@warlock.js/core 5.28.0 → 5.30.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 (1396) hide show
  1. package/CHANGELOG.md +71 -0
  2. package/esm/application/app.d.mts +1 -1
  3. package/esm/application/app.d.mts.map +1 -1
  4. package/esm/application/app.mjs +1 -1
  5. package/esm/application/app.mjs.map +1 -1
  6. package/esm/application/application-config-types.d.mts +1 -1
  7. package/esm/application/application-config-types.d.mts.map +1 -1
  8. package/esm/application/application.d.mts +1 -1
  9. package/esm/application/application.d.mts.map +1 -1
  10. package/esm/application/application.mjs +1 -1
  11. package/esm/application/application.mjs.map +1 -1
  12. package/esm/application/boot-signal.d.mts +1 -1
  13. package/esm/application/boot-signal.d.mts.map +1 -1
  14. package/esm/application/boot-signal.mjs +1 -1
  15. package/esm/application/boot-signal.mjs.map +1 -1
  16. package/esm/application/public-url.d.mts +1 -1
  17. package/esm/application/public-url.d.mts.map +1 -1
  18. package/esm/application/public-url.mjs +1 -1
  19. package/esm/application/public-url.mjs.map +1 -1
  20. package/esm/application/roles.d.mts +1 -1
  21. package/esm/application/roles.d.mts.map +1 -1
  22. package/esm/application/roles.mjs +1 -1
  23. package/esm/application/roles.mjs.map +1 -1
  24. package/esm/benchmark/benchmark-snapshots.d.mts +1 -1
  25. package/esm/benchmark/benchmark-snapshots.d.mts.map +1 -1
  26. package/esm/benchmark/benchmark-snapshots.mjs +1 -1
  27. package/esm/benchmark/benchmark-snapshots.mjs.map +1 -1
  28. package/esm/benchmark/benchmark.d.mts +1 -1
  29. package/esm/benchmark/benchmark.d.mts.map +1 -1
  30. package/esm/benchmark/benchmark.mjs +1 -1
  31. package/esm/benchmark/benchmark.mjs.map +1 -1
  32. package/esm/benchmark/channels/console.channel.d.mts +1 -1
  33. package/esm/benchmark/channels/console.channel.d.mts.map +1 -1
  34. package/esm/benchmark/channels/console.channel.mjs +1 -1
  35. package/esm/benchmark/channels/console.channel.mjs.map +1 -1
  36. package/esm/benchmark/channels/noop.channel.d.mts +1 -1
  37. package/esm/benchmark/channels/noop.channel.d.mts.map +1 -1
  38. package/esm/benchmark/channels/noop.channel.mjs +1 -1
  39. package/esm/benchmark/channels/noop.channel.mjs.map +1 -1
  40. package/esm/benchmark/profiler.d.mts +1 -1
  41. package/esm/benchmark/profiler.d.mts.map +1 -1
  42. package/esm/benchmark/profiler.mjs +1 -1
  43. package/esm/benchmark/profiler.mjs.map +1 -1
  44. package/esm/benchmark/types.d.mts +1 -1
  45. package/esm/benchmark/types.d.mts.map +1 -1
  46. package/esm/bootstrap/setup.d.mts +1 -1
  47. package/esm/bootstrap/setup.d.mts.map +1 -1
  48. package/esm/bootstrap/setup.mjs +1 -1
  49. package/esm/bootstrap/setup.mjs.map +1 -1
  50. package/esm/bootstrap.d.mts +1 -1
  51. package/esm/bootstrap.d.mts.map +1 -1
  52. package/esm/bootstrap.mjs +1 -1
  53. package/esm/bootstrap.mjs.map +1 -1
  54. package/esm/cache/database-cache-driver.d.mts +1 -1
  55. package/esm/cache/database-cache-driver.d.mts.map +1 -1
  56. package/esm/cache/database-cache-driver.mjs +1 -1
  57. package/esm/cache/database-cache-driver.mjs.map +1 -1
  58. package/esm/cache/index.mjs +1 -1
  59. package/esm/cache/index.mjs.map +1 -1
  60. package/esm/cli/cli-commands.manager.mjs +1 -1
  61. package/esm/cli/cli-commands.manager.mjs.map +1 -1
  62. package/esm/cli/cli-commands.utils.mjs +1 -1
  63. package/esm/cli/cli-commands.utils.mjs.map +1 -1
  64. package/esm/cli/commands/add.command.mjs +1 -1
  65. package/esm/cli/commands/add.command.mjs.map +1 -1
  66. package/esm/cli/commands/build.command.mjs +1 -1
  67. package/esm/cli/commands/build.command.mjs.map +1 -1
  68. package/esm/cli/commands/create-database.command.mjs +1 -1
  69. package/esm/cli/commands/create-database.command.mjs.map +1 -1
  70. package/esm/cli/commands/dev-server.command.mjs +1 -1
  71. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  72. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +1 -1
  73. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  74. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -1
  75. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  76. package/esm/cli/commands/doctor/checks/connectors.check.mjs +1 -1
  77. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  78. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -1
  79. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  80. package/esm/cli/commands/doctor/checks/health.check.mjs +1 -1
  81. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  82. package/esm/cli/commands/doctor/checks/index.mjs +1 -1
  83. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -1
  84. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -1
  85. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  86. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +1 -1
  87. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  88. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -1
  89. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  90. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +1 -1
  91. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  92. package/esm/cli/commands/doctor/checks/routes.check.mjs +1 -1
  93. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  94. package/esm/cli/commands/doctor/doctor-command.action.mjs +1 -1
  95. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  96. package/esm/cli/commands/doctor/format-report.mjs +1 -1
  97. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  98. package/esm/cli/commands/doctor/run-checks.mjs +1 -1
  99. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -1
  100. package/esm/cli/commands/doctor.command.mjs +1 -1
  101. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  102. package/esm/cli/commands/drop-tables.command.mjs +1 -1
  103. package/esm/cli/commands/drop-tables.command.mjs.map +1 -1
  104. package/esm/cli/commands/generate/generate.command.mjs +1 -1
  105. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  106. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs +1 -1
  107. package/esm/cli/commands/generate/generators/column-dsl-parser.mjs.map +1 -1
  108. package/esm/cli/commands/generate/generators/controller.generator.mjs +1 -1
  109. package/esm/cli/commands/generate/generators/controller.generator.mjs.map +1 -1
  110. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  111. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  112. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  113. package/esm/cli/commands/generate/generators/model.generator.mjs.map +1 -1
  114. package/esm/cli/commands/generate/generators/module.generator.mjs +1 -1
  115. package/esm/cli/commands/generate/generators/module.generator.mjs.map +1 -1
  116. package/esm/cli/commands/generate/generators/repository.generator.mjs +1 -1
  117. package/esm/cli/commands/generate/generators/repository.generator.mjs.map +1 -1
  118. package/esm/cli/commands/generate/generators/resource.generator.mjs +1 -1
  119. package/esm/cli/commands/generate/generators/resource.generator.mjs.map +1 -1
  120. package/esm/cli/commands/generate/generators/service.generator.mjs +1 -1
  121. package/esm/cli/commands/generate/generators/service.generator.mjs.map +1 -1
  122. package/esm/cli/commands/generate/generators/use-case.generator.mjs +1 -1
  123. package/esm/cli/commands/generate/generators/use-case.generator.mjs.map +1 -1
  124. package/esm/cli/commands/generate/templates/stubs.mjs +1 -1
  125. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  126. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  127. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  128. package/esm/cli/commands/generate/utils/path-resolver.mjs +1 -1
  129. package/esm/cli/commands/generate/utils/path-resolver.mjs.map +1 -1
  130. package/esm/cli/commands/generate/utils/prompt.mjs +1 -1
  131. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  132. package/esm/cli/commands/generate/utils/writer.mjs +1 -1
  133. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  134. package/esm/cli/commands/migrate.command.mjs +1 -1
  135. package/esm/cli/commands/migrate.command.mjs.map +1 -1
  136. package/esm/cli/commands/openapi-generator.action.mjs +1 -1
  137. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  138. package/esm/cli/commands/openapi-generator.command.mjs +1 -1
  139. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  140. package/esm/cli/commands/postman-generator.action.mjs +1 -1
  141. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  142. package/esm/cli/commands/postman-generator.command.mjs +1 -1
  143. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  144. package/esm/cli/commands/routes/diff-page-routes.mjs +1 -1
  145. package/esm/cli/commands/routes/diff-page-routes.mjs.map +1 -1
  146. package/esm/cli/commands/routes/format-routes-table.mjs +1 -1
  147. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -1
  148. package/esm/cli/commands/routes/route-row.mjs +1 -1
  149. package/esm/cli/commands/routes/route-row.mjs.map +1 -1
  150. package/esm/cli/commands/routes/routes-command.action.mjs +1 -1
  151. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -1
  152. package/esm/cli/commands/routes/routes-diff.action.mjs +1 -1
  153. package/esm/cli/commands/routes/routes-diff.action.mjs.map +1 -1
  154. package/esm/cli/commands/routes/with-console-on-stderr.mjs +1 -1
  155. package/esm/cli/commands/routes/with-console-on-stderr.mjs.map +1 -1
  156. package/esm/cli/commands/routes.command.mjs +1 -1
  157. package/esm/cli/commands/routes.command.mjs.map +1 -1
  158. package/esm/cli/commands/seed.command.mjs +1 -1
  159. package/esm/cli/commands/seed.command.mjs.map +1 -1
  160. package/esm/cli/commands/start-production.command.mjs +1 -1
  161. package/esm/cli/commands/start-production.command.mjs.map +1 -1
  162. package/esm/cli/commands/storage-put.action.mjs +1 -1
  163. package/esm/cli/commands/storage-put.action.mjs.map +1 -1
  164. package/esm/cli/commands/storage-put.command.mjs +1 -1
  165. package/esm/cli/commands/storage-put.command.mjs.map +1 -1
  166. package/esm/cli/commands/typings-generator.command.mjs +1 -1
  167. package/esm/cli/commands/typings-generator.command.mjs.map +1 -1
  168. package/esm/cli/commands/update.command.mjs +1 -1
  169. package/esm/cli/commands/update.command.mjs.map +1 -1
  170. package/esm/cli/commands-loader.mjs +1 -1
  171. package/esm/cli/commands-loader.mjs.map +1 -1
  172. package/esm/cli/framework-cli-commands.mjs +1 -1
  173. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  174. package/esm/cli/parse-cli-args.mjs +1 -1
  175. package/esm/cli/parse-cli-args.mjs.map +1 -1
  176. package/esm/cli/start.mjs +1 -1
  177. package/esm/cli/start.mjs.map +1 -1
  178. package/esm/cli/string-similarity.mjs +1 -1
  179. package/esm/cli/string-similarity.mjs.map +1 -1
  180. package/esm/commands/cli-command.d.mts +1 -1
  181. package/esm/commands/cli-command.d.mts.map +1 -1
  182. package/esm/commands/cli-command.mjs +1 -1
  183. package/esm/commands/cli-command.mjs.map +1 -1
  184. package/esm/commands/types.d.mts +1 -1
  185. package/esm/commands/types.d.mts.map +1 -1
  186. package/esm/config/config-getter.d.mts +1 -1
  187. package/esm/config/config-getter.d.mts.map +1 -1
  188. package/esm/config/config-getter.mjs +1 -1
  189. package/esm/config/config-getter.mjs.map +1 -1
  190. package/esm/config/config-handlers.d.mts +1 -1
  191. package/esm/config/config-handlers.d.mts.map +1 -1
  192. package/esm/config/config-handlers.mjs +1 -1
  193. package/esm/config/config-handlers.mjs.map +1 -1
  194. package/esm/config/config-key-from-path.mjs +1 -1
  195. package/esm/config/config-key-from-path.mjs.map +1 -1
  196. package/esm/config/config-loader.d.mts +1 -1
  197. package/esm/config/config-loader.d.mts.map +1 -1
  198. package/esm/config/config-loader.mjs +1 -1
  199. package/esm/config/config-loader.mjs.map +1 -1
  200. package/esm/config/config-manager.mjs +1 -1
  201. package/esm/config/config-manager.mjs.map +1 -1
  202. package/esm/config/config-setter.d.mts +1 -1
  203. package/esm/config/config-setter.d.mts.map +1 -1
  204. package/esm/config/config-setter.mjs +1 -1
  205. package/esm/config/config-setter.mjs.map +1 -1
  206. package/esm/config/config-special-handlers.d.mts +1 -1
  207. package/esm/config/config-special-handlers.d.mts.map +1 -1
  208. package/esm/config/config-special-handlers.mjs +1 -1
  209. package/esm/config/config-special-handlers.mjs.map +1 -1
  210. package/esm/config/load-config-files.mjs +1 -1
  211. package/esm/config/load-config-files.mjs.map +1 -1
  212. package/esm/config/locale-configuration.mjs +1 -1
  213. package/esm/config/locale-configuration.mjs.map +1 -1
  214. package/esm/config/types.d.mts +1 -1
  215. package/esm/config/types.d.mts.map +1 -1
  216. package/esm/connectors/access-connector.d.mts +1 -1
  217. package/esm/connectors/access-connector.d.mts.map +1 -1
  218. package/esm/connectors/access-connector.mjs +1 -1
  219. package/esm/connectors/access-connector.mjs.map +1 -1
  220. package/esm/connectors/ai-connector.d.mts +1 -1
  221. package/esm/connectors/ai-connector.d.mts.map +1 -1
  222. package/esm/connectors/ai-connector.mjs +1 -1
  223. package/esm/connectors/ai-connector.mjs.map +1 -1
  224. package/esm/connectors/assert-no-reserved-connector-names.d.mts +1 -1
  225. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  226. package/esm/connectors/assert-no-reserved-connector-names.mjs +1 -1
  227. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  228. package/esm/connectors/assert-unique-connector-names.d.mts +1 -1
  229. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  230. package/esm/connectors/assert-unique-connector-names.mjs +1 -1
  231. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  232. package/esm/connectors/base-connector.d.mts +1 -1
  233. package/esm/connectors/base-connector.d.mts.map +1 -1
  234. package/esm/connectors/base-connector.mjs +1 -1
  235. package/esm/connectors/base-connector.mjs.map +1 -1
  236. package/esm/connectors/cache-connector.d.mts +1 -1
  237. package/esm/connectors/cache-connector.d.mts.map +1 -1
  238. package/esm/connectors/cache-connector.mjs +1 -1
  239. package/esm/connectors/cache-connector.mjs.map +1 -1
  240. package/esm/connectors/connectors-manager.d.mts +1 -1
  241. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  242. package/esm/connectors/connectors-manager.mjs +2 -2
  243. package/esm/connectors/connectors-manager.mjs.map +1 -1
  244. package/esm/connectors/database-connector.d.mts +1 -1
  245. package/esm/connectors/database-connector.d.mts.map +1 -1
  246. package/esm/connectors/database-connector.mjs +1 -1
  247. package/esm/connectors/database-connector.mjs.map +1 -1
  248. package/esm/connectors/describe-server-address.mjs +1 -1
  249. package/esm/connectors/describe-server-address.mjs.map +1 -1
  250. package/esm/connectors/herald-connector.d.mts +1 -1
  251. package/esm/connectors/herald-connector.d.mts.map +1 -1
  252. package/esm/connectors/herald-connector.mjs +1 -1
  253. package/esm/connectors/herald-connector.mjs.map +1 -1
  254. package/esm/connectors/http-connector.d.mts +1 -1
  255. package/esm/connectors/http-connector.d.mts.map +1 -1
  256. package/esm/connectors/http-connector.mjs +1 -1
  257. package/esm/connectors/http-connector.mjs.map +1 -1
  258. package/esm/connectors/logger-connector.d.mts +1 -1
  259. package/esm/connectors/logger-connector.d.mts.map +1 -1
  260. package/esm/connectors/logger-connector.mjs +1 -1
  261. package/esm/connectors/logger-connector.mjs.map +1 -1
  262. package/esm/connectors/mail-connector.d.mts +1 -1
  263. package/esm/connectors/mail-connector.d.mts.map +1 -1
  264. package/esm/connectors/mail-connector.mjs +1 -1
  265. package/esm/connectors/mail-connector.mjs.map +1 -1
  266. package/esm/connectors/notifications-connector.d.mts +1 -1
  267. package/esm/connectors/notifications-connector.d.mts.map +1 -1
  268. package/esm/connectors/notifications-connector.mjs +1 -1
  269. package/esm/connectors/notifications-connector.mjs.map +1 -1
  270. package/esm/connectors/read-bound-port.mjs +1 -1
  271. package/esm/connectors/read-bound-port.mjs.map +1 -1
  272. package/esm/connectors/register-configured-connectors.d.mts +1 -1
  273. package/esm/connectors/register-configured-connectors.d.mts.map +1 -1
  274. package/esm/connectors/register-configured-connectors.mjs +1 -1
  275. package/esm/connectors/register-configured-connectors.mjs.map +1 -1
  276. package/esm/connectors/single-server-warnings.mjs +1 -1
  277. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  278. package/esm/connectors/socket-connector.d.mts +1 -1
  279. package/esm/connectors/socket-connector.d.mts.map +1 -1
  280. package/esm/connectors/socket-connector.mjs +1 -1
  281. package/esm/connectors/socket-connector.mjs.map +1 -1
  282. package/esm/connectors/storage.connector.d.mts +1 -1
  283. package/esm/connectors/storage.connector.d.mts.map +1 -1
  284. package/esm/connectors/storage.connector.mjs +1 -1
  285. package/esm/connectors/storage.connector.mjs.map +1 -1
  286. package/esm/connectors/types.d.mts +1 -1
  287. package/esm/connectors/types.d.mts.map +1 -1
  288. package/esm/connectors/types.mjs +1 -1
  289. package/esm/connectors/types.mjs.map +1 -1
  290. package/esm/container/container-instance-registry.mjs +1 -1
  291. package/esm/container/container-instance-registry.mjs.map +1 -1
  292. package/esm/container/development-app-modules.d.mts +31 -0
  293. package/esm/container/development-app-modules.d.mts.map +1 -0
  294. package/esm/container/development-model-modules.d.mts +1 -1
  295. package/esm/container/development-model-modules.d.mts.map +1 -1
  296. package/esm/container/index.d.mts +3 -1
  297. package/esm/container/index.d.mts.map +1 -1
  298. package/esm/container/index.mjs +1 -1
  299. package/esm/container/index.mjs.map +1 -1
  300. package/esm/database/create-database-action.mjs +1 -1
  301. package/esm/database/create-database-action.mjs.map +1 -1
  302. package/esm/database/drop-tables-action.mjs +1 -1
  303. package/esm/database/drop-tables-action.mjs.map +1 -1
  304. package/esm/database/migrate-action.mjs +1 -1
  305. package/esm/database/migrate-action.mjs.map +1 -1
  306. package/esm/database/models/database-log/database-log.d.mts +31 -39
  307. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  308. package/esm/database/models/database-log/database-log.mjs +1 -1
  309. package/esm/database/models/database-log/database-log.mjs.map +1 -1
  310. package/esm/database/pending-exit-code.mjs +1 -1
  311. package/esm/database/pending-exit-code.mjs.map +1 -1
  312. package/esm/database/resolve-pending-migrations.mjs +1 -1
  313. package/esm/database/resolve-pending-migrations.mjs.map +1 -1
  314. package/esm/database/seed-command-action.mjs +1 -1
  315. package/esm/database/seed-command-action.mjs.map +1 -1
  316. package/esm/database/seeds/seed-records-table-migration.mjs +1 -1
  317. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -1
  318. package/esm/database/seeds/seeder.d.mts +1 -1
  319. package/esm/database/seeds/seeder.d.mts.map +1 -1
  320. package/esm/database/seeds/seeder.errors.d.mts +1 -1
  321. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  322. package/esm/database/seeds/seeder.errors.mjs +1 -1
  323. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  324. package/esm/database/seeds/seeder.mjs +1 -1
  325. package/esm/database/seeds/seeder.mjs.map +1 -1
  326. package/esm/database/seeds/seeders.manager.mjs +1 -1
  327. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  328. package/esm/database/seeds/seeds-table-migration.mjs +1 -1
  329. package/esm/database/seeds/seeds-table-migration.mjs.map +1 -1
  330. package/esm/database/seeds/types.d.mts +1 -1
  331. package/esm/database/seeds/types.d.mts.map +1 -1
  332. package/esm/database/seeds/utils.mjs +1 -1
  333. package/esm/database/seeds/utils.mjs.map +1 -1
  334. package/esm/database/utils.d.mts +1 -1
  335. package/esm/database/utils.d.mts.map +1 -1
  336. package/esm/database/utils.mjs +1 -1
  337. package/esm/database/utils.mjs.map +1 -1
  338. package/esm/dev-server/app-module-registry.mjs +52 -0
  339. package/esm/dev-server/app-module-registry.mjs.map +1 -0
  340. package/esm/dev-server/boot-precondition-error.mjs +1 -1
  341. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  342. package/esm/dev-server/build-development-openapi-document.mjs +1 -1
  343. package/esm/dev-server/build-development-openapi-document.mjs.map +1 -1
  344. package/esm/dev-server/check-for-updates.mjs +1 -1
  345. package/esm/dev-server/check-for-updates.mjs.map +1 -1
  346. package/esm/dev-server/collect-development-api-routes.mjs +1 -1
  347. package/esm/dev-server/collect-development-api-routes.mjs.map +1 -1
  348. package/esm/dev-server/create-worker.mjs +1 -1
  349. package/esm/dev-server/create-worker.mjs.map +1 -1
  350. package/esm/dev-server/dependency-graph.d.mts +1 -1
  351. package/esm/dev-server/dependency-graph.d.mts.map +1 -1
  352. package/esm/dev-server/dependency-graph.mjs +1 -1
  353. package/esm/dev-server/dependency-graph.mjs.map +1 -1
  354. package/esm/dev-server/dev-logger.mjs +1 -1
  355. package/esm/dev-server/dev-logger.mjs.map +1 -1
  356. package/esm/dev-server/development-server.mjs +1 -1
  357. package/esm/dev-server/development-server.mjs.map +1 -1
  358. package/esm/dev-server/events.mjs +1 -1
  359. package/esm/dev-server/events.mjs.map +1 -1
  360. package/esm/dev-server/extract-translation-keys.mjs +1 -1
  361. package/esm/dev-server/extract-translation-keys.mjs.map +1 -1
  362. package/esm/dev-server/file-event-handler.mjs +1 -1
  363. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  364. package/esm/dev-server/file-manager.d.mts +1 -1
  365. package/esm/dev-server/file-manager.d.mts.map +1 -1
  366. package/esm/dev-server/file-manager.mjs +1 -1
  367. package/esm/dev-server/file-manager.mjs.map +1 -1
  368. package/esm/dev-server/file-operations.d.mts +1 -1
  369. package/esm/dev-server/file-operations.d.mts.map +1 -1
  370. package/esm/dev-server/file-operations.mjs +1 -1
  371. package/esm/dev-server/file-operations.mjs.map +1 -1
  372. package/esm/dev-server/files-orchestrator.mjs +28 -14
  373. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  374. package/esm/dev-server/files-watcher.mjs +1 -1
  375. package/esm/dev-server/files-watcher.mjs.map +1 -1
  376. package/esm/dev-server/flags.mjs +1 -1
  377. package/esm/dev-server/flags.mjs.map +1 -1
  378. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs +1 -1
  379. package/esm/dev-server/health-checker/checkers/base-health-checker.mjs.map +1 -1
  380. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +1 -1
  381. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  382. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs +1 -1
  383. package/esm/dev-server/health-checker/checkers/typescript-health-checker.mjs.map +1 -1
  384. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +1 -1
  385. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  386. package/esm/dev-server/health-checker/file-health-result.d.mts +1 -1
  387. package/esm/dev-server/health-checker/file-health-result.d.mts.map +1 -1
  388. package/esm/dev-server/health-checker/file-health-result.mjs +1 -1
  389. package/esm/dev-server/health-checker/file-health-result.mjs.map +1 -1
  390. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +1 -1
  391. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  392. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs +1 -1
  393. package/esm/dev-server/health-checker/workers/eslint-health.worker.mjs.map +1 -1
  394. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs +1 -1
  395. package/esm/dev-server/health-checker/workers/ts-health.worker.mjs.map +1 -1
  396. package/esm/dev-server/layer-executor.mjs +1 -1
  397. package/esm/dev-server/layer-executor.mjs.map +1 -1
  398. package/esm/dev-server/legacy-locales-warning.mjs +1 -1
  399. package/esm/dev-server/legacy-locales-warning.mjs.map +1 -1
  400. package/esm/dev-server/loader/build-transpile-init.mjs +1 -1
  401. package/esm/dev-server/loader/build-transpile-init.mjs.map +1 -1
  402. package/esm/dev-server/loader/hook-thread.d.mts +1 -1
  403. package/esm/dev-server/loader/hook-thread.d.mts.map +1 -1
  404. package/esm/dev-server/loader/hook-thread.mjs +1 -1
  405. package/esm/dev-server/loader/hook-thread.mjs.map +1 -1
  406. package/esm/dev-server/loader/load-hook.d.mts +1 -1
  407. package/esm/dev-server/loader/load-hook.d.mts.map +1 -1
  408. package/esm/dev-server/loader/load-hook.mjs +1 -1
  409. package/esm/dev-server/loader/load-hook.mjs.map +1 -1
  410. package/esm/dev-server/loader/loader-port-acks.mjs +34 -0
  411. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -0
  412. package/esm/dev-server/loader/own-resolver.mjs +1 -1
  413. package/esm/dev-server/loader/own-resolver.mjs.map +1 -1
  414. package/esm/dev-server/loader/register-loader.mjs +1 -1
  415. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  416. package/esm/dev-server/loader/resolve-capture.mjs +1 -1
  417. package/esm/dev-server/loader/resolve-capture.mjs.map +1 -1
  418. package/esm/dev-server/loader/resolve-hook.d.mts +1 -1
  419. package/esm/dev-server/loader/resolve-hook.d.mts.map +1 -1
  420. package/esm/dev-server/loader/resolve-hook.mjs +2 -2
  421. package/esm/dev-server/loader/resolve-hook.mjs.map +1 -1
  422. package/esm/dev-server/loader/source-slug.mjs +1 -1
  423. package/esm/dev-server/loader/source-slug.mjs.map +1 -1
  424. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  425. package/esm/dev-server/loader/transpile-cache.mjs.map +1 -1
  426. package/esm/dev-server/loader/version-registry.mjs +1 -1
  427. package/esm/dev-server/loader/version-registry.mjs.map +1 -1
  428. package/esm/dev-server/manifest-manager.d.mts +1 -1
  429. package/esm/dev-server/manifest-manager.d.mts.map +1 -1
  430. package/esm/dev-server/manifest-manager.mjs +1 -1
  431. package/esm/dev-server/manifest-manager.mjs.map +1 -1
  432. package/esm/dev-server/model-module-registry.mjs +1 -1
  433. package/esm/dev-server/model-module-registry.mjs.map +1 -1
  434. package/esm/dev-server/model-resource-typings.mjs +1 -1
  435. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  436. package/esm/dev-server/module-loader.mjs +1 -1
  437. package/esm/dev-server/module-loader.mjs.map +1 -1
  438. package/esm/dev-server/package-json-manager.mjs +1 -1
  439. package/esm/dev-server/package-json-manager.mjs.map +1 -1
  440. package/esm/dev-server/parse-imports.mjs +73 -6
  441. package/esm/dev-server/parse-imports.mjs.map +1 -1
  442. package/esm/dev-server/read-config-ast.mjs +1 -1
  443. package/esm/dev-server/read-config-ast.mjs.map +1 -1
  444. package/esm/dev-server/ready-block.mjs +1 -1
  445. package/esm/dev-server/ready-block.mjs.map +1 -1
  446. package/esm/dev-server/register-dev-shortcuts.mjs +1 -1
  447. package/esm/dev-server/register-dev-shortcuts.mjs.map +1 -1
  448. package/esm/dev-server/register-installed-devtools.mjs +1 -1
  449. package/esm/dev-server/register-installed-devtools.mjs.map +1 -1
  450. package/esm/dev-server/restart-dev-server.mjs +1 -1
  451. package/esm/dev-server/restart-dev-server.mjs.map +1 -1
  452. package/esm/dev-server/route-types-publisher.mjs +1 -1
  453. package/esm/dev-server/route-types-publisher.mjs.map +1 -1
  454. package/esm/dev-server/run-connector-typings.mjs +1 -1
  455. package/esm/dev-server/run-connector-typings.mjs.map +1 -1
  456. package/esm/dev-server/run-typings-generation.mjs +1 -1
  457. package/esm/dev-server/run-typings-generation.mjs.map +1 -1
  458. package/esm/dev-server/shortcuts.mjs +1 -1
  459. package/esm/dev-server/shortcuts.mjs.map +1 -1
  460. package/esm/dev-server/special-file-patterns.mjs +1 -1
  461. package/esm/dev-server/special-file-patterns.mjs.map +1 -1
  462. package/esm/dev-server/special-files-collector.d.mts +1 -1
  463. package/esm/dev-server/special-files-collector.d.mts.map +1 -1
  464. package/esm/dev-server/special-files-collector.mjs +1 -1
  465. package/esm/dev-server/special-files-collector.mjs.map +1 -1
  466. package/esm/dev-server/start-development-server.mjs +1 -1
  467. package/esm/dev-server/start-development-server.mjs.map +1 -1
  468. package/esm/dev-server/supervisor.mjs +1 -1
  469. package/esm/dev-server/supervisor.mjs.map +1 -1
  470. package/esm/dev-server/translation-keys-sources.mjs +1 -1
  471. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  472. package/esm/dev-server/tsconfig-manager.mjs +1 -1
  473. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  474. package/esm/dev-server/type-generator.mjs +32 -11
  475. package/esm/dev-server/type-generator.mjs.map +1 -1
  476. package/esm/dev-server/types.d.mts +1 -1
  477. package/esm/dev-server/types.d.mts.map +1 -1
  478. package/esm/dev-server/update-check-cache.mjs +1 -1
  479. package/esm/dev-server/update-check-cache.mjs.map +1 -1
  480. package/esm/dev-server/utils.mjs +1 -1
  481. package/esm/dev-server/utils.mjs.map +1 -1
  482. package/esm/encryption/encrypt.d.mts +1 -1
  483. package/esm/encryption/encrypt.d.mts.map +1 -1
  484. package/esm/encryption/encrypt.mjs +1 -1
  485. package/esm/encryption/encrypt.mjs.map +1 -1
  486. package/esm/encryption/hash.d.mts +1 -1
  487. package/esm/encryption/hash.d.mts.map +1 -1
  488. package/esm/encryption/hash.mjs +1 -1
  489. package/esm/encryption/hash.mjs.map +1 -1
  490. package/esm/encryption/password.d.mts +1 -1
  491. package/esm/encryption/password.d.mts.map +1 -1
  492. package/esm/encryption/password.mjs +1 -1
  493. package/esm/encryption/password.mjs.map +1 -1
  494. package/esm/encryption/types.d.mts +1 -1
  495. package/esm/encryption/types.d.mts.map +1 -1
  496. package/esm/errors/container-key-missing-error.mjs +1 -1
  497. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  498. package/esm/errors/esbuild-binary-missing-error.mjs +1 -1
  499. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  500. package/esm/errors/index.d.mts +2 -0
  501. package/esm/errors/index.mjs +3 -0
  502. package/esm/errors/unknown-locale-error.mjs +1 -1
  503. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  504. package/esm/generations/add-command.action.mjs +29 -6
  505. package/esm/generations/add-command.action.mjs.map +1 -1
  506. package/esm/generations/features/access.feature.mjs +1 -1
  507. package/esm/generations/features/access.feature.mjs.map +1 -1
  508. package/esm/generations/features/ai-anthropic.feature.mjs +1 -1
  509. package/esm/generations/features/ai-anthropic.feature.mjs.map +1 -1
  510. package/esm/generations/features/ai-bedrock.feature.mjs +1 -1
  511. package/esm/generations/features/ai-bedrock.feature.mjs.map +1 -1
  512. package/esm/generations/features/ai-google.feature.mjs +1 -1
  513. package/esm/generations/features/ai-google.feature.mjs.map +1 -1
  514. package/esm/generations/features/ai-ollama.feature.mjs +1 -1
  515. package/esm/generations/features/ai-ollama.feature.mjs.map +1 -1
  516. package/esm/generations/features/ai-openai.feature.mjs +1 -1
  517. package/esm/generations/features/ai-openai.feature.mjs.map +1 -1
  518. package/esm/generations/features/ai-panoptic.feature.mjs +1 -1
  519. package/esm/generations/features/ai-panoptic.feature.mjs.map +1 -1
  520. package/esm/generations/features/ai-tools.feature.mjs +1 -1
  521. package/esm/generations/features/ai-tools.feature.mjs.map +1 -1
  522. package/esm/generations/features/ai-workspace.feature.mjs +1 -1
  523. package/esm/generations/features/ai-workspace.feature.mjs.map +1 -1
  524. package/esm/generations/features/ai.feature.mjs +1 -1
  525. package/esm/generations/features/ai.feature.mjs.map +1 -1
  526. package/esm/generations/features/auth-google.feature.mjs +1 -1
  527. package/esm/generations/features/auth-google.feature.mjs.map +1 -1
  528. package/esm/generations/features/auth-passkeys.feature.mjs +1 -1
  529. package/esm/generations/features/auth-passkeys.feature.mjs.map +1 -1
  530. package/esm/generations/features/bull-board.feature.mjs +1 -1
  531. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  532. package/esm/generations/features/devtools.feature.mjs +1 -1
  533. package/esm/generations/features/devtools.feature.mjs.map +1 -1
  534. package/esm/generations/features/herald.feature.mjs +1 -1
  535. package/esm/generations/features/herald.feature.mjs.map +1 -1
  536. package/esm/generations/features/image.feature.mjs +1 -1
  537. package/esm/generations/features/image.feature.mjs.map +1 -1
  538. package/esm/generations/features/index.mjs +1 -1
  539. package/esm/generations/features/index.mjs.map +1 -1
  540. package/esm/generations/features/mail.feature.mjs +1 -1
  541. package/esm/generations/features/mail.feature.mjs.map +1 -1
  542. package/esm/generations/features/mongodb.feature.mjs +1 -1
  543. package/esm/generations/features/mongodb.feature.mjs.map +1 -1
  544. package/esm/generations/features/mysql.feature.mjs +1 -1
  545. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  546. package/esm/generations/features/notifications.feature.mjs +121 -17
  547. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  548. package/esm/generations/features/postgres.feature.mjs +1 -1
  549. package/esm/generations/features/postgres.feature.mjs.map +1 -1
  550. package/esm/generations/features/queue.feature.mjs +1 -1
  551. package/esm/generations/features/queue.feature.mjs.map +1 -1
  552. package/esm/generations/features/react-email.feature.mjs +1 -1
  553. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  554. package/esm/generations/features/react.feature.mjs +1 -1
  555. package/esm/generations/features/react.feature.mjs.map +1 -1
  556. package/esm/generations/features/redis.feature.mjs +1 -1
  557. package/esm/generations/features/redis.feature.mjs.map +1 -1
  558. package/esm/generations/features/s3.feature.mjs +1 -1
  559. package/esm/generations/features/s3.feature.mjs.map +1 -1
  560. package/esm/generations/features/scheduler.feature.mjs +1 -1
  561. package/esm/generations/features/scheduler.feature.mjs.map +1 -1
  562. package/esm/generations/features/ses.feature.mjs +1 -1
  563. package/esm/generations/features/ses.feature.mjs.map +1 -1
  564. package/esm/generations/features/shadcn.feature.mjs +1 -1
  565. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  566. package/esm/generations/features/shared/insert-connector-entry.mjs +1 -1
  567. package/esm/generations/features/shared/insert-connector-entry.mjs.map +1 -1
  568. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs +1 -1
  569. package/esm/generations/features/shared/insert-queue-dashboard-block.mjs.map +1 -1
  570. package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
  571. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  572. package/esm/generations/features/shared/merge-web-sitemap-config.mjs +1 -1
  573. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  574. package/esm/generations/features/shared/migration-timestamp.mjs +1 -1
  575. package/esm/generations/features/shared/migration-timestamp.mjs.map +1 -1
  576. package/esm/generations/features/shared/patch-tsconfig-include.mjs +1 -1
  577. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  578. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
  579. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  580. package/esm/generations/features/shared/resolve-contact-scaffold.mjs +1 -1
  581. package/esm/generations/features/shared/resolve-contact-scaffold.mjs.map +1 -1
  582. package/esm/generations/features/sitemap.feature.mjs +1 -1
  583. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  584. package/esm/generations/features/socket.feature.mjs +1 -1
  585. package/esm/generations/features/socket.feature.mjs.map +1 -1
  586. package/esm/generations/features/tailwind.feature.mjs +1 -1
  587. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  588. package/esm/generations/features/test.feature.mjs +1 -1
  589. package/esm/generations/features/test.feature.mjs.map +1 -1
  590. package/esm/generations/features/types.mjs +1 -1
  591. package/esm/generations/features/types.mjs.map +1 -1
  592. package/esm/generations/features/web.feature.mjs +1 -1
  593. package/esm/generations/features/web.feature.mjs.map +1 -1
  594. package/esm/generations/pnpm-build-approvals.mjs +89 -3
  595. package/esm/generations/pnpm-build-approvals.mjs.map +1 -1
  596. package/esm/generations/stubs.mjs +184 -78
  597. package/esm/generations/stubs.mjs.map +1 -1
  598. package/esm/http/boot-port-preflight.d.mts +1 -1
  599. package/esm/http/boot-port-preflight.d.mts.map +1 -1
  600. package/esm/http/boot-port-preflight.mjs +1 -1
  601. package/esm/http/boot-port-preflight.mjs.map +1 -1
  602. package/esm/http/build-cors-options.mjs +1 -1
  603. package/esm/http/build-cors-options.mjs.map +1 -1
  604. package/esm/http/build-rate-limit-options.d.mts +22 -1
  605. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  606. package/esm/http/build-rate-limit-options.mjs +7 -1
  607. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  608. package/esm/http/config.d.mts +1 -1
  609. package/esm/http/config.d.mts.map +1 -1
  610. package/esm/http/config.mjs +1 -1
  611. package/esm/http/config.mjs.map +1 -1
  612. package/esm/http/context/request-context.d.mts +1 -1
  613. package/esm/http/context/request-context.d.mts.map +1 -1
  614. package/esm/http/context/request-context.mjs +1 -1
  615. package/esm/http/context/request-context.mjs.map +1 -1
  616. package/esm/http/context/request-memo.d.mts +1 -1
  617. package/esm/http/context/request-memo.d.mts.map +1 -1
  618. package/esm/http/context/request-memo.mjs +1 -1
  619. package/esm/http/context/request-memo.mjs.map +1 -1
  620. package/esm/http/createHttpApplication.d.mts +1 -1
  621. package/esm/http/createHttpApplication.d.mts.map +1 -1
  622. package/esm/http/createHttpApplication.mjs +1 -1
  623. package/esm/http/createHttpApplication.mjs.map +1 -1
  624. package/esm/http/csp.d.mts +1 -1
  625. package/esm/http/csp.d.mts.map +1 -1
  626. package/esm/http/csp.mjs +1 -1
  627. package/esm/http/csp.mjs.map +1 -1
  628. package/esm/http/csrf-default-guard.d.mts +1 -1
  629. package/esm/http/csrf-default-guard.d.mts.map +1 -1
  630. package/esm/http/csrf-default-guard.mjs +1 -1
  631. package/esm/http/csrf-default-guard.mjs.map +1 -1
  632. package/esm/http/csrf-origin-policy.d.mts +1 -1
  633. package/esm/http/csrf-origin-policy.d.mts.map +1 -1
  634. package/esm/http/csrf-origin-policy.mjs +1 -1
  635. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  636. package/esm/http/database/RequestLog.d.mts +63 -111
  637. package/esm/http/database/RequestLog.d.mts.map +1 -1
  638. package/esm/http/database/RequestLog.mjs +1 -1
  639. package/esm/http/database/RequestLog.mjs.map +1 -1
  640. package/esm/http/error-codes.d.mts +1 -1
  641. package/esm/http/error-codes.d.mts.map +1 -1
  642. package/esm/http/error-codes.mjs +1 -1
  643. package/esm/http/error-codes.mjs.map +1 -1
  644. package/esm/http/error-mapper.d.mts +48 -0
  645. package/esm/http/error-mapper.d.mts.map +1 -0
  646. package/esm/http/error-mapper.mjs +48 -0
  647. package/esm/http/error-mapper.mjs.map +1 -0
  648. package/esm/http/errors/errors.d.mts +1 -1
  649. package/esm/http/errors/errors.d.mts.map +1 -1
  650. package/esm/http/errors/errors.mjs +1 -1
  651. package/esm/http/errors/errors.mjs.map +1 -1
  652. package/esm/http/events.d.mts +1 -1
  653. package/esm/http/events.d.mts.map +1 -1
  654. package/esm/http/events.mjs +1 -1
  655. package/esm/http/events.mjs.map +1 -1
  656. package/esm/http/flush-pending-cookies.mjs +1 -1
  657. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  658. package/esm/http/health.d.mts +1 -1
  659. package/esm/http/health.d.mts.map +1 -1
  660. package/esm/http/health.mjs +1 -1
  661. package/esm/http/health.mjs.map +1 -1
  662. package/esm/http/index.d.mts +10 -6
  663. package/esm/http/index.mjs +8 -5
  664. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  665. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  666. package/esm/http/middleware/cache-response-middleware.mjs +1 -1
  667. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  668. package/esm/http/middleware/concurrency-limit.middleware.d.mts +1 -1
  669. package/esm/http/middleware/concurrency-limit.middleware.d.mts.map +1 -1
  670. package/esm/http/middleware/concurrency-limit.middleware.mjs +1 -1
  671. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  672. package/esm/http/middleware/idempotency.middleware.d.mts +1 -1
  673. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  674. package/esm/http/middleware/idempotency.middleware.mjs +1 -1
  675. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  676. package/esm/http/middleware/inject-request-context.d.mts +1 -1
  677. package/esm/http/middleware/inject-request-context.d.mts.map +1 -1
  678. package/esm/http/middleware/inject-request-context.mjs +4 -2
  679. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  680. package/esm/http/middleware/ip-filter.middleware.d.mts +1 -1
  681. package/esm/http/middleware/ip-filter.middleware.d.mts.map +1 -1
  682. package/esm/http/middleware/ip-filter.middleware.mjs +1 -1
  683. package/esm/http/middleware/ip-filter.middleware.mjs.map +1 -1
  684. package/esm/http/middleware/maintenance.middleware.d.mts +1 -1
  685. package/esm/http/middleware/maintenance.middleware.d.mts.map +1 -1
  686. package/esm/http/middleware/maintenance.middleware.mjs +1 -1
  687. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  688. package/esm/http/middleware/max-body-size.middleware.d.mts +1 -1
  689. package/esm/http/middleware/max-body-size.middleware.d.mts.map +1 -1
  690. package/esm/http/middleware/max-body-size.middleware.mjs +1 -1
  691. package/esm/http/middleware/max-body-size.middleware.mjs.map +1 -1
  692. package/esm/http/middleware/middleware-list.d.mts +1 -1
  693. package/esm/http/middleware/middleware-list.d.mts.map +1 -1
  694. package/esm/http/middleware/middleware-list.mjs +1 -1
  695. package/esm/http/middleware/middleware-list.mjs.map +1 -1
  696. package/esm/http/middleware/rate-limit.middleware.d.mts +20 -5
  697. package/esm/http/middleware/rate-limit.middleware.d.mts.map +1 -1
  698. package/esm/http/middleware/rate-limit.middleware.mjs +34 -12
  699. package/esm/http/middleware/rate-limit.middleware.mjs.map +1 -1
  700. package/esm/http/middleware/utils/cidr-match.d.mts +1 -1
  701. package/esm/http/middleware/utils/cidr-match.d.mts.map +1 -1
  702. package/esm/http/middleware/utils/cidr-match.mjs +1 -1
  703. package/esm/http/middleware/utils/cidr-match.mjs.map +1 -1
  704. package/esm/http/middleware/utils/idempotency-key.d.mts +1 -1
  705. package/esm/http/middleware/utils/idempotency-key.d.mts.map +1 -1
  706. package/esm/http/middleware/utils/idempotency-key.mjs +1 -1
  707. package/esm/http/middleware/utils/idempotency-key.mjs.map +1 -1
  708. package/esm/http/middleware/utils/parse-size.d.mts +1 -1
  709. package/esm/http/middleware/utils/parse-size.d.mts.map +1 -1
  710. package/esm/http/middleware/utils/parse-size.mjs +1 -1
  711. package/esm/http/middleware/utils/parse-size.mjs.map +1 -1
  712. package/esm/http/parse-urlencoded-body.mjs +1 -1
  713. package/esm/http/parse-urlencoded-body.mjs.map +1 -1
  714. package/esm/http/plugins.d.mts +9 -2
  715. package/esm/http/plugins.d.mts.map +1 -1
  716. package/esm/http/plugins.mjs +18 -4
  717. package/esm/http/plugins.mjs.map +1 -1
  718. package/esm/http/port-preflight.d.mts +1 -1
  719. package/esm/http/port-preflight.d.mts.map +1 -1
  720. package/esm/http/port-preflight.mjs +1 -1
  721. package/esm/http/port-preflight.mjs.map +1 -1
  722. package/esm/http/rate-limit-cache-store.mjs +155 -0
  723. package/esm/http/rate-limit-cache-store.mjs.map +1 -0
  724. package/esm/http/ready-report.d.mts +1 -1
  725. package/esm/http/ready-report.d.mts.map +1 -1
  726. package/esm/http/ready-report.mjs +1 -1
  727. package/esm/http/ready-report.mjs.map +1 -1
  728. package/esm/http/request-controller.d.mts +1 -1
  729. package/esm/http/request-controller.d.mts.map +1 -1
  730. package/esm/http/request-controller.mjs +1 -1
  731. package/esm/http/request-controller.mjs.map +1 -1
  732. package/esm/http/request-log-snapshot.d.mts +123 -0
  733. package/esm/http/request-log-snapshot.d.mts.map +1 -0
  734. package/esm/http/request-log-snapshot.mjs +141 -0
  735. package/esm/http/request-log-snapshot.mjs.map +1 -0
  736. package/esm/http/request.d.mts +41 -2
  737. package/esm/http/request.d.mts.map +1 -1
  738. package/esm/http/request.mjs +65 -2
  739. package/esm/http/request.mjs.map +1 -1
  740. package/esm/http/resolve-bind-port.mjs +1 -1
  741. package/esm/http/resolve-bind-port.mjs.map +1 -1
  742. package/esm/http/response.d.mts +40 -8
  743. package/esm/http/response.d.mts.map +1 -1
  744. package/esm/http/response.mjs +173 -61
  745. package/esm/http/response.mjs.map +1 -1
  746. package/esm/http/serialized.d.mts +1 -1
  747. package/esm/http/serialized.d.mts.map +1 -1
  748. package/esm/http/server-rebuilt.d.mts +1 -1
  749. package/esm/http/server-rebuilt.d.mts.map +1 -1
  750. package/esm/http/server-rebuilt.mjs +1 -1
  751. package/esm/http/server-rebuilt.mjs.map +1 -1
  752. package/esm/http/server.d.mts +34 -6
  753. package/esm/http/server.d.mts.map +1 -1
  754. package/esm/http/server.mjs +70 -5
  755. package/esm/http/server.mjs.map +1 -1
  756. package/esm/http/stream-react-response.d.mts +1 -1
  757. package/esm/http/stream-react-response.d.mts.map +1 -1
  758. package/esm/http/stream-react-response.mjs +1 -1
  759. package/esm/http/stream-react-response.mjs.map +1 -1
  760. package/esm/http/stream-transport.mjs +75 -0
  761. package/esm/http/stream-transport.mjs.map +1 -0
  762. package/esm/http/tracing/trace-id.d.mts +1 -1
  763. package/esm/http/tracing/trace-id.d.mts.map +1 -1
  764. package/esm/http/tracing/trace-id.mjs +1 -1
  765. package/esm/http/tracing/trace-id.mjs.map +1 -1
  766. package/esm/http/tracing/tracing-dispatcher.d.mts +1 -1
  767. package/esm/http/tracing/tracing-dispatcher.d.mts.map +1 -1
  768. package/esm/http/tracing/tracing-dispatcher.mjs +1 -1
  769. package/esm/http/tracing/tracing-dispatcher.mjs.map +1 -1
  770. package/esm/http/tracing/tracing.type.d.mts +1 -1
  771. package/esm/http/tracing/tracing.type.d.mts.map +1 -1
  772. package/esm/http/types.d.mts +131 -6
  773. package/esm/http/types.d.mts.map +1 -1
  774. package/esm/http/uploaded-file.d.mts +2 -2
  775. package/esm/http/uploaded-file.d.mts.map +1 -1
  776. package/esm/http/uploaded-file.mjs +2 -2
  777. package/esm/http/uploaded-file.mjs.map +1 -1
  778. package/esm/http/uploads/detect-image-format.mjs +1 -1
  779. package/esm/http/uploads/detect-image-format.mjs.map +1 -1
  780. package/esm/http/uploads/generate-image-variant.mjs +1 -1
  781. package/esm/http/uploads/generate-image-variant.mjs.map +1 -1
  782. package/esm/http/uploads/generate-image-variants.d.mts +1 -1
  783. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  784. package/esm/http/uploads/generate-image-variants.mjs +15 -7
  785. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  786. package/esm/http/uploads/image-variant-cache.mjs +143 -0
  787. package/esm/http/uploads/image-variant-cache.mjs.map +1 -0
  788. package/esm/http/uploads/image-variant-types.d.mts +1 -1
  789. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  790. package/esm/http/uploads/image-variants-config-error.d.mts +1 -1
  791. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  792. package/esm/http/uploads/image-variants-config-error.mjs +1 -1
  793. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  794. package/esm/http/uploads/index.d.mts +3 -1
  795. package/esm/http/uploads/index.mjs +3 -1
  796. package/esm/http/uploads/is-path-inside.mjs +1 -1
  797. package/esm/http/uploads/is-path-inside.mjs.map +1 -1
  798. package/esm/http/uploads/load-variant-source.mjs +1 -1
  799. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  800. package/esm/http/uploads/local-disk-root.mjs +24 -0
  801. package/esm/http/uploads/local-disk-root.mjs.map +1 -0
  802. package/esm/http/uploads/matches-if-none-match.mjs +1 -1
  803. package/esm/http/uploads/matches-if-none-match.mjs.map +1 -1
  804. package/esm/http/uploads/parse-uploaded-file-query.mjs +1 -1
  805. package/esm/http/uploads/parse-uploaded-file-query.mjs.map +1 -1
  806. package/esm/http/uploads/purge-image-variants.d.mts +32 -0
  807. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -0
  808. package/esm/http/uploads/purge-image-variants.mjs +46 -0
  809. package/esm/http/uploads/purge-image-variants.mjs.map +1 -0
  810. package/esm/http/uploads/read-file-head.mjs +1 -1
  811. package/esm/http/uploads/read-file-head.mjs.map +1 -1
  812. package/esm/http/uploads/resolve-image-variant.d.mts +73 -0
  813. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -0
  814. package/esm/http/uploads/resolve-image-variant.mjs +107 -0
  815. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -0
  816. package/esm/http/uploads/resolve-image-variants-config.mjs +1 -1
  817. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  818. package/esm/http/uploads/resolve-inline-image-content-type.mjs +1 -1
  819. package/esm/http/uploads/resolve-inline-image-content-type.mjs.map +1 -1
  820. package/esm/http/uploads/resolve-original-content-type.mjs +1 -1
  821. package/esm/http/uploads/resolve-original-content-type.mjs.map +1 -1
  822. package/esm/http/uploads/resolve-upload-path.mjs +3 -2
  823. package/esm/http/uploads/resolve-upload-path.mjs.map +1 -1
  824. package/esm/http/uploads/resolve-variant-candidate.mjs +1 -1
  825. package/esm/http/uploads/resolve-variant-candidate.mjs.map +1 -1
  826. package/esm/http/uploads/single-flight.mjs +1 -1
  827. package/esm/http/uploads/single-flight.mjs.map +1 -1
  828. package/esm/http/uploads/uploaded-file.controller.d.mts +24 -6
  829. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  830. package/esm/http/uploads/uploaded-file.controller.mjs +63 -91
  831. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  832. package/esm/http/uploads/variant-cache-key.mjs +30 -5
  833. package/esm/http/uploads/variant-cache-key.mjs.map +1 -1
  834. package/esm/http/uploads/variant-generations.mjs +1 -1
  835. package/esm/http/uploads/variant-generations.mjs.map +1 -1
  836. package/esm/http/uploads-config.d.mts +1 -1
  837. package/esm/http/uploads-config.d.mts.map +1 -1
  838. package/esm/http/uploads-config.mjs +1 -1
  839. package/esm/http/uploads-config.mjs.map +1 -1
  840. package/esm/http/uploads-types.d.mts +1 -1
  841. package/esm/http/uploads-types.d.mts.map +1 -1
  842. package/esm/http/xmlable.d.mts +1 -1
  843. package/esm/http/xmlable.d.mts.map +1 -1
  844. package/esm/image/image.d.mts +1 -1
  845. package/esm/image/image.d.mts.map +1 -1
  846. package/esm/image/image.mjs +1 -1
  847. package/esm/image/image.mjs.map +1 -1
  848. package/esm/index.d.mts +15 -9
  849. package/esm/index.mjs +11 -7
  850. package/esm/loader/app-module-importer.d.mts +1 -1
  851. package/esm/loader/app-module-importer.d.mts.map +1 -1
  852. package/esm/loader/app-module-importer.mjs +1 -1
  853. package/esm/loader/app-module-importer.mjs.map +1 -1
  854. package/esm/localization/parse-locale-dictionary.d.mts +7 -2
  855. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  856. package/esm/localization/parse-locale-dictionary.mjs +6 -2
  857. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  858. package/esm/localization/register-locale-dictionary.d.mts +1 -1
  859. package/esm/localization/register-locale-dictionary.d.mts.map +1 -1
  860. package/esm/localization/register-locale-dictionary.mjs +1 -1
  861. package/esm/localization/register-locale-dictionary.mjs.map +1 -1
  862. package/esm/logger/fatal-visibility.d.mts +1 -1
  863. package/esm/logger/fatal-visibility.d.mts.map +1 -1
  864. package/esm/logger/fatal-visibility.mjs +1 -1
  865. package/esm/logger/fatal-visibility.mjs.map +1 -1
  866. package/esm/logger/logger.d.mts +1 -1
  867. package/esm/logger/logger.d.mts.map +1 -1
  868. package/esm/logger/logger.mjs +1 -1
  869. package/esm/logger/logger.mjs.map +1 -1
  870. package/esm/logger/types.d.mts +1 -1
  871. package/esm/logger/types.d.mts.map +1 -1
  872. package/esm/mail/config.d.mts +1 -1
  873. package/esm/mail/config.d.mts.map +1 -1
  874. package/esm/mail/config.mjs +1 -1
  875. package/esm/mail/config.mjs.map +1 -1
  876. package/esm/mail/events.d.mts +1 -1
  877. package/esm/mail/events.d.mts.map +1 -1
  878. package/esm/mail/events.mjs +1 -1
  879. package/esm/mail/events.mjs.map +1 -1
  880. package/esm/mail/mail.d.mts +1 -1
  881. package/esm/mail/mail.d.mts.map +1 -1
  882. package/esm/mail/mail.mjs +1 -1
  883. package/esm/mail/mail.mjs.map +1 -1
  884. package/esm/mail/mailer-pool.d.mts +1 -1
  885. package/esm/mail/mailer-pool.d.mts.map +1 -1
  886. package/esm/mail/mailer-pool.mjs +1 -1
  887. package/esm/mail/mailer-pool.mjs.map +1 -1
  888. package/esm/mail/react-mail.d.mts +1 -1
  889. package/esm/mail/react-mail.d.mts.map +1 -1
  890. package/esm/mail/react-mail.mjs +1 -1
  891. package/esm/mail/react-mail.mjs.map +1 -1
  892. package/esm/mail/send-mail.d.mts +1 -1
  893. package/esm/mail/send-mail.d.mts.map +1 -1
  894. package/esm/mail/send-mail.mjs +7 -7
  895. package/esm/mail/send-mail.mjs.map +1 -1
  896. package/esm/mail/test-mailbox.d.mts +1 -1
  897. package/esm/mail/test-mailbox.d.mts.map +1 -1
  898. package/esm/mail/test-mailbox.mjs +1 -1
  899. package/esm/mail/test-mailbox.mjs.map +1 -1
  900. package/esm/mail/types.d.mts +1 -1
  901. package/esm/mail/types.d.mts.map +1 -1
  902. package/esm/mail/types.mjs +1 -1
  903. package/esm/mail/types.mjs.map +1 -1
  904. package/esm/manifest/manifest-manager.mjs +1 -1
  905. package/esm/manifest/manifest-manager.mjs.map +1 -1
  906. package/esm/openapi/build-openapi-document.d.mts +1 -1
  907. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  908. package/esm/openapi/build-openapi-document.mjs +1 -1
  909. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  910. package/esm/openapi/cast-schema.mjs +1 -1
  911. package/esm/openapi/cast-schema.mjs.map +1 -1
  912. package/esm/openapi/collect-openapi-document.mjs +1 -1
  913. package/esm/openapi/collect-openapi-document.mjs.map +1 -1
  914. package/esm/openapi/development-openapi-provider.d.mts +1 -1
  915. package/esm/openapi/development-openapi-provider.d.mts.map +1 -1
  916. package/esm/openapi/development-openapi-provider.mjs +1 -1
  917. package/esm/openapi/development-openapi-provider.mjs.map +1 -1
  918. package/esm/openapi/error-responses.mjs +1 -1
  919. package/esm/openapi/error-responses.mjs.map +1 -1
  920. package/esm/openapi/openapi-child-output.mjs +1 -1
  921. package/esm/openapi/openapi-child-output.mjs.map +1 -1
  922. package/esm/openapi/openapi-protocol.mjs +1 -1
  923. package/esm/openapi/openapi-protocol.mjs.map +1 -1
  924. package/esm/openapi/paths.mjs +1 -1
  925. package/esm/openapi/paths.mjs.map +1 -1
  926. package/esm/openapi/postman/build-request-body.mjs +1 -1
  927. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  928. package/esm/openapi/postman/build-request-url.mjs +1 -1
  929. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  930. package/esm/openapi/postman/build-saved-responses.mjs +1 -1
  931. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  932. package/esm/openapi/postman/example-from-schema.d.mts +1 -1
  933. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  934. package/esm/openapi/postman/example-from-schema.mjs +1 -1
  935. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  936. package/esm/openapi/postman/http-status-text.mjs +1 -1
  937. package/esm/openapi/postman/http-status-text.mjs.map +1 -1
  938. package/esm/openapi/postman/openapi-to-postman-collection.d.mts +1 -1
  939. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  940. package/esm/openapi/postman/openapi-to-postman-collection.mjs +1 -1
  941. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  942. package/esm/openapi/postman/postman-types.d.mts +1 -1
  943. package/esm/openapi/postman/postman-types.d.mts.map +1 -1
  944. package/esm/openapi/postman/resolve-operation-auth.mjs +1 -1
  945. package/esm/openapi/postman/resolve-operation-auth.mjs.map +1 -1
  946. package/esm/openapi/postman/schema-refs.d.mts +1 -1
  947. package/esm/openapi/postman/schema-refs.d.mts.map +1 -1
  948. package/esm/openapi/postman/schema-refs.mjs +1 -1
  949. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  950. package/esm/openapi/postman/uuid-v5.mjs +1 -1
  951. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  952. package/esm/openapi/request-schemas.mjs +1 -1
  953. package/esm/openapi/request-schemas.mjs.map +1 -1
  954. package/esm/openapi/response-schemas.mjs +5 -2
  955. package/esm/openapi/response-schemas.mjs.map +1 -1
  956. package/esm/openapi/schema-registry.mjs +7 -1
  957. package/esm/openapi/schema-registry.mjs.map +1 -1
  958. package/esm/openapi/security.mjs +1 -1
  959. package/esm/openapi/security.mjs.map +1 -1
  960. package/esm/openapi/types.d.mts +1 -1
  961. package/esm/openapi/types.d.mts.map +1 -1
  962. package/esm/production/assert-dist-ready-to-start.mjs +1 -1
  963. package/esm/production/assert-dist-ready-to-start.mjs.map +1 -1
  964. package/esm/production/assert-generated-imports.mjs +1 -1
  965. package/esm/production/assert-generated-imports.mjs.map +1 -1
  966. package/esm/production/build-app-production.mjs +1 -1
  967. package/esm/production/build-app-production.mjs.map +1 -1
  968. package/esm/production/build-contributions.mjs +1 -1
  969. package/esm/production/build-contributions.mjs.map +1 -1
  970. package/esm/production/bundle-framework-dependencies.mjs +1 -1
  971. package/esm/production/bundle-framework-dependencies.mjs.map +1 -1
  972. package/esm/production/dist-build-manifest.mjs +1 -1
  973. package/esm/production/dist-build-manifest.mjs.map +1 -1
  974. package/esm/production/esbuild-plugins.mjs +1 -1
  975. package/esm/production/esbuild-plugins.mjs.map +1 -1
  976. package/esm/production/esbuild-preflight.mjs +1 -1
  977. package/esm/production/esbuild-preflight.mjs.map +1 -1
  978. package/esm/production/production-builder.mjs +1 -1
  979. package/esm/production/production-builder.mjs.map +1 -1
  980. package/esm/production/production-supervisor.mjs +1 -1
  981. package/esm/production/production-supervisor.mjs.map +1 -1
  982. package/esm/production/promote-dist.mjs +1 -1
  983. package/esm/production/promote-dist.mjs.map +1 -1
  984. package/esm/production/registration-child-runner.mjs +1 -1
  985. package/esm/production/registration-child-runner.mjs.map +1 -1
  986. package/esm/production/resolve-build-config.d.mts +1 -1
  987. package/esm/production/resolve-build-config.d.mts.map +1 -1
  988. package/esm/production/resolve-build-config.mjs +1 -1
  989. package/esm/production/resolve-build-config.mjs.map +1 -1
  990. package/esm/production/route-registration-child.mjs +1 -1
  991. package/esm/production/route-registration-child.mjs.map +1 -1
  992. package/esm/production/route-registration-snapshot.mjs +1 -1
  993. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  994. package/esm/production/tsconfig-path-aliases.mjs +1 -1
  995. package/esm/production/tsconfig-path-aliases.mjs.map +1 -1
  996. package/esm/react/index.d.mts +1 -1
  997. package/esm/react/index.d.mts.map +1 -1
  998. package/esm/react/index.mjs +1 -1
  999. package/esm/react/index.mjs.map +1 -1
  1000. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts +1 -1
  1001. package/esm/repositories/adapters/cascade/cascade-adapter.d.mts.map +1 -1
  1002. package/esm/repositories/adapters/cascade/cascade-adapter.mjs +1 -1
  1003. package/esm/repositories/adapters/cascade/cascade-adapter.mjs.map +1 -1
  1004. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +1 -1
  1005. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  1006. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +1 -1
  1007. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  1008. package/esm/repositories/adapters/cascade/filter-applicator.mjs +1 -1
  1009. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  1010. package/esm/repositories/contracts/query-builder.contract.d.mts +1 -1
  1011. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  1012. package/esm/repositories/contracts/repository-adapter.contract.d.mts +1 -1
  1013. package/esm/repositories/contracts/repository-adapter.contract.d.mts.map +1 -1
  1014. package/esm/repositories/contracts/types.d.mts +1 -1
  1015. package/esm/repositories/contracts/types.d.mts.map +1 -1
  1016. package/esm/repositories/repository.manager.d.mts +1 -1
  1017. package/esm/repositories/repository.manager.d.mts.map +1 -1
  1018. package/esm/repositories/repository.manager.mjs +1 -1
  1019. package/esm/repositories/repository.manager.mjs.map +1 -1
  1020. package/esm/resource/define-resource.d.mts +1 -1
  1021. package/esm/resource/define-resource.d.mts.map +1 -1
  1022. package/esm/resource/define-resource.mjs +1 -1
  1023. package/esm/resource/define-resource.mjs.map +1 -1
  1024. package/esm/resource/index.d.mts +1 -0
  1025. package/esm/resource/index.mjs +1 -0
  1026. package/esm/resource/nullable-resource.d.mts +44 -0
  1027. package/esm/resource/nullable-resource.d.mts.map +1 -0
  1028. package/esm/resource/nullable-resource.mjs +38 -0
  1029. package/esm/resource/nullable-resource.mjs.map +1 -0
  1030. package/esm/resource/register-resource.d.mts +1 -1
  1031. package/esm/resource/register-resource.d.mts.map +1 -1
  1032. package/esm/resource/register-resource.mjs +1 -1
  1033. package/esm/resource/register-resource.mjs.map +1 -1
  1034. package/esm/resource/resource-field-builder.d.mts +1 -1
  1035. package/esm/resource/resource-field-builder.d.mts.map +1 -1
  1036. package/esm/resource/resource-field-builder.mjs +1 -1
  1037. package/esm/resource/resource-field-builder.mjs.map +1 -1
  1038. package/esm/resource/resource.d.mts +1 -1
  1039. package/esm/resource/resource.d.mts.map +1 -1
  1040. package/esm/resource/resource.mjs +23 -4
  1041. package/esm/resource/resource.mjs.map +1 -1
  1042. package/esm/resource/types.d.mts +11 -6
  1043. package/esm/resource/types.d.mts.map +1 -1
  1044. package/esm/restful/restful.d.mts +1 -1
  1045. package/esm/restful/restful.d.mts.map +1 -1
  1046. package/esm/restful/restful.mjs +1 -1
  1047. package/esm/restful/restful.mjs.map +1 -1
  1048. package/esm/router/build-route-rate-limit.mjs +1 -1
  1049. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  1050. package/esm/router/describe-route-for-log.mjs +1 -1
  1051. package/esm/router/describe-route-for-log.mjs.map +1 -1
  1052. package/esm/router/dev-dispatch.mjs +1 -1
  1053. package/esm/router/dev-dispatch.mjs.map +1 -1
  1054. package/esm/router/log-request-lifecycle.mjs +1 -1
  1055. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  1056. package/esm/router/named-api-routes-with-responses.mjs +1 -1
  1057. package/esm/router/named-api-routes-with-responses.mjs.map +1 -1
  1058. package/esm/router/normalize-request-path.d.mts +1 -1
  1059. package/esm/router/normalize-request-path.d.mts.map +1 -1
  1060. package/esm/router/normalize-request-path.mjs +1 -1
  1061. package/esm/router/normalize-request-path.mjs.map +1 -1
  1062. package/esm/router/normalize-route-path.d.mts +1 -1
  1063. package/esm/router/normalize-route-path.d.mts.map +1 -1
  1064. package/esm/router/normalize-route-path.mjs +1 -1
  1065. package/esm/router/normalize-route-path.mjs.map +1 -1
  1066. package/esm/router/positional-handler-diagnostics.d.mts +1 -1
  1067. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  1068. package/esm/router/positional-handler-diagnostics.mjs +1 -1
  1069. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  1070. package/esm/router/response-schema-types.mjs +3 -1
  1071. package/esm/router/response-schema-types.mjs.map +1 -1
  1072. package/esm/router/route-builder.d.mts +1 -1
  1073. package/esm/router/route-builder.d.mts.map +1 -1
  1074. package/esm/router/route-builder.mjs +1 -1
  1075. package/esm/router/route-builder.mjs.map +1 -1
  1076. package/esm/router/route-name-method-suffix.d.mts +1 -1
  1077. package/esm/router/route-name-method-suffix.d.mts.map +1 -1
  1078. package/esm/router/route-name-method-suffix.mjs +1 -1
  1079. package/esm/router/route-name-method-suffix.mjs.map +1 -1
  1080. package/esm/router/route-registry.d.mts +1 -1
  1081. package/esm/router/route-registry.d.mts.map +1 -1
  1082. package/esm/router/route-registry.mjs +1 -1
  1083. package/esm/router/route-registry.mjs.map +1 -1
  1084. package/esm/router/router.d.mts +8 -1
  1085. package/esm/router/router.d.mts.map +1 -1
  1086. package/esm/router/router.mjs +20 -15
  1087. package/esm/router/router.mjs.map +1 -1
  1088. package/esm/router/types.d.mts +13 -1
  1089. package/esm/router/types.d.mts.map +1 -1
  1090. package/esm/socket/types.d.mts +1 -1
  1091. package/esm/socket/types.d.mts.map +1 -1
  1092. package/esm/socket/utils.d.mts +1 -1
  1093. package/esm/socket/utils.d.mts.map +1 -1
  1094. package/esm/socket/utils.mjs +1 -1
  1095. package/esm/socket/utils.mjs.map +1 -1
  1096. package/esm/storage/config.d.mts +1 -1
  1097. package/esm/storage/config.d.mts.map +1 -1
  1098. package/esm/storage/config.mjs +1 -1
  1099. package/esm/storage/config.mjs.map +1 -1
  1100. package/esm/storage/context/storage-driver-context.d.mts +1 -1
  1101. package/esm/storage/context/storage-driver-context.d.mts.map +1 -1
  1102. package/esm/storage/context/storage-driver-context.mjs +1 -1
  1103. package/esm/storage/context/storage-driver-context.mjs.map +1 -1
  1104. package/esm/storage/drivers/cloud-driver.d.mts +1 -1
  1105. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  1106. package/esm/storage/drivers/cloud-driver.mjs +1 -1
  1107. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  1108. package/esm/storage/drivers/do-spaces-driver.d.mts +1 -1
  1109. package/esm/storage/drivers/do-spaces-driver.d.mts.map +1 -1
  1110. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  1111. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  1112. package/esm/storage/drivers/local-driver.d.mts +12 -1
  1113. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  1114. package/esm/storage/drivers/local-driver.mjs +33 -1
  1115. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  1116. package/esm/storage/drivers/r2-driver.d.mts +1 -1
  1117. package/esm/storage/drivers/r2-driver.d.mts.map +1 -1
  1118. package/esm/storage/drivers/r2-driver.mjs +1 -1
  1119. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  1120. package/esm/storage/drivers/s3-driver.d.mts +1 -1
  1121. package/esm/storage/drivers/s3-driver.d.mts.map +1 -1
  1122. package/esm/storage/drivers/s3-driver.mjs +1 -1
  1123. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  1124. package/esm/storage/index.d.mts +1 -1
  1125. package/esm/storage/scoped-storage.d.mts +1 -1
  1126. package/esm/storage/scoped-storage.d.mts.map +1 -1
  1127. package/esm/storage/scoped-storage.mjs +1 -1
  1128. package/esm/storage/scoped-storage.mjs.map +1 -1
  1129. package/esm/storage/storage-file.d.mts +1 -1
  1130. package/esm/storage/storage-file.d.mts.map +1 -1
  1131. package/esm/storage/storage-file.mjs +1 -1
  1132. package/esm/storage/storage-file.mjs.map +1 -1
  1133. package/esm/storage/storage.d.mts +3 -3
  1134. package/esm/storage/storage.d.mts.map +1 -1
  1135. package/esm/storage/storage.mjs +1 -1
  1136. package/esm/storage/storage.mjs.map +1 -1
  1137. package/esm/storage/types.d.mts +3 -2
  1138. package/esm/storage/types.d.mts.map +1 -1
  1139. package/esm/storage/utils/classify-ip-address.d.mts +1 -1
  1140. package/esm/storage/utils/classify-ip-address.d.mts.map +1 -1
  1141. package/esm/storage/utils/classify-ip-address.mjs +1 -1
  1142. package/esm/storage/utils/classify-ip-address.mjs.map +1 -1
  1143. package/esm/storage/utils/contain-path.d.mts +1 -1
  1144. package/esm/storage/utils/contain-path.d.mts.map +1 -1
  1145. package/esm/storage/utils/contain-path.mjs +1 -1
  1146. package/esm/storage/utils/contain-path.mjs.map +1 -1
  1147. package/esm/storage/utils/mime.d.mts +1 -1
  1148. package/esm/storage/utils/mime.d.mts.map +1 -1
  1149. package/esm/storage/utils/mime.mjs +1 -1
  1150. package/esm/storage/utils/mime.mjs.map +1 -1
  1151. package/esm/storage/utils/safe-fetch.d.mts +1 -1
  1152. package/esm/storage/utils/safe-fetch.d.mts.map +1 -1
  1153. package/esm/storage/utils/safe-fetch.mjs +1 -1
  1154. package/esm/storage/utils/safe-fetch.mjs.map +1 -1
  1155. package/esm/storage/utils/storage-capability-error.d.mts +1 -1
  1156. package/esm/storage/utils/storage-capability-error.d.mts.map +1 -1
  1157. package/esm/storage/utils/storage-capability-error.mjs +1 -1
  1158. package/esm/storage/utils/storage-capability-error.mjs.map +1 -1
  1159. package/esm/storage/utils/storage-error.d.mts +1 -1
  1160. package/esm/storage/utils/storage-error.d.mts.map +1 -1
  1161. package/esm/storage/utils/storage-error.mjs +1 -1
  1162. package/esm/storage/utils/storage-error.mjs.map +1 -1
  1163. package/esm/storage/utils/storage-not-initialized-error.d.mts +1 -1
  1164. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  1165. package/esm/storage/utils/storage-not-initialized-error.mjs +1 -1
  1166. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  1167. package/esm/tests/start-http-development-server.d.mts +1 -1
  1168. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  1169. package/esm/tests/start-http-development-server.mjs +1 -1
  1170. package/esm/tests/start-http-development-server.mjs.map +1 -1
  1171. package/esm/tests/test-connectors-selection.d.mts +1 -1
  1172. package/esm/tests/test-connectors-selection.d.mts.map +1 -1
  1173. package/esm/tests/test-connectors-selection.mjs +1 -1
  1174. package/esm/tests/test-connectors-selection.mjs.map +1 -1
  1175. package/esm/tests/test-helpers.d.mts +1 -1
  1176. package/esm/tests/test-helpers.d.mts.map +1 -1
  1177. package/esm/tests/test-helpers.mjs +1 -1
  1178. package/esm/tests/test-helpers.mjs.map +1 -1
  1179. package/esm/tests/test-lifecycle-state.mjs +1 -1
  1180. package/esm/tests/test-lifecycle-state.mjs.map +1 -1
  1181. package/esm/tests/test-server-port-channel.mjs +1 -1
  1182. package/esm/tests/test-server-port-channel.mjs.map +1 -1
  1183. package/esm/tests/test-setup-timeout.mjs +1 -1
  1184. package/esm/tests/test-setup-timeout.mjs.map +1 -1
  1185. package/esm/tests/vitest-setup.d.mts +1 -1
  1186. package/esm/tests/vitest-setup.d.mts.map +1 -1
  1187. package/esm/tests/vitest-setup.mjs +1 -1
  1188. package/esm/tests/vitest-setup.mjs.map +1 -1
  1189. package/esm/updater/package-manager.mjs +1 -1
  1190. package/esm/updater/package-manager.mjs.map +1 -1
  1191. package/esm/updater/update-warlock-packages.mjs +1 -1
  1192. package/esm/updater/update-warlock-packages.mjs.map +1 -1
  1193. package/esm/use-cases/types.d.mts +1 -1
  1194. package/esm/use-cases/types.d.mts.map +1 -1
  1195. package/esm/use-cases/use-case-broadcast.d.mts +1 -1
  1196. package/esm/use-cases/use-case-broadcast.d.mts.map +1 -1
  1197. package/esm/use-cases/use-case-broadcast.mjs +1 -1
  1198. package/esm/use-cases/use-case-broadcast.mjs.map +1 -1
  1199. package/esm/use-cases/use-case-events.d.mts +1 -1
  1200. package/esm/use-cases/use-case-events.d.mts.map +1 -1
  1201. package/esm/use-cases/use-case-events.mjs +1 -1
  1202. package/esm/use-cases/use-case-events.mjs.map +1 -1
  1203. package/esm/use-cases/use-case-pipeline.d.mts +1 -1
  1204. package/esm/use-cases/use-case-pipeline.d.mts.map +1 -1
  1205. package/esm/use-cases/use-case-pipeline.mjs +1 -1
  1206. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  1207. package/esm/use-cases/use-case.d.mts +1 -1
  1208. package/esm/use-cases/use-case.d.mts.map +1 -1
  1209. package/esm/use-cases/use-case.errors.d.mts +1 -1
  1210. package/esm/use-cases/use-case.errors.d.mts.map +1 -1
  1211. package/esm/use-cases/use-case.errors.mjs +1 -1
  1212. package/esm/use-cases/use-case.errors.mjs.map +1 -1
  1213. package/esm/use-cases/use-case.mjs +1 -1
  1214. package/esm/use-cases/use-case.mjs.map +1 -1
  1215. package/esm/use-cases/use-cases-registry.d.mts +1 -1
  1216. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  1217. package/esm/use-cases/use-cases-registry.mjs +1 -1
  1218. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  1219. package/esm/utils/app-log.d.mts +6 -6
  1220. package/esm/utils/app-log.d.mts.map +1 -1
  1221. package/esm/utils/app-log.mjs +1 -1
  1222. package/esm/utils/app-log.mjs.map +1 -1
  1223. package/esm/utils/database-log.d.mts +1 -1
  1224. package/esm/utils/database-log.d.mts.map +1 -1
  1225. package/esm/utils/database-log.mjs +1 -1
  1226. package/esm/utils/database-log.mjs.map +1 -1
  1227. package/esm/utils/detect-environment-overrides.mjs +1 -1
  1228. package/esm/utils/detect-environment-overrides.mjs.map +1 -1
  1229. package/esm/utils/environment.d.mts +1 -1
  1230. package/esm/utils/environment.d.mts.map +1 -1
  1231. package/esm/utils/environment.mjs +1 -1
  1232. package/esm/utils/environment.mjs.map +1 -1
  1233. package/esm/utils/framework-vesion.mjs +1 -1
  1234. package/esm/utils/framework-vesion.mjs.map +1 -1
  1235. package/esm/utils/get-localized.d.mts +1 -1
  1236. package/esm/utils/get-localized.d.mts.map +1 -1
  1237. package/esm/utils/get-localized.mjs +1 -1
  1238. package/esm/utils/get-localized.mjs.map +1 -1
  1239. package/esm/utils/is-test-file.mjs +1 -1
  1240. package/esm/utils/is-test-file.mjs.map +1 -1
  1241. package/esm/utils/load-environment.mjs +1 -1
  1242. package/esm/utils/load-environment.mjs.map +1 -1
  1243. package/esm/utils/normalized-path.d.mts +1 -1
  1244. package/esm/utils/normalized-path.d.mts.map +1 -1
  1245. package/esm/utils/normalized-path.mjs +1 -1
  1246. package/esm/utils/normalized-path.mjs.map +1 -1
  1247. package/esm/utils/npm-registry.d.mts +1 -1
  1248. package/esm/utils/npm-registry.d.mts.map +1 -1
  1249. package/esm/utils/npm-registry.mjs +1 -1
  1250. package/esm/utils/npm-registry.mjs.map +1 -1
  1251. package/esm/utils/paths.d.mts +1 -1
  1252. package/esm/utils/paths.d.mts.map +1 -1
  1253. package/esm/utils/paths.mjs +1 -1
  1254. package/esm/utils/paths.mjs.map +1 -1
  1255. package/esm/utils/promise-all-object.d.mts +1 -1
  1256. package/esm/utils/promise-all-object.d.mts.map +1 -1
  1257. package/esm/utils/promise-all-object.mjs +1 -1
  1258. package/esm/utils/promise-all-object.mjs.map +1 -1
  1259. package/esm/utils/queue.d.mts +1 -1
  1260. package/esm/utils/queue.d.mts.map +1 -1
  1261. package/esm/utils/queue.mjs +1 -1
  1262. package/esm/utils/queue.mjs.map +1 -1
  1263. package/esm/utils/recorded-environment-overrides.mjs +1 -1
  1264. package/esm/utils/recorded-environment-overrides.mjs.map +1 -1
  1265. package/esm/utils/report-environment-overrides.mjs +1 -1
  1266. package/esm/utils/report-environment-overrides.mjs.map +1 -1
  1267. package/esm/utils/sleep.d.mts +1 -1
  1268. package/esm/utils/sleep.d.mts.map +1 -1
  1269. package/esm/utils/sleep.mjs +1 -1
  1270. package/esm/utils/sleep.mjs.map +1 -1
  1271. package/esm/utils/sluggable.d.mts +1 -1
  1272. package/esm/utils/sluggable.d.mts.map +1 -1
  1273. package/esm/utils/sluggable.mjs +1 -1
  1274. package/esm/utils/sluggable.mjs.map +1 -1
  1275. package/esm/utils/to-json.d.mts +1 -1
  1276. package/esm/utils/to-json.d.mts.map +1 -1
  1277. package/esm/utils/to-json.mjs +1 -1
  1278. package/esm/utils/to-json.mjs.map +1 -1
  1279. package/esm/utils/types.d.mts +1 -1
  1280. package/esm/utils/types.d.mts.map +1 -1
  1281. package/esm/utils/urls.d.mts +1 -1
  1282. package/esm/utils/urls.d.mts.map +1 -1
  1283. package/esm/utils/urls.mjs +1 -1
  1284. package/esm/utils/urls.mjs.map +1 -1
  1285. package/esm/utils/version-compare.d.mts +1 -1
  1286. package/esm/utils/version-compare.d.mts.map +1 -1
  1287. package/esm/utils/version-compare.mjs +1 -1
  1288. package/esm/utils/version-compare.mjs.map +1 -1
  1289. package/esm/validation/database/exists-except-current-id.d.mts +1 -1
  1290. package/esm/validation/database/exists-except-current-id.d.mts.map +1 -1
  1291. package/esm/validation/database/exists-except-current-id.mjs +1 -1
  1292. package/esm/validation/database/exists-except-current-id.mjs.map +1 -1
  1293. package/esm/validation/database/exists-except-current-user.d.mts +1 -1
  1294. package/esm/validation/database/exists-except-current-user.d.mts.map +1 -1
  1295. package/esm/validation/database/exists-except-current-user.mjs +1 -1
  1296. package/esm/validation/database/exists-except-current-user.mjs.map +1 -1
  1297. package/esm/validation/database/types.d.mts +1 -1
  1298. package/esm/validation/database/types.d.mts.map +1 -1
  1299. package/esm/validation/database/unique-except-current-id.d.mts +1 -1
  1300. package/esm/validation/database/unique-except-current-id.d.mts.map +1 -1
  1301. package/esm/validation/database/unique-except-current-id.mjs +1 -1
  1302. package/esm/validation/database/unique-except-current-id.mjs.map +1 -1
  1303. package/esm/validation/database/unique-except-current-user.d.mts +1 -1
  1304. package/esm/validation/database/unique-except-current-user.d.mts.map +1 -1
  1305. package/esm/validation/database/unique-except-current-user.mjs +1 -1
  1306. package/esm/validation/database/unique-except-current-user.mjs.map +1 -1
  1307. package/esm/validation/file/file.d.mts +1 -1
  1308. package/esm/validation/file/file.d.mts.map +1 -1
  1309. package/esm/validation/file/file.mjs +1 -1
  1310. package/esm/validation/file/file.mjs.map +1 -1
  1311. package/esm/validation/init.mjs +1 -1
  1312. package/esm/validation/init.mjs.map +1 -1
  1313. package/esm/validation/plugins/database-plugin.mjs +1 -1
  1314. package/esm/validation/plugins/database-plugin.mjs.map +1 -1
  1315. package/esm/validation/plugins/file-plugin.mjs +1 -1
  1316. package/esm/validation/plugins/file-plugin.mjs.map +1 -1
  1317. package/esm/validation/plugins/localized-plugin.mjs +1 -1
  1318. package/esm/validation/plugins/localized-plugin.mjs.map +1 -1
  1319. package/esm/validation/types.d.mts +1 -1
  1320. package/esm/validation/types.d.mts.map +1 -1
  1321. package/esm/validation/validateAll.mjs +1 -1
  1322. package/esm/validation/validateAll.mjs.map +1 -1
  1323. package/esm/validation/validators/file-validator.d.mts +44 -41
  1324. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  1325. package/esm/validation/validators/file-validator.mjs +4 -1
  1326. package/esm/validation/validators/file-validator.mjs.map +1 -1
  1327. package/esm/vite/lower-stage3-decorators.d.mts +1 -1
  1328. package/esm/vite/lower-stage3-decorators.d.mts.map +1 -1
  1329. package/esm/vite/lower-stage3-decorators.mjs +1 -1
  1330. package/esm/vite/lower-stage3-decorators.mjs.map +1 -1
  1331. package/esm/warlock-config/bundle-config.mjs +148 -0
  1332. package/esm/warlock-config/bundle-config.mjs.map +1 -0
  1333. package/esm/warlock-config/default-configurations.mjs +1 -1
  1334. package/esm/warlock-config/default-configurations.mjs.map +1 -1
  1335. package/esm/warlock-config/define-config.d.mts +1 -1
  1336. package/esm/warlock-config/define-config.d.mts.map +1 -1
  1337. package/esm/warlock-config/define-config.mjs +1 -1
  1338. package/esm/warlock-config/define-config.mjs.map +1 -1
  1339. package/esm/warlock-config/index.d.mts +1 -1
  1340. package/esm/warlock-config/index.mjs +1 -1
  1341. package/esm/warlock-config/normalize-build-config.mjs +1 -1
  1342. package/esm/warlock-config/normalize-build-config.mjs.map +1 -1
  1343. package/esm/warlock-config/types.d.mts +1 -1
  1344. package/esm/warlock-config/types.d.mts.map +1 -1
  1345. package/esm/warlock-config/warlock-config.manager.d.mts +32 -7
  1346. package/esm/warlock-config/warlock-config.manager.d.mts.map +1 -1
  1347. package/esm/warlock-config/warlock-config.manager.mjs +94 -18
  1348. package/esm/warlock-config/warlock-config.manager.mjs.map +1 -1
  1349. package/esm/warlock-config/warn-deprecated-config.mjs +1 -1
  1350. package/esm/warlock-config/warn-deprecated-config.mjs.map +1 -1
  1351. package/llms-full.txt +306 -249
  1352. package/llms.txt +42 -42
  1353. package/package.json +20 -13
  1354. package/skills/README.md +39 -39
  1355. package/skills/add-connector/SKILL.md +4 -4
  1356. package/skills/benchmark-code/SKILL.md +3 -3
  1357. package/skills/build-restful/SKILL.md +5 -5
  1358. package/skills/build-url/SKILL.md +7 -7
  1359. package/skills/configure-app/SKILL.md +30 -8
  1360. package/skills/create-controller/SKILL.md +12 -8
  1361. package/skills/create-module/SKILL.md +9 -9
  1362. package/skills/define-resource/SKILL.md +4 -4
  1363. package/skills/encrypt-data/SKILL.md +7 -7
  1364. package/skills/generate-openapi/SKILL.md +5 -5
  1365. package/skills/hash-password/SKILL.md +8 -8
  1366. package/skills/health-checks/SKILL.md +8 -6
  1367. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  1368. package/skills/process-image/SKILL.md +5 -5
  1369. package/skills/register-route/SKILL.md +16 -6
  1370. package/skills/request-memo/SKILL.md +4 -4
  1371. package/skills/request-tracing/SKILL.md +6 -6
  1372. package/skills/resolve-path/SKILL.md +6 -6
  1373. package/skills/retry-operation/SKILL.md +4 -4
  1374. package/skills/run-app/SKILL.md +20 -13
  1375. package/skills/send-mail/SKILL.md +3 -3
  1376. package/skills/send-response/SKILL.md +16 -8
  1377. package/skills/store-file/SKILL.md +9 -5
  1378. package/skills/test-http/SKILL.md +5 -5
  1379. package/skills/test-service/SKILL.md +5 -5
  1380. package/skills/update-packages/SKILL.md +6 -6
  1381. package/skills/upload-file/SKILL.md +7 -7
  1382. package/skills/use-app-context/SKILL.md +7 -7
  1383. package/skills/use-localization/SKILL.md +6 -6
  1384. package/skills/use-middleware/SKILL.md +8 -8
  1385. package/skills/use-model-transformers/SKILL.md +6 -6
  1386. package/skills/use-repository/SKILL.md +7 -7
  1387. package/skills/use-request-locals/SKILL.md +4 -4
  1388. package/skills/validate-input/SKILL.md +7 -7
  1389. package/skills/warlock-conventions/SKILL.md +6 -6
  1390. package/skills/warlock-doctor/SKILL.md +5 -5
  1391. package/skills/warlock-routes/SKILL.md +6 -6
  1392. package/skills/wire-socket/SKILL.md +4 -4
  1393. package/skills/write-cli-command/SKILL.md +6 -6
  1394. package/skills/write-middleware/SKILL.md +8 -8
  1395. package/skills/write-seeder/SKILL.md +5 -5
  1396. package/skills/write-use-case/SKILL.md +3 -3
package/llms-full.txt CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  ---
10
10
  name: add-connector
11
- description: 'Extend Warlock with a `BaseConnector` subclass and register its instance in `warlock.config.ts > connectors`. Covers runtime lifecycle (`boot`, `start`, `shutdown`, priority, phase, watched files) and the optional static `build.generate` / `build.emit` contribution used by `warlock build`. Triggers: `BaseConnector`, `connectors`, `ConnectorLifecyclePhase`, `ConnectorBuildContribution`, `build.generate`, `build.emit`; "add a queue worker", "wire a subsystem into bootstrap", "contribute files to warlock build", "control startup ordering", "graceful shutdown hook". Skip: app context accessors — `@warlock.js/core/use-app-context/SKILL.md`; general config shape — `@warlock.js/core/configure-app/SKILL.md`; competing pattern: hand-rolled process signal blocks, NestJS lifecycle hooks.'
11
+ description: 'Extend Warlock with a `BaseConnector` subclass and register its instance in `warlock.config.ts > connectors`. Covers runtime lifecycle (`boot`, `start`, `shutdown`, priority, phase, watched files) and the optional static `build.generate` / `build.emit` contribution used by `warlock build`. Triggers: `BaseConnector`, `connectors`, `ConnectorLifecyclePhase`, `ConnectorBuildContribution`, `build.generate`, `build.emit`; "add a queue worker", "wire a subsystem into bootstrap", "contribute files to warlock build", "control startup ordering", "graceful shutdown hook". Skip: app context accessors — the `use-app-context` topic; general config shape — the `configure-app` topic; competing pattern: hand-rolled process signal blocks, NestJS lifecycle hooks.'
12
12
  ---
13
13
 
14
14
  # Warlock — add a connector
@@ -243,16 +243,16 @@ See the [Registering a connector](#registering-a-connector) section above for th
243
243
 
244
244
  ## See also
245
245
 
246
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `warlock.config.ts`, config files, env.
247
- - [`use-app-context/SKILL.md`](../use-app-context/SKILL.md) — checking environment + paths inside `start()`.
248
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, canonical imports.
246
+ - The `configure-app` topic — `warlock.config.ts`, config files, env.
247
+ - The `use-app-context` topic — checking environment + paths inside `start()`.
248
+ - The `warlock-conventions` topic — module layout, canonical imports.
249
249
 
250
250
 
251
251
  ## benchmark-code `@warlock.js/core/benchmark-code/SKILL.md`
252
252
 
253
253
  ---
254
254
  name: benchmark-code
255
- description: 'Wrap a function with `measure(name, fn, options?)` to time it and classify the latency — onComplete/onError/onFinish hooks, `latencyRange` thresholds, `BenchmarkProfiler` for percentiles, `BenchmarkSnapshots` for raw captures. Triggers: `measure`, `BenchmarkProfiler`, `BenchmarkSnapshots`, `BenchmarkChannel`, `ConsoleChannel`, `latencyRange`, `shouldBenchmarkError`; "time this operation", "profile a slow service", "emit p50/p95/p99 metrics", "classify latency against thresholds"; typical import `import { measure, BenchmarkProfiler } from "@warlock.js/core"`. Skip: retry composition — `@warlock.js/core/retry-operation/SKILL.md`; benchmark config wiring — `@warlock.js/core/configure-app/SKILL.md`; competing libs `prom-client`, `pino`, `perf_hooks`, `console.time`.'
255
+ description: 'Wrap a function with `measure(name, fn, options?)` to time it and classify the latency — onComplete/onError/onFinish hooks, `latencyRange` thresholds, `BenchmarkProfiler` for percentiles, `BenchmarkSnapshots` for raw captures. Triggers: `measure`, `BenchmarkProfiler`, `BenchmarkSnapshots`, `BenchmarkChannel`, `ConsoleChannel`, `latencyRange`, `shouldBenchmarkError`; "time this operation", "profile a slow service", "emit p50/p95/p99 metrics", "classify latency against thresholds"; typical import `import { measure, BenchmarkProfiler } from "@warlock.js/core"`. Skip: retry composition — the `retry-operation` topic; benchmark config wiring — the `configure-app` topic; competing libs `prom-client`, `pino`, `perf_hooks`, `console.time`.'
256
256
  ---
257
257
 
258
258
  # Warlock — benchmark code
@@ -504,15 +504,15 @@ The `latency` is the *total* time including retries — useful for the SLO you a
504
504
 
505
505
  ## See also
506
506
 
507
- - [`retry-operation/SKILL.md`](../retry-operation/SKILL.md) — wrapping flaky operations with retry; composes inside `measure()`.
508
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — wiring `src/config/benchmark.ts`.
507
+ - The `retry-operation` topic — wrapping flaky operations with retry; composes inside `measure()`.
508
+ - The `configure-app` topic — wiring `src/config/benchmark.ts`.
509
509
 
510
510
 
511
511
  ## build-restful `@warlock.js/core/build-restful/SKILL.md`
512
512
 
513
513
  ---
514
514
  name: build-restful
515
- description: 'Generate standard CRUD endpoints — via `router.route(path).list().show().create().update().destroy()` chain or the `Restful` base class. Pick the chain by default; reach for `Restful` when you want repository-bound defaults. Triggers: `router.route`, `Restful`, `router.restfulResource`, `RouteResource`, `.crud`, `.nest`, `beforeCreate`, `onCreate`; "build a CRUD API", "register list/show/create/update/destroy", "repository-bound default handlers", "override a single REST action"; typical import `import { router, Restful } from "@warlock.js/core"`. Skip: wider router surface — `@warlock.js/core/register-route/SKILL.md`; per-action controllers — `@warlock.js/core/create-controller/SKILL.md`; wire mapping — `@warlock.js/core/define-resource/SKILL.md`; competing pattern: hand-rolled controllers, `@nestjs/swagger` decorator-driven CRUD.'
515
+ description: 'Generate standard CRUD endpoints — via `router.route(path).list().show().create().update().destroy()` chain or the `Restful` base class. Pick the chain by default; reach for `Restful` when you want repository-bound defaults. Triggers: `router.route`, `Restful`, `router.restfulResource`, `RouteResource`, `.crud`, `.nest`, `beforeCreate`, `onCreate`; "build a CRUD API", "register list/show/create/update/destroy", "repository-bound default handlers", "override a single REST action"; typical import `import { router, Restful } from "@warlock.js/core"`. Skip: wider router surface — the `register-route` topic; per-action controllers — the `create-controller` topic; wire mapping — the `define-resource` topic; competing pattern: hand-rolled controllers, `@nestjs/swagger` decorator-driven CRUD.'
516
516
  ---
517
517
 
518
518
  # Warlock — build a RESTful resource
@@ -774,22 +774,22 @@ router.restfulResource("/orders", new OrdersRestful());
774
774
 
775
775
  ## See also
776
776
 
777
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — the wider router surface (`group`, `prefix`, plain verbs).
778
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — what the chain's handlers look like.
779
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — wire shape for the records the chain returns.
780
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — controller/service/repository layering rules.
777
+ - The `register-route` topic — the wider router surface (`group`, `prefix`, plain verbs).
778
+ - The `create-controller` topic — what the chain's handlers look like.
779
+ - The `define-resource` topic — wire shape for the records the chain returns.
780
+ - The `warlock-conventions` topic — controller/service/repository layering rules.
781
781
 
782
782
 
783
783
  ## build-url `@warlock.js/core/build-url/SKILL.md`
784
784
 
785
785
  ---
786
786
  name: build-url
787
- description: 'HTTP URL helpers — `url`, `publicUrl`, `assetsUrl`, `uploadsUrl`, anchored at `app.baseUrl`. Use to render `src` / `href` / API URLs in resources and responses. `setBaseUrl` is wired by the HTTP connector from `config.get("app.baseUrl")`. Triggers: `url`, `publicUrl`, `assetsUrl`, `uploadsUrl`, `setBaseUrl`, `BASE_URL`; "render an avatar src URL", "absolute download link", "embed asset URL in email", "URL helpers vs path helpers"; typical import `import { url, publicUrl, uploadsUrl } from "@warlock.js/core"`. Skip: filesystem paths — `@warlock.js/core/resolve-path/SKILL.md`; signed CDN URLs — `@warlock.js/core/store-file/SKILL.md`; resource output — `@warlock.js/core/define-resource/SKILL.md`; competing patterns: hand-rolled `${baseUrl}/...` template strings.'
787
+ description: 'HTTP URL helpers — `url`, `publicUrl`, `assetsUrl`, `uploadsUrl`, anchored at `app.baseUrl`. Use to render `src` / `href` / API URLs in resources and responses. `setBaseUrl` is wired by the HTTP connector from `config.get("app.baseUrl")`. Triggers: `url`, `publicUrl`, `assetsUrl`, `uploadsUrl`, `setBaseUrl`, `BASE_URL`; "render an avatar src URL", "absolute download link", "embed asset URL in email", "URL helpers vs path helpers"; typical import `import { url, publicUrl, uploadsUrl } from "@warlock.js/core"`. Skip: filesystem paths — the `resolve-path` topic; signed CDN URLs — the `store-file` topic; resource output — the `define-resource` topic; competing patterns: hand-rolled `${baseUrl}/...` template strings.'
788
788
  ---
789
789
 
790
790
  # Warlock — build a URL
791
791
 
792
- Path helpers ([`resolve-path/SKILL.md`](../resolve-path/SKILL.md)) give you absolute filesystem paths. URL helpers give you absolute HTTP URLs. Different jobs, often confused.
792
+ Path helpers (the `resolve-path` topic) give you absolute filesystem paths. URL helpers give you absolute HTTP URLs. Different jobs, often confused.
793
793
 
794
794
  Use URL helpers whenever you need to render a string that goes into a browser, an HTTP client, or an email — `<img src=...>`, `<a href=...>`, an API response that includes a download link, a webhook payload.
795
795
 
@@ -957,18 +957,18 @@ Don't call `setBaseUrl` per request — it's process-global and races every othe
957
957
 
958
958
  ## See also
959
959
 
960
- - [`resolve-path/SKILL.md`](../resolve-path/SKILL.md) — filesystem path helpers (`uploadsPath`, `publicPath`, ...). Use for read/write; use the URL helpers for rendering.
961
- - [`store-file/SKILL.md`](../store-file/SKILL.md) — the `storage.url(path)` driver method, which can produce signed CDN URLs for non-local drivers (S3 etc.). Use that over `uploadsUrl` when you're on a remote driver.
962
- - [`upload-file/SKILL.md`](../upload-file/SKILL.md) — the `UploadedFile` lifecycle; where the path that feeds `uploadsUrl` comes from.
963
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — the `url` / `uploadsUrl` / `storageUrl` casts (and resolver functions) are the right place to call URL helpers.
964
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `src/config/app.ts` and the `baseUrl` env wiring.
960
+ - The `resolve-path` topic — filesystem path helpers (`uploadsPath`, `publicPath`, ...). Use for read/write; use the URL helpers for rendering.
961
+ - The `store-file` topic — the `storage.url(path)` driver method, which can produce signed CDN URLs for non-local drivers (S3 etc.). Use that over `uploadsUrl` when you're on a remote driver.
962
+ - The `upload-file` topic — the `UploadedFile` lifecycle; where the path that feeds `uploadsUrl` comes from.
963
+ - The `define-resource` topic — the `url` / `uploadsUrl` / `storageUrl` casts (and resolver functions) are the right place to call URL helpers.
964
+ - The `configure-app` topic — `src/config/app.ts` and the `baseUrl` env wiring.
965
965
 
966
966
 
967
967
  ## configure-app `@warlock.js/core/configure-app/SKILL.md`
968
968
 
969
969
  ---
970
970
  name: configure-app
971
- description: 'Configure a Warlock app — the two layers (`warlock.config.ts` for framework-level wiring, `src/config/*.ts` for subsystems), `.env` + `env()`, the `config()` getter for runtime reads, and `app.publicUrl`/`PUBLIC_APP_URL` (the app''s public origin). Triggers: `defineConfig`, `config.get`, `config.key`, `env`, `ConfigRegistry`, `HttpConfigurations`, `AppConfigurations`, `publicUrl`, `PUBLIC_APP_URL`, `getPublicUrl`; "add a new config file", "warlock.config.ts vs src/config", "read env values", "runtime config lookup", "app public origin/URL"; typical import `import { defineConfig, config, env } from "@warlock.js/core"`. Skip: cache driver registration — `@warlock.js/cache/cache-basics/SKILL.md`; mail config — `@warlock.js/core/send-mail/SKILL.md`; storage config — `@warlock.js/core/store-file/SKILL.md`; sitemap refusal on a missing origin — `@warlock.js/web/generate-sitemap/SKILL.md`; competing libs `dotenv` direct, `convict`, `node-config`.'
971
+ description: 'Configure a Warlock app — the two layers (`warlock.config.ts` for framework-level wiring, `src/config/*.ts` for subsystems), `.env` + `env()`, the `config()` getter for runtime reads, and `app.publicUrl`/`PUBLIC_APP_URL` (the app''s public origin). Triggers: `defineConfig`, `config.get`, `config.key`, `env`, `ConfigRegistry`, `HttpConfigurations`, `AppConfigurations`, `publicUrl`, `PUBLIC_APP_URL`, `getPublicUrl`; "add a new config file", "warlock.config.ts vs src/config", "read env values", "runtime config lookup", "app public origin/URL"; typical import `import { defineConfig, config, env } from "@warlock.js/core"`. Skip: cache driver registration — the `cache-basics` topic of the `warlock-js-cache` skill; mail config — the `send-mail` topic; storage config — the `store-file` topic; sitemap refusal on a missing origin — the `generate-sitemap` topic of the `warlock-js-web` skill; competing libs `dotenv` direct, `convict`, `node-config`.'
972
972
  ---
973
973
 
974
974
  # Warlock — configure the app
@@ -1038,6 +1038,24 @@ const httpConfigurations: HttpConfigurations = {
1038
1038
  export default httpConfigurations;
1039
1039
  ```
1040
1040
 
1041
+ ### `serverOptions` — native Fastify/Node server options (5.30.0)
1042
+
1043
+ `http.serverOptions` is passed to Fastify when the server is created, and its
1044
+ `http` key goes on to Node's `http.createServer()`. It is typed as
1045
+ `HttpServerOptions`. The request header limit, for example, is
1046
+ `serverOptions.http.maxHeaderSize` (Node's default is 16KB); a top-level
1047
+ `maxHeaderSize` is not a Fastify option and is ignored:
1048
+
1049
+ ```ts
1050
+ serverOptions: {
1051
+ http: { maxHeaderSize: 32 * 1024 },
1052
+ },
1053
+ ```
1054
+
1055
+ Framework-owned settings (`trustProxy`, `bodyLimit`,
1056
+ `gracefulShutdown.forceCloseConnections`) have their own `http.*` keys;
1057
+ setting them in `serverOptions` as well overrides those keys.
1058
+
1041
1059
  ### `csp` — Content-Security-Policy (5.12.0)
1042
1060
 
1043
1061
  Opt-in (`enabled: true`) `Content-Security-Policy` header, built per-request
@@ -1059,7 +1077,7 @@ for apps that don't opt in.
1059
1077
  A malformed directive value (containing `;`, or with an unbalanced `'`
1060
1078
  count) throws `InvalidCspDirectiveError` at boot, not silently — fix the
1061
1079
  value in `src/config/http.ts` rather than expecting the framework to repair
1062
- it. See [`send-response/SKILL.md`](../send-response/SKILL.md) for how the
1080
+ it. See the `send-response` topic for how the
1063
1081
  header lands on the response, and `@warlock.js/web`'s docs for how the
1064
1082
  same nonce reaches the page's `<script>` tags.
1065
1083
 
@@ -1193,12 +1211,16 @@ Same shape — TS validates the union; runtime picks the `default` key.
1193
1211
 
1194
1212
  ## Multi-server settings (5.20.0)
1195
1213
 
1196
- - `http.rateLimit` — `@fastify/rate-limit` options (`redis`, `nameSpace`, ...); `enabled: false` disables.
1214
+ - `http.rateLimit` — `@fastify/rate-limit` options (`nameSpace`, ...); `store: "cache"` counts in `@warlock.js/cache` so every server shares the limit (per-route `middleware.rateLimit()` follows it; `skipOnError` defaults to `true`, so a cache outage fails open; the `null` and `file` cache drivers are refused); `redis` needs an ioredis client; `enabled: false` disables.
1197
1215
  - `socket.adapter` — adapter factory for cross-server broadcast.
1198
1216
  - `cache.silenceSingleServerWarning`, `storage.silenceSingleServerWarning`, `socket.silenceSingleServerWarning` — silence the production warnings for in-memory cache, local storage, and adapter-less sockets.
1199
1217
 
1200
1218
  `http.modelValidationErrorStatus` sets the status for a Cascade model-write validation failure (a model failing its own schema on save). It defaults to `500` with an opaque body, because request input is already validated with a `422` before the model is touched. Set a `4xx` (e.g. `422`) to treat it as a client error instead; the response then carries `{ errors }`.
1201
1219
 
1220
+ `http.errorMapper(error, request)` maps errors that are not an `HttpError` to `{ status, message?, payload? }` (return `undefined` to keep the default opaque `500`). A mapped 5xx keeps the opaque message unless the mapper sets one.
1221
+
1222
+ `http.logging` controls what request log entries carry: `{ body?: boolean, query?: boolean, redactQueryParams?: string[] }` (body/query default `true`). A route's `logging` option overrides it — use `logging: { body: false, query: false }` on routes that accept secrets or arbitrary text. Entries carry `request.toLogSnapshot()`, never the `Request` object, with credential query values masked in the URL.
1223
+
1202
1224
  ## Per-env knobs
1203
1225
 
1204
1226
  For one-off switches gated on environment, the canonical pattern is `Application.isProduction` (also `isDevelopment`, `isTest`):
@@ -1240,7 +1262,7 @@ requires the value. `@warlock.js/web`'s sitemap is the first such consumer:
1240
1262
  with `web.sitemap.enabled: true` and no `app.publicUrl`/`PUBLIC_APP_URL` set,
1241
1263
  generation refuses (`MissingPublicUrlError`, naming both) rather than falling
1242
1264
  back to a request-derived host — a sitemap pointing at the wrong host is
1243
- worse than none. See `@warlock.js/web/generate-sitemap/SKILL.md`.
1265
+ worse than none. See the `generate-sitemap` topic of the `warlock-js-web` skill.
1244
1266
 
1245
1267
  ## Common patterns
1246
1268
 
@@ -1270,17 +1292,17 @@ Internal `@warlock.js/*` packages read from `config.get("<name>")` the same way
1270
1292
 
1271
1293
  ## See also
1272
1294
 
1273
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, canonical imports, framework-wide invariants.
1274
- - [`@warlock.js/cache/pick-cache-driver/SKILL.md`](../../../cache/skills/pick-cache-driver/SKILL.md) — picking and registering a cache driver in `src/config/cache.ts`.
1275
- - [`send-mail/SKILL.md`](../send-mail/SKILL.md) — the `src/config/mail.ts` shape.
1276
- - [`store-file/SKILL.md`](../store-file/SKILL.md) — the `src/config/storage.ts` shape.
1295
+ - The `warlock-conventions` topic — module layout, canonical imports, framework-wide invariants.
1296
+ - The `pick-cache-driver` topic of the `warlock-js-cache` skill — picking and registering a cache driver in `src/config/cache.ts`.
1297
+ - The `send-mail` topic — the `src/config/mail.ts` shape.
1298
+ - The `store-file` topic — the `src/config/storage.ts` shape.
1277
1299
 
1278
1300
 
1279
1301
  ## create-controller `@warlock.js/core/create-controller/SKILL.md`
1280
1302
 
1281
1303
  ---
1282
1304
  name: create-controller
1283
- description: 'Author HTTP controllers in @warlock.js/core — RequestHandler signature, validated input via seal schemas, response helpers, attaching metadata. Controllers are thin functions; business logic moves to services or use-cases. Triggers: `RequestHandler`, `Request<TSchema>`, `GuardedRequestHandler`, `request.validated`, `request.input`, `controller.validation`, `controller.responseSchema`, `response.success`, `response.successCreate`; "write a controller", "attach a schema to a handler", "thin controller pattern", "guarded request type", "type the API response"; typical import `import { type RequestHandler } from "@warlock.js/core"`. Skip: response helper menu — `@warlock.js/core/send-response/SKILL.md`; schema authoring — `@warlock.js/core/validate-input/SKILL.md`; URL wiring — `@warlock.js/core/register-route/SKILL.md`; competing patterns: `express` middleware functions, `@nestjs/common` `@Controller`/`@Get` decorators.'
1305
+ description: 'Author HTTP controllers in @warlock.js/core — RequestHandler signature, validated input via seal schemas, response helpers, attaching metadata. Controllers are thin functions; business logic moves to services or use-cases. Triggers: `RequestHandler`, `Request<TSchema>`, `GuardedRequestHandler`, `request.validated`, `request.input`, `controller.validation`, `controller.responseSchema`, `response.success`, `response.successCreate`; "write a controller", "attach a schema to a handler", "thin controller pattern", "guarded request type", "type the API response"; typical import `import { type RequestHandler } from "@warlock.js/core"`. Skip: response helper menu — the `send-response` topic; schema authoring — the `validate-input` topic; URL wiring — the `register-route` topic; competing patterns: `express` middleware functions, `@nestjs/common` `@Controller`/`@Get` decorators.'
1284
1306
  ---
1285
1307
 
1286
1308
  # Warlock — create a controller
@@ -1328,16 +1350,20 @@ Prefer `request.validated()` once a schema is attached — it's typed.
1328
1350
  | Content type | Parsed by | Notes |
1329
1351
  | ------------------------------------ | -------------------------------- | --------------------------------------------------------------------- |
1330
1352
  | `application/json` | Fastify (built-in) | objects/arrays parsed as-is |
1331
- | `multipart/form-data` | `@fastify/multipart` | fields + files; see [`upload-file`](../upload-file/SKILL.md) |
1353
+ | `multipart/form-data` | `@fastify/multipart` | fields + files; see the `upload-file` topic |
1332
1354
  | `application/x-www-form-urlencoded` | Warlock's own content-type parser (`http/parse-urlencoded-body.ts`) | plain HTML forms, OAuth `form_post` callbacks (e.g. Apple Sign in) |
1333
1355
 
1334
1356
  For urlencoded bodies: fields decode via `URLSearchParams`. A key sent more than once (`tag=a&tag=b`) becomes an array (`request.input("tag")` → `["a", "b"]`); every other key is a plain string. Bracket-notation keys (`a[b]=1`) are **not** expanded by the urlencoded parser itself — nesting only happens through the same shared bracket-key logic every body type already goes through, so it behaves exactly like a JSON or query-string key of that shape, no differently than today.
1335
1357
 
1336
1358
  All three content types are held to the same `http.bodyLimit` — an over-limit urlencoded body is rejected with the same `413` a JSON body would get.
1337
1359
 
1360
+ ### Stopping work when the client disconnects
1361
+
1362
+ `request.signal` is an `AbortSignal` that aborts when the client disconnects before the response finished (never on normal completion, never because the body finished reading). Pass it to long-running services, composed with a deadline when you need one: `AbortSignal.any([request.signal, AbortSignal.timeout(30_000)])`. Read it per request; never cache it on a shared service.
1363
+
1338
1364
  ## Returning output
1339
1365
 
1340
- Pick the helper that matches the outcome. Full surface in [send-response](../send-response/SKILL.md). Quick map:
1366
+ Pick the helper that matches the outcome. Full surface in the `send-response` topic. Quick map:
1341
1367
 
1342
1368
  | Helper | Status | Use when |
1343
1369
  | ---------------------------------- | ------ | ----------------------------- |
@@ -1414,7 +1440,7 @@ Use `RequestHandler<Request<TSchema>>` for public routes, `GuardedRequestHandler
1414
1440
  createProductController.description = "Create a new product (admin only)";
1415
1441
  ```
1416
1442
 
1417
- `description` feeds the OpenAPI document (`warlock generate.openapi`, see [`generate-openapi`](../generate-openapi/SKILL.md)) and surfaces in dev-server logs.
1443
+ `description` feeds the OpenAPI document (`warlock generate.openapi`, see the `generate-openapi` topic) and surfaces in dev-server logs.
1418
1444
 
1419
1445
  ## Declaring response types with `responseSchema`
1420
1446
 
@@ -1542,7 +1568,7 @@ export const getProductController: RequestHandler = async ({ request, response }
1542
1568
  };
1543
1569
  ```
1544
1570
 
1545
- No `if (!product)` branch in the controller. The error class carries the HTTP semantic (`404` for `ResourceNotFoundError`, `403` for `ForbiddenError`, `400` for `BadRequestError`, `409` for `ConflictError`, `500` for `ServerError`). Full list in [`send-response`](../send-response/SKILL.md#throwing-http-errors). `product.notFound` is a translation key — see localization conventions in your project's `utils/locales.ts`.
1571
+ No `if (!product)` branch in the controller. The error class carries the HTTP semantic (`404` for `ResourceNotFoundError`, `403` for `ForbiddenError`, `400` for `BadRequestError`, `409` for `ConflictError`, `500` for `ServerError`). Full list in the `send-response` topic ("Throwing HTTP errors" section). `product.notFound` is a translation key — see localization conventions in your project's `utils/locales.ts`.
1546
1572
 
1547
1573
  ## Gotchas
1548
1574
 
@@ -1553,16 +1579,16 @@ No `if (!product)` branch in the controller. The error class carries the HTTP se
1553
1579
 
1554
1580
  ## See also
1555
1581
 
1556
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — wiring a controller to a URL.
1557
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — full Response helper surface.
1558
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — controller-service-repository layering.
1582
+ - The `register-route` topic — wiring a controller to a URL.
1583
+ - The `send-response` topic — full Response helper surface.
1584
+ - The `warlock-conventions` topic — controller-service-repository layering.
1559
1585
 
1560
1586
 
1561
1587
  ## create-module `@warlock.js/core/create-module/SKILL.md`
1562
1588
 
1563
1589
  ---
1564
1590
  name: create-module
1565
- description: 'Scaffold a new feature module under `src/app/<name>/` via `warlock generate.module` and the follow-up generators for controllers, models, repositories, resources, and validation schemas. Triggers: `warlock generate.module`, `generate.controller`, `generate.service`, `generate.model`, `generate.repository`, `generate.resource`, `generate.migration`, `--minimal`, `gen.m`; "scaffold a new module", "create CRUD bootstrap", "add a controller to a module", "generate a model"; typical CLI `npx warlock generate.module <name>`. Skip: framework-wide layout rules — `@warlock.js/core/warlock-conventions/SKILL.md`; routes file shape — `@warlock.js/core/register-route/SKILL.md`; controller shape — `@warlock.js/core/create-controller/SKILL.md`; competing tooling: `@nestjs/cli`, `hygen`, hand-rolled folder layouts.'
1591
+ description: 'Scaffold a new feature module under `src/app/<name>/` via `warlock generate.module` and the follow-up generators for controllers, models, repositories, resources, and validation schemas. Triggers: `warlock generate.module`, `generate.controller`, `generate.service`, `generate.model`, `generate.repository`, `generate.resource`, `generate.migration`, `--minimal`, `gen.m`; "scaffold a new module", "create CRUD bootstrap", "add a controller to a module", "generate a model"; typical CLI `npx warlock generate.module <name>`. Skip: framework-wide layout rules — the `warlock-conventions` topic; routes file shape — the `register-route` topic; controller shape — the `create-controller` topic; competing tooling: `@nestjs/cli`, `hygen`, hand-rolled folder layouts.'
1566
1592
  ---
1567
1593
 
1568
1594
  # Warlock — create a module
@@ -1742,21 +1768,21 @@ await warmupProductCache();
1742
1768
 
1743
1769
  ## See also
1744
1770
 
1745
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, file suffixes, path aliases.
1746
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — what to put in `routes.ts`.
1747
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — the handler shape, attaching validation.
1748
- - [`use-repository/SKILL.md`](../use-repository/SKILL.md) — what the generated `<module>.repository.ts` looks like and how to extend it.
1749
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — the output mapper for the model.
1750
- - [`validate-input/SKILL.md`](../validate-input/SKILL.md) — wiring `schema/*.schema.ts` to controllers.
1751
- - [`write-seeder/SKILL.md`](../write-seeder/SKILL.md) — populating the generated `seeds/` folder.
1752
- - [`use-localization/SKILL.md`](../use-localization/SKILL.md) — populating the generated `utils/locales.ts`.
1771
+ - The `warlock-conventions` topic — module layout, file suffixes, path aliases.
1772
+ - The `register-route` topic — what to put in `routes.ts`.
1773
+ - The `create-controller` topic — the handler shape, attaching validation.
1774
+ - The `use-repository` topic — what the generated `<module>.repository.ts` looks like and how to extend it.
1775
+ - The `define-resource` topic — the output mapper for the model.
1776
+ - The `validate-input` topic — wiring `schema/*.schema.ts` to controllers.
1777
+ - The `write-seeder` topic — populating the generated `seeds/` folder.
1778
+ - The `use-localization` topic — populating the generated `utils/locales.ts`.
1753
1779
 
1754
1780
 
1755
1781
  ## define-resource `@warlock.js/core/define-resource/SKILL.md`
1756
1782
 
1757
1783
  ---
1758
1784
  name: define-resource
1759
- description: 'Map model fields to wire-shape via `defineResource()` or `Resource` subclasses. Output-only — never put business logic, hydration, or reconciliation in a resource. Also covers the typed output: `ResourceOutput<typeof R>`, `defineResource<Out>()`, `Serialized<T, W>` and `ModelResourceRegistry`. Triggers: `defineResource`, `Resource`, `RegisterResource`, `toJSON`, `ResourceOutput`, `Serialized`, `ModelResourceRegistry`, `"self"`, `"localized"`, `"uploadsUrl"`; "shape an API response", "type a resource''s output", "what does the client receive", "nest related resources", "rename a field on output", "self-referential tree resource"; typical import `import { defineResource } from "@warlock.js/core"`. Skip: localized columns — `@warlock.js/core/use-localization/SKILL.md`; URL casting — `@warlock.js/core/build-url/SKILL.md`; controller side — `@warlock.js/core/create-controller/SKILL.md`; competing libs `@nestjs/swagger` `@ApiProperty`, `class-transformer`, hand-rolled DTO mappers.'
1785
+ description: 'Map model fields to wire-shape via `defineResource()` or `Resource` subclasses. Output-only — never put business logic, hydration, or reconciliation in a resource. Also covers the typed output: `ResourceOutput<typeof R>`, `defineResource<Out>()`, `Serialized<T, W>` and `ModelResourceRegistry`. Triggers: `defineResource`, `Resource`, `RegisterResource`, `toJSON`, `ResourceOutput`, `Serialized`, `ModelResourceRegistry`, `"self"`, `"localized"`, `"uploadsUrl"`; "shape an API response", "type a resource''s output", "what does the client receive", "nest related resources", "rename a field on output", "self-referential tree resource"; typical import `import { defineResource } from "@warlock.js/core"`. Skip: localized columns — the `use-localization` topic; URL casting — the `build-url` topic; controller side — the `create-controller` topic; competing libs `@nestjs/swagger` `@ApiProperty`, `class-transformer`, hand-rolled DTO mappers.'
1760
1786
  ---
1761
1787
 
1762
1788
  # Warlock — define a resource
@@ -2151,16 +2177,16 @@ export const CommentResource = defineResource({
2151
2177
 
2152
2178
  ## See also
2153
2179
 
2154
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — the output-only rule and where logic actually lives.
2155
- - [`build-restful/SKILL.md`](../build-restful/SKILL.md) — wiring a resource into a CRUD pipeline.
2156
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — calling `new XResource(record).toJSON()` from a controller.
2180
+ - The `warlock-conventions` topic — the output-only rule and where logic actually lives.
2181
+ - The `build-restful` topic — wiring a resource into a CRUD pipeline.
2182
+ - The `create-controller` topic — calling `new XResource(record).toJSON()` from a controller.
2157
2183
 
2158
2184
 
2159
2185
  ## encrypt-data `@warlock.js/core/encrypt-data/SKILL.md`
2160
2186
 
2161
2187
  ---
2162
2188
  name: encrypt-data
2163
- description: 'Reversible AES-256-GCM `encrypt` / `decrypt` for secrets you need to read back; one-way HMAC-SHA256 `hmacHash` for deterministic fingerprints (lookup/dedup of encrypted columns). Keys come from `src/config/encryption.ts`. Triggers: `encrypt`, `decrypt`, `hmacHash`, `EncryptionConfigurations`, `APP_ENCRYPTION_KEY`, `APP_HMAC_KEY`; "store an API key reversibly", "fingerprint an encrypted column for lookup", "AES-256-GCM secret", "HMAC-SHA256 dedup key"; typical import `import { encrypt, decrypt, hmacHash } from "@warlock.js/core"`. Skip: password hashing — `@warlock.js/core/hash-password/SKILL.md`; config wiring — `@warlock.js/core/configure-app/SKILL.md`; competing libs Node `crypto` direct, `crypto-js`, `libsodium-wrappers`.'
2189
+ description: 'Reversible AES-256-GCM `encrypt` / `decrypt` for secrets you need to read back; one-way HMAC-SHA256 `hmacHash` for deterministic fingerprints (lookup/dedup of encrypted columns). Keys come from `src/config/encryption.ts`. Triggers: `encrypt`, `decrypt`, `hmacHash`, `EncryptionConfigurations`, `APP_ENCRYPTION_KEY`, `APP_HMAC_KEY`; "store an API key reversibly", "fingerprint an encrypted column for lookup", "AES-256-GCM secret", "HMAC-SHA256 dedup key"; typical import `import { encrypt, decrypt, hmacHash } from "@warlock.js/core"`. Skip: password hashing — the `hash-password` topic; config wiring — the `configure-app` topic; competing libs Node `crypto` direct, `crypto-js`, `libsodium-wrappers`.'
2164
2190
  ---
2165
2191
 
2166
2192
  # Warlock — encrypt and fingerprint
@@ -2172,7 +2198,7 @@ Two helpers, two different jobs:
2172
2198
  | `encrypt` / `decrypt` | reversible | AES-256-GCM | Secrets you need to read back (API keys, OAuth tokens). |
2173
2199
  | `hmacHash` | one-way | HMAC-SHA256 | Deterministic fingerprint for lookup/dedup of encrypted values. |
2174
2200
 
2175
- Both live in `@warlock.js/core`. For **password hashing** (a one-way job with very different requirements), reach for [`hash-password/SKILL.md`](../hash-password/SKILL.md) instead — bcrypt is the right tool there, not encrypt.
2201
+ Both live in `@warlock.js/core`. For **password hashing** (a one-way job with very different requirements), reach for the `hash-password` topic instead — bcrypt is the right tool there, not encrypt.
2176
2202
 
2177
2203
  ## The shape
2178
2204
 
@@ -2284,7 +2310,7 @@ await idempotencyKeysRepository.first({ hash: hmacHash(JSON.stringify(request))
2284
2310
  log.info("api-key", "used", { fingerprint: hmacHash(apiKey).slice(0, 8) });
2285
2311
  ```
2286
2312
 
2287
- **Do not use `hmacHash` for passwords.** It's fast — a brute-force attack with a stolen database would clear common passwords in minutes. That's what bcrypt is for (see [`hash-password/SKILL.md`](../hash-password/SKILL.md)).
2313
+ **Do not use `hmacHash` for passwords.** It's fast — a brute-force attack with a stolen database would clear common passwords in minutes. That's what bcrypt is for (see the `hash-password` topic).
2288
2314
 
2289
2315
  ## Common patterns
2290
2316
 
@@ -2359,20 +2385,20 @@ Same payload → same key → returns the cached result. Different keys (because
2359
2385
 
2360
2386
  `encrypt` / `decrypt` / `hmacHash` use Node's built-in `crypto` — no extra dependency. They're available out of the box.
2361
2387
 
2362
- Password hashing (`hashPassword`) needs `bcryptjs`, which is its own install — see [`hash-password/SKILL.md`](../hash-password/SKILL.md).
2388
+ Password hashing (`hashPassword`) needs `bcryptjs`, which is its own install — see the `hash-password` topic.
2363
2389
 
2364
2390
  ## See also
2365
2391
 
2366
- - [`hash-password/SKILL.md`](../hash-password/SKILL.md) — bcrypt password hashing (the third member of the encryption module, but a different job entirely).
2367
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `src/config/encryption.ts` and env wiring.
2368
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — service layering, where the encryption boundary should sit.
2392
+ - The `hash-password` topic — bcrypt password hashing (the third member of the encryption module, but a different job entirely).
2393
+ - The `configure-app` topic — `src/config/encryption.ts` and env wiring.
2394
+ - The `warlock-conventions` topic — service layering, where the encryption boundary should sit.
2369
2395
 
2370
2396
 
2371
2397
  ## generate-openapi `@warlock.js/core/generate-openapi/SKILL.md`
2372
2398
 
2373
2399
  ---
2374
2400
  name: generate-openapi
2375
- description: 'Generate an OpenAPI 3.1 document from the registered routes with `warlock generate.openapi` (default `storage/openapi/openapi.json`), write a Postman collection from it with `warlock generate.postman` (default `storage/postman/collection.json`), and read it live in the dev-only API docs page at `/__warlock/docs`. Documents paths, path/query parameters, request bodies from Seal validation, responses from `handler.responseSchema`, 401/422 and bearer/cookie security from `authMiddleware()`. Triggers: `generate.openapi`, `openApiGeneratorCommand`, `buildOpenApiDocument`, `getDevelopmentOpenApiDocument`, `generate.postman`, `openApiToPostmanCollection`, `getDevelopmentPostmanCollection`, `responseSchema`, `--include-pages`, `/__warlock/docs`; "OpenAPI", "Swagger", "API docs", "import my API into Postman or Insomnia", "document my routes". Skip: declaring response types on a handler — `@warlock.js/core/create-controller/SKILL.md`; the devtools dashboard — `@warlock.js/devtools/devtools-overview/SKILL.md`; listing routes — `@warlock.js/core/warlock-routes/SKILL.md`.'
2401
+ description: 'Generate an OpenAPI 3.1 document from the registered routes with `warlock generate.openapi` (default `storage/openapi/openapi.json`), write a Postman collection from it with `warlock generate.postman` (default `storage/postman/collection.json`), and read it live in the dev-only API docs page at `/__warlock/docs`. Documents paths, path/query parameters, request bodies from Seal validation, responses from `handler.responseSchema`, 401/422 and bearer/cookie security from `authMiddleware()`. Triggers: `generate.openapi`, `openApiGeneratorCommand`, `buildOpenApiDocument`, `getDevelopmentOpenApiDocument`, `generate.postman`, `openApiToPostmanCollection`, `getDevelopmentPostmanCollection`, `responseSchema`, `--include-pages`, `/__warlock/docs`; "OpenAPI", "Swagger", "API docs", "import my API into Postman or Insomnia", "document my routes". Skip: declaring response types on a handler — the `create-controller` topic; the devtools dashboard — the `devtools-overview` topic of the `warlock-js-devtools` skill; listing routes — the `warlock-routes` topic.'
2376
2402
  ---
2377
2403
 
2378
2404
  # Warlock — generate an OpenAPI document
@@ -2416,7 +2442,7 @@ npx warlock generate.openapi --out docs/openapi.json --title "Shop API" --server
2416
2442
 
2417
2443
  ### Responses from `responseSchema`
2418
2444
 
2419
- The grammar is the one described in [`create-controller`](../create-controller/SKILL.md#declaring-response-types-with-responseschema): cast strings with suffixes, a resource, `[Resource]`, nested objects.
2445
+ The grammar is the one described in the `create-controller` topic ("Declaring response types with `responseSchema`" section): cast strings with suffixes, a resource, `[Resource]`, nested objects.
2420
2446
 
2421
2447
  ```ts
2422
2448
  loginController.responseSchema = {
@@ -2515,23 +2541,23 @@ const { document, warnings } = buildOpenApiDocument(router.list(), {
2515
2541
 
2516
2542
  ## See also
2517
2543
 
2518
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — `validation`, `description` and `responseSchema` on a handler.
2519
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — resources, which become `components.schemas`.
2520
- - [`warlock-routes/SKILL.md`](../warlock-routes/SKILL.md) — list the routes the document is built from.
2544
+ - The `create-controller` topic — `validation`, `description` and `responseSchema` on a handler.
2545
+ - The `define-resource` topic — resources, which become `components.schemas`.
2546
+ - The `warlock-routes` topic — list the routes the document is built from.
2521
2547
 
2522
2548
 
2523
2549
  ## hash-password `@warlock.js/core/hash-password/SKILL.md`
2524
2550
 
2525
2551
  ---
2526
2552
  name: hash-password
2527
- description: 'One-way bcrypt password hashing — `hashPassword` / `verifyPassword`, plus the declarative `useHashedPassword()` schema transformer that auto-hashes a model''s password field on save. Salt rounds come from `src/config/encryption.ts`. Triggers: `hashPassword`, `verifyPassword`, `useHashedPassword`, `password.salt`, `bcryptjs`; "hash a user password", "verify login credentials", "auto-hash on save", "rotate a password"; typical import `import { hashPassword, verifyPassword } from "@warlock.js/core"`. Skip: reversible secrets — `@warlock.js/core/encrypt-data/SKILL.md`; the other transformers — `@warlock.js/core/use-model-transformers/SKILL.md`; config wiring — `@warlock.js/core/configure-app/SKILL.md`; competing libs `bcrypt` native, `argon2`, `scrypt`.'
2553
+ description: 'One-way bcrypt password hashing — `hashPassword` / `verifyPassword`, plus the declarative `useHashedPassword()` schema transformer that auto-hashes a model''s password field on save. Salt rounds come from `src/config/encryption.ts`. Triggers: `hashPassword`, `verifyPassword`, `useHashedPassword`, `password.salt`, `bcryptjs`; "hash a user password", "verify login credentials", "auto-hash on save", "rotate a password"; typical import `import { hashPassword, verifyPassword } from "@warlock.js/core"`. Skip: reversible secrets — the `encrypt-data` topic; the other transformers — the `use-model-transformers` topic; config wiring — the `configure-app` topic; competing libs `bcrypt` native, `argon2`, `scrypt`.'
2528
2554
  ---
2529
2555
 
2530
2556
  # Warlock — hash a password
2531
2557
 
2532
2558
  For storing user-typed passwords, bcrypt is the one right answer — and the only one. It's **deliberately slow** (~250ms per call with the default salt rounds), which is what makes it expensive to brute-force a stolen password database. Use it for nothing else: not API keys, not session tokens, not "this needs to be one-way."
2533
2559
 
2534
- If your value needs to be read back later → [`encrypt-data/SKILL.md`](../encrypt-data/SKILL.md).
2560
+ If your value needs to be read back later → the `encrypt-data` topic.
2535
2561
  If you need a fast searchable fingerprint of an encrypted value → also `encrypt-data` (`hmacHash`).
2536
2562
 
2537
2563
  ## The shape
@@ -2692,7 +2718,7 @@ There is no `warlock add` feature for password hashing — `bcryptjs` is a plain
2692
2718
 
2693
2719
  ## Gotchas
2694
2720
 
2695
- - **Never use `hashPassword` for non-password values.** A 250ms tax on every API request because someone reached for it as a "general one-way hash" — that's a performance bug waiting to happen. For one-way fingerprinting of encrypted values, use `hmacHash` (see [`encrypt-data/SKILL.md`](../encrypt-data/SKILL.md)).
2721
+ - **Never use `hashPassword` for non-password values.** A 250ms tax on every API request because someone reached for it as a "general one-way hash" — that's a performance bug waiting to happen. For one-way fingerprinting of encrypted values, use `hmacHash` (see the `encrypt-data` topic).
2696
2722
  - **Don't `hashPassword` on the request hot path twice.** Each call is ~250ms. If you `hashPassword(input)` then call it again as part of `verifyPassword`'s internals (you don't), you're stacking the tax. `verifyPassword(plain, storedHash)` takes the plaintext and the stored hash — that's the API.
2697
2723
  - **Don't swap `bcryptjs` for native `bcrypt` without a reason.** `bcryptjs` is portable across every platform (no native build), and the perf delta isn't meaningful in the password-verification workflow.
2698
2724
  - **The transformer detects changes by comparison.** If your model's password field is `null` and you save `null` again, it's a no-op. If it's a hash and you save the same hash string, also no-op. Only an actual value change triggers re-hashing.
@@ -2700,18 +2726,18 @@ There is no `warlock add` feature for password hashing — `bcryptjs` is a plain
2700
2726
 
2701
2727
  ## See also
2702
2728
 
2703
- - [`use-model-transformers/SKILL.md`](../use-model-transformers/SKILL.md) — `useHashedPassword` + the two other model transformers (`useComputedSlug`, `useComputedModel`).
2704
- - [`encrypt-data/SKILL.md`](../encrypt-data/SKILL.md) — reversible AES-256-GCM `encrypt`/`decrypt` + one-way HMAC `hmacHash` (the other two members of the encryption module).
2705
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `src/config/encryption.ts` and the `password.salt` knob.
2706
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — where to filter the password field out of API responses.
2707
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — service layering, where the password boundary should sit.
2729
+ - The `use-model-transformers` topic — `useHashedPassword` + the two other model transformers (`useComputedSlug`, `useComputedModel`).
2730
+ - The `encrypt-data` topic — reversible AES-256-GCM `encrypt`/`decrypt` + one-way HMAC `hmacHash` (the other two members of the encryption module).
2731
+ - The `configure-app` topic — `src/config/encryption.ts` and the `password.salt` knob.
2732
+ - The `define-resource` topic — where to filter the password field out of API responses.
2733
+ - The `warlock-conventions` topic — service layering, where the password boundary should sit.
2708
2734
 
2709
2735
 
2710
2736
  ## health-checks `@warlock.js/core/health-checks/SKILL.md`
2711
2737
 
2712
2738
  ---
2713
2739
  name: health-checks
2714
- description: 'Built-in liveness (`/health`) and readiness (`/ready`) endpoints plus graceful HTTP request draining for zero-downtime deploys — the `health` registry (`health.addCheck`/`removeCheck`), the `http.health.*` and `http.gracefulShutdown.*` config, and how readiness ties into `Application.isShuttingDown`. Triggers: `health`, `health.addCheck`, `health.removeCheck`, `HealthCheck`, `/health`, `/ready`, `http.health`, `http.gracefulShutdown`, `forceCloseConnections`, "liveness probe", "readiness probe", "graceful shutdown", "drain in-flight requests", "zero-downtime deploy", "kubernetes health check", "503 until ready"; typical import `import { health } from "@warlock.js/core"`. Skip: the `Application.onShutdown` / `onceBooted` lifecycle hooks — `@warlock.js/core/use-app-context/SKILL.md`; maintenance-mode 503s — `@warlock.js/core/use-middleware/SKILL.md`; connector lifecycle — `@warlock.js/core/add-connector/SKILL.md`; competing libs `@fastify/under-pressure`, `terminus`, hand-rolled `/health` controllers.'
2740
+ description: 'Built-in liveness (`/health`) and readiness (`/ready`) endpoints plus graceful HTTP request draining for zero-downtime deploys — the `health` registry (`health.addCheck`/`removeCheck`), the `http.health.*` and `http.gracefulShutdown.*` config, and how readiness ties into `Application.isShuttingDown`. Triggers: `health`, `health.addCheck`, `health.removeCheck`, `HealthCheck`, `/health`, `/ready`, `http.health`, `http.gracefulShutdown`, `forceCloseConnections`, "liveness probe", "readiness probe", "graceful shutdown", "drain in-flight requests", "zero-downtime deploy", "kubernetes health check", "503 until ready"; typical import `import { health } from "@warlock.js/core"`. Skip: the `Application.onShutdown` / `onceBooted` lifecycle hooks — the `use-app-context` topic; maintenance-mode 503s — the `use-middleware` topic; connector lifecycle — the `add-connector` topic; competing libs `@fastify/under-pressure`, `terminus`, hand-rolled `/health` controllers.'
2715
2741
  ---
2716
2742
 
2717
2743
  # Warlock — health checks & graceful shutdown
@@ -2803,6 +2829,8 @@ export default httpConfigurations;
2803
2829
 
2804
2830
  `forceCloseConnections`: `"idle"` (default) closes idle keep-alive connections and lets active requests finish; `true` force-closes everything immediately; `false` waits for every connection.
2805
2831
 
2832
+ Under `"idle"`, a request that is still running when shutdown begins answers with `Connection: close`, and its keep-alive connection is closed as soon as the response finishes, so a browser's kept-alive connection does not hold the drain open until the timeout. Responses that had already sent their headers (streams, SSE) are closed when they end. Active responses are never cut short.
2833
+
2806
2834
  ## The zero-downtime deploy flow
2807
2835
 
2808
2836
  ```
@@ -2820,21 +2848,21 @@ For an even smoother handoff, give the load balancer time to observe the 503 bef
2820
2848
  - **`/health` is registered straight on Fastify, not the app router.** It's infra, so it's immune to HMR and route scanning — but if your app also defines a `/health` route you'll have a collision. Rename via `http.health.path`.
2821
2849
  - **Readiness needs a finished boot.** Before `Application.isBooted` (e.g. while late-phase connectors are still starting) `/ready` is 503 by design — that's the point.
2822
2850
  - **A hanging `onShutdown` hook delays the drain.** App hooks run before connector teardown and are only bounded by your process manager's kill timeout; keep them fast. The HTTP drain itself is bounded by `gracefulShutdown.timeout`.
2823
- - **The `maintenance` middleware is a different 503.** It allowlists `/health` by default so probes pass during maintenance — but maintenance mode is operator-toggled downtime, not readiness. See `@warlock.js/core/use-middleware/SKILL.md`.
2851
+ - **The `maintenance` middleware is a different 503.** It allowlists `/health` by default so probes pass during maintenance — but maintenance mode is operator-toggled downtime, not readiness. See the `use-middleware` topic.
2824
2852
 
2825
2853
  ## See also
2826
2854
 
2827
- - [`use-app-context/SKILL.md`](../use-app-context/SKILL.md) — `Application.onShutdown` / `onceBooted` / `isShuttingDown`, the lifecycle hooks the endpoints build on.
2828
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — the `src/config/http.ts` shape.
2829
- - [`add-connector/SKILL.md`](../add-connector/SKILL.md) — connector boot/shutdown order, where draining slots in.
2830
- - [`use-middleware/SKILL.md`](../use-middleware/SKILL.md) — maintenance mode and other built-in middleware.
2855
+ - The `use-app-context` topic — `Application.onShutdown` / `onceBooted` / `isShuttingDown`, the lifecycle hooks the endpoints build on.
2856
+ - The `configure-app` topic — the `src/config/http.ts` shape.
2857
+ - The `add-connector` topic — connector boot/shutdown order, where draining slots in.
2858
+ - The `use-middleware` topic — maintenance mode and other built-in middleware.
2831
2859
 
2832
2860
 
2833
2861
  ## lower-stage3-decorators `@warlock.js/core/lower-stage3-decorators/SKILL.md`
2834
2862
 
2835
2863
  ---
2836
2864
  name: lower-stage3-decorators
2837
- description: 'Vite/Vitest plugin `lowerStage3Decorators()` that lowers TC39 Stage-3 (native) decorators with esbuild before oxc / the SSR rewrite mangles them — so `@RegisterModel`-decorated Cascade models load under Vitest 4 / Vite 8. Triggers: `lowerStage3Decorators`, "SyntaxError: Invalid or unexpected token" on a decorated class, "@(0, __vite_ssr_import__.X)()", "decorator crashes vitest", "models won''t load in tests", "Vite 8 oxc decorators"; typical import `import { lowerStage3Decorators } from "@warlock.js/core/vite"` in `vite.config.ts` / `vitest.config.ts`. Skip: writing the tests themselves — `@warlock.js/core/test-service/SKILL.md` / `@warlock.js/core/test-http/SKILL.md`; runtime migrations — `@warlock.js/cascade/write-migration/SKILL.md`.'
2865
+ description: 'Vite/Vitest plugin `lowerStage3Decorators()` that lowers TC39 Stage-3 (native) decorators with esbuild before oxc / the SSR rewrite mangles them — so `@RegisterModel`-decorated Cascade models load under Vitest 4 / Vite 8. Triggers: `lowerStage3Decorators`, "SyntaxError: Invalid or unexpected token" on a decorated class, "@(0, __vite_ssr_import__.X)()", "decorator crashes vitest", "models won''t load in tests", "Vite 8 oxc decorators"; typical import `import { lowerStage3Decorators } from "@warlock.js/core/vite"` in `vite.config.ts` / `vitest.config.ts`. Skip: writing the tests themselves — the `test-service` topic / the `test-http` topic; runtime migrations — the `write-migration` topic of the `warlock-js-cascade` skill.'
2838
2866
  ---
2839
2867
 
2840
2868
  # Lower Stage-3 decorators for Vite/Vitest
@@ -2885,16 +2913,16 @@ It's the **same esbuild transform the production `tsx`/build path uses**, so a f
2885
2913
 
2886
2914
  ## See also
2887
2915
 
2888
- - [`@warlock.js/core/test-service/SKILL.md`](@warlock.js/core/test-service/SKILL.md) — `setupTest()` bootstrap for unit-testing services/models once the harness loads.
2889
- - [`@warlock.js/core/test-http/SKILL.md`](@warlock.js/core/test-http/SKILL.md) — integration tests over the real HTTP server.
2890
- - [`@warlock.js/cascade/write-migration/SKILL.md`](@warlock.js/cascade/write-migration/SKILL.md) — the decorated models this plugin lets you load.
2916
+ - The `test-service` topic — `setupTest()` bootstrap for unit-testing services/models once the harness loads.
2917
+ - The `test-http` topic — integration tests over the real HTTP server.
2918
+ - The `write-migration` topic of the `warlock-js-cascade` skill — the decorated models this plugin lets you load.
2891
2919
 
2892
2920
 
2893
2921
  ## process-image `@warlock.js/core/process-image/SKILL.md`
2894
2922
 
2895
2923
  ---
2896
2924
  name: process-image
2897
- description: 'Transform images with the `Image` class — resize, crop, rotate, format, quality, watermark, blur, etc. — using a deferred pipeline that runs only at `save()` / `toBuffer()` / `toBase64()` / `toDataUrl()` time. Requires sharp via `warlock add image`. Triggers: `Image`, `Image.fromFile`, `Image.fromBuffer`, `Image.fromUrl`, `.resize`, `.crop`, `.watermark`, `.toBuffer`, `.toDataUrl`, `.apply`; "resize an image", "generate a thumbnail", "watermark a product photo", "build an image pipeline"; typical import `import { Image } from "@warlock.js/core"`. Skip: multipart upload entry — `@warlock.js/core/upload-file/SKILL.md`; storage persistence — `@warlock.js/core/store-file/SKILL.md`; competing libs `sharp` direct, `jimp`, `imagemagick`, `gm`.'
2925
+ description: 'Transform images with the `Image` class — resize, crop, rotate, format, quality, watermark, blur, etc. — using a deferred pipeline that runs only at `save()` / `toBuffer()` / `toBase64()` / `toDataUrl()` time. Requires sharp via `warlock add image`. Triggers: `Image`, `Image.fromFile`, `Image.fromBuffer`, `Image.fromUrl`, `.resize`, `.crop`, `.watermark`, `.toBuffer`, `.toDataUrl`, `.apply`; "resize an image", "generate a thumbnail", "watermark a product photo", "build an image pipeline"; typical import `import { Image } from "@warlock.js/core"`. Skip: multipart upload entry — the `upload-file` topic; storage persistence — the `store-file` topic; competing libs `sharp` direct, `jimp`, `imagemagick`, `gm`.'
2898
2926
  ---
2899
2927
 
2900
2928
  # Warlock — process an image
@@ -3047,7 +3075,7 @@ The wrapper exposes the underlying `sharp.Sharp` via `.image` for anything not s
3047
3075
 
3048
3076
  `UploadedFile` (from multipart uploads) has its own chainable `.resize().format().quality().save(...)` that runs through `Image` internally — same deferred execution, same transforms. Use it when the source is a multipart upload; reach for `new Image(...)` directly when the source is a buffer/path/URL.
3049
3077
 
3050
- See [`upload-file`](../upload-file/SKILL.md) for the multipart entry point and [`store-file`](../store-file/SKILL.md) for persisting the output through storage drivers.
3078
+ See the `upload-file` topic for the multipart entry point and the `store-file` topic for persisting the output through storage drivers.
3051
3079
 
3052
3080
  ## Gotchas
3053
3081
 
@@ -3060,16 +3088,16 @@ See [`upload-file`](../upload-file/SKILL.md) for the multipart entry point and [
3060
3088
 
3061
3089
  ## See also
3062
3090
 
3063
- - [`upload-file/SKILL.md`](../upload-file/SKILL.md) — multipart uploads, where image transforms typically start.
3064
- - [`store-file/SKILL.md`](../store-file/SKILL.md) — persisting image output through storage drivers (local / S3 / R2 / Spaces).
3065
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — where image-processing services live.
3091
+ - The `upload-file` topic — multipart uploads, where image transforms typically start.
3092
+ - The `store-file` topic — persisting image output through storage drivers (local / S3 / R2 / Spaces).
3093
+ - The `warlock-conventions` topic — where image-processing services live.
3066
3094
 
3067
3095
 
3068
3096
  ## register-route `@warlock.js/core/register-route/SKILL.md`
3069
3097
 
3070
3098
  ---
3071
3099
  name: register-route
3072
- description: 'Register HTTP routes via @warlock.js/core''s router — single routes, prefix groups, middleware-guarded blocks, and RESTful resource chains. Routes always live in `src/app/<module>/routes.ts`. Triggers: `router.get`, `router.post`, `router.prefix`, `router.group`, `router.route`, `guarded`; "add a route", "wire a controller to a URL", "group routes by prefix", "register a RESTful resource"; typical import `import { router } from "@warlock.js/core"`. Skip: handler shape — `@warlock.js/core/create-controller/SKILL.md`; CRUD chain details — `@warlock.js/core/build-restful/SKILL.md`; middleware authoring — `@warlock.js/core/write-middleware/SKILL.md`; competing libs `express`, `fastify`, `koa`, `@nestjs/common`.'
3100
+ description: 'Register HTTP routes via @warlock.js/core''s router — single routes, prefix groups, middleware-guarded blocks, and RESTful resource chains. Routes always live in `src/app/<module>/routes.ts`. Triggers: `router.get`, `router.post`, `router.prefix`, `router.group`, `router.route`, `guarded`; "add a route", "wire a controller to a URL", "group routes by prefix", "register a RESTful resource"; typical import `import { router } from "@warlock.js/core"`. Skip: handler shape — the `create-controller` topic; CRUD chain details — the `build-restful` topic; middleware authoring — the `write-middleware` topic; competing libs `express`, `fastify`, `koa`, `@nestjs/common`.'
3073
3101
  ---
3074
3102
 
3075
3103
  # Warlock — register a route
@@ -3098,7 +3126,7 @@ router.post("/orders/:id", createOrderController, { name: "orders.create" });
3098
3126
  Use a concrete HTTP verb for browser forms. `router.any()` is represented as
3099
3127
  `all` metadata and requires callers to choose an explicit path and method.
3100
3128
 
3101
- That's the entire contract for a simple route. `router` is a singleton; method calls register routes synchronously. The handler is a plain function (controllers are typed as `RequestHandler` — see [create-controller](../create-controller/SKILL.md)).
3129
+ That's the entire contract for a simple route. `router` is a singleton; method calls register routes synchronously. The handler is a plain function (controllers are typed as `RequestHandler` — see the `create-controller` topic).
3102
3130
 
3103
3131
  ## HTTP verbs
3104
3132
 
@@ -3167,7 +3195,7 @@ router.prefix("/products", () => {
3167
3195
  });
3168
3196
  ```
3169
3197
 
3170
- If `guarded` doesn't exist in your project yet, see the shared utility convention in [warlock-conventions](../warlock-conventions/SKILL.md).
3198
+ If `guarded` doesn't exist in your project yet, see the shared utility convention in the `warlock-conventions` topic.
3171
3199
 
3172
3200
  ## RESTful resource chain
3173
3201
 
@@ -3227,6 +3255,16 @@ router.prefix("/auth", () => {
3227
3255
  router.get(["/health", "/healthz"], healthController);
3228
3256
  ```
3229
3257
 
3258
+ ### Sensitive routes: keep input out of the logs
3259
+
3260
+ ```ts
3261
+ router.post("/accounts/credentials", accountsController.store, {
3262
+ logging: { body: false, query: false },
3263
+ });
3264
+ ```
3265
+
3266
+ Request log entries otherwise include the body as received (before validation), so rejected fields would be logged too.
3267
+
3230
3268
  ## Gotchas
3231
3269
 
3232
3270
  - **Never import `routes.ts`.** The framework auto-loads it. Importing causes a double-registration error.
@@ -3236,16 +3274,16 @@ router.get(["/health", "/healthz"], healthController);
3236
3274
 
3237
3275
  ## See also
3238
3276
 
3239
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — the handler shape, validation, request/response surface.
3240
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — picking the right `response.<helper>()`.
3241
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, the `guarded` convention, path aliases.
3277
+ - The `create-controller` topic — the handler shape, validation, request/response surface.
3278
+ - The `send-response` topic — picking the right `response.<helper>()`.
3279
+ - The `warlock-conventions` topic — module layout, the `guarded` convention, path aliases.
3242
3280
 
3243
3281
 
3244
3282
  ## request-memo `@warlock.js/core/request-memo/SKILL.md`
3245
3283
 
3246
3284
  ---
3247
3285
  name: request-memo
3248
- description: 'Memoize async work for one HTTP request with `requestMemo<T>(key, fn)` — the v5 replacement for removed `fromRequest`, with single-flight promise sharing, settled-success reuse, rejection eviction, and no cross-request fallback. Triggers: `requestMemo`, `fromRequest`, `fromRequest removed`, `request-scoped cache`, `single-flight`, `current request memo`; "migrate off fromRequest", "load this once per request", "deduplicate concurrent loaders", "cache a repository lookup during one request"; typical import `import { requestMemo } from "@warlock.js/core"`. Skip: middleware-written request state — `@warlock.js/core/use-request-locals/SKILL.md`; process-wide or cross-request caching — `@warlock.js/core/use-middleware/SKILL.md`; competing patterns: dynamic `request[key]` properties, module-global `Map`, payload `request.get()` / `request.set()`.'
3286
+ description: 'Memoize async work for one HTTP request with `requestMemo<T>(key, fn)` — the v5 replacement for removed `fromRequest`, with single-flight promise sharing, settled-success reuse, rejection eviction, and no cross-request fallback. Triggers: `requestMemo`, `fromRequest`, `fromRequest removed`, `request-scoped cache`, `single-flight`, `current request memo`; "migrate off fromRequest", "load this once per request", "deduplicate concurrent loaders", "cache a repository lookup during one request"; typical import `import { requestMemo } from "@warlock.js/core"`. Skip: middleware-written request state — the `use-request-locals` topic; process-wide or cross-request caching — the `use-middleware` topic; competing patterns: dynamic `request[key]` properties, module-global `Map`, payload `request.get()` / `request.set()`.'
3249
3287
  ---
3250
3288
 
3251
3289
  # Warlock — memoize work for one request
@@ -3382,16 +3420,16 @@ Reusing one key for different result types is a caller bug: TypeScript cannot co
3382
3420
 
3383
3421
  ## See also
3384
3422
 
3385
- - [`use-request-locals/SKILL.md`](../use-request-locals/SKILL.md) — typed per-request data written by middleware.
3386
- - [`write-middleware/SKILL.md`](../write-middleware/SKILL.md) — authoring and registering middleware.
3387
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — consuming request-scoped values from controllers.
3423
+ - The `use-request-locals` topic — typed per-request data written by middleware.
3424
+ - The `write-middleware` topic — authoring and registering middleware.
3425
+ - The `create-controller` topic — consuming request-scoped values from controllers.
3388
3426
 
3389
3427
 
3390
3428
  ## request-tracing `@warlock.js/core/request-tracing/SKILL.md`
3391
3429
 
3392
3430
  ---
3393
3431
  name: request-tracing
3394
- description: 'Vendor-neutral request tracing hooks (`http.tracing`) — observe request start/end and named phase spans (`route.match`, `middleware`, `validation`, `handler`, `response.write`) without adopting an OTel/vendor dependency in `core`. Covers the `TracingHooks` shape, trace id derivation from an inbound W3C `traceparent` vs `request.id`, that a throwing hook is caught and reported once (never breaks the request), and zero overhead when disabled. Triggers: `http.tracing`, `TracingHooks`, `onRequestStart`, `onRequestEnd`, `onPhase`, `traceparent`, `traceId`, `dispatchPhase`, "instrument requests", "trace a request", "slow phase logging", "APM / OTel bridge for Warlock". Skip: request-id header echo/inheritance (`X-Request-Id`) — `@warlock.js/core/use-middleware/SKILL.md`; app-level structured logging — `@warlock.js/logger/logger-basics/SKILL.md`; competing libs `@opentelemetry/api` direct instrumentation, `express-request-id`, hand-rolled `X-Trace-Id` middleware.'
3432
+ description: 'Vendor-neutral request tracing hooks (`http.tracing`) — observe request start/end and named phase spans (`route.match`, `middleware`, `validation`, `handler`, `response.write`) without adopting an OTel/vendor dependency in `core`. Covers the `TracingHooks` shape, trace id derivation from an inbound W3C `traceparent` vs `request.id`, that a throwing hook is caught and reported once (never breaks the request), and zero overhead when disabled. Triggers: `http.tracing`, `TracingHooks`, `onRequestStart`, `onRequestEnd`, `onPhase`, `traceparent`, `traceId`, `dispatchPhase`, "instrument requests", "trace a request", "slow phase logging", "APM / OTel bridge for Warlock". Skip: request-id header echo/inheritance (`X-Request-Id`) — the `use-middleware` topic; app-level structured logging — the `logger-basics` topic of the `warlock-js-logger` skill; competing libs `@opentelemetry/api` direct instrumentation, `express-request-id`, hand-rolled `X-Trace-Id` middleware.'
3395
3433
  ---
3396
3434
 
3397
3435
  # Warlock — request tracing hooks
@@ -3522,7 +3560,7 @@ instead of adding a separate hook API. They add three phases:
3522
3560
  trace keeps the same id through Warlock.
3523
3561
  2. Otherwise `traceId` falls back to `request.id` (the framework's own
3524
3562
  per-request correlation id — see
3525
- [`use-middleware/SKILL.md`](../use-middleware/SKILL.md#request-id-correlation)
3563
+ the `use-middleware` topic (its "Request ID correlation" section)
3526
3564
  for how that id is generated/inherited/echoed).
3527
3565
 
3528
3566
  `ctx.requestId` is always `request.id`, regardless of which branch produced
@@ -3543,7 +3581,7 @@ deriveTraceId(undefined, "req-abc123");
3543
3581
 
3544
3582
  Tracing does **not** add a response header of its own. `core` already echoes
3545
3583
  `request.id` back as `X-Request-Id` on every response (see
3546
- [`use-middleware/SKILL.md`](../use-middleware/SKILL.md#request-id-correlation)) —
3584
+ the `use-middleware` topic, "Request ID correlation" section) —
3547
3585
  apps correlate through that existing header. When a valid inbound
3548
3586
  `traceparent` is present, `ctx.traceId` inside your hooks carries that trace
3549
3587
  id even though the response header still reflects `request.id`; if you need
@@ -3617,16 +3655,16 @@ export default {
3617
3655
 
3618
3656
  ## See also
3619
3657
 
3620
- - [`use-middleware/SKILL.md`](../use-middleware/SKILL.md#request-id-correlation) — `X-Request-Id` inheritance/echo, the header tracing correlates through.
3621
- - [`use-app-context/SKILL.md`](../use-app-context/SKILL.md) — request-scoped ALS context (`request`/`response`) tracing hooks run inside.
3622
- - [`@warlock.js/logger/logger-basics/SKILL.md`](../../../logger/skills/logger-basics/SKILL.md) — structured logging; tracing hooks are the place to bridge phase timing into your log channel.
3658
+ - The `use-middleware` topic ("Request ID correlation" section) — `X-Request-Id` inheritance/echo, the header tracing correlates through.
3659
+ - The `use-app-context` topic — request-scoped ALS context (`request`/`response`) tracing hooks run inside.
3660
+ - The `logger-basics` topic of the `warlock-js-logger` skill — structured logging; tracing hooks are the place to bridge phase timing into your log channel.
3623
3661
 
3624
3662
 
3625
3663
  ## resolve-path `@warlock.js/core/resolve-path/SKILL.md`
3626
3664
 
3627
3665
  ---
3628
3666
  name: resolve-path
3629
- description: 'Path helpers anchored at `process.cwd()` — `rootPath`, `srcPath`, `appPath`, `configPath`, `publicPath`, `storagePath`, `uploadsPath`, `cachePath`, `logsPath`, `tempPath`, `warlockPath`, `sanitizePath`. Optional `uploads.root` config overrides the uploads anchor. Triggers: `appPath`, `configPath`, `uploadsPath`, `storagePath`, `publicPath`, `cachePath`, `logsPath`, `tempPath`, `sanitizePath`, `paths`; "resolve a path inside src/app", "absolute upload destination", "sanitize a user filename", "ship uploads to a mounted volume"; typical import `import { appPath, uploadsPath } from "@warlock.js/core"`. Skip: HTTP URL helpers — `@warlock.js/core/build-url/SKILL.md`; app metadata — `@warlock.js/core/use-app-context/SKILL.md`; storage abstraction — `@warlock.js/core/store-file/SKILL.md`; competing patterns: `path.join(process.cwd(), ...)`, hand-rolled directory constants.'
3667
+ description: 'Path helpers anchored at `process.cwd()` — `rootPath`, `srcPath`, `appPath`, `configPath`, `publicPath`, `storagePath`, `uploadsPath`, `cachePath`, `logsPath`, `tempPath`, `warlockPath`, `sanitizePath`. Optional `uploads.root` config overrides the uploads anchor. Triggers: `appPath`, `configPath`, `uploadsPath`, `storagePath`, `publicPath`, `cachePath`, `logsPath`, `tempPath`, `sanitizePath`, `paths`; "resolve a path inside src/app", "absolute upload destination", "sanitize a user filename", "ship uploads to a mounted volume"; typical import `import { appPath, uploadsPath } from "@warlock.js/core"`. Skip: HTTP URL helpers — the `build-url` topic; app metadata — the `use-app-context` topic; storage abstraction — the `store-file` topic; competing patterns: `path.join(process.cwd(), ...)`, hand-rolled directory constants.'
3630
3668
  ---
3631
3669
 
3632
3670
  # Warlock — resolve a path
@@ -3789,18 +3827,18 @@ If you find yourself reaching for `path.join(process.cwd(), ...)` — that's a s
3789
3827
 
3790
3828
  ## See also
3791
3829
 
3792
- - [`build-url/SKILL.md`](../build-url/SKILL.md) — HTTP URL helpers (`url`, `uploadsUrl`, `publicUrl`, `assetsUrl`) — companion for rendering URLs (not filesystem paths).
3793
- - [`use-app-context/SKILL.md`](../use-app-context/SKILL.md) — `Application` static (env, runtime strategy, version, uptime) + `app` runtime accessor (Fastify, socket.io, router, database).
3794
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `src/config/uploads.ts` for the `root` override.
3795
- - [`store-file/SKILL.md`](../store-file/SKILL.md) — the storage abstraction (most uploads code goes through `storage.put(...)`, not raw paths).
3796
- - [`upload-file/SKILL.md`](../upload-file/SKILL.md) — the `UploadedFile` shape that pairs with `uploadsPath`.
3830
+ - The `build-url` topic — HTTP URL helpers (`url`, `uploadsUrl`, `publicUrl`, `assetsUrl`) — companion for rendering URLs (not filesystem paths).
3831
+ - The `use-app-context` topic — `Application` static (env, runtime strategy, version, uptime) + `app` runtime accessor (Fastify, socket.io, router, database).
3832
+ - The `configure-app` topic — `src/config/uploads.ts` for the `root` override.
3833
+ - The `store-file` topic — the storage abstraction (most uploads code goes through `storage.put(...)`, not raw paths).
3834
+ - The `upload-file` topic — the `UploadedFile` shape that pairs with `uploadsPath`.
3797
3835
 
3798
3836
 
3799
3837
  ## retry-operation `@warlock.js/core/retry-operation/SKILL.md`
3800
3838
 
3801
3839
  ---
3802
3840
  name: retry-operation
3803
- description: 'Wrap a flaky operation with `retry(fn, options)` — now provided by `@mongez/reinforcements` (not `@warlock.js/core`). `attempts` total tries, `delay` + `backoff` (linear/exponential/fn), `maxDelay`, `jitter`, `shouldRetry` to bail on permanent errors, `signal` to cancel, plus `retryable()` to pre-bind options. Triggers: `retry`, `retryable`, `RetryOptions`, `attempts`, `backoff`, `jitter`, `maxDelay`, `shouldRetry`, `signal`; "retry a flaky API call", "handle transient errors", "exponential backoff with jitter", "wrap an external request"; typical import `import { retry } from "@mongez/reinforcements"`. Skip: timing the retried op — `@warlock.js/core/benchmark-code/SKILL.md`; use-case-level `retry` option — `@warlock.js/core/write-use-case/SKILL.md`; competing libs `p-retry`, `async-retry`, `cockatiel`.'
3841
+ description: 'Wrap a flaky operation with `retry(fn, options)` — now provided by `@mongez/reinforcements` (not `@warlock.js/core`). `attempts` total tries, `delay` + `backoff` (linear/exponential/fn), `maxDelay`, `jitter`, `shouldRetry` to bail on permanent errors, `signal` to cancel, plus `retryable()` to pre-bind options. Triggers: `retry`, `retryable`, `RetryOptions`, `attempts`, `backoff`, `jitter`, `maxDelay`, `shouldRetry`, `signal`; "retry a flaky API call", "handle transient errors", "exponential backoff with jitter", "wrap an external request"; typical import `import { retry } from "@mongez/reinforcements"`. Skip: timing the retried op — the `benchmark-code` topic; use-case-level `retry` option — the `write-use-case` topic; competing libs `p-retry`, `async-retry`, `cockatiel`.'
3804
3842
  ---
3805
3843
 
3806
3844
  # Warlock — retry an operation
@@ -3893,7 +3931,7 @@ const result = await measure("publish-event", () =>
3893
3931
 
3894
3932
  ## Use-case integration
3895
3933
 
3896
- `useCase()` accepts a `retry` option (the same `RetryOptions`) that wraps the **handler** — see [`@warlock.js/core/write-use-case/SKILL.md`](@warlock.js/core/write-use-case/SKILL.md). Reach for that when "retry" means "re-run the handler"; reach for raw `retry()` when only one step inside is flaky.
3934
+ `useCase()` accepts a `retry` option (the same `RetryOptions`) that wraps the **handler** — see the `write-use-case` topic. Reach for that when "retry" means "re-run the handler"; reach for raw `retry()` when only one step inside is flaky.
3897
3935
 
3898
3936
  ## Gotchas
3899
3937
 
@@ -3905,15 +3943,15 @@ const result = await measure("publish-event", () =>
3905
3943
  ## See also
3906
3944
 
3907
3945
  - [`mongez-reinforcements-async`](mongez-reinforcements-async) — full `retry` / `retryable` reference.
3908
- - [`@warlock.js/core/benchmark-code/SKILL.md`](@warlock.js/core/benchmark-code/SKILL.md) — timing retried operations.
3909
- - [`@warlock.js/core/write-use-case/SKILL.md`](@warlock.js/core/write-use-case/SKILL.md) — the use-case `retry` option.
3946
+ - The `benchmark-code` topic — timing retried operations.
3947
+ - The `write-use-case` topic — the use-case `retry` option.
3910
3948
 
3911
3949
 
3912
3950
  ## run-app `@warlock.js/core/run-app/SKILL.md`
3913
3951
 
3914
3952
  ---
3915
3953
  name: run-app
3916
- description: 'Three operational commands — `warlock dev` (HMR + type-gen + health checks), `warlock build` (esbuild bundle), `warlock start` (spawn the production bundle). All flags, all `warlock.config.ts` knobs that shape them. Triggers: `warlock dev`, `warlock build`, `warlock start`, `devServer`, `--fresh`, `--skip-typings`, `--skip-health`, `outdir`, `outFile`, `sourcemap`, `PortInUseError`, `assertPortIsAvailable`, `EADDRINUSE`, `EsbuildBinaryMissingError`; "start the dev server", "build for production", "run the bundle", "skip type generation", "tune watch globs", "dev server keyboard shortcuts", "press r to restart", "press q to quit", "restart the dev server", "port already in use"; typical config `warlock.config.ts > devServer / build`. Skip: writing a custom CLI — `@warlock.js/core/write-cli-command/SKILL.md`; config shape — `@warlock.js/core/configure-app/SKILL.md`; competing tooling `nodemon`, `tsx`, `ts-node-dev`, `esbuild` direct.'
3954
+ description: 'Three operational commands — `warlock dev` (HMR + type-gen + health checks), `warlock build` (esbuild bundle), `warlock start` (spawn the production bundle). All flags, all `warlock.config.ts` knobs that shape them. Triggers: `warlock dev`, `warlock build`, `warlock start`, `devServer`, `--fresh`, `--skip-typings`, `--skip-health`, `outdir`, `outFile`, `sourcemap`, `PortInUseError`, `assertPortIsAvailable`, `EADDRINUSE`, `EsbuildBinaryMissingError`; "start the dev server", "build for production", "run the bundle", "skip type generation", "tune watch globs", "dev server keyboard shortcuts", "press r to restart", "press q to quit", "restart the dev server", "port already in use"; typical config `warlock.config.ts > devServer / build`. Skip: writing a custom CLI — the `write-cli-command` topic; config shape — the `configure-app` topic; competing tooling `nodemon`, `tsx`, `ts-node-dev`, `esbuild` direct.'
3917
3955
  ---
3918
3956
 
3919
3957
  # Warlock — run the app
@@ -3959,7 +3997,7 @@ Once the server is ready, `warlock dev` listens for single keypresses:
3959
3997
  | `c` | Clear the console. |
3960
3998
  | `q` | Graceful shutdown, exit `0` — the same path as `Ctrl+C`. |
3961
3999
  | `h` | Print the shortcuts that are armed right now. |
3962
- | `u` | **Only while an update notice is showing** — update every `@warlock.js/*` package, install, and restart. See [`update-packages/SKILL.md`](../update-packages/SKILL.md). |
4000
+ | `u` | **Only while an update notice is showing** — update every `@warlock.js/*` package, install, and restart. See the `update-packages` topic. |
3963
4001
  | `Ctrl+C` | Graceful shutdown, unchanged. |
3964
4002
 
3965
4003
  A "restart" is a fresh process (`r` and `u` both use it) — see [The supervisor](#the-supervisor) below for how that works.
@@ -4065,7 +4103,7 @@ export default defineConfig({
4065
4103
  - **`generateTypings`** — turn off if you're committing generated typings and don't want them rewritten on every boot. The `--skip-typings` flag is the per-run version.
4066
4104
  - **`healthCheckers`** — custom file health checker contracts (or `false` to disable). The `--skip-health` flag is the per-run version.
4067
4105
  - **`transpileCacheDebug`** — diagnostic only. Names `.warlock/transpile/*.js` files `<slug>.<hash>.js` and appends `// @source <path>` markers so you can eyeball which cache entry came from which source. Leave off in normal use.
4068
- - **`checkForUpdates`** — on `warlock dev` start, check npm for a newer `@warlock.js/core` and print a one-line notice if one exists. Best-effort and non-blocking; auto-skipped in CI and non-TTY shells. In an interactive terminal the notice arms a **`u` shortcut** that updates every `@warlock.js/*` package, installs, and restarts the server; elsewhere it prints `npx warlock update` instead. The registry answer is cached for 24h in `.warlock/update-check.json`, so a day of restarts costs one lookup. See [`update-packages/SKILL.md`](../update-packages/SKILL.md).
4106
+ - **`checkForUpdates`** — on `warlock dev` start, check npm for a newer `@warlock.js/core` and print a one-line notice if one exists. Best-effort and non-blocking; auto-skipped in CI and non-TTY shells. In an interactive terminal the notice arms a **`u` shortcut** that updates every `@warlock.js/*` package, installs, and restarts the server; elsewhere it prints `npx warlock update` instead. The registry answer is cached for 24h in `.warlock/update-check.json`, so a day of restarts costs one lookup. See the `update-packages` topic.
4069
4107
  - **`restartOnConfigChange`** — restart the dev server when `warlock.config.ts` or any `.env*` changes (default `true`). Set `false` to get a warning instead and restart by hand. Neither file can be hot-reloaded, so without a restart the running services keep the old values.
4070
4108
  - **`timings`** — print a one-line, per-phase breakdown next to the `hmr update` line on every hot reload: `watcher`, `debounce`, `graph`, `reimport`, `connectors`. `watcher` is the raw-fs-notification-to-stabilised-event gap (chokidar's `awaitWriteFinish` window); `debounce` is the handler's own adaptive wait; the rest are self-explanatory. Opt-in, off by default — a disabled flag costs one boolean check per reload, since the watcher-settle bookkeeping only runs when this is on. Use it to see which phase a slow reload is actually spending time in.
4071
4109
 
@@ -4132,7 +4170,7 @@ It exists so `warlock start` can tell a promoted build from a directory that mer
4132
4170
 
4133
4171
  `warlock start` uses the same `resolveBuildConfig()` helper to find the bundle, so the two commands stay in sync no matter how you override the config. If `build` and `start` disagree on where the bundle is, it's because `warlock.config.ts` is being read with different cwds — never the case in normal operation.
4134
4172
 
4135
- If the app uses `@warlock.js/web` page routes, a successful `warlock build` also writes `page-routes.manifest.json` next to the bundle (same `outdir`) — the snapshot `warlock routes:diff` compares the live dev surface against. See [`warlock-routes/SKILL.md`](../warlock-routes/SKILL.md#warlock-routesdiff--catch-page-route-drift-before-it-ships).
4173
+ If the app uses `@warlock.js/web` page routes, a successful `warlock build` also writes `page-routes.manifest.json` next to the bundle (same `outdir`) — the snapshot `warlock routes:diff` compares the live dev surface against. See the `warlock-routes` topic (its `routes:diff` section).
4136
4174
 
4137
4175
  ## `warlock start` — run the production bundle
4138
4176
 
@@ -4216,14 +4254,21 @@ pnpm 10+ will not run a dependency's install script unless the app names it. esb
4216
4254
  [ERR_PNPM_IGNORED_BUILDS] Ignored build scripts: esbuild@0.27.7
4217
4255
  ```
4218
4256
 
4219
- Fix it once in the app's `pnpm-workspace.yaml`:
4257
+ Where the approval goes depends on the pnpm version (measured with real installs):
4258
+
4259
+ | pnpm | Approve esbuild in |
4260
+ | ---------------- | ---------------------------------------------------------------------------- |
4261
+ | 10.26+, 11, 12 | `pnpm-workspace.yaml`: `allowBuilds:` / ` esbuild: true` |
4262
+ | 10.5 – 10.25 | `pnpm-workspace.yaml`: `onlyBuiltDependencies:` / ` - esbuild` |
4263
+ | 7 – 9, 10.0–10.4 | `package.json`: `"pnpm": { "onlyBuiltDependencies": ["esbuild"] }`, and no `pnpm-workspace.yaml` |
4220
4264
 
4221
4265
  ```yaml
4266
+ # pnpm 10.26 and later
4222
4267
  allowBuilds:
4223
4268
  esbuild: true
4224
4269
  ```
4225
4270
 
4226
- Note pnpm reads this from `pnpm-workspace.yaml`, **not** from `package.json`'s `pnpm` field — pnpm 11 warns that the field is ignored and then carries on, so settings left there fail silently.
4271
+ pnpm 11 and 12 ignore `package.json`'s `pnpm` field and fail the install when the workspace file has only `onlyBuiltDependencies`, so keep `allowBuilds` there (listing both keys is fine). pnpm before 10.5 rejects a `pnpm-workspace.yaml` without a `packages:` field (`packages field missing or empty`), and adding `packages: ["."]` makes every later dependency add fail with `ERR_PNPM_ADDING_TO_ROOT` — so on those versions use the `package.json` field instead. `create-warlock` 5.30.0 checks the pnpm version and writes the right one, and `warlock add image` follows the same rule when it approves `sharp`.
4227
4272
 
4228
4273
  `warlock dev` checks for esbuild's native binary before starting (as `warlock build` already did) and fails fast with `EsbuildBinaryMissingError`, naming the same fix, instead of surfacing an opaque low-level error later from inside the bundler.
4229
4274
 
@@ -4309,7 +4354,7 @@ If you need the same fact inside the app, use `Application.onceBooted()` / `Appl
4309
4354
 
4310
4355
  `*` — `environment` follows `NODE_ENV`. The dev command doesn't force it, but the default in most projects is `development`. `start` doesn't force it either; deployments set `NODE_ENV=production` themselves.
4311
4356
 
4312
- If you need conditional behavior, branch on `Application.environment` (the orthogonal "what world am I talking to?" axis), not `runtimeStrategy` (the "how is the framework itself running?" axis). See [`use-app-context/SKILL.md`](../use-app-context/SKILL.md).
4357
+ If you need conditional behavior, branch on `Application.environment` (the orthogonal "what world am I talking to?" axis), not `runtimeStrategy` (the "how is the framework itself running?" axis). See the `use-app-context` topic.
4313
4358
 
4314
4359
  ## Common patterns
4315
4360
 
@@ -4420,19 +4465,19 @@ NODE_OPTIONS=--max-old-space-size=4096 npx warlock start
4420
4465
 
4421
4466
  ## See also
4422
4467
 
4423
- - [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — author a custom CLI command + the rest of the built-in commands (migrate / seed / generate.* / add / storage.put / jwt.generate).
4424
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `warlock.config.ts` shape and `defineConfig`.
4425
- - [`use-app-context/SKILL.md`](../use-app-context/SKILL.md) — `Application.environment` vs `Application.runtimeStrategy`.
4426
- - [`add-connector/SKILL.md`](../add-connector/SKILL.md) — Early vs Late connector phases (why HTTP/socket boot late in dev).
4427
- - [`update-packages/SKILL.md`](../update-packages/SKILL.md) — `warlock update` + the dev-server update notice (`devServer.checkForUpdates`).
4428
- - [`warlock-routes/SKILL.md`](../warlock-routes/SKILL.md) — `warlock routes` / `warlock routes:diff`, the latter comparing live page routes against the manifest `warlock build` writes.
4468
+ - The `write-cli-command` topic — author a custom CLI command + the rest of the built-in commands (migrate / seed / generate.* / add / storage.put / jwt.generate).
4469
+ - The `configure-app` topic — `warlock.config.ts` shape and `defineConfig`.
4470
+ - The `use-app-context` topic — `Application.environment` vs `Application.runtimeStrategy`.
4471
+ - The `add-connector` topic — Early vs Late connector phases (why HTTP/socket boot late in dev).
4472
+ - The `update-packages` topic — `warlock update` + the dev-server update notice (`devServer.checkForUpdates`).
4473
+ - The `warlock-routes` topic — `warlock routes` / `warlock routes:diff`, the latter comparing live page routes against the manifest `warlock build` writes.
4429
4474
 
4430
4475
 
4431
4476
  ## send-mail `@warlock.js/core/send-mail/SKILL.md`
4432
4477
 
4433
4478
  ---
4434
4479
  name: send-mail
4435
- description: 'Send transactional email — `Mail` fluent builder, `sendMail()` direct call, React Email components. Test mode auto-captures into an in-memory mailbox; dev mode logs. Triggers: `Mail.to`, `sendMail`, `setMailMode`, `mailEvents`, `assertMailSent`, `getTestMailbox`, `wasMailSentTo`, `closeAllMailers`; "send a transactional email", "build a React Email template", "configure SMTP or SES", "assert an email was sent in tests"; typical import `import { Mail, sendMail } from "@warlock.js/core"`. Skip: per-config wiring — `@warlock.js/core/configure-app/SKILL.md`; layered service patterns — `@warlock.js/core/warlock-conventions/SKILL.md`; competing libs `nodemailer` direct, `@sendgrid/mail`, `resend`, `mailgun.js`.'
4480
+ description: 'Send transactional email — `Mail` fluent builder, `sendMail()` direct call, React Email components. Test mode auto-captures into an in-memory mailbox; dev mode logs. Triggers: `Mail.to`, `sendMail`, `setMailMode`, `mailEvents`, `assertMailSent`, `getTestMailbox`, `wasMailSentTo`, `closeAllMailers`; "send a transactional email", "build a React Email template", "configure SMTP or SES", "assert an email was sent in tests"; typical import `import { Mail, sendMail } from "@warlock.js/core"`. Skip: per-config wiring — the `configure-app` topic; layered service patterns — the `warlock-conventions` topic; competing libs `nodemailer` direct, `@sendgrid/mail`, `resend`, `mailgun.js`.'
4436
4481
  ---
4437
4482
 
4438
4483
  # Warlock — send a mail
@@ -4830,15 +4875,15 @@ await Mail.to(user.email)
4830
4875
 
4831
4876
  ## See also
4832
4877
 
4833
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `src/config/mail.ts` shape and `env()` patterns.
4834
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — where mail-sending services live.
4878
+ - The `configure-app` topic — `src/config/mail.ts` shape and `env()` patterns.
4879
+ - The `warlock-conventions` topic — where mail-sending services live.
4835
4880
 
4836
4881
 
4837
4882
  ## send-response `@warlock.js/core/send-response/SKILL.md`
4838
4883
 
4839
4884
  ---
4840
4885
  name: send-response
4841
- description: 'Send HTTP responses via @warlock.js/core''s Response helpers — success/error variants, status helpers, redirects, files, streams, and SSE. Picking the right helper carries the HTTP semantic without manual status codes. Triggers: `response.success`, `response.successCreate`, `response.notFound`, `response.forbidden`, `response.badRequest`, `response.sendFile`, `response.stream`, `response.sse`, `response.replay`, `ResourceNotFoundError`, `ForbiddenError`, `request.cookie`, `request.hasCookie`, `CookieJarUnavailableError`; "return a 201 from a controller", "send a file", "stream Server-Sent Events", "throw HTTP-shaped errors from services"; typical import `import type { RequestHandler, Response } from "@warlock.js/core"`. Skip: controller shape — `@warlock.js/core/create-controller/SKILL.md`; route registration — `@warlock.js/core/register-route/SKILL.md`; competing patterns: hand-rolled status codes via `reply.code(404).send(...)`, raw Fastify reply.'
4886
+ description: 'Send HTTP responses via @warlock.js/core''s Response helpers — success/error variants, status helpers, redirects, files, streams, and SSE. Picking the right helper carries the HTTP semantic without manual status codes. Triggers: `response.success`, `response.successCreate`, `response.notFound`, `response.forbidden`, `response.badRequest`, `response.sendFile`, `response.stream`, `response.sse`, `response.replay`, `ResourceNotFoundError`, `ForbiddenError`, `request.cookie`, `request.hasCookie`, `CookieJarUnavailableError`; "return a 201 from a controller", "send a file", "stream Server-Sent Events", "throw HTTP-shaped errors from services"; typical import `import type { RequestHandler, Response } from "@warlock.js/core"`. Skip: controller shape — the `create-controller` topic; route registration — the `register-route` topic; competing patterns: hand-rolled status codes via `reply.code(404).send(...)`, raw Fastify reply.'
4842
4887
  ---
4843
4888
 
4844
4889
  # Warlock — send a response
@@ -4934,7 +4979,7 @@ stream.send("second chunk\n");
4934
4979
  stream.end();
4935
4980
  ```
4936
4981
 
4937
- `response.stream(contentType?)` returns a controller with `.send(chunk)`, `.render(reactNode)`, `.end()`, and an `.ended` getter. Use for large dynamic payloads where buffering would blow memory. Calling `.send()` after `.end()` throws.
4982
+ `response.stream(contentType?, { retainChunks? })` returns a controller with `.send(chunk)`, `.render(reactNode)`, `.end()`, and an `.ended` getter, plus `await .write(chunk)` / `await .drain()` (wait for a slow client; `false` once it left), `.backpressured`, `.signal` (aborted on client disconnect) and `.onDisconnect(fn)`. Use for large dynamic payloads where buffering would blow memory; loop on `await stream.write(chunk)` when the producer can outrun the client. Calling `.send()` after `.end()` throws; after a client disconnect it is a silent no-op. Written chunks are not kept on `response.body` unless `retainChunks` asks for a tail.
4938
4983
 
4939
4984
  ## Throwing HTTP errors
4940
4985
 
@@ -4958,6 +5003,12 @@ throw new ForbiddenError("permission.denied", { resource: "product", id });
4958
5003
  throw new ConflictError("user.duplicateEmail");
4959
5004
  ```
4960
5005
 
5006
+ A program that must not load the framework (a standalone helper, a worker
5007
+ bundle) imports the same classes from `@warlock.js/core/errors`, which pulls in
5008
+ nothing else. Domain errors that cannot extend `HttpError` get a status at the
5009
+ edge through `http.errorMapper` (`(error, request) => ({ status, message?, payload? }) | undefined`);
5010
+ anything unmapped and not an `HttpError` answers an opaque `500`.
5011
+
4961
5012
  Each class takes `(message, payload?)`. The framework keeps the optional
4962
5013
  detail nested under `payload`:
4963
5014
 
@@ -4983,7 +5034,7 @@ export const getProductController: RequestHandler = async ({ request, response }
4983
5034
  };
4984
5035
  ```
4985
5036
 
4986
- See [`create-controller`](../create-controller/SKILL.md) for the "throw from service, return from controller" pattern.
5037
+ See the `create-controller` topic for the "throw from service, return from controller" pattern.
4987
5038
 
4988
5039
  ## Server-Sent Events
4989
5040
 
@@ -4996,7 +5047,9 @@ sse.comment("keep-alive"); // invisible to the client, prevents timeout
4996
5047
  sse.end();
4997
5048
  ```
4998
5049
 
4999
- `response.sse()` returns a controller with `send(event, data, id?)`, `comment(text)`, `end()`, `onDisconnect(handler)`, and an `.ended` getter. The `send` signature is positional — `event` name first, then the `data` payload (JSON-stringified for you), then an optional event `id`. After the client disconnects, `send`/`comment` become silent no-ops and any `onDisconnect` handlers fire — register cleanup there:
5050
+ For streams that can outrun the client (terminals, log tails, big feeds), `await sse.write(event, data)` instead of `send()`: it waits until the client has caught up and resolves `false` once the client is gone. `sse.drain()` waits without sending, `sse.backpressured` reports a backed-up transport, and `sse.signal` aborts on disconnect. Sent events are not kept on `response.body`; `response.sse({ retainEvents: n })` keeps the last `n` for logging/tests (default 0).
5051
+
5052
+ `response.sse()` returns a controller with `send(event, data, id?)`, `comment(text)`, `end()`, `onDisconnect(handler)`, and an `.ended` getter. The `send` signature is positional — `event` name first, then the `data` payload (JSON-stringified for you), then an optional event `id`. Line breaks (and NUL) in the event name and `id` are removed, so values built from user input cannot inject SSE fields. After the client disconnects, `send`/`comment` become silent no-ops and any `onDisconnect` handlers fire (a handler that throws is logged; the rest still run) — register cleanup there:
5000
5053
 
5001
5054
  ```ts
5002
5055
  const sse = response.sse();
@@ -5063,7 +5116,7 @@ These mutate the response in place; chain or call before the final `return respo
5063
5116
  ### `Content-Security-Policy` (5.12.0)
5064
5117
 
5065
5118
  Opt in via `http.csp.enabled` in `src/config/http.ts` (see
5066
- [`configure-app/SKILL.md`](../configure-app/SKILL.md) for the full shape).
5119
+ the `configure-app` topic for the full shape).
5067
5120
  When enabled, every response through the shared request funnel
5068
5121
  (`http/middleware/inject-request-context.ts`, the same seam that stamps
5069
5122
  `X-Request-Id`) gets a `Content-Security-Policy` header — `-Report-Only`
@@ -5143,16 +5196,16 @@ return response.header("X-Cache", "HIT").replay({
5143
5196
 
5144
5197
  ## See also
5145
5198
 
5146
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — what calls `response.<helper>()` from.
5147
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — wiring the controller to a URL.
5148
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — when to use HTTP error helpers vs `throw`.
5199
+ - The `create-controller` topic — what calls `response.<helper>()` from.
5200
+ - The `register-route` topic — wiring the controller to a URL.
5201
+ - The `warlock-conventions` topic — when to use HTTP error helpers vs `throw`.
5149
5202
 
5150
5203
 
5151
5204
  ## store-file `@warlock.js/core/store-file/SKILL.md`
5152
5205
 
5153
5206
  ---
5154
5207
  name: store-file
5155
- description: 'Read/write/delete files via the `storage` singleton — disks, drivers (local/S3/R2/DO Spaces), `storage.use(name)`, `StorageFile` handles, presigned URLs. Triggers: `storage.put`, `storage.get`, `storage.use`, `StorageFile`, `storageConfigurations`, `getPresignedUrl`, `getPresignedUploadUrl`; "save an uploaded file", "switch between local and S3", "generate a presigned URL", "read file metadata"; typical import `import { storage } from "@warlock.js/core"`. Skip: multipart parsing + image chain — `@warlock.js/core/upload-file/SKILL.md`; image transforms — `@warlock.js/core/process-image/SKILL.md`; storage config shape — `@warlock.js/core/configure-app/SKILL.md`; competing libs `@aws-sdk/client-s3`, `multer`, `formidable`.'
5208
+ description: 'Read/write/delete files via the `storage` singleton — disks, drivers (local/S3/R2/DO Spaces), `storage.use(name)`, `StorageFile` handles, presigned URLs. Triggers: `storage.put`, `storage.get`, `storage.use`, `StorageFile`, `storageConfigurations`, `getPresignedUrl`, `getPresignedUploadUrl`; "save an uploaded file", "switch between local and S3", "generate a presigned URL", "read file metadata"; typical import `import { storage } from "@warlock.js/core"`. Skip: multipart parsing + image chain — the `upload-file` topic; image transforms — the `process-image` topic; storage config shape — the `configure-app` topic; competing libs `@aws-sdk/client-s3`, `multer`, `formidable`.'
5156
5209
  ---
5157
5210
 
5158
5211
  # Warlock — store a file
@@ -5331,7 +5384,11 @@ console.log(r2File.url);
5331
5384
  console.log(localFile.url);
5332
5385
  ```
5333
5386
 
5334
- `storage.use(name)` returns a `ScopedStorage` with the same surface as `storage`. To change the default permanently, call `storage.setDefault(name)` — but you almost always want per-call scoping for clarity.
5387
+ `storage.use(name)` returns a `ScopedStorage` with the same surface as `storage`, directory operations included (`storage.use("private").deleteDirectory(dir)` type-checks; no cast). To change the default permanently, call `storage.setDefault(name)` — but you almost always want per-call scoping for clarity.
5388
+
5389
+ ## Cached image variants follow their source
5390
+
5391
+ On a local disk, `delete`, `deleteMany`, `move` and `deleteDirectory` (for every file under it) also remove the file's cached image derivatives (the `?variant=` renders of `uploadedFileController`). For a file removed some other way, call `purgeImageVariants(path, { disk? })`; with no path it clears the disk's whole derivative cache. Serve another local disk's files and variants with `createUploadedFileController({ disk: "private" })`, or call `resolveImageVariant({ disk, path, variant, format? })` from your own authenticated route. A configured `uploads.images.cacheDirectory` is shared by every disk: never put it inside `public/` (Warlock warns once if you do).
5335
5392
 
5336
5393
  ## `StorageFile` — the OOP handle
5337
5394
 
@@ -5547,16 +5604,16 @@ Client `PUT`s the bytes straight to R2 — your server never sees them.
5547
5604
 
5548
5605
  ## See also
5549
5606
 
5550
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `src/config/storage.ts` shape and `env()` patterns.
5551
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout for upload flows (`src/app/uploads/`).
5552
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — `response.sendFile(absPath)` for serving local files.
5607
+ - The `configure-app` topic — `src/config/storage.ts` shape and `env()` patterns.
5608
+ - The `warlock-conventions` topic — module layout for upload flows (`src/app/uploads/`).
5609
+ - The `send-response` topic — `response.sendFile(absPath)` for serving local files.
5553
5610
 
5554
5611
 
5555
5612
  ## test-http `@warlock.js/core/test-http/SKILL.md`
5556
5613
 
5557
5614
  ---
5558
5615
  name: test-http
5559
- description: 'Integration tests against a real HTTP server — `startHttpTestServer()` boots one shared server in globalSetup, then `testGet` / `testPost` / `expectJson` make typed requests against it. Triggers: `startHttpTestServer`, `startHttpTestServer({ port })`, `stopHttpTestServer`, `testGet`, `testPost`, `testPut`, `testPatch`, `testDelete`, `expectJson`, `getTestServerUrl`, `testRequest`, `PortInUseError`, `assertPortIsAvailable`, `isPortAvailable`; "integration-test a controller", "end-to-end HTTP test", "globalSetup HTTP server", "assert status and body shape", "test server port already in use", "EADDRINUSE while running tests", "run tests while the dev server is up"; typical import `import { testGet, testPost, expectJson } from "@warlock.js/core/tests"`. Skip: pure unit tests — `@warlock.js/core/test-service/SKILL.md`; controller shape — `@warlock.js/core/create-controller/SKILL.md`; competing libs `supertest`, `light-my-request`, `nock`.'
5616
+ description: 'Integration tests against a real HTTP server — `startHttpTestServer()` boots one shared server in globalSetup, then `testGet` / `testPost` / `expectJson` make typed requests against it. Triggers: `startHttpTestServer`, `startHttpTestServer({ port })`, `stopHttpTestServer`, `testGet`, `testPost`, `testPut`, `testPatch`, `testDelete`, `expectJson`, `getTestServerUrl`, `testRequest`, `PortInUseError`, `assertPortIsAvailable`, `isPortAvailable`; "integration-test a controller", "end-to-end HTTP test", "globalSetup HTTP server", "assert status and body shape", "test server port already in use", "EADDRINUSE while running tests", "run tests while the dev server is up"; typical import `import { testGet, testPost, expectJson } from "@warlock.js/core/tests"`. Skip: pure unit tests — the `test-service` topic; controller shape — the `create-controller` topic; competing libs `supertest`, `light-my-request`, `nock`.'
5560
5617
  ---
5561
5618
 
5562
5619
  # Warlock — HTTP integration tests
@@ -5906,17 +5963,17 @@ This is fine for normal test flow. It bites when you're inside a transaction the
5906
5963
 
5907
5964
  ## See also
5908
5965
 
5909
- - [`test-service/SKILL.md`](../test-service/SKILL.md) — pure unit tests against services/repositories/models (no HTTP).
5910
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — the controller shape your HTTP tests are exercising.
5911
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, where `tests/*.test.ts` files live.
5912
- - [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — `warlock add test` scaffolds both global + worker setup files.
5966
+ - The `test-service` topic — pure unit tests against services/repositories/models (no HTTP).
5967
+ - The `create-controller` topic — the controller shape your HTTP tests are exercising.
5968
+ - The `warlock-conventions` topic — module layout, where `tests/*.test.ts` files live.
5969
+ - The `write-cli-command` topic — `warlock add test` scaffolds both global + worker setup files.
5913
5970
 
5914
5971
 
5915
5972
  ## test-service `@warlock.js/core/test-service/SKILL.md`
5916
5973
 
5917
5974
  ---
5918
5975
  name: test-service
5919
- description: 'Pure unit tests against services, repositories, models, and use-cases — `setupTest({ connectors })` bootstraps the framework with its own DB/cache connections so you can call your code directly, and `teardownTest()` closes it. Triggers: `setupTest`, `teardownTest`, `src/test-setup.ts`, `tests.connectors`, `tests.setupTimeout`, `Application.setEnvironment`; "unit-test a service", "test a repository query", "vitest setupFiles", "skip connectors for pure-logic tests"; typical import `import { setupTest, teardownTest } from "@warlock.js/core/tests"`. Skip: HTTP integration — `@warlock.js/core/test-http/SKILL.md`; warlock add test scaffold — `@warlock.js/core/write-cli-command/SKILL.md`; competing tooling: jest direct, `supertest`, `nock`.'
5976
+ description: 'Pure unit tests against services, repositories, models, and use-cases — `setupTest({ connectors })` bootstraps the framework with its own DB/cache connections so you can call your code directly, and `teardownTest()` closes it. Triggers: `setupTest`, `teardownTest`, `src/test-setup.ts`, `tests.connectors`, `tests.setupTimeout`, `Application.setEnvironment`; "unit-test a service", "test a repository query", "vitest setupFiles", "skip connectors for pure-logic tests"; typical import `import { setupTest, teardownTest } from "@warlock.js/core/tests"`. Skip: HTTP integration — the `test-http` topic; warlock add test scaffold — the `write-cli-command` topic; competing tooling: jest direct, `supertest`, `nock`.'
5920
5977
  ---
5921
5978
 
5922
5979
  # Warlock — test a service
@@ -6067,7 +6124,7 @@ export default defineConfig({
6067
6124
  });
6068
6125
  ```
6069
6126
 
6070
- The `mongezVite()` plugin handles TypeScript path resolution and the framework's module shape. Without it, your imports break the moment vitest tries to load a Warlock module. `lowerStage3Decorators()` goes **first** — it lets decorated Cascade models (`@RegisterModel`, …) load under Vitest 4 / Vite 8; see [`@warlock.js/core/lower-stage3-decorators/SKILL.md`](@warlock.js/core/lower-stage3-decorators/SKILL.md).
6127
+ The `mongezVite()` plugin handles TypeScript path resolution and the framework's module shape. Without it, your imports break the moment vitest tries to load a Warlock module. `lowerStage3Decorators()` goes **first** — it lets decorated Cascade models (`@RegisterModel`, …) load under Vitest 4 / Vite 8; see the `lower-stage3-decorators` topic.
6071
6128
 
6072
6129
  ### Keep Vitest setup out of development
6073
6130
 
@@ -6307,9 +6364,9 @@ In both cases the guard's scope matches the resource's scope, which is the point
6307
6364
 
6308
6365
  ## See also
6309
6366
 
6310
- - [`test-http/SKILL.md`](../test-http/SKILL.md) — integration tests via the real HTTP server (`startHttpTestServer` + `testGet` / `testPost` / `expectJson`).
6311
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — where tests live in a module (`tests/*.test.ts`).
6312
- - [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — `warlock add test` for the initial scaffold.
6367
+ - The `test-http` topic — integration tests via the real HTTP server (`startHttpTestServer` + `testGet` / `testPost` / `expectJson`).
6368
+ - The `warlock-conventions` topic — where tests live in a module (`tests/*.test.ts`).
6369
+ - The `write-cli-command` topic — `warlock add test` for the initial scaffold.
6313
6370
 
6314
6371
  ## App modules and `importModule`
6315
6372
 
@@ -6326,7 +6383,7 @@ The generated `src/test-setup.ts` already does this. Without it, `setupTest()` u
6326
6383
 
6327
6384
  ---
6328
6385
  name: update-packages
6329
- description: 'Keep a project current with `warlock update` — bump every `@warlock.js/*` dependency in package.json to its latest published version (range operator preserved), then run the lockfile-detected package manager install. Also covers the `warlock dev` update notice, its `u` update-and-restart keyboard shortcut, and the `devServer.checkForUpdates` toggle. Triggers: `warlock update`, `--no-install`, `--dry-run`, `--check`, `checkForUpdates`, `fetchLatestVersion`, `isNewerVersion`; "update warlock packages", "upgrade the framework", "is there a new warlock version", "update notice in the dev server", "press u to update", "dev server keyboard shortcut", "update check offline", "bump @warlock.js/* to latest"; typical CLI `warlock update`. Skip: dev/build/start runtime — `@warlock.js/core/run-app/SKILL.md`; writing a custom command — `@warlock.js/core/write-cli-command/SKILL.md`; installing a NEW feature package (auth, mail, storage) — that is `warlock add`; releasing/publishing the framework — workspace release tooling, not this command.'
6386
+ description: 'Keep a project current with `warlock update` — bump every `@warlock.js/*` dependency in package.json to its latest published version (range operator preserved), then run the lockfile-detected package manager install. Also covers the `warlock dev` update notice, its `u` update-and-restart keyboard shortcut, and the `devServer.checkForUpdates` toggle. Triggers: `warlock update`, `--no-install`, `--dry-run`, `--check`, `checkForUpdates`, `fetchLatestVersion`, `isNewerVersion`; "update warlock packages", "upgrade the framework", "is there a new warlock version", "update notice in the dev server", "press u to update", "dev server keyboard shortcut", "update check offline", "bump @warlock.js/* to latest"; typical CLI `warlock update`. Skip: dev/build/start runtime — the `run-app` topic; writing a custom command — the `write-cli-command` topic; installing a NEW feature package (auth, mail, storage) — that is `warlock add`; releasing/publishing the framework — workspace release tooling, not this command.'
6330
6387
  ---
6331
6388
 
6332
6389
  # Warlock — update the framework
@@ -6405,7 +6462,7 @@ Pressing `u` on that notice runs the whole upgrade without leaving the dev serve
6405
6462
 
6406
6463
  1. The shortcut is disarmed and the terminal handed back, so the package manager owns stdin.
6407
6464
  2. Every `@warlock.js/*` dependency is rewritten to latest and installed — exactly what `warlock update` does.
6408
- 3. The worker shuts down (freeing the http port) and exits `75`; the `warlock dev` supervisor spawns a replacement on the new version. See [`run-app/SKILL.md`](../run-app/SKILL.md) for the supervisor.
6465
+ 3. The worker shuts down (freeing the http port) and exits `75`; the `warlock dev` supervisor spawns a replacement on the new version. See the `run-app` topic for the supervisor.
6409
6466
 
6410
6467
  What happens when it doesn't go to plan:
6411
6468
 
@@ -6417,7 +6474,7 @@ What happens when it doesn't go to plan:
6417
6474
 
6418
6475
  The shortcut is only offered when stdin is an interactive TTY. When it isn't (CI, piped stdin, a process supervisor), the notice falls back to the `Run npx warlock update` line instead — it never silently does nothing.
6419
6476
 
6420
- `u` joins the dev server's standing shortcut bar (`r` restart, `c` clear, `q` quit, `h` help) — press `h` to list whatever is armed. See [`run-app/SKILL.md`](../run-app/SKILL.md) for the bar and the raw-mode / `Ctrl+C` contract.
6477
+ `u` joins the dev server's standing shortcut bar (`r` restart, `c` clear, `q` quit, `h` help) — press `h` to list whatever is armed. See the `run-app` topic for the bar and the raw-mode / `Ctrl+C` contract.
6421
6478
 
6422
6479
  It is automatically skipped when:
6423
6480
 
@@ -6454,16 +6511,16 @@ Two small zero-dependency utilities back the tooling and are exported from `@war
6454
6511
 
6455
6512
  ## See also
6456
6513
 
6457
- - [`run-app/SKILL.md`](../run-app/SKILL.md) — `warlock dev` / `build` / `start` and the `devServer.*` config knobs.
6458
- - [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — author your own `warlock <cmd>`.
6459
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `warlock.config.ts` shape and `defineConfig`.
6514
+ - The `run-app` topic — `warlock dev` / `build` / `start` and the `devServer.*` config knobs.
6515
+ - The `write-cli-command` topic — author your own `warlock <cmd>`.
6516
+ - The `configure-app` topic — `warlock.config.ts` shape and `defineConfig`.
6460
6517
 
6461
6518
 
6462
6519
  ## upload-file `@warlock.js/core/upload-file/SKILL.md`
6463
6520
 
6464
6521
  ---
6465
6522
  name: upload-file
6466
- description: 'Handle multipart file uploads — read via `request.file()` or `request.validated()`, validate with `v.file()`, save via `UploadedFile.save()` or the storage layer, transform images inline. Triggers: `UploadedFile`, `request.file`, `v.file`, `.save`, `.saveAs`, `.resize`, `.format`, `.quality`, `.image`, `.mimeType`, `.maxSize`; "accept a file upload", "validate file size and mime", "save to S3 or local disk", "resize an uploaded image on save"; typical import `import type { UploadedFile, RequestHandler } from "@warlock.js/core"`. Skip: storage drivers + presigned URLs — `@warlock.js/core/store-file/SKILL.md`; image-only transforms — `@warlock.js/core/process-image/SKILL.md`; schema rules — `@warlock.js/core/validate-input/SKILL.md`; competing libs `multer`, `formidable`, `busboy`.'
6523
+ description: 'Handle multipart file uploads — read via `request.file()` or `request.validated()`, validate with `v.file()`, save via `UploadedFile.save()` or the storage layer, transform images inline. Triggers: `UploadedFile`, `request.file`, `v.file`, `.save`, `.saveAs`, `.resize`, `.format`, `.quality`, `.image`, `.mimeType`, `.maxSize`; "accept a file upload", "validate file size and mime", "save to S3 or local disk", "resize an uploaded image on save"; typical import `import type { UploadedFile, RequestHandler } from "@warlock.js/core"`. Skip: storage drivers + presigned URLs — the `store-file` topic; image-only transforms — the `process-image` topic; schema rules — the `validate-input` topic; competing libs `multer`, `formidable`, `busboy`.'
6467
6524
  ---
6468
6525
 
6469
6526
  # Warlock — upload a file
@@ -6671,7 +6728,7 @@ v.file() // must be UploadedFile
6671
6728
  .minHeight(200).maxHeight(4000);
6672
6729
  ```
6673
6730
 
6674
- Size accepts either bytes (`.maxSize(5_242_880)`) or `{ unit, size }` (`{ unit: "MB", size: 5 }`). See [`validate-input`](../validate-input/SKILL.md) for the full validation pattern.
6731
+ Size accepts either bytes (`.maxSize(5_242_880)`) or `{ unit, size }` (`{ unit: "MB", size: 5 }`). See the `validate-input` topic for the full validation pattern.
6675
6732
 
6676
6733
  ### Optional file field
6677
6734
 
@@ -6754,7 +6811,7 @@ await storage.use("s3").put(await uploadedFile.buffer(), "documents/report.pdf",
6754
6811
 
6755
6812
  ### Stream a download from a stored file
6756
6813
 
6757
- The reverse direction — sending a stored file back via `response.sendFile(...)` is the cleanest path. For dynamic content, use `response.stream(...)`. See [`send-response`](../send-response/SKILL.md).
6814
+ The reverse direction — sending a stored file back via `response.sendFile(...)` is the cleanest path. For dynamic content, use `response.stream(...)`. See the `send-response` topic.
6758
6815
 
6759
6816
  ## Gotchas
6760
6817
 
@@ -6768,17 +6825,17 @@ The reverse direction — sending a stored file back via `response.sendFile(...)
6768
6825
 
6769
6826
  ## See also
6770
6827
 
6771
- - [`validate-input/SKILL.md`](../validate-input/SKILL.md) — `v.file()` rules and the validation pipeline.
6772
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — pulling files from `request.validated()` vs `request.file()`.
6773
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — `response.sendFile(...)` for serving the stored file back.
6774
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — storage configuration and driver selection.
6828
+ - The `validate-input` topic — `v.file()` rules and the validation pipeline.
6829
+ - The `create-controller` topic — pulling files from `request.validated()` vs `request.file()`.
6830
+ - The `send-response` topic — `response.sendFile(...)` for serving the stored file back.
6831
+ - The `warlock-conventions` topic — storage configuration and driver selection.
6775
6832
 
6776
6833
 
6777
6834
  ## use-app-context `@warlock.js/core/use-app-context/SKILL.md`
6778
6835
 
6779
6836
  ---
6780
6837
  name: use-app-context
6781
- description: 'Read app-wide context — the `Application` static class (env, version, uptime, runtime strategy, boot lifecycle) plus the `app` runtime accessor (live Fastify, socket.io, router, database via the DI container). Triggers: `Application.isProduction`, `Application.environment`, `Application.runtimeStrategy`, `Application.uptime`, `Application.version`, `Application.onceBooted`, `Application.whenBooted`, `Application.isBooted`, `Application.onShutdown`, `Application.isShuttingDown`, `app.http`, `app.socket`, `app.database`, `app.router`; "branch on environment", "reach the live Fastify instance", "framework version in health endpoint", "dev vs production runtime check", "run code once the app is fully booted", "after all connectors started", "app booted hook", "run cleanup before shutdown", "graceful shutdown hook"; typical import `import { Application, app } from "@warlock.js/core"`. Skip: path helpers — `@warlock.js/core/resolve-path/SKILL.md`; connector start order — `@warlock.js/core/add-connector/SKILL.md`; competing patterns: bare `process.env.NODE_ENV`, ad-hoc Fastify imports.'
6838
+ description: 'Read app-wide context — the `Application` static class (env, version, uptime, runtime strategy, boot lifecycle) plus the `app` runtime accessor (live Fastify, socket.io, router, database via the DI container). Triggers: `Application.isProduction`, `Application.environment`, `Application.runtimeStrategy`, `Application.uptime`, `Application.version`, `Application.onceBooted`, `Application.whenBooted`, `Application.isBooted`, `Application.onShutdown`, `Application.isShuttingDown`, `app.http`, `app.socket`, `app.database`, `app.router`; "branch on environment", "reach the live Fastify instance", "framework version in health endpoint", "dev vs production runtime check", "run code once the app is fully booted", "after all connectors started", "app booted hook", "run cleanup before shutdown", "graceful shutdown hook"; typical import `import { Application, app } from "@warlock.js/core"`. Skip: path helpers — the `resolve-path` topic; connector start order — the `add-connector` topic; competing patterns: bare `process.env.NODE_ENV`, ad-hoc Fastify imports.'
6782
6839
  ---
6783
6840
 
6784
6841
  # Warlock — use the application context
@@ -6909,11 +6966,11 @@ Application.onceBooted(() => {
6909
6966
 
6910
6967
  Hooks run **LIFO** (reverse of registration — last opened, first closed), each is awaited, and a throwing hook is caught + logged so it can't block the rest. `Application.isShuttingDown` flips `true` the moment shutdown begins — the built-in `/ready` endpoint reads it to report not-ready so a load balancer drains the instance first. Like `onceBooted`, registering after shutdown has begun runs the callback immediately.
6911
6968
 
6912
- The framework triggers this for you (the connectors manager runs the hooks at the start of shutdown); app code only ever registers via `onShutdown`. For the HTTP-side story — `/health`, `/ready`, and graceful request draining — see `@warlock.js/core/health-checks/SKILL.md`.
6969
+ The framework triggers this for you (the connectors manager runs the hooks at the start of shutdown); app code only ever registers via `onShutdown`. For the HTTP-side story — `/health`, `/ready`, and graceful request draining — see the `health-checks` topic.
6913
6970
 
6914
6971
  ## Paths
6915
6972
 
6916
- For path helpers (`appPath`, `configPath`, `uploadsPath`, …) anchored at `process.cwd()`, the `paths.*` aggregate, and the `uploads.root` config override, see [`resolve-path/SKILL.md`](../resolve-path/SKILL.md).
6973
+ For path helpers (`appPath`, `configPath`, `uploadsPath`, …) anchored at `process.cwd()`, the `paths.*` aggregate, and the `uploads.root` config override, see the `resolve-path` topic.
6917
6974
 
6918
6975
  The most-used helpers are also surfaced as no-argument getters on `Application`:
6919
6976
 
@@ -7072,17 +7129,17 @@ cors: {
7072
7129
 
7073
7130
  ## See also
7074
7131
 
7075
- - [`resolve-path/SKILL.md`](../resolve-path/SKILL.md) — path helpers (`appPath`, `configPath`, `uploadsPath`, …) and the `paths.*` aggregate.
7076
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — `src/config/*.ts` and `warlock.config.ts`.
7077
- - [`add-connector/SKILL.md`](../add-connector/SKILL.md) — using `Application.runtimeStrategy` inside a connector's `start()`.
7078
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, where paths point to.
7132
+ - The `resolve-path` topic — path helpers (`appPath`, `configPath`, `uploadsPath`, …) and the `paths.*` aggregate.
7133
+ - The `configure-app` topic — `src/config/*.ts` and `warlock.config.ts`.
7134
+ - The `add-connector` topic — using `Application.runtimeStrategy` inside a connector's `start()`.
7135
+ - The `warlock-conventions` topic — module layout, where paths point to.
7079
7136
 
7080
7137
 
7081
7138
  ## use-localization `@warlock.js/core/use-localization/SKILL.md`
7082
7139
 
7083
7140
  ---
7084
7141
  name: use-localization
7085
- description: 'Multi-locale translations via `groupedTranslations` (declare keys), `t()` (look up; always use it in app code, never `request.t()`), `request.getLocaleCode()` (detect locale from headers/query), `getLocalized` (pick the right value from a localized-array column). Triggers: `groupedTranslations`, `t`, `request.t`, `request.trans`, `request.transFrom`, `request.getLocaleCode`, `request.setLocaleCode`, `getLocalized`; "add a translation key", "resolve a localized error message", "detect request locale", "pick the right per-locale column value"; typical import `import { t, getLocalized } from "@warlock.js/core"`. Skip: resource output — `@warlock.js/core/define-resource/SKILL.md`; module scaffold — `@warlock.js/core/create-module/SKILL.md`; competing libs `i18next`, `react-intl`, raw `@mongez/localization`.'
7142
+ description: 'Multi-locale translations via `groupedTranslations` (declare keys), `t()` (look up; always use it in app code, never `request.t()`), `request.getLocaleCode()` (detect locale from headers/query), `getLocalized` (pick the right value from a localized-array column). Triggers: `groupedTranslations`, `t`, `request.t`, `request.trans`, `request.transFrom`, `request.getLocaleCode`, `request.setLocaleCode`, `getLocalized`; "add a translation key", "resolve a localized error message", "detect request locale", "pick the right per-locale column value"; typical import `import { t, getLocalized } from "@warlock.js/core"`. Skip: resource output — the `define-resource` topic; module scaffold — the `create-module` topic; competing libs `i18next`, `react-intl`, raw `@mongez/localization`.'
7086
7143
  ---
7087
7144
 
7088
7145
  # Warlock — translate keys + pick localized values
@@ -7197,7 +7254,7 @@ When an app uses `@warlock.js/web`, `warlock dev` writes `.warlock/typings/trans
7197
7254
  `useTrans()` now works correctly across hydration (5.15.0): the hydration
7198
7255
  payload ships a `translations` key with the active locale's keywords, and
7199
7256
  `@warlock.js/web` registers them into this same lookup table before the
7200
- client hydrates — see `@warlock.js/web/write-the-root/SKILL.md`'s "`useTrans()`
7257
+ client hydrates — see the `write-the-root` topic of the `warlock-js-web` skill's "`useTrans()`
7201
7258
  survives hydration" section for the failure this fixed.
7202
7259
 
7203
7260
  ### Locale on a specific lookup
@@ -7398,10 +7455,10 @@ GET /products/42?locale=ar
7398
7455
 
7399
7456
  ## See also
7400
7457
 
7401
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — error helpers that pair with translated messages (`response.notFound({ error: t("...") })`).
7402
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — using `getLocalized` inside resource output for clean per-locale responses.
7403
- - [`create-module/SKILL.md`](../create-module/SKILL.md) — the `utils/locales.json` file is part of the generated module scaffold.
7404
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — `utils/locales.json` is auto-loaded; the suffix is mandatory.
7458
+ - The `send-response` topic — error helpers that pair with translated messages (`response.notFound({ error: t("...") })`).
7459
+ - The `define-resource` topic — using `getLocalized` inside resource output for clean per-locale responses.
7460
+ - The `create-module` topic — the `utils/locales.json` file is part of the generated module scaffold.
7461
+ - The `warlock-conventions` topic — `utils/locales.json` is auto-loaded; the suffix is mandatory.
7405
7462
 
7406
7463
  ## Route-owned web translations (5.17)
7407
7464
 
@@ -7424,7 +7481,7 @@ When a route-locales snapshot applies, `t()` (through the request binding) and `
7424
7481
 
7425
7482
  ---
7426
7483
  name: use-middleware
7427
- description: 'Attach built-in HTTP middleware to routes via the `middleware` namespace from `@warlock.js/core` — rateLimit, concurrencyLimit, maxBodySize, idempotency, maintenance, ipFilter, cache. Plus `X-Request-Id` correlation, wired automatically. Triggers: `middleware.rateLimit`, `middleware.concurrencyLimit`, `middleware.maxBodySize`, `middleware.idempotency`, `middleware.maintenance`, `middleware.ipFilter`, `middleware.cache`, `X-Request-Id`, `Idempotency-Key`; "add rate limiting", "dedupe writes by idempotency key", "cap concurrent requests", "block IPs", "cache a GET response"; typical import `import { middleware } from "@warlock.js/core"`. Skip: author custom middleware — `@warlock.js/core/write-middleware/SKILL.md`; cache singleton — `@warlock.js/cache/cache-basics/SKILL.md`; competing libs `@fastify/rate-limit` direct, `express-rate-limit`, `helmet`.'
7484
+ description: 'Attach built-in HTTP middleware to routes via the `middleware` namespace from `@warlock.js/core` — rateLimit, concurrencyLimit, maxBodySize, idempotency, maintenance, ipFilter, cache. Plus `X-Request-Id` correlation, wired automatically. Triggers: `middleware.rateLimit`, `middleware.concurrencyLimit`, `middleware.maxBodySize`, `middleware.idempotency`, `middleware.maintenance`, `middleware.ipFilter`, `middleware.cache`, `X-Request-Id`, `Idempotency-Key`; "add rate limiting", "dedupe writes by idempotency key", "cap concurrent requests", "block IPs", "cache a GET response"; typical import `import { middleware } from "@warlock.js/core"`. Skip: author custom middleware — the `write-middleware` topic; cache singleton — the `cache-basics` topic of the `warlock-js-cache` skill; competing libs `@fastify/rate-limit` direct, `express-rate-limit`, `helmet`.'
7428
7485
  ---
7429
7486
 
7430
7487
  # Warlock — use built-in middleware
@@ -7440,7 +7497,7 @@ middleware.maxBodySize("2mb");
7440
7497
  // ... etc
7441
7498
  ```
7442
7499
 
7443
- For authoring your OWN middleware (custom guards, enrichment, etc.), see [`write-middleware`](../write-middleware/SKILL.md).
7500
+ For authoring your OWN middleware (custom guards, enrichment, etc.), see the `write-middleware` topic.
7444
7501
 
7445
7502
  ## The catalog
7446
7503
 
@@ -7463,7 +7520,7 @@ Each is documented inline (JSDoc + `@example`) — read the file under `@warlock
7463
7520
  - **Rate limit** caps **requests per time window** — 5 logins/minute per IP. Use for abuse prevention, cost-control on cheap-but-spammable endpoints.
7464
7521
  - **Concurrency limit** caps **in-flight requests at any instant** — 3 simultaneous report generations. Use for expensive endpoints where parallel calls would overload the worker (CPU-bound, large memory, slow third-party).
7465
7522
 
7466
- Both counters are **process-local**. With N replicas the effective cap is N × value. For globally-shared rate limits, configure `@fastify/rate-limit` with a Redis store via `http.rateLimit` instead.
7523
+ Both counters are **process-local** by default. With N replicas the effective cap is N × value. `rateLimit` can count in `@warlock.js/cache` instead: `store: "cache"` on the limiter, or `http.rateLimit.store: "cache"` for every limiter (give conditionally created limiters a `name`). It needs a counting driver (`redis`, `pg`, or memory for one process): `null` and `file` are refused, and a cache outage fails open with the error logged at most once a minute. The concurrency cap has no shared mode.
7467
7524
 
7468
7525
  ```ts
7469
7526
  import { middleware } from "@warlock.js/core";
@@ -7504,7 +7561,7 @@ Server errors (5xx) are not cached — clients can retry past a 5xx. 4xx respons
7504
7561
 
7505
7562
  ## Rate limit across servers
7506
7563
 
7507
- `http.rateLimit` passes `@fastify/rate-limit` options through — set `redis` for a store shared by all servers; `enabled: false` turns the global limiter off. The per-route `middleware.rateLimit()` counters stay in-process.
7564
+ Set `http.rateLimit.store: "cache"` to count in the configured `@warlock.js/cache` driver, shared by every server on a Redis or Postgres cache; the per-route `middleware.rateLimit()` follows it. `http.rateLimit` also passes `@fastify/rate-limit` options through (its own `redis` option needs an ioredis client, not the cache's node-redis one); `enabled: false` turns the global limiter off.
7508
7565
 
7509
7566
  ## `maxBodySize` vs the global `http.bodyLimit`
7510
7567
 
@@ -7692,17 +7749,17 @@ export default {
7692
7749
 
7693
7750
  ## See also
7694
7751
 
7695
- - [`write-middleware/SKILL.md`](../write-middleware/SKILL.md) — author your OWN middleware (custom guards, enrichment).
7696
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — where middleware attaches: `router.group` and route-options.
7697
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — the response helpers used to short-circuit (`tooManyRequests`, `contentTooLarge`, `serviceUnavailable`, etc.).
7698
- - [`@warlock.js/cache/cache-basics/SKILL.md`](../../../cache/skills/cache-basics/SKILL.md) — the cache singleton (`@warlock.js/cache`) that backs `middleware.idempotency` and `middleware.cache`.
7752
+ - The `write-middleware` topic — author your OWN middleware (custom guards, enrichment).
7753
+ - The `register-route` topic — where middleware attaches: `router.group` and route-options.
7754
+ - The `send-response` topic — the response helpers used to short-circuit (`tooManyRequests`, `contentTooLarge`, `serviceUnavailable`, etc.).
7755
+ - The `cache-basics` topic of the `warlock-js-cache` skill — the cache singleton (`@warlock.js/cache`) that backs `middleware.idempotency` and `middleware.cache`.
7699
7756
 
7700
7757
 
7701
7758
  ## use-model-transformers `@warlock.js/core/use-model-transformers/SKILL.md`
7702
7759
 
7703
7760
  ---
7704
7761
  name: use-model-transformers
7705
- description: 'Three schema-side helpers — `useHashedPassword()` (bcrypt on save) attaches via `.addTransformer(...)`; `useComputedSlug(field?, scope?)` (auto-slug from another field) and `useComputedModel(callback)` (arbitrary computed-on-save value) attach via `v.computed(...)`. Triggers: `useHashedPassword`, `useComputedSlug`, `useComputedModel`, `.addTransformer`, `v.computed`, `ComputedCallback`; "auto-hash a password field", "auto-slug from title on save", "derive a value at write time", "declarative model transformers"; typical import `import { useHashedPassword, useComputedSlug } from "@warlock.js/core"`. Skip: bcrypt setup details — `@warlock.js/core/hash-password/SKILL.md`; repository writes — `@warlock.js/core/use-repository/SKILL.md`; output filtering — `@warlock.js/core/define-resource/SKILL.md`; competing patterns: manual `await hashPassword(input)` in services, ORM lifecycle hooks.'
7762
+ description: 'Three schema-side helpers — `useHashedPassword()` (bcrypt on save) attaches via `.addTransformer(...)`; `useComputedSlug(field?, scope?)` (auto-slug from another field) and `useComputedModel(callback)` (arbitrary computed-on-save value) attach via `v.computed(...)`. Triggers: `useHashedPassword`, `useComputedSlug`, `useComputedModel`, `.addTransformer`, `v.computed`, `ComputedCallback`; "auto-hash a password field", "auto-slug from title on save", "derive a value at write time", "declarative model transformers"; typical import `import { useHashedPassword, useComputedSlug } from "@warlock.js/core"`. Skip: bcrypt setup details — the `hash-password` topic; repository writes — the `use-repository` topic; output filtering — the `define-resource` topic; competing patterns: manual `await hashPassword(input)` in services, ORM lifecycle hooks.'
7706
7763
  ---
7707
7764
 
7708
7765
  # Warlock — declare model transformers
@@ -7762,7 +7819,7 @@ What it does at save time:
7762
7819
  | Existing row, password unchanged | Pass through (no re-hashing — stored hash preserved). |
7763
7820
  | Empty / undefined value | Pass through untouched. |
7764
7821
 
7765
- Calls `authService.hashPassword(String(value))` under the hood — same bcryptjs path as the standalone `hashPassword()` helper. See [`hash-password/SKILL.md`](../hash-password/SKILL.md) for full bcrypt setup (salt rounds, `npm install bcryptjs`).
7822
+ Calls `authService.hashPassword(String(value))` under the hood — same bcryptjs path as the standalone `hashPassword()` helper. See the `hash-password` topic for full bcrypt setup (salt rounds, `npm install bcryptjs`).
7766
7823
 
7767
7824
  ### Why declarative wins
7768
7825
 
@@ -7916,17 +7973,17 @@ Rule of thumb: transformers are for **pure, deterministic** transforms of the ro
7916
7973
 
7917
7974
  ## See also
7918
7975
 
7919
- - [`hash-password/SKILL.md`](../hash-password/SKILL.md) — the bcrypt setup that `useHashedPassword` calls under the hood; salt rounds, `npm install bcryptjs`.
7920
- - [`use-repository/SKILL.md`](../use-repository/SKILL.md) — where `create` / `save` calls happen that trigger the transformers.
7921
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — filtering transformed fields (`password`) out of API responses.
7922
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — schema files live in `src/app/<module>/models/<entity>/<entity>.model.ts`.
7976
+ - The `hash-password` topic — the bcrypt setup that `useHashedPassword` calls under the hood; salt rounds, `npm install bcryptjs`.
7977
+ - The `use-repository` topic — where `create` / `save` calls happen that trigger the transformers.
7978
+ - The `define-resource` topic — filtering transformed fields (`password`) out of API responses.
7979
+ - The `warlock-conventions` topic — schema files live in `src/app/<module>/models/<entity>/<entity>.model.ts`.
7923
7980
 
7924
7981
 
7925
7982
  ## use-repository `@warlock.js/core/use-repository/SKILL.md`
7926
7983
 
7927
7984
  ---
7928
7985
  name: use-repository
7929
- description: 'Subclass `RepositoryManager` for data access — declare `source`, `filterBy`, `defaultOptions`, then call `list()`/`listCached()`/`find()`/`create()`/`update()`/`delete()`, the active/cached/cursor variants, and the `filterBy`-aware aggregates `sum()`/`avg()`/`min()`/`max()`/`groupBy()`/`aggregate()`. Triggers: `RepositoryManager`, `FilterRules`, `RepositoryOptions`, `.list`, `.listCached`, `.find`, `.findCached`, `.create`, `.update`, `.delete`, `.sum`, `.avg`, `.min`, `.max`, `.groupBy`, `.aggregate`, `simpleSelectColumns`; "create a repository", "filter rules for a list endpoint", "cursor vs page pagination", "cached vs uncached read", "sum/avg/group-by with filters"; typical import `import { RepositoryManager } from "@warlock.js/core"`. Skip: cache singleton — `@warlock.js/cache/cache-basics/SKILL.md`; use-case pipelines — `@warlock.js/core/write-use-case/SKILL.md`; wire mapping — `@warlock.js/core/define-resource/SKILL.md`; competing libs `typeorm` Repository, `prisma.client.<model>`, `@nestjs/typeorm`.'
7986
+ description: 'Subclass `RepositoryManager` for data access — declare `source`, `filterBy`, `defaultOptions`, then call `list()`/`listCached()`/`find()`/`create()`/`update()`/`delete()`, the active/cached/cursor variants, and the `filterBy`-aware aggregates `sum()`/`avg()`/`min()`/`max()`/`groupBy()`/`aggregate()`. Triggers: `RepositoryManager`, `FilterRules`, `RepositoryOptions`, `.list`, `.listCached`, `.find`, `.findCached`, `.create`, `.update`, `.delete`, `.sum`, `.avg`, `.min`, `.max`, `.groupBy`, `.aggregate`, `simpleSelectColumns`; "create a repository", "filter rules for a list endpoint", "cursor vs page pagination", "cached vs uncached read", "sum/avg/group-by with filters"; typical import `import { RepositoryManager } from "@warlock.js/core"`. Skip: cache singleton — the `cache-basics` topic of the `warlock-js-cache` skill; use-case pipelines — the `write-use-case` topic; wire mapping — the `define-resource` topic; competing libs `typeorm` Repository, `prisma.client.<model>`, `@nestjs/typeorm`.'
7930
7987
  ---
7931
7988
 
7932
7989
  # Warlock — use a repository
@@ -8348,19 +8405,19 @@ The third arg is a context object — `{ allValues, dateFormat, ... }` — for f
8348
8405
 
8349
8406
  ## See also
8350
8407
 
8351
- - [`create-module/SKILL.md`](../create-module/SKILL.md) — `warlock generate.repository` and where the file lives.
8352
- - [`@warlock.js/cache/cache-basics/SKILL.md`](../../../cache/skills/cache-basics/SKILL.md) — the cache singleton behind `listCached` / `getCached`. See sibling skills (`pick-cache-driver`, `use-swr`) for related tasks.
8353
- - [`write-use-case/SKILL.md`](../write-use-case/SKILL.md) — calling repositories from a use-case handler.
8354
- - [`define-resource/SKILL.md`](../define-resource/SKILL.md) — mapping repository output to the wire format.
8355
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — services that consume repositories from the controller edge.
8356
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — controller → service → repository → model layering.
8408
+ - The `create-module` topic — `warlock generate.repository` and where the file lives.
8409
+ - The `cache-basics` topic of the `warlock-js-cache` skill — the cache singleton behind `listCached` / `getCached`. See sibling skills (`pick-cache-driver`, `use-swr`) for related tasks.
8410
+ - The `write-use-case` topic — calling repositories from a use-case handler.
8411
+ - The `define-resource` topic — mapping repository output to the wire format.
8412
+ - The `create-controller` topic — services that consume repositories from the controller edge.
8413
+ - The `warlock-conventions` topic — controller → service → repository → model layering.
8357
8414
 
8358
8415
 
8359
8416
  ## use-request-locals `@warlock.js/core/use-request-locals/SKILL.md`
8360
8417
 
8361
8418
  ---
8362
8419
  name: use-request-locals
8363
- description: 'Carry typed, server-only data through one HTTP request with `request.locals`, usually written by middleware and read by downstream middleware or controllers. Augment `RequestLocals` in the module that owns each key; v5 no longer permits arbitrary `request.foo` properties. Triggers: `request.locals`, `RequestLocals`, `request.post`, `request.organization`, `Property does not exist on type Request`, `Request index signature`; "attach data to a request", "share middleware data with a controller", "type request locals", "migrate dynamic request properties"; typical type augmentation `declare module "@warlock.js/core" { interface RequestLocals { ... } }`. Skip: computed-on-demand single-flight values and removed `fromRequest` — `@warlock.js/core/request-memo/SKILL.md`; middleware mechanics — `@warlock.js/core/write-middleware/SKILL.md`; authenticated user typing — augment `RequestUser`, not `RequestLocals`; competing patterns: `(request as any).foo`, `request.set()`, module-global mutable state.'
8420
+ description: 'Carry typed, server-only data through one HTTP request with `request.locals`, usually written by middleware and read by downstream middleware or controllers. Augment `RequestLocals` in the module that owns each key; v5 no longer permits arbitrary `request.foo` properties. Triggers: `request.locals`, `RequestLocals`, `request.post`, `request.organization`, `Property does not exist on type Request`, `Request index signature`; "attach data to a request", "share middleware data with a controller", "type request locals", "migrate dynamic request properties"; typical type augmentation `declare module "@warlock.js/core" { interface RequestLocals { ... } }`. Skip: computed-on-demand single-flight values and removed `fromRequest` — the `request-memo` topic; middleware mechanics — the `write-middleware` topic; authenticated user typing — augment `RequestUser`, not `RequestLocals`; competing patterns: `(request as any).foo`, `request.set()`, module-global mutable state.'
8364
8421
  ---
8365
8422
 
8366
8423
  # Warlock — use typed request locals
@@ -8522,16 +8579,16 @@ Writing `request.locals.organization` does not affect `request.all()`, `request.
8522
8579
 
8523
8580
  ## See also
8524
8581
 
8525
- - [`request-memo/SKILL.md`](../request-memo/SKILL.md) — the `fromRequest()` migration and single-flight request memoization.
8526
- - [`write-middleware/SKILL.md`](../write-middleware/SKILL.md) — middleware execution and registration.
8527
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — reading locals in downstream controllers.
8582
+ - The `request-memo` topic — the `fromRequest()` migration and single-flight request memoization.
8583
+ - The `write-middleware` topic — middleware execution and registration.
8584
+ - The `create-controller` topic — reading locals in downstream controllers.
8528
8585
 
8529
8586
 
8530
8587
  ## validate-input `@warlock.js/core/validate-input/SKILL.md`
8531
8588
 
8532
8589
  ---
8533
8590
  name: validate-input
8534
- description: 'Author seal schemas, attach them to controllers via `controller.validation = { schema }`, infer types via `Infer<typeof schema>`, and layer DB-aware (`unique`/`exists`) and file validators on top. Triggers: `v.object`, `v.string`, `v.email`, `Infer`, `controller.validation`, `.unique`, `.exists`, `uniqueExceptCurrentId`, `request.validated`; "validate a request body", "attach a schema to a controller", "DB-aware unique rule", "infer schema types"; typical import `import { v, type Infer } from "@warlock.js/seal"`. Skip: schema authoring foundations — `@warlock.js/seal/seal-basics/SKILL.md`; controller wiring — `@warlock.js/core/create-controller/SKILL.md`; file rules deep-dive — `@warlock.js/core/upload-file/SKILL.md`; competing libs `zod`, `joi`, `yup`, `class-validator`.'
8591
+ description: 'Author seal schemas, attach them to controllers via `controller.validation = { schema }`, infer types via `Infer<typeof schema>`, and layer DB-aware (`unique`/`exists`) and file validators on top. Triggers: `v.object`, `v.string`, `v.email`, `Infer`, `controller.validation`, `.unique`, `.exists`, `uniqueExceptCurrentId`, `request.validated`; "validate a request body", "attach a schema to a controller", "DB-aware unique rule", "infer schema types"; typical import `import { v, type Infer } from "@warlock.js/seal"`. Skip: schema authoring foundations — the `seal-basics` topic of the `warlock-js-seal` skill; controller wiring — the `create-controller` topic; file rules deep-dive — the `upload-file` topic; competing libs `zod`, `joi`, `yup`, `class-validator`.'
8535
8592
  ---
8536
8593
 
8537
8594
  # Warlock — validate a request
@@ -8604,7 +8661,7 @@ From `@warlock.js/seal` — **always import from seal directly**. `@warlock.js/c
8604
8661
  | `v.literal(...values)` | exact literals | — |
8605
8662
  | `v.instanceof(Ctor, msg?)` | `Ctor` instances | — |
8606
8663
  | `v.lazy(() => schema)` | recursive/forward refs | — |
8607
- | `v.file(msg?)` | `UploadedFile` | `.image()`, `.accept(exts)`, `.mimeType(types)`, `.minSize(n)`, `.maxSize(n)`, `.minWidth(n)`, `.maxWidth(n)` — see [`upload-file`](../upload-file/SKILL.md) |
8664
+ | `v.file(msg?)` | `UploadedFile` | `.image()`, `.accept(exts)`, `.mimeType(types)`, `.minSize(n)`, `.maxSize(n)`, `.minWidth(n)`, `.maxWidth(n)` — see the `upload-file` topic |
8608
8665
  | `v.computed(callback)` | derived value | — |
8609
8666
  | `v.managed(callback)` | framework-injected value | — |
8610
8667
 
@@ -8699,7 +8756,7 @@ const uploadAvatarSchema = v.object({
8699
8756
  });
8700
8757
  ```
8701
8758
 
8702
- Full file chain: `.image()`, `.accept(extensions)`, `.mimeType(types)`, `.pdf()`, `.excel()`, `.word()`, `.minSize(n)`, `.maxSize(n)`, `.minWidth(px)`, `.maxWidth(px)`, `.minHeight(px)`, `.maxHeight(px)`. See [`upload-file`](../upload-file/SKILL.md) for the full upload flow.
8759
+ Full file chain: `.image()`, `.accept(extensions)`, `.mimeType(types)`, `.pdf()`, `.excel()`, `.word()`, `.minSize(n)`, `.maxSize(n)`, `.minWidth(px)`, `.maxWidth(px)`, `.minHeight(px)`, `.maxHeight(px)`. Every rule returns `this`, so the field's output type stays `UploadedFile` through the chain; `.saveTo(dir)` switches it to `string` (the saved path). See the `upload-file` topic for the full upload flow.
8703
8760
 
8704
8761
  ### Optional file field
8705
8762
 
@@ -8835,17 +8892,17 @@ updateProductController.validation = {
8835
8892
 
8836
8893
  ## See also
8837
8894
 
8838
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — how the schema attaches and how `request.validated()` reads.
8839
- - [`upload-file/SKILL.md`](../upload-file/SKILL.md) — `v.file()` and how it interacts with multipart uploads.
8840
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — the 400 helper used internally by `failedSchema`.
8841
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — `Request<Schema>` type-alias convention.
8895
+ - The `create-controller` topic — how the schema attaches and how `request.validated()` reads.
8896
+ - The `upload-file` topic — `v.file()` and how it interacts with multipart uploads.
8897
+ - The `send-response` topic — the 400 helper used internally by `failedSchema`.
8898
+ - The `warlock-conventions` topic — `Request<Schema>` type-alias convention.
8842
8899
 
8843
8900
 
8844
8901
  ## warlock-conventions `@warlock.js/core/warlock-conventions/SKILL.md`
8845
8902
 
8846
8903
  ---
8847
8904
  name: warlock-conventions
8848
- description: 'Framework-wide invariants for projects built on @warlock.js/core — module layout, canonical imports, layered flow, file naming, and the non-negotiable rules every other warlock skill assumes. Triggers: `src/app/<module>`, `routes.ts`, `main.ts`, `Request<TSchema>`, `RequestHandler`, `GuardedRequestHandler`, `app/<module>/...`; "where do files go in this project", "canonical Warlock imports", "module layout rules", "controller-service-repository layering"; typical import `import { router, type RequestHandler } from "@warlock.js/core"`. Skip: scaffold a new module — `@warlock.js/core/create-module/SKILL.md`; route shape — `@warlock.js/core/register-route/SKILL.md`; controller shape — `@warlock.js/core/create-controller/SKILL.md`; competing patterns: `express` ad-hoc layouts, `@nestjs/common` decorator-driven structure.'
8905
+ description: 'Framework-wide invariants for projects built on @warlock.js/core — module layout, canonical imports, layered flow, file naming, and the non-negotiable rules every other warlock skill assumes. Triggers: `src/app/<module>`, `routes.ts`, `main.ts`, `Request<TSchema>`, `RequestHandler`, `GuardedRequestHandler`, `app/<module>/...`; "where do files go in this project", "canonical Warlock imports", "module layout rules", "controller-service-repository layering"; typical import `import { router, type RequestHandler } from "@warlock.js/core"`. Skip: scaffold a new module — the `create-module` topic; route shape — the `register-route` topic; controller shape — the `create-controller` topic; competing patterns: `express` ad-hoc layouts, `@nestjs/common` decorator-driven structure.'
8849
8906
  ---
8850
8907
 
8851
8908
  # Warlock — framework-wide conventions
@@ -8969,24 +9026,24 @@ Within the same module, use relative paths (`./`, `../`).
8969
9026
 
8970
9027
  ## Type augmentations
8971
9028
 
8972
- `src/typings.d.ts` is the project's module-augmentation file. It ships with the scaffold, is listed explicitly in `tsconfig.json`'s `include`, and is where application-wide `declare module "@warlock.js/core"` blocks live — `RequestLocals` and `RequestUser` are already there as empty interfaces. Keep its trailing `export {}` (without it the block declares an ambient module and erases the framework's real typings) and keep the augmented declarations as `interface`, the one sanctioned exception to this project's prefer-`type` rule, since declaration merging is interface-only. See [`use-request-locals`](../use-request-locals/SKILL.md).
9029
+ `src/typings.d.ts` is the project's module-augmentation file. It ships with the scaffold, is listed explicitly in `tsconfig.json`'s `include`, and is where application-wide `declare module "@warlock.js/core"` blocks live — `RequestLocals` and `RequestUser` are already there as empty interfaces. Keep its trailing `export {}` (without it the block declares an ambient module and erases the framework's real typings) and keep the augmented declarations as `interface`, the one sanctioned exception to this project's prefer-`type` rule, since declaration merging is interface-only. See the `use-request-locals` topic.
8973
9030
 
8974
9031
  ## Decorators
8975
9032
 
8976
- Cascade uses `@RegisterModel()` for the model registry and `@BelongsTo` / `@HasMany` / `@MorphTo` for relations. The scaffolded `tsconfig.json` has `"experimentalDecorators": false` — these are native Stage-3 decorators, not legacy. Never set that flag to `true`; see [`lower-stage3-decorators`](../lower-stage3-decorators/SKILL.md).
9033
+ Cascade uses `@RegisterModel()` for the model registry and `@BelongsTo` / `@HasMany` / `@MorphTo` for relations. The scaffolded `tsconfig.json` has `"experimentalDecorators": false` — these are native Stage-3 decorators, not legacy. Never set that flag to `true`; see the `lower-stage3-decorators` topic.
8977
9034
 
8978
9035
  ## See also
8979
9036
 
8980
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — how to wire URLs to controllers.
8981
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — controller signature, validation, response shape.
8982
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — the full Response helper surface.
9037
+ - The `register-route` topic — how to wire URLs to controllers.
9038
+ - The `create-controller` topic — controller signature, validation, response shape.
9039
+ - The `send-response` topic — the full Response helper surface.
8983
9040
 
8984
9041
 
8985
9042
  ## warlock-doctor `@warlock.js/core/warlock-doctor/SKILL.md`
8986
9043
 
8987
9044
  ---
8988
9045
  name: warlock-doctor
8989
- description: 'Run `warlock doctor` — a read-only diagnostics command that checks routes / config / connectors / optional-peers / health endpoints / release hygiene and prints a pass/warn/fail report, exiting non-zero on any failure. Add your own probe with the `DoctorCheck` contract and `runChecks` / `formatReportLines`. Triggers: `warlock doctor`, `doctorCommand`, `DoctorCheck`, `CheckResult`, `CheckStatus`, `DoctorReport`, `runChecks`, `formatReportLines`, `printReport`, `defaultDoctorChecks`; "diagnose my app", "preflight / preflight check", "is the app healthy", "why are there 0 routes", "pre-release sanity check", "CI smoke check"; run as `npx warlock doctor`. Skip: the live `/health` + `/ready` HTTP probes — `@warlock.js/core/health-checks/SKILL.md`; authoring a general CLI command — `@warlock.js/core/write-cli-command/SKILL.md`; releasing the package — `releasing-warlock-monorepo`; competing tools `npm doctor`, `nest info`, hand-rolled preflight scripts.'
9046
+ description: 'Run `warlock doctor` — a read-only diagnostics command that checks routes / config / connectors / optional-peers / health endpoints / release hygiene and prints a pass/warn/fail report, exiting non-zero on any failure. Add your own probe with the `DoctorCheck` contract and `runChecks` / `formatReportLines`. Triggers: `warlock doctor`, `doctorCommand`, `DoctorCheck`, `CheckResult`, `CheckStatus`, `DoctorReport`, `runChecks`, `formatReportLines`, `printReport`, `defaultDoctorChecks`; "diagnose my app", "preflight / preflight check", "is the app healthy", "why are there 0 routes", "pre-release sanity check", "CI smoke check"; run as `npx warlock doctor`. Skip: the live `/health` + `/ready` HTTP probes — the `health-checks` topic; authoring a general CLI command — the `write-cli-command` topic; releasing the package — `releasing-warlock-monorepo`; competing tools `npm doctor`, `nest info`, hand-rolled preflight scripts.'
8990
9047
  ---
8991
9048
 
8992
9049
  # Warlock — `warlock doctor`
@@ -9118,22 +9175,22 @@ A `⚠ routes: 0 routes registered` line is the tell that a route module threw o
9118
9175
 
9119
9176
  ## See also
9120
9177
 
9121
- - [`health-checks/SKILL.md`](../health-checks/SKILL.md) — the live `/health` + `/ready` HTTP probes and the `health` registry the `health` doctor check reports on.
9122
- - [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — authoring a command + its `preload` plan, the shape `doctorCommand` is built from.
9123
- - [`add-connector/SKILL.md`](../add-connector/SKILL.md) — connector registration, which the `connectors` check enumerates.
9124
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — project layout the checks assume.
9178
+ - The `health-checks` topic — the live `/health` + `/ready` HTTP probes and the `health` registry the `health` doctor check reports on.
9179
+ - The `write-cli-command` topic — authoring a command + its `preload` plan, the shape `doctorCommand` is built from.
9180
+ - The `add-connector` topic — connector registration, which the `connectors` check enumerates.
9181
+ - The `warlock-conventions` topic — project layout the checks assume.
9125
9182
 
9126
9183
 
9127
9184
  ## warlock-routes `@warlock.js/core/warlock-routes/SKILL.md`
9128
9185
 
9129
9186
  ---
9130
9187
  name: warlock-routes
9131
- description: 'Run `warlock routes` — a read-only command that lists the registered HTTP routes as a verb-colored table (method / path / name / action / middleware-count / source), a sibling of `warlock doctor`. Filter with `--method` / `--path` / `--name`, or emit normalized rows as JSON with `--json`. Also covers `warlock routes:diff`, which compares live page routes against the last `warlock build`''s route snapshot and exits non-zero on drift. Triggers: `warlock routes`, `routesCommand`, `warlock routes:diff`, `routesDiffCommand`, "list my routes", "show all routes", "route table", "what endpoints does my app expose", "dump routes as JSON", "which routes have middleware", "route map for CI", "did my page routes drift from the last build"; run as `npx warlock routes` / `npx warlock routes:diff`. Skip: read-only health/preflight checks — `@warlock.js/core/warlock-doctor/SKILL.md`; defining/naming/grouping routes — `@warlock.js/core/register-route/SKILL.md`; authoring a general CLI command — `@warlock.js/core/write-cli-command/SKILL.md`; competing tools `nest`/`express` route listers, `php artisan route:list`.'
9188
+ description: 'Run `warlock routes` — a read-only command that lists the registered HTTP routes as a verb-colored table (method / path / name / action / middleware-count / source), a sibling of `warlock doctor`. Filter with `--method` / `--path` / `--name`, or emit normalized rows as JSON with `--json`. Also covers `warlock routes:diff`, which compares live page routes against the last `warlock build`''s route snapshot and exits non-zero on drift. Triggers: `warlock routes`, `routesCommand`, `warlock routes:diff`, `routesDiffCommand`, "list my routes", "show all routes", "route table", "what endpoints does my app expose", "dump routes as JSON", "which routes have middleware", "route map for CI", "did my page routes drift from the last build"; run as `npx warlock routes` / `npx warlock routes:diff`. Skip: read-only health/preflight checks — the `warlock-doctor` topic; defining/naming/grouping routes — the `register-route` topic; authoring a general CLI command — the `write-cli-command` topic; competing tools `nest`/`express` route listers, `php artisan route:list`.'
9132
9189
  ---
9133
9190
 
9134
9191
  # Warlock — `warlock routes`
9135
9192
 
9136
- `warlock routes` lists every registered HTTP route as a table. It's the read-only sibling of [`warlock doctor`](../warlock-doctor/SKILL.md): it boots the app far enough to register route modules — but **starts no connectors**, so it never opens a database, cache, or socket connection.
9193
+ `warlock routes` lists every registered HTTP route as a table. It's the read-only sibling of the `warlock-doctor` topic: it boots the app far enough to register route modules — but **starts no connectors**, so it never opens a database, cache, or socket connection.
9137
9194
 
9138
9195
  ```bash
9139
9196
  npx warlock routes
@@ -9251,17 +9308,17 @@ and exits non-zero.
9251
9308
 
9252
9309
  ## See also
9253
9310
 
9254
- - [`warlock-doctor/SKILL.md`](../warlock-doctor/SKILL.md) — the read-only diagnostics sibling; its `routes` check warns when this table would be empty.
9255
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — defining, naming, and grouping the routes this command lists.
9256
- - [`run-app/SKILL.md`](../run-app/SKILL.md) — `warlock build`, the command that produces the snapshot `routes:diff` compares against.
9257
- - [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — the command + `preload` shape `routesCommand` is built from.
9311
+ - The `warlock-doctor` topic — the read-only diagnostics sibling; its `routes` check warns when this table would be empty.
9312
+ - The `register-route` topic — defining, naming, and grouping the routes this command lists.
9313
+ - The `run-app` topic — `warlock build`, the command that produces the snapshot `routes:diff` compares against.
9314
+ - The `write-cli-command` topic — the command + `preload` shape `routesCommand` is built from.
9258
9315
 
9259
9316
 
9260
9317
  ## wire-socket `@warlock.js/core/wire-socket/SKILL.md`
9261
9318
 
9262
9319
  ---
9263
9320
  name: wire-socket
9264
- description: 'Configure Socket.IO via `src/config/socket.ts`, reach the live server through `getSocketServer()` (or `app.socket` post-bootstrap), register `connection` handlers once the late-phase socket connector has booted, emit from controllers/services, use rooms and namespaces. Triggers: `app.socket`, `getSocketServer`, `SocketOptions`, `socket.io` `Server`, `socket.join`, `socket.to`, `io.of`, `io.use`; "add realtime chat", "emit socket events from a service", "use rooms and namespaces", "per-socket JWT auth". Skip: connector lifecycle — `@warlock.js/core/add-connector/SKILL.md`; app context accessors — `@warlock.js/core/use-app-context/SKILL.md`; competing libs `ws`, `socket.io` direct without Warlock connector, `uWebSockets.js`.'
9321
+ description: 'Configure Socket.IO via `src/config/socket.ts`, reach the live server through `getSocketServer()` (or `app.socket` post-bootstrap), register `connection` handlers once the late-phase socket connector has booted, emit from controllers/services, use rooms and namespaces. Triggers: `app.socket`, `getSocketServer`, `SocketOptions`, `socket.io` `Server`, `socket.join`, `socket.to`, `io.of`, `io.use`; "add realtime chat", "emit socket events from a service", "use rooms and namespaces", "per-socket JWT auth". Skip: connector lifecycle — the `add-connector` topic; app context accessors — the `use-app-context` topic; competing libs `ws`, `socket.io` direct without Warlock connector, `uWebSockets.js`.'
9265
9322
  ---
9266
9323
 
9267
9324
  # Warlock — wire a Socket.IO server
@@ -9544,16 +9601,16 @@ CLI commands, scheduled jobs, queue workers — anything running outside an HTTP
9544
9601
 
9545
9602
  ## See also
9546
9603
 
9547
- - [`use-app-context/SKILL.md`](../use-app-context/SKILL.md) — `app.socket` runtime accessor + `Application` static metadata.
9548
- - [`add-connector/SKILL.md`](../add-connector/SKILL.md) — how connectors order their boot sequence around your modules.
9549
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — where socket-related code lives (a setup function for handler registration, `services/` for emit sites).
9604
+ - The `use-app-context` topic — `app.socket` runtime accessor + `Application` static metadata.
9605
+ - The `add-connector` topic — how connectors order their boot sequence around your modules.
9606
+ - The `warlock-conventions` topic — where socket-related code lives (a setup function for handler registration, `services/` for emit sites).
9550
9607
 
9551
9608
 
9552
9609
  ## write-cli-command `@warlock.js/core/write-cli-command/SKILL.md`
9553
9610
 
9554
9611
  ---
9555
9612
  name: write-cli-command
9556
- description: 'Author a custom `warlock <my-cmd>` command via the `command()` factory — name, description, action, options, preload, then register in `warlock.config.ts > cli.commands` or drop in `src/app/<module>/commands/`. Also covers built-in `warlock add` feature scaffolding, including the Web starter and `index.register.ts`. Triggers: `command`, `CLICommand`, `CLICommandPreload`, `CLICommandOption`, `preload`, `preAction`, `persistent`, `colors`, `warlock add`, `warlock add bull-board`, `index.register.ts`; "write a custom warlock command", "one-off maintenance task", "ship a CLI from a package", "framework built-in commands"; typical import `import { command } from "@warlock.js/core"`. Skip: framework dev/build/start — `@warlock.js/core/run-app/SKILL.md`; warlock.config.ts wiring — `@warlock.js/core/configure-app/SKILL.md`; competing libs `commander`, `yargs`, `oclif`.'
9613
+ description: 'Author a custom `warlock <my-cmd>` command via the `command()` factory — name, description, action, options, preload, then register in `warlock.config.ts > cli.commands` or drop in `src/app/<module>/commands/`. Also covers built-in `warlock add` feature scaffolding, including the Web starter and `index.register.ts`. Triggers: `command`, `CLICommand`, `CLICommandPreload`, `CLICommandOption`, `preload`, `preAction`, `persistent`, `colors`, `warlock add`, `warlock add bull-board`, `index.register.ts`; "write a custom warlock command", "one-off maintenance task", "ship a CLI from a package", "framework built-in commands"; typical import `import { command } from "@warlock.js/core"`. Skip: framework dev/build/start — the `run-app` topic; warlock.config.ts wiring — the `configure-app` topic; competing libs `commander`, `yargs`, `oclif`.'
9557
9614
  ---
9558
9615
 
9559
9616
  # Warlock — write a CLI command
@@ -9703,7 +9760,7 @@ console.log(colors.green("✓") + " user promoted");
9703
9760
 
9704
9761
  The framework ships a fixed set of commands you call but don't author. Knowing their flags up front saves a `--help` round-trip.
9705
9762
 
9706
- > For `warlock dev` / `warlock build` / `warlock start` — see [`run-app/SKILL.md`](../run-app/SKILL.md). Everything below covers the rest.
9763
+ > For `warlock dev` / `warlock build` / `warlock start` — see the `run-app` topic. Everything below covers the rest.
9707
9764
 
9708
9765
  ### Database + migrations
9709
9766
 
@@ -9749,7 +9806,7 @@ warlock generate.typings
9749
9806
  warlock generate (alias: g) — interactive picker
9750
9807
  ```
9751
9808
 
9752
- `<m>/<n>` is `<module>/<name>` (e.g. `products/create-product`). See [`create-module/SKILL.md`](../create-module/SKILL.md) for the full scaffolding flow.
9809
+ `<m>/<n>` is `<module>/<name>` (e.g. `products/create-product`). See the `create-module` topic for the full scaffolding flow.
9753
9810
 
9754
9811
  ### Feature installation
9755
9812
 
@@ -9864,16 +9921,16 @@ export default command({
9864
9921
 
9865
9922
  ## See also
9866
9923
 
9867
- - [`run-app/SKILL.md`](../run-app/SKILL.md) — the operational commands (`dev` / `build` / `start`) with all flags and config knobs.
9868
- - [`configure-app/SKILL.md`](../configure-app/SKILL.md) — wiring `defineConfig` and `warlock.config.ts`.
9869
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — module layout, canonical imports.
9924
+ - The `run-app` topic — the operational commands (`dev` / `build` / `start`) with all flags and config knobs.
9925
+ - The `configure-app` topic — wiring `defineConfig` and `warlock.config.ts`.
9926
+ - The `warlock-conventions` topic — module layout, canonical imports.
9870
9927
 
9871
9928
 
9872
9929
  ## write-middleware `@warlock.js/core/write-middleware/SKILL.md`
9873
9930
 
9874
9931
  ---
9875
9932
  name: write-middleware
9876
- description: 'Author HTTP middleware for @warlock.js/core — the `({ request, response })` signature, short-circuit by returning a response, enrich the request with extra fields, register per-route, per-group, or app-wide. Triggers: `Middleware`, `MiddlewareResponse`, `router.group`, `guarded`, `request.detectIp`, `authMiddleware`; "write a custom middleware", "short-circuit a request", "enrich the request with extra fields", "per-route vs per-group middleware"; typical import `import type { Middleware } from "@warlock.js/core"`. Skip: built-in middleware catalog — `@warlock.js/core/use-middleware/SKILL.md`; route attachment — `@warlock.js/core/register-route/SKILL.md`; response helpers — `@warlock.js/core/send-response/SKILL.md`; competing patterns: `express` `(req, res, next)` middleware, Fastify `preHandler` hooks.'
9933
+ description: 'Author HTTP middleware for @warlock.js/core — the `({ request, response })` signature, short-circuit by returning a response, enrich the request with extra fields, register per-route, per-group, or app-wide. Triggers: `Middleware`, `MiddlewareResponse`, `router.group`, `guarded`, `request.detectIp`, `authMiddleware`; "write a custom middleware", "short-circuit a request", "enrich the request with extra fields", "per-route vs per-group middleware"; typical import `import type { Middleware } from "@warlock.js/core"`. Skip: built-in middleware catalog — the `use-middleware` topic; route attachment — the `register-route` topic; response helpers — the `send-response` topic; competing patterns: `express` `(req, res, next)` middleware, Fastify `preHandler` hooks.'
9877
9934
  ---
9878
9935
 
9879
9936
  # Warlock — write a middleware
@@ -9924,7 +9981,7 @@ export const requireFeatureFlag: Middleware = async ({ request, response }) => {
9924
9981
  };
9925
9982
  ```
9926
9983
 
9927
- If you short-circuit, the controller never runs. The response helper you pick (`forbidden`, `unauthorized`, `badRequest`, etc.) sets the status — see [`send-response`](../send-response/SKILL.md).
9984
+ If you short-circuit, the controller never runs. The response helper you pick (`forbidden`, `unauthorized`, `badRequest`, etc.) sets the status — see the `send-response` topic.
9928
9985
 
9929
9986
  ## Enriching the request
9930
9987
 
@@ -10073,7 +10130,7 @@ export const optionalAuth: Middleware = async ({ request, response }) => {
10073
10130
 
10074
10131
  ## Using built-in middleware
10075
10132
 
10076
- `@warlock.js/core` ships seven built-in middlewares (rate limit, concurrency cap, body cap, idempotency, maintenance, IP filter, response cache) under the `middleware` namespace from `@warlock.js/core`. They cover the patterns most apps need — see [`use-middleware`](../use-middleware/SKILL.md) for the catalog, per-primitive deep-dives, error semantics, and gotchas specific to using them.
10133
+ `@warlock.js/core` ships seven built-in middlewares (rate limit, concurrency cap, body cap, idempotency, maintenance, IP filter, response cache) under the `middleware` namespace from `@warlock.js/core`. They cover the patterns most apps need — see the `use-middleware` topic for the catalog, per-primitive deep-dives, error semantics, and gotchas specific to using them.
10077
10134
 
10078
10135
  `X-Request-Id` correlation is wired automatically (inherit + echo on every response) — the same skill covers that too. It's not a middleware; nothing to register.
10079
10136
 
@@ -10090,18 +10147,18 @@ export const optionalAuth: Middleware = async ({ request, response }) => {
10090
10147
 
10091
10148
  ## See also
10092
10149
 
10093
- - [`use-middleware/SKILL.md`](../use-middleware/SKILL.md) — the built-in middleware catalog (`rateLimit`, `idempotency`, `maxBodySize`, etc.) + request-id correlation.
10094
- - [`register-route/SKILL.md`](../register-route/SKILL.md) — where middleware attaches: `router.group` and route-options.
10095
- - [`create-controller/SKILL.md`](../create-controller/SKILL.md) — how the controller picks up `request.locals.user`, `request.validated()`, etc., set by upstream middleware.
10096
- - [`send-response/SKILL.md`](../send-response/SKILL.md) — the response helpers used to short-circuit.
10097
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — the `guarded()` / `guardedAdmin()` / `publicRoutes()` convention.
10150
+ - The `use-middleware` topic — the built-in middleware catalog (`rateLimit`, `idempotency`, `maxBodySize`, etc.) + request-id correlation.
10151
+ - The `register-route` topic — where middleware attaches: `router.group` and route-options.
10152
+ - The `create-controller` topic — how the controller picks up `request.locals.user`, `request.validated()`, etc., set by upstream middleware.
10153
+ - The `send-response` topic — the response helpers used to short-circuit.
10154
+ - The `warlock-conventions` topic — the `guarded()` / `guardedAdmin()` / `publicRoutes()` convention.
10098
10155
 
10099
10156
 
10100
10157
  ## write-seeder `@warlock.js/core/write-seeder/SKILL.md`
10101
10158
 
10102
10159
  ---
10103
10160
  name: write-seeder
10104
- description: 'Author a seed file under `src/app/<module>/seeds/<name>.ts` using the `seeder()` factory — `name`, `dependsOn`, `once`, `order`, `batchSize`, `run({ track, now, batchSize })`. Auto-discovered by `warlock seed`; tracked in a `seeds` table; per-record refs in `seed_records` so `warlock seed --drop` can undo a seed. Triggers: `seeder`, `Seeder`, `SeedResult`, `SeedContext`, `SeedClock`, `track`, `now`, `batchSize`, `SeedersManager`, `warlock seed`, `--fresh`, `--drop`, `--list`, `--path`; "seed default roles", "undo a seed", "one-time data migration", "auto-discovered seeds", "order seeds by dependency", "deterministic seed timestamps", "inject a seed clock"; typical import `import { seeder } from "@warlock.js/core"`. Skip: module folder layout — `@warlock.js/core/create-module/SKILL.md`; repository CRUD — `@warlock.js/core/use-repository/SKILL.md`; CLI flags — `@warlock.js/core/write-cli-command/SKILL.md`; competing patterns: hand-rolled `node scripts/seed.js`, `typeorm-seeding`.'
10161
+ description: 'Author a seed file under `src/app/<module>/seeds/<name>.ts` using the `seeder()` factory — `name`, `dependsOn`, `once`, `order`, `batchSize`, `run({ track, now, batchSize })`. Auto-discovered by `warlock seed`; tracked in a `seeds` table; per-record refs in `seed_records` so `warlock seed --drop` can undo a seed. Triggers: `seeder`, `Seeder`, `SeedResult`, `SeedContext`, `SeedClock`, `track`, `now`, `batchSize`, `SeedersManager`, `warlock seed`, `--fresh`, `--drop`, `--list`, `--path`; "seed default roles", "undo a seed", "one-time data migration", "auto-discovered seeds", "order seeds by dependency", "deterministic seed timestamps", "inject a seed clock"; typical import `import { seeder } from "@warlock.js/core"`. Skip: module folder layout — the `create-module` topic; repository CRUD — the `use-repository` topic; CLI flags — the `write-cli-command` topic; competing patterns: hand-rolled `node scripts/seed.js`, `typeorm-seeding`.'
10105
10162
  ---
10106
10163
 
10107
10164
  # Warlock — write a seeder
@@ -10472,17 +10529,17 @@ warlock seed --transaction # (default true) — pass --transaction=false to s
10472
10529
 
10473
10530
  ## See also
10474
10531
 
10475
- - [`create-module/SKILL.md`](../create-module/SKILL.md) — the `seeds/` folder layout in a module, `generate.module` scaffolding.
10476
- - [`use-repository/SKILL.md`](../use-repository/SKILL.md) — the model `create` / `first` calls used inside seeds.
10477
- - [`write-cli-command/SKILL.md`](../write-cli-command/SKILL.md) — the `warlock seed` CLI flags and full preload shape.
10478
- - [`warlock-conventions/SKILL.md`](../warlock-conventions/SKILL.md) — `seeds/` is the canonical folder name (singular `seed/` is incorrect).
10532
+ - The `create-module` topic — the `seeds/` folder layout in a module, `generate.module` scaffolding.
10533
+ - The `use-repository` topic — the model `create` / `first` calls used inside seeds.
10534
+ - The `write-cli-command` topic — the `warlock seed` CLI flags and full preload shape.
10535
+ - The `warlock-conventions` topic — `seeds/` is the canonical folder name (singular `seed/` is incorrect).
10479
10536
 
10480
10537
 
10481
10538
  ## write-use-case `@warlock.js/core/write-use-case/SKILL.md`
10482
10539
 
10483
10540
  ---
10484
10541
  name: write-use-case
10485
- description: 'Author `useCase()` pipelines for business logic — guards, schema, before/after middleware, retry, benchmark, broadcast, lifecycle callbacks; transport-agnostic and observable by default. Input is inferred from the `schema`. Triggers: `useCase`, `UseCaseContext`, `UseCaseResult`, `retry`, `benchmark`, `broadcast`, `description`, `globalUseCasesEvents`, `UseCaseBroadcastChannel`; "encapsulate a business operation", "share logic between HTTP and CLI", "add guards and lifecycle hooks", "broadcast a use case result", "transport-agnostic pipeline"; typical import `import { useCase } from "@warlock.js/core"`. Skip: thin handler shape — `@warlock.js/core/create-controller/SKILL.md`; schema details — `@warlock.js/core/validate-input/SKILL.md`; the standalone retry util — `@warlock.js/core/retry-operation/SKILL.md`; competing libs `@nestjs/cqrs`, `inversify`, hand-rolled service classes.'
10542
+ description: 'Author `useCase()` pipelines for business logic — guards, schema, before/after middleware, retry, benchmark, broadcast, lifecycle callbacks; transport-agnostic and observable by default. Input is inferred from the `schema`. Triggers: `useCase`, `UseCaseContext`, `UseCaseResult`, `retry`, `benchmark`, `broadcast`, `description`, `globalUseCasesEvents`, `UseCaseBroadcastChannel`; "encapsulate a business operation", "share logic between HTTP and CLI", "add guards and lifecycle hooks", "broadcast a use case result", "transport-agnostic pipeline"; typical import `import { useCase } from "@warlock.js/core"`. Skip: thin handler shape — the `create-controller` topic; schema details — the `validate-input` topic; the standalone retry util — the `retry-operation` topic; competing libs `@nestjs/cqrs`, `inversify`, hand-rolled service classes.'
10486
10543
  ---
10487
10544
 
10488
10545
  # Warlock — write a use case
@@ -10772,8 +10829,8 @@ For the plain-function flavour (`warlock generate.use-case <module>/<verb-noun>`
10772
10829
 
10773
10830
  ## See also
10774
10831
 
10775
- - [`@warlock.js/core/create-controller/SKILL.md`](@warlock.js/core/create-controller/SKILL.md) — the usual next step: invoke this use case from an HTTP controller.
10776
- - [`@warlock.js/herald/publish-message/SKILL.md`](@warlock.js/herald/publish-message/SKILL.md) — the message bus the `broadcast` adapter publishes to (cross-package).
10832
+ - The `create-controller` topic — the usual next step: invoke this use case from an HTTP controller.
10833
+ - The `publish-message` topic of the `warlock-js-herald` skill — the message bus the `broadcast` adapter publishes to (cross-package).
10777
10834
 
10778
10835
 
10779
10836