@windrun-huaiin/backend-core 15.0.0 → 16.0.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 (340) hide show
  1. package/LICENSE +1 -1
  2. package/dist/app/api/stripe/checkout/route.js +2 -2
  3. package/dist/app/api/stripe/checkout/route.mjs +1 -1
  4. package/dist/app/api/stripe/customer-portal/route.js +2 -2
  5. package/dist/app/api/stripe/customer-portal/route.mjs +1 -1
  6. package/dist/app/api/user/anonymous/init/route.js +6 -6
  7. package/dist/app/api/user/anonymous/init/route.mjs +1 -1
  8. package/dist/app/api/webhook/clerk/user/route.js +4 -4
  9. package/dist/app/api/webhook/clerk/user/route.mjs +1 -1
  10. package/dist/app/api/webhook/stripe/route.js +2 -2
  11. package/dist/app/api/webhook/stripe/route.mjs +1 -1
  12. package/dist/auth/auth-middleware.js +3 -3
  13. package/dist/auth/auth-middleware.mjs +1 -1
  14. package/dist/auth/auth-utils.js +10 -10
  15. package/dist/auth/auth-utils.mjs +1 -1
  16. package/dist/index.d.ts +1 -0
  17. package/dist/index.d.ts.map +1 -1
  18. package/dist/index.js +44 -0
  19. package/dist/index.mjs +8 -1
  20. package/dist/lib/index.js +19 -0
  21. package/dist/lib/index.mjs +1 -1
  22. package/dist/lib/money-price-helper.js +3 -3
  23. package/dist/lib/money-price-helper.mjs +1 -1
  24. package/dist/lib/stripe-config.js +8 -8
  25. package/dist/lib/stripe-config.mjs +1 -1
  26. package/dist/lib/upstash/qstash.d.ts +20 -7
  27. package/dist/lib/upstash/qstash.d.ts.map +1 -1
  28. package/dist/lib/upstash/qstash.js +45 -19
  29. package/dist/lib/upstash/qstash.mjs +35 -9
  30. package/dist/lib/upstash/redis-counter.js +7 -7
  31. package/dist/lib/upstash/redis-counter.mjs +1 -1
  32. package/dist/lib/upstash/redis-favorite.js +9 -9
  33. package/dist/lib/upstash/redis-favorite.mjs +1 -1
  34. package/dist/lib/upstash/redis-like.js +9 -9
  35. package/dist/lib/upstash/redis-like.mjs +1 -1
  36. package/dist/lib/upstash/redis-lock.js +6 -6
  37. package/dist/lib/upstash/redis-lock.mjs +1 -1
  38. package/dist/lib/upstash/redis-structures.d.ts +83 -0
  39. package/dist/lib/upstash/redis-structures.d.ts.map +1 -1
  40. package/dist/lib/upstash/redis-structures.js +245 -25
  41. package/dist/lib/upstash/redis-structures.mjs +203 -2
  42. package/dist/lib/upstash-config.d.ts.map +1 -1
  43. package/dist/lib/upstash-config.js +90 -18
  44. package/dist/lib/upstash-config.mjs +80 -8
  45. package/dist/prisma/prisma-transaction-util.js +2 -2
  46. package/dist/prisma/prisma-transaction-util.mjs +1 -1
  47. package/dist/services/aggregate/anonymous.aggregate.service.js +6 -6
  48. package/dist/services/aggregate/anonymous.aggregate.service.mjs +1 -1
  49. package/dist/services/aggregate/billing.aggregate.service.js +21 -21
  50. package/dist/services/aggregate/billing.aggregate.service.mjs +1 -1
  51. package/dist/services/aggregate/user.aggregate.service.js +10 -10
  52. package/dist/services/aggregate/user.aggregate.service.mjs +1 -1
  53. package/dist/services/ai/abort.d.ts +2 -0
  54. package/dist/services/ai/abort.d.ts.map +1 -0
  55. package/dist/services/ai/abort.js +24 -0
  56. package/dist/services/ai/abort.mjs +22 -0
  57. package/dist/services/ai/env.d.ts +21 -0
  58. package/dist/services/ai/env.d.ts.map +1 -0
  59. package/dist/services/ai/env.js +85 -0
  60. package/dist/services/ai/env.mjs +80 -0
  61. package/dist/services/ai/error.d.ts +3 -0
  62. package/dist/services/ai/error.d.ts.map +1 -0
  63. package/dist/services/ai/error.js +54 -0
  64. package/dist/services/ai/error.mjs +52 -0
  65. package/dist/services/ai/index.d.ts +9 -0
  66. package/dist/services/ai/index.d.ts.map +1 -0
  67. package/dist/services/ai/index.js +30 -0
  68. package/dist/services/ai/index.mjs +7 -0
  69. package/dist/services/ai/message-builder.d.ts +4 -0
  70. package/dist/services/ai/message-builder.d.ts.map +1 -0
  71. package/dist/services/ai/message-builder.js +15 -0
  72. package/dist/services/ai/message-builder.mjs +13 -0
  73. package/dist/services/ai/mock.d.ts +30 -0
  74. package/dist/services/ai/mock.d.ts.map +1 -0
  75. package/dist/services/ai/mock.js +314 -0
  76. package/dist/services/ai/mock.mjs +308 -0
  77. package/dist/services/ai/openrouter-client.d.ts +12 -0
  78. package/dist/services/ai/openrouter-client.d.ts.map +1 -0
  79. package/dist/services/ai/openrouter-client.js +81 -0
  80. package/dist/services/ai/openrouter-client.mjs +78 -0
  81. package/dist/services/ai/route.d.ts +6 -0
  82. package/dist/services/ai/route.d.ts.map +1 -0
  83. package/dist/services/ai/route.js +178 -0
  84. package/dist/services/ai/route.mjs +173 -0
  85. package/dist/services/ai/types.d.ts +98 -0
  86. package/dist/services/ai/types.d.ts.map +1 -0
  87. package/dist/services/context/user-context-service.js +3 -3
  88. package/dist/services/context/user-context-service.mjs +1 -1
  89. package/dist/services/database/apilog.service.js +14 -14
  90. package/dist/services/database/apilog.service.mjs +1 -1
  91. package/dist/services/database/credit.service.js +20 -20
  92. package/dist/services/database/credit.service.mjs +1 -1
  93. package/dist/services/database/creditAuditLog.service.js +13 -13
  94. package/dist/services/database/creditAuditLog.service.mjs +1 -1
  95. package/dist/services/database/subscription.service.js +16 -16
  96. package/dist/services/database/subscription.service.mjs +1 -1
  97. package/dist/services/database/transaction.service.js +18 -18
  98. package/dist/services/database/transaction.service.mjs +1 -1
  99. package/dist/services/database/user.service.js +14 -14
  100. package/dist/services/database/user.service.mjs +1 -1
  101. package/dist/services/database/userBackup.service.js +15 -15
  102. package/dist/services/database/userBackup.service.mjs +1 -1
  103. package/dist/services/stripe/webhook-handler.js +13 -13
  104. package/dist/services/stripe/webhook-handler.mjs +3 -3
  105. package/package.json +14 -4
  106. package/src/index.ts +1 -0
  107. package/src/lib/upstash/qstash.ts +55 -15
  108. package/src/lib/upstash/redis-structures.ts +248 -0
  109. package/src/lib/upstash-config.ts +106 -4
  110. package/src/services/ai/abort.ts +26 -0
  111. package/src/services/ai/env.ts +120 -0
  112. package/src/services/ai/error.ts +64 -0
  113. package/src/services/ai/index.ts +8 -0
  114. package/src/services/ai/message-builder.ts +17 -0
  115. package/src/services/ai/mock.ts +378 -0
  116. package/src/services/ai/openrouter-client.ts +94 -0
  117. package/src/services/ai/route.ts +218 -0
  118. package/src/services/ai/types.ts +131 -0
  119. package/dist/_virtual/_commonjs-dynamic-modules.js +0 -7
  120. package/dist/_virtual/_commonjs-dynamic-modules.mjs +0 -5
  121. package/dist/_virtual/_commonjsHelpers.js +0 -10
  122. package/dist/_virtual/_commonjsHelpers.mjs +0 -7
  123. package/dist/_virtual/aes.js +0 -5
  124. package/dist/_virtual/aes.mjs +0 -3
  125. package/dist/_virtual/blowfish.js +0 -5
  126. package/dist/_virtual/blowfish.mjs +0 -3
  127. package/dist/_virtual/cipher-core.js +0 -5
  128. package/dist/_virtual/cipher-core.mjs +0 -3
  129. package/dist/_virtual/core.js +0 -5
  130. package/dist/_virtual/core.mjs +0 -3
  131. package/dist/_virtual/enc-base64.js +0 -5
  132. package/dist/_virtual/enc-base64.mjs +0 -3
  133. package/dist/_virtual/enc-base64url.js +0 -5
  134. package/dist/_virtual/enc-base64url.mjs +0 -3
  135. package/dist/_virtual/enc-utf16.js +0 -5
  136. package/dist/_virtual/enc-utf16.mjs +0 -3
  137. package/dist/_virtual/evpkdf.js +0 -5
  138. package/dist/_virtual/evpkdf.mjs +0 -3
  139. package/dist/_virtual/format-hex.js +0 -5
  140. package/dist/_virtual/format-hex.mjs +0 -3
  141. package/dist/_virtual/hmac.js +0 -5
  142. package/dist/_virtual/hmac.mjs +0 -3
  143. package/dist/_virtual/index.js +0 -11
  144. package/dist/_virtual/index.mjs +0 -7
  145. package/dist/_virtual/index2.js +0 -5
  146. package/dist/_virtual/index2.mjs +0 -3
  147. package/dist/_virtual/lib-typedarrays.js +0 -5
  148. package/dist/_virtual/lib-typedarrays.mjs +0 -3
  149. package/dist/_virtual/md5.js +0 -5
  150. package/dist/_virtual/md5.mjs +0 -3
  151. package/dist/_virtual/mode-cfb.js +0 -5
  152. package/dist/_virtual/mode-cfb.mjs +0 -3
  153. package/dist/_virtual/mode-ctr-gladman.js +0 -5
  154. package/dist/_virtual/mode-ctr-gladman.mjs +0 -3
  155. package/dist/_virtual/mode-ctr.js +0 -5
  156. package/dist/_virtual/mode-ctr.mjs +0 -3
  157. package/dist/_virtual/mode-ecb.js +0 -5
  158. package/dist/_virtual/mode-ecb.mjs +0 -3
  159. package/dist/_virtual/mode-ofb.js +0 -5
  160. package/dist/_virtual/mode-ofb.mjs +0 -3
  161. package/dist/_virtual/pad-ansix923.js +0 -5
  162. package/dist/_virtual/pad-ansix923.mjs +0 -3
  163. package/dist/_virtual/pad-iso10126.js +0 -5
  164. package/dist/_virtual/pad-iso10126.mjs +0 -3
  165. package/dist/_virtual/pad-iso97971.js +0 -5
  166. package/dist/_virtual/pad-iso97971.mjs +0 -3
  167. package/dist/_virtual/pad-nopadding.js +0 -5
  168. package/dist/_virtual/pad-nopadding.mjs +0 -3
  169. package/dist/_virtual/pad-zeropadding.js +0 -5
  170. package/dist/_virtual/pad-zeropadding.mjs +0 -3
  171. package/dist/_virtual/pbkdf2.js +0 -5
  172. package/dist/_virtual/pbkdf2.mjs +0 -3
  173. package/dist/_virtual/rabbit-legacy.js +0 -5
  174. package/dist/_virtual/rabbit-legacy.mjs +0 -3
  175. package/dist/_virtual/rabbit.js +0 -5
  176. package/dist/_virtual/rabbit.mjs +0 -3
  177. package/dist/_virtual/rc4.js +0 -5
  178. package/dist/_virtual/rc4.mjs +0 -3
  179. package/dist/_virtual/ripemd160.js +0 -5
  180. package/dist/_virtual/ripemd160.mjs +0 -3
  181. package/dist/_virtual/sha1.js +0 -5
  182. package/dist/_virtual/sha1.mjs +0 -3
  183. package/dist/_virtual/sha224.js +0 -5
  184. package/dist/_virtual/sha224.mjs +0 -3
  185. package/dist/_virtual/sha256.js +0 -5
  186. package/dist/_virtual/sha256.mjs +0 -3
  187. package/dist/_virtual/sha3.js +0 -5
  188. package/dist/_virtual/sha3.mjs +0 -3
  189. package/dist/_virtual/sha384.js +0 -5
  190. package/dist/_virtual/sha384.mjs +0 -3
  191. package/dist/_virtual/sha512.js +0 -5
  192. package/dist/_virtual/sha512.mjs +0 -3
  193. package/dist/_virtual/tripledes.js +0 -5
  194. package/dist/_virtual/tripledes.mjs +0 -3
  195. package/dist/_virtual/x64-core.js +0 -5
  196. package/dist/_virtual/x64-core.mjs +0 -3
  197. package/dist/node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.46.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js +0 -48
  198. package/dist/node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.46.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.mjs +0 -45
  199. package/dist/node_modules/.pnpm/@upstash_qstash@2.10.1/node_modules/@upstash/qstash/chunk-35B33QW3.js +0 -1848
  200. package/dist/node_modules/.pnpm/@upstash_qstash@2.10.1/node_modules/@upstash/qstash/chunk-35B33QW3.mjs +0 -1830
  201. package/dist/node_modules/.pnpm/@upstash_redis@1.37.0/node_modules/@upstash/redis/chunk-IH7W44G6.js +0 -5308
  202. package/dist/node_modules/.pnpm/@upstash_redis@1.37.0/node_modules/@upstash/redis/chunk-IH7W44G6.mjs +0 -5302
  203. package/dist/node_modules/.pnpm/@upstash_redis@1.37.0/node_modules/@upstash/redis/nodejs.js +0 -116
  204. package/dist/node_modules/.pnpm/@upstash_redis@1.37.0/node_modules/@upstash/redis/nodejs.mjs +0 -113
  205. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.js +0 -248
  206. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/aes.mjs +0 -246
  207. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.js +0 -485
  208. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/blowfish.mjs +0 -483
  209. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.js +0 -906
  210. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/cipher-core.mjs +0 -904
  211. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.js +0 -818
  212. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/core.mjs +0 -816
  213. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.js +0 -146
  214. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64.mjs +0 -144
  215. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.js +0 -158
  216. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-base64url.mjs +0 -156
  217. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.js +0 -159
  218. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/enc-utf16.mjs +0 -157
  219. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.js +0 -146
  220. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/evpkdf.mjs +0 -144
  221. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.js +0 -77
  222. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/format-hex.mjs +0 -75
  223. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.js +0 -153
  224. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/hmac.mjs +0 -151
  225. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.js +0 -62
  226. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/index.mjs +0 -60
  227. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.js +0 -86
  228. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/lib-typedarrays.mjs +0 -84
  229. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.js +0 -278
  230. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/md5.mjs +0 -276
  231. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.js +0 -91
  232. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-cfb.mjs +0 -89
  233. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.js +0 -127
  234. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr-gladman.mjs +0 -125
  235. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.js +0 -69
  236. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ctr.mjs +0 -67
  237. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.js +0 -51
  238. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ecb.mjs +0 -49
  239. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.js +0 -65
  240. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/mode-ofb.mjs +0 -63
  241. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.js +0 -60
  242. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-ansix923.mjs +0 -58
  243. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.js +0 -55
  244. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso10126.mjs +0 -53
  245. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.js +0 -51
  246. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-iso97971.mjs +0 -49
  247. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.js +0 -41
  248. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-nopadding.mjs +0 -39
  249. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.js +0 -58
  250. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pad-zeropadding.mjs +0 -56
  251. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.js +0 -157
  252. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/pbkdf2.mjs +0 -155
  253. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.js +0 -204
  254. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit-legacy.mjs +0 -202
  255. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.js +0 -206
  256. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rabbit.mjs +0 -204
  257. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.js +0 -153
  258. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/rc4.mjs +0 -151
  259. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.js +0 -277
  260. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/ripemd160.mjs +0 -275
  261. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.js +0 -160
  262. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha1.mjs +0 -158
  263. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.js +0 -91
  264. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha224.mjs +0 -89
  265. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.js +0 -209
  266. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha256.mjs +0 -207
  267. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.js +0 -337
  268. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha3.mjs +0 -335
  269. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.js +0 -95
  270. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha384.mjs +0 -93
  271. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.js +0 -337
  272. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/sha512.mjs +0 -335
  273. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.js +0 -793
  274. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/tripledes.mjs +0 -791
  275. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.js +0 -314
  276. package/dist/node_modules/.pnpm/crypto-js@4.2.0/node_modules/crypto-js/x64-core.mjs +0 -312
  277. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/compact/verify.js +0 -26
  278. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/compact/verify.mjs +0 -24
  279. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/flattened/verify.js +0 -127
  280. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jws/flattened/verify.mjs +0 -125
  281. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jwt/verify.js +0 -20
  282. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/jwt/verify.mjs +0 -18
  283. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/key/import.js +0 -31
  284. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/key/import.mjs +0 -29
  285. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/buffer_utils.js +0 -18
  286. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/buffer_utils.mjs +0 -14
  287. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/check_key_type.js +0 -82
  288. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/check_key_type.mjs +0 -80
  289. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/crypto_key.js +0 -103
  290. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/crypto_key.mjs +0 -101
  291. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/epoch.js +0 -7
  292. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/epoch.mjs +0 -3
  293. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/invalid_key_input.js +0 -38
  294. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/invalid_key_input.mjs +0 -33
  295. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_disjoint.js +0 -27
  296. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_disjoint.mjs +0 -23
  297. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_jwk.js +0 -21
  298. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_jwk.mjs +0 -16
  299. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_object.js +0 -22
  300. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/is_object.mjs +0 -18
  301. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/jwt_claims_set.js +0 -111
  302. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/jwt_claims_set.mjs +0 -107
  303. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/secs.js +0 -61
  304. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/secs.mjs +0 -57
  305. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_algorithms.js +0 -16
  306. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_algorithms.mjs +0 -12
  307. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_crit.js +0 -40
  308. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/lib/validate_crit.mjs +0 -36
  309. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/base64url.js +0 -15
  310. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/base64url.mjs +0 -13
  311. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/check_key_length.js +0 -23
  312. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/check_key_length.mjs +0 -19
  313. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/dsa_digest.js +0 -30
  314. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/dsa_digest.mjs +0 -26
  315. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_named_curve.js +0 -60
  316. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_named_curve.mjs +0 -56
  317. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_sign_verify_key.js +0 -35
  318. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/get_sign_verify_key.mjs +0 -31
  319. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/hmac_digest.js +0 -20
  320. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/hmac_digest.mjs +0 -16
  321. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_like.js +0 -15
  322. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_like.mjs +0 -10
  323. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_object.js +0 -28
  324. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/is_key_object.mjs +0 -5
  325. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/jwk_to_key.js +0 -14
  326. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/jwk_to_key.mjs +0 -10
  327. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/node_key.js +0 -115
  328. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/node_key.mjs +0 -111
  329. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/sign.js +0 -42
  330. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/sign.mjs +0 -19
  331. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/verify.js +0 -54
  332. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/verify.mjs +0 -31
  333. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/webcrypto.js +0 -32
  334. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/runtime/webcrypto.mjs +0 -7
  335. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/util/errors.js +0 -69
  336. package/dist/node_modules/.pnpm/jose@5.10.0/node_modules/jose/dist/node/esm/util/errors.mjs +0 -60
  337. package/dist/node_modules/.pnpm/neverthrow@7.2.0/node_modules/neverthrow/dist/index.es.js +0 -422
  338. package/dist/node_modules/.pnpm/neverthrow@7.2.0/node_modules/neverthrow/dist/index.es.mjs +0 -415
  339. package/dist/node_modules/.pnpm/uncrypto@0.1.3/node_modules/uncrypto/dist/crypto.web.js +0 -6
  340. package/dist/node_modules/.pnpm/uncrypto@0.1.3/node_modules/uncrypto/dist/crypto.web.mjs +0 -4
@@ -0,0 +1,81 @@
1
+ 'use strict';
2
+
3
+ var tslib = require('tslib');
4
+ var error = require('./error.js');
5
+
6
+ const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
7
+ function callOpenRouterStream(config, body, signal) {
8
+ return tslib.__awaiter(this, void 0, void 0, function* () {
9
+ var _a, _b;
10
+ const fetchImpl = (_a = config.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
11
+ const response = yield fetchImpl(`${(_b = config.baseUrl) !== null && _b !== void 0 ? _b : OPENROUTER_BASE_URL}/chat/completions`, {
12
+ method: 'POST',
13
+ signal,
14
+ headers: Object.assign(Object.assign({ Authorization: `Bearer ${config.apiKey}`, 'Content-Type': 'application/json' }, (config.referer ? { 'HTTP-Referer': config.referer } : {})), (config.title ? { 'X-Title': config.title } : {})),
15
+ body: JSON.stringify(body),
16
+ });
17
+ if (!response.ok || !response.body) {
18
+ let errorData = null;
19
+ try {
20
+ errorData = yield response.clone().json();
21
+ }
22
+ catch (_c) {
23
+ errorData = { message: response.statusText };
24
+ }
25
+ throw Object.assign({ status: response.status, message: response.statusText }, ((typeof errorData === 'object' && errorData !== null) ? errorData : {}));
26
+ }
27
+ return {
28
+ response,
29
+ status: response.status,
30
+ };
31
+ });
32
+ }
33
+ function guardedOpenRouterStreamStart(response) {
34
+ return tslib.__awaiter(this, void 0, void 0, function* () {
35
+ var _a;
36
+ const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader();
37
+ if (!reader) {
38
+ return {
39
+ ok: false,
40
+ error: error.normalizeAIError(new Error('Empty upstream response body')),
41
+ };
42
+ }
43
+ const firstChunk = yield reader.read();
44
+ if (firstChunk.done || !firstChunk.value) {
45
+ return {
46
+ ok: false,
47
+ error: {
48
+ error: 'AI returned an empty response',
49
+ status: 'failed',
50
+ failureReason: 'empty_response',
51
+ upstreamStatusCode: response.status,
52
+ },
53
+ };
54
+ }
55
+ const stream = new ReadableStream({
56
+ start(controller) {
57
+ controller.enqueue(firstChunk.value);
58
+ },
59
+ pull(controller) {
60
+ return tslib.__awaiter(this, void 0, void 0, function* () {
61
+ const nextChunk = yield reader.read();
62
+ if (nextChunk.done) {
63
+ controller.close();
64
+ return;
65
+ }
66
+ controller.enqueue(nextChunk.value);
67
+ });
68
+ },
69
+ cancel(reason) {
70
+ void reader.cancel(reason);
71
+ },
72
+ });
73
+ return {
74
+ ok: true,
75
+ stream,
76
+ };
77
+ });
78
+ }
79
+
80
+ exports.callOpenRouterStream = callOpenRouterStream;
81
+ exports.guardedOpenRouterStreamStart = guardedOpenRouterStreamStart;
@@ -0,0 +1,78 @@
1
+ import { __awaiter } from 'tslib';
2
+ import { normalizeAIError } from './error.mjs';
3
+
4
+ const OPENROUTER_BASE_URL = 'https://openrouter.ai/api/v1';
5
+ function callOpenRouterStream(config, body, signal) {
6
+ return __awaiter(this, void 0, void 0, function* () {
7
+ var _a, _b;
8
+ const fetchImpl = (_a = config.fetchImpl) !== null && _a !== void 0 ? _a : fetch;
9
+ const response = yield fetchImpl(`${(_b = config.baseUrl) !== null && _b !== void 0 ? _b : OPENROUTER_BASE_URL}/chat/completions`, {
10
+ method: 'POST',
11
+ signal,
12
+ headers: Object.assign(Object.assign({ Authorization: `Bearer ${config.apiKey}`, 'Content-Type': 'application/json' }, (config.referer ? { 'HTTP-Referer': config.referer } : {})), (config.title ? { 'X-Title': config.title } : {})),
13
+ body: JSON.stringify(body),
14
+ });
15
+ if (!response.ok || !response.body) {
16
+ let errorData = null;
17
+ try {
18
+ errorData = yield response.clone().json();
19
+ }
20
+ catch (_c) {
21
+ errorData = { message: response.statusText };
22
+ }
23
+ throw Object.assign({ status: response.status, message: response.statusText }, ((typeof errorData === 'object' && errorData !== null) ? errorData : {}));
24
+ }
25
+ return {
26
+ response,
27
+ status: response.status,
28
+ };
29
+ });
30
+ }
31
+ function guardedOpenRouterStreamStart(response) {
32
+ return __awaiter(this, void 0, void 0, function* () {
33
+ var _a;
34
+ const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader();
35
+ if (!reader) {
36
+ return {
37
+ ok: false,
38
+ error: normalizeAIError(new Error('Empty upstream response body')),
39
+ };
40
+ }
41
+ const firstChunk = yield reader.read();
42
+ if (firstChunk.done || !firstChunk.value) {
43
+ return {
44
+ ok: false,
45
+ error: {
46
+ error: 'AI returned an empty response',
47
+ status: 'failed',
48
+ failureReason: 'empty_response',
49
+ upstreamStatusCode: response.status,
50
+ },
51
+ };
52
+ }
53
+ const stream = new ReadableStream({
54
+ start(controller) {
55
+ controller.enqueue(firstChunk.value);
56
+ },
57
+ pull(controller) {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ const nextChunk = yield reader.read();
60
+ if (nextChunk.done) {
61
+ controller.close();
62
+ return;
63
+ }
64
+ controller.enqueue(nextChunk.value);
65
+ });
66
+ },
67
+ cancel(reason) {
68
+ void reader.cancel(reason);
69
+ },
70
+ });
71
+ return {
72
+ ok: true,
73
+ stream,
74
+ };
75
+ });
76
+ }
77
+
78
+ export { callOpenRouterStream, guardedOpenRouterStreamStart };
@@ -0,0 +1,6 @@
1
+ import type { AIRouteConfig } from './types';
2
+ export declare const runtime = "edge";
3
+ export declare const dynamic = "force-dynamic";
4
+ export declare const revalidate = 0;
5
+ export declare function createOpenRouterRoute(config: AIRouteConfig): (request: Request) => Promise<Response>;
6
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../src/services/ai/route.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAoB,MAAM,SAAS,CAAC;AAE/D,eAAO,MAAM,OAAO,SAAS,CAAC;AAC9B,eAAO,MAAM,OAAO,kBAAkB,CAAC;AACvC,eAAO,MAAM,UAAU,IAAI,CAAC;AA8F5B,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,aAAa,IAG9B,SAAS,OAAO,uBA0G5C"}
@@ -0,0 +1,178 @@
1
+ 'use strict';
2
+
3
+ var tslib = require('tslib');
4
+ var ai = require('@windrun-huaiin/contracts/ai');
5
+ var abort = require('./abort.js');
6
+ var env = require('./env.js');
7
+ var error = require('./error.js');
8
+ var messageBuilder = require('./message-builder.js');
9
+ var openrouterClient = require('./openrouter-client.js');
10
+
11
+ const runtime = 'edge';
12
+ const dynamic = 'force-dynamic';
13
+ const revalidate = 0;
14
+ const streamingHeaders = {
15
+ 'Content-Type': 'text/event-stream; charset=utf-8',
16
+ 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate, no-transform',
17
+ Connection: 'keep-alive',
18
+ Pragma: 'no-cache',
19
+ 'X-Accel-Buffering': 'no',
20
+ };
21
+ function createRequestId() {
22
+ try {
23
+ return crypto.randomUUID();
24
+ }
25
+ catch (_a) {
26
+ return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
27
+ }
28
+ }
29
+ function encodeEvent(event) {
30
+ return `data: ${JSON.stringify(event)}\n\n`;
31
+ }
32
+ function createEventStream(response, messageId) {
33
+ return tslib.__awaiter(this, void 0, void 0, function* () {
34
+ var _a;
35
+ const encoder = new TextEncoder();
36
+ const decoder = new TextDecoder();
37
+ const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader();
38
+ if (!reader) {
39
+ throw new Error('Missing upstream reader');
40
+ }
41
+ return new ReadableStream({
42
+ start(controller) {
43
+ return tslib.__awaiter(this, void 0, void 0, function* () {
44
+ controller.enqueue(encoder.encode(encodeEvent({
45
+ type: 'message_started',
46
+ messageId,
47
+ createdAt: Date.now(),
48
+ })));
49
+ try {
50
+ for (;;) {
51
+ const chunk = yield reader.read();
52
+ if (chunk.done) {
53
+ break;
54
+ }
55
+ const text = decoder.decode(chunk.value, { stream: true });
56
+ if (!text) {
57
+ continue;
58
+ }
59
+ controller.enqueue(encoder.encode(encodeEvent({
60
+ type: 'text_delta',
61
+ messageId,
62
+ text,
63
+ })));
64
+ }
65
+ controller.enqueue(encoder.encode(encodeEvent({
66
+ type: 'message_completed',
67
+ messageId,
68
+ createdAt: Date.now(),
69
+ })));
70
+ controller.close();
71
+ }
72
+ catch (error$1) {
73
+ controller.enqueue(encoder.encode(encodeEvent({
74
+ type: 'error',
75
+ error: error.normalizeAIError(error$1),
76
+ })));
77
+ controller.close();
78
+ }
79
+ });
80
+ },
81
+ cancel(reason) {
82
+ void reader.cancel(reason);
83
+ },
84
+ });
85
+ });
86
+ }
87
+ function createOpenRouterRoute(config) {
88
+ const openRouterConfig = env.createOpenRouterClientConfigFromEnv(config.openRouter);
89
+ return function POST(request) {
90
+ return tslib.__awaiter(this, void 0, void 0, function* () {
91
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
92
+ const parsedBody = ai.AIRuntimeRequestSchema.safeParse(yield request.json());
93
+ if (!parsedBody.success) {
94
+ const payload = ai.createAIErrorPayload({
95
+ message: 'Invalid AI runtime request body',
96
+ upstreamStatusCode: 400,
97
+ failureReason: 'invalid_request',
98
+ });
99
+ return Response.json(payload, { status: 400 });
100
+ }
101
+ const requestId = createRequestId();
102
+ const sessionId = (_a = parsedBody.data.sessionId) !== null && _a !== void 0 ? _a : ((_c = (_b = config.createSessionId) === null || _b === void 0 ? void 0 : _b.call(config)) !== null && _c !== void 0 ? _c : createRequestId());
103
+ const context = {
104
+ request,
105
+ input: parsedBody.data,
106
+ sessionId,
107
+ requestId,
108
+ startedAt: Date.now(),
109
+ metadata: parsedBody.data.metadata,
110
+ };
111
+ const mockHandler = (_d = config.mock) !== null && _d !== void 0 ? _d : env.createOpenRouterMockFromEnvForContext(context);
112
+ try {
113
+ yield ((_g = (_f = (_e = config.adapters) === null || _e === void 0 ? void 0 : _e.billing) === null || _f === void 0 ? void 0 : _f.reserve) === null || _g === void 0 ? void 0 : _g.call(_f, context));
114
+ yield ((_j = (_h = config.hooks) === null || _h === void 0 ? void 0 : _h.beforeCall) === null || _j === void 0 ? void 0 : _j.call(_h, context));
115
+ if (mockHandler) {
116
+ const mockResponse = yield mockHandler(context);
117
+ if (mockResponse) {
118
+ return mockResponse;
119
+ }
120
+ }
121
+ const runUpstream = () => tslib.__awaiter(this, void 0, void 0, function* () {
122
+ var _a, _b, _c, _d;
123
+ const upstreamSignal = abort.createUpstreamAbortSignal(request.signal, (_b = (_a = config.timeoutMs) !== null && _a !== void 0 ? _a : openRouterConfig.timeoutMs) !== null && _b !== void 0 ? _b : 60000);
124
+ const response = yield openrouterClient.callOpenRouterStream(openRouterConfig, {
125
+ model: (_c = parsedBody.data.modelName) !== null && _c !== void 0 ? _c : openRouterConfig.defaultModel,
126
+ messages: ((_d = config.buildModelMessages) !== null && _d !== void 0 ? _d : messageBuilder.buildModelMessages)(parsedBody.data.messages),
127
+ stream: true,
128
+ provider: openRouterConfig.provider,
129
+ temperature: openRouterConfig.temperature,
130
+ max_tokens: openRouterConfig.maxTokens,
131
+ }, upstreamSignal);
132
+ return response.response;
133
+ });
134
+ const upstreamResponse = ((_l = (_k = config.adapters) === null || _k === void 0 ? void 0 : _k.lock) === null || _l === void 0 ? void 0 : _l.withLock)
135
+ ? yield config.adapters.lock.withLock(`ai:${sessionId}`, runUpstream)
136
+ : yield runUpstream();
137
+ const guarded = yield openrouterClient.guardedOpenRouterStreamStart(upstreamResponse);
138
+ if (!guarded.ok) {
139
+ yield ((_o = (_m = config.hooks) === null || _m === void 0 ? void 0 : _m.onError) === null || _o === void 0 ? void 0 : _o.call(_m, context, guarded.error));
140
+ yield ((_r = (_q = (_p = config.adapters) === null || _p === void 0 ? void 0 : _p.billing) === null || _q === void 0 ? void 0 : _q.settle) === null || _r === void 0 ? void 0 : _r.call(_q, context, {
141
+ status: guarded.error.status,
142
+ upstreamStatusCode: guarded.error.upstreamStatusCode,
143
+ }));
144
+ return Response.json(guarded.error, {
145
+ status: (_s = guarded.error.upstreamStatusCode) !== null && _s !== void 0 ? _s : 500,
146
+ });
147
+ }
148
+ const messageId = `asst-${requestId}`;
149
+ const wrappedResponse = new Response(config.streamToEvents
150
+ ? yield config.streamToEvents(new Response(guarded.stream, { headers: upstreamResponse.headers }), context)
151
+ : yield createEventStream(new Response(guarded.stream, { headers: upstreamResponse.headers }), messageId), {
152
+ headers: streamingHeaders,
153
+ });
154
+ yield ((_u = (_t = config.hooks) === null || _t === void 0 ? void 0 : _t.afterCall) === null || _u === void 0 ? void 0 : _u.call(_t, context, {
155
+ status: 'streaming',
156
+ upstreamStatusCode: upstreamResponse.status,
157
+ }));
158
+ return wrappedResponse;
159
+ }
160
+ catch (error$1) {
161
+ const normalized = error.normalizeAIError(error$1);
162
+ yield ((_w = (_v = config.hooks) === null || _v === void 0 ? void 0 : _v.onError) === null || _w === void 0 ? void 0 : _w.call(_v, context, normalized));
163
+ yield ((_z = (_y = (_x = config.adapters) === null || _x === void 0 ? void 0 : _x.billing) === null || _y === void 0 ? void 0 : _y.settle) === null || _z === void 0 ? void 0 : _z.call(_y, context, {
164
+ status: normalized.status,
165
+ upstreamStatusCode: normalized.upstreamStatusCode,
166
+ }));
167
+ return Response.json(normalized, {
168
+ status: (_0 = normalized.upstreamStatusCode) !== null && _0 !== void 0 ? _0 : 500,
169
+ });
170
+ }
171
+ });
172
+ };
173
+ }
174
+
175
+ exports.createOpenRouterRoute = createOpenRouterRoute;
176
+ exports.dynamic = dynamic;
177
+ exports.revalidate = revalidate;
178
+ exports.runtime = runtime;
@@ -0,0 +1,173 @@
1
+ import { __awaiter } from 'tslib';
2
+ import { AIRuntimeRequestSchema, createAIErrorPayload } from '@windrun-huaiin/contracts/ai';
3
+ import { createUpstreamAbortSignal } from './abort.mjs';
4
+ import { createOpenRouterClientConfigFromEnv, createOpenRouterMockFromEnvForContext } from './env.mjs';
5
+ import { normalizeAIError } from './error.mjs';
6
+ import { buildModelMessages } from './message-builder.mjs';
7
+ import { callOpenRouterStream, guardedOpenRouterStreamStart } from './openrouter-client.mjs';
8
+
9
+ const runtime = 'edge';
10
+ const dynamic = 'force-dynamic';
11
+ const revalidate = 0;
12
+ const streamingHeaders = {
13
+ 'Content-Type': 'text/event-stream; charset=utf-8',
14
+ 'Cache-Control': 'no-cache, no-store, max-age=0, must-revalidate, no-transform',
15
+ Connection: 'keep-alive',
16
+ Pragma: 'no-cache',
17
+ 'X-Accel-Buffering': 'no',
18
+ };
19
+ function createRequestId() {
20
+ try {
21
+ return crypto.randomUUID();
22
+ }
23
+ catch (_a) {
24
+ return `${Date.now()}-${Math.random().toString(16).slice(2)}`;
25
+ }
26
+ }
27
+ function encodeEvent(event) {
28
+ return `data: ${JSON.stringify(event)}\n\n`;
29
+ }
30
+ function createEventStream(response, messageId) {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ var _a;
33
+ const encoder = new TextEncoder();
34
+ const decoder = new TextDecoder();
35
+ const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader();
36
+ if (!reader) {
37
+ throw new Error('Missing upstream reader');
38
+ }
39
+ return new ReadableStream({
40
+ start(controller) {
41
+ return __awaiter(this, void 0, void 0, function* () {
42
+ controller.enqueue(encoder.encode(encodeEvent({
43
+ type: 'message_started',
44
+ messageId,
45
+ createdAt: Date.now(),
46
+ })));
47
+ try {
48
+ for (;;) {
49
+ const chunk = yield reader.read();
50
+ if (chunk.done) {
51
+ break;
52
+ }
53
+ const text = decoder.decode(chunk.value, { stream: true });
54
+ if (!text) {
55
+ continue;
56
+ }
57
+ controller.enqueue(encoder.encode(encodeEvent({
58
+ type: 'text_delta',
59
+ messageId,
60
+ text,
61
+ })));
62
+ }
63
+ controller.enqueue(encoder.encode(encodeEvent({
64
+ type: 'message_completed',
65
+ messageId,
66
+ createdAt: Date.now(),
67
+ })));
68
+ controller.close();
69
+ }
70
+ catch (error) {
71
+ controller.enqueue(encoder.encode(encodeEvent({
72
+ type: 'error',
73
+ error: normalizeAIError(error),
74
+ })));
75
+ controller.close();
76
+ }
77
+ });
78
+ },
79
+ cancel(reason) {
80
+ void reader.cancel(reason);
81
+ },
82
+ });
83
+ });
84
+ }
85
+ function createOpenRouterRoute(config) {
86
+ const openRouterConfig = createOpenRouterClientConfigFromEnv(config.openRouter);
87
+ return function POST(request) {
88
+ return __awaiter(this, void 0, void 0, function* () {
89
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v, _w, _x, _y, _z, _0;
90
+ const parsedBody = AIRuntimeRequestSchema.safeParse(yield request.json());
91
+ if (!parsedBody.success) {
92
+ const payload = createAIErrorPayload({
93
+ message: 'Invalid AI runtime request body',
94
+ upstreamStatusCode: 400,
95
+ failureReason: 'invalid_request',
96
+ });
97
+ return Response.json(payload, { status: 400 });
98
+ }
99
+ const requestId = createRequestId();
100
+ const sessionId = (_a = parsedBody.data.sessionId) !== null && _a !== void 0 ? _a : ((_c = (_b = config.createSessionId) === null || _b === void 0 ? void 0 : _b.call(config)) !== null && _c !== void 0 ? _c : createRequestId());
101
+ const context = {
102
+ request,
103
+ input: parsedBody.data,
104
+ sessionId,
105
+ requestId,
106
+ startedAt: Date.now(),
107
+ metadata: parsedBody.data.metadata,
108
+ };
109
+ const mockHandler = (_d = config.mock) !== null && _d !== void 0 ? _d : createOpenRouterMockFromEnvForContext(context);
110
+ try {
111
+ yield ((_g = (_f = (_e = config.adapters) === null || _e === void 0 ? void 0 : _e.billing) === null || _f === void 0 ? void 0 : _f.reserve) === null || _g === void 0 ? void 0 : _g.call(_f, context));
112
+ yield ((_j = (_h = config.hooks) === null || _h === void 0 ? void 0 : _h.beforeCall) === null || _j === void 0 ? void 0 : _j.call(_h, context));
113
+ if (mockHandler) {
114
+ const mockResponse = yield mockHandler(context);
115
+ if (mockResponse) {
116
+ return mockResponse;
117
+ }
118
+ }
119
+ const runUpstream = () => __awaiter(this, void 0, void 0, function* () {
120
+ var _a, _b, _c, _d;
121
+ const upstreamSignal = createUpstreamAbortSignal(request.signal, (_b = (_a = config.timeoutMs) !== null && _a !== void 0 ? _a : openRouterConfig.timeoutMs) !== null && _b !== void 0 ? _b : 60000);
122
+ const response = yield callOpenRouterStream(openRouterConfig, {
123
+ model: (_c = parsedBody.data.modelName) !== null && _c !== void 0 ? _c : openRouterConfig.defaultModel,
124
+ messages: ((_d = config.buildModelMessages) !== null && _d !== void 0 ? _d : buildModelMessages)(parsedBody.data.messages),
125
+ stream: true,
126
+ provider: openRouterConfig.provider,
127
+ temperature: openRouterConfig.temperature,
128
+ max_tokens: openRouterConfig.maxTokens,
129
+ }, upstreamSignal);
130
+ return response.response;
131
+ });
132
+ const upstreamResponse = ((_l = (_k = config.adapters) === null || _k === void 0 ? void 0 : _k.lock) === null || _l === void 0 ? void 0 : _l.withLock)
133
+ ? yield config.adapters.lock.withLock(`ai:${sessionId}`, runUpstream)
134
+ : yield runUpstream();
135
+ const guarded = yield guardedOpenRouterStreamStart(upstreamResponse);
136
+ if (!guarded.ok) {
137
+ yield ((_o = (_m = config.hooks) === null || _m === void 0 ? void 0 : _m.onError) === null || _o === void 0 ? void 0 : _o.call(_m, context, guarded.error));
138
+ yield ((_r = (_q = (_p = config.adapters) === null || _p === void 0 ? void 0 : _p.billing) === null || _q === void 0 ? void 0 : _q.settle) === null || _r === void 0 ? void 0 : _r.call(_q, context, {
139
+ status: guarded.error.status,
140
+ upstreamStatusCode: guarded.error.upstreamStatusCode,
141
+ }));
142
+ return Response.json(guarded.error, {
143
+ status: (_s = guarded.error.upstreamStatusCode) !== null && _s !== void 0 ? _s : 500,
144
+ });
145
+ }
146
+ const messageId = `asst-${requestId}`;
147
+ const wrappedResponse = new Response(config.streamToEvents
148
+ ? yield config.streamToEvents(new Response(guarded.stream, { headers: upstreamResponse.headers }), context)
149
+ : yield createEventStream(new Response(guarded.stream, { headers: upstreamResponse.headers }), messageId), {
150
+ headers: streamingHeaders,
151
+ });
152
+ yield ((_u = (_t = config.hooks) === null || _t === void 0 ? void 0 : _t.afterCall) === null || _u === void 0 ? void 0 : _u.call(_t, context, {
153
+ status: 'streaming',
154
+ upstreamStatusCode: upstreamResponse.status,
155
+ }));
156
+ return wrappedResponse;
157
+ }
158
+ catch (error) {
159
+ const normalized = normalizeAIError(error);
160
+ yield ((_w = (_v = config.hooks) === null || _v === void 0 ? void 0 : _v.onError) === null || _w === void 0 ? void 0 : _w.call(_v, context, normalized));
161
+ yield ((_z = (_y = (_x = config.adapters) === null || _x === void 0 ? void 0 : _x.billing) === null || _y === void 0 ? void 0 : _y.settle) === null || _z === void 0 ? void 0 : _z.call(_y, context, {
162
+ status: normalized.status,
163
+ upstreamStatusCode: normalized.upstreamStatusCode,
164
+ }));
165
+ return Response.json(normalized, {
166
+ status: (_0 = normalized.upstreamStatusCode) !== null && _0 !== void 0 ? _0 : 500,
167
+ });
168
+ }
169
+ });
170
+ };
171
+ }
172
+
173
+ export { createOpenRouterRoute, dynamic, revalidate, runtime };
@@ -0,0 +1,98 @@
1
+ import type { AIErrorPayload, AIMessageStatus, AIRuntimeRequest, AIStreamEvent, ConversationMessage } from '@windrun-huaiin/contracts/ai';
2
+ export type AIRuntimeContext = {
3
+ request: Request;
4
+ input: AIRuntimeRequest;
5
+ sessionId: string;
6
+ requestId: string;
7
+ startedAt: number;
8
+ metadata?: Record<string, unknown>;
9
+ };
10
+ export type AIRuntimeUsage = {
11
+ inputTokens?: number;
12
+ outputTokens?: number;
13
+ totalTokens?: number;
14
+ };
15
+ export type AIRuntimeResult = {
16
+ status: AIMessageStatus;
17
+ message?: ConversationMessage;
18
+ usage?: AIRuntimeUsage;
19
+ upstreamStatusCode?: number;
20
+ };
21
+ export type AIBeforeCallHook = (context: AIRuntimeContext) => Promise<void> | void;
22
+ export type AIAfterCallHook = (context: AIRuntimeContext, result: AIRuntimeResult) => Promise<void> | void;
23
+ export type AIErrorHook = (context: AIRuntimeContext, error: AIErrorPayload) => Promise<void> | void;
24
+ export type AIStorageAdapter = {
25
+ loadHistory?(input: {
26
+ sessionId: string;
27
+ userId?: string;
28
+ }): Promise<ConversationMessage[]>;
29
+ saveMessages?(input: {
30
+ sessionId: string;
31
+ userId?: string;
32
+ messages: ConversationMessage[];
33
+ }): Promise<void>;
34
+ };
35
+ export type AIBillingAdapter = {
36
+ reserve?(context: AIRuntimeContext): Promise<void>;
37
+ settle?(context: AIRuntimeContext, result: AIRuntimeResult): Promise<void>;
38
+ };
39
+ export type AILockAdapter = {
40
+ withLock?<T>(key: string, fn: () => Promise<T>): Promise<T>;
41
+ };
42
+ export type AIMockHandler = (context: AIRuntimeContext) => Promise<Response | null> | Response | null;
43
+ export type AIRuntimeHooks = {
44
+ beforeCall?: AIBeforeCallHook;
45
+ afterCall?: AIAfterCallHook;
46
+ onError?: AIErrorHook;
47
+ };
48
+ export type AIRuntimeAdapters = {
49
+ storage?: AIStorageAdapter;
50
+ billing?: AIBillingAdapter;
51
+ lock?: AILockAdapter;
52
+ };
53
+ export type OpenRouterRequestBody = {
54
+ model: string;
55
+ messages: Array<{
56
+ role: 'user' | 'assistant' | 'system' | 'tool';
57
+ content: string;
58
+ }>;
59
+ stream: true;
60
+ provider?: Record<string, unknown>;
61
+ temperature?: number;
62
+ max_tokens?: number;
63
+ };
64
+ export type OpenRouterClientConfig = {
65
+ apiKey: string;
66
+ baseUrl?: string;
67
+ defaultModel: string;
68
+ referer?: string;
69
+ title?: string;
70
+ timeoutMs?: number;
71
+ provider?: Record<string, unknown>;
72
+ temperature?: number;
73
+ maxTokens?: number;
74
+ fetchImpl?: typeof fetch;
75
+ };
76
+ export type OpenRouterStreamResult = {
77
+ response: Response;
78
+ status: number;
79
+ };
80
+ export type AIRouteConfig = {
81
+ openRouter?: Partial<OpenRouterClientConfig>;
82
+ timeoutMs?: number;
83
+ createSessionId?: () => string;
84
+ mock?: AIMockHandler;
85
+ hooks?: AIRuntimeHooks;
86
+ adapters?: AIRuntimeAdapters;
87
+ buildModelMessages?: (messages: AIRuntimeRequest['messages']) => OpenRouterRequestBody['messages'];
88
+ streamToEvents?: (response: Response, context: AIRuntimeContext) => Promise<ReadableStream<Uint8Array>>;
89
+ };
90
+ export type GuardedStreamStartResult = {
91
+ ok: true;
92
+ stream: ReadableStream<Uint8Array>;
93
+ } | {
94
+ ok: false;
95
+ error: AIErrorPayload;
96
+ };
97
+ export type EncodedAIStreamEvent = AIStreamEvent;
98
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/services/ai/types.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var tslib_es6 = require('../../node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.46.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.js');
3
+ var tslib = require('tslib');
4
4
  var user_service = require('../database/user.service.js');
5
5
  var subscription_service = require('../database/subscription.service.js');
6
6
  var credit_service = require('../database/credit.service.js');
@@ -65,7 +65,7 @@ function buildInitUserContextFromEntities(params) {
65
65
  };
66
66
  }
67
67
  function fetchUserContextByClerkUserId(clerkUserId) {
68
- return tslib_es6.__awaiter(this, void 0, void 0, function* () {
68
+ return tslib.__awaiter(this, void 0, void 0, function* () {
69
69
  const user = yield user_service.userService.findByClerkUserId(clerkUserId);
70
70
  if (!user) {
71
71
  return null;
@@ -78,7 +78,7 @@ function fetchUserContextByClerkUserId(clerkUserId) {
78
78
  });
79
79
  }
80
80
  function fetchLatestUserContextByFingerprintId(fingerprintId) {
81
- return tslib_es6.__awaiter(this, void 0, void 0, function* () {
81
+ return tslib.__awaiter(this, void 0, void 0, function* () {
82
82
  const existingUsers = yield user_service.userService.findListByFingerprintId(fingerprintId);
83
83
  if (existingUsers.length === 0) {
84
84
  return null;
@@ -1,4 +1,4 @@
1
- import { __awaiter } from '../../node_modules/.pnpm/@rollup_plugin-typescript@12.1.4_rollup@4.46.2_tslib@2.8.1_typescript@5.9.3/node_modules/tslib/tslib.es6.mjs';
1
+ import { __awaiter } from 'tslib';
2
2
  import { userService } from '../database/user.service.mjs';
3
3
  import { subscriptionService } from '../database/subscription.service.mjs';
4
4
  import { creditService } from '../database/credit.service.mjs';