ts-procedures 8.5.0 → 9.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (635) hide show
  1. package/README.md +166 -101
  2. package/agent_config/claude-code/.claude-plugin/plugin.json +1 -1
  3. package/agent_config/claude-code/agents/ts-procedures-architect.md +11 -10
  4. package/agent_config/claude-code/skills/ts-procedures/SKILL.md +25 -12
  5. package/agent_config/claude-code/skills/ts-procedures/anti-patterns.md +10 -12
  6. package/agent_config/claude-code/skills/ts-procedures/api-reference.md +141 -45
  7. package/agent_config/claude-code/skills/ts-procedures/checklist.md +7 -6
  8. package/agent_config/claude-code/skills/ts-procedures/patterns.md +45 -6
  9. package/agent_config/claude-code/skills/ts-procedures/templates/client.md +1 -1
  10. package/agent_config/claude-code/skills/ts-procedures/templates/hono.md +1 -1
  11. package/agent_config/copilot/copilot-instructions.md +50 -33
  12. package/agent_config/cursor/cursorrules +50 -33
  13. package/build/adapters/astro/astro-context.js.map +1 -0
  14. package/build/adapters/astro/create-handler.js.map +1 -0
  15. package/build/adapters/astro/index.js.map +1 -0
  16. package/build/{implementations/http → adapters}/astro/index.test.js +1 -1
  17. package/build/adapters/astro/index.test.js.map +1 -0
  18. package/build/adapters/astro/rewrite-request.js.map +1 -0
  19. package/build/adapters/hono/envelope-parity.test.js +98 -0
  20. package/build/adapters/hono/envelope-parity.test.js.map +1 -0
  21. package/build/{implementations/http → adapters}/hono/handlers/http-stream.d.ts +1 -1
  22. package/build/adapters/hono/handlers/http-stream.js +55 -0
  23. package/build/adapters/hono/handlers/http-stream.js.map +1 -0
  24. package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.js +1 -1
  25. package/build/adapters/hono/handlers/http-stream.test.js.map +1 -0
  26. package/build/{implementations/http → adapters}/hono/handlers/http.d.ts +1 -1
  27. package/build/adapters/hono/handlers/http.js +50 -0
  28. package/build/adapters/hono/handlers/http.js.map +1 -0
  29. package/build/{implementations/http → adapters}/hono/handlers/http.test.js +1 -1
  30. package/build/adapters/hono/handlers/http.test.js.map +1 -0
  31. package/build/{implementations/http → adapters}/hono/handlers/rpc.d.ts +2 -2
  32. package/build/adapters/hono/handlers/rpc.js +23 -0
  33. package/build/adapters/hono/handlers/rpc.js.map +1 -0
  34. package/build/{implementations/http → adapters}/hono/handlers/rpc.test.js +1 -1
  35. package/build/adapters/hono/handlers/rpc.test.js.map +1 -0
  36. package/build/adapters/hono/handlers/stream.d.ts +12 -0
  37. package/build/adapters/hono/handlers/stream.js +89 -0
  38. package/build/adapters/hono/handlers/stream.js.map +1 -0
  39. package/build/{implementations/http → adapters}/hono/handlers/stream.test.js +3 -2
  40. package/build/adapters/hono/handlers/stream.test.js.map +1 -0
  41. package/build/{implementations/http → adapters}/hono/index.d.ts +24 -12
  42. package/build/{implementations/http → adapters}/hono/index.js +19 -8
  43. package/build/adapters/hono/index.js.map +1 -0
  44. package/build/{implementations/http → adapters}/hono/index.test.js +2 -4
  45. package/build/adapters/hono/index.test.js.map +1 -0
  46. package/build/{implementations/http → adapters/hono}/on-request-error.test.js +2 -2
  47. package/build/adapters/hono/on-request-error.test.js.map +1 -0
  48. package/build/adapters/hono/request.d.ts +7 -0
  49. package/build/adapters/hono/request.js +22 -0
  50. package/build/adapters/hono/request.js.map +1 -0
  51. package/build/{implementations/http → adapters/hono}/route-errors.test.js +4 -4
  52. package/build/adapters/hono/route-errors.test.js.map +1 -0
  53. package/build/adapters/hono/types.d.ts +55 -0
  54. package/build/adapters/hono/types.js +19 -0
  55. package/build/adapters/hono/types.js.map +1 -0
  56. package/build/client/freeze.test.js +39 -0
  57. package/build/client/freeze.test.js.map +1 -0
  58. package/build/client/typed-error-dispatch.test.js +2 -2
  59. package/build/client/typed-error-dispatch.test.js.map +1 -1
  60. package/build/codegen/__fixtures__/make-envelope.d.ts +1 -1
  61. package/build/codegen/bin/cli.d.ts +5 -0
  62. package/build/codegen/bin/cli.js +139 -182
  63. package/build/codegen/bin/cli.js.map +1 -1
  64. package/build/codegen/bin/cli.test.js +12 -2
  65. package/build/codegen/bin/cli.test.js.map +1 -1
  66. package/build/codegen/bin/flag-specs.d.ts +9 -0
  67. package/build/codegen/bin/flag-specs.js +33 -31
  68. package/build/codegen/bin/flag-specs.js.map +1 -1
  69. package/build/codegen/bin/flag-specs.test.js +14 -1
  70. package/build/codegen/bin/flag-specs.test.js.map +1 -1
  71. package/build/codegen/collect-models.d.ts +1 -1
  72. package/build/codegen/emit/api-route.d.ts +8 -0
  73. package/build/codegen/emit/api-route.js +156 -0
  74. package/build/codegen/emit/api-route.js.map +1 -0
  75. package/build/codegen/emit/context.d.ts +30 -0
  76. package/build/codegen/emit/context.js +2 -0
  77. package/build/codegen/emit/context.js.map +1 -0
  78. package/build/codegen/emit/declarations.d.ts +24 -0
  79. package/build/codegen/emit/declarations.js +48 -0
  80. package/build/codegen/emit/declarations.js.map +1 -0
  81. package/build/codegen/emit/format-types.d.ts +61 -0
  82. package/build/codegen/emit/format-types.js +188 -0
  83. package/build/codegen/emit/format-types.js.map +1 -0
  84. package/build/codegen/emit/http-stream-route.d.ts +7 -0
  85. package/build/codegen/emit/http-stream-route.js +138 -0
  86. package/build/codegen/emit/http-stream-route.js.map +1 -0
  87. package/build/codegen/emit/route-shared.d.ts +35 -0
  88. package/build/codegen/emit/route-shared.js +88 -0
  89. package/build/codegen/emit/route-shared.js.map +1 -0
  90. package/build/codegen/emit/rpc-route.d.ts +7 -0
  91. package/build/codegen/emit/rpc-route.js +37 -0
  92. package/build/codegen/emit/rpc-route.js.map +1 -0
  93. package/build/codegen/emit/scope-file.d.ts +39 -0
  94. package/build/codegen/emit/scope-file.js +166 -0
  95. package/build/codegen/emit/scope-file.js.map +1 -0
  96. package/build/codegen/emit/stream-route.d.ts +7 -0
  97. package/build/codegen/emit/stream-route.js +62 -0
  98. package/build/codegen/emit/stream-route.js.map +1 -0
  99. package/build/codegen/emit-errors.d.ts +1 -1
  100. package/build/codegen/emit-errors.integration.test.js +1 -1
  101. package/build/codegen/emit-errors.integration.test.js.map +1 -1
  102. package/build/codegen/emit-index.js +13 -0
  103. package/build/codegen/emit-index.js.map +1 -1
  104. package/build/codegen/emit-index.test.js +25 -0
  105. package/build/codegen/emit-index.test.js.map +1 -1
  106. package/build/codegen/emit-scope.d.ts +13 -30
  107. package/build/codegen/emit-scope.js +15 -807
  108. package/build/codegen/emit-scope.js.map +1 -1
  109. package/build/codegen/emit-scope.test.js +86 -4
  110. package/build/codegen/emit-scope.test.js.map +1 -1
  111. package/build/codegen/goldens.test.js +69 -0
  112. package/build/codegen/goldens.test.js.map +1 -0
  113. package/build/codegen/group-routes.d.ts +1 -1
  114. package/build/codegen/pipeline.d.ts +1 -1
  115. package/build/codegen/resolve-envelope.d.ts +1 -1
  116. package/build/codegen/targets/_shared/error-schemas.d.ts +1 -1
  117. package/build/codegen/targets/_shared/route-slots.d.ts +1 -1
  118. package/build/codegen/targets/_shared/target-run.d.ts +1 -1
  119. package/build/codegen/targets/kotlin/emit-route-kotlin.d.ts +1 -1
  120. package/build/codegen/targets/swift/emit-route-swift.d.ts +1 -1
  121. package/build/core/create-http-stream.d.ts +50 -0
  122. package/build/core/create-http-stream.js +108 -0
  123. package/build/core/create-http-stream.js.map +1 -0
  124. package/build/{create-http-stream.test.js → core/create-http-stream.test.js} +1 -1
  125. package/build/core/create-http-stream.test.js.map +1 -0
  126. package/build/core/create-http.d.ts +51 -0
  127. package/build/core/create-http.js +65 -0
  128. package/build/core/create-http.js.map +1 -0
  129. package/build/{create-http.test.js → core/create-http.test.js} +13 -4
  130. package/build/core/create-http.test.js.map +1 -0
  131. package/build/core/create-stream.d.ts +26 -0
  132. package/build/core/create-stream.js +80 -0
  133. package/build/core/create-stream.js.map +1 -0
  134. package/build/{create-stream.test.js → core/create-stream.test.js} +23 -28
  135. package/build/core/create-stream.test.js.map +1 -0
  136. package/build/core/create.d.ts +22 -0
  137. package/build/core/create.js +71 -0
  138. package/build/core/create.js.map +1 -0
  139. package/build/{create.test.js → core/create.test.js} +25 -46
  140. package/build/core/create.test.js.map +1 -0
  141. package/build/core/definition-site.d.ts +24 -0
  142. package/build/{stack-utils.js → core/definition-site.js} +20 -20
  143. package/build/core/definition-site.js.map +1 -0
  144. package/build/{stack-utils.test.js → core/definition-site.test.js} +12 -3
  145. package/build/core/definition-site.test.js.map +1 -0
  146. package/build/{errors.d.ts → core/errors.d.ts} +19 -8
  147. package/build/{errors.js → core/errors.js} +21 -26
  148. package/build/core/errors.js.map +1 -0
  149. package/build/core/errors.test.js.map +1 -0
  150. package/build/core/factory-options.test.js +82 -0
  151. package/build/core/factory-options.test.js.map +1 -0
  152. package/build/core/http-route.d.ts +13 -0
  153. package/build/core/http-route.js +54 -0
  154. package/build/core/http-route.js.map +1 -0
  155. package/build/core/internal.d.ts +72 -0
  156. package/build/core/internal.js +128 -0
  157. package/build/core/internal.js.map +1 -0
  158. package/build/{migration.test.js → core/migration.test.js} +17 -1
  159. package/build/core/migration.test.js.map +1 -0
  160. package/build/core/procedures.d.ts +143 -0
  161. package/build/core/procedures.js +64 -0
  162. package/build/core/procedures.js.map +1 -0
  163. package/build/{index.test.js → core/procedures.test.js} +14 -11
  164. package/build/core/procedures.test.js.map +1 -0
  165. package/build/core/types.d.ts +182 -0
  166. package/build/{schema → core}/types.js.map +1 -1
  167. package/build/exports.d.ts +31 -11
  168. package/build/exports.js +23 -8
  169. package/build/exports.js.map +1 -1
  170. package/build/schema/adapter.d.ts +35 -0
  171. package/build/schema/adapter.js +13 -0
  172. package/build/schema/adapter.js.map +1 -0
  173. package/build/schema/adapter.test.js +53 -0
  174. package/build/schema/adapter.test.js.map +1 -0
  175. package/build/schema/compile.d.ts +37 -0
  176. package/build/schema/compile.js +38 -0
  177. package/build/schema/compile.js.map +1 -0
  178. package/build/schema/compile.test.js +78 -0
  179. package/build/schema/compile.test.js.map +1 -0
  180. package/build/schema/compute-schema.d.ts +47 -37
  181. package/build/schema/compute-schema.js +86 -29
  182. package/build/schema/compute-schema.js.map +1 -1
  183. package/build/schema/compute-schema.test.js +158 -40
  184. package/build/schema/compute-schema.test.js.map +1 -1
  185. package/build/schema/json-schema.d.ts +17 -0
  186. package/build/schema/json-schema.js +2 -0
  187. package/build/schema/json-schema.js.map +1 -0
  188. package/build/schema/typebox.d.ts +11 -0
  189. package/build/schema/typebox.js +24 -0
  190. package/build/schema/typebox.js.map +1 -0
  191. package/build/schema/typebox.test.js +34 -0
  192. package/build/schema/typebox.test.js.map +1 -0
  193. package/build/server/context.d.ts +8 -0
  194. package/build/server/context.js +7 -0
  195. package/build/server/context.js.map +1 -0
  196. package/build/server/context.test.js +16 -0
  197. package/build/server/context.test.js.map +1 -0
  198. package/build/{doc-envelope.d.ts → server/doc-envelope.d.ts} +1 -1
  199. package/build/server/doc-envelope.js.map +1 -0
  200. package/build/server/doc-envelope.test.d.ts +1 -0
  201. package/build/server/doc-envelope.test.js.map +1 -0
  202. package/build/{implementations/http → server}/doc-registry.d.ts +7 -2
  203. package/build/{implementations/http → server}/doc-registry.js +9 -5
  204. package/build/server/doc-registry.js.map +1 -0
  205. package/build/server/doc-registry.test.d.ts +1 -0
  206. package/build/{implementations/http → server}/doc-registry.test.js +27 -24
  207. package/build/server/doc-registry.test.js.map +1 -0
  208. package/build/server/docs/docs.test.d.ts +1 -0
  209. package/build/server/docs/docs.test.js +237 -0
  210. package/build/server/docs/docs.test.js.map +1 -0
  211. package/build/{implementations/http/hono → server}/docs/http-doc.d.ts +2 -2
  212. package/build/{implementations/http/hono → server}/docs/http-doc.js +1 -1
  213. package/build/server/docs/http-doc.js.map +1 -0
  214. package/build/{implementations/http/hono → server}/docs/http-stream-doc.d.ts +2 -2
  215. package/build/{implementations/http/hono → server}/docs/http-stream-doc.js +1 -1
  216. package/build/server/docs/http-stream-doc.js.map +1 -0
  217. package/build/{implementations/http/hono → server}/docs/rpc-doc.d.ts +2 -2
  218. package/build/{implementations/http/hono → server}/docs/rpc-doc.js +1 -1
  219. package/build/server/docs/rpc-doc.js.map +1 -0
  220. package/build/{implementations/http/hono → server}/docs/stream-doc.d.ts +2 -2
  221. package/build/{implementations/http/hono → server}/docs/stream-doc.js +1 -1
  222. package/build/server/docs/stream-doc.js.map +1 -0
  223. package/build/server/errors/dispatch.d.ts +96 -0
  224. package/build/{implementations/http/error-dispatch.js → server/errors/dispatch.js} +20 -10
  225. package/build/server/errors/dispatch.js.map +1 -0
  226. package/build/server/errors/dispatch.test.d.ts +1 -0
  227. package/build/server/errors/dispatch.test.js +418 -0
  228. package/build/server/errors/dispatch.test.js.map +1 -0
  229. package/build/{implementations/http/error-taxonomy.d.ts → server/errors/taxonomy.d.ts} +8 -17
  230. package/build/{implementations/http/error-taxonomy.js → server/errors/taxonomy.js} +6 -15
  231. package/build/server/errors/taxonomy.js.map +1 -0
  232. package/build/server/errors/taxonomy.test.d.ts +1 -0
  233. package/build/{implementations/http/error-taxonomy.test.js → server/errors/taxonomy.test.js} +45 -39
  234. package/build/server/errors/taxonomy.test.js.map +1 -0
  235. package/build/server/index.d.ts +29 -0
  236. package/build/server/index.js +27 -0
  237. package/build/server/index.js.map +1 -0
  238. package/build/server/no-framework-imports.test.d.ts +1 -0
  239. package/build/server/no-framework-imports.test.js +40 -0
  240. package/build/server/no-framework-imports.test.js.map +1 -0
  241. package/build/{implementations/http/hono/path.d.ts → server/paths.d.ts} +2 -3
  242. package/build/{implementations/http/hono/path.js → server/paths.js} +1 -1
  243. package/build/server/paths.js.map +1 -0
  244. package/build/server/paths.test.d.ts +1 -0
  245. package/build/server/paths.test.js +111 -0
  246. package/build/server/paths.test.js.map +1 -0
  247. package/build/server/request/params.d.ts +29 -0
  248. package/build/server/request/params.js +43 -0
  249. package/build/server/request/params.js.map +1 -0
  250. package/build/server/request/params.test.d.ts +1 -0
  251. package/build/server/request/params.test.js +91 -0
  252. package/build/server/request/params.test.js.map +1 -0
  253. package/build/server/request/query.d.ts +9 -0
  254. package/build/server/request/query.js +22 -0
  255. package/build/server/request/query.js.map +1 -0
  256. package/build/server/request/query.test.d.ts +1 -0
  257. package/build/server/request/query.test.js +60 -0
  258. package/build/server/request/query.test.js.map +1 -0
  259. package/build/server/sse.d.ts +70 -0
  260. package/build/server/sse.js +94 -0
  261. package/build/server/sse.js.map +1 -0
  262. package/build/server/sse.test.d.ts +1 -0
  263. package/build/server/sse.test.js +98 -0
  264. package/build/server/sse.test.js.map +1 -0
  265. package/build/{implementations → server}/types.d.ts +17 -15
  266. package/build/{implementations → server}/types.js.map +1 -1
  267. package/docs/astro-adapter.md +8 -9
  268. package/docs/client-and-codegen.md +4 -4
  269. package/docs/client-error-handling.md +92 -5
  270. package/docs/codegen-kotlin.md +2 -3
  271. package/docs/codegen-swift.md +1 -2
  272. package/docs/core.md +135 -54
  273. package/docs/http-integrations.md +83 -6
  274. package/docs/migration-v8-to-v9.md +192 -0
  275. package/docs/plans/2026-06-09-v9-rewrite.md +130 -0
  276. package/docs/specs/2026-06-09-v9-rewrite-design.md +221 -0
  277. package/docs/streaming.md +12 -0
  278. package/package.json +23 -47
  279. package/src/{implementations/http → adapters}/astro/index.test.ts +2 -2
  280. package/src/adapters/hono/__fixtures__/parity-envelope.json +389 -0
  281. package/src/adapters/hono/envelope-parity.test.ts +126 -0
  282. package/src/{implementations/http → adapters}/hono/handlers/http-stream.test.ts +1 -1
  283. package/src/adapters/hono/handlers/http-stream.ts +73 -0
  284. package/src/{implementations/http → adapters}/hono/handlers/http.test.ts +1 -1
  285. package/src/adapters/hono/handlers/http.ts +70 -0
  286. package/src/{implementations/http → adapters}/hono/handlers/rpc.test.ts +2 -2
  287. package/src/adapters/hono/handlers/rpc.ts +39 -0
  288. package/src/{implementations/http → adapters}/hono/handlers/stream.test.ts +4 -3
  289. package/src/{implementations/http → adapters}/hono/handlers/stream.ts +19 -92
  290. package/src/{implementations/http → adapters}/hono/index.test.ts +14 -16
  291. package/src/{implementations/http → adapters}/hono/index.ts +35 -30
  292. package/src/{implementations/http → adapters/hono}/on-request-error.test.ts +3 -3
  293. package/src/adapters/hono/request.ts +28 -0
  294. package/src/{implementations/http → adapters/hono}/route-errors.test.ts +5 -5
  295. package/src/{implementations/http → adapters}/hono/types.ts +43 -20
  296. package/src/client/freeze.test.ts +41 -0
  297. package/src/client/typed-error-dispatch.test.ts +3 -3
  298. package/src/codegen/__fixtures__/make-envelope.ts +1 -1
  299. package/src/codegen/__fixtures__/models-envelope.json +310 -0
  300. package/src/codegen/__fixtures__/users-envelope.json +9 -0
  301. package/src/codegen/__goldens__/MANIFEST.json +85 -0
  302. package/src/codegen/__goldens__/kotlin-default--models/Billing.kt +112 -0
  303. package/src/codegen/__goldens__/kotlin-default--models/BillingReports.kt +26 -0
  304. package/src/codegen/__goldens__/kotlin-default--models/Orders.kt +88 -0
  305. package/src/codegen/__goldens__/kotlin-default--users/Users.kt +189 -0
  306. package/src/codegen/__goldens__/swift-default--models/Billing.swift +97 -0
  307. package/src/codegen/__goldens__/swift-default--models/BillingReports.swift +20 -0
  308. package/src/codegen/__goldens__/swift-default--models/Orders.swift +81 -0
  309. package/src/codegen/__goldens__/swift-default--users/Users.swift +204 -0
  310. package/src/codegen/__goldens__/ts-default--models/_client.ts +1319 -0
  311. package/src/codegen/__goldens__/ts-default--models/_errors.ts +90 -0
  312. package/src/codegen/__goldens__/ts-default--models/_models.ts +10 -0
  313. package/src/codegen/__goldens__/ts-default--models/_types.ts +502 -0
  314. package/src/codegen/__goldens__/ts-default--models/billing-reports.ts +29 -0
  315. package/src/codegen/__goldens__/ts-default--models/billing.ts +67 -0
  316. package/src/codegen/__goldens__/ts-default--models/index.ts +48 -0
  317. package/src/codegen/__goldens__/ts-default--models/orders.ts +80 -0
  318. package/src/codegen/__goldens__/ts-default--users/_client.ts +1319 -0
  319. package/src/codegen/__goldens__/ts-default--users/_errors.ts +90 -0
  320. package/src/codegen/__goldens__/ts-default--users/_types.ts +502 -0
  321. package/src/codegen/__goldens__/ts-default--users/index.ts +38 -0
  322. package/src/codegen/__goldens__/ts-default--users/users.ts +169 -0
  323. package/src/codegen/__goldens__/ts-external-runtime--models/_errors.ts +90 -0
  324. package/src/codegen/__goldens__/ts-external-runtime--models/_models.ts +10 -0
  325. package/src/codegen/__goldens__/ts-external-runtime--models/billing-reports.ts +29 -0
  326. package/src/codegen/__goldens__/ts-external-runtime--models/billing.ts +67 -0
  327. package/src/codegen/__goldens__/ts-external-runtime--models/index.ts +48 -0
  328. package/src/codegen/__goldens__/ts-external-runtime--models/orders.ts +80 -0
  329. package/src/codegen/__goldens__/ts-external-runtime--users/_errors.ts +90 -0
  330. package/src/codegen/__goldens__/ts-external-runtime--users/index.ts +38 -0
  331. package/src/codegen/__goldens__/ts-external-runtime--users/users.ts +169 -0
  332. package/src/codegen/__goldens__/ts-flat--models/_client.ts +1319 -0
  333. package/src/codegen/__goldens__/ts-flat--models/_errors.ts +87 -0
  334. package/src/codegen/__goldens__/ts-flat--models/_models.ts +10 -0
  335. package/src/codegen/__goldens__/ts-flat--models/_types.ts +502 -0
  336. package/src/codegen/__goldens__/ts-flat--models/billing-reports.ts +28 -0
  337. package/src/codegen/__goldens__/ts-flat--models/billing.ts +51 -0
  338. package/src/codegen/__goldens__/ts-flat--models/index.ts +42 -0
  339. package/src/codegen/__goldens__/ts-flat--models/orders.ts +73 -0
  340. package/src/codegen/__goldens__/ts-flat--users/_client.ts +1319 -0
  341. package/src/codegen/__goldens__/ts-flat--users/_errors.ts +87 -0
  342. package/src/codegen/__goldens__/ts-flat--users/_types.ts +502 -0
  343. package/src/codegen/__goldens__/ts-flat--users/index.ts +34 -0
  344. package/src/codegen/__goldens__/ts-flat--users/users.ts +126 -0
  345. package/src/codegen/__goldens__/ts-no-share-models--models/_client.ts +1319 -0
  346. package/src/codegen/__goldens__/ts-no-share-models--models/_errors.ts +90 -0
  347. package/src/codegen/__goldens__/ts-no-share-models--models/_types.ts +502 -0
  348. package/src/codegen/__goldens__/ts-no-share-models--models/billing-reports.ts +29 -0
  349. package/src/codegen/__goldens__/ts-no-share-models--models/billing.ts +111 -0
  350. package/src/codegen/__goldens__/ts-no-share-models--models/index.ts +48 -0
  351. package/src/codegen/__goldens__/ts-no-share-models--models/orders.ts +112 -0
  352. package/src/codegen/__goldens__/ts-no-share-models--users/_client.ts +1319 -0
  353. package/src/codegen/__goldens__/ts-no-share-models--users/_errors.ts +90 -0
  354. package/src/codegen/__goldens__/ts-no-share-models--users/_types.ts +502 -0
  355. package/src/codegen/__goldens__/ts-no-share-models--users/index.ts +38 -0
  356. package/src/codegen/__goldens__/ts-no-share-models--users/users.ts +169 -0
  357. package/src/codegen/__goldens__/ts-shared-models-module--models/_client.ts +1319 -0
  358. package/src/codegen/__goldens__/ts-shared-models-module--models/_errors.ts +90 -0
  359. package/src/codegen/__goldens__/ts-shared-models-module--models/_models.ts +7 -0
  360. package/src/codegen/__goldens__/ts-shared-models-module--models/_types.ts +502 -0
  361. package/src/codegen/__goldens__/ts-shared-models-module--models/billing-reports.ts +29 -0
  362. package/src/codegen/__goldens__/ts-shared-models-module--models/billing.ts +67 -0
  363. package/src/codegen/__goldens__/ts-shared-models-module--models/index.ts +48 -0
  364. package/src/codegen/__goldens__/ts-shared-models-module--models/orders.ts +80 -0
  365. package/src/codegen/bin/cli.test.ts +13 -2
  366. package/src/codegen/bin/cli.ts +181 -144
  367. package/src/codegen/bin/flag-specs.test.ts +16 -1
  368. package/src/codegen/bin/flag-specs.ts +43 -31
  369. package/src/codegen/bundle-size.test.ts +1 -1
  370. package/src/codegen/collect-models.ts +1 -1
  371. package/src/codegen/e2e.test.ts +1 -1
  372. package/src/codegen/emit/api-route.ts +184 -0
  373. package/src/codegen/emit/context.ts +32 -0
  374. package/src/codegen/emit/declarations.ts +49 -0
  375. package/src/codegen/emit/format-types.ts +232 -0
  376. package/src/codegen/emit/http-stream-route.ts +162 -0
  377. package/src/codegen/emit/route-shared.ts +102 -0
  378. package/src/codegen/emit/rpc-route.ts +49 -0
  379. package/src/codegen/emit/scope-file.ts +226 -0
  380. package/src/codegen/emit/stream-route.ts +81 -0
  381. package/src/codegen/emit-errors.integration.test.ts +2 -2
  382. package/src/codegen/emit-errors.test.ts +1 -1
  383. package/src/codegen/emit-errors.ts +1 -1
  384. package/src/codegen/emit-index.test.ts +34 -0
  385. package/src/codegen/emit-index.ts +19 -0
  386. package/src/codegen/emit-scope.test.ts +96 -6
  387. package/src/codegen/emit-scope.ts +15 -1003
  388. package/src/codegen/goldens.test.ts +89 -0
  389. package/src/codegen/group-routes.test.ts +1 -1
  390. package/src/codegen/group-routes.ts +1 -1
  391. package/src/codegen/pipeline.test.ts +1 -1
  392. package/src/codegen/pipeline.ts +1 -1
  393. package/src/codegen/resolve-envelope.test.ts +1 -1
  394. package/src/codegen/resolve-envelope.ts +1 -1
  395. package/src/codegen/targets/_shared/error-schemas.test.ts +1 -1
  396. package/src/codegen/targets/_shared/error-schemas.ts +1 -1
  397. package/src/codegen/targets/_shared/route-slots.test.ts +1 -1
  398. package/src/codegen/targets/_shared/route-slots.ts +1 -1
  399. package/src/codegen/targets/_shared/target-run.ts +1 -1
  400. package/src/codegen/targets/kotlin/__fixtures__/users-golden.kt +6 -0
  401. package/src/codegen/targets/kotlin/emit-route-kotlin.test.ts +1 -1
  402. package/src/codegen/targets/kotlin/emit-route-kotlin.ts +1 -1
  403. package/src/codegen/targets/kotlin/emit-scope-kotlin.test.ts +1 -1
  404. package/src/codegen/targets/swift/__fixtures__/users-golden.swift +6 -0
  405. package/src/codegen/targets/swift/access-level.test.ts +1 -1
  406. package/src/codegen/targets/swift/emit-route-swift.test.ts +1 -1
  407. package/src/codegen/targets/swift/emit-route-swift.ts +1 -1
  408. package/src/codegen/targets/swift/emit-scope-swift.test.ts +1 -1
  409. package/src/codegen/targets/ts/shared-models.test.ts +1 -1
  410. package/src/{create-http-stream.test.ts → core/create-http-stream.test.ts} +1 -1
  411. package/src/core/create-http-stream.ts +207 -0
  412. package/src/{create-http.test.ts → core/create-http.test.ts} +15 -4
  413. package/src/core/create-http.ts +126 -0
  414. package/src/{create-stream.test.ts → core/create-stream.test.ts} +28 -31
  415. package/src/core/create-stream.ts +142 -0
  416. package/src/{create.test.ts → core/create.test.ts} +25 -57
  417. package/src/core/create.ts +121 -0
  418. package/src/{stack-utils.test.ts → core/definition-site.test.ts} +14 -3
  419. package/src/{stack-utils.ts → core/definition-site.ts} +20 -23
  420. package/src/{errors.test.ts → core/errors.test.ts} +1 -1
  421. package/src/{errors.ts → core/errors.ts} +30 -28
  422. package/src/core/factory-options.test.ts +112 -0
  423. package/src/core/http-route.ts +73 -0
  424. package/src/core/internal.ts +203 -0
  425. package/src/{migration.test.ts → core/migration.test.ts} +23 -1
  426. package/src/{index.test.ts → core/procedures.test.ts} +13 -11
  427. package/src/core/procedures.ts +75 -0
  428. package/src/core/types.ts +195 -0
  429. package/src/exports.ts +60 -11
  430. package/src/schema/adapter.test.ts +58 -0
  431. package/src/schema/adapter.ts +45 -0
  432. package/src/schema/compile.test.ts +95 -0
  433. package/src/schema/compile.ts +64 -0
  434. package/src/schema/compute-schema.test.ts +222 -41
  435. package/src/schema/compute-schema.ts +145 -71
  436. package/src/schema/json-schema.ts +21 -0
  437. package/src/schema/typebox.test.ts +40 -0
  438. package/src/schema/typebox.ts +27 -0
  439. package/src/server/context.test.ts +22 -0
  440. package/src/server/context.ts +18 -0
  441. package/src/{doc-envelope.test.ts → server/doc-envelope.test.ts} +2 -2
  442. package/src/{doc-envelope.ts → server/doc-envelope.ts} +1 -1
  443. package/src/{implementations/http → server}/doc-registry.test.ts +32 -26
  444. package/src/{implementations/http → server}/doc-registry.ts +11 -7
  445. package/src/server/docs/docs.test.ts +287 -0
  446. package/src/{implementations/http/hono → server}/docs/http-doc.ts +3 -3
  447. package/src/{implementations/http/hono → server}/docs/http-stream-doc.ts +3 -3
  448. package/src/{implementations/http/hono → server}/docs/rpc-doc.ts +3 -3
  449. package/src/{implementations/http/hono → server}/docs/stream-doc.ts +3 -3
  450. package/src/server/errors/dispatch.test.ts +450 -0
  451. package/src/server/errors/dispatch.ts +189 -0
  452. package/src/{implementations/http/error-taxonomy.test.ts → server/errors/taxonomy.test.ts} +45 -39
  453. package/src/{implementations/http/error-taxonomy.ts → server/errors/taxonomy.ts} +8 -17
  454. package/src/server/index.ts +29 -0
  455. package/src/server/no-framework-imports.test.ts +43 -0
  456. package/src/server/paths.test.ts +141 -0
  457. package/src/{implementations/http/hono/path.ts → server/paths.ts} +2 -13
  458. package/src/server/request/params.test.ts +143 -0
  459. package/src/server/request/params.ts +68 -0
  460. package/src/server/request/query.test.ts +70 -0
  461. package/src/server/request/query.ts +24 -0
  462. package/src/server/sse.test.ts +113 -0
  463. package/src/server/sse.ts +117 -0
  464. package/src/{implementations → server}/types.ts +17 -16
  465. package/build/create-http-stream.d.ts +0 -58
  466. package/build/create-http-stream.js +0 -122
  467. package/build/create-http-stream.js.map +0 -1
  468. package/build/create-http-stream.test.js.map +0 -1
  469. package/build/create-http.d.ts +0 -49
  470. package/build/create-http.js +0 -108
  471. package/build/create-http.js.map +0 -1
  472. package/build/create-http.test.js.map +0 -1
  473. package/build/create-stream.d.ts +0 -35
  474. package/build/create-stream.js +0 -123
  475. package/build/create-stream.js.map +0 -1
  476. package/build/create-stream.test.js.map +0 -1
  477. package/build/create.d.ts +0 -28
  478. package/build/create.js +0 -82
  479. package/build/create.js.map +0 -1
  480. package/build/create.test.js.map +0 -1
  481. package/build/doc-envelope.js.map +0 -1
  482. package/build/doc-envelope.test.js.map +0 -1
  483. package/build/errors.js.map +0 -1
  484. package/build/errors.test.js.map +0 -1
  485. package/build/implementations/http/astro/astro-context.js.map +0 -1
  486. package/build/implementations/http/astro/create-handler.js.map +0 -1
  487. package/build/implementations/http/astro/index.js.map +0 -1
  488. package/build/implementations/http/astro/index.test.js.map +0 -1
  489. package/build/implementations/http/astro/rewrite-request.js.map +0 -1
  490. package/build/implementations/http/doc-registry.js.map +0 -1
  491. package/build/implementations/http/doc-registry.test.js.map +0 -1
  492. package/build/implementations/http/error-dispatch.d.ts +0 -76
  493. package/build/implementations/http/error-dispatch.js.map +0 -1
  494. package/build/implementations/http/error-dispatch.test.js +0 -254
  495. package/build/implementations/http/error-dispatch.test.js.map +0 -1
  496. package/build/implementations/http/error-taxonomy.js.map +0 -1
  497. package/build/implementations/http/error-taxonomy.test.js.map +0 -1
  498. package/build/implementations/http/hono/docs/http-doc.js.map +0 -1
  499. package/build/implementations/http/hono/docs/http-stream-doc.js.map +0 -1
  500. package/build/implementations/http/hono/docs/rpc-doc.js.map +0 -1
  501. package/build/implementations/http/hono/docs/stream-doc.js.map +0 -1
  502. package/build/implementations/http/hono/handlers/http-stream.js +0 -123
  503. package/build/implementations/http/hono/handlers/http-stream.js.map +0 -1
  504. package/build/implementations/http/hono/handlers/http-stream.test.js.map +0 -1
  505. package/build/implementations/http/hono/handlers/http.js +0 -110
  506. package/build/implementations/http/hono/handlers/http.js.map +0 -1
  507. package/build/implementations/http/hono/handlers/http.test.js.map +0 -1
  508. package/build/implementations/http/hono/handlers/rpc.js +0 -32
  509. package/build/implementations/http/hono/handlers/rpc.js.map +0 -1
  510. package/build/implementations/http/hono/handlers/rpc.test.js.map +0 -1
  511. package/build/implementations/http/hono/handlers/stream.d.ts +0 -23
  512. package/build/implementations/http/hono/handlers/stream.js +0 -147
  513. package/build/implementations/http/hono/handlers/stream.js.map +0 -1
  514. package/build/implementations/http/hono/handlers/stream.test.js.map +0 -1
  515. package/build/implementations/http/hono/index.js.map +0 -1
  516. package/build/implementations/http/hono/index.test.js.map +0 -1
  517. package/build/implementations/http/hono/path.js.map +0 -1
  518. package/build/implementations/http/hono/path.test.js +0 -83
  519. package/build/implementations/http/hono/path.test.js.map +0 -1
  520. package/build/implementations/http/hono/types.d.ts +0 -51
  521. package/build/implementations/http/hono/types.js.map +0 -1
  522. package/build/implementations/http/on-request-error.test.js.map +0 -1
  523. package/build/implementations/http/route-errors.test.js.map +0 -1
  524. package/build/index.d.ts +0 -175
  525. package/build/index.js +0 -47
  526. package/build/index.js.map +0 -1
  527. package/build/index.test.js.map +0 -1
  528. package/build/migration.test.js.map +0 -1
  529. package/build/schema/extract-json-schema.d.ts +0 -2
  530. package/build/schema/extract-json-schema.js +0 -12
  531. package/build/schema/extract-json-schema.js.map +0 -1
  532. package/build/schema/extract-json-schema.test.js +0 -23
  533. package/build/schema/extract-json-schema.test.js.map +0 -1
  534. package/build/schema/parser.d.ts +0 -36
  535. package/build/schema/parser.js +0 -210
  536. package/build/schema/parser.js.map +0 -1
  537. package/build/schema/parser.test.js +0 -120
  538. package/build/schema/parser.test.js.map +0 -1
  539. package/build/schema/resolve-schema-lib.d.ts +0 -12
  540. package/build/schema/resolve-schema-lib.js +0 -11
  541. package/build/schema/resolve-schema-lib.js.map +0 -1
  542. package/build/schema/resolve-schema-lib.test.js +0 -17
  543. package/build/schema/resolve-schema-lib.test.js.map +0 -1
  544. package/build/schema/types.d.ts +0 -8
  545. package/build/schema/types.js +0 -2
  546. package/build/stack-utils.d.ts +0 -25
  547. package/build/stack-utils.js.map +0 -1
  548. package/build/stack-utils.test.js.map +0 -1
  549. package/build/types.d.ts +0 -142
  550. package/build/types.js +0 -2
  551. package/build/types.js.map +0 -1
  552. package/docs/decisions/2026-06-02-monorepo-split-evaluation.md +0 -80
  553. package/docs/handoffs/ajsc-named-type-collision.md +0 -134
  554. package/docs/handoffs/ajsc-named-type-support.md +0 -181
  555. package/docs/handoffs/shared-models-auto-resolve-response.md +0 -181
  556. package/docs/npm-workspaces-migration-plan.md +0 -611
  557. package/docs/superpowers/plans/2026-04-24-doc-registry-simplification.md +0 -886
  558. package/docs/superpowers/plans/2026-04-24-kotlin-codegen-target.md +0 -1265
  559. package/docs/superpowers/plans/2026-04-25-ajsc-v7-kotlin-polish.md +0 -1993
  560. package/docs/superpowers/plans/2026-04-29-safe-result-api.md +0 -2293
  561. package/docs/superpowers/plans/2026-05-07-astro-adapter.md +0 -1391
  562. package/docs/superpowers/plans/2026-05-08-create-http.md +0 -3355
  563. package/docs/superpowers/plans/2026-05-08-hono-app-builder-convergence.md +0 -3365
  564. package/docs/superpowers/plans/2026-06-05-dx-feedback-round.md +0 -1292
  565. package/docs/superpowers/plans/2026-06-06-shared-models-convention-and-diagnostics.md +0 -659
  566. package/docs/superpowers/specs/2026-04-24-kotlin-swift-codegen-design.md +0 -401
  567. package/docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md +0 -314
  568. package/docs/superpowers/specs/2026-04-25-swift-codegen-design.md +0 -264
  569. package/docs/superpowers/specs/2026-04-29-safe-result-api-design.md +0 -324
  570. package/docs/superpowers/specs/2026-05-07-astro-adapter-design.md +0 -252
  571. package/docs/superpowers/specs/2026-05-08-create-http-design.md +0 -409
  572. package/docs/superpowers/specs/2026-05-08-hono-app-builder-convergence-design.md +0 -411
  573. package/docs/superpowers/specs/2026-06-05-dx-feedback-round-design.md +0 -285
  574. package/src/create-http-stream.ts +0 -191
  575. package/src/create-http.ts +0 -210
  576. package/src/create-stream.ts +0 -228
  577. package/src/create.ts +0 -172
  578. package/src/implementations/http/README.md +0 -390
  579. package/src/implementations/http/error-dispatch.test.ts +0 -283
  580. package/src/implementations/http/error-dispatch.ts +0 -176
  581. package/src/implementations/http/hono/handlers/http-stream.ts +0 -152
  582. package/src/implementations/http/hono/handlers/http.ts +0 -145
  583. package/src/implementations/http/hono/handlers/rpc.ts +0 -54
  584. package/src/implementations/http/hono/path.test.ts +0 -96
  585. package/src/index.ts +0 -101
  586. package/src/schema/extract-json-schema.test.ts +0 -25
  587. package/src/schema/extract-json-schema.ts +0 -15
  588. package/src/schema/parser.test.ts +0 -182
  589. package/src/schema/parser.ts +0 -265
  590. package/src/schema/resolve-schema-lib.test.ts +0 -19
  591. package/src/schema/resolve-schema-lib.ts +0 -29
  592. package/src/schema/types.ts +0 -20
  593. package/src/types.ts +0 -133
  594. /package/build/{implementations/http → adapters}/astro/astro-context.d.ts +0 -0
  595. /package/build/{implementations/http → adapters}/astro/astro-context.js +0 -0
  596. /package/build/{implementations/http → adapters}/astro/create-handler.d.ts +0 -0
  597. /package/build/{implementations/http → adapters}/astro/create-handler.js +0 -0
  598. /package/build/{implementations/http → adapters}/astro/index.d.ts +0 -0
  599. /package/build/{implementations/http → adapters}/astro/index.js +0 -0
  600. /package/build/{implementations/http → adapters}/astro/index.test.d.ts +0 -0
  601. /package/build/{implementations/http → adapters}/astro/rewrite-request.d.ts +0 -0
  602. /package/build/{implementations/http → adapters}/astro/rewrite-request.js +0 -0
  603. /package/build/{create-http-stream.test.d.ts → adapters/hono/envelope-parity.test.d.ts} +0 -0
  604. /package/build/{implementations/http → adapters}/hono/handlers/http-stream.test.d.ts +0 -0
  605. /package/build/{implementations/http → adapters}/hono/handlers/http.test.d.ts +0 -0
  606. /package/build/{implementations/http → adapters}/hono/handlers/rpc.test.d.ts +0 -0
  607. /package/build/{implementations/http → adapters}/hono/handlers/stream.test.d.ts +0 -0
  608. /package/build/{implementations/http → adapters}/hono/index.test.d.ts +0 -0
  609. /package/build/{implementations/http → adapters/hono}/on-request-error.test.d.ts +0 -0
  610. /package/build/{implementations/http → adapters/hono}/route-errors.test.d.ts +0 -0
  611. /package/build/{create-http.test.d.ts → client/freeze.test.d.ts} +0 -0
  612. /package/build/{create-stream.test.d.ts → codegen/goldens.test.d.ts} +0 -0
  613. /package/build/{create.test.d.ts → core/create-http-stream.test.d.ts} +0 -0
  614. /package/build/{doc-envelope.test.d.ts → core/create-http.test.d.ts} +0 -0
  615. /package/build/{errors.test.d.ts → core/create-stream.test.d.ts} +0 -0
  616. /package/build/{implementations/http/doc-registry.test.d.ts → core/create.test.d.ts} +0 -0
  617. /package/build/{implementations/http/error-dispatch.test.d.ts → core/definition-site.test.d.ts} +0 -0
  618. /package/build/{implementations/http/error-taxonomy.test.d.ts → core/errors.test.d.ts} +0 -0
  619. /package/build/{errors.test.js → core/errors.test.js} +0 -0
  620. /package/build/{implementations/http/hono/path.test.d.ts → core/factory-options.test.d.ts} +0 -0
  621. /package/build/{migration.test.d.ts → core/migration.test.d.ts} +0 -0
  622. /package/build/{index.test.d.ts → core/procedures.test.d.ts} +0 -0
  623. /package/build/{implementations/http/hono → core}/types.js +0 -0
  624. /package/build/schema/{extract-json-schema.test.d.ts → adapter.test.d.ts} +0 -0
  625. /package/build/schema/{parser.test.d.ts → compile.test.d.ts} +0 -0
  626. /package/build/schema/{resolve-schema-lib.test.d.ts → typebox.test.d.ts} +0 -0
  627. /package/build/{stack-utils.test.d.ts → server/context.test.d.ts} +0 -0
  628. /package/build/{doc-envelope.js → server/doc-envelope.js} +0 -0
  629. /package/build/{doc-envelope.test.js → server/doc-envelope.test.js} +0 -0
  630. /package/build/{implementations → server}/types.js +0 -0
  631. /package/src/{implementations/http → adapters}/astro/README.md +0 -0
  632. /package/src/{implementations/http → adapters}/astro/astro-context.ts +0 -0
  633. /package/src/{implementations/http → adapters}/astro/create-handler.ts +0 -0
  634. /package/src/{implementations/http → adapters}/astro/index.ts +0 -0
  635. /package/src/{implementations/http → adapters}/astro/rewrite-request.ts +0 -0
@@ -10,7 +10,7 @@ ts-procedures can generate type-safe client SDKs directly from your server's `Do
10
10
 
11
11
  ## Quick Start
12
12
 
13
- **Step 1 — Serve your docs endpoint** (see [DocRegistry](./http-integrations.md#docregistry--composing-docs-from-multiple-builders) for setup):
13
+ **Step 1 — Serve your docs endpoint** (see [DocRegistry](./http-integrations.md#docregistry--composing-docs) for setup):
14
14
 
15
15
  ```typescript
16
16
  app.get('/docs', (c) => c.json(docs.toJSON()))
@@ -267,7 +267,7 @@ const client = createClient({
267
267
  })
268
268
  ```
269
269
 
270
- The function form works everywhere a `headers` record does — client `defaults.headers` and per-call `options.headers` — and the same precedence applies: per-call headers (function or record) win over default headers, and route-declared headers from `schema.input.headers` win over both. A per-call function override:
270
+ The function form works everywhere a `headers` record does — client `defaults.headers` and per-call `options.headers` — and the same precedence applies: per-call headers (function or record) win over default headers, and route-declared headers from `schema.req.headers` win over both. A per-call function override:
271
271
 
272
272
  ```typescript
273
273
  await client.users.GetUser(
@@ -489,7 +489,7 @@ Headers and signals combine across layers. From lowest to highest precedence (wi
489
489
  1. Adapter config (e.g., `createFetchAdapter({ headers })`)
490
490
  2. Client `defaults.headers` / `defaults.signal` / `defaults.timeout`
491
491
  3. Per-call `options.headers` / `options.signal` / `options.timeout`
492
- 4. Route-declared headers from `schema.input.headers` (part of the typed contract)
492
+ 4. Route-declared headers from `schema.req.headers` (part of the typed contract)
493
493
  5. `onBeforeRequest` hook mutations — final say
494
494
 
495
495
  ## Streaming
@@ -650,4 +650,4 @@ import type {
650
650
  import { generateClient } from 'ts-procedures/codegen'
651
651
  ```
652
652
 
653
- > **Migration note:** `ClientRequestError` was renamed to `ClientHttpError` in 7.0.0. The old name is re-exported as a deprecated alias for one minor cycle. Update imports when possible.
653
+ > **Migration note:** `ClientRequestError` was renamed to `ClientHttpError` in 7.0.0. The old name is still re-exported as a deprecated alias. Update imports when possible.
@@ -45,7 +45,7 @@ All framework error classes are exported from `ts-procedures/client` (or from `.
45
45
 
46
46
  Every class carries `cause` to surface the underlying platform error — typically a `TypeError` or `DOMException` — when one exists.
47
47
 
48
- `ClientRequestError` is a deprecated alias for `ClientHttpError`. It is retained for one minor release after 7.0.0 and will be removed in a subsequent minor. See the [migration guide](#8-migration-6x--7x) below.
48
+ `ClientRequestError` is a deprecated alias for `ClientHttpError` (renamed in 7.0.0) and will be removed in a future release. See the [migration guide](#8-migration-6x--7x) below.
49
49
 
50
50
  ---
51
51
 
@@ -88,6 +88,66 @@ The `else { throw err }` rethrow at the end is intentional: any error that slips
88
88
 
89
89
  ---
90
90
 
91
+ ## 3a. Discoverability: where the types live and how to reach them
92
+
93
+ Two capabilities are easy to miss because they need no extra imports or wrappers — they fall out of the generated code directly. This section is purely about *finding and using* them.
94
+
95
+ ### Narrowing declared errors on the throwing path
96
+
97
+ You do **not** need `.safe()` to narrow typed errors — the throwing path is fully typed. Declared route errors are **real runtime classes**, so they narrow with the same `try/catch` + `instanceof` pattern shown in §3 (`err instanceof ApiErrors.Conflict`), right alongside the framework transport classes — there's no separate API to learn.
98
+
99
+ What makes them *discoverable*: when a server route declares `errors`, codegen also emits that route's error union as a **named type you can hover and import**, so you can see which classes a call may throw without leaving your editor:
100
+
101
+ - **Namespace mode** (default): `Scope.Route.Errors` — e.g. `Api.Users.CreateUser.Errors`.
102
+ - **Flat mode** (`--no-namespace-types`): `RouteErrors` — e.g. `CreateUserErrors`.
103
+
104
+ The classes themselves are the `${ServiceName}Errors` namespace (default `ApiErrors`) — the same one §3 catches against — and each class name matches the taxonomy key declared on the server. The callable's JSDoc names the union inline too: hovering a declared-error route shows `@throws Declared typed errors: {@link Api.Users.CreateUser.Errors} — narrow on the throwing path (§3), or call .safe() for a Result`.
105
+
106
+ Routes that declare *no* errors omit the `Errors` type (and the `kind: 'typed'` arm on `.safe()`) entirely, so their absence is discoverable too. `.safe()` (§4) stays available whenever you'd rather branch on a returned `Result` than catch.
107
+
108
+ ### Per-call options (signal, timeout, headers, basePath)
109
+
110
+ Every generated callable takes an **optional second argument**: a `ProcedureCallOptions` bag. It is the per-call seam for cancellation, deadlines, headers, and base-path overrides — no client reconfiguration required.
111
+
112
+ ```ts
113
+ export interface ProcedureCallDefaults {
114
+ signal?: AbortSignal // cancel this call (combines with any client-default signal)
115
+ timeout?: number // ms; per-call 0 disables an inherited default timeout
116
+ headers?: ClientHeadersInit // record or (async) () => record; merges over defaults
117
+ basePath?: string // override the base path for this call only
118
+ meta?: RequestMeta // typed per-request metadata (declaration-merged)
119
+ }
120
+ // ProcedureCallOptions = ProcedureCallDefaults + per-call hooks
121
+ ```
122
+
123
+ The most common case is threading an `AbortSignal` so the request cancels when the caller is torn down (component unmount, route change, a newer request superseding an in-flight one):
124
+
125
+ ```ts
126
+ const controller = new AbortController()
127
+
128
+ // Cancel on unmount / navigation:
129
+ const cleanup = () => controller.abort()
130
+
131
+ const user = await api.users.CreateUser(
132
+ { email, displayName },
133
+ { signal: controller.signal },
134
+ )
135
+ ```
136
+
137
+ When the signal fires, the in-flight call rejects with `ClientAbortError` (or resolves to `kind: 'aborted'` under `.safe()`), which you typically treat as silent. A per-call `timeout` fires `ClientTimeoutError` the same way:
138
+
139
+ ```ts
140
+ // A deliberately slow endpoint gets a longer deadline, just for this call:
141
+ const report = await api.reports.GenerateReport(
142
+ { range },
143
+ { timeout: 60_000, signal: controller.signal },
144
+ )
145
+ ```
146
+
147
+ Per-call options layer over client-wide `defaults` (set via `createApiClient({ defaults })`): headers and `meta` merge (per-call keys win), signals combine via `AbortSignal.any` (whichever aborts first wins), and per-call `timeout` overrides the default — with `timeout: 0` opting out of an inherited default entirely. Options are applied before hooks, so an `onBeforeRequest` hook still has the final say. For the full precedence table and the rotating-token `headers` function form, see [`docs/client-and-codegen.md`](./client-and-codegen.md).
148
+
149
+ ---
150
+
91
151
  ## 4. `.safe()` Form: Exhaustive Narrowing
92
152
 
93
153
  The same operation rewritten with `.safe()`. The call never rejects. `r.ok` is the top-level gate; `r.kind` narrows the failure:
@@ -248,7 +308,7 @@ Three breaking changes in 7.0.0 affect error handling.
248
308
 
249
309
  ### 8a. `ClientRequestError` Renamed to `ClientHttpError`
250
310
 
251
- `ClientRequestError` is a deprecated alias for `ClientHttpError`, retained for one minor release after 7.0.0.
311
+ `ClientRequestError` is a deprecated alias for `ClientHttpError`, retained for backward compatibility since 7.0.0.
252
312
 
253
313
  **Action**: rename your imports from `ClientRequestError` to `ClientHttpError`. The `instanceof ClientRequestError` guard continues to work until the alias is removed.
254
314
 
@@ -352,6 +412,33 @@ A framework-level "skip `onError` for `.safe()`" toggle was deliberately deferre
352
412
 
353
413
  ## 10. Reference
354
414
 
355
- - Design spec: [`docs/superpowers/specs/2026-04-29-safe-result-api-design.md`](./superpowers/specs/2026-04-29-safe-result-api-design.md)
356
- - Client types and interfaces: `CLAUDE.md` "Key Files" → `src/client/`
357
- - Agent config patterns and anti-patterns: `agent_config/claude-code/skills/ts-procedures/patterns.md` and `anti-patterns.md`
415
+ - Codegen setup, per-call options, hooks, and typed-error wiring: [`docs/client-and-codegen.md`](./client-and-codegen.md)
416
+ - Client types and interfaces: package source under `src/client/` (`types.ts`, `errors.ts`, `error-dispatch.ts`)
417
+ - Agent config patterns and anti-patterns: [`agent_config/claude-code/skills/ts-procedures/patterns.md`](../agent_config/claude-code/skills/ts-procedures/patterns.md) and [`anti-patterns.md`](../agent_config/claude-code/skills/ts-procedures/anti-patterns.md)
418
+
419
+ ---
420
+
421
+ ## 11. Design note: typed errors and your state layer
422
+
423
+ ts-procedures throws real, `instanceof`-catchable error classes. On the throwing path you `catch (err)` and narrow with `instanceof` (§3); with `.safe()` you get the same instances inside a `Result` (§4). Either way, the actual thrown value reaches your handler intact — that is the headline of this client's error model, and nothing below qualifies it.
424
+
425
+ ### Where the boundary sits
426
+
427
+ A state-management layer that sits between the call and your UI (for example, an async-task tracker in an MVC/store library) sometimes records a failure as a flattened, closed code union — mapping every rejection down to a `string` code or a single `error` enum before your view layer sees it. When that happens, the typed instance is intact when ts-procedures throws it, and lossy by the time your component reads task state. The narrowing in §3/§4 still works at the call site; what changes is what survives storage in the layer above.
428
+
429
+ That flattening is a property of the state layer, not of the transport. ts-procedures has already done its job: it produced an instance you can narrow. The fix — preserving the original thrown value (or its `cause`) on the task state so the UI can still narrow with `instanceof` — belongs to the state layer, which owns that storage decision.
430
+
431
+ ### Why the client does not add a transform hook
432
+
433
+ It would be possible to add a client-level "error map" or transform hook that pre-shapes thrown errors into whatever a given state layer expects. We have deliberately chosen not to, for two reasons:
434
+
435
+ 1. **It would erase the win.** The value of typed errors is that the *original instance* reaches you. A transform that reshapes errors at the transport boundary to satisfy a downstream consumer is the same flattening, just moved one layer earlier — every other consumer of the same client would inherit a lossy shape to accommodate one state layer.
436
+ 2. **The seam already exists, and it is an observer by design.** The `onError` hook (`ClientHooks.onError`) is typed to return `void` — it is a cross-cutting observer for telemetry, not a mutator. The error it observes is the same instance the client then throws; the hook cannot rewrite it, and that is intentional. Both call paths re-throw the original: the typed registry match is thrown as-is (tagged only with an internal `__tsProceduresTyped` marker so `.safe()` can label its `kind`), and the classified adapter error is thrown as the normalized framework instance. The transport's contract is "you get the instance"; honoring that means not reshaping it on the way out.
437
+
438
+ ### What to do instead
439
+
440
+ - **Catch at the call site.** Narrow with `instanceof` on the throwing path (§3), or read `Result.error` from `.safe()` (§4), before the value enters a state layer that might flatten it.
441
+ - **Carry the original through your state layer.** If your tracker stores a flattened code, also store the original thrown value (or `error.cause`) alongside it, and narrow against that in the UI. Every framework class carries `cause` for exactly this kind of pass-through (§2).
442
+ - **If your state layer can't carry it, that's where the change goes.** Surfacing the original error on task state is a state-layer concern. ts-procedures will keep throwing the instance; preserving it across the storage boundary is the layer that owns that boundary's responsibility.
443
+
444
+ This keeps each layer's contract clean: the client guarantees a typed, narrowable instance at the throw site, and the state layer decides how much of it to retain.
@@ -141,7 +141,7 @@ Choosing the dispatch strategy (status-code based, body.name based, sealed-class
141
141
 
142
142
  ## Untagged unions
143
143
 
144
- ajsc v7.2's Kotlin emitter silently produces an empty `@Serializable data class` for any untagged `oneOf` schema, regardless of whether `--unsupported-unions fallback` is set. There is no "throws on default" mode for Kotlin (that's Swift behavior). The `--unsupported-unions` flag is currently a no-op for the Kotlin target.
144
+ ajsc's Kotlin emitter (as of the bundled 7.x) silently produces an empty `@Serializable data class` for any untagged `oneOf` schema, regardless of whether `--unsupported-unions fallback` is set. There is no "throws on default" mode for Kotlin (that's Swift behavior). The `--unsupported-unions` flag is currently a no-op for the Kotlin target.
145
145
 
146
146
  For example, the schema `oneOf: [{ type: 'string' }, { type: 'integer' }]` with `rootTypeName: 'Mixed'` produces:
147
147
 
@@ -170,7 +170,6 @@ The following ajsc behaviors are intentional and documented; they are **not bugs
170
170
 
171
171
  ## Reference
172
172
 
173
- - Spec: [`docs/superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md`](./superpowers/specs/2026-04-25-ajsc-v7-kotlin-polish-design.md)
174
173
  - For iOS / macOS / Apple-platform consumers, see [`docs/codegen-swift.md`](./codegen-swift.md) — same types-only design with Swift-specific flags and `Codable` setup notes.
175
174
  - ajsc README: `node_modules/ajsc/README.md` (or [npmjs.com/package/ajsc](https://www.npmjs.com/package/ajsc))
176
- - ts-procedures-codegen CLI flags: see `CLAUDE.md` (search for "Kotlin target") and the spec linked above. (`--help` is not currently implemented; pass invalid/missing args to see error messages with usage hints.)
175
+ - ts-procedures-codegen CLI flags: run `npx ts-procedures-codegen --help` for the full grouped flag catalog. Kotlin-specific flags: `--kotlin-package` (required), `--kotlin-serializer`, `--unsupported-unions`.
@@ -308,7 +308,6 @@ The following ajsc behaviors are intentional and documented; they are **not bugs
308
308
 
309
309
  ## Reference
310
310
 
311
- - Spec: [`docs/superpowers/specs/2026-04-25-swift-codegen-design.md`](./superpowers/specs/2026-04-25-swift-codegen-design.md)
312
311
  - For Kotlin / Android consumers, see [`docs/codegen-kotlin.md`](./codegen-kotlin.md) — same types-only design with Kotlin-specific flags and `kotlinx.serialization` setup notes.
313
312
  - ajsc README: `node_modules/ajsc/README.md` (or [npmjs.com/package/ajsc](https://www.npmjs.com/package/ajsc))
314
- - ts-procedures-codegen CLI flags: see `CLAUDE.md` (search for "Swift target") and the spec linked above. (`--help` is not currently implemented; pass invalid/missing args to see error messages with usage hints.)
313
+ - ts-procedures-codegen CLI flags: run `npx ts-procedures-codegen --help` for the full grouped flag catalog. Swift-specific flags: `--swift-serializer`, `--swift-access-level`, `--unsupported-unions`.
package/docs/core.md CHANGED
@@ -6,21 +6,27 @@ ts-procedures creates type-safe, schema-validated procedure calls with a single
6
6
 
7
7
  ## Procedures Factory
8
8
 
9
- The `Procedures()` function creates a factory for defining procedures. It accepts two generic type parameters:
9
+ The `Procedures()` function creates a factory for defining procedures. It accepts two generic type parameters and a flat options bag:
10
10
 
11
11
  ```typescript
12
- Procedures<TContext, TExtendedConfig>(builder?: {
13
- config?: { noRuntimeValidation?: true }
14
- onCreate?: (procedure: TProcedureRegistration<TContext, TExtendedConfig>) => void
12
+ Procedures<TContext, TExtendedConfig>(options?: {
13
+ validation?: false | { ajv?: Ajv | AjvOptions }
14
+ schema?: { adapters?: SchemaAdapter[] }
15
+ http?: { pathPrefix?: string; scope?: string }
16
+ onCreate?: (procedure: AnyProcedureRegistration<TContext, TExtendedConfig>) => void
15
17
  })
16
18
  ```
17
19
 
18
20
  | Parameter | Description |
19
21
  |-----------|----------------------------------------------------------------------------|
20
22
  | `TContext` | The base context type passed to all handlers as the first parameter |
21
- | `TExtendedConfig` | Additional configuration properties for all procedures `config` properties |
22
- | `builder.config.noRuntimeValidation` | When `true`, every procedure created by this factory skips AJV validation of `schema.params` and `schema.input` at call time. Applies to both `Create` and `CreateStream`. Default: validation runs. |
23
- | `builder.onCreate` | Optional callback invoked when each procedure is registered (runtime) |
23
+ | `TExtendedConfig` | Additional configuration properties for all procedures `config` properties (applies to `Create` and `CreateStream`) |
24
+ | `options.validation` | `false` skips per-call AJV validation for the whole factory (see [Disabling Runtime Validation](#disabling-runtime-validation)); `{ ajv }` customizes AJV options merged over the defaults, or a configured `Ajv` instance used as-is. Default: validation runs with the default AJV configuration. |
25
+ | `options.schema.adapters` | Plug in additional schema libraries via the `SchemaAdapter` interface. TypeBox is built in. See [Other Schema Libraries](#other-schema-libraries--schemaadapter). |
26
+ | `options.http` | Factory-level defaults for `CreateHttp` / `CreateHttpStream`: `pathPrefix` is prepended to every route's `path` at registration time (part of the route's identity, unlike a server builder's mount prefix), and `scope` is the default codegen scope for routes that don't set one. Per-route config always wins. |
27
+ | `options.onCreate` | Optional callback invoked when each procedure is registered (runtime) |
28
+
29
+ **Returns:** `Create`, `CreateStream`, `CreateHttp`, `CreateHttpStream`, plus introspection helpers `getProcedures()`, `getProcedure(name)`, `removeProcedure(name)`, and `clear()`.
24
30
 
25
31
  ## Create Function
26
32
 
@@ -33,27 +39,27 @@ Create(name, config, handler)
33
39
  **Returns:**
34
40
  - `{ [name]: handler }` - Named export for the handler
35
41
  - `procedure` - Generic reference to the handler
36
- - `info` - Procedure metadata (name, description, schema, `TExtendedConfig` properties, etc.)
42
+ - `info` - Procedure metadata (name, `kind: 'rpc'`, description, schema, `TExtendedConfig` properties, etc.)
37
43
 
38
- ## Structured Input with schema.input
44
+ ## HTTP Procedures with CreateHttp
39
45
 
40
- For HTTP APIs and other multi-channel transports, `schema.input` provides per-channel type safety. Each key is an independently validated input channel:
46
+ For HTTP APIs and other multi-channel transports, `CreateHttp` provides per-channel type safety via `schema.req`. Each key is an independently validated input channel:
41
47
 
42
48
  ```typescript
43
- const { Create } = Procedures<AppContext, APIConfig>()
49
+ const { CreateHttp } = Procedures<AppContext>()
44
50
 
45
- const { UpdateUser } = Create(
51
+ const { UpdateUser } = CreateHttp(
46
52
  'UpdateUser',
47
53
  {
48
54
  path: '/users/:id',
49
55
  method: 'put',
50
56
  schema: {
51
- input: {
57
+ req: {
52
58
  pathParams: Type.Object({ id: Type.String() }),
53
59
  query: Type.Object({ notify: Type.Optional(Type.Boolean()) }),
54
60
  body: Type.Object({ name: Type.String(), email: Type.String() }),
55
61
  },
56
- returnType: Type.Object({ ok: Type.Boolean() }),
62
+ res: { body: Type.Object({ ok: Type.Boolean() }) },
57
63
  },
58
64
  },
59
65
  async (ctx, { pathParams, query, body }) => {
@@ -66,9 +72,13 @@ const { UpdateUser } = Create(
66
72
  ```
67
73
 
68
74
  **Rules:**
69
- - `schema.input` and `schema.params` are **mutually exclusive** — defining both throws `ProcedureRegistrationError`
70
- - Each channel is validated independently with per-channel error messages
71
- - Works with both `Create` and `CreateStream`
75
+ - `schema.req` and `schema.params` are **mutually exclusive** — `schema.params` belongs to RPC procedures (`Create`/`CreateStream`), `schema.req` to HTTP procedures. Using `schema.params` on `CreateHttp` throws `ProcedureRegistrationError`.
76
+ - Valid channels are `pathParams`, `query`, `body`, and `headers`; each is validated independently with per-channel error messages.
77
+ - `schema.res.body` documents the response body (drives codegen); omit `schema.res` entirely for 204-style no-content routes.
78
+ - Factory-level `http.pathPrefix` / `http.scope` defaults apply; per-route config wins.
79
+ - For HTTP streaming routes, use `CreateHttpStream` — same `schema.req` channels plus `schema.yield`.
80
+
81
+ For routing, status codes, and error handling for HTTP procedures, see [HTTP Integrations](./http-integrations.md).
72
82
 
73
83
  ## CreateStream Function
74
84
 
@@ -98,10 +108,23 @@ When using the built-in HTTP implementation (Hono), `ctx.signal` is automaticall
98
108
  **Returns:**
99
109
  - `{ [name]: handler }` - Named generator export
100
110
  - `procedure` - Generic reference to the generator
101
- - `info` - Procedure meta with `isStream: true`
111
+ - `info` - Procedure meta with `kind: 'rpc-stream'`
102
112
 
103
113
  For detailed streaming documentation (yield validation, abort signals, SSE integration), see [Streaming Procedures](./streaming.md).
104
114
 
115
+ ## Procedure Kinds
116
+
117
+ Every registration — and every creator's `info` — carries a `kind` discriminant for type narrowing:
118
+
119
+ | Creator | `kind` |
120
+ |---------|--------|
121
+ | `Create` | `'rpc'` |
122
+ | `CreateStream` | `'rpc-stream'` |
123
+ | `CreateHttp` | `'http'` |
124
+ | `CreateHttpStream` | `'http-stream'` |
125
+
126
+ Branch on `kind` in `onCreate` callbacks and `getProcedures()` consumers to narrow a registration to its specific shape.
127
+
105
128
  ## Using Generics
106
129
 
107
130
  ### Base Context
@@ -161,6 +184,8 @@ const { AdminOnly } = Create(
161
184
  console.log(AdminOnly.info.permissions) // ['admin']
162
185
  ```
163
186
 
187
+ `TExtendedConfig` applies to `Create` and `CreateStream`. `CreateHttp` / `CreateHttpStream` have their own fixed config shape (`path`, `method`, `successStatus`, `scope`, `errors`, `schema`).
188
+
164
189
  ### Combined Example
165
190
 
166
191
  ```typescript
@@ -177,8 +202,10 @@ interface ExtendedConfig {
177
202
  const { Create, getProcedures } = Procedures<CustomContext, ExtendedConfig>({
178
203
  onCreate: (procedure) => {
179
204
  // Register with your framework
180
- console.log(`Registered: ${procedure.name}`)
181
- console.log(`Requires Auth: ${procedure.config.requiresAuth}`)
205
+ console.log(`Registered: ${procedure.name} (${procedure.kind})`)
206
+ if (procedure.kind === 'rpc') {
207
+ console.log(`Requires Auth: ${procedure.config.requiresAuth}`)
208
+ }
182
209
  },
183
210
  })
184
211
 
@@ -212,10 +239,31 @@ import { Type } from 'typebox'
212
239
  schema: { params: Type.Object({ title: Type.String() }) }
213
240
  ```
214
241
 
215
- TypeBox schemas are valid JSON Schema and work directly with AJV for runtime validation.
242
+ TypeBox schemas are valid JSON Schema and work directly with AJV for runtime validation. Handler param and return types are inferred from the schemas via `Infer<T>`.
216
243
 
217
244
  > **Composing schemas:** the bundled typebox has no `Type.Composite`. Compose with a flat object spread instead — `Type.Object({ ...Base.properties, extra: Type.String() })` — which also keeps the emitted JSON Schema a single `object` rather than an `allOf`.
218
245
 
246
+ ### Other Schema Libraries — SchemaAdapter
247
+
248
+ TypeBox is built in. To register procedures with another schema library, implement the 3-member `SchemaAdapter` interface and pass it to the factory:
249
+
250
+ ```typescript
251
+ import type { SchemaAdapter } from 'ts-procedures'
252
+ import * as z from 'zod'
253
+
254
+ const zodAdapter: SchemaAdapter = {
255
+ name: 'zod', // used in registration error messages
256
+ detect: (s) => s instanceof z.ZodType, // does this adapter recognize the schema?
257
+ toJsonSchema: (s) => z.toJSONSchema(s as z.ZodType), // convert to JSON Schema
258
+ }
259
+
260
+ const { Create } = Procedures({ schema: { adapters: [zodAdapter] } })
261
+ ```
262
+
263
+ The framework only ever needs one thing from a schema object: its JSON Schema. Everything downstream (AJV validation, route docs, codegen) works on JSON Schema.
264
+
265
+ > **Note:** compile-time type inference (`Infer<T>`) is built in only for TypeBox. Custom adapters get runtime validation and docs, with params inferred as `unknown` unless you annotate handler types yourself.
266
+
219
267
  ### Validation Behavior
220
268
 
221
269
  AJV is configured with:
@@ -223,21 +271,29 @@ AJV is configured with:
223
271
  - `coerceTypes: true` - Automatically coerce types when possible
224
272
  - `removeAdditional: true` - Strip properties not in schema
225
273
 
274
+ Each factory owns its own AJV compiler. Customize it via the `validation` option — pass AJV options to merge over the defaults, or a fully configured `Ajv` instance to use as-is:
275
+
276
+ ```typescript
277
+ const { Create } = Procedures({
278
+ validation: { ajv: { coerceTypes: false } },
279
+ })
280
+ ```
281
+
226
282
  **Note:** `schema.params` is validated at runtime. `schema.returnType` is for documentation/introspection only.
227
283
 
228
284
  ### Disabling Runtime Validation
229
285
 
230
- For trusted internal callers — for example, a back-of-house factory whose inputs are already type-checked at build time and whose handlers are never invoked from public HTTP — pass `config.noRuntimeValidation: true` when constructing the factory:
286
+ For trusted internal callers — for example, a back-of-house factory whose inputs are already type-checked at build time and whose handlers are never invoked from public HTTP — pass `validation: false` when constructing the factory:
231
287
 
232
288
  ```typescript
233
289
  const { Create, CreateStream } = Procedures({
234
- config: { noRuntimeValidation: true },
290
+ validation: false,
235
291
  })
236
292
  ```
237
293
 
238
- When set, every procedure registered by this factory skips AJV validation of `schema.params` and `schema.input` on every call. JSON Schema is still computed at registration time (so `info.schema` and codegen are unaffected) — only the per-call validator runs are bypassed.
294
+ When set, every procedure registered by this factory skips AJV validation of `schema.params` and `schema.req` on every call. JSON Schema and validators are still computed at registration time (so bad schemas fail fast, and `info.schema` and codegen are unaffected) — only the per-call validator runs are bypassed.
239
295
 
240
- **Use sparingly.** Do not enable this for procedures that accept input from public clients, untyped JSON bodies, or anything you do not control end-to-end. The flag is shaped as `noRuntimeValidation?: true` (only `true` is accepted) to make the opt-out explicit at the call site.
296
+ **Use sparingly.** Do not enable this for procedures that accept input from public clients, untyped JSON bodies, or anything you do not control end-to-end.
241
297
 
242
298
  This is independent of the per-call `ctx.isPrevalidated` escape hatch used by HTTP builders that have already validated upstream — both paths short-circuit the same validators.
243
299
 
@@ -267,11 +323,13 @@ Create(
267
323
  | Error Class | Trigger |
268
324
  |-------------|---------|
269
325
  | ProcedureError | `ctx.error()` in handlers |
270
- | ProcedureValidationError | Schema validation failure (params) |
326
+ | ProcedureValidationError | Schema validation failure (params / req channels) |
271
327
  | ProcedureYieldValidationError | Yield validation failure (streaming with `validateYields: true`) |
272
- | ProcedureRegistrationError | Invalid schema at registration |
328
+ | ProcedureRegistrationError | Invalid schema at registration; duplicate procedure name |
273
329
  | `${Service}ProcedureError` (client-side) | Base class for every generated error class on the client — see [Client & Codegen → Typed Error Handling](./client-and-codegen.md#typed-error-handling) |
274
330
 
331
+ Every framework error also carries a `kind` field (`'procedure' | 'validation' | 'yield-validation' | 'registration'`) as an alternative to `instanceof` narrowing.
332
+
275
333
  ### Error Properties
276
334
 
277
335
  ```typescript
@@ -282,6 +340,7 @@ try {
282
340
  console.log(e.procedureName) // 'MyProcedure'
283
341
  console.log(e.message) // 'Resource not found'
284
342
  console.log(e.meta) // { id: '123' }
343
+ console.log(e.kind) // 'procedure'
285
344
  }
286
345
  }
287
346
  ```
@@ -320,7 +379,7 @@ For streaming abort signal behavior (including `signal.reason` and consumer brea
320
379
 
321
380
  ### onCreate Callback
322
381
 
323
- Register procedures with a custom framework via the `onCreate` callback. Each registration receives `{ name, handler, config }` so you can wire it into whatever router or framework you want:
382
+ Register procedures with a custom framework via the `onCreate` callback. Each registration receives `{ name, kind, handler, config }` so you can wire it into whatever router or framework you want:
324
383
 
325
384
  ```typescript
326
385
  import { Hono } from 'hono'
@@ -347,7 +406,7 @@ const { Create } = Procedures<{ raw: unknown }>({
347
406
  // Procedures are automatically registered as /rpc/GetUser, /rpc/CreateUser, etc.
348
407
  ```
349
408
 
350
- For the built-in HTTP integration (RPC, RPC streams, REST, REST streams via `HonoAppBuilder`), see [HTTP Integrations](./http-integrations.md).
409
+ For the built-in HTTP integration (RPC, RPC streams, REST, REST streams via `HonoAppBuilder`), see [HTTP Integrations](./http-integrations.md). To build a full adapter for another framework (route docs, taxonomy dispatch, SSE), use the transport-agnostic [`ts-procedures/server` toolkit](./http-integrations.md#build-your-own-adapter--ts-proceduresserver) instead of hand-rolling everything in `onCreate`.
351
410
 
352
411
  ### Introspection with getProcedures()
353
412
 
@@ -359,12 +418,12 @@ const { Create, getProcedures } = Procedures()
359
418
  Create('GetUser', { schema: { params: Type.Object({ id: Type.String() }) } }, async () => {})
360
419
  Create('ListUsers', { schema: { params: Type.Object({}) } }, async () => {})
361
420
 
362
- // Get all registered procedures
421
+ // Get all registered procedures (in registration order)
363
422
  const procedures = getProcedures()
364
423
 
365
424
  // Generate OpenAPI spec
366
- for (const config of procedures) {
367
- console.log(`${config.name}:`, config.schema)
425
+ for (const p of procedures) {
426
+ console.log(`${p.name} (${p.kind}):`, p.config.schema)
368
427
  }
369
428
  ```
370
429
 
@@ -374,7 +433,7 @@ Procedures return handlers that can be called directly in tests:
374
433
 
375
434
  ```typescript
376
435
  import { describe, test, expect } from 'vitest'
377
- import { Procedures } from 'ts-procedures'
436
+ import { Procedures, ProcedureValidationError } from 'ts-procedures'
378
437
  import { Type } from 'typebox'
379
438
 
380
439
  interface MyCustomContext {
@@ -393,13 +452,13 @@ const { GetUser, info } = Create(
393
452
  },
394
453
  },
395
454
  async (ctx, params) => {
396
- if (!params.userName || !ctx.userId) {
455
+ if (!ctx.userName || !ctx.userId) {
397
456
  throw ctx.error('User is not authenticated')
398
457
  }
399
458
 
400
459
  return {
401
- id: params.userId,
402
- name: params?.hideName ? '*******' : params.userName
460
+ id: ctx.userId,
461
+ name: params?.hideName ? '*******' : ctx.userName
403
462
  }
404
463
  },
405
464
  )
@@ -432,24 +491,27 @@ describe('GetUser', () => {
432
491
 
433
492
  ## API Reference
434
493
 
435
- ### Procedures(builder?)
494
+ ### Procedures(options?)
436
495
 
437
496
  Creates a procedure factory.
438
497
 
439
498
  **Parameters:**
440
- - `builder.config.noRuntimeValidation` - When `true`, every procedure registered through this factory skips AJV validation of `schema.params` and `schema.input` at call time. Default: validation runs. See [Disabling Runtime Validation](#disabling-runtime-validation).
441
- - `builder.onCreate` - Callback invoked when each procedure is registered
499
+ - `options.validation` - `false` to skip per-call validation for the whole factory (see [Disabling Runtime Validation](#disabling-runtime-validation)), or `{ ajv }` to customize AJV (options merged over defaults, or an `Ajv` instance). Default: validation runs.
500
+ - `options.schema.adapters` - Additional schema-library adapters (see [Other Schema Libraries](#other-schema-libraries--schemaadapter))
501
+ - `options.http` - Factory-level `pathPrefix` / `scope` defaults for `CreateHttp` / `CreateHttpStream`
502
+ - `options.onCreate` - Callback invoked when each procedure is registered
442
503
 
443
504
  **Returns:**
444
- - `Create` - Function to define procedures
445
- - `getProcedures()` - Returns `Array` of all registered procedures
505
+ - `Create` / `CreateStream` / `CreateHttp` / `CreateHttpStream` - Functions to define procedures
506
+ - `getProcedures()` - Returns `Array` of all registered procedures (`{ name, kind, config, handler }`)
507
+ - `getProcedure(name)` / `removeProcedure(name)` / `clear()` - Registry helpers
446
508
 
447
509
  ### Create(name, config, handler)
448
510
 
449
511
  Defines a procedure.
450
512
 
451
513
  **Parameters:**
452
- - `name` - Unique procedure name (becomes named export)
514
+ - `name` - Unique procedure name (becomes named export; registering the same name twice throws `ProcedureRegistrationError`)
453
515
  - `config.description` - Optional description
454
516
  - `config.schema.params` - TypeBox schema for params (validated at runtime)
455
517
  - `config.schema.returnType` - TypeBox schema for return type (documentation only)
@@ -459,7 +521,7 @@ Defines a procedure.
459
521
  **Returns:**
460
522
  - `{ [name]: handler }` - Named handler export
461
523
  - `procedure` - Generic handler reference
462
- - `info` - Procedure metadata (name, description, schema, extended-config properties)
524
+ - `info` - Procedure metadata (name, `kind`, description, schema, extended-config properties)
463
525
 
464
526
  ### Type Exports
465
527
 
@@ -474,23 +536,42 @@ import {
474
536
  ProcedureRegistrationError,
475
537
  ProcedureYieldValidationError, // For streaming yield validation
476
538
 
477
- // Types
478
- TLocalContext,
479
- TStreamContext, // Streaming context (AbortSignal always present)
539
+ // Schema utilities (low-level — the factory calls these for you)
540
+ extractJsonSchema, // extractJsonSchema(schema, adapters)
541
+ computeSchema, // computeSchema(name, schema, { adapters, compile })
542
+ createValidatorCompiler, // per-factory AJV compiler (no module singleton)
543
+ typeboxAdapter,
544
+ isTypeboxSchema,
545
+ DEFAULT_AJV_OPTIONS,
546
+ } from 'ts-procedures'
547
+
548
+ import type {
549
+ // Factory + registrations
550
+ ProceduresOptions,
551
+ ProcedureKind, // 'rpc' | 'rpc-stream' | 'http' | 'http-stream'
552
+ AnyProcedureRegistration,
480
553
  TProcedureRegistration,
481
- TStreamProcedureRegistration, // Streaming procedure registration
554
+ TStreamProcedureRegistration,
555
+ THttpProcedureRegistration,
556
+ THttpStreamProcedureRegistration,
557
+ TCreateHttpConfig,
558
+ TLocalContext,
559
+ TStreamContext, // Streaming context (AbortSignal always present)
482
560
  TNoContextProvided,
561
+ HttpMethod,
562
+ HttpReturn,
483
563
 
484
- // Schema utilities
485
- extractJsonSchema,
486
- schemaParser,
487
- isTypeboxSchema,
564
+ // Errors
565
+ ProcedureErrorKind, // 'procedure' | 'validation' | 'yield-validation' | 'registration'
488
566
 
489
567
  // Schema types
568
+ SchemaAdapter,
569
+ ValidationOptions,
570
+ Validate,
571
+ ValidatorCompiler,
572
+ Infer, // primary inference type (TypeBox-only)
573
+ TSchemaLib, // alias for Infer (kept for compatibility)
490
574
  TJSONSchema,
491
- TSchemaLib,
492
- TSchemaLibGenerator, // AsyncGenerator type utility
493
- TSchemaParsed,
494
575
  TSchemaValidationError,
495
576
  Prettify,
496
577
  } from 'ts-procedures'