theokit 0.48.13 → 0.50.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 (327) hide show
  1. package/README.md +1 -0
  2. package/dist/{actions-virtual-module-YQXRSSMW.js → actions-virtual-module-5WBVSDOM.js} +22 -12
  3. package/dist/actions-virtual-module-5WBVSDOM.js.map +1 -0
  4. package/dist/{actions-virtual-module-LB4NGONI.js → actions-virtual-module-ZYLMNW6K.js} +13 -8
  5. package/dist/{actions-virtual-module-LB4NGONI.js.map → actions-virtual-module-ZYLMNW6K.js.map} +1 -1
  6. package/dist/adapters/agent-mount.d.ts +127 -0
  7. package/dist/adapters/agent-mount.js +24 -0
  8. package/dist/adapters/security-headers.d.ts +132 -0
  9. package/dist/adapters/security-headers.js +64 -0
  10. package/dist/adapters/security-headers.js.map +1 -0
  11. package/dist/adapters/web-shim.d.ts +100 -13
  12. package/dist/adapters/web-shim.js +158 -54
  13. package/dist/adapters/web-shim.js.map +1 -1
  14. package/dist/agent-GKUEL6OH.js +15 -0
  15. package/dist/agent-scan-BZa-pagG.d.ts +16 -0
  16. package/dist/{app-typed-client-GHO3EWZK.js → app-typed-client-4LAIEGFX.js} +23 -13
  17. package/dist/app-typed-client-4LAIEGFX.js.map +1 -0
  18. package/dist/{app-typed-client-G3J5G7E5.js → app-typed-client-DQM3Y6YY.js} +14 -9
  19. package/dist/app-typed-client-DQM3Y6YY.js.map +1 -0
  20. package/dist/aws-lambda-VKMYUMP2.js +261 -0
  21. package/dist/aws-lambda-VKMYUMP2.js.map +1 -0
  22. package/dist/{build-WU6AKKIB.js → build-FLX6VF7Q.js} +71 -26
  23. package/dist/build-FLX6VF7Q.js.map +1 -0
  24. package/dist/{bun-33RD6K7O.js → bun-L7PP6ID5.js} +105 -13
  25. package/dist/bun-L7PP6ID5.js.map +1 -0
  26. package/dist/{check-45NKUVSQ.js → check-GIPZBFTX.js} +2 -2
  27. package/dist/{chunk-KD5G3YXI.js → chunk-2AMLGJJA.js} +35 -9
  28. package/dist/chunk-2AMLGJJA.js.map +1 -0
  29. package/dist/chunk-3PBAN2YE.js +146 -0
  30. package/dist/chunk-3PBAN2YE.js.map +1 -0
  31. package/dist/{chunk-HBU2GIMZ.js → chunk-3QPVEJ7D.js} +15 -9
  32. package/dist/chunk-3QPVEJ7D.js.map +1 -0
  33. package/dist/{chunk-47CINLWF.js → chunk-44J2ANQC.js} +2 -2
  34. package/dist/{chunk-IEES3CHD.js → chunk-47MM2JUK.js} +8 -2
  35. package/dist/chunk-47MM2JUK.js.map +1 -0
  36. package/dist/chunk-4X6H2BXP.js +108 -0
  37. package/dist/chunk-4X6H2BXP.js.map +1 -0
  38. package/dist/{chunk-A7JBF5FO.js → chunk-5K4TDLRG.js} +8 -5
  39. package/dist/chunk-5K4TDLRG.js.map +1 -0
  40. package/dist/chunk-5YPXXSYY.js +181 -0
  41. package/dist/chunk-5YPXXSYY.js.map +1 -0
  42. package/dist/{chunk-YGAXV5HR.js → chunk-6J4JWHDJ.js} +191 -112
  43. package/dist/chunk-6J4JWHDJ.js.map +1 -0
  44. package/dist/chunk-72DMJBXI.js +424 -0
  45. package/dist/chunk-72DMJBXI.js.map +1 -0
  46. package/dist/chunk-7PM6K5EV.js +513 -0
  47. package/dist/chunk-7PM6K5EV.js.map +1 -0
  48. package/dist/{chunk-MTEWLGVY.js → chunk-BPYMC7SU.js} +4 -48
  49. package/dist/chunk-BPYMC7SU.js.map +1 -0
  50. package/dist/chunk-BU6RJPPJ.js +421 -0
  51. package/dist/chunk-BU6RJPPJ.js.map +1 -0
  52. package/dist/{chunk-FB2HBNIC.js → chunk-BX6EUYHU.js} +6 -2
  53. package/dist/chunk-BX6EUYHU.js.map +1 -0
  54. package/dist/{chunk-BIVCP6X5.js → chunk-C62IZEJI.js} +465 -202
  55. package/dist/chunk-C62IZEJI.js.map +1 -0
  56. package/dist/chunk-D4VP2QPR.js +16 -0
  57. package/dist/chunk-D4VP2QPR.js.map +1 -0
  58. package/dist/{chunk-J5MXCGKA.js → chunk-DHAD2O3S.js} +6 -6
  59. package/dist/chunk-DHAD2O3S.js.map +1 -0
  60. package/dist/chunk-E43VJ3E5.js +188 -0
  61. package/dist/chunk-E43VJ3E5.js.map +1 -0
  62. package/dist/chunk-EVZKNA2W.js +110 -0
  63. package/dist/chunk-EVZKNA2W.js.map +1 -0
  64. package/dist/chunk-FD4ZDTQ6.js +181 -0
  65. package/dist/chunk-FD4ZDTQ6.js.map +1 -0
  66. package/dist/chunk-FDOOBTXJ.js +17 -0
  67. package/dist/chunk-FDOOBTXJ.js.map +1 -0
  68. package/dist/chunk-FH3SQR6P.js +275 -0
  69. package/dist/chunk-FH3SQR6P.js.map +1 -0
  70. package/dist/chunk-HJHGTFEJ.js +23 -0
  71. package/dist/chunk-HJHGTFEJ.js.map +1 -0
  72. package/dist/{chunk-LXAESF4Y.js → chunk-HK4AZBKX.js} +7 -4
  73. package/dist/chunk-HK4AZBKX.js.map +1 -0
  74. package/dist/{chunk-T5C46IIU.js → chunk-HWBRS4DZ.js} +28 -269
  75. package/dist/chunk-HWBRS4DZ.js.map +1 -0
  76. package/dist/chunk-IRQGAC4L.js +52 -0
  77. package/dist/chunk-IRQGAC4L.js.map +1 -0
  78. package/dist/{chunk-FNTLKHZ7.js → chunk-JDN5SAAD.js} +7 -4
  79. package/dist/chunk-JDN5SAAD.js.map +1 -0
  80. package/dist/{chunk-GXEX4CBH.js → chunk-JIKNR5LX.js} +673 -484
  81. package/dist/chunk-JIKNR5LX.js.map +1 -0
  82. package/dist/{chunk-GRI4XHBJ.js → chunk-JWRCZIA4.js} +266 -108
  83. package/dist/chunk-JWRCZIA4.js.map +1 -0
  84. package/dist/{chunk-E576KYYT.js → chunk-KI4DOTN4.js} +25 -2
  85. package/dist/chunk-KI4DOTN4.js.map +1 -0
  86. package/dist/{chunk-ZB7D62OA.js → chunk-KUZVRJ7M.js} +3 -3
  87. package/dist/chunk-L4VFNFDL.js +248 -0
  88. package/dist/chunk-L4VFNFDL.js.map +1 -0
  89. package/dist/chunk-M2WC5MF7.js +127 -0
  90. package/dist/chunk-M2WC5MF7.js.map +1 -0
  91. package/dist/{chunk-O3JIAU3V.js → chunk-MCTC6HSE.js} +157 -103
  92. package/dist/chunk-MCTC6HSE.js.map +1 -0
  93. package/dist/{chunk-PXFXSFJL.js → chunk-NZ5JU6D3.js} +9 -9
  94. package/dist/{chunk-YRBR424R.js → chunk-OAUI273L.js} +338 -165
  95. package/dist/chunk-OAUI273L.js.map +1 -0
  96. package/dist/chunk-OGLS76RN.js +43 -0
  97. package/dist/chunk-OGLS76RN.js.map +1 -0
  98. package/dist/{chunk-7LVM22VG.js → chunk-OQCRCXCP.js} +6 -6
  99. package/dist/chunk-OQCRCXCP.js.map +1 -0
  100. package/dist/{chunk-OLGPYOLO.js → chunk-P6OS7652.js} +5 -2
  101. package/dist/chunk-P6OS7652.js.map +1 -0
  102. package/dist/chunk-Q5L5EGWZ.js +26 -0
  103. package/dist/chunk-Q5L5EGWZ.js.map +1 -0
  104. package/dist/{chunk-S433N3CT.js → chunk-QTHVHNJJ.js} +6 -36
  105. package/dist/chunk-QTHVHNJJ.js.map +1 -0
  106. package/dist/chunk-RPET332G.js +84 -0
  107. package/dist/chunk-RPET332G.js.map +1 -0
  108. package/dist/{chunk-646CA6RV.js → chunk-RQW5YMH7.js} +12 -4
  109. package/dist/chunk-RQW5YMH7.js.map +1 -0
  110. package/dist/{chunk-XALU5LCU.js → chunk-RWNYIU6A.js} +550 -146
  111. package/dist/chunk-RWNYIU6A.js.map +1 -0
  112. package/dist/chunk-SL7YUHPV.js +111 -0
  113. package/dist/chunk-SL7YUHPV.js.map +1 -0
  114. package/dist/chunk-U5PWXS3J.js +39 -0
  115. package/dist/chunk-U5PWXS3J.js.map +1 -0
  116. package/dist/chunk-ULDCFL2O.js +273 -0
  117. package/dist/chunk-ULDCFL2O.js.map +1 -0
  118. package/dist/{chunk-RWNSW4FM.js → chunk-UMNXCU3K.js} +12 -6
  119. package/dist/{chunk-RWNSW4FM.js.map → chunk-UMNXCU3K.js.map} +1 -1
  120. package/dist/chunk-VI7ZANB3.js +193 -0
  121. package/dist/chunk-VI7ZANB3.js.map +1 -0
  122. package/dist/chunk-VQPHPQ5L.js +14 -0
  123. package/dist/chunk-VQPHPQ5L.js.map +1 -0
  124. package/dist/chunk-WNJTJRM6.js +147 -0
  125. package/dist/chunk-WNJTJRM6.js.map +1 -0
  126. package/dist/chunk-WOBSEO75.js +790 -0
  127. package/dist/chunk-WOBSEO75.js.map +1 -0
  128. package/dist/{chunk-BMHS4WAN.js → chunk-XS7EX55U.js} +156 -42
  129. package/dist/chunk-XS7EX55U.js.map +1 -0
  130. package/dist/chunk-YN4W7LCX.js +31 -0
  131. package/dist/chunk-YN4W7LCX.js.map +1 -0
  132. package/dist/chunk-YSJOZEI6.js +1 -0
  133. package/dist/{chunk-JA2ZAT5Q.js → chunk-Z4PJMZLM.js} +2 -2
  134. package/dist/chunk-Z4PJMZLM.js.map +1 -0
  135. package/dist/{chunk-7VPQHEAJ.js → chunk-ZNZISJDZ.js} +6 -2
  136. package/dist/chunk-ZNZISJDZ.js.map +1 -0
  137. package/dist/chunk-ZWN3AODA.js +11 -0
  138. package/dist/chunk-ZWN3AODA.js.map +1 -0
  139. package/dist/cli/index.js +25 -10
  140. package/dist/cli/index.js.map +1 -1
  141. package/dist/client/core.d.ts +1 -1
  142. package/dist/client/core.js +2 -0
  143. package/dist/client/core.js.map +1 -1
  144. package/dist/client/index.d.ts +44 -10
  145. package/dist/client/index.js +35 -0
  146. package/dist/client/index.js.map +1 -1
  147. package/dist/cloudflare-SIG42OIW.js +335 -0
  148. package/dist/cloudflare-SIG42OIW.js.map +1 -0
  149. package/dist/config-support-WQHQIJTA.js +104 -0
  150. package/dist/config-support-WQHQIJTA.js.map +1 -0
  151. package/dist/{csrf-BBrEZSBW.d.ts → csrf-Dgot9qSM.d.ts} +1 -1
  152. package/dist/deno-deploy-LQAYOOPW.js +196 -0
  153. package/dist/deno-deploy-LQAYOOPW.js.map +1 -0
  154. package/dist/{dev-MUWJAZRD.js → dev-ANDSEVLB.js} +28 -18
  155. package/dist/dev-ANDSEVLB.js.map +1 -0
  156. package/dist/{dev-emit-GWD6IXV7.js → dev-emit-BFNMDCPB.js} +5 -5
  157. package/dist/{dev-emit-NBT6JD7R.js → dev-emit-MVAJAFGX.js} +5 -3
  158. package/dist/dev-emit-MVAJAFGX.js.map +1 -0
  159. package/dist/engine-singleton-X4R7AZBJ.js +315 -0
  160. package/dist/engine-singleton-X4R7AZBJ.js.map +1 -0
  161. package/dist/{generate-Y3GWM57K.js → generate-EN6EDITF.js} +43 -4
  162. package/dist/generate-EN6EDITF.js.map +1 -0
  163. package/dist/index-CzxtQcnp.d.ts +1058 -0
  164. package/dist/index.d.ts +4 -0
  165. package/dist/index.js +24 -13
  166. package/dist/index.js.map +1 -1
  167. package/dist/{info-XW7HGUPH.js → info-Y55RWS42.js} +8 -6
  168. package/dist/{info-XW7HGUPH.js.map → info-Y55RWS42.js.map} +1 -1
  169. package/dist/{internal-api-V5L65YSJ.js → internal-api-IP35YU3G.js} +22 -12
  170. package/dist/{internal-api-WEOSTMSN.js → internal-api-OPU456AT.js} +30 -16
  171. package/dist/internal-api-OPU456AT.js.map +1 -0
  172. package/dist/load-config-4ATXQUN3.js +16 -0
  173. package/dist/match-DmGgxjIU.d.ts +44 -0
  174. package/dist/{mcp-ULUFJNSZ.js → mcp-5LLNAGKA.js} +7 -7
  175. package/dist/netlify-C2IRCZKI.js +245 -0
  176. package/dist/netlify-C2IRCZKI.js.map +1 -0
  177. package/dist/node-OSVPYQ3D.js +10 -0
  178. package/dist/nonce-BXt7Qu_C.d.ts +31 -0
  179. package/dist/observability-bootstrap-MZMSOE66.js +15 -0
  180. package/dist/{openapi-HZXR335W.js → openapi-VFPEZSRI.js} +13 -11
  181. package/dist/{openapi-HZXR335W.js.map → openapi-VFPEZSRI.js.map} +1 -1
  182. package/dist/{plugin-runner-BFEcgtmJ.d.ts → plugin-runner-BVMOSxvb.d.ts} +1 -1
  183. package/dist/{plugin-types-D69-lJZ9.d.ts → plugin-types-BUVfUQ0V.d.ts} +13 -1
  184. package/dist/preview-GHPT2EQ5.js +23 -0
  185. package/dist/preview-GHPT2EQ5.js.map +1 -0
  186. package/dist/provider-resolver-Dx6QuWrw.d.ts +128 -0
  187. package/dist/registry-KBZDCFVQ.js +23 -0
  188. package/dist/route-config-Cm_ZMA1C.d.ts +72 -0
  189. package/dist/route-policy-BxOycCDq.d.ts +65 -0
  190. package/dist/router/element-scroll-restoration.d.ts +28 -0
  191. package/dist/router/element-scroll-restoration.js +96 -0
  192. package/dist/router/element-scroll-restoration.js.map +1 -0
  193. package/dist/{routes-OLNQX7CT.js → routes-BPLU3ISV.js} +11 -9
  194. package/dist/{routes-OLNQX7CT.js.map → routes-BPLU3ISV.js.map} +1 -1
  195. package/dist/{scan-7MJC6PYU.js → scan-YJEE4KQK.js} +2 -2
  196. package/dist/{schema-ZO3OSWVG.js → schema-SOAD43RQ.js} +7 -5
  197. package/dist/schemas-4AXHQMV3.js +25 -0
  198. package/dist/schemas-4AXHQMV3.js.map +1 -0
  199. package/dist/security-headers-Ccj7ncNx.d.ts +129 -0
  200. package/dist/server/agent/index.d.ts +2 -90
  201. package/dist/server/agent/index.js +1 -1
  202. package/dist/server/auth/index.d.ts +2 -21
  203. package/dist/server/auth/index.js +3 -2
  204. package/dist/server/cron/index.js +4 -3
  205. package/dist/server/define/index.d.ts +51 -57
  206. package/dist/server/define/index.js +10 -1
  207. package/dist/server/http/index.d.ts +7 -5
  208. package/dist/server/http/index.js +56 -12
  209. package/dist/server/index.d.ts +47 -439
  210. package/dist/server/index.js +119 -201
  211. package/dist/server/index.js.map +1 -1
  212. package/dist/server/jobs/index.js +4 -3
  213. package/dist/server/observability/index.d.ts +109 -35
  214. package/dist/server/observability/index.js +10 -7
  215. package/dist/server/plugins/index.d.ts +3 -3
  216. package/dist/server/scan/index.d.ts +47 -12
  217. package/dist/server/scan/index.js +13 -4
  218. package/dist/server/security/index.d.ts +61 -103
  219. package/dist/server/security/index.js +15 -6
  220. package/dist/server/webhook/index.d.ts +90 -3
  221. package/dist/server/webhook/index.js +12 -2
  222. package/dist/server-boundary-6B4ZQUY7.js +148 -0
  223. package/dist/server-boundary-6B4ZQUY7.js.map +1 -0
  224. package/dist/server-boundary-7VZQRPPX.js +133 -0
  225. package/dist/server-boundary-7VZQRPPX.js.map +1 -0
  226. package/dist/{services-typed-client-PSAGRPFF.js → services-typed-client-XGT5SUUN.js} +2 -2
  227. package/dist/{start-KR2JJR7K.js → start-UZDMOT7I.js} +342 -111
  228. package/dist/start-UZDMOT7I.js.map +1 -0
  229. package/dist/{static-M2W4HUWS.js → static-SVDWIOXJ.js} +24 -13
  230. package/dist/static-SVDWIOXJ.js.map +1 -0
  231. package/dist/{theo-cloud-XAHWOUFK.js → theo-cloud-3ET4G5T6.js} +9 -2
  232. package/dist/theo-cloud-3ET4G5T6.js.map +1 -0
  233. package/dist/vercel-BMCQKCWE.js +277 -0
  234. package/dist/vercel-BMCQKCWE.js.map +1 -0
  235. package/dist/vite-plugin/index.js +24 -13
  236. package/dist/vite-plugin-VKCT2LF2.js +42 -0
  237. package/dist/vite-plugin-VKCT2LF2.js.map +1 -0
  238. package/package.json +19 -6
  239. package/dist/actions-virtual-module-YQXRSSMW.js.map +0 -1
  240. package/dist/agent-7JJW3TPB.js +0 -15
  241. package/dist/app-typed-client-G3J5G7E5.js.map +0 -1
  242. package/dist/app-typed-client-GHO3EWZK.js.map +0 -1
  243. package/dist/aws-lambda-CYNDGU5O.js +0 -172
  244. package/dist/aws-lambda-CYNDGU5O.js.map +0 -1
  245. package/dist/build-WU6AKKIB.js.map +0 -1
  246. package/dist/bun-33RD6K7O.js.map +0 -1
  247. package/dist/chunk-646CA6RV.js.map +0 -1
  248. package/dist/chunk-6E5WKMDS.js +0 -67
  249. package/dist/chunk-6E5WKMDS.js.map +0 -1
  250. package/dist/chunk-6GGWS7J3.js +0 -91
  251. package/dist/chunk-6GGWS7J3.js.map +0 -1
  252. package/dist/chunk-7LVM22VG.js.map +0 -1
  253. package/dist/chunk-7VPQHEAJ.js.map +0 -1
  254. package/dist/chunk-A7JBF5FO.js.map +0 -1
  255. package/dist/chunk-AM3QABW5.js +0 -161
  256. package/dist/chunk-AM3QABW5.js.map +0 -1
  257. package/dist/chunk-BIVCP6X5.js.map +0 -1
  258. package/dist/chunk-BMHS4WAN.js.map +0 -1
  259. package/dist/chunk-E576KYYT.js.map +0 -1
  260. package/dist/chunk-FB2HBNIC.js.map +0 -1
  261. package/dist/chunk-FNTLKHZ7.js.map +0 -1
  262. package/dist/chunk-GRI4XHBJ.js.map +0 -1
  263. package/dist/chunk-GVW5EKEU.js +0 -422
  264. package/dist/chunk-GVW5EKEU.js.map +0 -1
  265. package/dist/chunk-GXEX4CBH.js.map +0 -1
  266. package/dist/chunk-HBU2GIMZ.js.map +0 -1
  267. package/dist/chunk-IEES3CHD.js.map +0 -1
  268. package/dist/chunk-J5MXCGKA.js.map +0 -1
  269. package/dist/chunk-JA2ZAT5Q.js.map +0 -1
  270. package/dist/chunk-KD5G3YXI.js.map +0 -1
  271. package/dist/chunk-LNVMHQ2Z.js +0 -54
  272. package/dist/chunk-LNVMHQ2Z.js.map +0 -1
  273. package/dist/chunk-LXAESF4Y.js.map +0 -1
  274. package/dist/chunk-MTEWLGVY.js.map +0 -1
  275. package/dist/chunk-O3JIAU3V.js.map +0 -1
  276. package/dist/chunk-OJLL4YD6.js +0 -403
  277. package/dist/chunk-OJLL4YD6.js.map +0 -1
  278. package/dist/chunk-OLGPYOLO.js.map +0 -1
  279. package/dist/chunk-S433N3CT.js.map +0 -1
  280. package/dist/chunk-T5C46IIU.js.map +0 -1
  281. package/dist/chunk-U267AOWS.js +0 -28
  282. package/dist/chunk-U267AOWS.js.map +0 -1
  283. package/dist/chunk-UW2TEAGR.js +0 -77
  284. package/dist/chunk-UW2TEAGR.js.map +0 -1
  285. package/dist/chunk-WPJOTQA5.js +0 -1
  286. package/dist/chunk-XALU5LCU.js.map +0 -1
  287. package/dist/chunk-XR74JD4M.js +0 -457
  288. package/dist/chunk-XR74JD4M.js.map +0 -1
  289. package/dist/chunk-YGAXV5HR.js.map +0 -1
  290. package/dist/chunk-YRBR424R.js.map +0 -1
  291. package/dist/cloudflare-KYUWCEPL.js +0 -122
  292. package/dist/cloudflare-KYUWCEPL.js.map +0 -1
  293. package/dist/deno-deploy-CCTB7HGS.js +0 -107
  294. package/dist/deno-deploy-CCTB7HGS.js.map +0 -1
  295. package/dist/dev-MUWJAZRD.js.map +0 -1
  296. package/dist/dev-emit-NBT6JD7R.js.map +0 -1
  297. package/dist/generate-Y3GWM57K.js.map +0 -1
  298. package/dist/index-BEtEv6ZH.d.ts +0 -575
  299. package/dist/load-config-VKD6LKWU.js +0 -14
  300. package/dist/match-CfbEFRG4.d.ts +0 -26
  301. package/dist/netlify-AFMDNKT4.js +0 -150
  302. package/dist/netlify-AFMDNKT4.js.map +0 -1
  303. package/dist/node-ZJQEJSP3.js +0 -10
  304. package/dist/registry-GKR3EWRW.js +0 -23
  305. package/dist/start-KR2JJR7K.js.map +0 -1
  306. package/dist/static-M2W4HUWS.js.map +0 -1
  307. package/dist/theo-cloud-XAHWOUFK.js.map +0 -1
  308. package/dist/vercel-SRS2DH6O.js +0 -133
  309. package/dist/vercel-SRS2DH6O.js.map +0 -1
  310. package/dist/vite-plugin-VPJFD4HK.js +0 -36
  311. /package/dist/{chunk-WPJOTQA5.js.map → adapters/agent-mount.js.map} +0 -0
  312. /package/dist/{agent-7JJW3TPB.js.map → agent-GKUEL6OH.js.map} +0 -0
  313. /package/dist/{check-45NKUVSQ.js.map → check-GIPZBFTX.js.map} +0 -0
  314. /package/dist/{chunk-47CINLWF.js.map → chunk-44J2ANQC.js.map} +0 -0
  315. /package/dist/{chunk-ZB7D62OA.js.map → chunk-KUZVRJ7M.js.map} +0 -0
  316. /package/dist/{chunk-PXFXSFJL.js.map → chunk-NZ5JU6D3.js.map} +0 -0
  317. /package/dist/{internal-api-WEOSTMSN.js.map → chunk-YSJOZEI6.js.map} +0 -0
  318. /package/dist/{dev-emit-GWD6IXV7.js.map → dev-emit-BFNMDCPB.js.map} +0 -0
  319. /package/dist/{internal-api-V5L65YSJ.js.map → internal-api-IP35YU3G.js.map} +0 -0
  320. /package/dist/{load-config-VKD6LKWU.js.map → load-config-4ATXQUN3.js.map} +0 -0
  321. /package/dist/{mcp-ULUFJNSZ.js.map → mcp-5LLNAGKA.js.map} +0 -0
  322. /package/dist/{node-ZJQEJSP3.js.map → node-OSVPYQ3D.js.map} +0 -0
  323. /package/dist/{scan-7MJC6PYU.js.map → observability-bootstrap-MZMSOE66.js.map} +0 -0
  324. /package/dist/{registry-GKR3EWRW.js.map → registry-KBZDCFVQ.js.map} +0 -0
  325. /package/dist/{schema-ZO3OSWVG.js.map → scan-YJEE4KQK.js.map} +0 -0
  326. /package/dist/{vite-plugin-VPJFD4HK.js.map → schema-SOAD43RQ.js.map} +0 -0
  327. /package/dist/{services-typed-client-PSAGRPFF.js.map → services-typed-client-XGT5SUUN.js.map} +0 -0
@@ -0,0 +1,146 @@
1
+ // src/server/_internal/process-singleton.ts
2
+ var NAMESPACE = "theokit.singleton.";
3
+ function processSingleton(key, factory) {
4
+ const slot = /* @__PURE__ */ Symbol.for(NAMESPACE + key);
5
+ const host = globalThis;
6
+ const existing = host[slot];
7
+ if (existing !== void 0) return existing;
8
+ const created = factory();
9
+ host[slot] = created;
10
+ return created;
11
+ }
12
+
13
+ // src/server/agent/provider-resolver.ts
14
+ var DEFAULT_REGISTRY = [
15
+ {
16
+ name: "openrouter",
17
+ envKey: "OPENROUTER_API_KEY",
18
+ baseUrl: "https://openrouter.ai/api/v1",
19
+ priority: 1
20
+ },
21
+ {
22
+ name: "openai",
23
+ envKey: "OPENAI_API_KEY",
24
+ baseUrl: "https://api.openai.com/v1",
25
+ priority: 2
26
+ },
27
+ {
28
+ name: "anthropic",
29
+ envKey: "ANTHROPIC_API_KEY",
30
+ baseUrl: "https://api.anthropic.com",
31
+ priority: 3
32
+ },
33
+ {
34
+ // Mirrors the profile `@theokit/sdk` already ships for this provider — same default host, same
35
+ // override variable — so the two cannot disagree about where ollama is listening. The SDK is
36
+ // what dials it (see `baseUrlEnv`); this entry's job is to stop the resolver from rejecting the
37
+ // model before the SDK is ever reached. No `envKey`: see that field's doc comment for why the
38
+ // absence also keeps this entry out of the priority walk.
39
+ name: "ollama",
40
+ baseUrl: "http://localhost:11434",
41
+ baseUrlEnv: "OLLAMA_HOST",
42
+ priority: 100
43
+ }
44
+ ];
45
+ function registryOf() {
46
+ return processSingleton("provider-registry", () => [...DEFAULT_REGISTRY]);
47
+ }
48
+ var announced = /* @__PURE__ */ new Set();
49
+ function registerProvider(descriptor) {
50
+ const registry = registryOf();
51
+ const idx = registry.findIndex((p) => p.name === descriptor.name);
52
+ if (idx >= 0) registry[idx] = descriptor;
53
+ else registry.push(descriptor);
54
+ }
55
+ function resetProviderRegistry() {
56
+ const registry = registryOf();
57
+ registry.length = 0;
58
+ registry.push(...DEFAULT_REGISTRY);
59
+ }
60
+ function listProviders() {
61
+ return [...registryOf()].sort((a, b) => a.priority - b.priority);
62
+ }
63
+ function announce(desc, how, options) {
64
+ if (announced.has(desc.name)) return;
65
+ announced.add(desc.name);
66
+ const source = desc.envKey ?? "none (this provider takes no credential)";
67
+ const line = `[theokit] provider=${desc.name} (${how}) source=${source} baseUrl=${baseUrlOf(desc)}`;
68
+ if (options?.announce) options.announce(line);
69
+ else console.warn(line);
70
+ }
71
+ function baseUrlOf(desc) {
72
+ if (desc.baseUrlEnv === void 0) return desc.baseUrl;
73
+ const override = process.env[desc.baseUrlEnv];
74
+ return override !== void 0 && override.length > 0 ? override : desc.baseUrl;
75
+ }
76
+ function providerOf(modelId, registered) {
77
+ const prefix = declaredPrefixOf(modelId);
78
+ if (prefix === void 0) return void 0;
79
+ return registered.find((p) => p.name === prefix);
80
+ }
81
+ function declaredPrefixOf(modelId) {
82
+ if (modelId === void 0) return void 0;
83
+ const slash = modelId.indexOf("/");
84
+ if (slash <= 0) return void 0;
85
+ return modelId.slice(0, slash);
86
+ }
87
+ function takesCredential(desc) {
88
+ return desc.envKey !== void 0;
89
+ }
90
+ function resolveProvider(modelId, options) {
91
+ const sorted = [...registryOf()].sort((a, b) => a.priority - b.priority);
92
+ const declared = modelId === void 0 ? void 0 : providerOf(modelId, sorted);
93
+ if (declared !== void 0 && modelId !== void 0) {
94
+ if (declared.envKey === void 0) {
95
+ announce(declared, "declared by the model", options);
96
+ return { name: declared.name, apiKey: "", baseUrl: baseUrlOf(declared) };
97
+ }
98
+ const apiKey = process.env[declared.envKey];
99
+ if (apiKey && apiKey.length > 0) {
100
+ announce(declared, "declared by the model", options);
101
+ return { name: declared.name, apiKey, baseUrl: baseUrlOf(declared) };
102
+ }
103
+ throw new Error(
104
+ `Model "${modelId}" declares provider "${declared.name}", but ${declared.envKey} is not set. Set ${declared.envKey}, or change the model's provider prefix.`
105
+ );
106
+ }
107
+ const credentialed = sorted.filter(takesCredential);
108
+ for (const desc of credentialed) {
109
+ const apiKey = process.env[desc.envKey];
110
+ if (apiKey && apiKey.length > 0) {
111
+ announce(desc, "by env priority", options);
112
+ return {
113
+ name: desc.name,
114
+ apiKey,
115
+ baseUrl: baseUrlOf(desc)
116
+ };
117
+ }
118
+ }
119
+ const prefix = declaredPrefixOf(modelId);
120
+ if (prefix !== void 0) {
121
+ throw new Error(
122
+ `Model "${modelId}" declares provider "${prefix}", which is not registered. Registered providers: ${sorted.map((p) => p.name).join(", ")}. Register it with registerProvider({ name: '${prefix}', \u2026 }), or use a registered prefix.`
123
+ );
124
+ }
125
+ const envKeys = credentialed.map((p) => p.envKey).join(" OR ");
126
+ throw new Error(
127
+ `No LLM provider API key found in environment. Set one of: ${envKeys}. Get a free OpenRouter key at https://openrouter.ai/keys (recommended \u2014 one key, many models).`
128
+ );
129
+ }
130
+ function tryResolveProvider(modelId) {
131
+ try {
132
+ return resolveProvider(modelId);
133
+ } catch {
134
+ return null;
135
+ }
136
+ }
137
+
138
+ export {
139
+ processSingleton,
140
+ registerProvider,
141
+ resetProviderRegistry,
142
+ listProviders,
143
+ resolveProvider,
144
+ tryResolveProvider
145
+ };
146
+ //# sourceMappingURL=chunk-3PBAN2YE.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/_internal/process-singleton.ts","../src/server/agent/provider-resolver.ts"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import "tsx/esm";
3
3
 
4
4
  // src/config/load-env.ts
5
- import { lstatSync, readFileSync, realpathSync, statSync } from "fs";
5
+ import { closeSync, lstatSync, openSync, readFileSync, realpathSync, statSync } from "fs";
6
6
  import { resolve } from "path";
7
7
  import dotenv from "dotenv";
8
8
  import { expand } from "dotenv-expand";
@@ -29,19 +29,25 @@ function readEnvFile(path) {
29
29
  );
30
30
  return null;
31
31
  }
32
+ let fd;
32
33
  try {
33
- const lstat = lstatSync(path);
34
- if (lstat.isSymbolicLink()) {
35
- const real = realpathSync(path);
36
- console.info(`[theokit] .env at ${path} is a symlink \u2192 ${real}`);
37
- }
34
+ fd = openSync(path, "r");
38
35
  } catch {
36
+ return null;
39
37
  }
40
38
  try {
41
- const content = readFileSync(path, "utf-8");
42
- return dotenv.parse(content);
39
+ try {
40
+ if (lstatSync(path).isSymbolicLink()) {
41
+ const real = realpathSync(path);
42
+ console.info(`[theokit] .env at ${path} is a symlink \u2192 ${real}`);
43
+ }
44
+ } catch {
45
+ }
46
+ return dotenv.parse(readFileSync(fd, "utf-8"));
43
47
  } catch {
44
48
  return null;
49
+ } finally {
50
+ closeSync(fd);
45
51
  }
46
52
  }
47
53
  function loadEnv(options = {}) {
@@ -98,4 +104,4 @@ function loadEnv(options = {}) {
98
104
  export {
99
105
  loadEnv
100
106
  };
101
- //# sourceMappingURL=chunk-HBU2GIMZ.js.map
107
+ //# sourceMappingURL=chunk-3QPVEJ7D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/load-env.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Reads `.env` files from a CLI-controlled `cwd`. File names are a fixed\n * literal set. Build-time + CLI tool; no HTTP input.\n */\n/**\n * `loadEnv()` — auto-loads `.env` files into `process.env` for server code.\n *\n * Implements the Next.js `loadEnvConfig` algorithm\n * (`references/next.js/packages/next-env/index.ts:114-180`) with TheoKit\n * adaptations:\n *\n * - EC-1: 1MB file-size cap (anti-OOM, anti-supply-chain).\n * - EC-2: `_resetEnvCache()` test-only side-door.\n * - EC-8: `dotenv-expand` circular-ref safe (lib-provided).\n * - EC-13: log when `.env` is a symlink (transparency).\n * - D6: real `process.env` wins over `.env`-file values.\n * - NODE_ENV stash: `.env`-set NODE_ENV NEVER overrides the real\n * `process.env.NODE_ENV`. Stashed in `__THEOKIT_USER_NODE_ENV` instead.\n */\n\nimport { closeSync, lstatSync, openSync, readFileSync, realpathSync, statSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nimport dotenv from 'dotenv'\nimport { expand, type DotenvPopulateInput } from 'dotenv-expand'\n\nimport type { LoadEnvOptions, LoadEnvResult } from './load-env-types.js'\n\n/** EC-1: 1MB cap. Real `.env`s are < 10KB. */\nconst MAX_ENV_FILE_BYTES = 1_048_576\n\nconst cache = new Map<string, LoadEnvResult>()\n\n/** Test-only side-door for EC-2 — clear the module-level cache between vitest test files. */\nexport function _resetEnvCache(): void {\n cache.clear()\n}\n\nfunction envFilesInPriorityOrder(mode: string): string[] {\n // Top of list = highest priority. Will be read in REVERSE so first-in\n // wins via overwrite during merge.\n const files = [`.env.${mode}.local`, `.env.local`, `.env.${mode}`, `.env`]\n // Test mode skips `.env.local` per dotenv convention (avoid leaking dev\n // secrets into the test suite).\n if (mode === 'test') {\n return files.filter((f) => f !== '.env.local')\n }\n return files\n}\n\nfunction readEnvFile(path: string): Record<string, string> | null {\n let stat\n try {\n stat = statSync(path)\n } catch {\n return null // ENOENT / EACCES → skip\n }\n\n // Allow files + FIFOs (1Password/SOPS pipe support).\n if (!stat.isFile() && !stat.isFIFO()) return null\n\n // EC-1 — anti-OOM cap.\n if (stat.size > MAX_ENV_FILE_BYTES) {\n console.warn(\n `[theokit] .env file at ${path} exceeds ${MAX_ENV_FILE_BYTES} bytes — skipping (likely a generated artifact, not a real env file)`,\n )\n return null\n }\n\n // Open first, then describe, then read — all through the one descriptor. Reading by name after\n // inspecting the name resolves it twice, so the file the transparency note describes need not be\n // the file whose values are loaded (CodeQL `js/file-system-race`).\n let fd: number\n try {\n fd = openSync(path, 'r')\n } catch {\n return null\n }\n\n try {\n // EC-13 — symlink transparency. Don't refuse; just say so.\n try {\n if (lstatSync(path).isSymbolicLink()) {\n const real = realpathSync(path)\n // eslint-disable-next-line no-console -- intentional transparency log on a build-time tool\n console.info(`[theokit] .env at ${path} is a symlink → ${real}`)\n }\n } catch {\n // The note is informational; failing to produce it must not fail the load.\n }\n\n return dotenv.parse(readFileSync(fd, 'utf-8'))\n } catch {\n return null\n } finally {\n closeSync(fd)\n }\n}\n\n// eslint-disable-next-line complexity -- canonical env-load algorithm (priority → expand → guards → apply); inlining branches is clearer than extracting micro-helpers\nexport function loadEnv(options: LoadEnvOptions = {}): LoadEnvResult {\n const cwd = options.cwd ?? process.cwd()\n const mode = options.mode ?? process.env.NODE_ENV ?? 'development'\n const cacheKey = `${cwd}:${mode}`\n\n if (!options.forceReload) {\n const cached = cache.get(cacheKey)\n if (cached) return cached\n }\n\n const fileNames = envFilesInPriorityOrder(mode)\n const filePaths = fileNames.map((f) => resolve(cwd, f))\n\n // Read in REVERSE — lower-priority files first, so higher-priority\n // (lower-index) overwrites during merge.\n const merged: Record<string, string> = {}\n const loadedFromFiles: string[] = []\n for (const path of [...filePaths].reverse()) {\n const parsed = readEnvFile(path)\n if (parsed === null) continue\n for (const [k, v] of Object.entries(parsed)) {\n merged[k] = v\n }\n loadedFromFiles.unshift(path) // keep priority order in result\n }\n\n // NODE_ENV stash — `.env`-set NODE_ENV never overrides real process.env.NODE_ENV.\n if (merged.NODE_ENV && process.env.__THEOKIT_USER_NODE_ENV === undefined) {\n process.env.__THEOKIT_USER_NODE_ENV = merged.NODE_ENV\n }\n delete merged.NODE_ENV // never propagate\n\n // EC-8 — dotenv-expand@11 stack-overflows on circular refs (A=${B}, B=${A}).\n // Wrap in try/catch — on overflow, leave the parsed map untouched (literal\n // values survive). Tested via test_loadEnv_circular_expand_no_loop_EC8.\n // Pass a CLONE of process.env (string-only, filtered) so expand can\n // reference real env without mutating it.\n const processEnvClone: DotenvPopulateInput = {}\n for (const [k, v] of Object.entries(process.env)) {\n if (typeof v === 'string') processEnvClone[k] = v\n }\n try {\n expand({ parsed: merged, processEnv: processEnvClone })\n } catch (err) {\n if (err instanceof RangeError) {\n console.warn(\n `[theokit] .env expansion overflow (likely circular reference like A=\\${B}, B=\\${A}). Leaving values as literals.`,\n )\n } else {\n throw err\n }\n }\n\n // Apply: D6 — real process.env wins over file values.\n const loaded: Record<string, string> = {}\n for (const [k, v] of Object.entries(merged)) {\n if (process.env[k] !== undefined) continue // real env wins\n process.env[k] = v\n loaded[k] = v\n }\n\n // Sentinel\n process.env.__THEOKIT_PROCESSED_ENV = 'true'\n\n const result: LoadEnvResult = { loaded, loadedFromFiles }\n cache.set(cacheKey, result)\n return result\n}\n"],"mappings":"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","names":[]}
@@ -2,7 +2,7 @@
2
2
  import "tsx/esm";
3
3
  import {
4
4
  findControllerFiles
5
- } from "./chunk-T5C46IIU.js";
5
+ } from "./chunk-HWBRS4DZ.js";
6
6
 
7
7
  // src/cli/commands/build/emit-controllers.ts
8
8
  import { mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -43,4 +43,4 @@ export {
43
43
  emitControllerArtifacts,
44
44
  describeControllerArtifacts
45
45
  };
46
- //# sourceMappingURL=chunk-47CINLWF.js.map
46
+ //# sourceMappingURL=chunk-44J2ANQC.js.map
@@ -93,7 +93,13 @@ function scanChild(parentDir, dirName, routePath) {
93
93
  function scanDir(dir, segment, routePath) {
94
94
  const node = { segment, path: routePath, children: [] };
95
95
  attachRouteFiles(node, dir);
96
- for (const entry of readdirSync(dir, { withFileTypes: true })) {
96
+ const entries = readdirSync(dir, { withFileTypes: true });
97
+ entries.sort((a, b) => {
98
+ if (a.name < b.name) return -1;
99
+ if (a.name > b.name) return 1;
100
+ return 0;
101
+ });
102
+ for (const entry of entries) {
97
103
  if (!entry.isDirectory()) continue;
98
104
  if (entry.name.startsWith("_") || entry.name.startsWith(".")) continue;
99
105
  const child = scanChild(dir, entry.name, routePath);
@@ -117,4 +123,4 @@ export {
117
123
  isRouteFile,
118
124
  scanRoutes
119
125
  };
120
- //# sourceMappingURL=chunk-IEES3CHD.js.map
126
+ //# sourceMappingURL=chunk-47MM2JUK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/router/scan.ts","../src/router/types.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * Build-time file-system scanner. All paths originate from `appDir`,\n * which is itself derived from `process.cwd()`. No HTTP input flows here.\n */\nimport { readdirSync, statSync, existsSync } from 'node:fs'\nimport { join, resolve } from 'node:path'\n\nimport type { RouteNode, RouteFileName } from './types.js'\nimport { ROUTE_FILE_NAMES, ROUTE_FILE_EXTENSIONS } from './types.js'\n\nfunction toNodeKey(name: RouteFileName): 'page' | 'layout' | 'error' | 'loading' | 'notFound' {\n if (name === 'not-found') return 'notFound'\n return name\n}\n\nfunction setRouteFile(\n node: RouteNode,\n key: 'page' | 'layout' | 'error' | 'loading' | 'notFound',\n value: string,\n): void {\n switch (key) {\n case 'page':\n node.page = value\n break\n case 'layout':\n node.layout = value\n break\n case 'error':\n node.error = value\n break\n case 'loading':\n node.loading = value\n break\n case 'notFound':\n node.notFound = value\n break\n }\n}\n\nfunction attachRouteFiles(node: RouteNode, dir: string): void {\n // Check route files with extension priority (.tsx > .ts > .jsx > .js)\n for (const name of ROUTE_FILE_NAMES) {\n const key = toNodeKey(name)\n if (node[key] !== undefined) continue\n for (const ext of ROUTE_FILE_EXTENSIONS) {\n const filename = `${name}${ext}`\n if (existsSync(join(dir, filename))) {\n setRouteFile(node, key, resolve(dir, filename))\n break\n }\n }\n }\n}\n\ninterface ParsedSegment {\n kind: 'static' | 'dynamic' | 'catchall'\n paramName?: string\n}\n\n/**\n * Classify a directory name as a static, dynamic (`[param]`), or catch-all\n * (`[...slug]`) route segment. Throws at build time on:\n * - optional catch-all `[[...slug]]` (EC-4 — not supported yet; see plan Q3)\n * - a param name outside `[A-Za-z0-9_]` (EC-5 — react-router would silently mis-match)\n * Order matters: catch-all is checked before single dynamic so `[...slug]` is\n * not misread as a dynamic param literally named `...slug`.\n */\nfunction parseSegment(name: string): ParsedSegment {\n if (name.startsWith('[[')) {\n throw new Error(\n `Optional catch-all route segment is not supported yet: '${name}'. ` +\n `Use '[...param]' for catch-all, or split into explicit segments.`,\n )\n }\n const catchAll = /^\\[\\.\\.\\.(.+)\\]$/.exec(name)\n if (catchAll) return checkedSegment('catchall', catchAll[1], name)\n const dynamic = /^\\[(.+)\\]$/.exec(name)\n if (dynamic) return checkedSegment('dynamic', dynamic[1], name)\n return { kind: 'static' }\n}\n\nfunction checkedSegment(\n kind: 'dynamic' | 'catchall',\n paramName: string,\n name: string,\n): ParsedSegment {\n if (!/^\\w+$/.test(paramName)) {\n throw new Error(\n `Invalid route param '${paramName}' in segment '${name}' — ` +\n `param names must match [A-Za-z0-9_] (react-router constraint).`,\n )\n }\n return { kind, paramName }\n}\n\nfunction nodeHasContent(node: RouteNode): boolean {\n return (\n node.page !== undefined ||\n node.layout !== undefined ||\n node.error !== undefined ||\n node.loading !== undefined ||\n node.notFound !== undefined ||\n node.children.length > 0\n )\n}\n\nfunction buildChildPath(routePath: string, urlSegment: string): string {\n if (!urlSegment) return routePath\n return routePath === '/' ? `/${urlSegment}` : `${routePath}/${urlSegment}`\n}\n\n/** Scan one subdirectory into a child RouteNode, attaching dynamic-segment metadata. */\nfunction scanChild(parentDir: string, dirName: string, routePath: string): RouteNode {\n const isRouteGroup = dirName.startsWith('(') && dirName.endsWith(')')\n const urlSegment = isRouteGroup ? '' : dirName\n const childPath = buildChildPath(routePath, urlSegment)\n const child = scanDir(join(parentDir, dirName), isRouteGroup ? '' : dirName, childPath)\n\n // Dynamic / catch-all segment metadata (throws on [[...]] or invalid charset).\n if (!isRouteGroup) {\n const parsed = parseSegment(dirName)\n if (parsed.kind !== 'static' && parsed.paramName !== undefined) {\n child.dynamic = { paramName: parsed.paramName, catchAll: parsed.kind === 'catchall' }\n }\n }\n return child\n}\n\nfunction scanDir(dir: string, segment: string, routePath: string): RouteNode {\n const node: RouteNode = { segment, path: routePath, children: [] }\n attachRouteFiles(node, dir)\n\n // Sorted by name so the manifest does not inherit the filesystem's iteration order.\n // ext4 returns entries in filename-hash order, APFS and NTFS in others — an unsorted\n // walk emits a different module graph per machine, which is what makes the client build\n // non-reproducible (usetheokit/theokit#346).\n //\n // Compared by code unit rather than with `localeCompare`: collation is locale-dependent,\n // so the same tree could sort differently under a different `LANG` — reintroducing the\n // very cross-machine divergence this sort exists to remove.\n const entries = readdirSync(dir, { withFileTypes: true })\n entries.sort((a, b) => {\n if (a.name < b.name) return -1\n if (a.name > b.name) return 1\n return 0\n })\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue\n\n const child = scanChild(dir, entry.name, routePath)\n // Prune empty nodes — a directory with no route files AND no children is\n // irrelevant to the manifest.\n if (nodeHasContent(child)) {\n node.children.push(child)\n }\n }\n\n return node\n}\n\nexport function scanRoutes(appDir: string): RouteNode {\n if (!existsSync(appDir)) {\n throw new Error(`App directory does not exist: ${appDir}`)\n }\n if (!statSync(appDir).isDirectory()) {\n throw new Error(`App path is not a directory: ${appDir}`)\n }\n return scanDir(appDir, '', '/')\n}\n","// T2.2 (architecture-cleanup) — RouteNode moved to core/contracts/route-node.ts\n// (canonical home per ADR-0001 v3). Re-export keeps the local path stable.\nexport type { RouteNode } from '../core/contracts/route-node.js'\n\nexport const ROUTE_FILE_NAMES = ['page', 'layout', 'error', 'loading', 'not-found'] as const\n\nexport type RouteFileName = (typeof ROUTE_FILE_NAMES)[number]\n\nexport const ROUTE_FILE_EXTENSIONS = ['.tsx', '.ts', '.jsx', '.js'] as const\n\nconst ROUTE_FILE_REGEX = /^(page|layout|error|loading|not-found)\\.(tsx|ts|jsx|js)$/\n\nexport function isRouteFile(filename: string): boolean {\n return ROUTE_FILE_REGEX.test(filename)\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,108 @@
1
+ // src/config/load-env.ts
2
+ import { closeSync, lstatSync, openSync, readFileSync, realpathSync, statSync } from "fs";
3
+ import { resolve } from "path";
4
+ import dotenv from "dotenv";
5
+ import { expand } from "dotenv-expand";
6
+ var MAX_ENV_FILE_BYTES = 1048576;
7
+ var cache = /* @__PURE__ */ new Map();
8
+ function _resetEnvCache() {
9
+ cache.clear();
10
+ }
11
+ function envFilesInPriorityOrder(mode) {
12
+ const files = [`.env.${mode}.local`, `.env.local`, `.env.${mode}`, `.env`];
13
+ if (mode === "test") {
14
+ return files.filter((f) => f !== ".env.local");
15
+ }
16
+ return files;
17
+ }
18
+ function readEnvFile(path) {
19
+ let stat;
20
+ try {
21
+ stat = statSync(path);
22
+ } catch {
23
+ return null;
24
+ }
25
+ if (!stat.isFile() && !stat.isFIFO()) return null;
26
+ if (stat.size > MAX_ENV_FILE_BYTES) {
27
+ console.warn(
28
+ `[theokit] .env file at ${path} exceeds ${MAX_ENV_FILE_BYTES} bytes \u2014 skipping (likely a generated artifact, not a real env file)`
29
+ );
30
+ return null;
31
+ }
32
+ let fd;
33
+ try {
34
+ fd = openSync(path, "r");
35
+ } catch {
36
+ return null;
37
+ }
38
+ try {
39
+ try {
40
+ if (lstatSync(path).isSymbolicLink()) {
41
+ const real = realpathSync(path);
42
+ console.info(`[theokit] .env at ${path} is a symlink \u2192 ${real}`);
43
+ }
44
+ } catch {
45
+ }
46
+ return dotenv.parse(readFileSync(fd, "utf-8"));
47
+ } catch {
48
+ return null;
49
+ } finally {
50
+ closeSync(fd);
51
+ }
52
+ }
53
+ function loadEnv(options = {}) {
54
+ const cwd = options.cwd ?? process.cwd();
55
+ const mode = options.mode ?? process.env.NODE_ENV ?? "development";
56
+ const cacheKey = `${cwd}:${mode}`;
57
+ if (!options.forceReload) {
58
+ const cached = cache.get(cacheKey);
59
+ if (cached) return cached;
60
+ }
61
+ const fileNames = envFilesInPriorityOrder(mode);
62
+ const filePaths = fileNames.map((f) => resolve(cwd, f));
63
+ const merged = {};
64
+ const loadedFromFiles = [];
65
+ for (const path of [...filePaths].reverse()) {
66
+ const parsed = readEnvFile(path);
67
+ if (parsed === null) continue;
68
+ for (const [k, v] of Object.entries(parsed)) {
69
+ merged[k] = v;
70
+ }
71
+ loadedFromFiles.unshift(path);
72
+ }
73
+ if (merged.NODE_ENV && process.env.__THEOKIT_USER_NODE_ENV === void 0) {
74
+ process.env.__THEOKIT_USER_NODE_ENV = merged.NODE_ENV;
75
+ }
76
+ delete merged.NODE_ENV;
77
+ const processEnvClone = {};
78
+ for (const [k, v] of Object.entries(process.env)) {
79
+ if (typeof v === "string") processEnvClone[k] = v;
80
+ }
81
+ try {
82
+ expand({ parsed: merged, processEnv: processEnvClone });
83
+ } catch (err) {
84
+ if (err instanceof RangeError) {
85
+ console.warn(
86
+ `[theokit] .env expansion overflow (likely circular reference like A=\${B}, B=\${A}). Leaving values as literals.`
87
+ );
88
+ } else {
89
+ throw err;
90
+ }
91
+ }
92
+ const loaded = {};
93
+ for (const [k, v] of Object.entries(merged)) {
94
+ if (process.env[k] !== void 0) continue;
95
+ process.env[k] = v;
96
+ loaded[k] = v;
97
+ }
98
+ process.env.__THEOKIT_PROCESSED_ENV = "true";
99
+ const result = { loaded, loadedFromFiles };
100
+ cache.set(cacheKey, result);
101
+ return result;
102
+ }
103
+
104
+ export {
105
+ _resetEnvCache,
106
+ loadEnv
107
+ };
108
+ //# sourceMappingURL=chunk-4X6H2BXP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/load-env.ts"],"mappings":"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","names":[]}
@@ -1,19 +1,22 @@
1
- #!/usr/bin/env node
2
- import "tsx/esm";
1
+ import {
2
+ compareByCodeUnit
3
+ } from "./chunk-ZWN3AODA.js";
3
4
 
4
5
  // src/server/_internal/scan-walker.ts
5
6
  import { readdirSync } from "fs";
6
7
  import { extname, join, resolve } from "path";
7
8
  function walkSourceFiles(root, opts, onFile) {
8
9
  const skipPrefixes = opts.skipPrefixes ?? ["_", "."];
10
+ const readDir = opts.readDir ?? ((dir) => readdirSync(dir, { withFileTypes: true }));
9
11
  const visit = (dir) => {
10
12
  let entries;
11
13
  try {
12
- entries = readdirSync(dir, { withFileTypes: true });
14
+ entries = readDir(dir);
13
15
  } catch {
14
16
  return;
15
17
  }
16
- for (const entry of entries) {
18
+ const ordered = [...entries].sort((a, b) => compareByCodeUnit(a.name, b.name));
19
+ for (const entry of ordered) {
17
20
  const fullPath = join(dir, entry.name);
18
21
  if (entry.isDirectory() && !skipPrefixes.some((p) => entry.name.startsWith(p))) {
19
22
  visit(fullPath);
@@ -28,4 +31,4 @@ function walkSourceFiles(root, opts, onFile) {
28
31
  export {
29
32
  walkSourceFiles
30
33
  };
31
- //# sourceMappingURL=chunk-A7JBF5FO.js.map
34
+ //# sourceMappingURL=chunk-5K4TDLRG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/_internal/scan-walker.ts"],"mappings":";;;;;AAIA,SAAS,mBAAmB;AAE5B,SAAS,SAAS,MAAM,eAAe;AAoDhC,SAAS,gBACd,MACA,MACA,QACM;AACN,QAAM,eAAe,KAAK,gBAAgB,CAAC,KAAK,GAAG;AACnD,QAAM,UAAU,KAAK,YAAY,CAAC,QAAgB,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC;AAC1F,QAAM,QAAQ,CAAC,QAAsB;AACnC,QAAI;AACJ,QAAI;AACF,gBAAU,QAAQ,GAAG;AAAA,IACvB,QAAQ;AAEN;AAAA,IACF;AAKA,UAAM,UAAU,CAAC,GAAG,OAAO,EAAE,KAAK,CAAC,GAAG,MAAM,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC;AAC7E,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAW,KAAK,KAAK,MAAM,IAAI;AACrC,UAAI,MAAM,YAAY,KAAK,CAAC,aAAa,KAAK,CAAC,MAAM,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG;AAC9E,cAAM,QAAQ;AAAA,MAChB,WAAW,MAAM,OAAO,KAAK,KAAK,WAAW,IAAI,QAAQ,MAAM,IAAI,CAAC,GAAG;AACrE,eAAO,QAAQ,QAAQ,CAAC;AAAA,MAC1B;AAAA,IACF;AAAA,EACF;AACA,QAAM,IAAI;AACZ;","names":[]}
@@ -0,0 +1,181 @@
1
+ #!/usr/bin/env node
2
+ import "tsx/esm";
3
+
4
+ // src/server/_internal/process-singleton.ts
5
+ var NAMESPACE = "theokit.singleton.";
6
+ function processSingleton(key, factory) {
7
+ const slot = /* @__PURE__ */ Symbol.for(NAMESPACE + key);
8
+ const host = globalThis;
9
+ const existing = host[slot];
10
+ if (existing !== void 0) return existing;
11
+ const created = factory();
12
+ host[slot] = created;
13
+ return created;
14
+ }
15
+
16
+ // src/server/agent/provider-resolver.ts
17
+ var DEFAULT_REGISTRY = [
18
+ {
19
+ name: "openrouter",
20
+ envKey: "OPENROUTER_API_KEY",
21
+ baseUrl: "https://openrouter.ai/api/v1",
22
+ priority: 1
23
+ },
24
+ {
25
+ name: "openai",
26
+ envKey: "OPENAI_API_KEY",
27
+ baseUrl: "https://api.openai.com/v1",
28
+ priority: 2
29
+ },
30
+ {
31
+ name: "anthropic",
32
+ envKey: "ANTHROPIC_API_KEY",
33
+ baseUrl: "https://api.anthropic.com",
34
+ priority: 3
35
+ },
36
+ {
37
+ // Mirrors the profile `@theokit/sdk` already ships for this provider — same default host, same
38
+ // override variable — so the two cannot disagree about where ollama is listening. The SDK is
39
+ // what dials it (see `baseUrlEnv`); this entry's job is to stop the resolver from rejecting the
40
+ // model before the SDK is ever reached. No `envKey`: see that field's doc comment for why the
41
+ // absence also keeps this entry out of the priority walk.
42
+ name: "ollama",
43
+ baseUrl: "http://localhost:11434",
44
+ baseUrlEnv: "OLLAMA_HOST",
45
+ priority: 100
46
+ }
47
+ ];
48
+ function registryOf() {
49
+ return processSingleton("provider-registry", () => [...DEFAULT_REGISTRY]);
50
+ }
51
+ var announced = /* @__PURE__ */ new Set();
52
+ function announce(desc, how, options) {
53
+ if (announced.has(desc.name)) return;
54
+ announced.add(desc.name);
55
+ const source = desc.envKey ?? "none (this provider takes no credential)";
56
+ const line = `[theokit] provider=${desc.name} (${how}) source=${source} baseUrl=${baseUrlOf(desc)}`;
57
+ if (options?.announce) options.announce(line);
58
+ else console.warn(line);
59
+ }
60
+ function baseUrlOf(desc) {
61
+ if (desc.baseUrlEnv === void 0) return desc.baseUrl;
62
+ const override = process.env[desc.baseUrlEnv];
63
+ return override !== void 0 && override.length > 0 ? override : desc.baseUrl;
64
+ }
65
+ function providerOf(modelId, registered) {
66
+ const prefix = declaredPrefixOf(modelId);
67
+ if (prefix === void 0) return void 0;
68
+ return registered.find((p) => p.name === prefix);
69
+ }
70
+ function declaredPrefixOf(modelId) {
71
+ if (modelId === void 0) return void 0;
72
+ const slash = modelId.indexOf("/");
73
+ if (slash <= 0) return void 0;
74
+ return modelId.slice(0, slash);
75
+ }
76
+ function takesCredential(desc) {
77
+ return desc.envKey !== void 0;
78
+ }
79
+ function resolveProvider(modelId, options) {
80
+ const sorted = [...registryOf()].sort((a, b) => a.priority - b.priority);
81
+ const declared = modelId === void 0 ? void 0 : providerOf(modelId, sorted);
82
+ if (declared !== void 0 && modelId !== void 0) {
83
+ if (declared.envKey === void 0) {
84
+ announce(declared, "declared by the model", options);
85
+ return { name: declared.name, apiKey: "", baseUrl: baseUrlOf(declared) };
86
+ }
87
+ const apiKey = process.env[declared.envKey];
88
+ if (apiKey && apiKey.length > 0) {
89
+ announce(declared, "declared by the model", options);
90
+ return { name: declared.name, apiKey, baseUrl: baseUrlOf(declared) };
91
+ }
92
+ throw new Error(
93
+ `Model "${modelId}" declares provider "${declared.name}", but ${declared.envKey} is not set. Set ${declared.envKey}, or change the model's provider prefix.`
94
+ );
95
+ }
96
+ const credentialed = sorted.filter(takesCredential);
97
+ for (const desc of credentialed) {
98
+ const apiKey = process.env[desc.envKey];
99
+ if (apiKey && apiKey.length > 0) {
100
+ announce(desc, "by env priority", options);
101
+ return {
102
+ name: desc.name,
103
+ apiKey,
104
+ baseUrl: baseUrlOf(desc)
105
+ };
106
+ }
107
+ }
108
+ const prefix = declaredPrefixOf(modelId);
109
+ if (prefix !== void 0) {
110
+ throw new Error(
111
+ `Model "${modelId}" declares provider "${prefix}", which is not registered. Registered providers: ${sorted.map((p) => p.name).join(", ")}. Register it with registerProvider({ name: '${prefix}', \u2026 }), or use a registered prefix.`
112
+ );
113
+ }
114
+ const envKeys = credentialed.map((p) => p.envKey).join(" OR ");
115
+ throw new Error(
116
+ `No LLM provider API key found in environment. Set one of: ${envKeys}. Get a free OpenRouter key at https://openrouter.ai/keys (recommended \u2014 one key, many models).`
117
+ );
118
+ }
119
+
120
+ // src/server/agent/approval-registry.ts
121
+ function getApprovalRegistry() {
122
+ return processSingleton("approval-registry", () => createInProcessApprovalRegistry());
123
+ }
124
+ function createInProcessApprovalRegistry() {
125
+ const pending = /* @__PURE__ */ new Map();
126
+ return {
127
+ register(approvalId, opts) {
128
+ return new Promise((resolve) => {
129
+ const settle = (decision) => {
130
+ const entry = pending.get(approvalId);
131
+ if (!entry) return;
132
+ clearTimeout(entry.timer);
133
+ pending.delete(approvalId);
134
+ resolve(decision);
135
+ };
136
+ const timer = setTimeout(() => {
137
+ settle({
138
+ approved: opts.onTimeout === "proceed",
139
+ settledBy: "timeout",
140
+ // Every value in this sentence was already here and none of it used to survive the
141
+ // settle. `onTimeout` is named because all three of its values reach this line and two
142
+ // of them deny — an operator who wrote `'retry'` and got a denial had nothing to read
143
+ // that mentioned retry.
144
+ reason: `no decision within ${String(opts.timeoutMs)} ms; onTimeout: '${opts.onTimeout}' was applied`
145
+ });
146
+ }, opts.timeoutMs);
147
+ const info = {
148
+ approvalId,
149
+ toolName: opts.toolName,
150
+ question: opts.question,
151
+ expiresAt: Date.now() + opts.timeoutMs,
152
+ ...opts.payloadSchema !== void 0 ? { payloadSchema: opts.payloadSchema } : {}
153
+ };
154
+ pending.set(approvalId, {
155
+ settle,
156
+ timer,
157
+ info,
158
+ ...opts.owner !== void 0 ? { owner: opts.owner } : {}
159
+ });
160
+ });
161
+ },
162
+ resolve(approvalId, decision) {
163
+ const entry = pending.get(approvalId);
164
+ if (!entry) return false;
165
+ entry.settle(typeof decision === "boolean" ? { approved: decision } : decision);
166
+ return true;
167
+ },
168
+ list() {
169
+ return [...pending.values()].map((p) => p.info);
170
+ },
171
+ ownerOf(approvalId) {
172
+ return pending.get(approvalId)?.owner;
173
+ }
174
+ };
175
+ }
176
+
177
+ export {
178
+ getApprovalRegistry,
179
+ resolveProvider
180
+ };
181
+ //# sourceMappingURL=chunk-5YPXXSYY.js.map