@warlock.js/core 4.4.0 → 4.6.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 (997) hide show
  1. package/CHANGELOG.md +72 -5
  2. package/README.md +47 -11
  3. package/esm/ai/src/agent/agent-input-builder.mjs +132 -0
  4. package/esm/ai/src/agent/agent-input-builder.mjs.map +1 -0
  5. package/esm/ai/src/agent/agent-log-event.mjs +101 -0
  6. package/esm/ai/src/agent/agent-log-event.mjs.map +1 -0
  7. package/esm/ai/src/agent/agent-stream.mjs +82 -0
  8. package/esm/ai/src/agent/agent-stream.mjs.map +1 -0
  9. package/esm/ai/src/agent/agent-to-stream-event.mjs +86 -0
  10. package/esm/ai/src/agent/agent-to-stream-event.mjs.map +1 -0
  11. package/esm/ai/src/agent/agent.mjs +1276 -0
  12. package/esm/ai/src/agent/agent.mjs.map +1 -0
  13. package/esm/ai/src/agent/index.mjs +5 -0
  14. package/esm/ai/src/agent/json-stream-guard.mjs +400 -0
  15. package/esm/ai/src/agent/json-stream-guard.mjs.map +1 -0
  16. package/esm/ai/src/agent/signature.mjs +57 -0
  17. package/esm/ai/src/agent/signature.mjs.map +1 -0
  18. package/esm/ai/src/agent/snapshot.mjs +101 -0
  19. package/esm/ai/src/agent/snapshot.mjs.map +1 -0
  20. package/esm/ai/src/agent/spawn-sub-agent.mjs +68 -0
  21. package/esm/ai/src/agent/spawn-sub-agent.mjs.map +1 -0
  22. package/esm/ai/src/ai.mjs +191 -0
  23. package/esm/ai/src/ai.mjs.map +1 -0
  24. package/esm/ai/src/batch/batch.mjs +198 -0
  25. package/esm/ai/src/batch/batch.mjs.map +1 -0
  26. package/esm/ai/src/batch/index.mjs +3 -0
  27. package/esm/ai/src/batch/run-batch-item.mjs +100 -0
  28. package/esm/ai/src/batch/run-batch-item.mjs.map +1 -0
  29. package/esm/ai/src/batch/run-with-concurrency.mjs +39 -0
  30. package/esm/ai/src/batch/run-with-concurrency.mjs.map +1 -0
  31. package/esm/ai/src/checkpoint/memory.mjs +0 -0
  32. package/esm/ai/src/checkpoint/memory.mjs.map +1 -0
  33. package/esm/ai/src/checkpoint/pg.mjs +265 -0
  34. package/esm/ai/src/checkpoint/pg.mjs.map +1 -0
  35. package/esm/ai/src/checkpoint/redis.mjs +200 -0
  36. package/esm/ai/src/checkpoint/redis.mjs.map +1 -0
  37. package/esm/ai/src/config.mjs +59 -0
  38. package/esm/ai/src/config.mjs.map +1 -0
  39. package/esm/ai/src/contracts/end.type.mjs +47 -0
  40. package/esm/ai/src/contracts/end.type.mjs.map +1 -0
  41. package/esm/ai/src/errors/agent-cancelled-error.mjs +43 -0
  42. package/esm/ai/src/errors/agent-cancelled-error.mjs.map +1 -0
  43. package/esm/ai/src/errors/agent-drift-error.mjs +31 -0
  44. package/esm/ai/src/errors/agent-drift-error.mjs.map +1 -0
  45. package/esm/ai/src/errors/agent-execution-error.mjs +35 -0
  46. package/esm/ai/src/errors/agent-execution-error.mjs.map +1 -0
  47. package/esm/ai/src/errors/agent-max-trips-error.mjs +41 -0
  48. package/esm/ai/src/errors/agent-max-trips-error.mjs.map +1 -0
  49. package/esm/ai/src/errors/ai-error.mjs +68 -0
  50. package/esm/ai/src/errors/ai-error.mjs.map +1 -0
  51. package/esm/ai/src/errors/budget-exceeded-error.mjs +31 -0
  52. package/esm/ai/src/errors/budget-exceeded-error.mjs.map +1 -0
  53. package/esm/ai/src/errors/content-filter-error.mjs +28 -0
  54. package/esm/ai/src/errors/content-filter-error.mjs.map +1 -0
  55. package/esm/ai/src/errors/context-length-exceeded-error.mjs +31 -0
  56. package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +1 -0
  57. package/esm/ai/src/errors/guardrail-violation-error.mjs +41 -0
  58. package/esm/ai/src/errors/guardrail-violation-error.mjs.map +1 -0
  59. package/esm/ai/src/errors/index.mjs +39 -0
  60. package/esm/ai/src/errors/invalid-request-error.mjs +31 -0
  61. package/esm/ai/src/errors/invalid-request-error.mjs.map +1 -0
  62. package/esm/ai/src/errors/max-iterations-error.mjs +32 -0
  63. package/esm/ai/src/errors/max-iterations-error.mjs.map +1 -0
  64. package/esm/ai/src/errors/max-steps-exceeded-error.mjs +21 -0
  65. package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +1 -0
  66. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +31 -0
  67. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +1 -0
  68. package/esm/ai/src/errors/orchestrator-config-error.mjs +30 -0
  69. package/esm/ai/src/errors/orchestrator-config-error.mjs.map +1 -0
  70. package/esm/ai/src/errors/orchestrator-drift-error.mjs +37 -0
  71. package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +1 -0
  72. package/esm/ai/src/errors/orchestrator-failed-error.mjs +36 -0
  73. package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +1 -0
  74. package/esm/ai/src/errors/outbound-policy-error.mjs +32 -0
  75. package/esm/ai/src/errors/outbound-policy-error.mjs.map +1 -0
  76. package/esm/ai/src/errors/planner-cancelled-error.mjs +29 -0
  77. package/esm/ai/src/errors/planner-cancelled-error.mjs.map +1 -0
  78. package/esm/ai/src/errors/planner-drift-error.mjs +33 -0
  79. package/esm/ai/src/errors/planner-drift-error.mjs.map +1 -0
  80. package/esm/ai/src/errors/planner-failed-error.mjs +37 -0
  81. package/esm/ai/src/errors/planner-failed-error.mjs.map +1 -0
  82. package/esm/ai/src/errors/planner-plan-invalid-error.mjs +25 -0
  83. package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +1 -0
  84. package/esm/ai/src/errors/provider-auth-error.mjs +26 -0
  85. package/esm/ai/src/errors/provider-auth-error.mjs.map +1 -0
  86. package/esm/ai/src/errors/provider-error.mjs +42 -0
  87. package/esm/ai/src/errors/provider-error.mjs.map +1 -0
  88. package/esm/ai/src/errors/provider-rate-limit-error.mjs +31 -0
  89. package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +1 -0
  90. package/esm/ai/src/errors/provider-timeout-error.mjs +26 -0
  91. package/esm/ai/src/errors/provider-timeout-error.mjs.map +1 -0
  92. package/esm/ai/src/errors/quota-exceeded-error.mjs +40 -0
  93. package/esm/ai/src/errors/quota-exceeded-error.mjs.map +1 -0
  94. package/esm/ai/src/errors/routing-error.mjs +23 -0
  95. package/esm/ai/src/errors/routing-error.mjs.map +1 -0
  96. package/esm/ai/src/errors/schema-validation-error.mjs +37 -0
  97. package/esm/ai/src/errors/schema-validation-error.mjs.map +1 -0
  98. package/esm/ai/src/errors/step-failed-error.mjs +19 -0
  99. package/esm/ai/src/errors/step-failed-error.mjs.map +1 -0
  100. package/esm/ai/src/errors/supervisor-cancelled-error.mjs +29 -0
  101. package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +1 -0
  102. package/esm/ai/src/errors/supervisor-drift-error.mjs +30 -0
  103. package/esm/ai/src/errors/supervisor-drift-error.mjs.map +1 -0
  104. package/esm/ai/src/errors/supervisor-failed-error.mjs +43 -0
  105. package/esm/ai/src/errors/supervisor-failed-error.mjs.map +1 -0
  106. package/esm/ai/src/errors/supervisor-routing-error.mjs +39 -0
  107. package/esm/ai/src/errors/supervisor-routing-error.mjs.map +1 -0
  108. package/esm/ai/src/errors/tool-execution-error.mjs +32 -0
  109. package/esm/ai/src/errors/tool-execution-error.mjs.map +1 -0
  110. package/esm/ai/src/errors/workflow-cancelled-error.mjs +23 -0
  111. package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +1 -0
  112. package/esm/ai/src/errors/workflow-drift-error.mjs +24 -0
  113. package/esm/ai/src/errors/workflow-drift-error.mjs.map +1 -0
  114. package/esm/ai/src/errors/workflow-error.mjs +18 -0
  115. package/esm/ai/src/errors/workflow-error.mjs.map +1 -0
  116. package/esm/ai/src/eval/dataset.mjs +112 -0
  117. package/esm/ai/src/eval/dataset.mjs.map +1 -0
  118. package/esm/ai/src/eval/eval-runner.mjs +135 -0
  119. package/esm/ai/src/eval/eval-runner.mjs.map +1 -0
  120. package/esm/ai/src/eval/index.mjs +48 -0
  121. package/esm/ai/src/eval/index.mjs.map +1 -0
  122. package/esm/ai/src/eval/judge-scorer.mjs +87 -0
  123. package/esm/ai/src/eval/judge-scorer.mjs.map +1 -0
  124. package/esm/ai/src/eval/regression.mjs +51 -0
  125. package/esm/ai/src/eval/regression.mjs.map +1 -0
  126. package/esm/ai/src/eval/report-json.mjs +33 -0
  127. package/esm/ai/src/eval/report-json.mjs.map +1 -0
  128. package/esm/ai/src/eval/report-junit.mjs +60 -0
  129. package/esm/ai/src/eval/report-junit.mjs.map +1 -0
  130. package/esm/ai/src/eval/scorers.mjs +101 -0
  131. package/esm/ai/src/eval/scorers.mjs.map +1 -0
  132. package/esm/ai/src/guard/detectors/index.mjs +6 -0
  133. package/esm/ai/src/guard/detectors/injection.mjs +254 -0
  134. package/esm/ai/src/guard/detectors/injection.mjs.map +1 -0
  135. package/esm/ai/src/guard/detectors/moderation.mjs +134 -0
  136. package/esm/ai/src/guard/detectors/moderation.mjs.map +1 -0
  137. package/esm/ai/src/guard/detectors/pii.mjs +199 -0
  138. package/esm/ai/src/guard/detectors/pii.mjs.map +1 -0
  139. package/esm/ai/src/guard/detectors/topic.mjs +99 -0
  140. package/esm/ai/src/guard/detectors/topic.mjs.map +1 -0
  141. package/esm/ai/src/guard/errors.mjs +18 -0
  142. package/esm/ai/src/guard/errors.mjs.map +1 -0
  143. package/esm/ai/src/guard/guard.mjs +209 -0
  144. package/esm/ai/src/guard/guard.mjs.map +1 -0
  145. package/esm/ai/src/guard/guardrail.mjs +22 -0
  146. package/esm/ai/src/guard/guardrail.mjs.map +1 -0
  147. package/esm/ai/src/human/errors.mjs +60 -0
  148. package/esm/ai/src/human/errors.mjs.map +1 -0
  149. package/esm/ai/src/human/human-approval.mjs +170 -0
  150. package/esm/ai/src/human/human-approval.mjs.map +1 -0
  151. package/esm/ai/src/human/policy.mjs +67 -0
  152. package/esm/ai/src/human/policy.mjs.map +1 -0
  153. package/esm/ai/src/human/register.mjs +37 -0
  154. package/esm/ai/src/human/register.mjs.map +1 -0
  155. package/esm/ai/src/human/resume-seed.mjs +53 -0
  156. package/esm/ai/src/human/resume-seed.mjs.map +1 -0
  157. package/esm/ai/src/human/resume.mjs +121 -0
  158. package/esm/ai/src/human/resume.mjs.map +1 -0
  159. package/esm/ai/src/human/stores/index.mjs +5 -0
  160. package/esm/ai/src/human/stores/memory.mjs +91 -0
  161. package/esm/ai/src/human/stores/memory.mjs.map +1 -0
  162. package/esm/ai/src/human/stores/pg.mjs +220 -0
  163. package/esm/ai/src/human/stores/pg.mjs.map +1 -0
  164. package/esm/ai/src/human/stores/redis.mjs +201 -0
  165. package/esm/ai/src/human/stores/redis.mjs.map +1 -0
  166. package/esm/ai/src/image/image-cost.mjs +55 -0
  167. package/esm/ai/src/image/image-cost.mjs.map +1 -0
  168. package/esm/ai/src/image/image.mjs +112 -0
  169. package/esm/ai/src/image/image.mjs.map +1 -0
  170. package/esm/ai/src/image/index.mjs +4 -0
  171. package/esm/ai/src/index.mjs +194 -0
  172. package/esm/ai/src/memory/derive-id.mjs +24 -0
  173. package/esm/ai/src/memory/derive-id.mjs.map +1 -0
  174. package/esm/ai/src/memory/episodic-memory.mjs +106 -0
  175. package/esm/ai/src/memory/episodic-memory.mjs.map +1 -0
  176. package/esm/ai/src/memory/memory.mjs +166 -0
  177. package/esm/ai/src/memory/memory.mjs.map +1 -0
  178. package/esm/ai/src/memory/procedural-memory.mjs +103 -0
  179. package/esm/ai/src/memory/procedural-memory.mjs.map +1 -0
  180. package/esm/ai/src/memory/semantic-memory.mjs +80 -0
  181. package/esm/ai/src/memory/semantic-memory.mjs.map +1 -0
  182. package/esm/ai/src/memory/working-memory.mjs +62 -0
  183. package/esm/ai/src/memory/working-memory.mjs.map +1 -0
  184. package/esm/ai/src/middleware/builtins/budget.mjs +219 -0
  185. package/esm/ai/src/middleware/builtins/budget.mjs.map +1 -0
  186. package/esm/ai/src/middleware/builtins/guardrail.mjs +76 -0
  187. package/esm/ai/src/middleware/builtins/guardrail.mjs.map +1 -0
  188. package/esm/ai/src/middleware/builtins/semantic-cache.mjs +149 -0
  189. package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +1 -0
  190. package/esm/ai/src/middleware/helpers/compose.mjs +52 -0
  191. package/esm/ai/src/middleware/helpers/compose.mjs.map +1 -0
  192. package/esm/ai/src/middleware/helpers/for-tool.mjs +80 -0
  193. package/esm/ai/src/middleware/helpers/for-tool.mjs.map +1 -0
  194. package/esm/ai/src/middleware/index.mjs +10 -0
  195. package/esm/ai/src/middleware/pipeline.mjs +100 -0
  196. package/esm/ai/src/middleware/pipeline.mjs.map +1 -0
  197. package/esm/ai/src/middleware/utils/extract-user-text.mjs +47 -0
  198. package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +1 -0
  199. package/esm/ai/src/middleware/utils/namespaced-state.mjs +60 -0
  200. package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +1 -0
  201. package/esm/ai/src/mock/index.mjs +4 -0
  202. package/esm/ai/src/mock/mock-agent.mjs +3 -0
  203. package/esm/ai/src/mock/mock-router.mjs +58 -0
  204. package/esm/ai/src/mock/mock-router.mjs.map +1 -0
  205. package/esm/ai/src/model/fallback-model.mjs +218 -0
  206. package/esm/ai/src/model/fallback-model.mjs.map +1 -0
  207. package/esm/ai/src/model/index.mjs +3 -0
  208. package/esm/ai/src/object-stream/index.mjs +4 -0
  209. package/esm/ai/src/object-stream/parse-partial-json.mjs +78 -0
  210. package/esm/ai/src/object-stream/parse-partial-json.mjs.map +1 -0
  211. package/esm/ai/src/object-stream/stream-object.mjs +97 -0
  212. package/esm/ai/src/object-stream/stream-object.mjs.map +1 -0
  213. package/esm/ai/src/observe/index.mjs +4 -0
  214. package/esm/ai/src/observe/observer-registry.mjs +35 -0
  215. package/esm/ai/src/observe/observer-registry.mjs.map +1 -0
  216. package/esm/ai/src/observe/resolve-observers.mjs +73 -0
  217. package/esm/ai/src/observe/resolve-observers.mjs.map +1 -0
  218. package/esm/ai/src/orchestrator/as-tool.mjs +98 -0
  219. package/esm/ai/src/orchestrator/as-tool.mjs.map +1 -0
  220. package/esm/ai/src/orchestrator/checkpoint.mjs +75 -0
  221. package/esm/ai/src/orchestrator/checkpoint.mjs.map +1 -0
  222. package/esm/ai/src/orchestrator/commands.mjs +34 -0
  223. package/esm/ai/src/orchestrator/commands.mjs.map +1 -0
  224. package/esm/ai/src/orchestrator/compaction.mjs +206 -0
  225. package/esm/ai/src/orchestrator/compaction.mjs.map +1 -0
  226. package/esm/ai/src/orchestrator/dispatch.mjs +171 -0
  227. package/esm/ai/src/orchestrator/dispatch.mjs.map +1 -0
  228. package/esm/ai/src/orchestrator/emitter.mjs +85 -0
  229. package/esm/ai/src/orchestrator/emitter.mjs.map +1 -0
  230. package/esm/ai/src/orchestrator/execution.mjs +395 -0
  231. package/esm/ai/src/orchestrator/execution.mjs.map +1 -0
  232. package/esm/ai/src/orchestrator/index.mjs +11 -0
  233. package/esm/ai/src/orchestrator/load.mjs +49 -0
  234. package/esm/ai/src/orchestrator/load.mjs.map +1 -0
  235. package/esm/ai/src/orchestrator/lock.mjs +75 -0
  236. package/esm/ai/src/orchestrator/lock.mjs.map +1 -0
  237. package/esm/ai/src/orchestrator/memory.mjs +141 -0
  238. package/esm/ai/src/orchestrator/memory.mjs.map +1 -0
  239. package/esm/ai/src/orchestrator/orchestrator-stream.mjs +98 -0
  240. package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +1 -0
  241. package/esm/ai/src/orchestrator/orchestrator.mjs +206 -0
  242. package/esm/ai/src/orchestrator/orchestrator.mjs.map +1 -0
  243. package/esm/ai/src/orchestrator/resume.mjs +74 -0
  244. package/esm/ai/src/orchestrator/resume.mjs.map +1 -0
  245. package/esm/ai/src/orchestrator/session-lock.mjs +83 -0
  246. package/esm/ai/src/orchestrator/session-lock.mjs.map +1 -0
  247. package/esm/ai/src/orchestrator/signature.mjs +120 -0
  248. package/esm/ai/src/orchestrator/signature.mjs.map +1 -0
  249. package/esm/ai/src/orchestrator/window.mjs +56 -0
  250. package/esm/ai/src/orchestrator/window.mjs.map +1 -0
  251. package/esm/ai/src/planner/dag-scheduler.mjs +97 -0
  252. package/esm/ai/src/planner/dag-scheduler.mjs.map +1 -0
  253. package/esm/ai/src/planner/index.mjs +6 -0
  254. package/esm/ai/src/planner/plan-prompt.mjs +31 -0
  255. package/esm/ai/src/planner/plan-prompt.mjs.map +1 -0
  256. package/esm/ai/src/planner/plan-schema.mjs +120 -0
  257. package/esm/ai/src/planner/plan-schema.mjs.map +1 -0
  258. package/esm/ai/src/planner/planner-run.mjs +769 -0
  259. package/esm/ai/src/planner/planner-run.mjs.map +1 -0
  260. package/esm/ai/src/planner/planner.mjs +144 -0
  261. package/esm/ai/src/planner/planner.mjs.map +1 -0
  262. package/esm/ai/src/planner/signature.mjs +27 -0
  263. package/esm/ai/src/planner/signature.mjs.map +1 -0
  264. package/esm/ai/src/planner/snapshot.mjs +95 -0
  265. package/esm/ai/src/planner/snapshot.mjs.map +1 -0
  266. package/esm/ai/src/prompt/errors.mjs +73 -0
  267. package/esm/ai/src/prompt/errors.mjs.map +1 -0
  268. package/esm/ai/src/prompt/index.mjs +4 -0
  269. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +104 -0
  270. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +1 -0
  271. package/esm/ai/src/prompt/prompt-validate.mjs +170 -0
  272. package/esm/ai/src/prompt/prompt-validate.mjs.map +1 -0
  273. package/esm/ai/src/prompt/prompt.mjs +218 -0
  274. package/esm/ai/src/prompt/prompt.mjs.map +1 -0
  275. package/esm/ai/src/prompts/index.mjs +3 -0
  276. package/esm/ai/src/prompts/prompts-manager.mjs +410 -0
  277. package/esm/ai/src/prompts/prompts-manager.mjs.map +1 -0
  278. package/esm/ai/src/prompts/prompts-validate.mjs +200 -0
  279. package/esm/ai/src/prompts/prompts-validate.mjs.map +1 -0
  280. package/esm/ai/src/rag/as-tool.mjs +48 -0
  281. package/esm/ai/src/rag/as-tool.mjs.map +1 -0
  282. package/esm/ai/src/rag/chunk/chunk.mjs +44 -0
  283. package/esm/ai/src/rag/chunk/chunk.mjs.map +1 -0
  284. package/esm/ai/src/rag/chunk/fixed.mjs +32 -0
  285. package/esm/ai/src/rag/chunk/fixed.mjs.map +1 -0
  286. package/esm/ai/src/rag/chunk/markdown.mjs +75 -0
  287. package/esm/ai/src/rag/chunk/markdown.mjs.map +1 -0
  288. package/esm/ai/src/rag/chunk/recursive.mjs +132 -0
  289. package/esm/ai/src/rag/chunk/recursive.mjs.map +1 -0
  290. package/esm/ai/src/rag/chunk/sentence.mjs +73 -0
  291. package/esm/ai/src/rag/chunk/sentence.mjs.map +1 -0
  292. package/esm/ai/src/rag/hybrid/bm25.mjs +51 -0
  293. package/esm/ai/src/rag/hybrid/bm25.mjs.map +1 -0
  294. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs +29 -0
  295. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs.map +1 -0
  296. package/esm/ai/src/rag/hybrid/rrf.mjs +30 -0
  297. package/esm/ai/src/rag/hybrid/rrf.mjs.map +1 -0
  298. package/esm/ai/src/rag/index.mjs +18 -0
  299. package/esm/ai/src/rag/loaders/errors.mjs +25 -0
  300. package/esm/ai/src/rag/loaders/errors.mjs.map +1 -0
  301. package/esm/ai/src/rag/loaders/index.mjs +7 -0
  302. package/esm/ai/src/rag/loaders/load-html.mjs +138 -0
  303. package/esm/ai/src/rag/loaders/load-html.mjs.map +1 -0
  304. package/esm/ai/src/rag/loaders/load-pdf.mjs +150 -0
  305. package/esm/ai/src/rag/loaders/load-pdf.mjs.map +1 -0
  306. package/esm/ai/src/rag/loaders/load-text.mjs +60 -0
  307. package/esm/ai/src/rag/loaders/load-text.mjs.map +1 -0
  308. package/esm/ai/src/rag/loaders/load-web.mjs +89 -0
  309. package/esm/ai/src/rag/loaders/load-web.mjs.map +1 -0
  310. package/esm/ai/src/rag/rag.mjs +126 -0
  311. package/esm/ai/src/rag/rag.mjs.map +1 -0
  312. package/esm/ai/src/rag/rerank/keyword-reranker.mjs +58 -0
  313. package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +1 -0
  314. package/esm/ai/src/rag/rerank/llm-reranker.mjs +85 -0
  315. package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +1 -0
  316. package/esm/ai/src/rag/retrieve.mjs +68 -0
  317. package/esm/ai/src/rag/retrieve.mjs.map +1 -0
  318. package/esm/ai/src/rag/store/cache-vector-store.mjs +48 -0
  319. package/esm/ai/src/rag/store/cache-vector-store.mjs.map +1 -0
  320. package/esm/ai/src/rag/store/pg-vector-store.mjs +328 -0
  321. package/esm/ai/src/rag/store/pg-vector-store.mjs.map +1 -0
  322. package/esm/ai/src/rag/transforms/multi-query.mjs +41 -0
  323. package/esm/ai/src/rag/transforms/multi-query.mjs.map +1 -0
  324. package/esm/ai/src/security/index.mjs +5 -0
  325. package/esm/ai/src/security/outbound-policy.mjs +187 -0
  326. package/esm/ai/src/security/outbound-policy.mjs.map +1 -0
  327. package/esm/ai/src/security/private-ip.mjs +48 -0
  328. package/esm/ai/src/security/private-ip.mjs.map +1 -0
  329. package/esm/ai/src/security/redact.mjs +60 -0
  330. package/esm/ai/src/security/redact.mjs.map +1 -0
  331. package/esm/ai/src/serve/serve.mjs +90 -0
  332. package/esm/ai/src/serve/serve.mjs.map +1 -0
  333. package/esm/ai/src/serve/sse.mjs +25 -0
  334. package/esm/ai/src/serve/sse.mjs.map +1 -0
  335. package/esm/ai/src/serve/stream-to-sse.mjs +37 -0
  336. package/esm/ai/src/serve/stream-to-sse.mjs.map +1 -0
  337. package/esm/ai/src/skills/catalog.mjs +140 -0
  338. package/esm/ai/src/skills/catalog.mjs.map +1 -0
  339. package/esm/ai/src/skills/index.mjs +11 -0
  340. package/esm/ai/src/skills/load-skill-tool.mjs +65 -0
  341. package/esm/ai/src/skills/load-skill-tool.mjs.map +1 -0
  342. package/esm/ai/src/skills/save-skill-tool.mjs +65 -0
  343. package/esm/ai/src/skills/save-skill-tool.mjs.map +1 -0
  344. package/esm/ai/src/skills/skills.mjs +109 -0
  345. package/esm/ai/src/skills/skills.mjs.map +1 -0
  346. package/esm/ai/src/skills/sources/directory-source.mjs +108 -0
  347. package/esm/ai/src/skills/sources/directory-source.mjs.map +1 -0
  348. package/esm/ai/src/skills/sources/index.mjs +27 -0
  349. package/esm/ai/src/skills/sources/index.mjs.map +1 -0
  350. package/esm/ai/src/skills/sources/parse-frontmatter.mjs +46 -0
  351. package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +1 -0
  352. package/esm/ai/src/skills/sources/store-source.mjs +15 -0
  353. package/esm/ai/src/skills/sources/store-source.mjs.map +1 -0
  354. package/esm/ai/src/skills/sources/url-source.mjs +117 -0
  355. package/esm/ai/src/skills/sources/url-source.mjs.map +1 -0
  356. package/esm/ai/src/snapshot/memory.mjs +81 -0
  357. package/esm/ai/src/snapshot/memory.mjs.map +1 -0
  358. package/esm/ai/src/snapshot/pg.mjs +146 -0
  359. package/esm/ai/src/snapshot/pg.mjs.map +1 -0
  360. package/esm/ai/src/snapshot/redis.mjs +101 -0
  361. package/esm/ai/src/snapshot/redis.mjs.map +1 -0
  362. package/esm/ai/src/speech/index.mjs +3 -0
  363. package/esm/ai/src/speech/speech.mjs +122 -0
  364. package/esm/ai/src/speech/speech.mjs.map +1 -0
  365. package/esm/ai/src/supervisor/as-tool.mjs +74 -0
  366. package/esm/ai/src/supervisor/as-tool.mjs.map +1 -0
  367. package/esm/ai/src/supervisor/cancellation.mjs +22 -0
  368. package/esm/ai/src/supervisor/cancellation.mjs.map +1 -0
  369. package/esm/ai/src/supervisor/decide.mjs +272 -0
  370. package/esm/ai/src/supervisor/decide.mjs.map +1 -0
  371. package/esm/ai/src/supervisor/emitter.mjs +47 -0
  372. package/esm/ai/src/supervisor/emitter.mjs.map +1 -0
  373. package/esm/ai/src/supervisor/entries.mjs +206 -0
  374. package/esm/ai/src/supervisor/entries.mjs.map +1 -0
  375. package/esm/ai/src/supervisor/execution.mjs +1921 -0
  376. package/esm/ai/src/supervisor/execution.mjs.map +1 -0
  377. package/esm/ai/src/supervisor/fan-out.mjs +65 -0
  378. package/esm/ai/src/supervisor/fan-out.mjs.map +1 -0
  379. package/esm/ai/src/supervisor/index.mjs +14 -0
  380. package/esm/ai/src/supervisor/router-factory.mjs +141 -0
  381. package/esm/ai/src/supervisor/router-factory.mjs.map +1 -0
  382. package/esm/ai/src/supervisor/router-prompt.mjs +52 -0
  383. package/esm/ai/src/supervisor/router-prompt.mjs.map +1 -0
  384. package/esm/ai/src/supervisor/signature.mjs +89 -0
  385. package/esm/ai/src/supervisor/signature.mjs.map +1 -0
  386. package/esm/ai/src/supervisor/snapshot.mjs +69 -0
  387. package/esm/ai/src/supervisor/snapshot.mjs.map +1 -0
  388. package/esm/ai/src/supervisor/supervisor-stream.mjs +89 -0
  389. package/esm/ai/src/supervisor/supervisor-stream.mjs.map +1 -0
  390. package/esm/ai/src/supervisor/supervisor.mjs +144 -0
  391. package/esm/ai/src/supervisor/supervisor.mjs.map +1 -0
  392. package/esm/ai/src/system-prompt/index.mjs +6 -0
  393. package/esm/ai/src/system-prompt/instruction.mjs +57 -0
  394. package/esm/ai/src/system-prompt/instruction.mjs.map +1 -0
  395. package/esm/ai/src/system-prompt/persona.mjs +57 -0
  396. package/esm/ai/src/system-prompt/persona.mjs.map +1 -0
  397. package/esm/ai/src/system-prompt/render-placeholders.mjs +58 -0
  398. package/esm/ai/src/system-prompt/render-placeholders.mjs.map +1 -0
  399. package/esm/ai/src/system-prompt/system-prompt.mjs +267 -0
  400. package/esm/ai/src/system-prompt/system-prompt.mjs.map +1 -0
  401. package/esm/ai/src/team/gates.mjs +48 -0
  402. package/esm/ai/src/team/gates.mjs.map +1 -0
  403. package/esm/ai/src/team/index.mjs +3 -0
  404. package/esm/ai/src/team/team.mjs +94 -0
  405. package/esm/ai/src/team/team.mjs.map +1 -0
  406. package/esm/ai/src/tool/executable-as-tool.mjs +81 -0
  407. package/esm/ai/src/tool/executable-as-tool.mjs.map +1 -0
  408. package/esm/ai/src/tool/index.mjs +4 -0
  409. package/esm/ai/src/tool/tool.mjs +185 -0
  410. package/esm/ai/src/tool/tool.mjs.map +1 -0
  411. package/esm/ai/src/transcribe/audio-input.mjs +84 -0
  412. package/esm/ai/src/transcribe/audio-input.mjs.map +1 -0
  413. package/esm/ai/src/transcribe/index.mjs +4 -0
  414. package/esm/ai/src/transcribe/transcribe.mjs +127 -0
  415. package/esm/ai/src/transcribe/transcribe.mjs.map +1 -0
  416. package/esm/ai/src/utils/compute-cost.mjs +112 -0
  417. package/esm/ai/src/utils/compute-cost.mjs.map +1 -0
  418. package/esm/ai/src/utils/extract-json-lenient.mjs +97 -0
  419. package/esm/ai/src/utils/extract-json-lenient.mjs.map +1 -0
  420. package/esm/ai/src/utils/extract-json-payload.mjs +39 -0
  421. package/esm/ai/src/utils/extract-json-payload.mjs.map +1 -0
  422. package/esm/ai/src/utils/generate-run-id.mjs +23 -0
  423. package/esm/ai/src/utils/generate-run-id.mjs.map +1 -0
  424. package/esm/ai/src/utils/index.mjs +12 -0
  425. package/esm/ai/src/utils/json-schema.mjs +89 -0
  426. package/esm/ai/src/utils/json-schema.mjs.map +1 -0
  427. package/esm/ai/src/utils/prepare-attachment-part.mjs +232 -0
  428. package/esm/ai/src/utils/prepare-attachment-part.mjs.map +1 -0
  429. package/esm/ai/src/utils/resolve-attachment.mjs +74 -0
  430. package/esm/ai/src/utils/resolve-attachment.mjs.map +1 -0
  431. package/esm/ai/src/utils/run-context.mjs +89 -0
  432. package/esm/ai/src/utils/run-context.mjs.map +1 -0
  433. package/esm/ai/src/utils/safe-json-parse.mjs +22 -0
  434. package/esm/ai/src/utils/safe-json-parse.mjs.map +1 -0
  435. package/esm/ai/src/utils/stamp-report-lineage.mjs +45 -0
  436. package/esm/ai/src/utils/stamp-report-lineage.mjs.map +1 -0
  437. package/esm/ai/src/vcr/cassette-io.mjs +57 -0
  438. package/esm/ai/src/vcr/cassette-io.mjs.map +1 -0
  439. package/esm/ai/src/vcr/errors.mjs +37 -0
  440. package/esm/ai/src/vcr/errors.mjs.map +1 -0
  441. package/esm/ai/src/vcr/hash-request.mjs +118 -0
  442. package/esm/ai/src/vcr/hash-request.mjs.map +1 -0
  443. package/esm/ai/src/vcr/index.mjs +5 -0
  444. package/esm/ai/src/vcr/vcr.mjs +248 -0
  445. package/esm/ai/src/vcr/vcr.mjs.map +1 -0
  446. package/esm/ai/src/workflow/as-tool.mjs +49 -0
  447. package/esm/ai/src/workflow/as-tool.mjs.map +1 -0
  448. package/esm/ai/src/workflow/cancellation.mjs +44 -0
  449. package/esm/ai/src/workflow/cancellation.mjs.map +1 -0
  450. package/esm/ai/src/workflow/emitter.mjs +40 -0
  451. package/esm/ai/src/workflow/emitter.mjs.map +1 -0
  452. package/esm/ai/src/workflow/engine.mjs +363 -0
  453. package/esm/ai/src/workflow/engine.mjs.map +1 -0
  454. package/esm/ai/src/workflow/index.mjs +5 -0
  455. package/esm/ai/src/workflow/retry.mjs +32 -0
  456. package/esm/ai/src/workflow/retry.mjs.map +1 -0
  457. package/esm/ai/src/workflow/router.mjs +56 -0
  458. package/esm/ai/src/workflow/router.mjs.map +1 -0
  459. package/esm/ai/src/workflow/run-scoped-emitter.mjs +32 -0
  460. package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +1 -0
  461. package/esm/ai/src/workflow/signature.mjs +34 -0
  462. package/esm/ai/src/workflow/signature.mjs.map +1 -0
  463. package/esm/ai/src/workflow/snapshot.mjs +77 -0
  464. package/esm/ai/src/workflow/snapshot.mjs.map +1 -0
  465. package/esm/ai/src/workflow/state.mjs +37 -0
  466. package/esm/ai/src/workflow/state.mjs.map +1 -0
  467. package/esm/ai/src/workflow/step-runner.mjs +370 -0
  468. package/esm/ai/src/workflow/step-runner.mjs.map +1 -0
  469. package/esm/ai/src/workflow/step.mjs +37 -0
  470. package/esm/ai/src/workflow/step.mjs.map +1 -0
  471. package/esm/ai/src/workflow/workflow.mjs +122 -0
  472. package/esm/ai/src/workflow/workflow.mjs.map +1 -0
  473. package/esm/ai-openai/src/embedder.mjs +4 -0
  474. package/esm/ai-openai/src/image.mjs +5 -0
  475. package/esm/ai-openai/src/index.mjs +7 -0
  476. package/esm/ai-openai/src/model.mjs +5 -0
  477. package/esm/ai-openai/src/sdk.mjs +9 -0
  478. package/esm/ai-openai/src/speech.mjs +5 -0
  479. package/esm/ai-openai/src/transcription.mjs +6 -0
  480. package/esm/ai-openai/src/utils/index.mjs +5 -0
  481. package/esm/ai-openai/src/utils/to-openai-messages.mjs +3 -0
  482. package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
  483. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
  484. package/esm/cli/commands/dev-server.command.mjs +1 -1
  485. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  486. package/esm/cli/commands/doctor/checks/config.check.mjs +42 -0
  487. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -0
  488. package/esm/cli/commands/doctor/checks/connectors.check.mjs +28 -0
  489. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -0
  490. package/esm/cli/commands/doctor/checks/health.check.mjs +35 -0
  491. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -0
  492. package/esm/cli/commands/doctor/checks/index.mjs +25 -0
  493. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -0
  494. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +90 -0
  495. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -0
  496. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +69 -0
  497. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -0
  498. package/esm/cli/commands/doctor/checks/routes.check.mjs +30 -0
  499. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -0
  500. package/esm/cli/commands/doctor/doctor-command.action.mjs +28 -0
  501. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -0
  502. package/esm/cli/commands/doctor/format-report.mjs +44 -0
  503. package/esm/cli/commands/doctor/format-report.mjs.map +1 -0
  504. package/esm/cli/commands/doctor/run-checks.mjs +50 -0
  505. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -0
  506. package/esm/cli/commands/doctor.command.mjs +29 -0
  507. package/esm/cli/commands/doctor.command.mjs.map +1 -0
  508. package/esm/cli/commands/generate/templates/stubs.mjs +9 -12
  509. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  510. package/esm/cli/commands/routes/format-routes-table.mjs +129 -0
  511. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -0
  512. package/esm/cli/commands/routes/route-row.mjs +92 -0
  513. package/esm/cli/commands/routes/route-row.mjs.map +1 -0
  514. package/esm/cli/commands/routes/routes-command.action.mjs +43 -0
  515. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -0
  516. package/esm/cli/commands/routes.command.mjs +51 -0
  517. package/esm/cli/commands/routes.command.mjs.map +1 -0
  518. package/esm/cli/commands/seed.command.mjs +5 -0
  519. package/esm/cli/commands/seed.command.mjs.map +1 -1
  520. package/esm/cli/framework-cli-commands.mjs +4 -0
  521. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  522. package/esm/config/config-getter.mjs +5 -5
  523. package/esm/config/config-getter.mjs.map +1 -1
  524. package/esm/config/config-loader.mjs +2 -2
  525. package/esm/config/config-loader.mjs.map +1 -1
  526. package/esm/connectors/access-connector.mjs +2 -2
  527. package/esm/connectors/access-connector.mjs.map +1 -1
  528. package/esm/connectors/ai-connector.d.mts +43 -0
  529. package/esm/connectors/ai-connector.d.mts.map +1 -0
  530. package/esm/connectors/ai-connector.mjs +56 -0
  531. package/esm/connectors/ai-connector.mjs.map +1 -0
  532. package/esm/connectors/cache-connector.d.mts +5 -0
  533. package/esm/connectors/cache-connector.d.mts.map +1 -1
  534. package/esm/connectors/cache-connector.mjs +9 -2
  535. package/esm/connectors/cache-connector.mjs.map +1 -1
  536. package/esm/connectors/connectors-manager.d.mts +6 -2
  537. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  538. package/esm/connectors/connectors-manager.mjs +8 -2
  539. package/esm/connectors/connectors-manager.mjs.map +1 -1
  540. package/esm/connectors/database-connector.mjs +2 -2
  541. package/esm/connectors/database-connector.mjs.map +1 -1
  542. package/esm/connectors/herald-connector.mjs +2 -2
  543. package/esm/connectors/herald-connector.mjs.map +1 -1
  544. package/esm/connectors/http-connector.d.mts.map +1 -1
  545. package/esm/connectors/http-connector.mjs +9 -7
  546. package/esm/connectors/http-connector.mjs.map +1 -1
  547. package/esm/connectors/index.d.mts +1 -0
  548. package/esm/connectors/index.mjs +1 -0
  549. package/esm/connectors/logger-connector.mjs +2 -2
  550. package/esm/connectors/logger-connector.mjs.map +1 -1
  551. package/esm/connectors/mail-connector.mjs +2 -2
  552. package/esm/connectors/mail-connector.mjs.map +1 -1
  553. package/esm/connectors/notifications-connector.mjs +2 -2
  554. package/esm/connectors/notifications-connector.mjs.map +1 -1
  555. package/esm/connectors/socket-connector.d.mts +16 -1
  556. package/esm/connectors/socket-connector.d.mts.map +1 -1
  557. package/esm/connectors/socket-connector.mjs +31 -8
  558. package/esm/connectors/socket-connector.mjs.map +1 -1
  559. package/esm/connectors/storage.connector.d.mts +7 -0
  560. package/esm/connectors/storage.connector.d.mts.map +1 -1
  561. package/esm/connectors/storage.connector.mjs +7 -0
  562. package/esm/connectors/storage.connector.mjs.map +1 -1
  563. package/esm/connectors/types.d.mts +3 -2
  564. package/esm/connectors/types.d.mts.map +1 -1
  565. package/esm/connectors/types.mjs +1 -0
  566. package/esm/connectors/types.mjs.map +1 -1
  567. package/esm/database/index.d.mts +2 -1
  568. package/esm/database/index.mjs +1 -0
  569. package/esm/database/seed-command-action.mjs +44 -4
  570. package/esm/database/seed-command-action.mjs.map +1 -1
  571. package/esm/database/seeds/seed-records-table-migration.mjs +36 -0
  572. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -0
  573. package/esm/database/seeds/seeder.d.mts +22 -5
  574. package/esm/database/seeds/seeder.d.mts.map +1 -1
  575. package/esm/database/seeds/seeder.errors.d.mts +22 -0
  576. package/esm/database/seeds/seeder.errors.d.mts.map +1 -0
  577. package/esm/database/seeds/seeder.errors.mjs +29 -0
  578. package/esm/database/seeds/seeder.errors.mjs.map +1 -0
  579. package/esm/database/seeds/seeder.mjs.map +1 -1
  580. package/esm/database/seeds/seeders.manager.mjs +90 -11
  581. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  582. package/esm/database/seeds/types.d.mts +117 -1
  583. package/esm/database/seeds/types.d.mts.map +1 -1
  584. package/esm/database/seeds/utils.mjs +6 -1
  585. package/esm/database/seeds/utils.mjs.map +1 -1
  586. package/esm/dev-server/development-server.mjs +2 -14
  587. package/esm/dev-server/development-server.mjs.map +1 -1
  588. package/esm/dev-server/file-event-handler.mjs +15 -3
  589. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  590. package/esm/dev-server/module-loader.d.mts +12 -0
  591. package/esm/dev-server/module-loader.d.mts.map +1 -1
  592. package/esm/dev-server/module-loader.mjs +30 -2
  593. package/esm/dev-server/module-loader.mjs.map +1 -1
  594. package/esm/generations/add-command.action.mjs +61 -12
  595. package/esm/generations/add-command.action.mjs.map +1 -1
  596. package/esm/generations/stubs.mjs +31 -1
  597. package/esm/generations/stubs.mjs.map +1 -1
  598. package/esm/http/config.mjs +2 -2
  599. package/esm/http/config.mjs.map +1 -1
  600. package/esm/http/createHttpApplication.mjs +2 -2
  601. package/esm/http/createHttpApplication.mjs.map +1 -1
  602. package/esm/http/health.d.mts +14 -0
  603. package/esm/http/health.d.mts.map +1 -1
  604. package/esm/http/health.mjs +16 -0
  605. package/esm/http/health.mjs.map +1 -1
  606. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  607. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  608. package/esm/http/middleware/cache-response-middleware.mjs +15 -6
  609. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  610. package/esm/http/middleware/concurrency-limit.middleware.mjs +2 -0
  611. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  612. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  613. package/esm/http/middleware/idempotency.middleware.mjs +9 -6
  614. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  615. package/esm/http/middleware/inject-request-context.mjs +2 -2
  616. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  617. package/esm/http/middleware/maintenance.middleware.mjs +6 -5
  618. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  619. package/esm/http/plugins.mjs +9 -9
  620. package/esm/http/plugins.mjs.map +1 -1
  621. package/esm/http/request.d.mts +9 -2
  622. package/esm/http/request.d.mts.map +1 -1
  623. package/esm/http/request.mjs +15 -3
  624. package/esm/http/request.mjs.map +1 -1
  625. package/esm/http/response.d.mts +12 -0
  626. package/esm/http/response.d.mts.map +1 -1
  627. package/esm/http/response.mjs +24 -7
  628. package/esm/http/response.mjs.map +1 -1
  629. package/esm/http/server.d.mts.map +1 -1
  630. package/esm/http/server.mjs +4 -4
  631. package/esm/http/server.mjs.map +1 -1
  632. package/esm/index.d.mts +9 -4
  633. package/esm/index.mjs +6 -1
  634. package/esm/node_modules/langfuse/lib/index.mjs +1827 -0
  635. package/esm/node_modules/langfuse/lib/index.mjs.map +1 -0
  636. package/esm/node_modules/langfuse-core/lib/index.mjs +1770 -0
  637. package/esm/node_modules/langfuse-core/lib/index.mjs.map +1 -0
  638. package/esm/node_modules/mustache/mustache.mjs +587 -0
  639. package/esm/node_modules/mustache/mustache.mjs.map +1 -0
  640. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +180 -0
  641. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +1 -0
  642. package/esm/node_modules/openai/auth/workload-identity-auth.mjs +80 -0
  643. package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +1 -0
  644. package/esm/node_modules/openai/azure.mjs +82 -0
  645. package/esm/node_modules/openai/azure.mjs.map +1 -0
  646. package/esm/node_modules/openai/client.mjs +638 -0
  647. package/esm/node_modules/openai/client.mjs.map +1 -0
  648. package/esm/node_modules/openai/core/api-promise.mjs +75 -0
  649. package/esm/node_modules/openai/core/api-promise.mjs.map +1 -0
  650. package/esm/node_modules/openai/core/error.mjs +110 -0
  651. package/esm/node_modules/openai/core/error.mjs.map +1 -0
  652. package/esm/node_modules/openai/core/pagination.mjs +160 -0
  653. package/esm/node_modules/openai/core/pagination.mjs.map +1 -0
  654. package/esm/node_modules/openai/core/resource.mjs +10 -0
  655. package/esm/node_modules/openai/core/resource.mjs.map +1 -0
  656. package/esm/node_modules/openai/core/streaming.mjs +238 -0
  657. package/esm/node_modules/openai/core/streaming.mjs.map +1 -0
  658. package/esm/node_modules/openai/index.mjs +8 -0
  659. package/esm/node_modules/openai/internal/decoders/line.mjs +91 -0
  660. package/esm/node_modules/openai/internal/decoders/line.mjs.map +1 -0
  661. package/esm/node_modules/openai/internal/detect-platform.mjs +123 -0
  662. package/esm/node_modules/openai/internal/detect-platform.mjs.map +1 -0
  663. package/esm/node_modules/openai/internal/errors.mjs +26 -0
  664. package/esm/node_modules/openai/internal/errors.mjs.map +1 -0
  665. package/esm/node_modules/openai/internal/headers.mjs +65 -0
  666. package/esm/node_modules/openai/internal/headers.mjs.map +1 -0
  667. package/esm/node_modules/openai/internal/parse.mjs +41 -0
  668. package/esm/node_modules/openai/internal/parse.mjs.map +1 -0
  669. package/esm/node_modules/openai/internal/qs/formats.mjs +12 -0
  670. package/esm/node_modules/openai/internal/qs/formats.mjs.map +1 -0
  671. package/esm/node_modules/openai/internal/qs/stringify.mjs +179 -0
  672. package/esm/node_modules/openai/internal/qs/stringify.mjs.map +1 -0
  673. package/esm/node_modules/openai/internal/qs/utils.mjs +65 -0
  674. package/esm/node_modules/openai/internal/qs/utils.mjs.map +1 -0
  675. package/esm/node_modules/openai/internal/request-options.mjs +11 -0
  676. package/esm/node_modules/openai/internal/request-options.mjs.map +1 -0
  677. package/esm/node_modules/openai/internal/shims.mjs +77 -0
  678. package/esm/node_modules/openai/internal/shims.mjs.map +1 -0
  679. package/esm/node_modules/openai/internal/to-file.mjs +63 -0
  680. package/esm/node_modules/openai/internal/to-file.mjs.map +1 -0
  681. package/esm/node_modules/openai/internal/tslib.mjs +16 -0
  682. package/esm/node_modules/openai/internal/tslib.mjs.map +1 -0
  683. package/esm/node_modules/openai/internal/uploads.mjs +94 -0
  684. package/esm/node_modules/openai/internal/uploads.mjs.map +1 -0
  685. package/esm/node_modules/openai/internal/utils/base64.mjs +22 -0
  686. package/esm/node_modules/openai/internal/utils/base64.mjs.map +1 -0
  687. package/esm/node_modules/openai/internal/utils/bytes.mjs +26 -0
  688. package/esm/node_modules/openai/internal/utils/bytes.mjs.map +1 -0
  689. package/esm/node_modules/openai/internal/utils/env.mjs +16 -0
  690. package/esm/node_modules/openai/internal/utils/env.mjs.map +1 -0
  691. package/esm/node_modules/openai/internal/utils/log.mjs +58 -0
  692. package/esm/node_modules/openai/internal/utils/log.mjs.map +1 -0
  693. package/esm/node_modules/openai/internal/utils/path.mjs +62 -0
  694. package/esm/node_modules/openai/internal/utils/path.mjs.map +1 -0
  695. package/esm/node_modules/openai/internal/utils/query.mjs +10 -0
  696. package/esm/node_modules/openai/internal/utils/query.mjs.map +1 -0
  697. package/esm/node_modules/openai/internal/utils/sleep.mjs +6 -0
  698. package/esm/node_modules/openai/internal/utils/sleep.mjs.map +1 -0
  699. package/esm/node_modules/openai/internal/utils/uuid.mjs +18 -0
  700. package/esm/node_modules/openai/internal/utils/uuid.mjs.map +1 -0
  701. package/esm/node_modules/openai/internal/utils/values.mjs +41 -0
  702. package/esm/node_modules/openai/internal/utils/values.mjs.map +1 -0
  703. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +247 -0
  704. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +1 -0
  705. package/esm/node_modules/openai/lib/AssistantStream.mjs +472 -0
  706. package/esm/node_modules/openai/lib/AssistantStream.mjs.map +1 -0
  707. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +26 -0
  708. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +1 -0
  709. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +423 -0
  710. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +1 -0
  711. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +26 -0
  712. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +1 -0
  713. package/esm/node_modules/openai/lib/EventStream.mjs +163 -0
  714. package/esm/node_modules/openai/lib/EventStream.mjs.map +1 -0
  715. package/esm/node_modules/openai/lib/ResponsesParser.mjs +94 -0
  716. package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +1 -0
  717. package/esm/node_modules/openai/lib/RunnableFunction.mjs +8 -0
  718. package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +1 -0
  719. package/esm/node_modules/openai/lib/Util.mjs +19 -0
  720. package/esm/node_modules/openai/lib/Util.mjs.map +1 -0
  721. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +11 -0
  722. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +1 -0
  723. package/esm/node_modules/openai/lib/parser.mjs +88 -0
  724. package/esm/node_modules/openai/lib/parser.mjs.map +1 -0
  725. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +231 -0
  726. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +1 -0
  727. package/esm/node_modules/openai/resources/admin/admin.mjs +15 -0
  728. package/esm/node_modules/openai/resources/admin/admin.mjs.map +1 -0
  729. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +81 -0
  730. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +1 -0
  731. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +31 -0
  732. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +1 -0
  733. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +153 -0
  734. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +1 -0
  735. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +42 -0
  736. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +1 -0
  737. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +106 -0
  738. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +1 -0
  739. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +88 -0
  740. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +1 -0
  741. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +88 -0
  742. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +1 -0
  743. package/esm/node_modules/openai/resources/admin/organization/invites.mjs +83 -0
  744. package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +1 -0
  745. package/esm/node_modules/openai/resources/admin/organization/organization.mjs +45 -0
  746. package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +1 -0
  747. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +72 -0
  748. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +1 -0
  749. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +78 -0
  750. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +1 -0
  751. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +46 -0
  752. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +1 -0
  753. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +95 -0
  754. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +1 -0
  755. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +91 -0
  756. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +1 -0
  757. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +45 -0
  758. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +1 -0
  759. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +63 -0
  760. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +1 -0
  761. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +137 -0
  762. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +1 -0
  763. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +51 -0
  764. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +1 -0
  765. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +108 -0
  766. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +1 -0
  767. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +112 -0
  768. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +1 -0
  769. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +106 -0
  770. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +1 -0
  771. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +91 -0
  772. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +1 -0
  773. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +118 -0
  774. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +1 -0
  775. package/esm/node_modules/openai/resources/admin/organization/roles.mjs +96 -0
  776. package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +1 -0
  777. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +97 -0
  778. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +1 -0
  779. package/esm/node_modules/openai/resources/admin/organization/usage.mjs +207 -0
  780. package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +1 -0
  781. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +88 -0
  782. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +1 -0
  783. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +82 -0
  784. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +1 -0
  785. package/esm/node_modules/openai/resources/audio/audio.mjs +21 -0
  786. package/esm/node_modules/openai/resources/audio/audio.mjs.map +1 -0
  787. package/esm/node_modules/openai/resources/audio/speech.mjs +39 -0
  788. package/esm/node_modules/openai/resources/audio/speech.mjs.map +1 -0
  789. package/esm/node_modules/openai/resources/audio/transcriptions.mjs +22 -0
  790. package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +1 -0
  791. package/esm/node_modules/openai/resources/audio/translations.mjs +21 -0
  792. package/esm/node_modules/openai/resources/audio/translations.mjs.map +1 -0
  793. package/esm/node_modules/openai/resources/batches.mjs +54 -0
  794. package/esm/node_modules/openai/resources/batches.mjs.map +1 -0
  795. package/esm/node_modules/openai/resources/beta/assistants.mjs +78 -0
  796. package/esm/node_modules/openai/resources/beta/assistants.mjs.map +1 -0
  797. package/esm/node_modules/openai/resources/beta/beta.mjs +24 -0
  798. package/esm/node_modules/openai/resources/beta/beta.mjs.map +1 -0
  799. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +18 -0
  800. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +1 -0
  801. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +49 -0
  802. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +1 -0
  803. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +85 -0
  804. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +1 -0
  805. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +21 -0
  806. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +1 -0
  807. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +33 -0
  808. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +1 -0
  809. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +33 -0
  810. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +1 -0
  811. package/esm/node_modules/openai/resources/beta/threads/messages.mjs +83 -0
  812. package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +1 -0
  813. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +183 -0
  814. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +1 -0
  815. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +45 -0
  816. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +1 -0
  817. package/esm/node_modules/openai/resources/beta/threads/threads.mjs +101 -0
  818. package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +1 -0
  819. package/esm/node_modules/openai/resources/chat/chat.mjs +15 -0
  820. package/esm/node_modules/openai/resources/chat/chat.mjs.map +1 -0
  821. package/esm/node_modules/openai/resources/chat/completions/completions.mjs +123 -0
  822. package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +1 -0
  823. package/esm/node_modules/openai/resources/chat/completions/index.mjs +7 -0
  824. package/esm/node_modules/openai/resources/chat/completions/messages.mjs +35 -0
  825. package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +1 -0
  826. package/esm/node_modules/openai/resources/chat/index.mjs +5 -0
  827. package/esm/node_modules/openai/resources/completions.mjs +20 -0
  828. package/esm/node_modules/openai/resources/completions.mjs.map +1 -0
  829. package/esm/node_modules/openai/resources/containers/containers.mjs +57 -0
  830. package/esm/node_modules/openai/resources/containers/containers.mjs.map +1 -0
  831. package/esm/node_modules/openai/resources/containers/files/content.mjs +23 -0
  832. package/esm/node_modules/openai/resources/containers/files/content.mjs.map +1 -0
  833. package/esm/node_modules/openai/resources/containers/files/files.mjs +63 -0
  834. package/esm/node_modules/openai/resources/containers/files/files.mjs.map +1 -0
  835. package/esm/node_modules/openai/resources/conversations/conversations.mjs +57 -0
  836. package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +1 -0
  837. package/esm/node_modules/openai/resources/conversations/items.mjs +57 -0
  838. package/esm/node_modules/openai/resources/conversations/items.mjs.map +1 -0
  839. package/esm/node_modules/openai/resources/embeddings.mjs +48 -0
  840. package/esm/node_modules/openai/resources/embeddings.mjs.map +1 -0
  841. package/esm/node_modules/openai/resources/evals/evals.mjs +73 -0
  842. package/esm/node_modules/openai/resources/evals/evals.mjs.map +1 -0
  843. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +35 -0
  844. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +1 -0
  845. package/esm/node_modules/openai/resources/evals/runs/runs.mjs +72 -0
  846. package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +1 -0
  847. package/esm/node_modules/openai/resources/files.mjs +111 -0
  848. package/esm/node_modules/openai/resources/files.mjs.map +1 -0
  849. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +15 -0
  850. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +1 -0
  851. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +60 -0
  852. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +1 -0
  853. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +15 -0
  854. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +1 -0
  855. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +102 -0
  856. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +1 -0
  857. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +24 -0
  858. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +1 -0
  859. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +34 -0
  860. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +1 -0
  861. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +148 -0
  862. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +1 -0
  863. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +8 -0
  864. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +1 -0
  865. package/esm/node_modules/openai/resources/graders/grader-models.mjs +8 -0
  866. package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +1 -0
  867. package/esm/node_modules/openai/resources/graders/graders.mjs +15 -0
  868. package/esm/node_modules/openai/resources/graders/graders.mjs.map +1 -0
  869. package/esm/node_modules/openai/resources/images.mjs +46 -0
  870. package/esm/node_modules/openai/resources/images.mjs.map +1 -0
  871. package/esm/node_modules/openai/resources/index.mjs +27 -0
  872. package/esm/node_modules/openai/resources/models.mjs +44 -0
  873. package/esm/node_modules/openai/resources/models.mjs.map +1 -0
  874. package/esm/node_modules/openai/resources/moderations.mjs +23 -0
  875. package/esm/node_modules/openai/resources/moderations.mjs.map +1 -0
  876. package/esm/node_modules/openai/resources/realtime/calls.mjs +79 -0
  877. package/esm/node_modules/openai/resources/realtime/calls.mjs.map +1 -0
  878. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +39 -0
  879. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +1 -0
  880. package/esm/node_modules/openai/resources/realtime/realtime.mjs +18 -0
  881. package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +1 -0
  882. package/esm/node_modules/openai/resources/responses/input-items.mjs +31 -0
  883. package/esm/node_modules/openai/resources/responses/input-items.mjs.map +1 -0
  884. package/esm/node_modules/openai/resources/responses/input-tokens.mjs +27 -0
  885. package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +1 -0
  886. package/esm/node_modules/openai/resources/responses/responses.mjs +110 -0
  887. package/esm/node_modules/openai/resources/responses/responses.mjs.map +1 -0
  888. package/esm/node_modules/openai/resources/skills/content.mjs +22 -0
  889. package/esm/node_modules/openai/resources/skills/content.mjs.map +1 -0
  890. package/esm/node_modules/openai/resources/skills/skills.mjs +69 -0
  891. package/esm/node_modules/openai/resources/skills/skills.mjs.map +1 -0
  892. package/esm/node_modules/openai/resources/skills/versions/content.mjs +23 -0
  893. package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +1 -0
  894. package/esm/node_modules/openai/resources/skills/versions/versions.mjs +58 -0
  895. package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +1 -0
  896. package/esm/node_modules/openai/resources/uploads/parts.mjs +34 -0
  897. package/esm/node_modules/openai/resources/uploads/parts.mjs.map +1 -0
  898. package/esm/node_modules/openai/resources/uploads/uploads.mjs +84 -0
  899. package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +1 -0
  900. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +126 -0
  901. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +1 -0
  902. package/esm/node_modules/openai/resources/vector-stores/files.mjs +147 -0
  903. package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +1 -0
  904. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +87 -0
  905. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +1 -0
  906. package/esm/node_modules/openai/resources/videos.mjs +115 -0
  907. package/esm/node_modules/openai/resources/videos.mjs.map +1 -0
  908. package/esm/node_modules/openai/resources/webhooks/index.mjs +3 -0
  909. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +69 -0
  910. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +1 -0
  911. package/esm/node_modules/openai/resources/webhooks.mjs +4 -0
  912. package/esm/node_modules/openai/streaming.mjs +3 -0
  913. package/esm/node_modules/openai/version.mjs +6 -0
  914. package/esm/node_modules/openai/version.mjs.map +1 -0
  915. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +37 -1
  916. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  917. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +71 -5
  918. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  919. package/esm/repositories/adapters/cascade/filter-applicator.mjs +17 -3
  920. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  921. package/esm/repositories/contracts/index.d.mts +1 -1
  922. package/esm/repositories/contracts/query-builder.contract.d.mts +87 -1
  923. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  924. package/esm/repositories/index.d.mts +1 -1
  925. package/esm/repositories/repository.manager.d.mts +110 -2
  926. package/esm/repositories/repository.manager.d.mts.map +1 -1
  927. package/esm/repositories/repository.manager.mjs +207 -25
  928. package/esm/repositories/repository.manager.mjs.map +1 -1
  929. package/esm/router/route-registry.mjs +19 -10
  930. package/esm/router/route-registry.mjs.map +1 -1
  931. package/esm/router/router.d.mts +9 -0
  932. package/esm/router/router.d.mts.map +1 -1
  933. package/esm/router/router.mjs +28 -5
  934. package/esm/router/router.mjs.map +1 -1
  935. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  936. package/esm/storage/drivers/cloud-driver.mjs +48 -12
  937. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  938. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  939. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  940. package/esm/storage/drivers/local-driver.d.mts +8 -0
  941. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  942. package/esm/storage/drivers/local-driver.mjs +19 -4
  943. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  944. package/esm/storage/drivers/r2-driver.mjs +1 -1
  945. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  946. package/esm/storage/drivers/s3-driver.mjs +1 -1
  947. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  948. package/esm/storage/index.d.mts +4 -1
  949. package/esm/storage/index.mjs +3 -0
  950. package/esm/storage/scoped-storage.d.mts +8 -4
  951. package/esm/storage/scoped-storage.d.mts.map +1 -1
  952. package/esm/storage/scoped-storage.mjs +21 -6
  953. package/esm/storage/scoped-storage.mjs.map +1 -1
  954. package/esm/storage/storage.d.mts +12 -4
  955. package/esm/storage/storage.d.mts.map +1 -1
  956. package/esm/storage/storage.mjs +23 -9
  957. package/esm/storage/storage.mjs.map +1 -1
  958. package/esm/storage/types.d.mts +33 -5
  959. package/esm/storage/types.d.mts.map +1 -1
  960. package/esm/storage/utils/contain-path.d.mts +23 -0
  961. package/esm/storage/utils/contain-path.d.mts.map +1 -0
  962. package/esm/storage/utils/contain-path.mjs +35 -0
  963. package/esm/storage/utils/contain-path.mjs.map +1 -0
  964. package/esm/storage/utils/safe-fetch.d.mts +68 -0
  965. package/esm/storage/utils/safe-fetch.d.mts.map +1 -0
  966. package/esm/storage/utils/safe-fetch.mjs +205 -0
  967. package/esm/storage/utils/safe-fetch.mjs.map +1 -0
  968. package/esm/storage/utils/storage-error.d.mts +35 -0
  969. package/esm/storage/utils/storage-error.d.mts.map +1 -0
  970. package/esm/storage/utils/storage-error.mjs +17 -0
  971. package/esm/storage/utils/storage-error.mjs.map +1 -0
  972. package/esm/use-cases/use-case-pipeline.mjs +4 -1
  973. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  974. package/esm/use-cases/use-case.mjs +12 -4
  975. package/esm/use-cases/use-case.mjs.map +1 -1
  976. package/esm/use-cases/use-cases-registry.d.mts +12 -4
  977. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  978. package/esm/use-cases/use-cases-registry.mjs +13 -3
  979. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  980. package/esm/utils/npm-registry.d.mts +1 -1
  981. package/esm/utils/npm-registry.mjs +2 -2
  982. package/esm/utils/npm-registry.mjs.map +1 -1
  983. package/esm/utils/paths.mjs +2 -2
  984. package/esm/utils/paths.mjs.map +1 -1
  985. package/esm/validation/validateAll.mjs +2 -2
  986. package/esm/validation/validateAll.mjs.map +1 -1
  987. package/llms-full.txt +456 -46
  988. package/llms.txt +4 -2
  989. package/package.json +9 -9
  990. package/skills/README.md +65 -0
  991. package/skills/add-connector/SKILL.md +6 -1
  992. package/skills/configure-app/SKILL.md +23 -0
  993. package/skills/health-checks/SKILL.md +13 -0
  994. package/skills/use-repository/SKILL.md +38 -1
  995. package/skills/warlock-doctor/SKILL.md +135 -0
  996. package/skills/warlock-routes/SKILL.md +91 -0
  997. package/skills/write-seeder/SKILL.md +143 -45
@@ -0,0 +1,23 @@
1
+ //#region ../@warlock.js/core/src/storage/utils/contain-path.d.ts
2
+ /**
3
+ * Resolve `location` against `root` and assert the result stays *inside*
4
+ * `root` — the local-storage path-traversal guard.
5
+ *
6
+ * Without this, a `location` like `../../etc/passwd`, `..\..\windows\...`,
7
+ * an absolute path (`/etc/passwd`, `C:\secret`), or a prefix breakout could
8
+ * escape the configured storage root and read or clobber arbitrary files on
9
+ * the host.
10
+ *
11
+ * The check compares the relative path from `root` to the resolved target:
12
+ * if it climbs out (`..` prefix) or is itself absolute (different drive /
13
+ * root on Windows), the location is rejected.
14
+ *
15
+ * @param root - Absolute, normalized storage root.
16
+ * @param location - Caller-supplied (already prefix-applied) location.
17
+ * @returns The absolute, contained filesystem path.
18
+ * @throws {StorageError} When the location escapes `root`.
19
+ */
20
+ declare function resolveWithinRoot(root: string, location: string): string;
21
+ //#endregion
22
+ export { resolveWithinRoot };
23
+ //# sourceMappingURL=contain-path.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contain-path.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/utils/contain-path.ts"],"mappings":";;AAqBA;;;;AAAgE;;;;;;;;;;;;;iBAAhD,iBAAA,CAAkB,IAAA,UAAc,QAAgB"}
@@ -0,0 +1,35 @@
1
+ import { StorageError } from "./storage-error.mjs";
2
+ import path from "path";
3
+
4
+ //#region ../@warlock.js/core/src/storage/utils/contain-path.ts
5
+ /**
6
+ * Resolve `location` against `root` and assert the result stays *inside*
7
+ * `root` — the local-storage path-traversal guard.
8
+ *
9
+ * Without this, a `location` like `../../etc/passwd`, `..\..\windows\...`,
10
+ * an absolute path (`/etc/passwd`, `C:\secret`), or a prefix breakout could
11
+ * escape the configured storage root and read or clobber arbitrary files on
12
+ * the host.
13
+ *
14
+ * The check compares the relative path from `root` to the resolved target:
15
+ * if it climbs out (`..` prefix) or is itself absolute (different drive /
16
+ * root on Windows), the location is rejected.
17
+ *
18
+ * @param root - Absolute, normalized storage root.
19
+ * @param location - Caller-supplied (already prefix-applied) location.
20
+ * @returns The absolute, contained filesystem path.
21
+ * @throws {StorageError} When the location escapes `root`.
22
+ */
23
+ function resolveWithinRoot(root, location) {
24
+ const resolved = path.resolve(root, location);
25
+ const rel = path.relative(root, resolved);
26
+ if (rel !== "" && (rel.startsWith("..") || path.isAbsolute(rel))) throw new StorageError(`Storage location escapes the storage root: "${location}"`, { context: {
27
+ location,
28
+ root
29
+ } });
30
+ return resolved;
31
+ }
32
+
33
+ //#endregion
34
+ export { resolveWithinRoot };
35
+ //# sourceMappingURL=contain-path.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contain-path.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/utils/contain-path.ts"],"sourcesContent":["import path from \"path\";\nimport { StorageError } from \"./storage-error\";\n\n/**\n * Resolve `location` against `root` and assert the result stays *inside*\n * `root` — the local-storage path-traversal guard.\n *\n * Without this, a `location` like `../../etc/passwd`, `..\\..\\windows\\...`,\n * an absolute path (`/etc/passwd`, `C:\\secret`), or a prefix breakout could\n * escape the configured storage root and read or clobber arbitrary files on\n * the host.\n *\n * The check compares the relative path from `root` to the resolved target:\n * if it climbs out (`..` prefix) or is itself absolute (different drive /\n * root on Windows), the location is rejected.\n *\n * @param root - Absolute, normalized storage root.\n * @param location - Caller-supplied (already prefix-applied) location.\n * @returns The absolute, contained filesystem path.\n * @throws {StorageError} When the location escapes `root`.\n */\nexport function resolveWithinRoot(root: string, location: string): string {\n const resolved = path.resolve(root, location);\n const rel = path.relative(root, resolved);\n\n if (rel !== \"\" && (rel.startsWith(\"..\") || path.isAbsolute(rel))) {\n throw new StorageError(\n `Storage location escapes the storage root: \"${location}\"`,\n { context: { location, root } },\n );\n }\n\n return resolved;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAqBA,SAAgB,kBAAkB,MAAc,UAA0B;CACxE,MAAM,WAAW,KAAK,QAAQ,MAAM,QAAQ;CAC5C,MAAM,MAAM,KAAK,SAAS,MAAM,QAAQ;CAExC,IAAI,QAAQ,OAAO,IAAI,WAAW,IAAI,KAAK,KAAK,WAAW,GAAG,IAC5D,MAAM,IAAI,aACR,+CAA+C,SAAS,IACxD,EAAE,SAAS;EAAE;EAAU;CAAK,EAAE,CAChC;CAGF,OAAO;AACT"}
@@ -0,0 +1,68 @@
1
+ //#region ../@warlock.js/core/src/storage/utils/safe-fetch.d.ts
2
+ /**
3
+ * Options controlling a guarded outbound fetch. Every field is optional;
4
+ * {@link resolveFetchPolicy} fills safe defaults. The defaults are
5
+ * deliberately strict (https+http, private-IP deny ON, 30s timeout,
6
+ * 50 MiB cap) so a caller that does not tune them still gets a hardened
7
+ * request.
8
+ */
9
+ type SafeFetchOptions = {
10
+ /**
11
+ * Whether to ALLOW private / loopback / link-local / metadata hosts.
12
+ * Default `false` — the SSRF guard is on (private hosts are denied).
13
+ */
14
+ allowPrivateHosts?: boolean;
15
+ /**
16
+ * Maximum response body size in bytes. A declared `content-length` over
17
+ * this fails fast; otherwise the body is read with a running cap and the
18
+ * stream is aborted on overflow. Default `52_428_800` (50 MiB).
19
+ */
20
+ maxBytes?: number; /** Per-request timeout in milliseconds. Default `30_000`. */
21
+ timeoutMs?: number;
22
+ /**
23
+ * URL schemes permitted for the request, compared case-insensitively.
24
+ * Default `["https", "http"]`.
25
+ */
26
+ allowedSchemes?: string[];
27
+ /**
28
+ * Injected `fetch` implementation (for tests or proxies). Defaults to the
29
+ * global `fetch`.
30
+ */
31
+ fetch?: typeof fetch;
32
+ };
33
+ /**
34
+ * True when `ip` is a private, loopback, link-local, unique-local,
35
+ * carrier-grade-NAT, unspecified, or otherwise non-public address — the set
36
+ * an SSRF guard must refuse. Accepts IPv4 and IPv6 literals (including
37
+ * IPv4-mapped IPv6 like `::ffff:169.254.169.254`). A non-IP string returns
38
+ * `false` (the caller resolves hostnames via DNS first).
39
+ *
40
+ * The cloud-metadata endpoint `169.254.169.254` is covered by the IPv4
41
+ * link-local range `169.254.0.0/16`.
42
+ */
43
+ declare function isPrivateOrReservedIp(ip: string): boolean;
44
+ /**
45
+ * Result of {@link safeFetchToBuffer}: the (capped) body plus the response's
46
+ * content-type, so callers can derive a MIME type and enforce a non-empty
47
+ * content-type check.
48
+ */
49
+ type SafeFetchResult = {
50
+ buffer: Buffer;
51
+ contentType: string | null;
52
+ status: number;
53
+ statusText: string;
54
+ ok: boolean;
55
+ };
56
+ /**
57
+ * SSRF-guarded download: validates the URL (scheme allowlist + post-DNS
58
+ * private-IP deny), performs the request with a timeout via
59
+ * `AbortController`, then streams the body with a hard byte cap — aborting
60
+ * the moment the running total exceeds `maxBytes`. A declared
61
+ * `content-length` over the cap fails fast.
62
+ *
63
+ * @throws {StorageError} On a blocked URL, timeout, or oversized body.
64
+ */
65
+ declare function safeFetchToBuffer(rawUrl: string, options?: SafeFetchOptions): Promise<SafeFetchResult>;
66
+ //#endregion
67
+ export { SafeFetchOptions, SafeFetchResult, isPrivateOrReservedIp, safeFetchToBuffer };
68
+ //# sourceMappingURL=safe-fetch.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-fetch.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/utils/safe-fetch.ts"],"mappings":";;AA0BA;;;;;;KAAY,gBAAA;EAkBV;;;;EAbA,iBAAA;EA2Hc;;;;AAAgC;EArH9C,QAAA,WAgNyB;EA9MzB,SAAA;EA+Mc;;;;EA1Md,cAAA;EA6MA;;;AACE;EAzMF,KAAA,UAAe,KAAK;AAAA;;;;;;;;;;;iBAyGN,qBAAA,CAAsB,EAAU;;AA+GtB;;;;KApBd,eAAA;EACV,MAAA,EAAQ,MAAM;EACd,WAAA;EACA,MAAA;EACA,UAAA;EACA,EAAA;AAAA;;;;;;;;;;iBAYoB,iBAAA,CACpB,MAAA,UACA,OAAA,GAAS,gBAAA,GACR,OAAA,CAAQ,eAAA"}
@@ -0,0 +1,205 @@
1
+ import { StorageError } from "./storage-error.mjs";
2
+ import { lookup } from "node:dns/promises";
3
+ import { isIP } from "node:net";
4
+
5
+ //#region ../@warlock.js/core/src/storage/utils/safe-fetch.ts
6
+ /**
7
+ * SSRF / resource-exhaustion guard for storage's outbound downloads
8
+ * (`putFromUrl`).
9
+ *
10
+ * NOTE: this MIRRORS `@warlock.js/ai`'s `src/security/private-ip.ts` and
11
+ * `src/security/outbound-policy.ts`. It is duplicated here intentionally
12
+ * because `@warlock.js/core` cannot depend on `@warlock.js/ai`. Pending
13
+ * extraction of a shared security package, keep the two copies in sync.
14
+ */
15
+ /** 50 MiB — default cap on a downloaded body (storage files run larger than AI payloads). */
16
+ const DEFAULT_MAX_BYTES = 50 * 1024 * 1024;
17
+ /** 30s — default per-request timeout. */
18
+ const DEFAULT_TIMEOUT_MS = 3e4;
19
+ /**
20
+ * Fill a {@link SafeFetchOptions} with strict defaults: https+http,
21
+ * private-IP deny on, 30s timeout, 50 MiB cap, global `fetch`.
22
+ */
23
+ function resolveFetchPolicy(options = {}) {
24
+ return {
25
+ allowPrivateHosts: options.allowPrivateHosts ?? false,
26
+ maxBytes: options.maxBytes ?? DEFAULT_MAX_BYTES,
27
+ timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,
28
+ allowedSchemes: options.allowedSchemes ?? ["https", "http"],
29
+ fetch: options.fetch ?? globalThis.fetch
30
+ };
31
+ }
32
+ /** Parse a dotted-quad into four octets, or `null` if malformed. */
33
+ function parseIpv4(ip) {
34
+ const parts = ip.split(".");
35
+ if (parts.length !== 4) return null;
36
+ const octets = parts.map((part) => Number(part));
37
+ if (octets.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) return null;
38
+ return octets;
39
+ }
40
+ function isPrivateIpv4(ip) {
41
+ const octets = parseIpv4(ip);
42
+ if (!octets) return true;
43
+ const [a, b] = octets;
44
+ return a === 0 || a === 10 || a === 127 || a === 100 && b >= 64 && b <= 127 || a === 169 && b === 254 || a === 172 && b >= 16 && b <= 31 || a === 192 && b === 168 || a === 192 && b === 0 || a === 198 && (b === 18 || b === 19) || a === 198 && b === 51 || a === 203 && b === 0 || a >= 224;
45
+ }
46
+ function isPrivateIpv6(ip) {
47
+ const normalized = ip.toLowerCase().split("%")[0];
48
+ const v4 = normalized.match(/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/);
49
+ if (v4) return isPrivateIpv4(v4[1]);
50
+ if (normalized === "::1" || normalized === "::") return true;
51
+ const firstGroup = normalized.split(":")[0];
52
+ const head = firstGroup === "" ? 0 : Number.parseInt(firstGroup, 16);
53
+ if ((head & 65024) === 64512) return true;
54
+ if ((head & 65472) === 65152) return true;
55
+ return false;
56
+ }
57
+ /**
58
+ * True when `ip` is a private, loopback, link-local, unique-local,
59
+ * carrier-grade-NAT, unspecified, or otherwise non-public address — the set
60
+ * an SSRF guard must refuse. Accepts IPv4 and IPv6 literals (including
61
+ * IPv4-mapped IPv6 like `::ffff:169.254.169.254`). A non-IP string returns
62
+ * `false` (the caller resolves hostnames via DNS first).
63
+ *
64
+ * The cloud-metadata endpoint `169.254.169.254` is covered by the IPv4
65
+ * link-local range `169.254.0.0/16`.
66
+ */
67
+ function isPrivateOrReservedIp(ip) {
68
+ const family = isIP(ip);
69
+ if (family === 4) return isPrivateIpv4(ip);
70
+ if (family === 6) return isPrivateIpv6(ip);
71
+ return false;
72
+ }
73
+ /** Strip the `[ ]` IPv6 brackets `URL.hostname` keeps. */
74
+ function stripBrackets(host) {
75
+ return host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
76
+ }
77
+ /**
78
+ * Reject when `host` is — or resolves to — a private / reserved address.
79
+ * IP literals are checked directly; hostnames are resolved via DNS and every
80
+ * returned address is checked (a public name pointing inward is caught). A
81
+ * resolution failure fails closed.
82
+ */
83
+ async function assertHostNotPrivate(host, rawUrl) {
84
+ if (isIP(host) !== 0) {
85
+ if (isPrivateOrReservedIp(host)) throw new StorageError(`outbound request blocked — "${host}" is a private/reserved address`, { context: {
86
+ url: rawUrl,
87
+ address: host
88
+ } });
89
+ return;
90
+ }
91
+ let addresses;
92
+ try {
93
+ addresses = await lookup(host, { all: true });
94
+ } catch (cause) {
95
+ throw new StorageError(`outbound request blocked — could not resolve host "${host}" to verify it is public`, {
96
+ cause,
97
+ context: {
98
+ url: rawUrl,
99
+ host
100
+ }
101
+ });
102
+ }
103
+ for (const { address } of addresses) if (isPrivateOrReservedIp(address)) throw new StorageError(`outbound request blocked — host "${host}" resolves to a private/reserved address (${address})`, { context: {
104
+ url: rawUrl,
105
+ host,
106
+ address
107
+ } });
108
+ }
109
+ /**
110
+ * Validate a URL against the policy BEFORE any network call: scheme
111
+ * allowlist and (when private hosts are not allowed) a DNS resolution that
112
+ * rejects private / loopback / link-local / metadata addresses — the SSRF
113
+ * guard. Returns the parsed `URL` on success; throws {@link StorageError}
114
+ * otherwise.
115
+ */
116
+ async function assertUrlAllowed(rawUrl, policy) {
117
+ let url;
118
+ try {
119
+ url = new URL(rawUrl);
120
+ } catch {
121
+ throw new StorageError(`outbound request blocked — invalid URL: ${rawUrl}`, { context: { url: rawUrl } });
122
+ }
123
+ const scheme = url.protocol.replace(/:$/, "").toLowerCase();
124
+ if (!policy.allowedSchemes.some((s) => s.toLowerCase() === scheme)) throw new StorageError(`outbound request blocked — scheme "${scheme}" is not allowed (allowed: ${policy.allowedSchemes.join(", ")})`, { context: {
125
+ url: rawUrl,
126
+ scheme
127
+ } });
128
+ if (!policy.allowPrivateHosts) await assertHostNotPrivate(stripBrackets(url.hostname), rawUrl);
129
+ return url;
130
+ }
131
+ /**
132
+ * SSRF-guarded download: validates the URL (scheme allowlist + post-DNS
133
+ * private-IP deny), performs the request with a timeout via
134
+ * `AbortController`, then streams the body with a hard byte cap — aborting
135
+ * the moment the running total exceeds `maxBytes`. A declared
136
+ * `content-length` over the cap fails fast.
137
+ *
138
+ * @throws {StorageError} On a blocked URL, timeout, or oversized body.
139
+ */
140
+ async function safeFetchToBuffer(rawUrl, options = {}) {
141
+ const policy = resolveFetchPolicy(options);
142
+ const url = await assertUrlAllowed(rawUrl, policy);
143
+ const controller = new AbortController();
144
+ const timer = setTimeout(() => {
145
+ controller.abort(new StorageError(`outbound request timed out after ${policy.timeoutMs}ms`, { context: {
146
+ url: rawUrl,
147
+ timeoutMs: policy.timeoutMs
148
+ } }));
149
+ }, policy.timeoutMs);
150
+ try {
151
+ const response = await policy.fetch(url, { signal: controller.signal });
152
+ const declared = Number(response.headers.get("content-length"));
153
+ if (Number.isFinite(declared) && declared > policy.maxBytes) throw new StorageError(`outbound response body too large — declared ${declared} bytes exceeds the ${policy.maxBytes}-byte cap`, { context: {
154
+ url: rawUrl,
155
+ declared,
156
+ maxBytes: policy.maxBytes
157
+ } });
158
+ return {
159
+ buffer: await readBodyCapped(response, policy.maxBytes, rawUrl),
160
+ contentType: response.headers.get("content-type"),
161
+ status: response.status,
162
+ statusText: response.statusText,
163
+ ok: response.ok
164
+ };
165
+ } finally {
166
+ clearTimeout(timer);
167
+ }
168
+ }
169
+ /**
170
+ * Read a response body into a Buffer with a hard byte cap. The stream is
171
+ * read chunk-by-chunk and cancelled the moment the running total exceeds
172
+ * `maxBytes`. Throws {@link StorageError} on overflow.
173
+ */
174
+ async function readBodyCapped(response, maxBytes, rawUrl) {
175
+ if (!response.body) {
176
+ const arrayBuffer = await response.arrayBuffer();
177
+ if (arrayBuffer.byteLength > maxBytes) throw new StorageError(`outbound response body exceeded the ${maxBytes}-byte cap`, { context: {
178
+ url: rawUrl,
179
+ maxBytes
180
+ } });
181
+ return Buffer.from(arrayBuffer);
182
+ }
183
+ const reader = response.body.getReader();
184
+ const chunks = [];
185
+ let total = 0;
186
+ for (;;) {
187
+ const { done, value } = await reader.read();
188
+ if (done) break;
189
+ if (!value) continue;
190
+ total += value.byteLength;
191
+ if (total > maxBytes) {
192
+ await reader.cancel();
193
+ throw new StorageError(`outbound response body exceeded the ${maxBytes}-byte cap`, { context: {
194
+ url: rawUrl,
195
+ maxBytes
196
+ } });
197
+ }
198
+ chunks.push(value);
199
+ }
200
+ return Buffer.concat(chunks);
201
+ }
202
+
203
+ //#endregion
204
+ export { isPrivateOrReservedIp, safeFetchToBuffer };
205
+ //# sourceMappingURL=safe-fetch.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"safe-fetch.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/utils/safe-fetch.ts"],"sourcesContent":["import { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\nimport { StorageError } from \"./storage-error\";\n\n/**\n * SSRF / resource-exhaustion guard for storage's outbound downloads\n * (`putFromUrl`).\n *\n * NOTE: this MIRRORS `@warlock.js/ai`'s `src/security/private-ip.ts` and\n * `src/security/outbound-policy.ts`. It is duplicated here intentionally\n * because `@warlock.js/core` cannot depend on `@warlock.js/ai`. Pending\n * extraction of a shared security package, keep the two copies in sync.\n */\n\n/** 50 MiB — default cap on a downloaded body (storage files run larger than AI payloads). */\nconst DEFAULT_MAX_BYTES = 50 * 1024 * 1024;\n/** 30s — default per-request timeout. */\nconst DEFAULT_TIMEOUT_MS = 30_000;\n\n/**\n * Options controlling a guarded outbound fetch. Every field is optional;\n * {@link resolveFetchPolicy} fills safe defaults. The defaults are\n * deliberately strict (https+http, private-IP deny ON, 30s timeout,\n * 50 MiB cap) so a caller that does not tune them still gets a hardened\n * request.\n */\nexport type SafeFetchOptions = {\n /**\n * Whether to ALLOW private / loopback / link-local / metadata hosts.\n * Default `false` — the SSRF guard is on (private hosts are denied).\n */\n allowPrivateHosts?: boolean;\n /**\n * Maximum response body size in bytes. A declared `content-length` over\n * this fails fast; otherwise the body is read with a running cap and the\n * stream is aborted on overflow. Default `52_428_800` (50 MiB).\n */\n maxBytes?: number;\n /** Per-request timeout in milliseconds. Default `30_000`. */\n timeoutMs?: number;\n /**\n * URL schemes permitted for the request, compared case-insensitively.\n * Default `[\"https\", \"http\"]`.\n */\n allowedSchemes?: string[];\n /**\n * Injected `fetch` implementation (for tests or proxies). Defaults to the\n * global `fetch`.\n */\n fetch?: typeof fetch;\n};\n\n/** {@link SafeFetchOptions} with every default resolved — never partial. */\ntype ResolvedFetchPolicy = {\n allowPrivateHosts: boolean;\n maxBytes: number;\n timeoutMs: number;\n allowedSchemes: string[];\n fetch: typeof fetch;\n};\n\n/**\n * Fill a {@link SafeFetchOptions} with strict defaults: https+http,\n * private-IP deny on, 30s timeout, 50 MiB cap, global `fetch`.\n */\nfunction resolveFetchPolicy(options: SafeFetchOptions = {}): ResolvedFetchPolicy {\n return {\n allowPrivateHosts: options.allowPrivateHosts ?? false,\n maxBytes: options.maxBytes ?? DEFAULT_MAX_BYTES,\n timeoutMs: options.timeoutMs ?? DEFAULT_TIMEOUT_MS,\n allowedSchemes: options.allowedSchemes ?? [\"https\", \"http\"],\n fetch: options.fetch ?? globalThis.fetch,\n };\n}\n\n/** Parse a dotted-quad into four octets, or `null` if malformed. */\nfunction parseIpv4(ip: string): [number, number, number, number] | null {\n const parts = ip.split(\".\");\n if (parts.length !== 4) {\n return null;\n }\n\n const octets = parts.map((part) => Number(part));\n if (octets.some((n) => !Number.isInteger(n) || n < 0 || n > 255)) {\n return null;\n }\n\n return octets as [number, number, number, number];\n}\n\nfunction isPrivateIpv4(ip: string): boolean {\n const octets = parseIpv4(ip);\n if (!octets) {\n return true; // unparseable → refuse, fail closed\n }\n\n const [a, b] = octets;\n\n return (\n a === 0 || // 0.0.0.0/8 \"this network\"\n a === 10 || // 10.0.0.0/8 private\n a === 127 || // 127.0.0.0/8 loopback\n (a === 100 && b >= 64 && b <= 127) || // 100.64.0.0/10 CGNAT\n (a === 169 && b === 254) || // 169.254.0.0/16 link-local + metadata\n (a === 172 && b >= 16 && b <= 31) || // 172.16.0.0/12 private\n (a === 192 && b === 168) || // 192.168.0.0/16 private\n (a === 192 && b === 0) || // 192.0.0.0/24 + 192.0.2.0/24 (IETF/test)\n (a === 198 && (b === 18 || b === 19)) || // 198.18.0.0/15 benchmarking\n (a === 198 && b === 51) || // 198.51.100.0/24 test-net-2\n (a === 203 && b === 0) || // 203.0.113.0/24 test-net-3\n a >= 224 // 224.0.0.0/4 multicast + 240.0.0.0/4 reserved + 255.255.255.255\n );\n}\n\nfunction isPrivateIpv6(ip: string): boolean {\n const normalized = ip.toLowerCase().split(\"%\")[0]; // drop zone id\n\n // IPv4-mapped / -embedded (::ffff:a.b.c.d, ::a.b.c.d) — defer to the v4\n // check on the trailing dotted-quad so an inward-mapped address is caught.\n const v4 = normalized.match(/(\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3})$/);\n if (v4) {\n return isPrivateIpv4(v4[1]);\n }\n\n if (normalized === \"::1\" || normalized === \"::\") {\n return true; // loopback / unspecified\n }\n\n // Expand only the leading group enough to classify the reserved blocks.\n const firstGroup = normalized.split(\":\")[0];\n const head = firstGroup === \"\" ? 0 : Number.parseInt(firstGroup, 16);\n\n // fc00::/7 unique-local (fc.. / fd..)\n if ((head & 0xfe00) === 0xfc00) {\n return true;\n }\n // fe80::/10 link-local\n if ((head & 0xffc0) === 0xfe80) {\n return true;\n }\n\n return false;\n}\n\n/**\n * True when `ip` is a private, loopback, link-local, unique-local,\n * carrier-grade-NAT, unspecified, or otherwise non-public address — the set\n * an SSRF guard must refuse. Accepts IPv4 and IPv6 literals (including\n * IPv4-mapped IPv6 like `::ffff:169.254.169.254`). A non-IP string returns\n * `false` (the caller resolves hostnames via DNS first).\n *\n * The cloud-metadata endpoint `169.254.169.254` is covered by the IPv4\n * link-local range `169.254.0.0/16`.\n */\nexport function isPrivateOrReservedIp(ip: string): boolean {\n const family = isIP(ip);\n if (family === 4) {\n return isPrivateIpv4(ip);\n }\n if (family === 6) {\n return isPrivateIpv6(ip);\n }\n return false;\n}\n\n/** Strip the `[ ]` IPv6 brackets `URL.hostname` keeps. */\nfunction stripBrackets(host: string): string {\n return host.startsWith(\"[\") && host.endsWith(\"]\") ? host.slice(1, -1) : host;\n}\n\n/**\n * Reject when `host` is — or resolves to — a private / reserved address.\n * IP literals are checked directly; hostnames are resolved via DNS and every\n * returned address is checked (a public name pointing inward is caught). A\n * resolution failure fails closed.\n */\nasync function assertHostNotPrivate(host: string, rawUrl: string): Promise<void> {\n if (isIP(host) !== 0) {\n if (isPrivateOrReservedIp(host)) {\n throw new StorageError(\n `outbound request blocked — \"${host}\" is a private/reserved address`,\n { context: { url: rawUrl, address: host } },\n );\n }\n return;\n }\n\n let addresses: Array<{ address: string }>;\n try {\n addresses = await lookup(host, { all: true });\n } catch (cause) {\n throw new StorageError(\n `outbound request blocked — could not resolve host \"${host}\" to verify it is public`,\n { cause, context: { url: rawUrl, host } },\n );\n }\n\n for (const { address } of addresses) {\n if (isPrivateOrReservedIp(address)) {\n throw new StorageError(\n `outbound request blocked — host \"${host}\" resolves to a private/reserved address (${address})`,\n { context: { url: rawUrl, host, address } },\n );\n }\n }\n}\n\n/**\n * Validate a URL against the policy BEFORE any network call: scheme\n * allowlist and (when private hosts are not allowed) a DNS resolution that\n * rejects private / loopback / link-local / metadata addresses — the SSRF\n * guard. Returns the parsed `URL` on success; throws {@link StorageError}\n * otherwise.\n */\nasync function assertUrlAllowed(rawUrl: string, policy: ResolvedFetchPolicy): Promise<URL> {\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n throw new StorageError(`outbound request blocked — invalid URL: ${rawUrl}`, {\n context: { url: rawUrl },\n });\n }\n\n const scheme = url.protocol.replace(/:$/, \"\").toLowerCase();\n if (!policy.allowedSchemes.some((s) => s.toLowerCase() === scheme)) {\n throw new StorageError(\n `outbound request blocked — scheme \"${scheme}\" is not allowed (allowed: ${policy.allowedSchemes.join(\", \")})`,\n { context: { url: rawUrl, scheme } },\n );\n }\n\n if (!policy.allowPrivateHosts) {\n const host = stripBrackets(url.hostname);\n await assertHostNotPrivate(host, rawUrl);\n }\n\n return url;\n}\n\n/**\n * Result of {@link safeFetchToBuffer}: the (capped) body plus the response's\n * content-type, so callers can derive a MIME type and enforce a non-empty\n * content-type check.\n */\nexport type SafeFetchResult = {\n buffer: Buffer;\n contentType: string | null;\n status: number;\n statusText: string;\n ok: boolean;\n};\n\n/**\n * SSRF-guarded download: validates the URL (scheme allowlist + post-DNS\n * private-IP deny), performs the request with a timeout via\n * `AbortController`, then streams the body with a hard byte cap — aborting\n * the moment the running total exceeds `maxBytes`. A declared\n * `content-length` over the cap fails fast.\n *\n * @throws {StorageError} On a blocked URL, timeout, or oversized body.\n */\nexport async function safeFetchToBuffer(\n rawUrl: string,\n options: SafeFetchOptions = {},\n): Promise<SafeFetchResult> {\n const policy = resolveFetchPolicy(options);\n const url = await assertUrlAllowed(rawUrl, policy);\n\n const controller = new AbortController();\n const timer = setTimeout(() => {\n controller.abort(\n new StorageError(`outbound request timed out after ${policy.timeoutMs}ms`, {\n context: { url: rawUrl, timeoutMs: policy.timeoutMs },\n }),\n );\n }, policy.timeoutMs);\n\n try {\n const response = await policy.fetch(url, { signal: controller.signal });\n\n const declared = Number(response.headers.get(\"content-length\"));\n if (Number.isFinite(declared) && declared > policy.maxBytes) {\n throw new StorageError(\n `outbound response body too large — declared ${declared} bytes exceeds the ${policy.maxBytes}-byte cap`,\n { context: { url: rawUrl, declared, maxBytes: policy.maxBytes } },\n );\n }\n\n const buffer = await readBodyCapped(response, policy.maxBytes, rawUrl);\n\n return {\n buffer,\n contentType: response.headers.get(\"content-type\"),\n status: response.status,\n statusText: response.statusText,\n ok: response.ok,\n };\n } finally {\n clearTimeout(timer);\n }\n}\n\n/**\n * Read a response body into a Buffer with a hard byte cap. The stream is\n * read chunk-by-chunk and cancelled the moment the running total exceeds\n * `maxBytes`. Throws {@link StorageError} on overflow.\n */\nasync function readBodyCapped(\n response: Response,\n maxBytes: number,\n rawUrl: string,\n): Promise<Buffer> {\n if (!response.body) {\n const arrayBuffer = await response.arrayBuffer();\n if (arrayBuffer.byteLength > maxBytes) {\n throw new StorageError(\n `outbound response body exceeded the ${maxBytes}-byte cap`,\n { context: { url: rawUrl, maxBytes } },\n );\n }\n return Buffer.from(arrayBuffer);\n }\n\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n\n for (;;) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n if (!value) {\n continue;\n }\n\n total += value.byteLength;\n if (total > maxBytes) {\n await reader.cancel();\n throw new StorageError(\n `outbound response body exceeded the ${maxBytes}-byte cap`,\n { context: { url: rawUrl, maxBytes } },\n );\n }\n chunks.push(value);\n }\n\n return Buffer.concat(chunks);\n}\n"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ //#region ../@warlock.js/core/src/storage/utils/storage-error.d.ts
2
+ /**
3
+ * Base error for the storage subsystem.
4
+ *
5
+ * The storage drivers historically threw bare `Error`s. The security
6
+ * guards added to the local and cloud drivers (path-traversal containment,
7
+ * SSRF-guarded `putFromUrl`) need a named, catchable error so callers can
8
+ * branch on `instanceof StorageError` instead of string-matching messages.
9
+ *
10
+ * `context` is a free-form diagnostic bag (offending location, host, URL)
11
+ * mirroring the convention used by `@warlock.js/ai`'s error classes — it is
12
+ * for logs and telemetry, treated as opaque by consumers.
13
+ */
14
+ type StorageErrorOptions = {
15
+ cause?: unknown;
16
+ context?: Record<string, unknown>;
17
+ };
18
+ /**
19
+ * Error thrown by storage drivers for refused or invalid operations
20
+ * (path-traversal attempts, blocked outbound fetches, oversized downloads).
21
+ */
22
+ declare class StorageError extends Error {
23
+ /**
24
+ * Optional original thrown value preserved through re-wrapping.
25
+ */
26
+ readonly cause?: unknown;
27
+ /**
28
+ * Optional free-form diagnostic bag (location, host, url, …).
29
+ */
30
+ readonly context?: Record<string, unknown>;
31
+ constructor(message: string, options?: StorageErrorOptions);
32
+ }
33
+ //#endregion
34
+ export { StorageError, StorageErrorOptions };
35
+ //# sourceMappingURL=storage-error.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-error.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/utils/storage-error.ts"],"mappings":";;AAYA;;;;;;;;AAEkB;AAOlB;;KATY,mBAAA;EACV,KAAA;EACA,OAAA,GAAU,MAAM;AAAA;;;;;cAOL,YAAA,SAAqB,KAAA;EASN;;;EAAA,SALV,KAAA;EAOoB;;AAA6B;EAA7B,SAFpB,OAAA,GAAU,MAAA;cAEP,OAAA,UAAiB,OAAA,GAAU,mBAAA;AAAA"}
@@ -0,0 +1,17 @@
1
+ //#region ../@warlock.js/core/src/storage/utils/storage-error.ts
2
+ /**
3
+ * Error thrown by storage drivers for refused or invalid operations
4
+ * (path-traversal attempts, blocked outbound fetches, oversized downloads).
5
+ */
6
+ var StorageError = class extends Error {
7
+ constructor(message, options) {
8
+ super(message);
9
+ this.name = "StorageError";
10
+ this.cause = options?.cause;
11
+ this.context = options?.context;
12
+ }
13
+ };
14
+
15
+ //#endregion
16
+ export { StorageError };
17
+ //# sourceMappingURL=storage-error.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storage-error.mjs","names":[],"sources":["../../../../../../../../@warlock.js/core/src/storage/utils/storage-error.ts"],"sourcesContent":["/**\n * Base error for the storage subsystem.\n *\n * The storage drivers historically threw bare `Error`s. The security\n * guards added to the local and cloud drivers (path-traversal containment,\n * SSRF-guarded `putFromUrl`) need a named, catchable error so callers can\n * branch on `instanceof StorageError` instead of string-matching messages.\n *\n * `context` is a free-form diagnostic bag (offending location, host, URL)\n * mirroring the convention used by `@warlock.js/ai`'s error classes — it is\n * for logs and telemetry, treated as opaque by consumers.\n */\nexport type StorageErrorOptions = {\n cause?: unknown;\n context?: Record<string, unknown>;\n};\n\n/**\n * Error thrown by storage drivers for refused or invalid operations\n * (path-traversal attempts, blocked outbound fetches, oversized downloads).\n */\nexport class StorageError extends Error {\n /**\n * Optional original thrown value preserved through re-wrapping.\n */\n public readonly cause?: unknown;\n\n /**\n * Optional free-form diagnostic bag (location, host, url, …).\n */\n public readonly context?: Record<string, unknown>;\n\n public constructor(message: string, options?: StorageErrorOptions) {\n super(message);\n this.name = \"StorageError\";\n this.cause = options?.cause;\n this.context = options?.context;\n }\n}\n"],"mappings":";;;;;AAqBA,IAAa,eAAb,cAAkC,MAAM;CAWtC,AAAO,YAAY,SAAiB,SAA+B;EACjE,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,KAAK,QAAQ,SAAS;EACtB,KAAK,UAAU,SAAS;CAC1B;AACF"}
@@ -31,7 +31,10 @@ async function runPipeline(opts) {
31
31
  useCase: ucOnExecuting ? [ucOnExecuting] : void 0,
32
32
  global: globalEventsCallbacksMap.onExecuting.length ? globalEventsCallbacksMap.onExecuting : void 0
33
33
  });
34
- if (guards) for (const guard of guards) await guard(Object.freeze(data), ctx);
34
+ if (guards) {
35
+ const frozenData = Object.freeze(Array.isArray(data) ? [...data] : { ...data });
36
+ for (const guard of guards) await guard(frozenData, ctx);
37
+ }
35
38
  if (schema) {
36
39
  const result = await v.validate(schema, data);
37
40
  if (!result.isValid) throw new BadSchemaUseCaseError(result);
@@ -1 +1 @@
1
- {"version":3,"file":"use-case-pipeline.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/use-cases/use-case-pipeline.ts"],"sourcesContent":["import type { ObjectValidator } from \"@warlock.js/seal\";\r\nimport { v } from \"@warlock.js/seal\";\r\nimport type {\r\n UseCaseBeforeMiddleware,\r\n UseCaseContext,\r\n UseCaseGuard,\r\n UseCaseOnExecutingContext,\r\n} from \"./types\";\r\nimport { fireLifecycleEvent, globalEventsCallbacksMap } from \"./use-case-events\";\r\nimport { BadSchemaUseCaseError } from \"./use-case.errors\";\r\n\r\nexport type PipelineOptions<Input> = {\r\n name: string;\r\n id: string;\r\n data: Input;\r\n ctx: UseCaseContext;\r\n startedAt: Date;\r\n schema?: ObjectValidator;\r\n guards?: UseCaseGuard<Input>[];\r\n before?: UseCaseBeforeMiddleware<Input>[];\r\n /** Invocation-level onExecuting override */\r\n onExecuting?: (ctx: UseCaseOnExecutingContext) => void;\r\n /** Use-case-level onExecuting */\r\n ucOnExecuting?: (ctx: UseCaseOnExecutingContext) => void;\r\n};\r\n\r\n/**\r\n * Runs the pre-handler pipeline in order:\r\n * onExecuting event → guards → validation → before middleware.\r\n *\r\n * Returns the validated, transformed data ready for the handler. The handler is\r\n * invoked by the caller so retry/benchmark can wrap it in isolation — keeping\r\n * guards, validation, and onExecuting from re-running on each retry attempt.\r\n *\r\n * Throws on guard failure or validation failure.\r\n *\r\n * @example\r\n * const data = await runPipeline({ name, id, data, ctx, startedAt, schema, guards, before });\r\n */\r\nexport async function runPipeline<Input>(opts: PipelineOptions<Input>): Promise<Input> {\r\n const { name, id, ctx, startedAt, schema, guards, before, onExecuting, ucOnExecuting } = opts;\r\n let data = opts.data;\r\n\r\n await fireLifecycleEvent<UseCaseOnExecutingContext>(\r\n { name, id, data, schema, ctx, startedAt },\r\n {\r\n invocation: onExecuting ? [onExecuting] : undefined,\r\n useCase: ucOnExecuting ? [ucOnExecuting] : undefined,\r\n global: globalEventsCallbacksMap.onExecuting.length\r\n ? globalEventsCallbacksMap.onExecuting\r\n : undefined,\r\n },\r\n );\r\n\r\n if (guards) {\r\n for (const guard of guards) {\r\n await guard(Object.freeze(data) as Readonly<Input>, ctx);\r\n }\r\n }\r\n\r\n if (schema) {\r\n const result = await v.validate(schema, data);\r\n\r\n if (!result.isValid) {\r\n throw new BadSchemaUseCaseError(result);\r\n }\r\n\r\n data = result.data;\r\n }\r\n\r\n let transformed = data;\r\n\r\n if (before) {\r\n for (const middleware of before) {\r\n transformed = await middleware(transformed, ctx);\r\n }\r\n }\r\n\r\n return transformed;\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuCA,eAAsB,YAAmB,MAA8C;CACrF,MAAM,EAAE,MAAM,IAAI,KAAK,WAAW,QAAQ,QAAQ,QAAQ,aAAa,kBAAkB;CACzF,IAAI,OAAO,KAAK;CAEhB,MAAM,mBACJ;EAAE;EAAM;EAAI;EAAM;EAAQ;EAAK;CAAU,GACzC;EACE,YAAY,cAAc,CAAC,WAAW,IAAI;EAC1C,SAAS,gBAAgB,CAAC,aAAa,IAAI;EAC3C,QAAQ,yBAAyB,YAAY,SACzC,yBAAyB,cACzB;CACN,CACF;CAEA,IAAI,QACF,KAAK,MAAM,SAAS,QAClB,MAAM,MAAM,OAAO,OAAO,IAAI,GAAsB,GAAG;CAI3D,IAAI,QAAQ;EACV,MAAM,SAAS,MAAM,EAAE,SAAS,QAAQ,IAAI;EAE5C,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,sBAAsB,MAAM;EAGxC,OAAO,OAAO;CAChB;CAEA,IAAI,cAAc;CAElB,IAAI,QACF,KAAK,MAAM,cAAc,QACvB,cAAc,MAAM,WAAW,aAAa,GAAG;CAInD,OAAO;AACT"}
1
+ {"version":3,"file":"use-case-pipeline.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/use-cases/use-case-pipeline.ts"],"sourcesContent":["import type { ObjectValidator } from \"@warlock.js/seal\";\nimport { v } from \"@warlock.js/seal\";\nimport type {\n UseCaseBeforeMiddleware,\n UseCaseContext,\n UseCaseGuard,\n UseCaseOnExecutingContext,\n} from \"./types\";\nimport { fireLifecycleEvent, globalEventsCallbacksMap } from \"./use-case-events\";\nimport { BadSchemaUseCaseError } from \"./use-case.errors\";\n\nexport type PipelineOptions<Input> = {\n name: string;\n id: string;\n data: Input;\n ctx: UseCaseContext;\n startedAt: Date;\n schema?: ObjectValidator;\n guards?: UseCaseGuard<Input>[];\n before?: UseCaseBeforeMiddleware<Input>[];\n /** Invocation-level onExecuting override */\n onExecuting?: (ctx: UseCaseOnExecutingContext) => void;\n /** Use-case-level onExecuting */\n ucOnExecuting?: (ctx: UseCaseOnExecutingContext) => void;\n};\n\n/**\n * Runs the pre-handler pipeline in order:\n * onExecuting event → guards → validation → before middleware.\n *\n * Returns the validated, transformed data ready for the handler. The handler is\n * invoked by the caller so retry/benchmark can wrap it in isolation — keeping\n * guards, validation, and onExecuting from re-running on each retry attempt.\n *\n * Throws on guard failure or validation failure.\n *\n * @example\n * const data = await runPipeline({ name, id, data, ctx, startedAt, schema, guards, before });\n */\nexport async function runPipeline<Input>(opts: PipelineOptions<Input>): Promise<Input> {\n const { name, id, ctx, startedAt, schema, guards, before, onExecuting, ucOnExecuting } = opts;\n let data = opts.data;\n\n await fireLifecycleEvent<UseCaseOnExecutingContext>(\n { name, id, data, schema, ctx, startedAt },\n {\n invocation: onExecuting ? [onExecuting] : undefined,\n useCase: ucOnExecuting ? [ucOnExecuting] : undefined,\n global: globalEventsCallbacksMap.onExecuting.length\n ? globalEventsCallbacksMap.onExecuting\n : undefined,\n },\n );\n\n if (guards) {\n // Guards get a frozen SHALLOW CLONE so a guard can't mutate the input, while\n // the original `data` (and the reference that reaches before-middleware and the\n // handler) stays writable. Freezing `data` in place would leak the frozen ref\n // downstream and make a handler mutating its input throw under strict mode.\n // The guard contract is read-only by design; the clone is shallow (deep-freeze\n // is optional and intentionally not done here).\n const frozenData = Object.freeze(\n Array.isArray(data) ? [...data] : { ...(data as object) },\n ) as Readonly<Input>;\n\n for (const guard of guards) {\n await guard(frozenData, ctx);\n }\n }\n\n if (schema) {\n const result = await v.validate(schema, data);\n\n if (!result.isValid) {\n throw new BadSchemaUseCaseError(result);\n }\n\n data = result.data;\n }\n\n let transformed = data;\n\n if (before) {\n for (const middleware of before) {\n transformed = await middleware(transformed, ctx);\n }\n }\n\n return transformed;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAuCA,eAAsB,YAAmB,MAA8C;CACrF,MAAM,EAAE,MAAM,IAAI,KAAK,WAAW,QAAQ,QAAQ,QAAQ,aAAa,kBAAkB;CACzF,IAAI,OAAO,KAAK;CAEhB,MAAM,mBACJ;EAAE;EAAM;EAAI;EAAM;EAAQ;EAAK;CAAU,GACzC;EACE,YAAY,cAAc,CAAC,WAAW,IAAI;EAC1C,SAAS,gBAAgB,CAAC,aAAa,IAAI;EAC3C,QAAQ,yBAAyB,YAAY,SACzC,yBAAyB,cACzB;CACN,CACF;CAEA,IAAI,QAAQ;EAOV,MAAM,aAAa,OAAO,OACxB,MAAM,QAAQ,IAAI,IAAI,CAAC,GAAG,IAAI,IAAI,EAAE,GAAI,KAAgB,CAC1D;EAEA,KAAK,MAAM,SAAS,QAClB,MAAM,MAAM,YAAY,GAAG;CAE/B;CAEA,IAAI,QAAQ;EACV,MAAM,SAAS,MAAM,EAAE,SAAS,QAAQ,IAAI;EAE5C,IAAI,CAAC,OAAO,SACV,MAAM,IAAI,sBAAsB,MAAM;EAGxC,OAAO,OAAO;CAChB;CAEA,IAAI,cAAc;CAElB,IAAI,QACF,KAAK,MAAM,cAAc,QACvB,cAAc,MAAM,WAAW,aAAa,GAAG;CAInD,OAAO;AACT"}
@@ -34,7 +34,7 @@ function useCase(options) {
34
34
  let output;
35
35
  let error;
36
36
  let benchmarkResult;
37
- let currentRetry = 0;
37
+ let failedAttempts = 0;
38
38
  if (logEnabled) log.debug("use-cases", name, "executing", { id });
39
39
  try {
40
40
  const transformed = await runPipeline({
@@ -62,7 +62,7 @@ function useCase(options) {
62
62
  output = retryConfig ? await retry(runHandler, {
63
63
  ...retryConfig,
64
64
  onError: (retryError, attempt) => {
65
- currentRetry = attempt;
65
+ failedAttempts = attempt;
66
66
  retryConfig.onError?.(retryError, attempt);
67
67
  }
68
68
  }) : await runHandler();
@@ -70,11 +70,12 @@ function useCase(options) {
70
70
  error = err;
71
71
  }
72
72
  const endedAt = /* @__PURE__ */ new Date();
73
- if (!error && after && output !== void 0) for (const middleware of after) try {
73
+ if (!error && after) for (const middleware of after) try {
74
74
  await middleware(output, ctx);
75
75
  } catch (afterError) {
76
76
  log.error("use-cases", name, "after middleware failed", { error: afterError });
77
77
  }
78
+ const currentRetry = error ? Math.max(failedAttempts - 1, 0) : failedAttempts;
78
79
  const snapshot = {
79
80
  output,
80
81
  ctx,
@@ -111,7 +112,14 @@ function useCase(options) {
111
112
  id,
112
113
  latency: benchmarkResult?.latency
113
114
  });
114
- await addUseCaseHistory(name, snapshot);
115
+ try {
116
+ await addUseCaseHistory(name, snapshot);
117
+ } catch (historyError) {
118
+ log.error("use-cases", name, "history persistence failed", {
119
+ id,
120
+ error: historyError
121
+ });
122
+ }
115
123
  await fireLifecycleEvent(snapshot, {
116
124
  invocation: invocationOnCompleted ? [invocationOnCompleted] : void 0,
117
125
  useCase: onCompleted ? [onCompleted] : void 0,
@@ -1 +1 @@
1
- {"version":3,"file":"use-case.mjs","names":["runWithRetry"],"sources":["../../../../../../../@warlock.js/core/src/use-cases/use-case.ts"],"sourcesContent":["import { except, Random, retry as runWithRetry } from \"@mongez/reinforcements\";\r\nimport { log } from \"@warlock.js/logger\";\r\nimport type { Infer, ObjectValidator } from \"@warlock.js/seal\";\r\nimport { measure } from \"../benchmark\";\r\nimport { config } from \"../config\";\r\nimport type {\r\n UseCase,\r\n UseCaseConfigurations,\r\n UseCaseContext,\r\n UseCaseErrorResult,\r\n UseCaseHandler,\r\n UseCaseResult,\r\n UseCaseRuntimeOptions,\r\n UseCaseWithSchema,\r\n} from \"./types\";\r\nimport { broadcastUseCaseResult } from \"./use-case-broadcast\";\r\nimport { fireLifecycleEvent, globalEventsCallbacksMap } from \"./use-case-events\";\r\nimport { runPipeline } from \"./use-case-pipeline\";\r\nimport {\r\n $registerUseCase,\r\n $unregisterUseCase,\r\n addUseCaseHistory,\r\n increaseUseCaseFailedCalls,\r\n increaseUseCaseSuccessCalls,\r\n} from \"./use-cases-registry\";\r\n\r\nconst defaultUseCaseOptions: UseCaseConfigurations = {\r\n benchmark: true,\r\n};\r\n\r\n/**\r\n * Defines and registers a use case.\r\n *\r\n * A use case is a named, observable, optionally benchmarked unit of business logic.\r\n * The returned handler is a typed async function you call with the input data.\r\n *\r\n * Execution order: onExecuting → guards → validation → before → handler → after →\r\n * onCompleted → broadcast. Retry and benchmark wrap the **handler** only.\r\n *\r\n * When a `schema` is provided, the handler's input is inferred from it — no manual\r\n * `Input` generic needed.\r\n *\r\n * @example\r\n * export const createOrderUseCase = useCase({\r\n * name: \"create_order\",\r\n * schema: createOrderSchema, // handler `data` is inferred from this\r\n * guards: [authGuard],\r\n * handler: async (data, ctx) => orderService.create(data),\r\n * after: [sendConfirmationEmail],\r\n * retry: { attempts: 3, delay: 500, backoff: \"exponential\" },\r\n * broadcast: true,\r\n * });\r\n *\r\n * // In a controller:\r\n * const output = await createOrderUseCase({ ...validated, user_id: req.user.id });\r\n */\r\nexport function useCase<\r\n Output,\r\n Schema extends ObjectValidator,\r\n Ctx extends UseCaseContext = UseCaseContext,\r\n>(options: UseCaseWithSchema<Output, Schema, Ctx>): UseCaseHandler<Output, Infer<Schema>>;\r\nexport function useCase<Output = any, Input = any, Ctx extends UseCaseContext = UseCaseContext>(\r\n options: UseCase<Output, Input, Ctx>,\r\n): UseCaseHandler<Output, Input>;\r\nexport function useCase<Output = any, Input = any>(\r\n options: UseCase<Output, Input>,\r\n): UseCaseHandler<Output, Input> {\r\n const { name, handler, schema, guards, before, after, onExecuting, onCompleted, onError } =\r\n options;\r\n\r\n // Merge per-use-case options with global config defaults\r\n const useCaseConfig = config.get<UseCaseConfigurations>(\"use-cases\", defaultUseCaseOptions);\r\n const benchmark = options.benchmark ?? useCaseConfig?.benchmark ?? true;\r\n const retryConfig = options.retry ?? useCaseConfig?.retry;\r\n const broadcast = options.broadcast;\r\n const broadcastConfig = useCaseConfig?.broadcast;\r\n const logEnabled = useCaseConfig?.log === true;\r\n\r\n $registerUseCase(name, {\r\n ...options,\r\n calls: { success: 0, failed: 0, total: 0 },\r\n });\r\n\r\n const useCaseHandler = async (\r\n data: Input,\r\n {\r\n ctx = {},\r\n id = `uc-${name}-` + Random.string(),\r\n onExecuting: invocationOnExecuting,\r\n onCompleted: invocationOnCompleted,\r\n onError: invocationOnError,\r\n }: UseCaseRuntimeOptions = {},\r\n ): Promise<Output> => {\r\n ctx.schema = schema;\r\n ctx.id = id;\r\n\r\n const startedAt = new Date();\r\n let output: Output | undefined;\r\n let error: Error | undefined;\r\n let benchmarkResult: { latency: number; state: \"excellent\" | \"good\" | \"poor\" } | undefined;\r\n let currentRetry = 0;\r\n\r\n if (logEnabled) {\r\n log.debug(\"use-cases\", name, \"executing\", { id });\r\n }\r\n\r\n try {\r\n const transformed = await runPipeline<Input>({\r\n name,\r\n id,\r\n data,\r\n ctx,\r\n startedAt,\r\n schema,\r\n guards,\r\n before,\r\n onExecuting: invocationOnExecuting,\r\n ucOnExecuting: onExecuting,\r\n });\r\n\r\n // Benchmark wraps ONLY the handler (per attempt) so latency reflects business\r\n // logic — not the guard/validation prelude, and not the retry backoff delays.\r\n const runHandler = async (): Promise<Output> => {\r\n if (!benchmark) {\r\n return handler(transformed, ctx);\r\n }\r\n\r\n const measured = await measure(\r\n name,\r\n () => handler(transformed, ctx),\r\n benchmark === true ? undefined : benchmark,\r\n );\r\n\r\n benchmarkResult = { latency: measured.latency, state: measured.state };\r\n\r\n // measure() never throws — it returns an error result. Re-throw so retry\r\n // and the outer catch handle failures uniformly.\r\n if (!measured.success) {\r\n throw measured.error;\r\n }\r\n\r\n return measured.value;\r\n };\r\n\r\n output = retryConfig\r\n ? await runWithRetry(runHandler, {\r\n ...retryConfig,\r\n onError: (retryError, attempt) => {\r\n currentRetry = attempt;\r\n retryConfig.onError?.(retryError, attempt);\r\n },\r\n })\r\n : await runHandler();\r\n } catch (err) {\r\n error = err as Error;\r\n }\r\n\r\n const endedAt = new Date();\r\n\r\n // After middleware — fire-and-forget side effects, only on success\r\n if (!error && after && output !== undefined) {\r\n for (const middleware of after) {\r\n try {\r\n await middleware(output, ctx);\r\n } catch (afterError) {\r\n log.error(\"use-cases\", name, \"after middleware failed\", { error: afterError });\r\n }\r\n }\r\n }\r\n\r\n const snapshot: UseCaseResult<Output> = {\r\n output,\r\n ctx,\r\n startedAt,\r\n endedAt,\r\n id,\r\n name,\r\n retries: retryConfig\r\n ? { attempts: retryConfig.attempts ?? 3, delay: retryConfig.delay, currentRetry }\r\n : undefined,\r\n benchmarkResult,\r\n // Set per-branch below so the counter reflects the actual outcome —\r\n // a failure must never increment the success tally.\r\n calls: 0,\r\n };\r\n\r\n if (error) {\r\n snapshot.calls = increaseUseCaseFailedCalls(name);\r\n\r\n if (logEnabled) {\r\n log.error(\"use-cases\", name, \"failed\", { id, error });\r\n }\r\n\r\n await fireLifecycleEvent<UseCaseErrorResult>(\r\n { ...except(snapshot, [\"output\"]), error },\r\n {\r\n invocation: invocationOnError ? [invocationOnError] : undefined,\r\n useCase: onError ? [onError] : undefined,\r\n global: globalEventsCallbacksMap.onError.length\r\n ? globalEventsCallbacksMap.onError\r\n : undefined,\r\n },\r\n );\r\n\r\n throw error;\r\n }\r\n\r\n snapshot.calls = increaseUseCaseSuccessCalls(name);\r\n\r\n if (logEnabled) {\r\n log.debug(\"use-cases\", name, \"completed\", { id, latency: benchmarkResult?.latency });\r\n }\r\n\r\n await addUseCaseHistory(name, snapshot);\r\n\r\n await fireLifecycleEvent<UseCaseResult<Output>>(snapshot, {\r\n invocation: invocationOnCompleted ? [invocationOnCompleted] : undefined,\r\n useCase: onCompleted ? [onCompleted] : undefined,\r\n global: globalEventsCallbacksMap.onCompleted.length\r\n ? globalEventsCallbacksMap.onCompleted\r\n : undefined,\r\n });\r\n\r\n await broadcastUseCaseResult({\r\n name,\r\n id,\r\n output: output!,\r\n result: snapshot,\r\n broadcast,\r\n config: broadcastConfig,\r\n });\r\n\r\n return output!;\r\n };\r\n\r\n useCaseHandler.$cleanup = () => {\r\n $unregisterUseCase(name);\r\n };\r\n\r\n return useCaseHandler;\r\n}\r\n"],"mappings":"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"}
1
+ {"version":3,"file":"use-case.mjs","names":["runWithRetry"],"sources":["../../../../../../../@warlock.js/core/src/use-cases/use-case.ts"],"sourcesContent":["import { except, Random, retry as runWithRetry } from \"@mongez/reinforcements\";\nimport { log } from \"@warlock.js/logger\";\nimport type { Infer, ObjectValidator } from \"@warlock.js/seal\";\nimport { measure } from \"../benchmark\";\nimport { config } from \"../config\";\nimport type {\n UseCase,\n UseCaseConfigurations,\n UseCaseContext,\n UseCaseErrorResult,\n UseCaseHandler,\n UseCaseResult,\n UseCaseRuntimeOptions,\n UseCaseWithSchema,\n} from \"./types\";\nimport { broadcastUseCaseResult } from \"./use-case-broadcast\";\nimport { fireLifecycleEvent, globalEventsCallbacksMap } from \"./use-case-events\";\nimport { runPipeline } from \"./use-case-pipeline\";\nimport {\n $registerUseCase,\n $unregisterUseCase,\n addUseCaseHistory,\n increaseUseCaseFailedCalls,\n increaseUseCaseSuccessCalls,\n} from \"./use-cases-registry\";\n\nconst defaultUseCaseOptions: UseCaseConfigurations = {\n benchmark: true,\n};\n\n/**\n * Defines and registers a use case.\n *\n * A use case is a named, observable, optionally benchmarked unit of business logic.\n * The returned handler is a typed async function you call with the input data.\n *\n * Execution order: onExecuting → guards → validation → before → handler → after →\n * onCompleted → broadcast. Retry and benchmark wrap the **handler** only.\n *\n * When a `schema` is provided, the handler's input is inferred from it — no manual\n * `Input` generic needed.\n *\n * @example\n * export const createOrderUseCase = useCase({\n * name: \"create_order\",\n * schema: createOrderSchema, // handler `data` is inferred from this\n * guards: [authGuard],\n * handler: async (data, ctx) => orderService.create(data),\n * after: [sendConfirmationEmail],\n * retry: { attempts: 3, delay: 500, backoff: \"exponential\" },\n * broadcast: true,\n * });\n *\n * // In a controller:\n * const output = await createOrderUseCase({ ...validated, user_id: req.user.id });\n */\nexport function useCase<\n Output,\n Schema extends ObjectValidator,\n Ctx extends UseCaseContext = UseCaseContext,\n>(options: UseCaseWithSchema<Output, Schema, Ctx>): UseCaseHandler<Output, Infer<Schema>>;\nexport function useCase<Output = any, Input = any, Ctx extends UseCaseContext = UseCaseContext>(\n options: UseCase<Output, Input, Ctx>,\n): UseCaseHandler<Output, Input>;\nexport function useCase<Output = any, Input = any>(\n options: UseCase<Output, Input>,\n): UseCaseHandler<Output, Input> {\n const { name, handler, schema, guards, before, after, onExecuting, onCompleted, onError } =\n options;\n\n // Merge per-use-case options with global config defaults\n const useCaseConfig = config.get<UseCaseConfigurations>(\"use-cases\", defaultUseCaseOptions);\n const benchmark = options.benchmark ?? useCaseConfig?.benchmark ?? true;\n const retryConfig = options.retry ?? useCaseConfig?.retry;\n const broadcast = options.broadcast;\n const broadcastConfig = useCaseConfig?.broadcast;\n const logEnabled = useCaseConfig?.log === true;\n\n $registerUseCase(name, {\n ...options,\n calls: { success: 0, failed: 0, total: 0 },\n });\n\n const useCaseHandler = async (\n data: Input,\n {\n ctx = {},\n id = `uc-${name}-` + Random.string(),\n onExecuting: invocationOnExecuting,\n onCompleted: invocationOnCompleted,\n onError: invocationOnError,\n }: UseCaseRuntimeOptions = {},\n ): Promise<Output> => {\n ctx.schema = schema;\n ctx.id = id;\n\n const startedAt = new Date();\n let output: Output | undefined;\n let error: Error | undefined;\n let benchmarkResult: { latency: number; state: \"excellent\" | \"good\" | \"poor\" } | undefined;\n // 1-based count of failed attempts (reinforcements' `attempt` arg). Translated\n // into \"retries performed\" at snapshot time — see the `currentRetry` derivation.\n let failedAttempts = 0;\n\n if (logEnabled) {\n log.debug(\"use-cases\", name, \"executing\", { id });\n }\n\n try {\n const transformed = await runPipeline<Input>({\n name,\n id,\n data,\n ctx,\n startedAt,\n schema,\n guards,\n before,\n onExecuting: invocationOnExecuting,\n ucOnExecuting: onExecuting,\n });\n\n // Benchmark wraps ONLY the handler (per attempt) so latency reflects business\n // logic — not the guard/validation prelude, and not the retry backoff delays.\n const runHandler = async (): Promise<Output> => {\n if (!benchmark) {\n return handler(transformed, ctx);\n }\n\n const measured = await measure(\n name,\n () => handler(transformed, ctx),\n benchmark === true ? undefined : benchmark,\n );\n\n benchmarkResult = { latency: measured.latency, state: measured.state };\n\n // measure() never throws — it returns an error result. Re-throw so retry\n // and the outer catch handle failures uniformly.\n if (!measured.success) {\n throw measured.error;\n }\n\n return measured.value;\n };\n\n output = retryConfig\n ? await runWithRetry(runHandler, {\n ...retryConfig,\n onError: (retryError, attempt) => {\n failedAttempts = attempt;\n retryConfig.onError?.(retryError, attempt);\n },\n })\n : await runHandler();\n } catch (err) {\n error = err as Error;\n }\n\n const endedAt = new Date();\n\n // After middleware — fire-and-forget side effects, only on success.\n // Keyed off the error flag alone so void handlers (which return undefined)\n // still run their after middleware.\n if (!error && after) {\n for (const middleware of after) {\n try {\n // On the success path `output` holds the handler's return value; for a\n // void handler that's undefined, which the middleware receives as-is.\n await middleware(output as Output, ctx);\n } catch (afterError) {\n log.error(\"use-cases\", name, \"after middleware failed\", { error: afterError });\n }\n }\n }\n\n // Retries actually performed (0 = succeeded on the first try). On success every\n // failed attempt was followed by a retry; on failure the final failed attempt\n // was NOT retried, so it doesn't count as a retry performed.\n const currentRetry = error ? Math.max(failedAttempts - 1, 0) : failedAttempts;\n\n const snapshot: UseCaseResult<Output> = {\n output,\n ctx,\n startedAt,\n endedAt,\n id,\n name,\n retries: retryConfig\n ? { attempts: retryConfig.attempts ?? 3, delay: retryConfig.delay, currentRetry }\n : undefined,\n benchmarkResult,\n // Set per-branch below so the counter reflects the actual outcome —\n // a failure must never increment the success tally.\n calls: 0,\n };\n\n if (error) {\n snapshot.calls = increaseUseCaseFailedCalls(name);\n\n if (logEnabled) {\n log.error(\"use-cases\", name, \"failed\", { id, error });\n }\n\n await fireLifecycleEvent<UseCaseErrorResult>(\n { ...except(snapshot, [\"output\"]), error },\n {\n invocation: invocationOnError ? [invocationOnError] : undefined,\n useCase: onError ? [onError] : undefined,\n global: globalEventsCallbacksMap.onError.length\n ? globalEventsCallbacksMap.onError\n : undefined,\n },\n );\n\n throw error;\n }\n\n snapshot.calls = increaseUseCaseSuccessCalls(name);\n\n if (logEnabled) {\n log.debug(\"use-cases\", name, \"completed\", { id, latency: benchmarkResult?.latency });\n }\n\n // History is best-effort — a cache rejection must not turn a successful run\n // into a thrown error or skip onCompleted/broadcast.\n try {\n await addUseCaseHistory(name, snapshot);\n } catch (historyError) {\n log.error(\"use-cases\", name, \"history persistence failed\", { id, error: historyError });\n }\n\n await fireLifecycleEvent<UseCaseResult<Output>>(snapshot, {\n invocation: invocationOnCompleted ? [invocationOnCompleted] : undefined,\n useCase: onCompleted ? [onCompleted] : undefined,\n global: globalEventsCallbacksMap.onCompleted.length\n ? globalEventsCallbacksMap.onCompleted\n : undefined,\n });\n\n await broadcastUseCaseResult({\n name,\n id,\n // A void handler resolves to undefined — broadcast it as-is rather than\n // asserting a non-null value that would fabricate a bogus payload.\n output: output as Output,\n result: snapshot,\n broadcast,\n config: broadcastConfig,\n });\n\n return output as Output;\n };\n\n useCaseHandler.$cleanup = () => {\n $unregisterUseCase(name);\n };\n\n return useCaseHandler;\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { RegisteredUseCase, UseCase, UseCaseResult } from "./types.mjs";
1
+ import { RegisteredUseCase, UseCaseResult } from "./types.mjs";
2
2
 
3
3
  //#region ../@warlock.js/core/src/use-cases/use-cases-registry.d.ts
4
4
  /**
@@ -6,13 +6,21 @@ import { RegisteredUseCase, UseCase, UseCaseResult } from "./types.mjs";
6
6
  */
7
7
  declare function $registerUseCase<Output, Input>(name: string, useCase: RegisteredUseCase<Output, Input>): void;
8
8
  /**
9
- * Unregister a use case
9
+ * Unregister a use case.
10
+ *
11
+ * Dropping the history namespace is best-effort: `$cleanup` is synchronous, so the
12
+ * async cache removal is fire-and-forget with a `.catch` guard — a rejecting cache
13
+ * driver must never turn cleanup into an unhandled rejection.
10
14
  */
11
15
  declare function $unregisterUseCase(name: string): void;
12
16
  /**
13
- * Get a use case
17
+ * Get a use case.
18
+ *
19
+ * Returns the `RegisteredUseCase` shape — including the runtime `calls` counters
20
+ * the registry actually stores — so consumers can read call stats without an
21
+ * ad-hoc cast.
14
22
  */
15
- declare function getUseCase<Output, Input>(name: string): UseCase<Output, Input> | undefined;
23
+ declare function getUseCase<Output, Input>(name: string): RegisteredUseCase<Output, Input> | undefined;
16
24
  /**
17
25
  * Get all use cases
18
26
  */
@@ -1 +1 @@
1
- {"version":3,"file":"use-cases-registry.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/use-cases/use-cases-registry.ts"],"mappings":";;;;;AAaA;iBAAgB,gBAAA,gBACd,IAAA,UACA,OAAA,EAAS,iBAAA,CAAkB,MAAA,EAAQ,KAAA;;;;iBAgBrB,kBAAA,CAAmB,IAAY;;;;iBAS/B,UAAA,gBAA0B,IAAA,WACJ,OAAA,CAAQ,MAAA,EAAQ,KAAA;;;;iBAMtC,WAAA,IAAW,GAAA,SAAA,iBAAA;;;AAhCgB;iBAuC3B,2BAAA,CAA4B,IAAY;;;;iBAexC,0BAAA,CAA2B,IAAY;AA7BvD;;;;;AAAA,iBAwDsB,iBAAA,CAAkB,IAAA,WAAe,OAAO,CAAC,aAAA;;;;;iBA8BzC,iBAAA,CAAkB,IAAA,UAAc,MAAA,EAAQ,aAAA,QAAkB,OAAA"}
1
+ {"version":3,"file":"use-cases-registry.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/use-cases/use-cases-registry.ts"],"mappings":";;;;;AAaA;iBAAgB,gBAAA,gBACd,IAAA,UACA,OAAA,EAAS,iBAAA,CAAkB,MAAA,EAAQ,KAAA;;;;;;;;iBAoBrB,kBAAA,CAAmB,IAAY;;;;;;;AApBJ;iBAmC3B,UAAA,gBAA0B,IAAA,WACJ,iBAAA,CAAkB,MAAA,EAAQ,KAAA;;;;iBAMhD,WAAA,IAAW,GAAA,SAAA,iBAAA;AAP3B;;;AAAA,iBAcgB,2BAAA,CAA4B,IAAY;;;;iBAexC,0BAAA,CAA2B,IAAY;;;;;;iBA2BjC,iBAAA,CAAkB,IAAA,WAAe,OAAO,CAAC,aAAA;;AAvDM;AAMrE;;iBA+EsB,iBAAA,CAAkB,IAAA,UAAc,MAAA,EAAQ,aAAA,QAAkB,OAAA"}