theokit 0.4.0-beta.0 → 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 (297) 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-ITIYTBXO.js → app-typed-client-OUJO3V5J.js} +10 -5
  5. package/dist/{app-typed-client-62FYBLVJ.js.map → app-typed-client-OUJO3V5J.js.map} +1 -1
  6. package/dist/{app-typed-client-62FYBLVJ.js → app-typed-client-YOMWSA3F.js} +11 -6
  7. package/dist/{app-typed-client-ITIYTBXO.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-HIGHJQQV.js → build-D4J7XECU.js} +31 -22
  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-BIGBFZSU.js → chunk-2F4FROEQ.js} +1689 -1521
  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-JAAHOGKI.js → chunk-M2EY7KDR.js} +1223 -1124
  74. package/dist/chunk-M2EY7KDR.js.map +1 -0
  75. package/dist/{chunk-2VQKDRVF.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-B6RP57M3.js → chunk-OLPB36O2.js} +4 -4
  82. package/dist/chunk-PIVX3DYW.js +142 -0
  83. package/dist/chunk-PIVX3DYW.js.map +1 -0
  84. package/dist/{chunk-7TOMTMHT.js → chunk-R7OC6UDK.js} +2 -1
  85. package/dist/chunk-R7OC6UDK.js.map +1 -0
  86. package/dist/chunk-RESN62GB.js +269 -0
  87. package/dist/chunk-RESN62GB.js.map +1 -0
  88. package/dist/{chunk-64JI5LTO.js → chunk-RMU7EBRO.js} +2 -2
  89. package/dist/chunk-RMU7EBRO.js.map +1 -0
  90. package/dist/chunk-TQYSPYKU.js +131 -0
  91. package/dist/chunk-TQYSPYKU.js.map +1 -0
  92. package/dist/chunk-TSLSIRBR.js +107 -0
  93. package/dist/chunk-TSLSIRBR.js.map +1 -0
  94. package/dist/{chunk-XP7YXRHO.js → chunk-U6TPSW4L.js} +37 -5
  95. package/dist/chunk-U6TPSW4L.js.map +1 -0
  96. package/dist/chunk-UD3LFGDL.js +45 -0
  97. package/dist/chunk-UD3LFGDL.js.map +1 -0
  98. package/dist/chunk-UUFYP2UM.js +161 -0
  99. package/dist/chunk-UUFYP2UM.js.map +1 -0
  100. package/dist/{chunk-OXIQI2XZ.js → chunk-VBZCVFSA.js} +2 -2
  101. package/dist/chunk-VMEWD57H.js +137 -0
  102. package/dist/chunk-VMEWD57H.js.map +1 -0
  103. package/dist/{chunk-TRH2L3FI.js → chunk-WEGALZEU.js} +3 -3
  104. package/dist/{chunk-ZOXNJV2O.js → chunk-WGHJD6I7.js} +35 -138
  105. package/dist/chunk-WGHJD6I7.js.map +1 -0
  106. package/dist/chunk-XMS5VRIK.js +0 -0
  107. package/dist/chunk-Y4H3JNVK.js +18 -0
  108. package/dist/chunk-Y4H3JNVK.js.map +1 -0
  109. package/dist/chunk-Z5IGLBWE.js +329 -0
  110. package/dist/chunk-Z5IGLBWE.js.map +1 -0
  111. package/dist/chunk-ZEGYW52B.js +26 -0
  112. package/dist/chunk-ZEGYW52B.js.map +1 -0
  113. package/dist/chunk-ZJQ4O76G.js +87 -0
  114. package/dist/chunk-ZJQ4O76G.js.map +1 -0
  115. package/dist/cli/index.js +32 -21
  116. package/dist/cli/index.js.map +1 -1
  117. package/dist/client/index.d.ts +107 -1
  118. package/dist/client/index.js +152 -6
  119. package/dist/client/index.js.map +1 -1
  120. package/dist/{cloudflare-LCAOTRYZ.js → cloudflare-OJGJ7R2D.js} +3 -3
  121. package/dist/configure-agent-registry-6YGTJYBC.js +0 -0
  122. package/dist/cookies-MJKMGJ7N.js +22 -0
  123. package/dist/csrf-BBrEZSBW.d.ts +107 -0
  124. package/dist/csrf-readiness-store-CjIoub3U.d.ts +43 -0
  125. package/dist/define-websocket-CdK94O-D.d.ts +64 -0
  126. package/dist/{deno-deploy-ZN4RE5HF.js → deno-deploy-BHWKFTOW.js} +3 -3
  127. package/dist/{dev-266MVCVA.js → dev-MJVSRZGF.js} +11 -11
  128. package/dist/{dev-emit-RBSFZZNO.js → dev-emit-5VPRCHOD.js} +39 -142
  129. package/dist/dev-emit-5VPRCHOD.js.map +1 -0
  130. package/dist/{dev-emit-NO6OZJOQ.js → dev-emit-HHP2XJXE.js} +5 -5
  131. package/dist/devtools/entry.js +185 -131
  132. package/dist/devtools/entry.js.map +1 -1
  133. package/dist/{dispatcher-AQJGI3HU.js → dispatcher-63LBXYLE.js} +2 -2
  134. package/dist/{dispatcher-E6QV32BO.js → dispatcher-EJME6C6M.js} +5 -2
  135. package/dist/dispatcher-EJME6C6M.js.map +1 -0
  136. package/dist/{dist-5V77Z223.js → dist-KRW6OVD4.js} +7 -7
  137. package/dist/dist-KRW6OVD4.js.map +1 -0
  138. package/dist/docker-EZDA5FT7.js +0 -0
  139. package/dist/error-envelope-BsNzzAV5.d.ts +62 -0
  140. package/dist/{generate-DT4IIAHF.js → generate-AZ2K6Z2Z.js} +75 -2
  141. package/dist/generate-AZ2K6Z2Z.js.map +1 -0
  142. package/dist/index-DWWEdFh5.d.ts +399 -0
  143. package/dist/index.d.ts +161 -1391
  144. package/dist/index.js +20 -8
  145. package/dist/index.js.map +1 -1
  146. package/dist/{info-FJ4NXKTB.js → info-47VB62MV.js} +5 -5
  147. package/dist/job-backend-CgC8Xf33.d.ts +68 -0
  148. package/dist/{lib-NL5JXGEB.js → lib-NST3PNZX.js} +31 -31
  149. package/dist/lib-NST3PNZX.js.map +1 -0
  150. package/dist/module-loader-Cfz7dgCP.d.ts +26 -0
  151. package/dist/{netlify-5VQ22Z2P.js → netlify-GSNSJGMN.js} +3 -3
  152. package/dist/{node-3APTLGWB.js → node-6I5B6RL3.js} +3 -3
  153. package/dist/node-6I5B6RL3.js.map +1 -0
  154. package/dist/{openapi-FNVSWZOL.js → openapi-NFLSNNVQ.js} +10 -10
  155. package/dist/plugin-runner-BGBkzgi0.d.ts +95 -0
  156. package/dist/plugin-types-DNJGxr4Z.d.ts +79 -0
  157. package/dist/{proper-lockfile-4Y3DP3RP.js → proper-lockfile-MVKMQGFK.js} +27 -27
  158. package/dist/proper-lockfile-MVKMQGFK.js.map +1 -0
  159. package/dist/rate-limit-BdNDZ3vt.d.ts +58 -0
  160. package/dist/registry-QHEZ3BWB.js +25 -0
  161. package/dist/router-RGZFX75G.js +0 -0
  162. package/dist/{routes-H4SPLFHJ.js → routes-3A4XGIEJ.js} +6 -6
  163. package/dist/{scan-C2BOKLSY.js → scan-NQFI5S7P.js} +2 -2
  164. package/dist/scan-NQFI5S7P.js.map +1 -0
  165. package/dist/schema-D3v8VB7o.d.ts +76 -0
  166. package/dist/{schema-VR6YNVLQ.js → schema-KZVOV333.js} +5 -3
  167. package/dist/schema-KZVOV333.js.map +1 -0
  168. package/dist/server/agent/index.d.ts +229 -0
  169. package/dist/server/agent/index.js +16 -0
  170. package/dist/server/agent/index.js.map +1 -0
  171. package/dist/server/auth/index.d.ts +46 -1
  172. package/dist/server/auth/index.js +10 -3
  173. package/dist/server/cost/index.d.ts +1 -3
  174. package/dist/server/cost/index.js +1 -1
  175. package/dist/server/cron/index.js +4 -2
  176. package/dist/server/define/index.d.ts +281 -0
  177. package/dist/server/define/index.js +26 -0
  178. package/dist/server/define/index.js.map +1 -0
  179. package/dist/server/http/index.d.ts +10 -0
  180. package/dist/server/http/index.js +74 -0
  181. package/dist/server/http/index.js.map +1 -0
  182. package/dist/server/index.d.ts +151 -1677
  183. package/dist/server/index.js +558 -1102
  184. package/dist/server/index.js.map +1 -1
  185. package/dist/server/jobs/index.d.ts +348 -2
  186. package/dist/server/jobs/index.js +5 -3
  187. package/dist/server/observability/index.d.ts +324 -0
  188. package/dist/server/observability/index.js +48 -0
  189. package/dist/server/observability/index.js.map +1 -0
  190. package/dist/server/plugins/index.d.ts +17 -0
  191. package/dist/server/plugins/index.js +17 -0
  192. package/dist/server/plugins/index.js.map +1 -0
  193. package/dist/server/rate-limit/index.d.ts +105 -0
  194. package/dist/server/rate-limit/index.js +25 -0
  195. package/dist/server/rate-limit/index.js.map +1 -0
  196. package/dist/server/realtime/index.d.ts +15 -0
  197. package/dist/server/realtime/index.js +8 -0
  198. package/dist/server/realtime/index.js.map +1 -0
  199. package/dist/server/scan/index.d.ts +106 -0
  200. package/dist/server/scan/index.js +43 -0
  201. package/dist/server/scan/index.js.map +1 -0
  202. package/dist/server/security/index.d.ts +193 -0
  203. package/dist/server/security/index.js +50 -0
  204. package/dist/server/security/index.js.map +1 -0
  205. package/dist/server/storage/index.d.ts +22 -0
  206. package/dist/server/storage/index.js +14 -0
  207. package/dist/server/storage/index.js.map +1 -0
  208. package/dist/server/webhook/index.d.ts +148 -0
  209. package/dist/server/webhook/index.js +19 -0
  210. package/dist/server/webhook/index.js.map +1 -0
  211. package/dist/server-error-to-envelope-NO4CCAFQ.js +8 -0
  212. package/dist/server-error-to-envelope-NO4CCAFQ.js.map +1 -0
  213. package/dist/server-error-to-envelope-UJK6OWDJ.js +134 -0
  214. package/dist/server-error-to-envelope-UJK6OWDJ.js.map +1 -0
  215. package/dist/server-routes-hmr-GZJGPWMS.js +0 -0
  216. package/dist/services-json-Z2QNGVPW.js +142 -0
  217. package/dist/services-json-Z2QNGVPW.js.map +1 -0
  218. package/dist/{services-typed-client-XWYYBWGW.js → services-typed-client-KK6RHRDG.js} +2 -2
  219. package/dist/{services-typed-client-ZX5JUHH3.js → services-typed-client-T7M5VPBP.js} +2 -2
  220. package/dist/{sqlite-vec-ARPNUBWT.js → sqlite-vec-54KB4RD3.js} +2 -2
  221. package/dist/sqlite-vec-54KB4RD3.js.map +1 -0
  222. package/dist/{start-HX3QUSOS.js → start-CGSZPBAG.js} +23 -23
  223. package/dist/start-CGSZPBAG.js.map +1 -0
  224. package/dist/{static-TZBVBDTB.js → static-QI5NQT2X.js} +6 -6
  225. package/dist/storage-manager-C4jsO0Tp.d.ts +89 -0
  226. package/dist/storage-manager-D5KBXXKB.js +0 -0
  227. package/dist/{storage-types-DtIVejC1.d.ts → storage-types-DsDTCPbp.d.ts} +1 -1
  228. package/dist/{theo-cloud-3K4DGB3S.js → theo-cloud-RSQCBNXL.js} +4 -4
  229. package/dist/theo-cloud-RSQCBNXL.js.map +1 -0
  230. package/dist/upgrade-readiness-GUJBCJIS.js +0 -0
  231. package/dist/{vercel-MWW24ABC.js → vercel-TKPZK62A.js} +3 -3
  232. package/dist/vite-plugin/index.d.ts +3 -1
  233. package/dist/vite-plugin/index.js +20 -8
  234. package/dist/{vite-plugin-IK3NOWXS.js → vite-plugin-CR4JDFUQ.js} +9 -9
  235. package/dist/vite-plugin-CR4JDFUQ.js.map +1 -0
  236. package/package.json +59 -10
  237. package/LICENSE +0 -201
  238. package/dist/build-HIGHJQQV.js.map +0 -1
  239. package/dist/chunk-5OFPQK6N.js.map +0 -1
  240. package/dist/chunk-64JI5LTO.js.map +0 -1
  241. package/dist/chunk-7TOMTMHT.js.map +0 -1
  242. package/dist/chunk-BIGBFZSU.js.map +0 -1
  243. package/dist/chunk-C52GSJPF.js.map +0 -1
  244. package/dist/chunk-CZM6WWWS.js +0 -2450
  245. package/dist/chunk-CZM6WWWS.js.map +0 -1
  246. package/dist/chunk-JAAHOGKI.js.map +0 -1
  247. package/dist/chunk-KJVEJILQ.js.map +0 -1
  248. package/dist/chunk-O4BLVPML.js.map +0 -1
  249. package/dist/chunk-O7335ZGH.js.map +0 -1
  250. package/dist/chunk-PB4GR7EP.js.map +0 -1
  251. package/dist/chunk-TPCT3MXV.js.map +0 -1
  252. package/dist/chunk-VRHXOKRP.js.map +0 -1
  253. package/dist/chunk-WZ7CPVQB.js.map +0 -1
  254. package/dist/chunk-X4JAX2U3.js.map +0 -1
  255. package/dist/chunk-XP7YXRHO.js.map +0 -1
  256. package/dist/chunk-YLBSSEHX.js.map +0 -1
  257. package/dist/chunk-ZOXNJV2O.js.map +0 -1
  258. package/dist/dev-emit-RBSFZZNO.js.map +0 -1
  259. package/dist/dispatcher-E6QV32BO.js.map +0 -1
  260. package/dist/dist-5V77Z223.js.map +0 -1
  261. package/dist/generate-DT4IIAHF.js.map +0 -1
  262. package/dist/index-li83Swxa.d.ts +0 -506
  263. package/dist/lib-NL5JXGEB.js.map +0 -1
  264. package/dist/proper-lockfile-4Y3DP3RP.js.map +0 -1
  265. package/dist/registry-4MZ26TZD.js +0 -25
  266. package/dist/schema-CjVly9c_.d.ts +0 -274
  267. package/dist/sqlite-vec-ARPNUBWT.js.map +0 -1
  268. package/dist/start-HX3QUSOS.js.map +0 -1
  269. package/dist/theo-cloud-3K4DGB3S.js.map +0 -1
  270. /package/dist/{actions-virtual-module-HWNTIEPI.js.map → actions-virtual-module-IY46EEEX.js.map} +0 -0
  271. /package/dist/{actions-virtual-module-SEIPACG5.js.map → actions-virtual-module-XNHDNCZ6.js.map} +0 -0
  272. /package/dist/{aws-lambda-XYCGZH3I.js.map → aws-lambda-GKSTX6HD.js.map} +0 -0
  273. /package/dist/{bun-K73TQEWC.js.map → bun-ISHSNFIO.js.map} +0 -0
  274. /package/dist/{check-PZR67OY5.js.map → check-NXYPLM6M.js.map} +0 -0
  275. /package/dist/{dispatcher-AQJGI3HU.js.map → chunk-E3JH6YUM.js.map} +0 -0
  276. /package/dist/{node-3APTLGWB.js.map → chunk-JHEAWR3L.js.map} +0 -0
  277. /package/dist/{chunk-ZJW5FFYJ.js.map → chunk-LC5PYNJP.js.map} +0 -0
  278. /package/dist/{chunk-2VQKDRVF.js.map → chunk-MR7OLIC6.js.map} +0 -0
  279. /package/dist/{scan-C2BOKLSY.js.map → chunk-NPMCKOX4.js.map} +0 -0
  280. /package/dist/{chunk-B6RP57M3.js.map → chunk-OLPB36O2.js.map} +0 -0
  281. /package/dist/{chunk-OXIQI2XZ.js.map → chunk-VBZCVFSA.js.map} +0 -0
  282. /package/dist/{chunk-TRH2L3FI.js.map → chunk-WEGALZEU.js.map} +0 -0
  283. /package/dist/{cloudflare-LCAOTRYZ.js.map → cloudflare-OJGJ7R2D.js.map} +0 -0
  284. /package/dist/{schema-VR6YNVLQ.js.map → cookies-MJKMGJ7N.js.map} +0 -0
  285. /package/dist/{deno-deploy-ZN4RE5HF.js.map → deno-deploy-BHWKFTOW.js.map} +0 -0
  286. /package/dist/{dev-266MVCVA.js.map → dev-MJVSRZGF.js.map} +0 -0
  287. /package/dist/{dev-emit-NO6OZJOQ.js.map → dev-emit-HHP2XJXE.js.map} +0 -0
  288. /package/dist/{vite-plugin-IK3NOWXS.js.map → dispatcher-63LBXYLE.js.map} +0 -0
  289. /package/dist/{info-FJ4NXKTB.js.map → info-47VB62MV.js.map} +0 -0
  290. /package/dist/{netlify-5VQ22Z2P.js.map → netlify-GSNSJGMN.js.map} +0 -0
  291. /package/dist/{openapi-FNVSWZOL.js.map → openapi-NFLSNNVQ.js.map} +0 -0
  292. /package/dist/{registry-4MZ26TZD.js.map → registry-QHEZ3BWB.js.map} +0 -0
  293. /package/dist/{routes-H4SPLFHJ.js.map → routes-3A4XGIEJ.js.map} +0 -0
  294. /package/dist/{services-typed-client-XWYYBWGW.js.map → services-typed-client-KK6RHRDG.js.map} +0 -0
  295. /package/dist/{services-typed-client-ZX5JUHH3.js.map → services-typed-client-T7M5VPBP.js.map} +0 -0
  296. /package/dist/{static-TZBVBDTB.js.map → static-QI5NQT2X.js.map} +0 -0
  297. /package/dist/{vercel-MWW24ABC.js.map → vercel-TKPZK62A.js.map} +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cli/commands/generate.ts"],"sourcesContent":["/* eslint-disable security/detect-non-literal-fs-filename --\n * CLI `theo generate`. Writes scaffolded files under `cwd` + a generator\n * name from CLI args. Build-time tool. No HTTP input.\n */\nimport { existsSync, mkdirSync, writeFileSync } from 'node:fs'\nimport { resolve, dirname } from 'node:path'\n\nexport const VALID_TYPES = ['route', 'action', 'page', 'ws'] as const\nexport type GeneratorType = (typeof VALID_TYPES)[number]\n\nexport interface GenerateOptions {\n cwd: string\n type: string\n name: string\n}\n\nexport type GenerateStatus =\n | 'created'\n | 'already_exists'\n | 'invalid_kind'\n | 'invalid_name'\n | 'not_a_project'\n\nexport interface GenerateResult {\n status: GenerateStatus\n filePath?: string\n kind?: GeneratorType\n name?: string\n message?: string\n}\n\nfunction toKebabCase(name: string): boolean {\n return /^[a-z][a-z0-9/-]*$/.test(name)\n}\n\n/**\n * Reserved JS identifier names that conflict with object prototype machinery\n * or would shadow built-in module shapes if used as action/route names.\n * Mirrors action-scan's RESERVED_NAMES (T1.4).\n */\nconst RESERVED_BASENAMES = new Set([\n 'index',\n 'constructor',\n '__proto__',\n 'prototype',\n 'hasOwnProperty',\n])\n\n/**\n * Validate that a name segment doesn't hit the reserved-identifier list.\n * Checks the BASENAME (last `/` segment) — nested `admin/constructor` still\n * rejected because the file `constructor.ts` would be the conflict.\n */\nfunction hasReservedSegment(name: string): boolean {\n const basename = name.includes('/') ? (name.split('/').pop() ?? name) : name\n return RESERVED_BASENAMES.has(basename)\n}\n\n/**\n * EC-4: validate that resolving `targetSubpath` under `cwd` stays inside `cwd`.\n * Returns `true` when path is safe (stays inside), `false` when it escapes via\n * `..`, absolute path, null byte, or similar traversal vector.\n */\nfunction isPathInside(cwd: string, targetSubpath: string): boolean {\n if (targetSubpath.includes('\\x00')) return false\n if (targetSubpath.startsWith('/') || targetSubpath.startsWith('\\\\')) return false\n const resolved = resolve(cwd, targetSubpath)\n const cwdResolved = resolve(cwd)\n const sep = process.platform === 'win32' ? '\\\\' : '/'\n return resolved === cwdResolved || resolved.startsWith(cwdResolved + sep)\n}\n\nfunction toPascalCase(name: string): string {\n return name\n .split(/[-/]/)\n .map((s) => s.charAt(0).toUpperCase() + s.slice(1))\n .join('')\n}\n\nfunction toCamelCase(name: string): string {\n const pascal = toPascalCase(name)\n return pascal.charAt(0).toLowerCase() + pascal.slice(1)\n}\n\nfunction generateRouteTemplate(name: string): string {\n return [\n `import { defineRoute } from 'theokit/server'`,\n `import { z } from 'zod'`,\n ``,\n `export const GET = defineRoute({`,\n ` handler: ({ ctx }) => {`,\n ` return { message: 'TODO: implement ${name} GET' }`,\n ` },`,\n `})`,\n ``,\n ].join('\\n')\n}\n\nfunction generateActionTemplate(name: string): string {\n const camel = toCamelCase(name)\n return [\n `import { defineAction } from 'theokit/server'`,\n `import { z } from 'zod'`,\n ``,\n `export const ${camel} = defineAction({`,\n ` input: z.object({}),`,\n ` handler: ({ input, ctx }) => {`,\n ` return { message: 'TODO: implement ${name}' }`,\n ` },`,\n `})`,\n ``,\n ].join('\\n')\n}\n\n/**\n * Co-located test template for `theokit generate action <name>` (T5.2 +\n * plan Q4 cenário 1: roundtrip serialize). Skeleton uses vitest BDD shape\n * per testing.md.\n */\nfunction resolveTemplate(\n cwd: string,\n type: GeneratorType,\n name: string,\n): { filePath: string; content: string } | null {\n switch (type) {\n case 'route':\n return {\n filePath: resolve(cwd, 'server/routes', `${name}.ts`),\n content: generateRouteTemplate(name),\n }\n case 'action':\n return {\n filePath: resolve(cwd, 'server/actions', `${name}.ts`),\n content: generateActionTemplate(name),\n }\n case 'page':\n return { filePath: resolve(cwd, `app/${name}/page.tsx`), content: generatePageTemplate(name) }\n case 'ws':\n return {\n filePath: resolve(cwd, 'server/ws', `${name}.ts`),\n content: generateWsTemplate(name),\n }\n default:\n return null\n }\n}\n\nfunction generateActionTestTemplate(name: string): string {\n const camel = toCamelCase(name)\n return [\n `import { describe, it, expect } from 'vitest'`,\n ``,\n `import { ${camel} } from './${name.split('/').pop()}.js'`,\n ``,\n `describe('${name} action', () => {`,\n ` it('should accept a valid input shape', () => {`,\n ` expect(${camel}.input).toBeDefined()`,\n ` expect(typeof ${camel}.handler).toBe('function')`,\n ` })`,\n ``,\n ` it('should reject invalid input via zod schema', () => {`,\n ` const parsed = ${camel}.input.safeParse({ __invalid: true })`,\n ` // Empty object schema accepts {}; tighten this assertion when adding fields.`,\n ` expect(parsed.success).toBe(true)`,\n ` })`,\n `})`,\n ``,\n ].join('\\n')\n}\n\nfunction generatePageTemplate(name: string): string {\n const pascal = toPascalCase(name)\n return [`export default function ${pascal}Page() {`, ` return <h1>${pascal}</h1>`, `}`, ``].join(\n '\\n',\n )\n}\n\nfunction generateWsTemplate(_name: string): string {\n return [\n `import { defineWebSocket } from 'theokit/server'`,\n ``,\n `export default defineWebSocket({`,\n ` onMessage(ws, data) {`,\n ` ws.send(\\`echo: \\${data}\\`)`,\n ` },`,\n `})`,\n ``,\n ].join('\\n')\n}\n\n/**\n * Programmatic generate. Returns a structured result instead of throwing —\n * Studio (`theokit_generate` tool) consumes this directly. The CLI wrapper\n * below maps the structured result to console output + exit code semantics.\n */\n// eslint-disable-next-line @typescript-eslint/require-await\nexport async function generate(opts: GenerateOptions): Promise<GenerateResult> {\n const { cwd, type, name } = opts\n\n if (!existsSync(resolve(cwd, 'theo.config.ts')) && !existsSync(resolve(cwd, 'theo.config.js'))) {\n return {\n status: 'not_a_project',\n message: 'Not a Theo project. cwd has no theo.config.ts or theo.config.js',\n }\n }\n\n if (!VALID_TYPES.includes(type as GeneratorType)) {\n return {\n status: 'invalid_kind',\n message: `Invalid generator type \"${type}\". Available: ${VALID_TYPES.join(', ')}`,\n }\n }\n\n if (!name || !toKebabCase(name)) {\n return {\n status: 'invalid_name',\n message: `Invalid name \"${name}\". Use kebab-case: lowercase letters, numbers, hyphens.`,\n }\n }\n\n // EC-2-related: reject reserved JS identifier basenames (would shadow\n // built-in prototype machinery in virtual module emit or scan).\n if (hasReservedSegment(name)) {\n return {\n status: 'invalid_name',\n message: `Reserved name \"${name}\" — basename collides with built-in identifier (index/constructor/__proto__/prototype/hasOwnProperty).`,\n }\n }\n\n const resolved = resolveTemplate(cwd, type as GeneratorType, name)\n if (resolved === null) {\n return { status: 'invalid_kind', message: `Unknown type: ${type}` }\n }\n const { filePath, content } = resolved\n\n // EC-4: confirm the resolved filePath stays inside cwd. `toKebabCase`\n // already rejects most traversal vectors but a defense-in-depth check\n // against `..` slipping in via valid-looking segments is cheap.\n const relativeFromCwd = filePath.startsWith(resolve(cwd))\n ? filePath.slice(resolve(cwd).length + 1)\n : filePath\n if (!isPathInside(cwd, relativeFromCwd)) {\n return {\n status: 'invalid_name',\n message: `Path traversal denied: \"${name}\" would escape project root.`,\n }\n }\n\n if (existsSync(filePath)) {\n return { status: 'already_exists', filePath, kind: type as GeneratorType, name }\n }\n\n mkdirSync(dirname(filePath), { recursive: true })\n writeFileSync(filePath, content)\n\n // T5.2 + plan Q4: emit co-located test file alongside actions (only\n // for action type; routes/pages/ws keep prior single-file behavior).\n // Skip if existing test file present (preserve user-customized tests).\n if (type === 'action') {\n const testPath = filePath.replace(/\\.ts$/, '.test.ts')\n if (!existsSync(testPath)) {\n writeFileSync(testPath, generateActionTestTemplate(name))\n }\n }\n\n return { status: 'created', filePath, kind: type as GeneratorType, name }\n}\n\n/**\n * CLI entry point — preserves the original surface (throws + console.log).\n * Wraps the programmatic `generate` function.\n */\nexport async function generateCommand(type: string, name: string): Promise<void> {\n const result = await generate({ cwd: process.cwd(), type, name })\n switch (result.status) {\n case 'not_a_project':\n throw new Error('Not a Theo project. Run this from a project root with theo.config.ts')\n case 'invalid_kind':\n throw new Error(result.message ?? 'Invalid kind')\n case 'invalid_name':\n throw new Error(\n `Invalid name \"${name}\". Use kebab-case: lowercase letters, numbers, hyphens. Example: my-route`,\n )\n case 'already_exists':\n console.log(`\\n ⚠ ${result.filePath} already exists. Skipping.\\n`)\n return\n case 'created':\n console.log(`\\n ✓ Created ${type}: ${result.filePath}\\n`)\n return\n }\n}\n"],"mappings":";;;;;AAIA,SAAS,YAAY,WAAW,qBAAqB;AACrD,SAAS,SAAS,eAAe;AAE1B,IAAM,cAAc,CAAC,SAAS,UAAU,QAAQ,IAAI;AAwB3D,SAAS,YAAY,MAAuB;AAC1C,SAAO,qBAAqB,KAAK,IAAI;AACvC;AAOA,IAAM,qBAAqB,oBAAI,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOD,SAAS,mBAAmB,MAAuB;AACjD,QAAM,WAAW,KAAK,SAAS,GAAG,IAAK,KAAK,MAAM,GAAG,EAAE,IAAI,KAAK,OAAQ;AACxE,SAAO,mBAAmB,IAAI,QAAQ;AACxC;AAOA,SAAS,aAAa,KAAa,eAAgC;AACjE,MAAI,cAAc,SAAS,IAAM,EAAG,QAAO;AAC3C,MAAI,cAAc,WAAW,GAAG,KAAK,cAAc,WAAW,IAAI,EAAG,QAAO;AAC5E,QAAM,WAAW,QAAQ,KAAK,aAAa;AAC3C,QAAM,cAAc,QAAQ,GAAG;AAC/B,QAAM,MAAM,QAAQ,aAAa,UAAU,OAAO;AAClD,SAAO,aAAa,eAAe,SAAS,WAAW,cAAc,GAAG;AAC1E;AAEA,SAAS,aAAa,MAAsB;AAC1C,SAAO,KACJ,MAAM,MAAM,EACZ,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,EAAE;AACZ;AAEA,SAAS,YAAY,MAAsB;AACzC,QAAM,SAAS,aAAa,IAAI;AAChC,SAAO,OAAO,OAAO,CAAC,EAAE,YAAY,IAAI,OAAO,MAAM,CAAC;AACxD;AAEA,SAAS,sBAAsB,MAAsB;AACnD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,0CAA0C,IAAI;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,uBAAuB,MAAsB;AACpD,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,KAAK;AAAA,IACrB;AAAA,IACA;AAAA,IACA,0CAA0C,IAAI;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAOA,SAAS,gBACP,KACA,MACA,MAC8C;AAC9C,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,QACL,UAAU,QAAQ,KAAK,iBAAiB,GAAG,IAAI,KAAK;AAAA,QACpD,SAAS,sBAAsB,IAAI;AAAA,MACrC;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,UAAU,QAAQ,KAAK,kBAAkB,GAAG,IAAI,KAAK;AAAA,QACrD,SAAS,uBAAuB,IAAI;AAAA,MACtC;AAAA,IACF,KAAK;AACH,aAAO,EAAE,UAAU,QAAQ,KAAK,OAAO,IAAI,WAAW,GAAG,SAAS,qBAAqB,IAAI,EAAE;AAAA,IAC/F,KAAK;AACH,aAAO;AAAA,QACL,UAAU,QAAQ,KAAK,aAAa,GAAG,IAAI,KAAK;AAAA,QAChD,SAAS,mBAAmB,IAAI;AAAA,MAClC;AAAA,IACF;AACE,aAAO;AAAA,EACX;AACF;AAEA,SAAS,2BAA2B,MAAsB;AACxD,QAAM,QAAQ,YAAY,IAAI;AAC9B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,YAAY,KAAK,cAAc,KAAK,MAAM,GAAG,EAAE,IAAI,CAAC;AAAA,IACpD;AAAA,IACA,aAAa,IAAI;AAAA,IACjB;AAAA,IACA,cAAc,KAAK;AAAA,IACnB,qBAAqB,KAAK;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,sBAAsB,KAAK;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEA,SAAS,qBAAqB,MAAsB;AAClD,QAAM,SAAS,aAAa,IAAI;AAChC,SAAO,CAAC,2BAA2B,MAAM,YAAY,gBAAgB,MAAM,SAAS,KAAK,EAAE,EAAE;AAAA,IAC3F;AAAA,EACF;AACF;AAEA,SAAS,mBAAmB,OAAuB;AACjD,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAQA,eAAsB,SAAS,MAAgD;AAC7E,QAAM,EAAE,KAAK,MAAM,KAAK,IAAI;AAE5B,MAAI,CAAC,WAAW,QAAQ,KAAK,gBAAgB,CAAC,KAAK,CAAC,WAAW,QAAQ,KAAK,gBAAgB,CAAC,GAAG;AAC9F,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,CAAC,YAAY,SAAS,IAAqB,GAAG;AAChD,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,2BAA2B,IAAI,iBAAiB,YAAY,KAAK,IAAI,CAAC;AAAA,IACjF;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,CAAC,YAAY,IAAI,GAAG;AAC/B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,iBAAiB,IAAI;AAAA,IAChC;AAAA,EACF;AAIA,MAAI,mBAAmB,IAAI,GAAG;AAC5B,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,kBAAkB,IAAI;AAAA,IACjC;AAAA,EACF;AAEA,QAAM,WAAW,gBAAgB,KAAK,MAAuB,IAAI;AACjE,MAAI,aAAa,MAAM;AACrB,WAAO,EAAE,QAAQ,gBAAgB,SAAS,iBAAiB,IAAI,GAAG;AAAA,EACpE;AACA,QAAM,EAAE,UAAU,QAAQ,IAAI;AAK9B,QAAM,kBAAkB,SAAS,WAAW,QAAQ,GAAG,CAAC,IACpD,SAAS,MAAM,QAAQ,GAAG,EAAE,SAAS,CAAC,IACtC;AACJ,MAAI,CAAC,aAAa,KAAK,eAAe,GAAG;AACvC,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,SAAS,2BAA2B,IAAI;AAAA,IAC1C;AAAA,EACF;AAEA,MAAI,WAAW,QAAQ,GAAG;AACxB,WAAO,EAAE,QAAQ,kBAAkB,UAAU,MAAM,MAAuB,KAAK;AAAA,EACjF;AAEA,YAAU,QAAQ,QAAQ,GAAG,EAAE,WAAW,KAAK,CAAC;AAChD,gBAAc,UAAU,OAAO;AAK/B,MAAI,SAAS,UAAU;AACrB,UAAM,WAAW,SAAS,QAAQ,SAAS,UAAU;AACrD,QAAI,CAAC,WAAW,QAAQ,GAAG;AACzB,oBAAc,UAAU,2BAA2B,IAAI,CAAC;AAAA,IAC1D;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,WAAW,UAAU,MAAM,MAAuB,KAAK;AAC1E;AAMA,eAAsB,gBAAgB,MAAc,MAA6B;AAC/E,QAAM,SAAS,MAAM,SAAS,EAAE,KAAK,QAAQ,IAAI,GAAG,MAAM,KAAK,CAAC;AAChE,UAAQ,OAAO,QAAQ;AAAA,IACrB,KAAK;AACH,YAAM,IAAI,MAAM,sEAAsE;AAAA,IACxF,KAAK;AACH,YAAM,IAAI,MAAM,OAAO,WAAW,cAAc;AAAA,IAClD,KAAK;AACH,YAAM,IAAI;AAAA,QACR,iBAAiB,IAAI;AAAA,MACvB;AAAA,IACF,KAAK;AACH,cAAQ,IAAI;AAAA,WAAS,OAAO,QAAQ;AAAA,CAA8B;AAClE;AAAA,IACF,KAAK;AACH,cAAQ,IAAI;AAAA,mBAAiB,IAAI,KAAK,OAAO,QAAQ;AAAA,CAAI;AACzD;AAAA,EACJ;AACF;","names":[]}
@@ -1,506 +0,0 @@
1
- import { S as ServerConfig, a as PostgresDatabaseConfig, P as PoolLike, d as StorageConfig, b as RedisServerConfig, R as RedisLike, c as StorageAdapter } from './storage-types-DtIVejC1.js';
2
-
3
- /**
4
- * Neutral `JobBackend` interface per ADR-0002.
5
- *
6
- * Implementations ship in core:
7
- * - `InMemoryJobBackend` (T2.2) — dev + tests; no external deps
8
- * - `PostgresJobBackend` (T3.1) — production; requires `pg` peer dep
9
- *
10
- * Community packages (`@theokit/jobs-redis`, `@theokit/jobs-sqs`, etc.)
11
- * implement this same interface to plug in alternate substrates without
12
- * modifying TheoKit core.
13
- */
14
- interface JobEnqueueInput {
15
- /** The job name (matches a `defineJob` declaration). */
16
- name: string;
17
- /** Validated input (already passed through Zod or equivalent at the queue-client layer). */
18
- input: unknown;
19
- /** Optional idempotency key for at-most-once dispatch within TTL. */
20
- idempotencyKey?: string;
21
- /** Optional delay before the job becomes available for dispatch. */
22
- delaySeconds?: number;
23
- /** W3C Trace Context propagation per ADR/R0.5.9. */
24
- traceparent?: string;
25
- /** Maximum dispatch attempts (read from JobDefinition by the queue client). */
26
- maxAttempts?: number;
27
- }
28
- interface JobLease {
29
- readonly jobId: string;
30
- readonly name: string;
31
- readonly input: unknown;
32
- readonly attempts: number;
33
- readonly maxAttempts: number;
34
- readonly traceparent?: string;
35
- readonly lockExpiresAt: Date;
36
- }
37
- interface JobBackend {
38
- /** Human-readable name for logging (e.g., "memory", "postgres"). */
39
- readonly name: string;
40
- /** Persist a job for later dispatch. Returns the generated jobId. */
41
- enqueue(input: JobEnqueueInput): Promise<{
42
- jobId: string;
43
- }>;
44
- /** Worker loop polls for the next available leases. */
45
- dequeue(opts: {
46
- batchSize?: number;
47
- lockSeconds?: number;
48
- }): Promise<JobLease[]>;
49
- /** Mark a job complete (success). */
50
- ack(jobId: string): Promise<void>;
51
- /** Mark a job failed; backend decides retry vs DLQ via attempts. */
52
- nack(jobId: string, opts: {
53
- error: string;
54
- nonRetryable?: boolean;
55
- }): Promise<void>;
56
- /** Optional: return existing jobId if `key` was enqueued within `ttlSeconds`. */
57
- idempotency?(key: string, ttlSeconds: number): Promise<{
58
- jobId: string;
59
- } | null>;
60
- }
61
- /**
62
- * Thrown from a job handler to opt out of retry policy. The backend MUST
63
- * nack with `nonRetryable: true` and permanently remove the job.
64
- */
65
- declare class NonRetryableError extends Error {
66
- readonly code = "NON_RETRYABLE";
67
- constructor(message: string);
68
- }
69
-
70
- /**
71
- * Job primitive types (R0.5.5-9).
72
- *
73
- * @see docs/adr/0002-job-backend-interface-neutral-contract.md
74
- * @see docs/adr/0003-enqueue-returns-void-transactional-outbox.md
75
- */
76
- /**
77
- * Type registry for jobs. Users extend via module augmentation:
78
- *
79
- * ```ts
80
- * declare module 'theokit/server' {
81
- * interface JobRegistry {
82
- * 'process-document': { documentId: string }
83
- * 'send-email': { to: string; subject: string }
84
- * }
85
- * }
86
- * ```
87
- *
88
- * Once augmented, `ctx.queue.enqueue<'process-document'>(...)` gets full
89
- * type inference on the `input` argument.
90
- */
91
- interface JobRegistry {
92
- }
93
- interface JobContext<TInput = unknown> {
94
- /** W3C trace_id propagated from the originating request or cron. */
95
- readonly traceId: string;
96
- /** The job's input, type-narrowed per JobRegistry entry. */
97
- readonly input: TInput;
98
- /** Abort signal triggered when the worker stops or lease times out. */
99
- readonly signal: AbortSignal;
100
- /** Attempt number (1-indexed). */
101
- readonly attempt: number;
102
- }
103
- interface JobOptions<TInput = unknown> {
104
- /** Optional Zod schema (or any `.parse(value)`-shaped object) for input validation. */
105
- input?: {
106
- parse: (value: unknown) => TInput;
107
- };
108
- /** Maximum dispatch attempts (default 1 — no retry surprise per ADR-0003). */
109
- maxAttempts?: number;
110
- /** Handler. Returns `void` per ADR-0003 — no workflow API. */
111
- handler: (ctx: JobContext<TInput>) => Promise<void> | void;
112
- }
113
- interface JobDefinition<TInput = unknown> {
114
- readonly name: string;
115
- readonly maxAttempts: number;
116
- readonly hasInputSchema: boolean;
117
- readonly handler: (ctx: JobContext<TInput>) => Promise<void> | void;
118
- readonly inputSchema?: {
119
- parse: (value: unknown) => TInput;
120
- };
121
- }
122
-
123
- /**
124
- * Declare a background job. Pure identity helper — no registration side
125
- * effect; the build-time scanner (T2.3) discovers definitions by walking
126
- * `server/jobs/` and emits `.theo/jobs.json`.
127
- *
128
- * Per ADR-0003, handler returns `void` (or `Promise<void>`); no workflow
129
- * API. To run another job after this one, call `ctx.queue.enqueue` from
130
- * the handler.
131
- *
132
- * @example
133
- * ```ts
134
- * // server/jobs/process-document.ts
135
- * import { defineJob } from 'theokit/server'
136
- * import { z } from 'zod'
137
- *
138
- * export default defineJob('process-document', {
139
- * input: z.object({ documentId: z.string() }),
140
- * maxAttempts: 3,
141
- * async handler({ input, traceId }) {
142
- * // process input.documentId
143
- * },
144
- * })
145
- * ```
146
- */
147
- declare function defineJob<TInput = unknown>(name: string, options: JobOptions<TInput>): JobDefinition<TInput>;
148
-
149
- /**
150
- * Thrown when a plugin or middleware decorates `ctx.<key>` with a value
151
- * that the framework would also like to inject (e.g., `ctx.queue` from
152
- * the jobs backend wiring).
153
- *
154
- * Per EC-202 of system-100-percent-functional-plan: silent override is a
155
- * latent bug class. Fail loud so the conflict surfaces immediately.
156
- */
157
- declare class DuplicateContextKeyError extends Error {
158
- readonly key: string;
159
- readonly code = "DUPLICATE_CONTEXT_KEY";
160
- constructor(key: string, opts?: {
161
- reason?: string;
162
- });
163
- }
164
-
165
- /**
166
- * In-memory job backend for dev + tests + single-instance prototypes.
167
- *
168
- * Zero external dependencies. Storage is two Maps:
169
- * - `pending: Map<jobId, PendingEntry>` — all enqueued jobs (locked or not)
170
- * - `idempotencyMap: Map<key, { jobId; expiresAt }>` — dedup window
171
- *
172
- * Per ADR-0002: this is one of two first-party backends shipped in core.
173
- * Production deploys plug in PostgresJobBackend (T3.1).
174
- *
175
- * EC-104 (jobs-crons-webhooks-cost-tracking-plan): registers a
176
- * `process.on('beforeExit')` handler that clears pending dispatch timers
177
- * and logs a warning with the dropped count. Failure mode is visible,
178
- * not silent. `destroy()` removes the listener for test isolation.
179
- */
180
- interface InMemoryJobBackendOptions {
181
- /** Maximum pending entries before oldest is dropped + warning logged. */
182
- maxPending?: number;
183
- }
184
- declare class InMemoryJobBackend implements JobBackend {
185
- #private;
186
- readonly name = "memory";
187
- constructor(opts?: InMemoryJobBackendOptions);
188
- enqueue(input: JobEnqueueInput): Promise<{
189
- jobId: string;
190
- }>;
191
- dequeue(opts: {
192
- batchSize?: number;
193
- lockSeconds?: number;
194
- }): Promise<JobLease[]>;
195
- ack(jobId: string): Promise<void>;
196
- nack(jobId: string, opts: {
197
- error: string;
198
- nonRetryable?: boolean;
199
- }): Promise<void>;
200
- idempotency(key: string, ttlSeconds: number): Promise<{
201
- jobId: string;
202
- } | null>;
203
- /**
204
- * Remove the beforeExit listener and clear all pending timers.
205
- * Idempotent — safe to call multiple times. Use in test teardown to
206
- * avoid leaking listeners across vitest test files.
207
- */
208
- destroy(): void;
209
- /** EC-104 test hook — invokes the shutdown handler synchronously. */
210
- triggerBeforeExitForTest(): void;
211
- }
212
-
213
- /**
214
- * StorageManager — per-process singleton coordinating pluggable storage
215
- * adapters (Postgres pools, Redis clients, in-memory adapters).
216
- *
217
- * Architectural decisions: see ADR-0007 (docs/adr/0007-storage-manager-singleton.md).
218
- *
219
- * Lifecycle:
220
- * 1. `getStorageManager()` returns the singleton (D1).
221
- * 2. `configure(storageConfig)` honored once per process (D3). Second call
222
- * warns and is ignored.
223
- * 3. `usePostgres(dbName, factory)` / `useRedis(serverName, factory)`
224
- * lazily create + cache (D2). Factory invoked exactly once per name.
225
- * 4. `register(adapter)` opts the adapter into the SIGTERM drain (D6).
226
- * 5. `dispose()` drains in parallel — adapters + pools + Redis (D5).
227
- * Idempotent. Adapter errors logged + swallowed (do not block shutdown).
228
- *
229
- * Test seam: `__resetForTests()` resets state. Test files MUST call it from
230
- * `beforeEach` to avoid pollution across `it` blocks (EC-3).
231
- */
232
-
233
- type PostgresFactory = (server: ServerConfig, db: PostgresDatabaseConfig) => PoolLike;
234
- type RedisFactory = (config: RedisServerConfig) => RedisLike;
235
- declare class StorageManager {
236
- #private;
237
- /**
238
- * Apply the storage config block from `theo.config.ts`. Second call warns
239
- * and is ignored (D3). Reset only via `__resetForTests()`.
240
- */
241
- configure(config: StorageConfig): void;
242
- /**
243
- * Generic cache + factory for ANY client (MySQL, Mongo, Turso, DynamoDB, …).
244
- * Returns the cached client OR invokes the factory and caches its return.
245
- *
246
- * EC-1 FIX: cache-hit check uses `Map.has(name)`, NOT `cached !== undefined`.
247
- * Factories returning `null` or `undefined` are valid (lazy connect, stubs);
248
- * the `!== undefined` check would re-invoke the factory infinitely for
249
- * undefined returns AND silently cache `null` cast as `T`.
250
- *
251
- * EC-2 (documented type hole): `useStorage<A>('x', fA)` followed by
252
- * `useStorage<B>('x', fB)` returns the cached A cast as B. Same trade-off
253
- * as `Map<string, unknown>` — caller is responsible for using unique names
254
- * per type.
255
- *
256
- * Lifecycle: generic clients are NOT auto-drained by `dispose()`. Call
257
- * `manager.register({ name, dispose })` separately to participate.
258
- *
259
- * Reserved name prefixes (do NOT use): `__pg:`, `__redis:`, `__unstorage:`,
260
- * `__db0:` — these are used internally by the typed helpers.
261
- */
262
- useStorage<T>(name: string, factory: () => T): T;
263
- /**
264
- * Return a Postgres pool for the named database. Lazy + cached. Factory
265
- * invoked exactly once per `dbName` (D2).
266
- *
267
- * Throws if:
268
- * - manager is disposed
269
- * - `dbName` is not in `config.databases`
270
- * - the referenced server is not in `config.servers` (EC-2: deferred
271
- * cross-field validation surfaces here, not at configure time)
272
- */
273
- usePostgres(dbName: string, factory: PostgresFactory): PoolLike;
274
- /**
275
- * Return a Redis client for the named server. Lazy + cached. Factory
276
- * invoked exactly once per `serverName`.
277
- */
278
- useRedis(serverName: string, factory: RedisFactory): RedisLike;
279
- /**
280
- * Register an adapter for graceful shutdown coordination (D6).
281
- *
282
- * EC-4: throws if the manager is already disposed — prevents silent
283
- * leaks in test seams that reset+reuse the manager.
284
- */
285
- register(adapter: StorageAdapter): void;
286
- /**
287
- * Drain in parallel — registered adapters, then PG pools, then Redis
288
- * clients. Idempotent (D5). Errors per resource are logged and swallowed
289
- * — they do NOT prevent shutdown of the remaining resources.
290
- *
291
- * Caller must wrap in a timeout if a bound is needed (EC-7: documented).
292
- * In production, `start.ts` wraps the whole shutdown sequence in a 25 s
293
- * force-exit timer.
294
- */
295
- dispose(): Promise<void>;
296
- /** @internal Testing seam — resets state so a single test file can re-use the singleton across `it` blocks (EC-3). */
297
- __resetForTests(): void;
298
- /** @internal Introspection helper for tests. */
299
- __isConfiguredForTests(): boolean;
300
- /** @internal Introspection helper for tests. */
301
- __isDisposedForTests(): boolean;
302
- }
303
- declare function getStorageManager(): StorageManager;
304
- /** @internal Drops the module-level singleton — used by tests that need a fresh manager. */
305
- declare function __resetSingletonForTests(): void;
306
-
307
- interface PostgresJobBackendOptions {
308
- pool: PoolLike;
309
- /** Table name override (default `theokit_jobs`). */
310
- tableName?: string;
311
- }
312
- declare class PostgresJobBackend implements JobBackend {
313
- #private;
314
- readonly name = "postgres";
315
- constructor(opts: PostgresJobBackendOptions);
316
- /**
317
- * T2.1 — Construct a `PostgresJobBackend` using a pool managed by the
318
- * shared `StorageManager`. The manager caches the pool per `dbName`, so
319
- * repeated calls (in the same process) re-use the same connection pool.
320
- *
321
- * Equivalent to:
322
- * ```ts
323
- * const pool = manager.usePostgres(dbName, factory)
324
- * new PostgresJobBackend({ pool, ...options })
325
- * ```
326
- *
327
- * Errors thrown by the manager (unknown dbName, dangling server reference,
328
- * manager already disposed) propagate to the caller with actionable text.
329
- *
330
- * @see ADR-0007
331
- */
332
- static fromStorageManager(manager: StorageManager, dbName: string, factory: PostgresFactory, options?: Omit<PostgresJobBackendOptions, 'pool'>): PostgresJobBackend;
333
- /**
334
- * Create or upgrade the schema. Idempotent (uses IF NOT EXISTS).
335
- * Call once at process start; safe to re-run on every deploy.
336
- */
337
- migrate(): Promise<void>;
338
- enqueue(input: JobEnqueueInput): Promise<{
339
- jobId: string;
340
- }>;
341
- dequeue(opts: {
342
- batchSize?: number;
343
- lockSeconds?: number;
344
- }): Promise<JobLease[]>;
345
- ack(jobId: string): Promise<void>;
346
- nack(jobId: string, opts: {
347
- error: string;
348
- nonRetryable?: boolean;
349
- }): Promise<void>;
350
- idempotency(key: string, _ttlSeconds: number): Promise<{
351
- jobId: string;
352
- } | null>;
353
- }
354
-
355
- /**
356
- * Transactional outbox buffer for `ctx.queue.enqueue` (T2.5).
357
- *
358
- * Lifecycle (wired in `http/execute.ts` by T2.5 integration step):
359
- * 1. Request handler invoked → create per-request outbox.
360
- * 2. Handler calls `ctx.queue.enqueue(...)` → outbox.push(entry).
361
- * 3a. Response committed (`res.on('finish')` + statusCode < 400) →
362
- * outbox.flush(backend.enqueue).
363
- * 3b. Response errors (statusCode >= 400, handler throws, `res.on('close')`
364
- * without finish) → outbox.discard().
365
- *
366
- * Invariants:
367
- * - Outbox NEVER dispatches before commit. Backend.enqueue is NEVER
368
- * called on the request hot path.
369
- * - Handler throws → ZERO jobs dispatched. KEY guarantee from ADR-0003.
370
- *
371
- * EC-107: when `backend.enqueue` throws DURING flush (after response
372
- * committed), we log + continue. The response is already gone; partial
373
- * dispatch is better than zero. Each failure goes to `onError` (default:
374
- * `console.warn`).
375
- */
376
- interface OutboxFlushOptions {
377
- /**
378
- * Called once per failed entry. Default: `console.warn` with the
379
- * entry name (NOT input — privacy). Throw nothing back to caller —
380
- * flush always completes.
381
- */
382
- onError?: (entryName: string, errorMessage: string) => void;
383
- }
384
- interface Outbox {
385
- push(entry: JobEnqueueInput): void;
386
- drain(): JobEnqueueInput[];
387
- discard(): void;
388
- size(): number;
389
- /**
390
- * Dispatch all buffered entries via `dispatcher`. Returns after all
391
- * entries attempted. Per-entry failures invoke `opts.onError` (or
392
- * default warn) and do NOT abort the loop.
393
- */
394
- flush(dispatcher: (entry: JobEnqueueInput) => Promise<unknown>, opts?: OutboxFlushOptions): Promise<void>;
395
- }
396
- declare function createOutbox(): Outbox;
397
-
398
- /**
399
- * Options forwarded to `backend.enqueue` at outbox flush time.
400
- */
401
- interface EnqueueOptions {
402
- /** Optional idempotency key for at-most-once dispatch within TTL. */
403
- idempotencyKey?: string;
404
- /** Optional delay before the job becomes available. */
405
- delaySeconds?: number;
406
- }
407
- /**
408
- * Typed queue client. Per ADR-0003, `enqueue` returns `void` and buffers
409
- * to the per-request outbox. `enqueueWithId` is the log-correlation
410
- * variant that resolves to `{ jobId }` AFTER the outbox flushes.
411
- *
412
- * Type inference: `JobName extends keyof JobRegistry`. Users extend the
413
- * `JobRegistry` interface via module augmentation (see `job-types.ts`).
414
- * Without augmentation, all enqueue calls compile-error with "Type X is
415
- * not assignable to type never" — documented in EC-110 as a known onboarding
416
- * friction.
417
- */
418
- interface QueueClient {
419
- /** Buffer a job to the outbox. Returns void (fire-and-forget). */
420
- enqueue<JobName extends keyof JobRegistry>(name: JobName, input: JobRegistry[JobName], opts?: EnqueueOptions): void;
421
- /**
422
- * Buffer a job AND return a Promise that resolves with the jobId
423
- * AFTER the outbox flushes (i.e., after the response commits). NOT a
424
- * handle to await the job result — there is no result API.
425
- */
426
- enqueueWithId<JobName extends keyof JobRegistry>(name: JobName, input: JobRegistry[JobName], opts?: EnqueueOptions): Promise<{
427
- jobId: string;
428
- }>;
429
- }
430
- interface CreateQueueClientOptions {
431
- /** W3C traceparent to propagate to enqueued jobs. */
432
- traceparent?: string;
433
- }
434
- /**
435
- * Create a per-request queue client wired to a backend + outbox.
436
- *
437
- * The backend is referenced only to resolve `enqueueWithId` jobIds at
438
- * flush time — `enqueue` itself does NOT call backend on the hot path
439
- * (transactional outbox guarantee per ADR-0003).
440
- */
441
- declare function createQueueClient(backend: JobBackend, outbox: Outbox, opts?: CreateQueueClientOptions): QueueClient;
442
- /**
443
- * Outbox dispatcher that bridges enqueueWithId's hidden promise channel
444
- * (`__resolveJobId` / `__rejectJobId`) to the backend.enqueue result.
445
- *
446
- * Use this when the request lifecycle hooks call `outbox.flush(...)`.
447
- */
448
- declare function createOutboxDispatcher(backend: JobBackend): (entry: JobEnqueueInput) => Promise<unknown>;
449
-
450
- /**
451
- * Job runner — pulls leases from a backend and invokes the matching
452
- * handler. Each invocation wires up `JobContext` with:
453
- * - `traceId` extracted from the lease's `traceparent` header (W3C
454
- * Trace Context per R0.5.9), OR a fresh generated trace_id when
455
- * the upstream had no traceparent OR it was malformed.
456
- * - `attempt` from the lease.
457
- * - `signal` that aborts when the lease times out.
458
- *
459
- * `tick()` runs one dequeue+dispatch cycle and returns when all leases
460
- * have been ack'd or nack'd. Production deploys call `tick()` in a loop
461
- * with backoff (the loop is outside this module's scope).
462
- *
463
- * EC-6 (trace continuity edge): when a lease has no traceparent OR a
464
- * malformed one, the handler still gets a valid traceId (generated) —
465
- * never null/undefined. The job MAY itself enqueue child jobs that
466
- * continue the new trace_id.
467
- */
468
- interface JobRunner {
469
- /** Run one dequeue+dispatch cycle. */
470
- tick(opts?: {
471
- batchSize?: number;
472
- lockSeconds?: number;
473
- }): Promise<number>;
474
- }
475
- declare function createJobRunner(backend: JobBackend, definitions: readonly JobDefinition[]): JobRunner;
476
-
477
- interface JobNode {
478
- readonly name: string;
479
- readonly filePath: string;
480
- readonly maxAttempts: number;
481
- readonly hasInputSchema: boolean;
482
- }
483
- declare class DuplicateJobNameError extends Error {
484
- readonly jobName: string;
485
- readonly filePaths: readonly string[];
486
- readonly code = "DUPLICATE_JOB_NAME";
487
- constructor(jobName: string, filePaths: readonly string[]);
488
- }
489
- declare function scanJobs(jobsDir: string): Promise<JobNode[]>;
490
-
491
- declare const JOB_MANIFEST_SCHEMA_VERSION: 1;
492
- interface JobManifestEntry {
493
- readonly name: string;
494
- readonly filePath: string;
495
- readonly maxAttempts: number;
496
- readonly hasInputSchema: boolean;
497
- }
498
- interface JobManifest {
499
- readonly schemaVersion: typeof JOB_MANIFEST_SCHEMA_VERSION;
500
- readonly generatedAt: string;
501
- readonly jobs: readonly JobManifestEntry[];
502
- }
503
- declare function buildJobManifest(nodes: readonly JobNode[], projectRoot?: string): JobManifest;
504
- declare function writeJobManifest(path: string, input: readonly JobNode[] | JobManifest, projectRoot?: string): void;
505
-
506
- export { DuplicateContextKeyError as D, type EnqueueOptions as E, InMemoryJobBackend as I, type JobBackend as J, NonRetryableError as N, type Outbox as O, type PostgresFactory as P, type QueueClient as Q, type RedisFactory as R, StorageManager as S, __resetSingletonForTests as _, DuplicateJobNameError as a, type InMemoryJobBackendOptions as b, JOB_MANIFEST_SCHEMA_VERSION as c, type JobContext as d, type JobDefinition as e, type JobEnqueueInput as f, type JobLease as g, type JobManifest as h, type JobManifestEntry as i, type JobNode as j, type JobOptions as k, type JobRegistry as l, type JobRunner as m, type OutboxFlushOptions as n, PostgresJobBackend as o, type PostgresJobBackendOptions as p, buildJobManifest as q, createJobRunner as r, createOutbox as s, createOutboxDispatcher as t, createQueueClient as u, defineJob as v, getStorageManager as w, scanJobs as x, writeJobManifest as y };