@warlock.js/core 4.3.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (903) hide show
  1. package/CHANGELOG.md +61 -6
  2. package/README.md +47 -11
  3. package/esm/ai/src/agent/agent-input-builder.mjs +132 -0
  4. package/esm/ai/src/agent/agent-input-builder.mjs.map +1 -0
  5. package/esm/ai/src/agent/agent-log-event.mjs +101 -0
  6. package/esm/ai/src/agent/agent-log-event.mjs.map +1 -0
  7. package/esm/ai/src/agent/agent-stream.mjs +82 -0
  8. package/esm/ai/src/agent/agent-stream.mjs.map +1 -0
  9. package/esm/ai/src/agent/agent-to-stream-event.mjs +86 -0
  10. package/esm/ai/src/agent/agent-to-stream-event.mjs.map +1 -0
  11. package/esm/ai/src/agent/agent.mjs +1157 -0
  12. package/esm/ai/src/agent/agent.mjs.map +1 -0
  13. package/esm/ai/src/agent/index.mjs +5 -0
  14. package/esm/ai/src/agent/json-stream-guard.mjs +400 -0
  15. package/esm/ai/src/agent/json-stream-guard.mjs.map +1 -0
  16. package/esm/ai/src/agent/spawn-sub-agent.mjs +68 -0
  17. package/esm/ai/src/agent/spawn-sub-agent.mjs.map +1 -0
  18. package/esm/ai/src/ai.mjs +155 -0
  19. package/esm/ai/src/ai.mjs.map +1 -0
  20. package/esm/ai/src/batch/batch.mjs +198 -0
  21. package/esm/ai/src/batch/batch.mjs.map +1 -0
  22. package/esm/ai/src/batch/index.mjs +3 -0
  23. package/esm/ai/src/batch/run-batch-item.mjs +100 -0
  24. package/esm/ai/src/batch/run-batch-item.mjs.map +1 -0
  25. package/esm/ai/src/batch/run-with-concurrency.mjs +39 -0
  26. package/esm/ai/src/batch/run-with-concurrency.mjs.map +1 -0
  27. package/esm/ai/src/checkpoint/memory.mjs +0 -0
  28. package/esm/ai/src/checkpoint/memory.mjs.map +1 -0
  29. package/esm/ai/src/checkpoint/pg.mjs +265 -0
  30. package/esm/ai/src/checkpoint/pg.mjs.map +1 -0
  31. package/esm/ai/src/checkpoint/redis.mjs +200 -0
  32. package/esm/ai/src/checkpoint/redis.mjs.map +1 -0
  33. package/esm/ai/src/config.mjs +59 -0
  34. package/esm/ai/src/config.mjs.map +1 -0
  35. package/esm/ai/src/contracts/end.type.mjs +47 -0
  36. package/esm/ai/src/contracts/end.type.mjs.map +1 -0
  37. package/esm/ai/src/errors/agent-cancelled-error.mjs +43 -0
  38. package/esm/ai/src/errors/agent-cancelled-error.mjs.map +1 -0
  39. package/esm/ai/src/errors/agent-execution-error.mjs +35 -0
  40. package/esm/ai/src/errors/agent-execution-error.mjs.map +1 -0
  41. package/esm/ai/src/errors/agent-max-trips-error.mjs +41 -0
  42. package/esm/ai/src/errors/agent-max-trips-error.mjs.map +1 -0
  43. package/esm/ai/src/errors/ai-error.mjs +68 -0
  44. package/esm/ai/src/errors/ai-error.mjs.map +1 -0
  45. package/esm/ai/src/errors/budget-exceeded-error.mjs +31 -0
  46. package/esm/ai/src/errors/budget-exceeded-error.mjs.map +1 -0
  47. package/esm/ai/src/errors/content-filter-error.mjs +28 -0
  48. package/esm/ai/src/errors/content-filter-error.mjs.map +1 -0
  49. package/esm/ai/src/errors/context-length-exceeded-error.mjs +31 -0
  50. package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +1 -0
  51. package/esm/ai/src/errors/guardrail-violation-error.mjs +41 -0
  52. package/esm/ai/src/errors/guardrail-violation-error.mjs.map +1 -0
  53. package/esm/ai/src/errors/index.mjs +37 -0
  54. package/esm/ai/src/errors/invalid-request-error.mjs +31 -0
  55. package/esm/ai/src/errors/invalid-request-error.mjs.map +1 -0
  56. package/esm/ai/src/errors/max-iterations-error.mjs +32 -0
  57. package/esm/ai/src/errors/max-iterations-error.mjs.map +1 -0
  58. package/esm/ai/src/errors/max-steps-exceeded-error.mjs +21 -0
  59. package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +1 -0
  60. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +31 -0
  61. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +1 -0
  62. package/esm/ai/src/errors/orchestrator-config-error.mjs +30 -0
  63. package/esm/ai/src/errors/orchestrator-config-error.mjs.map +1 -0
  64. package/esm/ai/src/errors/orchestrator-drift-error.mjs +37 -0
  65. package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +1 -0
  66. package/esm/ai/src/errors/orchestrator-failed-error.mjs +36 -0
  67. package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +1 -0
  68. package/esm/ai/src/errors/outbound-policy-error.mjs +32 -0
  69. package/esm/ai/src/errors/outbound-policy-error.mjs.map +1 -0
  70. package/esm/ai/src/errors/planner-cancelled-error.mjs +29 -0
  71. package/esm/ai/src/errors/planner-cancelled-error.mjs.map +1 -0
  72. package/esm/ai/src/errors/planner-failed-error.mjs +37 -0
  73. package/esm/ai/src/errors/planner-failed-error.mjs.map +1 -0
  74. package/esm/ai/src/errors/planner-plan-invalid-error.mjs +25 -0
  75. package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +1 -0
  76. package/esm/ai/src/errors/provider-auth-error.mjs +26 -0
  77. package/esm/ai/src/errors/provider-auth-error.mjs.map +1 -0
  78. package/esm/ai/src/errors/provider-error.mjs +42 -0
  79. package/esm/ai/src/errors/provider-error.mjs.map +1 -0
  80. package/esm/ai/src/errors/provider-rate-limit-error.mjs +31 -0
  81. package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +1 -0
  82. package/esm/ai/src/errors/provider-timeout-error.mjs +26 -0
  83. package/esm/ai/src/errors/provider-timeout-error.mjs.map +1 -0
  84. package/esm/ai/src/errors/quota-exceeded-error.mjs +40 -0
  85. package/esm/ai/src/errors/quota-exceeded-error.mjs.map +1 -0
  86. package/esm/ai/src/errors/routing-error.mjs +23 -0
  87. package/esm/ai/src/errors/routing-error.mjs.map +1 -0
  88. package/esm/ai/src/errors/schema-validation-error.mjs +37 -0
  89. package/esm/ai/src/errors/schema-validation-error.mjs.map +1 -0
  90. package/esm/ai/src/errors/step-failed-error.mjs +19 -0
  91. package/esm/ai/src/errors/step-failed-error.mjs.map +1 -0
  92. package/esm/ai/src/errors/supervisor-cancelled-error.mjs +29 -0
  93. package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +1 -0
  94. package/esm/ai/src/errors/supervisor-drift-error.mjs +30 -0
  95. package/esm/ai/src/errors/supervisor-drift-error.mjs.map +1 -0
  96. package/esm/ai/src/errors/supervisor-failed-error.mjs +43 -0
  97. package/esm/ai/src/errors/supervisor-failed-error.mjs.map +1 -0
  98. package/esm/ai/src/errors/supervisor-routing-error.mjs +39 -0
  99. package/esm/ai/src/errors/supervisor-routing-error.mjs.map +1 -0
  100. package/esm/ai/src/errors/tool-execution-error.mjs +32 -0
  101. package/esm/ai/src/errors/tool-execution-error.mjs.map +1 -0
  102. package/esm/ai/src/errors/workflow-cancelled-error.mjs +23 -0
  103. package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +1 -0
  104. package/esm/ai/src/errors/workflow-drift-error.mjs +24 -0
  105. package/esm/ai/src/errors/workflow-drift-error.mjs.map +1 -0
  106. package/esm/ai/src/errors/workflow-error.mjs +18 -0
  107. package/esm/ai/src/errors/workflow-error.mjs.map +1 -0
  108. package/esm/ai/src/eval/dataset.mjs +112 -0
  109. package/esm/ai/src/eval/dataset.mjs.map +1 -0
  110. package/esm/ai/src/eval/eval-runner.mjs +135 -0
  111. package/esm/ai/src/eval/eval-runner.mjs.map +1 -0
  112. package/esm/ai/src/eval/index.mjs +48 -0
  113. package/esm/ai/src/eval/index.mjs.map +1 -0
  114. package/esm/ai/src/eval/judge-scorer.mjs +87 -0
  115. package/esm/ai/src/eval/judge-scorer.mjs.map +1 -0
  116. package/esm/ai/src/eval/regression.mjs +51 -0
  117. package/esm/ai/src/eval/regression.mjs.map +1 -0
  118. package/esm/ai/src/eval/report-json.mjs +33 -0
  119. package/esm/ai/src/eval/report-json.mjs.map +1 -0
  120. package/esm/ai/src/eval/report-junit.mjs +60 -0
  121. package/esm/ai/src/eval/report-junit.mjs.map +1 -0
  122. package/esm/ai/src/eval/scorers.mjs +101 -0
  123. package/esm/ai/src/eval/scorers.mjs.map +1 -0
  124. package/esm/ai/src/guard/detectors/index.mjs +6 -0
  125. package/esm/ai/src/guard/detectors/injection.mjs +254 -0
  126. package/esm/ai/src/guard/detectors/injection.mjs.map +1 -0
  127. package/esm/ai/src/guard/detectors/moderation.mjs +134 -0
  128. package/esm/ai/src/guard/detectors/moderation.mjs.map +1 -0
  129. package/esm/ai/src/guard/detectors/pii.mjs +199 -0
  130. package/esm/ai/src/guard/detectors/pii.mjs.map +1 -0
  131. package/esm/ai/src/guard/detectors/topic.mjs +99 -0
  132. package/esm/ai/src/guard/detectors/topic.mjs.map +1 -0
  133. package/esm/ai/src/guard/errors.mjs +18 -0
  134. package/esm/ai/src/guard/errors.mjs.map +1 -0
  135. package/esm/ai/src/guard/guard.mjs +209 -0
  136. package/esm/ai/src/guard/guard.mjs.map +1 -0
  137. package/esm/ai/src/guard/guardrail.mjs +22 -0
  138. package/esm/ai/src/guard/guardrail.mjs.map +1 -0
  139. package/esm/ai/src/human/errors.mjs +60 -0
  140. package/esm/ai/src/human/errors.mjs.map +1 -0
  141. package/esm/ai/src/human/human-approval.mjs +170 -0
  142. package/esm/ai/src/human/human-approval.mjs.map +1 -0
  143. package/esm/ai/src/human/policy.mjs +67 -0
  144. package/esm/ai/src/human/policy.mjs.map +1 -0
  145. package/esm/ai/src/human/register.mjs +37 -0
  146. package/esm/ai/src/human/register.mjs.map +1 -0
  147. package/esm/ai/src/human/resume-seed.mjs +53 -0
  148. package/esm/ai/src/human/resume-seed.mjs.map +1 -0
  149. package/esm/ai/src/human/resume.mjs +121 -0
  150. package/esm/ai/src/human/resume.mjs.map +1 -0
  151. package/esm/ai/src/human/stores/index.mjs +5 -0
  152. package/esm/ai/src/human/stores/memory.mjs +91 -0
  153. package/esm/ai/src/human/stores/memory.mjs.map +1 -0
  154. package/esm/ai/src/human/stores/pg.mjs +220 -0
  155. package/esm/ai/src/human/stores/pg.mjs.map +1 -0
  156. package/esm/ai/src/human/stores/redis.mjs +201 -0
  157. package/esm/ai/src/human/stores/redis.mjs.map +1 -0
  158. package/esm/ai/src/index.mjs +174 -0
  159. package/esm/ai/src/memory/derive-id.mjs +24 -0
  160. package/esm/ai/src/memory/derive-id.mjs.map +1 -0
  161. package/esm/ai/src/memory/episodic-memory.mjs +106 -0
  162. package/esm/ai/src/memory/episodic-memory.mjs.map +1 -0
  163. package/esm/ai/src/memory/memory.mjs +166 -0
  164. package/esm/ai/src/memory/memory.mjs.map +1 -0
  165. package/esm/ai/src/memory/procedural-memory.mjs +103 -0
  166. package/esm/ai/src/memory/procedural-memory.mjs.map +1 -0
  167. package/esm/ai/src/memory/semantic-memory.mjs +80 -0
  168. package/esm/ai/src/memory/semantic-memory.mjs.map +1 -0
  169. package/esm/ai/src/memory/working-memory.mjs +62 -0
  170. package/esm/ai/src/memory/working-memory.mjs.map +1 -0
  171. package/esm/ai/src/middleware/builtins/budget.mjs +219 -0
  172. package/esm/ai/src/middleware/builtins/budget.mjs.map +1 -0
  173. package/esm/ai/src/middleware/builtins/guardrail.mjs +76 -0
  174. package/esm/ai/src/middleware/builtins/guardrail.mjs.map +1 -0
  175. package/esm/ai/src/middleware/builtins/semantic-cache.mjs +149 -0
  176. package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +1 -0
  177. package/esm/ai/src/middleware/helpers/compose.mjs +52 -0
  178. package/esm/ai/src/middleware/helpers/compose.mjs.map +1 -0
  179. package/esm/ai/src/middleware/helpers/for-tool.mjs +80 -0
  180. package/esm/ai/src/middleware/helpers/for-tool.mjs.map +1 -0
  181. package/esm/ai/src/middleware/index.mjs +10 -0
  182. package/esm/ai/src/middleware/pipeline.mjs +100 -0
  183. package/esm/ai/src/middleware/pipeline.mjs.map +1 -0
  184. package/esm/ai/src/middleware/utils/extract-user-text.mjs +47 -0
  185. package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +1 -0
  186. package/esm/ai/src/middleware/utils/namespaced-state.mjs +60 -0
  187. package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +1 -0
  188. package/esm/ai/src/mock/index.mjs +4 -0
  189. package/esm/ai/src/mock/mock-agent.mjs +3 -0
  190. package/esm/ai/src/mock/mock-router.mjs +58 -0
  191. package/esm/ai/src/mock/mock-router.mjs.map +1 -0
  192. package/esm/ai/src/model/fallback-model.mjs +218 -0
  193. package/esm/ai/src/model/fallback-model.mjs.map +1 -0
  194. package/esm/ai/src/model/index.mjs +3 -0
  195. package/esm/ai/src/object-stream/index.mjs +4 -0
  196. package/esm/ai/src/object-stream/parse-partial-json.mjs +78 -0
  197. package/esm/ai/src/object-stream/parse-partial-json.mjs.map +1 -0
  198. package/esm/ai/src/object-stream/stream-object.mjs +97 -0
  199. package/esm/ai/src/object-stream/stream-object.mjs.map +1 -0
  200. package/esm/ai/src/observe/index.mjs +4 -0
  201. package/esm/ai/src/observe/observer-registry.mjs +35 -0
  202. package/esm/ai/src/observe/observer-registry.mjs.map +1 -0
  203. package/esm/ai/src/observe/resolve-observers.mjs +73 -0
  204. package/esm/ai/src/observe/resolve-observers.mjs.map +1 -0
  205. package/esm/ai/src/orchestrator/as-tool.mjs +98 -0
  206. package/esm/ai/src/orchestrator/as-tool.mjs.map +1 -0
  207. package/esm/ai/src/orchestrator/checkpoint.mjs +75 -0
  208. package/esm/ai/src/orchestrator/checkpoint.mjs.map +1 -0
  209. package/esm/ai/src/orchestrator/commands.mjs +34 -0
  210. package/esm/ai/src/orchestrator/commands.mjs.map +1 -0
  211. package/esm/ai/src/orchestrator/compaction.mjs +206 -0
  212. package/esm/ai/src/orchestrator/compaction.mjs.map +1 -0
  213. package/esm/ai/src/orchestrator/dispatch.mjs +171 -0
  214. package/esm/ai/src/orchestrator/dispatch.mjs.map +1 -0
  215. package/esm/ai/src/orchestrator/emitter.mjs +85 -0
  216. package/esm/ai/src/orchestrator/emitter.mjs.map +1 -0
  217. package/esm/ai/src/orchestrator/execution.mjs +395 -0
  218. package/esm/ai/src/orchestrator/execution.mjs.map +1 -0
  219. package/esm/ai/src/orchestrator/index.mjs +11 -0
  220. package/esm/ai/src/orchestrator/load.mjs +49 -0
  221. package/esm/ai/src/orchestrator/load.mjs.map +1 -0
  222. package/esm/ai/src/orchestrator/lock.mjs +75 -0
  223. package/esm/ai/src/orchestrator/lock.mjs.map +1 -0
  224. package/esm/ai/src/orchestrator/memory.mjs +141 -0
  225. package/esm/ai/src/orchestrator/memory.mjs.map +1 -0
  226. package/esm/ai/src/orchestrator/orchestrator-stream.mjs +98 -0
  227. package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +1 -0
  228. package/esm/ai/src/orchestrator/orchestrator.mjs +206 -0
  229. package/esm/ai/src/orchestrator/orchestrator.mjs.map +1 -0
  230. package/esm/ai/src/orchestrator/resume.mjs +74 -0
  231. package/esm/ai/src/orchestrator/resume.mjs.map +1 -0
  232. package/esm/ai/src/orchestrator/session-lock.mjs +83 -0
  233. package/esm/ai/src/orchestrator/session-lock.mjs.map +1 -0
  234. package/esm/ai/src/orchestrator/signature.mjs +120 -0
  235. package/esm/ai/src/orchestrator/signature.mjs.map +1 -0
  236. package/esm/ai/src/orchestrator/window.mjs +56 -0
  237. package/esm/ai/src/orchestrator/window.mjs.map +1 -0
  238. package/esm/ai/src/planner/dag-scheduler.mjs +97 -0
  239. package/esm/ai/src/planner/dag-scheduler.mjs.map +1 -0
  240. package/esm/ai/src/planner/index.mjs +6 -0
  241. package/esm/ai/src/planner/plan-prompt.mjs +31 -0
  242. package/esm/ai/src/planner/plan-prompt.mjs.map +1 -0
  243. package/esm/ai/src/planner/plan-schema.mjs +120 -0
  244. package/esm/ai/src/planner/plan-schema.mjs.map +1 -0
  245. package/esm/ai/src/planner/planner-run.mjs +614 -0
  246. package/esm/ai/src/planner/planner-run.mjs.map +1 -0
  247. package/esm/ai/src/planner/planner.mjs +120 -0
  248. package/esm/ai/src/planner/planner.mjs.map +1 -0
  249. package/esm/ai/src/planner/signature.mjs +27 -0
  250. package/esm/ai/src/planner/signature.mjs.map +1 -0
  251. package/esm/ai/src/prompt/errors.mjs +73 -0
  252. package/esm/ai/src/prompt/errors.mjs.map +1 -0
  253. package/esm/ai/src/prompt/index.mjs +4 -0
  254. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +104 -0
  255. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +1 -0
  256. package/esm/ai/src/prompt/prompt-validate.mjs +170 -0
  257. package/esm/ai/src/prompt/prompt-validate.mjs.map +1 -0
  258. package/esm/ai/src/prompt/prompt.mjs +218 -0
  259. package/esm/ai/src/prompt/prompt.mjs.map +1 -0
  260. package/esm/ai/src/prompts/index.mjs +3 -0
  261. package/esm/ai/src/prompts/prompts-manager.mjs +410 -0
  262. package/esm/ai/src/prompts/prompts-manager.mjs.map +1 -0
  263. package/esm/ai/src/prompts/prompts-validate.mjs +200 -0
  264. package/esm/ai/src/prompts/prompts-validate.mjs.map +1 -0
  265. package/esm/ai/src/rag/as-tool.mjs +48 -0
  266. package/esm/ai/src/rag/as-tool.mjs.map +1 -0
  267. package/esm/ai/src/rag/chunk/chunk.mjs +44 -0
  268. package/esm/ai/src/rag/chunk/chunk.mjs.map +1 -0
  269. package/esm/ai/src/rag/chunk/fixed.mjs +32 -0
  270. package/esm/ai/src/rag/chunk/fixed.mjs.map +1 -0
  271. package/esm/ai/src/rag/chunk/markdown.mjs +75 -0
  272. package/esm/ai/src/rag/chunk/markdown.mjs.map +1 -0
  273. package/esm/ai/src/rag/chunk/recursive.mjs +132 -0
  274. package/esm/ai/src/rag/chunk/recursive.mjs.map +1 -0
  275. package/esm/ai/src/rag/chunk/sentence.mjs +73 -0
  276. package/esm/ai/src/rag/chunk/sentence.mjs.map +1 -0
  277. package/esm/ai/src/rag/index.mjs +7 -0
  278. package/esm/ai/src/rag/rag.mjs +126 -0
  279. package/esm/ai/src/rag/rag.mjs.map +1 -0
  280. package/esm/ai/src/rag/rerank/keyword-reranker.mjs +58 -0
  281. package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +1 -0
  282. package/esm/ai/src/rag/rerank/llm-reranker.mjs +85 -0
  283. package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +1 -0
  284. package/esm/ai/src/rag/retrieve.mjs +68 -0
  285. package/esm/ai/src/rag/retrieve.mjs.map +1 -0
  286. package/esm/ai/src/rag/store/cache-vector-store.mjs +48 -0
  287. package/esm/ai/src/rag/store/cache-vector-store.mjs.map +1 -0
  288. package/esm/ai/src/security/index.mjs +5 -0
  289. package/esm/ai/src/security/outbound-policy.mjs +187 -0
  290. package/esm/ai/src/security/outbound-policy.mjs.map +1 -0
  291. package/esm/ai/src/security/private-ip.mjs +48 -0
  292. package/esm/ai/src/security/private-ip.mjs.map +1 -0
  293. package/esm/ai/src/security/redact.mjs +60 -0
  294. package/esm/ai/src/security/redact.mjs.map +1 -0
  295. package/esm/ai/src/serve/serve.mjs +90 -0
  296. package/esm/ai/src/serve/serve.mjs.map +1 -0
  297. package/esm/ai/src/serve/sse.mjs +25 -0
  298. package/esm/ai/src/serve/sse.mjs.map +1 -0
  299. package/esm/ai/src/serve/stream-to-sse.mjs +37 -0
  300. package/esm/ai/src/serve/stream-to-sse.mjs.map +1 -0
  301. package/esm/ai/src/skills/catalog.mjs +140 -0
  302. package/esm/ai/src/skills/catalog.mjs.map +1 -0
  303. package/esm/ai/src/skills/index.mjs +11 -0
  304. package/esm/ai/src/skills/load-skill-tool.mjs +65 -0
  305. package/esm/ai/src/skills/load-skill-tool.mjs.map +1 -0
  306. package/esm/ai/src/skills/save-skill-tool.mjs +65 -0
  307. package/esm/ai/src/skills/save-skill-tool.mjs.map +1 -0
  308. package/esm/ai/src/skills/skills.mjs +109 -0
  309. package/esm/ai/src/skills/skills.mjs.map +1 -0
  310. package/esm/ai/src/skills/sources/directory-source.mjs +108 -0
  311. package/esm/ai/src/skills/sources/directory-source.mjs.map +1 -0
  312. package/esm/ai/src/skills/sources/index.mjs +27 -0
  313. package/esm/ai/src/skills/sources/index.mjs.map +1 -0
  314. package/esm/ai/src/skills/sources/parse-frontmatter.mjs +46 -0
  315. package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +1 -0
  316. package/esm/ai/src/skills/sources/store-source.mjs +15 -0
  317. package/esm/ai/src/skills/sources/store-source.mjs.map +1 -0
  318. package/esm/ai/src/skills/sources/url-source.mjs +117 -0
  319. package/esm/ai/src/skills/sources/url-source.mjs.map +1 -0
  320. package/esm/ai/src/snapshot/memory.mjs +81 -0
  321. package/esm/ai/src/snapshot/memory.mjs.map +1 -0
  322. package/esm/ai/src/snapshot/pg.mjs +146 -0
  323. package/esm/ai/src/snapshot/pg.mjs.map +1 -0
  324. package/esm/ai/src/snapshot/redis.mjs +101 -0
  325. package/esm/ai/src/snapshot/redis.mjs.map +1 -0
  326. package/esm/ai/src/supervisor/as-tool.mjs +74 -0
  327. package/esm/ai/src/supervisor/as-tool.mjs.map +1 -0
  328. package/esm/ai/src/supervisor/cancellation.mjs +22 -0
  329. package/esm/ai/src/supervisor/cancellation.mjs.map +1 -0
  330. package/esm/ai/src/supervisor/decide.mjs +272 -0
  331. package/esm/ai/src/supervisor/decide.mjs.map +1 -0
  332. package/esm/ai/src/supervisor/emitter.mjs +47 -0
  333. package/esm/ai/src/supervisor/emitter.mjs.map +1 -0
  334. package/esm/ai/src/supervisor/entries.mjs +206 -0
  335. package/esm/ai/src/supervisor/entries.mjs.map +1 -0
  336. package/esm/ai/src/supervisor/execution.mjs +1921 -0
  337. package/esm/ai/src/supervisor/execution.mjs.map +1 -0
  338. package/esm/ai/src/supervisor/fan-out.mjs +65 -0
  339. package/esm/ai/src/supervisor/fan-out.mjs.map +1 -0
  340. package/esm/ai/src/supervisor/index.mjs +14 -0
  341. package/esm/ai/src/supervisor/router-factory.mjs +141 -0
  342. package/esm/ai/src/supervisor/router-factory.mjs.map +1 -0
  343. package/esm/ai/src/supervisor/router-prompt.mjs +52 -0
  344. package/esm/ai/src/supervisor/router-prompt.mjs.map +1 -0
  345. package/esm/ai/src/supervisor/signature.mjs +89 -0
  346. package/esm/ai/src/supervisor/signature.mjs.map +1 -0
  347. package/esm/ai/src/supervisor/snapshot.mjs +69 -0
  348. package/esm/ai/src/supervisor/snapshot.mjs.map +1 -0
  349. package/esm/ai/src/supervisor/supervisor-stream.mjs +89 -0
  350. package/esm/ai/src/supervisor/supervisor-stream.mjs.map +1 -0
  351. package/esm/ai/src/supervisor/supervisor.mjs +144 -0
  352. package/esm/ai/src/supervisor/supervisor.mjs.map +1 -0
  353. package/esm/ai/src/system-prompt/index.mjs +6 -0
  354. package/esm/ai/src/system-prompt/instruction.mjs +57 -0
  355. package/esm/ai/src/system-prompt/instruction.mjs.map +1 -0
  356. package/esm/ai/src/system-prompt/persona.mjs +57 -0
  357. package/esm/ai/src/system-prompt/persona.mjs.map +1 -0
  358. package/esm/ai/src/system-prompt/render-placeholders.mjs +58 -0
  359. package/esm/ai/src/system-prompt/render-placeholders.mjs.map +1 -0
  360. package/esm/ai/src/system-prompt/system-prompt.mjs +267 -0
  361. package/esm/ai/src/system-prompt/system-prompt.mjs.map +1 -0
  362. package/esm/ai/src/team/gates.mjs +48 -0
  363. package/esm/ai/src/team/gates.mjs.map +1 -0
  364. package/esm/ai/src/team/index.mjs +3 -0
  365. package/esm/ai/src/team/team.mjs +94 -0
  366. package/esm/ai/src/team/team.mjs.map +1 -0
  367. package/esm/ai/src/tool/executable-as-tool.mjs +81 -0
  368. package/esm/ai/src/tool/executable-as-tool.mjs.map +1 -0
  369. package/esm/ai/src/tool/index.mjs +4 -0
  370. package/esm/ai/src/tool/tool.mjs +185 -0
  371. package/esm/ai/src/tool/tool.mjs.map +1 -0
  372. package/esm/ai/src/utils/compute-cost.mjs +112 -0
  373. package/esm/ai/src/utils/compute-cost.mjs.map +1 -0
  374. package/esm/ai/src/utils/extract-json-lenient.mjs +97 -0
  375. package/esm/ai/src/utils/extract-json-lenient.mjs.map +1 -0
  376. package/esm/ai/src/utils/extract-json-payload.mjs +39 -0
  377. package/esm/ai/src/utils/extract-json-payload.mjs.map +1 -0
  378. package/esm/ai/src/utils/generate-run-id.mjs +23 -0
  379. package/esm/ai/src/utils/generate-run-id.mjs.map +1 -0
  380. package/esm/ai/src/utils/index.mjs +12 -0
  381. package/esm/ai/src/utils/json-schema.mjs +89 -0
  382. package/esm/ai/src/utils/json-schema.mjs.map +1 -0
  383. package/esm/ai/src/utils/prepare-attachment-part.mjs +232 -0
  384. package/esm/ai/src/utils/prepare-attachment-part.mjs.map +1 -0
  385. package/esm/ai/src/utils/resolve-attachment.mjs +74 -0
  386. package/esm/ai/src/utils/resolve-attachment.mjs.map +1 -0
  387. package/esm/ai/src/utils/run-context.mjs +89 -0
  388. package/esm/ai/src/utils/run-context.mjs.map +1 -0
  389. package/esm/ai/src/utils/safe-json-parse.mjs +22 -0
  390. package/esm/ai/src/utils/safe-json-parse.mjs.map +1 -0
  391. package/esm/ai/src/utils/stamp-report-lineage.mjs +45 -0
  392. package/esm/ai/src/utils/stamp-report-lineage.mjs.map +1 -0
  393. package/esm/ai/src/vcr/cassette-io.mjs +57 -0
  394. package/esm/ai/src/vcr/cassette-io.mjs.map +1 -0
  395. package/esm/ai/src/vcr/errors.mjs +37 -0
  396. package/esm/ai/src/vcr/errors.mjs.map +1 -0
  397. package/esm/ai/src/vcr/hash-request.mjs +118 -0
  398. package/esm/ai/src/vcr/hash-request.mjs.map +1 -0
  399. package/esm/ai/src/vcr/index.mjs +5 -0
  400. package/esm/ai/src/vcr/vcr.mjs +248 -0
  401. package/esm/ai/src/vcr/vcr.mjs.map +1 -0
  402. package/esm/ai/src/workflow/as-tool.mjs +49 -0
  403. package/esm/ai/src/workflow/as-tool.mjs.map +1 -0
  404. package/esm/ai/src/workflow/cancellation.mjs +44 -0
  405. package/esm/ai/src/workflow/cancellation.mjs.map +1 -0
  406. package/esm/ai/src/workflow/emitter.mjs +40 -0
  407. package/esm/ai/src/workflow/emitter.mjs.map +1 -0
  408. package/esm/ai/src/workflow/engine.mjs +363 -0
  409. package/esm/ai/src/workflow/engine.mjs.map +1 -0
  410. package/esm/ai/src/workflow/index.mjs +5 -0
  411. package/esm/ai/src/workflow/retry.mjs +32 -0
  412. package/esm/ai/src/workflow/retry.mjs.map +1 -0
  413. package/esm/ai/src/workflow/router.mjs +56 -0
  414. package/esm/ai/src/workflow/router.mjs.map +1 -0
  415. package/esm/ai/src/workflow/run-scoped-emitter.mjs +32 -0
  416. package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +1 -0
  417. package/esm/ai/src/workflow/signature.mjs +34 -0
  418. package/esm/ai/src/workflow/signature.mjs.map +1 -0
  419. package/esm/ai/src/workflow/snapshot.mjs +77 -0
  420. package/esm/ai/src/workflow/snapshot.mjs.map +1 -0
  421. package/esm/ai/src/workflow/state.mjs +37 -0
  422. package/esm/ai/src/workflow/state.mjs.map +1 -0
  423. package/esm/ai/src/workflow/step-runner.mjs +370 -0
  424. package/esm/ai/src/workflow/step-runner.mjs.map +1 -0
  425. package/esm/ai/src/workflow/step.mjs +37 -0
  426. package/esm/ai/src/workflow/step.mjs.map +1 -0
  427. package/esm/ai/src/workflow/workflow.mjs +122 -0
  428. package/esm/ai/src/workflow/workflow.mjs.map +1 -0
  429. package/esm/ai-openai/src/embedder.mjs +4 -0
  430. package/esm/ai-openai/src/index.mjs +4 -0
  431. package/esm/ai-openai/src/model.mjs +5 -0
  432. package/esm/ai-openai/src/sdk.mjs +6 -0
  433. package/esm/ai-openai/src/utils/index.mjs +4 -0
  434. package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
  435. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
  436. package/esm/application/application.d.mts +126 -4
  437. package/esm/application/application.d.mts.map +1 -1
  438. package/esm/application/application.mjs +133 -0
  439. package/esm/application/application.mjs.map +1 -1
  440. package/esm/application/index.d.mts +1 -1
  441. package/esm/cli/commands/dev-server.command.mjs +1 -1
  442. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  443. package/esm/cli/commands/generate/templates/stubs.mjs +3 -4
  444. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  445. package/esm/cli/types.d.mts +2 -1
  446. package/esm/cli/types.d.mts.map +1 -1
  447. package/esm/config/config-getter.mjs +5 -5
  448. package/esm/config/config-getter.mjs.map +1 -1
  449. package/esm/config/config-loader.mjs +2 -2
  450. package/esm/config/config-loader.mjs.map +1 -1
  451. package/esm/connectors/access-connector.mjs +2 -2
  452. package/esm/connectors/access-connector.mjs.map +1 -1
  453. package/esm/connectors/ai-connector.d.mts +43 -0
  454. package/esm/connectors/ai-connector.d.mts.map +1 -0
  455. package/esm/connectors/ai-connector.mjs +56 -0
  456. package/esm/connectors/ai-connector.mjs.map +1 -0
  457. package/esm/connectors/cache-connector.d.mts +5 -0
  458. package/esm/connectors/cache-connector.d.mts.map +1 -1
  459. package/esm/connectors/cache-connector.mjs +9 -2
  460. package/esm/connectors/cache-connector.mjs.map +1 -1
  461. package/esm/connectors/connectors-manager.d.mts +6 -2
  462. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  463. package/esm/connectors/connectors-manager.mjs +12 -3
  464. package/esm/connectors/connectors-manager.mjs.map +1 -1
  465. package/esm/connectors/database-connector.mjs +2 -2
  466. package/esm/connectors/database-connector.mjs.map +1 -1
  467. package/esm/connectors/herald-connector.mjs +2 -2
  468. package/esm/connectors/herald-connector.mjs.map +1 -1
  469. package/esm/connectors/http-connector.d.mts +8 -0
  470. package/esm/connectors/http-connector.d.mts.map +1 -1
  471. package/esm/connectors/http-connector.mjs +40 -7
  472. package/esm/connectors/http-connector.mjs.map +1 -1
  473. package/esm/connectors/index.d.mts +1 -0
  474. package/esm/connectors/index.mjs +1 -0
  475. package/esm/connectors/logger-connector.mjs +2 -2
  476. package/esm/connectors/logger-connector.mjs.map +1 -1
  477. package/esm/connectors/mail-connector.mjs +2 -2
  478. package/esm/connectors/mail-connector.mjs.map +1 -1
  479. package/esm/connectors/notifications-connector.mjs +2 -2
  480. package/esm/connectors/notifications-connector.mjs.map +1 -1
  481. package/esm/connectors/socket-connector.d.mts +16 -1
  482. package/esm/connectors/socket-connector.d.mts.map +1 -1
  483. package/esm/connectors/socket-connector.mjs +31 -8
  484. package/esm/connectors/socket-connector.mjs.map +1 -1
  485. package/esm/connectors/storage.connector.d.mts +7 -0
  486. package/esm/connectors/storage.connector.d.mts.map +1 -1
  487. package/esm/connectors/storage.connector.mjs +7 -0
  488. package/esm/connectors/storage.connector.mjs.map +1 -1
  489. package/esm/connectors/types.d.mts +3 -2
  490. package/esm/connectors/types.d.mts.map +1 -1
  491. package/esm/connectors/types.mjs +1 -0
  492. package/esm/connectors/types.mjs.map +1 -1
  493. package/esm/dev-server/development-server.mjs +9 -14
  494. package/esm/dev-server/development-server.mjs.map +1 -1
  495. package/esm/dev-server/file-event-handler.mjs +15 -3
  496. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  497. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  498. package/esm/generations/add-command.action.mjs +61 -12
  499. package/esm/generations/add-command.action.mjs.map +1 -1
  500. package/esm/generations/stubs.mjs +31 -1
  501. package/esm/generations/stubs.mjs.map +1 -1
  502. package/esm/http/config.mjs +2 -2
  503. package/esm/http/config.mjs.map +1 -1
  504. package/esm/http/createHttpApplication.mjs +2 -2
  505. package/esm/http/createHttpApplication.mjs.map +1 -1
  506. package/esm/http/health.d.mts +57 -0
  507. package/esm/http/health.d.mts.map +1 -0
  508. package/esm/http/health.mjs +75 -0
  509. package/esm/http/health.mjs.map +1 -0
  510. package/esm/http/index.d.mts +2 -1
  511. package/esm/http/index.mjs +2 -1
  512. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  513. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  514. package/esm/http/middleware/cache-response-middleware.mjs +15 -6
  515. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  516. package/esm/http/middleware/concurrency-limit.middleware.mjs +2 -0
  517. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  518. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  519. package/esm/http/middleware/idempotency.middleware.mjs +9 -6
  520. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  521. package/esm/http/middleware/inject-request-context.mjs +2 -2
  522. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  523. package/esm/http/middleware/maintenance.middleware.mjs +6 -5
  524. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  525. package/esm/http/plugins.mjs +9 -9
  526. package/esm/http/plugins.mjs.map +1 -1
  527. package/esm/http/request.d.mts +9 -2
  528. package/esm/http/request.d.mts.map +1 -1
  529. package/esm/http/request.mjs +15 -3
  530. package/esm/http/request.mjs.map +1 -1
  531. package/esm/http/response.d.mts +12 -0
  532. package/esm/http/response.d.mts.map +1 -1
  533. package/esm/http/response.mjs +24 -7
  534. package/esm/http/response.mjs.map +1 -1
  535. package/esm/http/server.d.mts +16 -1
  536. package/esm/http/server.d.mts.map +1 -1
  537. package/esm/http/server.mjs +24 -4
  538. package/esm/http/server.mjs.map +1 -1
  539. package/esm/http/types.d.mts +45 -0
  540. package/esm/http/types.d.mts.map +1 -1
  541. package/esm/index.d.mts +10 -5
  542. package/esm/index.mjs +10 -5
  543. package/esm/node_modules/langfuse/lib/index.mjs +1827 -0
  544. package/esm/node_modules/langfuse/lib/index.mjs.map +1 -0
  545. package/esm/node_modules/langfuse-core/lib/index.mjs +1770 -0
  546. package/esm/node_modules/langfuse-core/lib/index.mjs.map +1 -0
  547. package/esm/node_modules/mustache/mustache.mjs +587 -0
  548. package/esm/node_modules/mustache/mustache.mjs.map +1 -0
  549. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +180 -0
  550. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +1 -0
  551. package/esm/node_modules/openai/auth/workload-identity-auth.mjs +80 -0
  552. package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +1 -0
  553. package/esm/node_modules/openai/azure.mjs +82 -0
  554. package/esm/node_modules/openai/azure.mjs.map +1 -0
  555. package/esm/node_modules/openai/client.mjs +638 -0
  556. package/esm/node_modules/openai/client.mjs.map +1 -0
  557. package/esm/node_modules/openai/core/api-promise.mjs +75 -0
  558. package/esm/node_modules/openai/core/api-promise.mjs.map +1 -0
  559. package/esm/node_modules/openai/core/error.mjs +110 -0
  560. package/esm/node_modules/openai/core/error.mjs.map +1 -0
  561. package/esm/node_modules/openai/core/pagination.mjs +160 -0
  562. package/esm/node_modules/openai/core/pagination.mjs.map +1 -0
  563. package/esm/node_modules/openai/core/resource.mjs +10 -0
  564. package/esm/node_modules/openai/core/resource.mjs.map +1 -0
  565. package/esm/node_modules/openai/core/streaming.mjs +238 -0
  566. package/esm/node_modules/openai/core/streaming.mjs.map +1 -0
  567. package/esm/node_modules/openai/index.mjs +8 -0
  568. package/esm/node_modules/openai/internal/decoders/line.mjs +91 -0
  569. package/esm/node_modules/openai/internal/decoders/line.mjs.map +1 -0
  570. package/esm/node_modules/openai/internal/detect-platform.mjs +123 -0
  571. package/esm/node_modules/openai/internal/detect-platform.mjs.map +1 -0
  572. package/esm/node_modules/openai/internal/errors.mjs +26 -0
  573. package/esm/node_modules/openai/internal/errors.mjs.map +1 -0
  574. package/esm/node_modules/openai/internal/headers.mjs +65 -0
  575. package/esm/node_modules/openai/internal/headers.mjs.map +1 -0
  576. package/esm/node_modules/openai/internal/parse.mjs +41 -0
  577. package/esm/node_modules/openai/internal/parse.mjs.map +1 -0
  578. package/esm/node_modules/openai/internal/qs/formats.mjs +12 -0
  579. package/esm/node_modules/openai/internal/qs/formats.mjs.map +1 -0
  580. package/esm/node_modules/openai/internal/qs/stringify.mjs +179 -0
  581. package/esm/node_modules/openai/internal/qs/stringify.mjs.map +1 -0
  582. package/esm/node_modules/openai/internal/qs/utils.mjs +65 -0
  583. package/esm/node_modules/openai/internal/qs/utils.mjs.map +1 -0
  584. package/esm/node_modules/openai/internal/request-options.mjs +11 -0
  585. package/esm/node_modules/openai/internal/request-options.mjs.map +1 -0
  586. package/esm/node_modules/openai/internal/shims.mjs +77 -0
  587. package/esm/node_modules/openai/internal/shims.mjs.map +1 -0
  588. package/esm/node_modules/openai/internal/to-file.mjs +63 -0
  589. package/esm/node_modules/openai/internal/to-file.mjs.map +1 -0
  590. package/esm/node_modules/openai/internal/tslib.mjs +16 -0
  591. package/esm/node_modules/openai/internal/tslib.mjs.map +1 -0
  592. package/esm/node_modules/openai/internal/uploads.mjs +94 -0
  593. package/esm/node_modules/openai/internal/uploads.mjs.map +1 -0
  594. package/esm/node_modules/openai/internal/utils/base64.mjs +22 -0
  595. package/esm/node_modules/openai/internal/utils/base64.mjs.map +1 -0
  596. package/esm/node_modules/openai/internal/utils/bytes.mjs +26 -0
  597. package/esm/node_modules/openai/internal/utils/bytes.mjs.map +1 -0
  598. package/esm/node_modules/openai/internal/utils/env.mjs +16 -0
  599. package/esm/node_modules/openai/internal/utils/env.mjs.map +1 -0
  600. package/esm/node_modules/openai/internal/utils/log.mjs +58 -0
  601. package/esm/node_modules/openai/internal/utils/log.mjs.map +1 -0
  602. package/esm/node_modules/openai/internal/utils/path.mjs +62 -0
  603. package/esm/node_modules/openai/internal/utils/path.mjs.map +1 -0
  604. package/esm/node_modules/openai/internal/utils/query.mjs +10 -0
  605. package/esm/node_modules/openai/internal/utils/query.mjs.map +1 -0
  606. package/esm/node_modules/openai/internal/utils/sleep.mjs +6 -0
  607. package/esm/node_modules/openai/internal/utils/sleep.mjs.map +1 -0
  608. package/esm/node_modules/openai/internal/utils/uuid.mjs +18 -0
  609. package/esm/node_modules/openai/internal/utils/uuid.mjs.map +1 -0
  610. package/esm/node_modules/openai/internal/utils/values.mjs +41 -0
  611. package/esm/node_modules/openai/internal/utils/values.mjs.map +1 -0
  612. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +247 -0
  613. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +1 -0
  614. package/esm/node_modules/openai/lib/AssistantStream.mjs +472 -0
  615. package/esm/node_modules/openai/lib/AssistantStream.mjs.map +1 -0
  616. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +26 -0
  617. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +1 -0
  618. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +423 -0
  619. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +1 -0
  620. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +26 -0
  621. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +1 -0
  622. package/esm/node_modules/openai/lib/EventStream.mjs +163 -0
  623. package/esm/node_modules/openai/lib/EventStream.mjs.map +1 -0
  624. package/esm/node_modules/openai/lib/ResponsesParser.mjs +94 -0
  625. package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +1 -0
  626. package/esm/node_modules/openai/lib/RunnableFunction.mjs +8 -0
  627. package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +1 -0
  628. package/esm/node_modules/openai/lib/Util.mjs +19 -0
  629. package/esm/node_modules/openai/lib/Util.mjs.map +1 -0
  630. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +11 -0
  631. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +1 -0
  632. package/esm/node_modules/openai/lib/parser.mjs +88 -0
  633. package/esm/node_modules/openai/lib/parser.mjs.map +1 -0
  634. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +231 -0
  635. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +1 -0
  636. package/esm/node_modules/openai/resources/admin/admin.mjs +15 -0
  637. package/esm/node_modules/openai/resources/admin/admin.mjs.map +1 -0
  638. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +81 -0
  639. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +1 -0
  640. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +31 -0
  641. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +1 -0
  642. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +153 -0
  643. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +1 -0
  644. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +42 -0
  645. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +1 -0
  646. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +106 -0
  647. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +1 -0
  648. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +88 -0
  649. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +1 -0
  650. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +88 -0
  651. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +1 -0
  652. package/esm/node_modules/openai/resources/admin/organization/invites.mjs +83 -0
  653. package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +1 -0
  654. package/esm/node_modules/openai/resources/admin/organization/organization.mjs +45 -0
  655. package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +1 -0
  656. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +72 -0
  657. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +1 -0
  658. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +78 -0
  659. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +1 -0
  660. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +46 -0
  661. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +1 -0
  662. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +95 -0
  663. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +1 -0
  664. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +91 -0
  665. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +1 -0
  666. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +45 -0
  667. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +1 -0
  668. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +63 -0
  669. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +1 -0
  670. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +137 -0
  671. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +1 -0
  672. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +51 -0
  673. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +1 -0
  674. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +108 -0
  675. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +1 -0
  676. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +112 -0
  677. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +1 -0
  678. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +106 -0
  679. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +1 -0
  680. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +91 -0
  681. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +1 -0
  682. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +118 -0
  683. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +1 -0
  684. package/esm/node_modules/openai/resources/admin/organization/roles.mjs +96 -0
  685. package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +1 -0
  686. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +97 -0
  687. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +1 -0
  688. package/esm/node_modules/openai/resources/admin/organization/usage.mjs +207 -0
  689. package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +1 -0
  690. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +88 -0
  691. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +1 -0
  692. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +82 -0
  693. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +1 -0
  694. package/esm/node_modules/openai/resources/audio/audio.mjs +21 -0
  695. package/esm/node_modules/openai/resources/audio/audio.mjs.map +1 -0
  696. package/esm/node_modules/openai/resources/audio/speech.mjs +39 -0
  697. package/esm/node_modules/openai/resources/audio/speech.mjs.map +1 -0
  698. package/esm/node_modules/openai/resources/audio/transcriptions.mjs +22 -0
  699. package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +1 -0
  700. package/esm/node_modules/openai/resources/audio/translations.mjs +21 -0
  701. package/esm/node_modules/openai/resources/audio/translations.mjs.map +1 -0
  702. package/esm/node_modules/openai/resources/batches.mjs +54 -0
  703. package/esm/node_modules/openai/resources/batches.mjs.map +1 -0
  704. package/esm/node_modules/openai/resources/beta/assistants.mjs +78 -0
  705. package/esm/node_modules/openai/resources/beta/assistants.mjs.map +1 -0
  706. package/esm/node_modules/openai/resources/beta/beta.mjs +24 -0
  707. package/esm/node_modules/openai/resources/beta/beta.mjs.map +1 -0
  708. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +18 -0
  709. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +1 -0
  710. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +49 -0
  711. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +1 -0
  712. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +85 -0
  713. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +1 -0
  714. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +21 -0
  715. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +1 -0
  716. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +33 -0
  717. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +1 -0
  718. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +33 -0
  719. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +1 -0
  720. package/esm/node_modules/openai/resources/beta/threads/messages.mjs +83 -0
  721. package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +1 -0
  722. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +183 -0
  723. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +1 -0
  724. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +45 -0
  725. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +1 -0
  726. package/esm/node_modules/openai/resources/beta/threads/threads.mjs +101 -0
  727. package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +1 -0
  728. package/esm/node_modules/openai/resources/chat/chat.mjs +15 -0
  729. package/esm/node_modules/openai/resources/chat/chat.mjs.map +1 -0
  730. package/esm/node_modules/openai/resources/chat/completions/completions.mjs +123 -0
  731. package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +1 -0
  732. package/esm/node_modules/openai/resources/chat/completions/index.mjs +7 -0
  733. package/esm/node_modules/openai/resources/chat/completions/messages.mjs +35 -0
  734. package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +1 -0
  735. package/esm/node_modules/openai/resources/chat/index.mjs +5 -0
  736. package/esm/node_modules/openai/resources/completions.mjs +20 -0
  737. package/esm/node_modules/openai/resources/completions.mjs.map +1 -0
  738. package/esm/node_modules/openai/resources/containers/containers.mjs +57 -0
  739. package/esm/node_modules/openai/resources/containers/containers.mjs.map +1 -0
  740. package/esm/node_modules/openai/resources/containers/files/content.mjs +23 -0
  741. package/esm/node_modules/openai/resources/containers/files/content.mjs.map +1 -0
  742. package/esm/node_modules/openai/resources/containers/files/files.mjs +63 -0
  743. package/esm/node_modules/openai/resources/containers/files/files.mjs.map +1 -0
  744. package/esm/node_modules/openai/resources/conversations/conversations.mjs +57 -0
  745. package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +1 -0
  746. package/esm/node_modules/openai/resources/conversations/items.mjs +57 -0
  747. package/esm/node_modules/openai/resources/conversations/items.mjs.map +1 -0
  748. package/esm/node_modules/openai/resources/embeddings.mjs +48 -0
  749. package/esm/node_modules/openai/resources/embeddings.mjs.map +1 -0
  750. package/esm/node_modules/openai/resources/evals/evals.mjs +73 -0
  751. package/esm/node_modules/openai/resources/evals/evals.mjs.map +1 -0
  752. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +35 -0
  753. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +1 -0
  754. package/esm/node_modules/openai/resources/evals/runs/runs.mjs +72 -0
  755. package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +1 -0
  756. package/esm/node_modules/openai/resources/files.mjs +111 -0
  757. package/esm/node_modules/openai/resources/files.mjs.map +1 -0
  758. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +15 -0
  759. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +1 -0
  760. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +60 -0
  761. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +1 -0
  762. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +15 -0
  763. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +1 -0
  764. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +102 -0
  765. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +1 -0
  766. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +24 -0
  767. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +1 -0
  768. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +34 -0
  769. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +1 -0
  770. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +148 -0
  771. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +1 -0
  772. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +8 -0
  773. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +1 -0
  774. package/esm/node_modules/openai/resources/graders/grader-models.mjs +8 -0
  775. package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +1 -0
  776. package/esm/node_modules/openai/resources/graders/graders.mjs +15 -0
  777. package/esm/node_modules/openai/resources/graders/graders.mjs.map +1 -0
  778. package/esm/node_modules/openai/resources/images.mjs +46 -0
  779. package/esm/node_modules/openai/resources/images.mjs.map +1 -0
  780. package/esm/node_modules/openai/resources/index.mjs +27 -0
  781. package/esm/node_modules/openai/resources/models.mjs +44 -0
  782. package/esm/node_modules/openai/resources/models.mjs.map +1 -0
  783. package/esm/node_modules/openai/resources/moderations.mjs +23 -0
  784. package/esm/node_modules/openai/resources/moderations.mjs.map +1 -0
  785. package/esm/node_modules/openai/resources/realtime/calls.mjs +79 -0
  786. package/esm/node_modules/openai/resources/realtime/calls.mjs.map +1 -0
  787. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +39 -0
  788. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +1 -0
  789. package/esm/node_modules/openai/resources/realtime/realtime.mjs +18 -0
  790. package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +1 -0
  791. package/esm/node_modules/openai/resources/responses/input-items.mjs +31 -0
  792. package/esm/node_modules/openai/resources/responses/input-items.mjs.map +1 -0
  793. package/esm/node_modules/openai/resources/responses/input-tokens.mjs +27 -0
  794. package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +1 -0
  795. package/esm/node_modules/openai/resources/responses/responses.mjs +110 -0
  796. package/esm/node_modules/openai/resources/responses/responses.mjs.map +1 -0
  797. package/esm/node_modules/openai/resources/skills/content.mjs +22 -0
  798. package/esm/node_modules/openai/resources/skills/content.mjs.map +1 -0
  799. package/esm/node_modules/openai/resources/skills/skills.mjs +69 -0
  800. package/esm/node_modules/openai/resources/skills/skills.mjs.map +1 -0
  801. package/esm/node_modules/openai/resources/skills/versions/content.mjs +23 -0
  802. package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +1 -0
  803. package/esm/node_modules/openai/resources/skills/versions/versions.mjs +58 -0
  804. package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +1 -0
  805. package/esm/node_modules/openai/resources/uploads/parts.mjs +34 -0
  806. package/esm/node_modules/openai/resources/uploads/parts.mjs.map +1 -0
  807. package/esm/node_modules/openai/resources/uploads/uploads.mjs +84 -0
  808. package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +1 -0
  809. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +126 -0
  810. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +1 -0
  811. package/esm/node_modules/openai/resources/vector-stores/files.mjs +147 -0
  812. package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +1 -0
  813. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +87 -0
  814. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +1 -0
  815. package/esm/node_modules/openai/resources/videos.mjs +115 -0
  816. package/esm/node_modules/openai/resources/videos.mjs.map +1 -0
  817. package/esm/node_modules/openai/resources/webhooks/index.mjs +3 -0
  818. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +69 -0
  819. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +1 -0
  820. package/esm/node_modules/openai/resources/webhooks.mjs +4 -0
  821. package/esm/node_modules/openai/streaming.mjs +3 -0
  822. package/esm/node_modules/openai/version.mjs +6 -0
  823. package/esm/node_modules/openai/version.mjs.map +1 -0
  824. package/esm/production/production-builder.mjs +2 -2
  825. package/esm/production/production-builder.mjs.map +1 -1
  826. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +9 -0
  827. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  828. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +32 -5
  829. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  830. package/esm/repositories/adapters/cascade/filter-applicator.mjs +17 -3
  831. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  832. package/esm/repositories/repository.manager.d.mts +11 -1
  833. package/esm/repositories/repository.manager.d.mts.map +1 -1
  834. package/esm/repositories/repository.manager.mjs +79 -25
  835. package/esm/repositories/repository.manager.mjs.map +1 -1
  836. package/esm/router/route-registry.mjs +19 -10
  837. package/esm/router/route-registry.mjs.map +1 -1
  838. package/esm/router/router.d.mts.map +1 -1
  839. package/esm/router/router.mjs +7 -4
  840. package/esm/router/router.mjs.map +1 -1
  841. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  842. package/esm/storage/drivers/cloud-driver.mjs +48 -12
  843. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  844. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  845. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  846. package/esm/storage/drivers/local-driver.d.mts +8 -0
  847. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  848. package/esm/storage/drivers/local-driver.mjs +19 -4
  849. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  850. package/esm/storage/drivers/r2-driver.mjs +1 -1
  851. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  852. package/esm/storage/drivers/s3-driver.mjs +1 -1
  853. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  854. package/esm/storage/index.d.mts +4 -1
  855. package/esm/storage/index.mjs +3 -0
  856. package/esm/storage/scoped-storage.d.mts +8 -4
  857. package/esm/storage/scoped-storage.d.mts.map +1 -1
  858. package/esm/storage/scoped-storage.mjs +21 -6
  859. package/esm/storage/scoped-storage.mjs.map +1 -1
  860. package/esm/storage/storage.d.mts +12 -4
  861. package/esm/storage/storage.d.mts.map +1 -1
  862. package/esm/storage/storage.mjs +23 -9
  863. package/esm/storage/storage.mjs.map +1 -1
  864. package/esm/storage/types.d.mts +33 -5
  865. package/esm/storage/types.d.mts.map +1 -1
  866. package/esm/storage/utils/contain-path.d.mts +23 -0
  867. package/esm/storage/utils/contain-path.d.mts.map +1 -0
  868. package/esm/storage/utils/contain-path.mjs +35 -0
  869. package/esm/storage/utils/contain-path.mjs.map +1 -0
  870. package/esm/storage/utils/safe-fetch.d.mts +68 -0
  871. package/esm/storage/utils/safe-fetch.d.mts.map +1 -0
  872. package/esm/storage/utils/safe-fetch.mjs +205 -0
  873. package/esm/storage/utils/safe-fetch.mjs.map +1 -0
  874. package/esm/storage/utils/storage-error.d.mts +35 -0
  875. package/esm/storage/utils/storage-error.d.mts.map +1 -0
  876. package/esm/storage/utils/storage-error.mjs +17 -0
  877. package/esm/storage/utils/storage-error.mjs.map +1 -0
  878. package/esm/use-cases/use-case-pipeline.mjs +4 -1
  879. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  880. package/esm/use-cases/use-case.mjs +12 -4
  881. package/esm/use-cases/use-case.mjs.map +1 -1
  882. package/esm/use-cases/use-cases-registry.d.mts +12 -4
  883. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  884. package/esm/use-cases/use-cases-registry.mjs +13 -3
  885. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  886. package/esm/utils/environment.d.mts +6 -1
  887. package/esm/utils/environment.d.mts.map +1 -1
  888. package/esm/utils/environment.mjs.map +1 -1
  889. package/esm/utils/index.d.mts +1 -1
  890. package/esm/utils/npm-registry.d.mts +1 -1
  891. package/esm/utils/npm-registry.mjs +2 -2
  892. package/esm/utils/npm-registry.mjs.map +1 -1
  893. package/esm/utils/paths.mjs +2 -2
  894. package/esm/utils/paths.mjs.map +1 -1
  895. package/esm/validation/validateAll.mjs +2 -2
  896. package/esm/validation/validateAll.mjs.map +1 -1
  897. package/llms-full.txt +193 -3
  898. package/llms.txt +2 -1
  899. package/package.json +9 -9
  900. package/skills/add-connector/SKILL.md +6 -1
  901. package/skills/configure-app/SKILL.md +23 -0
  902. package/skills/health-checks/SKILL.md +98 -0
  903. package/skills/use-app-context/SKILL.md +62 -2
@@ -0,0 +1,146 @@
1
+ //#region ../@warlock.js/ai/src/snapshot/pg.ts
2
+ /**
3
+ * Default backing table for the pg snapshot store. Matches the name used
4
+ * in the orchestrator.md §8 reference wiring
5
+ * (`ai.snapshot.pg({ client, table: "warlock_supervisor_snapshots" })`).
6
+ */
7
+ const DEFAULT_TABLE = "warlock_supervisor_snapshots";
8
+ /**
9
+ * Allowed characters in a Postgres identifier (table name). The
10
+ * conservative ASCII subset; anything else is rejected because the table
11
+ * name is interpolated directly into DDL/DML, and an arbitrary string
12
+ * there would be a SQL-injection footgun. Mirrors `@warlock.js/cache`'s
13
+ * `PgCacheDriver`.
14
+ */
15
+ const SAFE_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;
16
+ /**
17
+ * Validate and resolve the table name. Throws on an unsafe identifier so
18
+ * the failure surfaces at construction time, not on the first query.
19
+ */
20
+ function resolveTable(table) {
21
+ const resolved = table ?? DEFAULT_TABLE;
22
+ if (!SAFE_IDENTIFIER.test(resolved)) throw new Error(`Pg snapshot store: invalid table name '${resolved}'. Allowed: [A-Za-z_][A-Za-z0-9_]*.`);
23
+ return resolved;
24
+ }
25
+ /**
26
+ * Coerce a `payload` column value back into a {@link SupervisorSnapshot}.
27
+ * node-postgres parses `JSONB` into a JS value already, but some pool
28
+ * wrappers hand back the raw string — be defensive across both.
29
+ */
30
+ function parsePayload(payload) {
31
+ if (typeof payload === "string") return JSON.parse(payload);
32
+ return payload;
33
+ }
34
+ /**
35
+ * Postgres {@link SnapshotStore} — supervisor run snapshots persisted to a
36
+ * single row per `runId` in a dev-provisioned table (orchestrator.md §8).
37
+ *
38
+ * Owns: durable round-tripping of the {@link SupervisorSnapshot} envelope
39
+ * keyed by `runId`, so a crashed mid-turn `iterate: true` iteration can
40
+ * resume after a restart. Does NOT own: the connection (the caller passes
41
+ * a live `pg.Pool`/`pg.Client` and keeps owning its lifecycle) or schema
42
+ * migration ({@link PgSnapshotStore.schema} returns DDL the dev runs
43
+ * themselves — the framework never auto-migrates, §8.5).
44
+ *
45
+ * Unlike the append-only checkpoint store, a run has exactly one live
46
+ * snapshot, so `save()` upserts on the `run_id` primary key.
47
+ *
48
+ * Front it with the {@link pg} factory — callers never `new` it.
49
+ */
50
+ var PgSnapshotStore = class {
51
+ constructor(options) {
52
+ if (!options || !options.client || typeof options.client.query !== "function") throw new Error("Pg snapshot store requires a 'client' option implementing { query(text, params) } — pass a pg.Pool or pg.Client.");
53
+ this.client = options.client;
54
+ this.table = resolveTable(options.table);
55
+ }
56
+ /**
57
+ * Load the snapshot for a `runId`, or `undefined` when no in-flight run
58
+ * is recorded.
59
+ */
60
+ async load(runId) {
61
+ const { rows } = await this.client.query(`SELECT payload FROM ${this.table} WHERE run_id = $1`, [runId]);
62
+ if (rows.length === 0) return;
63
+ return parsePayload(rows[0].payload);
64
+ }
65
+ /**
66
+ * Persist a snapshot, keyed by its own `runId`. Upserts — a run has
67
+ * exactly one live snapshot, so a second save for the same `runId`
68
+ * overwrites the payload rather than appending.
69
+ */
70
+ async save(snapshot) {
71
+ await this.client.query(`INSERT INTO ${this.table} (run_id, payload, saved_at)
72
+ VALUES ($1, $2::jsonb, now())
73
+ ON CONFLICT (run_id) DO UPDATE
74
+ SET payload = EXCLUDED.payload,
75
+ saved_at = EXCLUDED.saved_at`, [snapshot.runId, JSON.stringify(snapshot)]);
76
+ }
77
+ /**
78
+ * Drop the snapshot for a `runId`.
79
+ */
80
+ async delete(runId) {
81
+ await this.client.query(`DELETE FROM ${this.table} WHERE run_id = $1`, [runId]);
82
+ }
83
+ /**
84
+ * List the known run ids, optionally filtered by a prefix. The `_` and
85
+ * `%` LIKE wildcards in the prefix are escaped so an opaque runId that
86
+ * happens to contain them is matched literally.
87
+ */
88
+ async list(prefix) {
89
+ if (prefix === void 0) {
90
+ const { rows } = await this.client.query(`SELECT run_id FROM ${this.table}`);
91
+ return rows.map((row) => row.run_id);
92
+ }
93
+ const escaped = prefix.replace(/\\/g, "\\\\").replace(/_/g, "\\_").replace(/%/g, "\\%");
94
+ const { rows } = await this.client.query(`SELECT run_id FROM ${this.table} WHERE run_id LIKE $1 ESCAPE '\\'`, [`${escaped}%`]);
95
+ return rows.map((row) => row.run_id);
96
+ }
97
+ /**
98
+ * Return the DDL for this store's backing table. Run once via the
99
+ * caller's migration tooling — the store never auto-migrates (§8.5).
100
+ *
101
+ * @example
102
+ * await pool.query(store.schema());
103
+ */
104
+ schema() {
105
+ return [
106
+ `CREATE TABLE IF NOT EXISTS ${this.table} (`,
107
+ ` run_id TEXT PRIMARY KEY,`,
108
+ ` payload JSONB NOT NULL,`,
109
+ ` saved_at TIMESTAMPTZ NOT NULL DEFAULT now()`,
110
+ `);`,
111
+ `CREATE INDEX IF NOT EXISTS idx_${this.table}_saved_at ON ${this.table} (saved_at);`
112
+ ].join("\n");
113
+ }
114
+ };
115
+ /**
116
+ * Create a Postgres-backed {@link SnapshotStore}. Pass a live
117
+ * `pg.Pool`/`pg.Client` — the store never opens or closes it. Schema is
118
+ * not auto-migrated: run {@link SnapshotStore.schema} through your own
119
+ * migration tool first.
120
+ *
121
+ * @example
122
+ * import { Pool } from "pg";
123
+ * import { ai } from "@warlock.js/ai";
124
+ *
125
+ * const pool = new Pool({ connectionString: process.env.DATABASE_URL });
126
+ *
127
+ * const orchestrator = ai.orchestrator({
128
+ * name: "support",
129
+ * intents: { ... },
130
+ * iterate: true,
131
+ * snapshotStore: ai.snapshot.pg({
132
+ * client: pool,
133
+ * table: "warlock_supervisor_snapshots",
134
+ * }),
135
+ * });
136
+ *
137
+ * // Run once, via your own migration tooling:
138
+ * // await pool.query(orchestrator's store.schema());
139
+ */
140
+ function pg(options) {
141
+ return new PgSnapshotStore(options);
142
+ }
143
+
144
+ //#endregion
145
+ export { pg };
146
+ //# sourceMappingURL=pg.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pg.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/snapshot/pg.ts"],"sourcesContent":["import type {\n PgClientLike,\n SnapshotStore,\n} from \"../contracts/orchestrator/snapshot-store.contract\";\nimport type { SupervisorSnapshot } from \"../contracts/supervisor/supervisor-snapshot.type\";\n\n/**\n * Default backing table for the pg snapshot store. Matches the name used\n * in the orchestrator.md §8 reference wiring\n * (`ai.snapshot.pg({ client, table: \"warlock_supervisor_snapshots\" })`).\n */\nconst DEFAULT_TABLE = \"warlock_supervisor_snapshots\";\n\n/**\n * Allowed characters in a Postgres identifier (table name). The\n * conservative ASCII subset; anything else is rejected because the table\n * name is interpolated directly into DDL/DML, and an arbitrary string\n * there would be a SQL-injection footgun. Mirrors `@warlock.js/cache`'s\n * `PgCacheDriver`.\n */\nconst SAFE_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * Options for {@link pg}. The `client` is an already-built `pg.Pool` /\n * `pg.Client` (anything satisfying {@link PgClientLike}); the store never\n * opens or closes it — connection lifecycle stays with the caller.\n */\nexport type PgSnapshotStoreOptions = {\n /** Pre-built pg client. The store only ever calls `query`. */\n client: PgClientLike;\n /** Table name. Defaults to `warlock_supervisor_snapshots`. */\n table?: string;\n};\n\n/**\n * Validate and resolve the table name. Throws on an unsafe identifier so\n * the failure surfaces at construction time, not on the first query.\n */\nfunction resolveTable(table: string | undefined): string {\n const resolved = table ?? DEFAULT_TABLE;\n\n if (!SAFE_IDENTIFIER.test(resolved)) {\n throw new Error(\n `Pg snapshot store: invalid table name '${resolved}'. Allowed: [A-Za-z_][A-Za-z0-9_]*.`,\n );\n }\n\n return resolved;\n}\n\n/**\n * Coerce a `payload` column value back into a {@link SupervisorSnapshot}.\n * node-postgres parses `JSONB` into a JS value already, but some pool\n * wrappers hand back the raw string — be defensive across both.\n */\nfunction parsePayload(payload: unknown): SupervisorSnapshot {\n if (typeof payload === \"string\") {\n return JSON.parse(payload) as SupervisorSnapshot;\n }\n\n return payload as SupervisorSnapshot;\n}\n\n/**\n * Postgres {@link SnapshotStore} — supervisor run snapshots persisted to a\n * single row per `runId` in a dev-provisioned table (orchestrator.md §8).\n *\n * Owns: durable round-tripping of the {@link SupervisorSnapshot} envelope\n * keyed by `runId`, so a crashed mid-turn `iterate: true` iteration can\n * resume after a restart. Does NOT own: the connection (the caller passes\n * a live `pg.Pool`/`pg.Client` and keeps owning its lifecycle) or schema\n * migration ({@link PgSnapshotStore.schema} returns DDL the dev runs\n * themselves — the framework never auto-migrates, §8.5).\n *\n * Unlike the append-only checkpoint store, a run has exactly one live\n * snapshot, so `save()` upserts on the `run_id` primary key.\n *\n * Front it with the {@link pg} factory — callers never `new` it.\n */\nclass PgSnapshotStore implements SnapshotStore {\n /** The user-supplied pg client. The store only ever calls `query`. */\n private readonly client: PgClientLike;\n\n /** Validated, resolved table name. Safe to interpolate into SQL. */\n private readonly table: string;\n\n public constructor(options: PgSnapshotStoreOptions) {\n if (!options || !options.client || typeof options.client.query !== \"function\") {\n throw new Error(\n \"Pg snapshot store requires a 'client' option implementing { query(text, params) } — pass a pg.Pool or pg.Client.\",\n );\n }\n\n this.client = options.client;\n this.table = resolveTable(options.table);\n }\n\n /**\n * Load the snapshot for a `runId`, or `undefined` when no in-flight run\n * is recorded.\n */\n public async load(runId: string): Promise<SupervisorSnapshot | undefined> {\n const { rows } = await this.client.query(\n `SELECT payload FROM ${this.table} WHERE run_id = $1`,\n [runId],\n );\n\n if (rows.length === 0) {\n return undefined;\n }\n\n return parsePayload((rows[0] as { payload: unknown }).payload);\n }\n\n /**\n * Persist a snapshot, keyed by its own `runId`. Upserts — a run has\n * exactly one live snapshot, so a second save for the same `runId`\n * overwrites the payload rather than appending.\n */\n public async save(snapshot: SupervisorSnapshot): Promise<void> {\n await this.client.query(\n `INSERT INTO ${this.table} (run_id, payload, saved_at)\n VALUES ($1, $2::jsonb, now())\n ON CONFLICT (run_id) DO UPDATE\n SET payload = EXCLUDED.payload,\n saved_at = EXCLUDED.saved_at`,\n [snapshot.runId, JSON.stringify(snapshot)],\n );\n }\n\n /**\n * Drop the snapshot for a `runId`.\n */\n public async delete(runId: string): Promise<void> {\n await this.client.query(`DELETE FROM ${this.table} WHERE run_id = $1`, [\n runId,\n ]);\n }\n\n /**\n * List the known run ids, optionally filtered by a prefix. The `_` and\n * `%` LIKE wildcards in the prefix are escaped so an opaque runId that\n * happens to contain them is matched literally.\n */\n public async list(prefix?: string): Promise<string[]> {\n if (prefix === undefined) {\n const { rows } = await this.client.query(\n `SELECT run_id FROM ${this.table}`,\n );\n\n return rows.map((row) => (row as { run_id: string }).run_id);\n }\n\n const escaped = prefix\n .replace(/\\\\/g, \"\\\\\\\\\")\n .replace(/_/g, \"\\\\_\")\n .replace(/%/g, \"\\\\%\");\n\n const { rows } = await this.client.query(\n `SELECT run_id FROM ${this.table} WHERE run_id LIKE $1 ESCAPE '\\\\'`,\n [`${escaped}%`],\n );\n\n return rows.map((row) => (row as { run_id: string }).run_id);\n }\n\n /**\n * Return the DDL for this store's backing table. Run once via the\n * caller's migration tooling — the store never auto-migrates (§8.5).\n *\n * @example\n * await pool.query(store.schema());\n */\n public schema(): string {\n return [\n `CREATE TABLE IF NOT EXISTS ${this.table} (`,\n ` run_id TEXT PRIMARY KEY,`,\n ` payload JSONB NOT NULL,`,\n ` saved_at TIMESTAMPTZ NOT NULL DEFAULT now()`,\n `);`,\n `CREATE INDEX IF NOT EXISTS idx_${this.table}_saved_at ON ${this.table} (saved_at);`,\n ].join(\"\\n\");\n }\n}\n\n/**\n * Create a Postgres-backed {@link SnapshotStore}. Pass a live\n * `pg.Pool`/`pg.Client` — the store never opens or closes it. Schema is\n * not auto-migrated: run {@link SnapshotStore.schema} through your own\n * migration tool first.\n *\n * @example\n * import { Pool } from \"pg\";\n * import { ai } from \"@warlock.js/ai\";\n *\n * const pool = new Pool({ connectionString: process.env.DATABASE_URL });\n *\n * const orchestrator = ai.orchestrator({\n * name: \"support\",\n * intents: { ... },\n * iterate: true,\n * snapshotStore: ai.snapshot.pg({\n * client: pool,\n * table: \"warlock_supervisor_snapshots\",\n * }),\n * });\n *\n * // Run once, via your own migration tooling:\n * // await pool.query(orchestrator's store.schema());\n */\nexport function pg(options: PgSnapshotStoreOptions): SnapshotStore {\n return new PgSnapshotStore(options);\n}\n"],"mappings":";;;;;;AAWA,MAAM,gBAAgB;;;;;;;;AAStB,MAAM,kBAAkB;;;;;AAkBxB,SAAS,aAAa,OAAmC;CACvD,MAAM,WAAW,SAAS;CAE1B,IAAI,CAAC,gBAAgB,KAAK,QAAQ,GAChC,MAAM,IAAI,MACR,0CAA0C,SAAS,oCACrD;CAGF,OAAO;AACT;;;;;;AAOA,SAAS,aAAa,SAAsC;CAC1D,IAAI,OAAO,YAAY,UACrB,OAAO,KAAK,MAAM,OAAO;CAG3B,OAAO;AACT;;;;;;;;;;;;;;;;;AAkBA,IAAM,kBAAN,MAA+C;CAO7C,AAAO,YAAY,SAAiC;EAClD,IAAI,CAAC,WAAW,CAAC,QAAQ,UAAU,OAAO,QAAQ,OAAO,UAAU,YACjE,MAAM,IAAI,MACR,kHACF;EAGF,KAAK,SAAS,QAAQ;EACtB,KAAK,QAAQ,aAAa,QAAQ,KAAK;CACzC;;;;;CAMA,MAAa,KAAK,OAAwD;EACxE,MAAM,EAAE,SAAS,MAAM,KAAK,OAAO,MACjC,uBAAuB,KAAK,MAAM,qBAClC,CAAC,KAAK,CACR;EAEA,IAAI,KAAK,WAAW,GAClB;EAGF,OAAO,aAAc,KAAK,EAAE,CAA0B,OAAO;CAC/D;;;;;;CAOA,MAAa,KAAK,UAA6C;EAC7D,MAAM,KAAK,OAAO,MAChB,eAAe,KAAK,MAAM;;;;4CAK1B,CAAC,SAAS,OAAO,KAAK,UAAU,QAAQ,CAAC,CAC3C;CACF;;;;CAKA,MAAa,OAAO,OAA8B;EAChD,MAAM,KAAK,OAAO,MAAM,eAAe,KAAK,MAAM,qBAAqB,CACrE,KACF,CAAC;CACH;;;;;;CAOA,MAAa,KAAK,QAAoC;EACpD,IAAI,WAAW,QAAW;GACxB,MAAM,EAAE,SAAS,MAAM,KAAK,OAAO,MACjC,sBAAsB,KAAK,OAC7B;GAEA,OAAO,KAAK,KAAK,QAAS,IAA2B,MAAM;EAC7D;EAEA,MAAM,UAAU,OACb,QAAQ,OAAO,MAAM,CAAC,CACtB,QAAQ,MAAM,KAAK,CAAC,CACpB,QAAQ,MAAM,KAAK;EAEtB,MAAM,EAAE,SAAS,MAAM,KAAK,OAAO,MACjC,sBAAsB,KAAK,MAAM,oCACjC,CAAC,GAAG,QAAQ,EAAE,CAChB;EAEA,OAAO,KAAK,KAAK,QAAS,IAA2B,MAAM;CAC7D;;;;;;;;CASA,AAAO,SAAiB;EACtB,OAAO;GACL,8BAA8B,KAAK,MAAM;GACzC;GACA;GACA;GACA;GACA,kCAAkC,KAAK,MAAM,eAAe,KAAK,MAAM;EACzE,CAAC,CAAC,KAAK,IAAI;CACb;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BA,SAAgB,GAAG,SAAgD;CACjE,OAAO,IAAI,gBAAgB,OAAO;AACpC"}
@@ -0,0 +1,101 @@
1
+ //#region ../@warlock.js/ai/src/snapshot/redis.ts
2
+ /**
3
+ * Default key prefix the redis store prepends to each `runId`. Namespaces
4
+ * the snapshot keys so they coexist with other data in the same Redis
5
+ * database without collision.
6
+ */
7
+ const DEFAULT_PREFIX = "warlock:supervisor:snapshot:";
8
+ /**
9
+ * Redis {@link SnapshotStore} — supervisor run snapshots persisted as one
10
+ * JSON string value per `runId`, under a namespaced key (orchestrator.md
11
+ * §8).
12
+ *
13
+ * Owns: durable round-tripping of the {@link SupervisorSnapshot} envelope
14
+ * keyed by `runId`, so a crashed mid-turn `iterate: true` iteration can
15
+ * resume after a restart. Does NOT own: the connection (the caller passes
16
+ * a live client and keeps owning its lifecycle) or enumeration — the
17
+ * structural {@link RedisClientLike} surface exposes only `get`/`set`/
18
+ * `del`, with no `SCAN`/`KEYS`, so `list()` is intentionally not
19
+ * implemented (the contract allows stores that can't enumerate to omit
20
+ * it). Pair it with a {@link import("../contracts/orchestrator/checkpoint-store.contract").CheckpointStore}
21
+ * for the boot-drain loop, which is where enumeration is actually needed.
22
+ *
23
+ * `save()` overwrites the key — a run has exactly one live snapshot.
24
+ * Redis needs no schema, so {@link RedisSnapshotStore.schema} returns an
25
+ * empty string for uniformity with the other drivers.
26
+ *
27
+ * Front it with the {@link redis} factory — callers never `new` it.
28
+ */
29
+ var RedisSnapshotStore = class {
30
+ constructor(options) {
31
+ if (!options || !options.client || typeof options.client.get !== "function" || typeof options.client.set !== "function" || typeof options.client.del !== "function") throw new Error("Redis snapshot store requires a 'client' option implementing { get, set, del } — pass a connected redis client.");
32
+ this.client = options.client;
33
+ this.prefix = options.prefix ?? DEFAULT_PREFIX;
34
+ }
35
+ /**
36
+ * Build the namespaced Redis key for a `runId`.
37
+ */
38
+ key(runId) {
39
+ return `${this.prefix}${runId}`;
40
+ }
41
+ /**
42
+ * Load the snapshot for a `runId`, or `undefined` when the key is
43
+ * missing. Redis returns `null` for an absent key — converted to
44
+ * `undefined` at the boundary.
45
+ */
46
+ async load(runId) {
47
+ const value = await this.client.get(this.key(runId));
48
+ if (value === null) return;
49
+ return JSON.parse(value);
50
+ }
51
+ /**
52
+ * Persist a snapshot, keyed by its own `runId`. Overwrites any prior
53
+ * snapshot for the same run — a run has exactly one live snapshot.
54
+ */
55
+ async save(snapshot) {
56
+ await this.client.set(this.key(snapshot.runId), JSON.stringify(snapshot));
57
+ }
58
+ /**
59
+ * Drop the snapshot for a `runId`.
60
+ */
61
+ async delete(runId) {
62
+ await this.client.del(this.key(runId));
63
+ }
64
+ /**
65
+ * Redis needs no backing table — there is nothing to migrate. Returns
66
+ * an empty string so callers can treat `schema()` uniformly across
67
+ * drivers.
68
+ */
69
+ schema() {
70
+ return "";
71
+ }
72
+ };
73
+ /**
74
+ * Create a Redis-backed {@link SnapshotStore}. Pass a connected redis
75
+ * client — the store never connects or quits it.
76
+ *
77
+ * Note: this store does not implement the optional `list()` — the
78
+ * structural client surface has no `SCAN`/`KEYS`. Use a checkpoint store
79
+ * for the production boot-drain loop where enumeration is needed.
80
+ *
81
+ * @example
82
+ * import { createClient } from "redis";
83
+ * import { ai } from "@warlock.js/ai";
84
+ *
85
+ * const client = createClient({ url: process.env.REDIS_URL });
86
+ * await client.connect();
87
+ *
88
+ * const orchestrator = ai.orchestrator({
89
+ * name: "support",
90
+ * intents: { ... },
91
+ * iterate: true,
92
+ * snapshotStore: ai.snapshot.redis({ client }),
93
+ * });
94
+ */
95
+ function redis(options) {
96
+ return new RedisSnapshotStore(options);
97
+ }
98
+
99
+ //#endregion
100
+ export { redis };
101
+ //# sourceMappingURL=redis.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/snapshot/redis.ts"],"sourcesContent":["import type {\n RedisClientLike,\n SnapshotStore,\n} from \"../contracts/orchestrator/snapshot-store.contract\";\nimport type { SupervisorSnapshot } from \"../contracts/supervisor/supervisor-snapshot.type\";\n\n/**\n * Default key prefix the redis store prepends to each `runId`. Namespaces\n * the snapshot keys so they coexist with other data in the same Redis\n * database without collision.\n */\nconst DEFAULT_PREFIX = \"warlock:supervisor:snapshot:\";\n\n/**\n * Options for {@link redis}. The `client` is an already-connected redis\n * client (anything satisfying {@link RedisClientLike}); the store never\n * connects or quits it — connection lifecycle stays with the caller.\n */\nexport type RedisSnapshotStoreOptions = {\n /** Pre-connected redis client. The store only calls `get`/`set`/`del`. */\n client: RedisClientLike;\n /**\n * Key prefix prepended to each `runId`. Defaults to\n * `warlock:supervisor:snapshot:`.\n */\n prefix?: string;\n};\n\n/**\n * Redis {@link SnapshotStore} — supervisor run snapshots persisted as one\n * JSON string value per `runId`, under a namespaced key (orchestrator.md\n * §8).\n *\n * Owns: durable round-tripping of the {@link SupervisorSnapshot} envelope\n * keyed by `runId`, so a crashed mid-turn `iterate: true` iteration can\n * resume after a restart. Does NOT own: the connection (the caller passes\n * a live client and keeps owning its lifecycle) or enumeration — the\n * structural {@link RedisClientLike} surface exposes only `get`/`set`/\n * `del`, with no `SCAN`/`KEYS`, so `list()` is intentionally not\n * implemented (the contract allows stores that can't enumerate to omit\n * it). Pair it with a {@link import(\"../contracts/orchestrator/checkpoint-store.contract\").CheckpointStore}\n * for the boot-drain loop, which is where enumeration is actually needed.\n *\n * `save()` overwrites the key — a run has exactly one live snapshot.\n * Redis needs no schema, so {@link RedisSnapshotStore.schema} returns an\n * empty string for uniformity with the other drivers.\n *\n * Front it with the {@link redis} factory — callers never `new` it.\n */\nclass RedisSnapshotStore implements SnapshotStore {\n /** The user-supplied redis client. Only `get`/`set`/`del` are called. */\n private readonly client: RedisClientLike;\n\n /** Key prefix prepended to each `runId`. */\n private readonly prefix: string;\n\n public constructor(options: RedisSnapshotStoreOptions) {\n if (\n !options ||\n !options.client ||\n typeof options.client.get !== \"function\" ||\n typeof options.client.set !== \"function\" ||\n typeof options.client.del !== \"function\"\n ) {\n throw new Error(\n \"Redis snapshot store requires a 'client' option implementing { get, set, del } — pass a connected redis client.\",\n );\n }\n\n this.client = options.client;\n this.prefix = options.prefix ?? DEFAULT_PREFIX;\n }\n\n /**\n * Build the namespaced Redis key for a `runId`.\n */\n private key(runId: string): string {\n return `${this.prefix}${runId}`;\n }\n\n /**\n * Load the snapshot for a `runId`, or `undefined` when the key is\n * missing. Redis returns `null` for an absent key — converted to\n * `undefined` at the boundary.\n */\n public async load(runId: string): Promise<SupervisorSnapshot | undefined> {\n const value = await this.client.get(this.key(runId));\n\n if (value === null) {\n return undefined;\n }\n\n return JSON.parse(value) as SupervisorSnapshot;\n }\n\n /**\n * Persist a snapshot, keyed by its own `runId`. Overwrites any prior\n * snapshot for the same run — a run has exactly one live snapshot.\n */\n public async save(snapshot: SupervisorSnapshot): Promise<void> {\n await this.client.set(this.key(snapshot.runId), JSON.stringify(snapshot));\n }\n\n /**\n * Drop the snapshot for a `runId`.\n */\n public async delete(runId: string): Promise<void> {\n await this.client.del(this.key(runId));\n }\n\n /**\n * Redis needs no backing table — there is nothing to migrate. Returns\n * an empty string so callers can treat `schema()` uniformly across\n * drivers.\n */\n public schema(): string {\n return \"\";\n }\n}\n\n/**\n * Create a Redis-backed {@link SnapshotStore}. Pass a connected redis\n * client — the store never connects or quits it.\n *\n * Note: this store does not implement the optional `list()` — the\n * structural client surface has no `SCAN`/`KEYS`. Use a checkpoint store\n * for the production boot-drain loop where enumeration is needed.\n *\n * @example\n * import { createClient } from \"redis\";\n * import { ai } from \"@warlock.js/ai\";\n *\n * const client = createClient({ url: process.env.REDIS_URL });\n * await client.connect();\n *\n * const orchestrator = ai.orchestrator({\n * name: \"support\",\n * intents: { ... },\n * iterate: true,\n * snapshotStore: ai.snapshot.redis({ client }),\n * });\n */\nexport function redis(options: RedisSnapshotStoreOptions): SnapshotStore {\n return new RedisSnapshotStore(options);\n}\n"],"mappings":";;;;;;AAWA,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;AAsCvB,IAAM,qBAAN,MAAkD;CAOhD,AAAO,YAAY,SAAoC;EACrD,IACE,CAAC,WACD,CAAC,QAAQ,UACT,OAAO,QAAQ,OAAO,QAAQ,cAC9B,OAAO,QAAQ,OAAO,QAAQ,cAC9B,OAAO,QAAQ,OAAO,QAAQ,YAE9B,MAAM,IAAI,MACR,iHACF;EAGF,KAAK,SAAS,QAAQ;EACtB,KAAK,SAAS,QAAQ,UAAU;CAClC;;;;CAKA,AAAQ,IAAI,OAAuB;EACjC,OAAO,GAAG,KAAK,SAAS;CAC1B;;;;;;CAOA,MAAa,KAAK,OAAwD;EACxE,MAAM,QAAQ,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC;EAEnD,IAAI,UAAU,MACZ;EAGF,OAAO,KAAK,MAAM,KAAK;CACzB;;;;;CAMA,MAAa,KAAK,UAA6C;EAC7D,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,SAAS,KAAK,GAAG,KAAK,UAAU,QAAQ,CAAC;CAC1E;;;;CAKA,MAAa,OAAO,OAA8B;EAChD,MAAM,KAAK,OAAO,IAAI,KAAK,IAAI,KAAK,CAAC;CACvC;;;;;;CAOA,AAAO,SAAiB;EACtB,OAAO;CACT;AACF;;;;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,MAAM,SAAmD;CACvE,OAAO,IAAI,mBAAmB,OAAO;AACvC"}
@@ -0,0 +1,74 @@
1
+ import { SupervisorFailedError } from "../errors/supervisor-failed-error.mjs";
2
+ import "../errors/index.mjs";
3
+ import { compositeAsTool } from "../tool/tool.mjs";
4
+
5
+ //#region ../@warlock.js/ai/src/supervisor/as-tool.ts
6
+ /**
7
+ * Wrap a `SupervisorContract` as a `ToolContract` so an outer agent
8
+ * can invoke it from its tool-call loop. Mirrors
9
+ * `workflow.asTool()` / `agent.asTool()` — same composition pattern,
10
+ * same error-normalization behavior.
11
+ *
12
+ * Behavior:
13
+ * - The tool's `name` mirrors the supervisor's `name` unless the
14
+ * caller overrides via `options.name`. Supervisors without a
15
+ * meaningful name throw `SupervisorFailedError` — an outer agent
16
+ * can't route to an anonymous tool.
17
+ * - Tool `input` is the supplied schema; the validated value is
18
+ * coerced to a string (via `String()` for non-string values, or
19
+ * `JSON.stringify()` for objects) before being forwarded to
20
+ * `supervisor.execute(input)`. Consumers whose inputs need
21
+ * richer shaping should pre-format the string themselves.
22
+ * - On `result.error`, the supervisor error is thrown so the tool
23
+ * wrapper catches it and produces a `ToolExecutionError` with
24
+ * `cause` set to the original typed supervisor error — the outer
25
+ * agent sees one uniform error class regardless of which
26
+ * primitive failed.
27
+ *
28
+ * @example
29
+ * const support = ai.supervisor({ ... });
30
+ * const supportTool = support.asTool({
31
+ * name: "handle_support_ticket",
32
+ * description: "Process a customer support ticket end-to-end.",
33
+ * inputSchema: z.object({ ticket: z.string() }),
34
+ * });
35
+ * const concierge = ai.agent({ model, tools: [supportTool] });
36
+ */
37
+ function asTool(supervisorInstance, options) {
38
+ if (!supervisorInstance.name || typeof supervisorInstance.name !== "string") throw new SupervisorFailedError("supervisor.asTool(): supervisor must have a `name` to be wrapped as a tool");
39
+ return compositeAsTool({
40
+ name: options.name ?? supervisorInstance.name,
41
+ description: options.description ?? `Invoke supervisor "${supervisorInstance.name}" as a tool.`,
42
+ input: options.inputSchema,
43
+ execute: async (input, ctx) => {
44
+ const coerced = coerceInput(input);
45
+ const result = await supervisorInstance.execute(coerced, ctx?.signal ? { signal: ctx.signal } : void 0);
46
+ if (result.error) throw result.error;
47
+ return {
48
+ data: result.data,
49
+ usage: result.usage,
50
+ report: result.report
51
+ };
52
+ }
53
+ });
54
+ }
55
+ /**
56
+ * Coerce a tool-input value into the `string` shape supervisor
57
+ * `execute()` expects. Strings pass through; everything else gets
58
+ * JSON-stringified so supervisors invoked via tool wrappers receive a
59
+ * predictable textual input regardless of how the outer agent shaped
60
+ * its call.
61
+ */
62
+ function coerceInput(value) {
63
+ if (typeof value === "string") return value;
64
+ if (value === void 0 || value === null) return "";
65
+ try {
66
+ return JSON.stringify(value);
67
+ } catch {
68
+ return String(value);
69
+ }
70
+ }
71
+
72
+ //#endregion
73
+ export { asTool };
74
+ //# sourceMappingURL=as-tool.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"as-tool.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/supervisor/as-tool.ts"],"sourcesContent":["import type {\n SupervisorAsToolOptions,\n SupervisorContract,\n} from \"../contracts/supervisor/supervisor.contract\";\nimport { SupervisorFailedError } from \"../errors\";\nimport { compositeAsTool, type ToolContract } from \"../tool/tool\";\n\n/**\n * Wrap a `SupervisorContract` as a `ToolContract` so an outer agent\n * can invoke it from its tool-call loop. Mirrors\n * `workflow.asTool()` / `agent.asTool()` — same composition pattern,\n * same error-normalization behavior.\n *\n * Behavior:\n * - The tool's `name` mirrors the supervisor's `name` unless the\n * caller overrides via `options.name`. Supervisors without a\n * meaningful name throw `SupervisorFailedError` — an outer agent\n * can't route to an anonymous tool.\n * - Tool `input` is the supplied schema; the validated value is\n * coerced to a string (via `String()` for non-string values, or\n * `JSON.stringify()` for objects) before being forwarded to\n * `supervisor.execute(input)`. Consumers whose inputs need\n * richer shaping should pre-format the string themselves.\n * - On `result.error`, the supervisor error is thrown so the tool\n * wrapper catches it and produces a `ToolExecutionError` with\n * `cause` set to the original typed supervisor error — the outer\n * agent sees one uniform error class regardless of which\n * primitive failed.\n *\n * @example\n * const support = ai.supervisor({ ... });\n * const supportTool = support.asTool({\n * name: \"handle_support_ticket\",\n * description: \"Process a customer support ticket end-to-end.\",\n * inputSchema: z.object({ ticket: z.string() }),\n * });\n * const concierge = ai.agent({ model, tools: [supportTool] });\n */\nexport function asTool<TOutput, TToolInput>(\n supervisorInstance: SupervisorContract<TOutput>,\n options: SupervisorAsToolOptions<TToolInput>,\n): ToolContract<TToolInput, TOutput> {\n if (!supervisorInstance.name || typeof supervisorInstance.name !== \"string\") {\n throw new SupervisorFailedError(\n \"supervisor.asTool(): supervisor must have a `name` to be wrapped as a tool\",\n );\n }\n\n return compositeAsTool<TToolInput, TOutput>({\n name: options.name ?? supervisorInstance.name,\n description: options.description ?? `Invoke supervisor \"${supervisorInstance.name}\" as a tool.`,\n input: options.inputSchema,\n execute: async (input, ctx) => {\n const coerced = coerceInput(input);\n // Relay the outer agent's cancellation signal so cancelling the\n // parent aborts this nested supervisor run — its mid-iteration\n // aborts then propagate into every in-flight child (C2).\n const result = await supervisorInstance.execute(\n coerced,\n ctx?.signal ? { signal: ctx.signal } : undefined,\n );\n\n if (result.error) {\n // Surface the typed supervisor error — the outer ToolContract\n // wraps it as a ToolExecutionError with `cause` preserved.\n throw result.error;\n }\n\n return {\n data: result.data as TOutput,\n usage: result.usage,\n report: result.report,\n };\n },\n });\n}\n\n/**\n * Coerce a tool-input value into the `string` shape supervisor\n * `execute()` expects. Strings pass through; everything else gets\n * JSON-stringified so supervisors invoked via tool wrappers receive a\n * predictable textual input regardless of how the outer agent shaped\n * its call.\n */\nfunction coerceInput(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n\n if (value === undefined || value === null) {\n return \"\";\n }\n\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsCA,SAAgB,OACd,oBACA,SACmC;CACnC,IAAI,CAAC,mBAAmB,QAAQ,OAAO,mBAAmB,SAAS,UACjE,MAAM,IAAI,sBACR,4EACF;CAGF,OAAO,gBAAqC;EAC1C,MAAM,QAAQ,QAAQ,mBAAmB;EACzC,aAAa,QAAQ,eAAe,sBAAsB,mBAAmB,KAAK;EAClF,OAAO,QAAQ;EACf,SAAS,OAAO,OAAO,QAAQ;GAC7B,MAAM,UAAU,YAAY,KAAK;GAIjC,MAAM,SAAS,MAAM,mBAAmB,QACtC,SACA,KAAK,SAAS,EAAE,QAAQ,IAAI,OAAO,IAAI,MACzC;GAEA,IAAI,OAAO,OAGT,MAAM,OAAO;GAGf,OAAO;IACL,MAAM,OAAO;IACb,OAAO,OAAO;IACd,QAAQ,OAAO;GACjB;EACF;CACF,CAAC;AACH;;;;;;;;AASA,SAAS,YAAY,OAAwB;CAC3C,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,IAAI,UAAU,UAAa,UAAU,MACnC,OAAO;CAGT,IAAI;EACF,OAAO,KAAK,UAAU,KAAK;CAC7B,QAAQ;EACN,OAAO,OAAO,KAAK;CACrB;AACF"}
@@ -0,0 +1,22 @@
1
+ import { SupervisorCancelledError } from "../errors/supervisor-cancelled-error.mjs";
2
+ import "../errors/index.mjs";
3
+
4
+ //#region ../@warlock.js/ai/src/supervisor/cancellation.ts
5
+ /**
6
+ * Build a `SupervisorCancelledError` from an `AbortSignal`. Extracts a
7
+ * human-readable reason from `signal.reason` whether it was a string,
8
+ * an `Error`, or some other value. Used at between-iteration boundaries
9
+ * and on any mid-iteration cancellation path.
10
+ */
11
+ function createCancelledError(signal) {
12
+ const reason = signal?.reason;
13
+ const reasonText = typeof reason === "string" ? reason : reason instanceof Error ? reason.message : reason === void 0 ? "" : String(reason);
14
+ return new SupervisorCancelledError(`supervisor cancelled${reasonText ? `: ${reasonText}` : ""}`, {
15
+ cancelledAt: (/* @__PURE__ */ new Date()).toISOString(),
16
+ reason: reasonText
17
+ });
18
+ }
19
+
20
+ //#endregion
21
+ export { createCancelledError };
22
+ //# sourceMappingURL=cancellation.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cancellation.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/supervisor/cancellation.ts"],"sourcesContent":["import { SupervisorCancelledError } from \"../errors\";\n\n/**\n * Build a `SupervisorCancelledError` from an `AbortSignal`. Extracts a\n * human-readable reason from `signal.reason` whether it was a string,\n * an `Error`, or some other value. Used at between-iteration boundaries\n * and on any mid-iteration cancellation path.\n */\nexport function createCancelledError(\n signal: AbortSignal | undefined,\n): SupervisorCancelledError {\n const reason = signal?.reason;\n const reasonText =\n typeof reason === \"string\"\n ? reason\n : reason instanceof Error\n ? reason.message\n : reason === undefined\n ? \"\"\n : String(reason);\n\n return new SupervisorCancelledError(\n `supervisor cancelled${reasonText ? `: ${reasonText}` : \"\"}`,\n { cancelledAt: new Date().toISOString(), reason: reasonText },\n );\n}\n"],"mappings":";;;;;;;;;;AAQA,SAAgB,qBACd,QAC0B;CAC1B,MAAM,SAAS,QAAQ;CACvB,MAAM,aACJ,OAAO,WAAW,WACd,SACA,kBAAkB,QAChB,OAAO,UACP,WAAW,SACT,KACA,OAAO,MAAM;CAEvB,OAAO,IAAI,yBACT,uBAAuB,aAAa,KAAK,eAAe,MACxD;EAAE,8BAAa,IAAI,KAAK,EAAC,CAAC,YAAY;EAAG,QAAQ;CAAW,CAC9D;AACF"}
@@ -0,0 +1,272 @@
1
+ import { AIError } from "../errors/ai-error.mjs";
2
+ import { SupervisorFailedError } from "../errors/supervisor-failed-error.mjs";
3
+ import { SupervisorRoutingError } from "../errors/supervisor-routing-error.mjs";
4
+ import "../errors/index.mjs";
5
+ import { END } from "../contracts/end.type.mjs";
6
+ import { buildRouterContextMessage } from "./router-prompt.mjs";
7
+
8
+ //#region ../@warlock.js/ai/src/supervisor/decide.ts
9
+ /**
10
+ * Unified dispatch decision entry — calls either the `route` callback
11
+ * or the `router` agent based on the supervisor's configured mode and
12
+ * normalizes the result into a `DispatchDecision`. Runtime validates
13
+ * every routing value against the configured agent keys; unknown keys
14
+ * surface as `SupervisorRoutingError`.
15
+ */
16
+ async function decide(params) {
17
+ if (params.useInitialAgent && params.config.initialAgent) {
18
+ const intent = params.config.initialAgent;
19
+ validateKey(intent, params.entries);
20
+ return {
21
+ kind: "dispatch",
22
+ intents: [intent],
23
+ source: "initialAgent",
24
+ raw: intent,
25
+ durationMs: 0
26
+ };
27
+ }
28
+ if (params.config.route) return decideViaCallback(params);
29
+ if (params.config.router) return decideViaRouter(params);
30
+ throw new SupervisorFailedError(`ai.supervisor("${params.config.name}"): neither \`route\` nor \`router\` is configured — factory validation should have prevented this`, { context: { authoring: true } });
31
+ }
32
+ async function decideViaCallback(params) {
33
+ const started = performance.now();
34
+ const ctx = {
35
+ iteration: params.iteration,
36
+ input: params.input,
37
+ state: params.state,
38
+ iterations: params.iterations,
39
+ feedback: typeof params.evaluateFeedback?.feedback === "string" ? params.evaluateFeedback.feedback : void 0,
40
+ evaluateFeedback: params.evaluateFeedback,
41
+ context: params.context,
42
+ history: params.history,
43
+ goal: params.goal,
44
+ classifier: params.classifier
45
+ };
46
+ let raw;
47
+ try {
48
+ raw = await params.config.route(ctx);
49
+ } catch (thrown) {
50
+ throw wrapRouteError(params.config.name, thrown);
51
+ }
52
+ const durationMs = performance.now() - started;
53
+ return normalize(raw, params.entries, "route", durationMs);
54
+ }
55
+ async function decideViaRouter(params) {
56
+ const { agent, placeholders, inputOverride, historySlicer } = resolveRouterEntry(params.config.router);
57
+ const started = performance.now();
58
+ const routeCtx = {
59
+ iteration: params.iteration,
60
+ input: params.input,
61
+ state: params.state,
62
+ iterations: params.iterations,
63
+ feedback: typeof params.evaluateFeedback?.feedback === "string" ? params.evaluateFeedback.feedback : void 0,
64
+ evaluateFeedback: params.evaluateFeedback,
65
+ context: params.context,
66
+ history: params.history,
67
+ goal: params.goal
68
+ };
69
+ const userMessage = inputOverride?.(routeCtx) ?? buildRouterContextMessage({
70
+ entries: params.entries,
71
+ iteration: params.iteration,
72
+ maxIterations: params.maxIterations,
73
+ iterations: params.iterations,
74
+ input: params.input,
75
+ state: params.state,
76
+ feedback: routeCtx.feedback,
77
+ supervisorPrompt: resolveSupervisorPromptText(params.config),
78
+ goal: params.goal
79
+ });
80
+ const resolvedPlaceholders = placeholders?.(routeCtx);
81
+ const routerHistory = resolveRouterHistory(historySlicer, routeCtx, params.history, params.config.historyWindow?.router);
82
+ const routerResult = await agent.execute(userMessage, {
83
+ signal: params.signal,
84
+ output: ROUTER_OUTPUT_SCHEMA,
85
+ ...resolvedPlaceholders ? { placeholders: resolvedPlaceholders } : {},
86
+ ...routerHistory.length > 0 ? { history: routerHistory } : {}
87
+ });
88
+ const durationMs = performance.now() - started;
89
+ if (routerResult.error) throw routerResult.error instanceof AIError ? routerResult.error : new SupervisorFailedError(`router agent failed`, { cause: routerResult.error });
90
+ const data = routerResult.data;
91
+ if (!data || typeof data !== "object") throw new SupervisorRoutingError(`router agent returned no structured \`next\` — did its output schema include { next, reasoning? }?`, {
92
+ returned: data,
93
+ availableKeys: [...params.entries.keys()]
94
+ });
95
+ const rawNext = data.next;
96
+ const reasoning = data.reasoning;
97
+ if (rawNext === void 0) throw new SupervisorRoutingError(`router agent output missing \`next\` field`, {
98
+ returned: data,
99
+ availableKeys: [...params.entries.keys()]
100
+ });
101
+ return {
102
+ ...normalize(rawNext, params.entries, "router", durationMs),
103
+ reasoning: typeof reasoning === "string" ? reasoning : void 0,
104
+ usage: routerResult.usage,
105
+ routerReport: routerResult.report
106
+ };
107
+ }
108
+ /**
109
+ * Normalize the `router` config field — accepts either a bare
110
+ * `AgentContract` (shorthand) or a full `RouterEntry` — into a
111
+ * uniform `{ agent, placeholders?, inputOverride? }` triple. Centralized
112
+ * so the dispatch path doesn't branch on shape.
113
+ */
114
+ function resolveRouterEntry(router) {
115
+ if (typeof router.execute === "function") return { agent: router };
116
+ const entry = router;
117
+ return {
118
+ agent: entry.agent,
119
+ placeholders: entry.placeholders,
120
+ inputOverride: entry.input,
121
+ historySlicer: entry.history
122
+ };
123
+ }
124
+ /**
125
+ * Resolve the supervisor's own `systemPrompt` (string or contract)
126
+ * into plain text. Returns `undefined` when the supervisor didn't
127
+ * configure one. The resolved text is surfaced in the per-turn
128
+ * router user message so the router sees team/domain context without
129
+ * disturbing the router agent's own factory-level system prompt —
130
+ * functionally equivalent to prepending, without requiring an API
131
+ * expansion on `AgentContract` to read the router's system prompt.
132
+ */
133
+ function resolveSupervisorPromptText(config) {
134
+ if (!config.systemPrompt) return;
135
+ return typeof config.systemPrompt === "string" ? config.systemPrompt : config.systemPrompt.resolve();
136
+ }
137
+ /**
138
+ * Convert the raw routing value (callback return OR router agent
139
+ * `next` field) into a canonical `DispatchDecision`, validating every
140
+ * named intent against the supervisor's `intents` map.
141
+ */
142
+ function normalize(raw, entries, source, durationMs) {
143
+ if (isEnd(raw)) return {
144
+ kind: "end",
145
+ source,
146
+ raw,
147
+ durationMs
148
+ };
149
+ if (typeof raw === "string") {
150
+ validateKey(raw, entries);
151
+ return {
152
+ kind: "dispatch",
153
+ intents: [raw],
154
+ source,
155
+ raw,
156
+ durationMs
157
+ };
158
+ }
159
+ if (Array.isArray(raw)) {
160
+ if (raw.length === 0) throw new SupervisorRoutingError(`router returned an empty array — must be a non-empty list of agent intents`, {
161
+ returned: raw,
162
+ availableKeys: [...entries.keys()]
163
+ });
164
+ for (const intent of raw) {
165
+ if (typeof intent !== "string") throw new SupervisorRoutingError(`router returned a non-string inside its fan-out array`, {
166
+ returned: raw,
167
+ availableKeys: [...entries.keys()]
168
+ });
169
+ validateKey(intent, entries);
170
+ }
171
+ return {
172
+ kind: "dispatch",
173
+ intents: raw,
174
+ source,
175
+ raw,
176
+ durationMs
177
+ };
178
+ }
179
+ throw new SupervisorRoutingError(`router returned an unsupported value — expected a string, string[], or END`, {
180
+ returned: raw,
181
+ availableKeys: [...entries.keys()]
182
+ });
183
+ }
184
+ function validateKey(intent, entries) {
185
+ if (!entries.has(intent)) throw new SupervisorRoutingError(`router returned unknown agent key "${intent}"`, {
186
+ returned: intent,
187
+ availableKeys: [...entries.keys()]
188
+ });
189
+ }
190
+ function isEnd(value) {
191
+ return value === END;
192
+ }
193
+ /**
194
+ * Resolve the history slice forwarded to the router agent. Mirrors
195
+ * `SupervisorExecution.resolveHistoryFor("router", ...)` — duplicated
196
+ * here so the standalone `decide()` function stays callable without
197
+ * threading the execution instance through. Precedence is identical:
198
+ * entry slicer > `historyWindow.router` > full history.
199
+ */
200
+ function resolveRouterHistory(slicer, routeCtx, full, window) {
201
+ if (slicer) {
202
+ const sliced = slicer(routeCtx);
203
+ return sliced ? [...sliced] : [];
204
+ }
205
+ if (window === void 0 || window < 0) return [...full];
206
+ if (window === 0) return [];
207
+ return full.slice(-window);
208
+ }
209
+ /**
210
+ * JSON Schema form of the canonical router output shape. Surfaced via
211
+ * the Standard JSON Schema V1 extension path (`["~standard"].jsonSchema.input`)
212
+ * so `extractJsonSchema()` can pull it for native structured-output
213
+ * enforcement on capable providers (OpenAI strict json_schema mode,
214
+ * Anthropic tool-use shape, etc.). Without this, the model is told to
215
+ * emit JSON only via soft system-prompt instruction — fragile, and
216
+ * skipped entirely when the model advertises `structuredOutput: true`.
217
+ *
218
+ * `next` is intentionally `string` (not a union with arrays) because
219
+ * OpenAI strict mode rejects polymorphic root types — fan-out via
220
+ * `string[]` is still validated at the framework layer; the model
221
+ * just emits a single intent name (or the END sentinel) and the
222
+ * supervisor's own normalizer handles the rest.
223
+ */
224
+ const ROUTER_OUTPUT_JSON_SCHEMA = {
225
+ type: "object",
226
+ properties: {
227
+ next: {
228
+ type: "string",
229
+ description: "Name of the agent to dispatch next, or the END sentinel to terminate the run."
230
+ },
231
+ reasoning: {
232
+ type: "string",
233
+ description: "One-sentence justification for the routing choice."
234
+ }
235
+ },
236
+ required: ["next", "reasoning"],
237
+ additionalProperties: false
238
+ };
239
+ /**
240
+ * Canonical Standard Schema the supervisor injects when calling the
241
+ * router agent. Pragmatic — accepts any `next` shape the router can
242
+ * plausibly emit (`string`, `string[]`, or the `END` literal) plus an
243
+ * optional `reasoning` field. Rejects anything else so a broken
244
+ * router output surfaces cleanly via the agent's own validation path.
245
+ *
246
+ * Exposes `["~standard"].jsonSchema.input()` (Standard JSON Schema V1)
247
+ * so capable providers enforce the shape natively rather than relying
248
+ * on prompt-side coaching.
249
+ */
250
+ const ROUTER_OUTPUT_SCHEMA = { "~standard": {
251
+ version: 1,
252
+ vendor: "warlock-supervisor",
253
+ jsonSchema: { input: () => ROUTER_OUTPUT_JSON_SCHEMA },
254
+ validate(value) {
255
+ if (!value || typeof value !== "object") return { issues: [{ message: "router output must be an object" }] };
256
+ const record = value;
257
+ const rawNext = record.next;
258
+ if (!(typeof rawNext === "string" || Array.isArray(rawNext) && rawNext.every((element) => typeof element === "string"))) return { issues: [{ message: "router output `next` must be a string, string[], or the END sentinel" }] };
259
+ return { value: {
260
+ next: rawNext,
261
+ reasoning: typeof record.reasoning === "string" ? record.reasoning : void 0
262
+ } };
263
+ }
264
+ } };
265
+ function wrapRouteError(supervisorName, thrown) {
266
+ if (thrown instanceof AIError) return thrown;
267
+ return new SupervisorFailedError(`\`route\` callback threw in supervisor "${supervisorName}": ${thrown instanceof Error ? thrown.message : String(thrown)}`, { cause: thrown });
268
+ }
269
+
270
+ //#endregion
271
+ export { decide };
272
+ //# sourceMappingURL=decide.mjs.map