@warlock.js/core 4.4.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (997) hide show
  1. package/CHANGELOG.md +72 -5
  2. package/README.md +47 -11
  3. package/esm/ai/src/agent/agent-input-builder.mjs +132 -0
  4. package/esm/ai/src/agent/agent-input-builder.mjs.map +1 -0
  5. package/esm/ai/src/agent/agent-log-event.mjs +101 -0
  6. package/esm/ai/src/agent/agent-log-event.mjs.map +1 -0
  7. package/esm/ai/src/agent/agent-stream.mjs +82 -0
  8. package/esm/ai/src/agent/agent-stream.mjs.map +1 -0
  9. package/esm/ai/src/agent/agent-to-stream-event.mjs +86 -0
  10. package/esm/ai/src/agent/agent-to-stream-event.mjs.map +1 -0
  11. package/esm/ai/src/agent/agent.mjs +1276 -0
  12. package/esm/ai/src/agent/agent.mjs.map +1 -0
  13. package/esm/ai/src/agent/index.mjs +5 -0
  14. package/esm/ai/src/agent/json-stream-guard.mjs +400 -0
  15. package/esm/ai/src/agent/json-stream-guard.mjs.map +1 -0
  16. package/esm/ai/src/agent/signature.mjs +57 -0
  17. package/esm/ai/src/agent/signature.mjs.map +1 -0
  18. package/esm/ai/src/agent/snapshot.mjs +101 -0
  19. package/esm/ai/src/agent/snapshot.mjs.map +1 -0
  20. package/esm/ai/src/agent/spawn-sub-agent.mjs +68 -0
  21. package/esm/ai/src/agent/spawn-sub-agent.mjs.map +1 -0
  22. package/esm/ai/src/ai.mjs +191 -0
  23. package/esm/ai/src/ai.mjs.map +1 -0
  24. package/esm/ai/src/batch/batch.mjs +198 -0
  25. package/esm/ai/src/batch/batch.mjs.map +1 -0
  26. package/esm/ai/src/batch/index.mjs +3 -0
  27. package/esm/ai/src/batch/run-batch-item.mjs +100 -0
  28. package/esm/ai/src/batch/run-batch-item.mjs.map +1 -0
  29. package/esm/ai/src/batch/run-with-concurrency.mjs +39 -0
  30. package/esm/ai/src/batch/run-with-concurrency.mjs.map +1 -0
  31. package/esm/ai/src/checkpoint/memory.mjs +0 -0
  32. package/esm/ai/src/checkpoint/memory.mjs.map +1 -0
  33. package/esm/ai/src/checkpoint/pg.mjs +265 -0
  34. package/esm/ai/src/checkpoint/pg.mjs.map +1 -0
  35. package/esm/ai/src/checkpoint/redis.mjs +200 -0
  36. package/esm/ai/src/checkpoint/redis.mjs.map +1 -0
  37. package/esm/ai/src/config.mjs +59 -0
  38. package/esm/ai/src/config.mjs.map +1 -0
  39. package/esm/ai/src/contracts/end.type.mjs +47 -0
  40. package/esm/ai/src/contracts/end.type.mjs.map +1 -0
  41. package/esm/ai/src/errors/agent-cancelled-error.mjs +43 -0
  42. package/esm/ai/src/errors/agent-cancelled-error.mjs.map +1 -0
  43. package/esm/ai/src/errors/agent-drift-error.mjs +31 -0
  44. package/esm/ai/src/errors/agent-drift-error.mjs.map +1 -0
  45. package/esm/ai/src/errors/agent-execution-error.mjs +35 -0
  46. package/esm/ai/src/errors/agent-execution-error.mjs.map +1 -0
  47. package/esm/ai/src/errors/agent-max-trips-error.mjs +41 -0
  48. package/esm/ai/src/errors/agent-max-trips-error.mjs.map +1 -0
  49. package/esm/ai/src/errors/ai-error.mjs +68 -0
  50. package/esm/ai/src/errors/ai-error.mjs.map +1 -0
  51. package/esm/ai/src/errors/budget-exceeded-error.mjs +31 -0
  52. package/esm/ai/src/errors/budget-exceeded-error.mjs.map +1 -0
  53. package/esm/ai/src/errors/content-filter-error.mjs +28 -0
  54. package/esm/ai/src/errors/content-filter-error.mjs.map +1 -0
  55. package/esm/ai/src/errors/context-length-exceeded-error.mjs +31 -0
  56. package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +1 -0
  57. package/esm/ai/src/errors/guardrail-violation-error.mjs +41 -0
  58. package/esm/ai/src/errors/guardrail-violation-error.mjs.map +1 -0
  59. package/esm/ai/src/errors/index.mjs +39 -0
  60. package/esm/ai/src/errors/invalid-request-error.mjs +31 -0
  61. package/esm/ai/src/errors/invalid-request-error.mjs.map +1 -0
  62. package/esm/ai/src/errors/max-iterations-error.mjs +32 -0
  63. package/esm/ai/src/errors/max-iterations-error.mjs.map +1 -0
  64. package/esm/ai/src/errors/max-steps-exceeded-error.mjs +21 -0
  65. package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +1 -0
  66. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +31 -0
  67. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +1 -0
  68. package/esm/ai/src/errors/orchestrator-config-error.mjs +30 -0
  69. package/esm/ai/src/errors/orchestrator-config-error.mjs.map +1 -0
  70. package/esm/ai/src/errors/orchestrator-drift-error.mjs +37 -0
  71. package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +1 -0
  72. package/esm/ai/src/errors/orchestrator-failed-error.mjs +36 -0
  73. package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +1 -0
  74. package/esm/ai/src/errors/outbound-policy-error.mjs +32 -0
  75. package/esm/ai/src/errors/outbound-policy-error.mjs.map +1 -0
  76. package/esm/ai/src/errors/planner-cancelled-error.mjs +29 -0
  77. package/esm/ai/src/errors/planner-cancelled-error.mjs.map +1 -0
  78. package/esm/ai/src/errors/planner-drift-error.mjs +33 -0
  79. package/esm/ai/src/errors/planner-drift-error.mjs.map +1 -0
  80. package/esm/ai/src/errors/planner-failed-error.mjs +37 -0
  81. package/esm/ai/src/errors/planner-failed-error.mjs.map +1 -0
  82. package/esm/ai/src/errors/planner-plan-invalid-error.mjs +25 -0
  83. package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +1 -0
  84. package/esm/ai/src/errors/provider-auth-error.mjs +26 -0
  85. package/esm/ai/src/errors/provider-auth-error.mjs.map +1 -0
  86. package/esm/ai/src/errors/provider-error.mjs +42 -0
  87. package/esm/ai/src/errors/provider-error.mjs.map +1 -0
  88. package/esm/ai/src/errors/provider-rate-limit-error.mjs +31 -0
  89. package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +1 -0
  90. package/esm/ai/src/errors/provider-timeout-error.mjs +26 -0
  91. package/esm/ai/src/errors/provider-timeout-error.mjs.map +1 -0
  92. package/esm/ai/src/errors/quota-exceeded-error.mjs +40 -0
  93. package/esm/ai/src/errors/quota-exceeded-error.mjs.map +1 -0
  94. package/esm/ai/src/errors/routing-error.mjs +23 -0
  95. package/esm/ai/src/errors/routing-error.mjs.map +1 -0
  96. package/esm/ai/src/errors/schema-validation-error.mjs +37 -0
  97. package/esm/ai/src/errors/schema-validation-error.mjs.map +1 -0
  98. package/esm/ai/src/errors/step-failed-error.mjs +19 -0
  99. package/esm/ai/src/errors/step-failed-error.mjs.map +1 -0
  100. package/esm/ai/src/errors/supervisor-cancelled-error.mjs +29 -0
  101. package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +1 -0
  102. package/esm/ai/src/errors/supervisor-drift-error.mjs +30 -0
  103. package/esm/ai/src/errors/supervisor-drift-error.mjs.map +1 -0
  104. package/esm/ai/src/errors/supervisor-failed-error.mjs +43 -0
  105. package/esm/ai/src/errors/supervisor-failed-error.mjs.map +1 -0
  106. package/esm/ai/src/errors/supervisor-routing-error.mjs +39 -0
  107. package/esm/ai/src/errors/supervisor-routing-error.mjs.map +1 -0
  108. package/esm/ai/src/errors/tool-execution-error.mjs +32 -0
  109. package/esm/ai/src/errors/tool-execution-error.mjs.map +1 -0
  110. package/esm/ai/src/errors/workflow-cancelled-error.mjs +23 -0
  111. package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +1 -0
  112. package/esm/ai/src/errors/workflow-drift-error.mjs +24 -0
  113. package/esm/ai/src/errors/workflow-drift-error.mjs.map +1 -0
  114. package/esm/ai/src/errors/workflow-error.mjs +18 -0
  115. package/esm/ai/src/errors/workflow-error.mjs.map +1 -0
  116. package/esm/ai/src/eval/dataset.mjs +112 -0
  117. package/esm/ai/src/eval/dataset.mjs.map +1 -0
  118. package/esm/ai/src/eval/eval-runner.mjs +135 -0
  119. package/esm/ai/src/eval/eval-runner.mjs.map +1 -0
  120. package/esm/ai/src/eval/index.mjs +48 -0
  121. package/esm/ai/src/eval/index.mjs.map +1 -0
  122. package/esm/ai/src/eval/judge-scorer.mjs +87 -0
  123. package/esm/ai/src/eval/judge-scorer.mjs.map +1 -0
  124. package/esm/ai/src/eval/regression.mjs +51 -0
  125. package/esm/ai/src/eval/regression.mjs.map +1 -0
  126. package/esm/ai/src/eval/report-json.mjs +33 -0
  127. package/esm/ai/src/eval/report-json.mjs.map +1 -0
  128. package/esm/ai/src/eval/report-junit.mjs +60 -0
  129. package/esm/ai/src/eval/report-junit.mjs.map +1 -0
  130. package/esm/ai/src/eval/scorers.mjs +101 -0
  131. package/esm/ai/src/eval/scorers.mjs.map +1 -0
  132. package/esm/ai/src/guard/detectors/index.mjs +6 -0
  133. package/esm/ai/src/guard/detectors/injection.mjs +254 -0
  134. package/esm/ai/src/guard/detectors/injection.mjs.map +1 -0
  135. package/esm/ai/src/guard/detectors/moderation.mjs +134 -0
  136. package/esm/ai/src/guard/detectors/moderation.mjs.map +1 -0
  137. package/esm/ai/src/guard/detectors/pii.mjs +199 -0
  138. package/esm/ai/src/guard/detectors/pii.mjs.map +1 -0
  139. package/esm/ai/src/guard/detectors/topic.mjs +99 -0
  140. package/esm/ai/src/guard/detectors/topic.mjs.map +1 -0
  141. package/esm/ai/src/guard/errors.mjs +18 -0
  142. package/esm/ai/src/guard/errors.mjs.map +1 -0
  143. package/esm/ai/src/guard/guard.mjs +209 -0
  144. package/esm/ai/src/guard/guard.mjs.map +1 -0
  145. package/esm/ai/src/guard/guardrail.mjs +22 -0
  146. package/esm/ai/src/guard/guardrail.mjs.map +1 -0
  147. package/esm/ai/src/human/errors.mjs +60 -0
  148. package/esm/ai/src/human/errors.mjs.map +1 -0
  149. package/esm/ai/src/human/human-approval.mjs +170 -0
  150. package/esm/ai/src/human/human-approval.mjs.map +1 -0
  151. package/esm/ai/src/human/policy.mjs +67 -0
  152. package/esm/ai/src/human/policy.mjs.map +1 -0
  153. package/esm/ai/src/human/register.mjs +37 -0
  154. package/esm/ai/src/human/register.mjs.map +1 -0
  155. package/esm/ai/src/human/resume-seed.mjs +53 -0
  156. package/esm/ai/src/human/resume-seed.mjs.map +1 -0
  157. package/esm/ai/src/human/resume.mjs +121 -0
  158. package/esm/ai/src/human/resume.mjs.map +1 -0
  159. package/esm/ai/src/human/stores/index.mjs +5 -0
  160. package/esm/ai/src/human/stores/memory.mjs +91 -0
  161. package/esm/ai/src/human/stores/memory.mjs.map +1 -0
  162. package/esm/ai/src/human/stores/pg.mjs +220 -0
  163. package/esm/ai/src/human/stores/pg.mjs.map +1 -0
  164. package/esm/ai/src/human/stores/redis.mjs +201 -0
  165. package/esm/ai/src/human/stores/redis.mjs.map +1 -0
  166. package/esm/ai/src/image/image-cost.mjs +55 -0
  167. package/esm/ai/src/image/image-cost.mjs.map +1 -0
  168. package/esm/ai/src/image/image.mjs +112 -0
  169. package/esm/ai/src/image/image.mjs.map +1 -0
  170. package/esm/ai/src/image/index.mjs +4 -0
  171. package/esm/ai/src/index.mjs +194 -0
  172. package/esm/ai/src/memory/derive-id.mjs +24 -0
  173. package/esm/ai/src/memory/derive-id.mjs.map +1 -0
  174. package/esm/ai/src/memory/episodic-memory.mjs +106 -0
  175. package/esm/ai/src/memory/episodic-memory.mjs.map +1 -0
  176. package/esm/ai/src/memory/memory.mjs +166 -0
  177. package/esm/ai/src/memory/memory.mjs.map +1 -0
  178. package/esm/ai/src/memory/procedural-memory.mjs +103 -0
  179. package/esm/ai/src/memory/procedural-memory.mjs.map +1 -0
  180. package/esm/ai/src/memory/semantic-memory.mjs +80 -0
  181. package/esm/ai/src/memory/semantic-memory.mjs.map +1 -0
  182. package/esm/ai/src/memory/working-memory.mjs +62 -0
  183. package/esm/ai/src/memory/working-memory.mjs.map +1 -0
  184. package/esm/ai/src/middleware/builtins/budget.mjs +219 -0
  185. package/esm/ai/src/middleware/builtins/budget.mjs.map +1 -0
  186. package/esm/ai/src/middleware/builtins/guardrail.mjs +76 -0
  187. package/esm/ai/src/middleware/builtins/guardrail.mjs.map +1 -0
  188. package/esm/ai/src/middleware/builtins/semantic-cache.mjs +149 -0
  189. package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +1 -0
  190. package/esm/ai/src/middleware/helpers/compose.mjs +52 -0
  191. package/esm/ai/src/middleware/helpers/compose.mjs.map +1 -0
  192. package/esm/ai/src/middleware/helpers/for-tool.mjs +80 -0
  193. package/esm/ai/src/middleware/helpers/for-tool.mjs.map +1 -0
  194. package/esm/ai/src/middleware/index.mjs +10 -0
  195. package/esm/ai/src/middleware/pipeline.mjs +100 -0
  196. package/esm/ai/src/middleware/pipeline.mjs.map +1 -0
  197. package/esm/ai/src/middleware/utils/extract-user-text.mjs +47 -0
  198. package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +1 -0
  199. package/esm/ai/src/middleware/utils/namespaced-state.mjs +60 -0
  200. package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +1 -0
  201. package/esm/ai/src/mock/index.mjs +4 -0
  202. package/esm/ai/src/mock/mock-agent.mjs +3 -0
  203. package/esm/ai/src/mock/mock-router.mjs +58 -0
  204. package/esm/ai/src/mock/mock-router.mjs.map +1 -0
  205. package/esm/ai/src/model/fallback-model.mjs +218 -0
  206. package/esm/ai/src/model/fallback-model.mjs.map +1 -0
  207. package/esm/ai/src/model/index.mjs +3 -0
  208. package/esm/ai/src/object-stream/index.mjs +4 -0
  209. package/esm/ai/src/object-stream/parse-partial-json.mjs +78 -0
  210. package/esm/ai/src/object-stream/parse-partial-json.mjs.map +1 -0
  211. package/esm/ai/src/object-stream/stream-object.mjs +97 -0
  212. package/esm/ai/src/object-stream/stream-object.mjs.map +1 -0
  213. package/esm/ai/src/observe/index.mjs +4 -0
  214. package/esm/ai/src/observe/observer-registry.mjs +35 -0
  215. package/esm/ai/src/observe/observer-registry.mjs.map +1 -0
  216. package/esm/ai/src/observe/resolve-observers.mjs +73 -0
  217. package/esm/ai/src/observe/resolve-observers.mjs.map +1 -0
  218. package/esm/ai/src/orchestrator/as-tool.mjs +98 -0
  219. package/esm/ai/src/orchestrator/as-tool.mjs.map +1 -0
  220. package/esm/ai/src/orchestrator/checkpoint.mjs +75 -0
  221. package/esm/ai/src/orchestrator/checkpoint.mjs.map +1 -0
  222. package/esm/ai/src/orchestrator/commands.mjs +34 -0
  223. package/esm/ai/src/orchestrator/commands.mjs.map +1 -0
  224. package/esm/ai/src/orchestrator/compaction.mjs +206 -0
  225. package/esm/ai/src/orchestrator/compaction.mjs.map +1 -0
  226. package/esm/ai/src/orchestrator/dispatch.mjs +171 -0
  227. package/esm/ai/src/orchestrator/dispatch.mjs.map +1 -0
  228. package/esm/ai/src/orchestrator/emitter.mjs +85 -0
  229. package/esm/ai/src/orchestrator/emitter.mjs.map +1 -0
  230. package/esm/ai/src/orchestrator/execution.mjs +395 -0
  231. package/esm/ai/src/orchestrator/execution.mjs.map +1 -0
  232. package/esm/ai/src/orchestrator/index.mjs +11 -0
  233. package/esm/ai/src/orchestrator/load.mjs +49 -0
  234. package/esm/ai/src/orchestrator/load.mjs.map +1 -0
  235. package/esm/ai/src/orchestrator/lock.mjs +75 -0
  236. package/esm/ai/src/orchestrator/lock.mjs.map +1 -0
  237. package/esm/ai/src/orchestrator/memory.mjs +141 -0
  238. package/esm/ai/src/orchestrator/memory.mjs.map +1 -0
  239. package/esm/ai/src/orchestrator/orchestrator-stream.mjs +98 -0
  240. package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +1 -0
  241. package/esm/ai/src/orchestrator/orchestrator.mjs +206 -0
  242. package/esm/ai/src/orchestrator/orchestrator.mjs.map +1 -0
  243. package/esm/ai/src/orchestrator/resume.mjs +74 -0
  244. package/esm/ai/src/orchestrator/resume.mjs.map +1 -0
  245. package/esm/ai/src/orchestrator/session-lock.mjs +83 -0
  246. package/esm/ai/src/orchestrator/session-lock.mjs.map +1 -0
  247. package/esm/ai/src/orchestrator/signature.mjs +120 -0
  248. package/esm/ai/src/orchestrator/signature.mjs.map +1 -0
  249. package/esm/ai/src/orchestrator/window.mjs +56 -0
  250. package/esm/ai/src/orchestrator/window.mjs.map +1 -0
  251. package/esm/ai/src/planner/dag-scheduler.mjs +97 -0
  252. package/esm/ai/src/planner/dag-scheduler.mjs.map +1 -0
  253. package/esm/ai/src/planner/index.mjs +6 -0
  254. package/esm/ai/src/planner/plan-prompt.mjs +31 -0
  255. package/esm/ai/src/planner/plan-prompt.mjs.map +1 -0
  256. package/esm/ai/src/planner/plan-schema.mjs +120 -0
  257. package/esm/ai/src/planner/plan-schema.mjs.map +1 -0
  258. package/esm/ai/src/planner/planner-run.mjs +769 -0
  259. package/esm/ai/src/planner/planner-run.mjs.map +1 -0
  260. package/esm/ai/src/planner/planner.mjs +144 -0
  261. package/esm/ai/src/planner/planner.mjs.map +1 -0
  262. package/esm/ai/src/planner/signature.mjs +27 -0
  263. package/esm/ai/src/planner/signature.mjs.map +1 -0
  264. package/esm/ai/src/planner/snapshot.mjs +95 -0
  265. package/esm/ai/src/planner/snapshot.mjs.map +1 -0
  266. package/esm/ai/src/prompt/errors.mjs +73 -0
  267. package/esm/ai/src/prompt/errors.mjs.map +1 -0
  268. package/esm/ai/src/prompt/index.mjs +4 -0
  269. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +104 -0
  270. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +1 -0
  271. package/esm/ai/src/prompt/prompt-validate.mjs +170 -0
  272. package/esm/ai/src/prompt/prompt-validate.mjs.map +1 -0
  273. package/esm/ai/src/prompt/prompt.mjs +218 -0
  274. package/esm/ai/src/prompt/prompt.mjs.map +1 -0
  275. package/esm/ai/src/prompts/index.mjs +3 -0
  276. package/esm/ai/src/prompts/prompts-manager.mjs +410 -0
  277. package/esm/ai/src/prompts/prompts-manager.mjs.map +1 -0
  278. package/esm/ai/src/prompts/prompts-validate.mjs +200 -0
  279. package/esm/ai/src/prompts/prompts-validate.mjs.map +1 -0
  280. package/esm/ai/src/rag/as-tool.mjs +48 -0
  281. package/esm/ai/src/rag/as-tool.mjs.map +1 -0
  282. package/esm/ai/src/rag/chunk/chunk.mjs +44 -0
  283. package/esm/ai/src/rag/chunk/chunk.mjs.map +1 -0
  284. package/esm/ai/src/rag/chunk/fixed.mjs +32 -0
  285. package/esm/ai/src/rag/chunk/fixed.mjs.map +1 -0
  286. package/esm/ai/src/rag/chunk/markdown.mjs +75 -0
  287. package/esm/ai/src/rag/chunk/markdown.mjs.map +1 -0
  288. package/esm/ai/src/rag/chunk/recursive.mjs +132 -0
  289. package/esm/ai/src/rag/chunk/recursive.mjs.map +1 -0
  290. package/esm/ai/src/rag/chunk/sentence.mjs +73 -0
  291. package/esm/ai/src/rag/chunk/sentence.mjs.map +1 -0
  292. package/esm/ai/src/rag/hybrid/bm25.mjs +51 -0
  293. package/esm/ai/src/rag/hybrid/bm25.mjs.map +1 -0
  294. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs +29 -0
  295. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs.map +1 -0
  296. package/esm/ai/src/rag/hybrid/rrf.mjs +30 -0
  297. package/esm/ai/src/rag/hybrid/rrf.mjs.map +1 -0
  298. package/esm/ai/src/rag/index.mjs +18 -0
  299. package/esm/ai/src/rag/loaders/errors.mjs +25 -0
  300. package/esm/ai/src/rag/loaders/errors.mjs.map +1 -0
  301. package/esm/ai/src/rag/loaders/index.mjs +7 -0
  302. package/esm/ai/src/rag/loaders/load-html.mjs +138 -0
  303. package/esm/ai/src/rag/loaders/load-html.mjs.map +1 -0
  304. package/esm/ai/src/rag/loaders/load-pdf.mjs +150 -0
  305. package/esm/ai/src/rag/loaders/load-pdf.mjs.map +1 -0
  306. package/esm/ai/src/rag/loaders/load-text.mjs +60 -0
  307. package/esm/ai/src/rag/loaders/load-text.mjs.map +1 -0
  308. package/esm/ai/src/rag/loaders/load-web.mjs +89 -0
  309. package/esm/ai/src/rag/loaders/load-web.mjs.map +1 -0
  310. package/esm/ai/src/rag/rag.mjs +126 -0
  311. package/esm/ai/src/rag/rag.mjs.map +1 -0
  312. package/esm/ai/src/rag/rerank/keyword-reranker.mjs +58 -0
  313. package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +1 -0
  314. package/esm/ai/src/rag/rerank/llm-reranker.mjs +85 -0
  315. package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +1 -0
  316. package/esm/ai/src/rag/retrieve.mjs +68 -0
  317. package/esm/ai/src/rag/retrieve.mjs.map +1 -0
  318. package/esm/ai/src/rag/store/cache-vector-store.mjs +48 -0
  319. package/esm/ai/src/rag/store/cache-vector-store.mjs.map +1 -0
  320. package/esm/ai/src/rag/store/pg-vector-store.mjs +328 -0
  321. package/esm/ai/src/rag/store/pg-vector-store.mjs.map +1 -0
  322. package/esm/ai/src/rag/transforms/multi-query.mjs +41 -0
  323. package/esm/ai/src/rag/transforms/multi-query.mjs.map +1 -0
  324. package/esm/ai/src/security/index.mjs +5 -0
  325. package/esm/ai/src/security/outbound-policy.mjs +187 -0
  326. package/esm/ai/src/security/outbound-policy.mjs.map +1 -0
  327. package/esm/ai/src/security/private-ip.mjs +48 -0
  328. package/esm/ai/src/security/private-ip.mjs.map +1 -0
  329. package/esm/ai/src/security/redact.mjs +60 -0
  330. package/esm/ai/src/security/redact.mjs.map +1 -0
  331. package/esm/ai/src/serve/serve.mjs +90 -0
  332. package/esm/ai/src/serve/serve.mjs.map +1 -0
  333. package/esm/ai/src/serve/sse.mjs +25 -0
  334. package/esm/ai/src/serve/sse.mjs.map +1 -0
  335. package/esm/ai/src/serve/stream-to-sse.mjs +37 -0
  336. package/esm/ai/src/serve/stream-to-sse.mjs.map +1 -0
  337. package/esm/ai/src/skills/catalog.mjs +140 -0
  338. package/esm/ai/src/skills/catalog.mjs.map +1 -0
  339. package/esm/ai/src/skills/index.mjs +11 -0
  340. package/esm/ai/src/skills/load-skill-tool.mjs +65 -0
  341. package/esm/ai/src/skills/load-skill-tool.mjs.map +1 -0
  342. package/esm/ai/src/skills/save-skill-tool.mjs +65 -0
  343. package/esm/ai/src/skills/save-skill-tool.mjs.map +1 -0
  344. package/esm/ai/src/skills/skills.mjs +109 -0
  345. package/esm/ai/src/skills/skills.mjs.map +1 -0
  346. package/esm/ai/src/skills/sources/directory-source.mjs +108 -0
  347. package/esm/ai/src/skills/sources/directory-source.mjs.map +1 -0
  348. package/esm/ai/src/skills/sources/index.mjs +27 -0
  349. package/esm/ai/src/skills/sources/index.mjs.map +1 -0
  350. package/esm/ai/src/skills/sources/parse-frontmatter.mjs +46 -0
  351. package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +1 -0
  352. package/esm/ai/src/skills/sources/store-source.mjs +15 -0
  353. package/esm/ai/src/skills/sources/store-source.mjs.map +1 -0
  354. package/esm/ai/src/skills/sources/url-source.mjs +117 -0
  355. package/esm/ai/src/skills/sources/url-source.mjs.map +1 -0
  356. package/esm/ai/src/snapshot/memory.mjs +81 -0
  357. package/esm/ai/src/snapshot/memory.mjs.map +1 -0
  358. package/esm/ai/src/snapshot/pg.mjs +146 -0
  359. package/esm/ai/src/snapshot/pg.mjs.map +1 -0
  360. package/esm/ai/src/snapshot/redis.mjs +101 -0
  361. package/esm/ai/src/snapshot/redis.mjs.map +1 -0
  362. package/esm/ai/src/speech/index.mjs +3 -0
  363. package/esm/ai/src/speech/speech.mjs +122 -0
  364. package/esm/ai/src/speech/speech.mjs.map +1 -0
  365. package/esm/ai/src/supervisor/as-tool.mjs +74 -0
  366. package/esm/ai/src/supervisor/as-tool.mjs.map +1 -0
  367. package/esm/ai/src/supervisor/cancellation.mjs +22 -0
  368. package/esm/ai/src/supervisor/cancellation.mjs.map +1 -0
  369. package/esm/ai/src/supervisor/decide.mjs +272 -0
  370. package/esm/ai/src/supervisor/decide.mjs.map +1 -0
  371. package/esm/ai/src/supervisor/emitter.mjs +47 -0
  372. package/esm/ai/src/supervisor/emitter.mjs.map +1 -0
  373. package/esm/ai/src/supervisor/entries.mjs +206 -0
  374. package/esm/ai/src/supervisor/entries.mjs.map +1 -0
  375. package/esm/ai/src/supervisor/execution.mjs +1921 -0
  376. package/esm/ai/src/supervisor/execution.mjs.map +1 -0
  377. package/esm/ai/src/supervisor/fan-out.mjs +65 -0
  378. package/esm/ai/src/supervisor/fan-out.mjs.map +1 -0
  379. package/esm/ai/src/supervisor/index.mjs +14 -0
  380. package/esm/ai/src/supervisor/router-factory.mjs +141 -0
  381. package/esm/ai/src/supervisor/router-factory.mjs.map +1 -0
  382. package/esm/ai/src/supervisor/router-prompt.mjs +52 -0
  383. package/esm/ai/src/supervisor/router-prompt.mjs.map +1 -0
  384. package/esm/ai/src/supervisor/signature.mjs +89 -0
  385. package/esm/ai/src/supervisor/signature.mjs.map +1 -0
  386. package/esm/ai/src/supervisor/snapshot.mjs +69 -0
  387. package/esm/ai/src/supervisor/snapshot.mjs.map +1 -0
  388. package/esm/ai/src/supervisor/supervisor-stream.mjs +89 -0
  389. package/esm/ai/src/supervisor/supervisor-stream.mjs.map +1 -0
  390. package/esm/ai/src/supervisor/supervisor.mjs +144 -0
  391. package/esm/ai/src/supervisor/supervisor.mjs.map +1 -0
  392. package/esm/ai/src/system-prompt/index.mjs +6 -0
  393. package/esm/ai/src/system-prompt/instruction.mjs +57 -0
  394. package/esm/ai/src/system-prompt/instruction.mjs.map +1 -0
  395. package/esm/ai/src/system-prompt/persona.mjs +57 -0
  396. package/esm/ai/src/system-prompt/persona.mjs.map +1 -0
  397. package/esm/ai/src/system-prompt/render-placeholders.mjs +58 -0
  398. package/esm/ai/src/system-prompt/render-placeholders.mjs.map +1 -0
  399. package/esm/ai/src/system-prompt/system-prompt.mjs +267 -0
  400. package/esm/ai/src/system-prompt/system-prompt.mjs.map +1 -0
  401. package/esm/ai/src/team/gates.mjs +48 -0
  402. package/esm/ai/src/team/gates.mjs.map +1 -0
  403. package/esm/ai/src/team/index.mjs +3 -0
  404. package/esm/ai/src/team/team.mjs +94 -0
  405. package/esm/ai/src/team/team.mjs.map +1 -0
  406. package/esm/ai/src/tool/executable-as-tool.mjs +81 -0
  407. package/esm/ai/src/tool/executable-as-tool.mjs.map +1 -0
  408. package/esm/ai/src/tool/index.mjs +4 -0
  409. package/esm/ai/src/tool/tool.mjs +185 -0
  410. package/esm/ai/src/tool/tool.mjs.map +1 -0
  411. package/esm/ai/src/transcribe/audio-input.mjs +84 -0
  412. package/esm/ai/src/transcribe/audio-input.mjs.map +1 -0
  413. package/esm/ai/src/transcribe/index.mjs +4 -0
  414. package/esm/ai/src/transcribe/transcribe.mjs +127 -0
  415. package/esm/ai/src/transcribe/transcribe.mjs.map +1 -0
  416. package/esm/ai/src/utils/compute-cost.mjs +112 -0
  417. package/esm/ai/src/utils/compute-cost.mjs.map +1 -0
  418. package/esm/ai/src/utils/extract-json-lenient.mjs +97 -0
  419. package/esm/ai/src/utils/extract-json-lenient.mjs.map +1 -0
  420. package/esm/ai/src/utils/extract-json-payload.mjs +39 -0
  421. package/esm/ai/src/utils/extract-json-payload.mjs.map +1 -0
  422. package/esm/ai/src/utils/generate-run-id.mjs +23 -0
  423. package/esm/ai/src/utils/generate-run-id.mjs.map +1 -0
  424. package/esm/ai/src/utils/index.mjs +12 -0
  425. package/esm/ai/src/utils/json-schema.mjs +89 -0
  426. package/esm/ai/src/utils/json-schema.mjs.map +1 -0
  427. package/esm/ai/src/utils/prepare-attachment-part.mjs +232 -0
  428. package/esm/ai/src/utils/prepare-attachment-part.mjs.map +1 -0
  429. package/esm/ai/src/utils/resolve-attachment.mjs +74 -0
  430. package/esm/ai/src/utils/resolve-attachment.mjs.map +1 -0
  431. package/esm/ai/src/utils/run-context.mjs +89 -0
  432. package/esm/ai/src/utils/run-context.mjs.map +1 -0
  433. package/esm/ai/src/utils/safe-json-parse.mjs +22 -0
  434. package/esm/ai/src/utils/safe-json-parse.mjs.map +1 -0
  435. package/esm/ai/src/utils/stamp-report-lineage.mjs +45 -0
  436. package/esm/ai/src/utils/stamp-report-lineage.mjs.map +1 -0
  437. package/esm/ai/src/vcr/cassette-io.mjs +57 -0
  438. package/esm/ai/src/vcr/cassette-io.mjs.map +1 -0
  439. package/esm/ai/src/vcr/errors.mjs +37 -0
  440. package/esm/ai/src/vcr/errors.mjs.map +1 -0
  441. package/esm/ai/src/vcr/hash-request.mjs +118 -0
  442. package/esm/ai/src/vcr/hash-request.mjs.map +1 -0
  443. package/esm/ai/src/vcr/index.mjs +5 -0
  444. package/esm/ai/src/vcr/vcr.mjs +248 -0
  445. package/esm/ai/src/vcr/vcr.mjs.map +1 -0
  446. package/esm/ai/src/workflow/as-tool.mjs +49 -0
  447. package/esm/ai/src/workflow/as-tool.mjs.map +1 -0
  448. package/esm/ai/src/workflow/cancellation.mjs +44 -0
  449. package/esm/ai/src/workflow/cancellation.mjs.map +1 -0
  450. package/esm/ai/src/workflow/emitter.mjs +40 -0
  451. package/esm/ai/src/workflow/emitter.mjs.map +1 -0
  452. package/esm/ai/src/workflow/engine.mjs +363 -0
  453. package/esm/ai/src/workflow/engine.mjs.map +1 -0
  454. package/esm/ai/src/workflow/index.mjs +5 -0
  455. package/esm/ai/src/workflow/retry.mjs +32 -0
  456. package/esm/ai/src/workflow/retry.mjs.map +1 -0
  457. package/esm/ai/src/workflow/router.mjs +56 -0
  458. package/esm/ai/src/workflow/router.mjs.map +1 -0
  459. package/esm/ai/src/workflow/run-scoped-emitter.mjs +32 -0
  460. package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +1 -0
  461. package/esm/ai/src/workflow/signature.mjs +34 -0
  462. package/esm/ai/src/workflow/signature.mjs.map +1 -0
  463. package/esm/ai/src/workflow/snapshot.mjs +77 -0
  464. package/esm/ai/src/workflow/snapshot.mjs.map +1 -0
  465. package/esm/ai/src/workflow/state.mjs +37 -0
  466. package/esm/ai/src/workflow/state.mjs.map +1 -0
  467. package/esm/ai/src/workflow/step-runner.mjs +370 -0
  468. package/esm/ai/src/workflow/step-runner.mjs.map +1 -0
  469. package/esm/ai/src/workflow/step.mjs +37 -0
  470. package/esm/ai/src/workflow/step.mjs.map +1 -0
  471. package/esm/ai/src/workflow/workflow.mjs +122 -0
  472. package/esm/ai/src/workflow/workflow.mjs.map +1 -0
  473. package/esm/ai-openai/src/embedder.mjs +4 -0
  474. package/esm/ai-openai/src/image.mjs +5 -0
  475. package/esm/ai-openai/src/index.mjs +7 -0
  476. package/esm/ai-openai/src/model.mjs +5 -0
  477. package/esm/ai-openai/src/sdk.mjs +9 -0
  478. package/esm/ai-openai/src/speech.mjs +5 -0
  479. package/esm/ai-openai/src/transcription.mjs +6 -0
  480. package/esm/ai-openai/src/utils/index.mjs +5 -0
  481. package/esm/ai-openai/src/utils/to-openai-messages.mjs +3 -0
  482. package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
  483. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
  484. package/esm/cli/commands/dev-server.command.mjs +1 -1
  485. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  486. package/esm/cli/commands/doctor/checks/config.check.mjs +42 -0
  487. package/esm/cli/commands/doctor/checks/config.check.mjs.map +1 -0
  488. package/esm/cli/commands/doctor/checks/connectors.check.mjs +28 -0
  489. package/esm/cli/commands/doctor/checks/connectors.check.mjs.map +1 -0
  490. package/esm/cli/commands/doctor/checks/health.check.mjs +35 -0
  491. package/esm/cli/commands/doctor/checks/health.check.mjs.map +1 -0
  492. package/esm/cli/commands/doctor/checks/index.mjs +25 -0
  493. package/esm/cli/commands/doctor/checks/index.mjs.map +1 -0
  494. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs +90 -0
  495. package/esm/cli/commands/doctor/checks/optional-peers.check.mjs.map +1 -0
  496. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs +69 -0
  497. package/esm/cli/commands/doctor/checks/release-hygiene.check.mjs.map +1 -0
  498. package/esm/cli/commands/doctor/checks/routes.check.mjs +30 -0
  499. package/esm/cli/commands/doctor/checks/routes.check.mjs.map +1 -0
  500. package/esm/cli/commands/doctor/doctor-command.action.mjs +28 -0
  501. package/esm/cli/commands/doctor/doctor-command.action.mjs.map +1 -0
  502. package/esm/cli/commands/doctor/format-report.mjs +44 -0
  503. package/esm/cli/commands/doctor/format-report.mjs.map +1 -0
  504. package/esm/cli/commands/doctor/run-checks.mjs +50 -0
  505. package/esm/cli/commands/doctor/run-checks.mjs.map +1 -0
  506. package/esm/cli/commands/doctor.command.mjs +29 -0
  507. package/esm/cli/commands/doctor.command.mjs.map +1 -0
  508. package/esm/cli/commands/generate/templates/stubs.mjs +9 -12
  509. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  510. package/esm/cli/commands/routes/format-routes-table.mjs +129 -0
  511. package/esm/cli/commands/routes/format-routes-table.mjs.map +1 -0
  512. package/esm/cli/commands/routes/route-row.mjs +92 -0
  513. package/esm/cli/commands/routes/route-row.mjs.map +1 -0
  514. package/esm/cli/commands/routes/routes-command.action.mjs +43 -0
  515. package/esm/cli/commands/routes/routes-command.action.mjs.map +1 -0
  516. package/esm/cli/commands/routes.command.mjs +51 -0
  517. package/esm/cli/commands/routes.command.mjs.map +1 -0
  518. package/esm/cli/commands/seed.command.mjs +5 -0
  519. package/esm/cli/commands/seed.command.mjs.map +1 -1
  520. package/esm/cli/framework-cli-commands.mjs +4 -0
  521. package/esm/cli/framework-cli-commands.mjs.map +1 -1
  522. package/esm/config/config-getter.mjs +5 -5
  523. package/esm/config/config-getter.mjs.map +1 -1
  524. package/esm/config/config-loader.mjs +2 -2
  525. package/esm/config/config-loader.mjs.map +1 -1
  526. package/esm/connectors/access-connector.mjs +2 -2
  527. package/esm/connectors/access-connector.mjs.map +1 -1
  528. package/esm/connectors/ai-connector.d.mts +43 -0
  529. package/esm/connectors/ai-connector.d.mts.map +1 -0
  530. package/esm/connectors/ai-connector.mjs +56 -0
  531. package/esm/connectors/ai-connector.mjs.map +1 -0
  532. package/esm/connectors/cache-connector.d.mts +5 -0
  533. package/esm/connectors/cache-connector.d.mts.map +1 -1
  534. package/esm/connectors/cache-connector.mjs +9 -2
  535. package/esm/connectors/cache-connector.mjs.map +1 -1
  536. package/esm/connectors/connectors-manager.d.mts +6 -2
  537. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  538. package/esm/connectors/connectors-manager.mjs +8 -2
  539. package/esm/connectors/connectors-manager.mjs.map +1 -1
  540. package/esm/connectors/database-connector.mjs +2 -2
  541. package/esm/connectors/database-connector.mjs.map +1 -1
  542. package/esm/connectors/herald-connector.mjs +2 -2
  543. package/esm/connectors/herald-connector.mjs.map +1 -1
  544. package/esm/connectors/http-connector.d.mts.map +1 -1
  545. package/esm/connectors/http-connector.mjs +9 -7
  546. package/esm/connectors/http-connector.mjs.map +1 -1
  547. package/esm/connectors/index.d.mts +1 -0
  548. package/esm/connectors/index.mjs +1 -0
  549. package/esm/connectors/logger-connector.mjs +2 -2
  550. package/esm/connectors/logger-connector.mjs.map +1 -1
  551. package/esm/connectors/mail-connector.mjs +2 -2
  552. package/esm/connectors/mail-connector.mjs.map +1 -1
  553. package/esm/connectors/notifications-connector.mjs +2 -2
  554. package/esm/connectors/notifications-connector.mjs.map +1 -1
  555. package/esm/connectors/socket-connector.d.mts +16 -1
  556. package/esm/connectors/socket-connector.d.mts.map +1 -1
  557. package/esm/connectors/socket-connector.mjs +31 -8
  558. package/esm/connectors/socket-connector.mjs.map +1 -1
  559. package/esm/connectors/storage.connector.d.mts +7 -0
  560. package/esm/connectors/storage.connector.d.mts.map +1 -1
  561. package/esm/connectors/storage.connector.mjs +7 -0
  562. package/esm/connectors/storage.connector.mjs.map +1 -1
  563. package/esm/connectors/types.d.mts +3 -2
  564. package/esm/connectors/types.d.mts.map +1 -1
  565. package/esm/connectors/types.mjs +1 -0
  566. package/esm/connectors/types.mjs.map +1 -1
  567. package/esm/database/index.d.mts +2 -1
  568. package/esm/database/index.mjs +1 -0
  569. package/esm/database/seed-command-action.mjs +44 -4
  570. package/esm/database/seed-command-action.mjs.map +1 -1
  571. package/esm/database/seeds/seed-records-table-migration.mjs +36 -0
  572. package/esm/database/seeds/seed-records-table-migration.mjs.map +1 -0
  573. package/esm/database/seeds/seeder.d.mts +22 -5
  574. package/esm/database/seeds/seeder.d.mts.map +1 -1
  575. package/esm/database/seeds/seeder.errors.d.mts +22 -0
  576. package/esm/database/seeds/seeder.errors.d.mts.map +1 -0
  577. package/esm/database/seeds/seeder.errors.mjs +29 -0
  578. package/esm/database/seeds/seeder.errors.mjs.map +1 -0
  579. package/esm/database/seeds/seeder.mjs.map +1 -1
  580. package/esm/database/seeds/seeders.manager.mjs +90 -11
  581. package/esm/database/seeds/seeders.manager.mjs.map +1 -1
  582. package/esm/database/seeds/types.d.mts +117 -1
  583. package/esm/database/seeds/types.d.mts.map +1 -1
  584. package/esm/database/seeds/utils.mjs +6 -1
  585. package/esm/database/seeds/utils.mjs.map +1 -1
  586. package/esm/dev-server/development-server.mjs +2 -14
  587. package/esm/dev-server/development-server.mjs.map +1 -1
  588. package/esm/dev-server/file-event-handler.mjs +15 -3
  589. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  590. package/esm/dev-server/module-loader.d.mts +12 -0
  591. package/esm/dev-server/module-loader.d.mts.map +1 -1
  592. package/esm/dev-server/module-loader.mjs +30 -2
  593. package/esm/dev-server/module-loader.mjs.map +1 -1
  594. package/esm/generations/add-command.action.mjs +61 -12
  595. package/esm/generations/add-command.action.mjs.map +1 -1
  596. package/esm/generations/stubs.mjs +31 -1
  597. package/esm/generations/stubs.mjs.map +1 -1
  598. package/esm/http/config.mjs +2 -2
  599. package/esm/http/config.mjs.map +1 -1
  600. package/esm/http/createHttpApplication.mjs +2 -2
  601. package/esm/http/createHttpApplication.mjs.map +1 -1
  602. package/esm/http/health.d.mts +14 -0
  603. package/esm/http/health.d.mts.map +1 -1
  604. package/esm/http/health.mjs +16 -0
  605. package/esm/http/health.mjs.map +1 -1
  606. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  607. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  608. package/esm/http/middleware/cache-response-middleware.mjs +15 -6
  609. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  610. package/esm/http/middleware/concurrency-limit.middleware.mjs +2 -0
  611. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  612. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  613. package/esm/http/middleware/idempotency.middleware.mjs +9 -6
  614. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  615. package/esm/http/middleware/inject-request-context.mjs +2 -2
  616. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  617. package/esm/http/middleware/maintenance.middleware.mjs +6 -5
  618. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  619. package/esm/http/plugins.mjs +9 -9
  620. package/esm/http/plugins.mjs.map +1 -1
  621. package/esm/http/request.d.mts +9 -2
  622. package/esm/http/request.d.mts.map +1 -1
  623. package/esm/http/request.mjs +15 -3
  624. package/esm/http/request.mjs.map +1 -1
  625. package/esm/http/response.d.mts +12 -0
  626. package/esm/http/response.d.mts.map +1 -1
  627. package/esm/http/response.mjs +24 -7
  628. package/esm/http/response.mjs.map +1 -1
  629. package/esm/http/server.d.mts.map +1 -1
  630. package/esm/http/server.mjs +4 -4
  631. package/esm/http/server.mjs.map +1 -1
  632. package/esm/index.d.mts +9 -4
  633. package/esm/index.mjs +6 -1
  634. package/esm/node_modules/langfuse/lib/index.mjs +1827 -0
  635. package/esm/node_modules/langfuse/lib/index.mjs.map +1 -0
  636. package/esm/node_modules/langfuse-core/lib/index.mjs +1770 -0
  637. package/esm/node_modules/langfuse-core/lib/index.mjs.map +1 -0
  638. package/esm/node_modules/mustache/mustache.mjs +587 -0
  639. package/esm/node_modules/mustache/mustache.mjs.map +1 -0
  640. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +180 -0
  641. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +1 -0
  642. package/esm/node_modules/openai/auth/workload-identity-auth.mjs +80 -0
  643. package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +1 -0
  644. package/esm/node_modules/openai/azure.mjs +82 -0
  645. package/esm/node_modules/openai/azure.mjs.map +1 -0
  646. package/esm/node_modules/openai/client.mjs +638 -0
  647. package/esm/node_modules/openai/client.mjs.map +1 -0
  648. package/esm/node_modules/openai/core/api-promise.mjs +75 -0
  649. package/esm/node_modules/openai/core/api-promise.mjs.map +1 -0
  650. package/esm/node_modules/openai/core/error.mjs +110 -0
  651. package/esm/node_modules/openai/core/error.mjs.map +1 -0
  652. package/esm/node_modules/openai/core/pagination.mjs +160 -0
  653. package/esm/node_modules/openai/core/pagination.mjs.map +1 -0
  654. package/esm/node_modules/openai/core/resource.mjs +10 -0
  655. package/esm/node_modules/openai/core/resource.mjs.map +1 -0
  656. package/esm/node_modules/openai/core/streaming.mjs +238 -0
  657. package/esm/node_modules/openai/core/streaming.mjs.map +1 -0
  658. package/esm/node_modules/openai/index.mjs +8 -0
  659. package/esm/node_modules/openai/internal/decoders/line.mjs +91 -0
  660. package/esm/node_modules/openai/internal/decoders/line.mjs.map +1 -0
  661. package/esm/node_modules/openai/internal/detect-platform.mjs +123 -0
  662. package/esm/node_modules/openai/internal/detect-platform.mjs.map +1 -0
  663. package/esm/node_modules/openai/internal/errors.mjs +26 -0
  664. package/esm/node_modules/openai/internal/errors.mjs.map +1 -0
  665. package/esm/node_modules/openai/internal/headers.mjs +65 -0
  666. package/esm/node_modules/openai/internal/headers.mjs.map +1 -0
  667. package/esm/node_modules/openai/internal/parse.mjs +41 -0
  668. package/esm/node_modules/openai/internal/parse.mjs.map +1 -0
  669. package/esm/node_modules/openai/internal/qs/formats.mjs +12 -0
  670. package/esm/node_modules/openai/internal/qs/formats.mjs.map +1 -0
  671. package/esm/node_modules/openai/internal/qs/stringify.mjs +179 -0
  672. package/esm/node_modules/openai/internal/qs/stringify.mjs.map +1 -0
  673. package/esm/node_modules/openai/internal/qs/utils.mjs +65 -0
  674. package/esm/node_modules/openai/internal/qs/utils.mjs.map +1 -0
  675. package/esm/node_modules/openai/internal/request-options.mjs +11 -0
  676. package/esm/node_modules/openai/internal/request-options.mjs.map +1 -0
  677. package/esm/node_modules/openai/internal/shims.mjs +77 -0
  678. package/esm/node_modules/openai/internal/shims.mjs.map +1 -0
  679. package/esm/node_modules/openai/internal/to-file.mjs +63 -0
  680. package/esm/node_modules/openai/internal/to-file.mjs.map +1 -0
  681. package/esm/node_modules/openai/internal/tslib.mjs +16 -0
  682. package/esm/node_modules/openai/internal/tslib.mjs.map +1 -0
  683. package/esm/node_modules/openai/internal/uploads.mjs +94 -0
  684. package/esm/node_modules/openai/internal/uploads.mjs.map +1 -0
  685. package/esm/node_modules/openai/internal/utils/base64.mjs +22 -0
  686. package/esm/node_modules/openai/internal/utils/base64.mjs.map +1 -0
  687. package/esm/node_modules/openai/internal/utils/bytes.mjs +26 -0
  688. package/esm/node_modules/openai/internal/utils/bytes.mjs.map +1 -0
  689. package/esm/node_modules/openai/internal/utils/env.mjs +16 -0
  690. package/esm/node_modules/openai/internal/utils/env.mjs.map +1 -0
  691. package/esm/node_modules/openai/internal/utils/log.mjs +58 -0
  692. package/esm/node_modules/openai/internal/utils/log.mjs.map +1 -0
  693. package/esm/node_modules/openai/internal/utils/path.mjs +62 -0
  694. package/esm/node_modules/openai/internal/utils/path.mjs.map +1 -0
  695. package/esm/node_modules/openai/internal/utils/query.mjs +10 -0
  696. package/esm/node_modules/openai/internal/utils/query.mjs.map +1 -0
  697. package/esm/node_modules/openai/internal/utils/sleep.mjs +6 -0
  698. package/esm/node_modules/openai/internal/utils/sleep.mjs.map +1 -0
  699. package/esm/node_modules/openai/internal/utils/uuid.mjs +18 -0
  700. package/esm/node_modules/openai/internal/utils/uuid.mjs.map +1 -0
  701. package/esm/node_modules/openai/internal/utils/values.mjs +41 -0
  702. package/esm/node_modules/openai/internal/utils/values.mjs.map +1 -0
  703. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +247 -0
  704. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +1 -0
  705. package/esm/node_modules/openai/lib/AssistantStream.mjs +472 -0
  706. package/esm/node_modules/openai/lib/AssistantStream.mjs.map +1 -0
  707. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +26 -0
  708. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +1 -0
  709. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +423 -0
  710. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +1 -0
  711. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +26 -0
  712. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +1 -0
  713. package/esm/node_modules/openai/lib/EventStream.mjs +163 -0
  714. package/esm/node_modules/openai/lib/EventStream.mjs.map +1 -0
  715. package/esm/node_modules/openai/lib/ResponsesParser.mjs +94 -0
  716. package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +1 -0
  717. package/esm/node_modules/openai/lib/RunnableFunction.mjs +8 -0
  718. package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +1 -0
  719. package/esm/node_modules/openai/lib/Util.mjs +19 -0
  720. package/esm/node_modules/openai/lib/Util.mjs.map +1 -0
  721. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +11 -0
  722. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +1 -0
  723. package/esm/node_modules/openai/lib/parser.mjs +88 -0
  724. package/esm/node_modules/openai/lib/parser.mjs.map +1 -0
  725. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +231 -0
  726. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +1 -0
  727. package/esm/node_modules/openai/resources/admin/admin.mjs +15 -0
  728. package/esm/node_modules/openai/resources/admin/admin.mjs.map +1 -0
  729. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +81 -0
  730. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +1 -0
  731. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +31 -0
  732. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +1 -0
  733. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +153 -0
  734. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +1 -0
  735. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +42 -0
  736. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +1 -0
  737. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +106 -0
  738. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +1 -0
  739. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +88 -0
  740. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +1 -0
  741. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +88 -0
  742. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +1 -0
  743. package/esm/node_modules/openai/resources/admin/organization/invites.mjs +83 -0
  744. package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +1 -0
  745. package/esm/node_modules/openai/resources/admin/organization/organization.mjs +45 -0
  746. package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +1 -0
  747. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +72 -0
  748. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +1 -0
  749. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +78 -0
  750. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +1 -0
  751. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +46 -0
  752. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +1 -0
  753. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +95 -0
  754. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +1 -0
  755. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +91 -0
  756. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +1 -0
  757. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +45 -0
  758. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +1 -0
  759. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +63 -0
  760. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +1 -0
  761. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +137 -0
  762. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +1 -0
  763. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +51 -0
  764. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +1 -0
  765. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +108 -0
  766. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +1 -0
  767. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +112 -0
  768. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +1 -0
  769. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +106 -0
  770. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +1 -0
  771. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +91 -0
  772. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +1 -0
  773. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +118 -0
  774. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +1 -0
  775. package/esm/node_modules/openai/resources/admin/organization/roles.mjs +96 -0
  776. package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +1 -0
  777. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +97 -0
  778. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +1 -0
  779. package/esm/node_modules/openai/resources/admin/organization/usage.mjs +207 -0
  780. package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +1 -0
  781. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +88 -0
  782. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +1 -0
  783. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +82 -0
  784. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +1 -0
  785. package/esm/node_modules/openai/resources/audio/audio.mjs +21 -0
  786. package/esm/node_modules/openai/resources/audio/audio.mjs.map +1 -0
  787. package/esm/node_modules/openai/resources/audio/speech.mjs +39 -0
  788. package/esm/node_modules/openai/resources/audio/speech.mjs.map +1 -0
  789. package/esm/node_modules/openai/resources/audio/transcriptions.mjs +22 -0
  790. package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +1 -0
  791. package/esm/node_modules/openai/resources/audio/translations.mjs +21 -0
  792. package/esm/node_modules/openai/resources/audio/translations.mjs.map +1 -0
  793. package/esm/node_modules/openai/resources/batches.mjs +54 -0
  794. package/esm/node_modules/openai/resources/batches.mjs.map +1 -0
  795. package/esm/node_modules/openai/resources/beta/assistants.mjs +78 -0
  796. package/esm/node_modules/openai/resources/beta/assistants.mjs.map +1 -0
  797. package/esm/node_modules/openai/resources/beta/beta.mjs +24 -0
  798. package/esm/node_modules/openai/resources/beta/beta.mjs.map +1 -0
  799. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +18 -0
  800. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +1 -0
  801. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +49 -0
  802. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +1 -0
  803. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +85 -0
  804. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +1 -0
  805. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +21 -0
  806. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +1 -0
  807. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +33 -0
  808. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +1 -0
  809. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +33 -0
  810. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +1 -0
  811. package/esm/node_modules/openai/resources/beta/threads/messages.mjs +83 -0
  812. package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +1 -0
  813. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +183 -0
  814. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +1 -0
  815. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +45 -0
  816. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +1 -0
  817. package/esm/node_modules/openai/resources/beta/threads/threads.mjs +101 -0
  818. package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +1 -0
  819. package/esm/node_modules/openai/resources/chat/chat.mjs +15 -0
  820. package/esm/node_modules/openai/resources/chat/chat.mjs.map +1 -0
  821. package/esm/node_modules/openai/resources/chat/completions/completions.mjs +123 -0
  822. package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +1 -0
  823. package/esm/node_modules/openai/resources/chat/completions/index.mjs +7 -0
  824. package/esm/node_modules/openai/resources/chat/completions/messages.mjs +35 -0
  825. package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +1 -0
  826. package/esm/node_modules/openai/resources/chat/index.mjs +5 -0
  827. package/esm/node_modules/openai/resources/completions.mjs +20 -0
  828. package/esm/node_modules/openai/resources/completions.mjs.map +1 -0
  829. package/esm/node_modules/openai/resources/containers/containers.mjs +57 -0
  830. package/esm/node_modules/openai/resources/containers/containers.mjs.map +1 -0
  831. package/esm/node_modules/openai/resources/containers/files/content.mjs +23 -0
  832. package/esm/node_modules/openai/resources/containers/files/content.mjs.map +1 -0
  833. package/esm/node_modules/openai/resources/containers/files/files.mjs +63 -0
  834. package/esm/node_modules/openai/resources/containers/files/files.mjs.map +1 -0
  835. package/esm/node_modules/openai/resources/conversations/conversations.mjs +57 -0
  836. package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +1 -0
  837. package/esm/node_modules/openai/resources/conversations/items.mjs +57 -0
  838. package/esm/node_modules/openai/resources/conversations/items.mjs.map +1 -0
  839. package/esm/node_modules/openai/resources/embeddings.mjs +48 -0
  840. package/esm/node_modules/openai/resources/embeddings.mjs.map +1 -0
  841. package/esm/node_modules/openai/resources/evals/evals.mjs +73 -0
  842. package/esm/node_modules/openai/resources/evals/evals.mjs.map +1 -0
  843. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +35 -0
  844. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +1 -0
  845. package/esm/node_modules/openai/resources/evals/runs/runs.mjs +72 -0
  846. package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +1 -0
  847. package/esm/node_modules/openai/resources/files.mjs +111 -0
  848. package/esm/node_modules/openai/resources/files.mjs.map +1 -0
  849. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +15 -0
  850. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +1 -0
  851. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +60 -0
  852. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +1 -0
  853. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +15 -0
  854. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +1 -0
  855. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +102 -0
  856. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +1 -0
  857. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +24 -0
  858. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +1 -0
  859. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +34 -0
  860. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +1 -0
  861. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +148 -0
  862. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +1 -0
  863. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +8 -0
  864. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +1 -0
  865. package/esm/node_modules/openai/resources/graders/grader-models.mjs +8 -0
  866. package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +1 -0
  867. package/esm/node_modules/openai/resources/graders/graders.mjs +15 -0
  868. package/esm/node_modules/openai/resources/graders/graders.mjs.map +1 -0
  869. package/esm/node_modules/openai/resources/images.mjs +46 -0
  870. package/esm/node_modules/openai/resources/images.mjs.map +1 -0
  871. package/esm/node_modules/openai/resources/index.mjs +27 -0
  872. package/esm/node_modules/openai/resources/models.mjs +44 -0
  873. package/esm/node_modules/openai/resources/models.mjs.map +1 -0
  874. package/esm/node_modules/openai/resources/moderations.mjs +23 -0
  875. package/esm/node_modules/openai/resources/moderations.mjs.map +1 -0
  876. package/esm/node_modules/openai/resources/realtime/calls.mjs +79 -0
  877. package/esm/node_modules/openai/resources/realtime/calls.mjs.map +1 -0
  878. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +39 -0
  879. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +1 -0
  880. package/esm/node_modules/openai/resources/realtime/realtime.mjs +18 -0
  881. package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +1 -0
  882. package/esm/node_modules/openai/resources/responses/input-items.mjs +31 -0
  883. package/esm/node_modules/openai/resources/responses/input-items.mjs.map +1 -0
  884. package/esm/node_modules/openai/resources/responses/input-tokens.mjs +27 -0
  885. package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +1 -0
  886. package/esm/node_modules/openai/resources/responses/responses.mjs +110 -0
  887. package/esm/node_modules/openai/resources/responses/responses.mjs.map +1 -0
  888. package/esm/node_modules/openai/resources/skills/content.mjs +22 -0
  889. package/esm/node_modules/openai/resources/skills/content.mjs.map +1 -0
  890. package/esm/node_modules/openai/resources/skills/skills.mjs +69 -0
  891. package/esm/node_modules/openai/resources/skills/skills.mjs.map +1 -0
  892. package/esm/node_modules/openai/resources/skills/versions/content.mjs +23 -0
  893. package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +1 -0
  894. package/esm/node_modules/openai/resources/skills/versions/versions.mjs +58 -0
  895. package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +1 -0
  896. package/esm/node_modules/openai/resources/uploads/parts.mjs +34 -0
  897. package/esm/node_modules/openai/resources/uploads/parts.mjs.map +1 -0
  898. package/esm/node_modules/openai/resources/uploads/uploads.mjs +84 -0
  899. package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +1 -0
  900. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +126 -0
  901. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +1 -0
  902. package/esm/node_modules/openai/resources/vector-stores/files.mjs +147 -0
  903. package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +1 -0
  904. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +87 -0
  905. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +1 -0
  906. package/esm/node_modules/openai/resources/videos.mjs +115 -0
  907. package/esm/node_modules/openai/resources/videos.mjs.map +1 -0
  908. package/esm/node_modules/openai/resources/webhooks/index.mjs +3 -0
  909. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +69 -0
  910. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +1 -0
  911. package/esm/node_modules/openai/resources/webhooks.mjs +4 -0
  912. package/esm/node_modules/openai/streaming.mjs +3 -0
  913. package/esm/node_modules/openai/version.mjs +6 -0
  914. package/esm/node_modules/openai/version.mjs.map +1 -0
  915. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +37 -1
  916. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  917. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +71 -5
  918. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  919. package/esm/repositories/adapters/cascade/filter-applicator.mjs +17 -3
  920. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  921. package/esm/repositories/contracts/index.d.mts +1 -1
  922. package/esm/repositories/contracts/query-builder.contract.d.mts +87 -1
  923. package/esm/repositories/contracts/query-builder.contract.d.mts.map +1 -1
  924. package/esm/repositories/index.d.mts +1 -1
  925. package/esm/repositories/repository.manager.d.mts +110 -2
  926. package/esm/repositories/repository.manager.d.mts.map +1 -1
  927. package/esm/repositories/repository.manager.mjs +207 -25
  928. package/esm/repositories/repository.manager.mjs.map +1 -1
  929. package/esm/router/route-registry.mjs +19 -10
  930. package/esm/router/route-registry.mjs.map +1 -1
  931. package/esm/router/router.d.mts +9 -0
  932. package/esm/router/router.d.mts.map +1 -1
  933. package/esm/router/router.mjs +28 -5
  934. package/esm/router/router.mjs.map +1 -1
  935. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  936. package/esm/storage/drivers/cloud-driver.mjs +48 -12
  937. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  938. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  939. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  940. package/esm/storage/drivers/local-driver.d.mts +8 -0
  941. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  942. package/esm/storage/drivers/local-driver.mjs +19 -4
  943. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  944. package/esm/storage/drivers/r2-driver.mjs +1 -1
  945. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  946. package/esm/storage/drivers/s3-driver.mjs +1 -1
  947. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  948. package/esm/storage/index.d.mts +4 -1
  949. package/esm/storage/index.mjs +3 -0
  950. package/esm/storage/scoped-storage.d.mts +8 -4
  951. package/esm/storage/scoped-storage.d.mts.map +1 -1
  952. package/esm/storage/scoped-storage.mjs +21 -6
  953. package/esm/storage/scoped-storage.mjs.map +1 -1
  954. package/esm/storage/storage.d.mts +12 -4
  955. package/esm/storage/storage.d.mts.map +1 -1
  956. package/esm/storage/storage.mjs +23 -9
  957. package/esm/storage/storage.mjs.map +1 -1
  958. package/esm/storage/types.d.mts +33 -5
  959. package/esm/storage/types.d.mts.map +1 -1
  960. package/esm/storage/utils/contain-path.d.mts +23 -0
  961. package/esm/storage/utils/contain-path.d.mts.map +1 -0
  962. package/esm/storage/utils/contain-path.mjs +35 -0
  963. package/esm/storage/utils/contain-path.mjs.map +1 -0
  964. package/esm/storage/utils/safe-fetch.d.mts +68 -0
  965. package/esm/storage/utils/safe-fetch.d.mts.map +1 -0
  966. package/esm/storage/utils/safe-fetch.mjs +205 -0
  967. package/esm/storage/utils/safe-fetch.mjs.map +1 -0
  968. package/esm/storage/utils/storage-error.d.mts +35 -0
  969. package/esm/storage/utils/storage-error.d.mts.map +1 -0
  970. package/esm/storage/utils/storage-error.mjs +17 -0
  971. package/esm/storage/utils/storage-error.mjs.map +1 -0
  972. package/esm/use-cases/use-case-pipeline.mjs +4 -1
  973. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  974. package/esm/use-cases/use-case.mjs +12 -4
  975. package/esm/use-cases/use-case.mjs.map +1 -1
  976. package/esm/use-cases/use-cases-registry.d.mts +12 -4
  977. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  978. package/esm/use-cases/use-cases-registry.mjs +13 -3
  979. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  980. package/esm/utils/npm-registry.d.mts +1 -1
  981. package/esm/utils/npm-registry.mjs +2 -2
  982. package/esm/utils/npm-registry.mjs.map +1 -1
  983. package/esm/utils/paths.mjs +2 -2
  984. package/esm/utils/paths.mjs.map +1 -1
  985. package/esm/validation/validateAll.mjs +2 -2
  986. package/esm/validation/validateAll.mjs.map +1 -1
  987. package/llms-full.txt +456 -46
  988. package/llms.txt +4 -2
  989. package/package.json +9 -9
  990. package/skills/README.md +65 -0
  991. package/skills/add-connector/SKILL.md +6 -1
  992. package/skills/configure-app/SKILL.md +23 -0
  993. package/skills/health-checks/SKILL.md +13 -0
  994. package/skills/use-repository/SKILL.md +38 -1
  995. package/skills/warlock-doctor/SKILL.md +135 -0
  996. package/skills/warlock-routes/SKILL.md +91 -0
  997. package/skills/write-seeder/SKILL.md +143 -45
@@ -61,9 +61,13 @@ var RepositoryManager = class {
61
61
  * Register events
62
62
  */
63
63
  registerEvents() {
64
- this.eventsCallbacks.push(...this.adapter.registerEvents((source) => {
65
- this.clearCache();
66
- }));
64
+ try {
65
+ this.eventsCallbacks.push(...this.adapter.registerEvents((source) => {
66
+ this.clearCache();
67
+ }));
68
+ } catch (error) {
69
+ console.error(`[Repository] Failed to register events:`, error);
70
+ }
67
71
  }
68
72
  /**
69
73
  * Unregister events
@@ -350,6 +354,7 @@ var RepositoryManager = class {
350
354
  async all(options) {
351
355
  const query = this.newQuery();
352
356
  const opts = this.prepareOptions(options);
357
+ opts.paginate = false;
353
358
  this.applyOptionsToQuery(query, opts);
354
359
  return query.get();
355
360
  }
@@ -459,10 +464,10 @@ var RepositoryManager = class {
459
464
  if (options.deselect) query.deselect(options.deselect);
460
465
  if (options.simpleSelect && this.simpleSelectColumns.length > 0) query.select(this.simpleSelectColumns);
461
466
  if (options.orderBy) {
462
- if (options.orderBy === "random") query.random();
467
+ if (options.orderBy === "random") query.random(options.limit);
463
468
  else if (Array.isArray(options.orderBy)) query.orderBy(options.orderBy[0], options.orderBy[1]);
464
469
  else if (typeof options.orderBy === "object") query.sortBy(options.orderBy);
465
- }
470
+ } else if (options.sortBy) query.orderBy(options.sortBy, options.sortDirection ?? "asc");
466
471
  if (options.limit && options.paginate === false) query.limit(options.limit);
467
472
  if (options?.perform) options.perform(query, options);
468
473
  return options;
@@ -474,7 +479,12 @@ var RepositoryManager = class {
474
479
  * @public
475
480
  */
476
481
  async create(data) {
477
- return this.adapter.create(data);
482
+ await this.onSaving(data, "create");
483
+ await this.onCreating(data);
484
+ const result = await this.adapter.create(data);
485
+ await this.onCreate(result, data);
486
+ await this.onSave(result, data, "create");
487
+ return result;
478
488
  }
479
489
  /**
480
490
  * Update a record by ID
@@ -484,7 +494,12 @@ var RepositoryManager = class {
484
494
  * @public
485
495
  */
486
496
  async update(id, data) {
487
- return this.adapter.update(id, data);
497
+ await this.onSaving(data, "update");
498
+ await this.onUpdating(id, data);
499
+ const result = await this.adapter.update(id, data);
500
+ await this.onUpdate(result, data);
501
+ await this.onSave(result, data, "update");
502
+ return result;
488
503
  }
489
504
  /**
490
505
  * Delete a record by ID
@@ -493,7 +508,9 @@ var RepositoryManager = class {
493
508
  * @public
494
509
  */
495
510
  async delete(id) {
496
- return this.adapter.delete(id);
511
+ await this.onDeleting(id);
512
+ await this.adapter.delete(id);
513
+ await this.onDelete(id);
497
514
  }
498
515
  /**
499
516
  * Update multiple records matching filter
@@ -669,9 +686,11 @@ var RepositoryManager = class {
669
686
  if (!this.isCacheable || !this.cacheDriver) return await this.count(options);
670
687
  const opts = this.prepareOptions(options);
671
688
  const cacheKey = this.cacheKey("count", opts);
672
- let count = await this.cacheDriver.get(cacheKey);
673
- if (count !== void 0) return count;
674
- count = await this.count(options);
689
+ if (!opts.purgeCache) {
690
+ const cachedCount = await this.cacheDriver.get(cacheKey);
691
+ if (cachedCount !== null && cachedCount !== void 0) return cachedCount;
692
+ }
693
+ const count = await this.count(options);
675
694
  await this.cache(cacheKey, count);
676
695
  return count;
677
696
  }
@@ -688,6 +707,134 @@ var RepositoryManager = class {
688
707
  }));
689
708
  }
690
709
  /**
710
+ * Sum a numeric field across records matching options.
711
+ *
712
+ * Applies `filterBy` (and its operator-injection guard), `where`, scopes and
713
+ * every other repository option to the query FIRST — exactly like `count()` —
714
+ * THEN runs the aggregate, so the sum is always scoped by the same filters
715
+ * the rest of the repository honors.
716
+ *
717
+ * @param field - Numeric field to sum
718
+ * @param options - Repository options (filter values, perform, etc.)
719
+ * @returns Promise resolving to the filtered numeric sum
720
+ * @public
721
+ *
722
+ * @example
723
+ * await ordersRepository.sum("total", { status: "paid" });
724
+ */
725
+ async sum(field, options) {
726
+ const query = this.newQuery();
727
+ const opts = this.prepareOptions(options);
728
+ this.applyOptionsToQuery(query, opts);
729
+ return await query.sum(field);
730
+ }
731
+ /**
732
+ * Average a numeric field across records matching options.
733
+ *
734
+ * Options (including `filterBy`) are applied before the aggregate, mirroring
735
+ * `count()`.
736
+ *
737
+ * @param field - Numeric field to average
738
+ * @param options - Repository options
739
+ * @returns Promise resolving to the filtered numeric average
740
+ * @public
741
+ */
742
+ async avg(field, options) {
743
+ const query = this.newQuery();
744
+ const opts = this.prepareOptions(options);
745
+ this.applyOptionsToQuery(query, opts);
746
+ return await query.avg(field);
747
+ }
748
+ /**
749
+ * Minimum value of a field across records matching options.
750
+ *
751
+ * Options (including `filterBy`) are applied before the aggregate, mirroring
752
+ * `count()`.
753
+ *
754
+ * @param field - Field name
755
+ * @param options - Repository options
756
+ * @returns Promise resolving to the filtered minimum value
757
+ * @public
758
+ */
759
+ async min(field, options) {
760
+ const query = this.newQuery();
761
+ const opts = this.prepareOptions(options);
762
+ this.applyOptionsToQuery(query, opts);
763
+ return await query.min(field);
764
+ }
765
+ /**
766
+ * Maximum value of a field across records matching options.
767
+ *
768
+ * Options (including `filterBy`) are applied before the aggregate, mirroring
769
+ * `count()`.
770
+ *
771
+ * @param field - Field name
772
+ * @param options - Repository options
773
+ * @returns Promise resolving to the filtered maximum value
774
+ * @public
775
+ */
776
+ async max(field, options) {
777
+ const query = this.newQuery();
778
+ const opts = this.prepareOptions(options);
779
+ this.applyOptionsToQuery(query, opts);
780
+ return await query.max(field);
781
+ }
782
+ /**
783
+ * Group records by one or more fields and compute aggregates.
784
+ *
785
+ * Repository options (including `filterBy`) are applied before the grouping,
786
+ * mirroring `count()`, so the grouped rows are always scoped by the same
787
+ * filters the rest of the repository honors.
788
+ *
789
+ * @template R - Shape of each grouped row
790
+ * @param fields - Field(s) to group by
791
+ * @param aggregates - Map of result aliases to aggregate expressions (e.g. `$agg.*`)
792
+ * @param options - Repository options
793
+ * @returns Promise resolving to the array of grouped rows
794
+ * @public
795
+ *
796
+ * @example
797
+ * import { $agg } from "@warlock.js/cascade";
798
+ *
799
+ * await ordersRepository.groupBy(
800
+ * "status",
801
+ * { count: $agg.count(), total: $agg.sum("total") },
802
+ * { paidAfter: "2026-01-01" },
803
+ * );
804
+ */
805
+ async groupBy(fields, aggregates, options) {
806
+ const query = this.newQuery();
807
+ const opts = this.prepareOptions(options);
808
+ this.applyOptionsToQuery(query, opts);
809
+ return await query.groupBy(fields, aggregates);
810
+ }
811
+ /**
812
+ * Compute aggregates over the whole matching set as a single summary row.
813
+ *
814
+ * Repository options (including `filterBy`) are applied before the aggregate,
815
+ * mirroring `count()`.
816
+ *
817
+ * @template R - Shape of the summary row
818
+ * @param aggregates - Map of result aliases to aggregate expressions (e.g. `$agg.*`)
819
+ * @param options - Repository options
820
+ * @returns Promise resolving to the single summary row (or `null` when empty)
821
+ * @public
822
+ *
823
+ * @example
824
+ * import { $agg } from "@warlock.js/cascade";
825
+ *
826
+ * await ordersRepository.aggregate(
827
+ * { total: $agg.sum("total"), avg: $agg.avg("total") },
828
+ * { status: "paid" },
829
+ * );
830
+ */
831
+ async aggregate(aggregates, options) {
832
+ const query = this.newQuery();
833
+ const opts = this.prepareOptions(options);
834
+ this.applyOptionsToQuery(query, opts);
835
+ return await query.aggregate(aggregates);
836
+ }
837
+ /**
691
838
  * Set cache driver
692
839
  * @param driver - Cache driver instance
693
840
  * @returns This repository for chaining
@@ -714,11 +861,37 @@ var RepositoryManager = class {
714
861
  */
715
862
  cacheKey(key, moreOptions) {
716
863
  let cacheKey = `repositories.${this.getName()}`;
717
- if (key) cacheKey += "." + (typeof key === "string" ? key : JSON.stringify(key));
718
- if (moreOptions) cacheKey += "." + JSON.stringify(moreOptions);
864
+ if (key) cacheKey += "." + (typeof key === "string" ? key : this.stableStringify(key));
865
+ if (moreOptions) {
866
+ const { purgeCache: _purgeCache, ...keyOptions } = moreOptions;
867
+ cacheKey += "." + this.stableStringify(keyOptions);
868
+ }
719
869
  return cacheKey;
720
870
  }
721
871
  /**
872
+ * Deterministically serialize a value for use in a cache key.
873
+ *
874
+ * Unlike raw `JSON.stringify`, object keys are recursively sorted so that
875
+ * `{ a: 1, b: 2 }` and `{ b: 2, a: 1 }` produce the same key. Function-valued
876
+ * options (e.g. a `perform` callback) are represented by a stable marker
877
+ * (`[fn:<name>]`) rather than being silently dropped, so two distinct
878
+ * callbacks do not collide on the same cache key.
879
+ */
880
+ stableStringify(value) {
881
+ const seen = /* @__PURE__ */ new WeakSet();
882
+ const normalize = (input) => {
883
+ if (typeof input === "function") return `[fn:${input.name || "anonymous"}]`;
884
+ if (input === null || typeof input !== "object") return input;
885
+ if (seen.has(input)) return "[circular]";
886
+ seen.add(input);
887
+ if (Array.isArray(input)) return input.map((item) => normalize(item));
888
+ const sorted = {};
889
+ for (const objectKey of Object.keys(input).sort()) sorted[objectKey] = normalize(input[objectKey]);
890
+ return sorted;
891
+ };
892
+ return JSON.stringify(normalize(value));
893
+ }
894
+ /**
722
895
  * Cache a value
723
896
  * @param key - Cache key
724
897
  * @param value - Value to cache
@@ -726,7 +899,11 @@ var RepositoryManager = class {
726
899
  */
727
900
  async cache(key, value) {
728
901
  if (!this.isCacheable || !this.cacheDriver) return;
729
- await this.cacheDriver.set(key, value);
902
+ try {
903
+ await this.cacheDriver.set(key, value);
904
+ } catch (error) {
905
+ console.error(`[Repository] Failed to write cache key "${key}":`, error);
906
+ }
730
907
  }
731
908
  /**
732
909
  * Get cached record by ID
@@ -758,7 +935,7 @@ var RepositoryManager = class {
758
935
  if (cachedData) return this.adapter.deserializeModel(cachedData);
759
936
  const model = await this.findBy(column, value);
760
937
  if (!model) return null;
761
- this.cache(cacheKey, this.adapter.serializeModel(model));
938
+ await this.cache(cacheKey, this.adapter.serializeModel(model));
762
939
  return model;
763
940
  }
764
941
  /**
@@ -771,8 +948,10 @@ var RepositoryManager = class {
771
948
  if (!this.isCacheable || !this.cacheDriver) return await this.all(options);
772
949
  const opts = this.prepareOptions(options);
773
950
  const cacheKey = this.cacheKey("all", opts);
774
- const cachedData = await this.cacheDriver.get(cacheKey);
775
- if (cachedData) return cachedData.map((record) => this.adapter.deserializeModel(record));
951
+ if (!opts.purgeCache) {
952
+ const cachedData = await this.cacheDriver.get(cacheKey);
953
+ if (cachedData) return cachedData.map((record) => this.adapter.deserializeModel(record));
954
+ }
776
955
  const records = await this.all(options);
777
956
  await this.cache(cacheKey, records.map((record) => this.adapter.serializeModel(record)));
778
957
  return records;
@@ -799,11 +978,13 @@ var RepositoryManager = class {
799
978
  if (!this.isCacheable || !this.cacheDriver) return await this._listImpl(options);
800
979
  const opts = this.prepareOptions(options);
801
980
  const cacheKey = this.cacheKey("list", opts);
802
- const cachedData = await this.cacheDriver.get(cacheKey);
803
- if (cachedData) return {
804
- data: (cachedData?.data || []).map((record) => this.adapter.deserializeModel(record)),
805
- pagination: cachedData.pagination
806
- };
981
+ if (!opts.purgeCache) {
982
+ const cachedData = await this.cacheDriver.get(cacheKey);
983
+ if (cachedData) return {
984
+ data: (cachedData?.data || []).map((record) => this.adapter.deserializeModel(record)),
985
+ pagination: cachedData.pagination
986
+ };
987
+ }
807
988
  const result = await this._listImpl(options);
808
989
  await this.cache(cacheKey, {
809
990
  data: result.data.map((record) => this.adapter.serializeModel(record)),
@@ -865,9 +1046,10 @@ var RepositoryManager = class {
865
1046
  * exported as cleanup
866
1047
  * export const cleanup = usersRepository.cleanup.bind(usersRepository);
867
1048
  */
868
- $cleanup() {
869
- this.cleanup();
870
- this.cacheDriver.flush();
1049
+ async $cleanup() {
1050
+ await this.clearCache();
1051
+ this.cleanuEvents();
1052
+ if (this.cacheDriver) await this.cacheDriver.flush();
871
1053
  }
872
1054
  /**
873
1055
  * Clear all cache for this repository
@@ -1 +1 @@
1
- {"version":3,"file":"repository.manager.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/repositories/repository.manager.ts"],"sourcesContent":["import { cache, CacheKey, type CacheDriver } from \"@warlock.js/cache\";\nimport { config } from \"../config\";\nimport { CascadeAdapter } from \"./adapters/cascade\";\nimport type {\n AllRepositoryOptions,\n ChunkCallback,\n CursorPaginationResult,\n FilterRules,\n PaginationResult,\n QueryBuilderContract,\n RepositoryAdapterContract,\n RepositoryOptions,\n SaveMode,\n TypedAllRepositoryOptions,\n TypedRepositoryOptions,\n TypedRepositoryOptionsWithCursor,\n TypedRepositoryOptionsWithPages,\n} from \"./contracts\";\n\n/**\n * Base repository manager class\n * Provides ORM-agnostic data access layer with support for listing, filtering,\n * caching, pagination, and CRUD operations\n *\n * @template T - The type of records managed by this repository\n *\n * @example\n * // Extend with source\n * class UserRepository extends RepositoryManager<User> {\n * protected source = User;\n * protected filterBy = { email: \"=\", role: [\"in\", \"role\"] };\n * }\n *\n * @example\n * // Direct instantiation with adapter\n * const userRepo = new RepositoryManager<User>(new PrismaAdapter(prisma.user));\n */\nexport class RepositoryManager<T = unknown, F = Record<string, any>> {\n /**\n * Adapter instance (lazy-loaded)\n * @private\n */\n protected _adapter?: RepositoryAdapterContract<T>;\n\n /**\n * Data source reference (Model, Prisma client, table name, etc.)\n * Used by createDefaultAdapter to instantiate the appropriate adapter\n * @protected\n */\n protected source?: any;\n\n // ============================================================================\n // CONFIGURATION PROPERTIES\n // ============================================================================\n\n /**\n * Filter definitions\n * Maps filter keys to filter rules\n * @protected\n */\n protected filterBy: FilterRules = {};\n\n /**\n * Get adapter instance (lazy-loaded)\n * Resolution order:\n * 1. Use injected adapter from constructor\n * 2. Use config-based resolver if available\n * 3. Use createDefaultAdapter\n *\n * @returns Adapter instance\n * @protected\n */\n protected get adapter(): RepositoryAdapterContract<T> {\n if (this._adapter) {\n return this._adapter;\n }\n\n // Try config-based resolver\n const resolver = config.key(\"repository.adapterResolver\");\n\n if (resolver) {\n this._adapter = resolver(this);\n } else {\n this._adapter = config.get(\"repository.defaultAdapter\") || this.createDefaultAdapter();\n }\n\n // Adapter is guaranteed to be set at this point\n return this._adapter!;\n }\n\n /**\n * Default repository options\n * @protected\n */\n protected defaultOptions: Partial<RepositoryOptions> =\n config.get(\"repository.defaultOptions\") || {};\n\n /**\n * Simple select columns (used with simple filter)\n * @protected\n */\n protected simpleSelectColumns: string[] = [];\n\n /**\n * Active column name\n * @default \"isActive\"\n * @protected\n */\n protected isActiveColumn?: string;\n\n /**\n * Active column value\n * @default true\n * @protected\n */\n protected isActiveValue?: any;\n\n /**\n * Repository name (for events)\n * @protected\n */\n protected name?: string;\n\n /**\n * Whether caching is enabled\n * @default true\n * @protected\n */\n protected isCacheable = config.get(\"repository.isCacheable\") ?? true;\n\n /**\n * Cache driver instance\n * @protected\n */\n protected cacheDriver: CacheDriver<any, any> = config.get(\"repository.cacheDriver\") || cache;\n\n /**\n * List of all events callbacks\n */\n protected eventsCallbacks: any[] = [];\n\n /**\n * Constructor\n * @param adapter - Optional adapter instance for direct injection\n */\n public constructor(adapter?: RepositoryAdapterContract<T>) {\n if (adapter) {\n this._adapter = adapter;\n }\n\n // Wait for constructor to finish and all properties are properly registered\n // specially for adapter to get instanciated\n setTimeout(() => {\n this.registerEvents();\n }, 0);\n }\n\n /**\n * Register events\n */\n public registerEvents() {\n this.eventsCallbacks.push(\n ...this.adapter.registerEvents((source: any) => {\n // this.clearCache({ id: source.id });\n this.clearCache();\n }),\n );\n }\n\n /**\n * Unregister events\n */\n public cleanuEvents() {\n this.eventsCallbacks.forEach((callback) => {\n callback();\n });\n this.eventsCallbacks = [];\n }\n\n /**\n * Create default adapter instance\n * Override this method to provide custom adapter creation logic\n *\n * @returns Adapter instance\n * @throws Error if no source is configured\n * @protected\n */\n protected createDefaultAdapter(): RepositoryAdapterContract<T> {\n if (!this.source) {\n throw new Error(\n \"No adapter or source configured. Either pass an adapter to the constructor, \" +\n \"set the 'source' property, or configure 'repository.adapterResolver' in config.\",\n );\n }\n\n // Default: assume source is a Cascade Model\n if (typeof this.source === \"function\") {\n // Lazy import to avoid circular dependencies\n return new CascadeAdapter(this.source) as unknown as RepositoryAdapterContract<T>;\n }\n\n throw new Error(\n \"Cannot create default adapter for this source type. \" +\n \"Please provide an adapter or configure repository.adapterResolver.\",\n );\n }\n\n // ============================================================================\n // UTILITY METHODS\n // ============================================================================\n\n /**\n * Get repository name\n * @returns Repository name\n * @public\n */\n public getName(): string {\n if (this.name) {\n return this.name;\n }\n\n // Try to get collection name from source\n this.name = this.adapter.resolveRepositoryName() || \"unknown\";\n\n return this.name;\n }\n\n /**\n * Get is active column\n */\n protected getIsActiveColumn(): string {\n return this.isActiveColumn || config.key(\"repository.isActiveColumn\") || \"isActive\";\n }\n\n /**\n * Get is active value\n */\n protected getIsActiveValue(): any {\n return this.isActiveValue ?? config.key(\"repository.isActiveValue\") ?? true;\n }\n\n /**\n * Create new query builder instance\n * @returns Query builder\n * @public\n */\n public newQuery() {\n return this.adapter.query();\n }\n\n /**\n * Create new model instance\n * @param data - Model data\n * @returns Model instance\n * @public\n */\n public newModel(data?: any): T {\n return this.adapter.createModel(data);\n }\n\n /**\n * Get active filter object\n * @returns Filter object for active records\n * @protected\n */\n protected getIsActiveFilter() {\n return {\n [this.getIsActiveColumn()]: this.getIsActiveValue(),\n };\n }\n\n // ============================================================================\n // FINDING METHODS\n // ============================================================================\n\n /**\n * Find a record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to record or null\n * @public\n */\n public async find(id: string | number | T): Promise<T | null> {\n return this.adapter.find(id);\n }\n\n /**\n * Find a record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to record or null\n * @public\n */\n public async findBy(column: string, value: any): Promise<T | null> {\n return this.adapter.findBy(column, value);\n }\n\n /**\n * Find active record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findActive(id: string | number | T): Promise<T | null> {\n return this.newQuery()\n .where({\n id,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Find active record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findByActive(column: string, value: any): Promise<T | null> {\n return this.newQuery()\n .where({\n [column]: value,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Get first record matching options\n * @param options - Repository options\n * @returns Promise resolving to first record or null\n * @public\n */\n public async first(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.limit(1).first();\n }\n\n /**\n * Get id by the given filter\n */\n public async firstId(options?: TypedRepositoryOptions<F>): Promise<string | number | undefined> {\n const record = await this.first(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active id\n */\n public async firstActiveId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first cached id\n */\n public async firstCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active cached id\n */\n public async firstActiveCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first uuid\n */\n public async firstUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.first(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active uuid\n */\n public async firstActiveUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached uuid\n */\n public async firstCachedUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active cached uuid\n */\n public async firstActiveCachedUuid(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached record\n */\n public async firstCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached({\n ...options,\n limit: 1,\n } as TypedAllRepositoryOptions<F>);\n\n return results[0] || null;\n }\n\n /**\n * Get first active record\n * @param options - Repository options\n * @returns Promise resolving to first active record or null\n * @public\n */\n public async firstActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get first active cached record\n * @param options - Repository options\n * @returns Promise resolving to first active cached record or null\n * @public\n */\n public async firstActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.firstCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last record matching options\n * @param options - Repository options\n * @returns Promise resolving to last record or null\n * @public\n */\n public async last(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n orderBy: {\n id: \"desc\",\n },\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last cached record\n */\n public async lastCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached(\n this.asTypedAll({\n ...options,\n limit: 1,\n orderBy: { id: \"desc\" },\n }),\n );\n\n return results[0] || null;\n }\n\n /**\n * Get last active record\n * @param options - Repository options\n * @returns Promise resolving to last active record or null\n * @public\n */\n public async lastActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.last({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last active cached record\n * @param options - Repository options\n * @returns Promise resolving to last active cached record or null\n * @public\n */\n public async lastActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.lastCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n // ============================================================================\n // LISTING METHODS\n // ============================================================================\n\n /**\n * List records with pagination\n * Supports both traditional page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n *\n * @example\n * // Traditional pagination (default)\n * const result = await repo.list({ page: 2, limit: 10 });\n *\n * @example\n * // Cursor pagination\n * const result = await repo.list({\n * paginationMode: \"cursor\",\n * limit: 20,\n * cursor: lastId,\n * direction: \"next\"\n * });\n *\n * @public\n */\n public async list(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async list(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async list(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl(options);\n }\n\n /**\n * Internal list implementation - no overloads, handles union type\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @private\n */\n private async _listImpl(\n options?: RepositoryOptions,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options as TypedRepositoryOptions<F>);\n const paginationMode = opts.paginationMode || \"pages\";\n\n // applyOptionsToQuery handles cursor phase 1 (WHERE + ORDER BY) internally\n // when paginationMode === \"cursor\", ensuring the cursor column is always\n // the primary sort key before any other options are applied.\n this.applyOptionsToQuery(query, opts);\n\n if (paginationMode === \"cursor\") {\n return query.cursorPaginate({\n limit: opts.limit || opts.defaultLimit || 15,\n cursor: opts.cursor,\n direction: opts.direction,\n cursorColumn: opts.cursorColumn,\n });\n }\n\n // Traditional page-based pagination (default)\n const page = opts.page || 1;\n const limit = opts.limit || opts.defaultLimit || 15;\n\n return query.paginate(page, limit);\n }\n\n /**\n * List all records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of records\n * @public\n */\n public async all(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n const query = this.newQuery();\n\n // Apply options\n const opts = this.prepareOptions(options);\n this.applyOptionsToQuery(query, opts);\n\n return query.get();\n }\n\n /**\n * List active records with pagination\n * Supports both page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async listActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async listActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async listActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * List all active records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of active records\n * @public\n */\n public async allActive(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return this.all(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // EXISTENCE CHECKS\n // ============================================================================\n\n /**\n * Check if record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if exists\n * @public\n */\n public async exists(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.first(filter));\n }\n\n /**\n * Check if active record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async existsActive(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.firstActive(filter));\n }\n\n /**\n * Check if record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if exists\n * @public\n */\n public async idExists(id: number | string): Promise<boolean> {\n return !!(await this.find(id));\n }\n\n /**\n * Check if active record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async idExistsActive(id: number | string): Promise<boolean> {\n return !!(await this.findActive(id));\n }\n\n /**\n * Prepare options — merges defaultOptions with caller options.\n * Returning as TypedRepositoryOptions<F> ensures internal composition\n * (spread + forward) satisfies the typed public API without per-call casts.\n */\n protected prepareOptions(options?: TypedRepositoryOptions<F>): TypedRepositoryOptions<F> {\n return { ...(this.defaultOptions || {}), ...(options || {}) } as TypedRepositoryOptions<F>;\n }\n\n /**\n * Cast a plain `RepositoryOptions` spread to the typed variant.\n * Used internally when composing options across method calls where the\n * spread breaks the F-generic inference chain.\n */\n protected asTyped(opts: RepositoryOptions): TypedRepositoryOptions<F> {\n return opts as TypedRepositoryOptions<F>;\n }\n\n protected asTypedAll(opts: AllRepositoryOptions): TypedAllRepositoryOptions<F> {\n return opts as TypedAllRepositoryOptions<F>;\n }\n\n // ============================================================================\n // HELPER METHODS\n // ============================================================================\n\n /**\n * Apply repository options to query\n * @param query - Query builder instance\n * @param options - Repository options\n * @protected\n */\n protected applyOptionsToQuery(\n query: QueryBuilderContract<T>,\n options: RepositoryOptions,\n ): RepositoryOptions {\n // ── Cursor phase 1: WHERE + ORDER BY ──────────────────────────────────────\n // Must run first so the cursor column is always the PRIMARY sort key.\n // Any orderBy appended below becomes a harmless secondary sort key.\n if (options.paginationMode === \"cursor\") {\n const cursorColumn = options.cursorColumn ?? \"id\";\n const direction = options.direction ?? \"next\";\n\n if (options.cursor) {\n query.where(cursorColumn, direction === \"next\" ? \">\" : \"<\", options.cursor);\n }\n\n query.orderBy(cursorColumn, direction === \"next\" ? \"asc\" : \"desc\");\n\n // Warn and strip orderBy that targets the same column as the cursor —\n // it would produce a duplicate / conflicting sort clause.\n if (options.orderBy) {\n const conflictingKeys = Array.isArray(options.orderBy)\n ? [options.orderBy[0]]\n : typeof options.orderBy === \"object\"\n ? Object.keys(options.orderBy)\n : [];\n\n if (conflictingKeys.includes(cursorColumn)) {\n console.warn(\n `[Repository] orderBy on \"${cursorColumn}\" conflicts with cursorColumn and will be ignored. ` +\n `Cursor pagination owns the sort order for its cursor column.`,\n );\n options = { ...options, orderBy: undefined };\n }\n }\n }\n\n // Apply filters\n if (this.filterBy && Object.keys(this.filterBy).length > 0) {\n query.applyFilters(this.filterBy, options, {\n dateFormat: \"DD-MM-YYYY\",\n dateTimeFormat: \"DD-MM-YYYY HH:mm:ss\",\n });\n }\n\n // Apply select\n if (options.select) {\n query.select(options.select);\n }\n\n // Apply deselect\n if (options.deselect) {\n query.deselect(options.deselect);\n }\n\n if (options.simpleSelect && this.simpleSelectColumns.length > 0) {\n query.select(this.simpleSelectColumns);\n }\n\n // Apply ordering\n if (options.orderBy) {\n if (options.orderBy === \"random\") {\n query.random();\n } else if (Array.isArray(options.orderBy)) {\n query.orderBy(options.orderBy[0], options.orderBy[1]);\n } else if (typeof options.orderBy === \"object\") {\n query.sortBy(options.orderBy);\n }\n }\n\n // Apply limit (for non-paginated queries)\n if (options.limit && options.paginate === false) {\n query.limit(options.limit);\n }\n\n // Apply custom perform function\n if (options?.perform) {\n options.perform(query, options);\n }\n\n return options;\n }\n\n // ============================================================================\n // CRUD OPERATIONS\n // ============================================================================\n\n /**\n * Create a new record\n * @param data - Record data\n * @returns Promise resolving to created record\n * @public\n */\n public async create(data: any): Promise<T> {\n return this.adapter.create(data);\n }\n\n /**\n * Update a record by ID\n * @param id - Record ID\n * @param data - Updated data\n * @returns Promise resolving to updated record\n * @public\n */\n public async update(id: string | number | any, data: any): Promise<T> {\n return this.adapter.update(id, data);\n }\n\n /**\n * Delete a record by ID\n * @param id - Record ID\n * @returns Promise that resolves when deletion is complete\n * @public\n */\n public async delete(id: string | number): Promise<void> {\n return this.adapter.delete(id);\n }\n\n // ============================================================================\n // BULK OPERATIONS\n // ============================================================================\n\n /**\n * Update multiple records matching filter\n * @param filter - Filter criteria\n * @param data - Updated data\n * @returns Promise resolving to number of updated records\n * @public\n */\n public async updateMany(filter: any, data: any): Promise<number> {\n return this.adapter.updateMany(filter, data);\n }\n\n /**\n * Delete multiple records matching filter\n * @param filter - Filter criteria\n * @returns Promise resolving to number of deleted records\n * @public\n */\n public async deleteMany(filter: any): Promise<number> {\n return this.adapter.deleteMany(filter);\n }\n\n // ============================================================================\n // CHUNKING\n // ============================================================================\n\n /**\n * Process records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunk(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.chunk(size, callback);\n }\n\n /**\n * Process active records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunkActive(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n return this.chunk(size, callback, this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Get latest records (ordered by ID descending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async latest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...options,\n });\n }\n\n /**\n * Get oldest records (ordered by ID ascending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async oldest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...options,\n });\n }\n\n /**\n * Get latest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async latestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * Get oldest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async oldestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n // ============================================================================\n // LIFECYCLE HOOKS (Override these in child classes)\n // ============================================================================\n\n /**\n * Called before listing records\n * @param options - Repository options\n * @protected\n */\n protected async beforeListing(options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after listing records\n * @param result - Pagination result\n * @param options - Repository options\n * @protected\n */\n protected async onList(result: PaginationResult<T>, options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before creating a record\n * @param data - Record data\n * @protected\n */\n protected async onCreating(data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after creating a record\n * @param record - Created record\n * @param data - Original data\n * @protected\n */\n protected async onCreate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before updating a record\n * @param id - Record ID\n * @param data - Updated data\n * @protected\n */\n protected async onUpdating(id: string | number, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after updating a record\n * @param record - Updated record\n * @param data - Original data\n * @protected\n */\n protected async onUpdate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before saving a record (create or update)\n * @param data - Record data\n * @param mode - Save mode\n * @protected\n */\n protected async onSaving(data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after saving a record (create or update)\n * @param record - Saved record\n * @param data - Original data\n * @param mode - Save mode\n * @protected\n */\n protected async onSave(record: T, data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDeleting(id: string | number): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDelete(id: string | number): Promise<void> {\n // Override in child class\n }\n\n // ============================================================================\n // COUNT METHODS\n // ============================================================================\n\n /**\n * Count total records matching options\n * @param options - Repository options\n * @returns Promise resolving to count\n * @public\n */\n public async count(options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.count();\n }\n\n /**\n * Count total active records\n * @param options - Repository options\n * @returns Promise resolving to count of active records\n * @public\n */\n public async countActive(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.count(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Count records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count\n * @public\n */\n public async countCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.count(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"count\", opts);\n let count = await this.cacheDriver.get(cacheKey);\n\n if (count !== undefined) return count;\n\n count = await this.count(options);\n await this.cache(cacheKey, count);\n return count;\n }\n\n /**\n * Count active records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count of active records\n * @public\n */\n public async countActiveCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.countCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // CACHING METHODS\n // ============================================================================\n\n /**\n * Set cache driver\n * @param driver - Cache driver instance\n * @returns This repository for chaining\n * @public\n */\n public setCacheDriver(driver: any): this {\n this.cacheDriver = driver;\n return this;\n }\n\n /**\n * Get cache driver\n * @returns Cache driver instance\n * @public\n */\n public getCacheDriver(): any {\n return this.cacheDriver;\n }\n\n /**\n * Generate cache key\n * @param key - Base key or object\n * @param moreOptions - Additional options for key\n * @returns Generated cache key\n * @protected\n */\n protected cacheKey(key: string | Record<string, any>, moreOptions?: Record<string, any>): string {\n let cacheKey = `repositories.${this.getName()}`;\n\n if (key) {\n cacheKey += \".\" + (typeof key === \"string\" ? key : JSON.stringify(key));\n }\n\n if (moreOptions) {\n cacheKey += \".\" + JSON.stringify(moreOptions);\n }\n\n return cacheKey;\n }\n\n /**\n * Cache a value\n * @param key - Cache key\n * @param value - Value to cache\n * @protected\n */\n protected async cache(key: string, value: any): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n await this.cacheDriver.set(key, value);\n }\n\n /**\n * Get cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached record or null\n * @public\n */\n public async getCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * @alias getCached\n */\n public async findCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * Get cached record by column value\n * @param column - Column name\n * @param value - Column value\n * @param cacheKeyOptions - Additional cache key options\n * @returns Promise resolving to cached record or undefined\n * @public\n */\n public async getCachedBy(\n column: string,\n value: any,\n cacheKeyOptions?: Record<string, any>,\n ): Promise<T | null> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.findBy(column, value);\n }\n\n const cacheKey = this.cacheKey(`${column}.${value}`, cacheKeyOptions);\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return this.adapter.deserializeModel(cachedData);\n }\n\n const model = await this.findBy(column, value);\n\n if (!model) return null;\n\n this.cache(cacheKey, this.adapter.serializeModel(model));\n return model;\n }\n\n /**\n * Get all cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached records\n * @public\n */\n public async allCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.all(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"all\", opts);\n const cachedData = await this.cacheDriver.get<T[]>(cacheKey);\n\n if (cachedData) {\n return cachedData.map((record) => this.adapter.deserializeModel(record));\n }\n\n const records = await this.all(options);\n await this.cache(\n cacheKey,\n records.map((record) => this.adapter.serializeModel(record)),\n );\n return records;\n }\n\n /**\n * Get all active cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached active records\n * @public\n */\n public async allActiveCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return await this.allCached(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * List cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result\n * @public\n */\n public async listCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n if (!this.isCacheable || !this.cacheDriver) {\n return (await this._listImpl(options)) as PaginationResult<T>;\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"list\", opts);\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return {\n data: (cachedData?.data || []).map((record: T) => this.adapter.deserializeModel(record)),\n pagination: cachedData.pagination,\n };\n }\n\n const result = (await this._listImpl(options)) as PaginationResult<T>;\n\n await this.cache(cacheKey, {\n data: result.data.map((record) => this.adapter.serializeModel(record)),\n pagination: result.pagination,\n });\n return result;\n }\n\n /**\n * List active cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result of active records\n * @public\n */\n public async listActiveCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n return await this.listCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Get active cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached active record or undefined\n * @public\n */\n public async getActiveCached(id: string | number): Promise<T | undefined> {\n const model = await this.getCached(id);\n if (!model) return undefined;\n\n if (typeof (model as any).get === \"function\") {\n return (model as any).get(this.getIsActiveColumn()) === this.getIsActiveValue()\n ? model\n : undefined;\n }\n\n // Check if model is active\n const isActive = (model as any)[this.getIsActiveColumn()] === this.getIsActiveValue();\n return isActive ? model : undefined;\n }\n\n /**\n * Cache a model\n * @param model - Model to cache\n * @public\n */\n public async cacheModel(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cache(cacheKey, this.adapter.serializeModel(model));\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n *\n * @example\n * ```typescript\n */\n public cleanup() {\n this.clearCache();\n this.cleanuEvents();\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n * export const cleanup = usersRepository.cleanup.bind(usersRepository);\n */\n public $cleanup() {\n this.cleanup();\n this.cacheDriver.flush();\n }\n\n /**\n * Clear all cache for this repository\n * @public\n */\n public async clearCache(key?: CacheKey): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n await this.cacheDriver.removeNamespace(this.cacheKey(key || \"\"));\n }\n\n /**\n * Clear cache for specific model\n * @param model - Model to clear cache for\n * @public\n */\n public async clearModelCache(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cacheDriver.removeNamespace(cacheKey);\n }\n\n /**\n * Map documents to models\n * @param documents - Array of document data\n * @returns Array of model instances\n * @protected\n */\n protected mapModels(documents: any[]): T[] {\n return documents.map((doc) => this.newModel(doc));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Find or create a record\n * @param where - Conditions to find by\n * @param data - Data to create if not found\n * @returns Promise resolving to found or created record\n * @public\n */\n public async findOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n return model || (await this.create(data));\n }\n\n /**\n * Update or create a record\n * @param where - Conditions to find by\n * @param data - Data to update or create\n * @returns Promise resolving to updated or created record\n * @public\n */\n public async updateOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n if (model) {\n return await this.update(model, data);\n }\n return await this.create(data);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"repository.manager.mjs","names":[],"sources":["../../../../../../../@warlock.js/core/src/repositories/repository.manager.ts"],"sourcesContent":["import { cache, CacheKey, type CacheDriver } from \"@warlock.js/cache\";\nimport { config } from \"../config\";\nimport { CascadeAdapter } from \"./adapters/cascade\";\nimport type {\n AggregateExpressions,\n AllRepositoryOptions,\n ChunkCallback,\n CursorPaginationResult,\n FilterRules,\n GroupByFields,\n PaginationResult,\n QueryBuilderContract,\n RepositoryAdapterContract,\n RepositoryOptions,\n SaveMode,\n TypedAllRepositoryOptions,\n TypedRepositoryOptions,\n TypedRepositoryOptionsWithCursor,\n TypedRepositoryOptionsWithPages,\n} from \"./contracts\";\n\n/**\n * Base repository manager class\n * Provides ORM-agnostic data access layer with support for listing, filtering,\n * caching, pagination, and CRUD operations\n *\n * @template T - The type of records managed by this repository\n *\n * @example\n * // Extend with source\n * class UserRepository extends RepositoryManager<User> {\n * protected source = User;\n * protected filterBy = { email: \"=\", role: [\"in\", \"role\"] };\n * }\n *\n * @example\n * // Direct instantiation with adapter\n * const userRepo = new RepositoryManager<User>(new PrismaAdapter(prisma.user));\n */\nexport class RepositoryManager<T = unknown, F = Record<string, any>> {\n /**\n * Adapter instance (lazy-loaded)\n * @private\n */\n protected _adapter?: RepositoryAdapterContract<T>;\n\n /**\n * Data source reference (Model, Prisma client, table name, etc.)\n * Used by createDefaultAdapter to instantiate the appropriate adapter\n * @protected\n */\n protected source?: any;\n\n // ============================================================================\n // CONFIGURATION PROPERTIES\n // ============================================================================\n\n /**\n * Filter definitions\n * Maps filter keys to filter rules\n * @protected\n */\n protected filterBy: FilterRules = {};\n\n /**\n * Get adapter instance (lazy-loaded)\n * Resolution order:\n * 1. Use injected adapter from constructor\n * 2. Use config-based resolver if available\n * 3. Use createDefaultAdapter\n *\n * @returns Adapter instance\n * @protected\n */\n protected get adapter(): RepositoryAdapterContract<T> {\n if (this._adapter) {\n return this._adapter;\n }\n\n // Try config-based resolver\n const resolver = config.key(\"repository.adapterResolver\");\n\n if (resolver) {\n this._adapter = resolver(this);\n } else {\n this._adapter = config.get(\"repository.defaultAdapter\") || this.createDefaultAdapter();\n }\n\n // Adapter is guaranteed to be set at this point\n return this._adapter!;\n }\n\n /**\n * Default repository options\n * @protected\n */\n protected defaultOptions: Partial<RepositoryOptions> =\n config.get(\"repository.defaultOptions\") || {};\n\n /**\n * Simple select columns (used with simple filter)\n * @protected\n */\n protected simpleSelectColumns: string[] = [];\n\n /**\n * Active column name\n * @default \"isActive\"\n * @protected\n */\n protected isActiveColumn?: string;\n\n /**\n * Active column value\n * @default true\n * @protected\n */\n protected isActiveValue?: any;\n\n /**\n * Repository name (for events)\n * @protected\n */\n protected name?: string;\n\n /**\n * Whether caching is enabled\n * @default true\n * @protected\n */\n protected isCacheable = config.get(\"repository.isCacheable\") ?? true;\n\n /**\n * Cache driver instance\n * @protected\n */\n protected cacheDriver: CacheDriver<any, any> = config.get(\"repository.cacheDriver\") || cache;\n\n /**\n * List of all events callbacks\n */\n protected eventsCallbacks: any[] = [];\n\n /**\n * Constructor\n * @param adapter - Optional adapter instance for direct injection\n */\n public constructor(adapter?: RepositoryAdapterContract<T>) {\n if (adapter) {\n this._adapter = adapter;\n }\n\n // Wait for constructor to finish and all properties are properly registered\n // specially for adapter to get instanciated\n setTimeout(() => {\n this.registerEvents();\n }, 0);\n }\n\n /**\n * Register events\n */\n public registerEvents() {\n // Scheduled via setTimeout(0) in the constructor, so this runs detached:\n // the adapter getter (or its event wiring) can throw and there is no caller\n // to catch it. Guard the whole body so a registration failure is logged\n // instead of surfacing as an uncaught exception that crashes the process.\n try {\n this.eventsCallbacks.push(\n ...this.adapter.registerEvents((source: any) => {\n // this.clearCache({ id: source.id });\n this.clearCache();\n }),\n );\n } catch (error) {\n console.error(`[Repository] Failed to register events:`, error);\n }\n }\n\n /**\n * Unregister events\n */\n public cleanuEvents() {\n this.eventsCallbacks.forEach((callback) => {\n callback();\n });\n this.eventsCallbacks = [];\n }\n\n /**\n * Create default adapter instance\n * Override this method to provide custom adapter creation logic\n *\n * @returns Adapter instance\n * @throws Error if no source is configured\n * @protected\n */\n protected createDefaultAdapter(): RepositoryAdapterContract<T> {\n if (!this.source) {\n throw new Error(\n \"No adapter or source configured. Either pass an adapter to the constructor, \" +\n \"set the 'source' property, or configure 'repository.adapterResolver' in config.\",\n );\n }\n\n // Default: assume source is a Cascade Model\n if (typeof this.source === \"function\") {\n // Lazy import to avoid circular dependencies\n return new CascadeAdapter(this.source) as unknown as RepositoryAdapterContract<T>;\n }\n\n throw new Error(\n \"Cannot create default adapter for this source type. \" +\n \"Please provide an adapter or configure repository.adapterResolver.\",\n );\n }\n\n // ============================================================================\n // UTILITY METHODS\n // ============================================================================\n\n /**\n * Get repository name\n * @returns Repository name\n * @public\n */\n public getName(): string {\n if (this.name) {\n return this.name;\n }\n\n // Try to get collection name from source\n this.name = this.adapter.resolveRepositoryName() || \"unknown\";\n\n return this.name;\n }\n\n /**\n * Get is active column\n */\n protected getIsActiveColumn(): string {\n return this.isActiveColumn || config.key(\"repository.isActiveColumn\") || \"isActive\";\n }\n\n /**\n * Get is active value\n */\n protected getIsActiveValue(): any {\n return this.isActiveValue ?? config.key(\"repository.isActiveValue\") ?? true;\n }\n\n /**\n * Create new query builder instance\n * @returns Query builder\n * @public\n */\n public newQuery() {\n return this.adapter.query();\n }\n\n /**\n * Create new model instance\n * @param data - Model data\n * @returns Model instance\n * @public\n */\n public newModel(data?: any): T {\n return this.adapter.createModel(data);\n }\n\n /**\n * Get active filter object\n * @returns Filter object for active records\n * @protected\n */\n protected getIsActiveFilter() {\n return {\n [this.getIsActiveColumn()]: this.getIsActiveValue(),\n };\n }\n\n // ============================================================================\n // FINDING METHODS\n // ============================================================================\n\n /**\n * Find a record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to record or null\n * @public\n */\n public async find(id: string | number | T): Promise<T | null> {\n return this.adapter.find(id);\n }\n\n /**\n * Find a record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to record or null\n * @public\n */\n public async findBy(column: string, value: any): Promise<T | null> {\n return this.adapter.findBy(column, value);\n }\n\n /**\n * Find active record by ID\n * @param id - Record ID or model instance\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findActive(id: string | number | T): Promise<T | null> {\n return this.newQuery()\n .where({\n id,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Find active record by column value\n * @param column - Column name\n * @param value - Value to search for\n * @returns Promise resolving to active record or null\n * @public\n */\n public async findByActive(column: string, value: any): Promise<T | null> {\n return this.newQuery()\n .where({\n [column]: value,\n ...this.getIsActiveFilter(),\n })\n .first();\n }\n\n /**\n * Get first record matching options\n * @param options - Repository options\n * @returns Promise resolving to first record or null\n * @public\n */\n public async first(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.limit(1).first();\n }\n\n /**\n * Get id by the given filter\n */\n public async firstId(options?: TypedRepositoryOptions<F>): Promise<string | number | undefined> {\n const record = await this.first(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active id\n */\n public async firstActiveId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first cached id\n */\n public async firstCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first active cached id\n */\n public async firstActiveCachedId(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | number | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.id;\n }\n\n /**\n * Get first uuid\n */\n public async firstUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.first(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active uuid\n */\n public async firstActiveUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstActive(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached uuid\n */\n public async firstCachedUuid(options?: TypedRepositoryOptions<F>): Promise<string | undefined> {\n const record = await this.firstCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first active cached uuid\n */\n public async firstActiveCachedUuid(\n options?: TypedRepositoryOptions<F>,\n ): Promise<string | undefined> {\n const record = await this.firstActiveCached(options);\n return (record as any)?.uuid;\n }\n\n /**\n * Get first cached record\n */\n public async firstCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached({\n ...options,\n limit: 1,\n } as TypedAllRepositoryOptions<F>);\n\n return results[0] || null;\n }\n\n /**\n * Get first active record\n * @param options - Repository options\n * @returns Promise resolving to first active record or null\n * @public\n */\n public async firstActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get first active cached record\n * @param options - Repository options\n * @returns Promise resolving to first active cached record or null\n * @public\n */\n public async firstActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.firstCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last record matching options\n * @param options - Repository options\n * @returns Promise resolving to last record or null\n * @public\n */\n public async last(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.first({\n orderBy: {\n id: \"desc\",\n },\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last cached record\n */\n public async lastCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n const results = await this.allCached(\n this.asTypedAll({\n ...options,\n limit: 1,\n orderBy: { id: \"desc\" },\n }),\n );\n\n return results[0] || null;\n }\n\n /**\n * Get last active record\n * @param options - Repository options\n * @returns Promise resolving to last active record or null\n * @public\n */\n public async lastActive(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.last({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n /**\n * Get last active cached record\n * @param options - Repository options\n * @returns Promise resolving to last active cached record or null\n * @public\n */\n public async lastActiveCached(options?: TypedRepositoryOptions<F>): Promise<T | null> {\n return this.lastCached({\n ...this.getIsActiveFilter(),\n ...options,\n } as TypedRepositoryOptions<F>);\n }\n\n // ============================================================================\n // LISTING METHODS\n // ============================================================================\n\n /**\n * List records with pagination\n * Supports both traditional page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n *\n * @example\n * // Traditional pagination (default)\n * const result = await repo.list({ page: 2, limit: 10 });\n *\n * @example\n * // Cursor pagination\n * const result = await repo.list({\n * paginationMode: \"cursor\",\n * limit: 20,\n * cursor: lastId,\n * direction: \"next\"\n * });\n *\n * @public\n */\n public async list(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async list(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async list(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl(options);\n }\n\n /**\n * Internal list implementation - no overloads, handles union type\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @private\n */\n private async _listImpl(\n options?: RepositoryOptions,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options as TypedRepositoryOptions<F>);\n const paginationMode = opts.paginationMode || \"pages\";\n\n // applyOptionsToQuery handles cursor phase 1 (WHERE + ORDER BY) internally\n // when paginationMode === \"cursor\", ensuring the cursor column is always\n // the primary sort key before any other options are applied.\n this.applyOptionsToQuery(query, opts);\n\n if (paginationMode === \"cursor\") {\n return query.cursorPaginate({\n limit: opts.limit || opts.defaultLimit || 15,\n cursor: opts.cursor,\n direction: opts.direction,\n cursorColumn: opts.cursorColumn,\n });\n }\n\n // Traditional page-based pagination (default)\n const page = opts.page || 1;\n const limit = opts.limit || opts.defaultLimit || 15;\n\n return query.paginate(page, limit);\n }\n\n /**\n * List all records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of records\n * @public\n */\n public async all(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n const query = this.newQuery();\n\n // Apply options. all() never paginates, so flag paginate:false explicitly —\n // this lets applyOptionsToQuery honor a provided `limit` on this path (e.g.\n // firstCached/lastCached call all({ limit: 1 }) and rely on LIMIT 1 being\n // applied instead of fetching+caching the entire table).\n const opts = this.prepareOptions(options);\n opts.paginate = false;\n this.applyOptionsToQuery(query, opts);\n\n return query.get();\n }\n\n /**\n * List active records with pagination\n * Supports both page-based and cursor-based pagination\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async listActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async listActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async listActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * List all active records without pagination\n * @param options - Repository options\n * @returns Promise resolving to array of active records\n * @public\n */\n public async allActive(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return this.all(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // EXISTENCE CHECKS\n // ============================================================================\n\n /**\n * Check if record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if exists\n * @public\n */\n public async exists(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.first(filter));\n }\n\n /**\n * Check if active record exists matching filter\n * @param filter - Repository options\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async existsActive(filter?: TypedRepositoryOptions<F>): Promise<boolean> {\n return !!(await this.firstActive(filter));\n }\n\n /**\n * Check if record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if exists\n * @public\n */\n public async idExists(id: number | string): Promise<boolean> {\n return !!(await this.find(id));\n }\n\n /**\n * Check if active record exists by ID\n * @param id - Record ID\n * @returns Promise resolving to true if active record exists\n * @public\n */\n public async idExistsActive(id: number | string): Promise<boolean> {\n return !!(await this.findActive(id));\n }\n\n /**\n * Prepare options — merges defaultOptions with caller options.\n * Returning as TypedRepositoryOptions<F> ensures internal composition\n * (spread + forward) satisfies the typed public API without per-call casts.\n */\n protected prepareOptions(options?: TypedRepositoryOptions<F>): TypedRepositoryOptions<F> {\n return { ...(this.defaultOptions || {}), ...(options || {}) } as TypedRepositoryOptions<F>;\n }\n\n /**\n * Cast a plain `RepositoryOptions` spread to the typed variant.\n * Used internally when composing options across method calls where the\n * spread breaks the F-generic inference chain.\n */\n protected asTyped(opts: RepositoryOptions): TypedRepositoryOptions<F> {\n return opts as TypedRepositoryOptions<F>;\n }\n\n protected asTypedAll(opts: AllRepositoryOptions): TypedAllRepositoryOptions<F> {\n return opts as TypedAllRepositoryOptions<F>;\n }\n\n // ============================================================================\n // HELPER METHODS\n // ============================================================================\n\n /**\n * Apply repository options to query\n * @param query - Query builder instance\n * @param options - Repository options\n * @protected\n */\n protected applyOptionsToQuery(\n query: QueryBuilderContract<T>,\n options: RepositoryOptions,\n ): RepositoryOptions {\n // ── Cursor phase 1: WHERE + ORDER BY ──────────────────────────────────────\n // Must run first so the cursor column is always the PRIMARY sort key.\n // Any orderBy appended below becomes a harmless secondary sort key.\n if (options.paginationMode === \"cursor\") {\n const cursorColumn = options.cursorColumn ?? \"id\";\n const direction = options.direction ?? \"next\";\n\n if (options.cursor) {\n query.where(cursorColumn, direction === \"next\" ? \">\" : \"<\", options.cursor);\n }\n\n query.orderBy(cursorColumn, direction === \"next\" ? \"asc\" : \"desc\");\n\n // Warn and strip orderBy that targets the same column as the cursor —\n // it would produce a duplicate / conflicting sort clause.\n if (options.orderBy) {\n const conflictingKeys = Array.isArray(options.orderBy)\n ? [options.orderBy[0]]\n : typeof options.orderBy === \"object\"\n ? Object.keys(options.orderBy)\n : [];\n\n if (conflictingKeys.includes(cursorColumn)) {\n console.warn(\n `[Repository] orderBy on \"${cursorColumn}\" conflicts with cursorColumn and will be ignored. ` +\n `Cursor pagination owns the sort order for its cursor column.`,\n );\n options = { ...options, orderBy: undefined };\n }\n }\n }\n\n // Apply filters\n if (this.filterBy && Object.keys(this.filterBy).length > 0) {\n query.applyFilters(this.filterBy, options, {\n dateFormat: \"DD-MM-YYYY\",\n dateTimeFormat: \"DD-MM-YYYY HH:mm:ss\",\n });\n }\n\n // Apply select\n if (options.select) {\n query.select(options.select);\n }\n\n // Apply deselect\n if (options.deselect) {\n query.deselect(options.deselect);\n }\n\n if (options.simpleSelect && this.simpleSelectColumns.length > 0) {\n query.select(this.simpleSelectColumns);\n }\n\n // Apply ordering\n if (options.orderBy) {\n if (options.orderBy === \"random\") {\n // Pass the explicit limit through to random() when set. For the MongoDB\n // driver `$sample` REQUIRES a size — with no argument it silently\n // defaults to 1000, truncating larger result sets. Forwarding the\n // caller's limit keeps the random sample bounded to what they asked for.\n query.random(options.limit);\n } else if (Array.isArray(options.orderBy)) {\n query.orderBy(options.orderBy[0], options.orderBy[1]);\n } else if (typeof options.orderBy === \"object\") {\n query.sortBy(options.orderBy);\n }\n } else if (options.sortBy) {\n // Honor the standalone sortBy/sortDirection pair as a single orderBy clause\n // (only when no explicit orderBy was provided, which always wins).\n query.orderBy(options.sortBy, options.sortDirection ?? \"asc\");\n }\n\n // Apply limit (for non-paginated queries).\n // The all() path sets `paginate: false` explicitly so a provided `limit`\n // is honored there (otherwise firstCached/lastCached, which delegate to\n // all({ limit: 1 }), would drop the LIMIT and fetch the whole table).\n // Page-based pagination leaves paginate undefined and owns LIMIT itself.\n if (options.limit && options.paginate === false) {\n query.limit(options.limit);\n }\n\n // Apply custom perform function\n if (options?.perform) {\n options.perform(query, options);\n }\n\n return options;\n }\n\n // ============================================================================\n // CRUD OPERATIONS\n // ============================================================================\n\n /**\n * Create a new record\n * @param data - Record data\n * @returns Promise resolving to created record\n * @public\n */\n public async create(data: any): Promise<T> {\n await this.onSaving(data, \"create\");\n await this.onCreating(data);\n\n const result = await this.adapter.create(data);\n\n await this.onCreate(result, data);\n await this.onSave(result, data, \"create\");\n\n return result;\n }\n\n /**\n * Update a record by ID\n * @param id - Record ID\n * @param data - Updated data\n * @returns Promise resolving to updated record\n * @public\n */\n public async update(id: string | number | any, data: any): Promise<T> {\n await this.onSaving(data, \"update\");\n await this.onUpdating(id, data);\n\n const result = await this.adapter.update(id, data);\n\n await this.onUpdate(result, data);\n await this.onSave(result, data, \"update\");\n\n return result;\n }\n\n /**\n * Delete a record by ID\n * @param id - Record ID\n * @returns Promise that resolves when deletion is complete\n * @public\n */\n public async delete(id: string | number): Promise<void> {\n await this.onDeleting(id);\n\n await this.adapter.delete(id);\n\n await this.onDelete(id);\n }\n\n // ============================================================================\n // BULK OPERATIONS\n // ============================================================================\n\n /**\n * Update multiple records matching filter\n * @param filter - Filter criteria\n * @param data - Updated data\n * @returns Promise resolving to number of updated records\n * @public\n */\n public async updateMany(filter: any, data: any): Promise<number> {\n return this.adapter.updateMany(filter, data);\n }\n\n /**\n * Delete multiple records matching filter\n * @param filter - Filter criteria\n * @returns Promise resolving to number of deleted records\n * @public\n */\n public async deleteMany(filter: any): Promise<number> {\n return this.adapter.deleteMany(filter);\n }\n\n // ============================================================================\n // CHUNKING\n // ============================================================================\n\n /**\n * Process records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunk(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return query.chunk(size, callback);\n }\n\n /**\n * Process active records in chunks\n * @param size - Chunk size\n * @param callback - Function called for each chunk\n * @param options - Repository options\n * @returns Promise that resolves when chunking is complete\n * @public\n */\n public async chunkActive(\n size: number,\n callback: ChunkCallback<T>,\n options?: TypedRepositoryOptions<F>,\n ): Promise<void> {\n return this.chunk(size, callback, this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Get latest records (ordered by ID descending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async latest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...options,\n });\n }\n\n /**\n * Get oldest records (ordered by ID ascending)\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldest(options?: TypedRepositoryOptionsWithPages<F>): Promise<PaginationResult<T>>;\n public async oldest(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldest(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...options,\n });\n }\n\n /**\n * Get latest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async latestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async latestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async latestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"desc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n /**\n * Get oldest active records\n * Supports both pagination modes\n *\n * @param options - Repository options\n * @returns Promise resolving to pagination result\n * @public\n */\n public async oldestActive(\n options?: TypedRepositoryOptionsWithPages<F>,\n ): Promise<PaginationResult<T>>;\n public async oldestActive(\n options: TypedRepositoryOptionsWithCursor<F>,\n ): Promise<CursorPaginationResult<T>>;\n public async oldestActive(\n options?: TypedRepositoryOptions<F>,\n ): Promise<PaginationResult<T> | CursorPaginationResult<T>> {\n return this._listImpl({\n orderBy: [\"id\", \"asc\"],\n ...this.getIsActiveFilter(),\n ...options,\n });\n }\n\n // ============================================================================\n // LIFECYCLE HOOKS (Override these in child classes)\n // ============================================================================\n\n /**\n * Called before listing records\n * @param options - Repository options\n * @protected\n */\n protected async beforeListing(options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after listing records\n * @param result - Pagination result\n * @param options - Repository options\n * @protected\n */\n protected async onList(result: PaginationResult<T>, options: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before creating a record\n * @param data - Record data\n * @protected\n */\n protected async onCreating(data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after creating a record\n * @param record - Created record\n * @param data - Original data\n * @protected\n */\n protected async onCreate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before updating a record\n * @param id - Record ID\n * @param data - Updated data\n * @protected\n */\n protected async onUpdating(id: string | number, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after updating a record\n * @param record - Updated record\n * @param data - Original data\n * @protected\n */\n protected async onUpdate(record: T, data: any): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before saving a record (create or update)\n * @param data - Record data\n * @param mode - Save mode\n * @protected\n */\n protected async onSaving(data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after saving a record (create or update)\n * @param record - Saved record\n * @param data - Original data\n * @param mode - Save mode\n * @protected\n */\n protected async onSave(record: T, data: any, mode: SaveMode): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called before deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDeleting(id: string | number): Promise<void> {\n // Override in child class\n }\n\n /**\n * Called after deleting a record\n * @param id - Record ID\n * @protected\n */\n protected async onDelete(id: string | number): Promise<void> {\n // Override in child class\n }\n\n // ============================================================================\n // COUNT METHODS\n // ============================================================================\n\n /**\n * Count total records matching options\n * @param options - Repository options\n * @returns Promise resolving to count\n * @public\n */\n public async count(options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.count();\n }\n\n /**\n * Count total active records\n * @param options - Repository options\n * @returns Promise resolving to count of active records\n * @public\n */\n public async countActive(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.count(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Count records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count\n * @public\n */\n public async countCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.count(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"count\", opts);\n\n // Bypass + refresh the cache when purgeCache is requested.\n if (!opts.purgeCache) {\n const cachedCount = await this.cacheDriver.get(cacheKey);\n\n // Treat BOTH null and undefined as a cache miss: every shipped cache\n // driver returns `null` (not `undefined`) on a miss, so checking only\n // for `undefined` would return that null as the count and never cache.\n if (cachedCount !== null && cachedCount !== undefined) {\n return cachedCount;\n }\n }\n\n const count = await this.count(options);\n await this.cache(cacheKey, count);\n return count;\n }\n\n /**\n * Count active records with caching\n * @param options - Repository options\n * @returns Promise resolving to cached count of active records\n * @public\n */\n public async countActiveCached(options?: TypedRepositoryOptions<F>): Promise<number> {\n return await this.countCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n // ============================================================================\n // AGGREGATION METHODS\n // ============================================================================\n\n /**\n * Sum a numeric field across records matching options.\n *\n * Applies `filterBy` (and its operator-injection guard), `where`, scopes and\n * every other repository option to the query FIRST — exactly like `count()` —\n * THEN runs the aggregate, so the sum is always scoped by the same filters\n * the rest of the repository honors.\n *\n * @param field - Numeric field to sum\n * @param options - Repository options (filter values, perform, etc.)\n * @returns Promise resolving to the filtered numeric sum\n * @public\n *\n * @example\n * await ordersRepository.sum(\"total\", { status: \"paid\" });\n */\n public async sum(field: string, options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.sum(field);\n }\n\n /**\n * Average a numeric field across records matching options.\n *\n * Options (including `filterBy`) are applied before the aggregate, mirroring\n * `count()`.\n *\n * @param field - Numeric field to average\n * @param options - Repository options\n * @returns Promise resolving to the filtered numeric average\n * @public\n */\n public async avg(field: string, options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.avg(field);\n }\n\n /**\n * Minimum value of a field across records matching options.\n *\n * Options (including `filterBy`) are applied before the aggregate, mirroring\n * `count()`.\n *\n * @param field - Field name\n * @param options - Repository options\n * @returns Promise resolving to the filtered minimum value\n * @public\n */\n public async min(field: string, options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.min(field);\n }\n\n /**\n * Maximum value of a field across records matching options.\n *\n * Options (including `filterBy`) are applied before the aggregate, mirroring\n * `count()`.\n *\n * @param field - Field name\n * @param options - Repository options\n * @returns Promise resolving to the filtered maximum value\n * @public\n */\n public async max(field: string, options?: TypedRepositoryOptions<F>): Promise<number> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.max(field);\n }\n\n /**\n * Group records by one or more fields and compute aggregates.\n *\n * Repository options (including `filterBy`) are applied before the grouping,\n * mirroring `count()`, so the grouped rows are always scoped by the same\n * filters the rest of the repository honors.\n *\n * @template R - Shape of each grouped row\n * @param fields - Field(s) to group by\n * @param aggregates - Map of result aliases to aggregate expressions (e.g. `$agg.*`)\n * @param options - Repository options\n * @returns Promise resolving to the array of grouped rows\n * @public\n *\n * @example\n * import { $agg } from \"@warlock.js/cascade\";\n *\n * await ordersRepository.groupBy(\n * \"status\",\n * { count: $agg.count(), total: $agg.sum(\"total\") },\n * { paidAfter: \"2026-01-01\" },\n * );\n */\n public async groupBy<R = Record<string, unknown>>(\n fields: GroupByFields,\n aggregates: AggregateExpressions,\n options?: TypedRepositoryOptions<F>,\n ): Promise<R[]> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.groupBy<R>(fields, aggregates);\n }\n\n /**\n * Compute aggregates over the whole matching set as a single summary row.\n *\n * Repository options (including `filterBy`) are applied before the aggregate,\n * mirroring `count()`.\n *\n * @template R - Shape of the summary row\n * @param aggregates - Map of result aliases to aggregate expressions (e.g. `$agg.*`)\n * @param options - Repository options\n * @returns Promise resolving to the single summary row (or `null` when empty)\n * @public\n *\n * @example\n * import { $agg } from \"@warlock.js/cascade\";\n *\n * await ordersRepository.aggregate(\n * { total: $agg.sum(\"total\"), avg: $agg.avg(\"total\") },\n * { status: \"paid\" },\n * );\n */\n public async aggregate<R = Record<string, unknown>>(\n aggregates: AggregateExpressions,\n options?: TypedRepositoryOptions<F>,\n ): Promise<R | null> {\n const query = this.newQuery();\n const opts = this.prepareOptions(options);\n\n this.applyOptionsToQuery(query, opts);\n\n return await query.aggregate<R>(aggregates);\n }\n\n // ============================================================================\n // CACHING METHODS\n // ============================================================================\n\n /**\n * Set cache driver\n * @param driver - Cache driver instance\n * @returns This repository for chaining\n * @public\n */\n public setCacheDriver(driver: any): this {\n this.cacheDriver = driver;\n return this;\n }\n\n /**\n * Get cache driver\n * @returns Cache driver instance\n * @public\n */\n public getCacheDriver(): any {\n return this.cacheDriver;\n }\n\n /**\n * Generate cache key\n * @param key - Base key or object\n * @param moreOptions - Additional options for key\n * @returns Generated cache key\n * @protected\n */\n protected cacheKey(key: string | Record<string, any>, moreOptions?: Record<string, any>): string {\n let cacheKey = `repositories.${this.getName()}`;\n\n if (key) {\n cacheKey += \".\" + (typeof key === \"string\" ? key : this.stableStringify(key));\n }\n\n if (moreOptions) {\n // `purgeCache` is a control flag, not a query parameter — it must NOT\n // affect the key, otherwise a purge would refresh a different key than a\n // normal read consults, defeating the purpose.\n const { purgeCache: _purgeCache, ...keyOptions } = moreOptions;\n cacheKey += \".\" + this.stableStringify(keyOptions);\n }\n\n return cacheKey;\n }\n\n /**\n * Deterministically serialize a value for use in a cache key.\n *\n * Unlike raw `JSON.stringify`, object keys are recursively sorted so that\n * `{ a: 1, b: 2 }` and `{ b: 2, a: 1 }` produce the same key. Function-valued\n * options (e.g. a `perform` callback) are represented by a stable marker\n * (`[fn:<name>]`) rather than being silently dropped, so two distinct\n * callbacks do not collide on the same cache key.\n */\n protected stableStringify(value: any): string {\n const seen = new WeakSet<object>();\n\n const normalize = (input: any): any => {\n if (typeof input === \"function\") {\n return `[fn:${input.name || \"anonymous\"}]`;\n }\n\n if (input === null || typeof input !== \"object\") {\n return input;\n }\n\n // Guard against circular references — represent them with a stable marker.\n if (seen.has(input)) {\n return \"[circular]\";\n }\n\n seen.add(input);\n\n if (Array.isArray(input)) {\n return input.map((item) => normalize(item));\n }\n\n const sorted: Record<string, any> = {};\n\n for (const objectKey of Object.keys(input).sort()) {\n sorted[objectKey] = normalize(input[objectKey]);\n }\n\n return sorted;\n };\n\n return JSON.stringify(normalize(value));\n }\n\n /**\n * Cache a value\n * @param key - Cache key\n * @param value - Value to cache\n * @protected\n */\n protected async cache(key: string, value: any): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n // Swallow cache write failures so a flaky/unreachable remote cache (e.g.\n // Redis) degrades gracefully to a cache miss instead of breaking the read.\n try {\n await this.cacheDriver.set(key, value);\n } catch (error) {\n console.error(`[Repository] Failed to write cache key \"${key}\":`, error);\n }\n }\n\n /**\n * Get cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached record or null\n * @public\n */\n public async getCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * @alias getCached\n */\n public async findCached(id: string | number): Promise<T | null> {\n return await this.getCachedBy(\"id\", id);\n }\n\n /**\n * Get cached record by column value\n * @param column - Column name\n * @param value - Column value\n * @param cacheKeyOptions - Additional cache key options\n * @returns Promise resolving to cached record or undefined\n * @public\n */\n public async getCachedBy(\n column: string,\n value: any,\n cacheKeyOptions?: Record<string, any>,\n ): Promise<T | null> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.findBy(column, value);\n }\n\n const cacheKey = this.cacheKey(`${column}.${value}`, cacheKeyOptions);\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return this.adapter.deserializeModel(cachedData);\n }\n\n const model = await this.findBy(column, value);\n\n if (!model) return null;\n\n await this.cache(cacheKey, this.adapter.serializeModel(model));\n return model;\n }\n\n /**\n * Get all cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached records\n * @public\n */\n public async allCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n if (!this.isCacheable || !this.cacheDriver) {\n return await this.all(options);\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"all\", opts);\n\n // Bypass + refresh the cache when purgeCache is requested.\n if (!opts.purgeCache) {\n const cachedData = await this.cacheDriver.get<T[]>(cacheKey);\n\n if (cachedData) {\n return cachedData.map((record) => this.adapter.deserializeModel(record));\n }\n }\n\n const records = await this.all(options);\n await this.cache(\n cacheKey,\n records.map((record) => this.adapter.serializeModel(record)),\n );\n return records;\n }\n\n /**\n * Get all active cached records\n * @param options - Repository options\n * @returns Promise resolving to array of cached active records\n * @public\n */\n public async allActiveCached(options?: TypedAllRepositoryOptions<F>): Promise<T[]> {\n return await this.allCached(this.asTypedAll({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * List cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result\n * @public\n */\n public async listCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n if (!this.isCacheable || !this.cacheDriver) {\n return (await this._listImpl(options)) as PaginationResult<T>;\n }\n\n const opts = this.prepareOptions(options);\n\n const cacheKey = this.cacheKey(\"list\", opts);\n\n // Bypass + refresh the cache when purgeCache is requested.\n if (!opts.purgeCache) {\n const cachedData = await this.cacheDriver.get(cacheKey);\n\n if (cachedData) {\n return {\n data: (cachedData?.data || []).map((record: T) => this.adapter.deserializeModel(record)),\n pagination: cachedData.pagination,\n };\n }\n }\n\n const result = (await this._listImpl(options)) as PaginationResult<T>;\n\n await this.cache(cacheKey, {\n data: result.data.map((record) => this.adapter.serializeModel(record)),\n pagination: result.pagination,\n });\n return result;\n }\n\n /**\n * List active cached records with pagination\n * @param options - Repository options\n * @returns Promise resolving to cached pagination result of active records\n * @public\n */\n public async listActiveCached(options?: TypedRepositoryOptions<F>): Promise<PaginationResult<T>> {\n return await this.listCached(this.asTyped({ ...this.getIsActiveFilter(), ...options }));\n }\n\n /**\n * Get active cached record by ID\n * @param id - Record ID\n * @returns Promise resolving to cached active record or undefined\n * @public\n */\n public async getActiveCached(id: string | number): Promise<T | undefined> {\n const model = await this.getCached(id);\n if (!model) return undefined;\n\n if (typeof (model as any).get === \"function\") {\n return (model as any).get(this.getIsActiveColumn()) === this.getIsActiveValue()\n ? model\n : undefined;\n }\n\n // Check if model is active\n const isActive = (model as any)[this.getIsActiveColumn()] === this.getIsActiveValue();\n return isActive ? model : undefined;\n }\n\n /**\n * Cache a model\n * @param model - Model to cache\n * @public\n */\n public async cacheModel(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cache(cacheKey, this.adapter.serializeModel(model));\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n *\n * @example\n * ```typescript\n */\n public cleanup() {\n this.clearCache();\n this.cleanuEvents();\n }\n\n /**\n * Cleanup all events and cache as well\n * Please note this is mostly used with development server to be\n * exported as cleanup\n * export const cleanup = usersRepository.cleanup.bind(usersRepository);\n */\n public async $cleanup(): Promise<void> {\n await this.clearCache();\n this.cleanuEvents();\n\n if (this.cacheDriver) {\n await this.cacheDriver.flush();\n }\n }\n\n /**\n * Clear all cache for this repository\n * @public\n */\n public async clearCache(key?: CacheKey): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n await this.cacheDriver.removeNamespace(this.cacheKey(key || \"\"));\n }\n\n /**\n * Clear cache for specific model\n * @param model - Model to clear cache for\n * @public\n */\n public async clearModelCache(model: T): Promise<void> {\n if (!this.isCacheable || !this.cacheDriver) return;\n\n const id = (model as any).id;\n if (!id) return;\n\n const cacheKey = this.cacheKey(`id.${id}`);\n await this.cacheDriver.removeNamespace(cacheKey);\n }\n\n /**\n * Map documents to models\n * @param documents - Array of document data\n * @returns Array of model instances\n * @protected\n */\n protected mapModels(documents: any[]): T[] {\n return documents.map((doc) => this.newModel(doc));\n }\n\n // ============================================================================\n // CONVENIENCE METHODS\n // ============================================================================\n\n /**\n * Find or create a record\n * @param where - Conditions to find by\n * @param data - Data to create if not found\n * @returns Promise resolving to found or created record\n * @public\n */\n public async findOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n return model || (await this.create(data));\n }\n\n /**\n * Update or create a record\n * @param where - Conditions to find by\n * @param data - Data to update or create\n * @returns Promise resolving to updated or created record\n * @public\n */\n public async updateOrCreate(\n where: TypedRepositoryOptions<F>,\n data: Record<string, any>,\n ): Promise<T> {\n const model = await this.first(where);\n if (model) {\n return await this.update(model, data);\n }\n return await this.create(data);\n }\n}\n"],"mappings":"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"}