theokit 0.2.4 → 0.4.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 (303) hide show
  1. package/dist/{actions-virtual-module-HWNTIEPI.js → actions-virtual-module-IY46EEEX.js} +2 -2
  2. package/dist/{actions-virtual-module-SEIPACG5.js → actions-virtual-module-XNHDNCZ6.js} +2 -2
  3. package/dist/add-2ZFFGGE4.js +0 -0
  4. package/dist/{app-typed-client-6GC6VWXS.js → app-typed-client-OUJO3V5J.js} +10 -5
  5. package/dist/{app-typed-client-6GC6VWXS.js.map → app-typed-client-OUJO3V5J.js.map} +1 -1
  6. package/dist/{app-typed-client-US2ZXBEC.js → app-typed-client-YOMWSA3F.js} +11 -6
  7. package/dist/{app-typed-client-US2ZXBEC.js.map → app-typed-client-YOMWSA3F.js.map} +1 -1
  8. package/dist/audit-log-BQWM5YLG.d.ts +60 -0
  9. package/dist/{aws-lambda-XYCGZH3I.js → aws-lambda-GKSTX6HD.js} +3 -3
  10. package/dist/body-parser-web-MUWBKZ3F.js +70 -0
  11. package/dist/body-parser-web-MUWBKZ3F.js.map +1 -0
  12. package/dist/broadcast-QOQGUNNK.js +0 -0
  13. package/dist/{build-MREW6MVS.js → build-D4J7XECU.js} +33 -24
  14. package/dist/build-D4J7XECU.js.map +1 -0
  15. package/dist/build-request-body-preview-II2235E6.js +0 -0
  16. package/dist/{bun-K73TQEWC.js → bun-ISHSNFIO.js} +3 -3
  17. package/dist/{check-PZR67OY5.js → check-NXYPLM6M.js} +2 -2
  18. package/dist/{chunk-WZ7CPVQB.js → chunk-27LWMYNK.js} +28 -24
  19. package/dist/chunk-27LWMYNK.js.map +1 -0
  20. package/dist/{chunk-5OKZY2VL.js → chunk-2F4FROEQ.js} +1695 -1522
  21. package/dist/chunk-2F4FROEQ.js.map +1 -0
  22. package/dist/chunk-4HBI7DHP.js +20 -0
  23. package/dist/chunk-4HBI7DHP.js.map +1 -0
  24. package/dist/{chunk-X4JAX2U3.js → chunk-4S2UCILN.js} +180 -125
  25. package/dist/chunk-4S2UCILN.js.map +1 -0
  26. package/dist/{chunk-C52GSJPF.js → chunk-4S6YHNG2.js} +11 -8
  27. package/dist/chunk-4S6YHNG2.js.map +1 -0
  28. package/dist/chunk-5ODOE6EF.js +0 -0
  29. package/dist/{chunk-KJVEJILQ.js → chunk-5PU65T5W.js} +9 -3
  30. package/dist/chunk-5PU65T5W.js.map +1 -0
  31. package/dist/chunk-5QW7IQQU.js +36 -0
  32. package/dist/chunk-5QW7IQQU.js.map +1 -0
  33. package/dist/chunk-5Z2727GV.js +1324 -0
  34. package/dist/chunk-5Z2727GV.js.map +1 -0
  35. package/dist/{chunk-YLBSSEHX.js → chunk-6NEXVBPY.js} +5 -15
  36. package/dist/chunk-6NEXVBPY.js.map +1 -0
  37. package/dist/chunk-7MQOHNHE.js +36 -0
  38. package/dist/chunk-7MQOHNHE.js.map +1 -0
  39. package/dist/{chunk-TPCT3MXV.js → chunk-ABVITXFH.js} +405 -272
  40. package/dist/chunk-ABVITXFH.js.map +1 -0
  41. package/dist/chunk-ASDXVRJD.js +185 -0
  42. package/dist/chunk-ASDXVRJD.js.map +1 -0
  43. package/dist/chunk-B3L3TJVF.js +406 -0
  44. package/dist/chunk-B3L3TJVF.js.map +1 -0
  45. package/dist/{chunk-PB4GR7EP.js → chunk-C3ZZ56YZ.js} +1 -18
  46. package/dist/chunk-C3ZZ56YZ.js.map +1 -0
  47. package/dist/{chunk-O7335ZGH.js → chunk-CG563V5M.js} +5 -3
  48. package/dist/chunk-CG563V5M.js.map +1 -0
  49. package/dist/{chunk-5OFPQK6N.js → chunk-COXLEZCN.js} +2 -1
  50. package/dist/chunk-COXLEZCN.js.map +1 -0
  51. package/dist/{chunk-O4BLVPML.js → chunk-DNMSV3R3.js} +22 -28
  52. package/dist/chunk-DNMSV3R3.js.map +1 -0
  53. package/dist/chunk-E3JH6YUM.js +1 -0
  54. package/dist/chunk-ESC54TAK.js +220 -0
  55. package/dist/chunk-ESC54TAK.js.map +1 -0
  56. package/dist/chunk-FI7MPTJW.js +77 -0
  57. package/dist/chunk-FI7MPTJW.js.map +1 -0
  58. package/dist/chunk-H4J2LECY.js +201 -0
  59. package/dist/chunk-H4J2LECY.js.map +1 -0
  60. package/dist/chunk-IAJ2JVEH.js +256 -0
  61. package/dist/chunk-IAJ2JVEH.js.map +1 -0
  62. package/dist/{chunk-F3TG5FJV.js → chunk-IEZCAT2I.js} +7 -1
  63. package/dist/{chunk-F3TG5FJV.js.map → chunk-IEZCAT2I.js.map} +1 -1
  64. package/dist/chunk-JHEAWR3L.js +1 -0
  65. package/dist/chunk-JQSKBMXP.js +17 -0
  66. package/dist/chunk-JQSKBMXP.js.map +1 -0
  67. package/dist/{chunk-4QTKSLTO.js → chunk-K4M64WD6.js} +9 -5
  68. package/dist/{chunk-4QTKSLTO.js.map → chunk-K4M64WD6.js.map} +1 -1
  69. package/dist/chunk-KI7OWQUX.js +293 -0
  70. package/dist/chunk-KI7OWQUX.js.map +1 -0
  71. package/dist/chunk-KT3MWNZG.js +0 -0
  72. package/dist/{chunk-ZJW5FFYJ.js → chunk-LC5PYNJP.js} +2 -2
  73. package/dist/{chunk-X2OLD264.js → chunk-M2EY7KDR.js} +1228 -1124
  74. package/dist/chunk-M2EY7KDR.js.map +1 -0
  75. package/dist/{chunk-YWWHK7R6.js → chunk-MR7OLIC6.js} +3 -3
  76. package/dist/chunk-NM4WF3XD.js +63 -0
  77. package/dist/chunk-NM4WF3XD.js.map +1 -0
  78. package/dist/chunk-NPMCKOX4.js +1 -0
  79. package/dist/{chunk-VRHXOKRP.js → chunk-NZXH2LQQ.js} +86 -83
  80. package/dist/chunk-NZXH2LQQ.js.map +1 -0
  81. package/dist/{chunk-2BQYEBCK.js → chunk-OLPB36O2.js} +87 -5
  82. package/dist/chunk-OLPB36O2.js.map +1 -0
  83. package/dist/chunk-PIVX3DYW.js +142 -0
  84. package/dist/chunk-PIVX3DYW.js.map +1 -0
  85. package/dist/{chunk-7TOMTMHT.js → chunk-R7OC6UDK.js} +2 -1
  86. package/dist/chunk-R7OC6UDK.js.map +1 -0
  87. package/dist/chunk-RESN62GB.js +269 -0
  88. package/dist/chunk-RESN62GB.js.map +1 -0
  89. package/dist/{chunk-64JI5LTO.js → chunk-RMU7EBRO.js} +2 -2
  90. package/dist/chunk-RMU7EBRO.js.map +1 -0
  91. package/dist/chunk-TQYSPYKU.js +131 -0
  92. package/dist/chunk-TQYSPYKU.js.map +1 -0
  93. package/dist/chunk-TSLSIRBR.js +107 -0
  94. package/dist/chunk-TSLSIRBR.js.map +1 -0
  95. package/dist/{chunk-XP7YXRHO.js → chunk-U6TPSW4L.js} +37 -5
  96. package/dist/chunk-U6TPSW4L.js.map +1 -0
  97. package/dist/chunk-UD3LFGDL.js +45 -0
  98. package/dist/chunk-UD3LFGDL.js.map +1 -0
  99. package/dist/chunk-UUFYP2UM.js +161 -0
  100. package/dist/chunk-UUFYP2UM.js.map +1 -0
  101. package/dist/{chunk-SNDZQ64K.js → chunk-VBZCVFSA.js} +85 -3
  102. package/dist/chunk-VBZCVFSA.js.map +1 -0
  103. package/dist/chunk-VMEWD57H.js +137 -0
  104. package/dist/chunk-VMEWD57H.js.map +1 -0
  105. package/dist/{chunk-BE2LKDI7.js → chunk-WEGALZEU.js} +3 -3
  106. package/dist/{chunk-ZOXNJV2O.js → chunk-WGHJD6I7.js} +35 -138
  107. package/dist/chunk-WGHJD6I7.js.map +1 -0
  108. package/dist/chunk-XMS5VRIK.js +0 -0
  109. package/dist/chunk-Y4H3JNVK.js +18 -0
  110. package/dist/chunk-Y4H3JNVK.js.map +1 -0
  111. package/dist/chunk-Z5IGLBWE.js +329 -0
  112. package/dist/chunk-Z5IGLBWE.js.map +1 -0
  113. package/dist/chunk-ZEGYW52B.js +26 -0
  114. package/dist/chunk-ZEGYW52B.js.map +1 -0
  115. package/dist/chunk-ZJQ4O76G.js +87 -0
  116. package/dist/chunk-ZJQ4O76G.js.map +1 -0
  117. package/dist/cli/index.js +44 -9
  118. package/dist/cli/index.js.map +1 -1
  119. package/dist/client/index.d.ts +107 -1
  120. package/dist/client/index.js +152 -6
  121. package/dist/client/index.js.map +1 -1
  122. package/dist/{cloudflare-LCAOTRYZ.js → cloudflare-OJGJ7R2D.js} +3 -3
  123. package/dist/configure-agent-registry-6YGTJYBC.js +0 -0
  124. package/dist/cookies-MJKMGJ7N.js +22 -0
  125. package/dist/csrf-BBrEZSBW.d.ts +107 -0
  126. package/dist/csrf-readiness-store-CjIoub3U.d.ts +43 -0
  127. package/dist/define-websocket-CdK94O-D.d.ts +64 -0
  128. package/dist/{deno-deploy-ZN4RE5HF.js → deno-deploy-BHWKFTOW.js} +3 -3
  129. package/dist/{dev-6P2DM33Q.js → dev-MJVSRZGF.js} +13 -13
  130. package/dist/{dev-emit-MLDFOLUU.js → dev-emit-5VPRCHOD.js} +39 -142
  131. package/dist/dev-emit-5VPRCHOD.js.map +1 -0
  132. package/dist/{dev-emit-PRSRPDHA.js → dev-emit-HHP2XJXE.js} +5 -5
  133. package/dist/devtools/entry.js +185 -131
  134. package/dist/devtools/entry.js.map +1 -1
  135. package/dist/{dispatcher-AQJGI3HU.js → dispatcher-63LBXYLE.js} +2 -2
  136. package/dist/{dispatcher-E6QV32BO.js → dispatcher-EJME6C6M.js} +5 -2
  137. package/dist/dispatcher-EJME6C6M.js.map +1 -0
  138. package/dist/{dist-E6BL4ZVY.js → dist-KRW6OVD4.js} +7 -7
  139. package/dist/dist-KRW6OVD4.js.map +1 -0
  140. package/dist/docker-EZDA5FT7.js +0 -0
  141. package/dist/error-envelope-BsNzzAV5.d.ts +62 -0
  142. package/dist/{generate-DT4IIAHF.js → generate-AZ2K6Z2Z.js} +75 -2
  143. package/dist/generate-AZ2K6Z2Z.js.map +1 -0
  144. package/dist/index-DWWEdFh5.d.ts +399 -0
  145. package/dist/index.d.ts +161 -1391
  146. package/dist/index.js +20 -8
  147. package/dist/index.js.map +1 -1
  148. package/dist/{info-FJ4NXKTB.js → info-47VB62MV.js} +5 -5
  149. package/dist/job-backend-CgC8Xf33.d.ts +68 -0
  150. package/dist/{lib-NL5JXGEB.js → lib-NST3PNZX.js} +31 -31
  151. package/dist/lib-NST3PNZX.js.map +1 -0
  152. package/dist/module-loader-Cfz7dgCP.d.ts +26 -0
  153. package/dist/{netlify-5VQ22Z2P.js → netlify-GSNSJGMN.js} +3 -3
  154. package/dist/{node-3APTLGWB.js → node-6I5B6RL3.js} +3 -3
  155. package/dist/node-6I5B6RL3.js.map +1 -0
  156. package/dist/{openapi-SOKZTFE3.js → openapi-NFLSNNVQ.js} +10 -10
  157. package/dist/plugin-runner-BGBkzgi0.d.ts +95 -0
  158. package/dist/plugin-types-DNJGxr4Z.d.ts +79 -0
  159. package/dist/{proper-lockfile-4Y3DP3RP.js → proper-lockfile-MVKMQGFK.js} +27 -27
  160. package/dist/proper-lockfile-MVKMQGFK.js.map +1 -0
  161. package/dist/rate-limit-BdNDZ3vt.d.ts +58 -0
  162. package/dist/registry-QHEZ3BWB.js +25 -0
  163. package/dist/router-RGZFX75G.js +274 -0
  164. package/dist/router-RGZFX75G.js.map +1 -0
  165. package/dist/{routes-XVRAUH6H.js → routes-3A4XGIEJ.js} +6 -6
  166. package/dist/{scan-C2BOKLSY.js → scan-NQFI5S7P.js} +2 -2
  167. package/dist/scan-NQFI5S7P.js.map +1 -0
  168. package/dist/schema-D3v8VB7o.d.ts +76 -0
  169. package/dist/{schema-VR6YNVLQ.js → schema-KZVOV333.js} +5 -3
  170. package/dist/schema-KZVOV333.js.map +1 -0
  171. package/dist/server/agent/index.d.ts +229 -0
  172. package/dist/server/agent/index.js +16 -0
  173. package/dist/server/agent/index.js.map +1 -0
  174. package/dist/server/auth/index.d.ts +46 -1
  175. package/dist/server/auth/index.js +10 -3
  176. package/dist/server/cost/index.d.ts +1 -3
  177. package/dist/server/cost/index.js +1 -1
  178. package/dist/server/cron/index.js +4 -2
  179. package/dist/server/define/index.d.ts +281 -0
  180. package/dist/server/define/index.js +26 -0
  181. package/dist/server/define/index.js.map +1 -0
  182. package/dist/server/http/index.d.ts +10 -0
  183. package/dist/server/http/index.js +74 -0
  184. package/dist/server/http/index.js.map +1 -0
  185. package/dist/server/index.d.ts +151 -1677
  186. package/dist/server/index.js +558 -1102
  187. package/dist/server/index.js.map +1 -1
  188. package/dist/server/jobs/index.d.ts +348 -2
  189. package/dist/server/jobs/index.js +5 -3
  190. package/dist/server/observability/index.d.ts +324 -0
  191. package/dist/server/observability/index.js +48 -0
  192. package/dist/server/observability/index.js.map +1 -0
  193. package/dist/server/plugins/index.d.ts +17 -0
  194. package/dist/server/plugins/index.js +17 -0
  195. package/dist/server/plugins/index.js.map +1 -0
  196. package/dist/server/rate-limit/index.d.ts +105 -0
  197. package/dist/server/rate-limit/index.js +25 -0
  198. package/dist/server/rate-limit/index.js.map +1 -0
  199. package/dist/server/realtime/index.d.ts +15 -0
  200. package/dist/server/realtime/index.js +8 -0
  201. package/dist/server/realtime/index.js.map +1 -0
  202. package/dist/server/scan/index.d.ts +106 -0
  203. package/dist/server/scan/index.js +43 -0
  204. package/dist/server/scan/index.js.map +1 -0
  205. package/dist/server/security/index.d.ts +193 -0
  206. package/dist/server/security/index.js +50 -0
  207. package/dist/server/security/index.js.map +1 -0
  208. package/dist/server/storage/index.d.ts +22 -0
  209. package/dist/server/storage/index.js +14 -0
  210. package/dist/server/storage/index.js.map +1 -0
  211. package/dist/server/webhook/index.d.ts +148 -0
  212. package/dist/server/webhook/index.js +19 -0
  213. package/dist/server/webhook/index.js.map +1 -0
  214. package/dist/server-error-to-envelope-NO4CCAFQ.js +8 -0
  215. package/dist/server-error-to-envelope-NO4CCAFQ.js.map +1 -0
  216. package/dist/server-error-to-envelope-UJK6OWDJ.js +134 -0
  217. package/dist/server-error-to-envelope-UJK6OWDJ.js.map +1 -0
  218. package/dist/server-routes-hmr-GZJGPWMS.js +44 -0
  219. package/dist/server-routes-hmr-GZJGPWMS.js.map +1 -0
  220. package/dist/server-routes-hmr-PBHSKCQJ.js +42 -0
  221. package/dist/server-routes-hmr-PBHSKCQJ.js.map +1 -0
  222. package/dist/services-json-Z2QNGVPW.js +142 -0
  223. package/dist/services-json-Z2QNGVPW.js.map +1 -0
  224. package/dist/{services-typed-client-XWYYBWGW.js → services-typed-client-KK6RHRDG.js} +2 -2
  225. package/dist/{services-typed-client-ZX5JUHH3.js → services-typed-client-T7M5VPBP.js} +2 -2
  226. package/dist/{sqlite-vec-ARPNUBWT.js → sqlite-vec-54KB4RD3.js} +2 -2
  227. package/dist/sqlite-vec-54KB4RD3.js.map +1 -0
  228. package/dist/{start-R7XSQL5L.js → start-CGSZPBAG.js} +23 -23
  229. package/dist/start-CGSZPBAG.js.map +1 -0
  230. package/dist/{static-TZBVBDTB.js → static-QI5NQT2X.js} +6 -6
  231. package/dist/storage-manager-C4jsO0Tp.d.ts +89 -0
  232. package/dist/storage-manager-D5KBXXKB.js +0 -0
  233. package/dist/{storage-types-DtIVejC1.d.ts → storage-types-DsDTCPbp.d.ts} +1 -1
  234. package/dist/{theo-cloud-3K4DGB3S.js → theo-cloud-RSQCBNXL.js} +4 -4
  235. package/dist/theo-cloud-RSQCBNXL.js.map +1 -0
  236. package/dist/upgrade-readiness-GUJBCJIS.js +0 -0
  237. package/dist/{vercel-MWW24ABC.js → vercel-TKPZK62A.js} +3 -3
  238. package/dist/vite-plugin/index.d.ts +3 -1
  239. package/dist/vite-plugin/index.js +20 -8
  240. package/dist/{vite-plugin-6MPHTKIW.js → vite-plugin-CR4JDFUQ.js} +9 -9
  241. package/dist/vite-plugin-CR4JDFUQ.js.map +1 -0
  242. package/package.json +59 -10
  243. package/LICENSE +0 -201
  244. package/dist/build-MREW6MVS.js.map +0 -1
  245. package/dist/chunk-2BQYEBCK.js.map +0 -1
  246. package/dist/chunk-5OFPQK6N.js.map +0 -1
  247. package/dist/chunk-5OKZY2VL.js.map +0 -1
  248. package/dist/chunk-64JI5LTO.js.map +0 -1
  249. package/dist/chunk-7TOMTMHT.js.map +0 -1
  250. package/dist/chunk-C52GSJPF.js.map +0 -1
  251. package/dist/chunk-CZM6WWWS.js +0 -2450
  252. package/dist/chunk-CZM6WWWS.js.map +0 -1
  253. package/dist/chunk-KJVEJILQ.js.map +0 -1
  254. package/dist/chunk-O4BLVPML.js.map +0 -1
  255. package/dist/chunk-O7335ZGH.js.map +0 -1
  256. package/dist/chunk-PB4GR7EP.js.map +0 -1
  257. package/dist/chunk-SNDZQ64K.js.map +0 -1
  258. package/dist/chunk-TPCT3MXV.js.map +0 -1
  259. package/dist/chunk-VRHXOKRP.js.map +0 -1
  260. package/dist/chunk-WZ7CPVQB.js.map +0 -1
  261. package/dist/chunk-X2OLD264.js.map +0 -1
  262. package/dist/chunk-X4JAX2U3.js.map +0 -1
  263. package/dist/chunk-XP7YXRHO.js.map +0 -1
  264. package/dist/chunk-YLBSSEHX.js.map +0 -1
  265. package/dist/chunk-ZOXNJV2O.js.map +0 -1
  266. package/dist/dev-emit-MLDFOLUU.js.map +0 -1
  267. package/dist/dispatcher-E6QV32BO.js.map +0 -1
  268. package/dist/dist-E6BL4ZVY.js.map +0 -1
  269. package/dist/generate-DT4IIAHF.js.map +0 -1
  270. package/dist/index-li83Swxa.d.ts +0 -506
  271. package/dist/lib-NL5JXGEB.js.map +0 -1
  272. package/dist/proper-lockfile-4Y3DP3RP.js.map +0 -1
  273. package/dist/registry-5QFTLOL2.js +0 -25
  274. package/dist/schema-CjVly9c_.d.ts +0 -274
  275. package/dist/sqlite-vec-ARPNUBWT.js.map +0 -1
  276. package/dist/start-R7XSQL5L.js.map +0 -1
  277. package/dist/theo-cloud-3K4DGB3S.js.map +0 -1
  278. /package/dist/{actions-virtual-module-HWNTIEPI.js.map → actions-virtual-module-IY46EEEX.js.map} +0 -0
  279. /package/dist/{actions-virtual-module-SEIPACG5.js.map → actions-virtual-module-XNHDNCZ6.js.map} +0 -0
  280. /package/dist/{aws-lambda-XYCGZH3I.js.map → aws-lambda-GKSTX6HD.js.map} +0 -0
  281. /package/dist/{bun-K73TQEWC.js.map → bun-ISHSNFIO.js.map} +0 -0
  282. /package/dist/{check-PZR67OY5.js.map → check-NXYPLM6M.js.map} +0 -0
  283. /package/dist/{dispatcher-AQJGI3HU.js.map → chunk-E3JH6YUM.js.map} +0 -0
  284. /package/dist/{node-3APTLGWB.js.map → chunk-JHEAWR3L.js.map} +0 -0
  285. /package/dist/{chunk-ZJW5FFYJ.js.map → chunk-LC5PYNJP.js.map} +0 -0
  286. /package/dist/{chunk-YWWHK7R6.js.map → chunk-MR7OLIC6.js.map} +0 -0
  287. /package/dist/{scan-C2BOKLSY.js.map → chunk-NPMCKOX4.js.map} +0 -0
  288. /package/dist/{chunk-BE2LKDI7.js.map → chunk-WEGALZEU.js.map} +0 -0
  289. /package/dist/{cloudflare-LCAOTRYZ.js.map → cloudflare-OJGJ7R2D.js.map} +0 -0
  290. /package/dist/{schema-VR6YNVLQ.js.map → cookies-MJKMGJ7N.js.map} +0 -0
  291. /package/dist/{deno-deploy-ZN4RE5HF.js.map → deno-deploy-BHWKFTOW.js.map} +0 -0
  292. /package/dist/{dev-6P2DM33Q.js.map → dev-MJVSRZGF.js.map} +0 -0
  293. /package/dist/{dev-emit-PRSRPDHA.js.map → dev-emit-HHP2XJXE.js.map} +0 -0
  294. /package/dist/{vite-plugin-6MPHTKIW.js.map → dispatcher-63LBXYLE.js.map} +0 -0
  295. /package/dist/{info-FJ4NXKTB.js.map → info-47VB62MV.js.map} +0 -0
  296. /package/dist/{netlify-5VQ22Z2P.js.map → netlify-GSNSJGMN.js.map} +0 -0
  297. /package/dist/{openapi-SOKZTFE3.js.map → openapi-NFLSNNVQ.js.map} +0 -0
  298. /package/dist/{registry-5QFTLOL2.js.map → registry-QHEZ3BWB.js.map} +0 -0
  299. /package/dist/{routes-XVRAUH6H.js.map → routes-3A4XGIEJ.js.map} +0 -0
  300. /package/dist/{services-typed-client-XWYYBWGW.js.map → services-typed-client-KK6RHRDG.js.map} +0 -0
  301. /package/dist/{services-typed-client-ZX5JUHH3.js.map → services-typed-client-T7M5VPBP.js.map} +0 -0
  302. /package/dist/{static-TZBVBDTB.js.map → static-QI5NQT2X.js.map} +0 -0
  303. /package/dist/{vercel-MWW24ABC.js.map → vercel-TKPZK62A.js.map} +0 -0
@@ -0,0 +1,77 @@
1
+ // src/server/http/error-pages.ts
2
+ import { existsSync, readFileSync, statSync } from "fs";
3
+ import { resolve } from "path";
4
+ var MAX_ERROR_HTML_BYTES = 1048576;
5
+ function loadIfSafe(dir, name) {
6
+ const path = resolve(dir, name);
7
+ if (!existsSync(path)) return void 0;
8
+ try {
9
+ const stat = statSync(path);
10
+ if (stat.size > MAX_ERROR_HTML_BYTES) {
11
+ console.warn(
12
+ `[theokit] Custom error page ${name} is ${stat.size} bytes (max ${MAX_ERROR_HTML_BYTES}); skipping.`
13
+ );
14
+ return void 0;
15
+ }
16
+ return readFileSync(path, "utf-8");
17
+ } catch (err) {
18
+ console.warn(`[theokit] Failed to read ${name}: ${err.message}`);
19
+ return void 0;
20
+ }
21
+ }
22
+ function loadCustomErrorPages(clientDir) {
23
+ return {
24
+ custom404Html: loadIfSafe(clientDir, "404.html"),
25
+ custom500Html: loadIfSafe(clientDir, "500.html")
26
+ };
27
+ }
28
+
29
+ // src/server/http/static.ts
30
+ import { existsSync as existsSync2, readFileSync as readFileSync2, statSync as statSync2 } from "fs";
31
+ import { resolve as resolve2, extname } from "path";
32
+ var MIME_TYPES = {
33
+ ".html": "text/html",
34
+ ".js": "application/javascript",
35
+ ".mjs": "application/javascript",
36
+ ".css": "text/css",
37
+ ".json": "application/json",
38
+ ".png": "image/png",
39
+ ".jpg": "image/jpeg",
40
+ ".jpeg": "image/jpeg",
41
+ ".gif": "image/gif",
42
+ ".svg": "image/svg+xml",
43
+ ".ico": "image/x-icon",
44
+ ".woff": "font/woff",
45
+ ".woff2": "font/woff2",
46
+ ".ttf": "font/ttf",
47
+ ".txt": "text/plain",
48
+ ".map": "application/json"
49
+ };
50
+ function serveStaticFile(req, res, clientDir) {
51
+ const urlPath = (req.url ?? "/").split("?")[0];
52
+ const filePath = resolve2(clientDir, "." + urlPath);
53
+ if (!filePath.startsWith(clientDir)) {
54
+ res.writeHead(403);
55
+ res.end("Forbidden");
56
+ return true;
57
+ }
58
+ if (!existsSync2(filePath)) return false;
59
+ const stat = statSync2(filePath);
60
+ if (!stat.isFile()) return false;
61
+ const ext = extname(filePath);
62
+ const contentType = MIME_TYPES[ext] ?? "application/octet-stream";
63
+ const content = readFileSync2(filePath);
64
+ res.writeHead(200, {
65
+ "Content-Type": contentType,
66
+ "Content-Length": content.length
67
+ });
68
+ res.end(content);
69
+ return true;
70
+ }
71
+
72
+ export {
73
+ MAX_ERROR_HTML_BYTES,
74
+ loadCustomErrorPages,
75
+ serveStaticFile
76
+ };
77
+ //# sourceMappingURL=chunk-FI7MPTJW.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/http/error-pages.ts","../src/server/http/static.ts"],"sourcesContent":["/**\n * T2.4 — Custom error pages loader.\n *\n * Loads optional `.theo/client/404.html` and `500.html` from disk so adapters\n * (Node, CF, Vercel, Bun, Netlify, AWS Lambda, Deno) can pass them to the\n * shared `sendError` pipeline.\n *\n * EC-9: caps file size at 1MB. Files beyond the limit are skipped with a\n * console.warn and the default JSON error path is used.\n */\n\n/* eslint-disable security/detect-non-literal-fs-filename --\n * Loads `.theo/client/404.html` and `500.html` from a directory `dir` that\n * is always the build output of the current project. The names are fixed\n * literals (`'404.html'` / `'500.html'`) — no HTTP input.\n */\nimport { existsSync, readFileSync, statSync } from 'node:fs'\nimport { resolve } from 'node:path'\n\nexport const MAX_ERROR_HTML_BYTES = 1_048_576 // 1MB\n\nexport interface CustomErrorPages {\n custom404Html?: string\n custom500Html?: string\n}\n\nfunction loadIfSafe(dir: string, name: string): string | undefined {\n const path = resolve(dir, name)\n if (!existsSync(path)) return undefined\n try {\n const stat = statSync(path)\n if (stat.size > MAX_ERROR_HTML_BYTES) {\n console.warn(\n `[theokit] Custom error page ${name} is ${stat.size} bytes (max ${MAX_ERROR_HTML_BYTES}); skipping.`,\n )\n return undefined\n }\n return readFileSync(path, 'utf-8')\n } catch (err) {\n console.warn(`[theokit] Failed to read ${name}: ${(err as Error).message}`)\n return undefined\n }\n}\n\n/**\n * Load `.theo/client/{404,500}.html` from the given client directory.\n * Returns object with both fields when present; missing pages remain undefined.\n */\nexport function loadCustomErrorPages(clientDir: string): CustomErrorPages {\n return {\n custom404Html: loadIfSafe(clientDir, '404.html'),\n custom500Html: loadIfSafe(clientDir, '500.html'),\n }\n}\n","/* eslint-disable security/detect-non-literal-fs-filename --\n * Static-file server. The URL path IS user-controlled, BUT before any fs\n * call we resolve to absolute and reject with 403 if the resolved path\n * escapes `clientDir` (see EC-1 guard at line below). The guard is\n * authoritative; the rule cannot see it.\n */\nimport { existsSync, readFileSync, statSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { resolve, extname } from 'node:path'\n\nconst MIME_TYPES: Record<string, string> = {\n '.html': 'text/html',\n '.js': 'application/javascript',\n '.mjs': 'application/javascript',\n '.css': 'text/css',\n '.json': 'application/json',\n '.png': 'image/png',\n '.jpg': 'image/jpeg',\n '.jpeg': 'image/jpeg',\n '.gif': 'image/gif',\n '.svg': 'image/svg+xml',\n '.ico': 'image/x-icon',\n '.woff': 'font/woff',\n '.woff2': 'font/woff2',\n '.ttf': 'font/ttf',\n '.txt': 'text/plain',\n '.map': 'application/json',\n}\n\nexport function serveStaticFile(\n req: IncomingMessage,\n res: ServerResponse,\n clientDir: string,\n): boolean {\n const urlPath = (req.url ?? '/').split('?')[0]\n\n // Path traversal prevention (EC-1)\n const filePath = resolve(clientDir, '.' + urlPath)\n if (!filePath.startsWith(clientDir)) {\n res.writeHead(403)\n res.end('Forbidden')\n return true\n }\n\n if (!existsSync(filePath)) return false\n\n const stat = statSync(filePath)\n if (!stat.isFile()) return false\n\n const ext = extname(filePath)\n const contentType = MIME_TYPES[ext] ?? 'application/octet-stream'\n const content = readFileSync(filePath)\n\n res.writeHead(200, {\n 'Content-Type': contentType,\n 'Content-Length': content.length,\n })\n res.end(content)\n return true\n}\n"],"mappings":";AAgBA,SAAS,YAAY,cAAc,gBAAgB;AACnD,SAAS,eAAe;AAEjB,IAAM,uBAAuB;AAOpC,SAAS,WAAW,KAAa,MAAkC;AACjE,QAAM,OAAO,QAAQ,KAAK,IAAI;AAC9B,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,OAAO,SAAS,IAAI;AAC1B,QAAI,KAAK,OAAO,sBAAsB;AACpC,cAAQ;AAAA,QACN,+BAA+B,IAAI,OAAO,KAAK,IAAI,eAAe,oBAAoB;AAAA,MACxF;AACA,aAAO;AAAA,IACT;AACA,WAAO,aAAa,MAAM,OAAO;AAAA,EACnC,SAAS,KAAK;AACZ,YAAQ,KAAK,4BAA4B,IAAI,KAAM,IAAc,OAAO,EAAE;AAC1E,WAAO;AAAA,EACT;AACF;AAMO,SAAS,qBAAqB,WAAqC;AACxE,SAAO;AAAA,IACL,eAAe,WAAW,WAAW,UAAU;AAAA,IAC/C,eAAe,WAAW,WAAW,UAAU;AAAA,EACjD;AACF;;;AC/CA,SAAS,cAAAA,aAAY,gBAAAC,eAAc,YAAAC,iBAAgB;AAEnD,SAAS,WAAAC,UAAS,eAAe;AAEjC,IAAM,aAAqC;AAAA,EACzC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAEO,SAAS,gBACd,KACA,KACA,WACS;AACT,QAAM,WAAW,IAAI,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC;AAG7C,QAAM,WAAWA,SAAQ,WAAW,MAAM,OAAO;AACjD,MAAI,CAAC,SAAS,WAAW,SAAS,GAAG;AACnC,QAAI,UAAU,GAAG;AACjB,QAAI,IAAI,WAAW;AACnB,WAAO;AAAA,EACT;AAEA,MAAI,CAACH,YAAW,QAAQ,EAAG,QAAO;AAElC,QAAM,OAAOE,UAAS,QAAQ;AAC9B,MAAI,CAAC,KAAK,OAAO,EAAG,QAAO;AAE3B,QAAM,MAAM,QAAQ,QAAQ;AAC5B,QAAM,cAAc,WAAW,GAAG,KAAK;AACvC,QAAM,UAAUD,cAAa,QAAQ;AAErC,MAAI,UAAU,KAAK;AAAA,IACjB,gBAAgB;AAAA,IAChB,kBAAkB,QAAQ;AAAA,EAC5B,CAAC;AACD,MAAI,IAAI,OAAO;AACf,SAAO;AACT;","names":["existsSync","readFileSync","statSync","resolve"]}
@@ -0,0 +1,201 @@
1
+ // src/server/define/define-route.ts
2
+ function defineRoute(config) {
3
+ return config;
4
+ }
5
+
6
+ // src/server/define/define-action.ts
7
+ function defineAction(config) {
8
+ return config;
9
+ }
10
+
11
+ // src/server/define/define-middleware.ts
12
+ function defineMiddleware(handler) {
13
+ return handler;
14
+ }
15
+
16
+ // src/server/define/define-agent-endpoint.ts
17
+ var SSE_HEADERS = {
18
+ "content-type": "text/event-stream",
19
+ "cache-control": "no-cache, no-transform",
20
+ connection: "keep-alive"
21
+ };
22
+ function encodeSSE(event) {
23
+ return new TextEncoder().encode(`data: ${JSON.stringify(event)}
24
+
25
+ `);
26
+ }
27
+ function resolveAbortSignal(request) {
28
+ if (typeof request !== "object" || request === null) {
29
+ return new AbortController().signal;
30
+ }
31
+ const r = request;
32
+ if (typeof r.signal === "object" && r.signal !== null && "aborted" in r.signal && typeof r.signal.addEventListener === "function") {
33
+ return r.signal;
34
+ }
35
+ const controller = new AbortController();
36
+ if (r.aborted === true) controller.abort();
37
+ if (typeof r.on === "function") {
38
+ r.on("close", () => {
39
+ if (!controller.signal.aborted) controller.abort();
40
+ });
41
+ r.on("aborted", () => {
42
+ if (!controller.signal.aborted) controller.abort();
43
+ });
44
+ }
45
+ return controller.signal;
46
+ }
47
+ function defineAgentEndpoint(config) {
48
+ return {
49
+ handler: async ({ request, ctx, body, query, params }) => {
50
+ const cookieHeaders = new Headers();
51
+ const signal = resolveAbortSignal(request);
52
+ const generator = config.handler({
53
+ request,
54
+ ctx,
55
+ body,
56
+ query,
57
+ params,
58
+ cookieHeaders,
59
+ signal
60
+ });
61
+ let firstResult;
62
+ let primeError;
63
+ try {
64
+ firstResult = await generator.next();
65
+ } catch (err) {
66
+ primeError = err;
67
+ firstResult = { value: void 0, done: true };
68
+ }
69
+ const responseHeaders = new Headers(SSE_HEADERS);
70
+ for (const value of cookieHeaders.getSetCookie()) {
71
+ responseHeaders.append("set-cookie", value);
72
+ }
73
+ const stream = new ReadableStream({
74
+ async start(controller) {
75
+ const onAbort = () => {
76
+ void generator.return(void 0);
77
+ };
78
+ if (signal.aborted) {
79
+ controller.close();
80
+ return;
81
+ }
82
+ signal.addEventListener("abort", onAbort, { once: true });
83
+ try {
84
+ if (primeError !== void 0) {
85
+ let message;
86
+ if (primeError instanceof Error) {
87
+ message = primeError.message;
88
+ } else if (typeof primeError === "string") {
89
+ message = primeError;
90
+ } else {
91
+ message = "agent handler failed during setup";
92
+ }
93
+ controller.enqueue(encodeSSE({ type: "error", message }));
94
+ return;
95
+ }
96
+ if (firstResult.done !== true) {
97
+ controller.enqueue(encodeSSE(firstResult.value));
98
+ } else {
99
+ return;
100
+ }
101
+ for await (const event of generator) {
102
+ if (signal.aborted) break;
103
+ controller.enqueue(encodeSSE(event));
104
+ }
105
+ } catch (err) {
106
+ const message = err instanceof Error ? err.message : String(err);
107
+ controller.enqueue(encodeSSE({ type: "error", message }));
108
+ } finally {
109
+ signal.removeEventListener("abort", onAbort);
110
+ controller.close();
111
+ }
112
+ },
113
+ cancel() {
114
+ void generator.return(void 0);
115
+ }
116
+ });
117
+ return new Response(stream, { headers: responseHeaders });
118
+ }
119
+ };
120
+ }
121
+
122
+ // src/server/define/define-agent-tool.ts
123
+ import { z } from "zod";
124
+ var TOOL_NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/;
125
+ function isZodObject(schema) {
126
+ let current = schema;
127
+ for (let depth = 0; depth < 10; depth++) {
128
+ const def = current._def;
129
+ if (def?.typeName === "ZodObject") return true;
130
+ if (def?.schema !== void 0) {
131
+ current = def.schema;
132
+ continue;
133
+ }
134
+ if (def?.innerType !== void 0) {
135
+ current = def.innerType;
136
+ continue;
137
+ }
138
+ return false;
139
+ }
140
+ return false;
141
+ }
142
+ function defineAgentTool(spec) {
143
+ if (!TOOL_NAME_REGEX.test(spec.name)) {
144
+ throw new Error(
145
+ `defineAgentTool: name must match ${TOOL_NAME_REGEX.source}. Got: ${JSON.stringify(spec.name)}`
146
+ );
147
+ }
148
+ if (!isZodObject(spec.inputSchema)) {
149
+ throw new Error("defineAgentTool: inputSchema must be a ZodObject (z.object({...}))");
150
+ }
151
+ if (spec.description.length === 0) {
152
+ console.warn(
153
+ `defineAgentTool(${JSON.stringify(spec.name)}): empty description degrades LLM tool selection \u2014 provide a one-sentence summary.`
154
+ );
155
+ }
156
+ const { $schema: _$schema, ...inputSchema } = z.toJSONSchema(spec.inputSchema);
157
+ return {
158
+ name: spec.name,
159
+ description: spec.description,
160
+ inputSchema,
161
+ handler: async (input) => {
162
+ const parsed = spec.inputSchema.parse(input);
163
+ return await spec.handler(parsed);
164
+ }
165
+ };
166
+ }
167
+
168
+ // src/server/define/define-websocket.ts
169
+ function defineWebSocket(handler) {
170
+ return handler;
171
+ }
172
+ function defineWebSocketWeb(handler) {
173
+ return handler;
174
+ }
175
+
176
+ // src/server/define/define-channel.ts
177
+ function defineChannel(handler) {
178
+ return handler;
179
+ }
180
+ function defineWebChannel(handler) {
181
+ return handler;
182
+ }
183
+
184
+ // src/server/define/define-plugin.ts
185
+ function defineTheoPlugin(plugin) {
186
+ return plugin;
187
+ }
188
+
189
+ export {
190
+ defineRoute,
191
+ defineAction,
192
+ defineMiddleware,
193
+ defineAgentEndpoint,
194
+ defineAgentTool,
195
+ defineWebSocket,
196
+ defineWebSocketWeb,
197
+ defineChannel,
198
+ defineWebChannel,
199
+ defineTheoPlugin
200
+ };
201
+ //# sourceMappingURL=chunk-H4J2LECY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/define/define-route.ts","../src/server/define/define-action.ts","../src/server/define/define-middleware.ts","../src/server/define/define-agent-endpoint.ts","../src/server/define/define-agent-tool.ts","../src/server/define/define-websocket.ts","../src/server/define/define-channel.ts","../src/server/define/define-plugin.ts"],"sourcesContent":["import type { z } from 'zod'\n\n// T2.2 (architecture-cleanup) — RouteConfig type moved to core/contracts/\n// (canonical home per ADR-0001 v3). Re-export preserves the public path\n// `import { type RouteConfig } from 'theokit/server'`.\nexport type { RouteConfig } from '../../core/contracts/route-config.js'\n\nimport type { RouteConfig } from '../../core/contracts/route-config.js'\n\n/**\n * Define a typed HTTP route.\n * Identity function — provides type inference for route handlers.\n */\nexport function defineRoute<\n TQuery extends z.ZodType = z.ZodUndefined,\n TBody extends z.ZodType = z.ZodUndefined,\n TParams extends z.ZodType = z.ZodUndefined,\n TCtx = unknown,\n TResponse = unknown,\n>(\n config: RouteConfig<TQuery, TBody, TParams, TCtx, TResponse>,\n): RouteConfig<TQuery, TBody, TParams, TCtx, TResponse> {\n return config\n}\n","import type { z } from 'zod'\n\n/**\n * Action wire-protocol accept mode per plan g3-server-actions-and-useaction\n * v1.2 ADR D1. Default behavior (when omitted) is `'json'`. `'form'` opts the\n * action into FormData multipart parsing for progressive-enhancement forms;\n * the runtime in `server/http/action-execute.ts` will coerce FormData entries\n * against the `input` schema via `formDataToObject` (Astro pattern).\n */\nexport type ActionAccept = 'form' | 'json'\n\nexport interface ActionConfig<TInput extends z.ZodType, TCtx = unknown> {\n /**\n * Zod input schema. Required: every action declares its input contract via\n * Zod (architecture rule: zod-is-SSOT). The shape becomes the handler's\n * typed `input` parameter via `z.infer<TInput>`.\n */\n input: TInput\n /**\n * Wire-protocol accept mode. Defaults to `'json'` when omitted. Setting\n * `'form'` switches the runtime to FormData multipart parsing — the input\n * schema MUST be `z.object(...)` so field-by-field coercion can drive\n * boolean string / number / array coercion (Astro pattern).\n */\n accept?: ActionAccept\n handler: (ctx: { input: z.infer<TInput>; ctx: TCtx }) => unknown\n}\n\n/**\n * Define a typed server action.\n *\n * Identity function — provides type inference for action handlers. The\n * runtime that consumes the config (validation + invocation + serialization)\n * lives in `server/http/action-execute.ts`.\n *\n * Per plan g3-server-actions-and-useaction v1.2 § Phase 1 / T1.2: the new\n * `accept?: 'form' | 'json'` field is the only contract change vs the\n * pre-G3 identity. Existing callsites (`defineAction({input, handler})`)\n * continue to compile — `accept` is opt-in.\n */\nexport function defineAction<TInput extends z.ZodType, TCtx = unknown>(\n config: ActionConfig<TInput, TCtx>,\n): ActionConfig<TInput, TCtx> {\n return config\n}\n","export type MiddlewareHandler = (\n request: Request,\n next: (request: Request) => Promise<Response>,\n) => Response | Promise<Response>\n\n/**\n * Define a middleware handler.\n * Identity function — provides type annotation for middleware.\n */\nexport function defineMiddleware(handler: MiddlewareHandler): MiddlewareHandler {\n return handler\n}\n","import type { z } from 'zod'\n\nimport type { AgentEvent } from '../agent/agent-types.js'\n\nimport type { RouteConfig } from './define-route.js'\n\n/**\n * T5.1 — defineAgentEndpoint\n *\n * Sugar over defineRoute (ADR D4). Accepts an async generator that yields\n * AgentEvents and produces a RouteConfig whose handler returns a Response\n * streaming Server-Sent Events (SSE).\n *\n * Wire format: `data: <JSON>\\n\\n` per event. Standards-compliant.\n *\n * The generator may throw — the wrapper catches and emits a final\n * `{ type: 'error', message }` event before closing the stream.\n *\n * The wrapper observes `request.signal` (EC-7) — when aborted, the\n * underlying generator is told to `return()` and the stream closes\n * promptly.\n *\n * Note (EC-12, Out of Scope): SSE backpressure (slow consumer) is not\n * handled here. For high-frequency token streaming consider a different\n * transport (WS) or a buffer policy. This MVP enqueues each event\n * immediately.\n */\n\nexport interface AgentEndpointHandlerArgs<TCtx = unknown, TBody = unknown> {\n query: undefined\n body: TBody\n params: undefined\n request: Request\n ctx: TCtx\n /**\n * Mutable headers bag that the wrapper merges into the SSE response BEFORE\n * the stream starts. Used by `createConversationHistory` to issue a\n * conversation-id cookie on first request. Append entries via\n * `cookieHeaders.append('set-cookie', '<cookie-string>')`.\n *\n * Cookies appended AFTER the first yield are NOT applied — the response\n * headers commit when the wrapper constructs the Response, before the\n * async generator runs. This is per HTTP semantics, not a wrapper choice.\n */\n cookieHeaders: Headers\n /**\n * Phase 3 (Production-Readiness #5) — request abort signal.\n *\n * Fires when the SSE client disconnects (browser closes tab, abort fetch,\n * etc.). Thread this to `agent.send(msg, { signal })` so the SDK cancels\n * the in-flight provider call — STOPS TOKENS FROM CHARGING for output\n * the user will never receive.\n *\n * EC-1 (MUST FIX): the signal is derived via duck-type detection\n * (`'aborted' in r.signal && typeof r.signal.addEventListener === 'function'`)\n * to survive cross-realm scenarios (Node 18 polyfills, undici, Edge\n * runtimes with their own AbortSignal globals). `instanceof AbortSignal`\n * would fail in those cases.\n */\n signal: AbortSignal\n}\n\nexport interface AgentEndpointConfig<TCtx = unknown, TBody = unknown> {\n handler: (\n args: AgentEndpointHandlerArgs<TCtx, TBody>,\n ) => AsyncGenerator<AgentEvent, void, unknown>\n}\n\nconst SSE_HEADERS = {\n 'content-type': 'text/event-stream',\n 'cache-control': 'no-cache, no-transform',\n connection: 'keep-alive',\n} as const\n\nfunction encodeSSE(event: AgentEvent): Uint8Array {\n return new TextEncoder().encode(`data: ${JSON.stringify(event)}\\n\\n`)\n}\n\n/**\n * Resolve an AbortSignal from either a Web `Request` (`.signal`) or a\n * Node `IncomingMessage` (`.aborted` flag + `'close'`/'aborted' events).\n *\n * The framework's `executeRoute` passes IncomingMessage to route handlers\n * today, but `defineAgentEndpoint` was designed for the Web Standards\n * `Request` shape. This helper bridges both — preventing a runtime crash\n * (`Cannot read properties of undefined (reading 'aborted')`) that would\n * otherwise abort the SSE stream silently before the first yield.\n */\nfunction resolveAbortSignal(request: unknown): AbortSignal {\n if (typeof request !== 'object' || request === null) {\n return new AbortController().signal\n }\n const r = request as {\n signal?: unknown\n aborted?: boolean\n on?: (event: string, cb: () => void) => void\n }\n if (\n typeof r.signal === 'object' &&\n r.signal !== null &&\n 'aborted' in r.signal &&\n typeof (r.signal as AbortSignal).addEventListener === 'function'\n ) {\n return r.signal as AbortSignal\n }\n\n const controller = new AbortController()\n if (r.aborted === true) controller.abort()\n if (typeof r.on === 'function') {\n r.on('close', () => {\n if (!controller.signal.aborted) controller.abort()\n })\n r.on('aborted', () => {\n if (!controller.signal.aborted) controller.abort()\n })\n }\n return controller.signal\n}\n\nexport function defineAgentEndpoint<TBody = unknown, TCtx = unknown>(\n config: AgentEndpointConfig<TCtx, TBody>,\n): RouteConfig<z.ZodUndefined, z.ZodUndefined, z.ZodUndefined, TCtx, Response> {\n return {\n handler: async ({ request, ctx, body, query, params }) => {\n const cookieHeaders = new Headers()\n const signal = resolveAbortSignal(request)\n const generator = config.handler({\n request,\n ctx: ctx,\n body: body as TBody,\n query: query,\n params: params,\n cookieHeaders,\n signal,\n })\n\n // Prime the generator to its first yield. This forces the handler's\n // synchronous + async setup (including `createConversationHistory` if\n // used) to run BEFORE the Response headers commit, so any Set-Cookie\n // lines appended to `cookieHeaders` land in the actual response.\n //\n // First-byte latency cost: bounded by the work up to the first yield\n // (typically 100-500ms for an LLM chat with `agent.send`). Acceptable\n // for the use case; alternative (heuristic detection of cookie writes)\n // is brittle.\n let firstResult: IteratorResult<AgentEvent, void>\n let primeError: unknown\n try {\n firstResult = await generator.next()\n } catch (err) {\n primeError = err\n firstResult = { value: undefined, done: true }\n }\n\n // Merge any cookies the handler issued into the response headers.\n const responseHeaders = new Headers(SSE_HEADERS)\n for (const value of cookieHeaders.getSetCookie()) {\n responseHeaders.append('set-cookie', value)\n }\n\n const stream = new ReadableStream<Uint8Array>({\n async start(controller) {\n const onAbort = () => {\n void generator.return(undefined)\n }\n\n if (signal.aborted) {\n controller.close()\n return\n }\n signal.addEventListener('abort', onAbort, { once: true })\n\n try {\n // If priming threw, yield a final error event and close.\n if (primeError !== undefined) {\n let message: string\n if (primeError instanceof Error) {\n message = primeError.message\n } else if (typeof primeError === 'string') {\n message = primeError\n } else {\n message = 'agent handler failed during setup'\n }\n controller.enqueue(encodeSSE({ type: 'error', message }))\n return\n }\n // Enqueue the primed first value (if any).\n if (firstResult.done !== true) {\n controller.enqueue(encodeSSE(firstResult.value))\n } else {\n return\n }\n // Continue iterating remaining events.\n for await (const event of generator) {\n // `signal.aborted` can flip true asynchronously via the\n // listener registered above. ESLint's narrowing only sees\n // the false assertion at line 114; the dynamic abort is\n // legitimate and the guard prevents enqueue-after-close.\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (signal.aborted) break\n controller.enqueue(encodeSSE(event))\n }\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err)\n controller.enqueue(encodeSSE({ type: 'error', message }))\n } finally {\n signal.removeEventListener('abort', onAbort)\n controller.close()\n }\n },\n cancel() {\n void generator.return(undefined)\n },\n })\n\n return new Response(stream, { headers: responseHeaders })\n },\n }\n}\n","import { z } from 'zod'\n\n/**\n * Item #4 — `defineAgentTool`\n *\n * Sugar over the `@theokit/sdk` `CustomTool` contract. Takes a Zod schema +\n * handler and produces a structurally-compatible `CustomTool` that\n * `Agent.create({ tools: [...] })` accepts.\n *\n * Uses Zod v4's native `z.toJSONSchema()` to convert the input schema to\n * JSON Schema for LLM providers.\n *\n * Handler error propagation:\n * `defineAgentTool` parses the input via the Zod schema BEFORE calling the\n * user handler. Invalid input throws a `ZodError`, which the SDK's tool-\n * dispatcher (or the `streamAgentRun` adapter) sees as a tool failure and\n * surfaces as an `error` AgentEvent on the SSE wire (ADR D3).\n */\n\n/**\n * Local mirror of the SDK's `CustomTool` interface. We don't `import type`\n * from `@theokit/sdk` because the SDK is an optional peer (consumers who\n * never call `defineAgentTool` shouldn't need it installed). The shape is\n * the wire contract; any structurally-matching object is accepted by\n * `Agent.create({ tools })`.\n *\n * @public\n */\nexport interface CustomTool {\n name: string\n description: string\n inputSchema: Record<string, unknown>\n handler: (input: Record<string, unknown>) => string | Promise<string>\n}\n\n/**\n * Spec accepted by {@link defineAgentTool}. `inputSchema` is a Zod 3 schema\n * rooted in `z.object(...)`. The `handler` argument type is inferred via\n * `z.infer<T>`.\n *\n * @public\n */\nexport interface DefineAgentToolSpec<T extends z.ZodType> {\n /** Tool name surfaced to the LLM. Must match `^[a-zA-Z][a-zA-Z0-9_-]{0,63}$`. */\n name: string\n /** Description surfaced to the LLM. Required — drives tool-selection accuracy. */\n description: string\n /** Zod schema describing the input. Must be `z.object(...)` at the root. */\n inputSchema: T\n /** Handler invoked with the parsed input. */\n handler: (input: z.infer<T>) => string | Promise<string>\n}\n\nconst TOOL_NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_-]{0,63}$/\n\nfunction isZodObject(schema: z.ZodType): boolean {\n // Zod 3 stores the typeName at `_def.typeName`. ZodObject has 'ZodObject'.\n // Refinements (`.refine`), transforms (`.transform`), and defaults wrap the\n // underlying schema in ZodEffects / ZodDefault / etc. — walk the chain via\n // `_def.schema` / `_def.innerType` until we hit ZodObject (or give up).\n // Avoids importing the ZodObject class to keep the runtime import surface\n // minimal.\n let current: unknown = schema\n for (let depth = 0; depth < 10; depth++) {\n const def = (current as { _def?: { typeName?: string; schema?: unknown; innerType?: unknown } })\n ._def\n if (def?.typeName === 'ZodObject') return true\n if (def?.schema !== undefined) {\n current = def.schema\n continue\n }\n if (def?.innerType !== undefined) {\n current = def.innerType\n continue\n }\n return false\n }\n return false\n}\n\n/**\n * Build a {@link CustomTool} from a Zod 3 schema + handler.\n *\n * Behavior:\n * - Validates `name` matches the LLM tool-name regex.\n * - Requires `inputSchema` to be a `ZodObject` (Anthropic + SDK contract).\n * - Warns (not throws) if `description` is empty — empty descriptions\n * degrade LLM tool selection.\n * - Converts the Zod schema to JSON Schema 7 inline (no `$ref`s — LLMs handle\n * inline schemas more reliably).\n * - Strips the top-level `$schema` field (Anthropic rejects schemas with\n * `$schema` at root in some provider modes).\n * - Wraps the handler to parse the input via the Zod schema BEFORE invoking\n * the user code — bad LLM-supplied input throws `ZodError`, which the SDK\n * converts to `tool_result(isError)`.\n *\n * @public\n */\nexport function defineAgentTool<T extends z.ZodType>(spec: DefineAgentToolSpec<T>): CustomTool {\n if (!TOOL_NAME_REGEX.test(spec.name)) {\n throw new Error(\n `defineAgentTool: name must match ${TOOL_NAME_REGEX.source}. Got: ${JSON.stringify(spec.name)}`,\n )\n }\n if (!isZodObject(spec.inputSchema)) {\n throw new Error('defineAgentTool: inputSchema must be a ZodObject (z.object({...}))')\n }\n if (spec.description.length === 0) {\n console.warn(\n `defineAgentTool(${JSON.stringify(spec.name)}): empty description degrades LLM tool selection — provide a one-sentence summary.`,\n )\n }\n\n // Zod v4 native JSON Schema conversion — replaces zod-to-json-schema dep.\n // Strip $schema (Anthropic + some providers reject it).\n const { $schema: _$schema, ...inputSchema } = z.toJSONSchema(spec.inputSchema) as Record<string, unknown> & {\n $schema?: unknown\n }\n\n return {\n name: spec.name,\n description: spec.description,\n inputSchema,\n handler: async (input: Record<string, unknown>): Promise<string> => {\n const parsed = spec.inputSchema.parse(input) as z.infer<T>\n return await spec.handler(parsed)\n },\n }\n}\n","import type { IncomingMessage } from 'node:http'\n\nexport interface WebSocketLike {\n send(data: string | Buffer): void\n close(code?: number, reason?: string): void\n}\n\nexport interface WebSocketHandler {\n onOpen?: (ws: WebSocketLike, req: IncomingMessage) => void\n onMessage?: (ws: WebSocketLike, data: string | Buffer) => void\n onClose?: (ws: WebSocketLike, code: number, reason: Buffer) => void\n onError?: (ws: WebSocketLike, error: Error) => void\n}\n\n/**\n * Define a WebSocket endpoint handler.\n * Identity function — provides type inference for WebSocket handlers.\n */\nexport function defineWebSocket(handler: WebSocketHandler): WebSocketHandler {\n return handler\n}\n\n/**\n * T5a.2 Phase F slice 3/3 — Web-Standards WebSocket endpoint handler.\n *\n * Mirror of `WebSocketHandler` for the Web `Request` shape. `onOpen`\n * receives `request: Request` instead of `req: IncomingMessage`. The\n * rest of the lifecycle (onMessage, onClose, onError) is shape-agnostic\n * (`WebSocketLike` is already Web-standards-compatible per the existing\n * design — `send(string | Buffer)` works on both Node `ws` and Web\n * `WebSocket` instances; CF Workers / Bun / Deno coerce as needed at\n * the adapter boundary).\n *\n * Per `docs/plans/t5a2-incoming-message-to-request-shape-refactor-plan.md`\n * v1.0 § Phase F (closes Phase F).\n *\n * **Architectural note — WebSocket upgrade semantics differ across runtimes:**\n * - Node + `ws`: `WebSocketServer.handleUpgrade(req, socket, head, cb)` —\n * `req` is `IncomingMessage`. Use `WebSocketHandler`.\n * - CF Workers: `new WebSocketPair()` + `request.headers` (the upgrade\n * handshake IS a Web Request). Use `WebSocketHandlerWeb`.\n * - Bun: `server.upgrade(request, { data })` — same Web Request shape.\n * - Deno: `Deno.upgradeWebSocket(request)` — same Web Request shape.\n *\n * Cross-runtime WebSocket endpoints ship BOTH `WebSocketHandler` +\n * `WebSocketHandlerWeb` exports; the runtime adapter picks the matching\n * one. This is the canonical Hono / Nitric pattern.\n */\nexport interface WebSocketHandlerWeb {\n onOpen?: (ws: WebSocketLike, request: Request) => void\n onMessage?: (ws: WebSocketLike, data: string | Uint8Array) => void\n onClose?: (ws: WebSocketLike, code: number, reason: string) => void\n onError?: (ws: WebSocketLike, error: Error) => void\n}\n\n/**\n * Web-Standards `defineWebSocket` sibling. Identity function — provides\n * type inference for Web WebSocket handlers.\n *\n * **Type difference note vs Node path:**\n * - `onMessage` data is `string | Uint8Array` instead of `string | Buffer`\n * (Web standards have no `Buffer`; Node's Buffer is a Uint8Array\n * subclass so the Node path's Buffer values flow through unchanged\n * when adapters wrap them).\n * - `onClose` reason is `string` instead of `Buffer` (Web `CloseEvent`\n * exposes the reason as a UTF-8 string natively).\n */\nexport function defineWebSocketWeb(handler: WebSocketHandlerWeb): WebSocketHandlerWeb {\n return handler\n}\n","import type { IncomingMessage } from 'node:http'\n\nimport type { WebSocketLike } from './define-websocket.js'\n\nexport interface ChannelHandler<TMessage = unknown> {\n onSubscribe?: (ws: WebSocketLike, room: string, req: IncomingMessage) => void\n onMessage?: (ws: WebSocketLike, room: string, data: TMessage) => void\n onUnsubscribe?: (ws: WebSocketLike, room: string) => void\n}\n\n/**\n * Define a channel handler for WebSocket rooms.\n * Identity function — provides type inference for channel handlers.\n */\nexport function defineChannel<TMessage = unknown>(\n handler: ChannelHandler<TMessage>,\n): ChannelHandler<TMessage> {\n return handler\n}\n\n/**\n * T5a.2 Phase F slice 2/3 — Web-Standards channel handler.\n *\n * Mirror of `ChannelHandler<TMessage>` for the Web `Request` shape.\n * `onSubscribe` receives `request: Request` instead of `req: IncomingMessage`\n * — the rest of the surface (onMessage, onUnsubscribe) is shape-agnostic\n * (WebSocketLike is already Web-standards-compatible per `define-websocket.ts`).\n *\n * Per `docs/plans/t5a2-incoming-message-to-request-shape-refactor-plan.md`\n * v1.0 § Phase F.\n *\n * **Architectural note:** WebSocket upgrade semantics differ across\n * runtimes:\n * - Node: `WebSocketServer.handleUpgrade(req, socket, head, cb)` —\n * hands you `req: IncomingMessage` at the upgrade handshake.\n * - CF Workers: `new WebSocketPair()` + `request.headers` (the upgrade\n * handshake IS a Web Request) — hands you `request: Request`.\n * - Bun: `server.upgrade(request, { data })` — same Web Request shape.\n * - Deno: `Deno.upgradeWebSocket(request)` — same Web Request shape.\n *\n * Channel handlers targeting CF/Bun/Deno use `WebChannelHandler`; legacy\n * Node consumers stay on `ChannelHandler`. Cross-runtime channels ship\n * both shapes.\n */\nexport interface WebChannelHandler<TMessage = unknown> {\n onSubscribe?: (ws: WebSocketLike, room: string, request: Request) => void\n onMessage?: (ws: WebSocketLike, room: string, data: TMessage) => void\n onUnsubscribe?: (ws: WebSocketLike, room: string) => void\n}\n\n/**\n * Web-Standards `defineChannel` sibling. Identity function — provides\n * type inference for Web channel handlers.\n */\nexport function defineWebChannel<TMessage = unknown>(\n handler: WebChannelHandler<TMessage>,\n): WebChannelHandler<TMessage> {\n return handler\n}\n","import type { TheoPlugin } from '../plugin-types.js'\n\n/**\n * Identity function for defining a Theo plugin.\n *\n * **Note:** Prefer `definePlugin` (shorter, canonical name per ADR-0008 D6).\n * Both functions are identical — `defineTheoPlugin` is kept as an alias for\n * existing in-tree consumers without forcing a migration sweep.\n */\nexport function defineTheoPlugin(plugin: TheoPlugin): TheoPlugin {\n return plugin\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,256 @@
1
+ // src/server/plugins/plugin-runner.ts
2
+ var DuplicatePluginError = class extends Error {
3
+ constructor(name) {
4
+ super(`Plugin "${name}" is already registered.`);
5
+ this.name = "DuplicatePluginError";
6
+ }
7
+ };
8
+ var DuplicateDecorationError = class extends Error {
9
+ constructor(key, existingPlugin, newPlugin) {
10
+ super(
11
+ `Plugin "${newPlugin}" tried to decorate ctx.${key}, but it is already declared by plugin "${existingPlugin}".`
12
+ );
13
+ this.name = "DuplicateDecorationError";
14
+ }
15
+ };
16
+ var PluginRunner = class {
17
+ plugins = /* @__PURE__ */ new Set();
18
+ pluginScopes = /* @__PURE__ */ new Map();
19
+ onRequestHooks = [];
20
+ preHandlerHooks = [];
21
+ onResponseHooks = [];
22
+ onErrorHooks = [];
23
+ /**
24
+ * Parent app — proto-chain root for all child scopes. Has its OWN empty
25
+ * decorations map (parent never receives `decorateRequest` calls under
26
+ * the T3.1 contract; only child scopes do).
27
+ */
28
+ parentDecorations = /* @__PURE__ */ new Map();
29
+ parentApp = this.buildParentAppFacade();
30
+ has(name) {
31
+ return this.plugins.has(name);
32
+ }
33
+ /**
34
+ * Per T3.1 (C1 plugin scope encapsulation):
35
+ * 1. Reserve the plugin name (still rejects duplicates).
36
+ * 2. Build a CHILD TheoApp via `Object.create(parentApp)` — Fastify
37
+ * `plugin-override.js:38` pattern. The child's own `decorateRequest`
38
+ * populates per-scope `decorations`; the child's `addHook` still
39
+ * forwards into the shared hook lists (hooks ARE process-global —
40
+ * only decorations are scoped, mirroring Fastify's decoration vs
41
+ * hook semantics).
42
+ * 3. Invoke `plugin.register(childApp)`.
43
+ *
44
+ * Cross-plugin decoration-key collisions are PERMITTED (per blueprint
45
+ * D1). The legacy `DuplicateDecorationError` is no longer thrown.
46
+ */
47
+ async register(plugin) {
48
+ if (this.plugins.has(plugin.name)) {
49
+ throw new DuplicatePluginError(plugin.name);
50
+ }
51
+ this.plugins.add(plugin.name);
52
+ const scope = this.buildPluginScope(plugin.name);
53
+ this.pluginScopes.set(plugin.name, scope);
54
+ try {
55
+ await plugin.register(scope.app);
56
+ } catch (err) {
57
+ this.plugins.delete(plugin.name);
58
+ this.pluginScopes.delete(plugin.name);
59
+ throw err;
60
+ }
61
+ }
62
+ /**
63
+ * Build the parent app facade. Hooks forward to shared lists.
64
+ * `decorateRequest` writes into the parent decorations map — used only
65
+ * if a future consumer registers a non-plugin "app-level" decoration
66
+ * directly. T3.1 contract: plugins decorate ONLY through child scopes.
67
+ */
68
+ buildParentAppFacade() {
69
+ const facade = {
70
+ addHook: (name, fn) => {
71
+ this.routeHookByName(name, fn);
72
+ },
73
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- T documents the per-decoration type for consumers
74
+ decorateRequest: (key, value) => {
75
+ this.parentDecorations.set(key, value);
76
+ }
77
+ };
78
+ return facade;
79
+ }
80
+ /**
81
+ * Build a child scope via `Object.create(parentApp)` so the child
82
+ * inherits the parent's facade methods through the prototype chain.
83
+ * Then override `decorateRequest` on the child instance so writes
84
+ * land in the per-scope `decorations` map (parent is NOT mutated).
85
+ */
86
+ buildPluginScope(_pluginName) {
87
+ const decorations = /* @__PURE__ */ new Map();
88
+ const childApp = Object.create(this.parentApp);
89
+ Object.defineProperty(childApp, "decorateRequest", {
90
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- T documents the per-decoration type for consumers
91
+ value: (key, value) => {
92
+ if (typeof key !== "string") {
93
+ throw new TypeError(
94
+ `decorateRequest: invalid key (expected string, got ${typeof key}). Plugin authors MUST pass string keys.`
95
+ );
96
+ }
97
+ decorations.set(key, value);
98
+ },
99
+ enumerable: false,
100
+ writable: false,
101
+ configurable: false
102
+ });
103
+ Object.defineProperty(childApp, "decorations", {
104
+ get: () => Object.fromEntries(decorations),
105
+ enumerable: false,
106
+ configurable: false
107
+ });
108
+ return { app: childApp, decorations };
109
+ }
110
+ routeHookByName(name, fn) {
111
+ switch (name) {
112
+ case "onRequest":
113
+ this.onRequestHooks.push(fn);
114
+ return;
115
+ case "preHandler":
116
+ this.preHandlerHooks.push(fn);
117
+ return;
118
+ case "onResponse":
119
+ this.onResponseHooks.push(fn);
120
+ return;
121
+ case "onError":
122
+ this.onErrorHooks.push(fn);
123
+ return;
124
+ }
125
+ }
126
+ /**
127
+ * Apply ALL plugin scopes' decorations into the request ctx. Per T3.1,
128
+ * sibling plugins MAY decorate the same key — last-writer-wins at apply
129
+ * time (ordering = registration order). This keeps the legacy
130
+ * `ctx.<key>` flat surface working for consumers that already aggregate
131
+ * decorations into a single bag.
132
+ */
133
+ applyDecorations(ctx) {
134
+ for (const scope of this.pluginScopes.values()) {
135
+ for (const [key, value] of scope.decorations.entries()) {
136
+ ctx[key] = value;
137
+ }
138
+ }
139
+ }
140
+ /**
141
+ * Apply ONLY one plugin's scoped decorations into `target`. Used by
142
+ * the T1.1 RED-3 test (sibling isolation proof) and by future scope-aware
143
+ * dispatch paths. Throws if the plugin name isn't registered.
144
+ */
145
+ applyScopedDecorations(pluginName, target) {
146
+ const scope = this.pluginScopes.get(pluginName);
147
+ if (!scope) throw new Error(`PluginRunner: unknown plugin "${pluginName}"`);
148
+ for (const [key, value] of scope.decorations.entries()) {
149
+ target[key] = value;
150
+ }
151
+ }
152
+ /** T1.1 RED-1/RED-4 introspection: returns the child TheoApp built for `pluginName`. */
153
+ getPluginScope(pluginName) {
154
+ const scope = this.pluginScopes.get(pluginName);
155
+ if (!scope) throw new Error(`PluginRunner: unknown plugin "${pluginName}"`);
156
+ return scope.app;
157
+ }
158
+ /** T1.1 RED-4: returns the parent TheoApp (root of every child's proto chain). */
159
+ getParentApp() {
160
+ return this.parentApp;
161
+ }
162
+ /** T1.1 RED-2: returns the parent's decorations map (NEVER touched by plugin decorate calls under T3.1 contract). */
163
+ getParentDecorations() {
164
+ return this.parentDecorations;
165
+ }
166
+ async runOnRequest(ctx) {
167
+ return this.runHookList(this.onRequestHooks, ctx);
168
+ }
169
+ async runPreHandler(ctx) {
170
+ return this.runHookList(this.preHandlerHooks, ctx);
171
+ }
172
+ async runOnResponse(ctx, options = {}) {
173
+ return this.runHookList(this.onResponseHooks, ctx, options);
174
+ }
175
+ /**
176
+ * Run all onError hooks. Swallows errors thrown inside hooks themselves to
177
+ * prevent recursion (an error in an error handler must not trigger onError
178
+ * again).
179
+ */
180
+ async runOnError(ctx, error) {
181
+ const errorCtx = { ...ctx, error };
182
+ for (const hook of this.onErrorHooks) {
183
+ try {
184
+ await hook(errorCtx);
185
+ } catch (innerErr) {
186
+ console.error(
187
+ `[plugin-runner] onError hook threw; suppressed to avoid recursion:`,
188
+ innerErr
189
+ );
190
+ }
191
+ }
192
+ return { shortCircuited: false };
193
+ }
194
+ async runHookList(hooks, ctx, options = {}) {
195
+ for (const hook of hooks) {
196
+ try {
197
+ await hook(ctx);
198
+ } catch (err) {
199
+ if (options.inErrorPath) {
200
+ console.error(`[plugin-runner] hook threw during error path; suppressed (EC-9):`, err);
201
+ continue;
202
+ }
203
+ throw err;
204
+ }
205
+ if (ctx.response.writableEnded || ctx.response.headersSent) {
206
+ return { shortCircuited: true };
207
+ }
208
+ }
209
+ return { shortCircuited: false };
210
+ }
211
+ };
212
+
213
+ // src/server/plugins/load-plugins.ts
214
+ var InvalidPluginShapeError = class extends Error {
215
+ constructor(index, reason) {
216
+ super(`plugins[${index}] is not a valid TheoPlugin: ${reason}`);
217
+ this.name = "InvalidPluginShapeError";
218
+ }
219
+ };
220
+ function isPlugin(value, index) {
221
+ if (value == null || typeof value !== "object") {
222
+ throw new InvalidPluginShapeError(index, "expected an object");
223
+ }
224
+ const v = value;
225
+ if (typeof v.name !== "string" || v.name.length === 0) {
226
+ throw new InvalidPluginShapeError(index, 'missing "name" string');
227
+ }
228
+ if (typeof v.register !== "function") {
229
+ throw new InvalidPluginShapeError(index, 'missing "register" function');
230
+ }
231
+ return true;
232
+ }
233
+ async function createPluginRunnerFromConfig(plugins) {
234
+ if (plugins == null) return void 0;
235
+ if (!Array.isArray(plugins)) return void 0;
236
+ if (plugins.length === 0) return void 0;
237
+ const runner = new PluginRunner();
238
+ const pluginsArray = plugins;
239
+ for (let i = 0; i < pluginsArray.length; i++) {
240
+ const candidate = pluginsArray[i];
241
+ if (!isPlugin(candidate, i)) {
242
+ continue;
243
+ }
244
+ await runner.register(candidate);
245
+ }
246
+ return runner;
247
+ }
248
+
249
+ export {
250
+ DuplicatePluginError,
251
+ DuplicateDecorationError,
252
+ PluginRunner,
253
+ InvalidPluginShapeError,
254
+ createPluginRunnerFromConfig
255
+ };
256
+ //# sourceMappingURL=chunk-IAJ2JVEH.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server/plugins/plugin-runner.ts","../src/server/plugins/load-plugins.ts"],"sourcesContent":["import type {\n HookName,\n HookResult,\n OnErrorHook,\n OnRequestHook,\n OnResponseHook,\n PluginContext,\n PluginErrorContext,\n PreHandlerHook,\n RunHookOptions,\n TheoApp,\n TheoPlugin,\n} from '../plugin-types.js'\n\nexport class DuplicatePluginError extends Error {\n constructor(name: string) {\n super(`Plugin \"${name}\" is already registered.`)\n this.name = 'DuplicatePluginError'\n }\n}\n\n/**\n * @deprecated Per T3.1 (C1 plugin scope encapsulation) — duplicate decoration\n * keys across sibling plugins are now PERMITTED because each plugin gets its\n * own child scope via `Object.create(parent)` (Fastify pattern, ADR-0028\n * blueprint D1). This class is retained for one minor cycle so consumers who\n * `instanceof DuplicateDecorationError` continue to compile; the constructor\n * is no longer reachable from `PluginRunner.register()`. Removal scheduled\n * for 0.x+2 per CHANGELOG.\n */\nexport class DuplicateDecorationError extends Error {\n constructor(key: string, existingPlugin: string, newPlugin: string) {\n super(\n `Plugin \"${newPlugin}\" tried to decorate ctx.${key}, but it is already declared by plugin \"${existingPlugin}\".`,\n )\n this.name = 'DuplicateDecorationError'\n }\n}\n\n/**\n * Per-plugin scope built by `Object.create(parentApp)` at `register()` time\n * (T3.1 / Fastify `plugin-override.js:38` pattern). Each plugin's\n * `decorateRequest` calls populate THIS scope's `decorations` map only —\n * parent + sibling scopes are isolated through the JavaScript prototype chain.\n */\ninterface PluginScope {\n /** The child TheoApp instance whose proto chain points at `parentApp`. */\n app: TheoApp\n /** Per-plugin decorations map. Cross-plugin key collision is permitted. */\n decorations: Map<string, unknown>\n}\n\nexport class PluginRunner {\n private plugins = new Set<string>()\n private pluginScopes = new Map<string, PluginScope>()\n private onRequestHooks: OnRequestHook[] = []\n private preHandlerHooks: PreHandlerHook[] = []\n private onResponseHooks: OnResponseHook[] = []\n private onErrorHooks: OnErrorHook[] = []\n\n /**\n * Parent app — proto-chain root for all child scopes. Has its OWN empty\n * decorations map (parent never receives `decorateRequest` calls under\n * the T3.1 contract; only child scopes do).\n */\n private parentDecorations = new Map<string, unknown>()\n private parentApp: TheoApp = this.buildParentAppFacade()\n\n has(name: string): boolean {\n return this.plugins.has(name)\n }\n\n /**\n * Per T3.1 (C1 plugin scope encapsulation):\n * 1. Reserve the plugin name (still rejects duplicates).\n * 2. Build a CHILD TheoApp via `Object.create(parentApp)` — Fastify\n * `plugin-override.js:38` pattern. The child's own `decorateRequest`\n * populates per-scope `decorations`; the child's `addHook` still\n * forwards into the shared hook lists (hooks ARE process-global —\n * only decorations are scoped, mirroring Fastify's decoration vs\n * hook semantics).\n * 3. Invoke `plugin.register(childApp)`.\n *\n * Cross-plugin decoration-key collisions are PERMITTED (per blueprint\n * D1). The legacy `DuplicateDecorationError` is no longer thrown.\n */\n async register(plugin: TheoPlugin): Promise<void> {\n if (this.plugins.has(plugin.name)) {\n throw new DuplicatePluginError(plugin.name)\n }\n // Add to registry FIRST so duplicate detection works even if register throws.\n this.plugins.add(plugin.name)\n\n const scope = this.buildPluginScope(plugin.name)\n this.pluginScopes.set(plugin.name, scope)\n\n try {\n await plugin.register(scope.app)\n } catch (err) {\n // Roll back partial registration so a failed plugin does not leave\n // half-mounted state (T1.1 BDD \"error scenario: plugin throws in\n // register → parent recovery is clean\").\n this.plugins.delete(plugin.name)\n this.pluginScopes.delete(plugin.name)\n throw err\n }\n }\n\n /**\n * Build the parent app facade. Hooks forward to shared lists.\n * `decorateRequest` writes into the parent decorations map — used only\n * if a future consumer registers a non-plugin \"app-level\" decoration\n * directly. T3.1 contract: plugins decorate ONLY through child scopes.\n */\n private buildParentAppFacade(): TheoApp {\n const facade: TheoApp = {\n addHook: (name: HookName, fn: unknown) => {\n this.routeHookByName(name, fn)\n },\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- T documents the per-decoration type for consumers\n decorateRequest: <T>(key: string, value: T) => {\n this.parentDecorations.set(key, value)\n },\n }\n return facade\n }\n\n /**\n * Build a child scope via `Object.create(parentApp)` so the child\n * inherits the parent's facade methods through the prototype chain.\n * Then override `decorateRequest` on the child instance so writes\n * land in the per-scope `decorations` map (parent is NOT mutated).\n */\n private buildPluginScope(_pluginName: string): PluginScope {\n const decorations = new Map<string, unknown>()\n const childApp: TheoApp = Object.create(this.parentApp) as TheoApp\n // Override decorateRequest on the child instance — parent's facade\n // method stays untouched, so `getParentApp().decorateRequest` still\n // writes to parentDecorations. This is the canonical Fastify pattern.\n // `_pluginName` reserved for future per-scope diagnostics (underscore\n // prefix marks intentional unused param per project lint convention).\n Object.defineProperty(childApp, 'decorateRequest', {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters -- T documents the per-decoration type for consumers\n value: <T>(key: string, value: T) => {\n if (typeof key !== 'string') {\n throw new TypeError(\n `decorateRequest: invalid key (expected string, got ${typeof key}). ` +\n `Plugin authors MUST pass string keys.`,\n )\n }\n decorations.set(key, value)\n },\n enumerable: false,\n writable: false,\n configurable: false,\n })\n // Expose `decorations` on the child instance so `getPluginScope()`\n // consumers (devtools, tests) can introspect without touching this\n // private map. Read-only property — the JS prototype chain rule means\n // child.decorations shadows any parent.decorations the proto exposes.\n Object.defineProperty(childApp, 'decorations', {\n get: () => Object.fromEntries(decorations),\n enumerable: false,\n configurable: false,\n })\n return { app: childApp, decorations }\n }\n\n private routeHookByName(name: HookName, fn: unknown): void {\n switch (name) {\n case 'onRequest':\n this.onRequestHooks.push(fn as OnRequestHook)\n return\n case 'preHandler':\n this.preHandlerHooks.push(fn as PreHandlerHook)\n return\n case 'onResponse':\n this.onResponseHooks.push(fn as OnResponseHook)\n return\n case 'onError':\n this.onErrorHooks.push(fn as OnErrorHook)\n return\n }\n }\n\n /**\n * Apply ALL plugin scopes' decorations into the request ctx. Per T3.1,\n * sibling plugins MAY decorate the same key — last-writer-wins at apply\n * time (ordering = registration order). This keeps the legacy\n * `ctx.<key>` flat surface working for consumers that already aggregate\n * decorations into a single bag.\n */\n applyDecorations(ctx: Record<string, unknown>): void {\n for (const scope of this.pluginScopes.values()) {\n for (const [key, value] of scope.decorations.entries()) {\n ctx[key] = value\n }\n }\n }\n\n /**\n * Apply ONLY one plugin's scoped decorations into `target`. Used by\n * the T1.1 RED-3 test (sibling isolation proof) and by future scope-aware\n * dispatch paths. Throws if the plugin name isn't registered.\n */\n applyScopedDecorations(pluginName: string, target: Record<string, unknown>): void {\n const scope = this.pluginScopes.get(pluginName)\n if (!scope) throw new Error(`PluginRunner: unknown plugin \"${pluginName}\"`)\n for (const [key, value] of scope.decorations.entries()) {\n target[key] = value\n }\n }\n\n /** T1.1 RED-1/RED-4 introspection: returns the child TheoApp built for `pluginName`. */\n getPluginScope(pluginName: string): TheoApp {\n const scope = this.pluginScopes.get(pluginName)\n if (!scope) throw new Error(`PluginRunner: unknown plugin \"${pluginName}\"`)\n return scope.app\n }\n\n /** T1.1 RED-4: returns the parent TheoApp (root of every child's proto chain). */\n getParentApp(): TheoApp {\n return this.parentApp\n }\n\n /** T1.1 RED-2: returns the parent's decorations map (NEVER touched by plugin decorate calls under T3.1 contract). */\n getParentDecorations(): Map<string, unknown> {\n return this.parentDecorations\n }\n\n async runOnRequest(ctx: PluginContext): Promise<HookResult> {\n return this.runHookList(this.onRequestHooks, ctx)\n }\n\n async runPreHandler(ctx: PluginContext): Promise<HookResult> {\n return this.runHookList(this.preHandlerHooks, ctx)\n }\n\n async runOnResponse(ctx: PluginContext, options: RunHookOptions = {}): Promise<HookResult> {\n return this.runHookList(this.onResponseHooks, ctx, options)\n }\n\n /**\n * Run all onError hooks. Swallows errors thrown inside hooks themselves to\n * prevent recursion (an error in an error handler must not trigger onError\n * again).\n */\n async runOnError(ctx: PluginContext, error: unknown): Promise<HookResult> {\n const errorCtx: PluginErrorContext = { ...ctx, error }\n for (const hook of this.onErrorHooks) {\n try {\n await hook(errorCtx)\n } catch (innerErr) {\n // EC-9 + onError-safety: swallow to avoid recursion. Diagnostic\n // surface only — error context is preserved via innerErr arg.\n console.error(\n `[plugin-runner] onError hook threw; suppressed to avoid recursion:`,\n innerErr,\n )\n }\n }\n return { shortCircuited: false }\n }\n\n private async runHookList(\n hooks: readonly ((ctx: PluginContext) => void | Promise<void>)[],\n ctx: PluginContext,\n options: RunHookOptions = {},\n ): Promise<HookResult> {\n for (const hook of hooks) {\n try {\n await hook(ctx)\n } catch (err) {\n if (options.inErrorPath) {\n // EC-9: we're already handling an error; do NOT trigger onError again.\n // Diagnostic surface only — original error preserved via err arg.\n console.error(`[plugin-runner] hook threw during error path; suppressed (EC-9):`, err)\n continue\n }\n throw err\n }\n if (ctx.response.writableEnded || ctx.response.headersSent) {\n return { shortCircuited: true }\n }\n }\n return { shortCircuited: false }\n }\n}\n","import type { TheoPlugin } from '../plugin-types.js'\n\nimport { PluginRunner } from './plugin-runner.js'\n\nexport class InvalidPluginShapeError extends Error {\n constructor(index: number, reason: string) {\n super(`plugins[${index}] is not a valid TheoPlugin: ${reason}`)\n this.name = 'InvalidPluginShapeError'\n }\n}\n\nfunction isPlugin(value: unknown, index: number): value is TheoPlugin {\n if (value == null || typeof value !== 'object') {\n throw new InvalidPluginShapeError(index, 'expected an object')\n }\n const v = value as Record<string, unknown>\n if (typeof v.name !== 'string' || v.name.length === 0) {\n throw new InvalidPluginShapeError(index, 'missing \"name\" string')\n }\n if (typeof v.register !== 'function') {\n throw new InvalidPluginShapeError(index, 'missing \"register\" function')\n }\n return true\n}\n\n/**\n * Build a PluginRunner from a list of plugins typically declared in\n * `theo.config.ts` under the `plugins` field. Returns `undefined` when no\n * plugins are configured so callers can pass `undefined` to `executeRoute`\n * and preserve the zero-overhead path.\n */\nexport async function createPluginRunnerFromConfig(\n plugins: unknown,\n): Promise<PluginRunner | undefined> {\n if (plugins == null) return undefined\n if (!Array.isArray(plugins)) return undefined\n if (plugins.length === 0) return undefined\n\n const runner = new PluginRunner()\n const pluginsArray: unknown[] = plugins\n for (let i = 0; i < pluginsArray.length; i++) {\n const candidate: unknown = pluginsArray[i]\n if (!isPlugin(candidate, i)) {\n // Unreachable in practice — `isPlugin` throws on invalid input.\n // The branch exists to narrow `candidate` to TheoPlugin below.\n continue\n }\n await runner.register(candidate)\n }\n return runner\n}\n"],"mappings":"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","names":[]}