@warlock.js/core 5.30.0 → 5.31.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 (797) hide show
  1. package/CHANGELOG.md +142 -36
  2. package/README.md +28 -23
  3. package/bin/source-load-hook.mjs +63 -0
  4. package/bin/warlock.js +102 -42
  5. package/esm/cli/commands/add.command.mjs +4 -2
  6. package/esm/cli/commands/add.command.mjs.map +1 -1
  7. package/esm/cli/commands/agents-md/agents-md-command.action.mjs +69 -0
  8. package/esm/cli/commands/agents-md/agents-md-command.action.mjs.map +1 -0
  9. package/esm/cli/commands/agents-md.command.mjs +38 -0
  10. package/esm/cli/commands/agents-md.command.mjs.map +1 -0
  11. package/esm/cli/commands/board/board-command.action.mjs +279 -0
  12. package/esm/cli/commands/board/board-command.action.mjs.map +1 -0
  13. package/esm/cli/commands/board.command.mjs +78 -0
  14. package/esm/cli/commands/board.command.mjs.map +1 -0
  15. package/esm/cli/commands/build.command.mjs +6 -1
  16. package/esm/cli/commands/build.command.mjs.map +1 -1
  17. package/esm/cli/commands/check/check-command.action.mjs +57 -0
  18. package/esm/cli/commands/check/check-command.action.mjs.map +1 -0
  19. package/esm/cli/commands/check/child-typecheck.mjs +66 -0
  20. package/esm/cli/commands/check/child-typecheck.mjs.map +1 -0
  21. package/esm/cli/commands/check/format-problems.mjs +43 -0
  22. package/esm/cli/commands/check/format-problems.mjs.map +1 -0
  23. package/esm/cli/commands/check/typecheck-command.action.mjs +61 -0
  24. package/esm/cli/commands/check/typecheck-command.action.mjs.map +1 -0
  25. package/esm/cli/commands/check.command.mjs +50 -0
  26. package/esm/cli/commands/check.command.mjs.map +1 -0
  27. package/esm/cli/commands/dev-server.command.mjs +9 -1
  28. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  29. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs +8 -3
  30. package/esm/cli/commands/doctor/boot-for-diagnostics.mjs.map +1 -1
  31. package/esm/cli/commands/doctor/check.types.d.mts +76 -0
  32. package/esm/cli/commands/doctor/check.types.d.mts.map +1 -0
  33. package/esm/cli/commands/doctor/checks/config.check.mjs +1 -0
  34. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -1
  35. package/esm/cli/commands/doctor/checks/connectors.check.mjs +2 -0
  36. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -1
  37. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs +1 -0
  38. package/esm/cli/commands/doctor/checks/handler-signature.check.mjs.map +1 -1
  39. package/esm/cli/commands/doctor/checks/health.check.mjs +3 -0
  40. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -1
  41. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs +1 -0
  42. package/esm/cli/commands/doctor/checks/jwt-secret.check.mjs.map +1 -1
  43. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs +1 -0
  44. package/esm/cli/commands/doctor/checks/locales-ts-deprecated.check.mjs.map +1 -1
  45. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +1 -0
  46. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -1
  47. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +4 -0
  48. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -1
  49. package/esm/cli/commands/doctor/checks/routes.check.mjs +3 -0
  50. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -1
  51. package/esm/cli/commands/doctor/doctor-command.action.mjs +14 -6
  52. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -1
  53. package/esm/cli/commands/doctor/format-report.mjs +30 -2
  54. package/esm/cli/commands/doctor/format-report.mjs.map +1 -1
  55. package/esm/cli/commands/doctor.command.mjs +4 -0
  56. package/esm/cli/commands/doctor.command.mjs.map +1 -1
  57. package/esm/cli/commands/explain/explain-command.action.mjs +64 -0
  58. package/esm/cli/commands/explain/explain-command.action.mjs.map +1 -0
  59. package/esm/cli/commands/explain.command.mjs +23 -0
  60. package/esm/cli/commands/explain.command.mjs.map +1 -0
  61. package/esm/cli/commands/generate/generate.command.mjs +124 -124
  62. package/esm/cli/commands/generate/generate.command.mjs.map +1 -1
  63. package/esm/cli/commands/generate/generators/endpoint.generator.mjs +311 -0
  64. package/esm/cli/commands/generate/generators/endpoint.generator.mjs.map +1 -0
  65. package/esm/cli/commands/generate/generators/migration.generator.mjs +1 -1
  66. package/esm/cli/commands/generate/generators/migration.generator.mjs.map +1 -1
  67. package/esm/cli/commands/generate/generators/model.generator.mjs +1 -1
  68. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs +341 -0
  69. package/esm/cli/commands/generate/templates/endpoint-stubs.mjs.map +1 -0
  70. package/esm/cli/commands/generate/templates/stubs.mjs +19 -6
  71. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  72. package/esm/cli/commands/generate/utils/endpoint-schema.mjs +137 -0
  73. package/esm/cli/commands/generate/utils/endpoint-schema.mjs.map +1 -0
  74. package/esm/cli/commands/generate/utils/name-parser.mjs +1 -1
  75. package/esm/cli/commands/generate/utils/name-parser.mjs.map +1 -1
  76. package/esm/cli/commands/generate/utils/prompt.mjs.map +1 -1
  77. package/esm/cli/commands/generate/utils/writer.mjs +38 -13
  78. package/esm/cli/commands/generate/utils/writer.mjs.map +1 -1
  79. package/esm/cli/commands/inspect/inspect-command.action.mjs +72 -0
  80. package/esm/cli/commands/inspect/inspect-command.action.mjs.map +1 -0
  81. package/esm/cli/commands/inspect.command.mjs +39 -0
  82. package/esm/cli/commands/inspect.command.mjs.map +1 -0
  83. package/esm/cli/commands/mcp/mcp-command.action.mjs +103 -0
  84. package/esm/cli/commands/mcp/mcp-command.action.mjs.map +1 -0
  85. package/esm/cli/commands/mcp.command.mjs +76 -0
  86. package/esm/cli/commands/mcp.command.mjs.map +1 -0
  87. package/esm/cli/commands/openapi-generator.action.mjs.map +1 -1
  88. package/esm/cli/commands/openapi-generator.command.mjs.map +1 -1
  89. package/esm/cli/commands/postman-generator.action.mjs.map +1 -1
  90. package/esm/cli/commands/postman-generator.command.mjs.map +1 -1
  91. package/esm/cli/commands/routes/routes-diff.action.mjs +1 -1
  92. package/esm/cli/commands/test.command.mjs +131 -0
  93. package/esm/cli/commands/test.command.mjs.map +1 -0
  94. package/esm/cli/commands/trace/trace-command.action.mjs +145 -0
  95. package/esm/cli/commands/trace/trace-command.action.mjs.map +1 -0
  96. package/esm/cli/commands/trace.command.mjs +60 -0
  97. package/esm/cli/commands/trace.command.mjs.map +1 -0
  98. package/esm/cli/commands/typecheck.command.mjs +40 -0
  99. package/esm/cli/commands/typecheck.command.mjs.map +1 -0
  100. package/esm/cli/commands/upgrade.command.mjs +46 -0
  101. package/esm/cli/commands/upgrade.command.mjs.map +1 -0
  102. package/esm/cli/flush-and-exit.mjs +34 -0
  103. package/esm/cli/flush-and-exit.mjs.map +1 -0
  104. package/esm/cli/framework-cli-commands.mjs +23 -1
  105. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  106. package/esm/cli/parse-cli-args.mjs +1 -0
  107. package/esm/cli/parse-cli-args.mjs.map +1 -1
  108. package/esm/config/config-loader.d.mts.map +1 -1
  109. package/esm/config/config-loader.mjs +34 -13
  110. package/esm/config/config-loader.mjs.map +1 -1
  111. package/esm/config/config-schema.d.mts +67 -0
  112. package/esm/config/config-schema.d.mts.map +1 -0
  113. package/esm/config/config-schema.mjs +77 -0
  114. package/esm/config/config-schema.mjs.map +1 -0
  115. package/esm/config/index.d.mts +6 -0
  116. package/esm/config/index.mjs +1 -0
  117. package/esm/connectors/assert-no-reserved-connector-names.d.mts.map +1 -1
  118. package/esm/connectors/assert-no-reserved-connector-names.mjs +2 -1
  119. package/esm/connectors/assert-no-reserved-connector-names.mjs.map +1 -1
  120. package/esm/connectors/assert-unique-connector-names.d.mts.map +1 -1
  121. package/esm/connectors/assert-unique-connector-names.mjs +26 -2
  122. package/esm/connectors/assert-unique-connector-names.mjs.map +1 -1
  123. package/esm/connectors/http-connector.d.mts.map +1 -1
  124. package/esm/connectors/http-connector.mjs +3 -2
  125. package/esm/connectors/http-connector.mjs.map +1 -1
  126. package/esm/connectors/single-server-warnings.mjs.map +1 -1
  127. package/esm/connectors/socket-connector.d.mts.map +1 -1
  128. package/esm/connectors/socket-connector.mjs.map +1 -1
  129. package/esm/container/index.d.mts.map +1 -1
  130. package/esm/container/index.mjs.map +1 -1
  131. package/esm/database/migrate-action.mjs.map +1 -1
  132. package/esm/database/models/database-log/database-log.d.mts +0 -28
  133. package/esm/database/models/database-log/database-log.d.mts.map +1 -1
  134. package/esm/database/seeds/seeder.errors.d.mts +4 -0
  135. package/esm/database/seeds/seeder.errors.d.mts.map +1 -1
  136. package/esm/database/seeds/seeder.errors.mjs +2 -0
  137. package/esm/database/seeds/seeder.errors.mjs.map +1 -1
  138. package/esm/dev-server/boot-precondition-error.mjs +1 -0
  139. package/esm/dev-server/boot-precondition-error.mjs.map +1 -1
  140. package/esm/dev-server/create-worker.mjs +15 -9
  141. package/esm/dev-server/create-worker.mjs.map +1 -1
  142. package/esm/dev-server/dev-agent-tooling.mjs +135 -0
  143. package/esm/dev-server/dev-agent-tooling.mjs.map +1 -0
  144. package/esm/dev-server/dev-logger.mjs.map +1 -1
  145. package/esm/dev-server/development-server.mjs +8 -0
  146. package/esm/dev-server/development-server.mjs.map +1 -1
  147. package/esm/dev-server/files-orchestrator.mjs +4 -5
  148. package/esm/dev-server/files-orchestrator.mjs.map +1 -1
  149. package/esm/dev-server/files-watcher.mjs +1 -1
  150. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs +2 -3
  151. package/esm/dev-server/health-checker/checkers/eslint-health-checker.mjs.map +1 -1
  152. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs +33 -0
  153. package/esm/dev-server/health-checker/checkers/oxlint-health-checker.mjs.map +1 -0
  154. package/esm/dev-server/health-checker/default-health-checkers.mjs +31 -0
  155. package/esm/dev-server/health-checker/default-health-checkers.mjs.map +1 -0
  156. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts +9 -3
  157. package/esm/dev-server/health-checker/file-health-checker.contract.d.mts.map +1 -1
  158. package/esm/dev-server/health-checker/files-healthcare.manager.mjs +15 -4
  159. package/esm/dev-server/health-checker/files-healthcare.manager.mjs.map +1 -1
  160. package/esm/dev-server/health-checker/oxlint-runner.mjs +302 -0
  161. package/esm/dev-server/health-checker/oxlint-runner.mjs.map +1 -0
  162. package/esm/dev-server/health-checker/workers/oxlint-health.worker.d.mts +1 -0
  163. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs +42 -0
  164. package/esm/dev-server/health-checker/workers/oxlint-health.worker.mjs.map +1 -0
  165. package/esm/dev-server/loader/loader-port-acks.mjs +1 -1
  166. package/esm/dev-server/loader/loader-port-acks.mjs.map +1 -1
  167. package/esm/dev-server/loader/register-loader.mjs +1 -1
  168. package/esm/dev-server/loader/register-loader.mjs.map +1 -1
  169. package/esm/dev-server/loader/resolve-hook.mjs +1 -1
  170. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  171. package/esm/dev-server/model-resource-typings.mjs.map +1 -1
  172. package/esm/dev-server/module-loader.mjs +1 -0
  173. package/esm/dev-server/module-loader.mjs.map +1 -1
  174. package/esm/dev-server/parse-imports.mjs +1 -1
  175. package/esm/dev-server/parse-imports.mjs.map +1 -1
  176. package/esm/dev-server/route-types-publisher.mjs +1 -1
  177. package/esm/dev-server/start-development-server.mjs.map +1 -1
  178. package/esm/dev-server/translation-keys-sources.mjs +1 -1
  179. package/esm/dev-server/translation-keys-sources.mjs.map +1 -1
  180. package/esm/dev-server/tsconfig-manager.mjs.map +1 -1
  181. package/esm/dev-server/type-generator.mjs +3 -3
  182. package/esm/dev-server/type-generator.mjs.map +1 -1
  183. package/esm/dev-server/types.d.mts.map +1 -1
  184. package/esm/errors/container-key-missing-error.mjs +1 -0
  185. package/esm/errors/container-key-missing-error.mjs.map +1 -1
  186. package/esm/errors/error-codes.d.mts +653 -0
  187. package/esm/errors/error-codes.d.mts.map +1 -0
  188. package/esm/errors/error-codes.mjs +634 -0
  189. package/esm/errors/error-codes.mjs.map +1 -0
  190. package/esm/errors/esbuild-binary-missing-error.mjs +1 -0
  191. package/esm/errors/esbuild-binary-missing-error.mjs.map +1 -1
  192. package/esm/errors/index.d.mts +3 -1
  193. package/esm/errors/index.mjs +3 -1
  194. package/esm/errors/unknown-locale-error.mjs +1 -0
  195. package/esm/errors/unknown-locale-error.mjs.map +1 -1
  196. package/esm/errors/warlock-error.d.mts +23 -0
  197. package/esm/errors/warlock-error.d.mts.map +1 -0
  198. package/esm/errors/warlock-error.mjs +22 -0
  199. package/esm/errors/warlock-error.mjs.map +1 -0
  200. package/esm/generations/add-command.action.mjs +19 -3
  201. package/esm/generations/add-command.action.mjs.map +1 -1
  202. package/esm/generations/features/access.feature.mjs +1 -1
  203. package/esm/generations/features/access.feature.mjs.map +1 -1
  204. package/esm/generations/features/bull-board.feature.mjs +1 -1
  205. package/esm/generations/features/bull-board.feature.mjs.map +1 -1
  206. package/esm/generations/features/mysql.feature.mjs.map +1 -1
  207. package/esm/generations/features/notifications.feature.mjs +5 -2
  208. package/esm/generations/features/notifications.feature.mjs.map +1 -1
  209. package/esm/generations/features/queue.feature.mjs +1 -1
  210. package/esm/generations/features/queue.feature.mjs.map +1 -1
  211. package/esm/generations/features/react-email.feature.mjs +1 -1
  212. package/esm/generations/features/react-email.feature.mjs.map +1 -1
  213. package/esm/generations/features/shadcn.feature.mjs +1 -1
  214. package/esm/generations/features/shadcn.feature.mjs.map +1 -1
  215. package/esm/generations/features/shared/link-ai-package-import.mjs +1 -1
  216. package/esm/generations/features/shared/link-ai-package-import.mjs.map +1 -1
  217. package/esm/generations/features/shared/merge-web-sitemap-config.mjs.map +1 -1
  218. package/esm/generations/features/shared/patch-tsconfig-include.mjs +1 -1
  219. package/esm/generations/features/shared/patch-tsconfig-include.mjs.map +1 -1
  220. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs +1 -1
  221. package/esm/generations/features/shared/relocate-conflicting-home-route.mjs.map +1 -1
  222. package/esm/generations/features/sitemap.feature.mjs +1 -1
  223. package/esm/generations/features/sitemap.feature.mjs.map +1 -1
  224. package/esm/generations/features/tailwind.feature.mjs +1 -1
  225. package/esm/generations/features/tailwind.feature.mjs.map +1 -1
  226. package/esm/generations/features/test.feature.mjs +11 -6
  227. package/esm/generations/features/test.feature.mjs.map +1 -1
  228. package/esm/generations/features/web.feature.mjs +1 -1
  229. package/esm/generations/features/web.feature.mjs.map +1 -1
  230. package/esm/generations/generation-fs.mjs +73 -0
  231. package/esm/generations/generation-fs.mjs.map +1 -0
  232. package/esm/generations/generation-run.mjs +185 -0
  233. package/esm/generations/generation-run.mjs.map +1 -0
  234. package/esm/generations/stubs.mjs +155 -13
  235. package/esm/generations/stubs.mjs.map +1 -1
  236. package/esm/http/bounded-stream-queue.d.mts +10 -0
  237. package/esm/http/bounded-stream-queue.d.mts.map +1 -0
  238. package/esm/http/bounded-stream-queue.mjs +97 -0
  239. package/esm/http/bounded-stream-queue.mjs.map +1 -0
  240. package/esm/http/build-rate-limit-options.d.mts +13 -0
  241. package/esm/http/build-rate-limit-options.d.mts.map +1 -1
  242. package/esm/http/build-rate-limit-options.mjs.map +1 -1
  243. package/esm/http/conditional-request.d.mts +86 -0
  244. package/esm/http/conditional-request.d.mts.map +1 -0
  245. package/esm/http/conditional-request.mjs +121 -0
  246. package/esm/http/conditional-request.mjs.map +1 -0
  247. package/esm/http/csp.d.mts +2 -0
  248. package/esm/http/csp.d.mts.map +1 -1
  249. package/esm/http/csp.mjs +1 -0
  250. package/esm/http/csp.mjs.map +1 -1
  251. package/esm/http/csrf-origin-policy.mjs.map +1 -1
  252. package/esm/http/database/RequestLog.d.mts +24 -84
  253. package/esm/http/database/RequestLog.d.mts.map +1 -1
  254. package/esm/http/errors/errors.d.mts +2 -0
  255. package/esm/http/errors/errors.d.mts.map +1 -1
  256. package/esm/http/errors/errors.mjs +1 -0
  257. package/esm/http/errors/errors.mjs.map +1 -1
  258. package/esm/http/escape-header-value.d.mts +18 -0
  259. package/esm/http/escape-header-value.d.mts.map +1 -0
  260. package/esm/http/escape-header-value.mjs +27 -0
  261. package/esm/http/escape-header-value.mjs.map +1 -0
  262. package/esm/http/flush-pending-cookies.mjs.map +1 -1
  263. package/esm/http/index.d.mts +5 -2
  264. package/esm/http/index.mjs +4 -1
  265. package/esm/http/lazy-static.mjs +194 -0
  266. package/esm/http/lazy-static.mjs.map +1 -0
  267. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  268. package/esm/http/plugins.d.mts.map +1 -1
  269. package/esm/http/plugins.mjs +7 -4
  270. package/esm/http/plugins.mjs.map +1 -1
  271. package/esm/http/rate-limit-cache-store.mjs +2 -1
  272. package/esm/http/rate-limit-cache-store.mjs.map +1 -1
  273. package/esm/http/request-log-snapshot.d.mts +12 -5
  274. package/esm/http/request-log-snapshot.d.mts.map +1 -1
  275. package/esm/http/request-log-snapshot.mjs +83 -4
  276. package/esm/http/request-log-snapshot.mjs.map +1 -1
  277. package/esm/http/request.d.mts +2 -2
  278. package/esm/http/request.d.mts.map +1 -1
  279. package/esm/http/request.mjs +5 -4
  280. package/esm/http/request.mjs.map +1 -1
  281. package/esm/http/response.d.mts +11 -1
  282. package/esm/http/response.d.mts.map +1 -1
  283. package/esm/http/response.mjs +164 -76
  284. package/esm/http/response.mjs.map +1 -1
  285. package/esm/http/safe-redirect.d.mts +51 -0
  286. package/esm/http/safe-redirect.d.mts.map +1 -0
  287. package/esm/http/safe-redirect.mjs +80 -0
  288. package/esm/http/safe-redirect.mjs.map +1 -0
  289. package/esm/http/serialized.d.mts.map +1 -1
  290. package/esm/http/server.d.mts +3 -1
  291. package/esm/http/server.d.mts.map +1 -1
  292. package/esm/http/server.mjs +14 -4
  293. package/esm/http/server.mjs.map +1 -1
  294. package/esm/http/stream-transport.mjs +4 -2
  295. package/esm/http/stream-transport.mjs.map +1 -1
  296. package/esm/http/types.d.mts +44 -11
  297. package/esm/http/types.d.mts.map +1 -1
  298. package/esm/http/uploads/generate-image-variant.mjs +1 -1
  299. package/esm/http/uploads/generate-image-variants.d.mts +10 -7
  300. package/esm/http/uploads/generate-image-variants.d.mts.map +1 -1
  301. package/esm/http/uploads/generate-image-variants.mjs +61 -24
  302. package/esm/http/uploads/generate-image-variants.mjs.map +1 -1
  303. package/esm/http/uploads/image-variant-cache-entries.mjs +78 -0
  304. package/esm/http/uploads/image-variant-cache-entries.mjs.map +1 -0
  305. package/esm/http/uploads/image-variant-cache.mjs +72 -30
  306. package/esm/http/uploads/image-variant-cache.mjs.map +1 -1
  307. package/esm/http/uploads/image-variant-types.d.mts +2 -0
  308. package/esm/http/uploads/image-variant-types.d.mts.map +1 -1
  309. package/esm/http/uploads/image-variants-config-error.d.mts +3 -1
  310. package/esm/http/uploads/image-variants-config-error.d.mts.map +1 -1
  311. package/esm/http/uploads/image-variants-config-error.mjs +3 -2
  312. package/esm/http/uploads/image-variants-config-error.mjs.map +1 -1
  313. package/esm/http/uploads/load-variant-source.mjs +1 -1
  314. package/esm/http/uploads/load-variant-source.mjs.map +1 -1
  315. package/esm/http/uploads/purge-image-variants.d.mts +7 -2
  316. package/esm/http/uploads/purge-image-variants.d.mts.map +1 -1
  317. package/esm/http/uploads/purge-image-variants.mjs +16 -16
  318. package/esm/http/uploads/purge-image-variants.mjs.map +1 -1
  319. package/esm/http/uploads/remote-variant-source.mjs +115 -0
  320. package/esm/http/uploads/remote-variant-source.mjs.map +1 -0
  321. package/esm/http/uploads/resolve-image-variant.d.mts +3 -4
  322. package/esm/http/uploads/resolve-image-variant.d.mts.map +1 -1
  323. package/esm/http/uploads/resolve-image-variant.mjs +10 -18
  324. package/esm/http/uploads/resolve-image-variant.mjs.map +1 -1
  325. package/esm/http/uploads/resolve-image-variants-config.mjs +5 -3
  326. package/esm/http/uploads/resolve-image-variants-config.mjs.map +1 -1
  327. package/esm/http/uploads/resolve-remote-image-variant.mjs +89 -0
  328. package/esm/http/uploads/resolve-remote-image-variant.mjs.map +1 -0
  329. package/esm/http/uploads/trim-image-variant-cache.mjs +193 -0
  330. package/esm/http/uploads/trim-image-variant-cache.mjs.map +1 -0
  331. package/esm/http/uploads/uploaded-file.controller.d.mts +5 -3
  332. package/esm/http/uploads/uploaded-file.controller.d.mts.map +1 -1
  333. package/esm/http/uploads/uploaded-file.controller.mjs +16 -8
  334. package/esm/http/uploads/uploaded-file.controller.mjs.map +1 -1
  335. package/esm/http/uploads/variant-cache-key.mjs +1 -1
  336. package/esm/http/uploads-types.d.mts +6 -2
  337. package/esm/http/uploads-types.d.mts.map +1 -1
  338. package/esm/index.d.mts +17 -6
  339. package/esm/index.mjs +14 -3
  340. package/esm/localization/parse-locale-dictionary.d.mts +2 -0
  341. package/esm/localization/parse-locale-dictionary.d.mts.map +1 -1
  342. package/esm/localization/parse-locale-dictionary.mjs +1 -0
  343. package/esm/localization/parse-locale-dictionary.mjs.map +1 -1
  344. package/esm/mail/config.d.mts +12 -1
  345. package/esm/mail/config.d.mts.map +1 -1
  346. package/esm/mail/config.mjs +16 -1
  347. package/esm/mail/config.mjs.map +1 -1
  348. package/esm/mail/index.d.mts +1 -1
  349. package/esm/mail/index.mjs +1 -1
  350. package/esm/net/index.d.mts +2 -0
  351. package/esm/net/index.mjs +3 -0
  352. package/esm/openapi/build-openapi-document.d.mts.map +1 -1
  353. package/esm/openapi/build-openapi-document.mjs +8 -5
  354. package/esm/openapi/build-openapi-document.mjs.map +1 -1
  355. package/esm/openapi/error-responses.mjs +28 -2
  356. package/esm/openapi/error-responses.mjs.map +1 -1
  357. package/esm/openapi/postman/build-request-body.mjs.map +1 -1
  358. package/esm/openapi/postman/build-request-url.mjs.map +1 -1
  359. package/esm/openapi/postman/build-saved-responses.mjs.map +1 -1
  360. package/esm/openapi/postman/example-from-schema.d.mts.map +1 -1
  361. package/esm/openapi/postman/example-from-schema.mjs.map +1 -1
  362. package/esm/openapi/postman/openapi-to-postman-collection.d.mts.map +1 -1
  363. package/esm/openapi/postman/openapi-to-postman-collection.mjs.map +1 -1
  364. package/esm/openapi/postman/schema-refs.mjs.map +1 -1
  365. package/esm/openapi/postman/uuid-v5.mjs.map +1 -1
  366. package/esm/openapi/request-schemas.mjs.map +1 -1
  367. package/esm/openapi/response-schemas.mjs.map +1 -1
  368. package/esm/openapi/schema-registry.d.mts +1 -0
  369. package/esm/openapi/schema-registry.mjs.map +1 -1
  370. package/esm/openapi/security.mjs.map +1 -1
  371. package/esm/openapi/types.d.mts +3 -2
  372. package/esm/openapi/types.d.mts.map +1 -1
  373. package/esm/production/assert-generated-imports.mjs +1 -0
  374. package/esm/production/assert-generated-imports.mjs.map +1 -1
  375. package/esm/production/production-builder.mjs +12 -4
  376. package/esm/production/production-builder.mjs.map +1 -1
  377. package/esm/production/resolve-build-config.mjs +1 -0
  378. package/esm/production/resolve-build-config.mjs.map +1 -1
  379. package/esm/production/route-registration-child.mjs.map +1 -1
  380. package/esm/production/route-registration-snapshot.mjs.map +1 -1
  381. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  382. package/esm/repositories/contracts/types.d.mts.map +1 -1
  383. package/esm/repositories/repository.manager.mjs.map +1 -1
  384. package/esm/resource/resource.d.mts.map +1 -1
  385. package/esm/resource/resource.mjs.map +1 -1
  386. package/esm/resource/types.d.mts.map +1 -1
  387. package/esm/restful/restful.d.mts +5 -5
  388. package/esm/restful/restful.d.mts.map +1 -1
  389. package/esm/restful/restful.mjs.map +1 -1
  390. package/esm/router/build-route-rate-limit.mjs.map +1 -1
  391. package/esm/router/dev-dispatch.mjs +31 -12
  392. package/esm/router/dev-dispatch.mjs.map +1 -1
  393. package/esm/router/index.d.mts +4 -2
  394. package/esm/router/index.mjs +2 -0
  395. package/esm/router/log-request-lifecycle.mjs.map +1 -1
  396. package/esm/router/positional-handler-diagnostics.d.mts.map +1 -1
  397. package/esm/router/positional-handler-diagnostics.mjs.map +1 -1
  398. package/esm/router/resolve-route-rate-limit.mjs +47 -0
  399. package/esm/router/resolve-route-rate-limit.mjs.map +1 -0
  400. package/esm/router/resolve-route-validation.mjs +19 -0
  401. package/esm/router/resolve-route-validation.mjs.map +1 -0
  402. package/esm/router/route-guard-names.mjs +30 -0
  403. package/esm/router/route-guard-names.mjs.map +1 -0
  404. package/esm/router/route-name-taken-error.d.mts +14 -0
  405. package/esm/router/route-name-taken-error.d.mts.map +1 -0
  406. package/esm/router/route-name-taken-error.mjs +18 -0
  407. package/esm/router/route-name-taken-error.mjs.map +1 -0
  408. package/esm/router/router.d.mts +32 -13
  409. package/esm/router/router.d.mts.map +1 -1
  410. package/esm/router/router.mjs +71 -38
  411. package/esm/router/router.mjs.map +1 -1
  412. package/esm/router/types.d.mts +137 -17
  413. package/esm/router/types.d.mts.map +1 -1
  414. package/esm/router/unguarded-route-diagnostics.d.mts +40 -0
  415. package/esm/router/unguarded-route-diagnostics.d.mts.map +1 -0
  416. package/esm/router/unguarded-route-diagnostics.mjs +95 -0
  417. package/esm/router/unguarded-route-diagnostics.mjs.map +1 -0
  418. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  419. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  420. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  421. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  422. package/esm/storage/local-disk-roots.mjs +24 -0
  423. package/esm/storage/local-disk-roots.mjs.map +1 -0
  424. package/esm/storage/storage.d.mts +14 -0
  425. package/esm/storage/storage.d.mts.map +1 -1
  426. package/esm/storage/storage.mjs +22 -0
  427. package/esm/storage/storage.mjs.map +1 -1
  428. package/esm/storage/types.d.mts.map +1 -1
  429. package/esm/storage/utils/storage-not-initialized-error.d.mts +2 -0
  430. package/esm/storage/utils/storage-not-initialized-error.d.mts.map +1 -1
  431. package/esm/storage/utils/storage-not-initialized-error.mjs +1 -0
  432. package/esm/storage/utils/storage-not-initialized-error.mjs.map +1 -1
  433. package/esm/tests/authenticated-test-client.d.mts +32 -0
  434. package/esm/tests/authenticated-test-client.d.mts.map +1 -0
  435. package/esm/tests/authenticated-test-client.mjs +40 -0
  436. package/esm/tests/authenticated-test-client.mjs.map +1 -0
  437. package/esm/tests/factories.d.mts +59 -0
  438. package/esm/tests/factories.d.mts.map +1 -0
  439. package/esm/tests/factories.mjs +105 -0
  440. package/esm/tests/factories.mjs.map +1 -0
  441. package/esm/tests/fakes/cache-fake.d.mts +29 -0
  442. package/esm/tests/fakes/cache-fake.d.mts.map +1 -0
  443. package/esm/tests/fakes/cache-fake.mjs +79 -0
  444. package/esm/tests/fakes/cache-fake.mjs.map +1 -0
  445. package/esm/tests/fakes/clock-fake.d.mts +32 -0
  446. package/esm/tests/fakes/clock-fake.d.mts.map +1 -0
  447. package/esm/tests/fakes/clock-fake.mjs +69 -0
  448. package/esm/tests/fakes/clock-fake.mjs.map +1 -0
  449. package/esm/tests/fakes/fake-assertion-error.d.mts +13 -0
  450. package/esm/tests/fakes/fake-assertion-error.d.mts.map +1 -0
  451. package/esm/tests/fakes/fake-assertion-error.mjs +20 -0
  452. package/esm/tests/fakes/fake-assertion-error.mjs.map +1 -0
  453. package/esm/tests/fakes/ids-fake.d.mts +22 -0
  454. package/esm/tests/fakes/ids-fake.d.mts.map +1 -0
  455. package/esm/tests/fakes/ids-fake.mjs +57 -0
  456. package/esm/tests/fakes/ids-fake.mjs.map +1 -0
  457. package/esm/tests/fakes/index.d.mts +8 -0
  458. package/esm/tests/fakes/index.mjs +10 -0
  459. package/esm/tests/fakes/mail-fake.d.mts +41 -0
  460. package/esm/tests/fakes/mail-fake.d.mts.map +1 -0
  461. package/esm/tests/fakes/mail-fake.mjs +111 -0
  462. package/esm/tests/fakes/mail-fake.mjs.map +1 -0
  463. package/esm/tests/fakes/queue-fake.d.mts +48 -0
  464. package/esm/tests/fakes/queue-fake.d.mts.map +1 -0
  465. package/esm/tests/fakes/queue-fake.mjs +134 -0
  466. package/esm/tests/fakes/queue-fake.mjs.map +1 -0
  467. package/esm/tests/fakes/storage-fake.d.mts +31 -0
  468. package/esm/tests/fakes/storage-fake.d.mts.map +1 -0
  469. package/esm/tests/fakes/storage-fake.mjs +122 -0
  470. package/esm/tests/fakes/storage-fake.mjs.map +1 -0
  471. package/esm/tests/fakes/test-fakes.d.mts +39 -0
  472. package/esm/tests/fakes/test-fakes.d.mts.map +1 -0
  473. package/esm/tests/fakes/test-fakes.mjs +90 -0
  474. package/esm/tests/fakes/test-fakes.mjs.map +1 -0
  475. package/esm/tests/index.d.mts +14 -2
  476. package/esm/tests/index.mjs +15 -2
  477. package/esm/tests/snapshot-response.d.mts +34 -0
  478. package/esm/tests/snapshot-response.d.mts.map +1 -0
  479. package/esm/tests/snapshot-response.mjs +42 -0
  480. package/esm/tests/snapshot-response.mjs.map +1 -0
  481. package/esm/tests/start-http-development-server.d.mts +22 -0
  482. package/esm/tests/start-http-development-server.d.mts.map +1 -1
  483. package/esm/tests/start-http-development-server.mjs +36 -3
  484. package/esm/tests/start-http-development-server.mjs.map +1 -1
  485. package/esm/tests/test-helpers.d.mts +20 -1
  486. package/esm/tests/test-helpers.d.mts.map +1 -1
  487. package/esm/tests/test-helpers.mjs +40 -27
  488. package/esm/tests/test-helpers.mjs.map +1 -1
  489. package/esm/tests/test-http-server.d.mts +62 -0
  490. package/esm/tests/test-http-server.d.mts.map +1 -0
  491. package/esm/tests/test-http-server.mjs +119 -0
  492. package/esm/tests/test-http-server.mjs.map +1 -0
  493. package/esm/tests/vitest-setup.d.mts +11 -0
  494. package/esm/tests/vitest-setup.d.mts.map +1 -1
  495. package/esm/tests/vitest-setup.mjs +12 -4
  496. package/esm/tests/vitest-setup.mjs.map +1 -1
  497. package/esm/tooling/agents-md/agents-md-markers.d.mts +27 -0
  498. package/esm/tooling/agents-md/agents-md-markers.d.mts.map +1 -0
  499. package/esm/tooling/agents-md/agents-md-markers.mjs +59 -0
  500. package/esm/tooling/agents-md/agents-md-markers.mjs.map +1 -0
  501. package/esm/tooling/agents-md/agents-md-refresher.d.mts +36 -0
  502. package/esm/tooling/agents-md/agents-md-refresher.d.mts.map +1 -0
  503. package/esm/tooling/agents-md/agents-md-refresher.mjs +72 -0
  504. package/esm/tooling/agents-md/agents-md-refresher.mjs.map +1 -0
  505. package/esm/tooling/agents-md/index.mjs +7 -0
  506. package/esm/tooling/agents-md/installed-skills.d.mts +30 -0
  507. package/esm/tooling/agents-md/installed-skills.d.mts.map +1 -0
  508. package/esm/tooling/agents-md/installed-skills.mjs +74 -0
  509. package/esm/tooling/agents-md/installed-skills.mjs.map +1 -0
  510. package/esm/tooling/agents-md/render-agents-md.d.mts +33 -0
  511. package/esm/tooling/agents-md/render-agents-md.d.mts.map +1 -0
  512. package/esm/tooling/agents-md/render-agents-md.mjs +195 -0
  513. package/esm/tooling/agents-md/render-agents-md.mjs.map +1 -0
  514. package/esm/tooling/agents-md/write-agents-md.d.mts +33 -0
  515. package/esm/tooling/agents-md/write-agents-md.d.mts.map +1 -0
  516. package/esm/tooling/agents-md/write-agents-md.mjs +49 -0
  517. package/esm/tooling/agents-md/write-agents-md.mjs.map +1 -0
  518. package/esm/tooling/board/board-message.d.mts +31 -0
  519. package/esm/tooling/board/board-message.d.mts.map +1 -0
  520. package/esm/tooling/board/board-message.mjs +86 -0
  521. package/esm/tooling/board/board-message.mjs.map +1 -0
  522. package/esm/tooling/board/board.d.mts +109 -0
  523. package/esm/tooling/board/board.d.mts.map +1 -0
  524. package/esm/tooling/board/board.mjs +406 -0
  525. package/esm/tooling/board/board.mjs.map +1 -0
  526. package/esm/tooling/board/board.types.d.mts +72 -0
  527. package/esm/tooling/board/board.types.d.mts.map +1 -0
  528. package/esm/tooling/board/board.types.mjs +54 -0
  529. package/esm/tooling/board/board.types.mjs.map +1 -0
  530. package/esm/tooling/check/changed-files.d.mts +33 -0
  531. package/esm/tooling/check/changed-files.d.mts.map +1 -0
  532. package/esm/tooling/check/changed-files.mjs +73 -0
  533. package/esm/tooling/check/changed-files.mjs.map +1 -0
  534. package/esm/tooling/check/check-report.types.d.mts +62 -0
  535. package/esm/tooling/check/check-report.types.d.mts.map +1 -0
  536. package/esm/tooling/check/check-report.types.mjs +37 -0
  537. package/esm/tooling/check/check-report.types.mjs.map +1 -0
  538. package/esm/tooling/check/code-style-conventions.mjs +106 -0
  539. package/esm/tooling/check/code-style-conventions.mjs.map +1 -0
  540. package/esm/tooling/check/conventions-step.d.mts +34 -0
  541. package/esm/tooling/check/conventions-step.d.mts.map +1 -0
  542. package/esm/tooling/check/conventions-step.mjs +184 -0
  543. package/esm/tooling/check/conventions-step.mjs.map +1 -0
  544. package/esm/tooling/check/environment-step.d.mts +18 -0
  545. package/esm/tooling/check/environment-step.d.mts.map +1 -0
  546. package/esm/tooling/check/environment-step.mjs +78 -0
  547. package/esm/tooling/check/environment-step.mjs.map +1 -0
  548. package/esm/tooling/check/index.d.mts +8 -0
  549. package/esm/tooling/check/index.mjs +10 -0
  550. package/esm/tooling/check/lint-step.d.mts +19 -0
  551. package/esm/tooling/check/lint-step.d.mts.map +1 -0
  552. package/esm/tooling/check/lint-step.mjs +111 -0
  553. package/esm/tooling/check/lint-step.mjs.map +1 -0
  554. package/esm/tooling/check/request-input.mjs +132 -0
  555. package/esm/tooling/check/request-input.mjs.map +1 -0
  556. package/esm/tooling/check/run-check.d.mts +35 -0
  557. package/esm/tooling/check/run-check.d.mts.map +1 -0
  558. package/esm/tooling/check/run-check.mjs +192 -0
  559. package/esm/tooling/check/run-check.mjs.map +1 -0
  560. package/esm/tooling/check/run-tests.d.mts +48 -0
  561. package/esm/tooling/check/run-tests.d.mts.map +1 -0
  562. package/esm/tooling/check/run-tests.mjs +93 -0
  563. package/esm/tooling/check/run-tests.mjs.map +1 -0
  564. package/esm/tooling/check/security-conventions.mjs +648 -0
  565. package/esm/tooling/check/security-conventions.mjs.map +1 -0
  566. package/esm/tooling/check/source-ast.mjs +195 -0
  567. package/esm/tooling/check/source-ast.mjs.map +1 -0
  568. package/esm/tooling/check/source-files.mjs +27 -0
  569. package/esm/tooling/check/source-files.mjs.map +1 -0
  570. package/esm/tooling/check/tests-step.d.mts +34 -0
  571. package/esm/tooling/check/tests-step.d.mts.map +1 -0
  572. package/esm/tooling/check/tests-step.mjs +177 -0
  573. package/esm/tooling/check/tests-step.mjs.map +1 -0
  574. package/esm/tooling/dev-state/dev-server-state.d.mts +39 -0
  575. package/esm/tooling/dev-state/dev-server-state.d.mts.map +1 -0
  576. package/esm/tooling/dev-state/dev-server-state.mjs +67 -0
  577. package/esm/tooling/dev-state/dev-server-state.mjs.map +1 -0
  578. package/esm/tooling/devtools/devtools-client.d.mts +91 -0
  579. package/esm/tooling/devtools/devtools-client.d.mts.map +1 -0
  580. package/esm/tooling/devtools/devtools-client.mjs +155 -0
  581. package/esm/tooling/devtools/devtools-client.mjs.map +1 -0
  582. package/esm/tooling/generate/generation.d.mts +78 -0
  583. package/esm/tooling/generate/generation.d.mts.map +1 -0
  584. package/esm/tooling/generate/generation.mjs +123 -0
  585. package/esm/tooling/generate/generation.mjs.map +1 -0
  586. package/esm/tooling/generate/generator-spec.d.mts +57 -0
  587. package/esm/tooling/generate/generator-spec.d.mts.map +1 -0
  588. package/esm/tooling/generate/generator-spec.mjs +102 -0
  589. package/esm/tooling/generate/generator-spec.mjs.map +1 -0
  590. package/esm/tooling/generate/index.mjs +6 -0
  591. package/esm/tooling/generate/project-files.mjs +121 -0
  592. package/esm/tooling/generate/project-files.mjs.map +1 -0
  593. package/esm/tooling/generate/run-cli.d.mts +40 -0
  594. package/esm/tooling/generate/run-cli.d.mts.map +1 -0
  595. package/esm/tooling/generate/run-cli.mjs +93 -0
  596. package/esm/tooling/generate/run-cli.mjs.map +1 -0
  597. package/esm/tooling/generate/unified-diff.d.mts +37 -0
  598. package/esm/tooling/generate/unified-diff.d.mts.map +1 -0
  599. package/esm/tooling/generate/unified-diff.mjs +161 -0
  600. package/esm/tooling/generate/unified-diff.mjs.map +1 -0
  601. package/esm/tooling/index.d.mts +41 -0
  602. package/esm/tooling/index.mjs +45 -0
  603. package/esm/tooling/inspect/boot-for-inspect.d.mts +23 -0
  604. package/esm/tooling/inspect/boot-for-inspect.d.mts.map +1 -0
  605. package/esm/tooling/inspect/boot-for-inspect.mjs +63 -0
  606. package/esm/tooling/inspect/boot-for-inspect.mjs.map +1 -0
  607. package/esm/tooling/inspect/collect-config.mjs +77 -0
  608. package/esm/tooling/inspect/collect-config.mjs.map +1 -0
  609. package/esm/tooling/inspect/collect-models.d.mts +9 -0
  610. package/esm/tooling/inspect/collect-models.d.mts.map +1 -0
  611. package/esm/tooling/inspect/collect-models.mjs +154 -0
  612. package/esm/tooling/inspect/collect-models.mjs.map +1 -0
  613. package/esm/tooling/inspect/collect-packages.d.mts +10 -0
  614. package/esm/tooling/inspect/collect-packages.d.mts.map +1 -0
  615. package/esm/tooling/inspect/collect-packages.mjs +157 -0
  616. package/esm/tooling/inspect/collect-packages.mjs.map +1 -0
  617. package/esm/tooling/inspect/collect-pages.mjs +108 -0
  618. package/esm/tooling/inspect/collect-pages.mjs.map +1 -0
  619. package/esm/tooling/inspect/collect-routes.mjs +168 -0
  620. package/esm/tooling/inspect/collect-routes.mjs.map +1 -0
  621. package/esm/tooling/inspect/event-recorder.d.mts +37 -0
  622. package/esm/tooling/inspect/event-recorder.d.mts.map +1 -0
  623. package/esm/tooling/inspect/event-recorder.mjs +91 -0
  624. package/esm/tooling/inspect/event-recorder.mjs.map +1 -0
  625. package/esm/tooling/inspect/index.d.mts +7 -0
  626. package/esm/tooling/inspect/index.mjs +7 -0
  627. package/esm/tooling/inspect/inspect-app.d.mts +53 -0
  628. package/esm/tooling/inspect/inspect-app.d.mts.map +1 -0
  629. package/esm/tooling/inspect/inspect-app.mjs +92 -0
  630. package/esm/tooling/inspect/inspect-app.mjs.map +1 -0
  631. package/esm/tooling/inspect/inspect-report.schema.d.mts +15 -0
  632. package/esm/tooling/inspect/inspect-report.schema.d.mts.map +1 -0
  633. package/esm/tooling/inspect/inspect-report.schema.mjs +463 -0
  634. package/esm/tooling/inspect/inspect-report.schema.mjs.map +1 -0
  635. package/esm/tooling/inspect/inspect-report.types.d.mts +196 -0
  636. package/esm/tooling/inspect/inspect-report.types.d.mts.map +1 -0
  637. package/esm/tooling/inspect/inspect-report.types.mjs +33 -0
  638. package/esm/tooling/inspect/inspect-report.types.mjs.map +1 -0
  639. package/esm/tooling/mcp/create-mcp-context.d.mts +26 -0
  640. package/esm/tooling/mcp/create-mcp-context.d.mts.map +1 -0
  641. package/esm/tooling/mcp/create-mcp-context.mjs +75 -0
  642. package/esm/tooling/mcp/create-mcp-context.mjs.map +1 -0
  643. package/esm/tooling/mcp/db-schema.d.mts +49 -0
  644. package/esm/tooling/mcp/db-schema.d.mts.map +1 -0
  645. package/esm/tooling/mcp/db-schema.mjs +56 -0
  646. package/esm/tooling/mcp/db-schema.mjs.map +1 -0
  647. package/esm/tooling/mcp/docs-search.d.mts +72 -0
  648. package/esm/tooling/mcp/docs-search.d.mts.map +1 -0
  649. package/esm/tooling/mcp/docs-search.mjs +178 -0
  650. package/esm/tooling/mcp/docs-search.mjs.map +1 -0
  651. package/esm/tooling/mcp/index.mjs +9 -0
  652. package/esm/tooling/mcp/load-ai-tools.d.mts +62 -0
  653. package/esm/tooling/mcp/load-ai-tools.d.mts.map +1 -0
  654. package/esm/tooling/mcp/load-ai-tools.mjs +44 -0
  655. package/esm/tooling/mcp/load-ai-tools.mjs.map +1 -0
  656. package/esm/tooling/mcp/mcp-tools.d.mts +60 -0
  657. package/esm/tooling/mcp/mcp-tools.d.mts.map +1 -0
  658. package/esm/tooling/mcp/mcp-tools.mjs +513 -0
  659. package/esm/tooling/mcp/mcp-tools.mjs.map +1 -0
  660. package/esm/tooling/mcp/start-mcp-server.d.mts +56 -0
  661. package/esm/tooling/mcp/start-mcp-server.d.mts.map +1 -0
  662. package/esm/tooling/mcp/start-mcp-server.mjs +126 -0
  663. package/esm/tooling/mcp/start-mcp-server.mjs.map +1 -0
  664. package/esm/tooling/mcp/tool-input.d.mts +75 -0
  665. package/esm/tooling/mcp/tool-input.d.mts.map +1 -0
  666. package/esm/tooling/mcp/tool-input.mjs +72 -0
  667. package/esm/tooling/mcp/tool-input.mjs.map +1 -0
  668. package/esm/tooling/problem.d.mts +45 -0
  669. package/esm/tooling/problem.d.mts.map +1 -0
  670. package/esm/tooling/problem.mjs +28 -0
  671. package/esm/tooling/problem.mjs.map +1 -0
  672. package/esm/tooling/trace/trace-report.types.d.mts +71 -0
  673. package/esm/tooling/trace/trace-report.types.d.mts.map +1 -0
  674. package/esm/tooling/trace/trace-report.types.mjs +7 -0
  675. package/esm/tooling/trace/trace-report.types.mjs.map +1 -0
  676. package/esm/tooling/trace/trace-request.d.mts +83 -0
  677. package/esm/tooling/trace/trace-request.d.mts.map +1 -0
  678. package/esm/tooling/trace/trace-request.mjs +241 -0
  679. package/esm/tooling/trace/trace-request.mjs.map +1 -0
  680. package/esm/tooling/typecheck/index.d.mts +1 -0
  681. package/esm/tooling/typecheck/index.mjs +3 -0
  682. package/esm/tooling/typecheck/run-typecheck.d.mts +59 -0
  683. package/esm/tooling/typecheck/run-typecheck.d.mts.map +1 -0
  684. package/esm/tooling/typecheck/run-typecheck.mjs +153 -0
  685. package/esm/tooling/typecheck/run-typecheck.mjs.map +1 -0
  686. package/esm/upgrade/codemods/head-viewport.mjs +46 -0
  687. package/esm/upgrade/codemods/head-viewport.mjs.map +1 -0
  688. package/esm/upgrade/codemods/helpers.mjs +81 -0
  689. package/esm/upgrade/codemods/helpers.mjs.map +1 -0
  690. package/esm/upgrade/codemods/index.mjs +34 -0
  691. package/esm/upgrade/codemods/index.mjs.map +1 -0
  692. package/esm/upgrade/codemods/logger-sync-calls.mjs +57 -0
  693. package/esm/upgrade/codemods/logger-sync-calls.mjs.map +1 -0
  694. package/esm/upgrade/codemods/package-json.mjs +122 -0
  695. package/esm/upgrade/codemods/package-json.mjs.map +1 -0
  696. package/esm/upgrade/codemods/request-log-snapshot.mjs +82 -0
  697. package/esm/upgrade/codemods/request-log-snapshot.mjs.map +1 -0
  698. package/esm/upgrade/codemods/review-sites.mjs +262 -0
  699. package/esm/upgrade/codemods/review-sites.mjs.map +1 -0
  700. package/esm/upgrade/diff.mjs +119 -0
  701. package/esm/upgrade/diff.mjs.map +1 -0
  702. package/esm/upgrade/format-upgrade-report.mjs +32 -0
  703. package/esm/upgrade/format-upgrade-report.mjs.map +1 -0
  704. package/esm/upgrade/load-ts-morph.mjs +48 -0
  705. package/esm/upgrade/load-ts-morph.mjs.map +1 -0
  706. package/esm/upgrade/notes.mjs +16 -0
  707. package/esm/upgrade/notes.mjs.map +1 -0
  708. package/esm/upgrade/run-upgrade.mjs +246 -0
  709. package/esm/upgrade/run-upgrade.mjs.map +1 -0
  710. package/esm/upgrade/upgrade-command.action.mjs +37 -0
  711. package/esm/upgrade/upgrade-command.action.mjs.map +1 -0
  712. package/esm/upgrade/version.mjs +39 -0
  713. package/esm/upgrade/version.mjs.map +1 -0
  714. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  715. package/esm/utils/clock.d.mts +33 -0
  716. package/esm/utils/clock.d.mts.map +1 -0
  717. package/esm/utils/clock.mjs +27 -0
  718. package/esm/utils/clock.mjs.map +1 -0
  719. package/esm/utils/framework-vesion.mjs +1 -1
  720. package/esm/utils/framework-vesion.mjs.map +1 -1
  721. package/esm/utils/ids.d.mts +32 -0
  722. package/esm/utils/ids.d.mts.map +1 -0
  723. package/esm/utils/ids.mjs +33 -0
  724. package/esm/utils/ids.mjs.map +1 -0
  725. package/esm/utils/index.d.mts +3 -0
  726. package/esm/utils/index.mjs +3 -0
  727. package/esm/utils/runtime.d.mts +59 -0
  728. package/esm/utils/runtime.d.mts.map +1 -0
  729. package/esm/utils/runtime.mjs +85 -0
  730. package/esm/utils/runtime.mjs.map +1 -0
  731. package/esm/validation/index.d.mts +1 -1
  732. package/esm/validation/types.d.mts +57 -2
  733. package/esm/validation/types.d.mts.map +1 -1
  734. package/esm/validation/validateAll.mjs +19 -2
  735. package/esm/validation/validateAll.mjs.map +1 -1
  736. package/esm/validation/validation-failure-status.mjs +15 -0
  737. package/esm/validation/validation-failure-status.mjs.map +1 -0
  738. package/esm/validation/validators/file-validator.d.mts +0 -16
  739. package/esm/validation/validators/file-validator.d.mts.map +1 -1
  740. package/esm/warlock-config/bundle-config.mjs +1 -1
  741. package/esm/warlock-config/types.d.mts +27 -3
  742. package/esm/warlock-config/types.d.mts.map +1 -1
  743. package/llms-full.txt +3166 -736
  744. package/llms.txt +16 -6
  745. package/package.json +43 -13
  746. package/schemas/inspect-report.schema.json +554 -0
  747. package/skills/README.md +9 -0
  748. package/skills/add-connector/SKILL.md +26 -38
  749. package/skills/benchmark-code/SKILL.md +30 -24
  750. package/skills/build-restful/SKILL.md +14 -14
  751. package/skills/build-url/SKILL.md +18 -18
  752. package/skills/configure-app/SKILL.md +107 -14
  753. package/skills/create-controller/SKILL.md +25 -12
  754. package/skills/create-module/SKILL.md +3 -3
  755. package/skills/define-resource/SKILL.md +32 -29
  756. package/skills/encrypt-data/SKILL.md +21 -19
  757. package/skills/generate-openapi/SKILL.md +50 -24
  758. package/skills/hash-password/SKILL.md +2 -2
  759. package/skills/health-checks/SKILL.md +24 -7
  760. package/skills/index.md +9 -4
  761. package/skills/lower-stage3-decorators/SKILL.md +4 -4
  762. package/skills/make-endpoint/SKILL.md +110 -0
  763. package/skills/model-factories/SKILL.md +92 -0
  764. package/skills/process-image/SKILL.md +32 -30
  765. package/skills/register-route/SKILL.md +109 -10
  766. package/skills/request-memo/SKILL.md +1 -1
  767. package/skills/request-tracing/SKILL.md +4 -1
  768. package/skills/resolve-path/SKILL.md +45 -44
  769. package/skills/retry-operation/SKILL.md +20 -11
  770. package/skills/run-app/SKILL.md +106 -22
  771. package/skills/send-response/SKILL.md +179 -14
  772. package/skills/store-file/SKILL.md +93 -53
  773. package/skills/test-fakes/SKILL.md +123 -0
  774. package/skills/test-http/SKILL.md +125 -21
  775. package/skills/test-service/SKILL.md +41 -1
  776. package/skills/update-packages/SKILL.md +29 -18
  777. package/skills/upgrade-from-5-29/SKILL.md +413 -0
  778. package/skills/upload-file/SKILL.md +31 -33
  779. package/skills/use-app-context/SKILL.md +38 -31
  780. package/skills/use-middleware/SKILL.md +45 -25
  781. package/skills/use-model-transformers/SKILL.md +37 -28
  782. package/skills/use-repository/SKILL.md +2 -2
  783. package/skills/validate-input/SKILL.md +72 -28
  784. package/skills/warlock-agents-md/SKILL.md +96 -0
  785. package/skills/warlock-board/SKILL.md +123 -0
  786. package/skills/warlock-check/SKILL.md +132 -0
  787. package/skills/warlock-conventions/SKILL.md +115 -0
  788. package/skills/warlock-doctor/SKILL.md +55 -22
  789. package/skills/warlock-inspect/SKILL.md +134 -0
  790. package/skills/warlock-mcp/SKILL.md +120 -0
  791. package/skills/warlock-routes/SKILL.md +18 -11
  792. package/skills/warlock-trace/SKILL.md +81 -0
  793. package/skills/wire-socket/SKILL.md +8 -8
  794. package/skills/write-seeder/SKILL.md +46 -32
  795. package/skills/write-use-case/SKILL.md +40 -27
  796. package/esm/http/uploads/matches-if-none-match.mjs +0 -13
  797. package/esm/http/uploads/matches-if-none-match.mjs.map +0 -1
@@ -0,0 +1,33 @@
1
+ //#region ../../packages/core/src/tooling/inspect/inspect-report.types.ts
2
+ /**
3
+ * @fileoverview The `warlock inspect` report, schema version 1.
4
+ *
5
+ * STABILITY: within `schemaVersion: 1` fields are only ever ADDED. No field is
6
+ * removed, renamed or retyped, so a consumer written against this file keeps
7
+ * working on every later 5.x release. Consumers must ignore keys they do not
8
+ * know. A change that breaks that promise ships as `schemaVersion: 2` and is
9
+ * listed under BREAKING in the changelog. Free text (warning messages,
10
+ * descriptions) is not part of the contract.
11
+ *
12
+ * The same shape is published as JSON Schema (draft 2020-12) in
13
+ * `@warlock.js/core/schemas/inspect-report.schema.json` and as the
14
+ * `INSPECT_REPORT_JSON_SCHEMA` constant.
15
+ */
16
+ /** The version of the report shape. Bumped only for a breaking change. */
17
+ const INSPECT_SCHEMA_VERSION = 1;
18
+ /** Every section the report can contain, in output order. */
19
+ const INSPECT_SECTIONS = [
20
+ "routes",
21
+ "models",
22
+ "resources",
23
+ "config",
24
+ "events",
25
+ "pages",
26
+ "jobs",
27
+ "schedules",
28
+ "packages"
29
+ ];
30
+
31
+ //#endregion
32
+ export { INSPECT_SCHEMA_VERSION, INSPECT_SECTIONS };
33
+ //# sourceMappingURL=inspect-report.types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect-report.types.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/inspect/inspect-report.types.ts"],"sourcesContent":["import type { WarlockErrorCode } from \"../../errors/error-codes\";\n\n/**\n * @fileoverview The `warlock inspect` report, schema version 1.\n *\n * STABILITY: within `schemaVersion: 1` fields are only ever ADDED. No field is\n * removed, renamed or retyped, so a consumer written against this file keeps\n * working on every later 5.x release. Consumers must ignore keys they do not\n * know. A change that breaks that promise ships as `schemaVersion: 2` and is\n * listed under BREAKING in the changelog. Free text (warning messages,\n * descriptions) is not part of the contract.\n *\n * The same shape is published as JSON Schema (draft 2020-12) in\n * `@warlock.js/core/schemas/inspect-report.schema.json` and as the\n * `INSPECT_REPORT_JSON_SCHEMA` constant.\n */\n\n/** The version of the report shape. Bumped only for a breaking change. */\nexport const INSPECT_SCHEMA_VERSION = 1;\n\n/** Every section the report can contain, in output order. */\nexport const INSPECT_SECTIONS = [\n \"routes\",\n \"models\",\n \"resources\",\n \"config\",\n \"events\",\n \"pages\",\n \"jobs\",\n \"schedules\",\n \"packages\",\n] as const;\n\n/** One section name. */\nexport type InspectSection = (typeof INSPECT_SECTIONS)[number];\n\n/** A JSON Schema (draft 2020-12) fragment. */\nexport type JsonSchema = Record<string, unknown>;\n\n/** Who guards a route, from the descriptor `authMiddleware()` attaches. */\nexport type InspectRouteAuth = {\n /** Whether an auth guard runs on the route. */\n required: boolean;\n /** Where the token is read: `\"header\"` (bearer) or `{ cookie }`. */\n sources: (\"header\" | { cookie: string })[];\n /** User types the guard accepts; empty means any. */\n userTypes: string[];\n};\n\n/** The rate limit a route runs under. */\nexport type InspectRouteRateLimit = {\n /** `route` = the route's own option, `global` = `http.rateLimit`, `none` = no limiter. */\n source: \"route\" | \"global\" | \"none\";\n /** Max requests per window; `\"dynamic\"` when configured as a function. */\n max: number | \"dynamic\" | null;\n /** Window in milliseconds, or the configured string (`\"1 minute\"`); `\"dynamic\"` for a function. */\n timeWindow: number | string | null;\n};\n\n/** What the route's request log entries keep. */\nexport type InspectRouteLogging = {\n /** Whether the request body is logged. */\n body: boolean;\n /** Whether the query string is logged. */\n query: boolean;\n /** Whether `http.logging.private` rules exist that may remove more for some URLs. */\n privateRules: boolean;\n};\n\n/** One request parameter (path, query or header). */\nexport type InspectParameter = {\n name: string;\n in: \"path\" | \"query\" | \"header\" | \"cookie\";\n required: boolean;\n schema: JsonSchema;\n};\n\n/** One registered HTTP route. */\nexport type InspectRoute = {\n /** Uppercase method, `ALL` for `router.all`. */\n method: string;\n path: string;\n name: string | null;\n /** Project-relative file that registered the route. */\n sourceFile: string | null;\n /** Handler function name, `\"anonymous\"` when it has none. */\n handler: string;\n description: string | null;\n /** Whether a page (SSR) route registered it. */\n isPage: boolean;\n /** Middleware function names in run order. */\n middleware: string[];\n auth: InspectRouteAuth;\n /** `false` when the route opted out of the CSRF origin guard (`csrf: false`). */\n csrf: boolean;\n rateLimit: InspectRouteRateLimit;\n logging: InspectRouteLogging;\n request: {\n parameters: InspectParameter[];\n /** JSON Schema of the request body, or `null`. */\n body: JsonSchema | null;\n /** Whether `validation.validate` (custom middleware, not described) is set. */\n customValidation: boolean;\n };\n /** Declared responses keyed by status code. */\n responses: Record<string, { description: string; schema: JsonSchema | null }>;\n};\n\n/** One model column, from the model's Seal `schema`. */\nexport type InspectModelColumn = {\n name: string;\n required: boolean;\n schema: JsonSchema;\n};\n\n/** One model relation. */\nexport type InspectModelRelation = {\n name: string;\n type: string;\n /** Target model name, or `null` when it could not be resolved. */\n model: string | null;\n foreignKey: string | null;\n localKey: string | null;\n};\n\n/** One model class. */\nexport type InspectModel = {\n name: string;\n table: string | null;\n primaryKey: string | null;\n /** Data source name, when configured by name. */\n dataSource: string | null;\n sourceFile: string | null;\n /** Whether `@RegisterModel()` put it in the registry. */\n registered: boolean;\n columns: InspectModelColumn[];\n relations: InspectModelRelation[];\n /** Name of the model's `static resource`, a key of `components.schemas`. */\n resource: string | null;\n deleteStrategy: string | null;\n createdAtColumn: string | null;\n updatedAtColumn: string | null;\n deletedAtColumn: string | null;\n};\n\n/** One resource class reached from a route or a model. */\nexport type InspectResource = {\n name: string;\n /** Its output shape (JSON Schema; nested resources are `$ref`s into `components.schemas`). */\n schema: JsonSchema;\n /** Models whose `static resource` is this resource. */\n models: string[];\n};\n\n/** One config key: its path and value type. Values are never printed. */\nexport type InspectConfigKey = {\n key: string;\n /** `string`, `number`, `boolean`, `null`, `array`, `object`, `function`, `regexp`, `date`, or a class name. */\n type: string;\n /** The `src/config/*` file the top-level key comes from, when it exists. */\n file: string | null;\n};\n\n/** One event and the listeners app modules registered for it. */\nexport type InspectEvent = {\n event: string;\n listeners: { name: string; sourceFile: string }[];\n};\n\n/** One page installed by `@warlock.js/web`. */\nexport type InspectPage = {\n path: string;\n name: string | null;\n file: string;\n /** Layout files from the outermost to the page's own directory. */\n layouts: string[];\n /** Files on the chain (layouts, then the page) that export a `loader`. */\n loaders: string[];\n /** Action names the page exports (`\"default\"` for `action`). */\n actions: string[];\n /** `\"user\"` when the page or a layout statically requires a user. */\n guard: string | null;\n};\n\n/** One queue job defined with `defineJob()`. */\nexport type InspectJob = {\n name: string;\n queue: string;\n attempts: number | null;\n backoff: number | { type: string; delay: number } | null;\n removeOnComplete: boolean | number | null;\n removeOnFail: boolean | number | null;\n};\n\n/** One scheduled task on the `@warlock.js/scheduler` scheduler. */\nexport type InspectSchedule = {\n name: string;\n cron: string | null;\n intervals: Record<string, unknown>;\n nextRun: string | null;\n};\n\n/** One installed `@warlock.js/*` package. */\nexport type InspectPackage = {\n name: string;\n version: string;\n};\n\n/** Something inspect could not read, with its code when one applies. */\nexport type InspectWarning = {\n code: WarlockErrorCode | null;\n message: string;\n /** The section or file it concerns. */\n source: string | null;\n};\n\n/** The whole report. Sections not requested are absent. */\nexport type InspectReport = {\n schemaVersion: typeof INSPECT_SCHEMA_VERSION;\n generatedAt: string;\n app: {\n name: string | null;\n version: string | null;\n /** Absolute project root. */\n root: string;\n node: string;\n environment: string;\n runtimeStrategy: string;\n };\n /** The sections this report contains. */\n sections: InspectSection[];\n routes?: InspectRoute[];\n models?: InspectModel[];\n resources?: InspectResource[];\n config?: InspectConfigKey[];\n events?: InspectEvent[];\n pages?: InspectPage[];\n jobs?: InspectJob[];\n schedules?: InspectSchedule[];\n packages?: InspectPackage[];\n /** Shared schemas that `$ref`s point at (`#/components/schemas/<name>`). */\n components: { schemas: Record<string, JsonSchema> };\n warnings: InspectWarning[];\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAkBA,MAAa,yBAAyB;;AAGtC,MAAa,mBAAmB;CAC9B;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF"}
@@ -0,0 +1,26 @@
1
+ import { InspectReport, InspectSection } from "../inspect/inspect-report.types.mjs";
2
+ import { ConnectDevtoolsOptions } from "../devtools/devtools-client.mjs";
3
+ import { WarlockMcpContext } from "./mcp-tools.mjs";
4
+
5
+ //#region ../../packages/core/src/tooling/mcp/create-mcp-context.d.ts
6
+ /** Options of {@link createMcpContext}. */
7
+ type CreateMcpContextOptions = {
8
+ /** Project root. Default: `process.cwd()`. */cwd?: string; /** Let generate tools write into the project. Default `false`. */
9
+ allowWrites?: boolean; /** How the app is described: a booted snapshot (`warlock mcp`) or the live process (`warlock dev --mcp`). */
10
+ inspect: (sections: readonly InspectSection[]) => Promise<InspectReport>;
11
+ /**
12
+ * The `warlock` CLI script. Runs the typecheck in a child process (so a heap
13
+ * overflow cannot end the server) and the generators. Default: core's bin.
14
+ */
15
+ cliEntry?: string; /** Where the dev server is, for `requests_recent`. Default: `.warlock/dev-server.json`. */
16
+ devtools?: Omit<ConnectDevtoolsOptions, "cwd">; /** The `warlock add` feature names to advertise. */
17
+ features?: readonly string[];
18
+ };
19
+ /**
20
+ * The real {@link WarlockMcpContext}: `warlock check`, `runTests`, the devtools
21
+ * client, the sandboxed generators and the installed-docs corpus (loaded once).
22
+ */
23
+ declare function createMcpContext(options: CreateMcpContextOptions): WarlockMcpContext;
24
+ //#endregion
25
+ export { CreateMcpContextOptions, createMcpContext };
26
+ //# sourceMappingURL=create-mcp-context.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-mcp-context.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/mcp/create-mcp-context.ts"],"mappings":";;;;;;KAYY,uBAAA;EAAA,8CAEV,GAAA;EAEA,WAAA,YAE0D;EAA1D,OAAA,GAAU,QAAA,WAAmB,cAAA,OAAqB,OAAA,CAAQ,aAAA;EAO1C;;;;EAFhB,QAAA,WAPA;EASA,QAAA,GAAW,IAAA,CAAK,sBAAA,UAPa;EAS7B,QAAA;AAAA;;;;;iBAgBc,gBAAA,CAAiB,OAAA,EAAS,uBAAA,GAA0B,iBAAiB"}
@@ -0,0 +1,75 @@
1
+ import { WarlockError } from "../../errors/warlock-error.mjs";
2
+ import { runCheck } from "../check/run-check.mjs";
3
+ import { childTypecheckRunner } from "../../cli/commands/check/child-typecheck.mjs";
4
+ import { connectDevtools } from "../devtools/devtools-client.mjs";
5
+ import { runTests } from "../check/run-tests.mjs";
6
+ import { resolveCliEntry } from "../generate/run-cli.mjs";
7
+ import { applyGeneration, sandboxBackend } from "../generate/generation.mjs";
8
+ import "../generate/index.mjs";
9
+ import { loadDocsCorpus } from "./docs-search.mjs";
10
+ import path from "node:path";
11
+
12
+ //#region ../../packages/core/src/tooling/mcp/create-mcp-context.ts
13
+ /** The project's `warlock` bin, or `undefined` (the generators then report the problem when used). */
14
+ function findCliEntry(cwd) {
15
+ try {
16
+ return resolveCliEntry(cwd);
17
+ } catch {
18
+ return;
19
+ }
20
+ }
21
+ /**
22
+ * The real {@link WarlockMcpContext}: `warlock check`, `runTests`, the devtools
23
+ * client, the sandboxed generators and the installed-docs corpus (loaded once).
24
+ */
25
+ function createMcpContext(options) {
26
+ const cwd = path.resolve(options.cwd ?? process.cwd());
27
+ const allowWrites = options.allowWrites === true;
28
+ const cliEntry = options.cliEntry ?? findCliEntry(cwd);
29
+ const sandbox = sandboxBackend(cliEntry ? { cliEntry } : {});
30
+ let corpus;
31
+ return {
32
+ cwd,
33
+ allowWrites,
34
+ inspect: options.inspect,
35
+ check: ({ changed, base, skip }) => {
36
+ const flags = [...changed ? ["--changed"] : [], ...base ? ["--base", base] : []];
37
+ return runCheck({
38
+ cwd,
39
+ changed,
40
+ base,
41
+ skip,
42
+ ...cliEntry ? { typecheck: childTypecheckRunner(cliEntry, flags) } : {}
43
+ });
44
+ },
45
+ tests: ({ files, changed, base }) => runTests({
46
+ cwd,
47
+ files,
48
+ changed,
49
+ base
50
+ }),
51
+ devtools: () => connectDevtools({
52
+ cwd,
53
+ ...options.devtools
54
+ }),
55
+ generation: {
56
+ plan: (spec) => sandbox.plan(spec, { cwd }),
57
+ apply: async (spec) => {
58
+ if (!allowWrites) throw new WarlockError("WL7005", "This MCP server is read-only; restart it with --allow-writes to let generate tools write.");
59
+ return applyGeneration(spec, {
60
+ cwd,
61
+ ...cliEntry ? { cliEntry } : {}
62
+ });
63
+ }
64
+ },
65
+ docs: () => {
66
+ corpus ??= loadDocsCorpus(cwd);
67
+ return corpus;
68
+ },
69
+ features: options.features
70
+ };
71
+ }
72
+
73
+ //#endregion
74
+ export { createMcpContext };
75
+ //# sourceMappingURL=create-mcp-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-mcp-context.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/mcp/create-mcp-context.ts"],"sourcesContent":["import path from \"node:path\";\nimport { childTypecheckRunner } from \"../../cli/commands/check/child-typecheck\";\nimport { WarlockError } from \"../../errors/warlock-error\";\nimport { runCheck } from \"../check/run-check\";\nimport { runTests } from \"../check/run-tests\";\nimport { connectDevtools, type ConnectDevtoolsOptions } from \"../devtools/devtools-client\";\nimport { applyGeneration, resolveCliEntry, sandboxBackend } from \"../generate\";\nimport type { InspectReport, InspectSection } from \"../inspect/inspect-report.types\";\nimport { type DocsCorpus, loadDocsCorpus } from \"./docs-search\";\nimport type { WarlockMcpContext } from \"./mcp-tools\";\n\n/** Options of {@link createMcpContext}. */\nexport type CreateMcpContextOptions = {\n /** Project root. Default: `process.cwd()`. */\n cwd?: string;\n /** Let generate tools write into the project. Default `false`. */\n allowWrites?: boolean;\n /** How the app is described: a booted snapshot (`warlock mcp`) or the live process (`warlock dev --mcp`). */\n inspect: (sections: readonly InspectSection[]) => Promise<InspectReport>;\n /**\n * The `warlock` CLI script. Runs the typecheck in a child process (so a heap\n * overflow cannot end the server) and the generators. Default: core's bin.\n */\n cliEntry?: string;\n /** Where the dev server is, for `requests_recent`. Default: `.warlock/dev-server.json`. */\n devtools?: Omit<ConnectDevtoolsOptions, \"cwd\">;\n /** The `warlock add` feature names to advertise. */\n features?: readonly string[];\n};\n\n/** The project's `warlock` bin, or `undefined` (the generators then report the problem when used). */\nfunction findCliEntry(cwd: string): string | undefined {\n try {\n return resolveCliEntry(cwd);\n } catch {\n return undefined;\n }\n}\n\n/**\n * The real {@link WarlockMcpContext}: `warlock check`, `runTests`, the devtools\n * client, the sandboxed generators and the installed-docs corpus (loaded once).\n */\nexport function createMcpContext(options: CreateMcpContextOptions): WarlockMcpContext {\n const cwd = path.resolve(options.cwd ?? process.cwd());\n const allowWrites = options.allowWrites === true;\n const cliEntry = options.cliEntry ?? findCliEntry(cwd);\n const sandbox = sandboxBackend(cliEntry ? { cliEntry } : {});\n let corpus: Promise<DocsCorpus> | undefined;\n\n return {\n cwd,\n allowWrites,\n inspect: options.inspect,\n check: ({ changed, base, skip }) => {\n const flags = [...(changed ? [\"--changed\"] : []), ...(base ? [\"--base\", base] : [])];\n\n return runCheck({\n cwd,\n changed,\n base,\n skip,\n ...(cliEntry ? { typecheck: childTypecheckRunner(cliEntry, flags) } : {}),\n });\n },\n tests: ({ files, changed, base }) => runTests({ cwd, files, changed, base }),\n devtools: () => connectDevtools({ cwd, ...options.devtools }),\n generation: {\n plan: (spec) => sandbox.plan(spec, { cwd }),\n apply: async (spec) => {\n if (!allowWrites) {\n throw new WarlockError(\n \"WL7005\",\n \"This MCP server is read-only; restart it with --allow-writes to let generate tools write.\",\n );\n }\n\n return applyGeneration(spec, { cwd, ...(cliEntry ? { cliEntry } : {}) });\n },\n },\n docs: () => {\n corpus ??= loadDocsCorpus(cwd);\n\n return corpus;\n },\n features: options.features,\n };\n}\n"],"mappings":";;;;;;;;;;;;;AA+BA,SAAS,aAAa,KAAiC;CACrD,IAAI;EACF,OAAO,gBAAgB,GAAG;CAC5B,QAAQ;EACN;CACF;AACF;;;;;AAMA,SAAgB,iBAAiB,SAAqD;CACpF,MAAM,MAAM,KAAK,QAAQ,QAAQ,OAAO,QAAQ,IAAI,CAAC;CACrD,MAAM,cAAc,QAAQ,gBAAgB;CAC5C,MAAM,WAAW,QAAQ,YAAY,aAAa,GAAG;CACrD,MAAM,UAAU,eAAe,WAAW,EAAE,SAAS,IAAI,CAAC,CAAC;CAC3D,IAAI;CAEJ,OAAO;EACL;EACA;EACA,SAAS,QAAQ;EACjB,QAAQ,EAAE,SAAS,MAAM,WAAW;GAClC,MAAM,QAAQ,CAAC,GAAI,UAAU,CAAC,WAAW,IAAI,CAAC,GAAI,GAAI,OAAO,CAAC,UAAU,IAAI,IAAI,CAAC,CAAE;GAEnF,OAAO,SAAS;IACd;IACA;IACA;IACA;IACA,GAAI,WAAW,EAAE,WAAW,qBAAqB,UAAU,KAAK,EAAE,IAAI,CAAC;GACzE,CAAC;EACH;EACA,QAAQ,EAAE,OAAO,SAAS,WAAW,SAAS;GAAE;GAAK;GAAO;GAAS;EAAK,CAAC;EAC3E,gBAAgB,gBAAgB;GAAE;GAAK,GAAG,QAAQ;EAAS,CAAC;EAC5D,YAAY;GACV,OAAO,SAAS,QAAQ,KAAK,MAAM,EAAE,IAAI,CAAC;GAC1C,OAAO,OAAO,SAAS;IACrB,IAAI,CAAC,aACH,MAAM,IAAI,aACR,UACA,2FACF;IAGF,OAAO,gBAAgB,MAAM;KAAE;KAAK,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;IAAG,CAAC;GACzE;EACF;EACA,YAAY;GACV,WAAW,eAAe,GAAG;GAE7B,OAAO;EACT;EACA,UAAU,QAAQ;CACpB;AACF"}
@@ -0,0 +1,49 @@
1
+ import { InspectModel, JsonSchema } from "../inspect/inspect-report.types.mjs";
2
+
3
+ //#region ../../packages/core/src/tooling/mcp/db-schema.d.ts
4
+ /** One column of a {@link DbSchemaTable}. */
5
+ type DbSchemaColumn = {
6
+ name: string; /** The JSON Schema `type` (`string`, `integer`, …), `format` appended when set (`string:date-time`). */
7
+ type: string;
8
+ required: boolean;
9
+ primaryKey: boolean; /** Set when a `belongsTo` relation uses this column. */
10
+ references: {
11
+ model: string | null;
12
+ column: string | null;
13
+ } | null;
14
+ schema: JsonSchema;
15
+ };
16
+ /** One table, as the app's models declare it. */
17
+ type DbSchemaTable = {
18
+ table: string | null;
19
+ model: string;
20
+ dataSource: string | null;
21
+ sourceFile: string | null;
22
+ primaryKey: string | null;
23
+ columns: DbSchemaColumn[];
24
+ relations: InspectModel["relations"];
25
+ timestamps: {
26
+ createdAt: string | null;
27
+ updatedAt: string | null;
28
+ deletedAt: string | null;
29
+ };
30
+ deleteStrategy: string | null;
31
+ };
32
+ /** What the `db_schema` tool returns. */
33
+ type DbSchema = {
34
+ /** Where the facts come from: the models' Seal schemas, not the live database. */source: "models";
35
+ tables: DbSchemaTable[];
36
+ };
37
+ /**
38
+ * The database schema the models declare: one table per model with its
39
+ * columns (from the model's Seal `schema`), primary key, foreign keys of its
40
+ * `belongsTo` relations, relations, timestamp columns and delete strategy.
41
+ *
42
+ * Built from `inspectApp()`'s `models` section — the declared shape, which is
43
+ * what code is written against. It does not open a database connection, so
44
+ * columns that exist only in a migration are not listed.
45
+ */
46
+ declare function buildDbSchema(models: readonly InspectModel[], filter?: string): DbSchema;
47
+ //#endregion
48
+ export { DbSchema, DbSchemaColumn, DbSchemaTable, buildDbSchema };
49
+ //# sourceMappingURL=db-schema.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-schema.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/mcp/db-schema.ts"],"mappings":";;;;KAGY,cAAA;EACV,IAAA,UADwB;EAGxB,IAAA;EACA,QAAA;EACA,UAAA,WAFA;EAIA,UAAA;IAAc,KAAA;IAAsB,MAAA;EAAA;EACpC,MAAA,EAAQ,UAAU;AAAA;;KAIR,aAAA;EACV,KAAA;EACA,KAAA;EACA,UAAA;EACA,UAAA;EACA,UAAA;EACA,OAAA,EAAS,cAAA;EACT,SAAA,EAAW,YAAY;EACvB,UAAA;IAAc,SAAA;IAA0B,SAAA;IAA0B,SAAA;EAAA;EAClE,cAAA;AAAA;;KAIU,QAAA;EAL8B,kFAOxC,MAAA;EACA,MAAA,EAAQ,aAAa;AAAA;AAPP;AAIhB;;;;;;;;AAJgB,iBA+BA,aAAA,CAAc,MAAA,WAAiB,YAAA,IAAgB,MAAA,YAAkB,QAAQ"}
@@ -0,0 +1,56 @@
1
+ //#region ../../packages/core/src/tooling/mcp/db-schema.ts
2
+ function columnType(schema) {
3
+ const type = schema.type;
4
+ return `${Array.isArray(type) ? type.filter((entry) => typeof entry === "string").join("|") : typeof type === "string" ? type : "unknown"}${typeof schema.format === "string" ? `:${schema.format}` : ""}`;
5
+ }
6
+ /**
7
+ * The database schema the models declare: one table per model with its
8
+ * columns (from the model's Seal `schema`), primary key, foreign keys of its
9
+ * `belongsTo` relations, relations, timestamp columns and delete strategy.
10
+ *
11
+ * Built from `inspectApp()`'s `models` section — the declared shape, which is
12
+ * what code is written against. It does not open a database connection, so
13
+ * columns that exist only in a migration are not listed.
14
+ */
15
+ function buildDbSchema(models, filter) {
16
+ const wanted = filter?.toLowerCase();
17
+ return {
18
+ source: "models",
19
+ tables: models.filter((model) => !wanted || model.name.toLowerCase() === wanted || (model.table ?? "").toLowerCase() === wanted).map((model) => {
20
+ const foreignKeys = new Map(model.relations.filter((relation) => relation.type === "belongsTo" && relation.foreignKey).map((relation) => [relation.foreignKey, relation]));
21
+ const columns = model.columns.map((column) => {
22
+ const relation = foreignKeys.get(column.name);
23
+ return {
24
+ name: column.name,
25
+ type: columnType(column.schema),
26
+ required: column.required,
27
+ primaryKey: column.name === model.primaryKey,
28
+ references: relation ? {
29
+ model: relation.model,
30
+ column: relation.localKey ?? "id"
31
+ } : null,
32
+ schema: column.schema
33
+ };
34
+ });
35
+ return {
36
+ table: model.table,
37
+ model: model.name,
38
+ dataSource: model.dataSource,
39
+ sourceFile: model.sourceFile,
40
+ primaryKey: model.primaryKey,
41
+ columns,
42
+ relations: model.relations,
43
+ timestamps: {
44
+ createdAt: model.createdAtColumn,
45
+ updatedAt: model.updatedAtColumn,
46
+ deletedAt: model.deletedAtColumn
47
+ },
48
+ deleteStrategy: model.deleteStrategy
49
+ };
50
+ }).sort((first, second) => (first.table ?? first.model).localeCompare(second.table ?? second.model))
51
+ };
52
+ }
53
+
54
+ //#endregion
55
+ export { buildDbSchema };
56
+ //# sourceMappingURL=db-schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db-schema.mjs","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/mcp/db-schema.ts"],"sourcesContent":["import type { InspectModel, JsonSchema } from \"../inspect/inspect-report.types\";\n\n/** One column of a {@link DbSchemaTable}. */\nexport type DbSchemaColumn = {\n name: string;\n /** The JSON Schema `type` (`string`, `integer`, …), `format` appended when set (`string:date-time`). */\n type: string;\n required: boolean;\n primaryKey: boolean;\n /** Set when a `belongsTo` relation uses this column. */\n references: { model: string | null; column: string | null } | null;\n schema: JsonSchema;\n};\n\n/** One table, as the app's models declare it. */\nexport type DbSchemaTable = {\n table: string | null;\n model: string;\n dataSource: string | null;\n sourceFile: string | null;\n primaryKey: string | null;\n columns: DbSchemaColumn[];\n relations: InspectModel[\"relations\"];\n timestamps: { createdAt: string | null; updatedAt: string | null; deletedAt: string | null };\n deleteStrategy: string | null;\n};\n\n/** What the `db_schema` tool returns. */\nexport type DbSchema = {\n /** Where the facts come from: the models' Seal schemas, not the live database. */\n source: \"models\";\n tables: DbSchemaTable[];\n};\n\nfunction columnType(schema: JsonSchema): string {\n const type = schema.type;\n const name = Array.isArray(type)\n ? type.filter((entry): entry is string => typeof entry === \"string\").join(\"|\")\n : typeof type === \"string\"\n ? type\n : \"unknown\";\n const format = typeof schema.format === \"string\" ? `:${schema.format}` : \"\";\n\n return `${name}${format}`;\n}\n\n/**\n * The database schema the models declare: one table per model with its\n * columns (from the model's Seal `schema`), primary key, foreign keys of its\n * `belongsTo` relations, relations, timestamp columns and delete strategy.\n *\n * Built from `inspectApp()`'s `models` section — the declared shape, which is\n * what code is written against. It does not open a database connection, so\n * columns that exist only in a migration are not listed.\n */\nexport function buildDbSchema(models: readonly InspectModel[], filter?: string): DbSchema {\n const wanted = filter?.toLowerCase();\n\n const tables = models\n .filter(\n (model) =>\n !wanted ||\n model.name.toLowerCase() === wanted ||\n (model.table ?? \"\").toLowerCase() === wanted,\n )\n .map((model): DbSchemaTable => {\n const foreignKeys = new Map(\n model.relations\n .filter((relation) => relation.type === \"belongsTo\" && relation.foreignKey)\n .map((relation) => [relation.foreignKey, relation]),\n );\n const columns = model.columns.map((column): DbSchemaColumn => {\n const relation = foreignKeys.get(column.name);\n\n return {\n name: column.name,\n type: columnType(column.schema),\n required: column.required,\n primaryKey: column.name === model.primaryKey,\n references: relation\n ? { model: relation.model, column: relation.localKey ?? \"id\" }\n : null,\n schema: column.schema,\n };\n });\n\n return {\n table: model.table,\n model: model.name,\n dataSource: model.dataSource,\n sourceFile: model.sourceFile,\n primaryKey: model.primaryKey,\n columns,\n relations: model.relations,\n timestamps: {\n createdAt: model.createdAtColumn,\n updatedAt: model.updatedAtColumn,\n deletedAt: model.deletedAtColumn,\n },\n deleteStrategy: model.deleteStrategy,\n };\n })\n .sort((first, second) =>\n (first.table ?? first.model).localeCompare(second.table ?? second.model),\n );\n\n return { source: \"models\", tables };\n}\n"],"mappings":";AAkCA,SAAS,WAAW,QAA4B;CAC9C,MAAM,OAAO,OAAO;CAQpB,OAAO,GAPM,MAAM,QAAQ,IAAI,IAC3B,KAAK,QAAQ,UAA2B,OAAO,UAAU,QAAQ,CAAC,CAAC,KAAK,GAAG,IAC3E,OAAO,SAAS,WACd,OACA,YACS,OAAO,OAAO,WAAW,WAAW,IAAI,OAAO,WAAW;AAG3E;;;;;;;;;;AAWA,SAAgB,cAAc,QAAiC,QAA2B;CACxF,MAAM,SAAS,QAAQ,YAAY;CAkDnC,OAAO;EAAE,QAAQ;EAAU,QAhDZ,OACZ,QACE,UACC,CAAC,UACD,MAAM,KAAK,YAAY,MAAM,WAC5B,MAAM,SAAS,GAAE,CAAE,YAAY,MAAM,MAC1C,CAAC,CACA,KAAK,UAAyB;GAC7B,MAAM,cAAc,IAAI,IACtB,MAAM,UACH,QAAQ,aAAa,SAAS,SAAS,eAAe,SAAS,UAAU,CAAC,CAC1E,KAAK,aAAa,CAAC,SAAS,YAAY,QAAQ,CAAC,CACtD;GACA,MAAM,UAAU,MAAM,QAAQ,KAAK,WAA2B;IAC5D,MAAM,WAAW,YAAY,IAAI,OAAO,IAAI;IAE5C,OAAO;KACL,MAAM,OAAO;KACb,MAAM,WAAW,OAAO,MAAM;KAC9B,UAAU,OAAO;KACjB,YAAY,OAAO,SAAS,MAAM;KAClC,YAAY,WACR;MAAE,OAAO,SAAS;MAAO,QAAQ,SAAS,YAAY;KAAK,IAC3D;KACJ,QAAQ,OAAO;IACjB;GACF,CAAC;GAED,OAAO;IACL,OAAO,MAAM;IACb,OAAO,MAAM;IACb,YAAY,MAAM;IAClB,YAAY,MAAM;IAClB,YAAY,MAAM;IAClB;IACA,WAAW,MAAM;IACjB,YAAY;KACV,WAAW,MAAM;KACjB,WAAW,MAAM;KACjB,WAAW,MAAM;IACnB;IACA,gBAAgB,MAAM;GACxB;EACF,CAAC,CAAC,CACD,MAAM,OAAO,YACX,MAAM,SAAS,MAAM,MAAK,CAAE,cAAc,OAAO,SAAS,OAAO,KAAK,CAG3C;CAAE;AACpC"}
@@ -0,0 +1,72 @@
1
+ //#region ../../packages/core/src/tooling/mcp/docs-search.d.ts
2
+ /**
3
+ * Offline search over the documentation the app has INSTALLED: every
4
+ * `@warlock.js/*` package's skills (`skills/**\/*.md`), `README.md` and
5
+ * `llms.txt` / `llms-full.txt`. Nothing is fetched, so the answers match the
6
+ * versions in `node_modules`, not whatever the website documents today.
7
+ */
8
+ /** The globs, relative to the project root, that make up the corpus. */
9
+ declare const DOCS_CORPUS_GLOBS: readonly ["node_modules/@warlock.js/*/skills/**/*.md", "node_modules/@warlock.js/*/README.md", "node_modules/@warlock.js/*/llms.txt", "node_modules/@warlock.js/*/llms-full.txt"];
10
+ /** One searchable section: a file split at its markdown headings. */
11
+ type DocsSection = {
12
+ /** `@warlock.js/<name>`. */package: string; /** Project-relative POSIX path of the file. */
13
+ file: string; /** `skill`, `readme` or `llms`. */
14
+ source: "skill" | "readme" | "llms"; /** The section heading, or the file name for text before the first heading. */
15
+ heading: string; /** 1-based line where the section starts. */
16
+ line: number;
17
+ text: string;
18
+ };
19
+ /** One search hit. */
20
+ type DocsSearchHit = {
21
+ package: string;
22
+ file: string;
23
+ source: DocsSection["source"];
24
+ heading: string;
25
+ line: number;
26
+ score: number; /** The section's lines around the first match, bounded. */
27
+ excerpt: string;
28
+ };
29
+ /** The loaded corpus. */
30
+ type DocsCorpus = {
31
+ files: string[];
32
+ sections: DocsSection[];
33
+ };
34
+ /** Split markdown text into heading-delimited sections. */
35
+ declare function splitSections(text: string, meta: {
36
+ package: string;
37
+ file: string;
38
+ source: DocsSection["source"];
39
+ }): DocsSection[];
40
+ /** Load the corpus of the app at `cwd`. Unreadable files are skipped. */
41
+ declare function loadDocsCorpus(cwd: string): Promise<DocsCorpus>;
42
+ /** Lower-cased search terms of two or more characters. */
43
+ declare function searchTerms(query: string): string[];
44
+ /**
45
+ * Rank sections for a query: every term found in the heading counts 5, in the
46
+ * body 1 per occurrence (capped), and each distinct term found adds 10, so a
47
+ * section matching all terms beats one repeating a single term. Skills rank
48
+ * above READMEs above llms files on equal scores; the generated `llms-full.txt`
49
+ * repeats the skills, so it is weighted down.
50
+ */
51
+ declare function searchDocs(corpus: DocsCorpus, query: string, options?: {
52
+ limit?: number;
53
+ package?: string;
54
+ }): DocsSearchHit[];
55
+ /**
56
+ * Read one corpus file (optionally one section of it). Only files of the
57
+ * corpus can be read, so the tool never becomes a general file reader.
58
+ *
59
+ * @returns `undefined` when `file` is not in the corpus.
60
+ */
61
+ declare function readDocsFile(corpus: DocsCorpus, cwd: string, file: string, options?: {
62
+ heading?: string;
63
+ maxBytes?: number;
64
+ }): {
65
+ file: string;
66
+ heading: string | null;
67
+ text: string;
68
+ truncated: boolean;
69
+ } | undefined;
70
+ //#endregion
71
+ export { DOCS_CORPUS_GLOBS, DocsCorpus, DocsSearchHit, DocsSection, loadDocsCorpus, readDocsFile, searchDocs, searchTerms, splitSections };
72
+ //# sourceMappingURL=docs-search.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-search.d.mts","names":[],"sources":["../../../../../../../../../packages/core/src/tooling/mcp/docs-search.ts"],"mappings":";;AAYA;;;;AAKU;AAGV;AAAA,cARa,iBAAA;;KAQD,WAAA;EAEV,4BAAA,OAAA,UAIA;EAFA,IAAA,UAMA;EAJA,MAAA,+BAKI;EAHJ,OAAA,UAOU;EALV,IAAA;EACA,IAAA;AAAA;;KAIU,aAAA;EACV,OAAA;EACA,IAAA;EACA,MAAA,EAAQ,WAAW;EACnB,OAAA;EACA,IAAA;EACA,KAAA,UAEO;EAAP,OAAA;AAAA;;KAIU,UAAA;EACV,KAAA;EACA,QAAA,EAAU,WAAW;AAAA;;iBAmBP,aAAA,CACd,IAAA,UACA,IAAA;EAAQ,OAAA;EAAiB,IAAA;EAAc,MAAA,EAAQ,WAAA;AAAA,IAC9C,WAAW;;iBAoCQ,cAAA,CAAe,GAAA,WAAc,OAAO,CAAC,UAAA;;iBAwB3C,WAAA,CAAY,KAAa;;;;;;AA5D3B;AAoCd;iBAmEgB,UAAA,CACd,MAAA,EAAQ,UAAA,EACR,KAAA,UACA,OAAA;EAAW,KAAA;EAAgB,OAAA;AAAA,IAC1B,aAAa;;;;AAvEqD;AAwBrE;;iBA2GgB,YAAA,CACd,MAAA,EAAQ,UAAU,EAClB,GAAA,UACA,IAAA,UACA,OAAA;EAAW,OAAA;EAAkB,QAAA;AAAA;EAC1B,IAAA;EAAc,OAAA;EAAwB,IAAA;EAAc,SAAA;AAAA"}
@@ -0,0 +1,178 @@
1
+ import path from "node:path";
2
+ import { readFileSync } from "node:fs";
3
+ import glob from "fast-glob";
4
+
5
+ //#region ../../packages/core/src/tooling/mcp/docs-search.ts
6
+ /**
7
+ * Offline search over the documentation the app has INSTALLED: every
8
+ * `@warlock.js/*` package's skills (`skills/**\/*.md`), `README.md` and
9
+ * `llms.txt` / `llms-full.txt`. Nothing is fetched, so the answers match the
10
+ * versions in `node_modules`, not whatever the website documents today.
11
+ */
12
+ /** The globs, relative to the project root, that make up the corpus. */
13
+ const DOCS_CORPUS_GLOBS = [
14
+ "node_modules/@warlock.js/*/skills/**/*.md",
15
+ "node_modules/@warlock.js/*/README.md",
16
+ "node_modules/@warlock.js/*/llms.txt",
17
+ "node_modules/@warlock.js/*/llms-full.txt"
18
+ ];
19
+ const HEADING = /^(#{1,4})\s+(.+?)\s*#*\s*$/;
20
+ const MAX_EXCERPT = 1200;
21
+ function sourceOf(file) {
22
+ if (file.includes("/skills/")) return "skill";
23
+ return path.basename(file).toLowerCase() === "readme.md" ? "readme" : "llms";
24
+ }
25
+ function packageOf(file) {
26
+ return /node_modules\/(@warlock\.js\/[^/]+)\//.exec(file)?.[1] ?? "@warlock.js";
27
+ }
28
+ /** Split markdown text into heading-delimited sections. */
29
+ function splitSections(text, meta) {
30
+ const sections = [];
31
+ const lines = text.split(/\r?\n/);
32
+ let heading = path.basename(meta.file);
33
+ let start = 1;
34
+ let buffer = [];
35
+ let inFence = false;
36
+ const flush = () => {
37
+ const body = buffer.join("\n").trim();
38
+ if (body.length > 0) sections.push({
39
+ ...meta,
40
+ heading,
41
+ line: start,
42
+ text: body
43
+ });
44
+ };
45
+ lines.forEach((line, index) => {
46
+ if (line.trimStart().startsWith("```")) inFence = !inFence;
47
+ const match = inFence ? null : HEADING.exec(line);
48
+ if (match?.[2]) {
49
+ flush();
50
+ heading = match[2];
51
+ start = index + 1;
52
+ buffer = [line];
53
+ return;
54
+ }
55
+ buffer.push(line);
56
+ });
57
+ flush();
58
+ return sections;
59
+ }
60
+ /** Load the corpus of the app at `cwd`. Unreadable files are skipped. */
61
+ async function loadDocsCorpus(cwd) {
62
+ const files = (await glob([...DOCS_CORPUS_GLOBS], {
63
+ cwd,
64
+ onlyFiles: true,
65
+ followSymbolicLinks: true
66
+ })).sort();
67
+ const sections = [];
68
+ for (const file of files) {
69
+ let text;
70
+ try {
71
+ text = readFileSync(path.join(cwd, file), "utf8");
72
+ } catch {
73
+ continue;
74
+ }
75
+ sections.push(...splitSections(text, {
76
+ package: packageOf(file),
77
+ file,
78
+ source: sourceOf(file)
79
+ }));
80
+ }
81
+ return {
82
+ files,
83
+ sections
84
+ };
85
+ }
86
+ /** Lower-cased search terms of two or more characters. */
87
+ function searchTerms(query) {
88
+ return [...new Set(query.toLowerCase().split(/[^a-z0-9_.@/-]+/).map((term) => term.replace(/^[.\-/]+|[.\-/]+$/g, "")).filter((term) => term.length >= 2))];
89
+ }
90
+ function occurrences(haystack, needle) {
91
+ let count = 0;
92
+ let index = haystack.indexOf(needle);
93
+ while (index !== -1) {
94
+ count++;
95
+ index = haystack.indexOf(needle, index + needle.length);
96
+ }
97
+ return count;
98
+ }
99
+ function excerptOf(section, terms) {
100
+ const lines = section.text.split("\n");
101
+ const first = Math.max(0, lines.findIndex((line) => terms.some((term) => line.toLowerCase().includes(term))));
102
+ const from = Math.max(0, first - 3);
103
+ const excerpt = lines.slice(from, from + 18).join("\n");
104
+ return excerpt.length > MAX_EXCERPT ? `${excerpt.slice(0, MAX_EXCERPT)}…` : excerpt;
105
+ }
106
+ /**
107
+ * Rank sections for a query: every term found in the heading counts 5, in the
108
+ * body 1 per occurrence (capped), and each distinct term found adds 10, so a
109
+ * section matching all terms beats one repeating a single term. Skills rank
110
+ * above READMEs above llms files on equal scores; the generated `llms-full.txt`
111
+ * repeats the skills, so it is weighted down.
112
+ */
113
+ function searchDocs(corpus, query, options = {}) {
114
+ const terms = searchTerms(query);
115
+ if (terms.length === 0) return [];
116
+ const limit = options.limit ?? 8;
117
+ const sourceRank = {
118
+ skill: 0,
119
+ readme: 1,
120
+ llms: 2
121
+ };
122
+ const hits = [];
123
+ for (const section of corpus.sections) {
124
+ if (options.package && section.package !== options.package) continue;
125
+ const heading = section.heading.toLowerCase();
126
+ const body = section.text.toLowerCase();
127
+ let score = 0;
128
+ let matched = 0;
129
+ for (const term of terms) {
130
+ const inHeading = heading.includes(term);
131
+ const inBody = Math.min(occurrences(body, term), 10);
132
+ if (inHeading || inBody > 0) matched++;
133
+ score += (inHeading ? 5 : 0) + inBody;
134
+ }
135
+ if (matched === 0) continue;
136
+ score += matched * 10;
137
+ if (section.file.endsWith("llms-full.txt")) score = Math.floor(score / 2);
138
+ hits.push({
139
+ package: section.package,
140
+ file: section.file,
141
+ source: section.source,
142
+ heading: section.heading,
143
+ line: section.line,
144
+ score,
145
+ excerpt: excerptOf(section, terms)
146
+ });
147
+ }
148
+ return hits.sort((first, second) => second.score - first.score || sourceRank[first.source] - sourceRank[second.source] || first.file.localeCompare(second.file) || first.line - second.line).slice(0, limit);
149
+ }
150
+ /**
151
+ * Read one corpus file (optionally one section of it). Only files of the
152
+ * corpus can be read, so the tool never becomes a general file reader.
153
+ *
154
+ * @returns `undefined` when `file` is not in the corpus.
155
+ */
156
+ function readDocsFile(corpus, cwd, file, options = {}) {
157
+ const normalized = file.split(path.sep).join("/").replace(/^\.\//, "");
158
+ if (!corpus.files.includes(normalized)) return void 0;
159
+ let text;
160
+ if (options.heading) {
161
+ const wanted = options.heading.toLowerCase();
162
+ const section = corpus.sections.find((candidate) => candidate.file === normalized && candidate.heading.toLowerCase() === wanted);
163
+ if (!section) return void 0;
164
+ text = section.text;
165
+ } else text = readFileSync(path.join(cwd, normalized), "utf8");
166
+ const maxBytes = options.maxBytes ?? 1e5;
167
+ const truncated = text.length > maxBytes;
168
+ return {
169
+ file: normalized,
170
+ heading: options.heading ?? null,
171
+ text: truncated ? text.slice(0, maxBytes) : text,
172
+ truncated
173
+ };
174
+ }
175
+
176
+ //#endregion
177
+ export { DOCS_CORPUS_GLOBS, loadDocsCorpus, readDocsFile, searchDocs, searchTerms, splitSections };
178
+ //# sourceMappingURL=docs-search.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docs-search.mjs","names":["fg"],"sources":["../../../../../../../../../packages/core/src/tooling/mcp/docs-search.ts"],"sourcesContent":["import fg from \"fast-glob\";\nimport { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Offline search over the documentation the app has INSTALLED: every\n * `@warlock.js/*` package's skills (`skills/**\\/*.md`), `README.md` and\n * `llms.txt` / `llms-full.txt`. Nothing is fetched, so the answers match the\n * versions in `node_modules`, not whatever the website documents today.\n */\n\n/** The globs, relative to the project root, that make up the corpus. */\nexport const DOCS_CORPUS_GLOBS = [\n \"node_modules/@warlock.js/*/skills/**/*.md\",\n \"node_modules/@warlock.js/*/README.md\",\n \"node_modules/@warlock.js/*/llms.txt\",\n \"node_modules/@warlock.js/*/llms-full.txt\",\n] as const;\n\n/** One searchable section: a file split at its markdown headings. */\nexport type DocsSection = {\n /** `@warlock.js/<name>`. */\n package: string;\n /** Project-relative POSIX path of the file. */\n file: string;\n /** `skill`, `readme` or `llms`. */\n source: \"skill\" | \"readme\" | \"llms\";\n /** The section heading, or the file name for text before the first heading. */\n heading: string;\n /** 1-based line where the section starts. */\n line: number;\n text: string;\n};\n\n/** One search hit. */\nexport type DocsSearchHit = {\n package: string;\n file: string;\n source: DocsSection[\"source\"];\n heading: string;\n line: number;\n score: number;\n /** The section's lines around the first match, bounded. */\n excerpt: string;\n};\n\n/** The loaded corpus. */\nexport type DocsCorpus = {\n files: string[];\n sections: DocsSection[];\n};\n\nconst HEADING = /^(#{1,4})\\s+(.+?)\\s*#*\\s*$/;\nconst MAX_EXCERPT = 1200;\n\nfunction sourceOf(file: string): DocsSection[\"source\"] {\n if (file.includes(\"/skills/\")) return \"skill\";\n\n return path.basename(file).toLowerCase() === \"readme.md\" ? \"readme\" : \"llms\";\n}\n\nfunction packageOf(file: string): string {\n const match = /node_modules\\/(@warlock\\.js\\/[^/]+)\\//.exec(file);\n\n return match?.[1] ?? \"@warlock.js\";\n}\n\n/** Split markdown text into heading-delimited sections. */\nexport function splitSections(\n text: string,\n meta: { package: string; file: string; source: DocsSection[\"source\"] },\n): DocsSection[] {\n const sections: DocsSection[] = [];\n const lines = text.split(/\\r?\\n/);\n let heading = path.basename(meta.file);\n let start = 1;\n let buffer: string[] = [];\n let inFence = false;\n\n const flush = () => {\n const body = buffer.join(\"\\n\").trim();\n\n if (body.length > 0) sections.push({ ...meta, heading, line: start, text: body });\n };\n\n lines.forEach((line, index) => {\n if (line.trimStart().startsWith(\"```\")) inFence = !inFence;\n\n const match = inFence ? null : HEADING.exec(line);\n\n if (match?.[2]) {\n flush();\n heading = match[2];\n start = index + 1;\n buffer = [line];\n return;\n }\n\n buffer.push(line);\n });\n\n flush();\n\n return sections;\n}\n\n/** Load the corpus of the app at `cwd`. Unreadable files are skipped. */\nexport async function loadDocsCorpus(cwd: string): Promise<DocsCorpus> {\n const files = (\n await fg([...DOCS_CORPUS_GLOBS], { cwd, onlyFiles: true, followSymbolicLinks: true })\n ).sort();\n const sections: DocsSection[] = [];\n\n for (const file of files) {\n let text: string;\n\n try {\n text = readFileSync(path.join(cwd, file), \"utf8\");\n } catch {\n continue;\n }\n\n sections.push(\n ...splitSections(text, { package: packageOf(file), file, source: sourceOf(file) }),\n );\n }\n\n return { files, sections };\n}\n\n/** Lower-cased search terms of two or more characters. */\nexport function searchTerms(query: string): string[] {\n return [\n ...new Set(\n query\n .toLowerCase()\n .split(/[^a-z0-9_.@/-]+/)\n .map((term) => term.replace(/^[.\\-/]+|[.\\-/]+$/g, \"\"))\n .filter((term) => term.length >= 2),\n ),\n ];\n}\n\nfunction occurrences(haystack: string, needle: string): number {\n let count = 0;\n let index = haystack.indexOf(needle);\n\n while (index !== -1) {\n count++;\n index = haystack.indexOf(needle, index + needle.length);\n }\n\n return count;\n}\n\nfunction excerptOf(section: DocsSection, terms: readonly string[]): string {\n const lines = section.text.split(\"\\n\");\n const first = Math.max(\n 0,\n lines.findIndex((line) => terms.some((term) => line.toLowerCase().includes(term))),\n );\n const from = Math.max(0, first - 3);\n const excerpt = lines.slice(from, from + 18).join(\"\\n\");\n\n return excerpt.length > MAX_EXCERPT ? `${excerpt.slice(0, MAX_EXCERPT)}…` : excerpt;\n}\n\n/**\n * Rank sections for a query: every term found in the heading counts 5, in the\n * body 1 per occurrence (capped), and each distinct term found adds 10, so a\n * section matching all terms beats one repeating a single term. Skills rank\n * above READMEs above llms files on equal scores; the generated `llms-full.txt`\n * repeats the skills, so it is weighted down.\n */\nexport function searchDocs(\n corpus: DocsCorpus,\n query: string,\n options: { limit?: number; package?: string } = {},\n): DocsSearchHit[] {\n const terms = searchTerms(query);\n\n if (terms.length === 0) return [];\n\n const limit = options.limit ?? 8;\n const sourceRank: Record<DocsSection[\"source\"], number> = { skill: 0, readme: 1, llms: 2 };\n const hits: DocsSearchHit[] = [];\n\n for (const section of corpus.sections) {\n if (options.package && section.package !== options.package) continue;\n\n const heading = section.heading.toLowerCase();\n const body = section.text.toLowerCase();\n let score = 0;\n let matched = 0;\n\n for (const term of terms) {\n const inHeading = heading.includes(term);\n const inBody = Math.min(occurrences(body, term), 10);\n\n if (inHeading || inBody > 0) matched++;\n\n score += (inHeading ? 5 : 0) + inBody;\n }\n\n if (matched === 0) continue;\n\n score += matched * 10;\n\n if (section.file.endsWith(\"llms-full.txt\")) score = Math.floor(score / 2);\n\n hits.push({\n package: section.package,\n file: section.file,\n source: section.source,\n heading: section.heading,\n line: section.line,\n score,\n excerpt: excerptOf(section, terms),\n });\n }\n\n return hits\n .sort(\n (first, second) =>\n second.score - first.score ||\n sourceRank[first.source] - sourceRank[second.source] ||\n first.file.localeCompare(second.file) ||\n first.line - second.line,\n )\n .slice(0, limit);\n}\n\n/**\n * Read one corpus file (optionally one section of it). Only files of the\n * corpus can be read, so the tool never becomes a general file reader.\n *\n * @returns `undefined` when `file` is not in the corpus.\n */\nexport function readDocsFile(\n corpus: DocsCorpus,\n cwd: string,\n file: string,\n options: { heading?: string; maxBytes?: number } = {},\n): { file: string; heading: string | null; text: string; truncated: boolean } | undefined {\n const normalized = file.split(path.sep).join(\"/\").replace(/^\\.\\//, \"\");\n\n if (!corpus.files.includes(normalized)) return undefined;\n\n let text: string;\n\n if (options.heading) {\n const wanted = options.heading.toLowerCase();\n const section = corpus.sections.find(\n (candidate) => candidate.file === normalized && candidate.heading.toLowerCase() === wanted,\n );\n\n if (!section) return undefined;\n\n text = section.text;\n } else {\n text = readFileSync(path.join(cwd, normalized), \"utf8\");\n }\n\n const maxBytes = options.maxBytes ?? 100_000;\n const truncated = text.length > maxBytes;\n\n return {\n file: normalized,\n heading: options.heading ?? null,\n text: truncated ? text.slice(0, maxBytes) : text,\n truncated,\n };\n}\n"],"mappings":";;;;;;;;;;;;AAYA,MAAa,oBAAoB;CAC/B;CACA;CACA;CACA;AACF;AAmCA,MAAM,UAAU;AAChB,MAAM,cAAc;AAEpB,SAAS,SAAS,MAAqC;CACrD,IAAI,KAAK,SAAS,UAAU,GAAG,OAAO;CAEtC,OAAO,KAAK,SAAS,IAAI,CAAC,CAAC,YAAY,MAAM,cAAc,WAAW;AACxE;AAEA,SAAS,UAAU,MAAsB;CAGvC,OAFc,wCAAwC,KAAK,IAEhD,CAAC,GAAG,MAAM;AACvB;;AAGA,SAAgB,cACd,MACA,MACe;CACf,MAAM,WAA0B,CAAC;CACjC,MAAM,QAAQ,KAAK,MAAM,OAAO;CAChC,IAAI,UAAU,KAAK,SAAS,KAAK,IAAI;CACrC,IAAI,QAAQ;CACZ,IAAI,SAAmB,CAAC;CACxB,IAAI,UAAU;CAEd,MAAM,cAAc;EAClB,MAAM,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,KAAK;EAEpC,IAAI,KAAK,SAAS,GAAG,SAAS,KAAK;GAAE,GAAG;GAAM;GAAS,MAAM;GAAO,MAAM;EAAK,CAAC;CAClF;CAEA,MAAM,SAAS,MAAM,UAAU;EAC7B,IAAI,KAAK,UAAU,CAAC,CAAC,WAAW,KAAK,GAAG,UAAU,CAAC;EAEnD,MAAM,QAAQ,UAAU,OAAO,QAAQ,KAAK,IAAI;EAEhD,IAAI,QAAQ,IAAI;GACd,MAAM;GACN,UAAU,MAAM;GAChB,QAAQ,QAAQ;GAChB,SAAS,CAAC,IAAI;GACd;EACF;EAEA,OAAO,KAAK,IAAI;CAClB,CAAC;CAED,MAAM;CAEN,OAAO;AACT;;AAGA,eAAsB,eAAe,KAAkC;CACrE,MAAM,SACJ,MAAMA,KAAG,CAAC,GAAG,iBAAiB,GAAG;EAAE;EAAK,WAAW;EAAM,qBAAqB;CAAK,CAAC,EAAC,CACrF,KAAK;CACP,MAAM,WAA0B,CAAC;CAEjC,KAAK,MAAM,QAAQ,OAAO;EACxB,IAAI;EAEJ,IAAI;GACF,OAAO,aAAa,KAAK,KAAK,KAAK,IAAI,GAAG,MAAM;EAClD,QAAQ;GACN;EACF;EAEA,SAAS,KACP,GAAG,cAAc,MAAM;GAAE,SAAS,UAAU,IAAI;GAAG;GAAM,QAAQ,SAAS,IAAI;EAAE,CAAC,CACnF;CACF;CAEA,OAAO;EAAE;EAAO;CAAS;AAC3B;;AAGA,SAAgB,YAAY,OAAyB;CACnD,OAAO,CACL,GAAG,IAAI,IACL,MACG,YAAY,CAAC,CACb,MAAM,iBAAiB,CAAC,CACxB,KAAK,SAAS,KAAK,QAAQ,sBAAsB,EAAE,CAAC,CAAC,CACrD,QAAQ,SAAS,KAAK,UAAU,CAAC,CACtC,CACF;AACF;AAEA,SAAS,YAAY,UAAkB,QAAwB;CAC7D,IAAI,QAAQ;CACZ,IAAI,QAAQ,SAAS,QAAQ,MAAM;CAEnC,OAAO,UAAU,IAAI;EACnB;EACA,QAAQ,SAAS,QAAQ,QAAQ,QAAQ,OAAO,MAAM;CACxD;CAEA,OAAO;AACT;AAEA,SAAS,UAAU,SAAsB,OAAkC;CACzE,MAAM,QAAQ,QAAQ,KAAK,MAAM,IAAI;CACrC,MAAM,QAAQ,KAAK,IACjB,GACA,MAAM,WAAW,SAAS,MAAM,MAAM,SAAS,KAAK,YAAY,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CACnF;CACA,MAAM,OAAO,KAAK,IAAI,GAAG,QAAQ,CAAC;CAClC,MAAM,UAAU,MAAM,MAAM,MAAM,OAAO,EAAE,CAAC,CAAC,KAAK,IAAI;CAEtD,OAAO,QAAQ,SAAS,cAAc,GAAG,QAAQ,MAAM,GAAG,WAAW,EAAE,KAAK;AAC9E;;;;;;;;AASA,SAAgB,WACd,QACA,OACA,UAAgD,CAAC,GAChC;CACjB,MAAM,QAAQ,YAAY,KAAK;CAE/B,IAAI,MAAM,WAAW,GAAG,OAAO,CAAC;CAEhC,MAAM,QAAQ,QAAQ,SAAS;CAC/B,MAAM,aAAoD;EAAE,OAAO;EAAG,QAAQ;EAAG,MAAM;CAAE;CACzF,MAAM,OAAwB,CAAC;CAE/B,KAAK,MAAM,WAAW,OAAO,UAAU;EACrC,IAAI,QAAQ,WAAW,QAAQ,YAAY,QAAQ,SAAS;EAE5D,MAAM,UAAU,QAAQ,QAAQ,YAAY;EAC5C,MAAM,OAAO,QAAQ,KAAK,YAAY;EACtC,IAAI,QAAQ;EACZ,IAAI,UAAU;EAEd,KAAK,MAAM,QAAQ,OAAO;GACxB,MAAM,YAAY,QAAQ,SAAS,IAAI;GACvC,MAAM,SAAS,KAAK,IAAI,YAAY,MAAM,IAAI,GAAG,EAAE;GAEnD,IAAI,aAAa,SAAS,GAAG;GAE7B,UAAU,YAAY,IAAI,KAAK;EACjC;EAEA,IAAI,YAAY,GAAG;EAEnB,SAAS,UAAU;EAEnB,IAAI,QAAQ,KAAK,SAAS,eAAe,GAAG,QAAQ,KAAK,MAAM,QAAQ,CAAC;EAExE,KAAK,KAAK;GACR,SAAS,QAAQ;GACjB,MAAM,QAAQ;GACd,QAAQ,QAAQ;GAChB,SAAS,QAAQ;GACjB,MAAM,QAAQ;GACd;GACA,SAAS,UAAU,SAAS,KAAK;EACnC,CAAC;CACH;CAEA,OAAO,KACJ,MACE,OAAO,WACN,OAAO,QAAQ,MAAM,SACrB,WAAW,MAAM,UAAU,WAAW,OAAO,WAC7C,MAAM,KAAK,cAAc,OAAO,IAAI,KACpC,MAAM,OAAO,OAAO,IACxB,CAAC,CACA,MAAM,GAAG,KAAK;AACnB;;;;;;;AAQA,SAAgB,aACd,QACA,KACA,MACA,UAAmD,CAAC,GACoC;CACxF,MAAM,aAAa,KAAK,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE;CAErE,IAAI,CAAC,OAAO,MAAM,SAAS,UAAU,GAAG,OAAO;CAE/C,IAAI;CAEJ,IAAI,QAAQ,SAAS;EACnB,MAAM,SAAS,QAAQ,QAAQ,YAAY;EAC3C,MAAM,UAAU,OAAO,SAAS,MAC7B,cAAc,UAAU,SAAS,cAAc,UAAU,QAAQ,YAAY,MAAM,MACtF;EAEA,IAAI,CAAC,SAAS,OAAO;EAErB,OAAO,QAAQ;CACjB,OACE,OAAO,aAAa,KAAK,KAAK,KAAK,UAAU,GAAG,MAAM;CAGxD,MAAM,WAAW,QAAQ,YAAY;CACrC,MAAM,YAAY,KAAK,SAAS;CAEhC,OAAO;EACL,MAAM;EACN,SAAS,QAAQ,WAAW;EAC5B,MAAM,YAAY,KAAK,MAAM,GAAG,QAAQ,IAAI;EAC5C;CACF;AACF"}
@@ -0,0 +1,9 @@
1
+ import { DOCS_CORPUS_GLOBS, loadDocsCorpus, readDocsFile, searchDocs, searchTerms, splitSections } from "./docs-search.mjs";
2
+ import { createMcpContext } from "./create-mcp-context.mjs";
3
+ import { MCP_INSTALL_HINT, isAiToolsServeModule, loadAiToolsServe } from "./load-ai-tools.mjs";
4
+ import { buildDbSchema } from "./db-schema.mjs";
5
+ import { inputSchema, toStandardSchema, validateToolInput } from "./tool-input.mjs";
6
+ import { MCP_MAKE_GENERATORS, createWarlockMcpTools, describeToolError, makeSpecFromInput } from "./mcp-tools.mjs";
7
+ import { isLoopbackHost, resolveMcpTransport, startWarlockMcpServer, toServeContract } from "./start-mcp-server.mjs";
8
+
9
+ export { };
@@ -0,0 +1,62 @@
1
+ //#region ../../packages/core/src/tooling/mcp/load-ai-tools.d.ts
2
+ /** The install line printed when the MCP transport packages are missing. */
3
+ declare const MCP_INSTALL_HINT = "npm install -D @warlock.js/ai-tools @warlock.js/ai";
4
+ /** The tool shape `ai.mcp.serve` consumes, built structurally (see `@warlock.js/ai`'s `ToolContract`). */
5
+ type ServeToolContract = {
6
+ name: string;
7
+ description: string;
8
+ input: unknown;
9
+ execute(input: Record<string, unknown>): Promise<unknown>;
10
+ invoke(raw: unknown, context?: unknown): Promise<{
11
+ data?: unknown;
12
+ error?: Error;
13
+ usage: {
14
+ input: number;
15
+ output: number;
16
+ total: number;
17
+ };
18
+ report: Record<string, unknown>;
19
+ }>;
20
+ };
21
+ /** The transport options of `ai.mcp.serve` this command uses. */
22
+ type ServeTransportOptions = {
23
+ type: "stdio";
24
+ } | {
25
+ type: "http";
26
+ host: string;
27
+ port: number;
28
+ path: string;
29
+ auth?: {
30
+ bearer: string;
31
+ };
32
+ };
33
+ /** The handle `start()` resolves. */
34
+ type ServeHandle = {
35
+ url?: string;
36
+ close(): Promise<void>;
37
+ };
38
+ /** The slice of `@warlock.js/ai-tools` this command calls. */
39
+ type AiToolsServeModule = {
40
+ serve(tools: ServeToolContract[], options: {
41
+ name: string;
42
+ version?: string;
43
+ transport: ServeTransportOptions;
44
+ }): {
45
+ start(): Promise<ServeHandle>;
46
+ stop(): Promise<void>;
47
+ };
48
+ };
49
+ /** Whether a loaded module exposes `serve()`. */
50
+ declare function isAiToolsServeModule(value: unknown): value is AiToolsServeModule;
51
+ /**
52
+ * Import `@warlock.js/ai-tools` lazily — it is an optional peer, so a project
53
+ * that never runs `warlock mcp` does not need it. Tries core's own resolution
54
+ * first (pnpm links installed peers next to core), then the app's.
55
+ *
56
+ * Throws `WL7003` with the install line when it (or `@warlock.js/ai`, which
57
+ * it imports) is missing.
58
+ */
59
+ declare function loadAiToolsServe(cwd: string, importer?: (specifier: string) => Promise<unknown>): Promise<AiToolsServeModule>;
60
+ //#endregion
61
+ export { AiToolsServeModule, MCP_INSTALL_HINT, ServeToolContract, ServeTransportOptions, isAiToolsServeModule, loadAiToolsServe };
62
+ //# sourceMappingURL=load-ai-tools.d.mts.map