alepha 0.23.0 → 0.24.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 (845) hide show
  1. package/assets/swagger-ui/swagger-ui-bundle.js +1 -1
  2. package/assets/swagger-ui/swagger-ui-standalone-preset.js +1 -1
  3. package/dist/api/audits/index.browser.js +49 -52
  4. package/dist/api/audits/index.browser.js.map +1 -1
  5. package/dist/api/audits/index.d.ts +629 -565
  6. package/dist/api/audits/index.d.ts.map +1 -1
  7. package/dist/api/audits/index.js +206 -98
  8. package/dist/api/audits/index.js.map +1 -1
  9. package/dist/api/files/index.browser.js +44 -44
  10. package/dist/api/files/index.browser.js.map +1 -1
  11. package/dist/api/files/index.d.ts +292 -293
  12. package/dist/api/files/index.d.ts.map +1 -1
  13. package/dist/api/files/index.js +61 -64
  14. package/dist/api/files/index.js.map +1 -1
  15. package/dist/api/jobs/index.browser.js +61 -59
  16. package/dist/api/jobs/index.browser.js.map +1 -1
  17. package/dist/api/jobs/index.d.ts +546 -347
  18. package/dist/api/jobs/index.d.ts.map +1 -1
  19. package/dist/api/jobs/index.js +165 -86
  20. package/dist/api/jobs/index.js.map +1 -1
  21. package/dist/api/keys/index.d.ts +247 -235
  22. package/dist/api/keys/index.d.ts.map +1 -1
  23. package/dist/api/keys/index.js +63 -66
  24. package/dist/api/keys/index.js.map +1 -1
  25. package/dist/api/notifications/index.browser.js +40 -38
  26. package/dist/api/notifications/index.browser.js.map +1 -1
  27. package/dist/api/notifications/index.d.ts +339 -209
  28. package/dist/api/notifications/index.d.ts.map +1 -1
  29. package/dist/api/notifications/index.js +108 -60
  30. package/dist/api/notifications/index.js.map +1 -1
  31. package/dist/api/oauth/index.d.ts +190 -78
  32. package/dist/api/oauth/index.d.ts.map +1 -1
  33. package/dist/api/oauth/index.js +290 -68
  34. package/dist/api/oauth/index.js.map +1 -1
  35. package/dist/api/organizations/index.browser.js +14 -14
  36. package/dist/api/organizations/index.browser.js.map +1 -1
  37. package/dist/api/organizations/index.d.ts +158 -134
  38. package/dist/api/organizations/index.d.ts.map +1 -1
  39. package/dist/api/organizations/index.js +18 -18
  40. package/dist/api/organizations/index.js.map +1 -1
  41. package/dist/api/parameters/index.browser.js +74 -53
  42. package/dist/api/parameters/index.browser.js.map +1 -1
  43. package/dist/api/parameters/index.d.ts +607 -513
  44. package/dist/api/parameters/index.d.ts.map +1 -1
  45. package/dist/api/parameters/index.js +205 -127
  46. package/dist/api/parameters/index.js.map +1 -1
  47. package/dist/api/payments/index.d.ts +652 -449
  48. package/dist/api/payments/index.d.ts.map +1 -1
  49. package/dist/api/payments/index.js +159 -93
  50. package/dist/api/payments/index.js.map +1 -1
  51. package/dist/api/subscriptions/index.d.ts +1032 -762
  52. package/dist/api/subscriptions/index.d.ts.map +1 -1
  53. package/dist/api/subscriptions/index.js +166 -185
  54. package/dist/api/subscriptions/index.js.map +1 -1
  55. package/dist/api/users/index.browser.js +48 -71
  56. package/dist/api/users/index.browser.js.map +1 -1
  57. package/dist/api/users/index.d.ts +1297 -1143
  58. package/dist/api/users/index.d.ts.map +1 -1
  59. package/dist/api/users/index.js +456 -392
  60. package/dist/api/users/index.js.map +1 -1
  61. package/dist/api/verifications/index.browser.js +17 -17
  62. package/dist/api/verifications/index.browser.js.map +1 -1
  63. package/dist/api/verifications/index.d.ts +167 -155
  64. package/dist/api/verifications/index.d.ts.map +1 -1
  65. package/dist/api/verifications/index.js +47 -95
  66. package/dist/api/verifications/index.js.map +1 -1
  67. package/dist/background/index.d.ts +0 -1
  68. package/dist/background/index.d.ts.map +1 -1
  69. package/dist/background/index.js.map +1 -1
  70. package/dist/background/index.workerd.js.map +1 -1
  71. package/dist/batch/index.d.ts +0 -1
  72. package/dist/batch/index.d.ts.map +1 -1
  73. package/dist/batch/index.js.map +1 -1
  74. package/dist/bin/index.js +1 -1
  75. package/dist/bin/index.js.map +1 -1
  76. package/dist/bucket/index.d.ts +27 -32
  77. package/dist/bucket/index.d.ts.map +1 -1
  78. package/dist/bucket/index.js +56 -26
  79. package/dist/bucket/index.js.map +1 -1
  80. package/dist/bucket/index.workerd.js +52 -24
  81. package/dist/bucket/index.workerd.js.map +1 -1
  82. package/dist/cache/core/index.d.ts +4 -6
  83. package/dist/cache/core/index.d.ts.map +1 -1
  84. package/dist/cache/core/index.js +4 -10
  85. package/dist/cache/core/index.js.map +1 -1
  86. package/dist/cache/core/index.workerd.js +4 -10
  87. package/dist/cache/core/index.workerd.js.map +1 -1
  88. package/dist/cache/database/index.d.ts +22 -23
  89. package/dist/cache/database/index.d.ts.map +1 -1
  90. package/dist/cache/database/index.js +11 -20
  91. package/dist/cache/database/index.js.map +1 -1
  92. package/dist/cache/redis/index.d.ts +3 -4
  93. package/dist/cache/redis/index.d.ts.map +1 -1
  94. package/dist/cache/redis/index.js +2 -2
  95. package/dist/cache/redis/index.js.map +1 -1
  96. package/dist/captcha/index.d.ts.map +1 -1
  97. package/dist/captcha/index.js +4 -4
  98. package/dist/captcha/index.js.map +1 -1
  99. package/dist/cli/config/index.d.ts +0 -1
  100. package/dist/cli/config/index.d.ts.map +1 -1
  101. package/dist/cli/core/index.d.ts +205 -442
  102. package/dist/cli/core/index.d.ts.map +1 -1
  103. package/dist/cli/core/index.js +259 -284
  104. package/dist/cli/core/index.js.map +1 -1
  105. package/dist/cli/devtools/index.d.ts +3 -9
  106. package/dist/cli/devtools/index.d.ts.map +1 -1
  107. package/dist/cli/devtools/index.js +3 -3
  108. package/dist/cli/devtools/index.js.map +1 -1
  109. package/dist/cli/i18n/index.d.ts +8 -34
  110. package/dist/cli/i18n/index.d.ts.map +1 -1
  111. package/dist/cli/i18n/index.js +6 -6
  112. package/dist/cli/i18n/index.js.map +1 -1
  113. package/dist/cli/platform/index.d.ts +89 -82
  114. package/dist/cli/platform/index.d.ts.map +1 -1
  115. package/dist/cli/platform/index.js +27 -33
  116. package/dist/cli/platform/index.js.map +1 -1
  117. package/dist/cli/platform-lib/index.d.ts +351 -404
  118. package/dist/cli/platform-lib/index.d.ts.map +1 -1
  119. package/dist/cli/platform-lib/index.js +218 -239
  120. package/dist/cli/platform-lib/index.js.map +1 -1
  121. package/dist/cli/vendor/index.d.ts +17 -41
  122. package/dist/cli/vendor/index.d.ts.map +1 -1
  123. package/dist/cli/vendor/index.js +10 -13
  124. package/dist/cli/vendor/index.js.map +1 -1
  125. package/dist/command/index.d.ts +83 -195
  126. package/dist/command/index.d.ts.map +1 -1
  127. package/dist/command/index.js +160 -563
  128. package/dist/command/index.js.map +1 -1
  129. package/dist/core/index.browser.js +845 -859
  130. package/dist/core/index.browser.js.map +1 -1
  131. package/dist/core/index.d.ts +787 -527
  132. package/dist/core/index.d.ts.map +1 -1
  133. package/dist/core/index.js +845 -859
  134. package/dist/core/index.js.map +1 -1
  135. package/dist/core/index.native.js +845 -859
  136. package/dist/core/index.native.js.map +1 -1
  137. package/dist/core/index.workerd.js +845 -859
  138. package/dist/core/index.workerd.js.map +1 -1
  139. package/dist/crypto/index.browser.js +1 -1
  140. package/dist/crypto/index.browser.js.map +1 -1
  141. package/dist/crypto/index.d.ts +3 -4
  142. package/dist/crypto/index.d.ts.map +1 -1
  143. package/dist/crypto/index.js +6 -3
  144. package/dist/crypto/index.js.map +1 -1
  145. package/dist/datetime/index.d.ts +12 -2
  146. package/dist/datetime/index.d.ts.map +1 -1
  147. package/dist/datetime/index.js +6 -1
  148. package/dist/datetime/index.js.map +1 -1
  149. package/dist/email/brevo/index.d.ts +0 -1
  150. package/dist/email/brevo/index.d.ts.map +1 -1
  151. package/dist/email/brevo/index.js +4 -4
  152. package/dist/email/brevo/index.js.map +1 -1
  153. package/dist/email/cloudflare/index.d.ts +0 -1
  154. package/dist/email/cloudflare/index.d.ts.map +1 -1
  155. package/dist/email/cloudflare/index.js +2 -2
  156. package/dist/email/cloudflare/index.js.map +1 -1
  157. package/dist/email/core/index.d.ts +15 -7
  158. package/dist/email/core/index.d.ts.map +1 -1
  159. package/dist/email/core/index.js +14 -5
  160. package/dist/email/core/index.js.map +1 -1
  161. package/dist/email/core/index.workerd.js +5 -1
  162. package/dist/email/core/index.workerd.js.map +1 -1
  163. package/dist/email/smtp/index.d.ts +8 -9
  164. package/dist/email/smtp/index.d.ts.map +1 -1
  165. package/dist/email/smtp/index.js +702 -479
  166. package/dist/email/smtp/index.js.map +1 -1
  167. package/dist/fake/index.d.ts +1580 -1238
  168. package/dist/fake/index.d.ts.map +1 -1
  169. package/dist/fake/index.js +11728 -32131
  170. package/dist/fake/index.js.map +1 -1
  171. package/dist/lock/core/index.d.ts +13 -9
  172. package/dist/lock/core/index.d.ts.map +1 -1
  173. package/dist/lock/core/index.js +5 -5
  174. package/dist/lock/core/index.js.map +1 -1
  175. package/dist/lock/redis/index.d.ts +0 -1
  176. package/dist/lock/redis/index.d.ts.map +1 -1
  177. package/dist/lock/redis/index.js.map +1 -1
  178. package/dist/logger/index.d.ts +81 -69
  179. package/dist/logger/index.d.ts.map +1 -1
  180. package/dist/logger/index.js +123 -56
  181. package/dist/logger/index.js.map +1 -1
  182. package/dist/mcp/index.d.ts +27 -90
  183. package/dist/mcp/index.d.ts.map +1 -1
  184. package/dist/mcp/index.js +42 -70
  185. package/dist/mcp/index.js.map +1 -1
  186. package/dist/orm/core/index.browser.js +54 -40
  187. package/dist/orm/core/index.browser.js.map +1 -1
  188. package/dist/orm/core/index.bun.js +140 -106
  189. package/dist/orm/core/index.bun.js.map +1 -1
  190. package/dist/orm/core/index.d.ts +145 -150
  191. package/dist/orm/core/index.d.ts.map +1 -1
  192. package/dist/orm/core/index.js +144 -109
  193. package/dist/orm/core/index.js.map +1 -1
  194. package/dist/orm/postgres/index.bun.js +64 -54
  195. package/dist/orm/postgres/index.bun.js.map +1 -1
  196. package/dist/orm/postgres/index.d.ts +36 -76
  197. package/dist/orm/postgres/index.d.ts.map +1 -1
  198. package/dist/orm/postgres/index.js +67 -57
  199. package/dist/orm/postgres/index.js.map +1 -1
  200. package/dist/queue/core/index.d.ts +62 -75
  201. package/dist/queue/core/index.d.ts.map +1 -1
  202. package/dist/queue/core/index.js +48 -71
  203. package/dist/queue/core/index.js.map +1 -1
  204. package/dist/queue/core/index.workerd.js +48 -71
  205. package/dist/queue/core/index.workerd.js.map +1 -1
  206. package/dist/queue/redis/index.d.ts +3 -4
  207. package/dist/queue/redis/index.d.ts.map +1 -1
  208. package/dist/queue/redis/index.js +2 -2
  209. package/dist/queue/redis/index.js.map +1 -1
  210. package/dist/react/auth/index.browser.js.map +1 -1
  211. package/dist/react/auth/index.d.ts +7 -4
  212. package/dist/react/auth/index.d.ts.map +1 -1
  213. package/dist/react/auth/index.js.map +1 -1
  214. package/dist/react/core/index.d.ts +87 -5
  215. package/dist/react/core/index.d.ts.map +1 -1
  216. package/dist/react/core/index.js +170 -23
  217. package/dist/react/core/index.js.map +1 -1
  218. package/dist/react/form/index.d.ts +4 -5
  219. package/dist/react/form/index.d.ts.map +1 -1
  220. package/dist/react/form/index.js +91 -56
  221. package/dist/react/form/index.js.map +1 -1
  222. package/dist/react/head/index.browser.js.map +1 -1
  223. package/dist/react/head/index.d.ts +0 -1
  224. package/dist/react/head/index.d.ts.map +1 -1
  225. package/dist/react/head/index.js.map +1 -1
  226. package/dist/react/i18n/index.d.ts +4 -5
  227. package/dist/react/i18n/index.d.ts.map +1 -1
  228. package/dist/react/i18n/index.js +2 -2
  229. package/dist/react/i18n/index.js.map +1 -1
  230. package/dist/react/intro/index.d.ts +1 -4
  231. package/dist/react/intro/index.d.ts.map +1 -1
  232. package/dist/react/intro/index.js.map +1 -1
  233. package/dist/react/router/index.browser.js +60 -24
  234. package/dist/react/router/index.browser.js.map +1 -1
  235. package/dist/react/router/index.d.ts +378 -377
  236. package/dist/react/router/index.d.ts.map +1 -1
  237. package/dist/react/router/index.js +77 -41
  238. package/dist/react/router/index.js.map +1 -1
  239. package/dist/react/sitemap/index.d.ts +0 -1
  240. package/dist/react/sitemap/index.d.ts.map +1 -1
  241. package/dist/react/sitemap/index.js.map +1 -1
  242. package/dist/react/testing/index.d.ts +4 -5
  243. package/dist/react/testing/index.d.ts.map +1 -1
  244. package/dist/react/testing/index.js +41 -15
  245. package/dist/react/testing/index.js.map +1 -1
  246. package/dist/react/testing/{chunk-BpyX8vjI.js → rolldown-runtime-Bl3dcgcQ.js} +1 -1
  247. package/dist/react/ui/index.d.ts +35 -34
  248. package/dist/react/ui/index.d.ts.map +1 -1
  249. package/dist/react/ui/index.js +12 -17
  250. package/dist/react/ui/index.js.map +1 -1
  251. package/dist/redis/index.bun.js +5 -5
  252. package/dist/redis/index.bun.js.map +1 -1
  253. package/dist/redis/index.d.ts +6 -7
  254. package/dist/redis/index.d.ts.map +1 -1
  255. package/dist/redis/index.js +6 -6
  256. package/dist/redis/index.js.map +1 -1
  257. package/dist/retry/index.d.ts +0 -1
  258. package/dist/retry/index.d.ts.map +1 -1
  259. package/dist/retry/index.js.map +1 -1
  260. package/dist/router/index.d.ts.map +1 -1
  261. package/dist/router/index.js.map +1 -1
  262. package/dist/scheduler/index.d.ts +4 -12
  263. package/dist/scheduler/index.d.ts.map +1 -1
  264. package/dist/scheduler/index.js +9 -4
  265. package/dist/scheduler/index.js.map +1 -1
  266. package/dist/scheduler/index.workerd.js +9 -4
  267. package/dist/scheduler/index.workerd.js.map +1 -1
  268. package/dist/security/index.browser.js +30 -28
  269. package/dist/security/index.browser.js.map +1 -1
  270. package/dist/security/index.d.ts +113 -44
  271. package/dist/security/index.d.ts.map +1 -1
  272. package/dist/security/index.js +452 -37
  273. package/dist/security/index.js.map +1 -1
  274. package/dist/server/auth/index.browser.js +19 -19
  275. package/dist/server/auth/index.browser.js.map +1 -1
  276. package/dist/server/auth/index.d.ts +198 -274
  277. package/dist/server/auth/index.d.ts.map +1 -1
  278. package/dist/server/auth/index.js +83 -621
  279. package/dist/server/auth/index.js.map +1 -1
  280. package/dist/server/cookies/index.browser.js +103 -5
  281. package/dist/server/cookies/index.browser.js.map +1 -1
  282. package/dist/server/cookies/index.d.ts +72 -5
  283. package/dist/server/cookies/index.d.ts.map +1 -1
  284. package/dist/server/cookies/index.js +103 -9
  285. package/dist/server/cookies/index.js.map +1 -1
  286. package/dist/server/core/index.browser.js +22 -27
  287. package/dist/server/core/index.browser.js.map +1 -1
  288. package/dist/server/core/index.d.ts +116 -85
  289. package/dist/server/core/index.d.ts.map +1 -1
  290. package/dist/server/core/index.js +105 -118
  291. package/dist/server/core/index.js.map +1 -1
  292. package/dist/server/cors/index.d.ts +9 -10
  293. package/dist/server/cors/index.d.ts.map +1 -1
  294. package/dist/server/cors/index.js +14 -26
  295. package/dist/server/cors/index.js.map +1 -1
  296. package/dist/server/etag/index.d.ts +2 -3
  297. package/dist/server/etag/index.d.ts.map +1 -1
  298. package/dist/server/etag/index.js.map +1 -1
  299. package/dist/server/health/index.d.ts +18 -19
  300. package/dist/server/health/index.d.ts.map +1 -1
  301. package/dist/server/health/index.js +6 -6
  302. package/dist/server/health/index.js.map +1 -1
  303. package/dist/server/links/index.browser.js +15 -18
  304. package/dist/server/links/index.browser.js.map +1 -1
  305. package/dist/server/links/index.d.ts +66 -67
  306. package/dist/server/links/index.d.ts.map +1 -1
  307. package/dist/server/links/index.js +29 -32
  308. package/dist/server/links/index.js.map +1 -1
  309. package/dist/server/metrics/index.d.ts +0 -1
  310. package/dist/server/metrics/index.d.ts.map +1 -1
  311. package/dist/server/metrics/index.js +10 -3
  312. package/dist/server/metrics/index.js.map +1 -1
  313. package/dist/server/proxy/index.d.ts +0 -1
  314. package/dist/server/proxy/index.d.ts.map +1 -1
  315. package/dist/server/proxy/index.js.map +1 -1
  316. package/dist/server/rate-limit/index.d.ts +8 -9
  317. package/dist/server/rate-limit/index.d.ts.map +1 -1
  318. package/dist/server/rate-limit/index.js +6 -12
  319. package/dist/server/rate-limit/index.js.map +1 -1
  320. package/dist/server/static/index.d.ts +0 -1
  321. package/dist/server/static/index.d.ts.map +1 -1
  322. package/dist/server/static/index.js.map +1 -1
  323. package/dist/server/swagger/index.d.ts +4 -4
  324. package/dist/server/swagger/index.d.ts.map +1 -1
  325. package/dist/server/swagger/index.js +37 -25
  326. package/dist/server/swagger/index.js.map +1 -1
  327. package/dist/sms/index.d.ts +0 -1
  328. package/dist/sms/index.d.ts.map +1 -1
  329. package/dist/sms/index.js.map +1 -1
  330. package/dist/system/index.browser.js.map +1 -1
  331. package/dist/system/index.d.ts +0 -1
  332. package/dist/system/index.d.ts.map +1 -1
  333. package/dist/system/index.js +2 -1
  334. package/dist/system/index.js.map +1 -1
  335. package/dist/system/index.workerd.js.map +1 -1
  336. package/dist/topic/core/index.d.ts +19 -20
  337. package/dist/topic/core/index.d.ts.map +1 -1
  338. package/dist/topic/core/index.js +8 -8
  339. package/dist/topic/core/index.js.map +1 -1
  340. package/dist/topic/redis/index.d.ts +3 -4
  341. package/dist/topic/redis/index.d.ts.map +1 -1
  342. package/dist/topic/redis/index.js +2 -2
  343. package/dist/topic/redis/index.js.map +1 -1
  344. package/package.json +22 -35
  345. package/src/api/audits/__tests__/AuditJobs.spec.ts +83 -0
  346. package/src/api/audits/__tests__/AuditService.spec.ts +139 -1
  347. package/src/api/audits/controllers/AdminAuditController.ts +41 -41
  348. package/src/api/audits/entities/audits.ts +22 -22
  349. package/src/api/audits/index.ts +6 -1
  350. package/src/api/audits/jobs/AuditJobs.ts +29 -0
  351. package/src/api/audits/parameters/AuditParameters.ts +51 -0
  352. package/src/api/audits/primitives/$audit.ts +24 -0
  353. package/src/api/audits/schemas/auditQuerySchema.ts +13 -13
  354. package/src/api/audits/schemas/createAuditSchema.ts +18 -18
  355. package/src/api/audits/services/AuditService.ts +79 -7
  356. package/src/api/files/__tests__/FileController.spec.ts +5 -5
  357. package/src/api/files/__tests__/FileJobs.spec.ts +6 -0
  358. package/src/api/files/controllers/FileController.ts +25 -25
  359. package/src/api/files/entities/files.ts +15 -15
  360. package/src/api/files/schemas/fileCreatorSummarySchema.ts +7 -7
  361. package/src/api/files/schemas/fileQuerySchema.ts +9 -9
  362. package/src/api/files/schemas/fileResourceSchema.ts +7 -9
  363. package/src/api/files/schemas/storageStatsSchema.ts +13 -13
  364. package/src/api/jobs/__tests__/$job-hardening.spec.ts +289 -0
  365. package/src/api/jobs/__tests__/$job.spec.ts +18 -18
  366. package/src/api/jobs/controllers/AdminJobController.ts +8 -8
  367. package/src/api/jobs/entities/jobExecutionEntity.ts +29 -19
  368. package/src/api/jobs/providers/JobProvider.ts +128 -12
  369. package/src/api/jobs/providers/JobQueueProvider.ts +2 -2
  370. package/src/api/jobs/schemas/jobConfigAtom.ts +22 -22
  371. package/src/api/jobs/schemas/jobExecutionQuerySchema.ts +6 -6
  372. package/src/api/jobs/schemas/jobExecutionResourceSchema.ts +11 -15
  373. package/src/api/jobs/schemas/jobRegistrationSchema.ts +20 -19
  374. package/src/api/jobs/schemas/triggerJobSchema.ts +3 -3
  375. package/src/api/jobs/services/JobService.ts +6 -6
  376. package/src/api/keys/__tests__/ApiKeyService.spec.ts +2 -2
  377. package/src/api/keys/controllers/AdminApiKeyController.ts +10 -10
  378. package/src/api/keys/entities/apiKeyEntity.ts +15 -15
  379. package/src/api/keys/schemas/adminApiKeyQuerySchema.ts +4 -4
  380. package/src/api/keys/schemas/adminApiKeyResourceSchema.ts +15 -15
  381. package/src/api/keys/schemas/createApiKeyBodySchema.ts +5 -5
  382. package/src/api/keys/schemas/createApiKeyResponseSchema.ts +9 -9
  383. package/src/api/keys/schemas/listApiKeyResponseSchema.ts +13 -13
  384. package/src/api/keys/schemas/revokeApiKeyParamsSchema.ts +3 -3
  385. package/src/api/keys/schemas/revokeApiKeyResponseSchema.ts +3 -3
  386. package/src/api/notifications/__tests__/AlephaApiNotifications.spec.ts +2 -2
  387. package/src/api/notifications/controllers/AdminNotificationController.ts +38 -14
  388. package/src/api/notifications/jobs/NotificationJobs.ts +7 -6
  389. package/src/api/notifications/primitives/$notification.ts +43 -4
  390. package/src/api/notifications/schemas/notificationContactPreferencesSchema.ts +4 -4
  391. package/src/api/notifications/schemas/notificationContactSchema.ts +7 -7
  392. package/src/api/notifications/schemas/notificationDetailResourceSchema.ts +9 -11
  393. package/src/api/notifications/schemas/notificationPayloadSchema.ts +11 -9
  394. package/src/api/notifications/schemas/notificationQuerySchema.ts +6 -6
  395. package/src/api/notifications/schemas/notificationResourceSchema.ts +14 -14
  396. package/src/api/notifications/services/NotificationSenderService.ts +38 -2
  397. package/src/api/oauth/__tests__/OAuthClientService.spec.ts +42 -0
  398. package/src/api/oauth/__tests__/OAuthController.spec.ts +128 -0
  399. package/src/api/oauth/controllers/OAuthController.ts +132 -12
  400. package/src/api/oauth/entities/oauthClientEntity.ts +29 -12
  401. package/src/api/oauth/helpers/oauthMetadata.ts +1 -0
  402. package/src/api/oauth/helpers/oidcMetadata.ts +19 -0
  403. package/src/api/oauth/index.ts +1 -0
  404. package/src/api/oauth/schemas/authorizeDecisionBodySchema.ts +12 -11
  405. package/src/api/oauth/schemas/authorizeQuerySchema.ts +12 -10
  406. package/src/api/oauth/schemas/registerClientBodySchema.ts +10 -11
  407. package/src/api/oauth/schemas/tokenRequestBodySchema.ts +9 -8
  408. package/src/api/oauth/services/OAuthClientService.ts +228 -15
  409. package/src/api/organizations/controllers/AdminOrganizationController.ts +8 -8
  410. package/src/api/organizations/entities/organizations.ts +6 -6
  411. package/src/api/organizations/schemas/createOrganizationSchema.ts +5 -5
  412. package/src/api/organizations/schemas/organizationQuerySchema.ts +4 -4
  413. package/src/api/organizations/schemas/updateOrganizationSchema.ts +1 -2
  414. package/src/api/parameters/__tests__/$parameter.spec.ts +229 -50
  415. package/src/api/parameters/controllers/AdminParameterController.ts +9 -12
  416. package/src/api/parameters/entities/parameters.ts +29 -16
  417. package/src/api/parameters/primitives/$parameter.ts +3 -3
  418. package/src/api/parameters/schemas/activateParameterBodySchema.ts +4 -4
  419. package/src/api/parameters/schemas/createParameterVersionBodySchema.ts +15 -15
  420. package/src/api/parameters/schemas/parameterCreatorSummarySchema.ts +7 -7
  421. package/src/api/parameters/schemas/parameterCurrentResponseSchema.ts +7 -7
  422. package/src/api/parameters/schemas/parameterHistoryResponseSchema.ts +3 -3
  423. package/src/api/parameters/schemas/parameterNameParamSchema.ts +2 -3
  424. package/src/api/parameters/schemas/parameterNamesResponseSchema.ts +3 -3
  425. package/src/api/parameters/schemas/parameterResponseSchema.ts +3 -3
  426. package/src/api/parameters/schemas/parameterStatusSchema.ts +2 -2
  427. package/src/api/parameters/schemas/parameterTreeNodeSchema.ts +6 -6
  428. package/src/api/parameters/schemas/parameterVersionParamSchema.ts +5 -6
  429. package/src/api/parameters/schemas/parameterVersionResponseSchema.ts +3 -3
  430. package/src/api/parameters/schemas/rollbackParameterBodySchema.ts +6 -9
  431. package/src/api/parameters/services/ParameterProvider.ts +152 -65
  432. package/src/api/payments/controllers/AdminPaymentController.ts +7 -7
  433. package/src/api/payments/controllers/MockCheckoutController.ts +79 -28
  434. package/src/api/payments/controllers/PaymentController.ts +4 -4
  435. package/src/api/payments/entities/paymentIntents.ts +11 -11
  436. package/src/api/payments/entities/paymentMethods.ts +11 -11
  437. package/src/api/payments/entities/refunds.ts +9 -9
  438. package/src/api/payments/providers/PaymentProvider.ts +18 -0
  439. package/src/api/payments/schemas/intentSchemas.ts +25 -25
  440. package/src/api/payments/schemas/paymentMethodSchemas.ts +3 -3
  441. package/src/api/payments/services/PaymentService.ts +60 -3
  442. package/src/api/subscriptions/__tests__/SubscriptionService.spec.ts +14 -0
  443. package/src/api/subscriptions/controllers/AdminSubscriptionController.ts +11 -11
  444. package/src/api/subscriptions/controllers/SubscriptionController.ts +5 -4
  445. package/src/api/subscriptions/entities/subscriptionEvents.ts +15 -15
  446. package/src/api/subscriptions/entities/subscriptions.ts +22 -22
  447. package/src/api/subscriptions/notifications/SubscriptionNotifications.ts +22 -22
  448. package/src/api/subscriptions/schemas/cancelSubscriptionSchema.ts +4 -4
  449. package/src/api/subscriptions/schemas/changePlanSchema.ts +5 -5
  450. package/src/api/subscriptions/schemas/createSubscriptionSchema.ts +14 -7
  451. package/src/api/subscriptions/schemas/entitlementsSchema.ts +10 -10
  452. package/src/api/subscriptions/schemas/mrrSchema.ts +9 -9
  453. package/src/api/subscriptions/schemas/planDefinitionSchema.ts +21 -21
  454. package/src/api/subscriptions/schemas/planResourceSchema.ts +19 -19
  455. package/src/api/subscriptions/schemas/subscriptionQuerySchema.ts +8 -8
  456. package/src/api/subscriptions/schemas/subscriptionSettingsSchema.ts +7 -7
  457. package/src/api/subscriptions/schemas/subscriptionStatsSchema.ts +17 -17
  458. package/src/api/subscriptions/services/SubscriptionConfig.ts +2 -2
  459. package/src/api/users/__tests__/ApiKeys-integration.spec.ts +11 -11
  460. package/src/api/users/atoms/realmAuthSettingsAtom.ts +111 -119
  461. package/src/api/users/controllers/AdminIdentityController.ts +29 -19
  462. package/src/api/users/controllers/AdminSessionController.ts +37 -27
  463. package/src/api/users/controllers/AdminUserController.ts +75 -53
  464. package/src/api/users/controllers/MySessionController.ts +125 -0
  465. package/src/api/users/controllers/RealmController.ts +9 -10
  466. package/src/api/users/controllers/UserController.ts +55 -55
  467. package/src/api/users/entities/identities.ts +8 -8
  468. package/src/api/users/entities/sessions.ts +17 -17
  469. package/src/api/users/entities/users.ts +17 -17
  470. package/src/api/users/index.ts +3 -0
  471. package/src/api/users/notifications/UserNotifications.ts +76 -24
  472. package/src/api/users/primitives/$realm.ts +12 -26
  473. package/src/api/users/providers/RealmProvider.ts +0 -15
  474. package/src/api/users/schemas/completePasswordResetRequestSchema.ts +8 -12
  475. package/src/api/users/schemas/completeRegistrationRequestSchema.ts +17 -20
  476. package/src/api/users/schemas/createUserSchema.ts +2 -2
  477. package/src/api/users/schemas/identityQuerySchema.ts +4 -4
  478. package/src/api/users/schemas/identityResourceSchema.ts +3 -2
  479. package/src/api/users/schemas/loginSchema.ts +4 -4
  480. package/src/api/users/schemas/passwordResetIntentResponseSchema.ts +6 -8
  481. package/src/api/users/schemas/realmConfigSchema.ts +10 -24
  482. package/src/api/users/schemas/registerQuerySchema.ts +6 -6
  483. package/src/api/users/schemas/registerRequestSchema.ts +21 -43
  484. package/src/api/users/schemas/registerResponseSchema.ts +2 -2
  485. package/src/api/users/schemas/registerSchema.ts +13 -31
  486. package/src/api/users/schemas/registrationIntentResponseSchema.ts +19 -23
  487. package/src/api/users/schemas/resetPasswordSchema.ts +10 -17
  488. package/src/api/users/schemas/sessionQuerySchema.ts +3 -3
  489. package/src/api/users/schemas/sessionResourceSchema.ts +25 -25
  490. package/src/api/users/schemas/updateUserSchema.ts +3 -4
  491. package/src/api/users/schemas/userQuerySchema.ts +7 -7
  492. package/src/api/users/services/RegistrationService.ts +25 -11
  493. package/src/api/users/services/UserService.ts +12 -6
  494. package/src/api/verifications/__tests__/CodeVerification.spec.ts +63 -101
  495. package/src/api/verifications/__tests__/LinkVerification.spec.ts +23 -92
  496. package/src/api/verifications/controllers/VerificationController.ts +13 -27
  497. package/src/api/verifications/entities/verifications.ts +13 -14
  498. package/src/api/verifications/schemas/requestVerificationCodeResponseSchema.ts +17 -14
  499. package/src/api/verifications/schemas/validateVerificationCodeResponseSchema.ts +9 -10
  500. package/src/api/verifications/schemas/verificationSettingsSchema.ts +65 -66
  501. package/src/api/verifications/schemas/verificationTypeEnumSchema.ts +2 -2
  502. package/src/api/verifications/services/VerificationService.ts +12 -0
  503. package/src/background/__tests__/BackgroundTaskProvider.spec.ts +36 -0
  504. package/src/batch/__tests__/$batch.spec.ts +22 -22
  505. package/src/batch/__tests__/startup-buffering.spec.ts +9 -9
  506. package/src/bin/index.ts +1 -1
  507. package/src/bucket/__tests__/TenantScopedBucket.spec.ts +60 -0
  508. package/src/bucket/providers/LocalFileStorageProvider.ts +14 -6
  509. package/src/bucket/providers/MemoryFileStorageProvider.ts +18 -7
  510. package/src/bucket/providers/R2FileStorageProvider.ts +14 -6
  511. package/src/bucket/providers/S3FileStorageProvider.ts +31 -15
  512. package/src/cache/core/primitives/$cache.ts +7 -10
  513. package/src/cache/database/entities/cacheEntries.ts +16 -27
  514. package/src/cache/database/providers/DatabaseCacheProvider.ts +15 -13
  515. package/src/cache/redis/providers/RedisCacheProvider.ts +6 -6
  516. package/src/captcha/providers/TurnstileCaptchaProvider.ts +4 -4
  517. package/src/cli/core/__tests__/BuildCloudflareTask.spec.ts +178 -0
  518. package/src/cli/core/__tests__/BuildDockerTask.spec.ts +0 -2
  519. package/src/cli/core/__tests__/DbCommand.spec.ts +108 -0
  520. package/src/cli/core/atoms/appEntryOptions.ts +5 -5
  521. package/src/cli/core/atoms/buildOptions.ts +76 -76
  522. package/src/cli/core/atoms/changelogOptions.ts +3 -3
  523. package/src/cli/core/atoms/devOptions.ts +3 -3
  524. package/src/cli/core/commands/build.ts +36 -39
  525. package/src/cli/core/commands/db.ts +171 -83
  526. package/src/cli/core/commands/dev.ts +8 -8
  527. package/src/cli/core/commands/gen/changelog.ts +12 -14
  528. package/src/cli/core/commands/gen/env.ts +6 -6
  529. package/src/cli/core/commands/gen/openapi.ts +6 -6
  530. package/src/cli/core/commands/init.ts +28 -33
  531. package/src/cli/core/commands/pack.ts +10 -10
  532. package/src/cli/core/commands/root.ts +7 -8
  533. package/src/cli/core/commands/test.ts +17 -20
  534. package/src/cli/core/tasks/BuildCloudflareTask.ts +103 -230
  535. package/src/cli/core/templates/apiHelloResponseSchemaTs.ts +4 -4
  536. package/src/cli/devtools/atoms/devtoolsOptions.ts +6 -6
  537. package/src/cli/i18n/atoms/i18nOptions.ts +8 -8
  538. package/src/cli/platform/commands/SecretsCommand.ts +24 -25
  539. package/src/cli/platform/commands/platform.ts +40 -46
  540. package/src/cli/platform/index.ts +1 -1
  541. package/src/cli/platform-lib/__tests__/CloudflareAdapter.spec.ts +0 -4
  542. package/src/cli/platform-lib/__tests__/PlatformInspector.spec.ts +10 -3
  543. package/src/cli/platform-lib/__tests__/VercelAdapter.spec.ts +0 -2
  544. package/src/cli/platform-lib/adapters/CloudflareAdapter.ts +13 -14
  545. package/src/cli/platform-lib/adapters/VercelAdapter.ts +6 -11
  546. package/src/cli/platform-lib/atoms/platformOptions.ts +46 -25
  547. package/src/cli/platform-lib/schemas/cloudflare.ts +87 -87
  548. package/src/cli/platform-lib/schemas/platform.ts +51 -51
  549. package/src/cli/platform-lib/schemas/vercel.ts +28 -28
  550. package/src/cli/platform-lib/services/CloudflareApi.ts +5 -5
  551. package/src/cli/platform-lib/services/VercelApi.ts +4 -4
  552. package/src/cli/platform-lib/services/VercelCli.ts +6 -15
  553. package/src/cli/platform-lib/services/WranglerApi.ts +6 -15
  554. package/src/cli/vendor/atoms/vendorOptions.ts +9 -9
  555. package/src/cli/vendor/commands/VendorCommand.ts +11 -12
  556. package/src/command/__tests__/$command.spec.ts +82 -83
  557. package/src/command/__tests__/Asker.spec.ts +6 -13
  558. package/src/command/__tests__/CliProvider.spec.ts +136 -149
  559. package/src/command/__tests__/Runner.spec.ts +86 -110
  560. package/src/command/helpers/Asker.ts +23 -58
  561. package/src/command/helpers/Runner.ts +34 -110
  562. package/src/command/index.ts +4 -9
  563. package/src/command/primitives/$command.ts +10 -10
  564. package/src/command/providers/CliProvider.ts +183 -161
  565. package/src/core/Alepha.ts +62 -13
  566. package/src/core/__tests__/$atom.spec.ts +52 -3
  567. package/src/core/__tests__/$computed.spec.ts +129 -0
  568. package/src/core/__tests__/$env.spec.ts +13 -13
  569. package/src/core/__tests__/$inject.spec.ts +4 -4
  570. package/src/core/__tests__/$module.spec.ts +1 -1
  571. package/src/core/__tests__/Alepha-graph.spec.ts +1 -1
  572. package/src/core/__tests__/Alepha-parseEnv.spec.ts +32 -32
  573. package/src/core/__tests__/Alepha-start.spec.ts +3 -3
  574. package/src/core/__tests__/CodecManager.spec.ts +113 -94
  575. package/src/core/__tests__/KeylessJsonSchemaCodec.spec.ts +138 -138
  576. package/src/core/__tests__/SchemaValidator.spec.ts +43 -44
  577. package/src/core/__tests__/StateManager.persist.browser.spec.ts +87 -0
  578. package/src/core/__tests__/StateManager.spec.ts +423 -0
  579. package/src/core/__tests__/TypeBox-usecases.spec.ts +8 -8
  580. package/src/core/__tests__/TypeProvider.spec.ts +314 -309
  581. package/src/core/__tests__/dump.spec.ts +6 -6
  582. package/src/core/__tests__/pagination.spec.ts +4 -4
  583. package/src/core/__tests__/scoped-after-start.spec.ts +43 -0
  584. package/src/core/errors/TypeBoxError.ts +10 -4
  585. package/src/core/helpers/FileLike.ts +5 -5
  586. package/src/core/helpers/coerceStrings.ts +70 -0
  587. package/src/core/helpers/jsonSchemaToZod.ts +112 -0
  588. package/src/core/index.shared.ts +4 -1
  589. package/src/core/primitives/$atom.ts +95 -27
  590. package/src/core/primitives/$computed.ts +148 -0
  591. package/src/core/primitives/$env.ts +5 -5
  592. package/src/core/primitives/$state.ts +1 -1
  593. package/src/core/providers/AlsProvider.ts +26 -0
  594. package/src/core/providers/CodecManager.ts +1 -2
  595. package/src/core/providers/JsonSchemaCodec.ts +1 -2
  596. package/src/core/providers/KeylessJsonSchemaCodec.ts +82 -57
  597. package/src/core/providers/SchemaValidator.ts +48 -158
  598. package/src/core/providers/StateManager.ts +383 -9
  599. package/src/core/providers/TypeProvider.ts +80 -734
  600. package/src/core/providers/ZodProvider.ts +380 -0
  601. package/src/core/providers/zodAugment.ts +69 -0
  602. package/src/core/schemas/pageQuerySchema.ts +19 -21
  603. package/src/core/schemas/pageSchema.ts +47 -57
  604. package/src/crypto/__tests__/SecretProvider.spec.ts +31 -0
  605. package/src/crypto/providers/SecretProvider.ts +16 -10
  606. package/src/datetime/primitives/$throttle.ts +6 -1
  607. package/src/email/brevo/providers/BrevoEmailProvider.ts +4 -4
  608. package/src/email/cloudflare/providers/CloudflareEmailProvider.ts +6 -6
  609. package/src/email/core/index.ts +7 -2
  610. package/src/email/core/primitives/$email.ts +5 -1
  611. package/src/email/core/providers/LocalEmailProvider.ts +5 -5
  612. package/src/email/smtp/providers/NodemailerEmailProvider.ts +41 -52
  613. package/src/fake/__tests__/FakeProvider.spec.ts +110 -110
  614. package/src/fake/__tests__/keyName.example.ts +21 -21
  615. package/src/fake/__tests__/keyName.spec.ts +41 -41
  616. package/src/fake/__tests__/module.example.ts +8 -8
  617. package/src/fake/providers/FakeProvider.ts +122 -121
  618. package/src/lock/core/__tests__/lock-mutual-exclusion.spec.ts +44 -0
  619. package/src/lock/core/index.ts +1 -0
  620. package/src/lock/core/primitives/$lock.ts +13 -6
  621. package/src/logger/__tests__/CliFormatterProvider.spec.ts +76 -0
  622. package/src/logger/__tests__/Logger.spec.ts +49 -0
  623. package/src/logger/index.ts +25 -18
  624. package/src/logger/providers/CliFormatterProvider.ts +75 -0
  625. package/src/logger/schemas/logEntrySchema.ts +10 -10
  626. package/src/logger/services/Logger.ts +18 -0
  627. package/src/mcp/__tests__/$prompt.spec.ts +21 -23
  628. package/src/mcp/__tests__/$tool.spec.ts +22 -22
  629. package/src/mcp/__tests__/McpServerProvider.spec.ts +11 -11
  630. package/src/mcp/__tests__/StreamableHttpMcpTransport.spec.ts +2 -2
  631. package/src/mcp/__tests__/integration.spec.ts +33 -33
  632. package/src/mcp/primitives/$prompt.ts +11 -9
  633. package/src/mcp/primitives/$tool.ts +27 -86
  634. package/src/mcp/transports/StreamableHttpMcpTransport.ts +7 -7
  635. package/src/orm/__tests__/$repository-tests.ts +133 -27
  636. package/src/orm/__tests__/$repository.spec.ts +23 -0
  637. package/src/orm/__tests__/$transactional-tests.ts +4 -4
  638. package/src/orm/__tests__/ModelBuilder-tests.ts +28 -28
  639. package/src/orm/__tests__/ModelBuilder.spec.ts +124 -106
  640. package/src/orm/__tests__/QueryManager.spec.ts +5 -5
  641. package/src/orm/__tests__/delete-returning-tests.ts +11 -11
  642. package/src/orm/__tests__/deletedAt-tests.ts +3 -3
  643. package/src/orm/__tests__/enums.spec.ts +29 -25
  644. package/src/orm/__tests__/execute-tests.ts +8 -8
  645. package/src/orm/__tests__/fixtures/bigEntitySchema.ts +48 -48
  646. package/src/orm/__tests__/fixtures/userEntitySchema.ts +6 -6
  647. package/src/orm/__tests__/joins-tests.ts +30 -30
  648. package/src/orm/__tests__/organization-tests.ts +105 -3
  649. package/src/orm/__tests__/organization.spec.ts +46 -0
  650. package/src/orm/__tests__/orm-errors.spec.ts +10 -10
  651. package/src/orm/__tests__/orm-next-tests.ts +29 -29
  652. package/src/orm/__tests__/orm-showcase-tests.ts +9 -9
  653. package/src/orm/__tests__/primaryKey.spec.ts +4 -4
  654. package/src/orm/__tests__/query-date-encoding-tests.ts +17 -17
  655. package/src/orm/__tests__/ref-auto-onDelete.spec.ts +14 -14
  656. package/src/orm/__tests__/references.spec.ts +7 -7
  657. package/src/orm/__tests__/security.spec.ts +17 -17
  658. package/src/orm/__tests__/string-operators-tests.ts +5 -5
  659. package/src/orm/__tests__/timestamps-tests.ts +14 -14
  660. package/src/orm/__tests__/validation-tests.ts +5 -5
  661. package/src/orm/core/__tests__/BunSqliteProvider.bun.spec.ts +8 -8
  662. package/src/orm/core/constants/PG_SYMBOLS.ts +13 -1
  663. package/src/orm/core/entities/alephaSequences.ts +8 -8
  664. package/src/orm/core/helpers/pgAttr.ts +4 -4
  665. package/src/orm/core/primitives/$entity.ts +10 -6
  666. package/src/orm/core/providers/DatabaseTypeProvider.ts +46 -53
  667. package/src/orm/core/providers/drivers/BunSqliteProvider.ts +8 -8
  668. package/src/orm/core/providers/drivers/CloudflareD1Provider.ts +3 -5
  669. package/src/orm/core/providers/drivers/NodeSqliteProvider.ts +8 -8
  670. package/src/orm/core/schemas/databaseEnvSchema.ts +4 -4
  671. package/src/orm/core/schemas/insertSchema.ts +14 -18
  672. package/src/orm/core/schemas/legacyIdSchema.ts +2 -2
  673. package/src/orm/core/schemas/updateSchema.ts +10 -16
  674. package/src/orm/core/services/PgRelationManager.ts +2 -2
  675. package/src/orm/core/services/QueryManager.ts +13 -2
  676. package/src/orm/core/services/Repository.ts +88 -33
  677. package/src/orm/core/services/SqliteModelBuilder.ts +38 -45
  678. package/src/orm/postgres/__tests__/BunPostgresProvider.bun.spec.ts +4 -4
  679. package/src/orm/postgres/providers/CloudflareHyperdriveProvider.ts +4 -6
  680. package/src/orm/postgres/schemas/postgresEnvSchema.ts +6 -6
  681. package/src/orm/postgres/services/PostgresModelBuilder.ts +127 -114
  682. package/src/queue/core/__tests__/$consumer.spec.ts +4 -4
  683. package/src/queue/core/__tests__/WorkerProvider.spec.ts +4 -4
  684. package/src/queue/core/__tests__/shared.ts +6 -6
  685. package/src/queue/core/primitives/$consumer.ts +5 -5
  686. package/src/queue/core/primitives/$queue.ts +44 -61
  687. package/src/queue/core/providers/CloudflareQueueProvider.ts +6 -0
  688. package/src/queue/core/providers/WorkerProvider.ts +17 -14
  689. package/src/queue/redis/providers/RedisQueueProvider.ts +3 -3
  690. package/src/react/core/__tests__/ErrorBoundary.browser.spec.tsx +92 -0
  691. package/src/react/core/__tests__/Router.spec.tsx +4 -4
  692. package/src/react/core/__tests__/useComputed.browser.spec.tsx +192 -0
  693. package/src/react/core/__tests__/useQuery.browser.spec.tsx +48 -0
  694. package/src/react/core/__tests__/useSelector.browser.spec.tsx +105 -0
  695. package/src/react/core/__tests__/useStore.browser.spec.tsx +113 -0
  696. package/src/react/core/components/ErrorBoundary.tsx +42 -0
  697. package/src/react/core/hooks/useAction.ts +56 -19
  698. package/src/react/core/hooks/useComputed.ts +91 -0
  699. package/src/react/core/hooks/useSelector.ts +67 -0
  700. package/src/react/core/hooks/useStore.ts +36 -17
  701. package/src/react/core/index.ts +3 -0
  702. package/src/react/core/utils/shallowEqual.ts +36 -0
  703. package/src/react/form/__tests__/FormModel-submit-loading.spec.ts +2 -2
  704. package/src/react/form/__tests__/form-submitting-reactive.browser.spec.tsx +5 -5
  705. package/src/react/form/__tests__/useForm.browser.spec.tsx +54 -54
  706. package/src/react/form/errors/FormValidationError.ts +0 -2
  707. package/src/react/form/hooks/useForm.ts +19 -4
  708. package/src/react/form/hooks/useFormQuerySync.ts +0 -0
  709. package/src/react/form/services/FormModel.ts +67 -47
  710. package/src/react/form/services/parseField.ts +66 -27
  711. package/src/react/i18n/__tests__/Localize.spec.tsx +1 -1
  712. package/src/react/i18n/providers/I18nProvider.ts +2 -2
  713. package/src/react/router/__tests__/$page.browser.spec.tsx +19 -19
  714. package/src/react/router/__tests__/$page.spec.tsx +21 -21
  715. package/src/react/router/__tests__/ReactBrowserProvider.browser.spec.ts +87 -1
  716. package/src/react/router/atoms/ssrManifestAtom.ts +16 -16
  717. package/src/react/router/components/NestedView.tsx +11 -3
  718. package/src/react/router/hooks/useQueryParams.ts +1 -1
  719. package/src/react/router/primitives/$page.ts +2 -2
  720. package/src/react/router/providers/ReactBrowserProvider.ts +64 -13
  721. package/src/react/router/providers/ReactPageProvider.ts +26 -12
  722. package/src/react/router/providers/ReactServerProvider.ts +13 -15
  723. package/src/react/sitemap/__tests__/$sitemap.spec.ts +2 -2
  724. package/src/react/ui/atoms/uiAtom.ts +6 -6
  725. package/src/react/ui/atoms/uiThemeListAtom.ts +7 -7
  726. package/src/react/ui/hooks/useColorMode.ts +11 -4
  727. package/src/react/ui/services/SchemaControl.ts +4 -4
  728. package/src/redis/providers/BunRedisProvider.ts +19 -11
  729. package/src/redis/providers/NodeRedisProvider.ts +3 -3
  730. package/src/scheduler/primitives/$scheduler.ts +21 -8
  731. package/src/security/__tests__/assertRealmScope.spec.ts +29 -0
  732. package/src/security/atoms/currentTenantAtom.ts +6 -6
  733. package/src/security/atoms/currentUserAtom.ts +2 -2
  734. package/src/security/primitives/$issuer.ts +24 -2
  735. package/src/security/providers/JwtProvider.ts +100 -0
  736. package/src/security/providers/SecurityProvider.ts +43 -2
  737. package/src/security/schemas/permissionSchema.ts +19 -19
  738. package/src/security/schemas/roleSchema.ts +22 -28
  739. package/src/security/schemas/userAccountInfoSchema.ts +47 -37
  740. package/src/server/auth/index.ts +0 -3
  741. package/src/server/auth/primitives/$auth.ts +6 -6
  742. package/src/server/auth/primitives/$authApple.ts +10 -10
  743. package/src/server/auth/primitives/$authFacebook.ts +10 -10
  744. package/src/server/auth/primitives/$authFranceConnect.ts +10 -10
  745. package/src/server/auth/primitives/$authGithub.ts +10 -10
  746. package/src/server/auth/primitives/$authGoogle.ts +10 -10
  747. package/src/server/auth/primitives/$authMicrosoft.ts +14 -14
  748. package/src/server/auth/providers/ServerAuthProvider.ts +49 -48
  749. package/src/server/auth/schemas/authenticationProviderSchema.ts +9 -12
  750. package/src/server/auth/schemas/tokenResponseSchema.ts +2 -2
  751. package/src/server/auth/schemas/tokensSchema.ts +16 -16
  752. package/src/server/auth/schemas/userinfoResponseSchema.ts +3 -3
  753. package/src/server/cookies/__tests__/AtomCookieBinding.spec.ts +80 -0
  754. package/src/server/cookies/__tests__/AtomCookiePersistence.browser.spec.ts +169 -0
  755. package/src/server/cookies/__tests__/AtomCookiePersistence.spec.ts +294 -0
  756. package/src/server/cookies/__tests__/ServerCookiesProvider.spec.ts +14 -14
  757. package/src/server/cookies/index.browser.ts +4 -1
  758. package/src/server/cookies/index.ts +8 -1
  759. package/src/server/cookies/primitives/$cookie.browser.ts +1 -1
  760. package/src/server/cookies/primitives/$cookie.ts +16 -0
  761. package/src/server/cookies/providers/AtomCookiePersistence.browser.ts +133 -0
  762. package/src/server/cookies/providers/AtomCookiePersistence.ts +148 -0
  763. package/src/server/cookies/providers/ServerCookiesProvider.ts +13 -5
  764. package/src/server/cookies/services/CookieParser.ts +6 -1
  765. package/src/server/core/__tests__/$action.spec.ts +13 -13
  766. package/src/server/core/__tests__/$middleware.spec.ts +10 -10
  767. package/src/server/core/__tests__/$route.spec.ts +9 -9
  768. package/src/server/core/__tests__/$sse.spec.ts +26 -26
  769. package/src/server/core/__tests__/BunHttpServerProvider.bun.spec.ts +6 -6
  770. package/src/server/core/__tests__/HttpClient.spec.ts +2 -2
  771. package/src/server/core/__tests__/NodeHttpServerProvider.spec.ts +15 -3
  772. package/src/server/core/__tests__/ServerBodyParserProvider.spec.ts +14 -14
  773. package/src/server/core/__tests__/ServerMultipartProvider.spec.ts +33 -33
  774. package/src/server/core/__tests__/ServerRouterProvider-errorHandler.spec.ts +5 -1
  775. package/src/server/core/__tests__/ServerRouterProvider-getRoutes.spec.ts +25 -25
  776. package/src/server/core/__tests__/ServerRouterProvider-serializationError.spec.ts +9 -5
  777. package/src/server/core/__tests__/ServerRouterProvider-validationError.spec.ts +56 -24
  778. package/src/server/core/errors/ValidationError.ts +6 -3
  779. package/src/server/core/helpers/isMultipart.ts +2 -1
  780. package/src/server/core/index.ts +5 -2
  781. package/src/server/core/interfaces/ServerRequest.ts +6 -14
  782. package/src/server/core/primitives/$action.ts +26 -36
  783. package/src/server/core/primitives/$sse.ts +3 -3
  784. package/src/server/core/providers/BunHttpServerProvider.ts +8 -9
  785. package/src/server/core/providers/NodeHttpServerProvider.ts +8 -9
  786. package/src/server/core/providers/ServerBodyParserProvider.ts +20 -12
  787. package/src/server/core/providers/ServerCompressProvider.ts +9 -10
  788. package/src/server/core/providers/ServerHelmetProvider.ts +26 -27
  789. package/src/server/core/providers/ServerMultipartProvider.ts +19 -19
  790. package/src/server/core/providers/ServerRouterProvider.ts +44 -15
  791. package/src/server/core/schemas/errorSchema.ts +20 -25
  792. package/src/server/core/schemas/okSchema.ts +9 -14
  793. package/src/server/core/services/HttpClient.ts +13 -1
  794. package/src/server/core/services/ServerRequestParser.ts +6 -6
  795. package/src/server/cors/providers/ServerCorsProvider.ts +26 -28
  796. package/src/server/health/schemas/healthSchema.ts +6 -6
  797. package/src/server/links/__tests__/$remote.spec.ts +3 -3
  798. package/src/server/links/__tests__/BatchEndpoint.spec.ts +9 -9
  799. package/src/server/links/__tests__/LinkProvider.spec.ts +9 -9
  800. package/src/server/links/__tests__/ServerLinksProvider.spec.ts +23 -23
  801. package/src/server/links/__tests__/fixtures/CrudApp.ts +21 -21
  802. package/src/server/links/atoms/apiLinksAtom.ts +2 -2
  803. package/src/server/links/atoms/linkOptionsAtom.ts +6 -6
  804. package/src/server/links/primitives/$remote.ts +3 -3
  805. package/src/server/links/providers/LinkProvider.ts +3 -3
  806. package/src/server/links/providers/ServerLinksProvider.ts +20 -20
  807. package/src/server/links/schemas/apiLinksResponseSchema.ts +23 -23
  808. package/src/server/proxy/__tests__/$proxy.spec.ts +9 -9
  809. package/src/server/proxy/providers/ServerProxyProvider.ts +5 -0
  810. package/src/server/rate-limit/providers/ServerRateLimitProvider.ts +18 -20
  811. package/src/server/swagger/__tests__/$swagger.spec.ts +91 -94
  812. package/src/server/swagger/__tests__/ui.spec.ts +3 -3
  813. package/src/server/swagger/providers/ServerSwaggerProvider.ts +66 -43
  814. package/src/system/__tests__/NodeShellProvider.spec.ts +46 -0
  815. package/src/system/providers/NodeShellProvider.ts +4 -1
  816. package/src/topic/core/__tests__/$subscriber.spec.ts +4 -4
  817. package/src/topic/core/__tests__/shared.ts +8 -8
  818. package/src/topic/core/primitives/$subscriber.ts +5 -5
  819. package/src/topic/core/primitives/$topic.ts +14 -14
  820. package/src/topic/redis/providers/RedisTopicProvider.ts +3 -3
  821. package/dist/container/core/index.d.ts +0 -236
  822. package/dist/container/core/index.d.ts.map +0 -1
  823. package/dist/container/core/index.js +0 -231
  824. package/dist/container/core/index.js.map +0 -1
  825. package/dist/container/core/index.workerd.js +0 -192
  826. package/dist/container/core/index.workerd.js.map +0 -1
  827. package/src/command/helpers/PrettyAsker.ts +0 -256
  828. package/src/command/helpers/PrettyPrint.ts +0 -332
  829. package/src/container/core/__tests__/$container.spec.ts +0 -83
  830. package/src/container/core/index.ts +0 -50
  831. package/src/container/core/index.workerd.ts +0 -53
  832. package/src/container/core/interfaces/ContainerOptions.ts +0 -69
  833. package/src/container/core/primitives/$container.ts +0 -100
  834. package/src/container/core/providers/CloudflareContainerProvider.ts +0 -70
  835. package/src/container/core/providers/ContainerProvider.ts +0 -92
  836. package/src/container/core/providers/MockContainerProvider.ts +0 -62
  837. package/src/container/core/providers/NodeContainerProvider.ts +0 -53
  838. package/src/core/__tests__/jsonSchemaToTypeBox.spec.ts +0 -771
  839. package/src/core/helpers/jsonSchemaToTypeBox.ts +0 -359
  840. package/src/server/auth/__tests__/authFederationClient.spec.ts +0 -40
  841. package/src/server/auth/__tests__/federationAssertion.spec.ts +0 -146
  842. package/src/server/auth/helpers/federationAssertion.ts +0 -74
  843. package/src/server/auth/primitives/$authFederationBroker.ts +0 -273
  844. package/src/server/auth/primitives/$authFederationClient.ts +0 -89
  845. /package/dist/orm/core/{chunk-B4FMCO8f.js → rolldown-runtime-B4FMCO8f.js} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/mcp/helpers/jsonrpc.ts","../../src/mcp/errors/McpError.ts","../../src/mcp/providers/McpServerProvider.ts","../../src/mcp/primitives/$prompt.ts","../../src/mcp/primitives/$resource.ts","../../src/mcp/primitives/$tool.ts","../../src/mcp/transports/StreamableHttpMcpTransport.ts","../../src/mcp/index.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport type {\n JsonRpcError,\n JsonRpcNotification,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"../interfaces/McpTypes.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const JSONRPC_VERSION = \"2.0\" as const;\n\n/**\n * The latest MCP protocol revision Alepha targets.\n * See {@link SUPPORTED_PROTOCOL_VERSIONS} for the full negotiation list.\n */\nexport const MCP_PROTOCOL_VERSION = \"2025-11-25\" as const;\n\n/**\n * Protocol versions Alepha will accept during `initialize` negotiation,\n * highest preference first. The server echoes back whichever version the\n * client requested if it appears here, otherwise picks the first entry.\n */\nexport const SUPPORTED_PROTOCOL_VERSIONS = [\n \"2025-11-25\",\n \"2025-06-18\",\n \"2025-03-26\",\n \"2024-11-05\",\n] as const;\n\nexport type SupportedProtocolVersion =\n (typeof SUPPORTED_PROTOCOL_VERSIONS)[number];\n\nexport const isSupportedProtocolVersion = (\n v: unknown,\n): v is SupportedProtocolVersion =>\n typeof v === \"string\" &&\n (SUPPORTED_PROTOCOL_VERSIONS as readonly string[]).includes(v);\n\nexport const JsonRpcErrorCodes = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Response Builders\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function createResponse(\n id: string | number,\n result: unknown,\n): JsonRpcResponse {\n return {\n jsonrpc: JSONRPC_VERSION,\n id,\n result,\n };\n}\n\nexport function createErrorResponse(\n id: string | number,\n error: JsonRpcError,\n): JsonRpcResponse {\n return {\n jsonrpc: JSONRPC_VERSION,\n id,\n error,\n };\n}\n\nexport function createNotification(\n method: string,\n params?: Record<string, unknown>,\n): JsonRpcNotification {\n return {\n jsonrpc: JSONRPC_VERSION,\n method,\n params,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Error Builders\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function createParseError(message = \"Parse error\"): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.PARSE_ERROR,\n message,\n };\n}\n\nexport function createInvalidRequestError(\n message = \"Invalid request\",\n): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INVALID_REQUEST,\n message,\n };\n}\n\nexport function createMethodNotFoundError(method: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.METHOD_NOT_FOUND,\n message: `Method not found: ${method}`,\n };\n}\n\nexport function createInvalidParamsError(message: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INVALID_PARAMS,\n message,\n };\n}\n\nexport function createInternalError(message: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INTERNAL_ERROR,\n message,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Message Parsing\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function parseMessage(data: string): JsonRpcRequest {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(data);\n } catch {\n throw new JsonRpcParseError(\"Invalid JSON\");\n }\n\n if (!isValidJsonRpcRequest(parsed)) {\n throw new JsonRpcParseError(\"Invalid JSON-RPC request\");\n }\n\n return parsed;\n}\n\nexport function isValidJsonRpcRequest(value: unknown): value is JsonRpcRequest {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n if (obj.jsonrpc !== JSONRPC_VERSION) {\n return false;\n }\n\n if (typeof obj.method !== \"string\") {\n return false;\n }\n\n if (\n obj.id !== undefined &&\n typeof obj.id !== \"string\" &&\n typeof obj.id !== \"number\"\n ) {\n return false;\n }\n\n if (obj.params !== undefined && typeof obj.params !== \"object\") {\n return false;\n }\n\n return true;\n}\n\nexport function isNotification(request: JsonRpcRequest): boolean {\n return request.id === undefined;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class JsonRpcParseError extends AlephaError {\n name = \"JsonRpcParseError\";\n}\n","import { JsonRpcErrorCodes } from \"../helpers/jsonrpc.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * MCP-specific error codes (application-specific codes in the -32000 to -32099 range).\n */\nexport const McpErrorCodes = {\n UNAUTHORIZED: -32001,\n FORBIDDEN: -32003,\n} as const;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpError extends Error {\n name = \"McpError\";\n code: number;\n\n constructor(\n message: string,\n code: number = JsonRpcErrorCodes.INTERNAL_ERROR,\n ) {\n super(message);\n this.code = code;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpMethodNotFoundError extends McpError {\n name = \"McpMethodNotFoundError\";\n\n constructor(method: string) {\n super(`Method not found: ${method}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpToolNotFoundError extends McpError {\n name = \"McpToolNotFoundError\";\n tool: string;\n\n constructor(tool: string) {\n super(`Tool not found: ${tool}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.tool = tool;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpResourceNotFoundError extends McpError {\n name = \"McpResourceNotFoundError\";\n uri: string;\n\n constructor(uri: string) {\n super(`Resource not found: ${uri}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.uri = uri;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpPromptNotFoundError extends McpError {\n name = \"McpPromptNotFoundError\";\n prompt: string;\n\n constructor(prompt: string) {\n super(`Prompt not found: ${prompt}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.prompt = prompt;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpInvalidParamsError extends McpError {\n name = \"McpInvalidParamsError\";\n\n constructor(message: string) {\n super(message, JsonRpcErrorCodes.INVALID_PARAMS);\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpUnauthorizedError extends McpError {\n name = \"McpUnauthorizedError\";\n\n constructor(message = \"Unauthorized\") {\n super(message, McpErrorCodes.UNAUTHORIZED);\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpForbiddenError extends McpError {\n name = \"McpForbiddenError\";\n\n constructor(message = \"Forbidden\") {\n super(message, McpErrorCodes.FORBIDDEN);\n }\n}\n","import { $inject, Alepha, TypeBoxError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n McpError,\n McpMethodNotFoundError,\n McpPromptNotFoundError,\n McpResourceNotFoundError,\n McpToolNotFoundError,\n} from \"../errors/McpError.ts\";\nimport {\n createErrorResponse,\n createInternalError,\n createResponse,\n isSupportedProtocolVersion,\n MCP_PROTOCOL_VERSION,\n SUPPORTED_PROTOCOL_VERSIONS,\n} from \"../helpers/jsonrpc.ts\";\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpCapabilities,\n McpContent,\n McpContext,\n McpInitializeResult,\n McpPromptDescriptor,\n McpPromptGetResult,\n McpPromptMessage,\n McpResourceContent,\n McpResourceDescriptor,\n McpResourceReadResult,\n McpServerInfo,\n McpToolCallResult,\n McpToolDescriptor,\n} from \"../interfaces/McpTypes.ts\";\nimport type { PromptPrimitive } from \"../primitives/$prompt.ts\";\nimport type { ResourcePrimitive } from \"../primitives/$resource.ts\";\nimport type { ToolPrimitive } from \"../primitives/$tool.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Core MCP server provider that handles protocol messages.\n *\n * This provider maintains registries of tools, resources, and prompts,\n * and routes incoming JSON-RPC requests to the appropriate handlers.\n *\n * It is transport-agnostic - actual communication is handled by\n * transport providers like StdioMcpTransport or SseMcpTransport.\n */\nexport class McpServerProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n\n protected readonly tools = new Map<string, ToolPrimitive<any>>();\n protected readonly resources = new Map<string, ResourcePrimitive>();\n protected readonly prompts = new Map<string, PromptPrimitive<any>>();\n\n protected initialized = false;\n\n /**\n * Protocol version negotiated with the client during `initialize`.\n * Used by transports to validate the `MCP-Protocol-Version` header on\n * subsequent HTTP requests (per spec 2025-06-18+).\n */\n public negotiatedVersion: string = MCP_PROTOCOL_VERSION;\n\n /**\n * Server identity returned during `initialize`. Consumers may override\n * fields directly (e.g. `mcpServer.serverInfo = { name: \"lore-mcp\",\n * version: \"0.20.3\", description: \"...\" }`) — the `description` field\n * is supported per spec 2025-11-25 (minor change #2).\n */\n public serverInfo: McpServerInfo = {\n name: \"alepha-mcp\",\n version: \"1.0.0\",\n };\n\n // -----------------------------------------------------------------------------------------------------------------\n // Registration Methods\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Register a tool with the MCP server.\n */\n public registerTool(tool: ToolPrimitive<any>): void {\n this.log.trace(`Registering MCP tool: ${tool.name}`);\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Register a resource with the MCP server.\n */\n public registerResource(resource: ResourcePrimitive): void {\n this.log.trace(`Registering MCP resource: ${resource.uri}`);\n this.resources.set(resource.uri, resource);\n }\n\n /**\n * Register a prompt with the MCP server.\n */\n public registerPrompt(prompt: PromptPrimitive<any>): void {\n this.log.trace(`Registering MCP prompt: ${prompt.name}`);\n this.prompts.set(prompt.name, prompt);\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Getters\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Get the server capabilities based on registered primitives.\n */\n public getCapabilities(): McpCapabilities {\n return {\n tools: this.tools.size > 0 ? {} : undefined,\n resources: this.resources.size > 0 ? {} : undefined,\n prompts: this.prompts.size > 0 ? {} : undefined,\n };\n }\n\n /**\n * Get all registered tools.\n */\n public getTools(): ToolPrimitive<any>[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Get all registered resources.\n */\n public getResources(): ResourcePrimitive[] {\n return Array.from(this.resources.values());\n }\n\n /**\n * Get all registered prompts.\n */\n public getPrompts(): PromptPrimitive<any>[] {\n return Array.from(this.prompts.values());\n }\n\n /**\n * Get a tool by name.\n */\n public getTool(name: string): ToolPrimitive<any> | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get a resource by URI.\n */\n public getResource(uri: string): ResourcePrimitive | undefined {\n return this.resources.get(uri);\n }\n\n /**\n * Get a prompt by name.\n */\n public getPrompt(name: string): PromptPrimitive<any> | undefined {\n return this.prompts.get(name);\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Message Handling\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Handle an incoming JSON-RPC request.\n *\n * @param request - The parsed JSON-RPC request\n * @param context - Optional context from the transport layer (headers, auth, etc.)\n * @returns The JSON-RPC response, or null for notifications\n */\n public async handleMessage(\n request: JsonRpcRequest,\n context?: McpContext,\n ): Promise<JsonRpcResponse | null> {\n const id = request.id;\n\n // Notifications have no id and expect no response\n if (id === undefined) {\n await this.handleNotification(request);\n return null;\n }\n\n try {\n const result = await this.handleRequest(request, context);\n return createResponse(id, result);\n } catch (error) {\n this.log.error(\"MCP request failed\", error);\n // Preserve error code from McpError instances\n if (error instanceof McpError) {\n return createErrorResponse(id, {\n code: error.code,\n message: error.message,\n });\n }\n return createErrorResponse(\n id,\n createInternalError((error as Error).message),\n );\n }\n }\n\n /**\n * Handle a JSON-RPC request that expects a response.\n */\n protected async handleRequest(\n request: JsonRpcRequest,\n context?: McpContext,\n ): Promise<unknown> {\n const { method, params = {} } = request;\n\n switch (method) {\n case \"initialize\":\n return this.handleInitialize(params);\n case \"ping\":\n return this.handlePing();\n case \"tools/list\":\n return this.handleToolsList();\n case \"tools/call\":\n return this.handleToolsCall(params, context);\n case \"resources/list\":\n return this.handleResourcesList();\n case \"resources/read\":\n return this.handleResourcesRead(params, context);\n case \"prompts/list\":\n return this.handlePromptsList();\n case \"prompts/get\":\n return this.handlePromptsGet(params, context);\n default:\n throw new McpMethodNotFoundError(method);\n }\n }\n\n /**\n * Handle a notification (no response expected).\n */\n protected async handleNotification(request: JsonRpcRequest): Promise<void> {\n const { method } = request;\n\n switch (method) {\n case \"notifications/initialized\":\n this.log.debug(\"MCP client initialized\");\n break;\n case \"notifications/cancelled\":\n this.log.debug(\"MCP request cancelled\", request.params);\n break;\n default:\n this.log.debug(`Unknown MCP notification: ${method}`);\n }\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Protocol Handlers\n // -----------------------------------------------------------------------------------------------------------------\n\n protected handleInitialize(\n params: Record<string, unknown>,\n ): McpInitializeResult {\n const requested = params.protocolVersion;\n // Echo the client's version when supported, otherwise reply with our\n // preferred version (highest entry in SUPPORTED_PROTOCOL_VERSIONS).\n // The client can then decide to retry, downgrade, or disconnect.\n const negotiated = isSupportedProtocolVersion(requested)\n ? requested\n : SUPPORTED_PROTOCOL_VERSIONS[0];\n\n this.log.info(\"MCP client initializing\", {\n clientInfo: params.clientInfo,\n requestedProtocolVersion: requested,\n negotiatedProtocolVersion: negotiated,\n });\n\n this.initialized = true;\n this.negotiatedVersion = negotiated;\n\n return {\n protocolVersion: negotiated,\n capabilities: this.getCapabilities(),\n serverInfo: this.serverInfo,\n };\n }\n\n protected handlePing(): Record<string, never> {\n return {};\n }\n\n protected handleToolsList(): { tools: McpToolDescriptor[] } {\n return {\n tools: Array.from(this.tools.values()).map((t) => t.toDescriptor()),\n };\n }\n\n protected async handleToolsCall(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpToolCallResult> {\n const name = params.name as string;\n const args = (params.arguments ?? {}) as Record<string, unknown>;\n\n const tool = this.tools.get(name);\n if (!tool) {\n // McpToolNotFoundError is intentionally a JSON-RPC protocol error,\n // not a tool execution error — see SEP-1303 (only validation/runtime\n // failures of an existing tool are reported via isError: true).\n throw new McpToolNotFoundError(name);\n }\n\n try {\n const result = await tool.execute(args, context);\n\n // A tool WITHOUT an output schema may return raw MCP content blocks\n // (e.g. an `image` block) instead of JSON — used for binary payloads\n // like attachment previews. Recognized by the CallToolResult shape\n // (`{ content: McpContent[] }`); passed through verbatim. Tools that\n // declare an output schema always go through the structured path\n // below, so a JSON result that happens to carry a `content` array is\n // never mistaken for raw content.\n if (!tool.hasOutputSchema()) {\n const raw = this.asRawToolContent(result);\n if (raw) {\n return raw;\n }\n }\n\n const callResult: McpToolCallResult = {\n content: [\n {\n type: \"text\",\n text:\n typeof result === \"string\"\n ? result\n : JSON.stringify(result ?? null),\n },\n ],\n };\n\n // Spec 2025-06-18: when the tool declares an outputSchema, the server\n // MUST populate `structuredContent` with the validated result. The\n // text-stringified `content` block remains as a back-compat fallback.\n if (tool.hasOutputSchema() && result !== undefined) {\n callResult.structuredContent = result;\n }\n\n return callResult;\n } catch (error) {\n // Spec 2025-11-25 / SEP-1303: input-validation failures (and other\n // tool-runtime errors) are returned as Tool Execution Errors, not\n // JSON-RPC protocol errors, so the model can self-correct.\n // For TypeBox validation errors we surface the failing path so the\n // model knows which argument was malformed.\n if (error instanceof TypeBoxError) {\n const path = error.value?.path || \"/\";\n const message = error.value?.message || error.message;\n return {\n content: [\n {\n type: \"text\",\n text: `Validation error at ${path}: ${message}`,\n },\n ],\n structuredContent: {\n errors: [{ path, message }],\n },\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${(error as Error).message}`,\n },\n ],\n isError: true,\n };\n }\n }\n\n /**\n * Recognize a tool handler's return value as a pre-built MCP tool result —\n * i.e. it already carries a `content` array of content blocks (text, image,\n * audio, resource, resource_link). Returns the normalized\n * {@link McpToolCallResult} when matched, or `undefined` to fall back to the\n * default JSON/text encoding. Only ever consulted for tools that did NOT\n * declare an output schema (see {@link handleToolCall}).\n */\n protected asRawToolContent(result: unknown): McpToolCallResult | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n const candidate = result as {\n content?: unknown;\n isError?: unknown;\n _meta?: unknown;\n };\n if (!Array.isArray(candidate.content) || candidate.content.length === 0) {\n return undefined;\n }\n const allBlocks = candidate.content.every(\n (block): block is McpContent =>\n !!block &&\n typeof block === \"object\" &&\n typeof (block as { type?: unknown }).type === \"string\",\n );\n if (!allBlocks) {\n return undefined;\n }\n return {\n content: candidate.content as McpContent[],\n isError:\n typeof candidate.isError === \"boolean\" ? candidate.isError : undefined,\n _meta:\n candidate._meta && typeof candidate._meta === \"object\"\n ? (candidate._meta as Record<string, unknown>)\n : undefined,\n };\n }\n\n protected handleResourcesList(): { resources: McpResourceDescriptor[] } {\n return {\n resources: Array.from(this.resources.values()).map((r) =>\n r.toDescriptor(),\n ),\n };\n }\n\n protected async handleResourcesRead(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpResourceReadResult> {\n const uri = params.uri as string;\n\n const resource = this.resources.get(uri);\n if (!resource) {\n throw new McpResourceNotFoundError(uri);\n }\n\n const content = await resource.read(context);\n\n const resourceContent: McpResourceContent = {\n uri,\n mimeType: resource.mimeType,\n };\n\n if (content.text !== undefined) {\n resourceContent.text = content.text;\n }\n\n if (content.blob !== undefined) {\n // Convert binary to base64 for transport\n resourceContent.blob = Buffer.from(content.blob).toString(\"base64\");\n }\n\n return {\n contents: [resourceContent],\n };\n }\n\n protected handlePromptsList(): { prompts: McpPromptDescriptor[] } {\n return {\n prompts: Array.from(this.prompts.values()).map((p) => p.toDescriptor()),\n };\n }\n\n protected async handlePromptsGet(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpPromptGetResult> {\n const name = params.name as string;\n const args = (params.arguments ?? {}) as Record<string, string>;\n\n const prompt = this.prompts.get(name);\n if (!prompt) {\n throw new McpPromptNotFoundError(name);\n }\n\n const messages = await prompt.get(args, context);\n\n const mcpMessages: McpPromptMessage[] = messages.map((msg) => ({\n role: msg.role,\n content: {\n type: \"text\" as const,\n text: msg.content,\n },\n }));\n\n return {\n description: prompt.description,\n messages: mcpMessages,\n };\n }\n}\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n t,\n} from \"alepha\";\nimport type {\n McpContext,\n McpIcon,\n McpPromptArgument,\n McpPromptDescriptor,\n PromptHandlerArgs,\n PromptMessage,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP prompt primitive for defining reusable prompt templates.\n *\n * Prompts allow you to define templated messages that can be filled in\n * with arguments at runtime. They're useful for creating consistent\n * interaction patterns.\n *\n * @example\n * ```ts\n * class Prompts {\n * greeting = $prompt({\n * description: \"Generate a personalized greeting\",\n * args: t.object({\n * name: t.text({ description: \"Name of the person to greet\" }),\n * style: t.optional(t.enum([\"formal\", \"casual\"])),\n * }),\n * handler: async ({ args }) => [\n * {\n * role: \"user\",\n * content: args.style === \"formal\"\n * ? `Please greet ${args.name} in a formal manner.`\n * : `Say hi to ${args.name}!`,\n * },\n * ],\n * });\n *\n * codeReview = $prompt({\n * description: \"Request a code review\",\n * args: t.object({\n * code: t.text({ description: \"The code to review\" }),\n * language: t.text({ description: \"Programming language\" }),\n * }),\n * handler: async ({ args }) => [\n * {\n * role: \"user\",\n * content: `Please review this ${args.language} code:\\n\\n${args.code}`,\n * },\n * ],\n * });\n * }\n * ```\n */\nexport const $prompt = <T extends TObject>(\n options: PromptPrimitiveOptions<T>,\n): PromptPrimitive<T> => {\n return createPrimitive(PromptPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface PromptPrimitiveOptions<T extends TObject> {\n /**\n * The name of the prompt.\n *\n * If not provided, defaults to the property key where the prompt is declared.\n *\n * @example \"greeting\"\n * @example \"code-review\"\n */\n name?: string;\n\n /**\n * Human-friendly display title (spec 2025-11-25). Distinct from `name`,\n * which remains the programmatic identifier.\n */\n title?: string;\n\n /**\n * Description of what this prompt does.\n *\n * Helps users understand the purpose of the prompt.\n *\n * @example \"Generate a personalized greeting message\"\n */\n description?: string;\n\n /**\n * Optional icons surfaced in client UIs (spec 2025-11-25 / SEP-973).\n */\n icons?: McpIcon[];\n\n /**\n * TypeBox schema defining the prompt arguments.\n *\n * Each property in the schema becomes an argument that can be\n * filled in when the prompt is used.\n */\n args?: T;\n\n /**\n * Handler function that generates the prompt messages.\n *\n * Receives the validated arguments and returns an array of messages.\n *\n * @param args - Object containing validated arguments\n * @returns Array of prompt messages\n */\n handler: (args: PromptHandlerArgs<T>) => Async<PromptMessage[]>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class PromptPrimitive<T extends TObject> extends Primitive<\n PromptPrimitiveOptions<T>\n> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the prompt.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the description of the prompt.\n */\n public get description(): string | undefined {\n return this.options.description;\n }\n\n protected onInit(): void {\n this.mcpServer.registerPrompt(this);\n }\n\n /**\n * Get the prompt messages with the given arguments.\n *\n * @param rawArgs - Raw arguments to validate and pass to the handler\n * @param context - Optional context from the transport layer\n * @returns Array of prompt messages\n */\n public async get(\n rawArgs: unknown,\n context?: McpContext,\n ): Promise<PromptMessage[]> {\n let args = (rawArgs ?? {}) as Static<T>;\n\n if (this.options.args) {\n args = this.alepha.codec.decode(this.options.args, rawArgs ?? {});\n }\n\n return this.options.handler({ args, context });\n }\n\n /**\n * Convert the prompt to an MCP prompt descriptor for protocol messages.\n */\n public toDescriptor(): McpPromptDescriptor {\n const descriptor: McpPromptDescriptor = {\n name: this.name,\n description: this.description,\n arguments: this.options.args\n ? this.schemaToArguments(this.options.args)\n : [],\n };\n if (this.options.title) descriptor.title = this.options.title;\n if (this.options.icons && this.options.icons.length > 0) {\n descriptor.icons = this.options.icons;\n }\n return descriptor;\n }\n\n /**\n * Convert a TypeBox schema to an array of prompt arguments.\n */\n protected schemaToArguments(schema: TObject): McpPromptArgument[] {\n const args: McpPromptArgument[] = [];\n\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n const prop = propSchema as Record<string, unknown>;\n args.push({\n name,\n description: prop.description as string | undefined,\n required: !t.schema.isOptional(propSchema),\n });\n }\n\n return args;\n }\n}\n\n$prompt[KIND] = PromptPrimitive;\n","import { $inject, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type {\n McpContext,\n McpIcon,\n McpResourceDescriptor,\n ResourceContent,\n ResourceHandler,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP resource primitive for exposing read-only data.\n *\n * Resources represent any kind of data that an LLM might want to read,\n * such as files, database records, API responses, or computed data.\n *\n * **Key Features**\n * - URI-based identification for resources\n * - Support for text and binary content\n * - MIME type specification\n * - Lazy loading via handler function\n *\n * @example\n * ```ts\n * class ProjectResources {\n * readme = $resource({\n * uri: \"file:///readme\",\n * description: \"Project README file\",\n * mimeType: \"text/markdown\",\n * handler: async () => ({\n * text: await fs.readFile(\"README.md\", \"utf-8\"),\n * }),\n * });\n *\n * config = $resource({\n * uri: \"config://app\",\n * name: \"Application Configuration\",\n * mimeType: \"application/json\",\n * handler: async () => ({\n * text: JSON.stringify(this.configService.getConfig()),\n * }),\n * });\n * }\n * ```\n */\nexport const $resource = (\n options: ResourcePrimitiveOptions,\n): ResourcePrimitive => {\n return createPrimitive(ResourcePrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ResourcePrimitiveOptions {\n /**\n * The URI that identifies this resource.\n *\n * URIs should follow a consistent scheme for your application.\n * Common patterns:\n * - `file:///path/to/file` - File system resources\n * - `db://table/id` - Database records\n * - `api://endpoint` - API responses\n * - `config://name` - Configuration values\n *\n * @example \"file:///readme.md\"\n * @example \"db://users/123\"\n */\n uri: string;\n\n /**\n * Human-readable name for the resource.\n *\n * If not provided, defaults to the property key where the resource is declared.\n *\n * @example \"Project README\"\n * @example \"User Profile\"\n */\n name?: string;\n\n /**\n * Human-friendly display title (spec 2025-11-25). Distinct from `name`,\n * which remains the programmatic identifier.\n */\n title?: string;\n\n /**\n * Optional icons surfaced in client UIs (spec 2025-11-25 / SEP-973).\n */\n icons?: McpIcon[];\n\n /**\n * Description of what this resource contains.\n *\n * Helps the LLM understand the purpose and content of the resource.\n *\n * @example \"The main README file for the project\"\n */\n description?: string;\n\n /**\n * MIME type of the resource content.\n *\n * Helps clients understand how to interpret the content.\n *\n * @default \"text/plain\"\n * @example \"text/markdown\"\n * @example \"application/json\"\n */\n mimeType?: string;\n\n /**\n * Handler function that returns the resource content.\n *\n * Called when the resource is read. Can return text or binary content.\n *\n * @returns Resource content with either `text` or `blob` property\n */\n handler: ResourceHandler;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ResourcePrimitive extends Primitive<ResourcePrimitiveOptions> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the resource.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the URI of the resource.\n */\n public get uri(): string {\n return this.options.uri;\n }\n\n /**\n * Returns the description of the resource.\n */\n public get description(): string | undefined {\n return this.options.description;\n }\n\n /**\n * Returns the MIME type of the resource.\n */\n public get mimeType(): string {\n return this.options.mimeType ?? \"text/plain\";\n }\n\n protected onInit(): void {\n this.mcpServer.registerResource(this);\n }\n\n /**\n * Read the resource content.\n *\n * @param context - Optional context from the transport layer\n * @returns The resource content\n */\n public async read(context?: McpContext): Promise<ResourceContent> {\n return this.options.handler({ context });\n }\n\n /**\n * Convert the resource to an MCP resource descriptor for protocol messages.\n */\n public toDescriptor(): McpResourceDescriptor {\n const descriptor: McpResourceDescriptor = {\n uri: this.uri,\n name: this.name,\n description: this.description,\n mimeType: this.mimeType,\n };\n if (this.options.title) descriptor.title = this.options.title;\n if (this.options.icons && this.options.icons.length > 0) {\n descriptor.icons = this.options.icons;\n }\n return descriptor;\n }\n}\n\n$resource[KIND] = ResourcePrimitive;\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type TObject,\n type TSchema,\n t,\n} from \"alepha\";\nimport type {\n McpContext,\n McpIcon,\n McpJsonSchema,\n McpToolAnnotations,\n McpToolDescriptor,\n ToolHandlerArgs,\n ToolHandlerResult,\n ToolPrimitiveSchema,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP tool primitive for defining callable functions.\n *\n * Tools are the primary way for LLMs to interact with external systems through MCP.\n * Each tool has a name, description, typed parameters, and a handler function.\n *\n * **Key Features**\n * - Full TypeScript inference for parameters and results\n * - Automatic schema validation using TypeBox\n * - JSON Schema generation for MCP protocol\n * - Integration with MCP server provider\n *\n * @example\n * ```ts\n * class CalculatorTools {\n * add = $tool({\n * description: \"Add two numbers together\",\n * schema: {\n * params: t.object({\n * a: t.number(),\n * b: t.number(),\n * }),\n * result: t.number(),\n * },\n * handler: async ({ params }) => {\n * return params.a + params.b;\n * },\n * });\n *\n * greet = $tool({\n * description: \"Generate a greeting message\",\n * schema: {\n * params: t.object({\n * name: t.text(),\n * }),\n * result: t.text(),\n * },\n * handler: async ({ params }) => {\n * return `Hello, ${params.name}!`;\n * },\n * });\n * }\n * ```\n */\nexport const $tool = <T extends ToolPrimitiveSchema>(\n options: ToolPrimitiveOptions<T>,\n): ToolPrimitive<T> => {\n return createPrimitive(ToolPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ToolPrimitiveOptions<T extends ToolPrimitiveSchema> {\n /**\n * The name of the tool.\n *\n * If not provided, defaults to the property key where the tool is declared.\n * Names should be descriptive and use kebab-case or snake_case.\n *\n * @example \"calculate-sum\"\n * @example \"get_weather\"\n */\n name?: string;\n\n /**\n * Human-friendly display title (spec 2025-11-25). Distinct from `name`,\n * which remains the programmatic identifier. Clients use `title` in\n * tool palettes / picker UIs.\n *\n * @example \"Search Lore\"\n */\n title?: string;\n\n /**\n * A human-readable description of what the tool does.\n *\n * This description is sent to the LLM to help it understand\n * when and how to use the tool. Be clear and specific.\n *\n * @example \"Calculate the sum of two numbers\"\n * @example \"Retrieve current weather data for a given location\"\n */\n description: string;\n\n /**\n * Behavior hints (spec 2025-03-26+). Clients use these to gate UI prompts\n * (e.g. require confirmation before a tool with `destructiveHint: true`).\n * None are guarantees — they are heuristics for the client, not the model.\n */\n annotations?: McpToolAnnotations;\n\n /**\n * Icons surfaced in client tool palettes / picker UIs (spec 2025-11-25).\n */\n icons?: McpIcon[];\n\n /**\n * TypeBox schema defining the tool's parameters and result type.\n *\n * - **params**: TObject schema for input parameters (optional)\n * - **result**: TSchema for the return value (optional)\n *\n * Schemas provide:\n * - Type inference for handler function\n * - Runtime validation of inputs\n * - JSON Schema generation for MCP protocol\n */\n schema?: T;\n\n /**\n * The handler function that executes when the tool is called.\n *\n * Receives validated parameters and returns the result.\n * Errors thrown here are caught and returned as MCP errors.\n *\n * @param args - Object containing validated params\n * @returns The tool result (can be async)\n */\n handler: (args: ToolHandlerArgs<T>) => Async<ToolHandlerResult<T>>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ToolPrimitive<T extends ToolPrimitiveSchema> extends Primitive<\n ToolPrimitiveOptions<T>\n> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the tool.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the description of the tool.\n */\n public get description(): string {\n return this.options.description;\n }\n\n /**\n * Whether the tool declared a result schema. When true, `tools/call`\n * responses include `structuredContent` populated with the validated\n * result (spec 2025-06-18).\n */\n public hasOutputSchema(): boolean {\n return !!this.options.schema?.result;\n }\n\n protected onInit(): void {\n this.mcpServer.registerTool(this);\n }\n\n /**\n * Execute the tool with the given parameters.\n *\n * @param params - Raw parameters to validate and pass to the handler\n * @param context - Optional context from the transport layer\n * @returns The tool result\n */\n public async execute(\n params: unknown,\n context?: McpContext,\n ): Promise<ToolHandlerResult<T>> {\n let validatedParams: any = params ?? {};\n\n // Validate params using alepha.codec if schema provided\n if (this.options.schema?.params) {\n validatedParams = this.alepha.codec.decode(\n this.options.schema.params,\n validatedParams,\n );\n }\n\n const result = await this.options.handler({\n params: validatedParams,\n context,\n });\n\n // Validate and encode result if schema provided\n if (this.options.schema?.result && result !== undefined) {\n return this.alepha.codec.encode(\n this.options.schema.result,\n result,\n ) as ToolHandlerResult<T>;\n }\n\n return result as ToolHandlerResult<T>;\n }\n\n /**\n * Convert the tool to an MCP tool descriptor for protocol messages.\n *\n * Emits the spec 2025-11-25 surface: `title`, `annotations`, `icons`,\n * and (when `schema.result` is defined) `outputSchema` so the server\n * can populate `structuredContent` on call results.\n */\n public toDescriptor(): McpToolDescriptor {\n const inputSchema: McpJsonSchema = this.options.schema?.params\n ? this.schemaToJsonSchema(this.options.schema.params)\n : { type: \"object\", properties: {}, required: [] };\n\n const descriptor: McpToolDescriptor = {\n name: this.name,\n description: this.description,\n inputSchema,\n };\n\n if (this.options.title) descriptor.title = this.options.title;\n if (this.options.annotations)\n descriptor.annotations = this.options.annotations;\n if (this.options.icons && this.options.icons.length > 0) {\n descriptor.icons = this.options.icons;\n }\n\n // Output schema is emitted when the tool declares `schema.result`,\n // unlocking structured content on tools/call responses.\n if (this.options.schema?.result) {\n const out = this.propertyToJsonSchema(this.options.schema.result);\n // The result schema may be a primitive — wrap so the descriptor\n // value is always a JSON Schema object with `type`.\n descriptor.outputSchema = (\n typeof out === \"object\" && out !== null && \"type\" in out\n ? out\n : { type: \"object\", properties: {}, required: [] }\n ) as McpJsonSchema;\n }\n\n return descriptor;\n }\n\n /**\n * Convert a TypeBox schema to JSON Schema format.\n *\n * Emits the 2020-12 dialect annotation at the root (spec 2025-11-25 /\n * SEP-1613 — JSON Schema 2020-12 is the default dialect for MCP).\n * The TypeBox shapes Alepha emits today are already 2020-12-compatible;\n * this is just the dialect declaration.\n */\n protected schemaToJsonSchema(\n schema: TObject,\n options?: { root?: boolean },\n ): McpJsonSchema {\n const properties: Record<string, unknown> = {};\n const required: string[] = [];\n\n for (const [key, propSchema] of Object.entries(schema.properties)) {\n properties[key] = this.propertyToJsonSchema(propSchema as TSchema);\n\n // Check if property is required (not optional)\n if (!t.schema.isOptional(propSchema as TSchema)) {\n required.push(key);\n }\n }\n\n const result: McpJsonSchema = {\n type: \"object\",\n properties,\n required,\n };\n\n // Annotate the dialect on the root schema only (avoid noise on nested\n // sub-schemas where MCP doesn't expect $schema).\n if (options?.root !== false) {\n result.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n }\n\n return result;\n }\n\n /**\n * Convert a single property schema to JSON Schema format.\n */\n protected propertyToJsonSchema(schema: TSchema): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Check for description on all types\n if (\"description\" in schema) {\n result.description = schema.description;\n }\n\n if (t.schema.isString(schema)) {\n result.type = \"string\";\n if (\"minLength\" in schema) result.minLength = schema.minLength;\n if (\"maxLength\" in schema) result.maxLength = schema.maxLength;\n if (\"pattern\" in schema) result.pattern = schema.pattern;\n if (\"enum\" in schema) result.enum = schema.enum;\n } else if (t.schema.isNumber(schema)) {\n result.type = \"number\";\n if (\"minimum\" in schema) result.minimum = schema.minimum;\n if (\"maximum\" in schema) result.maximum = schema.maximum;\n } else if (t.schema.isInteger(schema)) {\n result.type = \"integer\";\n if (\"minimum\" in schema) result.minimum = schema.minimum;\n if (\"maximum\" in schema) result.maximum = schema.maximum;\n } else if (t.schema.isBoolean(schema)) {\n result.type = \"boolean\";\n } else if (t.schema.isArray(schema)) {\n result.type = \"array\";\n if (\"items\" in schema) {\n result.items = this.propertyToJsonSchema(schema.items as TSchema);\n }\n } else if (t.schema.isObject(schema)) {\n Object.assign(result, this.schemaToJsonSchema(schema, { root: false }));\n } else if (t.schema.isUnsafe(schema) || t.schema.isOptional(schema)) {\n // Handle Unsafe types (like t.enum) and optional wrappers by checking the underlying type property\n const schemaAny = schema as { type?: string; enum?: unknown[] };\n if (schemaAny.type === \"string\") {\n result.type = \"string\";\n if (\"enum\" in schema) result.enum = schema.enum;\n if (\"pattern\" in schema) result.pattern = schema.pattern;\n } else if (schemaAny.type === \"number\") {\n result.type = \"number\";\n } else if (schemaAny.type === \"integer\") {\n result.type = \"integer\";\n } else if (schemaAny.type === \"boolean\") {\n result.type = \"boolean\";\n } else if (schemaAny.type === \"array\") {\n result.type = \"array\";\n } else if (schemaAny.type === \"object\") {\n result.type = \"object\";\n } else {\n // Fallback\n result.type = \"string\";\n }\n } else {\n // Fallback for other types\n result.type = \"string\";\n }\n\n return result;\n }\n}\n\n$tool[KIND] = ToolPrimitive;\n","import { $atom, $inject, $state, t } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { $route } from \"alepha/server\";\nimport {\n createErrorResponse,\n createParseError,\n JsonRpcParseError,\n parseMessage,\n} from \"../helpers/jsonrpc.ts\";\nimport type { McpContext } from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const mcpStreamableHttpOptions = $atom({\n name: \"alepha.mcp.streamableHttp.options\",\n description: \"Configuration options for the MCP Streamable HTTP transport.\",\n schema: t.object({\n /**\n * Path for the MCP endpoint. Single endpoint for both requests and\n * (optional) server-streamed responses, per spec 2025-03-26+.\n */\n path: t.text({ default: \"/mcp\" }),\n /**\n * Allow-list of `Origin` header values accepted on incoming requests.\n * Empty array (default) means \"allow any\". When set, browser-originated\n * requests with a non-matching `Origin` are rejected with 403 Forbidden,\n * blocking DNS-rebinding attacks against localhost MCP servers.\n *\n * Server-to-server callers (no `Origin` header) are always allowed.\n *\n * Spec 2025-11-25, PR #1439.\n */\n allowedOrigins: t.array(t.text(), { default: [] }),\n /**\n * When true, an unauthenticated POST to the MCP endpoint is rejected\n * with `401 Unauthorized` and an RFC 9728 `WWW-Authenticate` challenge\n * instead of being dispatched. MCP clients (Claude, etc.) rely on that\n * challenge to discover the OAuth authorization server.\n *\n * The transport stays OAuth-agnostic: it only knows \"auth is required\".\n * `$realm({ features: { oauth: true } })` flips this on automatically.\n *\n * @default false\n */\n requireAuth: t.boolean({ default: false }),\n /**\n * Path of the RFC 9728 protected-resource metadata document, advertised\n * (as an absolute URL, resolved against the request origin) in the\n * `WWW-Authenticate` challenge emitted when {@link requireAuth} rejects\n * a request.\n */\n resourceMetadataPath: t.text({\n default: \"/.well-known/oauth-protected-resource\",\n }),\n }),\n default: {\n path: \"/mcp\",\n allowedOrigins: [],\n requireAuth: false,\n resourceMetadataPath: \"/.well-known/oauth-protected-resource\",\n },\n});\n\n// Backward-compat alias for the legacy atom name. Prefer\n// `mcpStreamableHttpOptions` going forward; this re-export keeps existing\n// consumer imports compiling and will be removed once they migrate.\nexport const mcpSseOptions = mcpStreamableHttpOptions;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Streamable HTTP transport for MCP communication.\n *\n * Implements the 2025-03-26+ Streamable HTTP transport: a single `/mcp`\n * endpoint that accepts JSON-RPC over POST and returns either\n * `application/json` (single response, the default) or\n * `text/event-stream` (when the server wants to stream multiple messages).\n *\n * Designed for serverless deployment (Cloudflare Workers, etc.) — there is\n * no long-lived GET stream. GET on the endpoint returns 405 Method Not\n * Allowed; clients that want server-initiated push must rely on the POST\n * response stream when the server upgrades to SSE for that particular call.\n *\n * Spec compliance:\n * - 2025-06-18: validates `MCP-Protocol-Version` header on every request\n * after `initialize` against the version negotiated and stored on\n * `McpServerProvider`.\n * - 2025-11-25: rejects requests with a non-allow-listed `Origin` header\n * (PR #1439). See {@link mcpStreamableHttpOptions.allowedOrigins}.\n *\n * @example\n * ```ts\n * import { Alepha, run } from \"alepha\";\n * import { AlephaServer } from \"alepha/server\";\n * import { AlephaMcp, StreamableHttpMcpTransport } from \"alepha/mcp\";\n *\n * class MyTools {\n * // ... tool definitions\n * }\n *\n * run(\n * Alepha.create()\n * .with(AlephaServer)\n * .with(AlephaMcp)\n * .with(StreamableHttpMcpTransport)\n * .with(MyTools)\n * );\n * ```\n */\nexport class StreamableHttpMcpTransport {\n protected readonly log = $logger();\n protected readonly options = $state(mcpStreamableHttpOptions);\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * GET on the MCP endpoint is not supported in this transport. Returning\n * 405 (rather than serving the legacy two-endpoint SSE pattern) is the\n * spec-allowed response for servers that don't offer server-initiated\n * push outside of an active POST.\n */\n notAllowed = $route({\n method: \"GET\",\n path: this.options.path,\n handler: (request) => {\n request.reply.status = 405;\n request.reply.headers.allow = \"POST\";\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: \"Method Not Allowed. Use POST for MCP messages.\",\n });\n },\n });\n\n /**\n * POST endpoint for client-to-server JSON-RPC messages.\n * Returns `application/json` for single responses; tools that need to\n * stream progress would upgrade to `text/event-stream` (deferred until a\n * concrete need exists).\n */\n message = $route({\n method: \"POST\",\n path: this.options.path,\n schema: {\n body: t.json(),\n },\n handler: async (request) => {\n try {\n // Origin allow-list check (spec 2025-11-25 / PR #1439).\n const originRaw = request.headers.origin;\n const origin = Array.isArray(originRaw) ? originRaw[0] : originRaw;\n if (\n origin &&\n this.options.allowedOrigins.length > 0 &&\n !this.options.allowedOrigins.includes(origin)\n ) {\n this.log.warn(\"Rejected MCP request with non-allowed Origin\", {\n origin,\n allowed: this.options.allowedOrigins,\n });\n request.reply.status = 403;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: \"Forbidden: Origin not allowed\",\n });\n return;\n }\n\n // RFC 9728 / MCP auth (spec 2025-06-18+): when the endpoint is\n // OAuth-protected, an unauthenticated request is rejected with 401\n // and a `WWW-Authenticate` challenge pointing at the protected-\n // resource metadata. MCP clients (Claude, etc.) follow that\n // `resource_metadata` URL to discover the authorization server —\n // without it, discovery never starts. The URL MUST be absolute.\n if (this.options.requireAuth && !request.user) {\n const url =\n typeof request.url === \"string\"\n ? new URL(request.url)\n : request.url;\n const resourceMetadataUrl = `${url.protocol}//${url.host}${this.options.resourceMetadataPath}`;\n this.log.debug(\"Rejecting unauthenticated MCP request\", {\n resourceMetadataUrl,\n });\n request.reply.status = 401;\n request.reply.headers[\"www-authenticate\"] =\n `Bearer resource_metadata=\"${resourceMetadataUrl}\"`;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: \"Unauthorized\",\n });\n return;\n }\n\n const body =\n typeof request.body === \"string\"\n ? request.body\n : JSON.stringify(request.body);\n\n this.log.debug(\"MCP request body\", {\n body,\n bodyType: typeof request.body,\n });\n\n const rpcRequest = parseMessage(body);\n\n // Build context from request headers\n const headers = { ...request.headers } as Record<\n string,\n string | string[] | undefined\n >;\n\n // Spec 2025-06-18+: every HTTP request after `initialize` MUST carry\n // an `MCP-Protocol-Version` header matching the negotiated version.\n // Reject mismatches with 400 so the client doesn't silently drift.\n if (rpcRequest.method !== \"initialize\") {\n const headerRaw = headers[\"mcp-protocol-version\"];\n const headerVersion = Array.isArray(headerRaw)\n ? headerRaw[0]\n : headerRaw;\n if (\n headerVersion &&\n headerVersion !== this.mcpServer.negotiatedVersion\n ) {\n this.log.warn(\"MCP-Protocol-Version header mismatch\", {\n header: headerVersion,\n negotiated: this.mcpServer.negotiatedVersion,\n });\n request.reply.status = 400;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: `MCP-Protocol-Version mismatch: expected ${this.mcpServer.negotiatedVersion}, got ${headerVersion}`,\n });\n return;\n }\n }\n\n const context: McpContext = { headers };\n\n const response = await this.mcpServer.handleMessage(\n rpcRequest,\n context,\n );\n\n if (response) {\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify(response);\n } else {\n request.reply.status = 204;\n }\n } catch (error) {\n if (error instanceof JsonRpcParseError) {\n request.reply.status = 400;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify(\n createErrorResponse(0, createParseError(error.message)),\n );\n } else {\n this.log.error(\"Failed to process MCP message\", error);\n request.reply.status = 500;\n request.reply.body = JSON.stringify({\n error: (error as Error).message,\n });\n }\n }\n },\n });\n}\n\n/**\n * @deprecated Use {@link StreamableHttpMcpTransport}. The 2024-11-05\n * two-endpoint HTTP+SSE pattern was replaced by Streamable HTTP in spec\n * 2025-03-26. This alias is preserved for one release to ease migration.\n */\nexport const SseMcpTransport = StreamableHttpMcpTransport;\n","import { $module } from \"alepha\";\nimport { $prompt } from \"./primitives/$prompt.ts\";\nimport { $resource } from \"./primitives/$resource.ts\";\nimport { $tool } from \"./primitives/$tool.ts\";\nimport { McpServerProvider } from \"./providers/McpServerProvider.ts\";\nimport { StreamableHttpMcpTransport } from \"./transports/StreamableHttpMcpTransport.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport {\n McpError,\n McpErrorCodes,\n McpForbiddenError,\n McpInvalidParamsError,\n McpMethodNotFoundError,\n McpPromptNotFoundError,\n McpResourceNotFoundError,\n McpToolNotFoundError,\n McpUnauthorizedError,\n} from \"./errors/McpError.ts\";\nexport {\n createErrorResponse,\n createInternalError,\n createInvalidParamsError,\n createInvalidRequestError,\n createMethodNotFoundError,\n createNotification,\n createParseError,\n createResponse,\n isNotification,\n isSupportedProtocolVersion,\n isValidJsonRpcRequest,\n JSONRPC_VERSION,\n JsonRpcErrorCodes,\n JsonRpcParseError,\n MCP_PROTOCOL_VERSION,\n parseMessage,\n SUPPORTED_PROTOCOL_VERSIONS,\n type SupportedProtocolVersion,\n} from \"./helpers/jsonrpc.ts\";\nexport type {\n JsonRpcError,\n JsonRpcNotification,\n // JSON-RPC types\n JsonRpcRequest,\n JsonRpcResponse,\n // MCP protocol types\n McpCapabilities,\n McpClientInfo,\n McpContent,\n // Context type for auth/headers\n McpContext,\n McpInitializeParams,\n McpInitializeResult,\n McpJsonSchema,\n McpPromptArgument,\n McpPromptContent,\n // Prompt types\n McpPromptDescriptor,\n McpPromptGetParams,\n McpPromptGetResult,\n McpPromptMessage,\n McpResourceContent,\n // Resource types\n McpResourceDescriptor,\n McpResourceReadParams,\n McpResourceReadResult,\n McpServerInfo,\n McpToolCallParams,\n McpToolCallResult,\n // Tool types\n McpToolDescriptor,\n PromptHandler,\n PromptHandlerArgs,\n PromptMessage,\n ResourceContent,\n ResourceHandler,\n ResourceHandlerArgs,\n ToolHandler,\n ToolHandlerArgs,\n ToolHandlerResult,\n // Handler types\n ToolPrimitiveSchema,\n} from \"./interfaces/McpTypes.ts\";\nexport type { PromptPrimitiveOptions } from \"./primitives/$prompt.ts\";\nexport { $prompt, PromptPrimitive } from \"./primitives/$prompt.ts\";\nexport type { ResourcePrimitiveOptions } from \"./primitives/$resource.ts\";\nexport { $resource, ResourcePrimitive } from \"./primitives/$resource.ts\";\nexport type { ToolPrimitiveOptions } from \"./primitives/$tool.ts\";\nexport { $tool, ToolPrimitive } from \"./primitives/$tool.ts\";\nexport { McpServerProvider } from \"./providers/McpServerProvider.ts\";\nexport {\n mcpSseOptions,\n mcpStreamableHttpOptions,\n SseMcpTransport,\n StreamableHttpMcpTransport,\n} from \"./transports/StreamableHttpMcpTransport.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Model Context Protocol for AI tool integration.\n *\n * **Features:**\n * - MCP resource definitions\n * - MCP tool definitions\n * - MCP prompt definitions\n * - JSON-RPC protocol\n * - Streamable HTTP transport (spec 2025-03-26+)\n *\n * @module alepha.mcp\n */\nexport const AlephaMcp = $module({\n name: \"alepha.mcp\",\n primitives: [$tool, $resource, $prompt],\n services: [McpServerProvider],\n // Transports are opt-in — user wires the one(s) they need via alepha.with(StreamableHttpMcpTransport).\n variants: [StreamableHttpMcpTransport],\n});\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/mcp/helpers/jsonrpc.ts","../../src/mcp/errors/McpError.ts","../../src/mcp/providers/McpServerProvider.ts","../../src/mcp/primitives/$prompt.ts","../../src/mcp/primitives/$resource.ts","../../src/mcp/primitives/$tool.ts","../../src/mcp/transports/StreamableHttpMcpTransport.ts","../../src/mcp/index.ts"],"sourcesContent":["import { AlephaError } from \"alepha\";\nimport type {\n JsonRpcError,\n JsonRpcNotification,\n JsonRpcRequest,\n JsonRpcResponse,\n} from \"../interfaces/McpTypes.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const JSONRPC_VERSION = \"2.0\" as const;\n\n/**\n * The latest MCP protocol revision Alepha targets.\n * See {@link SUPPORTED_PROTOCOL_VERSIONS} for the full negotiation list.\n */\nexport const MCP_PROTOCOL_VERSION = \"2025-11-25\" as const;\n\n/**\n * Protocol versions Alepha will accept during `initialize` negotiation,\n * highest preference first. The server echoes back whichever version the\n * client requested if it appears here, otherwise picks the first entry.\n */\nexport const SUPPORTED_PROTOCOL_VERSIONS = [\n \"2025-11-25\",\n \"2025-06-18\",\n \"2025-03-26\",\n \"2024-11-05\",\n] as const;\n\nexport type SupportedProtocolVersion =\n (typeof SUPPORTED_PROTOCOL_VERSIONS)[number];\n\nexport const isSupportedProtocolVersion = (\n v: unknown,\n): v is SupportedProtocolVersion =>\n typeof v === \"string\" &&\n (SUPPORTED_PROTOCOL_VERSIONS as readonly string[]).includes(v);\n\nexport const JsonRpcErrorCodes = {\n PARSE_ERROR: -32700,\n INVALID_REQUEST: -32600,\n METHOD_NOT_FOUND: -32601,\n INVALID_PARAMS: -32602,\n INTERNAL_ERROR: -32603,\n} as const;\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Response Builders\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function createResponse(\n id: string | number,\n result: unknown,\n): JsonRpcResponse {\n return {\n jsonrpc: JSONRPC_VERSION,\n id,\n result,\n };\n}\n\nexport function createErrorResponse(\n id: string | number,\n error: JsonRpcError,\n): JsonRpcResponse {\n return {\n jsonrpc: JSONRPC_VERSION,\n id,\n error,\n };\n}\n\nexport function createNotification(\n method: string,\n params?: Record<string, unknown>,\n): JsonRpcNotification {\n return {\n jsonrpc: JSONRPC_VERSION,\n method,\n params,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Error Builders\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function createParseError(message = \"Parse error\"): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.PARSE_ERROR,\n message,\n };\n}\n\nexport function createInvalidRequestError(\n message = \"Invalid request\",\n): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INVALID_REQUEST,\n message,\n };\n}\n\nexport function createMethodNotFoundError(method: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.METHOD_NOT_FOUND,\n message: `Method not found: ${method}`,\n };\n}\n\nexport function createInvalidParamsError(message: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INVALID_PARAMS,\n message,\n };\n}\n\nexport function createInternalError(message: string): JsonRpcError {\n return {\n code: JsonRpcErrorCodes.INTERNAL_ERROR,\n message,\n };\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Message Parsing\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport function parseMessage(data: string): JsonRpcRequest {\n let parsed: unknown;\n\n try {\n parsed = JSON.parse(data);\n } catch {\n throw new JsonRpcParseError(\"Invalid JSON\");\n }\n\n if (!isValidJsonRpcRequest(parsed)) {\n throw new JsonRpcParseError(\"Invalid JSON-RPC request\");\n }\n\n return parsed;\n}\n\nexport function isValidJsonRpcRequest(value: unknown): value is JsonRpcRequest {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const obj = value as Record<string, unknown>;\n\n if (obj.jsonrpc !== JSONRPC_VERSION) {\n return false;\n }\n\n if (typeof obj.method !== \"string\") {\n return false;\n }\n\n if (\n obj.id !== undefined &&\n typeof obj.id !== \"string\" &&\n typeof obj.id !== \"number\"\n ) {\n return false;\n }\n\n if (obj.params !== undefined && typeof obj.params !== \"object\") {\n return false;\n }\n\n return true;\n}\n\nexport function isNotification(request: JsonRpcRequest): boolean {\n return request.id === undefined;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n// Errors\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class JsonRpcParseError extends AlephaError {\n name = \"JsonRpcParseError\";\n}\n","import { JsonRpcErrorCodes } from \"../helpers/jsonrpc.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * MCP-specific error codes (application-specific codes in the -32000 to -32099 range).\n */\nexport const McpErrorCodes = {\n UNAUTHORIZED: -32001,\n FORBIDDEN: -32003,\n} as const;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpError extends Error {\n name = \"McpError\";\n code: number;\n\n constructor(\n message: string,\n code: number = JsonRpcErrorCodes.INTERNAL_ERROR,\n ) {\n super(message);\n this.code = code;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpMethodNotFoundError extends McpError {\n name = \"McpMethodNotFoundError\";\n\n constructor(method: string) {\n super(`Method not found: ${method}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpToolNotFoundError extends McpError {\n name = \"McpToolNotFoundError\";\n tool: string;\n\n constructor(tool: string) {\n super(`Tool not found: ${tool}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.tool = tool;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpResourceNotFoundError extends McpError {\n name = \"McpResourceNotFoundError\";\n uri: string;\n\n constructor(uri: string) {\n super(`Resource not found: ${uri}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.uri = uri;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpPromptNotFoundError extends McpError {\n name = \"McpPromptNotFoundError\";\n prompt: string;\n\n constructor(prompt: string) {\n super(`Prompt not found: ${prompt}`, JsonRpcErrorCodes.METHOD_NOT_FOUND);\n this.prompt = prompt;\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpInvalidParamsError extends McpError {\n name = \"McpInvalidParamsError\";\n\n constructor(message: string) {\n super(message, JsonRpcErrorCodes.INVALID_PARAMS);\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpUnauthorizedError extends McpError {\n name = \"McpUnauthorizedError\";\n\n constructor(message = \"Unauthorized\") {\n super(message, McpErrorCodes.UNAUTHORIZED);\n }\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class McpForbiddenError extends McpError {\n name = \"McpForbiddenError\";\n\n constructor(message = \"Forbidden\") {\n super(message, McpErrorCodes.FORBIDDEN);\n }\n}\n","import { $inject, Alepha, TypeBoxError } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport {\n McpError,\n McpMethodNotFoundError,\n McpPromptNotFoundError,\n McpResourceNotFoundError,\n McpToolNotFoundError,\n} from \"../errors/McpError.ts\";\nimport {\n createErrorResponse,\n createInternalError,\n createResponse,\n isSupportedProtocolVersion,\n MCP_PROTOCOL_VERSION,\n SUPPORTED_PROTOCOL_VERSIONS,\n} from \"../helpers/jsonrpc.ts\";\nimport type {\n JsonRpcRequest,\n JsonRpcResponse,\n McpCapabilities,\n McpContent,\n McpContext,\n McpInitializeResult,\n McpPromptDescriptor,\n McpPromptGetResult,\n McpPromptMessage,\n McpResourceContent,\n McpResourceDescriptor,\n McpResourceReadResult,\n McpServerInfo,\n McpToolCallResult,\n McpToolDescriptor,\n} from \"../interfaces/McpTypes.ts\";\nimport type { PromptPrimitive } from \"../primitives/$prompt.ts\";\nimport type { ResourcePrimitive } from \"../primitives/$resource.ts\";\nimport type { ToolPrimitive } from \"../primitives/$tool.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Core MCP server provider that handles protocol messages.\n *\n * This provider maintains registries of tools, resources, and prompts,\n * and routes incoming JSON-RPC requests to the appropriate handlers.\n *\n * It is transport-agnostic - actual communication is handled by\n * transport providers like StdioMcpTransport or SseMcpTransport.\n */\nexport class McpServerProvider {\n protected readonly log = $logger();\n protected readonly alepha = $inject(Alepha);\n\n protected readonly tools = new Map<string, ToolPrimitive<any>>();\n protected readonly resources = new Map<string, ResourcePrimitive>();\n protected readonly prompts = new Map<string, PromptPrimitive<any>>();\n\n protected initialized = false;\n\n /**\n * Protocol version negotiated with the client during `initialize`.\n * Used by transports to validate the `MCP-Protocol-Version` header on\n * subsequent HTTP requests (per spec 2025-06-18+).\n */\n public negotiatedVersion: string = MCP_PROTOCOL_VERSION;\n\n /**\n * Server identity returned during `initialize`. Consumers may override\n * fields directly (e.g. `mcpServer.serverInfo = { name: \"lore-mcp\",\n * version: \"0.20.3\", description: \"...\" }`) — the `description` field\n * is supported per spec 2025-11-25 (minor change #2).\n */\n public serverInfo: McpServerInfo = {\n name: \"alepha-mcp\",\n version: \"1.0.0\",\n };\n\n // -----------------------------------------------------------------------------------------------------------------\n // Registration Methods\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Register a tool with the MCP server.\n */\n public registerTool(tool: ToolPrimitive<any>): void {\n this.log.trace(`Registering MCP tool: ${tool.name}`);\n this.tools.set(tool.name, tool);\n }\n\n /**\n * Register a resource with the MCP server.\n */\n public registerResource(resource: ResourcePrimitive): void {\n this.log.trace(`Registering MCP resource: ${resource.uri}`);\n this.resources.set(resource.uri, resource);\n }\n\n /**\n * Register a prompt with the MCP server.\n */\n public registerPrompt(prompt: PromptPrimitive<any>): void {\n this.log.trace(`Registering MCP prompt: ${prompt.name}`);\n this.prompts.set(prompt.name, prompt);\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Getters\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Get the server capabilities based on registered primitives.\n */\n public getCapabilities(): McpCapabilities {\n return {\n tools: this.tools.size > 0 ? {} : undefined,\n resources: this.resources.size > 0 ? {} : undefined,\n prompts: this.prompts.size > 0 ? {} : undefined,\n };\n }\n\n /**\n * Get all registered tools.\n */\n public getTools(): ToolPrimitive<any>[] {\n return Array.from(this.tools.values());\n }\n\n /**\n * Get all registered resources.\n */\n public getResources(): ResourcePrimitive[] {\n return Array.from(this.resources.values());\n }\n\n /**\n * Get all registered prompts.\n */\n public getPrompts(): PromptPrimitive<any>[] {\n return Array.from(this.prompts.values());\n }\n\n /**\n * Get a tool by name.\n */\n public getTool(name: string): ToolPrimitive<any> | undefined {\n return this.tools.get(name);\n }\n\n /**\n * Get a resource by URI.\n */\n public getResource(uri: string): ResourcePrimitive | undefined {\n return this.resources.get(uri);\n }\n\n /**\n * Get a prompt by name.\n */\n public getPrompt(name: string): PromptPrimitive<any> | undefined {\n return this.prompts.get(name);\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Message Handling\n // -----------------------------------------------------------------------------------------------------------------\n\n /**\n * Handle an incoming JSON-RPC request.\n *\n * @param request - The parsed JSON-RPC request\n * @param context - Optional context from the transport layer (headers, auth, etc.)\n * @returns The JSON-RPC response, or null for notifications\n */\n public async handleMessage(\n request: JsonRpcRequest,\n context?: McpContext,\n ): Promise<JsonRpcResponse | null> {\n const id = request.id;\n\n // Notifications have no id and expect no response\n if (id === undefined) {\n await this.handleNotification(request);\n return null;\n }\n\n try {\n const result = await this.handleRequest(request, context);\n return createResponse(id, result);\n } catch (error) {\n this.log.error(\"MCP request failed\", error);\n // Preserve error code from McpError instances\n if (error instanceof McpError) {\n return createErrorResponse(id, {\n code: error.code,\n message: error.message,\n });\n }\n return createErrorResponse(\n id,\n createInternalError((error as Error).message),\n );\n }\n }\n\n /**\n * Handle a JSON-RPC request that expects a response.\n */\n protected async handleRequest(\n request: JsonRpcRequest,\n context?: McpContext,\n ): Promise<unknown> {\n const { method, params = {} } = request;\n\n switch (method) {\n case \"initialize\":\n return this.handleInitialize(params);\n case \"ping\":\n return this.handlePing();\n case \"tools/list\":\n return this.handleToolsList();\n case \"tools/call\":\n return this.handleToolsCall(params, context);\n case \"resources/list\":\n return this.handleResourcesList();\n case \"resources/read\":\n return this.handleResourcesRead(params, context);\n case \"prompts/list\":\n return this.handlePromptsList();\n case \"prompts/get\":\n return this.handlePromptsGet(params, context);\n default:\n throw new McpMethodNotFoundError(method);\n }\n }\n\n /**\n * Handle a notification (no response expected).\n */\n protected async handleNotification(request: JsonRpcRequest): Promise<void> {\n const { method } = request;\n\n switch (method) {\n case \"notifications/initialized\":\n this.log.debug(\"MCP client initialized\");\n break;\n case \"notifications/cancelled\":\n this.log.debug(\"MCP request cancelled\", request.params);\n break;\n default:\n this.log.debug(`Unknown MCP notification: ${method}`);\n }\n }\n\n // -----------------------------------------------------------------------------------------------------------------\n // Protocol Handlers\n // -----------------------------------------------------------------------------------------------------------------\n\n protected handleInitialize(\n params: Record<string, unknown>,\n ): McpInitializeResult {\n const requested = params.protocolVersion;\n // Echo the client's version when supported, otherwise reply with our\n // preferred version (highest entry in SUPPORTED_PROTOCOL_VERSIONS).\n // The client can then decide to retry, downgrade, or disconnect.\n const negotiated = isSupportedProtocolVersion(requested)\n ? requested\n : SUPPORTED_PROTOCOL_VERSIONS[0];\n\n this.log.info(\"MCP client initializing\", {\n clientInfo: params.clientInfo,\n requestedProtocolVersion: requested,\n negotiatedProtocolVersion: negotiated,\n });\n\n this.initialized = true;\n this.negotiatedVersion = negotiated;\n\n return {\n protocolVersion: negotiated,\n capabilities: this.getCapabilities(),\n serverInfo: this.serverInfo,\n };\n }\n\n protected handlePing(): Record<string, never> {\n return {};\n }\n\n protected handleToolsList(): { tools: McpToolDescriptor[] } {\n return {\n tools: Array.from(this.tools.values()).map((t) => t.toDescriptor()),\n };\n }\n\n protected async handleToolsCall(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpToolCallResult> {\n const name = params.name as string;\n const args = (params.arguments ?? {}) as Record<string, unknown>;\n\n const tool = this.tools.get(name);\n if (!tool) {\n // McpToolNotFoundError is intentionally a JSON-RPC protocol error,\n // not a tool execution error — see SEP-1303 (only validation/runtime\n // failures of an existing tool are reported via isError: true).\n throw new McpToolNotFoundError(name);\n }\n\n try {\n const result = await tool.execute(args, context);\n\n // A tool WITHOUT an output schema may return raw MCP content blocks\n // (e.g. an `image` block) instead of JSON — used for binary payloads\n // like attachment previews. Recognized by the CallToolResult shape\n // (`{ content: McpContent[] }`); passed through verbatim. Tools that\n // declare an output schema always go through the structured path\n // below, so a JSON result that happens to carry a `content` array is\n // never mistaken for raw content.\n if (!tool.hasOutputSchema()) {\n const raw = this.asRawToolContent(result);\n if (raw) {\n return raw;\n }\n }\n\n const callResult: McpToolCallResult = {\n content: [\n {\n type: \"text\",\n text:\n typeof result === \"string\"\n ? result\n : JSON.stringify(result ?? null),\n },\n ],\n };\n\n // Spec 2025-06-18: when the tool declares an outputSchema, the server\n // MUST populate `structuredContent` with the validated result. The\n // text-stringified `content` block remains as a back-compat fallback.\n if (tool.hasOutputSchema() && result !== undefined) {\n callResult.structuredContent = result;\n }\n\n return callResult;\n } catch (error) {\n // Spec 2025-11-25 / SEP-1303: input-validation failures (and other\n // tool-runtime errors) are returned as Tool Execution Errors, not\n // JSON-RPC protocol errors, so the model can self-correct.\n // For TypeBox validation errors we surface the failing path so the\n // model knows which argument was malformed.\n if (error instanceof TypeBoxError) {\n const path = error.value?.path || \"/\";\n const message = error.value?.message || error.message;\n return {\n content: [\n {\n type: \"text\",\n text: `Validation error at ${path}: ${message}`,\n },\n ],\n structuredContent: {\n errors: [{ path, message }],\n },\n isError: true,\n };\n }\n\n return {\n content: [\n {\n type: \"text\",\n text: `Error: ${(error as Error).message}`,\n },\n ],\n isError: true,\n };\n }\n }\n\n /**\n * Recognize a tool handler's return value as a pre-built MCP tool result —\n * i.e. it already carries a `content` array of content blocks (text, image,\n * audio, resource, resource_link). Returns the normalized\n * {@link McpToolCallResult} when matched, or `undefined` to fall back to the\n * default JSON/text encoding. Only ever consulted for tools that did NOT\n * declare an output schema (see {@link handleToolCall}).\n */\n protected asRawToolContent(result: unknown): McpToolCallResult | undefined {\n if (!result || typeof result !== \"object\") {\n return undefined;\n }\n const candidate = result as {\n content?: unknown;\n isError?: unknown;\n _meta?: unknown;\n };\n if (!Array.isArray(candidate.content) || candidate.content.length === 0) {\n return undefined;\n }\n const allBlocks = candidate.content.every(\n (block): block is McpContent =>\n !!block &&\n typeof block === \"object\" &&\n typeof (block as { type?: unknown }).type === \"string\",\n );\n if (!allBlocks) {\n return undefined;\n }\n return {\n content: candidate.content as McpContent[],\n isError:\n typeof candidate.isError === \"boolean\" ? candidate.isError : undefined,\n _meta:\n candidate._meta && typeof candidate._meta === \"object\"\n ? (candidate._meta as Record<string, unknown>)\n : undefined,\n };\n }\n\n protected handleResourcesList(): { resources: McpResourceDescriptor[] } {\n return {\n resources: Array.from(this.resources.values()).map((r) =>\n r.toDescriptor(),\n ),\n };\n }\n\n protected async handleResourcesRead(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpResourceReadResult> {\n const uri = params.uri as string;\n\n const resource = this.resources.get(uri);\n if (!resource) {\n throw new McpResourceNotFoundError(uri);\n }\n\n const content = await resource.read(context);\n\n const resourceContent: McpResourceContent = {\n uri,\n mimeType: resource.mimeType,\n };\n\n if (content.text !== undefined) {\n resourceContent.text = content.text;\n }\n\n if (content.blob !== undefined) {\n // Convert binary to base64 for transport\n resourceContent.blob = Buffer.from(content.blob).toString(\"base64\");\n }\n\n return {\n contents: [resourceContent],\n };\n }\n\n protected handlePromptsList(): { prompts: McpPromptDescriptor[] } {\n return {\n prompts: Array.from(this.prompts.values()).map((p) => p.toDescriptor()),\n };\n }\n\n protected async handlePromptsGet(\n params: Record<string, unknown>,\n context?: McpContext,\n ): Promise<McpPromptGetResult> {\n const name = params.name as string;\n const args = (params.arguments ?? {}) as Record<string, string>;\n\n const prompt = this.prompts.get(name);\n if (!prompt) {\n throw new McpPromptNotFoundError(name);\n }\n\n const messages = await prompt.get(args, context);\n\n const mcpMessages: McpPromptMessage[] = messages.map((msg) => ({\n role: msg.role,\n content: {\n type: \"text\" as const,\n text: msg.content,\n },\n }));\n\n return {\n description: prompt.description,\n messages: mcpMessages,\n };\n }\n}\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type Static,\n type TObject,\n z,\n} from \"alepha\";\nimport type {\n McpContext,\n McpIcon,\n McpPromptArgument,\n McpPromptDescriptor,\n PromptHandlerArgs,\n PromptMessage,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP prompt primitive for defining reusable prompt templates.\n *\n * Prompts allow you to define templated messages that can be filled in\n * with arguments at runtime. They're useful for creating consistent\n * interaction patterns.\n *\n * @example\n * ```ts\n * class Prompts {\n * greeting = $prompt({\n * description: \"Generate a personalized greeting\",\n * args: z.object({\n * name: z.text({ description: \"Name of the person to greet\" }),\n * style: z.enum([\"formal\", \"casual\"]).optional(),\n * }),\n * handler: async ({ args }) => [\n * {\n * role: \"user\",\n * content: args.style === \"formal\"\n * ? `Please greet ${args.name} in a formal manner.`\n * : `Say hi to ${args.name}!`,\n * },\n * ],\n * });\n *\n * codeReview = $prompt({\n * description: \"Request a code review\",\n * args: z.object({\n * code: z.text({ description: \"The code to review\" }),\n * language: z.text({ description: \"Programming language\" }),\n * }),\n * handler: async ({ args }) => [\n * {\n * role: \"user\",\n * content: `Please review this ${args.language} code:\\n\\n${args.code}`,\n * },\n * ],\n * });\n * }\n * ```\n */\nexport const $prompt = <T extends TObject>(\n options: PromptPrimitiveOptions<T>,\n): PromptPrimitive<T> => {\n return createPrimitive(PromptPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface PromptPrimitiveOptions<T extends TObject> {\n /**\n * The name of the prompt.\n *\n * If not provided, defaults to the property key where the prompt is declared.\n *\n * @example \"greeting\"\n * @example \"code-review\"\n */\n name?: string;\n\n /**\n * Human-friendly display title (spec 2025-11-25). Distinct from `name`,\n * which remains the programmatic identifier.\n */\n title?: string;\n\n /**\n * Description of what this prompt does.\n *\n * Helps users understand the purpose of the prompt.\n *\n * @example \"Generate a personalized greeting message\"\n */\n description?: string;\n\n /**\n * Optional icons surfaced in client UIs (spec 2025-11-25 / SEP-973).\n */\n icons?: McpIcon[];\n\n /**\n * TypeBox schema defining the prompt arguments.\n *\n * Each property in the schema becomes an argument that can be\n * filled in when the prompt is used.\n */\n args?: T;\n\n /**\n * Handler function that generates the prompt messages.\n *\n * Receives the validated arguments and returns an array of messages.\n *\n * @param args - Object containing validated arguments\n * @returns Array of prompt messages\n */\n handler: (args: PromptHandlerArgs<T>) => Async<PromptMessage[]>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class PromptPrimitive<T extends TObject> extends Primitive<\n PromptPrimitiveOptions<T>\n> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the prompt.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the description of the prompt.\n */\n public get description(): string | undefined {\n return this.options.description;\n }\n\n protected onInit(): void {\n this.mcpServer.registerPrompt(this);\n }\n\n /**\n * Get the prompt messages with the given arguments.\n *\n * @param rawArgs - Raw arguments to validate and pass to the handler\n * @param context - Optional context from the transport layer\n * @returns Array of prompt messages\n */\n public async get(\n rawArgs: unknown,\n context?: McpContext,\n ): Promise<PromptMessage[]> {\n let args = (rawArgs ?? {}) as Static<T>;\n\n if (this.options.args) {\n args = this.alepha.codec.decode(this.options.args, rawArgs ?? {});\n }\n\n return this.options.handler({ args, context });\n }\n\n /**\n * Convert the prompt to an MCP prompt descriptor for protocol messages.\n */\n public toDescriptor(): McpPromptDescriptor {\n const descriptor: McpPromptDescriptor = {\n name: this.name,\n description: this.description,\n arguments: this.options.args\n ? this.schemaToArguments(this.options.args)\n : [],\n };\n if (this.options.title) descriptor.title = this.options.title;\n if (this.options.icons && this.options.icons.length > 0) {\n descriptor.icons = this.options.icons;\n }\n return descriptor;\n }\n\n /**\n * Convert a TypeBox schema to an array of prompt arguments.\n */\n protected schemaToArguments(schema: TObject): McpPromptArgument[] {\n const args: McpPromptArgument[] = [];\n\n for (const [name, propSchema] of Object.entries(schema.properties)) {\n // The description lives on the inner schema; peel optional/nullable/default\n // wrappers so `z.number({ description }).optional()` still surfaces it.\n const prop = z.schema.unwrap(propSchema) as Record<string, unknown>;\n args.push({\n name,\n description: prop.description as string | undefined,\n required: !z.schema.isOptional(propSchema),\n });\n }\n\n return args;\n }\n}\n\n$prompt[KIND] = PromptPrimitive;\n","import { $inject, createPrimitive, KIND, Primitive } from \"alepha\";\nimport type {\n McpContext,\n McpIcon,\n McpResourceDescriptor,\n ResourceContent,\n ResourceHandler,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP resource primitive for exposing read-only data.\n *\n * Resources represent any kind of data that an LLM might want to read,\n * such as files, database records, API responses, or computed data.\n *\n * **Key Features**\n * - URI-based identification for resources\n * - Support for text and binary content\n * - MIME type specification\n * - Lazy loading via handler function\n *\n * @example\n * ```ts\n * class ProjectResources {\n * readme = $resource({\n * uri: \"file:///readme\",\n * description: \"Project README file\",\n * mimeType: \"text/markdown\",\n * handler: async () => ({\n * text: await fs.readFile(\"README.md\", \"utf-8\"),\n * }),\n * });\n *\n * config = $resource({\n * uri: \"config://app\",\n * name: \"Application Configuration\",\n * mimeType: \"application/json\",\n * handler: async () => ({\n * text: JSON.stringify(this.configService.getConfig()),\n * }),\n * });\n * }\n * ```\n */\nexport const $resource = (\n options: ResourcePrimitiveOptions,\n): ResourcePrimitive => {\n return createPrimitive(ResourcePrimitive, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ResourcePrimitiveOptions {\n /**\n * The URI that identifies this resource.\n *\n * URIs should follow a consistent scheme for your application.\n * Common patterns:\n * - `file:///path/to/file` - File system resources\n * - `db://table/id` - Database records\n * - `api://endpoint` - API responses\n * - `config://name` - Configuration values\n *\n * @example \"file:///readme.md\"\n * @example \"db://users/123\"\n */\n uri: string;\n\n /**\n * Human-readable name for the resource.\n *\n * If not provided, defaults to the property key where the resource is declared.\n *\n * @example \"Project README\"\n * @example \"User Profile\"\n */\n name?: string;\n\n /**\n * Human-friendly display title (spec 2025-11-25). Distinct from `name`,\n * which remains the programmatic identifier.\n */\n title?: string;\n\n /**\n * Optional icons surfaced in client UIs (spec 2025-11-25 / SEP-973).\n */\n icons?: McpIcon[];\n\n /**\n * Description of what this resource contains.\n *\n * Helps the LLM understand the purpose and content of the resource.\n *\n * @example \"The main README file for the project\"\n */\n description?: string;\n\n /**\n * MIME type of the resource content.\n *\n * Helps clients understand how to interpret the content.\n *\n * @default \"text/plain\"\n * @example \"text/markdown\"\n * @example \"application/json\"\n */\n mimeType?: string;\n\n /**\n * Handler function that returns the resource content.\n *\n * Called when the resource is read. Can return text or binary content.\n *\n * @returns Resource content with either `text` or `blob` property\n */\n handler: ResourceHandler;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ResourcePrimitive extends Primitive<ResourcePrimitiveOptions> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the resource.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the URI of the resource.\n */\n public get uri(): string {\n return this.options.uri;\n }\n\n /**\n * Returns the description of the resource.\n */\n public get description(): string | undefined {\n return this.options.description;\n }\n\n /**\n * Returns the MIME type of the resource.\n */\n public get mimeType(): string {\n return this.options.mimeType ?? \"text/plain\";\n }\n\n protected onInit(): void {\n this.mcpServer.registerResource(this);\n }\n\n /**\n * Read the resource content.\n *\n * @param context - Optional context from the transport layer\n * @returns The resource content\n */\n public async read(context?: McpContext): Promise<ResourceContent> {\n return this.options.handler({ context });\n }\n\n /**\n * Convert the resource to an MCP resource descriptor for protocol messages.\n */\n public toDescriptor(): McpResourceDescriptor {\n const descriptor: McpResourceDescriptor = {\n uri: this.uri,\n name: this.name,\n description: this.description,\n mimeType: this.mimeType,\n };\n if (this.options.title) descriptor.title = this.options.title;\n if (this.options.icons && this.options.icons.length > 0) {\n descriptor.icons = this.options.icons;\n }\n return descriptor;\n }\n}\n\n$resource[KIND] = ResourcePrimitive;\n","import {\n $inject,\n type Async,\n createPrimitive,\n KIND,\n Primitive,\n type TObject,\n type TSchema,\n z,\n} from \"alepha\";\nimport type {\n McpContext,\n McpIcon,\n McpJsonSchema,\n McpToolAnnotations,\n McpToolDescriptor,\n ToolHandlerArgs,\n ToolHandlerResult,\n ToolPrimitiveSchema,\n} from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Creates an MCP tool primitive for defining callable functions.\n *\n * Tools are the primary way for LLMs to interact with external systems through MCP.\n * Each tool has a name, description, typed parameters, and a handler function.\n *\n * **Key Features**\n * - Full TypeScript inference for parameters and results\n * - Automatic schema validation using TypeBox\n * - JSON Schema generation for MCP protocol\n * - Integration with MCP server provider\n *\n * @example\n * ```ts\n * class CalculatorTools {\n * add = $tool({\n * description: \"Add two numbers together\",\n * schema: {\n * params: z.object({\n * a: z.number(),\n * b: z.number(),\n * }),\n * result: z.number(),\n * },\n * handler: async ({ params }) => {\n * return params.a + params.b;\n * },\n * });\n *\n * greet = $tool({\n * description: \"Generate a greeting message\",\n * schema: {\n * params: z.object({\n * name: z.text(),\n * }),\n * result: z.text(),\n * },\n * handler: async ({ params }) => {\n * return `Hello, ${params.name}!`;\n * },\n * });\n * }\n * ```\n */\nexport const $tool = <T extends ToolPrimitiveSchema>(\n options: ToolPrimitiveOptions<T>,\n): ToolPrimitive<T> => {\n return createPrimitive(ToolPrimitive<T>, options);\n};\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport interface ToolPrimitiveOptions<T extends ToolPrimitiveSchema> {\n /**\n * The name of the tool.\n *\n * If not provided, defaults to the property key where the tool is declared.\n * Names should be descriptive and use kebab-case or snake_case.\n *\n * @example \"calculate-sum\"\n * @example \"get_weather\"\n */\n name?: string;\n\n /**\n * Human-friendly display title (spec 2025-11-25). Distinct from `name`,\n * which remains the programmatic identifier. Clients use `title` in\n * tool palettes / picker UIs.\n *\n * @example \"Search Lore\"\n */\n title?: string;\n\n /**\n * A human-readable description of what the tool does.\n *\n * This description is sent to the LLM to help it understand\n * when and how to use the tool. Be clear and specific.\n *\n * @example \"Calculate the sum of two numbers\"\n * @example \"Retrieve current weather data for a given location\"\n */\n description: string;\n\n /**\n * Behavior hints (spec 2025-03-26+). Clients use these to gate UI prompts\n * (e.g. require confirmation before a tool with `destructiveHint: true`).\n * None are guarantees — they are heuristics for the client, not the model.\n */\n annotations?: McpToolAnnotations;\n\n /**\n * Icons surfaced in client tool palettes / picker UIs (spec 2025-11-25).\n */\n icons?: McpIcon[];\n\n /**\n * TypeBox schema defining the tool's parameters and result type.\n *\n * - **params**: TObject schema for input parameters (optional)\n * - **result**: TSchema for the return value (optional)\n *\n * Schemas provide:\n * - Type inference for handler function\n * - Runtime validation of inputs\n * - JSON Schema generation for MCP protocol\n */\n schema?: T;\n\n /**\n * The handler function that executes when the tool is called.\n *\n * Receives validated parameters and returns the result.\n * Errors thrown here are caught and returned as MCP errors.\n *\n * @param args - Object containing validated params\n * @returns The tool result (can be async)\n */\n handler: (args: ToolHandlerArgs<T>) => Async<ToolHandlerResult<T>>;\n}\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport class ToolPrimitive<T extends ToolPrimitiveSchema> extends Primitive<\n ToolPrimitiveOptions<T>\n> {\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * Returns the name of the tool.\n */\n public get name(): string {\n return this.options.name ?? this.config.propertyKey;\n }\n\n /**\n * Returns the description of the tool.\n */\n public get description(): string {\n return this.options.description;\n }\n\n /**\n * Whether the tool declared a result schema. When true, `tools/call`\n * responses include `structuredContent` populated with the validated\n * result (spec 2025-06-18).\n */\n public hasOutputSchema(): boolean {\n return !!this.options.schema?.result;\n }\n\n protected onInit(): void {\n this.mcpServer.registerTool(this);\n }\n\n /**\n * Execute the tool with the given parameters.\n *\n * @param params - Raw parameters to validate and pass to the handler\n * @param context - Optional context from the transport layer\n * @returns The tool result\n */\n public async execute(\n params: unknown,\n context?: McpContext,\n ): Promise<ToolHandlerResult<T>> {\n let validatedParams: any = params ?? {};\n\n // Validate params using alepha.codec if schema provided\n if (this.options.schema?.params) {\n validatedParams = this.alepha.codec.decode(\n this.options.schema.params,\n validatedParams,\n );\n }\n\n const result = await this.options.handler({\n params: validatedParams,\n context,\n });\n\n // Validate and encode result if schema provided\n if (this.options.schema?.result && result !== undefined) {\n return this.alepha.codec.encode(\n this.options.schema.result,\n result,\n ) as ToolHandlerResult<T>;\n }\n\n return result as ToolHandlerResult<T>;\n }\n\n /**\n * Convert the tool to an MCP tool descriptor for protocol messages.\n *\n * Emits the spec 2025-11-25 surface: `title`, `annotations`, `icons`,\n * and (when `schema.result` is defined) `outputSchema` so the server\n * can populate `structuredContent` on call results.\n */\n public toDescriptor(): McpToolDescriptor {\n const inputSchema: McpJsonSchema = this.options.schema?.params\n ? this.schemaToJsonSchema(this.options.schema.params)\n : { type: \"object\", properties: {}, required: [] };\n\n const descriptor: McpToolDescriptor = {\n name: this.name,\n description: this.description,\n inputSchema,\n };\n\n if (this.options.title) descriptor.title = this.options.title;\n if (this.options.annotations)\n descriptor.annotations = this.options.annotations;\n if (this.options.icons && this.options.icons.length > 0) {\n descriptor.icons = this.options.icons;\n }\n\n // Output schema is emitted when the tool declares `schema.result`,\n // unlocking structured content on tools/call responses.\n if (this.options.schema?.result) {\n const out = this.propertyToJsonSchema(this.options.schema.result);\n // The result schema may be a primitive — wrap so the descriptor\n // value is always a JSON Schema object with `type`.\n descriptor.outputSchema = (\n typeof out === \"object\" && out !== null && \"type\" in out\n ? out\n : { type: \"object\", properties: {}, required: [] }\n ) as McpJsonSchema;\n }\n\n return descriptor;\n }\n\n /**\n * Convert a TypeBox schema to JSON Schema format.\n *\n * Emits the 2020-12 dialect annotation at the root (spec 2025-11-25 /\n * SEP-1613 — JSON Schema 2020-12 is the default dialect for MCP).\n * The TypeBox shapes Alepha emits today are already 2020-12-compatible;\n * this is just the dialect declaration.\n */\n protected schemaToJsonSchema(\n schema: TObject,\n options?: { root?: boolean },\n ): McpJsonSchema {\n let json: any;\n try {\n json = z.toJSONSchema(schema as any);\n } catch {\n json = { type: \"object\", properties: {}, required: [] };\n }\n\n // Annotate the 2020-12 dialect on the root schema only (avoid noise on\n // nested sub-schemas where MCP doesn't expect $schema).\n if (options?.root === false) {\n json.$schema = undefined;\n } else {\n json.$schema = \"https://json-schema.org/draft/2020-12/schema\";\n }\n\n return json as McpJsonSchema;\n }\n\n /**\n * Convert a single property schema to JSON Schema format (zod-native).\n */\n protected propertyToJsonSchema(schema: TSchema): Record<string, unknown> {\n try {\n const json: any = z.toJSONSchema(schema as any);\n json.$schema = undefined;\n return json;\n } catch {\n return { type: \"string\" };\n }\n }\n}\n\n$tool[KIND] = ToolPrimitive;\n","import { $atom, $inject, $state, z } from \"alepha\";\nimport { $logger } from \"alepha/logger\";\nimport { $route } from \"alepha/server\";\nimport {\n createErrorResponse,\n createParseError,\n JsonRpcParseError,\n parseMessage,\n} from \"../helpers/jsonrpc.ts\";\nimport type { McpContext } from \"../interfaces/McpTypes.ts\";\nimport { McpServerProvider } from \"../providers/McpServerProvider.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport const mcpStreamableHttpOptions = $atom({\n name: \"alepha.mcp.streamableHttp.options\",\n description: \"Configuration options for the MCP Streamable HTTP transport.\",\n schema: z.object({\n /**\n * Path for the MCP endpoint. Single endpoint for both requests and\n * (optional) server-streamed responses, per spec 2025-03-26+.\n */\n path: z.text({ default: \"/mcp\" }),\n /**\n * Allow-list of `Origin` header values accepted on incoming requests.\n * Empty array (default) means \"allow any\". When set, browser-originated\n * requests with a non-matching `Origin` are rejected with 403 Forbidden,\n * blocking DNS-rebinding attacks against localhost MCP servers.\n *\n * Server-to-server callers (no `Origin` header) are always allowed.\n *\n * Spec 2025-11-25, PR #1439.\n */\n allowedOrigins: z.array(z.text()).default([]),\n /**\n * When true, an unauthenticated POST to the MCP endpoint is rejected\n * with `401 Unauthorized` and an RFC 9728 `WWW-Authenticate` challenge\n * instead of being dispatched. MCP clients (Claude, etc.) rely on that\n * challenge to discover the OAuth authorization server.\n *\n * The transport stays OAuth-agnostic: it only knows \"auth is required\".\n * `$realm({ features: { oauth: true } })` flips this on automatically.\n *\n * @default false\n */\n requireAuth: z.boolean().default(false),\n /**\n * Path of the RFC 9728 protected-resource metadata document, advertised\n * (as an absolute URL, resolved against the request origin) in the\n * `WWW-Authenticate` challenge emitted when {@link requireAuth} rejects\n * a request.\n */\n resourceMetadataPath: z.text({\n default: \"/.well-known/oauth-protected-resource\",\n }),\n }),\n default: {\n path: \"/mcp\",\n allowedOrigins: [],\n requireAuth: false,\n resourceMetadataPath: \"/.well-known/oauth-protected-resource\",\n },\n});\n\n// Backward-compat alias for the legacy atom name. Prefer\n// `mcpStreamableHttpOptions` going forward; this re-export keeps existing\n// consumer imports compiling and will be removed once they migrate.\nexport const mcpSseOptions = mcpStreamableHttpOptions;\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Streamable HTTP transport for MCP communication.\n *\n * Implements the 2025-03-26+ Streamable HTTP transport: a single `/mcp`\n * endpoint that accepts JSON-RPC over POST and returns either\n * `application/json` (single response, the default) or\n * `text/event-stream` (when the server wants to stream multiple messages).\n *\n * Designed for serverless deployment (Cloudflare Workers, etc.) — there is\n * no long-lived GET stream. GET on the endpoint returns 405 Method Not\n * Allowed; clients that want server-initiated push must rely on the POST\n * response stream when the server upgrades to SSE for that particular call.\n *\n * Spec compliance:\n * - 2025-06-18: validates `MCP-Protocol-Version` header on every request\n * after `initialize` against the version negotiated and stored on\n * `McpServerProvider`.\n * - 2025-11-25: rejects requests with a non-allow-listed `Origin` header\n * (PR #1439). See {@link mcpStreamableHttpOptions.allowedOrigins}.\n *\n * @example\n * ```ts\n * import { Alepha, run } from \"alepha\";\n * import { AlephaServer } from \"alepha/server\";\n * import { AlephaMcp, StreamableHttpMcpTransport } from \"alepha/mcp\";\n *\n * class MyTools {\n * // ... tool definitions\n * }\n *\n * run(\n * Alepha.create()\n * .with(AlephaServer)\n * .with(AlephaMcp)\n * .with(StreamableHttpMcpTransport)\n * .with(MyTools)\n * );\n * ```\n */\nexport class StreamableHttpMcpTransport {\n protected readonly log = $logger();\n protected readonly options = $state(mcpStreamableHttpOptions);\n protected readonly mcpServer = $inject(McpServerProvider);\n\n /**\n * GET on the MCP endpoint is not supported in this transport. Returning\n * 405 (rather than serving the legacy two-endpoint SSE pattern) is the\n * spec-allowed response for servers that don't offer server-initiated\n * push outside of an active POST.\n */\n notAllowed = $route({\n method: \"GET\",\n path: this.options.path,\n handler: (request) => {\n request.reply.status = 405;\n request.reply.headers.allow = \"POST\";\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: \"Method Not Allowed. Use POST for MCP messages.\",\n });\n },\n });\n\n /**\n * POST endpoint for client-to-server JSON-RPC messages.\n * Returns `application/json` for single responses; tools that need to\n * stream progress would upgrade to `text/event-stream` (deferred until a\n * concrete need exists).\n */\n message = $route({\n method: \"POST\",\n path: this.options.path,\n schema: {\n body: z.json(),\n },\n handler: async (request) => {\n try {\n // Origin allow-list check (spec 2025-11-25 / PR #1439).\n const originRaw = request.headers.origin;\n const origin = Array.isArray(originRaw) ? originRaw[0] : originRaw;\n if (\n origin &&\n this.options.allowedOrigins.length > 0 &&\n !this.options.allowedOrigins.includes(origin)\n ) {\n this.log.warn(\"Rejected MCP request with non-allowed Origin\", {\n origin,\n allowed: this.options.allowedOrigins,\n });\n request.reply.status = 403;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: \"Forbidden: Origin not allowed\",\n });\n return;\n }\n\n // RFC 9728 / MCP auth (spec 2025-06-18+): when the endpoint is\n // OAuth-protected, an unauthenticated request is rejected with 401\n // and a `WWW-Authenticate` challenge pointing at the protected-\n // resource metadata. MCP clients (Claude, etc.) follow that\n // `resource_metadata` URL to discover the authorization server —\n // without it, discovery never starts. The URL MUST be absolute.\n if (this.options.requireAuth && !request.user) {\n const url =\n typeof request.url === \"string\"\n ? new URL(request.url)\n : request.url;\n const resourceMetadataUrl = `${url.protocol}//${url.host}${this.options.resourceMetadataPath}`;\n this.log.debug(\"Rejecting unauthenticated MCP request\", {\n resourceMetadataUrl,\n });\n request.reply.status = 401;\n request.reply.headers[\"www-authenticate\"] =\n `Bearer resource_metadata=\"${resourceMetadataUrl}\"`;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: \"Unauthorized\",\n });\n return;\n }\n\n const body =\n typeof request.body === \"string\"\n ? request.body\n : JSON.stringify(request.body);\n\n this.log.debug(\"MCP request body\", {\n body,\n bodyType: typeof request.body,\n });\n\n const rpcRequest = parseMessage(body);\n\n // Build context from request headers\n const headers = { ...request.headers } as Record<\n string,\n string | string[] | undefined\n >;\n\n // Spec 2025-06-18+: every HTTP request after `initialize` MUST carry\n // an `MCP-Protocol-Version` header matching the negotiated version.\n // Reject mismatches with 400 so the client doesn't silently drift.\n if (rpcRequest.method !== \"initialize\") {\n const headerRaw = headers[\"mcp-protocol-version\"];\n const headerVersion = Array.isArray(headerRaw)\n ? headerRaw[0]\n : headerRaw;\n if (\n headerVersion &&\n headerVersion !== this.mcpServer.negotiatedVersion\n ) {\n this.log.warn(\"MCP-Protocol-Version header mismatch\", {\n header: headerVersion,\n negotiated: this.mcpServer.negotiatedVersion,\n });\n request.reply.status = 400;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify({\n error: `MCP-Protocol-Version mismatch: expected ${this.mcpServer.negotiatedVersion}, got ${headerVersion}`,\n });\n return;\n }\n }\n\n const context: McpContext = { headers };\n\n const response = await this.mcpServer.handleMessage(\n rpcRequest,\n context,\n );\n\n if (response) {\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify(response);\n } else {\n request.reply.status = 204;\n }\n } catch (error) {\n if (error instanceof JsonRpcParseError) {\n request.reply.status = 400;\n request.reply.headers[\"content-type\"] = \"application/json\";\n request.reply.body = JSON.stringify(\n createErrorResponse(0, createParseError(error.message)),\n );\n } else {\n this.log.error(\"Failed to process MCP message\", error);\n request.reply.status = 500;\n request.reply.body = JSON.stringify({\n error: (error as Error).message,\n });\n }\n }\n },\n });\n}\n\n/**\n * @deprecated Use {@link StreamableHttpMcpTransport}. The 2024-11-05\n * two-endpoint HTTP+SSE pattern was replaced by Streamable HTTP in spec\n * 2025-03-26. This alias is preserved for one release to ease migration.\n */\nexport const SseMcpTransport = StreamableHttpMcpTransport;\n","import { $module } from \"alepha\";\nimport { $prompt } from \"./primitives/$prompt.ts\";\nimport { $resource } from \"./primitives/$resource.ts\";\nimport { $tool } from \"./primitives/$tool.ts\";\nimport { McpServerProvider } from \"./providers/McpServerProvider.ts\";\nimport { StreamableHttpMcpTransport } from \"./transports/StreamableHttpMcpTransport.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\nexport {\n McpError,\n McpErrorCodes,\n McpForbiddenError,\n McpInvalidParamsError,\n McpMethodNotFoundError,\n McpPromptNotFoundError,\n McpResourceNotFoundError,\n McpToolNotFoundError,\n McpUnauthorizedError,\n} from \"./errors/McpError.ts\";\nexport {\n createErrorResponse,\n createInternalError,\n createInvalidParamsError,\n createInvalidRequestError,\n createMethodNotFoundError,\n createNotification,\n createParseError,\n createResponse,\n isNotification,\n isSupportedProtocolVersion,\n isValidJsonRpcRequest,\n JSONRPC_VERSION,\n JsonRpcErrorCodes,\n JsonRpcParseError,\n MCP_PROTOCOL_VERSION,\n parseMessage,\n SUPPORTED_PROTOCOL_VERSIONS,\n type SupportedProtocolVersion,\n} from \"./helpers/jsonrpc.ts\";\nexport type {\n JsonRpcError,\n JsonRpcNotification,\n // JSON-RPC types\n JsonRpcRequest,\n JsonRpcResponse,\n // MCP protocol types\n McpCapabilities,\n McpClientInfo,\n McpContent,\n // Context type for auth/headers\n McpContext,\n McpInitializeParams,\n McpInitializeResult,\n McpJsonSchema,\n McpPromptArgument,\n McpPromptContent,\n // Prompt types\n McpPromptDescriptor,\n McpPromptGetParams,\n McpPromptGetResult,\n McpPromptMessage,\n McpResourceContent,\n // Resource types\n McpResourceDescriptor,\n McpResourceReadParams,\n McpResourceReadResult,\n McpServerInfo,\n McpToolCallParams,\n McpToolCallResult,\n // Tool types\n McpToolDescriptor,\n PromptHandler,\n PromptHandlerArgs,\n PromptMessage,\n ResourceContent,\n ResourceHandler,\n ResourceHandlerArgs,\n ToolHandler,\n ToolHandlerArgs,\n ToolHandlerResult,\n // Handler types\n ToolPrimitiveSchema,\n} from \"./interfaces/McpTypes.ts\";\nexport type { PromptPrimitiveOptions } from \"./primitives/$prompt.ts\";\nexport { $prompt, PromptPrimitive } from \"./primitives/$prompt.ts\";\nexport type { ResourcePrimitiveOptions } from \"./primitives/$resource.ts\";\nexport { $resource, ResourcePrimitive } from \"./primitives/$resource.ts\";\nexport type { ToolPrimitiveOptions } from \"./primitives/$tool.ts\";\nexport { $tool, ToolPrimitive } from \"./primitives/$tool.ts\";\nexport { McpServerProvider } from \"./providers/McpServerProvider.ts\";\nexport {\n mcpSseOptions,\n mcpStreamableHttpOptions,\n SseMcpTransport,\n StreamableHttpMcpTransport,\n} from \"./transports/StreamableHttpMcpTransport.ts\";\n\n// ---------------------------------------------------------------------------------------------------------------------\n\n/**\n * Model Context Protocol for AI tool integration.\n *\n * **Features:**\n * - MCP resource definitions\n * - MCP tool definitions\n * - MCP prompt definitions\n * - JSON-RPC protocol\n * - Streamable HTTP transport (spec 2025-03-26+)\n *\n * @module alepha.mcp\n */\nexport const AlephaMcp = $module({\n name: \"alepha.mcp\",\n primitives: [$tool, $resource, $prompt],\n services: [McpServerProvider],\n // Transports are opt-in — user wires the one(s) they need via alepha.with(StreamableHttpMcpTransport).\n variants: [StreamableHttpMcpTransport],\n});\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $module, AlephaError, KIND, pageQuerySchema, pageSchema, pageSchema as pageSchema$1, t } from "alepha";
1
+ import { $module, AlephaError, KIND, pageQuerySchema, pageSchema, pageSchema as pageSchema$1, z } from "alepha";
2
2
  import { AlephaDateTime } from "alepha/datetime";
3
3
  import { sql } from "drizzle-orm";
4
4
  //#region ../../src/orm/core/errors/DbError.ts
@@ -44,7 +44,8 @@ var DbColumnNotFoundError = class DbColumnNotFoundError extends DbError {
44
44
  if (pgMatch) {
45
45
  const column = pgMatch[1];
46
46
  const table = pgMatch[2];
47
- return new DbColumnNotFoundError(table ? `Column '${column}' does not exist in table '${table}'` : `Column '${column}' does not exist`, error, {
47
+ const msg = table ? `Column '${column}' does not exist in table '${table}'` : `Column '${column}' does not exist`;
48
+ return new DbColumnNotFoundError(msg, error, {
48
49
  column,
49
50
  table
50
51
  });
@@ -53,7 +54,8 @@ var DbColumnNotFoundError = class DbColumnNotFoundError extends DbError {
53
54
  if (sqliteMatch) {
54
55
  const table = sqliteMatch[1];
55
56
  const column = sqliteMatch[2];
56
- return new DbColumnNotFoundError(table ? `Column '${column}' does not exist in table '${table}'` : `Column '${column}' does not exist`, error, {
57
+ const msg = table ? `Column '${column}' does not exist in table '${table}'` : `Column '${column}' does not exist`;
58
+ return new DbColumnNotFoundError(msg, error, {
57
59
  column,
58
60
  table
59
61
  });
@@ -299,11 +301,11 @@ var DbTableNotFoundError = class DbTableNotFoundError extends DbError {
299
301
  *
300
302
  * @example
301
303
  * ```ts
302
- * import { t } from "alepha";
304
+ * import { z } from "alepha";
303
305
  * import { PG_UPDATED_AT } from "../constants/PG_SYMBOLS";
304
306
  *
305
307
  * export const updatedAtSchema = pgAttr(
306
- * t.datetime(), PG_UPDATED_AT,
308
+ * z.datetime(), PG_UPDATED_AT,
307
309
  * );
308
310
  * ```
309
311
  */
@@ -316,8 +318,8 @@ const pgAttr = (type, attr, value) => {
316
318
  */
317
319
  const getAttrFields = (schema, name) => {
318
320
  const fields = [];
319
- for (const key of Object.keys(schema.properties)) {
320
- const value = schema.properties[key];
321
+ for (const key of Object.keys(schema.shape)) {
322
+ const value = schema.shape[key];
321
323
  if (name in value) fields.push({
322
324
  type: value,
323
325
  key,
@@ -346,25 +348,26 @@ const PG_SERIAL = Symbol.for("Alepha.Postgres.Serial");
346
348
  //#region ../../src/orm/core/schemas/insertSchema.ts
347
349
  const insertSchema = (obj) => {
348
350
  const newProperties = {};
349
- for (const key in obj.properties) {
350
- const prop = obj.properties[key];
351
+ for (const key in obj.shape) {
352
+ const prop = obj.shape[key];
351
353
  if (PG_GENERATED in prop) continue;
352
- if (PG_DEFAULT in prop || PG_ORGANIZATION in prop) newProperties[key] = t.optional(prop);
354
+ if (PG_DEFAULT in prop || PG_ORGANIZATION in prop) newProperties[key] = prop.optional();
355
+ else if (z.schema.isOptional(prop)) newProperties[key] = z.schema.unwrap(prop).nullable().optional();
353
356
  else newProperties[key] = prop;
354
357
  }
355
- return t.object(newProperties, "options" in obj && typeof obj.options === "object" ? { ...obj.options } : {});
358
+ return z.object(newProperties);
356
359
  };
357
360
  //#endregion
358
361
  //#region ../../src/orm/core/schemas/updateSchema.ts
359
362
  const updateSchema = (schema) => {
360
363
  const newProperties = {};
361
- for (const key in schema.properties) {
362
- const prop = schema.properties[key];
364
+ for (const key in schema.shape) {
365
+ const prop = schema.shape[key];
363
366
  if (PG_GENERATED in prop) continue;
364
- if (t.schema.isOptional(prop)) newProperties[key] = t.optional(t.union([prop, t.null()]));
367
+ if (z.schema.isOptional(prop)) newProperties[key] = z.union([prop, z.null()]).optional();
365
368
  else newProperties[key] = prop;
366
369
  }
367
- return t.object(newProperties, "options" in schema && typeof schema.options === "object" ? { ...schema.options } : {});
370
+ return z.object(newProperties);
368
371
  };
369
372
  //#endregion
370
373
  //#region ../../src/orm/core/primitives/$entity.ts
@@ -373,15 +376,15 @@ const updateSchema = (schema) => {
373
376
  *
374
377
  * @example
375
378
  * ```ts
376
- * import { t } from "alepha";
379
+ * import { z } from "alepha";
377
380
  * import { $entity } from "alepha/orm";
378
381
  *
379
382
  * const userEntity = $entity({
380
383
  * name: "users",
381
- * schema: t.object({
384
+ * schema: z.object({
382
385
  * id: pg.primaryKey(),
383
- * name: t.text(),
384
- * email: t.email(),
386
+ * name: z.text(),
387
+ * email: z.email(),
385
388
  * }),
386
389
  * });
387
390
  * ```
@@ -415,11 +418,15 @@ var EntityPrimitive = class EntityPrimitive {
415
418
  get schema() {
416
419
  return this.options.schema;
417
420
  }
421
+ _insertSchema;
418
422
  get insertSchema() {
419
- return insertSchema(this.options.schema);
423
+ this._insertSchema ??= insertSchema(this.options.schema);
424
+ return this._insertSchema;
420
425
  }
426
+ _updateSchema;
421
427
  get updateSchema() {
422
- return updateSchema(this.options.schema);
428
+ this._updateSchema ??= updateSchema(this.options.schema);
429
+ return this._updateSchema;
423
430
  }
424
431
  };
425
432
  $entity[KIND] = EntityPrimitive;
@@ -430,20 +437,20 @@ var DatabaseTypeProvider = class {
430
437
  /**
431
438
  * Creates a primary key with an identity column.
432
439
  */
433
- identityPrimaryKey = (identity, options) => pgAttr(pgAttr(pgAttr(t.integer(options), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
440
+ identityPrimaryKey = (identity) => pgAttr(pgAttr(pgAttr(z.integer(), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
434
441
  /**
435
442
  * Creates a primary key with a big identity column. (default)
436
443
  */
437
- bigIdentityPrimaryKey = (identity, options) => pgAttr(pgAttr(pgAttr(t.int64(options), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
444
+ bigIdentityPrimaryKey = (identity) => pgAttr(pgAttr(pgAttr(z.int64(), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
438
445
  /**
439
446
  * Creates a primary key with a UUID column.
440
447
  */
441
- uuidPrimaryKey = () => pgAttr(pgAttr(t.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);
442
- primaryKey(type, options, identity) {
443
- if (!type || t.schema.isInteger(type)) return pgAttr(pgAttr(pgAttr(t.integer(options), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
444
- if (t.schema.isString(type) && type.format === "uuid") return pgAttr(pgAttr(t.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);
445
- if (t.schema.isNumber(type) && type.format === "int64") return pgAttr(pgAttr(pgAttr(t.number(options), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
446
- if (t.schema.isBigInt(type)) return pgAttr(pgAttr(pgAttr(t.bigint(options), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
448
+ uuidPrimaryKey = () => pgAttr(pgAttr(z.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);
449
+ primaryKey(type, _options, identity) {
450
+ if (!type || z.schema.isInteger(type)) return pgAttr(pgAttr(pgAttr(z.integer(), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
451
+ if (z.schema.isString(type) && z.schema.format(type) === "uuid") return pgAttr(pgAttr(z.uuid(), PG_PRIMARY_KEY), PG_DEFAULT);
452
+ if (z.schema.isNumber(type) && z.schema.format(type) === "int64") return pgAttr(pgAttr(pgAttr(z.number(), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
453
+ if (z.schema.isBigInt(type)) return pgAttr(pgAttr(pgAttr(z.bigint(), PG_PRIMARY_KEY), PG_IDENTITY, identity), PG_DEFAULT);
447
454
  throw new AlephaError(`Unsupported type for primary key: ${type}`);
448
455
  }
449
456
  /**
@@ -464,21 +471,21 @@ var DatabaseTypeProvider = class {
464
471
  * @see {@link RepositoryPrimitive#save}
465
472
  * @see {@link PgVersionMismatchError}
466
473
  */
467
- version = (options = {}) => this.default(pgAttr(t.integer(options), PG_VERSION), 0);
474
+ version = () => this.default(pgAttr(z.integer(), PG_VERSION), 0);
468
475
  /**
469
476
  * Creates a column Created At. So just a datetime column with a default value of the current timestamp.
470
477
  */
471
- createdAt = (options) => pgAttr(pgAttr(t.datetime(options), PG_CREATED_AT), PG_DEFAULT);
478
+ createdAt = () => pgAttr(pgAttr(z.datetime(), PG_CREATED_AT), PG_DEFAULT);
472
479
  /**
473
480
  * Creates a column Updated At. Like createdAt, but it is updated on every update of the row.
474
481
  */
475
- updatedAt = (options) => pgAttr(pgAttr(t.datetime(options), PG_UPDATED_AT), PG_DEFAULT);
482
+ updatedAt = () => pgAttr(pgAttr(z.datetime(), PG_UPDATED_AT), PG_DEFAULT);
476
483
  /**
477
484
  * Creates a column Deleted At for soft delete functionality.
478
485
  * This is used to mark rows as deleted without actually removing them from the database.
479
486
  * The column is nullable - NULL means not deleted, timestamp means deleted.
480
487
  */
481
- deletedAt = (options) => pgAttr(t.optional(t.datetime(options)), PG_DELETED_AT);
488
+ deletedAt = () => pgAttr(z.datetime().optional(), PG_DELETED_AT);
482
489
  /**
483
490
  * Creates an organization column for multi-tenant row scoping.
484
491
  *
@@ -487,17 +494,24 @@ var DatabaseTypeProvider = class {
487
494
  *
488
495
  * @param options.nullable - When `false`, the column is NOT NULL in the database and
489
496
  * the ORM rejects inserts that arrive without an organization context.
490
- * Defaults to `true` (nullable) for backward compatibility: NULL rows are visible
491
- * to every tenant, which is the historic "global row" semantics.
497
+ * Defaults to `true` (nullable) unless `strict` is set, which flips the
498
+ * default to non-nullable. NULL rows are visible to every tenant (the
499
+ * historic "global row" semantics) only when the column is nullable AND
500
+ * not strict.
501
+ * @param options.strict - Fail-closed tenant scoping for security-sensitive
502
+ * tables. Refuses reads/writes with no resolved tenant (instead of a
503
+ * fail-open "see/write everything") and drops the `OR org IS NULL` escape
504
+ * so a scoped tenant never sees global rows. Defaults to `false`.
492
505
  */
493
506
  organization = (options) => {
494
- return pgAttr(options?.nullable ?? true ? t.optional(t.uuid()) : t.uuid(), PG_ORGANIZATION);
507
+ const strict = options?.strict ?? false;
508
+ return pgAttr(options?.nullable ?? !strict ? z.uuid().optional() : z.uuid(), PG_ORGANIZATION, { strict });
495
509
  };
496
510
  /**
497
511
  * Creates a reference to another table or schema. Basically a foreign key.
498
512
  */
499
513
  ref = (type, ref, actions) => {
500
- const finalActions = actions ?? { onDelete: t.schema.isOptional(type) ? "set null" : "cascade" };
514
+ const finalActions = actions ?? { onDelete: z.schema.isOptional(type) ? "set null" : "cascade" };
501
515
  return this.attr(type, PG_REF, {
502
516
  ref,
503
517
  actions: finalActions
@@ -507,8 +521,8 @@ var DatabaseTypeProvider = class {
507
521
  * Creates a page schema for a given object schema.
508
522
  * It's used by {@link Repository#paginate} method.
509
523
  */
510
- page = (resource, options) => {
511
- return pageSchema$1(resource, options);
524
+ page = (resource) => {
525
+ return pageSchema$1(resource);
512
526
  };
513
527
  };
514
528
  /**
@@ -534,7 +548,7 @@ const db = new DatabaseTypeProvider();
534
548
  /**
535
549
  * @deprecated Use `pg.primaryKey()` instead.
536
550
  */
537
- const legacyIdSchema = pgAttr(pgAttr(pgAttr(t.integer(), PG_PRIMARY_KEY), PG_SERIAL), PG_DEFAULT);
551
+ const legacyIdSchema = pgAttr(pgAttr(pgAttr(z.integer(), PG_PRIMARY_KEY), PG_SERIAL), PG_DEFAULT);
538
552
  //#endregion
539
553
  //#region ../../src/orm/core/index.browser.ts
540
554
  const AlephaOrm = $module({