@warlock.js/core 4.3.0 → 4.5.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 (903) hide show
  1. package/CHANGELOG.md +61 -6
  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 +1157 -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/spawn-sub-agent.mjs +68 -0
  17. package/esm/ai/src/agent/spawn-sub-agent.mjs.map +1 -0
  18. package/esm/ai/src/ai.mjs +155 -0
  19. package/esm/ai/src/ai.mjs.map +1 -0
  20. package/esm/ai/src/batch/batch.mjs +198 -0
  21. package/esm/ai/src/batch/batch.mjs.map +1 -0
  22. package/esm/ai/src/batch/index.mjs +3 -0
  23. package/esm/ai/src/batch/run-batch-item.mjs +100 -0
  24. package/esm/ai/src/batch/run-batch-item.mjs.map +1 -0
  25. package/esm/ai/src/batch/run-with-concurrency.mjs +39 -0
  26. package/esm/ai/src/batch/run-with-concurrency.mjs.map +1 -0
  27. package/esm/ai/src/checkpoint/memory.mjs +0 -0
  28. package/esm/ai/src/checkpoint/memory.mjs.map +1 -0
  29. package/esm/ai/src/checkpoint/pg.mjs +265 -0
  30. package/esm/ai/src/checkpoint/pg.mjs.map +1 -0
  31. package/esm/ai/src/checkpoint/redis.mjs +200 -0
  32. package/esm/ai/src/checkpoint/redis.mjs.map +1 -0
  33. package/esm/ai/src/config.mjs +59 -0
  34. package/esm/ai/src/config.mjs.map +1 -0
  35. package/esm/ai/src/contracts/end.type.mjs +47 -0
  36. package/esm/ai/src/contracts/end.type.mjs.map +1 -0
  37. package/esm/ai/src/errors/agent-cancelled-error.mjs +43 -0
  38. package/esm/ai/src/errors/agent-cancelled-error.mjs.map +1 -0
  39. package/esm/ai/src/errors/agent-execution-error.mjs +35 -0
  40. package/esm/ai/src/errors/agent-execution-error.mjs.map +1 -0
  41. package/esm/ai/src/errors/agent-max-trips-error.mjs +41 -0
  42. package/esm/ai/src/errors/agent-max-trips-error.mjs.map +1 -0
  43. package/esm/ai/src/errors/ai-error.mjs +68 -0
  44. package/esm/ai/src/errors/ai-error.mjs.map +1 -0
  45. package/esm/ai/src/errors/budget-exceeded-error.mjs +31 -0
  46. package/esm/ai/src/errors/budget-exceeded-error.mjs.map +1 -0
  47. package/esm/ai/src/errors/content-filter-error.mjs +28 -0
  48. package/esm/ai/src/errors/content-filter-error.mjs.map +1 -0
  49. package/esm/ai/src/errors/context-length-exceeded-error.mjs +31 -0
  50. package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +1 -0
  51. package/esm/ai/src/errors/guardrail-violation-error.mjs +41 -0
  52. package/esm/ai/src/errors/guardrail-violation-error.mjs.map +1 -0
  53. package/esm/ai/src/errors/index.mjs +37 -0
  54. package/esm/ai/src/errors/invalid-request-error.mjs +31 -0
  55. package/esm/ai/src/errors/invalid-request-error.mjs.map +1 -0
  56. package/esm/ai/src/errors/max-iterations-error.mjs +32 -0
  57. package/esm/ai/src/errors/max-iterations-error.mjs.map +1 -0
  58. package/esm/ai/src/errors/max-steps-exceeded-error.mjs +21 -0
  59. package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +1 -0
  60. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +31 -0
  61. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +1 -0
  62. package/esm/ai/src/errors/orchestrator-config-error.mjs +30 -0
  63. package/esm/ai/src/errors/orchestrator-config-error.mjs.map +1 -0
  64. package/esm/ai/src/errors/orchestrator-drift-error.mjs +37 -0
  65. package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +1 -0
  66. package/esm/ai/src/errors/orchestrator-failed-error.mjs +36 -0
  67. package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +1 -0
  68. package/esm/ai/src/errors/outbound-policy-error.mjs +32 -0
  69. package/esm/ai/src/errors/outbound-policy-error.mjs.map +1 -0
  70. package/esm/ai/src/errors/planner-cancelled-error.mjs +29 -0
  71. package/esm/ai/src/errors/planner-cancelled-error.mjs.map +1 -0
  72. package/esm/ai/src/errors/planner-failed-error.mjs +37 -0
  73. package/esm/ai/src/errors/planner-failed-error.mjs.map +1 -0
  74. package/esm/ai/src/errors/planner-plan-invalid-error.mjs +25 -0
  75. package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +1 -0
  76. package/esm/ai/src/errors/provider-auth-error.mjs +26 -0
  77. package/esm/ai/src/errors/provider-auth-error.mjs.map +1 -0
  78. package/esm/ai/src/errors/provider-error.mjs +42 -0
  79. package/esm/ai/src/errors/provider-error.mjs.map +1 -0
  80. package/esm/ai/src/errors/provider-rate-limit-error.mjs +31 -0
  81. package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +1 -0
  82. package/esm/ai/src/errors/provider-timeout-error.mjs +26 -0
  83. package/esm/ai/src/errors/provider-timeout-error.mjs.map +1 -0
  84. package/esm/ai/src/errors/quota-exceeded-error.mjs +40 -0
  85. package/esm/ai/src/errors/quota-exceeded-error.mjs.map +1 -0
  86. package/esm/ai/src/errors/routing-error.mjs +23 -0
  87. package/esm/ai/src/errors/routing-error.mjs.map +1 -0
  88. package/esm/ai/src/errors/schema-validation-error.mjs +37 -0
  89. package/esm/ai/src/errors/schema-validation-error.mjs.map +1 -0
  90. package/esm/ai/src/errors/step-failed-error.mjs +19 -0
  91. package/esm/ai/src/errors/step-failed-error.mjs.map +1 -0
  92. package/esm/ai/src/errors/supervisor-cancelled-error.mjs +29 -0
  93. package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +1 -0
  94. package/esm/ai/src/errors/supervisor-drift-error.mjs +30 -0
  95. package/esm/ai/src/errors/supervisor-drift-error.mjs.map +1 -0
  96. package/esm/ai/src/errors/supervisor-failed-error.mjs +43 -0
  97. package/esm/ai/src/errors/supervisor-failed-error.mjs.map +1 -0
  98. package/esm/ai/src/errors/supervisor-routing-error.mjs +39 -0
  99. package/esm/ai/src/errors/supervisor-routing-error.mjs.map +1 -0
  100. package/esm/ai/src/errors/tool-execution-error.mjs +32 -0
  101. package/esm/ai/src/errors/tool-execution-error.mjs.map +1 -0
  102. package/esm/ai/src/errors/workflow-cancelled-error.mjs +23 -0
  103. package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +1 -0
  104. package/esm/ai/src/errors/workflow-drift-error.mjs +24 -0
  105. package/esm/ai/src/errors/workflow-drift-error.mjs.map +1 -0
  106. package/esm/ai/src/errors/workflow-error.mjs +18 -0
  107. package/esm/ai/src/errors/workflow-error.mjs.map +1 -0
  108. package/esm/ai/src/eval/dataset.mjs +112 -0
  109. package/esm/ai/src/eval/dataset.mjs.map +1 -0
  110. package/esm/ai/src/eval/eval-runner.mjs +135 -0
  111. package/esm/ai/src/eval/eval-runner.mjs.map +1 -0
  112. package/esm/ai/src/eval/index.mjs +48 -0
  113. package/esm/ai/src/eval/index.mjs.map +1 -0
  114. package/esm/ai/src/eval/judge-scorer.mjs +87 -0
  115. package/esm/ai/src/eval/judge-scorer.mjs.map +1 -0
  116. package/esm/ai/src/eval/regression.mjs +51 -0
  117. package/esm/ai/src/eval/regression.mjs.map +1 -0
  118. package/esm/ai/src/eval/report-json.mjs +33 -0
  119. package/esm/ai/src/eval/report-json.mjs.map +1 -0
  120. package/esm/ai/src/eval/report-junit.mjs +60 -0
  121. package/esm/ai/src/eval/report-junit.mjs.map +1 -0
  122. package/esm/ai/src/eval/scorers.mjs +101 -0
  123. package/esm/ai/src/eval/scorers.mjs.map +1 -0
  124. package/esm/ai/src/guard/detectors/index.mjs +6 -0
  125. package/esm/ai/src/guard/detectors/injection.mjs +254 -0
  126. package/esm/ai/src/guard/detectors/injection.mjs.map +1 -0
  127. package/esm/ai/src/guard/detectors/moderation.mjs +134 -0
  128. package/esm/ai/src/guard/detectors/moderation.mjs.map +1 -0
  129. package/esm/ai/src/guard/detectors/pii.mjs +199 -0
  130. package/esm/ai/src/guard/detectors/pii.mjs.map +1 -0
  131. package/esm/ai/src/guard/detectors/topic.mjs +99 -0
  132. package/esm/ai/src/guard/detectors/topic.mjs.map +1 -0
  133. package/esm/ai/src/guard/errors.mjs +18 -0
  134. package/esm/ai/src/guard/errors.mjs.map +1 -0
  135. package/esm/ai/src/guard/guard.mjs +209 -0
  136. package/esm/ai/src/guard/guard.mjs.map +1 -0
  137. package/esm/ai/src/guard/guardrail.mjs +22 -0
  138. package/esm/ai/src/guard/guardrail.mjs.map +1 -0
  139. package/esm/ai/src/human/errors.mjs +60 -0
  140. package/esm/ai/src/human/errors.mjs.map +1 -0
  141. package/esm/ai/src/human/human-approval.mjs +170 -0
  142. package/esm/ai/src/human/human-approval.mjs.map +1 -0
  143. package/esm/ai/src/human/policy.mjs +67 -0
  144. package/esm/ai/src/human/policy.mjs.map +1 -0
  145. package/esm/ai/src/human/register.mjs +37 -0
  146. package/esm/ai/src/human/register.mjs.map +1 -0
  147. package/esm/ai/src/human/resume-seed.mjs +53 -0
  148. package/esm/ai/src/human/resume-seed.mjs.map +1 -0
  149. package/esm/ai/src/human/resume.mjs +121 -0
  150. package/esm/ai/src/human/resume.mjs.map +1 -0
  151. package/esm/ai/src/human/stores/index.mjs +5 -0
  152. package/esm/ai/src/human/stores/memory.mjs +91 -0
  153. package/esm/ai/src/human/stores/memory.mjs.map +1 -0
  154. package/esm/ai/src/human/stores/pg.mjs +220 -0
  155. package/esm/ai/src/human/stores/pg.mjs.map +1 -0
  156. package/esm/ai/src/human/stores/redis.mjs +201 -0
  157. package/esm/ai/src/human/stores/redis.mjs.map +1 -0
  158. package/esm/ai/src/index.mjs +174 -0
  159. package/esm/ai/src/memory/derive-id.mjs +24 -0
  160. package/esm/ai/src/memory/derive-id.mjs.map +1 -0
  161. package/esm/ai/src/memory/episodic-memory.mjs +106 -0
  162. package/esm/ai/src/memory/episodic-memory.mjs.map +1 -0
  163. package/esm/ai/src/memory/memory.mjs +166 -0
  164. package/esm/ai/src/memory/memory.mjs.map +1 -0
  165. package/esm/ai/src/memory/procedural-memory.mjs +103 -0
  166. package/esm/ai/src/memory/procedural-memory.mjs.map +1 -0
  167. package/esm/ai/src/memory/semantic-memory.mjs +80 -0
  168. package/esm/ai/src/memory/semantic-memory.mjs.map +1 -0
  169. package/esm/ai/src/memory/working-memory.mjs +62 -0
  170. package/esm/ai/src/memory/working-memory.mjs.map +1 -0
  171. package/esm/ai/src/middleware/builtins/budget.mjs +219 -0
  172. package/esm/ai/src/middleware/builtins/budget.mjs.map +1 -0
  173. package/esm/ai/src/middleware/builtins/guardrail.mjs +76 -0
  174. package/esm/ai/src/middleware/builtins/guardrail.mjs.map +1 -0
  175. package/esm/ai/src/middleware/builtins/semantic-cache.mjs +149 -0
  176. package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +1 -0
  177. package/esm/ai/src/middleware/helpers/compose.mjs +52 -0
  178. package/esm/ai/src/middleware/helpers/compose.mjs.map +1 -0
  179. package/esm/ai/src/middleware/helpers/for-tool.mjs +80 -0
  180. package/esm/ai/src/middleware/helpers/for-tool.mjs.map +1 -0
  181. package/esm/ai/src/middleware/index.mjs +10 -0
  182. package/esm/ai/src/middleware/pipeline.mjs +100 -0
  183. package/esm/ai/src/middleware/pipeline.mjs.map +1 -0
  184. package/esm/ai/src/middleware/utils/extract-user-text.mjs +47 -0
  185. package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +1 -0
  186. package/esm/ai/src/middleware/utils/namespaced-state.mjs +60 -0
  187. package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +1 -0
  188. package/esm/ai/src/mock/index.mjs +4 -0
  189. package/esm/ai/src/mock/mock-agent.mjs +3 -0
  190. package/esm/ai/src/mock/mock-router.mjs +58 -0
  191. package/esm/ai/src/mock/mock-router.mjs.map +1 -0
  192. package/esm/ai/src/model/fallback-model.mjs +218 -0
  193. package/esm/ai/src/model/fallback-model.mjs.map +1 -0
  194. package/esm/ai/src/model/index.mjs +3 -0
  195. package/esm/ai/src/object-stream/index.mjs +4 -0
  196. package/esm/ai/src/object-stream/parse-partial-json.mjs +78 -0
  197. package/esm/ai/src/object-stream/parse-partial-json.mjs.map +1 -0
  198. package/esm/ai/src/object-stream/stream-object.mjs +97 -0
  199. package/esm/ai/src/object-stream/stream-object.mjs.map +1 -0
  200. package/esm/ai/src/observe/index.mjs +4 -0
  201. package/esm/ai/src/observe/observer-registry.mjs +35 -0
  202. package/esm/ai/src/observe/observer-registry.mjs.map +1 -0
  203. package/esm/ai/src/observe/resolve-observers.mjs +73 -0
  204. package/esm/ai/src/observe/resolve-observers.mjs.map +1 -0
  205. package/esm/ai/src/orchestrator/as-tool.mjs +98 -0
  206. package/esm/ai/src/orchestrator/as-tool.mjs.map +1 -0
  207. package/esm/ai/src/orchestrator/checkpoint.mjs +75 -0
  208. package/esm/ai/src/orchestrator/checkpoint.mjs.map +1 -0
  209. package/esm/ai/src/orchestrator/commands.mjs +34 -0
  210. package/esm/ai/src/orchestrator/commands.mjs.map +1 -0
  211. package/esm/ai/src/orchestrator/compaction.mjs +206 -0
  212. package/esm/ai/src/orchestrator/compaction.mjs.map +1 -0
  213. package/esm/ai/src/orchestrator/dispatch.mjs +171 -0
  214. package/esm/ai/src/orchestrator/dispatch.mjs.map +1 -0
  215. package/esm/ai/src/orchestrator/emitter.mjs +85 -0
  216. package/esm/ai/src/orchestrator/emitter.mjs.map +1 -0
  217. package/esm/ai/src/orchestrator/execution.mjs +395 -0
  218. package/esm/ai/src/orchestrator/execution.mjs.map +1 -0
  219. package/esm/ai/src/orchestrator/index.mjs +11 -0
  220. package/esm/ai/src/orchestrator/load.mjs +49 -0
  221. package/esm/ai/src/orchestrator/load.mjs.map +1 -0
  222. package/esm/ai/src/orchestrator/lock.mjs +75 -0
  223. package/esm/ai/src/orchestrator/lock.mjs.map +1 -0
  224. package/esm/ai/src/orchestrator/memory.mjs +141 -0
  225. package/esm/ai/src/orchestrator/memory.mjs.map +1 -0
  226. package/esm/ai/src/orchestrator/orchestrator-stream.mjs +98 -0
  227. package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +1 -0
  228. package/esm/ai/src/orchestrator/orchestrator.mjs +206 -0
  229. package/esm/ai/src/orchestrator/orchestrator.mjs.map +1 -0
  230. package/esm/ai/src/orchestrator/resume.mjs +74 -0
  231. package/esm/ai/src/orchestrator/resume.mjs.map +1 -0
  232. package/esm/ai/src/orchestrator/session-lock.mjs +83 -0
  233. package/esm/ai/src/orchestrator/session-lock.mjs.map +1 -0
  234. package/esm/ai/src/orchestrator/signature.mjs +120 -0
  235. package/esm/ai/src/orchestrator/signature.mjs.map +1 -0
  236. package/esm/ai/src/orchestrator/window.mjs +56 -0
  237. package/esm/ai/src/orchestrator/window.mjs.map +1 -0
  238. package/esm/ai/src/planner/dag-scheduler.mjs +97 -0
  239. package/esm/ai/src/planner/dag-scheduler.mjs.map +1 -0
  240. package/esm/ai/src/planner/index.mjs +6 -0
  241. package/esm/ai/src/planner/plan-prompt.mjs +31 -0
  242. package/esm/ai/src/planner/plan-prompt.mjs.map +1 -0
  243. package/esm/ai/src/planner/plan-schema.mjs +120 -0
  244. package/esm/ai/src/planner/plan-schema.mjs.map +1 -0
  245. package/esm/ai/src/planner/planner-run.mjs +614 -0
  246. package/esm/ai/src/planner/planner-run.mjs.map +1 -0
  247. package/esm/ai/src/planner/planner.mjs +120 -0
  248. package/esm/ai/src/planner/planner.mjs.map +1 -0
  249. package/esm/ai/src/planner/signature.mjs +27 -0
  250. package/esm/ai/src/planner/signature.mjs.map +1 -0
  251. package/esm/ai/src/prompt/errors.mjs +73 -0
  252. package/esm/ai/src/prompt/errors.mjs.map +1 -0
  253. package/esm/ai/src/prompt/index.mjs +4 -0
  254. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +104 -0
  255. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +1 -0
  256. package/esm/ai/src/prompt/prompt-validate.mjs +170 -0
  257. package/esm/ai/src/prompt/prompt-validate.mjs.map +1 -0
  258. package/esm/ai/src/prompt/prompt.mjs +218 -0
  259. package/esm/ai/src/prompt/prompt.mjs.map +1 -0
  260. package/esm/ai/src/prompts/index.mjs +3 -0
  261. package/esm/ai/src/prompts/prompts-manager.mjs +410 -0
  262. package/esm/ai/src/prompts/prompts-manager.mjs.map +1 -0
  263. package/esm/ai/src/prompts/prompts-validate.mjs +200 -0
  264. package/esm/ai/src/prompts/prompts-validate.mjs.map +1 -0
  265. package/esm/ai/src/rag/as-tool.mjs +48 -0
  266. package/esm/ai/src/rag/as-tool.mjs.map +1 -0
  267. package/esm/ai/src/rag/chunk/chunk.mjs +44 -0
  268. package/esm/ai/src/rag/chunk/chunk.mjs.map +1 -0
  269. package/esm/ai/src/rag/chunk/fixed.mjs +32 -0
  270. package/esm/ai/src/rag/chunk/fixed.mjs.map +1 -0
  271. package/esm/ai/src/rag/chunk/markdown.mjs +75 -0
  272. package/esm/ai/src/rag/chunk/markdown.mjs.map +1 -0
  273. package/esm/ai/src/rag/chunk/recursive.mjs +132 -0
  274. package/esm/ai/src/rag/chunk/recursive.mjs.map +1 -0
  275. package/esm/ai/src/rag/chunk/sentence.mjs +73 -0
  276. package/esm/ai/src/rag/chunk/sentence.mjs.map +1 -0
  277. package/esm/ai/src/rag/index.mjs +7 -0
  278. package/esm/ai/src/rag/rag.mjs +126 -0
  279. package/esm/ai/src/rag/rag.mjs.map +1 -0
  280. package/esm/ai/src/rag/rerank/keyword-reranker.mjs +58 -0
  281. package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +1 -0
  282. package/esm/ai/src/rag/rerank/llm-reranker.mjs +85 -0
  283. package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +1 -0
  284. package/esm/ai/src/rag/retrieve.mjs +68 -0
  285. package/esm/ai/src/rag/retrieve.mjs.map +1 -0
  286. package/esm/ai/src/rag/store/cache-vector-store.mjs +48 -0
  287. package/esm/ai/src/rag/store/cache-vector-store.mjs.map +1 -0
  288. package/esm/ai/src/security/index.mjs +5 -0
  289. package/esm/ai/src/security/outbound-policy.mjs +187 -0
  290. package/esm/ai/src/security/outbound-policy.mjs.map +1 -0
  291. package/esm/ai/src/security/private-ip.mjs +48 -0
  292. package/esm/ai/src/security/private-ip.mjs.map +1 -0
  293. package/esm/ai/src/security/redact.mjs +60 -0
  294. package/esm/ai/src/security/redact.mjs.map +1 -0
  295. package/esm/ai/src/serve/serve.mjs +90 -0
  296. package/esm/ai/src/serve/serve.mjs.map +1 -0
  297. package/esm/ai/src/serve/sse.mjs +25 -0
  298. package/esm/ai/src/serve/sse.mjs.map +1 -0
  299. package/esm/ai/src/serve/stream-to-sse.mjs +37 -0
  300. package/esm/ai/src/serve/stream-to-sse.mjs.map +1 -0
  301. package/esm/ai/src/skills/catalog.mjs +140 -0
  302. package/esm/ai/src/skills/catalog.mjs.map +1 -0
  303. package/esm/ai/src/skills/index.mjs +11 -0
  304. package/esm/ai/src/skills/load-skill-tool.mjs +65 -0
  305. package/esm/ai/src/skills/load-skill-tool.mjs.map +1 -0
  306. package/esm/ai/src/skills/save-skill-tool.mjs +65 -0
  307. package/esm/ai/src/skills/save-skill-tool.mjs.map +1 -0
  308. package/esm/ai/src/skills/skills.mjs +109 -0
  309. package/esm/ai/src/skills/skills.mjs.map +1 -0
  310. package/esm/ai/src/skills/sources/directory-source.mjs +108 -0
  311. package/esm/ai/src/skills/sources/directory-source.mjs.map +1 -0
  312. package/esm/ai/src/skills/sources/index.mjs +27 -0
  313. package/esm/ai/src/skills/sources/index.mjs.map +1 -0
  314. package/esm/ai/src/skills/sources/parse-frontmatter.mjs +46 -0
  315. package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +1 -0
  316. package/esm/ai/src/skills/sources/store-source.mjs +15 -0
  317. package/esm/ai/src/skills/sources/store-source.mjs.map +1 -0
  318. package/esm/ai/src/skills/sources/url-source.mjs +117 -0
  319. package/esm/ai/src/skills/sources/url-source.mjs.map +1 -0
  320. package/esm/ai/src/snapshot/memory.mjs +81 -0
  321. package/esm/ai/src/snapshot/memory.mjs.map +1 -0
  322. package/esm/ai/src/snapshot/pg.mjs +146 -0
  323. package/esm/ai/src/snapshot/pg.mjs.map +1 -0
  324. package/esm/ai/src/snapshot/redis.mjs +101 -0
  325. package/esm/ai/src/snapshot/redis.mjs.map +1 -0
  326. package/esm/ai/src/supervisor/as-tool.mjs +74 -0
  327. package/esm/ai/src/supervisor/as-tool.mjs.map +1 -0
  328. package/esm/ai/src/supervisor/cancellation.mjs +22 -0
  329. package/esm/ai/src/supervisor/cancellation.mjs.map +1 -0
  330. package/esm/ai/src/supervisor/decide.mjs +272 -0
  331. package/esm/ai/src/supervisor/decide.mjs.map +1 -0
  332. package/esm/ai/src/supervisor/emitter.mjs +47 -0
  333. package/esm/ai/src/supervisor/emitter.mjs.map +1 -0
  334. package/esm/ai/src/supervisor/entries.mjs +206 -0
  335. package/esm/ai/src/supervisor/entries.mjs.map +1 -0
  336. package/esm/ai/src/supervisor/execution.mjs +1921 -0
  337. package/esm/ai/src/supervisor/execution.mjs.map +1 -0
  338. package/esm/ai/src/supervisor/fan-out.mjs +65 -0
  339. package/esm/ai/src/supervisor/fan-out.mjs.map +1 -0
  340. package/esm/ai/src/supervisor/index.mjs +14 -0
  341. package/esm/ai/src/supervisor/router-factory.mjs +141 -0
  342. package/esm/ai/src/supervisor/router-factory.mjs.map +1 -0
  343. package/esm/ai/src/supervisor/router-prompt.mjs +52 -0
  344. package/esm/ai/src/supervisor/router-prompt.mjs.map +1 -0
  345. package/esm/ai/src/supervisor/signature.mjs +89 -0
  346. package/esm/ai/src/supervisor/signature.mjs.map +1 -0
  347. package/esm/ai/src/supervisor/snapshot.mjs +69 -0
  348. package/esm/ai/src/supervisor/snapshot.mjs.map +1 -0
  349. package/esm/ai/src/supervisor/supervisor-stream.mjs +89 -0
  350. package/esm/ai/src/supervisor/supervisor-stream.mjs.map +1 -0
  351. package/esm/ai/src/supervisor/supervisor.mjs +144 -0
  352. package/esm/ai/src/supervisor/supervisor.mjs.map +1 -0
  353. package/esm/ai/src/system-prompt/index.mjs +6 -0
  354. package/esm/ai/src/system-prompt/instruction.mjs +57 -0
  355. package/esm/ai/src/system-prompt/instruction.mjs.map +1 -0
  356. package/esm/ai/src/system-prompt/persona.mjs +57 -0
  357. package/esm/ai/src/system-prompt/persona.mjs.map +1 -0
  358. package/esm/ai/src/system-prompt/render-placeholders.mjs +58 -0
  359. package/esm/ai/src/system-prompt/render-placeholders.mjs.map +1 -0
  360. package/esm/ai/src/system-prompt/system-prompt.mjs +267 -0
  361. package/esm/ai/src/system-prompt/system-prompt.mjs.map +1 -0
  362. package/esm/ai/src/team/gates.mjs +48 -0
  363. package/esm/ai/src/team/gates.mjs.map +1 -0
  364. package/esm/ai/src/team/index.mjs +3 -0
  365. package/esm/ai/src/team/team.mjs +94 -0
  366. package/esm/ai/src/team/team.mjs.map +1 -0
  367. package/esm/ai/src/tool/executable-as-tool.mjs +81 -0
  368. package/esm/ai/src/tool/executable-as-tool.mjs.map +1 -0
  369. package/esm/ai/src/tool/index.mjs +4 -0
  370. package/esm/ai/src/tool/tool.mjs +185 -0
  371. package/esm/ai/src/tool/tool.mjs.map +1 -0
  372. package/esm/ai/src/utils/compute-cost.mjs +112 -0
  373. package/esm/ai/src/utils/compute-cost.mjs.map +1 -0
  374. package/esm/ai/src/utils/extract-json-lenient.mjs +97 -0
  375. package/esm/ai/src/utils/extract-json-lenient.mjs.map +1 -0
  376. package/esm/ai/src/utils/extract-json-payload.mjs +39 -0
  377. package/esm/ai/src/utils/extract-json-payload.mjs.map +1 -0
  378. package/esm/ai/src/utils/generate-run-id.mjs +23 -0
  379. package/esm/ai/src/utils/generate-run-id.mjs.map +1 -0
  380. package/esm/ai/src/utils/index.mjs +12 -0
  381. package/esm/ai/src/utils/json-schema.mjs +89 -0
  382. package/esm/ai/src/utils/json-schema.mjs.map +1 -0
  383. package/esm/ai/src/utils/prepare-attachment-part.mjs +232 -0
  384. package/esm/ai/src/utils/prepare-attachment-part.mjs.map +1 -0
  385. package/esm/ai/src/utils/resolve-attachment.mjs +74 -0
  386. package/esm/ai/src/utils/resolve-attachment.mjs.map +1 -0
  387. package/esm/ai/src/utils/run-context.mjs +89 -0
  388. package/esm/ai/src/utils/run-context.mjs.map +1 -0
  389. package/esm/ai/src/utils/safe-json-parse.mjs +22 -0
  390. package/esm/ai/src/utils/safe-json-parse.mjs.map +1 -0
  391. package/esm/ai/src/utils/stamp-report-lineage.mjs +45 -0
  392. package/esm/ai/src/utils/stamp-report-lineage.mjs.map +1 -0
  393. package/esm/ai/src/vcr/cassette-io.mjs +57 -0
  394. package/esm/ai/src/vcr/cassette-io.mjs.map +1 -0
  395. package/esm/ai/src/vcr/errors.mjs +37 -0
  396. package/esm/ai/src/vcr/errors.mjs.map +1 -0
  397. package/esm/ai/src/vcr/hash-request.mjs +118 -0
  398. package/esm/ai/src/vcr/hash-request.mjs.map +1 -0
  399. package/esm/ai/src/vcr/index.mjs +5 -0
  400. package/esm/ai/src/vcr/vcr.mjs +248 -0
  401. package/esm/ai/src/vcr/vcr.mjs.map +1 -0
  402. package/esm/ai/src/workflow/as-tool.mjs +49 -0
  403. package/esm/ai/src/workflow/as-tool.mjs.map +1 -0
  404. package/esm/ai/src/workflow/cancellation.mjs +44 -0
  405. package/esm/ai/src/workflow/cancellation.mjs.map +1 -0
  406. package/esm/ai/src/workflow/emitter.mjs +40 -0
  407. package/esm/ai/src/workflow/emitter.mjs.map +1 -0
  408. package/esm/ai/src/workflow/engine.mjs +363 -0
  409. package/esm/ai/src/workflow/engine.mjs.map +1 -0
  410. package/esm/ai/src/workflow/index.mjs +5 -0
  411. package/esm/ai/src/workflow/retry.mjs +32 -0
  412. package/esm/ai/src/workflow/retry.mjs.map +1 -0
  413. package/esm/ai/src/workflow/router.mjs +56 -0
  414. package/esm/ai/src/workflow/router.mjs.map +1 -0
  415. package/esm/ai/src/workflow/run-scoped-emitter.mjs +32 -0
  416. package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +1 -0
  417. package/esm/ai/src/workflow/signature.mjs +34 -0
  418. package/esm/ai/src/workflow/signature.mjs.map +1 -0
  419. package/esm/ai/src/workflow/snapshot.mjs +77 -0
  420. package/esm/ai/src/workflow/snapshot.mjs.map +1 -0
  421. package/esm/ai/src/workflow/state.mjs +37 -0
  422. package/esm/ai/src/workflow/state.mjs.map +1 -0
  423. package/esm/ai/src/workflow/step-runner.mjs +370 -0
  424. package/esm/ai/src/workflow/step-runner.mjs.map +1 -0
  425. package/esm/ai/src/workflow/step.mjs +37 -0
  426. package/esm/ai/src/workflow/step.mjs.map +1 -0
  427. package/esm/ai/src/workflow/workflow.mjs +122 -0
  428. package/esm/ai/src/workflow/workflow.mjs.map +1 -0
  429. package/esm/ai-openai/src/embedder.mjs +4 -0
  430. package/esm/ai-openai/src/index.mjs +4 -0
  431. package/esm/ai-openai/src/model.mjs +5 -0
  432. package/esm/ai-openai/src/sdk.mjs +6 -0
  433. package/esm/ai-openai/src/utils/index.mjs +4 -0
  434. package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
  435. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
  436. package/esm/application/application.d.mts +126 -4
  437. package/esm/application/application.d.mts.map +1 -1
  438. package/esm/application/application.mjs +133 -0
  439. package/esm/application/application.mjs.map +1 -1
  440. package/esm/application/index.d.mts +1 -1
  441. package/esm/cli/commands/dev-server.command.mjs +1 -1
  442. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  443. package/esm/cli/commands/generate/templates/stubs.mjs +3 -4
  444. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  445. package/esm/cli/types.d.mts +2 -1
  446. package/esm/cli/types.d.mts.map +1 -1
  447. package/esm/config/config-getter.mjs +5 -5
  448. package/esm/config/config-getter.mjs.map +1 -1
  449. package/esm/config/config-loader.mjs +2 -2
  450. package/esm/config/config-loader.mjs.map +1 -1
  451. package/esm/connectors/access-connector.mjs +2 -2
  452. package/esm/connectors/access-connector.mjs.map +1 -1
  453. package/esm/connectors/ai-connector.d.mts +43 -0
  454. package/esm/connectors/ai-connector.d.mts.map +1 -0
  455. package/esm/connectors/ai-connector.mjs +56 -0
  456. package/esm/connectors/ai-connector.mjs.map +1 -0
  457. package/esm/connectors/cache-connector.d.mts +5 -0
  458. package/esm/connectors/cache-connector.d.mts.map +1 -1
  459. package/esm/connectors/cache-connector.mjs +9 -2
  460. package/esm/connectors/cache-connector.mjs.map +1 -1
  461. package/esm/connectors/connectors-manager.d.mts +6 -2
  462. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  463. package/esm/connectors/connectors-manager.mjs +12 -3
  464. package/esm/connectors/connectors-manager.mjs.map +1 -1
  465. package/esm/connectors/database-connector.mjs +2 -2
  466. package/esm/connectors/database-connector.mjs.map +1 -1
  467. package/esm/connectors/herald-connector.mjs +2 -2
  468. package/esm/connectors/herald-connector.mjs.map +1 -1
  469. package/esm/connectors/http-connector.d.mts +8 -0
  470. package/esm/connectors/http-connector.d.mts.map +1 -1
  471. package/esm/connectors/http-connector.mjs +40 -7
  472. package/esm/connectors/http-connector.mjs.map +1 -1
  473. package/esm/connectors/index.d.mts +1 -0
  474. package/esm/connectors/index.mjs +1 -0
  475. package/esm/connectors/logger-connector.mjs +2 -2
  476. package/esm/connectors/logger-connector.mjs.map +1 -1
  477. package/esm/connectors/mail-connector.mjs +2 -2
  478. package/esm/connectors/mail-connector.mjs.map +1 -1
  479. package/esm/connectors/notifications-connector.mjs +2 -2
  480. package/esm/connectors/notifications-connector.mjs.map +1 -1
  481. package/esm/connectors/socket-connector.d.mts +16 -1
  482. package/esm/connectors/socket-connector.d.mts.map +1 -1
  483. package/esm/connectors/socket-connector.mjs +31 -8
  484. package/esm/connectors/socket-connector.mjs.map +1 -1
  485. package/esm/connectors/storage.connector.d.mts +7 -0
  486. package/esm/connectors/storage.connector.d.mts.map +1 -1
  487. package/esm/connectors/storage.connector.mjs +7 -0
  488. package/esm/connectors/storage.connector.mjs.map +1 -1
  489. package/esm/connectors/types.d.mts +3 -2
  490. package/esm/connectors/types.d.mts.map +1 -1
  491. package/esm/connectors/types.mjs +1 -0
  492. package/esm/connectors/types.mjs.map +1 -1
  493. package/esm/dev-server/development-server.mjs +9 -14
  494. package/esm/dev-server/development-server.mjs.map +1 -1
  495. package/esm/dev-server/file-event-handler.mjs +15 -3
  496. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  497. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  498. package/esm/generations/add-command.action.mjs +61 -12
  499. package/esm/generations/add-command.action.mjs.map +1 -1
  500. package/esm/generations/stubs.mjs +31 -1
  501. package/esm/generations/stubs.mjs.map +1 -1
  502. package/esm/http/config.mjs +2 -2
  503. package/esm/http/config.mjs.map +1 -1
  504. package/esm/http/createHttpApplication.mjs +2 -2
  505. package/esm/http/createHttpApplication.mjs.map +1 -1
  506. package/esm/http/health.d.mts +57 -0
  507. package/esm/http/health.d.mts.map +1 -0
  508. package/esm/http/health.mjs +75 -0
  509. package/esm/http/health.mjs.map +1 -0
  510. package/esm/http/index.d.mts +2 -1
  511. package/esm/http/index.mjs +2 -1
  512. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  513. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  514. package/esm/http/middleware/cache-response-middleware.mjs +15 -6
  515. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  516. package/esm/http/middleware/concurrency-limit.middleware.mjs +2 -0
  517. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  518. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  519. package/esm/http/middleware/idempotency.middleware.mjs +9 -6
  520. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  521. package/esm/http/middleware/inject-request-context.mjs +2 -2
  522. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  523. package/esm/http/middleware/maintenance.middleware.mjs +6 -5
  524. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  525. package/esm/http/plugins.mjs +9 -9
  526. package/esm/http/plugins.mjs.map +1 -1
  527. package/esm/http/request.d.mts +9 -2
  528. package/esm/http/request.d.mts.map +1 -1
  529. package/esm/http/request.mjs +15 -3
  530. package/esm/http/request.mjs.map +1 -1
  531. package/esm/http/response.d.mts +12 -0
  532. package/esm/http/response.d.mts.map +1 -1
  533. package/esm/http/response.mjs +24 -7
  534. package/esm/http/response.mjs.map +1 -1
  535. package/esm/http/server.d.mts +16 -1
  536. package/esm/http/server.d.mts.map +1 -1
  537. package/esm/http/server.mjs +24 -4
  538. package/esm/http/server.mjs.map +1 -1
  539. package/esm/http/types.d.mts +45 -0
  540. package/esm/http/types.d.mts.map +1 -1
  541. package/esm/index.d.mts +10 -5
  542. package/esm/index.mjs +10 -5
  543. package/esm/node_modules/langfuse/lib/index.mjs +1827 -0
  544. package/esm/node_modules/langfuse/lib/index.mjs.map +1 -0
  545. package/esm/node_modules/langfuse-core/lib/index.mjs +1770 -0
  546. package/esm/node_modules/langfuse-core/lib/index.mjs.map +1 -0
  547. package/esm/node_modules/mustache/mustache.mjs +587 -0
  548. package/esm/node_modules/mustache/mustache.mjs.map +1 -0
  549. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +180 -0
  550. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +1 -0
  551. package/esm/node_modules/openai/auth/workload-identity-auth.mjs +80 -0
  552. package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +1 -0
  553. package/esm/node_modules/openai/azure.mjs +82 -0
  554. package/esm/node_modules/openai/azure.mjs.map +1 -0
  555. package/esm/node_modules/openai/client.mjs +638 -0
  556. package/esm/node_modules/openai/client.mjs.map +1 -0
  557. package/esm/node_modules/openai/core/api-promise.mjs +75 -0
  558. package/esm/node_modules/openai/core/api-promise.mjs.map +1 -0
  559. package/esm/node_modules/openai/core/error.mjs +110 -0
  560. package/esm/node_modules/openai/core/error.mjs.map +1 -0
  561. package/esm/node_modules/openai/core/pagination.mjs +160 -0
  562. package/esm/node_modules/openai/core/pagination.mjs.map +1 -0
  563. package/esm/node_modules/openai/core/resource.mjs +10 -0
  564. package/esm/node_modules/openai/core/resource.mjs.map +1 -0
  565. package/esm/node_modules/openai/core/streaming.mjs +238 -0
  566. package/esm/node_modules/openai/core/streaming.mjs.map +1 -0
  567. package/esm/node_modules/openai/index.mjs +8 -0
  568. package/esm/node_modules/openai/internal/decoders/line.mjs +91 -0
  569. package/esm/node_modules/openai/internal/decoders/line.mjs.map +1 -0
  570. package/esm/node_modules/openai/internal/detect-platform.mjs +123 -0
  571. package/esm/node_modules/openai/internal/detect-platform.mjs.map +1 -0
  572. package/esm/node_modules/openai/internal/errors.mjs +26 -0
  573. package/esm/node_modules/openai/internal/errors.mjs.map +1 -0
  574. package/esm/node_modules/openai/internal/headers.mjs +65 -0
  575. package/esm/node_modules/openai/internal/headers.mjs.map +1 -0
  576. package/esm/node_modules/openai/internal/parse.mjs +41 -0
  577. package/esm/node_modules/openai/internal/parse.mjs.map +1 -0
  578. package/esm/node_modules/openai/internal/qs/formats.mjs +12 -0
  579. package/esm/node_modules/openai/internal/qs/formats.mjs.map +1 -0
  580. package/esm/node_modules/openai/internal/qs/stringify.mjs +179 -0
  581. package/esm/node_modules/openai/internal/qs/stringify.mjs.map +1 -0
  582. package/esm/node_modules/openai/internal/qs/utils.mjs +65 -0
  583. package/esm/node_modules/openai/internal/qs/utils.mjs.map +1 -0
  584. package/esm/node_modules/openai/internal/request-options.mjs +11 -0
  585. package/esm/node_modules/openai/internal/request-options.mjs.map +1 -0
  586. package/esm/node_modules/openai/internal/shims.mjs +77 -0
  587. package/esm/node_modules/openai/internal/shims.mjs.map +1 -0
  588. package/esm/node_modules/openai/internal/to-file.mjs +63 -0
  589. package/esm/node_modules/openai/internal/to-file.mjs.map +1 -0
  590. package/esm/node_modules/openai/internal/tslib.mjs +16 -0
  591. package/esm/node_modules/openai/internal/tslib.mjs.map +1 -0
  592. package/esm/node_modules/openai/internal/uploads.mjs +94 -0
  593. package/esm/node_modules/openai/internal/uploads.mjs.map +1 -0
  594. package/esm/node_modules/openai/internal/utils/base64.mjs +22 -0
  595. package/esm/node_modules/openai/internal/utils/base64.mjs.map +1 -0
  596. package/esm/node_modules/openai/internal/utils/bytes.mjs +26 -0
  597. package/esm/node_modules/openai/internal/utils/bytes.mjs.map +1 -0
  598. package/esm/node_modules/openai/internal/utils/env.mjs +16 -0
  599. package/esm/node_modules/openai/internal/utils/env.mjs.map +1 -0
  600. package/esm/node_modules/openai/internal/utils/log.mjs +58 -0
  601. package/esm/node_modules/openai/internal/utils/log.mjs.map +1 -0
  602. package/esm/node_modules/openai/internal/utils/path.mjs +62 -0
  603. package/esm/node_modules/openai/internal/utils/path.mjs.map +1 -0
  604. package/esm/node_modules/openai/internal/utils/query.mjs +10 -0
  605. package/esm/node_modules/openai/internal/utils/query.mjs.map +1 -0
  606. package/esm/node_modules/openai/internal/utils/sleep.mjs +6 -0
  607. package/esm/node_modules/openai/internal/utils/sleep.mjs.map +1 -0
  608. package/esm/node_modules/openai/internal/utils/uuid.mjs +18 -0
  609. package/esm/node_modules/openai/internal/utils/uuid.mjs.map +1 -0
  610. package/esm/node_modules/openai/internal/utils/values.mjs +41 -0
  611. package/esm/node_modules/openai/internal/utils/values.mjs.map +1 -0
  612. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +247 -0
  613. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +1 -0
  614. package/esm/node_modules/openai/lib/AssistantStream.mjs +472 -0
  615. package/esm/node_modules/openai/lib/AssistantStream.mjs.map +1 -0
  616. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +26 -0
  617. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +1 -0
  618. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +423 -0
  619. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +1 -0
  620. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +26 -0
  621. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +1 -0
  622. package/esm/node_modules/openai/lib/EventStream.mjs +163 -0
  623. package/esm/node_modules/openai/lib/EventStream.mjs.map +1 -0
  624. package/esm/node_modules/openai/lib/ResponsesParser.mjs +94 -0
  625. package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +1 -0
  626. package/esm/node_modules/openai/lib/RunnableFunction.mjs +8 -0
  627. package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +1 -0
  628. package/esm/node_modules/openai/lib/Util.mjs +19 -0
  629. package/esm/node_modules/openai/lib/Util.mjs.map +1 -0
  630. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +11 -0
  631. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +1 -0
  632. package/esm/node_modules/openai/lib/parser.mjs +88 -0
  633. package/esm/node_modules/openai/lib/parser.mjs.map +1 -0
  634. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +231 -0
  635. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +1 -0
  636. package/esm/node_modules/openai/resources/admin/admin.mjs +15 -0
  637. package/esm/node_modules/openai/resources/admin/admin.mjs.map +1 -0
  638. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +81 -0
  639. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +1 -0
  640. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +31 -0
  641. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +1 -0
  642. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +153 -0
  643. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +1 -0
  644. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +42 -0
  645. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +1 -0
  646. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +106 -0
  647. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +1 -0
  648. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +88 -0
  649. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +1 -0
  650. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +88 -0
  651. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +1 -0
  652. package/esm/node_modules/openai/resources/admin/organization/invites.mjs +83 -0
  653. package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +1 -0
  654. package/esm/node_modules/openai/resources/admin/organization/organization.mjs +45 -0
  655. package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +1 -0
  656. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +72 -0
  657. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +1 -0
  658. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +78 -0
  659. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +1 -0
  660. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +46 -0
  661. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +1 -0
  662. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +95 -0
  663. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +1 -0
  664. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +91 -0
  665. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +1 -0
  666. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +45 -0
  667. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +1 -0
  668. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +63 -0
  669. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +1 -0
  670. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +137 -0
  671. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +1 -0
  672. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +51 -0
  673. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +1 -0
  674. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +108 -0
  675. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +1 -0
  676. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +112 -0
  677. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +1 -0
  678. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +106 -0
  679. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +1 -0
  680. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +91 -0
  681. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +1 -0
  682. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +118 -0
  683. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +1 -0
  684. package/esm/node_modules/openai/resources/admin/organization/roles.mjs +96 -0
  685. package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +1 -0
  686. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +97 -0
  687. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +1 -0
  688. package/esm/node_modules/openai/resources/admin/organization/usage.mjs +207 -0
  689. package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +1 -0
  690. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +88 -0
  691. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +1 -0
  692. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +82 -0
  693. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +1 -0
  694. package/esm/node_modules/openai/resources/audio/audio.mjs +21 -0
  695. package/esm/node_modules/openai/resources/audio/audio.mjs.map +1 -0
  696. package/esm/node_modules/openai/resources/audio/speech.mjs +39 -0
  697. package/esm/node_modules/openai/resources/audio/speech.mjs.map +1 -0
  698. package/esm/node_modules/openai/resources/audio/transcriptions.mjs +22 -0
  699. package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +1 -0
  700. package/esm/node_modules/openai/resources/audio/translations.mjs +21 -0
  701. package/esm/node_modules/openai/resources/audio/translations.mjs.map +1 -0
  702. package/esm/node_modules/openai/resources/batches.mjs +54 -0
  703. package/esm/node_modules/openai/resources/batches.mjs.map +1 -0
  704. package/esm/node_modules/openai/resources/beta/assistants.mjs +78 -0
  705. package/esm/node_modules/openai/resources/beta/assistants.mjs.map +1 -0
  706. package/esm/node_modules/openai/resources/beta/beta.mjs +24 -0
  707. package/esm/node_modules/openai/resources/beta/beta.mjs.map +1 -0
  708. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +18 -0
  709. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +1 -0
  710. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +49 -0
  711. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +1 -0
  712. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +85 -0
  713. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +1 -0
  714. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +21 -0
  715. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +1 -0
  716. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +33 -0
  717. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +1 -0
  718. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +33 -0
  719. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +1 -0
  720. package/esm/node_modules/openai/resources/beta/threads/messages.mjs +83 -0
  721. package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +1 -0
  722. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +183 -0
  723. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +1 -0
  724. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +45 -0
  725. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +1 -0
  726. package/esm/node_modules/openai/resources/beta/threads/threads.mjs +101 -0
  727. package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +1 -0
  728. package/esm/node_modules/openai/resources/chat/chat.mjs +15 -0
  729. package/esm/node_modules/openai/resources/chat/chat.mjs.map +1 -0
  730. package/esm/node_modules/openai/resources/chat/completions/completions.mjs +123 -0
  731. package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +1 -0
  732. package/esm/node_modules/openai/resources/chat/completions/index.mjs +7 -0
  733. package/esm/node_modules/openai/resources/chat/completions/messages.mjs +35 -0
  734. package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +1 -0
  735. package/esm/node_modules/openai/resources/chat/index.mjs +5 -0
  736. package/esm/node_modules/openai/resources/completions.mjs +20 -0
  737. package/esm/node_modules/openai/resources/completions.mjs.map +1 -0
  738. package/esm/node_modules/openai/resources/containers/containers.mjs +57 -0
  739. package/esm/node_modules/openai/resources/containers/containers.mjs.map +1 -0
  740. package/esm/node_modules/openai/resources/containers/files/content.mjs +23 -0
  741. package/esm/node_modules/openai/resources/containers/files/content.mjs.map +1 -0
  742. package/esm/node_modules/openai/resources/containers/files/files.mjs +63 -0
  743. package/esm/node_modules/openai/resources/containers/files/files.mjs.map +1 -0
  744. package/esm/node_modules/openai/resources/conversations/conversations.mjs +57 -0
  745. package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +1 -0
  746. package/esm/node_modules/openai/resources/conversations/items.mjs +57 -0
  747. package/esm/node_modules/openai/resources/conversations/items.mjs.map +1 -0
  748. package/esm/node_modules/openai/resources/embeddings.mjs +48 -0
  749. package/esm/node_modules/openai/resources/embeddings.mjs.map +1 -0
  750. package/esm/node_modules/openai/resources/evals/evals.mjs +73 -0
  751. package/esm/node_modules/openai/resources/evals/evals.mjs.map +1 -0
  752. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +35 -0
  753. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +1 -0
  754. package/esm/node_modules/openai/resources/evals/runs/runs.mjs +72 -0
  755. package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +1 -0
  756. package/esm/node_modules/openai/resources/files.mjs +111 -0
  757. package/esm/node_modules/openai/resources/files.mjs.map +1 -0
  758. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +15 -0
  759. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +1 -0
  760. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +60 -0
  761. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +1 -0
  762. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +15 -0
  763. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +1 -0
  764. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +102 -0
  765. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +1 -0
  766. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +24 -0
  767. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +1 -0
  768. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +34 -0
  769. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +1 -0
  770. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +148 -0
  771. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +1 -0
  772. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +8 -0
  773. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +1 -0
  774. package/esm/node_modules/openai/resources/graders/grader-models.mjs +8 -0
  775. package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +1 -0
  776. package/esm/node_modules/openai/resources/graders/graders.mjs +15 -0
  777. package/esm/node_modules/openai/resources/graders/graders.mjs.map +1 -0
  778. package/esm/node_modules/openai/resources/images.mjs +46 -0
  779. package/esm/node_modules/openai/resources/images.mjs.map +1 -0
  780. package/esm/node_modules/openai/resources/index.mjs +27 -0
  781. package/esm/node_modules/openai/resources/models.mjs +44 -0
  782. package/esm/node_modules/openai/resources/models.mjs.map +1 -0
  783. package/esm/node_modules/openai/resources/moderations.mjs +23 -0
  784. package/esm/node_modules/openai/resources/moderations.mjs.map +1 -0
  785. package/esm/node_modules/openai/resources/realtime/calls.mjs +79 -0
  786. package/esm/node_modules/openai/resources/realtime/calls.mjs.map +1 -0
  787. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +39 -0
  788. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +1 -0
  789. package/esm/node_modules/openai/resources/realtime/realtime.mjs +18 -0
  790. package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +1 -0
  791. package/esm/node_modules/openai/resources/responses/input-items.mjs +31 -0
  792. package/esm/node_modules/openai/resources/responses/input-items.mjs.map +1 -0
  793. package/esm/node_modules/openai/resources/responses/input-tokens.mjs +27 -0
  794. package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +1 -0
  795. package/esm/node_modules/openai/resources/responses/responses.mjs +110 -0
  796. package/esm/node_modules/openai/resources/responses/responses.mjs.map +1 -0
  797. package/esm/node_modules/openai/resources/skills/content.mjs +22 -0
  798. package/esm/node_modules/openai/resources/skills/content.mjs.map +1 -0
  799. package/esm/node_modules/openai/resources/skills/skills.mjs +69 -0
  800. package/esm/node_modules/openai/resources/skills/skills.mjs.map +1 -0
  801. package/esm/node_modules/openai/resources/skills/versions/content.mjs +23 -0
  802. package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +1 -0
  803. package/esm/node_modules/openai/resources/skills/versions/versions.mjs +58 -0
  804. package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +1 -0
  805. package/esm/node_modules/openai/resources/uploads/parts.mjs +34 -0
  806. package/esm/node_modules/openai/resources/uploads/parts.mjs.map +1 -0
  807. package/esm/node_modules/openai/resources/uploads/uploads.mjs +84 -0
  808. package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +1 -0
  809. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +126 -0
  810. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +1 -0
  811. package/esm/node_modules/openai/resources/vector-stores/files.mjs +147 -0
  812. package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +1 -0
  813. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +87 -0
  814. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +1 -0
  815. package/esm/node_modules/openai/resources/videos.mjs +115 -0
  816. package/esm/node_modules/openai/resources/videos.mjs.map +1 -0
  817. package/esm/node_modules/openai/resources/webhooks/index.mjs +3 -0
  818. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +69 -0
  819. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +1 -0
  820. package/esm/node_modules/openai/resources/webhooks.mjs +4 -0
  821. package/esm/node_modules/openai/streaming.mjs +3 -0
  822. package/esm/node_modules/openai/version.mjs +6 -0
  823. package/esm/node_modules/openai/version.mjs.map +1 -0
  824. package/esm/production/production-builder.mjs +2 -2
  825. package/esm/production/production-builder.mjs.map +1 -1
  826. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +9 -0
  827. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  828. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +32 -5
  829. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  830. package/esm/repositories/adapters/cascade/filter-applicator.mjs +17 -3
  831. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  832. package/esm/repositories/repository.manager.d.mts +11 -1
  833. package/esm/repositories/repository.manager.d.mts.map +1 -1
  834. package/esm/repositories/repository.manager.mjs +79 -25
  835. package/esm/repositories/repository.manager.mjs.map +1 -1
  836. package/esm/router/route-registry.mjs +19 -10
  837. package/esm/router/route-registry.mjs.map +1 -1
  838. package/esm/router/router.d.mts.map +1 -1
  839. package/esm/router/router.mjs +7 -4
  840. package/esm/router/router.mjs.map +1 -1
  841. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  842. package/esm/storage/drivers/cloud-driver.mjs +48 -12
  843. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  844. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  845. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  846. package/esm/storage/drivers/local-driver.d.mts +8 -0
  847. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  848. package/esm/storage/drivers/local-driver.mjs +19 -4
  849. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  850. package/esm/storage/drivers/r2-driver.mjs +1 -1
  851. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  852. package/esm/storage/drivers/s3-driver.mjs +1 -1
  853. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  854. package/esm/storage/index.d.mts +4 -1
  855. package/esm/storage/index.mjs +3 -0
  856. package/esm/storage/scoped-storage.d.mts +8 -4
  857. package/esm/storage/scoped-storage.d.mts.map +1 -1
  858. package/esm/storage/scoped-storage.mjs +21 -6
  859. package/esm/storage/scoped-storage.mjs.map +1 -1
  860. package/esm/storage/storage.d.mts +12 -4
  861. package/esm/storage/storage.d.mts.map +1 -1
  862. package/esm/storage/storage.mjs +23 -9
  863. package/esm/storage/storage.mjs.map +1 -1
  864. package/esm/storage/types.d.mts +33 -5
  865. package/esm/storage/types.d.mts.map +1 -1
  866. package/esm/storage/utils/contain-path.d.mts +23 -0
  867. package/esm/storage/utils/contain-path.d.mts.map +1 -0
  868. package/esm/storage/utils/contain-path.mjs +35 -0
  869. package/esm/storage/utils/contain-path.mjs.map +1 -0
  870. package/esm/storage/utils/safe-fetch.d.mts +68 -0
  871. package/esm/storage/utils/safe-fetch.d.mts.map +1 -0
  872. package/esm/storage/utils/safe-fetch.mjs +205 -0
  873. package/esm/storage/utils/safe-fetch.mjs.map +1 -0
  874. package/esm/storage/utils/storage-error.d.mts +35 -0
  875. package/esm/storage/utils/storage-error.d.mts.map +1 -0
  876. package/esm/storage/utils/storage-error.mjs +17 -0
  877. package/esm/storage/utils/storage-error.mjs.map +1 -0
  878. package/esm/use-cases/use-case-pipeline.mjs +4 -1
  879. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  880. package/esm/use-cases/use-case.mjs +12 -4
  881. package/esm/use-cases/use-case.mjs.map +1 -1
  882. package/esm/use-cases/use-cases-registry.d.mts +12 -4
  883. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  884. package/esm/use-cases/use-cases-registry.mjs +13 -3
  885. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  886. package/esm/utils/environment.d.mts +6 -1
  887. package/esm/utils/environment.d.mts.map +1 -1
  888. package/esm/utils/environment.mjs.map +1 -1
  889. package/esm/utils/index.d.mts +1 -1
  890. package/esm/utils/npm-registry.d.mts +1 -1
  891. package/esm/utils/npm-registry.mjs +2 -2
  892. package/esm/utils/npm-registry.mjs.map +1 -1
  893. package/esm/utils/paths.mjs +2 -2
  894. package/esm/utils/paths.mjs.map +1 -1
  895. package/esm/validation/validateAll.mjs +2 -2
  896. package/esm/validation/validateAll.mjs.map +1 -1
  897. package/llms-full.txt +193 -3
  898. package/llms.txt +2 -1
  899. package/package.json +9 -9
  900. package/skills/add-connector/SKILL.md +6 -1
  901. package/skills/configure-app/SKILL.md +23 -0
  902. package/skills/health-checks/SKILL.md +98 -0
  903. package/skills/use-app-context/SKILL.md +62 -2
@@ -1 +1 @@
1
- {"version":3,"file":"storage.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/storage.ts"],"sourcesContent":["import events, { type EventSubscription } from \"@mongez/events\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { storageConfig } from \"./config\";\nimport { storageDriverContext } from \"./context/storage-driver-context\";\nimport { DOSpacesDriver } from \"./drivers/do-spaces-driver\";\nimport { LocalDriver } from \"./drivers/local-driver\";\nimport { R2Driver } from \"./drivers/r2-driver\";\nimport { S3Driver } from \"./drivers/s3-driver\";\nimport { ScopedStorage } from \"./scoped-storage\";\nimport { StorageFile } from \"./storage-file\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n LocalStorageDriverOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutOptions,\n R2StorageDriverOptions,\n ScopedStorageContract,\n StorageCopyEventPayload,\n StorageDriverConfig,\n StorageDriverContract,\n StorageDriverName,\n StorageEventHandler,\n StorageEventPayload,\n StorageEventType,\n StorageFileInfo,\n StorageManagerContract,\n StoragePutEventPayload,\n TemporaryTokenValidation,\n} from \"./types\";\n\n/**\n * Storage Manager\n *\n * Provides a unified interface for file storage operations across multiple\n * drivers (local, S3, R2, DigitalOcean Spaces). Extends `ScopedStorage` to\n * inherit all base operations while adding driver management and events.\n *\n * All operations return `StorageFile` instances for a consistent, rich DX.\n *\n * @example\n * ```typescript\n * // Basic usage (uses default driver)\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"uploads/image.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n *\n * // Using specific driver (also returns StorageFile)\n * const file = await storage.use(\"s3\").put(buffer, \"path/to/file\");\n *\n * // Get raw driver for advanced use\n * const driver = storage.driver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\"); // Returns StorageFileData\n *\n * // Stream operations for large files\n * const stream = await storage.getStream(\"large-file.zip\");\n * await storage.putStream(readableStream, \"output/file.zip\");\n *\n * // Batch operations\n * const results = await storage.deleteMany([\"file1.txt\", \"file2.txt\"]);\n *\n * // Event hooks\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${location}`);\n * });\n * ```\n */\nexport class Storage extends ScopedStorage implements StorageManagerContract {\n /**\n * Registered drivers (cached instances)\n * @internal\n */\n protected drivers = new Map<string, StorageDriverContract>();\n\n /**\n * Driver configurations\n * @internal\n */\n protected configs = new Map<string, StorageDriverConfig>();\n\n /**\n * Default driver name\n * @internal\n */\n protected defaultDriverName!: StorageDriverName;\n\n /**\n * Whether the storage has been initialized\n * @internal\n */\n private initialized = false;\n\n /**\n * Create a new Storage manager instance\n *\n * Uses lazy initialization - driver is resolved on first access.\n */\n public constructor() {\n // Temp placeholder - will be replaced on first access\n super(null as unknown as StorageDriverContract);\n }\n\n /**\n * Ensure storage is initialized (lazy initialization)\n *\n * Called automatically on first driver access.\n */\n public async init(): Promise<void> {\n if (this.initialized) return;\n\n // Mark as initialized FIRST to prevent infinite recursion\n this.initialized = true;\n\n // Get default driver name from config\n\n const defaultName = storageConfig(\"default\", \"local\");\n\n this.defaultDriverName = defaultName as StorageDriverName;\n this.loadDriversFromConfig();\n\n // Now set the actual driver\n this._driver = this.resolveDriver(this.defaultDriverName);\n }\n\n /**\n * Reset storage defaults\n */\n public reset(): void {\n this.initialized = false;\n this.drivers.clear();\n this.configs.clear();\n this.defaultDriverName = null as unknown as StorageDriverName;\n this._driver = null as unknown as StorageDriverContract;\n }\n\n /**\n * Get the currently active driver (context-aware in future)\n *\n * Currently returns the default driver.\n * Will be enhanced to check AsyncLocalStorage context for multi-tenant support.\n *\n * @returns The active storage driver\n */\n public override get activeDriver(): StorageDriverContract {\n // Check context for tenant-specific driver\n const contextDriver = storageDriverContext.getDriver();\n\n if (contextDriver) return contextDriver;\n\n return this._driver;\n }\n\n // ============================================================\n // Driver Management\n // ============================================================\n\n /**\n * Load drivers from configuration\n * @internal\n */\n protected loadDriversFromConfig(): void {\n const drivers = storageConfig<Record<string, StorageDriverConfig>>(\"drivers\", {});\n\n for (const [name, config] of Object.entries(drivers)) {\n this.configs.set(name, config);\n }\n }\n\n /**\n * Get a scoped storage for a specific driver\n *\n * Returns a `ScopedStorage` instance that wraps the specified driver.\n * Operations on the returned instance also return `StorageFile` objects.\n *\n * @param name - Driver name as defined in configuration\n * @returns ScopedStorage instance for the specified driver\n *\n * @example\n * ```typescript\n * // Upload to S3\n * const s3File = await storage.use(\"s3\").put(buffer, \"images/photo.jpg\");\n *\n * // Upload to local\n * const localFile = await storage.use(\"local\").put(buffer, \"temp/file.txt\");\n *\n * // Both return StorageFile with identical API\n * console.log(s3File.url);\n * console.log(localFile.url);\n * ```\n */\n public use(name: StorageDriverName): ScopedStorageContract {\n return new ScopedStorage(this.getDriver(name));\n }\n\n /**\n * Get a raw driver instance\n *\n * Returns the underlying driver directly for advanced use cases.\n * Unlike `use()`, calling methods on the raw driver returns\n * `StorageFileData` instead of `StorageFile`.\n *\n * @param name - Driver name as defined in configuration\n * @returns Raw driver instance implementing StorageDriverContract\n *\n * @example\n * ```typescript\n * const driver = storage.getDriver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\");\n * // data is StorageFileData, not StorageFile\n * ```\n */\n public getDriver(name: StorageDriverName): StorageDriverContract {\n return this.resolveDriver(name);\n }\n\n /**\n * Get root directory of current driver\n */\n public root(apepndedPath?: string): string {\n const rootPath = this.activeDriver.options?.root || \"\";\n\n return path.join(rootPath, apepndedPath || \"\");\n }\n\n /**\n * Use a cloud storage driver with extended cloud capabilities\n *\n * @param name - Cloud driver name (s3, r2, spaces)\n * @returns Driver instance implementing CloudStorageDriverContract\n * @throws Error if driver doesn't support cloud operations\n *\n * @example\n * ```typescript\n * const cloudDriver = storage.useCloud(\"s3\");\n * const presignedUrl = await cloudDriver.getPresignedUrl(\"private/doc.pdf\");\n * ```\n */\n public useCloud(name: StorageDriverName): CloudStorageDriverContract {\n const instance = this.getDriver(name);\n\n if (!this.isCloudDriver(instance)) {\n throw new Error(`Driver \"${name}\" does not support cloud operations`);\n }\n\n return instance as CloudStorageDriverContract;\n }\n\n /**\n * Register a new driver configuration at runtime\n *\n * Allows dynamic driver registration for multi-tenancy or\n * runtime configuration scenarios.\n *\n * @param name - Unique driver name\n * @param config - Driver configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.register(\"tenant-s3\", {\n * driver: \"s3\",\n * bucket: \"tenant-bucket\",\n * region: \"us-east-1\",\n * accessKeyId: process.env.TENANT_AWS_KEY,\n * secretAccessKey: process.env.TENANT_AWS_SECRET\n * });\n *\n * await storage.use(\"tenant-s3\").put(buffer, \"file.txt\");\n * ```\n */\n public register(name: StorageDriverName, config: StorageDriverConfig): this {\n this.configs.set(name, config);\n this.drivers.delete(name); // Clear cached instance\n return this;\n }\n\n /**\n * Set the default driver name\n *\n * @param name - Driver name to use as default\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.setDefault(\"s3\");\n * await storage.put(buffer, \"file.txt\"); // Now uses S3\n * ```\n */\n public setDefault(name: StorageDriverName): this {\n this.defaultDriverName = name;\n this._driver = this.getDriver(name);\n return this;\n }\n\n /**\n * Check if current driver is a cloud driver\n *\n * @returns Promise resolving to true if the current driver supports cloud operations\n */\n public async isCloud(): Promise<boolean> {\n return this.isCloudDriver(this.activeDriver);\n }\n\n /**\n * Check if a driver instance supports cloud operations\n * @internal\n */\n protected isCloudDriver(driver: StorageDriverContract): driver is CloudStorageDriverContract {\n return \"getPresignedUrl\" in driver;\n }\n\n // ============================================================\n // Event System\n // ============================================================\n\n /**\n * Register an event handler\n *\n * Subscribe to storage events for logging, analytics, or side effects.\n *\n * @param event - Event type to listen for\n * @param handler - Handler function\n * @returns Event subscription for unsubscribing\n *\n * @example\n * ```typescript\n * // Log all uploads\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${file?.size} bytes to ${location}`);\n * });\n *\n * // Track deletions\n * storage.on(\"afterDelete\", ({ location }) => {\n * analytics.track(\"file_deleted\", { path: location });\n * });\n * ```\n */\n public on<T extends StorageEventPayload = StorageEventPayload>(\n event: StorageEventType,\n handler: StorageEventHandler<T>,\n ): EventSubscription {\n return events.subscribe(`storage.${event}`, handler);\n }\n\n /**\n * Remove all handlers for an event type\n *\n * @param event - Event type to remove handlers for\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.off(\"afterPut\"); // Remove all afterPut handlers\n * ```\n */\n public off(event: StorageEventType): this {\n events.off(`storage.${event}`);\n return this;\n }\n\n /**\n * Emit an event to all registered handlers\n * @internal\n */\n protected async emit<T extends StorageEventPayload>(\n event: StorageEventType,\n payload: T,\n ): Promise<void> {\n await events.triggerAll(`storage.${event}`, payload);\n }\n\n // ============================================================\n // Overridden Operations with Events\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Extends base `put()` with event emission for beforePut/afterPut hooks.\n *\n * @param file - File content as Buffer, string, UploadedFile, or Readable stream\n * @param location - Destination path\n * @param options - Storage options (mimeType, cacheControl, etc.)\n * @returns StorageFile instance with cached metadata\n */\n public override async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n const buffer = await this.toBuffer(file);\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size: buffer.length,\n });\n\n const result = await driver.put(buffer, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = buffer.length;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a readable stream (for large files)\n *\n * Extends base `putStream()` with event emission.\n *\n * @param stream - Readable stream\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n */\n public override async putStream(\n stream: Readable | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n });\n\n if (typeof stream === \"string\") {\n stream = fs.createReadStream(stream);\n }\n\n const result = await driver.putStream(stream, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads content from the URL and stores it at the specified location.\n *\n * @param url - Source URL to download from\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"downloads/image.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const response = await fetch(url);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch file from URL: ${response.statusText}`);\n }\n\n const arrayBuffer = await response.arrayBuffer();\n const buffer = Buffer.from(arrayBuffer);\n const mimeType = options?.mimeType || response.headers.get(\"content-type\") || undefined;\n\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Store a file from base64 encoded string\n *\n * Decodes base64 content (with optional data URL prefix) and stores it.\n *\n * @param base64 - Base64 encoded file content (or data URL)\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From plain base64\n * const file = await storage.putFromBase64(base64String, \"images/photo.jpg\");\n *\n * // From data URL (auto-extracts MIME type)\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgo...\",\n * \"images/photo.png\"\n * );\n * ```\n */\n public async putFromBase64(\n base64: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n let data = base64;\n let mimeType = options?.mimeType;\n\n if (base64.startsWith(\"data:\")) {\n const match = base64.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n mimeType = mimeType || match[1];\n data = match[2];\n }\n }\n\n const buffer = Buffer.from(data, \"base64\");\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Retrieve file contents as Buffer\n *\n * Uses the current driver (with async resolution).\n *\n * @param location - File path\n * @returns Buffer containing file contents\n */\n public override async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Get JSON content from a file\n *\n * Downloads and parses JSON file content.\n *\n * @param location - File path\n * @returns Parsed JSON content\n *\n * @example\n * ```typescript\n * const config = await storage.getJson(\"config/settings.json\");\n * console.log(config.apiKey);\n * ```\n */\n public async getJson(location: string): Promise<any> {\n const buffer = await this.get(location);\n return JSON.parse(buffer.toString());\n }\n\n /**\n * Retrieve a file as a readable stream (for large files)\n *\n * @param location - File path\n * @returns Readable stream of file contents\n */\n public override async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file\n *\n * Extends base `delete()` with event emission.\n *\n * @param location - File path or StorageFile\n * @returns true if deleted, false if not found\n */\n public override async delete(location: string | StorageFile): Promise<boolean> {\n const driver = this.activeDriver;\n const path = typeof location === \"string\" ? location : location.path;\n\n await this.emit<StorageEventPayload>(\"beforeDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n const result = await driver.delete(path);\n\n await this.emit<StorageEventPayload>(\"afterDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n /**\n * Delete multiple files at once\n *\n * @param locations - Array of file paths\n * @returns Array of delete results with status for each file\n */\n public override async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Check if a file exists\n *\n * @param location - File path\n * @returns true if file exists\n */\n public override async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Extends base `copy()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.copy(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Move a file to a new location\n *\n * Extends base `move()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.move(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * List files in a directory\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, etc.)\n * @returns Array of file information objects\n */\n public override async list(\n directory?: string,\n options?: ListOptions,\n ): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading\n *\n * @param location - File path\n * @returns File information object\n */\n public override async metadata(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.metadata(location);\n }\n\n /**\n * Get file size in bytes\n *\n * @param location - File path\n * @returns File size in bytes\n */\n public override async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n // ============================================================\n // Path Operations (Local Driver Only)\n // ============================================================\n\n /**\n * Get the absolute filesystem path for a location\n *\n * Only available for local driver.\n *\n * @param location - File path\n * @throws Error if current driver is not a local driver\n * @returns Absolute filesystem path\n */\n public async path(location: string): Promise<string> {\n const driver = this.activeDriver;\n\n if (!(\"path\" in driver) || typeof driver.path !== \"function\") {\n throw new Error(\"path() is only available for local storage drivers\");\n }\n\n return driver.path(location);\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get a presigned URL for downloading a file\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param options - Presigned URL options (expiresIn)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned download URL\n *\n * @example\n * ```typescript\n * const url = await storage.getPresignedUrl(\"private/document.pdf\", {\n * expiresIn: 3600 // 1 hour\n * });\n * ```\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUrl(location, options);\n }\n\n /**\n * Get a presigned URL for uploading a file directly to cloud storage\n *\n * Only available for cloud drivers.\n *\n * @param location - Destination path\n * @param options - Upload options (expiresIn, contentType, maxSize)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned upload URL\n *\n * @example\n * ```typescript\n * const uploadUrl = await storage.getPresignedUploadUrl(\"uploads/file.pdf\", {\n * expiresIn: 3600,\n * contentType: \"application/pdf\"\n * });\n *\n * // Client can PUT directly to this URL\n * ```\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned upload URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUploadUrl(location, options);\n }\n\n /**\n * Get the bucket name for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Bucket name\n */\n public async getBucket(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Bucket information is only available for cloud storage drivers\");\n }\n\n return driver.getBucket();\n }\n\n /**\n * Get the region for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Region name\n */\n public async getRegion(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Region information is only available for cloud storage drivers\");\n }\n\n return driver.getRegion();\n }\n\n /**\n * Set storage class for a file (e.g., STANDARD, GLACIER, etc.)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param storageClass - Target storage class\n * @throws Error if current driver is not a cloud driver\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Storage class is only available for cloud storage drivers\");\n }\n\n return driver.setStorageClass(location, storageClass);\n }\n\n /**\n * Set file visibility (public or private)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param visibility - \"public\" or \"private\"\n * @throws Error if current driver is not a cloud driver\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.setVisibility(location, visibility);\n }\n\n /**\n * Get file visibility\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @throws Error if current driver is not a cloud driver\n * @returns Current visibility setting\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.getVisibility(location);\n }\n\n /**\n * Get a temporary signed URL\n *\n * Creates a URL that provides temporary access to the file.\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n * @returns Signed URL string\n */\n public override async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n /**\n * Validate a temporary URL token\n *\n * For local driver: validates HMAC-signed tokens\n * For cloud drivers: returns invalid (cloud validates via presigned URL)\n *\n * @param token - The token from the temporary URL\n * @returns Validation result with file info and convenience methods\n *\n * @example\n * ```typescript\n * const result = await storage.validateTemporaryToken(token);\n *\n * if (!result.valid) {\n * return response.status(403).send(result.error);\n * }\n *\n * // For local driver - use sendFile for efficiency\n * if (result.absolutePath) {\n * return response.sendFile(result.absolutePath);\n * }\n *\n * // For cloud driver - stream the file\n * const stream = await result.getStream!();\n * stream.pipe(response.raw);\n * ```\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check if driver supports token validation\n if (\n !(\"validateTemporaryToken\" in this.activeDriver) ||\n typeof this.activeDriver.validateTemporaryToken !== \"function\"\n ) {\n // For cloud drivers, temporary URLs are presigned and validated by the cloud provider\n return {\n valid: false,\n error: \"invalid_token\",\n };\n }\n\n return this.activeDriver.validateTemporaryToken(token);\n }\n\n // ============================================================\n // Configuration Parsing\n // ============================================================\n\n /**\n * Parse config into driver-specific options\n * @internal\n */\n protected parseOptions(\n config: StorageDriverConfig,\n ): LocalStorageDriverOptions | CloudStorageDriverOptions | R2StorageDriverOptions {\n const { driver, ...options } = config;\n\n switch (driver) {\n case \"local\":\n return {\n root: options.root,\n urlPrefix: options.urlPrefix,\n signatureKey: options.signatureKey,\n } satisfies LocalStorageDriverOptions;\n\n case \"s3\":\n this.validateCloudConfig(config, \"s3\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n case \"r2\":\n this.validateCloudConfig(config, \"r2\");\n if (!options.accountId) {\n throw new Error('R2 driver requires \"accountId\" configuration');\n }\n\n return {\n ...options,\n region: options.region || \"auto\",\n bucket: options.bucket!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n accountId: options.accountId,\n publicDomain: options.publicDomain,\n } satisfies R2StorageDriverOptions;\n\n case \"spaces\":\n this.validateCloudConfig(config, \"spaces\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n default:\n throw new Error(`Unknown driver type: ${driver}`);\n }\n }\n\n /**\n * Validate cloud driver configuration has required fields\n * @internal\n */\n protected validateCloudConfig(config: StorageDriverConfig, driverName: string): void {\n const required = [\"bucket\", \"accessKeyId\", \"secretAccessKey\"];\n\n if (driverName !== \"r2\") {\n required.push(\"region\");\n }\n\n for (const field of required) {\n if (!config[field as keyof StorageDriverConfig]) {\n throw new Error(`${driverName.toUpperCase()} driver requires \"${field}\" configuration`);\n }\n }\n }\n\n /**\n * Get or create driver instance from cache\n * @internal\n */\n protected resolveDriver(name: string): StorageDriverContract {\n // Ensure configs are loaded\n\n if (this.drivers.has(name)) {\n return this.drivers.get(name)!;\n }\n\n const config = this.configs.get(name);\n\n if (!config) {\n throw new Error(`Storage driver \"${name}\" is not configured`);\n }\n\n const options = this.parseOptions(config);\n let driver: StorageDriverContract;\n\n switch (config.driver) {\n case \"local\":\n driver = new LocalDriver(options as LocalStorageDriverOptions);\n break;\n case \"s3\":\n driver = new S3Driver(options as CloudStorageDriverOptions);\n break;\n case \"r2\":\n driver = new R2Driver(options as R2StorageDriverOptions);\n break;\n case \"spaces\":\n driver = new DOSpacesDriver(options as CloudStorageDriverOptions);\n break;\n default:\n throw new Error(`Unknown storage driver type: ${config.driver}`);\n }\n\n this.drivers.set(name, driver);\n return driver;\n }\n\n /**\n * Resolve the default driver name (supports async resolver for multi-tenancy)\n * @internal\n */\n protected async resolveDefaultDriver(): Promise<StorageDriverName> {\n const resolver = storageConfig(\"resolver\");\n\n if (resolver) {\n const resolved = await resolver();\n return resolved || this.defaultDriverName;\n }\n\n return this.defaultDriverName;\n }\n}\n\n/**\n * Singleton storage instance\n *\n * Pre-configured storage manager ready for use throughout the application.\n *\n * @example\n * ```typescript\n * import { storage } from \"@warlock.js/core\";\n *\n * const file = await storage.put(buffer, \"uploads/file.txt\");\n * ```\n */\nexport const storage = new Storage();\n"],"mappings":"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"}
1
+ {"version":3,"file":"storage.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/storage.ts"],"sourcesContent":["import events, { type EventSubscription } from \"@mongez/events\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport type { Readable } from \"stream\";\nimport type { UploadedFile } from \"../http\";\nimport { storageConfig } from \"./config\";\nimport { storageDriverContext } from \"./context/storage-driver-context\";\nimport { DOSpacesDriver } from \"./drivers/do-spaces-driver\";\nimport { LocalDriver } from \"./drivers/local-driver\";\nimport { R2Driver } from \"./drivers/r2-driver\";\nimport { S3Driver } from \"./drivers/s3-driver\";\nimport { ScopedStorage } from \"./scoped-storage\";\nimport { StorageFile } from \"./storage-file\";\nimport { safeFetchToBuffer } from \"./utils/safe-fetch\";\nimport type {\n CloudStorageDriverContract,\n CloudStorageDriverOptions,\n DeleteManyResult,\n FileVisibility,\n ListOptions,\n LocalStorageDriverOptions,\n PresignedOptions,\n PresignedUploadOptions,\n PutFromUrlOptions,\n PutOptions,\n R2StorageDriverOptions,\n ScopedStorageContract,\n StorageCopyEventPayload,\n StorageDriverConfig,\n StorageDriverContract,\n StorageDriverName,\n StorageEventHandler,\n StorageEventPayload,\n StorageEventType,\n StorageFileInfo,\n StorageManagerContract,\n StoragePutEventPayload,\n TemporaryTokenValidation,\n} from \"./types\";\n\n/**\n * Storage Manager\n *\n * Provides a unified interface for file storage operations across multiple\n * drivers (local, S3, R2, DigitalOcean Spaces). Extends `ScopedStorage` to\n * inherit all base operations while adding driver management and events.\n *\n * All operations return `StorageFile` instances for a consistent, rich DX.\n *\n * @example\n * ```typescript\n * // Basic usage (uses default driver)\n * const file = await storage.put(buffer, \"uploads/image.jpg\");\n *\n * // With options\n * const file = await storage.put(buffer, \"uploads/image.jpg\", {\n * mimeType: \"image/jpeg\",\n * cacheControl: \"max-age=31536000\"\n * });\n *\n * // Using specific driver (also returns StorageFile)\n * const file = await storage.use(\"s3\").put(buffer, \"path/to/file\");\n *\n * // Get raw driver for advanced use\n * const driver = storage.driver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\"); // Returns StorageFileData\n *\n * // Stream operations for large files\n * const stream = await storage.getStream(\"large-file.zip\");\n * await storage.putStream(readableStream, \"output/file.zip\");\n *\n * // Batch operations\n * const results = await storage.deleteMany([\"file1.txt\", \"file2.txt\"]);\n *\n * // Event hooks\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${location}`);\n * });\n * ```\n */\nexport class Storage extends ScopedStorage implements StorageManagerContract {\n /**\n * Registered drivers (cached instances)\n * @internal\n */\n protected drivers = new Map<string, StorageDriverContract>();\n\n /**\n * Driver configurations\n * @internal\n */\n protected configs = new Map<string, StorageDriverConfig>();\n\n /**\n * Default driver name\n * @internal\n */\n protected defaultDriverName!: StorageDriverName;\n\n /**\n * Whether the storage has been initialized\n * @internal\n */\n private initialized = false;\n\n /**\n * Create a new Storage manager instance\n *\n * Uses lazy initialization - driver is resolved on first access.\n */\n public constructor() {\n // Temp placeholder - will be replaced on first access\n super(null as unknown as StorageDriverContract);\n }\n\n /**\n * Ensure storage is initialized (lazy initialization)\n *\n * Called automatically on first driver access.\n */\n public async init(): Promise<void> {\n if (this.initialized) return;\n\n // Mark as initialized FIRST to prevent infinite recursion\n this.initialized = true;\n\n // Get default driver name from config\n\n const defaultName = storageConfig(\"default\", \"local\");\n\n this.defaultDriverName = defaultName as StorageDriverName;\n this.loadDriversFromConfig();\n\n // Now set the actual driver\n this._driver = this.resolveDriver(this.defaultDriverName);\n }\n\n /**\n * Reset storage defaults\n */\n public reset(): void {\n this.initialized = false;\n this.drivers.clear();\n this.configs.clear();\n this.defaultDriverName = null as unknown as StorageDriverName;\n this._driver = null as unknown as StorageDriverContract;\n }\n\n /**\n * Get the currently active driver (context-aware in future)\n *\n * Currently returns the default driver.\n * Will be enhanced to check AsyncLocalStorage context for multi-tenant support.\n *\n * @returns The active storage driver\n */\n public override get activeDriver(): StorageDriverContract {\n // Check context for tenant-specific driver\n const contextDriver = storageDriverContext.getDriver();\n\n if (contextDriver) return contextDriver;\n\n return this._driver;\n }\n\n // ============================================================\n // Driver Management\n // ============================================================\n\n /**\n * Load drivers from configuration\n * @internal\n */\n protected loadDriversFromConfig(): void {\n const drivers = storageConfig<Record<string, StorageDriverConfig>>(\"drivers\", {});\n\n for (const [name, config] of Object.entries(drivers)) {\n this.configs.set(name, config);\n }\n }\n\n /**\n * Get a scoped storage for a specific driver\n *\n * Returns a `ScopedStorage` instance that wraps the specified driver.\n * Operations on the returned instance also return `StorageFile` objects.\n *\n * @param name - Driver name as defined in configuration\n * @returns ScopedStorage instance for the specified driver\n *\n * @example\n * ```typescript\n * // Upload to S3\n * const s3File = await storage.use(\"s3\").put(buffer, \"images/photo.jpg\");\n *\n * // Upload to local\n * const localFile = await storage.use(\"local\").put(buffer, \"temp/file.txt\");\n *\n * // Both return StorageFile with identical API\n * console.log(s3File.url);\n * console.log(localFile.url);\n * ```\n */\n public use(name: StorageDriverName): ScopedStorageContract {\n return new ScopedStorage(this.getDriver(name));\n }\n\n /**\n * Get a raw driver instance\n *\n * Returns the underlying driver directly for advanced use cases.\n * Unlike `use()`, calling methods on the raw driver returns\n * `StorageFileData` instead of `StorageFile`.\n *\n * @param name - Driver name as defined in configuration\n * @returns Raw driver instance implementing StorageDriverContract\n *\n * @example\n * ```typescript\n * const driver = storage.getDriver(\"s3\");\n * const data = await driver.put(buffer, \"path/to/file\");\n * // data is StorageFileData, not StorageFile\n * ```\n */\n public getDriver(name: StorageDriverName): StorageDriverContract {\n return this.resolveDriver(name);\n }\n\n /**\n * Get root directory of current driver\n */\n public root(apepndedPath?: string): string {\n const rootPath = this.activeDriver.options?.root || \"\";\n\n return path.join(rootPath, apepndedPath || \"\");\n }\n\n /**\n * Use a cloud storage driver with extended cloud capabilities\n *\n * @param name - Cloud driver name (s3, r2, spaces)\n * @returns Driver instance implementing CloudStorageDriverContract\n * @throws Error if driver doesn't support cloud operations\n *\n * @example\n * ```typescript\n * const cloudDriver = storage.useCloud(\"s3\");\n * const presignedUrl = await cloudDriver.getPresignedUrl(\"private/doc.pdf\");\n * ```\n */\n public useCloud(name: StorageDriverName): CloudStorageDriverContract {\n const instance = this.getDriver(name);\n\n if (!this.isCloudDriver(instance)) {\n throw new Error(`Driver \"${name}\" does not support cloud operations`);\n }\n\n return instance as CloudStorageDriverContract;\n }\n\n /**\n * Register a new driver configuration at runtime\n *\n * Allows dynamic driver registration for multi-tenancy or\n * runtime configuration scenarios.\n *\n * @param name - Unique driver name\n * @param config - Driver configuration\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.register(\"tenant-s3\", {\n * driver: \"s3\",\n * bucket: \"tenant-bucket\",\n * region: \"us-east-1\",\n * accessKeyId: process.env.TENANT_AWS_KEY,\n * secretAccessKey: process.env.TENANT_AWS_SECRET\n * });\n *\n * await storage.use(\"tenant-s3\").put(buffer, \"file.txt\");\n * ```\n */\n public register(name: StorageDriverName, config: StorageDriverConfig): this {\n this.configs.set(name, config);\n this.drivers.delete(name); // Clear cached instance\n return this;\n }\n\n /**\n * Set the default driver name\n *\n * @param name - Driver name to use as default\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.setDefault(\"s3\");\n * await storage.put(buffer, \"file.txt\"); // Now uses S3\n * ```\n */\n public setDefault(name: StorageDriverName): this {\n this.defaultDriverName = name;\n this._driver = this.getDriver(name);\n return this;\n }\n\n /**\n * Check if current driver is a cloud driver\n *\n * @returns Promise resolving to true if the current driver supports cloud operations\n */\n public async isCloud(): Promise<boolean> {\n return this.isCloudDriver(this.activeDriver);\n }\n\n /**\n * Check if a driver instance supports cloud operations\n * @internal\n */\n protected isCloudDriver(driver: StorageDriverContract): driver is CloudStorageDriverContract {\n return \"getPresignedUrl\" in driver;\n }\n\n // ============================================================\n // Event System\n // ============================================================\n\n /**\n * Register an event handler\n *\n * Subscribe to storage events for logging, analytics, or side effects.\n *\n * @param event - Event type to listen for\n * @param handler - Handler function\n * @returns Event subscription for unsubscribing\n *\n * @example\n * ```typescript\n * // Log all uploads\n * storage.on(\"afterPut\", ({ location, file }) => {\n * console.log(`Uploaded ${file?.size} bytes to ${location}`);\n * });\n *\n * // Track deletions\n * storage.on(\"afterDelete\", ({ location }) => {\n * analytics.track(\"file_deleted\", { path: location });\n * });\n * ```\n */\n public on<T extends StorageEventPayload = StorageEventPayload>(\n event: StorageEventType,\n handler: StorageEventHandler<T>,\n ): EventSubscription {\n return events.subscribe(`storage.${event}`, handler);\n }\n\n /**\n * Remove all handlers for an event type\n *\n * @param event - Event type to remove handlers for\n * @returns This instance for chaining\n *\n * @example\n * ```typescript\n * storage.off(\"afterPut\"); // Remove all afterPut handlers\n * ```\n */\n public off(event: StorageEventType): this {\n events.off(`storage.${event}`);\n return this;\n }\n\n /**\n * Emit an event to all registered handlers\n * @internal\n */\n protected async emit<T extends StorageEventPayload>(\n event: StorageEventType,\n payload: T,\n ): Promise<void> {\n await events.triggerAll(`storage.${event}`, payload);\n }\n\n // ============================================================\n // Overridden Operations with Events\n // ============================================================\n\n /**\n * Store a file in storage\n *\n * Extends base `put()` with event emission for beforePut/afterPut hooks.\n *\n * @param file - File content as Buffer, string, UploadedFile, or Readable stream\n * @param location - Destination path\n * @param options - Storage options (mimeType, cacheControl, etc.)\n * @returns StorageFile instance with cached metadata\n */\n public override async put(\n file: UploadedFile | Buffer | string | Readable,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n const buffer = await this.toBuffer(file);\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n size: buffer.length,\n });\n\n const result = await driver.put(buffer, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n if (!result.size) {\n result.size = buffer.length;\n }\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a readable stream (for large files)\n *\n * Extends base `putStream()` with event emission.\n *\n * @param stream - Readable stream\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n */\n public override async putStream(\n stream: Readable | string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n const driver = this.activeDriver;\n\n await this.emit<StoragePutEventPayload>(\"beforePut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n });\n\n if (typeof stream === \"string\") {\n stream = fs.createReadStream(stream);\n }\n\n const result = await driver.putStream(stream, location, options);\n\n await this.emit<StoragePutEventPayload>(\"afterPut\", {\n driver: driver.name,\n location,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Store a file from a URL\n *\n * Downloads content from the URL and stores it at the specified location.\n *\n * The download is SSRF-guarded by default: the URL scheme must be\n * https/http, the host must not resolve to a private / loopback /\n * link-local / cloud-metadata address, the body is capped, and the\n * request times out. Tune or relax via the {@link PutFromUrlOptions}\n * guard fields.\n *\n * @param url - Source URL to download from\n * @param location - Destination path\n * @param options - Storage + outbound-download guard options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * const file = await storage.putFromUrl(\n * \"https://example.com/image.jpg\",\n * \"downloads/image.jpg\"\n * );\n * ```\n */\n public async putFromUrl(\n url: string,\n location: string,\n options?: PutFromUrlOptions,\n ): Promise<StorageFile> {\n const { allowPrivateHosts, maxBytes, timeoutMs, allowedSchemes, ...putOptions } =\n options ?? {};\n\n const result = await safeFetchToBuffer(url, {\n allowPrivateHosts,\n maxBytes,\n timeoutMs,\n allowedSchemes,\n });\n\n if (!result.ok) {\n throw new Error(`Failed to fetch file from URL: ${result.statusText}`);\n }\n\n if (!result.contentType) {\n throw new Error(`Failed to fetch file from URL: missing content-type header`);\n }\n\n const mimeType = putOptions.mimeType || result.contentType;\n\n return this.put(result.buffer, location, { ...putOptions, mimeType });\n }\n\n /**\n * Store a file from base64 encoded string\n *\n * Decodes base64 content (with optional data URL prefix) and stores it.\n *\n * @param base64 - Base64 encoded file content (or data URL)\n * @param location - Destination path\n * @param options - Storage options\n * @returns StorageFile instance with cached metadata\n *\n * @example\n * ```typescript\n * // From plain base64\n * const file = await storage.putFromBase64(base64String, \"images/photo.jpg\");\n *\n * // From data URL (auto-extracts MIME type)\n * const file = await storage.putFromBase64(\n * \"data:image/png;base64,iVBORw0KGgo...\",\n * \"images/photo.png\"\n * );\n * ```\n */\n public async putFromBase64(\n base64: string,\n location: string,\n options?: PutOptions,\n ): Promise<StorageFile> {\n let data = base64;\n let mimeType = options?.mimeType;\n\n if (base64.startsWith(\"data:\")) {\n const match = base64.match(/^data:([^;]+);base64,(.+)$/);\n if (match) {\n mimeType = mimeType || match[1];\n data = match[2];\n }\n }\n\n const buffer = Buffer.from(data, \"base64\");\n return this.put(buffer, location, { ...options, mimeType });\n }\n\n /**\n * Retrieve file contents as Buffer\n *\n * Uses the current driver (with async resolution).\n *\n * @param location - File path\n * @returns Buffer containing file contents\n */\n public override async get(location: string): Promise<Buffer> {\n return this.activeDriver.get(location);\n }\n\n /**\n * Get JSON content from a file\n *\n * Downloads and parses JSON file content.\n *\n * @param location - File path\n * @returns Parsed JSON content\n *\n * @example\n * ```typescript\n * const config = await storage.getJson(\"config/settings.json\");\n * console.log(config.apiKey);\n * ```\n */\n public async getJson(location: string): Promise<any> {\n const buffer = await this.get(location);\n return JSON.parse(buffer.toString());\n }\n\n /**\n * Retrieve a file as a readable stream (for large files)\n *\n * @param location - File path\n * @returns Readable stream of file contents\n */\n public override async getStream(location: string): Promise<Readable> {\n return this.activeDriver.getStream(location);\n }\n\n /**\n * Delete a file\n *\n * Extends base `delete()` with event emission.\n *\n * @param location - File path or StorageFile\n * @returns true if deleted, false if not found\n */\n public override async delete(location: string | StorageFile): Promise<boolean> {\n const driver = this.activeDriver;\n const path = typeof location === \"string\" ? location : location.path;\n\n await this.emit<StorageEventPayload>(\"beforeDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n const result = await driver.delete(path);\n\n await this.emit<StorageEventPayload>(\"afterDelete\", {\n driver: driver.name,\n location: path,\n timestamp: new Date(),\n });\n\n return result;\n }\n\n /**\n * Delete multiple files at once\n *\n * @param locations - Array of file paths\n * @returns Array of delete results with status for each file\n */\n public override async deleteMany(locations: string[]): Promise<DeleteManyResult[]> {\n return this.activeDriver.deleteMany(locations);\n }\n\n /**\n * Check if a file exists\n *\n * @param location - File path\n * @returns true if file exists\n */\n public override async exists(location: string): Promise<boolean> {\n return this.activeDriver.exists(location);\n }\n\n /**\n * Copy a file to a new location\n *\n * Extends base `copy()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async copy(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.copy(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterCopy\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * Move a file to a new location\n *\n * Extends base `move()` with event emission.\n *\n * @param from - Source path or StorageFile\n * @param to - Destination path\n * @returns StorageFile instance at destination\n */\n public override async move(from: string | StorageFile, to: string): Promise<StorageFile> {\n const driver = this.activeDriver;\n const fromPath = typeof from === \"string\" ? from : from.path;\n\n await this.emit<StorageCopyEventPayload>(\"beforeMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n });\n\n const result = await driver.move(fromPath, to);\n\n await this.emit<StorageCopyEventPayload>(\"afterMove\", {\n driver: driver.name,\n location: to,\n from: fromPath,\n to,\n timestamp: new Date(),\n file: result,\n });\n\n return StorageFile.fromData(result, driver);\n }\n\n /**\n * List files in a directory\n *\n * @param directory - Directory path (defaults to root)\n * @param options - List options (recursive, limit, etc.)\n * @returns Array of file information objects\n */\n public override async list(\n directory?: string,\n options?: ListOptions,\n ): Promise<StorageFileInfo[]> {\n return this.activeDriver.list(directory || \"\", options);\n }\n\n // ============================================================\n // Metadata Operations\n // ============================================================\n\n /**\n * Get file metadata without downloading\n *\n * @param location - File path\n * @returns File information object\n */\n public override async metadata(location: string): Promise<StorageFileInfo> {\n return this.activeDriver.metadata(location);\n }\n\n /**\n * Get file size in bytes\n *\n * @param location - File path\n * @returns File size in bytes\n */\n public override async size(location: string): Promise<number> {\n return this.activeDriver.size(location);\n }\n\n // ============================================================\n // Path Operations (Local Driver Only)\n // ============================================================\n\n /**\n * Get the absolute filesystem path for a location\n *\n * Only available for local driver.\n *\n * @param location - File path\n * @throws Error if current driver is not a local driver\n * @returns Absolute filesystem path\n */\n public async path(location: string): Promise<string> {\n const driver = this.activeDriver;\n\n if (!(\"path\" in driver) || typeof driver.path !== \"function\") {\n throw new Error(\"path() is only available for local storage drivers\");\n }\n\n return driver.path(location);\n }\n\n // ============================================================\n // Cloud-Specific Operations\n // ============================================================\n\n /**\n * Get a presigned URL for downloading a file\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param options - Presigned URL options (expiresIn)\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned download URL\n *\n * @example\n * ```typescript\n * const url = await storage.getPresignedUrl(\"private/document.pdf\", {\n * expiresIn: 3600 // 1 hour\n * });\n * ```\n */\n public async getPresignedUrl(location: string, options?: PresignedOptions): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUrl(location, options);\n }\n\n /**\n * Get a presigned URL for uploading a file directly to cloud storage\n *\n * Only available for cloud drivers.\n *\n * @param location - Destination path\n * @param options - Upload options (expiresIn, contentType, metadata).\n * There is no size cap: a presigned PUT URL cannot enforce one — verify\n * the uploaded size server-side or use a presigned POST policy instead.\n * @throws Error if current driver is not a cloud driver\n * @returns Presigned upload URL\n *\n * @example\n * ```typescript\n * const uploadUrl = await storage.getPresignedUploadUrl(\"uploads/file.pdf\", {\n * expiresIn: 3600,\n * contentType: \"application/pdf\"\n * });\n *\n * // Client can PUT directly to this URL\n * ```\n */\n public async getPresignedUploadUrl(\n location: string,\n options?: PresignedUploadOptions,\n ): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Presigned upload URLs are only available for cloud storage drivers\");\n }\n\n return driver.getPresignedUploadUrl(location, options);\n }\n\n /**\n * Get the bucket name for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Bucket name\n */\n public async getBucket(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Bucket information is only available for cloud storage drivers\");\n }\n\n return driver.getBucket();\n }\n\n /**\n * Get the region for cloud storage\n *\n * Only available for cloud drivers.\n *\n * @throws Error if current driver is not a cloud driver\n * @returns Region name\n */\n public async getRegion(): Promise<string> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Region information is only available for cloud storage drivers\");\n }\n\n return driver.getRegion();\n }\n\n /**\n * Set storage class for a file (e.g., STANDARD, GLACIER, etc.)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param storageClass - Target storage class\n * @throws Error if current driver is not a cloud driver\n */\n public async setStorageClass(location: string, storageClass: string): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Storage class is only available for cloud storage drivers\");\n }\n\n return driver.setStorageClass(location, storageClass);\n }\n\n /**\n * Set file visibility (public or private)\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @param visibility - \"public\" or \"private\"\n * @throws Error if current driver is not a cloud driver\n */\n public async setVisibility(location: string, visibility: FileVisibility): Promise<void> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.setVisibility(location, visibility);\n }\n\n /**\n * Get file visibility\n *\n * Only available for cloud drivers.\n *\n * @param location - File path\n * @throws Error if current driver is not a cloud driver\n * @returns Current visibility setting\n */\n public async getVisibility(location: string): Promise<FileVisibility> {\n const driver = this.activeDriver;\n\n if (!this.isCloudDriver(driver)) {\n throw new Error(\"Visibility is only available for cloud storage drivers\");\n }\n\n return driver.getVisibility(location);\n }\n\n /**\n * Get a temporary signed URL\n *\n * Creates a URL that provides temporary access to the file.\n *\n * @param location - File path\n * @param expiresIn - Seconds until expiration (default: 3600)\n * @returns Signed URL string\n */\n public override async temporaryUrl(location: string, expiresIn?: number): Promise<string> {\n return this.activeDriver.temporaryUrl(location, expiresIn);\n }\n\n /**\n * Validate a temporary URL token\n *\n * For local driver: validates HMAC-signed tokens\n * For cloud drivers: returns invalid (cloud validates via presigned URL)\n *\n * @param token - The token from the temporary URL\n * @returns Validation result with file info and convenience methods\n *\n * @example\n * ```typescript\n * const result = await storage.validateTemporaryToken(token);\n *\n * if (!result.valid) {\n * return response.status(403).send(result.error);\n * }\n *\n * // For local driver - use sendFile for efficiency\n * if (result.absolutePath) {\n * return response.sendFile(result.absolutePath);\n * }\n *\n * // For cloud driver - stream the file\n * const stream = await result.getStream!();\n * stream.pipe(response.raw);\n * ```\n */\n public async validateTemporaryToken(token: string): Promise<TemporaryTokenValidation> {\n // Check if driver supports token validation\n if (\n !(\"validateTemporaryToken\" in this.activeDriver) ||\n typeof this.activeDriver.validateTemporaryToken !== \"function\"\n ) {\n // For cloud drivers, temporary URLs are presigned and validated by the cloud provider\n return {\n valid: false,\n error: \"invalid_token\",\n };\n }\n\n return this.activeDriver.validateTemporaryToken(token);\n }\n\n // ============================================================\n // Configuration Parsing\n // ============================================================\n\n /**\n * Parse config into driver-specific options\n * @internal\n */\n protected parseOptions(\n config: StorageDriverConfig,\n ): LocalStorageDriverOptions | CloudStorageDriverOptions | R2StorageDriverOptions {\n const { driver, ...options } = config;\n\n switch (driver) {\n case \"local\":\n return {\n root: options.root,\n urlPrefix: options.urlPrefix,\n signatureKey: options.signatureKey,\n } satisfies LocalStorageDriverOptions;\n\n case \"s3\":\n this.validateCloudConfig(config, \"s3\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n case \"r2\":\n this.validateCloudConfig(config, \"r2\");\n if (!options.accountId) {\n throw new Error('R2 driver requires \"accountId\" configuration');\n }\n\n return {\n ...options,\n region: options.region || \"auto\",\n bucket: options.bucket!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n accountId: options.accountId,\n publicDomain: options.publicDomain,\n } satisfies R2StorageDriverOptions;\n\n case \"spaces\":\n this.validateCloudConfig(config, \"spaces\");\n return {\n ...options,\n bucket: options.bucket!,\n region: options.region!,\n accessKeyId: options.accessKeyId!,\n secretAccessKey: options.secretAccessKey!,\n endpoint: options.endpoint,\n urlPrefix: options.urlPrefix,\n } satisfies CloudStorageDriverOptions;\n\n default:\n throw new Error(`Unknown driver type: ${driver}`);\n }\n }\n\n /**\n * Validate cloud driver configuration has required fields\n * @internal\n */\n protected validateCloudConfig(config: StorageDriverConfig, driverName: string): void {\n const required = [\"bucket\", \"accessKeyId\", \"secretAccessKey\"];\n\n if (driverName !== \"r2\") {\n required.push(\"region\");\n }\n\n for (const field of required) {\n if (!config[field as keyof StorageDriverConfig]) {\n throw new Error(`${driverName.toUpperCase()} driver requires \"${field}\" configuration`);\n }\n }\n }\n\n /**\n * Get or create driver instance from cache\n * @internal\n */\n protected resolveDriver(name: string): StorageDriverContract {\n // Ensure configs are loaded\n\n if (this.drivers.has(name)) {\n return this.drivers.get(name)!;\n }\n\n const config = this.configs.get(name);\n\n if (!config) {\n throw new Error(`Storage driver \"${name}\" is not configured`);\n }\n\n const options = this.parseOptions(config);\n let driver: StorageDriverContract;\n\n switch (config.driver) {\n case \"local\":\n driver = new LocalDriver(options as LocalStorageDriverOptions);\n break;\n case \"s3\":\n driver = new S3Driver(options as CloudStorageDriverOptions);\n break;\n case \"r2\":\n driver = new R2Driver(options as R2StorageDriverOptions);\n break;\n case \"spaces\":\n driver = new DOSpacesDriver(options as CloudStorageDriverOptions);\n break;\n default:\n throw new Error(`Unknown storage driver type: ${config.driver}`);\n }\n\n this.drivers.set(name, driver);\n return driver;\n }\n\n /**\n * Resolve the default driver name (supports async resolver for multi-tenancy)\n * @internal\n */\n protected async resolveDefaultDriver(): Promise<StorageDriverName> {\n const resolver = storageConfig(\"resolver\");\n\n if (resolver) {\n const resolved = await resolver();\n return resolved || this.defaultDriverName;\n }\n\n return this.defaultDriverName;\n }\n}\n\n/**\n * Singleton storage instance\n *\n * Pre-configured storage manager ready for use throughout the application.\n *\n * @example\n * ```typescript\n * import { storage } from \"@warlock.js/core\";\n *\n * const file = await storage.put(buffer, \"uploads/file.txt\");\n * ```\n */\nexport const storage = new Storage();\n"],"mappings":"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"}
@@ -310,21 +310,49 @@ type PresignedOptions = {
310
310
  };
311
311
  /**
312
312
  * Options for presigned upload URLs
313
+ *
314
+ * NOTE: there is intentionally no `maxSize` option. The driver issues a
315
+ * presigned PUT URL (via `getSignedUrl` + `PutObjectCommand`), which CANNOT
316
+ * enforce an upload size limit — only a presigned POST policy
317
+ * (`createPresignedPost` + `ContentLengthRange`) can. A `maxSize` field here
318
+ * would advertise a guarantee the implementation does not provide, so it was
319
+ * removed rather than left as a no-op. Enforce size limits server-side (e.g.
320
+ * verify `metadata().size` after upload) or migrate to presigned POST.
313
321
  */
314
322
  type PresignedUploadOptions = PresignedOptions & {
315
323
  /**
316
324
  * File content type
317
325
  */
318
326
  contentType?: string;
319
- /**
320
- * Maximum file size in bytes
321
- */
322
- maxSize?: number;
323
327
  /**
324
328
  * Custom metadata to store with the file (cloud drivers only)
325
329
  */
326
330
  metadata?: Record<string, string>;
327
331
  };
332
+ /**
333
+ * Options for `putFromUrl` operations.
334
+ *
335
+ * Extends {@link PutOptions} with SSRF / resource-exhaustion guards for the
336
+ * outbound download. All guard fields are optional and default to the SAFE
337
+ * (guards-ON) behaviour: https+http only, private/loopback/metadata hosts
338
+ * denied, a byte cap, and a timeout.
339
+ */
340
+ type PutFromUrlOptions = PutOptions & {
341
+ /**
342
+ * Allow private / loopback / link-local / cloud-metadata hosts. Default
343
+ * `false` — the SSRF guard is ON.
344
+ */
345
+ allowPrivateHosts?: boolean;
346
+ /**
347
+ * Maximum downloaded body size in bytes. Default `52_428_800` (50 MiB).
348
+ */
349
+ maxBytes?: number; /** Per-request timeout in milliseconds. Default `30_000`. */
350
+ timeoutMs?: number;
351
+ /**
352
+ * URL schemes permitted for the download. Default `["https", "http"]`.
353
+ */
354
+ allowedSchemes?: string[];
355
+ };
328
356
  /**
329
357
  * Options for put operations
330
358
  */
@@ -963,5 +991,5 @@ interface EventSubscription {
963
991
  unsubscribe(): void;
964
992
  }
965
993
  //#endregion
966
- export { CloudStorageDriverContract, CloudStorageDriverOptions, CloudStorageFileData, DeleteManyResult, EventSubscription, FileVisibility, ListOptions, LocalStorageDriverOptions, PresignedOptions, PresignedUploadOptions, PutDirectoryOptions, PutDirectoryResult, PutOptions, R2StorageDriverOptions, ScopedStorageContract, StorageConfigurations, StorageCopyEventPayload, StorageDriverConfig, StorageDriverContract, StorageDriverName, StorageDriverRegistry, StorageDriverType, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFileData, StorageFileInfo, StorageManagerContract, StoragePutEventPayload, TemporaryTokenError, TemporaryTokenPayload, TemporaryTokenValidation };
994
+ export { CloudStorageDriverContract, CloudStorageDriverOptions, CloudStorageFileData, DeleteManyResult, EventSubscription, FileVisibility, ListOptions, LocalStorageDriverOptions, PresignedOptions, PresignedUploadOptions, PutDirectoryOptions, PutDirectoryResult, PutFromUrlOptions, PutOptions, R2StorageDriverOptions, ScopedStorageContract, StorageConfigurations, StorageCopyEventPayload, StorageDriverConfig, StorageDriverContract, StorageDriverName, StorageDriverRegistry, StorageDriverType, StorageEventHandler, StorageEventPayload, StorageEventType, StorageFileData, StorageFileInfo, StorageManagerContract, StoragePutEventPayload, TemporaryTokenError, TemporaryTokenPayload, TemporaryTokenValidation };
967
995
  //# sourceMappingURL=types.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/types.ts"],"mappings":"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"}
1
+ {"version":3,"file":"types.d.mts","names":[],"sources":["../../../../../../../@warlock.js/core/src/storage/types.ts"],"mappings":"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"}
@@ -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"}