@lovrozagar/honey 0.6.8 → 0.7.1

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 (674) hide show
  1. package/README.md +514 -192
  2. package/bin/honey.js +25 -0
  3. package/dist/accepts.d.ts +7 -1
  4. package/dist/accepts.d.ts.map +1 -1
  5. package/dist/accepts.js +126 -0
  6. package/dist/accepts.js.map +1 -0
  7. package/dist/body-kind.d.ts +26 -0
  8. package/dist/body-kind.d.ts.map +1 -0
  9. package/dist/body-kind.js +70 -0
  10. package/dist/body-kind.js.map +1 -0
  11. package/dist/body-limit.d.ts +5 -1
  12. package/dist/body-limit.d.ts.map +1 -1
  13. package/dist/body-limit.js +126 -0
  14. package/dist/body-limit.js.map +1 -0
  15. package/dist/build/index.d.ts +19 -3
  16. package/dist/build/index.d.ts.map +1 -1
  17. package/dist/build/index.js +173 -0
  18. package/dist/build/index.js.map +1 -0
  19. package/dist/cli-args.d.ts +33 -0
  20. package/dist/cli-args.d.ts.map +1 -0
  21. package/dist/cli-args.js +102 -0
  22. package/dist/cli-args.js.map +1 -0
  23. package/dist/cli-go/auth.go +26 -0
  24. package/dist/cli-go/config.go +192 -0
  25. package/dist/cli-go/errors.go +75 -0
  26. package/dist/cli-go/multipart.go +79 -0
  27. package/dist/cli-go/output.go +163 -0
  28. package/dist/cli-go/root.go +30 -0
  29. package/dist/cli-go/stream.go +88 -0
  30. package/dist/cli-go/version.go +5 -0
  31. package/dist/cli.d.ts +1 -1
  32. package/dist/cli.js +209 -0
  33. package/dist/cli.js.map +1 -0
  34. package/dist/client/defaults.js +48 -0
  35. package/dist/client/defaults.js.map +1 -0
  36. package/dist/client/error.d.ts +35 -0
  37. package/dist/client/error.d.ts.map +1 -1
  38. package/dist/client/error.js +71 -0
  39. package/dist/client/error.js.map +1 -0
  40. package/dist/client/http.d.ts +67 -8
  41. package/dist/client/http.d.ts.map +1 -1
  42. package/dist/client/http.js +571 -0
  43. package/dist/client/http.js.map +1 -0
  44. package/dist/client/index.d.ts +3 -2
  45. package/dist/client/index.d.ts.map +1 -1
  46. package/dist/client/index.js +95 -0
  47. package/dist/client/index.js.map +1 -0
  48. package/dist/client/path.d.ts +26 -0
  49. package/dist/client/path.d.ts.map +1 -0
  50. package/dist/client/path.js +163 -0
  51. package/dist/client/path.js.map +1 -0
  52. package/dist/client/redirect-policy.d.ts +12 -0
  53. package/dist/client/redirect-policy.d.ts.map +1 -0
  54. package/dist/client/redirect-policy.js +20 -0
  55. package/dist/client/redirect-policy.js.map +1 -0
  56. package/dist/client/sdk.d.ts +36 -0
  57. package/dist/client/sdk.d.ts.map +1 -1
  58. package/dist/client/sdk.js +292 -0
  59. package/dist/client/sdk.js.map +1 -0
  60. package/dist/client/sse.d.ts +13 -0
  61. package/dist/client/sse.d.ts.map +1 -1
  62. package/dist/client/sse.js +129 -0
  63. package/dist/client/sse.js.map +1 -0
  64. package/dist/client/types.js +2 -0
  65. package/dist/client/types.js.map +1 -0
  66. package/dist/client/ws.d.ts +9 -2
  67. package/dist/client/ws.d.ts.map +1 -1
  68. package/dist/client/ws.js +112 -0
  69. package/dist/client/ws.js.map +1 -0
  70. package/dist/client-go/errors.go +236 -0
  71. package/dist/client-go/export.go +44 -0
  72. package/dist/client-go/invalidation.go +371 -0
  73. package/dist/client-go/nullable.go +62 -0
  74. package/dist/client-go/realtime.go +354 -0
  75. package/dist/client-go/result.go +20 -0
  76. package/dist/client-go/runtime.go +975 -0
  77. package/dist/client-go/sse.go +159 -0
  78. package/dist/client-go/transport.go +495 -0
  79. package/dist/client-go/ws.go +128 -0
  80. package/dist/client-info.d.ts +36 -0
  81. package/dist/client-info.d.ts.map +1 -0
  82. package/dist/client-info.js +53 -0
  83. package/dist/client-info.js.map +1 -0
  84. package/dist/client-mcp/README.md +10 -0
  85. package/dist/client-mcp/server.ts +221 -0
  86. package/dist/client-mcp/types.ts +19 -0
  87. package/dist/client-python/_errors.py +115 -0
  88. package/dist/client-python/_invalidation.py +494 -0
  89. package/dist/client-python/_realtime.py +179 -0
  90. package/dist/client-python/_runtime.py +860 -0
  91. package/dist/client-python/_sse.py +155 -0
  92. package/dist/client-python/_transport.py +366 -0
  93. package/dist/client-python/_ws.py +159 -0
  94. package/dist/client-python/py.typed +0 -0
  95. package/dist/client-rust/errors.rs +220 -0
  96. package/dist/client-rust/invalidation.rs +412 -0
  97. package/dist/client-rust/invalidation_sync.rs +93 -0
  98. package/dist/client-rust/nullable.rs +17 -0
  99. package/dist/client-rust/realtime.rs +702 -0
  100. package/dist/client-rust/result.rs +22 -0
  101. package/dist/client-rust/runtime.rs +980 -0
  102. package/dist/client-rust/runtime_sync.rs +484 -0
  103. package/dist/client-rust/sse.rs +188 -0
  104. package/dist/client-rust/ws.rs +167 -0
  105. package/dist/codegen-go-cli.d.ts.map +1 -1
  106. package/dist/codegen-go-cli.js +964 -0
  107. package/dist/codegen-go-cli.js.map +1 -0
  108. package/dist/codegen-go.d.ts +15 -3
  109. package/dist/codegen-go.d.ts.map +1 -1
  110. package/dist/codegen-go.js +872 -0
  111. package/dist/codegen-go.js.map +1 -0
  112. package/dist/codegen-hash.js +9 -0
  113. package/dist/codegen-hash.js.map +1 -0
  114. package/dist/codegen-ir.d.ts +69 -2
  115. package/dist/codegen-ir.d.ts.map +1 -1
  116. package/dist/codegen-ir.js +661 -0
  117. package/dist/codegen-ir.js.map +1 -0
  118. package/dist/codegen-lang.d.ts +65 -0
  119. package/dist/codegen-lang.d.ts.map +1 -0
  120. package/dist/codegen-lang.js +526 -0
  121. package/dist/codegen-lang.js.map +1 -0
  122. package/dist/codegen-load.d.ts +31 -0
  123. package/dist/codegen-load.d.ts.map +1 -0
  124. package/dist/codegen-load.js +138 -0
  125. package/dist/codegen-load.js.map +1 -0
  126. package/dist/codegen-loaders.js +55 -0
  127. package/dist/codegen-loaders.js.map +1 -0
  128. package/dist/codegen-mcp.d.ts.map +1 -1
  129. package/dist/codegen-mcp.js +368 -0
  130. package/dist/codegen-mcp.js.map +1 -0
  131. package/dist/codegen-python.d.ts +13 -1
  132. package/dist/codegen-python.d.ts.map +1 -1
  133. package/dist/codegen-python.js +828 -0
  134. package/dist/codegen-python.js.map +1 -0
  135. package/dist/codegen-route-tree-intern.d.ts +15 -5
  136. package/dist/codegen-route-tree-intern.d.ts.map +1 -1
  137. package/dist/codegen-route-tree-intern.js +221 -0
  138. package/dist/codegen-route-tree-intern.js.map +1 -0
  139. package/dist/codegen-rust.d.ts.map +1 -1
  140. package/dist/codegen-rust.js +1293 -0
  141. package/dist/codegen-rust.js.map +1 -0
  142. package/dist/codegen-sanitize.d.ts.map +1 -1
  143. package/dist/codegen-sanitize.js +56 -0
  144. package/dist/codegen-sanitize.js.map +1 -0
  145. package/dist/codegen-schema-naming.d.ts +5 -0
  146. package/dist/codegen-schema-naming.d.ts.map +1 -1
  147. package/dist/codegen-schema-naming.js +150 -0
  148. package/dist/codegen-schema-naming.js.map +1 -0
  149. package/dist/codegen-sdk-model.d.ts +71 -0
  150. package/dist/codegen-sdk-model.d.ts.map +1 -0
  151. package/dist/codegen-sdk-model.js +179 -0
  152. package/dist/codegen-sdk-model.js.map +1 -0
  153. package/dist/codegen.d.ts +41 -23
  154. package/dist/codegen.d.ts.map +1 -1
  155. package/dist/codegen.js +4610 -0
  156. package/dist/codegen.js.map +1 -0
  157. package/dist/context.d.ts +36 -6
  158. package/dist/context.d.ts.map +1 -1
  159. package/dist/context.js +242 -0
  160. package/dist/context.js.map +1 -0
  161. package/dist/cookie-sign.d.ts +16 -2
  162. package/dist/cookie-sign.d.ts.map +1 -1
  163. package/dist/cookie-sign.js +104 -0
  164. package/dist/cookie-sign.js.map +1 -0
  165. package/dist/cookie.d.ts +12 -0
  166. package/dist/cookie.d.ts.map +1 -1
  167. package/dist/cookie.js +138 -0
  168. package/dist/cookie.js.map +1 -0
  169. package/dist/cors.d.ts +1 -0
  170. package/dist/cors.d.ts.map +1 -1
  171. package/dist/cors.js +87 -0
  172. package/dist/cors.js.map +1 -0
  173. package/dist/crypto.d.ts +6 -1
  174. package/dist/crypto.d.ts.map +1 -1
  175. package/dist/crypto.js +38 -0
  176. package/dist/crypto.js.map +1 -0
  177. package/dist/csrf.d.ts +19 -0
  178. package/dist/csrf.d.ts.map +1 -1
  179. package/dist/csrf.js +79 -0
  180. package/dist/csrf.js.map +1 -0
  181. package/dist/curl-logger.d.ts +14 -3
  182. package/dist/curl-logger.d.ts.map +1 -1
  183. package/dist/curl-logger.js +199 -0
  184. package/dist/curl-logger.js.map +1 -0
  185. package/dist/detect-runtime.js +13 -0
  186. package/dist/detect-runtime.js.map +1 -0
  187. package/dist/dict.d.ts +11 -0
  188. package/dist/dict.d.ts.map +1 -0
  189. package/dist/dict.js +13 -0
  190. package/dist/dict.js.map +1 -0
  191. package/dist/error.d.ts.map +1 -1
  192. package/dist/error.js +44 -0
  193. package/dist/error.js.map +1 -0
  194. package/dist/errors.js +39 -0
  195. package/dist/errors.js.map +1 -0
  196. package/dist/etag.d.ts +2 -0
  197. package/dist/etag.d.ts.map +1 -1
  198. package/dist/etag.js +82 -0
  199. package/dist/etag.js.map +1 -0
  200. package/dist/feature-detect.d.ts +25 -0
  201. package/dist/feature-detect.d.ts.map +1 -0
  202. package/dist/feature-detect.js +144 -0
  203. package/dist/feature-detect.js.map +1 -0
  204. package/dist/feature-load.js +36 -0
  205. package/dist/feature-load.js.map +1 -0
  206. package/dist/feature-slots.d.ts +44 -0
  207. package/dist/feature-slots.d.ts.map +1 -0
  208. package/dist/feature-slots.js +48 -0
  209. package/dist/feature-slots.js.map +1 -0
  210. package/dist/fetch-request.d.ts +10 -0
  211. package/dist/fetch-request.d.ts.map +1 -0
  212. package/dist/fetch-request.js +13 -0
  213. package/dist/fetch-request.js.map +1 -0
  214. package/dist/gen-process.d.ts +15 -0
  215. package/dist/gen-process.d.ts.map +1 -0
  216. package/dist/gen-process.js +43 -0
  217. package/dist/gen-process.js.map +1 -0
  218. package/dist/gen-write.d.ts +19 -0
  219. package/dist/gen-write.d.ts.map +1 -0
  220. package/dist/gen-write.js +120 -0
  221. package/dist/gen-write.js.map +1 -0
  222. package/dist/glob.d.ts +21 -0
  223. package/dist/glob.d.ts.map +1 -0
  224. package/dist/glob.js +115 -0
  225. package/dist/glob.js.map +1 -0
  226. package/dist/go-type-emitter.d.ts +18 -4
  227. package/dist/go-type-emitter.d.ts.map +1 -1
  228. package/dist/go-type-emitter.js +594 -0
  229. package/dist/go-type-emitter.js.map +1 -0
  230. package/dist/honey-response.d.ts.map +1 -1
  231. package/dist/honey-response.js +338 -0
  232. package/dist/honey-response.js.map +1 -0
  233. package/dist/i18n-slot.d.ts +8 -0
  234. package/dist/i18n-slot.d.ts.map +1 -1
  235. package/dist/i18n-slot.js +14 -0
  236. package/dist/i18n-slot.js.map +1 -0
  237. package/dist/i18n.d.ts +3 -0
  238. package/dist/i18n.d.ts.map +1 -1
  239. package/dist/i18n.js +250 -0
  240. package/dist/i18n.js.map +1 -0
  241. package/dist/index.d.ts +408 -148
  242. package/dist/index.d.ts.map +1 -1
  243. package/dist/index.js +2324 -0
  244. package/dist/index.js.map +1 -0
  245. package/dist/init.d.ts +3 -5
  246. package/dist/init.d.ts.map +1 -1
  247. package/dist/init.js +140 -0
  248. package/dist/init.js.map +1 -0
  249. package/dist/input.js +4 -0
  250. package/dist/input.js.map +1 -0
  251. package/dist/invalidate-check.d.ts +11 -0
  252. package/dist/invalidate-check.d.ts.map +1 -1
  253. package/dist/invalidate-check.js +163 -0
  254. package/dist/invalidate-check.js.map +1 -0
  255. package/dist/invoke-user.d.ts +35 -0
  256. package/dist/invoke-user.d.ts.map +1 -0
  257. package/dist/invoke-user.js +73 -0
  258. package/dist/invoke-user.js.map +1 -0
  259. package/dist/ip-restrict.d.ts +13 -1
  260. package/dist/ip-restrict.d.ts.map +1 -1
  261. package/dist/ip-restrict.js +60 -0
  262. package/dist/ip-restrict.js.map +1 -0
  263. package/dist/ip.d.ts +39 -0
  264. package/dist/ip.d.ts.map +1 -0
  265. package/dist/ip.js +209 -0
  266. package/dist/ip.js.map +1 -0
  267. package/dist/logger.d.ts.map +1 -1
  268. package/dist/logger.js +113 -0
  269. package/dist/logger.js.map +1 -0
  270. package/dist/media-type.d.ts +30 -0
  271. package/dist/media-type.d.ts.map +1 -0
  272. package/dist/media-type.js +97 -0
  273. package/dist/media-type.js.map +1 -0
  274. package/dist/meta-spec-merge.d.ts +32 -0
  275. package/dist/meta-spec-merge.d.ts.map +1 -0
  276. package/dist/meta-spec-merge.js +68 -0
  277. package/dist/meta-spec-merge.js.map +1 -0
  278. package/dist/meta-spec.d.ts +16 -3
  279. package/dist/meta-spec.d.ts.map +1 -1
  280. package/dist/meta-spec.js +535 -0
  281. package/dist/meta-spec.js.map +1 -0
  282. package/dist/middleware.d.ts +23 -6
  283. package/dist/middleware.d.ts.map +1 -1
  284. package/dist/middleware.js +253 -0
  285. package/dist/middleware.js.map +1 -0
  286. package/dist/node-request.d.ts +57 -12
  287. package/dist/node-request.d.ts.map +1 -1
  288. package/dist/node-request.js +407 -0
  289. package/dist/node-request.js.map +1 -0
  290. package/dist/node.d.ts +20 -3
  291. package/dist/node.d.ts.map +1 -1
  292. package/dist/node.js +396 -0
  293. package/dist/node.js.map +1 -0
  294. package/dist/openapi/collect.d.ts +6 -3
  295. package/dist/openapi/collect.d.ts.map +1 -1
  296. package/dist/openapi/collect.js +30 -0
  297. package/dist/openapi/collect.js.map +1 -0
  298. package/dist/openapi/docs-page.d.ts +42 -0
  299. package/dist/openapi/docs-page.d.ts.map +1 -0
  300. package/dist/openapi/docs-page.js +80 -0
  301. package/dist/openapi/docs-page.js.map +1 -0
  302. package/dist/openapi/document.d.ts +4 -0
  303. package/dist/openapi/document.d.ts.map +1 -1
  304. package/dist/openapi/document.js +785 -0
  305. package/dist/openapi/document.js.map +1 -0
  306. package/dist/openapi/json-schema-slot.d.ts +7 -0
  307. package/dist/openapi/json-schema-slot.d.ts.map +1 -1
  308. package/dist/openapi/json-schema-slot.js +38 -0
  309. package/dist/openapi/json-schema-slot.js.map +1 -0
  310. package/dist/openapi/register.d.ts.map +1 -1
  311. package/dist/openapi/register.js +20 -0
  312. package/dist/openapi/register.js.map +1 -0
  313. package/dist/openapi/scalar.d.ts +3 -1
  314. package/dist/openapi/scalar.d.ts.map +1 -1
  315. package/dist/openapi/scalar.js +21 -0
  316. package/dist/openapi/scalar.js.map +1 -0
  317. package/dist/openapi/serve.d.ts +9 -0
  318. package/dist/openapi/serve.d.ts.map +1 -0
  319. package/dist/openapi/serve.js +36 -0
  320. package/dist/openapi/serve.js.map +1 -0
  321. package/dist/openapi/spec-factory.d.ts +30 -1
  322. package/dist/openapi/spec-factory.d.ts.map +1 -1
  323. package/dist/openapi/spec-factory.js +52 -0
  324. package/dist/openapi/spec-factory.js.map +1 -0
  325. package/dist/openapi/spec.d.ts +14 -5
  326. package/dist/openapi/spec.d.ts.map +1 -1
  327. package/dist/openapi/spec.js +50 -0
  328. package/dist/openapi/spec.js.map +1 -0
  329. package/dist/openapi/swagger.d.ts +3 -1
  330. package/dist/openapi/swagger.d.ts.map +1 -1
  331. package/dist/openapi/swagger.js +22 -0
  332. package/dist/openapi/swagger.js.map +1 -0
  333. package/dist/pattern.d.ts +71 -0
  334. package/dist/pattern.d.ts.map +1 -0
  335. package/dist/pattern.js +239 -0
  336. package/dist/pattern.js.map +1 -0
  337. package/dist/peer.d.ts +17 -0
  338. package/dist/peer.d.ts.map +1 -0
  339. package/dist/peer.js +50 -0
  340. package/dist/peer.js.map +1 -0
  341. package/dist/plugin.d.ts +67 -16
  342. package/dist/plugin.d.ts.map +1 -1
  343. package/dist/plugin.js +649 -0
  344. package/dist/plugin.js.map +1 -0
  345. package/dist/powered-by.d.ts.map +1 -1
  346. package/dist/powered-by.js +11 -0
  347. package/dist/powered-by.js.map +1 -0
  348. package/dist/pretty-json.d.ts.map +1 -1
  349. package/dist/pretty-json.js +47 -0
  350. package/dist/pretty-json.js.map +1 -0
  351. package/dist/producer-stream.d.ts +47 -0
  352. package/dist/producer-stream.d.ts.map +1 -0
  353. package/dist/producer-stream.js +267 -0
  354. package/dist/producer-stream.js.map +1 -0
  355. package/dist/proxy.d.ts +47 -8
  356. package/dist/proxy.d.ts.map +1 -1
  357. package/dist/proxy.js +274 -0
  358. package/dist/proxy.js.map +1 -0
  359. package/dist/python-type-emitter.d.ts +14 -1
  360. package/dist/python-type-emitter.d.ts.map +1 -1
  361. package/dist/python-type-emitter.js +157 -0
  362. package/dist/python-type-emitter.js.map +1 -0
  363. package/dist/realtime/bus.d.ts +17 -1
  364. package/dist/realtime/bus.d.ts.map +1 -1
  365. package/dist/realtime/bus.js +112 -0
  366. package/dist/realtime/bus.js.map +1 -0
  367. package/dist/realtime/register.d.ts +3 -0
  368. package/dist/realtime/register.d.ts.map +1 -0
  369. package/dist/realtime/register.js +10 -0
  370. package/dist/realtime/register.js.map +1 -0
  371. package/dist/realtime/route.d.ts +65 -26
  372. package/dist/realtime/route.d.ts.map +1 -1
  373. package/dist/realtime/route.js +72 -0
  374. package/dist/realtime/route.js.map +1 -0
  375. package/dist/realtime/server.d.ts +43 -0
  376. package/dist/realtime/server.d.ts.map +1 -0
  377. package/dist/realtime/server.js +255 -0
  378. package/dist/realtime/server.js.map +1 -0
  379. package/dist/request-id.d.ts +7 -0
  380. package/dist/request-id.d.ts.map +1 -1
  381. package/dist/request-id.js +16 -0
  382. package/dist/request-id.js.map +1 -0
  383. package/dist/request-limits.d.ts +3 -0
  384. package/dist/request-limits.d.ts.map +1 -0
  385. package/dist/request-limits.js +3 -0
  386. package/dist/request-limits.js.map +1 -0
  387. package/dist/request-path.d.ts +33 -0
  388. package/dist/request-path.d.ts.map +1 -0
  389. package/dist/request-path.js +178 -0
  390. package/dist/request-path.js.map +1 -0
  391. package/dist/request-to-curl.d.ts +7 -1
  392. package/dist/request-to-curl.d.ts.map +1 -1
  393. package/dist/request-to-curl.js +48 -0
  394. package/dist/request-to-curl.js.map +1 -0
  395. package/dist/response.d.ts +25 -2
  396. package/dist/response.d.ts.map +1 -1
  397. package/dist/response.js +313 -0
  398. package/dist/response.js.map +1 -0
  399. package/dist/rust-type-emitter.d.ts +14 -2
  400. package/dist/rust-type-emitter.d.ts.map +1 -1
  401. package/dist/rust-type-emitter.js +463 -0
  402. package/dist/rust-type-emitter.js.map +1 -0
  403. package/dist/secure-headers.d.ts.map +1 -1
  404. package/dist/secure-headers.js +53 -0
  405. package/dist/secure-headers.js.map +1 -0
  406. package/dist/serve-register.d.ts +4 -0
  407. package/dist/serve-register.d.ts.map +1 -1
  408. package/dist/serve-register.js +9 -0
  409. package/dist/serve-register.js.map +1 -0
  410. package/dist/serve-slot.d.ts +3 -0
  411. package/dist/serve-slot.d.ts.map +1 -1
  412. package/dist/serve-slot.js +52 -0
  413. package/dist/serve-slot.js.map +1 -0
  414. package/dist/serve.d.ts +18 -1
  415. package/dist/serve.d.ts.map +1 -1
  416. package/dist/serve.js +157 -0
  417. package/dist/serve.js.map +1 -0
  418. package/dist/server-timing.d.ts.map +1 -1
  419. package/dist/server-timing.js +51 -0
  420. package/dist/server-timing.js.map +1 -0
  421. package/dist/static.d.ts +9 -0
  422. package/dist/static.d.ts.map +1 -1
  423. package/dist/static.js +102 -0
  424. package/dist/static.js.map +1 -0
  425. package/dist/telemetry/otel.d.ts +2 -0
  426. package/dist/telemetry/otel.d.ts.map +1 -1
  427. package/dist/telemetry/otel.js +135 -0
  428. package/dist/telemetry/otel.js.map +1 -0
  429. package/dist/testing.d.ts +12 -0
  430. package/dist/testing.d.ts.map +1 -1
  431. package/dist/testing.js +124 -0
  432. package/dist/testing.js.map +1 -0
  433. package/dist/timeout.d.ts +6 -0
  434. package/dist/timeout.d.ts.map +1 -1
  435. package/dist/timeout.js +36 -0
  436. package/dist/timeout.js.map +1 -0
  437. package/dist/tree.d.ts +133 -36
  438. package/dist/tree.d.ts.map +1 -1
  439. package/dist/tree.js +437 -0
  440. package/dist/tree.js.map +1 -0
  441. package/dist/trust.d.ts +21 -0
  442. package/dist/trust.d.ts.map +1 -0
  443. package/dist/trust.js +100 -0
  444. package/dist/trust.js.map +1 -0
  445. package/dist/ts-type-emitter.d.ts.map +1 -1
  446. package/dist/ts-type-emitter.js +150 -0
  447. package/dist/ts-type-emitter.js.map +1 -0
  448. package/dist/type-emitter.d.ts +16 -2
  449. package/dist/type-emitter.d.ts.map +1 -1
  450. package/dist/type-emitter.js +729 -0
  451. package/dist/type-emitter.js.map +1 -0
  452. package/dist/type-extractor.d.ts +8 -4
  453. package/dist/type-extractor.d.ts.map +1 -1
  454. package/dist/type-extractor.js +819 -0
  455. package/dist/type-extractor.js.map +1 -0
  456. package/dist/types.d.ts +7 -0
  457. package/dist/types.d.ts.map +1 -1
  458. package/dist/types.js +96 -0
  459. package/dist/types.js.map +1 -0
  460. package/dist/validation.d.ts +14 -2
  461. package/dist/validation.d.ts.map +1 -1
  462. package/dist/validation.js +335 -0
  463. package/dist/validation.js.map +1 -0
  464. package/dist/with-headers.d.ts +15 -0
  465. package/dist/with-headers.d.ts.map +1 -0
  466. package/dist/with-headers.js +45 -0
  467. package/dist/with-headers.js.map +1 -0
  468. package/dist/ws/bun.d.ts +11 -5
  469. package/dist/ws/bun.d.ts.map +1 -1
  470. package/dist/ws/bun.js +82 -0
  471. package/dist/ws/bun.js.map +1 -0
  472. package/dist/ws/cloudflare.d.ts +25 -3
  473. package/dist/ws/cloudflare.d.ts.map +1 -1
  474. package/dist/ws/cloudflare.js +117 -0
  475. package/dist/ws/cloudflare.js.map +1 -0
  476. package/dist/ws/deno.d.ts +4 -4
  477. package/dist/ws/deno.d.ts.map +1 -1
  478. package/dist/ws/deno.js +133 -0
  479. package/dist/ws/deno.js.map +1 -0
  480. package/dist/ws/node.d.ts +20 -3
  481. package/dist/ws/node.d.ts.map +1 -1
  482. package/dist/ws/node.js +173 -0
  483. package/dist/ws/node.js.map +1 -0
  484. package/dist/ws/session.d.ts +11 -0
  485. package/dist/ws/session.d.ts.map +1 -0
  486. package/dist/ws/session.js +60 -0
  487. package/dist/ws/session.js.map +1 -0
  488. package/dist/ws/shared.d.ts +65 -0
  489. package/dist/ws/shared.d.ts.map +1 -0
  490. package/dist/ws/shared.js +103 -0
  491. package/dist/ws/shared.js.map +1 -0
  492. package/dist/ws-origin.d.ts +20 -0
  493. package/dist/ws-origin.d.ts.map +1 -0
  494. package/dist/ws-origin.js +41 -0
  495. package/dist/ws-origin.js.map +1 -0
  496. package/dist/yaml.d.ts +15 -1
  497. package/dist/yaml.d.ts.map +1 -1
  498. package/dist/yaml.js +101 -0
  499. package/dist/yaml.js.map +1 -0
  500. package/docs/invalidate-spec.md +13 -1
  501. package/docs/meta-spec.md +36 -12
  502. package/docs/packaging.md +43 -24
  503. package/docs/regression-matrix/README.md +32 -0
  504. package/docs/regression-matrix/review.md +44 -0
  505. package/docs/regression-matrix/ws1-3.md +97 -0
  506. package/docs/regression-matrix/ws4-8.md +107 -0
  507. package/docs/regression-matrix/ws9-12.md +266 -0
  508. package/docs/sdk.md +102 -52
  509. package/package.json +183 -52
  510. package/src/accepts.ts +91 -33
  511. package/src/body-kind.ts +67 -0
  512. package/src/body-limit.ts +102 -87
  513. package/src/build/index.ts +104 -54
  514. package/src/cli-args.ts +123 -0
  515. package/src/cli-go/auth.go +12 -1
  516. package/src/cli-go/config.go +29 -2
  517. package/src/cli-go/errors.go +28 -10
  518. package/src/cli-go/multipart.go +51 -27
  519. package/src/cli-go/output.go +58 -4
  520. package/src/cli-go/root.go +1 -1
  521. package/src/cli-go/version.go +2 -2
  522. package/src/cli.ts +154 -148
  523. package/src/client/error.ts +56 -1
  524. package/src/client/http.ts +479 -256
  525. package/src/client/index.ts +55 -17
  526. package/src/client/path.ts +169 -0
  527. package/src/client/redirect-policy.ts +19 -0
  528. package/src/client/sdk.ts +180 -101
  529. package/src/client/sse.ts +92 -66
  530. package/src/client/ws.ts +67 -31
  531. package/src/client-go/errors.go +41 -12
  532. package/src/client-go/export.go +44 -0
  533. package/src/client-go/invalidation.go +52 -54
  534. package/src/client-go/nullable.go +62 -0
  535. package/src/client-go/realtime.go +147 -110
  536. package/src/client-go/runtime.go +646 -88
  537. package/src/client-go/sse.go +104 -94
  538. package/src/client-go/transport.go +67 -27
  539. package/src/client-go/ws.go +49 -25
  540. package/src/client-info.ts +79 -0
  541. package/src/client-mcp/server.ts +133 -3
  542. package/src/client-python/_invalidation.py +207 -291
  543. package/src/client-python/_realtime.py +63 -40
  544. package/src/client-python/_runtime.py +501 -119
  545. package/src/client-python/_sse.py +130 -74
  546. package/src/client-python/_transport.py +37 -9
  547. package/src/client-python/_ws.py +50 -22
  548. package/src/client-rust/errors.rs +21 -1
  549. package/src/client-rust/invalidation.rs +202 -231
  550. package/src/client-rust/invalidation_sync.rs +16 -229
  551. package/src/client-rust/nullable.rs +17 -0
  552. package/src/client-rust/realtime.rs +217 -217
  553. package/src/client-rust/runtime.rs +602 -177
  554. package/src/client-rust/runtime_sync.rs +169 -145
  555. package/src/client-rust/sse.rs +142 -121
  556. package/src/client-rust/ws.rs +61 -37
  557. package/src/codegen-go-cli.ts +607 -728
  558. package/src/codegen-go.ts +710 -770
  559. package/src/codegen-ir.ts +381 -75
  560. package/src/codegen-lang.ts +517 -0
  561. package/src/codegen-load.ts +150 -0
  562. package/src/codegen-mcp.ts +207 -108
  563. package/src/codegen-python.ts +684 -816
  564. package/src/codegen-route-tree-intern.ts +51 -25
  565. package/src/codegen-rust.ts +946 -1240
  566. package/src/codegen-sanitize.ts +0 -4
  567. package/src/codegen-schema-naming.ts +19 -6
  568. package/src/codegen-sdk-model.ts +228 -0
  569. package/src/codegen.ts +1488 -1140
  570. package/src/context.ts +130 -11
  571. package/src/cookie-sign.ts +85 -16
  572. package/src/cookie.ts +66 -11
  573. package/src/cors.ts +55 -54
  574. package/src/crypto.ts +27 -5
  575. package/src/csrf.ts +57 -25
  576. package/src/curl-logger.ts +155 -114
  577. package/src/dict.ts +12 -0
  578. package/src/error.ts +4 -2
  579. package/src/etag.ts +58 -34
  580. package/src/feature-detect.ts +147 -0
  581. package/src/feature-slots.ts +70 -0
  582. package/src/fetch-request.ts +13 -0
  583. package/src/gen-process.ts +42 -0
  584. package/src/gen-write.ts +127 -0
  585. package/src/glob.ts +109 -0
  586. package/src/go-type-emitter.ts +406 -155
  587. package/src/honey-response.ts +36 -9
  588. package/src/i18n-slot.ts +10 -0
  589. package/src/i18n.ts +98 -23
  590. package/src/index.ts +1887 -1756
  591. package/src/init.ts +40 -28
  592. package/src/invalidate-check.ts +42 -4
  593. package/src/invoke-user.ts +95 -0
  594. package/src/ip-restrict.ts +47 -161
  595. package/src/ip.ts +194 -0
  596. package/src/logger.ts +65 -36
  597. package/src/media-type.ts +104 -0
  598. package/src/meta-spec-merge.ts +80 -0
  599. package/src/meta-spec.ts +0 -0
  600. package/src/middleware.ts +112 -12
  601. package/src/node-request.ts +242 -52
  602. package/src/node.ts +318 -75
  603. package/src/openapi/collect.ts +19 -44
  604. package/src/openapi/docs-page.ts +89 -0
  605. package/src/openapi/document.ts +503 -224
  606. package/src/openapi/json-schema-slot.ts +40 -0
  607. package/src/openapi/register.ts +7 -2
  608. package/src/openapi/scalar.ts +11 -10
  609. package/src/openapi/serve.ts +39 -0
  610. package/src/openapi/spec-factory.ts +50 -1
  611. package/src/openapi/spec.ts +53 -30
  612. package/src/openapi/swagger.ts +12 -11
  613. package/src/pattern.ts +245 -0
  614. package/src/peer.ts +53 -0
  615. package/src/plugin.ts +270 -185
  616. package/src/powered-by.ts +2 -2
  617. package/src/pretty-json.ts +25 -9
  618. package/src/producer-stream.ts +296 -0
  619. package/src/proxy.ts +253 -55
  620. package/src/python-type-emitter.ts +68 -56
  621. package/src/realtime/bus.ts +56 -9
  622. package/src/realtime/register.ts +13 -0
  623. package/src/realtime/route.ts +129 -80
  624. package/src/realtime/server.ts +298 -0
  625. package/src/request-id.ts +13 -3
  626. package/src/request-limits.ts +2 -0
  627. package/src/request-path.ts +165 -0
  628. package/src/request-to-curl.ts +28 -7
  629. package/src/response.ts +143 -103
  630. package/src/rust-type-emitter.ts +265 -170
  631. package/src/secure-headers.ts +8 -4
  632. package/src/serve-register.ts +4 -0
  633. package/src/serve-slot.ts +38 -0
  634. package/src/serve.ts +113 -25
  635. package/src/server-timing.ts +11 -7
  636. package/src/static.ts +85 -32
  637. package/src/telemetry/otel.ts +29 -7
  638. package/src/testing.ts +76 -14
  639. package/src/timeout.ts +15 -7
  640. package/src/tree.ts +405 -333
  641. package/src/trust.ts +117 -0
  642. package/src/ts-type-emitter.ts +18 -12
  643. package/src/type-emitter.ts +227 -89
  644. package/src/type-extractor.ts +603 -423
  645. package/src/types.ts +8 -0
  646. package/src/validation.ts +221 -96
  647. package/src/with-headers.ts +45 -0
  648. package/src/ws/bun.ts +53 -15
  649. package/src/ws/cloudflare.ts +81 -19
  650. package/src/ws/deno.ts +124 -36
  651. package/src/ws/node.ts +173 -79
  652. package/src/ws/session.ts +73 -0
  653. package/src/ws/shared.ts +140 -0
  654. package/src/ws-origin.ts +53 -0
  655. package/src/yaml.ts +45 -22
  656. package/dist/client-mcp/server.d.ts +0 -10
  657. package/dist/client-mcp/server.d.ts.map +0 -1
  658. package/dist/client-mcp/types.d.ts +0 -16
  659. package/dist/client-mcp/types.d.ts.map +0 -1
  660. package/dist/cloudflare/realtime.d.ts +0 -30
  661. package/dist/cloudflare/realtime.d.ts.map +0 -1
  662. package/dist/realtime/buffer.d.ts +0 -18
  663. package/dist/realtime/buffer.d.ts.map +0 -1
  664. package/dist/realtime/longpoll.d.ts +0 -23
  665. package/dist/realtime/longpoll.d.ts.map +0 -1
  666. package/dist/realtime/protocol.d.ts +0 -50
  667. package/dist/realtime/protocol.d.ts.map +0 -1
  668. package/dist/realtime/runtime.d.ts +0 -74
  669. package/dist/realtime/runtime.d.ts.map +0 -1
  670. package/src/cloudflare/realtime.ts +0 -234
  671. package/src/realtime/buffer.ts +0 -101
  672. package/src/realtime/longpoll.ts +0 -148
  673. package/src/realtime/protocol.ts +0 -128
  674. package/src/realtime/runtime.ts +0 -427
@@ -0,0 +1,128 @@
1
+ // Code generated by honey. DO NOT EDIT.
2
+
3
+ package sdk
4
+
5
+ import (
6
+ "context"
7
+ "encoding/json"
8
+ "errors"
9
+ "sync"
10
+
11
+ "nhooyr.io/websocket"
12
+ )
13
+
14
+ // WSStatusNormalClosure is the normal close code (1000).
15
+ const WSStatusNormalClosure = websocket.StatusNormalClosure
16
+
17
+ // WSStatusGoingAway is the going away close code (1001).
18
+ const WSStatusGoingAway = websocket.StatusGoingAway
19
+
20
+ // WSStatusProtocolError is the protocol error close code (1002).
21
+ const WSStatusProtocolError = websocket.StatusProtocolError
22
+
23
+ // defaultWSReadLimit replaces nhooyr's 32 KiB default, which closes the
24
+ // connection on any larger frame.
25
+ const defaultWSReadLimit = 16 << 20
26
+
27
+ // TypedWebSocket wraps a nhooyr.io/websocket connection with an event fanout
28
+ // system that mirrors the TS client's .on() escape hatch.
29
+ type TypedWebSocket struct {
30
+ conn *websocket.Conn
31
+ mu sync.Mutex
32
+ handlers map[string][]func(data []byte)
33
+ closed bool
34
+ }
35
+
36
+ // newTypedWebSocket constructs a TypedWebSocket from an already-dialled conn.
37
+ func newTypedWebSocket(conn *websocket.Conn) *TypedWebSocket {
38
+ conn.SetReadLimit(defaultWSReadLimit)
39
+ return &TypedWebSocket{
40
+ conn: conn,
41
+ handlers: make(map[string][]func(data []byte)),
42
+ }
43
+ }
44
+
45
+ // SetReadLimit sets the largest inbound message, in bytes (default 16 MiB).
46
+ func (w *TypedWebSocket) SetReadLimit(n int64) {
47
+ w.conn.SetReadLimit(n)
48
+ }
49
+
50
+ // Send serialises data to JSON when it is a struct or map, and passes []byte
51
+ // (binary frame) and string (text frame) through as-is.
52
+ func (w *TypedWebSocket) Send(ctx context.Context, data interface{}) error {
53
+ switch v := data.(type) {
54
+ case []byte:
55
+ return w.conn.Write(ctx, websocket.MessageBinary, v)
56
+ case string:
57
+ return w.conn.Write(ctx, websocket.MessageText, []byte(v))
58
+ default:
59
+ encoded, err := json.Marshal(v)
60
+ if err != nil {
61
+ return err
62
+ }
63
+ return w.conn.Write(ctx, websocket.MessageText, encoded)
64
+ }
65
+ }
66
+
67
+ // Close sends a WebSocket close frame with the given status code and reason.
68
+ // A reason over 123 bytes is truncated to fit the frame.
69
+ func (w *TypedWebSocket) Close(code websocket.StatusCode, reason string) error {
70
+ if len(reason) > 123 {
71
+ reason = reason[:123]
72
+ }
73
+ err := w.conn.Close(code, reason)
74
+ w.fireClose(int(code), reason)
75
+ return err
76
+ }
77
+
78
+ // Read reads the next message from the connection. On a close frame it fires
79
+ // "close" handlers (data is the close reason); on any other failure it fires
80
+ // "error" handlers (data is the error text).
81
+ func (w *TypedWebSocket) Read(ctx context.Context) ([]byte, error) {
82
+ _, msg, err := w.conn.Read(ctx)
83
+ if err != nil {
84
+ var ce websocket.CloseError
85
+ if errors.As(err, &ce) {
86
+ w.fireClose(int(ce.Code), ce.Reason)
87
+ } else {
88
+ w.fanout("error", []byte(err.Error()))
89
+ }
90
+ return nil, err
91
+ }
92
+ w.fanout("message", msg)
93
+ return msg, nil
94
+ }
95
+
96
+ // On registers an event handler. Supported events: "message", "close", "error".
97
+ // The handler receives the raw message bytes; callers unmarshal as needed.
98
+ // This is an escape hatch — prefer ranging over Read for typed message dispatch.
99
+ func (w *TypedWebSocket) On(event string, handler func(data []byte)) {
100
+ w.mu.Lock()
101
+ defer w.mu.Unlock()
102
+ w.handlers[event] = append(w.handlers[event], handler)
103
+ }
104
+
105
+ func (w *TypedWebSocket) fireClose(code int, reason string) {
106
+ w.mu.Lock()
107
+ if w.closed {
108
+ w.mu.Unlock()
109
+ return
110
+ }
111
+ w.closed = true
112
+ w.mu.Unlock()
113
+ _ = code
114
+ w.fanout("close", []byte(reason))
115
+ }
116
+
117
+ func (w *TypedWebSocket) fanout(event string, data []byte) {
118
+ w.mu.Lock()
119
+ handlers := append([]func([]byte){}, w.handlers[event]...)
120
+ w.mu.Unlock()
121
+ for _, h := range handlers {
122
+ h(data)
123
+ }
124
+ }
125
+
126
+ // DialOptions exposes nhooyr.io/websocket DialOptions for consumer configuration.
127
+ // Set Subprotocols here before Dial.
128
+ type DialOptions = websocket.DialOptions
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Who sent a request, and over what, as the core sees it without `app.trustProxy()`: the peer
3
+ * the runtime reports is the client, and forwarding headers are client-controlled text. Trusting
4
+ * reverse proxies (hop counts, CIDR lists) lives in `trust.ts`, which `trustProxy()` loads.
5
+ */
6
+ export type ClientInfo = {
7
+ /** Canonical client address, or `null` when it is unknown or a trusted header holds garbage. */
8
+ ip: string | null;
9
+ /** Host the client asked for (`host[:port]`), or `null`. */
10
+ host: string | null;
11
+ protocol: "http" | "https";
12
+ };
13
+ /**
14
+ * The app's compiled `trustProxy()` setting. Anything but `off` carries its own resolver, so
15
+ * the core never imports the hop and range logic.
16
+ */
17
+ export type TrustSetting = {
18
+ readonly kind: "off";
19
+ } | {
20
+ readonly kind: "hops" | "ranges";
21
+ readonly resolve: (req: Request, peer: string | null) => ClientInfo;
22
+ };
23
+ export declare const TRUST_OFF: TrustSetting;
24
+ /** `host[:port]` as RFC 9110 allows it in `Host`; nothing that could change a URL's meaning. */
25
+ export declare function isValidHost(host: string): boolean;
26
+ /**
27
+ * Bun before 1.4 builds `request.url` by concatenating `Host` and the request target, so a
28
+ * `Host: x/admin?` picks the routed path. Later versions hand over the target alone.
29
+ */
30
+ export declare const BUN_URL_FROM_HOST: boolean;
31
+ /** `false` when the request carries a `Host` header that is not `host[:port]`. */
32
+ export declare function hasValidHost(req: Request): boolean;
33
+ /** The client as the connection shows it: the peer, the URL's host, the transport's scheme. */
34
+ export declare function directClientInfo(req: Request, peer: string | null): ClientInfo;
35
+ export declare function resolveClient(trust: TrustSetting, req: Request, peer: string | null): ClientInfo;
36
+ //# sourceMappingURL=client-info.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-info.d.ts","sourceRoot":"","sources":["../src/client-info.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,MAAM,UAAU,GAAG;IACxB,gGAAgG;IAChG,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;IACjB,4DAA4D;IAC5D,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IACnB,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;CAC1B,CAAA;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GACxB;IACA,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAA;IAChC,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,UAAU,CAAA;CAClE,CAAA;AAEJ,eAAO,MAAM,SAAS,EAAE,YAA6C,CAAA;AAIrE,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAQjD;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,OAK5B,CAAA;AAEJ,kFAAkF;AAClF,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAGlD;AAWD,+FAA+F;AAC/F,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAM9E;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,CAEhG"}
@@ -0,0 +1,53 @@
1
+ import { canonicalIp } from "./ip.js";
2
+ export const TRUST_OFF = Object.freeze({ kind: "off" });
3
+ const HOST = /^(?:\[[0-9A-Fa-f:.]+\]|[A-Za-z0-9](?:[A-Za-z0-9.-]*[A-Za-z0-9])?\.?)(?::\d{1,5})?$/;
4
+ /** `host[:port]` as RFC 9110 allows it in `Host`; nothing that could change a URL's meaning. */
5
+ export function isValidHost(host) {
6
+ if (!HOST.test(host))
7
+ return false;
8
+ const colon = host.lastIndexOf(":");
9
+ if (colon !== -1 && host.lastIndexOf("]") < colon) {
10
+ const port = Number(host.slice(colon + 1));
11
+ if (port > 65535)
12
+ return false;
13
+ }
14
+ return true;
15
+ }
16
+ /**
17
+ * Bun before 1.4 builds `request.url` by concatenating `Host` and the request target, so a
18
+ * `Host: x/admin?` picks the routed path. Later versions hand over the target alone.
19
+ */
20
+ export const BUN_URL_FROM_HOST = (() => {
21
+ const version = globalThis.Bun?.version;
22
+ if (version === undefined)
23
+ return false;
24
+ const [major = 0, minor = 0] = version.split(".").map(Number);
25
+ return major < 1 || (major === 1 && minor < 4);
26
+ })();
27
+ /** `false` when the request carries a `Host` header that is not `host[:port]`. */
28
+ export function hasValidHost(req) {
29
+ const host = req.headers.get("host");
30
+ return host === null || isValidHost(host);
31
+ }
32
+ function hostOfUrl(url) {
33
+ const start = url.indexOf("//");
34
+ if (start === -1)
35
+ return null;
36
+ let end = url.indexOf("/", start + 2);
37
+ if (end === -1)
38
+ end = url.length;
39
+ const host = url.slice(start + 2, end);
40
+ return host === "" ? null : host;
41
+ }
42
+ /** The client as the connection shows it: the peer, the URL's host, the transport's scheme. */
43
+ export function directClientInfo(req, peer) {
44
+ return {
45
+ host: hostOfUrl(req.url),
46
+ ip: peer === null ? null : canonicalIp(peer),
47
+ protocol: req.url.startsWith("https:") ? "https" : "http",
48
+ };
49
+ }
50
+ export function resolveClient(trust, req, peer) {
51
+ return trust.kind === "off" ? directClientInfo(req, peer) : trust.resolve(req, peer);
52
+ }
53
+ //# sourceMappingURL=client-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-info.js","sourceRoot":"","sources":["../src/client-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AA0BrC,MAAM,CAAC,MAAM,SAAS,GAAiB,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;AAErE,MAAM,IAAI,GAAG,oFAAoF,CAAA;AAEjG,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,IAAY;IACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAA;IAClC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAA;IACnC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAA;QAC1C,IAAI,IAAI,GAAG,KAAK;YAAE,OAAO,KAAK,CAAA;IAC/B,CAAC;IACD,OAAO,IAAI,CAAA;AACZ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAY,CAAC,GAAG,EAAE;IAC/C,MAAM,OAAO,GAAI,UAA6C,CAAC,GAAG,EAAE,OAAO,CAAA;IAC3E,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IACvC,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IAC7D,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAA;AAC/C,CAAC,CAAC,EAAE,CAAA;AAEJ,kFAAkF;AAClF,MAAM,UAAU,YAAY,CAAC,GAAY;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;IACpC,OAAO,IAAI,KAAK,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,CAAA;AAC1C,CAAC;AAED,SAAS,SAAS,CAAC,GAAW;IAC7B,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAA;IAC/B,IAAI,KAAK,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IAC7B,IAAI,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,GAAG,CAAC,CAAC,CAAA;IACrC,IAAI,GAAG,KAAK,CAAC,CAAC;QAAE,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;IAChC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,GAAG,CAAC,CAAA;IACtC,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAA;AACjC,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,gBAAgB,CAAC,GAAY,EAAE,IAAmB;IACjE,OAAO;QACN,IAAI,EAAE,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC;QACxB,EAAE,EAAE,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC;QAC5C,QAAQ,EAAE,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM;KACzD,CAAA;AACF,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAmB,EAAE,GAAY,EAAE,IAAmB;IACnF,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAA;AACrF,CAAC"}
@@ -0,0 +1,10 @@
1
+ # client-mcp/
2
+
3
+ Static MCP runtime templates. Files `server.ts` + `types.ts` are copied
4
+ verbatim into emitted `@{project}/mcp-server` packages by
5
+ `codegen-mcp.ts` at codegen time via `readFileSync(new URL(..., import.meta.url))`.
6
+
7
+ Changes here propagate to every emitted MCP server on next regen.
8
+
9
+ Do not import from this directory in honey/core runtime code — it only
10
+ exists as a template source for the emitter.
@@ -0,0 +1,221 @@
1
+ /* Static MCP stdio runtime — copied verbatim into emitted packages by codegen-mcp.ts.
2
+ * Consumes a Tool[] array + SDK instance. Wires MCP low-level Server class to
3
+ * stdio JSON-RPC. Maps SDK client errors -> { isError: true, content: [...] }.
4
+ *
5
+ * Intentional choice of low-level `Server` over `McpServer`: tool inputSchema is
6
+ * already JSON Schema (emitted from OpenAPI). `McpServer.registerTool` requires
7
+ * zod; switching would mean carrying json-schema-to-zod at runtime for zero gain.
8
+ * `Server` is marked @deprecated but the SDK's own guidance says to use it for
9
+ * advanced/codegen cases — keep until SDK exposes a JSON-Schema-native path. */
10
+
11
+ /* eslint-disable @typescript-eslint/no-deprecated */
12
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js"
13
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
14
+ import { CallToolRequestSchema, ListToolsRequestSchema } from "@modelcontextprotocol/sdk/types.js"
15
+ import type { Tool, ToolResult } from "./types.ts"
16
+
17
+ type ServerError = Error & { status?: number; body?: unknown; data?: unknown }
18
+
19
+ /** Per argument group, the keys a tool may forward (`true`: the whole JSON body). */
20
+ export type AllowedArgs = { headers?: string[]; json?: true; params?: string[]; search?: string[] }
21
+
22
+ /* Tool results go into a model's context: cap them. */
23
+ const MAX_RESULT_CHARS = 100_000
24
+
25
+ function errorResult(message: string, extra: Record<string, unknown> = {}): ToolResult {
26
+ return { content: [{ text: JSON.stringify({ message, ...extra }), type: "text" }], isError: true }
27
+ }
28
+
29
+ function typeOf(value: unknown): string {
30
+ if (value === null) return "null"
31
+ if (Array.isArray(value)) return "array"
32
+ if (typeof value === "number") return Number.isInteger(value) ? "integer" : "number"
33
+ return typeof value
34
+ }
35
+
36
+ function matchesType(value: unknown, type: unknown): boolean {
37
+ if (type === undefined) return true
38
+ const types = Array.isArray(type) ? type : [type]
39
+ const actual = typeOf(value)
40
+ return types.some((t) => t === actual || (t === "number" && actual === "integer"))
41
+ }
42
+
43
+ /**
44
+ * The subset of JSON Schema that OpenAPI-derived tool schemas use: type, required,
45
+ * properties, items, enum, const, nullable. Enough to reject malformed arguments before
46
+ * they reach the API; the server validates the rest.
47
+ */
48
+ export function validateArgs(schema: Record<string, unknown>, value: unknown, path = "arguments"): string[] {
49
+ const errors: string[] = []
50
+ if (value === null && schema.nullable === true) return errors
51
+ if (!matchesType(value, schema.type)) {
52
+ errors.push(`${path}: expected ${JSON.stringify(schema.type)}, got ${typeOf(value)}`)
53
+ return errors
54
+ }
55
+ if (Array.isArray(schema.enum) && !schema.enum.some((e) => JSON.stringify(e) === JSON.stringify(value))) {
56
+ errors.push(`${path}: must be one of ${JSON.stringify(schema.enum)}`)
57
+ }
58
+ if ("const" in schema && JSON.stringify(schema.const) !== JSON.stringify(value)) {
59
+ errors.push(`${path}: must be ${JSON.stringify(schema.const)}`)
60
+ }
61
+ if (typeOf(value) === "object") {
62
+ const obj = value as Record<string, unknown>
63
+ const props = (schema.properties ?? {}) as Record<string, Record<string, unknown>>
64
+ for (const key of (schema.required ?? []) as string[]) {
65
+ if (!Object.hasOwn(obj, key) || obj[key] === undefined) errors.push(`${path}.${key}: required`)
66
+ }
67
+ for (const [key, sub] of Object.entries(props)) {
68
+ if (Object.hasOwn(obj, key) && obj[key] !== undefined)
69
+ errors.push(...validateArgs(sub, obj[key], `${path}.${key}`))
70
+ }
71
+ }
72
+ if (Array.isArray(value) && schema.items && typeof schema.items === "object") {
73
+ value.forEach((item, i) =>
74
+ errors.push(...validateArgs(schema.items as Record<string, unknown>, item, `${path}[${i}]`)),
75
+ )
76
+ }
77
+ return errors
78
+ }
79
+
80
+ function pick(source: unknown, keys: string[]): Record<string, unknown> | undefined {
81
+ if (source === null || typeof source !== "object" || Array.isArray(source)) return undefined
82
+ const out: Record<string, unknown> = {}
83
+ for (const key of keys) {
84
+ if (Object.hasOwn(source, key) && (source as Record<string, unknown>)[key] !== undefined) {
85
+ out[key] = (source as Record<string, unknown>)[key]
86
+ }
87
+ }
88
+ return Object.keys(out).length > 0 ? out : undefined
89
+ }
90
+
91
+ function formatResult(result: unknown): ToolResult {
92
+ let text: string
93
+ if (typeof result === "string") text = result
94
+ else if (result instanceof ArrayBuffer || ArrayBuffer.isView(result)) {
95
+ const bytes = result instanceof ArrayBuffer ? result.byteLength : result.byteLength
96
+ text = JSON.stringify({ binary: true, bytes, message: "binary response not shown" })
97
+ } else if (typeof Blob !== "undefined" && result instanceof Blob) {
98
+ text = JSON.stringify({ binary: true, bytes: result.size, message: "binary response not shown", type: result.type })
99
+ } else text = JSON.stringify(result ?? null)
100
+ if (text.length > MAX_RESULT_CHARS) {
101
+ text = `${text.slice(0, MAX_RESULT_CHARS)}\n[truncated: ${text.length} characters, showing ${MAX_RESULT_CHARS}]`
102
+ }
103
+ return { content: [{ text, type: "text" }] }
104
+ }
105
+
106
+ /**
107
+ * Run one tool call: validate `args` against the tool's input schema, forward only the keys
108
+ * the operation declares (never extra headers, cookies or a raw body), refuse path params that
109
+ * would change the request path, and call the SDK method at `segments`.
110
+ */
111
+ export async function callTool(
112
+ sdk: unknown,
113
+ segments: string[],
114
+ args: Record<string, unknown>,
115
+ inputSchema: Record<string, unknown>,
116
+ allowed: AllowedArgs,
117
+ ): Promise<ToolResult> {
118
+ const errors = validateArgs(inputSchema, args ?? {})
119
+ if (errors.length > 0) return errorResult("Invalid tool arguments", { errors: errors.slice(0, 20) })
120
+
121
+ const input: Record<string, unknown> = {}
122
+ for (const group of ["params", "search", "headers"] as const) {
123
+ const keys = allowed[group]
124
+ if (!keys) continue
125
+ const picked = pick(args[group], keys)
126
+ if (picked) input[group] = picked
127
+ }
128
+ if (allowed.json && args.json !== undefined) input.json = args.json
129
+
130
+ const params = input.params as Record<string, unknown> | undefined
131
+ for (const [key, value] of Object.entries(params ?? {})) {
132
+ const text = String(value)
133
+ if (text === "" || text === "." || text === "..") {
134
+ return errorResult(`Invalid path parameter ${JSON.stringify(key)}: ${JSON.stringify(text)}`)
135
+ }
136
+ params![key] = text
137
+ }
138
+
139
+ let method: unknown = sdk
140
+ let owner: unknown = sdk
141
+ for (const seg of segments) {
142
+ owner = method
143
+ method = method !== null && typeof method === "object" ? (method as Record<string, unknown>)[seg] : undefined
144
+ }
145
+ if (typeof method !== "function") return errorResult(`SDK missing method ${segments.join(".")}`)
146
+ return formatResult(await (method as (input: unknown) => Promise<unknown>).call(owner, input))
147
+ }
148
+
149
+ function formatError(err: unknown): ToolResult {
150
+ if (err instanceof Error) {
151
+ const e = err as ServerError
152
+ const status = typeof e.status === "number" ? e.status : 0
153
+ const payload: Record<string, unknown> = {
154
+ message: e.message,
155
+ name: e.name,
156
+ }
157
+ if (status > 0) payload.status = status
158
+ if (e.data !== undefined) payload.data = e.data
159
+ else if (e.body !== undefined) payload.data = e.body
160
+ const text = JSON.stringify(payload)
161
+ return {
162
+ content: [{ text: text.length > MAX_RESULT_CHARS ? `${text.slice(0, MAX_RESULT_CHARS)}…` : text, type: "text" }],
163
+ isError: true,
164
+ }
165
+ }
166
+ return {
167
+ content: [{ text: JSON.stringify({ message: String(err) }), type: "text" }],
168
+ isError: true,
169
+ }
170
+ }
171
+
172
+ export async function createMCPServer(options: {
173
+ tools: Tool[]
174
+ sdk: unknown
175
+ serverInfo: { name: string; version: string }
176
+ }): Promise<void> {
177
+ const { tools, sdk, serverInfo } = options
178
+
179
+ const server = new Server(serverInfo, {
180
+ capabilities: { tools: {} },
181
+ })
182
+
183
+ server.setRequestHandler(ListToolsRequestSchema, () => {
184
+ return {
185
+ tools: tools.map((t) => ({
186
+ description: t.description,
187
+ inputSchema: t.inputSchema,
188
+ name: t.name,
189
+ })),
190
+ }
191
+ })
192
+
193
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
194
+ const { name, arguments: args } = request.params
195
+ const tool = tools.find((t) => t.name === name)
196
+ if (!tool) {
197
+ return {
198
+ content: [{ text: JSON.stringify({ message: `Unknown tool: ${name}` }), type: "text" }],
199
+ isError: true,
200
+ }
201
+ }
202
+ try {
203
+ return await tool.handler((args ?? {}) as Record<string, unknown>, sdk)
204
+ } catch (err: unknown) {
205
+ return formatError(err)
206
+ }
207
+ })
208
+
209
+ const transport = new StdioServerTransport()
210
+
211
+ /* graceful shutdown on SIGTERM / stdin close — stdio transport closes on stdin EOF,
212
+ * Server.close() flushes pending responses, process.exit(0) per MCP conventions. */
213
+ const shutdown = (): void => {
214
+ void server.close().finally(() => process.exit(0))
215
+ }
216
+ process.on("SIGTERM", shutdown)
217
+ process.on("SIGINT", shutdown)
218
+ process.stdin.on("end", shutdown)
219
+
220
+ await server.connect(transport)
221
+ }
@@ -0,0 +1,19 @@
1
+ /* Static MCP runtime types — copied verbatim into emitted packages by codegen-mcp.ts.
2
+ * No @modelcontextprotocol/sdk imports here: keeps type surface decoupled from the
3
+ * SDK so callers (tool authors) only depend on this shared shape. */
4
+
5
+ export type ToolContent = { type: "text"; text: string }
6
+
7
+ export type ToolResult = {
8
+ content: ToolContent[]
9
+ isError?: boolean
10
+ }
11
+
12
+ export type ToolHandler = (args: Record<string, unknown>, sdk: unknown) => Promise<ToolResult>
13
+
14
+ export type Tool = {
15
+ name: string
16
+ description?: string
17
+ inputSchema: Record<string, unknown>
18
+ handler: ToolHandler
19
+ }
@@ -0,0 +1,115 @@
1
+ from __future__ import annotations
2
+
3
+ from typing import Any
4
+
5
+ import httpx
6
+
7
+
8
+ class APIError(Exception):
9
+ """Base class for all API errors."""
10
+
11
+ status: int
12
+ body: Any
13
+ data: Any
14
+ response: httpx.Response
15
+ message: str
16
+
17
+ def __init__(
18
+ self,
19
+ *,
20
+ status: int,
21
+ body: Any,
22
+ data: Any,
23
+ response: httpx.Response,
24
+ message: str,
25
+ ) -> None:
26
+ super().__init__(message)
27
+ self.status = status
28
+ self.body = body
29
+ self.data = data
30
+ self.response = response
31
+ self.message = message
32
+
33
+ def __repr__(self) -> str:
34
+ cls = self.__class__.__name__
35
+ return f"{cls}(status={self.status}, message={self.message!r})"
36
+
37
+
38
+ class BadRequestError(APIError):
39
+ """HTTP 400 Bad Request."""
40
+
41
+
42
+ class UnauthorizedError(APIError):
43
+ """HTTP 401 Unauthorized."""
44
+
45
+
46
+ class ForbiddenError(APIError):
47
+ """HTTP 403 Forbidden."""
48
+
49
+
50
+ class NotFoundError(APIError):
51
+ """HTTP 404 Not Found."""
52
+
53
+
54
+ class ConflictError(APIError):
55
+ """HTTP 409 Conflict."""
56
+
57
+
58
+ class UnprocessableEntityError(APIError):
59
+ """HTTP 422 Unprocessable Entity."""
60
+
61
+
62
+ class RateLimitError(APIError):
63
+ """HTTP 429 Too Many Requests."""
64
+
65
+
66
+ class InternalServerError(APIError):
67
+ """HTTP 500 Internal Server Error."""
68
+
69
+
70
+ class BadGatewayError(APIError):
71
+ """HTTP 502 Bad Gateway."""
72
+
73
+
74
+ class ServiceUnavailableError(APIError):
75
+ """HTTP 503 Service Unavailable."""
76
+
77
+
78
+ class GatewayTimeoutError(APIError):
79
+ """HTTP 504 Gateway Timeout."""
80
+
81
+
82
+ class APIStatusError(APIError):
83
+ """Fallback for any 4xx/5xx status not covered by a named subclass."""
84
+
85
+
86
+ _STATUS_ERROR_MAP: dict[int, type[APIError]] = {
87
+ 400: BadRequestError,
88
+ 401: UnauthorizedError,
89
+ 403: ForbiddenError,
90
+ 404: NotFoundError,
91
+ 409: ConflictError,
92
+ 422: UnprocessableEntityError,
93
+ 429: RateLimitError,
94
+ 500: InternalServerError,
95
+ 502: BadGatewayError,
96
+ 503: ServiceUnavailableError,
97
+ 504: GatewayTimeoutError,
98
+ }
99
+
100
+ __all__ = [
101
+ "APIError",
102
+ "APIStatusError",
103
+ "BadGatewayError",
104
+ "BadRequestError",
105
+ "ConflictError",
106
+ "ForbiddenError",
107
+ "GatewayTimeoutError",
108
+ "InternalServerError",
109
+ "NotFoundError",
110
+ "RateLimitError",
111
+ "ServiceUnavailableError",
112
+ "UnauthorizedError",
113
+ "UnprocessableEntityError",
114
+ "_STATUS_ERROR_MAP",
115
+ ]