theokit 0.43.6 → 0.43.12

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 (244) hide show
  1. package/LICENSE +201 -0
  2. package/dist/{actions-virtual-module-N7GKUS3D.js → actions-virtual-module-HG66SZ7T.js} +8 -8
  3. package/dist/actions-virtual-module-HG66SZ7T.js.map +1 -0
  4. package/dist/{actions-virtual-module-LD3YKWIX.js → actions-virtual-module-RSFRPJQZ.js} +7 -7
  5. package/dist/actions-virtual-module-RSFRPJQZ.js.map +1 -0
  6. package/dist/{add-W6FNTAFS.js → add-3VLFUPF4.js} +1 -1
  7. package/dist/add-3VLFUPF4.js.map +1 -0
  8. package/dist/{agent-U35G3WNE.js → agent-OXRRKB55.js} +5 -5
  9. package/dist/{agents-typed-client-NJ73Z6XY.js → agents-typed-client-X56CQ6FX.js} +1 -1
  10. package/dist/agents-typed-client-X56CQ6FX.js.map +1 -0
  11. package/dist/{agents-typed-client-CHMVW7MK.js → agents-typed-client-ZP7BKJB3.js} +1 -1
  12. package/dist/agents-typed-client-ZP7BKJB3.js.map +1 -0
  13. package/dist/{app-typed-client-6YZRDAPY.js → app-typed-client-GDF2OMJ2.js} +8 -8
  14. package/dist/app-typed-client-GDF2OMJ2.js.map +1 -0
  15. package/dist/{app-typed-client-V77SVU2O.js → app-typed-client-USLAMN7X.js} +7 -7
  16. package/dist/app-typed-client-USLAMN7X.js.map +1 -0
  17. package/dist/{aws-lambda-7GSCNLPY.js → aws-lambda-473QCOL6.js} +3 -3
  18. package/dist/{body-parser-web-MUWBKZ3F.js → body-parser-web-NNEJGX6Y.js} +1 -1
  19. package/dist/body-parser-web-NNEJGX6Y.js.map +1 -0
  20. package/dist/{body-parser-web-FV5HWCY3.js → body-parser-web-TIOTXPDW.js} +1 -1
  21. package/dist/body-parser-web-TIOTXPDW.js.map +1 -0
  22. package/dist/broadcast-LUMOJIJT.js +0 -0
  23. package/dist/{build-BYLQZJT2.js → build-MQHIJROR.js} +11 -11
  24. package/dist/{build-BYLQZJT2.js.map → build-MQHIJROR.js.map} +1 -1
  25. package/dist/{build-request-body-preview-EOP2Y4F3.js → build-request-body-preview-FVBQ7LCE.js} +1 -1
  26. package/dist/build-request-body-preview-FVBQ7LCE.js.map +1 -0
  27. package/dist/{build-request-body-preview-QMWD2IXK.js → build-request-body-preview-XPZ2GYMG.js} +1 -1
  28. package/dist/build-request-body-preview-XPZ2GYMG.js.map +1 -0
  29. package/dist/{bun-KP2KES6S.js → bun-OQUCL3XW.js} +3 -3
  30. package/dist/{check-PD2FTKMM.js → check-45NKUVSQ.js} +1 -1
  31. package/dist/check-45NKUVSQ.js.map +1 -0
  32. package/dist/{chunk-FRUEDJFX.js → chunk-226KMIGZ.js} +3 -3
  33. package/dist/{chunk-FRUEDJFX.js.map → chunk-226KMIGZ.js.map} +1 -1
  34. package/dist/{chunk-U3NTEK46.js → chunk-26ECIX74.js} +2 -2
  35. package/dist/chunk-2CVV6CNN.js +0 -0
  36. package/dist/{chunk-FEDSPOY6.js → chunk-2WH6SD3C.js} +6 -6
  37. package/dist/chunk-2WH6SD3C.js.map +1 -0
  38. package/dist/{chunk-JAIKGP3Q.js → chunk-47VNWTL4.js} +1 -1
  39. package/dist/chunk-47VNWTL4.js.map +1 -0
  40. package/dist/{chunk-D7ZH7DTG.js → chunk-4B2ZMX45.js} +1 -1
  41. package/dist/chunk-4B2ZMX45.js.map +1 -0
  42. package/dist/{chunk-IHJZPQEF.js → chunk-4HAU7AJM.js} +3 -3
  43. package/dist/chunk-4HAU7AJM.js.map +1 -0
  44. package/dist/{chunk-IPC5UREF.js → chunk-575PAX5L.js} +17 -17
  45. package/dist/chunk-575PAX5L.js.map +1 -0
  46. package/dist/chunk-5ODOE6EF.js +0 -0
  47. package/dist/{chunk-X2VVCJ4V.js → chunk-65EFIUDD.js} +1 -1
  48. package/dist/chunk-65EFIUDD.js.map +1 -0
  49. package/dist/{chunk-GY5Q27BJ.js → chunk-6FK7FKY6.js} +1 -1
  50. package/dist/{chunk-GY5Q27BJ.js.map → chunk-6FK7FKY6.js.map} +1 -1
  51. package/dist/{chunk-GSO77FSM.js → chunk-6OXCZMW3.js} +45 -47
  52. package/dist/chunk-6OXCZMW3.js.map +1 -0
  53. package/dist/{chunk-P37RZRFV.js → chunk-A7JBF5FO.js} +1 -1
  54. package/dist/chunk-A7JBF5FO.js.map +1 -0
  55. package/dist/{chunk-AFVTEAES.js → chunk-CJNMJUHE.js} +2 -2
  56. package/dist/{chunk-AXVFVMLM.js → chunk-DJFMAWH5.js} +8 -4
  57. package/dist/chunk-DJFMAWH5.js.map +1 -0
  58. package/dist/{chunk-2ZX4J4SX.js → chunk-DQVBL2G4.js} +58 -56
  59. package/dist/chunk-DQVBL2G4.js.map +1 -0
  60. package/dist/{chunk-GW5H4KB4.js → chunk-FX72VHAE.js} +3 -3
  61. package/dist/chunk-GDN3PXFH.js +0 -0
  62. package/dist/chunk-GEQJAFSV.js +0 -0
  63. package/dist/{chunk-5AVPWHUE.js → chunk-HGUZWG2C.js} +7 -4
  64. package/dist/chunk-HGUZWG2C.js.map +1 -0
  65. package/dist/chunk-HGZL5EOI.js +0 -0
  66. package/dist/chunk-HNBWZKIQ.js +0 -0
  67. package/dist/{chunk-UNLG36Z5.js → chunk-IE6C4KZX.js} +10 -5
  68. package/dist/chunk-IE6C4KZX.js.map +1 -0
  69. package/dist/chunk-IEES3CHD.js +0 -0
  70. package/dist/{chunk-QWBXUZAX.js → chunk-JIL74SFK.js} +4 -4
  71. package/dist/chunk-JIL74SFK.js.map +1 -0
  72. package/dist/{chunk-KI7OWQUX.js → chunk-L2S2R3TI.js} +63 -20
  73. package/dist/chunk-L2S2R3TI.js.map +1 -0
  74. package/dist/{chunk-L4GCEMNW.js → chunk-LNVMHQ2Z.js} +2 -2
  75. package/dist/{chunk-SPJNVWOK.js → chunk-N2D5AVRR.js} +2 -3
  76. package/dist/chunk-N2D5AVRR.js.map +1 -0
  77. package/dist/{chunk-UO7WS32S.js → chunk-OI6DK6ZJ.js} +3 -3
  78. package/dist/chunk-OI6DK6ZJ.js.map +1 -0
  79. package/dist/{chunk-RMU7EBRO.js → chunk-OP7QCTR5.js} +2 -2
  80. package/dist/{chunk-RMU7EBRO.js.map → chunk-OP7QCTR5.js.map} +1 -1
  81. package/dist/{chunk-GUUWDMR2.js → chunk-OVHW23YC.js} +2 -2
  82. package/dist/{chunk-NQRNDPZJ.js → chunk-OXCALO3W.js} +3 -3
  83. package/dist/{chunk-45C3WUQ7.js → chunk-QPVXGC7O.js} +1 -1
  84. package/dist/chunk-QPVXGC7O.js.map +1 -0
  85. package/dist/{chunk-FOZIR3TG.js → chunk-SMP2T335.js} +2 -2
  86. package/dist/{chunk-M6NMS5LR.js → chunk-TDNNBLGW.js} +1 -1
  87. package/dist/chunk-TDNNBLGW.js.map +1 -0
  88. package/dist/{chunk-WFNLNIJX.js → chunk-VPISAMXU.js} +2 -2
  89. package/dist/{chunk-5PU65T5W.js → chunk-XZ6B2Y2R.js} +1 -1
  90. package/dist/chunk-XZ6B2Y2R.js.map +1 -0
  91. package/dist/cli/index.js +15 -15
  92. package/dist/client/index.d.ts +1 -1
  93. package/dist/client/index.js +20 -25
  94. package/dist/client/index.js.map +1 -1
  95. package/dist/{cloudflare-C6E5SPAE.js → cloudflare-4YT5CK3P.js} +3 -3
  96. package/dist/configure-agent-registry-ZOBVU3MV.js +0 -0
  97. package/dist/{controller-swc-transform-URELVCBM.js → controller-swc-transform-JJRMTSDY.js} +1 -1
  98. package/dist/controller-swc-transform-JJRMTSDY.js.map +1 -0
  99. package/dist/{controller-swc-transform-XV3ETSE3.js → controller-swc-transform-LUJ4VAZJ.js} +1 -1
  100. package/dist/controller-swc-transform-LUJ4VAZJ.js.map +1 -0
  101. package/dist/{db-3UNAMSFK.js → db-IVVCQE5Z.js} +1 -2
  102. package/dist/db-IVVCQE5Z.js.map +1 -0
  103. package/dist/{deno-deploy-RFZN56X4.js → deno-deploy-YYN6BNLF.js} +3 -3
  104. package/dist/{dev-PS2NGT6I.js → dev-WQ4LWCAW.js} +13 -13
  105. package/dist/{dev-emit-2DL3MCLM.js → dev-emit-HLGJK3PP.js} +3 -3
  106. package/dist/dev-emit-HLGJK3PP.js.map +1 -0
  107. package/dist/{dev-emit-XVTJXZGA.js → dev-emit-J7V6GWSK.js} +6 -6
  108. package/dist/devtools/entry.js +43 -15
  109. package/dist/devtools/entry.js.map +1 -1
  110. package/dist/{dispatcher-63LBXYLE.js → dispatcher-DLKIXYNO.js} +2 -2
  111. package/dist/{dispatcher-EJHL6JMJ.js → dispatcher-KMZBGMM5.js} +1 -1
  112. package/dist/dispatcher-KMZBGMM5.js.map +1 -0
  113. package/dist/docker-LZZB4D5E.js +0 -0
  114. package/dist/{generate-5X4LG77M.js → generate-GXWPUVS7.js} +4 -5
  115. package/dist/generate-GXWPUVS7.js.map +1 -0
  116. package/dist/index.js +9 -9
  117. package/dist/{info-2OOXFTJX.js → info-75U6GCMD.js} +4 -4
  118. package/dist/info-75U6GCMD.js.map +1 -0
  119. package/dist/{internal-api-LFW7R65K.js → internal-api-DV3H5NNV.js} +7 -9
  120. package/dist/{internal-api-FBFV265J.js → internal-api-JFORKYLR.js} +8 -10
  121. package/dist/{load-config-3EAQTXPH.js → load-config-XP7NSSA7.js} +4 -4
  122. package/dist/{mcp-ML4QK5ON.js → mcp-FF3NTCHB.js} +6 -6
  123. package/dist/mcp-FF3NTCHB.js.map +1 -0
  124. package/dist/{netlify-PMLHVPN4.js → netlify-2WZUQYI3.js} +3 -3
  125. package/dist/node-CMAYKDCM.js +10 -0
  126. package/dist/{openapi-2HVGJMSN.js → openapi-ZPXYRAM2.js} +9 -9
  127. package/dist/openapi-ZPXYRAM2.js.map +1 -0
  128. package/dist/registry-72YH7ZJM.js +23 -0
  129. package/dist/registry-72YH7ZJM.js.map +1 -0
  130. package/dist/{router-TLEAOFID.js → router-6MAACS25.js} +1 -2
  131. package/dist/router-6MAACS25.js.map +1 -0
  132. package/dist/{routes-XNS3UM3B.js → routes-ZVDKABXZ.js} +6 -6
  133. package/dist/scan-7MJC6PYU.js +0 -0
  134. package/dist/schema-FBOTN46F.js +22 -0
  135. package/dist/server/agent/index.js +1 -1
  136. package/dist/server/cost/index.js +1 -1
  137. package/dist/server/cron/index.js +2 -2
  138. package/dist/server/http/index.js +3 -3
  139. package/dist/server/index.js +11 -11
  140. package/dist/server/jobs/index.js +3 -3
  141. package/dist/server/observability/index.d.ts +1 -38
  142. package/dist/server/observability/index.js +2 -2
  143. package/dist/server/scan/index.js +2 -2
  144. package/dist/server-error-to-envelope-UUXDSLAZ.js +0 -0
  145. package/dist/{server-routes-hmr-VZXOP5YT.js → server-routes-hmr-4W5L2MKN.js} +1 -1
  146. package/dist/server-routes-hmr-4W5L2MKN.js.map +1 -0
  147. package/dist/{server-routes-hmr-PBHSKCQJ.js → server-routes-hmr-RI7SYNT2.js} +1 -1
  148. package/dist/server-routes-hmr-RI7SYNT2.js.map +1 -0
  149. package/dist/{services-json-Y3XODNB5.js → services-json-7ZXJ4CIS.js} +1 -1
  150. package/dist/services-json-7ZXJ4CIS.js.map +1 -0
  151. package/dist/{services-typed-client-IETY2SAK.js → services-typed-client-AU6DKXAO.js} +2 -2
  152. package/dist/services-typed-client-AU6DKXAO.js.map +1 -0
  153. package/dist/{services-typed-client-32KMTTXR.js → services-typed-client-EO4RFNTZ.js} +2 -2
  154. package/dist/services-typed-client-EO4RFNTZ.js.map +1 -0
  155. package/dist/{start-YLR2SFHU.js → start-2U3FUCJX.js} +12 -12
  156. package/dist/start-2U3FUCJX.js.map +1 -0
  157. package/dist/{static-MB2CD5Y3.js → static-25H5K42R.js} +3 -3
  158. package/dist/{static-MB2CD5Y3.js.map → static-25H5K42R.js.map} +1 -1
  159. package/dist/storage-manager-ZSQFLEYT.js +0 -0
  160. package/dist/{theo-cloud-DQRP6S6M.js → theo-cloud-JL2KXHIS.js} +2 -2
  161. package/dist/{upgrade-readiness-ACGW44JC.js → upgrade-readiness-77P6VNB4.js} +1 -1
  162. package/dist/upgrade-readiness-77P6VNB4.js.map +1 -0
  163. package/dist/{vercel-J6G7ZHYQ.js → vercel-FP3C6LN6.js} +3 -3
  164. package/dist/vite-plugin/index.js +9 -9
  165. package/dist/{vite-plugin-6VVU6PPC.js → vite-plugin-D2NTPZNC.js} +13 -13
  166. package/package.json +10 -13
  167. package/dist/actions-virtual-module-LD3YKWIX.js.map +0 -1
  168. package/dist/actions-virtual-module-N7GKUS3D.js.map +0 -1
  169. package/dist/add-W6FNTAFS.js.map +0 -1
  170. package/dist/agents-typed-client-CHMVW7MK.js.map +0 -1
  171. package/dist/agents-typed-client-NJ73Z6XY.js.map +0 -1
  172. package/dist/app-typed-client-6YZRDAPY.js.map +0 -1
  173. package/dist/app-typed-client-V77SVU2O.js.map +0 -1
  174. package/dist/body-parser-web-FV5HWCY3.js.map +0 -1
  175. package/dist/body-parser-web-MUWBKZ3F.js.map +0 -1
  176. package/dist/build-request-body-preview-EOP2Y4F3.js.map +0 -1
  177. package/dist/build-request-body-preview-QMWD2IXK.js.map +0 -1
  178. package/dist/check-PD2FTKMM.js.map +0 -1
  179. package/dist/chunk-2ZX4J4SX.js.map +0 -1
  180. package/dist/chunk-45C3WUQ7.js.map +0 -1
  181. package/dist/chunk-5AVPWHUE.js.map +0 -1
  182. package/dist/chunk-5PU65T5W.js.map +0 -1
  183. package/dist/chunk-AXVFVMLM.js.map +0 -1
  184. package/dist/chunk-D7ZH7DTG.js.map +0 -1
  185. package/dist/chunk-FEDSPOY6.js.map +0 -1
  186. package/dist/chunk-GSO77FSM.js.map +0 -1
  187. package/dist/chunk-IHJZPQEF.js.map +0 -1
  188. package/dist/chunk-IPC5UREF.js.map +0 -1
  189. package/dist/chunk-JAIKGP3Q.js.map +0 -1
  190. package/dist/chunk-KI7OWQUX.js.map +0 -1
  191. package/dist/chunk-M6NMS5LR.js.map +0 -1
  192. package/dist/chunk-P37RZRFV.js.map +0 -1
  193. package/dist/chunk-QWBXUZAX.js.map +0 -1
  194. package/dist/chunk-SPJNVWOK.js.map +0 -1
  195. package/dist/chunk-UNLG36Z5.js.map +0 -1
  196. package/dist/chunk-UO7WS32S.js.map +0 -1
  197. package/dist/chunk-X2VVCJ4V.js.map +0 -1
  198. package/dist/controller-swc-transform-URELVCBM.js.map +0 -1
  199. package/dist/controller-swc-transform-XV3ETSE3.js.map +0 -1
  200. package/dist/db-3UNAMSFK.js.map +0 -1
  201. package/dist/dev-emit-2DL3MCLM.js.map +0 -1
  202. package/dist/dispatcher-EJHL6JMJ.js.map +0 -1
  203. package/dist/generate-5X4LG77M.js.map +0 -1
  204. package/dist/info-2OOXFTJX.js.map +0 -1
  205. package/dist/mcp-ML4QK5ON.js.map +0 -1
  206. package/dist/node-BPJ3Z4DT.js +0 -10
  207. package/dist/openapi-2HVGJMSN.js.map +0 -1
  208. package/dist/registry-FKPH7XEL.js +0 -24
  209. package/dist/registry-FKPH7XEL.js.map +0 -1
  210. package/dist/router-TLEAOFID.js.map +0 -1
  211. package/dist/schema-LYOLNHZ7.js +0 -30
  212. package/dist/server-routes-hmr-PBHSKCQJ.js.map +0 -1
  213. package/dist/server-routes-hmr-VZXOP5YT.js.map +0 -1
  214. package/dist/services-json-Y3XODNB5.js.map +0 -1
  215. package/dist/services-typed-client-32KMTTXR.js.map +0 -1
  216. package/dist/services-typed-client-IETY2SAK.js.map +0 -1
  217. package/dist/start-YLR2SFHU.js.map +0 -1
  218. package/dist/upgrade-readiness-ACGW44JC.js.map +0 -1
  219. /package/dist/{agent-U35G3WNE.js.map → agent-OXRRKB55.js.map} +0 -0
  220. /package/dist/{aws-lambda-7GSCNLPY.js.map → aws-lambda-473QCOL6.js.map} +0 -0
  221. /package/dist/{bun-KP2KES6S.js.map → bun-OQUCL3XW.js.map} +0 -0
  222. /package/dist/{chunk-U3NTEK46.js.map → chunk-26ECIX74.js.map} +0 -0
  223. /package/dist/{chunk-AFVTEAES.js.map → chunk-CJNMJUHE.js.map} +0 -0
  224. /package/dist/{chunk-GW5H4KB4.js.map → chunk-FX72VHAE.js.map} +0 -0
  225. /package/dist/{chunk-L4GCEMNW.js.map → chunk-LNVMHQ2Z.js.map} +0 -0
  226. /package/dist/{chunk-GUUWDMR2.js.map → chunk-OVHW23YC.js.map} +0 -0
  227. /package/dist/{chunk-NQRNDPZJ.js.map → chunk-OXCALO3W.js.map} +0 -0
  228. /package/dist/{chunk-FOZIR3TG.js.map → chunk-SMP2T335.js.map} +0 -0
  229. /package/dist/{chunk-WFNLNIJX.js.map → chunk-VPISAMXU.js.map} +0 -0
  230. /package/dist/{cloudflare-C6E5SPAE.js.map → cloudflare-4YT5CK3P.js.map} +0 -0
  231. /package/dist/{deno-deploy-RFZN56X4.js.map → deno-deploy-YYN6BNLF.js.map} +0 -0
  232. /package/dist/{dev-PS2NGT6I.js.map → dev-WQ4LWCAW.js.map} +0 -0
  233. /package/dist/{dev-emit-XVTJXZGA.js.map → dev-emit-J7V6GWSK.js.map} +0 -0
  234. /package/dist/{dispatcher-63LBXYLE.js.map → dispatcher-DLKIXYNO.js.map} +0 -0
  235. /package/dist/{internal-api-FBFV265J.js.map → internal-api-DV3H5NNV.js.map} +0 -0
  236. /package/dist/{internal-api-LFW7R65K.js.map → internal-api-JFORKYLR.js.map} +0 -0
  237. /package/dist/{load-config-3EAQTXPH.js.map → load-config-XP7NSSA7.js.map} +0 -0
  238. /package/dist/{netlify-PMLHVPN4.js.map → netlify-2WZUQYI3.js.map} +0 -0
  239. /package/dist/{node-BPJ3Z4DT.js.map → node-CMAYKDCM.js.map} +0 -0
  240. /package/dist/{routes-XNS3UM3B.js.map → routes-ZVDKABXZ.js.map} +0 -0
  241. /package/dist/{schema-LYOLNHZ7.js.map → schema-FBOTN46F.js.map} +0 -0
  242. /package/dist/{theo-cloud-DQRP6S6M.js.map → theo-cloud-JL2KXHIS.js.map} +0 -0
  243. /package/dist/{vercel-J6G7ZHYQ.js.map → vercel-FP3C6LN6.js.map} +0 -0
  244. /package/dist/{vite-plugin-6VVU6PPC.js.map → vite-plugin-D2NTPZNC.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/migrate/router.ts","../src/cli/commands/migrate/router-codemod.ts"],"sourcesContent":["/**\n * G6 T2.1 — `theokit migrate router` CLI subcommand.\n *\n * Plan: .claude/knowledge-base/plans/g6-router-convention-plan.md v1.1\n *\n * Wraps the pure `planRouterMigration` with side effects:\n * - EC-2: pre-flight `isPortInUse(3000|3100)` warning to prevent the\n * dev-server HMR cascade described in the edge-case review.\n * - EC-7: partial failure produces a typed `RouterMigrationPartialFailure`\n * with `filesAlreadyMigrated` so a re-run can continue from where it\n * stopped (idempotent by virtue of `planRouterMigration`).\n * - Prefers `git mv $from $to` so the rename appears as a single\n * history entry; falls back to `mkdir -p $(dirname $to) && fs.rename`\n * when not in a git repo or git mv fails.\n */\nimport { execFileSync } from 'node:child_process'\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'\nimport { createServer } from 'node:net'\nimport { dirname, resolve } from 'node:path'\n\nimport {\n computeDepthDelta,\n planRouterMigration,\n rewriteRelativeImports,\n type RouterMigrationPlanItem,\n} from './router-codemod.js'\n\ninterface RouterMigrateOptions {\n /** Absolute path to `<project>/server/routes`. Defaults to `<cwd>/server/routes`. */\n routesDir?: string\n /**\n * Skip the EC-2 dev-server port pre-flight check (CI / non-TTY).\n * Default: false.\n */\n force?: boolean\n /** When true, prints the plan but performs no renames (dry-run). */\n dryRun?: boolean\n /** When true, suppresses stdout (used in tests). */\n silent?: boolean\n}\n\n/**\n * Thrown when the codemod completes with at least one successful rename\n * AND at least one failure — caller can re-run safely (idempotent) and\n * the second pass will skip already-migrated files.\n */\nclass RouterMigrationPartialFailure extends Error {\n override readonly name = 'RouterMigrationPartialFailure'\n readonly filesAlreadyMigrated: string[]\n readonly failedFile: string\n readonly causeMessage: string\n constructor(filesAlreadyMigrated: string[], failedFile: string, causeMessage: string) {\n super(\n `Router migration partial failure: ${filesAlreadyMigrated.length} files migrated successfully, then failed on ${failedFile}: ${causeMessage}. Re-run \\`theokit migrate router\\` to retry — already-migrated files will be skipped.`,\n )\n this.filesAlreadyMigrated = filesAlreadyMigrated\n this.failedFile = failedFile\n this.causeMessage = causeMessage\n }\n}\n\n/**\n * EC-2: dev-server detection. Returns true if the port is in use (someone\n * is already listening on localhost:<port>). Uses Node's `node:net` —\n * zero new deps.\n */\nexport async function isPortInUse(port: number): Promise<boolean> {\n return await new Promise<boolean>((resolve) => {\n const probe = createServer()\n probe.once('error', (err: NodeJS.ErrnoException) => {\n probe.close(() => {\n resolve(err.code === 'EADDRINUSE')\n })\n })\n probe.once('listening', () => {\n probe.close(() => {\n resolve(false)\n })\n })\n probe.listen(port, '127.0.0.1')\n })\n}\n\n/**\n * EC-2 pre-flight: returns the first port in use among the typical\n * theokit dev ports (3000 + 3100) so the caller can warn the user.\n */\nexport async function findRunningDevServerPort(): Promise<number | null> {\n for (const port of [3000, 3100]) {\n if (await isPortInUse(port)) return port\n }\n return null\n}\n\nfunction tryGitMv(from: string, to: string): boolean {\n try {\n mkdirSync(dirname(to), { recursive: true })\n // Arguments are absolute paths from a recursive walk of <routesDir>.\n // Pass as argv to avoid shell parsing entirely (no `shell: true`).\n // `git` is resolved via the operator's PATH (same security model as\n // every other CLI tool — `theokit dev`, `pnpm install`, etc.).\n\n execFileSync('git', ['mv', from, to], { stdio: 'pipe' })\n return true\n } catch {\n return false\n }\n}\n\nfunction fallbackRename(from: string, to: string): void {\n mkdirSync(dirname(to), { recursive: true })\n renameSync(from, to)\n}\n\nfunction applyRename(item: RouterMigrationPlanItem): void {\n if (!existsSync(item.from)) {\n // Idempotency: already migrated — skip silently\n return\n }\n if (existsSync(item.to)) {\n // The plan() phase would have thrown CollisionError if we knew about\n // it at plan time. This branch covers a race condition where the\n // target was created between plan and apply.\n throw new Error(\n `Refusing to overwrite existing file at ${item.to} during migration of ${item.from}`,\n )\n }\n if (!tryGitMv(item.from, item.to)) {\n fallbackRename(item.from, item.to)\n }\n}\n\n/**\n * Adjust relative imports inside the renamed file to compensate for the\n * extra nesting depth. Without this, `import { foo } from './chat'` inside\n * a file moved from `routes/admin.sdk-config.ts` → `routes/admin/sdk-config.ts`\n * would fail to resolve at typecheck/runtime — the import needs `../chat`\n * now that the file lives one level deeper.\n */\nfunction applyImportRewrite(item: RouterMigrationPlanItem, routesDir: string): void {\n const delta = computeDepthDelta(item.from, item.to, routesDir)\n if (delta <= 0) return\n const source = readFileSync(item.to, 'utf8')\n const rewritten = rewriteRelativeImports(source, delta)\n if (rewritten !== source) {\n writeFileSync(item.to, rewritten, 'utf8')\n }\n}\n\ninterface RouterMigrateResult {\n /** Successfully renamed (from, to) pairs. */\n migrated: RouterMigrationPlanItem[]\n /** Plan was empty — nothing to do (already-nested). */\n alreadyClean: boolean\n}\n\ntype LogFn = (msg: string) => void\n\nfunction makeLog(silent: boolean | undefined): LogFn {\n if (silent) {\n return (_msg: string) => {\n // intentionally silent\n }\n }\n return (msg: string) => {\n console.log(msg)\n }\n}\n\nasync function assertNoRunningDevServer(opts: RouterMigrateOptions): Promise<void> {\n if (opts.force) return\n const runningPort = await findRunningDevServerPort()\n if (runningPort !== null) {\n throw new Error(\n `Detected theokit dev server running on port ${runningPort}. STOP it before running migration to avoid HMR cascade (see EC-2). Re-run with --force to override.`,\n )\n }\n}\n\nfunction executeRenames(\n plan: readonly RouterMigrationPlanItem[],\n routesDir: string,\n log: LogFn,\n): RouterMigrationPlanItem[] {\n const migrated: RouterMigrationPlanItem[] = []\n for (const item of plan) {\n try {\n applyRename(item)\n applyImportRewrite(item, routesDir)\n migrated.push(item)\n log(` ✓ ${item.from} → ${item.to}`)\n } catch (err) {\n // EC-7: partial failure observability — emit structured error with\n // the list of already-migrated files so a re-run can recover.\n const causeMessage = err instanceof Error ? err.message : String(err)\n throw new RouterMigrationPartialFailure(\n migrated.map((m) => m.from),\n item.from,\n causeMessage,\n )\n }\n }\n return migrated\n}\n\nexport async function routerMigrateCommand(\n opts: RouterMigrateOptions = {},\n): Promise<RouterMigrateResult> {\n const routesDir = opts.routesDir ?? resolve(process.cwd(), 'server', 'routes')\n const log = makeLog(opts.silent)\n\n await assertNoRunningDevServer(opts)\n\n const plan = planRouterMigration(routesDir)\n if (plan.length === 0) {\n log(' ✓ Router already uses directory-nested convention. Nothing to do.')\n return { migrated: [], alreadyClean: true }\n }\n\n log(` → Migrating ${plan.length} dotted route(s) to directory-nested form...`)\n\n if (opts.dryRun) {\n for (const item of plan) {\n log(` [dry-run] ${item.from} → ${item.to}`)\n }\n return { migrated: [], alreadyClean: false }\n }\n\n const migrated = executeRenames(plan, routesDir, log)\n log(` ✓ Migrated ${migrated.length} route(s).`)\n return { migrated, alreadyClean: false }\n}\n","/**\n * G6 T2.1 — Pure codemod core for `theokit migrate router`.\n *\n * Plan: .claude/knowledge-base/plans/g6-router-convention-plan.md v1.1\n *\n * `planRouterMigration` walks `<routesDir>` recursively and returns the\n * set of (from, to) renames required to convert legacy dotted-basename\n * routes (`auth.[provider].login.ts`) into the directory-nested form\n * (`auth/[provider]/login.ts`). The function is PURE — it does NOT\n * touch the filesystem beyond `readdirSync`/`statSync`. The CLI subcommand\n * (`router.ts`) is responsible for executing the renames via `git mv`\n * or `fs.rename` with the appropriate error handling.\n *\n * Edge cases covered:\n * - EC-4: co-located `*.test.[jt]sx?` / `*.spec.[jt]sx?` files are\n * silently skipped (same filter as the scanner).\n * - EC-5: target collision detection is CASE-INSENSITIVE so a\n * macOS/Windows dev doesn't silently overwrite a sibling file that\n * differs only in case.\n * - Idempotent: invoked twice on the same tree, the second pass is empty.\n */\nimport { readdirSync, statSync } from 'node:fs'\nimport { extname, join, relative, sep } from 'node:path'\n\nconst ROUTE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx'])\nconst TEST_OR_SPEC_RE = /\\.(test|spec)\\.[jt]sx?$/\n\n/**\n * One pending rename emitted by `planRouterMigration`.\n */\nexport interface RouterMigrationPlanItem {\n /** Absolute path of the offending dotted-basename file. */\n from: string\n /** Absolute path of the proposed directory-nested replacement. */\n to: string\n}\n\n/**\n * `RouterMigrationCollisionError` is thrown when migrating a dotted file\n * would overwrite an existing file (case-insensitive). The caller MUST\n * resolve the conflict manually before re-running the codemod.\n */\nexport class RouterMigrationCollisionError extends Error {\n override readonly name = 'RouterMigrationCollisionError'\n readonly from: string\n readonly to: string\n constructor(from: string, to: string) {\n super(\n `Router migration collision: ${from} would rename to ${to}, but that file already exists (case-insensitive match). Resolve manually.`,\n )\n this.from = from\n this.to = to\n }\n}\n\n/**\n * Compute the depth delta (number of extra `..` levels needed) between\n * the original (dotted) path and the migrated (nested) path, relative\n * to a common `routesDir` ancestor.\n *\n * - `admin.sdk-config.ts` (depth 0) → `admin/sdk-config.ts` (depth 1): delta = 1\n * - `debug.stability.last.ts` (depth 0) → `debug/stability/last.ts` (depth 2): delta = 2\n * - `canvas/artifacts.[id].ts` (depth 1) → `canvas/artifacts/[id].ts` (depth 2): delta = 1\n */\nexport function computeDepthDelta(from: string, to: string, routesDir: string): number {\n const depthOf = (p: string): number => {\n const rel = relative(routesDir, p).replace(/\\\\/g, '/')\n // depth = number of `/` separators in the relative path\n return rel.split('/').length - 1\n }\n return depthOf(to) - depthOf(from)\n}\n\n/**\n * Rewrite all relative imports in `source` by prepending `../` × `delta`\n * to every `./X` or `../X` specifier. Absolute / package specifiers\n * (`theokit/server`, `zod`, `node:fs`) are untouched.\n *\n * Handles three import shapes:\n * - `import ... from './foo'`\n * - `import('./foo')` (dynamic)\n * - `import './foo'` (side-effect only)\n * - `export ... from './foo'` (re-exports)\n *\n * Pure: returns the new source; does NOT touch disk.\n */\nexport function rewriteRelativeImports(source: string, delta: number): string {\n if (delta <= 0) return source\n\n const prefix = '../'.repeat(delta)\n\n // Rewrites a captured relative specifier: `./foo` → `<prefix>foo`,\n // `../foo` → `<prefix>../foo`. Single source of truth for the algorithm\n // shared by all three import-shape regexes below.\n const transformSpecifier = (specifier: string): string => {\n if (specifier.startsWith('./')) return `${prefix}${specifier.slice(2)}`\n return `${prefix}${specifier}`\n }\n\n // Three narrow regexes keep us out of catastrophic-backtracking territory.\n // Each is anchored on a keyword (`from`, `import`) and uses a possessive\n // character class (`[^'\"]+`) for the specifier, so backtracking is bounded.\n const fromRe = /\\bfrom\\s+(['\"])(\\.{1,2}\\/[^'\"]+)\\1/g\n const dynRe = /\\bimport\\s*\\(\\s*(['\"])(\\.{1,2}\\/[^'\"]+)\\1\\s*\\)/g\n const sideRe = /\\bimport\\s+(['\"])(\\.{1,2}\\/[^'\"]+)\\1/g\n\n const fromSub = (_m: string, q: string, spec: string): string =>\n `from ${q}${transformSpecifier(spec)}${q}`\n const dynSub = (_m: string, q: string, spec: string): string =>\n `import(${q}${transformSpecifier(spec)}${q})`\n const sideSub = (_m: string, q: string, spec: string): string =>\n `import ${q}${transformSpecifier(spec)}${q}`\n\n // `from` covers both `import ... from '...'` and `export ... from '...'`\n // (the `\\bfrom\\s+` anchor matches the keyword position in both shapes).\n // `dynRe` handles `import('...')`. `sideRe` handles bare `import '...'`.\n // No overlap — `sideRe` requires `import` followed by whitespace then\n // a quote (vs. `import(` for dynRe and `import ... from` for fromRe).\n return source.replace(fromRe, fromSub).replace(dynRe, dynSub).replace(sideRe, sideSub)\n}\n\nfunction isTestOrSpecFile(filePath: string): boolean {\n return TEST_OR_SPEC_RE.test(filePath)\n}\n\nfunction hasDotOutsideBrackets(segment: string): boolean {\n let depth = 0\n for (const ch of segment) {\n if (ch === '[') depth++\n else if (ch === ']') depth--\n else if (ch === '.' && depth === 0) return true\n }\n return false\n}\n\nfunction splitDottedSegmentOutsideBrackets(segment: string): string[] {\n const parts: string[] = []\n let current = ''\n let depth = 0\n for (const ch of segment) {\n if (ch === '[') {\n depth++\n current += ch\n } else if (ch === ']') {\n depth--\n current += ch\n } else if (ch === '.' && depth === 0) {\n if (current) parts.push(current)\n current = ''\n } else {\n current += ch\n }\n }\n if (current) parts.push(current)\n return parts\n}\n\nfunction toDirectoryNestedPath(filePath: string, routesDir: string): string {\n const rel = relative(routesDir, filePath).replace(/\\\\/g, '/')\n const ext = extname(rel)\n const withoutExt = rel.slice(0, -ext.length)\n const flattened = withoutExt.split('/').flatMap(splitDottedSegmentOutsideBrackets)\n return join(routesDir, `${flattened.join(sep)}${ext}`)\n}\n\nfunction walkRoutes(root: string, onFile: (absPath: string) => void): void {\n let entries\n try {\n entries = readdirSync(root, { withFileTypes: true })\n } catch {\n return\n }\n for (const entry of entries) {\n if (entry.name.startsWith('_') || entry.name.startsWith('.')) continue\n const full = join(root, entry.name)\n if (entry.isDirectory()) {\n walkRoutes(full, onFile)\n } else if (entry.isFile() && ROUTE_EXTENSIONS.has(extname(entry.name))) {\n onFile(full)\n }\n }\n}\n\nfunction isDottedRouteFile(filePath: string, routesDir: string): boolean {\n const rel = relative(routesDir, filePath).replace(/\\\\/g, '/')\n const ext = extname(rel)\n const withoutExt = rel.slice(0, -ext.length)\n return withoutExt.split('/').some(hasDotOutsideBrackets)\n}\n\n/**\n * Compute the migration plan for a `<server>/routes` tree.\n *\n * Pure: does NOT mutate the filesystem.\n *\n * @throws RouterMigrationCollisionError when a target collides with an\n * existing file (case-insensitive).\n */\nexport function planRouterMigration(routesDir: string): RouterMigrationPlanItem[] {\n const plan: RouterMigrationPlanItem[] = []\n const existingPathsLowercase = new Set<string>()\n\n walkRoutes(routesDir, (absPath) => {\n existingPathsLowercase.add(absPath.toLowerCase())\n })\n\n walkRoutes(routesDir, (absPath) => {\n if (isTestOrSpecFile(absPath)) return\n if (!isDottedRouteFile(absPath, routesDir)) return\n\n const to = toDirectoryNestedPath(absPath, routesDir)\n\n // EC-5: case-insensitive collision check — macOS HFS+/APFS default\n // and Windows NTFS treat case-only differences as the same path. If\n // any pre-existing file at a case-insensitive match exists, the codemod\n // would silently overwrite on those platforms; we bail explicitly.\n const targetLower = to.toLowerCase()\n if (existingPathsLowercase.has(targetLower) && targetLower !== absPath.toLowerCase()) {\n throw new RouterMigrationCollisionError(absPath, to)\n }\n // Also guard against statSync race using an explicit existence check.\n try {\n if (statSync(to).isFile()) {\n throw new RouterMigrationCollisionError(absPath, to)\n }\n } catch (err) {\n if (err instanceof RouterMigrationCollisionError) throw err\n // ENOENT — fine, target does not exist\n }\n\n plan.push({ from: absPath, to })\n })\n\n return plan\n}\n"],"mappings":"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","names":["resolve"]}
@@ -5,16 +5,16 @@ import {
5
5
  } from "./chunk-GEQJAFSV.js";
6
6
  import {
7
7
  loadConfig
8
- } from "./chunk-AFVTEAES.js";
8
+ } from "./chunk-CJNMJUHE.js";
9
9
  import "./chunk-GDN3PXFH.js";
10
- import "./chunk-GSO77FSM.js";
11
- import "./chunk-45C3WUQ7.js";
10
+ import "./chunk-6OXCZMW3.js";
11
+ import "./chunk-QPVXGC7O.js";
12
12
  import {
13
13
  scanServerActions,
14
14
  scanServerRoutes,
15
15
  scanWebSocketRoutes
16
- } from "./chunk-FRUEDJFX.js";
17
- import "./chunk-P37RZRFV.js";
16
+ } from "./chunk-226KMIGZ.js";
17
+ import "./chunk-A7JBF5FO.js";
18
18
 
19
19
  // src/cli/commands/routes.ts
20
20
  import { resolve, relative } from "path";
@@ -62,4 +62,4 @@ async function routesCommand() {
62
62
  export {
63
63
  routesCommand
64
64
  };
65
- //# sourceMappingURL=routes-XNS3UM3B.js.map
65
+ //# sourceMappingURL=routes-ZVDKABXZ.js.map
File without changes
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ import "tsx/esm";
3
+ import {
4
+ cacheSchema,
5
+ corsSchema,
6
+ rateLimitSchema,
7
+ securityHeadersSchema,
8
+ securitySchema,
9
+ storageSchema,
10
+ theoConfigSchema
11
+ } from "./chunk-6OXCZMW3.js";
12
+ import "./chunk-QPVXGC7O.js";
13
+ export {
14
+ cacheSchema,
15
+ corsSchema,
16
+ rateLimitSchema,
17
+ securityHeadersSchema,
18
+ securitySchema,
19
+ storageSchema,
20
+ theoConfigSchema
21
+ };
22
+ //# sourceMappingURL=schema-FBOTN46F.js.map
@@ -12,7 +12,7 @@ import {
12
12
  parseChannelPath,
13
13
  serveMcpStdio,
14
14
  streamAgentTurnInProcess
15
- } from "../../chunk-5AVPWHUE.js";
15
+ } from "../../chunk-HGUZWG2C.js";
16
16
  import {
17
17
  buildResourceDescriptors,
18
18
  defineAppResource,
@@ -2,7 +2,7 @@ import {
2
2
  InMemoryUsageStorage,
3
3
  trackAgentRun,
4
4
  trackAgentTools
5
- } from "../../chunk-RMU7EBRO.js";
5
+ } from "../../chunk-OP7QCTR5.js";
6
6
  import "../../chunk-DGUM43GV.js";
7
7
  export {
8
8
  InMemoryUsageStorage,
@@ -14,11 +14,11 @@ import {
14
14
  translateCronToVercel,
15
15
  validateCronSchedule,
16
16
  writeCronManifest
17
- } from "../../chunk-U3NTEK46.js";
17
+ } from "../../chunk-26ECIX74.js";
18
18
  import "../../chunk-YB5DJJ4U.js";
19
19
  import "../../chunk-6NEXVBPY.js";
20
20
  import "../../chunk-7MQOHNHE.js";
21
- import "../../chunk-X2VVCJ4V.js";
21
+ import "../../chunk-65EFIUDD.js";
22
22
  import "../../chunk-DGUM43GV.js";
23
23
  export {
24
24
  CRON_MANIFEST_SCHEMA_VERSION,
@@ -24,9 +24,9 @@ import {
24
24
  runMiddlewareAndContext,
25
25
  sendError,
26
26
  sendJson
27
- } from "../../chunk-QWBXUZAX.js";
28
- import "../../chunk-GY5Q27BJ.js";
29
- import "../../chunk-WFNLNIJX.js";
27
+ } from "../../chunk-JIL74SFK.js";
28
+ import "../../chunk-6FK7FKY6.js";
29
+ import "../../chunk-VPISAMXU.js";
30
30
  import "../../chunk-ZEGYW52B.js";
31
31
  import "../../chunk-TSLSIRBR.js";
32
32
  import "../../chunk-UD3LFGDL.js";
@@ -28,7 +28,7 @@ import {
28
28
  defineJob,
29
29
  scanJobs,
30
30
  writeJobManifest
31
- } from "../chunk-GUUWDMR2.js";
31
+ } from "../chunk-OVHW23YC.js";
32
32
  import {
33
33
  ConsoleObservabilityAdapter,
34
34
  NoopObservabilityAdapter,
@@ -39,7 +39,7 @@ import {
39
39
  defineObservabilityAdapter,
40
40
  resolveAdapter,
41
41
  serializeSpansToOtlp
42
- } from "../chunk-KI7OWQUX.js";
42
+ } from "../chunk-L2S2R3TI.js";
43
43
  import "../chunk-NPMCKOX4.js";
44
44
  import {
45
45
  createRouteRateLimiter,
@@ -61,7 +61,7 @@ import {
61
61
  resolveTransformer,
62
62
  superjsonTransformer,
63
63
  validateRouteInput
64
- } from "../chunk-GW5H4KB4.js";
64
+ } from "../chunk-FX72VHAE.js";
65
65
  import {
66
66
  ActionError,
67
67
  ActionInputError,
@@ -88,13 +88,13 @@ import {
88
88
  runMiddlewareAndContext,
89
89
  sendError,
90
90
  sendJson
91
- } from "../chunk-QWBXUZAX.js";
91
+ } from "../chunk-JIL74SFK.js";
92
92
  import {
93
93
  DuplicateContextKeyError,
94
94
  createOutbox,
95
95
  createOutboxDispatcher,
96
96
  createQueueClient
97
- } from "../chunk-GY5Q27BJ.js";
97
+ } from "../chunk-6FK7FKY6.js";
98
98
  import {
99
99
  findSuggestion,
100
100
  levenshtein
@@ -106,7 +106,7 @@ import {
106
106
  logRequest,
107
107
  parseRequestBody,
108
108
  warnOnce
109
- } from "../chunk-WFNLNIJX.js";
109
+ } from "../chunk-VPISAMXU.js";
110
110
  import {
111
111
  DuplicateDecorationError,
112
112
  DuplicatePluginError,
@@ -134,7 +134,7 @@ import {
134
134
  scanServerRoutes,
135
135
  scanWebSocketRoutes,
136
136
  writeManifest
137
- } from "../chunk-IHJZPQEF.js";
137
+ } from "../chunk-4HAU7AJM.js";
138
138
  import "../chunk-WSJKACWB.js";
139
139
  import {
140
140
  scanMiddlewares
@@ -191,7 +191,7 @@ import {
191
191
  parseChannelPath,
192
192
  serveMcpStdio,
193
193
  streamAgentTurnInProcess
194
- } from "../chunk-5AVPWHUE.js";
194
+ } from "../chunk-HGUZWG2C.js";
195
195
  import {
196
196
  buildResourceDescriptors,
197
197
  defineAppResource,
@@ -241,7 +241,7 @@ import {
241
241
  InMemoryUsageStorage,
242
242
  trackAgentRun,
243
243
  trackAgentTools
244
- } from "../chunk-RMU7EBRO.js";
244
+ } from "../chunk-OP7QCTR5.js";
245
245
  import {
246
246
  CRON_MANIFEST_SCHEMA_VERSION,
247
247
  DuplicateCronNameError,
@@ -258,11 +258,11 @@ import {
258
258
  translateCronToVercel,
259
259
  validateCronSchedule,
260
260
  writeCronManifest
261
- } from "../chunk-U3NTEK46.js";
261
+ } from "../chunk-26ECIX74.js";
262
262
  import "../chunk-YB5DJJ4U.js";
263
263
  import "../chunk-6NEXVBPY.js";
264
264
  import "../chunk-7MQOHNHE.js";
265
- import "../chunk-X2VVCJ4V.js";
265
+ import "../chunk-65EFIUDD.js";
266
266
  import {
267
267
  action,
268
268
  defineChannel,
@@ -9,17 +9,17 @@ import {
9
9
  defineJob,
10
10
  scanJobs,
11
11
  writeJobManifest
12
- } from "../../chunk-GUUWDMR2.js";
12
+ } from "../../chunk-OVHW23YC.js";
13
13
  import {
14
14
  DuplicateContextKeyError,
15
15
  createOutbox,
16
16
  createOutboxDispatcher,
17
17
  createQueueClient
18
- } from "../../chunk-GY5Q27BJ.js";
18
+ } from "../../chunk-6FK7FKY6.js";
19
19
  import "../../chunk-YB5DJJ4U.js";
20
20
  import "../../chunk-6NEXVBPY.js";
21
21
  import "../../chunk-7MQOHNHE.js";
22
- import "../../chunk-X2VVCJ4V.js";
22
+ import "../../chunk-65EFIUDD.js";
23
23
  import "../../chunk-DGUM43GV.js";
24
24
  export {
25
25
  DuplicateContextKeyError,
@@ -71,9 +71,7 @@ declare function findSuggestion(input: string, candidates: string[], maxDistance
71
71
  * Per ADR D456: implementations can be lightweight (50 LoC OTLP serializer)
72
72
  * or full OTel SDK wrappers via defineObservabilityAdapter().
73
73
  */
74
- interface SpanAttributes {
75
- [key: string]: string | number | boolean | undefined;
76
- }
74
+ type SpanAttributes = Record<string, string | number | boolean | undefined>;
77
75
  /** Handle to an active span — setAttribute, setStatus, end. */
78
76
  interface SpanHandle {
79
77
  /** Set a key-value attribute on this span. */
@@ -101,14 +99,6 @@ interface ObservabilityAdapter {
101
99
  shutdown(): Promise<void>;
102
100
  }
103
101
 
104
- /**
105
- * NoopObservabilityAdapter — silent fallback.
106
- *
107
- * All methods are no-ops. Never throws, never blocks.
108
- * Used as the default when no other adapter is configured.
109
- * EC-2: startSpan after shutdown returns a noop span (no crash).
110
- */
111
-
112
102
  declare class NoopObservabilityAdapter implements ObservabilityAdapter {
113
103
  readonly name = "noop";
114
104
  private isShutdown;
@@ -120,13 +110,6 @@ declare class NoopObservabilityAdapter implements ObservabilityAdapter {
120
110
  shutdown(): Promise<void>;
121
111
  }
122
112
 
123
- /**
124
- * ConsoleObservabilityAdapter — dev-mode console output.
125
- *
126
- * Emits JSON-structured lines to a configurable writer (default: process.stderr).
127
- * Inspired by Hono middleware timing pattern.
128
- */
129
-
130
113
  interface ConsoleAdapterOptions {
131
114
  /** Writer function — defaults to process.stderr.write. */
132
115
  write?: (line: string) => void;
@@ -147,16 +130,6 @@ declare class ConsoleObservabilityAdapter implements ObservabilityAdapter {
147
130
  private emit;
148
131
  }
149
132
 
150
- /**
151
- * TheoCloudObservabilityAdapter — OTLP/HTTP batched export for TheoCloud.
152
- *
153
- * Zero-config via env vars (THEO_CLOUD_INGEST_URL, THEO_CLOUD_API_KEY).
154
- * Batches spans and flushes via native fetch() POST.
155
- *
156
- * EC-1: flush failure logs warning, does NOT throw, does NOT retry (KISS).
157
- * EC-2: startSpan after shutdown returns noop span.
158
- */
159
-
160
133
  interface TheoCloudAdapterOptions {
161
134
  /** TheoCloud ingest endpoint URL. */
162
135
  ingestUrl: string;
@@ -181,16 +154,6 @@ declare class TheoCloudObservabilityAdapter implements ObservabilityAdapter {
181
154
  shutdown(): Promise<void>;
182
155
  }
183
156
 
184
- /**
185
- * Adapter registry — resolves the active observability adapter.
186
- *
187
- * Per ADR D457 (v1.1) priority chain:
188
- * 1. Explicit config (theo.config.ts observability.provider) — ALWAYS wins
189
- * 2. THEO_CLOUD_INGEST_URL env → theo-cloud adapter
190
- * 3. NODE_ENV=development → console adapter
191
- * 4. Fallback → noop adapter
192
- */
193
-
194
157
  interface ResolveAdapterOptions {
195
158
  env: Record<string, string | undefined>;
196
159
  config?: {
@@ -8,7 +8,7 @@ import {
8
8
  defineObservabilityAdapter,
9
9
  resolveAdapter,
10
10
  serializeSpansToOtlp
11
- } from "../../chunk-KI7OWQUX.js";
11
+ } from "../../chunk-L2S2R3TI.js";
12
12
  import {
13
13
  findSuggestion,
14
14
  levenshtein
@@ -18,7 +18,7 @@ import {
18
18
  createLogger,
19
19
  logRequest,
20
20
  warnOnce
21
- } from "../../chunk-WFNLNIJX.js";
21
+ } from "../../chunk-VPISAMXU.js";
22
22
  import {
23
23
  JsonStdoutSink,
24
24
  createNoOpLogger,
@@ -14,12 +14,12 @@ import {
14
14
  scanServerRoutes,
15
15
  scanWebSocketRoutes,
16
16
  writeManifest
17
- } from "../../chunk-IHJZPQEF.js";
17
+ } from "../../chunk-4HAU7AJM.js";
18
18
  import "../../chunk-WSJKACWB.js";
19
19
  import {
20
20
  scanMiddlewares
21
21
  } from "../../chunk-ZEGYW52B.js";
22
- import "../../chunk-X2VVCJ4V.js";
22
+ import "../../chunk-65EFIUDD.js";
23
23
  import "../../chunk-DGUM43GV.js";
24
24
  export {
25
25
  ActionScanError,
File without changes
@@ -40,4 +40,4 @@ function serverRoutesHmrPlugin(opts) {
40
40
  export {
41
41
  serverRoutesHmrPlugin
42
42
  };
43
- //# sourceMappingURL=server-routes-hmr-VZXOP5YT.js.map
43
+ //# sourceMappingURL=server-routes-hmr-4W5L2MKN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin/server-routes-hmr.ts"],"sourcesContent":["/**\n * G6 T1.2 — Vite plugin: watch `server/routes/**` and invalidate SSR module\n * cache on add/change/unlink with a 50 ms debounce window.\n *\n * Plan: .claude/knowledge-base/plans/g6-router-convention-plan.md v1.1\n *\n * Pattern reference: SvelteKit `exports/vite/dev/index.js:335-398`.\n *\n * Why this exists: in dev, `scanServerRoutes` runs per-request (fresh disk\n * read), so adding/removing routes already takes effect on next request.\n * But the SSR dynamic-import cache holds stale code for EDITED routes — Vite\n * needs an explicit `invalidateModule` call to bust it. We also send a\n * `full-reload` so any browser code that imported a route module\n * (rare, but the typed client G1 does this for ts-only type resolution)\n * picks up the change.\n *\n * EC-6: 50 ms debounce collapses bursty file events (e.g., codemod-driven\n * 21-rename storm in T2.1) into a single invalidation cycle — without it,\n * 21 invalidations + 21 full-reloads in 5 s would hang the dev server.\n */\nimport { sep } from 'node:path'\n\nimport type { Plugin, ViteDevServer } from 'vite'\n\ninterface ServerRoutesHmrPluginOptions {\n /** Absolute path of the consumer's `server/` directory. */\n serverDir: string\n /** Debounce window in milliseconds (default 50 ms per EC-6). */\n debounceMs?: number\n}\n\ninterface ModuleGraphLike {\n getModuleById: (id: string) => unknown\n invalidateModule: (mod: unknown) => void\n idToModuleMap: Map<string, { id: string }>\n}\n\ninterface ViteDevServerLike {\n watcher: { on: (event: string, listener: (path: string) => void) => void }\n moduleGraph: ModuleGraphLike\n ws: { send: (payload: { type: string }) => void }\n}\n\nexport function serverRoutesHmrPlugin(opts: ServerRoutesHmrPluginOptions): Plugin {\n const routesDir = `${opts.serverDir}${sep}routes${sep}`\n // Cross-platform: on Windows the watcher MAY emit forward slashes even on NTFS.\n const routesDirPosix = routesDir.replace(/\\\\/g, '/')\n const debounceMs = opts.debounceMs ?? 50\n\n const isUnderRoutes = (filePath: string): boolean => {\n const normalized = filePath.replace(/\\\\/g, '/')\n return normalized.startsWith(routesDirPosix)\n }\n\n return {\n name: 'theokit:server-routes-hmr',\n\n configureServer(server: ViteDevServer) {\n const srv = server as unknown as ViteDevServerLike\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const fireInvalidation = (): void => {\n timer = null\n for (const mod of srv.moduleGraph.idToModuleMap.values()) {\n const normalizedId = mod.id.replace(/\\\\/g, '/')\n if (normalizedId.startsWith(routesDirPosix)) {\n srv.moduleGraph.invalidateModule(mod)\n }\n }\n srv.ws.send({ type: 'full-reload' })\n }\n\n const scheduleInvalidation = (filePath: string): void => {\n if (!isUnderRoutes(filePath)) return\n if (timer !== null) clearTimeout(timer)\n timer = setTimeout(fireInvalidation, debounceMs)\n }\n\n srv.watcher.on('add', scheduleInvalidation)\n srv.watcher.on('change', scheduleInvalidation)\n srv.watcher.on('unlink', scheduleInvalidation)\n },\n }\n}\n"],"mappings":";;;;AAoBA,SAAS,WAAW;AAuBb,SAAS,sBAAsB,MAA4C;AAChF,QAAM,YAAY,GAAG,KAAK,SAAS,GAAG,GAAG,SAAS,GAAG;AAErD,QAAM,iBAAiB,UAAU,QAAQ,OAAO,GAAG;AACnD,QAAM,aAAa,KAAK,cAAc;AAEtC,QAAM,gBAAgB,CAAC,aAA8B;AACnD,UAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,WAAO,WAAW,WAAW,cAAc;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,gBAAgB,QAAuB;AACrC,YAAM,MAAM;AACZ,UAAI,QAA8C;AAElD,YAAM,mBAAmB,MAAY;AACnC,gBAAQ;AACR,mBAAW,OAAO,IAAI,YAAY,cAAc,OAAO,GAAG;AACxD,gBAAM,eAAe,IAAI,GAAG,QAAQ,OAAO,GAAG;AAC9C,cAAI,aAAa,WAAW,cAAc,GAAG;AAC3C,gBAAI,YAAY,iBAAiB,GAAG;AAAA,UACtC;AAAA,QACF;AACA,YAAI,GAAG,KAAK,EAAE,MAAM,cAAc,CAAC;AAAA,MACrC;AAEA,YAAM,uBAAuB,CAAC,aAA2B;AACvD,YAAI,CAAC,cAAc,QAAQ,EAAG;AAC9B,YAAI,UAAU,KAAM,cAAa,KAAK;AACtC,gBAAQ,WAAW,kBAAkB,UAAU;AAAA,MACjD;AAEA,UAAI,QAAQ,GAAG,OAAO,oBAAoB;AAC1C,UAAI,QAAQ,GAAG,UAAU,oBAAoB;AAC7C,UAAI,QAAQ,GAAG,UAAU,oBAAoB;AAAA,IAC/C;AAAA,EACF;AACF;","names":[]}
@@ -39,4 +39,4 @@ function serverRoutesHmrPlugin(opts) {
39
39
  export {
40
40
  serverRoutesHmrPlugin
41
41
  };
42
- //# sourceMappingURL=server-routes-hmr-PBHSKCQJ.js.map
42
+ //# sourceMappingURL=server-routes-hmr-RI7SYNT2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin/server-routes-hmr.ts"],"sourcesContent":["/**\n * G6 T1.2 — Vite plugin: watch `server/routes/**` and invalidate SSR module\n * cache on add/change/unlink with a 50 ms debounce window.\n *\n * Plan: .claude/knowledge-base/plans/g6-router-convention-plan.md v1.1\n *\n * Pattern reference: SvelteKit `exports/vite/dev/index.js:335-398`.\n *\n * Why this exists: in dev, `scanServerRoutes` runs per-request (fresh disk\n * read), so adding/removing routes already takes effect on next request.\n * But the SSR dynamic-import cache holds stale code for EDITED routes — Vite\n * needs an explicit `invalidateModule` call to bust it. We also send a\n * `full-reload` so any browser code that imported a route module\n * (rare, but the typed client G1 does this for ts-only type resolution)\n * picks up the change.\n *\n * EC-6: 50 ms debounce collapses bursty file events (e.g., codemod-driven\n * 21-rename storm in T2.1) into a single invalidation cycle — without it,\n * 21 invalidations + 21 full-reloads in 5 s would hang the dev server.\n */\nimport { sep } from 'node:path'\n\nimport type { Plugin, ViteDevServer } from 'vite'\n\ninterface ServerRoutesHmrPluginOptions {\n /** Absolute path of the consumer's `server/` directory. */\n serverDir: string\n /** Debounce window in milliseconds (default 50 ms per EC-6). */\n debounceMs?: number\n}\n\ninterface ModuleGraphLike {\n getModuleById: (id: string) => unknown\n invalidateModule: (mod: unknown) => void\n idToModuleMap: Map<string, { id: string }>\n}\n\ninterface ViteDevServerLike {\n watcher: { on: (event: string, listener: (path: string) => void) => void }\n moduleGraph: ModuleGraphLike\n ws: { send: (payload: { type: string }) => void }\n}\n\nexport function serverRoutesHmrPlugin(opts: ServerRoutesHmrPluginOptions): Plugin {\n const routesDir = `${opts.serverDir}${sep}routes${sep}`\n // Cross-platform: on Windows the watcher MAY emit forward slashes even on NTFS.\n const routesDirPosix = routesDir.replace(/\\\\/g, '/')\n const debounceMs = opts.debounceMs ?? 50\n\n const isUnderRoutes = (filePath: string): boolean => {\n const normalized = filePath.replace(/\\\\/g, '/')\n return normalized.startsWith(routesDirPosix)\n }\n\n return {\n name: 'theokit:server-routes-hmr',\n\n configureServer(server: ViteDevServer) {\n const srv = server as unknown as ViteDevServerLike\n let timer: ReturnType<typeof setTimeout> | null = null\n\n const fireInvalidation = (): void => {\n timer = null\n for (const mod of srv.moduleGraph.idToModuleMap.values()) {\n const normalizedId = mod.id.replace(/\\\\/g, '/')\n if (normalizedId.startsWith(routesDirPosix)) {\n srv.moduleGraph.invalidateModule(mod)\n }\n }\n srv.ws.send({ type: 'full-reload' })\n }\n\n const scheduleInvalidation = (filePath: string): void => {\n if (!isUnderRoutes(filePath)) return\n if (timer !== null) clearTimeout(timer)\n timer = setTimeout(fireInvalidation, debounceMs)\n }\n\n srv.watcher.on('add', scheduleInvalidation)\n srv.watcher.on('change', scheduleInvalidation)\n srv.watcher.on('unlink', scheduleInvalidation)\n },\n }\n}\n"],"mappings":";;;AAoBA,SAAS,WAAW;AAuBb,SAAS,sBAAsB,MAA4C;AAChF,QAAM,YAAY,GAAG,KAAK,SAAS,GAAG,GAAG,SAAS,GAAG;AAErD,QAAM,iBAAiB,UAAU,QAAQ,OAAO,GAAG;AACnD,QAAM,aAAa,KAAK,cAAc;AAEtC,QAAM,gBAAgB,CAAC,aAA8B;AACnD,UAAM,aAAa,SAAS,QAAQ,OAAO,GAAG;AAC9C,WAAO,WAAW,WAAW,cAAc;AAAA,EAC7C;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IAEN,gBAAgB,QAAuB;AACrC,YAAM,MAAM;AACZ,UAAI,QAA8C;AAElD,YAAM,mBAAmB,MAAY;AACnC,gBAAQ;AACR,mBAAW,OAAO,IAAI,YAAY,cAAc,OAAO,GAAG;AACxD,gBAAM,eAAe,IAAI,GAAG,QAAQ,OAAO,GAAG;AAC9C,cAAI,aAAa,WAAW,cAAc,GAAG;AAC3C,gBAAI,YAAY,iBAAiB,GAAG;AAAA,UACtC;AAAA,QACF;AACA,YAAI,GAAG,KAAK,EAAE,MAAM,cAAc,CAAC;AAAA,MACrC;AAEA,YAAM,uBAAuB,CAAC,aAA2B;AACvD,YAAI,CAAC,cAAc,QAAQ,EAAG;AAC9B,YAAI,UAAU,KAAM,cAAa,KAAK;AACtC,gBAAQ,WAAW,kBAAkB,UAAU;AAAA,MACjD;AAEA,UAAI,QAAQ,GAAG,OAAO,oBAAoB;AAC1C,UAAI,QAAQ,GAAG,UAAU,oBAAoB;AAC7C,UAAI,QAAQ,GAAG,UAAU,oBAAoB;AAAA,IAC/C;AAAA,EACF;AACF;","names":[]}
@@ -138,4 +138,4 @@ export {
138
138
  servicesJsonMigrateCommand,
139
139
  slugify
140
140
  };
141
- //# sourceMappingURL=services-json-Y3XODNB5.js.map
141
+ //# sourceMappingURL=services-json-7ZXJ4CIS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/commands/migrate/services-json.ts"],"sourcesContent":["/**\n * Plan v1.2 T2.3 + EC-2 — `theokit migrate services-json-v1-to-v2`.\n *\n * Idempotent codemod that injects a top-level `name` field into\n * `theo.config.ts` (and refreshes `.theokit/services.json` if a build artifact\n * exists). When the resolved `name` would be `services-bundle`, the codemod\n * emits an actionable warning so the operator can decide between:\n * a) keeping `services-bundle` (zero-downtime — preserves the Gitea repo\n * lineage shipped by Plan B v3.1); or\n * b) renaming to a new project — requires ArgoCD App rewire downtime.\n *\n * Inputs (in order of precedence):\n * 1) explicit `--name <slug>` CLI argument\n * 2) `package.json` `name` field (slugified to DNS-1123)\n * 3) directory basename\n * 4) `services-bundle` fallback with a warning\n */\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs'\nimport { basename, join, resolve } from 'node:path'\n\ninterface ServicesJsonMigrateOptions {\n /** Override theo.config.ts path. Defaults to `<cwd>/theo.config.ts`. */\n configPath?: string\n /** Override package.json path. Defaults to `<cwd>/package.json`. */\n pkgPath?: string\n /** Explicit project name. When set, bypasses package.json / dir-basename. */\n name?: string\n /** When true, prints the plan but performs no writes. */\n dryRun?: boolean\n /** When true, suppresses stdout (used in tests). */\n silent?: boolean\n /** When set, treats this as the working directory (defaults to process.cwd). */\n cwd?: string\n}\n\ninterface ServicesJsonMigratePlan {\n /** The DNS-1123 project name that will land in theo.config.ts. */\n projectName: string\n /** Reason describing where the name came from. */\n source: 'flag' | 'package-json' | 'directory' | 'fallback'\n /** Whether `theo.config.ts` already declared `name`. */\n alreadyMigrated: boolean\n /** Warning string when projectName=services-bundle. Empty otherwise. */\n warning: string\n}\n\n// Canonical DNS-1123 anchor. Equivalent to ^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$\n// but split into explicit single-char anchors so neither security/detect-\n// unsafe-regex nor sonarjs/slow-regex flag it (linear scan, no backtracking\n// hot paths over arbitrary input).\nfunction isDns1123(s: string): boolean {\n if (s.length === 0 || s.length > 63) return false\n for (let i = 0; i < s.length; i += 1) {\n const c = s.charCodeAt(i)\n const isLower = c >= 0x61 && c <= 0x7a\n const isDigit = c >= 0x30 && c <= 0x39\n const isHyphen = c === 0x2d\n if (!(isLower || isDigit || isHyphen)) return false\n if (i === 0 && isHyphen) return false\n if (i === s.length - 1 && isHyphen) return false\n }\n return true\n}\n\n/**\n * Best-effort slugifier: lowercases, replaces underscores with hyphens,\n * drops invalid characters, collapses repeated hyphens, trims leading /\n * trailing hyphens. Returns empty string when nothing survives.\n */\nexport function slugify(input: string): string {\n const lowered = input.toLowerCase()\n let result = ''\n let lastWasHyphen = false\n for (let i = 0; i < lowered.length; i += 1) {\n const ch = lowered.charAt(i)\n const code = lowered.charCodeAt(i)\n const isLower = code >= 0x61 && code <= 0x7a\n const isDigit = code >= 0x30 && code <= 0x39\n if (isLower || isDigit) {\n result += ch\n lastWasHyphen = false\n continue\n }\n if ((ch === '-' || ch === '_') && !lastWasHyphen && result.length > 0) {\n result += '-'\n lastWasHyphen = true\n }\n }\n while (result.endsWith('-')) result = result.slice(0, -1)\n return result.slice(0, 63)\n}\n\n/** Returns `true` when `theo.config.ts` source already declares `name: …`. */\nexport function configDeclaresName(source: string): boolean {\n // Linear scan instead of `[\\s\\S]*?` lookahead so sonarjs/slow-regex\n // stays clean (no super-linear backtracking). We anchor on `defineConfig(`\n // then walk forward looking for `name:` inside the literal block.\n const start = source.indexOf('defineConfig(')\n if (start < 0) return false\n return /\\bname\\s*:\\s*['\"]/u.test(source.slice(start))\n}\n\n/**\n * Inject `name: <project>,` into the first `defineConfig({ ... })` call.\n * Idempotent: when the config already declares `name`, returns the source\n * untouched.\n */\nexport function injectName(source: string, projectName: string): string {\n if (configDeclaresName(source)) return source\n return source.replace(/(defineConfig\\(\\s*\\{)([\\s\\S])/u, (_match, head: string, next: string) => {\n // Preserve existing whitespace style by sniffing the next character.\n const nl = next === '\\n' || next === '\\r' ? next : '\\n'\n return `${head}\\n name: '${projectName}',${nl === '\\n' ? '' : nl}`\n })\n}\n\ninterface CandidateResolution {\n projectName: string\n source: ServicesJsonMigratePlan['source']\n}\n\nfunction fromPackageJson(pkgPath: string): CandidateResolution | null {\n if (!existsSync(pkgPath)) return null\n try {\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8')) as { name?: string }\n if (typeof pkg.name !== 'string' || pkg.name.length === 0) return null\n const candidate = slugify(pkg.name)\n return isDns1123(candidate) ? { projectName: candidate, source: 'package-json' } : null\n } catch {\n return null\n }\n}\n\nfunction fromDirectoryBasename(cwd: string): CandidateResolution | null {\n const candidate = slugify(basename(resolve(cwd)))\n return isDns1123(candidate) ? { projectName: candidate, source: 'directory' } : null\n}\n\nfunction resolveProjectName(\n opts: ServicesJsonMigrateOptions,\n cwd: string,\n pkgPath: string,\n): CandidateResolution {\n if (opts.name !== undefined && opts.name.length > 0) {\n return { projectName: opts.name, source: 'flag' }\n }\n return (\n fromPackageJson(pkgPath) ??\n fromDirectoryBasename(cwd) ?? {\n projectName: 'services-bundle',\n source: 'fallback',\n }\n )\n}\n\nexport function planServicesJsonMigration(\n opts: ServicesJsonMigrateOptions,\n): ServicesJsonMigratePlan {\n const cwd = opts.cwd ?? process.cwd()\n const configPath = opts.configPath ?? join(cwd, 'theo.config.ts')\n const pkgPath = opts.pkgPath ?? join(cwd, 'package.json')\n\n const configSource = existsSync(configPath) ? readFileSync(configPath, 'utf-8') : ''\n const alreadyMigrated = configSource.length > 0 ? configDeclaresName(configSource) : false\n\n const resolution = resolveProjectName(opts, cwd, pkgPath)\n const warning =\n resolution.source === 'fallback'\n ? 'Using fallback project name `services-bundle`. This preserves the Gitea ' +\n 'repo lineage shipped by Plan B v3.1 (zero downtime). To adopt a new project ' +\n 'name, re-run with `--name <slug>` and coordinate the ArgoCD App rewire.'\n : ''\n\n if (!isDns1123(resolution.projectName)) {\n throw new Error(\n `services-json migrate: resolved project name \"${resolution.projectName}\" is not DNS-1123 ` +\n '(1-63 chars, lowercase alphanumeric+hyphens, no leading/trailing hyphen). Re-run with --name <slug>.',\n )\n }\n\n return {\n projectName: resolution.projectName,\n source: resolution.source,\n alreadyMigrated,\n warning,\n }\n}\n\n// Returns void; not async — kept Promise-bearing via the CLI dispatcher's\n// `await` site by wrapping into Promise.resolve(...) on the call boundary.\nexport function servicesJsonMigrateCommand(opts: ServicesJsonMigrateOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd()\n const configPath = opts.configPath ?? join(cwd, 'theo.config.ts')\n const log = (m: string): void => {\n if (opts.silent === true) return\n process.stdout.write(`${m}\\n`)\n }\n\n if (!existsSync(configPath)) {\n return Promise.reject(\n new Error(`services-json migrate: ${configPath} not found. Run from a TheoKit project root.`),\n )\n }\n\n const plan = planServicesJsonMigration(opts)\n log(` • Resolved project name: '${plan.projectName}' (source: ${plan.source})`)\n if (plan.warning.length > 0) log(` ⚠ ${plan.warning}`)\n\n if (plan.alreadyMigrated) {\n log(' ✓ theo.config.ts already declares `name` — nothing to do (idempotent).')\n return Promise.resolve()\n }\n\n if (opts.dryRun === true) {\n log(' • Dry-run: would inject `name` into theo.config.ts (no write).')\n return Promise.resolve()\n }\n\n const before = readFileSync(configPath, 'utf-8')\n const after = injectName(before, plan.projectName)\n if (after === before) {\n log(\" ⚠ Could not locate `defineConfig({ ... })` block. Add `name: '<slug>',` manually.\")\n return Promise.resolve()\n }\n writeFileSync(configPath, after, 'utf-8')\n log(` ✓ Injected name='${plan.projectName}' into theo.config.ts`)\n log(' • Next: re-run `theokit build --target theo-cloud` to emit services.json v2.')\n return Promise.resolve()\n}\n"],"mappings":"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","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  generateTypedClient
3
- } from "./chunk-D7ZH7DTG.js";
3
+ } from "./chunk-4B2ZMX45.js";
4
4
  import "./chunk-DGUM43GV.js";
5
5
 
6
6
  // src/vite-plugin/services-typed-client.ts
@@ -43,4 +43,4 @@ function servicesTypedClientPlugin(opts) {
43
43
  export {
44
44
  servicesTypedClientPlugin
45
45
  };
46
- //# sourceMappingURL=services-typed-client-IETY2SAK.js.map
46
+ //# sourceMappingURL=services-typed-client-AU6DKXAO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin/services-typed-client.ts"],"sourcesContent":["/**\n * Vite plugin (T3.1) — generates a typed TS client from each service's\n * OpenAPI URL using `@hey-api/openapi-ts` (soft dep — graceful skip when\n * not installed; warns on failure).\n *\n * Dev-only (`apply: 'serve'`). Fire-and-forget — never blocks dev startup.\n *\n * D3: best-effort, warn-only. Generator failure must NEVER crash dev.\n */\nimport { resolve } from 'node:path'\n\nimport type { Plugin } from 'vite'\n\nimport { generateTypedClient, type ServicesConfig } from '../services/index.js'\n\ninterface ServicesTypedClientPluginOptions {\n cwd: string\n services: ServicesConfig\n}\n\nexport function servicesTypedClientPlugin(opts: ServicesTypedClientPluginOptions): Plugin {\n return {\n name: 'theokit:services-typed-client',\n apply: 'serve', // dev-only; never runs in build\n configureServer() {\n // EC-5: ordering — services-typed-client fires AFTER orchestrateDev's\n // healthcheck-gated readiness (orchestrateDev is awaited synchronously\n // in cli/commands/dev.ts BEFORE createServer, so by the time Vite's\n // configureServer hook fires, services are healthy).\n const outputDir = resolve(opts.cwd, 'clients')\n for (const [name, def] of Object.entries(opts.services)) {\n if (!def.openapi) continue\n const openapi = def.openapi\n void generateTypedClient({\n service: {\n name,\n runtime: def.runtime,\n port: def.port,\n proxy: def.proxy,\n dev: def.dev,\n start: def.start,\n healthcheck: def.healthcheck,\n cors: def.cors,\n passSetCookie: def.passSetCookie,\n openapi,\n ...(def.build !== undefined ? { build: def.build } : {}),\n ...(def.env !== undefined ? { env: def.env } : {}),\n ...(def.dependsOn !== undefined ? { dependsOn: def.dependsOn } : {}),\n },\n outputDir,\n log: (_level, msg) => {\n // Use console.warn unconditionally — eslint disallows console.log\n // in source code; warn is appropriate for \"best-effort with skip\"\n // semantics of this plugin.\n console.warn(`[services-typed-client] ${msg}`)\n },\n })\n }\n },\n }\n}\n"],"mappings":";;;;;;AASA,SAAS,eAAe;AAWjB,SAAS,0BAA0B,MAAgD;AACxF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,IACP,kBAAkB;AAKhB,YAAM,YAAY,QAAQ,KAAK,KAAK,SAAS;AAC7C,iBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACvD,YAAI,CAAC,IAAI,QAAS;AAClB,cAAM,UAAU,IAAI;AACpB,aAAK,oBAAoB;AAAA,UACvB,SAAS;AAAA,YACP;AAAA,YACA,SAAS,IAAI;AAAA,YACb,MAAM,IAAI;AAAA,YACV,OAAO,IAAI;AAAA,YACX,KAAK,IAAI;AAAA,YACT,OAAO,IAAI;AAAA,YACX,aAAa,IAAI;AAAA,YACjB,MAAM,IAAI;AAAA,YACV,eAAe,IAAI;AAAA,YACnB;AAAA,YACA,GAAI,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,YACtD,GAAI,IAAI,QAAQ,SAAY,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,YAChD,GAAI,IAAI,cAAc,SAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;AAAA,UACpE;AAAA,UACA;AAAA,UACA,KAAK,CAAC,QAAQ,QAAQ;AAIpB,oBAAQ,KAAK,2BAA2B,GAAG,EAAE;AAAA,UAC/C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -2,7 +2,7 @@
2
2
  import "tsx/esm";
3
3
  import {
4
4
  generateTypedClient
5
- } from "./chunk-45C3WUQ7.js";
5
+ } from "./chunk-QPVXGC7O.js";
6
6
 
7
7
  // src/vite-plugin/services-typed-client.ts
8
8
  import { resolve } from "path";
@@ -44,4 +44,4 @@ function servicesTypedClientPlugin(opts) {
44
44
  export {
45
45
  servicesTypedClientPlugin
46
46
  };
47
- //# sourceMappingURL=services-typed-client-32KMTTXR.js.map
47
+ //# sourceMappingURL=services-typed-client-EO4RFNTZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/vite-plugin/services-typed-client.ts"],"sourcesContent":["/**\n * Vite plugin (T3.1) — generates a typed TS client from each service's\n * OpenAPI URL using `@hey-api/openapi-ts` (soft dep — graceful skip when\n * not installed; warns on failure).\n *\n * Dev-only (`apply: 'serve'`). Fire-and-forget — never blocks dev startup.\n *\n * D3: best-effort, warn-only. Generator failure must NEVER crash dev.\n */\nimport { resolve } from 'node:path'\n\nimport type { Plugin } from 'vite'\n\nimport { generateTypedClient, type ServicesConfig } from '../services/index.js'\n\ninterface ServicesTypedClientPluginOptions {\n cwd: string\n services: ServicesConfig\n}\n\nexport function servicesTypedClientPlugin(opts: ServicesTypedClientPluginOptions): Plugin {\n return {\n name: 'theokit:services-typed-client',\n apply: 'serve', // dev-only; never runs in build\n configureServer() {\n // EC-5: ordering — services-typed-client fires AFTER orchestrateDev's\n // healthcheck-gated readiness (orchestrateDev is awaited synchronously\n // in cli/commands/dev.ts BEFORE createServer, so by the time Vite's\n // configureServer hook fires, services are healthy).\n const outputDir = resolve(opts.cwd, 'clients')\n for (const [name, def] of Object.entries(opts.services)) {\n if (!def.openapi) continue\n const openapi = def.openapi\n void generateTypedClient({\n service: {\n name,\n runtime: def.runtime,\n port: def.port,\n proxy: def.proxy,\n dev: def.dev,\n start: def.start,\n healthcheck: def.healthcheck,\n cors: def.cors,\n passSetCookie: def.passSetCookie,\n openapi,\n ...(def.build !== undefined ? { build: def.build } : {}),\n ...(def.env !== undefined ? { env: def.env } : {}),\n ...(def.dependsOn !== undefined ? { dependsOn: def.dependsOn } : {}),\n },\n outputDir,\n log: (_level, msg) => {\n // Use console.warn unconditionally — eslint disallows console.log\n // in source code; warn is appropriate for \"best-effort with skip\"\n // semantics of this plugin.\n console.warn(`[services-typed-client] ${msg}`)\n },\n })\n }\n },\n }\n}\n"],"mappings":";;;;;;;AASA,SAAS,eAAe;AAWjB,SAAS,0BAA0B,MAAgD;AACxF,SAAO;AAAA,IACL,MAAM;AAAA,IACN,OAAO;AAAA;AAAA,IACP,kBAAkB;AAKhB,YAAM,YAAY,QAAQ,KAAK,KAAK,SAAS;AAC7C,iBAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,KAAK,QAAQ,GAAG;AACvD,YAAI,CAAC,IAAI,QAAS;AAClB,cAAM,UAAU,IAAI;AACpB,aAAK,oBAAoB;AAAA,UACvB,SAAS;AAAA,YACP;AAAA,YACA,SAAS,IAAI;AAAA,YACb,MAAM,IAAI;AAAA,YACV,OAAO,IAAI;AAAA,YACX,KAAK,IAAI;AAAA,YACT,OAAO,IAAI;AAAA,YACX,aAAa,IAAI;AAAA,YACjB,MAAM,IAAI;AAAA,YACV,eAAe,IAAI;AAAA,YACnB;AAAA,YACA,GAAI,IAAI,UAAU,SAAY,EAAE,OAAO,IAAI,MAAM,IAAI,CAAC;AAAA,YACtD,GAAI,IAAI,QAAQ,SAAY,EAAE,KAAK,IAAI,IAAI,IAAI,CAAC;AAAA,YAChD,GAAI,IAAI,cAAc,SAAY,EAAE,WAAW,IAAI,UAAU,IAAI,CAAC;AAAA,UACpE;AAAA,UACA;AAAA,UACA,KAAK,CAAC,QAAQ,QAAQ;AAIpB,oBAAQ,KAAK,2BAA2B,GAAG,EAAE;AAAA,UAC/C;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
@@ -9,16 +9,16 @@ import {
9
9
  resolveTransformer,
10
10
  serveAgentAuxRoute,
11
11
  writeWebResponseToServerResponse
12
- } from "./chunk-UO7WS32S.js";
12
+ } from "./chunk-OI6DK6ZJ.js";
13
13
  import "./chunk-2CVV6CNN.js";
14
14
  import {
15
15
  loadConfig
16
- } from "./chunk-AFVTEAES.js";
16
+ } from "./chunk-CJNMJUHE.js";
17
17
  import {
18
18
  loadEnv
19
19
  } from "./chunk-GDN3PXFH.js";
20
- import "./chunk-GSO77FSM.js";
21
- import "./chunk-45C3WUQ7.js";
20
+ import "./chunk-6OXCZMW3.js";
21
+ import "./chunk-QPVXGC7O.js";
22
22
  import {
23
23
  buildSecurityHeaders,
24
24
  createPluginRunnerFromConfig,
@@ -33,24 +33,24 @@ import {
33
33
  mountAgent,
34
34
  sendError,
35
35
  warnOnce
36
- } from "./chunk-UNLG36Z5.js";
36
+ } from "./chunk-IE6C4KZX.js";
37
37
  import {
38
38
  getApprovalRegistry,
39
39
  resolveProvider
40
- } from "./chunk-M6NMS5LR.js";
40
+ } from "./chunk-TDNNBLGW.js";
41
41
  import {
42
42
  loadManifest
43
- } from "./chunk-NQRNDPZJ.js";
43
+ } from "./chunk-OXCALO3W.js";
44
44
  import {
45
45
  scanAgents
46
- } from "./chunk-L4GCEMNW.js";
46
+ } from "./chunk-LNVMHQ2Z.js";
47
47
  import {
48
48
  matchRoute,
49
49
  scanServerActions,
50
50
  scanServerRoutes,
51
51
  scanWebSocketRoutes
52
- } from "./chunk-FRUEDJFX.js";
53
- import "./chunk-P37RZRFV.js";
52
+ } from "./chunk-226KMIGZ.js";
53
+ import "./chunk-A7JBF5FO.js";
54
54
  import "./chunk-HGZL5EOI.js";
55
55
 
56
56
  // src/cli/commands/start/index.ts
@@ -190,7 +190,7 @@ async function configureStorageManagerFromConfig(storageConfig) {
190
190
  if (storageConfig === void 0 || storageConfig === null) return;
191
191
  try {
192
192
  const { getStorageManager } = await import("./storage-manager-ZSQFLEYT.js");
193
- const { storageSchema } = await import("./schema-LYOLNHZ7.js");
193
+ const { storageSchema } = await import("./schema-FBOTN46F.js");
194
194
  const parsed = storageSchema.parse(storageConfig);
195
195
  getStorageManager().configure(parsed);
196
196
  } catch (err) {
@@ -904,4 +904,4 @@ export {
904
904
  resolveSsrEntry,
905
905
  startCommand
906
906
  };
907
- //# sourceMappingURL=start-YLR2SFHU.js.map
907
+ //# sourceMappingURL=start-2U3FUCJX.js.map