@warlock.js/ai 4.1.15 → 4.2.1

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 (449) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/LICENSE +21 -0
  3. package/cjs/index.cjs +88 -87
  4. package/cjs/index.cjs.map +1 -1
  5. package/esm/agent/agent-config.type.d.mts +1 -1
  6. package/esm/agent/agent-config.type.d.mts.map +1 -1
  7. package/esm/agent/agent-input-builder.mjs +1 -1
  8. package/esm/agent/agent-input-builder.mjs.map +1 -1
  9. package/esm/agent/agent-log-event.mjs +1 -1
  10. package/esm/agent/agent-log-event.mjs.map +1 -1
  11. package/esm/agent/agent-stream.d.mts +1 -1
  12. package/esm/agent/agent-stream.d.mts.map +1 -1
  13. package/esm/agent/agent-stream.mjs +1 -1
  14. package/esm/agent/agent-stream.mjs.map +1 -1
  15. package/esm/agent/agent-to-stream-event.mjs +1 -1
  16. package/esm/agent/agent-to-stream-event.mjs.map +1 -1
  17. package/esm/agent/agent.d.mts +1 -1
  18. package/esm/agent/agent.d.mts.map +1 -1
  19. package/esm/agent/agent.mjs +1 -1
  20. package/esm/agent/agent.mjs.map +1 -1
  21. package/esm/agent/json-stream-guard.mjs +1 -1
  22. package/esm/agent/json-stream-guard.mjs.map +1 -1
  23. package/esm/ai.d.mts +1 -1
  24. package/esm/ai.d.mts.map +1 -1
  25. package/esm/ai.mjs +1 -1
  26. package/esm/ai.mjs.map +1 -1
  27. package/esm/config.d.mts +1 -1
  28. package/esm/config.d.mts.map +1 -1
  29. package/esm/config.mjs +1 -1
  30. package/esm/config.mjs.map +1 -1
  31. package/esm/contracts/agent/agent-options.type.d.mts +1 -1
  32. package/esm/contracts/agent/agent-options.type.d.mts.map +1 -1
  33. package/esm/contracts/agent/agent.contract.d.mts +1 -1
  34. package/esm/contracts/agent/agent.contract.d.mts.map +1 -1
  35. package/esm/contracts/attachment.type.d.mts +1 -1
  36. package/esm/contracts/attachment.type.d.mts.map +1 -1
  37. package/esm/contracts/content-part.type.d.mts +1 -1
  38. package/esm/contracts/content-part.type.d.mts.map +1 -1
  39. package/esm/contracts/conversation-message.type.d.mts +1 -1
  40. package/esm/contracts/conversation-message.type.d.mts.map +1 -1
  41. package/esm/contracts/embedder.contract.d.mts +1 -1
  42. package/esm/contracts/embedder.contract.d.mts.map +1 -1
  43. package/esm/contracts/end.type.d.mts +1 -1
  44. package/esm/contracts/end.type.d.mts.map +1 -1
  45. package/esm/contracts/end.type.mjs +1 -1
  46. package/esm/contracts/end.type.mjs.map +1 -1
  47. package/esm/contracts/events/agent-events.type.d.mts +1 -1
  48. package/esm/contracts/events/agent-events.type.d.mts.map +1 -1
  49. package/esm/contracts/events/complete-event.type.d.mts +1 -1
  50. package/esm/contracts/events/complete-event.type.d.mts.map +1 -1
  51. package/esm/contracts/events/event-identity.type.d.mts +1 -1
  52. package/esm/contracts/events/event-identity.type.d.mts.map +1 -1
  53. package/esm/contracts/events/event-map.type.d.mts +1 -1
  54. package/esm/contracts/events/event-map.type.d.mts.map +1 -1
  55. package/esm/contracts/events/supervisor-events.type.d.mts +1 -1
  56. package/esm/contracts/events/supervisor-events.type.d.mts.map +1 -1
  57. package/esm/contracts/events/usage-event.type.d.mts +1 -1
  58. package/esm/contracts/events/usage-event.type.d.mts.map +1 -1
  59. package/esm/contracts/events/workflow-events.type.d.mts +1 -1
  60. package/esm/contracts/events/workflow-events.type.d.mts.map +1 -1
  61. package/esm/contracts/executable.contract.d.mts +1 -1
  62. package/esm/contracts/executable.contract.d.mts.map +1 -1
  63. package/esm/contracts/finish-reason.type.d.mts +1 -1
  64. package/esm/contracts/finish-reason.type.d.mts.map +1 -1
  65. package/esm/contracts/middleware/middleware-context.type.d.mts +1 -1
  66. package/esm/contracts/middleware/middleware-context.type.d.mts.map +1 -1
  67. package/esm/contracts/middleware/middleware-state.type.d.mts +1 -1
  68. package/esm/contracts/middleware/middleware-state.type.d.mts.map +1 -1
  69. package/esm/contracts/middleware/middleware.contract.d.mts +1 -1
  70. package/esm/contracts/middleware/middleware.contract.d.mts.map +1 -1
  71. package/esm/contracts/model-tool-call-request.type.d.mts +1 -1
  72. package/esm/contracts/model-tool-call-request.type.d.mts.map +1 -1
  73. package/esm/contracts/model.contract.d.mts +1 -1
  74. package/esm/contracts/model.contract.d.mts.map +1 -1
  75. package/esm/contracts/placeholders.type.d.mts +1 -1
  76. package/esm/contracts/placeholders.type.d.mts.map +1 -1
  77. package/esm/contracts/result/agent-result.type.d.mts +1 -1
  78. package/esm/contracts/result/agent-result.type.d.mts.map +1 -1
  79. package/esm/contracts/result/attempt-entry.type.d.mts +1 -1
  80. package/esm/contracts/result/attempt-entry.type.d.mts.map +1 -1
  81. package/esm/contracts/result/base-report.type.d.mts +1 -1
  82. package/esm/contracts/result/base-report.type.d.mts.map +1 -1
  83. package/esm/contracts/result/base-report.type.mjs +1 -1
  84. package/esm/contracts/result/base-report.type.mjs.map +1 -1
  85. package/esm/contracts/result/base-result.type.d.mts +1 -1
  86. package/esm/contracts/result/base-result.type.d.mts.map +1 -1
  87. package/esm/contracts/result/execute-result.type.d.mts +1 -1
  88. package/esm/contracts/result/execute-result.type.d.mts.map +1 -1
  89. package/esm/contracts/result/execution-report.type.d.mts +1 -1
  90. package/esm/contracts/result/execution-report.type.d.mts.map +1 -1
  91. package/esm/contracts/result/llm-trip.type.d.mts +1 -1
  92. package/esm/contracts/result/llm-trip.type.d.mts.map +1 -1
  93. package/esm/contracts/result/model-pricing.type.d.mts +1 -1
  94. package/esm/contracts/result/model-pricing.type.d.mts.map +1 -1
  95. package/esm/contracts/result/session-send-result.type.d.mts +1 -1
  96. package/esm/contracts/result/session-send-result.type.d.mts.map +1 -1
  97. package/esm/contracts/result/step-result.type.d.mts +1 -1
  98. package/esm/contracts/result/step-result.type.d.mts.map +1 -1
  99. package/esm/contracts/result/supervisor-result.type.d.mts +1 -1
  100. package/esm/contracts/result/supervisor-result.type.d.mts.map +1 -1
  101. package/esm/contracts/result/tool-call.type.d.mts +1 -1
  102. package/esm/contracts/result/tool-call.type.d.mts.map +1 -1
  103. package/esm/contracts/result/usage.type.d.mts +1 -1
  104. package/esm/contracts/result/usage.type.d.mts.map +1 -1
  105. package/esm/contracts/result/workflow-result.type.d.mts +1 -1
  106. package/esm/contracts/result/workflow-result.type.d.mts.map +1 -1
  107. package/esm/contracts/sdk-adapter.contract.d.mts +1 -1
  108. package/esm/contracts/sdk-adapter.contract.d.mts.map +1 -1
  109. package/esm/contracts/stream/stream-event.type.d.mts +1 -1
  110. package/esm/contracts/stream/stream-event.type.d.mts.map +1 -1
  111. package/esm/contracts/stream/stream.contract.d.mts +1 -1
  112. package/esm/contracts/stream/stream.contract.d.mts.map +1 -1
  113. package/esm/contracts/streaming-tool-guard-config.type.d.mts +1 -1
  114. package/esm/contracts/streaming-tool-guard-config.type.d.mts.map +1 -1
  115. package/esm/contracts/supervisor/ack-entry.type.d.mts +1 -1
  116. package/esm/contracts/supervisor/ack-entry.type.d.mts.map +1 -1
  117. package/esm/contracts/supervisor/classifier-context.type.d.mts +1 -1
  118. package/esm/contracts/supervisor/classifier-context.type.d.mts.map +1 -1
  119. package/esm/contracts/supervisor/dispatch-context.type.d.mts +1 -1
  120. package/esm/contracts/supervisor/dispatch-context.type.d.mts.map +1 -1
  121. package/esm/contracts/supervisor/evaluate-context.type.d.mts +1 -1
  122. package/esm/contracts/supervisor/evaluate-context.type.d.mts.map +1 -1
  123. package/esm/contracts/supervisor/intent-entry.type.d.mts +1 -1
  124. package/esm/contracts/supervisor/intent-entry.type.d.mts.map +1 -1
  125. package/esm/contracts/supervisor/iteration-snapshot.type.d.mts +1 -1
  126. package/esm/contracts/supervisor/iteration-snapshot.type.d.mts.map +1 -1
  127. package/esm/contracts/supervisor/next.type.d.mts +1 -1
  128. package/esm/contracts/supervisor/next.type.d.mts.map +1 -1
  129. package/esm/contracts/supervisor/route-context.type.d.mts +1 -1
  130. package/esm/contracts/supervisor/route-context.type.d.mts.map +1 -1
  131. package/esm/contracts/supervisor/router-entry.type.d.mts +1 -1
  132. package/esm/contracts/supervisor/router-entry.type.d.mts.map +1 -1
  133. package/esm/contracts/supervisor/supervisor-config.type.d.mts +1 -1
  134. package/esm/contracts/supervisor/supervisor-config.type.d.mts.map +1 -1
  135. package/esm/contracts/supervisor/supervisor-execute-options.type.d.mts +1 -1
  136. package/esm/contracts/supervisor/supervisor-execute-options.type.d.mts.map +1 -1
  137. package/esm/contracts/supervisor/supervisor-input.type.d.mts +1 -1
  138. package/esm/contracts/supervisor/supervisor-input.type.d.mts.map +1 -1
  139. package/esm/contracts/supervisor/supervisor-snapshot.type.d.mts +1 -1
  140. package/esm/contracts/supervisor/supervisor-snapshot.type.d.mts.map +1 -1
  141. package/esm/contracts/supervisor/supervisor-stream-event.type.d.mts +1 -1
  142. package/esm/contracts/supervisor/supervisor-stream-event.type.d.mts.map +1 -1
  143. package/esm/contracts/supervisor/supervisor.contract.d.mts +1 -1
  144. package/esm/contracts/supervisor/supervisor.contract.d.mts.map +1 -1
  145. package/esm/contracts/system-prompt.contract.d.mts +1 -1
  146. package/esm/contracts/system-prompt.contract.d.mts.map +1 -1
  147. package/esm/contracts/tool.contract.d.mts +1 -1
  148. package/esm/contracts/tool.contract.d.mts.map +1 -1
  149. package/esm/contracts/workflow/next-step-result.type.d.mts +1 -1
  150. package/esm/contracts/workflow/next-step-result.type.d.mts.map +1 -1
  151. package/esm/contracts/workflow/retry-config.type.d.mts +1 -1
  152. package/esm/contracts/workflow/retry-config.type.d.mts.map +1 -1
  153. package/esm/contracts/workflow/step.contract.d.mts +1 -1
  154. package/esm/contracts/workflow/step.contract.d.mts.map +1 -1
  155. package/esm/contracts/workflow/workflow-context.type.d.mts +1 -1
  156. package/esm/contracts/workflow/workflow-context.type.d.mts.map +1 -1
  157. package/esm/contracts/workflow/workflow-snapshot.type.d.mts +1 -1
  158. package/esm/contracts/workflow/workflow-snapshot.type.d.mts.map +1 -1
  159. package/esm/contracts/workflow/workflow.contract.d.mts +1 -1
  160. package/esm/contracts/workflow/workflow.contract.d.mts.map +1 -1
  161. package/esm/errors/agent-cancelled-error.d.mts +1 -1
  162. package/esm/errors/agent-cancelled-error.d.mts.map +1 -1
  163. package/esm/errors/agent-cancelled-error.mjs +1 -1
  164. package/esm/errors/agent-cancelled-error.mjs.map +1 -1
  165. package/esm/errors/agent-execution-error.d.mts +1 -1
  166. package/esm/errors/agent-execution-error.d.mts.map +1 -1
  167. package/esm/errors/agent-execution-error.mjs +1 -1
  168. package/esm/errors/agent-execution-error.mjs.map +1 -1
  169. package/esm/errors/agent-max-trips-error.d.mts +1 -1
  170. package/esm/errors/agent-max-trips-error.d.mts.map +1 -1
  171. package/esm/errors/agent-max-trips-error.mjs +1 -1
  172. package/esm/errors/agent-max-trips-error.mjs.map +1 -1
  173. package/esm/errors/ai-error.d.mts +1 -1
  174. package/esm/errors/ai-error.d.mts.map +1 -1
  175. package/esm/errors/ai-error.mjs +1 -1
  176. package/esm/errors/ai-error.mjs.map +1 -1
  177. package/esm/errors/budget-exceeded-error.d.mts +1 -1
  178. package/esm/errors/budget-exceeded-error.d.mts.map +1 -1
  179. package/esm/errors/budget-exceeded-error.mjs +1 -1
  180. package/esm/errors/budget-exceeded-error.mjs.map +1 -1
  181. package/esm/errors/content-filter-error.d.mts +1 -1
  182. package/esm/errors/content-filter-error.d.mts.map +1 -1
  183. package/esm/errors/content-filter-error.mjs +1 -1
  184. package/esm/errors/content-filter-error.mjs.map +1 -1
  185. package/esm/errors/context-length-exceeded-error.d.mts +1 -1
  186. package/esm/errors/context-length-exceeded-error.d.mts.map +1 -1
  187. package/esm/errors/context-length-exceeded-error.mjs +1 -1
  188. package/esm/errors/context-length-exceeded-error.mjs.map +1 -1
  189. package/esm/errors/error-category.type.d.mts +1 -1
  190. package/esm/errors/error-category.type.d.mts.map +1 -1
  191. package/esm/errors/error-code.type.d.mts +1 -1
  192. package/esm/errors/error-code.type.d.mts.map +1 -1
  193. package/esm/errors/guardrail-violation-error.d.mts +1 -1
  194. package/esm/errors/guardrail-violation-error.d.mts.map +1 -1
  195. package/esm/errors/guardrail-violation-error.mjs +1 -1
  196. package/esm/errors/guardrail-violation-error.mjs.map +1 -1
  197. package/esm/errors/invalid-request-error.d.mts +1 -1
  198. package/esm/errors/invalid-request-error.d.mts.map +1 -1
  199. package/esm/errors/invalid-request-error.mjs +1 -1
  200. package/esm/errors/invalid-request-error.mjs.map +1 -1
  201. package/esm/errors/max-iterations-error.d.mts +1 -1
  202. package/esm/errors/max-iterations-error.d.mts.map +1 -1
  203. package/esm/errors/max-iterations-error.mjs +1 -1
  204. package/esm/errors/max-iterations-error.mjs.map +1 -1
  205. package/esm/errors/max-steps-exceeded-error.d.mts +1 -1
  206. package/esm/errors/max-steps-exceeded-error.d.mts.map +1 -1
  207. package/esm/errors/max-steps-exceeded-error.mjs +1 -1
  208. package/esm/errors/max-steps-exceeded-error.mjs.map +1 -1
  209. package/esm/errors/provider-auth-error.d.mts +1 -1
  210. package/esm/errors/provider-auth-error.d.mts.map +1 -1
  211. package/esm/errors/provider-auth-error.mjs +1 -1
  212. package/esm/errors/provider-auth-error.mjs.map +1 -1
  213. package/esm/errors/provider-error.d.mts +1 -1
  214. package/esm/errors/provider-error.d.mts.map +1 -1
  215. package/esm/errors/provider-error.mjs +1 -1
  216. package/esm/errors/provider-error.mjs.map +1 -1
  217. package/esm/errors/provider-rate-limit-error.d.mts +1 -1
  218. package/esm/errors/provider-rate-limit-error.d.mts.map +1 -1
  219. package/esm/errors/provider-rate-limit-error.mjs +1 -1
  220. package/esm/errors/provider-rate-limit-error.mjs.map +1 -1
  221. package/esm/errors/provider-timeout-error.d.mts +1 -1
  222. package/esm/errors/provider-timeout-error.d.mts.map +1 -1
  223. package/esm/errors/provider-timeout-error.mjs +1 -1
  224. package/esm/errors/provider-timeout-error.mjs.map +1 -1
  225. package/esm/errors/quota-exceeded-error.d.mts +1 -1
  226. package/esm/errors/quota-exceeded-error.d.mts.map +1 -1
  227. package/esm/errors/quota-exceeded-error.mjs +1 -1
  228. package/esm/errors/quota-exceeded-error.mjs.map +1 -1
  229. package/esm/errors/routing-error.d.mts +1 -1
  230. package/esm/errors/routing-error.d.mts.map +1 -1
  231. package/esm/errors/routing-error.mjs +1 -1
  232. package/esm/errors/routing-error.mjs.map +1 -1
  233. package/esm/errors/schema-validation-error.d.mts +1 -1
  234. package/esm/errors/schema-validation-error.d.mts.map +1 -1
  235. package/esm/errors/schema-validation-error.mjs +1 -1
  236. package/esm/errors/schema-validation-error.mjs.map +1 -1
  237. package/esm/errors/step-failed-error.d.mts +1 -1
  238. package/esm/errors/step-failed-error.d.mts.map +1 -1
  239. package/esm/errors/step-failed-error.mjs +1 -1
  240. package/esm/errors/step-failed-error.mjs.map +1 -1
  241. package/esm/errors/supervisor-cancelled-error.d.mts +1 -1
  242. package/esm/errors/supervisor-cancelled-error.d.mts.map +1 -1
  243. package/esm/errors/supervisor-cancelled-error.mjs +1 -1
  244. package/esm/errors/supervisor-cancelled-error.mjs.map +1 -1
  245. package/esm/errors/supervisor-drift-error.d.mts +1 -1
  246. package/esm/errors/supervisor-drift-error.d.mts.map +1 -1
  247. package/esm/errors/supervisor-drift-error.mjs +1 -1
  248. package/esm/errors/supervisor-drift-error.mjs.map +1 -1
  249. package/esm/errors/supervisor-failed-error.d.mts +1 -1
  250. package/esm/errors/supervisor-failed-error.d.mts.map +1 -1
  251. package/esm/errors/supervisor-failed-error.mjs +1 -1
  252. package/esm/errors/supervisor-failed-error.mjs.map +1 -1
  253. package/esm/errors/supervisor-routing-error.d.mts +1 -1
  254. package/esm/errors/supervisor-routing-error.d.mts.map +1 -1
  255. package/esm/errors/supervisor-routing-error.mjs +1 -1
  256. package/esm/errors/supervisor-routing-error.mjs.map +1 -1
  257. package/esm/errors/tool-execution-error.d.mts +1 -1
  258. package/esm/errors/tool-execution-error.d.mts.map +1 -1
  259. package/esm/errors/tool-execution-error.mjs +1 -1
  260. package/esm/errors/tool-execution-error.mjs.map +1 -1
  261. package/esm/errors/workflow-cancelled-error.d.mts +1 -1
  262. package/esm/errors/workflow-cancelled-error.d.mts.map +1 -1
  263. package/esm/errors/workflow-cancelled-error.mjs +1 -1
  264. package/esm/errors/workflow-cancelled-error.mjs.map +1 -1
  265. package/esm/errors/workflow-drift-error.d.mts +1 -1
  266. package/esm/errors/workflow-drift-error.d.mts.map +1 -1
  267. package/esm/errors/workflow-drift-error.mjs +1 -1
  268. package/esm/errors/workflow-drift-error.mjs.map +1 -1
  269. package/esm/errors/workflow-error.d.mts +1 -1
  270. package/esm/errors/workflow-error.d.mts.map +1 -1
  271. package/esm/errors/workflow-error.mjs +1 -1
  272. package/esm/errors/workflow-error.mjs.map +1 -1
  273. package/esm/middleware/builtins/budget.d.mts +1 -1
  274. package/esm/middleware/builtins/budget.d.mts.map +1 -1
  275. package/esm/middleware/builtins/budget.mjs +1 -1
  276. package/esm/middleware/builtins/budget.mjs.map +1 -1
  277. package/esm/middleware/builtins/guardrail.d.mts +1 -1
  278. package/esm/middleware/builtins/guardrail.d.mts.map +1 -1
  279. package/esm/middleware/builtins/guardrail.mjs +1 -1
  280. package/esm/middleware/builtins/guardrail.mjs.map +1 -1
  281. package/esm/middleware/builtins/semantic-cache.d.mts +1 -1
  282. package/esm/middleware/builtins/semantic-cache.d.mts.map +1 -1
  283. package/esm/middleware/builtins/semantic-cache.mjs +1 -1
  284. package/esm/middleware/builtins/semantic-cache.mjs.map +1 -1
  285. package/esm/middleware/helpers/compose.d.mts +1 -1
  286. package/esm/middleware/helpers/compose.d.mts.map +1 -1
  287. package/esm/middleware/helpers/compose.mjs +1 -1
  288. package/esm/middleware/helpers/compose.mjs.map +1 -1
  289. package/esm/middleware/helpers/for-tool.d.mts +1 -1
  290. package/esm/middleware/helpers/for-tool.d.mts.map +1 -1
  291. package/esm/middleware/helpers/for-tool.mjs +1 -1
  292. package/esm/middleware/helpers/for-tool.mjs.map +1 -1
  293. package/esm/middleware/pipeline.d.mts +1 -1
  294. package/esm/middleware/pipeline.d.mts.map +1 -1
  295. package/esm/middleware/pipeline.mjs +1 -1
  296. package/esm/middleware/pipeline.mjs.map +1 -1
  297. package/esm/middleware/utils/extract-user-text.d.mts +1 -1
  298. package/esm/middleware/utils/extract-user-text.d.mts.map +1 -1
  299. package/esm/middleware/utils/extract-user-text.mjs +1 -1
  300. package/esm/middleware/utils/extract-user-text.mjs.map +1 -1
  301. package/esm/middleware/utils/namespaced-state.d.mts +1 -1
  302. package/esm/middleware/utils/namespaced-state.d.mts.map +1 -1
  303. package/esm/middleware/utils/namespaced-state.mjs +1 -1
  304. package/esm/middleware/utils/namespaced-state.mjs.map +1 -1
  305. package/esm/mock/mock-agent.d.mts +1 -1
  306. package/esm/mock/mock-agent.d.mts.map +1 -1
  307. package/esm/mock/mock-agent.mjs +1 -1
  308. package/esm/mock/mock-agent.mjs.map +1 -1
  309. package/esm/mock/mock-config.type.d.mts +1 -1
  310. package/esm/mock/mock-config.type.d.mts.map +1 -1
  311. package/esm/mock/mock-model.d.mts +1 -1
  312. package/esm/mock/mock-model.d.mts.map +1 -1
  313. package/esm/mock/mock-model.mjs +1 -1
  314. package/esm/mock/mock-model.mjs.map +1 -1
  315. package/esm/mock/mock-sdk.d.mts +1 -1
  316. package/esm/mock/mock-sdk.d.mts.map +1 -1
  317. package/esm/mock/mock-sdk.mjs +1 -1
  318. package/esm/mock/mock-sdk.mjs.map +1 -1
  319. package/esm/supervisor/as-tool.d.mts +1 -1
  320. package/esm/supervisor/as-tool.d.mts.map +1 -1
  321. package/esm/supervisor/as-tool.mjs +1 -1
  322. package/esm/supervisor/as-tool.mjs.map +1 -1
  323. package/esm/supervisor/cancellation.d.mts +1 -1
  324. package/esm/supervisor/cancellation.d.mts.map +1 -1
  325. package/esm/supervisor/cancellation.mjs +1 -1
  326. package/esm/supervisor/cancellation.mjs.map +1 -1
  327. package/esm/supervisor/decide.mjs +1 -1
  328. package/esm/supervisor/decide.mjs.map +1 -1
  329. package/esm/supervisor/emitter.d.mts +1 -1
  330. package/esm/supervisor/emitter.d.mts.map +1 -1
  331. package/esm/supervisor/emitter.mjs +1 -1
  332. package/esm/supervisor/emitter.mjs.map +1 -1
  333. package/esm/supervisor/entries.d.mts +1 -1
  334. package/esm/supervisor/entries.d.mts.map +1 -1
  335. package/esm/supervisor/entries.mjs +1 -1
  336. package/esm/supervisor/entries.mjs.map +1 -1
  337. package/esm/supervisor/execution.d.mts +1 -1
  338. package/esm/supervisor/execution.d.mts.map +1 -1
  339. package/esm/supervisor/execution.mjs +1 -1
  340. package/esm/supervisor/execution.mjs.map +1 -1
  341. package/esm/supervisor/router-prompt.d.mts +1 -1
  342. package/esm/supervisor/router-prompt.d.mts.map +1 -1
  343. package/esm/supervisor/router-prompt.mjs +1 -1
  344. package/esm/supervisor/router-prompt.mjs.map +1 -1
  345. package/esm/supervisor/signature.d.mts +1 -1
  346. package/esm/supervisor/signature.d.mts.map +1 -1
  347. package/esm/supervisor/signature.mjs +1 -1
  348. package/esm/supervisor/signature.mjs.map +1 -1
  349. package/esm/supervisor/snapshot.d.mts +1 -1
  350. package/esm/supervisor/snapshot.d.mts.map +1 -1
  351. package/esm/supervisor/snapshot.mjs +1 -1
  352. package/esm/supervisor/snapshot.mjs.map +1 -1
  353. package/esm/supervisor/supervisor-stream.d.mts +1 -1
  354. package/esm/supervisor/supervisor-stream.d.mts.map +1 -1
  355. package/esm/supervisor/supervisor-stream.mjs +1 -1
  356. package/esm/supervisor/supervisor-stream.mjs.map +1 -1
  357. package/esm/supervisor/supervisor.d.mts +1 -1
  358. package/esm/supervisor/supervisor.d.mts.map +1 -1
  359. package/esm/supervisor/supervisor.mjs +1 -1
  360. package/esm/supervisor/supervisor.mjs.map +1 -1
  361. package/esm/system-prompt/instruction.d.mts +1 -1
  362. package/esm/system-prompt/instruction.d.mts.map +1 -1
  363. package/esm/system-prompt/instruction.mjs +1 -1
  364. package/esm/system-prompt/instruction.mjs.map +1 -1
  365. package/esm/system-prompt/persona.d.mts +1 -1
  366. package/esm/system-prompt/persona.d.mts.map +1 -1
  367. package/esm/system-prompt/persona.mjs +1 -1
  368. package/esm/system-prompt/persona.mjs.map +1 -1
  369. package/esm/system-prompt/render-placeholders.d.mts +1 -1
  370. package/esm/system-prompt/render-placeholders.d.mts.map +1 -1
  371. package/esm/system-prompt/render-placeholders.mjs +1 -1
  372. package/esm/system-prompt/render-placeholders.mjs.map +1 -1
  373. package/esm/system-prompt/system-prompt.d.mts +1 -1
  374. package/esm/system-prompt/system-prompt.d.mts.map +1 -1
  375. package/esm/system-prompt/system-prompt.mjs +1 -1
  376. package/esm/system-prompt/system-prompt.mjs.map +1 -1
  377. package/esm/tool/tool.d.mts +1 -1
  378. package/esm/tool/tool.d.mts.map +1 -1
  379. package/esm/tool/tool.mjs +3 -2
  380. package/esm/tool/tool.mjs.map +1 -1
  381. package/esm/utils/compute-cost.d.mts +1 -1
  382. package/esm/utils/compute-cost.d.mts.map +1 -1
  383. package/esm/utils/compute-cost.mjs +1 -1
  384. package/esm/utils/compute-cost.mjs.map +1 -1
  385. package/esm/utils/extract-json-payload.d.mts +1 -1
  386. package/esm/utils/extract-json-payload.d.mts.map +1 -1
  387. package/esm/utils/extract-json-payload.mjs +1 -1
  388. package/esm/utils/extract-json-payload.mjs.map +1 -1
  389. package/esm/utils/generate-run-id.d.mts +1 -1
  390. package/esm/utils/generate-run-id.d.mts.map +1 -1
  391. package/esm/utils/generate-run-id.mjs +1 -1
  392. package/esm/utils/generate-run-id.mjs.map +1 -1
  393. package/esm/utils/json-schema.d.mts +1 -1
  394. package/esm/utils/json-schema.d.mts.map +1 -1
  395. package/esm/utils/json-schema.mjs +1 -1
  396. package/esm/utils/json-schema.mjs.map +1 -1
  397. package/esm/utils/prepare-attachment-part.d.mts +1 -1
  398. package/esm/utils/prepare-attachment-part.d.mts.map +1 -1
  399. package/esm/utils/prepare-attachment-part.mjs +1 -1
  400. package/esm/utils/prepare-attachment-part.mjs.map +1 -1
  401. package/esm/utils/resolve-attachment.d.mts +1 -1
  402. package/esm/utils/resolve-attachment.d.mts.map +1 -1
  403. package/esm/utils/resolve-attachment.mjs +1 -1
  404. package/esm/utils/resolve-attachment.mjs.map +1 -1
  405. package/esm/utils/safe-json-parse.d.mts +1 -1
  406. package/esm/utils/safe-json-parse.d.mts.map +1 -1
  407. package/esm/utils/safe-json-parse.mjs +1 -1
  408. package/esm/utils/safe-json-parse.mjs.map +1 -1
  409. package/esm/utils/stamp-report-lineage.d.mts +1 -1
  410. package/esm/utils/stamp-report-lineage.d.mts.map +1 -1
  411. package/esm/utils/stamp-report-lineage.mjs +1 -1
  412. package/esm/utils/stamp-report-lineage.mjs.map +1 -1
  413. package/esm/utils/token-count.d.mts +1 -1
  414. package/esm/utils/token-count.d.mts.map +1 -1
  415. package/esm/utils/token-count.mjs +1 -1
  416. package/esm/utils/token-count.mjs.map +1 -1
  417. package/esm/workflow/as-tool.mjs +1 -1
  418. package/esm/workflow/as-tool.mjs.map +1 -1
  419. package/esm/workflow/cancellation.mjs +1 -1
  420. package/esm/workflow/cancellation.mjs.map +1 -1
  421. package/esm/workflow/emitter.mjs +1 -1
  422. package/esm/workflow/emitter.mjs.map +1 -1
  423. package/esm/workflow/engine.mjs +1 -1
  424. package/esm/workflow/engine.mjs.map +1 -1
  425. package/esm/workflow/retry.mjs +1 -1
  426. package/esm/workflow/retry.mjs.map +1 -1
  427. package/esm/workflow/router.mjs +1 -1
  428. package/esm/workflow/router.mjs.map +1 -1
  429. package/esm/workflow/run-scoped-emitter.mjs +1 -1
  430. package/esm/workflow/run-scoped-emitter.mjs.map +1 -1
  431. package/esm/workflow/signature.d.mts +1 -1
  432. package/esm/workflow/signature.d.mts.map +1 -1
  433. package/esm/workflow/signature.mjs +1 -1
  434. package/esm/workflow/signature.mjs.map +1 -1
  435. package/esm/workflow/snapshot.mjs +1 -1
  436. package/esm/workflow/snapshot.mjs.map +1 -1
  437. package/esm/workflow/state.mjs +1 -1
  438. package/esm/workflow/state.mjs.map +1 -1
  439. package/esm/workflow/step-runner.mjs +1 -1
  440. package/esm/workflow/step-runner.mjs.map +1 -1
  441. package/esm/workflow/step.d.mts +1 -1
  442. package/esm/workflow/step.d.mts.map +1 -1
  443. package/esm/workflow/step.mjs +1 -1
  444. package/esm/workflow/step.mjs.map +1 -1
  445. package/esm/workflow/workflow.d.mts +1 -1
  446. package/esm/workflow/workflow.d.mts.map +1 -1
  447. package/esm/workflow/workflow.mjs +1 -1
  448. package/esm/workflow/workflow.mjs.map +1 -1
  449. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"json-stream-guard.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/agent/json-stream-guard.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ModelToolCallRequest } from \"../contracts/model-tool-call-request.type\";\nimport type { ToolContract } from \"../tool/tool\";\n\n/**\n * Default cap on bytes accumulated in a single suspect buffer before\n * the guard gives up, flushes as text, and resets to pass-through.\n * Real envelope payloads observed in production leaks are well under\n * 1 KB; this is a safety valve against runaway / adversarial input.\n */\nconst DEFAULT_MAX_BUFFER_BYTES = 4096;\n\n/**\n * Fence opener the guard recognizes in pass-through mode. Targets the\n * lowercase form ```` ```json ```` only — that is the form models\n * actually emit in the wild when they fence-wrap a JSON tool envelope.\n * Other languages / casings flush as plain text.\n */\nconst FENCE_OPENER = \"```json\";\n\n/**\n * Closing fence sequence inside `bufferingFence` mode. Three backticks,\n * no language tag.\n */\nconst FENCE_CLOSER = \"```\";\n\n/**\n * Options passed when constructing a `JsonStreamGuard`.\n *\n * The guard is deliberately framework-agnostic of *how* deltas are\n * emitted or how recovered calls are dispatched — callers wire those\n * via `onSafeDelta` / `onRecoveredCall`. This keeps the unit-testable\n * surface tiny and lets the agent loop own all event-emission policy.\n */\nexport type JsonStreamGuardOptions = {\n /** Tools the agent has registered for this trip. Envelope lookups use `.name`. */\n tools: ReadonlyArray<ToolContract<unknown, unknown>>;\n /**\n * Hard cap on a single suspect buffer's size. When exceeded, the\n * buffer is flushed verbatim as text and the guard returns to\n * pass-through. Defaults to {@link DEFAULT_MAX_BUFFER_BYTES}.\n */\n maxBufferBytes?: number;\n /**\n * Called for every chunk of text that survived the guard — exactly\n * what the consumer should treat as the visible delta. May be\n * called many times per `feed()` call, possibly with a single\n * character or with a multi-character flush.\n */\n onSafeDelta: (delta: string) => void;\n /**\n * Called once per envelope the guard successfully classifies as a\n * tool-call recovery. The request carries `recoveredFrom:\n * \"stream-text\"` so downstream consumers can distinguish synthesized\n * calls from real ones.\n */\n onRecoveredCall: (request: ModelToolCallRequest) => void;\n};\n\n/**\n * Per-trip state machine that intercepts streamed text deltas, detects\n * JSON envelopes the model has emitted as plain text (the\n * tool-call-leakage symptom), and synthesizes real `ModelToolCallRequest`\n * entries for them while suppressing the JSON from visible output.\n *\n * **Role.** A `JsonStreamGuard` is the per-trip implementation of the\n * opt-in `streamingToolGuard` config. It sits between the model\n * adapter's `delta` chunks and the agent's `agent.trip.streaming`\n * emit + `content` accumulator — text that survives the guard is what\n * the consumer sees and what the trip records as `output`.\n *\n * **Responsibility.**\n * - Owns: a small character-level state machine (pass-through,\n * brace-buffering, fence-buffering), string-literal-aware brace\n * tracking, fence-opener / fence-closer detection, named-envelope\n * matching against registered tool schemas, buffer-cap enforcement.\n * - Does NOT own: event emission (delegated via callbacks), tool\n * dispatch, `finishReason` normalization, dedupe vs. real tool\n * calls — the agent loop handles all four.\n *\n * **Matcher tier — named envelope only (v1).** A buffer matches when\n * it parses as a JSON object containing both:\n * - a `name` or `tool` key resolving to a registered tool name, AND\n * - an `arguments` or `input` key whose value validates against the\n * resolved tool's `~standard` schema.\n * Bare-object matching (where any registered tool's schema is the\n * sole signal) is deferred until tool input schemas are tight enough\n * to distinguish — `v.record(v.any())` would match everything.\n *\n * **Per-trip lifecycle.** One instance per trip. The agent loop calls\n * `feed(chunk)` for every `delta` chunk and `finalize()` exactly once\n * after the stream's `done` chunk. Mid-stream cancellation: the loop\n * simply stops calling `feed`; any open buffer is discarded with the\n * guard instance.\n *\n * Modeled as a class (see §4.2 of code-style.md — per-call execution\n * state across phases): the machine has 3 states, accumulators for\n * brace depth, string-literal escape tracking, and a synthesized-call\n * counter for stable ids across the trip.\n *\n * @example\n * // Inside the agent's streaming trip body:\n * const guard = new JsonStreamGuard({\n * tools: this.config.tools ?? [],\n * maxBufferBytes: guardConfig.maxBufferBytes,\n * onSafeDelta: (delta) => {\n * content += delta;\n * this.emit(\"agent.trip.streaming\", { delta, tripIndex });\n * },\n * onRecoveredCall: (request) => recoveredCalls.push(request),\n * });\n *\n * for await (const chunk of model.stream(messages, callOptions)) {\n * if (chunk.type === \"delta\") await guard.feed(chunk.content);\n * // ... other chunk types\n * }\n *\n * await guard.finalize();\n */\nexport class JsonStreamGuard {\n private readonly tools: ReadonlyArray<ToolContract<unknown, unknown>>;\n private readonly maxBufferBytes: number;\n private readonly onSafeDelta: (delta: string) => void;\n private readonly onRecoveredCall: (request: ModelToolCallRequest) => void;\n\n private mode: \"passThrough\" | \"bufferingBrace\" | \"bufferingFence\" = \"passThrough\";\n\n /**\n * Characters held back in pass-through mode while we resolve whether\n * a partial fence opener (`` ` ``, `` `` ``, `` ``` ``, `` ```j ``, …)\n * will complete or break. Always a strict prefix of {@link FENCE_OPENER};\n * emptied (and emitted verbatim) the moment a non-matching character\n * arrives.\n */\n private holdback = \"\";\n\n /**\n * Accumulator while `mode === \"bufferingBrace\"` or `\"bufferingFence\"`.\n * In brace mode it carries the JSON including the outermost `{`/`}`.\n * In fence mode it carries everything between the opener and the\n * closer (the opener and closer themselves are NOT in the buffer —\n * they are reconstructed only on a flush-as-text fallback).\n */\n private buffer = \"\";\n\n /**\n * Brace-depth counter for `bufferingBrace` mode. Increments on `{`,\n * decrements on `}` — but only when {@link inString} is false, so a\n * `{` inside a JSON string literal does not skew the depth. Buffer\n * closes when depth returns to zero.\n */\n private braceDepth = 0;\n\n /** True while the scanner is inside a `\"...\"` JSON string literal. */\n private inString = false;\n\n /**\n * True when the previous character inside a string literal was a\n * backslash, so the current character is escaped (`\\\"` does not end\n * the string; `\\\\` resets the flag without escaping anything else).\n */\n private escapeNext = false;\n\n /**\n * Trailing tail of the fence buffer used to detect the closing\n * ```` ``` ```` sequence. Length capped at the closer length; rotated\n * forward as new characters arrive.\n */\n private fenceCloseTail = \"\";\n\n /**\n * Count of envelopes the guard has successfully synthesized this\n * trip. Used to assign deterministic, collision-free ids on\n * recovered `ModelToolCallRequest` entries.\n */\n private recoveredCount = 0;\n\n public constructor(options: JsonStreamGuardOptions) {\n this.tools = options.tools;\n this.maxBufferBytes = options.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;\n this.onSafeDelta = options.onSafeDelta;\n this.onRecoveredCall = options.onRecoveredCall;\n }\n\n /**\n * Feed the next raw delta from the model. Splits the chunk into\n * characters and runs each through the state machine, awaiting\n * envelope classification whenever a buffer closes mid-chunk.\n *\n * The hot path (pass-through prose with no `{` / `` ` ``) is fully\n * synchronous — `await` here only blocks at buffer-close points,\n * which are rare in normal traffic.\n */\n public async feed(chunk: string): Promise<void> {\n for (let i = 0; i < chunk.length; i++) {\n await this.processChar(chunk[i]);\n }\n }\n\n /**\n * Stream ended. Anything still in the holdback was prose\n * misclassified as a partial fence opener — emit it. Anything still\n * in an open buffer never closed — emit it as text too (a leak\n * truncated mid-flight is still text the user partially saw).\n */\n public async finalize(): Promise<void> {\n if (this.holdback.length > 0) {\n this.onSafeDelta(this.holdback);\n this.holdback = \"\";\n }\n\n if (this.mode === \"bufferingBrace\") {\n this.flushBraceBufferAsText();\n return;\n }\n\n if (this.mode === \"bufferingFence\") {\n this.flushFenceBufferAsText();\n }\n }\n\n /**\n * True when at least one envelope was recovered this trip. The\n * agent loop reads this to override `finishReason` from `\"stop\"` to\n * `\"tool_calls\"` when the model reported a natural stop but the\n * guard found tool calls hiding in the text channel.\n */\n public hasRecoveredCalls(): boolean {\n return this.recoveredCount > 0;\n }\n\n /**\n * Route a single character based on the current mode. The\n * `passThrough` branch handles holdback expansion / flushing\n * iteratively (no recursion) so a character that \"breaks\" a fence\n * opener can be re-evaluated as a fresh pass-through input in the\n * same call.\n */\n private async processChar(char: string): Promise<void> {\n if (this.mode === \"bufferingBrace\") {\n await this.processBraceChar(char);\n return;\n }\n\n if (this.mode === \"bufferingFence\") {\n await this.processFenceChar(char);\n return;\n }\n\n let current = char;\n\n while (true) {\n if (this.holdback.length === 0 && current === \"{\") {\n this.openBraceBuffer(current);\n return;\n }\n\n const extended = this.holdback + current;\n\n if (this.isFenceOpenerPrefix(extended)) {\n this.holdback = extended;\n\n if (extended === FENCE_OPENER) {\n this.openFenceBuffer();\n }\n\n return;\n }\n\n if (this.holdback.length === 0) {\n this.onSafeDelta(current);\n return;\n }\n\n this.onSafeDelta(this.holdback);\n this.holdback = \"\";\n }\n }\n\n /**\n * Recognize any strict prefix of {@link FENCE_OPENER} including the\n * full string. Used to decide whether to keep extending the holdback\n * or flush it as plain text.\n */\n private isFenceOpenerPrefix(candidate: string): boolean {\n return candidate.length <= FENCE_OPENER.length && FENCE_OPENER.startsWith(candidate);\n }\n\n /**\n * Enter `bufferingBrace` mode with the seed `{` as the first buffer\n * character and the initial brace depth set to one. Any holdback at\n * this point was already a non-fence sequence so it stays empty.\n */\n private openBraceBuffer(seed: string): void {\n this.mode = \"bufferingBrace\";\n this.buffer = seed;\n this.braceDepth = 1;\n this.inString = false;\n this.escapeNext = false;\n }\n\n /**\n * Enter `bufferingFence` mode immediately after the opener\n * ```` ```json ```` matched in the holdback. Holdback resets;\n * subsequent characters accumulate into the buffer until the\n * closing fence is seen.\n */\n private openFenceBuffer(): void {\n this.mode = \"bufferingFence\";\n this.buffer = \"\";\n this.fenceCloseTail = \"\";\n this.holdback = \"\";\n }\n\n /**\n * Process one character while accumulating a brace-delimited JSON\n * object. Tracks string-literal context so `{` / `}` inside `\"...\"`\n * do not skew brace depth. Closes (and classifies) on balanced\n * braces; flushes-as-text on cap overflow.\n */\n private async processBraceChar(char: string): Promise<void> {\n this.buffer += char;\n\n if (this.inString) {\n if (this.escapeNext) {\n this.escapeNext = false;\n return;\n }\n\n if (char === \"\\\\\") {\n this.escapeNext = true;\n return;\n }\n\n if (char === '\"') {\n this.inString = false;\n }\n\n this.guardBufferCap(\"brace\");\n return;\n }\n\n if (char === '\"') {\n this.inString = true;\n this.guardBufferCap(\"brace\");\n return;\n }\n\n if (char === \"{\") {\n this.braceDepth++;\n this.guardBufferCap(\"brace\");\n return;\n }\n\n if (char === \"}\") {\n this.braceDepth--;\n\n if (this.braceDepth === 0) {\n await this.closeBraceBuffer();\n return;\n }\n\n this.guardBufferCap(\"brace\");\n return;\n }\n\n this.guardBufferCap(\"brace\");\n }\n\n /**\n * Process one character while accumulating a fence-delimited JSON\n * block. The closing fence ```` ``` ```` ends the block; the closing\n * characters are NOT included in the classified buffer (they are\n * re-emitted only when the block flushes back to text).\n */\n private async processFenceChar(char: string): Promise<void> {\n this.fenceCloseTail += char;\n\n if (this.fenceCloseTail.length > FENCE_CLOSER.length) {\n this.fenceCloseTail = this.fenceCloseTail.slice(-FENCE_CLOSER.length);\n }\n\n if (this.fenceCloseTail === FENCE_CLOSER) {\n const innerLength = this.buffer.length - (FENCE_CLOSER.length - 1);\n this.buffer = this.buffer.slice(0, Math.max(0, innerLength));\n\n await this.closeFenceBuffer();\n return;\n }\n\n this.buffer += char;\n this.guardBufferCap(\"fence\");\n }\n\n /**\n * Enforce the buffer-byte cap. When the current buffer exceeds the\n * cap, flush it back to the consumer as plain text and reset to\n * pass-through. Acts as a runaway / adversarial-input safety valve.\n */\n private guardBufferCap(source: \"brace\" | \"fence\"): void {\n if (this.buffer.length <= this.maxBufferBytes) {\n return;\n }\n\n if (source === \"brace\") {\n this.flushBraceBufferAsText();\n return;\n }\n\n this.flushFenceBufferAsText();\n }\n\n /**\n * Run the envelope matcher against the closed brace buffer. On a\n * match, synthesize a recovered `ModelToolCallRequest`; on no\n * match, flush the buffer back as plain text. Resets state to\n * pass-through either way.\n */\n private async closeBraceBuffer(): Promise<void> {\n const closed = this.buffer;\n\n this.resetToPassThrough();\n\n const matched = await this.tryMatchEnvelope(closed);\n\n if (matched) {\n return;\n }\n\n this.onSafeDelta(closed);\n }\n\n /**\n * Run the envelope matcher against the closed fence buffer. On a\n * match, synthesize a recovered call; on no match, flush as text\n * **with** the original opener and closer reconstructed so the\n * customer sees exactly the markdown the model emitted.\n */\n private async closeFenceBuffer(): Promise<void> {\n const closed = this.buffer;\n\n this.resetToPassThrough();\n\n const matched = await this.tryMatchEnvelope(closed);\n\n if (matched) {\n return;\n }\n\n this.onSafeDelta(`${FENCE_OPENER}${closed}${FENCE_CLOSER}`);\n }\n\n /**\n * Emit the brace-buffer verbatim as text and reset to pass-through.\n * Used on cap overflow and on `finalize()` for an unclosed buffer.\n */\n private flushBraceBufferAsText(): void {\n const closed = this.buffer;\n this.resetToPassThrough();\n this.onSafeDelta(closed);\n }\n\n /**\n * Emit the fence-buffer verbatim as text, reconstructing the\n * opener and closer so the original markdown structure is\n * preserved for the consumer.\n */\n private flushFenceBufferAsText(): void {\n const closed = this.buffer;\n this.resetToPassThrough();\n this.onSafeDelta(`${FENCE_OPENER}${closed}`);\n }\n\n /**\n * Reset all per-buffer state back to the pass-through baseline.\n * Called whenever a buffer closes — by recovery, by flush, or by\n * cap overflow — so the next character starts a fresh scan.\n */\n private resetToPassThrough(): void {\n this.mode = \"passThrough\";\n this.buffer = \"\";\n this.braceDepth = 0;\n this.inString = false;\n this.escapeNext = false;\n this.fenceCloseTail = \"\";\n }\n\n /**\n * Attempt to classify a closed buffer as a tool-call envelope. On\n * success, invoke `onRecoveredCall` with a synthesized request and\n * return `true`; on failure return `false` so the caller can flush\n * the buffer back as text.\n */\n private async tryMatchEnvelope(raw: string): Promise<boolean> {\n const parsed = safeParseJson(raw);\n\n if (parsed === undefined || typeof parsed !== \"object\" || parsed === null) {\n return false;\n }\n\n const envelope = parsed as Record<string, unknown>;\n const candidateName = readString(envelope, \"name\") ?? readString(envelope, \"tool\");\n const candidateInput = readObject(envelope, \"arguments\") ?? readObject(envelope, \"input\");\n\n if (!candidateName || !candidateInput) {\n return false;\n }\n\n const tool = this.tools.find((entry) => entry.name === candidateName);\n\n if (!tool || !tool.input) {\n return false;\n }\n\n const schema = tool.input as StandardSchemaV1<unknown>;\n\n let validationResult: StandardSchemaV1.Result<unknown>;\n\n try {\n validationResult = await schema[\"~standard\"].validate(candidateInput);\n } catch {\n return false;\n }\n\n if (validationResult.issues) {\n return false;\n }\n\n this.recoveredCount++;\n\n this.onRecoveredCall({\n id: `synth_${candidateName}_${this.recoveredCount}`,\n name: candidateName,\n input: validationResult.value,\n recoveredFrom: \"stream-text\",\n });\n\n return true;\n }\n}\n\n/**\n * Parse a JSON string returning `undefined` on any failure. Local to\n * the guard so it can distinguish \"not JSON\" from a parsed `null`\n * value, which `safeJsonParse` cannot — a parsed `null` is a valid\n * JSON value but not a valid envelope, and we want the difference.\n */\nfunction safeParseJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Read a string-typed field from an envelope candidate. Returns\n * `undefined` when the key is missing or the value is non-string —\n * the matcher rejects either case.\n */\nfunction readString(envelope: Record<string, unknown>, key: string): string | undefined {\n const value = envelope[key];\n\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/**\n * Read an object-typed field from an envelope candidate. Returns\n * `undefined` when the key is missing or the value is not a\n * plain object (rejects arrays, primitives, null) — tool input\n * schemas always validate against an object root.\n */\nfunction readObject(\n envelope: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const value = envelope[key];\n\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, unknown>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-stream-guard.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/agent/json-stream-guard.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ModelToolCallRequest } from \"../contracts/model-tool-call-request.type\";\nimport type { ToolContract } from \"../tool/tool\";\n\n/**\n * Default cap on bytes accumulated in a single suspect buffer before\n * the guard gives up, flushes as text, and resets to pass-through.\n * Real envelope payloads observed in production leaks are well under\n * 1 KB; this is a safety valve against runaway / adversarial input.\n */\nconst DEFAULT_MAX_BUFFER_BYTES = 4096;\n\n/**\n * Fence opener the guard recognizes in pass-through mode. Targets the\n * lowercase form ```` ```json ```` only — that is the form models\n * actually emit in the wild when they fence-wrap a JSON tool envelope.\n * Other languages / casings flush as plain text.\n */\nconst FENCE_OPENER = \"```json\";\n\n/**\n * Closing fence sequence inside `bufferingFence` mode. Three backticks,\n * no language tag.\n */\nconst FENCE_CLOSER = \"```\";\n\n/**\n * Options passed when constructing a `JsonStreamGuard`.\n *\n * The guard is deliberately framework-agnostic of *how* deltas are\n * emitted or how recovered calls are dispatched — callers wire those\n * via `onSafeDelta` / `onRecoveredCall`. This keeps the unit-testable\n * surface tiny and lets the agent loop own all event-emission policy.\n */\nexport type JsonStreamGuardOptions = {\n /** Tools the agent has registered for this trip. Envelope lookups use `.name`. */\n tools: ReadonlyArray<ToolContract<unknown, unknown>>;\n /**\n * Hard cap on a single suspect buffer's size. When exceeded, the\n * buffer is flushed verbatim as text and the guard returns to\n * pass-through. Defaults to {@link DEFAULT_MAX_BUFFER_BYTES}.\n */\n maxBufferBytes?: number;\n /**\n * Called for every chunk of text that survived the guard — exactly\n * what the consumer should treat as the visible delta. May be\n * called many times per `feed()` call, possibly with a single\n * character or with a multi-character flush.\n */\n onSafeDelta: (delta: string) => void;\n /**\n * Called once per envelope the guard successfully classifies as a\n * tool-call recovery. The request carries `recoveredFrom:\n * \"stream-text\"` so downstream consumers can distinguish synthesized\n * calls from real ones.\n */\n onRecoveredCall: (request: ModelToolCallRequest) => void;\n};\n\n/**\n * Per-trip state machine that intercepts streamed text deltas, detects\n * JSON envelopes the model has emitted as plain text (the\n * tool-call-leakage symptom), and synthesizes real `ModelToolCallRequest`\n * entries for them while suppressing the JSON from visible output.\n *\n * **Role.** A `JsonStreamGuard` is the per-trip implementation of the\n * opt-in `streamingToolGuard` config. It sits between the model\n * adapter's `delta` chunks and the agent's `agent.trip.streaming`\n * emit + `content` accumulator — text that survives the guard is what\n * the consumer sees and what the trip records as `output`.\n *\n * **Responsibility.**\n * - Owns: a small character-level state machine (pass-through,\n * brace-buffering, fence-buffering), string-literal-aware brace\n * tracking, fence-opener / fence-closer detection, named-envelope\n * matching against registered tool schemas, buffer-cap enforcement.\n * - Does NOT own: event emission (delegated via callbacks), tool\n * dispatch, `finishReason` normalization, dedupe vs. real tool\n * calls — the agent loop handles all four.\n *\n * **Matcher tier — named envelope only (v1).** A buffer matches when\n * it parses as a JSON object containing both:\n * - a `name` or `tool` key resolving to a registered tool name, AND\n * - an `arguments` or `input` key whose value validates against the\n * resolved tool's `~standard` schema.\n * Bare-object matching (where any registered tool's schema is the\n * sole signal) is deferred until tool input schemas are tight enough\n * to distinguish — `v.record(v.any())` would match everything.\n *\n * **Per-trip lifecycle.** One instance per trip. The agent loop calls\n * `feed(chunk)` for every `delta` chunk and `finalize()` exactly once\n * after the stream's `done` chunk. Mid-stream cancellation: the loop\n * simply stops calling `feed`; any open buffer is discarded with the\n * guard instance.\n *\n * Modeled as a class (see §4.2 of code-style.md — per-call execution\n * state across phases): the machine has 3 states, accumulators for\n * brace depth, string-literal escape tracking, and a synthesized-call\n * counter for stable ids across the trip.\n *\n * @example\n * // Inside the agent's streaming trip body:\n * const guard = new JsonStreamGuard({\n * tools: this.config.tools ?? [],\n * maxBufferBytes: guardConfig.maxBufferBytes,\n * onSafeDelta: (delta) => {\n * content += delta;\n * this.emit(\"agent.trip.streaming\", { delta, tripIndex });\n * },\n * onRecoveredCall: (request) => recoveredCalls.push(request),\n * });\n *\n * for await (const chunk of model.stream(messages, callOptions)) {\n * if (chunk.type === \"delta\") await guard.feed(chunk.content);\n * // ... other chunk types\n * }\n *\n * await guard.finalize();\n */\nexport class JsonStreamGuard {\n private readonly tools: ReadonlyArray<ToolContract<unknown, unknown>>;\n private readonly maxBufferBytes: number;\n private readonly onSafeDelta: (delta: string) => void;\n private readonly onRecoveredCall: (request: ModelToolCallRequest) => void;\n\n private mode: \"passThrough\" | \"bufferingBrace\" | \"bufferingFence\" = \"passThrough\";\n\n /**\n * Characters held back in pass-through mode while we resolve whether\n * a partial fence opener (`` ` ``, `` `` ``, `` ``` ``, `` ```j ``, …)\n * will complete or break. Always a strict prefix of {@link FENCE_OPENER};\n * emptied (and emitted verbatim) the moment a non-matching character\n * arrives.\n */\n private holdback = \"\";\n\n /**\n * Accumulator while `mode === \"bufferingBrace\"` or `\"bufferingFence\"`.\n * In brace mode it carries the JSON including the outermost `{`/`}`.\n * In fence mode it carries everything between the opener and the\n * closer (the opener and closer themselves are NOT in the buffer —\n * they are reconstructed only on a flush-as-text fallback).\n */\n private buffer = \"\";\n\n /**\n * Brace-depth counter for `bufferingBrace` mode. Increments on `{`,\n * decrements on `}` — but only when {@link inString} is false, so a\n * `{` inside a JSON string literal does not skew the depth. Buffer\n * closes when depth returns to zero.\n */\n private braceDepth = 0;\n\n /** True while the scanner is inside a `\"...\"` JSON string literal. */\n private inString = false;\n\n /**\n * True when the previous character inside a string literal was a\n * backslash, so the current character is escaped (`\\\"` does not end\n * the string; `\\\\` resets the flag without escaping anything else).\n */\n private escapeNext = false;\n\n /**\n * Trailing tail of the fence buffer used to detect the closing\n * ```` ``` ```` sequence. Length capped at the closer length; rotated\n * forward as new characters arrive.\n */\n private fenceCloseTail = \"\";\n\n /**\n * Count of envelopes the guard has successfully synthesized this\n * trip. Used to assign deterministic, collision-free ids on\n * recovered `ModelToolCallRequest` entries.\n */\n private recoveredCount = 0;\n\n public constructor(options: JsonStreamGuardOptions) {\n this.tools = options.tools;\n this.maxBufferBytes = options.maxBufferBytes ?? DEFAULT_MAX_BUFFER_BYTES;\n this.onSafeDelta = options.onSafeDelta;\n this.onRecoveredCall = options.onRecoveredCall;\n }\n\n /**\n * Feed the next raw delta from the model. Splits the chunk into\n * characters and runs each through the state machine, awaiting\n * envelope classification whenever a buffer closes mid-chunk.\n *\n * The hot path (pass-through prose with no `{` / `` ` ``) is fully\n * synchronous — `await` here only blocks at buffer-close points,\n * which are rare in normal traffic.\n */\n public async feed(chunk: string): Promise<void> {\n for (let i = 0; i < chunk.length; i++) {\n await this.processChar(chunk[i]);\n }\n }\n\n /**\n * Stream ended. Anything still in the holdback was prose\n * misclassified as a partial fence opener — emit it. Anything still\n * in an open buffer never closed — emit it as text too (a leak\n * truncated mid-flight is still text the user partially saw).\n */\n public async finalize(): Promise<void> {\n if (this.holdback.length > 0) {\n this.onSafeDelta(this.holdback);\n this.holdback = \"\";\n }\n\n if (this.mode === \"bufferingBrace\") {\n this.flushBraceBufferAsText();\n return;\n }\n\n if (this.mode === \"bufferingFence\") {\n this.flushFenceBufferAsText();\n }\n }\n\n /**\n * True when at least one envelope was recovered this trip. The\n * agent loop reads this to override `finishReason` from `\"stop\"` to\n * `\"tool_calls\"` when the model reported a natural stop but the\n * guard found tool calls hiding in the text channel.\n */\n public hasRecoveredCalls(): boolean {\n return this.recoveredCount > 0;\n }\n\n /**\n * Route a single character based on the current mode. The\n * `passThrough` branch handles holdback expansion / flushing\n * iteratively (no recursion) so a character that \"breaks\" a fence\n * opener can be re-evaluated as a fresh pass-through input in the\n * same call.\n */\n private async processChar(char: string): Promise<void> {\n if (this.mode === \"bufferingBrace\") {\n await this.processBraceChar(char);\n return;\n }\n\n if (this.mode === \"bufferingFence\") {\n await this.processFenceChar(char);\n return;\n }\n\n let current = char;\n\n while (true) {\n if (this.holdback.length === 0 && current === \"{\") {\n this.openBraceBuffer(current);\n return;\n }\n\n const extended = this.holdback + current;\n\n if (this.isFenceOpenerPrefix(extended)) {\n this.holdback = extended;\n\n if (extended === FENCE_OPENER) {\n this.openFenceBuffer();\n }\n\n return;\n }\n\n if (this.holdback.length === 0) {\n this.onSafeDelta(current);\n return;\n }\n\n this.onSafeDelta(this.holdback);\n this.holdback = \"\";\n }\n }\n\n /**\n * Recognize any strict prefix of {@link FENCE_OPENER} including the\n * full string. Used to decide whether to keep extending the holdback\n * or flush it as plain text.\n */\n private isFenceOpenerPrefix(candidate: string): boolean {\n return candidate.length <= FENCE_OPENER.length && FENCE_OPENER.startsWith(candidate);\n }\n\n /**\n * Enter `bufferingBrace` mode with the seed `{` as the first buffer\n * character and the initial brace depth set to one. Any holdback at\n * this point was already a non-fence sequence so it stays empty.\n */\n private openBraceBuffer(seed: string): void {\n this.mode = \"bufferingBrace\";\n this.buffer = seed;\n this.braceDepth = 1;\n this.inString = false;\n this.escapeNext = false;\n }\n\n /**\n * Enter `bufferingFence` mode immediately after the opener\n * ```` ```json ```` matched in the holdback. Holdback resets;\n * subsequent characters accumulate into the buffer until the\n * closing fence is seen.\n */\n private openFenceBuffer(): void {\n this.mode = \"bufferingFence\";\n this.buffer = \"\";\n this.fenceCloseTail = \"\";\n this.holdback = \"\";\n }\n\n /**\n * Process one character while accumulating a brace-delimited JSON\n * object. Tracks string-literal context so `{` / `}` inside `\"...\"`\n * do not skew brace depth. Closes (and classifies) on balanced\n * braces; flushes-as-text on cap overflow.\n */\n private async processBraceChar(char: string): Promise<void> {\n this.buffer += char;\n\n if (this.inString) {\n if (this.escapeNext) {\n this.escapeNext = false;\n return;\n }\n\n if (char === \"\\\\\") {\n this.escapeNext = true;\n return;\n }\n\n if (char === '\"') {\n this.inString = false;\n }\n\n this.guardBufferCap(\"brace\");\n return;\n }\n\n if (char === '\"') {\n this.inString = true;\n this.guardBufferCap(\"brace\");\n return;\n }\n\n if (char === \"{\") {\n this.braceDepth++;\n this.guardBufferCap(\"brace\");\n return;\n }\n\n if (char === \"}\") {\n this.braceDepth--;\n\n if (this.braceDepth === 0) {\n await this.closeBraceBuffer();\n return;\n }\n\n this.guardBufferCap(\"brace\");\n return;\n }\n\n this.guardBufferCap(\"brace\");\n }\n\n /**\n * Process one character while accumulating a fence-delimited JSON\n * block. The closing fence ```` ``` ```` ends the block; the closing\n * characters are NOT included in the classified buffer (they are\n * re-emitted only when the block flushes back to text).\n */\n private async processFenceChar(char: string): Promise<void> {\n this.fenceCloseTail += char;\n\n if (this.fenceCloseTail.length > FENCE_CLOSER.length) {\n this.fenceCloseTail = this.fenceCloseTail.slice(-FENCE_CLOSER.length);\n }\n\n if (this.fenceCloseTail === FENCE_CLOSER) {\n const innerLength = this.buffer.length - (FENCE_CLOSER.length - 1);\n this.buffer = this.buffer.slice(0, Math.max(0, innerLength));\n\n await this.closeFenceBuffer();\n return;\n }\n\n this.buffer += char;\n this.guardBufferCap(\"fence\");\n }\n\n /**\n * Enforce the buffer-byte cap. When the current buffer exceeds the\n * cap, flush it back to the consumer as plain text and reset to\n * pass-through. Acts as a runaway / adversarial-input safety valve.\n */\n private guardBufferCap(source: \"brace\" | \"fence\"): void {\n if (this.buffer.length <= this.maxBufferBytes) {\n return;\n }\n\n if (source === \"brace\") {\n this.flushBraceBufferAsText();\n return;\n }\n\n this.flushFenceBufferAsText();\n }\n\n /**\n * Run the envelope matcher against the closed brace buffer. On a\n * match, synthesize a recovered `ModelToolCallRequest`; on no\n * match, flush the buffer back as plain text. Resets state to\n * pass-through either way.\n */\n private async closeBraceBuffer(): Promise<void> {\n const closed = this.buffer;\n\n this.resetToPassThrough();\n\n const matched = await this.tryMatchEnvelope(closed);\n\n if (matched) {\n return;\n }\n\n this.onSafeDelta(closed);\n }\n\n /**\n * Run the envelope matcher against the closed fence buffer. On a\n * match, synthesize a recovered call; on no match, flush as text\n * **with** the original opener and closer reconstructed so the\n * customer sees exactly the markdown the model emitted.\n */\n private async closeFenceBuffer(): Promise<void> {\n const closed = this.buffer;\n\n this.resetToPassThrough();\n\n const matched = await this.tryMatchEnvelope(closed);\n\n if (matched) {\n return;\n }\n\n this.onSafeDelta(`${FENCE_OPENER}${closed}${FENCE_CLOSER}`);\n }\n\n /**\n * Emit the brace-buffer verbatim as text and reset to pass-through.\n * Used on cap overflow and on `finalize()` for an unclosed buffer.\n */\n private flushBraceBufferAsText(): void {\n const closed = this.buffer;\n this.resetToPassThrough();\n this.onSafeDelta(closed);\n }\n\n /**\n * Emit the fence-buffer verbatim as text, reconstructing the\n * opener and closer so the original markdown structure is\n * preserved for the consumer.\n */\n private flushFenceBufferAsText(): void {\n const closed = this.buffer;\n this.resetToPassThrough();\n this.onSafeDelta(`${FENCE_OPENER}${closed}`);\n }\n\n /**\n * Reset all per-buffer state back to the pass-through baseline.\n * Called whenever a buffer closes — by recovery, by flush, or by\n * cap overflow — so the next character starts a fresh scan.\n */\n private resetToPassThrough(): void {\n this.mode = \"passThrough\";\n this.buffer = \"\";\n this.braceDepth = 0;\n this.inString = false;\n this.escapeNext = false;\n this.fenceCloseTail = \"\";\n }\n\n /**\n * Attempt to classify a closed buffer as a tool-call envelope. On\n * success, invoke `onRecoveredCall` with a synthesized request and\n * return `true`; on failure return `false` so the caller can flush\n * the buffer back as text.\n */\n private async tryMatchEnvelope(raw: string): Promise<boolean> {\n const parsed = safeParseJson(raw);\n\n if (parsed === undefined || typeof parsed !== \"object\" || parsed === null) {\n return false;\n }\n\n const envelope = parsed as Record<string, unknown>;\n const candidateName = readString(envelope, \"name\") ?? readString(envelope, \"tool\");\n const candidateInput = readObject(envelope, \"arguments\") ?? readObject(envelope, \"input\");\n\n if (!candidateName || !candidateInput) {\n return false;\n }\n\n const tool = this.tools.find((entry) => entry.name === candidateName);\n\n if (!tool || !tool.input) {\n return false;\n }\n\n const schema = tool.input as StandardSchemaV1<unknown>;\n\n let validationResult: StandardSchemaV1.Result<unknown>;\n\n try {\n validationResult = await schema[\"~standard\"].validate(candidateInput);\n } catch {\n return false;\n }\n\n if (validationResult.issues) {\n return false;\n }\n\n this.recoveredCount++;\n\n this.onRecoveredCall({\n id: `synth_${candidateName}_${this.recoveredCount}`,\n name: candidateName,\n input: validationResult.value,\n recoveredFrom: \"stream-text\",\n });\n\n return true;\n }\n}\n\n/**\n * Parse a JSON string returning `undefined` on any failure. Local to\n * the guard so it can distinguish \"not JSON\" from a parsed `null`\n * value, which `safeJsonParse` cannot — a parsed `null` is a valid\n * JSON value but not a valid envelope, and we want the difference.\n */\nfunction safeParseJson(raw: string): unknown {\n try {\n return JSON.parse(raw);\n } catch {\n return undefined;\n }\n}\n\n/**\n * Read a string-typed field from an envelope candidate. Returns\n * `undefined` when the key is missing or the value is non-string —\n * the matcher rejects either case.\n */\nfunction readString(envelope: Record<string, unknown>, key: string): string | undefined {\n const value = envelope[key];\n\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\n/**\n * Read an object-typed field from an envelope candidate. Returns\n * `undefined` when the key is missing or the value is not a\n * plain object (rejects arrays, primitives, null) — tool input\n * schemas always validate against an object root.\n */\nfunction readObject(\n envelope: Record<string, unknown>,\n key: string,\n): Record<string, unknown> | undefined {\n const value = envelope[key];\n\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, unknown>;\n}\n"],"mappings":"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"}
package/esm/ai.d.mts CHANGED
@@ -13,7 +13,7 @@ import { systemPrompt } from "./system-prompt/system-prompt.mjs";
13
13
  import { step } from "./workflow/step.mjs";
14
14
  import { workflow } from "./workflow/workflow.mjs";
15
15
 
16
- //#region ../../@warlock.js/ai/src/ai.d.ts
16
+ //#region ../@warlock.js/ai/src/ai.d.ts
17
17
  /**
18
18
  * Top-level `ai` namespace — holds built-in factories and user-registered SDK adapters.
19
19
  *
package/esm/ai.d.mts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.d.mts","names":[],"sources":["../../../../../@warlock.js/ai/src/ai.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyCA;;;;;;;;;;;;;;;;;;;;;;;cAAa,EAAA"}
1
+ {"version":3,"file":"ai.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/ai.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;AAyCA;;;;;;;;;;;;;;;;;;;;;;;cAAa,EAAA"}
package/esm/ai.mjs CHANGED
@@ -13,7 +13,7 @@ import { systemPrompt } from "./system-prompt/system-prompt.mjs";
13
13
  import { step } from "./workflow/step.mjs";
14
14
  import { workflow } from "./workflow/workflow.mjs";
15
15
 
16
- //#region ../../@warlock.js/ai/src/ai.ts
16
+ //#region ../@warlock.js/ai/src/ai.ts
17
17
  /**
18
18
  * Top-level `ai` namespace — holds built-in factories and user-registered SDK adapters.
19
19
  *
package/esm/ai.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"ai.mjs","names":[],"sources":["../../../../../@warlock.js/ai/src/ai.ts"],"sourcesContent":["import { agent } from \"./agent/agent\";\nimport { setAIConfig } from \"./config\";\nimport { budget } from \"./middleware/builtins/budget\";\nimport { guardrail } from \"./middleware/builtins/guardrail\";\nimport { semanticCache } from \"./middleware/builtins/semantic-cache\";\nimport { composeMiddleware, forTool } from \"./middleware/helpers\";\nimport { supervisor } from \"./supervisor/supervisor\";\nimport { instruction } from \"./system-prompt/instruction\";\nimport { persona } from \"./system-prompt/persona\";\nimport { systemPrompt } from \"./system-prompt/system-prompt\";\nimport { tool } from \"./tool/tool\";\nimport { step } from \"./workflow/step\";\nimport { workflow } from \"./workflow/workflow\";\n\n/**\n * Top-level `ai` namespace — holds built-in factories and user-registered SDK adapters.\n *\n * Factories:\n * - `ai.tool(...)` — wrap an async function with a schema-validated input.\n * - `ai.agent(...)` — build an executable agent from model + tools + prompt.\n * - `ai.systemPrompt(...)` — compose a layered persona + instructions prompt.\n * - `ai.persona(text)` — reusable persona block (can be passed to `systemPrompt`).\n * - `ai.instruction(text)` — reusable instruction block (can be passed to `systemPrompt`).\n * - `ai.openai.model(...)` / `ai.anthropic.model(...)` / ... once the adapter SDK is registered.\n *\n * @example\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n * const replyIn = ai.instruction(\"Respond in {{language|English}}.\");\n *\n * const prompt = ai.systemPrompt().persona(alex).instruction(replyIn);\n *\n * const myAgent = ai.agent({\n * model: ai.openai.model({ name: \"gpt-4o\" }),\n * systemPrompt: prompt,\n * tools: [myTool],\n * });\n *\n * const result = await myAgent.execute(\"What is the weather in Cairo?\", {\n * placeholders: { language: \"Arabic\" },\n * });\n */\nexport const ai = {\n config: setAIConfig,\n tool,\n agent,\n systemPrompt,\n persona,\n instruction,\n workflow,\n step,\n supervisor,\n middleware: {\n budget,\n guardrail,\n semanticCache,\n compose: composeMiddleware,\n forTool,\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,KAAK;CAChB,QAAQ;CACR;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,YAAY;EACV;EACA;EACA;EACA,SAAS;EACT;CACF;AACF"}
1
+ {"version":3,"file":"ai.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/ai.ts"],"sourcesContent":["import { agent } from \"./agent/agent\";\nimport { setAIConfig } from \"./config\";\nimport { budget } from \"./middleware/builtins/budget\";\nimport { guardrail } from \"./middleware/builtins/guardrail\";\nimport { semanticCache } from \"./middleware/builtins/semantic-cache\";\nimport { composeMiddleware, forTool } from \"./middleware/helpers\";\nimport { supervisor } from \"./supervisor/supervisor\";\nimport { instruction } from \"./system-prompt/instruction\";\nimport { persona } from \"./system-prompt/persona\";\nimport { systemPrompt } from \"./system-prompt/system-prompt\";\nimport { tool } from \"./tool/tool\";\nimport { step } from \"./workflow/step\";\nimport { workflow } from \"./workflow/workflow\";\n\n/**\n * Top-level `ai` namespace — holds built-in factories and user-registered SDK adapters.\n *\n * Factories:\n * - `ai.tool(...)` — wrap an async function with a schema-validated input.\n * - `ai.agent(...)` — build an executable agent from model + tools + prompt.\n * - `ai.systemPrompt(...)` — compose a layered persona + instructions prompt.\n * - `ai.persona(text)` — reusable persona block (can be passed to `systemPrompt`).\n * - `ai.instruction(text)` — reusable instruction block (can be passed to `systemPrompt`).\n * - `ai.openai.model(...)` / `ai.anthropic.model(...)` / ... once the adapter SDK is registered.\n *\n * @example\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n * const replyIn = ai.instruction(\"Respond in {{language|English}}.\");\n *\n * const prompt = ai.systemPrompt().persona(alex).instruction(replyIn);\n *\n * const myAgent = ai.agent({\n * model: ai.openai.model({ name: \"gpt-4o\" }),\n * systemPrompt: prompt,\n * tools: [myTool],\n * });\n *\n * const result = await myAgent.execute(\"What is the weather in Cairo?\", {\n * placeholders: { language: \"Arabic\" },\n * });\n */\nexport const ai = {\n config: setAIConfig,\n tool,\n agent,\n systemPrompt,\n persona,\n instruction,\n workflow,\n step,\n supervisor,\n middleware: {\n budget,\n guardrail,\n semanticCache,\n compose: composeMiddleware,\n forTool,\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,KAAK;CAChB,QAAQ;CACR;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA,YAAY;EACV;EACA;EACA;EACA,SAAS;EACT;CACF;AACF"}
package/esm/config.d.mts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { CacheDriver } from "@warlock.js/cache";
2
2
 
3
- //#region ../../@warlock.js/ai/src/config.d.ts
3
+ //#region ../@warlock.js/ai/src/config.d.ts
4
4
  /**
5
5
  * Process-wide `@warlock.js/ai` configuration. **Intentionally tiny.**
6
6
  * Lives here only for genuinely cross-cutting defaults that would
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.mts","names":[],"sources":["../../../../../@warlock.js/ai/src/config.ts"],"mappings":";;;;;AAuBA;;;;AAoB4B;AAoB5B;;;;;;;;;;;;;AAAiE;KAxCrD,QAAA;EAkDe;;;AAAY;AAWvC;;;;AAAkD;;;;;;;;;;;EAzChD,YAAA,GAAe,WAAW;AAAA;;;;;;;;;;;;;;;;iBAoBZ,WAAA,CAAY,OAAA,EAAS,OAAA,CAAQ,QAAA,IAAY,QAAA;;;;;;iBAUzC,WAAA,CAAA,GAAe,QAAQ;;;;;;;;iBAWvB,mBAAA,CAAA,GAAuB,WAAW"}
1
+ {"version":3,"file":"config.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/config.ts"],"mappings":";;;;;AAuBA;;;;AAoB4B;AAoB5B;;;;;;;;;;;;;AAAiE;KAxCrD,QAAA;EAkDe;;;AAAY;AAWvC;;;;AAAkD;;;;;;;;;;;EAzChD,YAAA,GAAe,WAAW;AAAA;;;;;;;;;;;;;;;;iBAoBZ,WAAA,CAAY,OAAA,EAAS,OAAA,CAAQ,QAAA,IAAY,QAAA;;;;;;iBAUzC,WAAA,IAAe,QAAQ;;;;;;;;iBAWvB,mBAAA,IAAuB,WAAW"}
package/esm/config.mjs CHANGED
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/config.ts
1
+ //#region ../@warlock.js/ai/src/config.ts
2
2
  const aiConfig = {};
3
3
  /**
4
4
  * Set or extend process-wide AI configuration. Merges over existing
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../@warlock.js/ai/src/config.ts"],"sourcesContent":["import type { CacheDriver } from \"@warlock.js/cache\";\n\n/**\n * Process-wide `@warlock.js/ai` configuration. **Intentionally tiny.**\n * Lives here only for genuinely cross-cutting defaults that would\n * otherwise force users to wire the same value into every consumer.\n *\n * **What lives here.** A field earns a slot only when it satisfies\n * all three:\n * 1. Multiple unrelated consumers need the same value.\n * 2. The value is infrastructure (drivers, clients, pools), not\n * behavior (kill-switches, mode flags).\n * 3. Per-call override doesn't make sense for the use case.\n *\n * **What does NOT live here.** Logger config (use\n * `@warlock.js/logger` directly). Per-primitive feature flags\n * (live on the relevant config type). Anything that's really one\n * consumer's concern (lives on that consumer).\n *\n * Phase 3.2 deliberately removed the previous `configureAI()` bag\n * because it was growing unbounded. Treat new fields here with the\n * same suspicion.\n */\nexport type AIConfig = {\n /**\n * Default store used by every consumer that supports persistence\n * but didn't supply its own `store` / `snapshotStore`. Most\n * realistic deployments back resume snapshots, semantic cache, and\n * future memory primitives with the same driver — declaring it\n * once here removes the repetition.\n *\n * Per-declaration overrides (`SupervisorConfig.snapshotStore`,\n * `semanticCache({ store })`) win when supplied. Set this once at\n * app boot, *after* you've constructed your driver.\n *\n * @example\n * import { cache } from \"@warlock.js/cache\";\n * import { ai } from \"@warlock.js/ai\";\n *\n * ai.config({\n * defaultStore: cache.driver(\"redis\", { client: redisClient }),\n * });\n */\n defaultStore?: CacheDriver<any, any>;\n};\n\nconst aiConfig: AIConfig = {};\n\n/**\n * Set or extend process-wide AI configuration. Merges over existing\n * values — fields not present in `partial` keep whatever was set\n * before (or stay unset). Call once at app boot, before constructing\n * any agent / supervisor / middleware that should pick up the\n * defaults.\n *\n * Returns the merged config so callers can verify what landed.\n *\n * @example\n * import { cache } from \"@warlock.js/cache\";\n * import { ai } from \"@warlock.js/ai\";\n *\n * ai.config({ defaultStore: cache.driver(\"redis\", { client }) });\n */\nexport function setAIConfig(partial: Partial<AIConfig>): AIConfig {\n Object.assign(aiConfig, partial);\n return { ...aiConfig };\n}\n\n/**\n * Read the current AI config snapshot. Returns a shallow copy so\n * callers can't accidentally mutate the source of truth. Used\n * internally by consumers to resolve their `defaultStore` fallback.\n */\nexport function getAIConfig(): AIConfig {\n return { ...aiConfig };\n}\n\n/**\n * Resolve the effective store for a consumer that didn't receive an\n * explicit one. Returns the global `defaultStore` if set, otherwise\n * `undefined`. Consumers decide whether `undefined` is fatal (semantic\n * cache: yes, throws) or a no-op (snapshot persistence: yes, just\n * skips).\n */\nexport function resolveDefaultStore(): CacheDriver<any, any> | undefined {\n return aiConfig.defaultStore;\n}\n"],"mappings":";AA8CA,MAAM,WAAqB,CAAC;;;;;;;;;;;;;;;;AAiB5B,SAAgB,YAAY,SAAsC;CAChE,OAAO,OAAO,UAAU,OAAO;CAC/B,OAAO,EAAE,GAAG,SAAS;AACvB;;;;;;AAOA,SAAgB,cAAwB;CACtC,OAAO,EAAE,GAAG,SAAS;AACvB;;;;;;;;AASA,SAAgB,sBAAyD;CACvE,OAAO,SAAS;AAClB"}
1
+ {"version":3,"file":"config.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/config.ts"],"sourcesContent":["import type { CacheDriver } from \"@warlock.js/cache\";\n\n/**\n * Process-wide `@warlock.js/ai` configuration. **Intentionally tiny.**\n * Lives here only for genuinely cross-cutting defaults that would\n * otherwise force users to wire the same value into every consumer.\n *\n * **What lives here.** A field earns a slot only when it satisfies\n * all three:\n * 1. Multiple unrelated consumers need the same value.\n * 2. The value is infrastructure (drivers, clients, pools), not\n * behavior (kill-switches, mode flags).\n * 3. Per-call override doesn't make sense for the use case.\n *\n * **What does NOT live here.** Logger config (use\n * `@warlock.js/logger` directly). Per-primitive feature flags\n * (live on the relevant config type). Anything that's really one\n * consumer's concern (lives on that consumer).\n *\n * Phase 3.2 deliberately removed the previous `configureAI()` bag\n * because it was growing unbounded. Treat new fields here with the\n * same suspicion.\n */\nexport type AIConfig = {\n /**\n * Default store used by every consumer that supports persistence\n * but didn't supply its own `store` / `snapshotStore`. Most\n * realistic deployments back resume snapshots, semantic cache, and\n * future memory primitives with the same driver — declaring it\n * once here removes the repetition.\n *\n * Per-declaration overrides (`SupervisorConfig.snapshotStore`,\n * `semanticCache({ store })`) win when supplied. Set this once at\n * app boot, *after* you've constructed your driver.\n *\n * @example\n * import { cache } from \"@warlock.js/cache\";\n * import { ai } from \"@warlock.js/ai\";\n *\n * ai.config({\n * defaultStore: cache.driver(\"redis\", { client: redisClient }),\n * });\n */\n defaultStore?: CacheDriver<any, any>;\n};\n\nconst aiConfig: AIConfig = {};\n\n/**\n * Set or extend process-wide AI configuration. Merges over existing\n * values — fields not present in `partial` keep whatever was set\n * before (or stay unset). Call once at app boot, before constructing\n * any agent / supervisor / middleware that should pick up the\n * defaults.\n *\n * Returns the merged config so callers can verify what landed.\n *\n * @example\n * import { cache } from \"@warlock.js/cache\";\n * import { ai } from \"@warlock.js/ai\";\n *\n * ai.config({ defaultStore: cache.driver(\"redis\", { client }) });\n */\nexport function setAIConfig(partial: Partial<AIConfig>): AIConfig {\n Object.assign(aiConfig, partial);\n return { ...aiConfig };\n}\n\n/**\n * Read the current AI config snapshot. Returns a shallow copy so\n * callers can't accidentally mutate the source of truth. Used\n * internally by consumers to resolve their `defaultStore` fallback.\n */\nexport function getAIConfig(): AIConfig {\n return { ...aiConfig };\n}\n\n/**\n * Resolve the effective store for a consumer that didn't receive an\n * explicit one. Returns the global `defaultStore` if set, otherwise\n * `undefined`. Consumers decide whether `undefined` is fatal (semantic\n * cache: yes, throws) or a no-op (snapshot persistence: yes, just\n * skips).\n */\nexport function resolveDefaultStore(): CacheDriver<any, any> | undefined {\n return aiConfig.defaultStore;\n}\n"],"mappings":";AA8CA,MAAM,WAAqB,CAAC;;;;;;;;;;;;;;;;AAiB5B,SAAgB,YAAY,SAAsC;CAChE,OAAO,OAAO,UAAU,OAAO;CAC/B,OAAO,EAAE,GAAG,SAAS;AACvB;;;;;;AAOA,SAAgB,cAAwB;CACtC,OAAO,EAAE,GAAG,SAAS;AACvB;;;;;;;;AASA,SAAgB,sBAAyD;CACvE,OAAO,SAAS;AAClB"}
@@ -7,7 +7,7 @@ import { AgentEventMap } from "../events/event-map.type.mjs";
7
7
  import { StreamingToolGuardConfig } from "../streaming-tool-guard-config.type.mjs";
8
8
  import { StandardSchemaV1 } from "@standard-schema/spec";
9
9
 
10
- //#region ../../@warlock.js/ai/src/contracts/agent/agent-options.type.d.ts
10
+ //#region ../@warlock.js/ai/src/contracts/agent/agent-options.type.d.ts
11
11
  /**
12
12
  * Options passed to AgentContract.execute() to configure a single execution run.
13
13
  *
@@ -1 +1 @@
1
- {"version":3,"file":"agent-options.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/agent/agent-options.type.ts"],"mappings":";;;;;;;;;;;;AAwBA;;;;;;;;;;;;;KAAY,mBAAA;EA2EL,wDAzEL,OAAA,GAAU,OAAA,IA+FW;EA7FrB,WAAA,GAAc,UAAA,IA6F+B;EA3F7C,YAAA,GAAe,YAAA;EAJf;;;;EASA,MAAA,GAAS,gBAAA,CAAiB,OAAA;EALX;;;;;;;;;;;;;;;;;;;;;;;;EA8Bf,cAAA,GAAiB,MAAA;EA0ER;;;;;;;;;;;;;;;;;;;;EArDT,MAAA;8EAEE,WAAA;EAAA;EAGF,YAAA,GAAe,oBAAA;;;;;;;;;;;EAWf,MAAA,GAAS,WAAA;EAET,EAAA,GAAK,OAAA,eACS,aAAA,IAAiB,OAAA,EAAS,aAAA,CAAc,CAAA;;;;;;;;;;;;EAatD,OAAA,GAAU,WAAA;;;;;;;;EAQV,kBAAA,GAAqB,wBAAA;;;;;;;;;;;;;EAarB,SAAA;AAAA"}
1
+ {"version":3,"file":"agent-options.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/agent/agent-options.type.ts"],"mappings":";;;;;;;;;;;;AAwBA;;;;;;;;;;;;;KAAY,mBAAA;EA2EL,wDAzEL,OAAA,GAAU,OAAA,IA+FW;EA7FrB,WAAA,GAAc,UAAA,IA6F+B;EA3F7C,YAAA,GAAe,YAAA;EAJf;;;;EASA,MAAA,GAAS,gBAAA,CAAiB,OAAA;EALX;;;;;;;;;;;;;;;;;;;;;;;;EA8Bf,cAAA,GAAiB,MAAA;EA0ER;;;;;;;;;;;;;;;;;;;;EArDT,MAAA;8EAEE,WAAA;EAAA;EAGF,YAAA,GAAe,oBAAA;;;;;;;;;;;EAWf,MAAA,GAAS,WAAA;EAET,EAAA,GAAK,OAAA,eACS,aAAA,IAAiB,OAAA,EAAS,aAAA,CAAc,CAAA;;;;;;;;;;;;EAatD,OAAA,GAAU,WAAA;;;;;;;;EAQV,kBAAA,GAAqB,wBAAA;;;;;;;;;;;;;EAarB,SAAA;AAAA"}
@@ -4,7 +4,7 @@ import { StreamContract } from "../stream/stream.contract.mjs";
4
4
  import { AgentEventMap } from "../events/event-map.type.mjs";
5
5
  import { AgentExecuteOptions } from "./agent-options.type.mjs";
6
6
 
7
- //#region ../../@warlock.js/ai/src/contracts/agent/agent.contract.d.ts
7
+ //#region ../@warlock.js/ai/src/contracts/agent/agent.contract.d.ts
8
8
  /**
9
9
  * Handler function for a single agent event. Takes the event's typed
10
10
  * payload; return value is ignored.
@@ -1 +1 @@
1
- {"version":3,"file":"agent.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/agent/agent.contract.ts"],"mappings":";;;;;;;;;AAUA;;KAAY,iBAAA,iBAAkC,aAAA,KAC5C,OAAA,EAAS,aAAA,CAAc,CAAA;;;;;;;;;;;;AAAE;AAyC3B;;;;;;;;;;;;;;;;;;;;;;;;;;UAAiB,aAAA,4BAAyC,kBAAA,SAExD,mBAAA,CAAoB,OAAA,GACpB,WAAA,CAAY,OAAA;EAAZ;;;;;;;;EAAA,SAUS,IAAA;EAmBP;;;;;EAAA,SAbO,WAAA;EAqBU;;;;;EAAA,SAfV,WAAA;EAwBT;;;;EAnBA,MAAA,CACE,KAAA,UACA,OAAA,GAAU,mBAAA,CAAoB,OAAA,IAC7B,cAAA,CAAe,WAAA,CAAY,OAAA;EAkBnB;;;;AAAoB;EAX/B,EAAA,iBAAmB,aAAA,EACjB,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,iBAAA,CAAkB,CAAA;;;;;EAO7B,GAAA,iBAAoB,aAAA,EAClB,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,iBAAA,CAAkB,CAAA;AAAA"}
1
+ {"version":3,"file":"agent.contract.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/agent/agent.contract.ts"],"mappings":";;;;;;;;;AAUA;;KAAY,iBAAA,iBAAkC,aAAA,KAC5C,OAAA,EAAS,aAAA,CAAc,CAAA;;;;;;;;;;;;AAAE;AAyC3B;;;;;;;;;;;;;;;;;;;;;;;;;;UAAiB,aAAA,4BAAyC,kBAAA,SAExD,mBAAA,CAAoB,OAAA,GACpB,WAAA,CAAY,OAAA;EAAZ;;;;;;;;EAAA,SAUS,IAAA;EAmBP;;;;;EAAA,SAbO,WAAA;EAqBU;;;;;EAAA,SAfV,WAAA;EAwBT;;;;EAnBA,MAAA,CACE,KAAA,UACA,OAAA,GAAU,mBAAA,CAAoB,OAAA,IAC7B,cAAA,CAAe,WAAA,CAAY,OAAA;EAkBnB;;;;AAAoB;EAX/B,EAAA,iBAAmB,aAAA,EACjB,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,iBAAA,CAAkB,CAAA;;;;;EAO7B,GAAA,iBAAoB,aAAA,EAClB,KAAA,EAAO,CAAA,EACP,OAAA,EAAS,iBAAA,CAAkB,CAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/attachment.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/attachment.type.d.ts
2
2
  /**
3
3
  * Shape of a StorageFile object from @warlock.js/core.
4
4
  * Used to detect storage files in the Attachment union.
@@ -1 +1 @@
1
- {"version":3,"file":"attachment.type.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/attachment.type.ts"],"mappings":";;AAUA;;;;AAIc;AAed;;;;KAnBY,gBAAA;EAsBN,6BApBJ,GAAA,WAoB6B;EAlB7B,YAAY;AAAA;;;;;;;;;;;;;KAeF,gBAAA,YAER,gBAAgB;EACd,MAAA;EAAgB,SAAA;AAAA;AAwDtB;;;;;;;;;;;;AAG8C;;;;;;;;;;;;;;;;;;;;;;AAH9C,KApBY,UAAA,YAER,gBAAA;EACE,IAAA;EAAe,MAAA,EAAQ,gBAAA;AAAA;EACvB,IAAA;EAAc,MAAA,EAAQ,gBAAA;AAAA;;;;;;;;;;;;;;;KAgBhB,kBAAA;EACN,IAAA;EAAa,KAAA;AAAA;EACb,IAAA;EAAc,KAAA;AAAA;EACd,IAAA;EAAgB,KAAA;EAAe,SAAA;AAAA"}
1
+ {"version":3,"file":"attachment.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/attachment.type.ts"],"mappings":";;AAUA;;;;AAIc;AAed;;;;KAnBY,gBAAA;EAsBN,6BApBJ,GAAA,WAoB6B;EAlB7B,YAAY;AAAA;;;;;;;;;;;;;KAeF,gBAAA,YAER,gBAAgB;EACd,MAAA;EAAgB,SAAA;AAAA;AAwDtB;;;;;;;;;;;;AAG8C;;;;;;;;;;;;;;;;;;;;;;AAH9C,KApBY,UAAA,YAER,gBAAA;EACE,IAAA;EAAe,MAAA,EAAQ,gBAAA;AAAA;EACvB,IAAA;EAAc,MAAA,EAAQ,gBAAA;AAAA;;;;;;;;;;;;;;;KAgBhB,kBAAA;EACN,IAAA;EAAa,KAAA;AAAA;EACb,IAAA;EAAc,KAAA;AAAA;EACd,IAAA;EAAgB,KAAA;EAAe,SAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/content-part.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/content-part.type.d.ts
2
2
  /**
3
3
  * A single resolved piece of message content.
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"content-part.type.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/content-part.type.ts"],"mappings":";;AA6BA;;;;;;;;;;AAA+F;AAW/F;;;;;;;;AAAuE;;;;;;;;;KAX3D,WAAA;EAAgB,IAAA;EAAc,IAAA;AAAA;EAAmB,IAAA;EAAe,MAAA,EAAQ,WAAW;AAAA;;;;;;;;;;KAWnF,WAAA;EAAgB,GAAA;AAAA;EAAkB,MAAA;EAAgB,SAAA;AAAA"}
1
+ {"version":3,"file":"content-part.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/content-part.type.ts"],"mappings":";;AA6BA;;;;;;;;;;AAA+F;AAW/F;;;;;;;;AAAuE;;;;;;;;;KAX3D,WAAA;EAAgB,IAAA;EAAc,IAAA;AAAA;EAAmB,IAAA;EAAe,MAAA,EAAQ,WAAW;AAAA;;;;;;;;;;KAWnF,WAAA;EAAgB,GAAA;AAAA;EAAkB,MAAA;EAAgB,SAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { ContentPart } from "./content-part.type.mjs";
2
2
  import { ModelToolCallRequest } from "./model-tool-call-request.type.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/contracts/conversation-message.type.d.ts
4
+ //#region ../@warlock.js/ai/src/contracts/conversation-message.type.d.ts
5
5
  /**
6
6
  * A single message in a conversation history.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"conversation-message.type.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/conversation-message.type.ts"],"mappings":";;;;;;AAgCA;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAY,OAAA,QAAe,MAAA;mBAEzB,EAAA;EAEA,IAAA;;;;;;EAMA,OAAA,WAAkB,WAAA;EAElB,UAAA;EAEA,SAAA,GAAY,oBAAA;EAEZ,SAAA,GAAY,IAAA;EAEZ,QAAA,GAAW,MAAA;EAEX,IAAA,GAAO,IAAA;AAAA"}
1
+ {"version":3,"file":"conversation-message.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/conversation-message.type.ts"],"mappings":";;;;;;AAgCA;;;;;;;;;;;;;;;;;;;;;;;;;;;KAAY,OAAA,QAAe,MAAA;mBAEzB,EAAA;EAEA,IAAA;;;;;;EAMA,OAAA,WAAkB,WAAA;EAElB,UAAA;EAEA,SAAA,GAAY,oBAAA;EAEZ,SAAA,GAAY,IAAA;EAEZ,QAAA,GAAW,MAAA;EAEX,IAAA,GAAO,IAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/embedder.contract.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/embedder.contract.d.ts
2
2
  /** Token usage returned from an embedding request. */
3
3
  type EmbeddingUsage = {
4
4
  promptTokens: number;
@@ -1 +1 @@
1
- {"version":3,"file":"embedder.contract.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/embedder.contract.ts"],"mappings":";;KACY,cAAA;EACV,YAAA;EACA,WAAW;AAAA;AAAA;AAAA,KAID,eAAA;EACV,MAAA;EACA,UAAA;EACA,KAAA,EAAO,cAAc;AAAA;;KAIX,oBAAA;EACV,OAAA;EACA,UAAA;EACA,KAAA,EAAO,cAAc;AAAA;;;;;;;;KAUX,cAAA;EACV,IAAA;EACA,UAAA;EAAA,CACC,GAAA;AAAA;;;;;;AAAW;AAiBd;;;;;;;;UAAiB,gBAAA;EAAA,SACN,IAAA;EAAA,SACA,QAAA;EAST;;;;;;;;EAAA,UAAA;EAWyD;EARzD,KAAA,CAAM,KAAA,WAAgB,OAAA,CAAQ,eAAA;;;;;;;EAQ9B,SAAA,CAAU,MAAA,aAAmB,OAAA,CAAQ,oBAAA;AAAA"}
1
+ {"version":3,"file":"embedder.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/embedder.contract.ts"],"mappings":";;KACY,cAAA;EACV,YAAA;EACA,WAAW;AAAA;AAAA;AAAA,KAID,eAAA;EACV,MAAA;EACA,UAAA;EACA,KAAA,EAAO,cAAc;AAAA;;KAIX,oBAAA;EACV,OAAA;EACA,UAAA;EACA,KAAA,EAAO,cAAc;AAAA;;;;;;;;KAUX,cAAA;EACV,IAAA;EACA,UAAA;EAAA,CACC,GAAA;AAAA;;;;;;AAAW;AAiBd;;;;;;;;UAAiB,gBAAA;EAAA,SACN,IAAA;EAAA,SACA,QAAA;EAST;;;;;;;;EAAA,UAAA;EAWyD;EARzD,KAAA,CAAM,KAAA,WAAgB,OAAA,CAAQ,eAAA;;;;;;;EAQ9B,SAAA,CAAU,MAAA,aAAmB,OAAA,CAAQ,oBAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/end.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/end.type.d.ts
2
2
  /**
3
3
  * Framework-global termination sentinel. Emitted by any primitive
4
4
  * whose control flow is routed through JSON-serializable strings —
@@ -1 +1 @@
1
- {"version":3,"file":"end.type.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/end.type.ts"],"mappings":";;AAyCA;;;;AAA6C;AAQ7C;;;;AAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cARvB,GAAA;;;;;;;KAQD,WAAA,UAAqB,GAAG"}
1
+ {"version":3,"file":"end.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/end.type.ts"],"mappings":";;AAyCA;;;;AAA6C;AAQ7C;;;;AAAoC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cARvB,GAAA;;;;;;;KAQD,WAAA,UAAqB,GAAG"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/end.type.ts
1
+ //#region ../@warlock.js/ai/src/contracts/end.type.ts
2
2
  /**
3
3
  * Framework-global termination sentinel. Emitted by any primitive
4
4
  * whose control flow is routed through JSON-serializable strings —
@@ -1 +1 @@
1
- {"version":3,"file":"end.type.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/end.type.ts"],"sourcesContent":["/**\n * Framework-global termination sentinel. Emitted by any primitive\n * whose control flow is routed through JSON-serializable strings —\n * supervisor (router agent's `next`, deterministic `route` callback),\n * future planner (plan steps), future orchestrator (session\n * directive), any future primitive that needs to say \"stop\" across a\n * wire that can't carry `null`.\n *\n * **Why one shared literal.** Consumers learn one word. Cross-\n * primitive pipes — a planner feeding a supervisor, a supervisor\n * nested as a tool inside an orchestrator — can pass the sentinel\n * through without translation.\n *\n * **Why this specific string.** Brand-prefixed (`__warlock:`) so it\n * can't collide with a realistic user-chosen intent / step / route\n * key (`\"end\"`, `\"done\"`, `\"stop\"` are all valid user keys).\n * Underscore-surrounded so it stands out in logs and snapshots.\n * JSON-safe so a router agent emits it verbatim.\n *\n * **Not used by every primitive.** Workflow's `nextStep` returns\n * `null` to end — a callback-level mechanism that predates this\n * sentinel. Workflows keep `null`; the sentinel is for primitives\n * whose \"end\" must survive a JSON boundary.\n *\n * @example\n * import { END } from \"@warlock.js/ai\";\n *\n * // Supervisor route callback\n * ai.supervisor({\n * intents: { writer, critic },\n * route: (ctx) => (ctx.iteration >= 5 ? END : \"writer\"),\n * });\n *\n * // Router agent output schema\n * const router = ai.agent({\n * model,\n * output: z.object({\n * next: z.union([z.string(), z.array(z.string()), z.literal(END)]),\n * }),\n * });\n */\nexport const END = \"__warlock:end__\" as const;\n\n/**\n * Value type of `END`. Exposed so consumers building Zod / Standard\n * Schema output schemas can write `z.literal(END)` without\n * hard-coding the string, and so generic helpers that accept \"the\n * end sentinel\" can type-narrow correctly.\n */\nexport type EndSentinel = typeof END;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,MAAM"}
1
+ {"version":3,"file":"end.type.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/end.type.ts"],"sourcesContent":["/**\n * Framework-global termination sentinel. Emitted by any primitive\n * whose control flow is routed through JSON-serializable strings —\n * supervisor (router agent's `next`, deterministic `route` callback),\n * future planner (plan steps), future orchestrator (session\n * directive), any future primitive that needs to say \"stop\" across a\n * wire that can't carry `null`.\n *\n * **Why one shared literal.** Consumers learn one word. Cross-\n * primitive pipes — a planner feeding a supervisor, a supervisor\n * nested as a tool inside an orchestrator — can pass the sentinel\n * through without translation.\n *\n * **Why this specific string.** Brand-prefixed (`__warlock:`) so it\n * can't collide with a realistic user-chosen intent / step / route\n * key (`\"end\"`, `\"done\"`, `\"stop\"` are all valid user keys).\n * Underscore-surrounded so it stands out in logs and snapshots.\n * JSON-safe so a router agent emits it verbatim.\n *\n * **Not used by every primitive.** Workflow's `nextStep` returns\n * `null` to end — a callback-level mechanism that predates this\n * sentinel. Workflows keep `null`; the sentinel is for primitives\n * whose \"end\" must survive a JSON boundary.\n *\n * @example\n * import { END } from \"@warlock.js/ai\";\n *\n * // Supervisor route callback\n * ai.supervisor({\n * intents: { writer, critic },\n * route: (ctx) => (ctx.iteration >= 5 ? END : \"writer\"),\n * });\n *\n * // Router agent output schema\n * const router = ai.agent({\n * model,\n * output: z.object({\n * next: z.union([z.string(), z.array(z.string()), z.literal(END)]),\n * }),\n * });\n */\nexport const END = \"__warlock:end__\" as const;\n\n/**\n * Value type of `END`. Exposed so consumers building Zod / Standard\n * Schema output schemas can write `z.literal(END)` without\n * hard-coding the string, and so generic helpers that accept \"the\n * end sentinel\" can type-narrow correctly.\n */\nexport type EndSentinel = typeof END;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,MAAM"}
@@ -3,7 +3,7 @@ import { ToolCall } from "../result/tool-call.type.mjs";
3
3
  import { LLMTrip } from "../result/llm-trip.type.mjs";
4
4
  import { AgentResult } from "../result/agent-result.type.mjs";
5
5
 
6
- //#region ../../@warlock.js/ai/src/contracts/events/agent-events.type.d.ts
6
+ //#region ../@warlock.js/ai/src/contracts/events/agent-events.type.d.ts
7
7
  /**
8
8
  * Lightweight tool metadata surfaced on tool-lifecycle events. A
9
9
  * deliberately thin slice of `ToolConfig` — name and description
@@ -1 +1 @@
1
- {"version":3,"file":"agent-events.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/events/agent-events.type.ts"],"mappings":";;;;;;;;AAaA;;;;;;KAAY,aAAA;EAWJ,uCATN,IAAA,UAaU;EAXV,WAAA;;;AAWwC;AAG1C;;;EAPE,MAAA;AAAA;AAUF;AAAA,KANY,oBAAA;EAAyB,KAAK;AAAA;AAMoB;AAAA,KAHlD,uBAAA;EAA4B,SAAA;EAAmB,KAAK;AAAA;;KAGpD,qBAAA;EAA0B,KAAA;EAAe,SAAS;AAAA;AAMnD;AAAA,KAHC,uBAAA;EACV,IAAA,EAAM,aAAa;EACnB,KAAA;EACA,SAAA;AAAA;;KAIU,sBAAA,GAAyB,QAAA;EAAa,IAAA,EAAM,aAAa;AAAA;AAGrE;AAAA,KAAY,6BAAA;EACV,IAAA,EAAM,aAAA;EACN,KAAA;EACA,KAAA,EAAO,OAAO;EACd,SAAA;AAAA;;KAIU,yBAAA;EAA8B,IAAA,EAAM,OAAO;AAAA;AAJ5C;AAAA,KAOC,qBAAA;EACV,MAAA,EAAQ,WAAW,CAAC,OAAA;AAAA;;KAIV,iBAAA;EAAsB,KAAA,EAAO,OAAO;AAAA"}
1
+ {"version":3,"file":"agent-events.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/events/agent-events.type.ts"],"mappings":";;;;;;;;AAaA;;;;;;KAAY,aAAA;EAWJ,uCATN,IAAA,UAaU;EAXV,WAAA;;;AAWwC;AAG1C;;;EAPE,MAAA;AAAA;AAUF;AAAA,KANY,oBAAA;EAAyB,KAAK;AAAA;AAMoB;AAAA,KAHlD,uBAAA;EAA4B,SAAA;EAAmB,KAAK;AAAA;;KAGpD,qBAAA;EAA0B,KAAA;EAAe,SAAS;AAAA;AAMnD;AAAA,KAHC,uBAAA;EACV,IAAA,EAAM,aAAa;EACnB,KAAA;EACA,SAAA;AAAA;;KAIU,sBAAA,GAAyB,QAAA;EAAa,IAAA,EAAM,aAAa;AAAA;AAGrE;AAAA,KAAY,6BAAA;EACV,IAAA,EAAM,aAAA;EACN,KAAA;EACA,KAAA,EAAO,OAAO;EACd,SAAA;AAAA;;KAIU,yBAAA;EAA8B,IAAA,EAAM,OAAO;AAAA;AAJ5C;AAAA,KAOC,qBAAA;EACV,MAAA,EAAQ,WAAW,CAAC,OAAA;AAAA;;KAIV,iBAAA;EAAsB,KAAA,EAAO,OAAO;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { AgentResult } from "../result/agent-result.type.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/contracts/events/complete-event.type.d.ts
3
+ //#region ../@warlock.js/ai/src/contracts/events/complete-event.type.d.ts
4
4
  /**
5
5
  * Execution-completion payload for the `onComplete` agent hook (T1
6
6
  * of the 2026-05-08 ai-usage/runs/state/cart plan).
@@ -1 +1 @@
1
- {"version":3,"file":"complete-event.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/events/complete-event.type.ts"],"mappings":";;;;;AAwBA;;;;;;;;;;;AAMY;;;;;;;;;KANA,aAAA;mEAEV,MAAA,EAAQ,WAAW,CAAC,OAAA;EAEpB,KAAA;EAEA,UAAA;AAAA"}
1
+ {"version":3,"file":"complete-event.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/events/complete-event.type.ts"],"mappings":";;;;;AAwBA;;;;;;;;;;;AAMY;;;;;;;;;KANA,aAAA;mEAEV,MAAA,EAAQ,WAAW,CAAC,OAAA;EAEpB,KAAA;EAEA,UAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/events/event-identity.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/events/event-identity.type.d.ts
2
2
  /**
3
3
  * Run-scoped identity stamped onto every lifecycle event payload
4
4
  * (agent, workflow, supervisor) and every stream event.
@@ -1 +1 @@
1
- {"version":3,"file":"event-identity.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/events/event-identity.type.ts"],"mappings":";;AAeA;;;;AAAsD;AAQtD;;;;;;;;;KARY,aAAA;EAAkB,KAAA;EAAe,SAAS;AAAA;AAQM;;;;;;AAAA,KAAhD,eAAA,MAAqB,IAAA,CAAK,CAAA,QAAS,aAAA"}
1
+ {"version":3,"file":"event-identity.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/events/event-identity.type.ts"],"mappings":";;AAeA;;;;AAAsD;AAQtD;;;;;;;;;KARY,aAAA;EAAkB,KAAA;EAAe,SAAS;AAAA;AAQM;;;;;;AAAA,KAAhD,eAAA,MAAqB,IAAA,CAAK,CAAA,QAAS,aAAA"}
@@ -3,7 +3,7 @@ import { EventIdentity } from "./event-identity.type.mjs";
3
3
  import { SupervisorAckCompletedPayload, SupervisorAckStreamingPayload, SupervisorAgentCompletedPayload, SupervisorAgentFailedPayload, SupervisorAgentStartingPayload, SupervisorAgentStreamingPayload, SupervisorCancelledPayload, SupervisorClassifierCompletedPayload, SupervisorClassifierFailedPayload, SupervisorClassifierStartingPayload, SupervisorClassifierStreamingPayload, SupervisorCompletedPayload, SupervisorErrorPayload, SupervisorEvaluateVerdictPayload, SupervisorIterationCompletedPayload, SupervisorIterationStartingPayload, SupervisorRouterDecidedPayload, SupervisorRouterDecidingPayload, SupervisorStartingPayload } from "./supervisor-events.type.mjs";
4
4
  import { WorkflowCancelledPayload, WorkflowCompletedPayload, WorkflowErrorPayload, WorkflowLoopWarningPayload, WorkflowStartingPayload, WorkflowStepCompletedPayload, WorkflowStepFailedPayload, WorkflowStepRetryingPayload, WorkflowStepSkippedPayload, WorkflowStepStartingPayload, WorkflowStepStreamingPayload } from "./workflow-events.type.mjs";
5
5
 
6
- //#region ../../@warlock.js/ai/src/contracts/events/event-map.type.d.ts
6
+ //#region ../@warlock.js/ai/src/contracts/events/event-map.type.d.ts
7
7
  /**
8
8
  * Apply run identity to every value of an event map. The central
9
9
  * `emit` chokepoint of each primitive injects `runId` / `rootRunId`,
@@ -1 +1 @@
1
- {"version":3,"file":"event-map.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/events/event-map.type.ts"],"mappings":";;;;;;;;AA6CgC;;;;KAQ3B,YAAA,uBAAmC,IAAA,GAAO,IAAA,CAAK,CAAA,IAAK,aAAA;;;;;;;;;;KAW7C,aAAA,GAAgB,YAAA;EAC1B,gBAAA,EAAkB,oBAAA;EAClB,oBAAA,EAAsB,uBAAA;EACtB,sBAAA,EAAwB,qBAAA;EACxB,sBAAA,EAAwB,yBAAA;EACxB,oBAAA,EAAsB,uBAAA;EACtB,mBAAA,EAAqB,sBAAA;EACrB,mBAAA,EAAqB,6BAAA;EACrB,iBAAA,EAAmB,qBAAA;EACnB,aAAA,EAAe,iBAAA;AAAA;;KAIL,gBAAA,GAAmB,YAAA;EAC7B,mBAAA,EAAqB,uBAAA;EACrB,wBAAA,EAA0B,2BAAA;EAC1B,yBAAA,EAA2B,4BAAA;EAC3B,yBAAA,EAA2B,4BAAA;EAC3B,uBAAA,EAAyB,0BAAA;EACzB,wBAAA,EAA0B,2BAAA;EAC1B,sBAAA,EAAwB,yBAAA;EACxB,uBAAA,EAAyB,0BAAA;EACzB,oBAAA,EAAsB,wBAAA;EACtB,oBAAA,EAAsB,wBAAA;EACtB,gBAAA,EAAkB,oBAAA;AAAA;;;;;;;;;;KAYR,kBAAA,GAAqB,YAAA;EAC/B,qBAAA,EAAuB,yBAAA;EACvB,+BAAA,EAAiC,kCAAA;EACjC,4BAAA,EAA8B,+BAAA;EAC9B,2BAAA,EAA6B,8BAAA;EAC7B,2BAAA,EAA6B,8BAAA;EAC7B,4BAAA,EAA8B,+BAAA;EAC9B,4BAAA,EAA8B,+BAAA;EAC9B,yBAAA,EAA2B,4BAAA;EAC3B,0BAAA,EAA4B,6BAAA;EAC5B,0BAAA,EAA4B,6BAAA;EAC5B,gCAAA,EAAkC,mCAAA;EAClC,iCAAA,EAAmC,oCAAA;EACnC,iCAAA,EAAmC,oCAAA;EACnC,8BAAA,EAAgC,iCAAA;EAChC,6BAAA,EAA+B,gCAAA;EAC/B,gCAAA,EAAkC,mCAAA;EAClC,sBAAA,EAAwB,0BAAA;EACxB,sBAAA,EAAwB,0BAAA;EACxB,kBAAA,EAAoB,sBAAA;AAAA"}
1
+ {"version":3,"file":"event-map.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/events/event-map.type.ts"],"mappings":";;;;;;;;AA6CgC;;;;KAQ3B,YAAA,uBAAmC,IAAA,GAAO,IAAA,CAAK,CAAA,IAAK,aAAA;;;;;;;;;;KAW7C,aAAA,GAAgB,YAAA;EAC1B,gBAAA,EAAkB,oBAAA;EAClB,oBAAA,EAAsB,uBAAA;EACtB,sBAAA,EAAwB,qBAAA;EACxB,sBAAA,EAAwB,yBAAA;EACxB,oBAAA,EAAsB,uBAAA;EACtB,mBAAA,EAAqB,sBAAA;EACrB,mBAAA,EAAqB,6BAAA;EACrB,iBAAA,EAAmB,qBAAA;EACnB,aAAA,EAAe,iBAAA;AAAA;;KAIL,gBAAA,GAAmB,YAAA;EAC7B,mBAAA,EAAqB,uBAAA;EACrB,wBAAA,EAA0B,2BAAA;EAC1B,yBAAA,EAA2B,4BAAA;EAC3B,yBAAA,EAA2B,4BAAA;EAC3B,uBAAA,EAAyB,0BAAA;EACzB,wBAAA,EAA0B,2BAAA;EAC1B,sBAAA,EAAwB,yBAAA;EACxB,uBAAA,EAAyB,0BAAA;EACzB,oBAAA,EAAsB,wBAAA;EACtB,oBAAA,EAAsB,wBAAA;EACtB,gBAAA,EAAkB,oBAAA;AAAA;;;;;;;;;;KAYR,kBAAA,GAAqB,YAAA;EAC/B,qBAAA,EAAuB,yBAAA;EACvB,+BAAA,EAAiC,kCAAA;EACjC,4BAAA,EAA8B,+BAAA;EAC9B,2BAAA,EAA6B,8BAAA;EAC7B,2BAAA,EAA6B,8BAAA;EAC7B,4BAAA,EAA8B,+BAAA;EAC9B,4BAAA,EAA8B,+BAAA;EAC9B,yBAAA,EAA2B,4BAAA;EAC3B,0BAAA,EAA4B,6BAAA;EAC5B,0BAAA,EAA4B,6BAAA;EAC5B,gCAAA,EAAkC,mCAAA;EAClC,iCAAA,EAAmC,oCAAA;EACnC,iCAAA,EAAmC,oCAAA;EACnC,8BAAA,EAAgC,iCAAA;EAChC,6BAAA,EAA+B,gCAAA;EAC/B,gCAAA,EAAkC,mCAAA;EAClC,sBAAA,EAAwB,0BAAA;EACxB,sBAAA,EAAwB,0BAAA;EACxB,kBAAA,EAAoB,sBAAA;AAAA"}
@@ -5,7 +5,7 @@ import { IterationSnapshot } from "../supervisor/iteration-snapshot.type.mjs";
5
5
  import { SupervisorInput } from "../supervisor/supervisor-input.type.mjs";
6
6
  import { EvaluateResult } from "../supervisor/evaluate-context.type.mjs";
7
7
  import { SupervisorResult } from "../result/supervisor-result.type.mjs";
8
- //#region ../../@warlock.js/ai/src/contracts/events/supervisor-events.type.d.ts
8
+ //#region ../@warlock.js/ai/src/contracts/events/supervisor-events.type.d.ts
9
9
  /** Fires once at the start of every `supervisor.execute()` call. */
10
10
  type SupervisorStartingPayload = {
11
11
  supervisorName: string;
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor-events.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/events/supervisor-events.type.ts"],"mappings":";;;;;;;;;KAWY,yBAAA;EACV,cAAA;EACA,KAAA,EAAO,eAAe;AAAA;;KAIZ,kCAAA;EAAuC,SAAS;AAAA;;KAGhD,+BAAA;EAAoC,SAAS;AAAA;;KAG7C,8BAAA;EACV,SAAA;EACA,IAAA,EAAM,IAAI;EACV,SAAA;EACA,UAAA;AAAA;AAV0D;AAAA,KAchD,8BAAA;EACV,SAAA;EACA,MAAA;EACA,KAAA;AAAA;AAXF;;;;;AAAA,KAmBY,+BAAA;EACV,SAAA;EACA,MAAA;EACA,KAAA;AAAA;AAlBU;AAAA,KAsBA,+BAAA;EACV,SAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;IAAS,KAAA;IAAe,MAAA;IAAgB,KAAA;EAAA;EACxC,QAAA;AAAA;;;;;;KAQU,4BAAA;EACV,SAAA;EACA,MAAA;EACA,KAAA,EAAO,OAAO;AAAA;;;;;;KAQJ,mCAAA;EAAwC,SAAS;AAAA;;;AAnBnD;AAQV;;;;KAoBY,oCAAA;EACV,KAAK;AAAA;;;AAlBS;AAQhB;;;KAmBY,oCAAA;EACV,MAAA;IAAU,MAAA;IAAiB,SAAA;IAAoB,UAAA;EAAA;EAC/C,MAAA;EACA,OAAA;EACA,MAAA;EACA,QAAA;EACA,KAAA,GAAQ,KAAK;AAAA;;;;;;KAQH,iCAAA;EACV,KAAA,EAAO,OAAO;AAAA;;;AATD;AAQf;;;KAUY,6BAAA;EACV,KAAK;AAAA;;;;AAAA;AAQP;KAAY,6BAAA;EACV,MAAA;EACA,KAAA,GAAQ,KAAA;EACR,QAAA;EACA,KAAA,GAAQ,OAAO;AAAA;;KAIL,gCAAA;EACV,SAAA;EACA,OAAA,EAAS,cAAc;AAAA;AAFzB;;;;AAAA,KASY,mCAAA;EACV,SAAA;EACA,QAAA,EAAU,iBAAiB;AAAA;AATJ;AAAA,KAab,0BAAA;EACV,WAAA;EACA,MAAM;AAAA;;KAII,0BAAA;EACV,MAAA,EAAQ,gBAAgB,CAAC,OAAA;AAAA;AAXE;AAI7B;;;AAJ6B,KAkBjB,sBAAA;EAA2B,KAAA,EAAO,OAAO;AAAA"}
1
+ {"version":3,"file":"supervisor-events.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/events/supervisor-events.type.ts"],"mappings":";;;;;;;;;KAWY,yBAAA;EACV,cAAA;EACA,KAAA,EAAO,eAAe;AAAA;;KAIZ,kCAAA;EAAuC,SAAS;AAAA;;KAGhD,+BAAA;EAAoC,SAAS;AAAA;;KAG7C,8BAAA;EACV,SAAA;EACA,IAAA,EAAM,IAAI;EACV,SAAA;EACA,UAAA;AAAA;AAV0D;AAAA,KAchD,8BAAA;EACV,SAAA;EACA,MAAA;EACA,KAAA;AAAA;AAXF;;;;;AAAA,KAmBY,+BAAA;EACV,SAAA;EACA,MAAA;EACA,KAAA;AAAA;AAlBU;AAAA,KAsBA,+BAAA;EACV,SAAA;EACA,MAAA;EACA,MAAA;EACA,KAAA;IAAS,KAAA;IAAe,MAAA;IAAgB,KAAA;EAAA;EACxC,QAAA;AAAA;;;;;;KAQU,4BAAA;EACV,SAAA;EACA,MAAA;EACA,KAAA,EAAO,OAAO;AAAA;;;;;;KAQJ,mCAAA;EAAwC,SAAS;AAAA;;;AAnBnD;AAQV;;;;KAoBY,oCAAA;EACV,KAAK;AAAA;;;AAlBS;AAQhB;;;KAmBY,oCAAA;EACV,MAAA;IAAU,MAAA;IAAiB,SAAA;IAAoB,UAAA;EAAA;EAC/C,MAAA;EACA,OAAA;EACA,MAAA;EACA,QAAA;EACA,KAAA,GAAQ,KAAK;AAAA;;;;;;KAQH,iCAAA;EACV,KAAA,EAAO,OAAO;AAAA;;;AATD;AAQf;;;KAUY,6BAAA;EACV,KAAK;AAAA;;;;AAAA;AAQP;KAAY,6BAAA;EACV,MAAA;EACA,KAAA,GAAQ,KAAA;EACR,QAAA;EACA,KAAA,GAAQ,OAAO;AAAA;;KAIL,gCAAA;EACV,SAAA;EACA,OAAA,EAAS,cAAc;AAAA;AAFzB;;;;AAAA,KASY,mCAAA;EACV,SAAA;EACA,QAAA,EAAU,iBAAiB;AAAA;AATJ;AAAA,KAab,0BAAA;EACV,WAAA;EACA,MAAM;AAAA;;KAII,0BAAA;EACV,MAAA,EAAQ,gBAAgB,CAAC,OAAA;AAAA;AAXE;AAI7B;;;AAJ6B,KAkBjB,sBAAA;EAA2B,KAAA,EAAO,OAAO;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { Usage } from "../result/usage.type.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/contracts/events/usage-event.type.d.ts
3
+ //#region ../@warlock.js/ai/src/contracts/events/usage-event.type.d.ts
4
4
  /**
5
5
  * Per-trip telemetry payload for the `onUsage` agent hook (T1 of the
6
6
  * 2026-05-08 ai-usage/runs/state/cart plan).
@@ -1 +1 @@
1
- {"version":3,"file":"usage-event.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/events/usage-event.type.ts"],"mappings":";;;;;AAyBA;;;;;;;;;;;;;AAUW;;;;;;;;KAVC,UAAA;oEAEV,KAAA;EAEA,SAAA;EAEA,KAAA;IAAS,IAAA;IAAc,QAAA;EAAA;EAEvB,KAAA,EAAO,KAAK;EAEZ,SAAA;AAAA"}
1
+ {"version":3,"file":"usage-event.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/events/usage-event.type.ts"],"mappings":";;;;;AAyBA;;;;;;;;;;;;;AAUW;;;;;;;;KAVC,UAAA;oEAEV,KAAA;EAEA,SAAA;EAEA,KAAA;IAAS,IAAA;IAAc,QAAA;EAAA;EAEvB,KAAA,EAAO,KAAK;EAEZ,SAAA;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { WorkflowResult } from "../result/workflow-result.type.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/contracts/events/workflow-events.type.d.ts
3
+ //#region ../@warlock.js/ai/src/contracts/events/workflow-events.type.d.ts
4
4
  type WorkflowStartingPayload = {
5
5
  workflowName: string;
6
6
  input: unknown;
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-events.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/events/workflow-events.type.ts"],"mappings":";;;KAEY,uBAAA;EACV,YAAA;EACA,KAAK;AAAA;AAAA,KAGK,2BAAA;EAAgC,IAAI;AAAA;AAAA,KAEpC,4BAAA;EAAiC,IAAA;EAAc,KAAK;AAAA;AAAA,KAEpD,4BAAA;EACV,IAAA;EACA,MAAA;EACA,QAAA;AAAA;AAAA,KAGU,0BAAA;EAA+B,IAAI;AAAA;AAAA,KAEnC,2BAAA;EACV,IAAA;EACA,OAAA;EACA,aAAA;EACA,SAAA;AAAA;AAAA,KAGU,yBAAA;EACV,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,0BAAA;EACV,IAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,KAGU,wBAAA;EACV,WAAA;EACA,MAAM;AAAA;AAAA,KAGI,wBAAA;EAA6B,MAAA,EAAQ,cAAc;AAAA;AAAA,KAEnD,oBAAA;EAAyB,KAAK;AAAA"}
1
+ {"version":3,"file":"workflow-events.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/events/workflow-events.type.ts"],"mappings":";;;KAEY,uBAAA;EACV,YAAA;EACA,KAAK;AAAA;AAAA,KAGK,2BAAA;EAAgC,IAAI;AAAA;AAAA,KAEpC,4BAAA;EAAiC,IAAA;EAAc,KAAK;AAAA;AAAA,KAEpD,4BAAA;EACV,IAAA;EACA,MAAA;EACA,QAAA;AAAA;AAAA,KAGU,0BAAA;EAA+B,IAAI;AAAA;AAAA,KAEnC,2BAAA;EACV,IAAA;EACA,OAAA;EACA,aAAA;EACA,SAAA;AAAA;AAAA,KAGU,yBAAA;EACV,IAAA;EACA,KAAA;EACA,QAAA;AAAA;AAAA,KAGU,0BAAA;EACV,IAAA;EACA,YAAA;EACA,QAAA;AAAA;AAAA,KAGU,wBAAA;EACV,WAAA;EACA,MAAM;AAAA;AAAA,KAGI,wBAAA;EAA6B,MAAA,EAAQ,cAAc;AAAA;AAAA,KAEnD,oBAAA;EAAyB,KAAK;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { BaseResult } from "./result/base-result.type.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/contracts/executable.contract.d.ts
3
+ //#region ../@warlock.js/ai/src/contracts/executable.contract.d.ts
4
4
  /**
5
5
  * Shared contract for all executable AI primitives (agent, workflow, supervisor).
6
6
  * All three implement this interface with their specific result types.
@@ -1 +1 @@
1
- {"version":3,"file":"executable.contract.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/executable.contract.ts"],"mappings":";;;;;AAcA;;;;;;;;;;UAAiB,kBAAA,mCAGC,UAAA;EADhB;;;;EAOA,OAAA,CAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,GAAU,QAAA,GAAW,OAAA,CAAQ,OAAA;AAAA"}
1
+ {"version":3,"file":"executable.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/executable.contract.ts"],"mappings":";;;;;AAcA;;;;;;;;;;UAAiB,kBAAA,mCAGC,UAAA;EADhB;;;;EAOA,OAAA,CAAQ,KAAA,EAAO,MAAA,EAAQ,OAAA,GAAU,QAAA,GAAW,OAAA,CAAQ,OAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/finish-reason.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/finish-reason.type.d.ts
2
2
  /**
3
3
  * Reasons the LLM stopped generating. Shared across model responses,
4
4
  * streaming chunks, and LLM trip records.
@@ -1 +1 @@
1
- {"version":3,"file":"finish-reason.type.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/finish-reason.type.ts"],"mappings":";;AAYA;;;;AAAwB;;;;;;;KAAZ,YAAA"}
1
+ {"version":3,"file":"finish-reason.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/finish-reason.type.ts"],"mappings":";;AAYA;;;;AAAwB;;;;;;;KAAZ,YAAA"}
@@ -4,7 +4,7 @@ import { ToolMode } from "../tool.contract.mjs";
4
4
  import { AgentExecuteOptions } from "../agent/agent-options.type.mjs";
5
5
  import { MiddlewareState } from "./middleware-state.type.mjs";
6
6
 
7
- //#region ../../@warlock.js/ai/src/contracts/middleware/middleware-context.type.d.ts
7
+ //#region ../@warlock.js/ai/src/contracts/middleware/middleware-context.type.d.ts
8
8
  /**
9
9
  * Minimal identity shape of the agent the middleware is wrapping.
10
10
  * Middleware never mutates the agent itself, so it sees only the
@@ -1 +1 @@
1
- {"version":3,"file":"middleware-context.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/middleware/middleware-context.type.ts"],"mappings":";;;;;;;;;AAYA;;;;KAAY,kBAAA;EAAA,SACD,IAAA;EAAA,SACA,WAAW;AAAA;;AAWH;AAgBnB;;;;KAlBY,kBAAA;EAAA,SACD,IAAA;EAAA,SACA,QAAQ;AAAA;;;;;;;;;;;;;;KAgBP,wBAAA;EAAA,SACD,KAAA,EAAO,kBAAA;EAAA,SACP,KAAA,EAAO,kBAAA;EAAA,SACP,KAAA;EAAA,SACA,OAAA,EAAS,mBAAA;EAAA,SACT,KAAA,EAAO,eAAA;EAAA,SACP,MAAA,GAAS,WAAA;AAAA;;;;;;;;;AAkBsB;AAiB1C;;;;KAnBY,qBAAA,GAAwB,wBAAA;EAAA,SACzB,SAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,OAAA;AAAA;;;;;;;;;;AAgCK;;;;;KAf5B,qBAAA,GAAwB,qBAAA;EAAA,SACzB,IAAA;IAAA,SACE,IAAA;IAAA,SACA,WAAA;;;;;;;;;;aAUA,IAAA,GAAO,QAAA;EAAA;EAAA,SAET,OAAA,EAAS,oBAAA;AAAA"}
1
+ {"version":3,"file":"middleware-context.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/middleware/middleware-context.type.ts"],"mappings":";;;;;;;;;AAYA;;;;KAAY,kBAAA;EAAA,SACD,IAAA;EAAA,SACA,WAAW;AAAA;;AAWH;AAgBnB;;;;KAlBY,kBAAA;EAAA,SACD,IAAA;EAAA,SACA,QAAQ;AAAA;;;;;;;;;;;;;;KAgBP,wBAAA;EAAA,SACD,KAAA,EAAO,kBAAA;EAAA,SACP,KAAA,EAAO,kBAAA;EAAA,SACP,KAAA;EAAA,SACA,OAAA,EAAS,mBAAA;EAAA,SACT,KAAA,EAAO,eAAA;EAAA,SACP,MAAA,GAAS,WAAA;AAAA;;;;;;;;;AAkBsB;AAiB1C;;;;KAnBY,qBAAA,GAAwB,wBAAA;EAAA,SACzB,SAAA;EAAA,SACA,QAAA,EAAU,aAAA,CAAc,OAAA;AAAA;;;;;;;;;;AAgCK;;;;;KAf5B,qBAAA,GAAwB,qBAAA;EAAA,SACzB,IAAA;IAAA,SACE,IAAA;IAAA,SACA,WAAA;;;;;;;;;;aAUA,IAAA,GAAO,QAAA;EAAA;EAAA,SAET,OAAA,EAAS,oBAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/middleware/middleware-state.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/middleware/middleware-state.type.d.ts
2
2
  /**
3
3
  * Per-execution shared-state bag threaded through every middleware
4
4
  * hook of every level (`execute`, `trip`, `tool`) for a single
@@ -1 +1 @@
1
- {"version":3,"file":"middleware-state.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/middleware/middleware-state.type.ts"],"mappings":";;AA6BA;;;;AAAiC;;;;;;;;;;;;;;;;;;;;;;;;KAArB,eAAA,GAAkB,GAAG"}
1
+ {"version":3,"file":"middleware-state.type.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/middleware/middleware-state.type.ts"],"mappings":";;AA6BA;;;;AAAiC;;;;;;;;;;;;;;;;;;;;;;;;KAArB,eAAA,GAAkB,GAAG"}
@@ -4,7 +4,7 @@ import { ToolInvokeResult } from "../../tool/tool.mjs";
4
4
  import { MiddlewareExecuteContext, MiddlewareToolContext, MiddlewareTripContext } from "./middleware-context.type.mjs";
5
5
  import { ModelResponse } from "../model.contract.mjs";
6
6
 
7
- //#region ../../@warlock.js/ai/src/contracts/middleware/middleware.contract.d.ts
7
+ //#region ../@warlock.js/ai/src/contracts/middleware/middleware.contract.d.ts
8
8
  /**
9
9
  * `execute`-level hook map. Wraps the entire `agent.execute()` call.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/middleware/middleware.contract.ts"],"mappings":";;;;;;;;;;AAuBA;;;;;;;;;;KAAY,2BAAA;EACV,MAAA,EAAQ,GAAA,EAAK,wBAAA,UAAkC,OAAA;EAC/C,KAAA,EACE,GAAA,EAAK,wBAAA,EACL,MAAA,EAAQ,WAAA,mBACA,WAAA,YAAuB,OAAA,QAAe,WAAA;EAChD,OAAA,EACE,GAAA,EAAK,wBAAA,EACL,KAAA,EAAO,OAAA,UACC,WAAA,YAAuB,OAAA,QAAe,WAAA;AAAA;;;;;;;;;;;;;;KAgBtC,wBAAA;EACV,MAAA,EACE,GAAA,EAAK,qBAAA,UACG,aAAA,GAAgB,OAAA,QAAe,aAAA;EACzC,KAAA,EACE,GAAA,EAAK,qBAAA,EACL,QAAA,EAAU,aAAA,UACF,aAAA,GAAgB,OAAA,QAAe,aAAA;EACzC,OAAA,EACE,GAAA,EAAK,qBAAA,EACL,KAAA,EAAO,OAAA,UACC,aAAA,GAAgB,OAAA,QAAe,aAAA;AAAA;;;;;;AA3BkB;AAgB7D;;;;;;;KA2BY,wBAAA;EACV,MAAA,EACE,GAAA,EAAK,qBAAA,UAGH,gBAAA,YACA,OAAA,QAAe,gBAAA;EACnB,KAAA,EACE,GAAA,EAAK,qBAAA,EACL,MAAA,EAAQ,gBAAA,mBAGN,gBAAA,YACA,OAAA,QAAe,gBAAA;EACnB,OAAA,EACE,GAAA,EAAK,qBAAA,EACL,KAAA,EAAO,OAAA,UAGL,gBAAA,YACA,OAAA,QAAe,gBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AApCmC;AAgBxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkFY,eAAA;EAzER;;;;;EA+EF,IAAA;EAzEE;;;;;EA+EF,GAAA;EACA,OAAA,GAAU,2BAAA;EACV,IAAA,GAAO,wBAAA;EACP,IAAA,GAAO,wBAAA;AAAA"}
1
+ {"version":3,"file":"middleware.contract.d.mts","names":[],"sources":["../../../../../../../../@warlock.js/ai/src/contracts/middleware/middleware.contract.ts"],"mappings":";;;;;;;;;;AAuBA;;;;;;;;;;KAAY,2BAAA;EACV,MAAA,EAAQ,GAAA,EAAK,wBAAA,UAAkC,OAAA;EAC/C,KAAA,EACE,GAAA,EAAK,wBAAA,EACL,MAAA,EAAQ,WAAA,mBACA,WAAA,YAAuB,OAAA,QAAe,WAAA;EAChD,OAAA,EACE,GAAA,EAAK,wBAAA,EACL,KAAA,EAAO,OAAA,UACC,WAAA,YAAuB,OAAA,QAAe,WAAA;AAAA;;;;;;;;;;;;;;KAgBtC,wBAAA;EACV,MAAA,EACE,GAAA,EAAK,qBAAA,UACG,aAAA,GAAgB,OAAA,QAAe,aAAA;EACzC,KAAA,EACE,GAAA,EAAK,qBAAA,EACL,QAAA,EAAU,aAAA,UACF,aAAA,GAAgB,OAAA,QAAe,aAAA;EACzC,OAAA,EACE,GAAA,EAAK,qBAAA,EACL,KAAA,EAAO,OAAA,UACC,aAAA,GAAgB,OAAA,QAAe,aAAA;AAAA;;;;;;AA3BkB;AAgB7D;;;;;;;KA2BY,wBAAA;EACV,MAAA,EACE,GAAA,EAAK,qBAAA,UAGH,gBAAA,YACA,OAAA,QAAe,gBAAA;EACnB,KAAA,EACE,GAAA,EAAK,qBAAA,EACL,MAAA,EAAQ,gBAAA,mBAGN,gBAAA,YACA,OAAA,QAAe,gBAAA;EACnB,OAAA,EACE,GAAA,EAAK,qBAAA,EACL,KAAA,EAAO,OAAA,UAGL,gBAAA,YACA,OAAA,QAAe,gBAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AApCmC;AAgBxD;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAkFY,eAAA;EAzER;;;;;EA+EF,IAAA;EAzEE;;;;;EA+EF,GAAA;EACA,OAAA,GAAU,2BAAA;EACV,IAAA,GAAO,wBAAA;EACP,IAAA,GAAO,wBAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/model-tool-call-request.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/model-tool-call-request.type.d.ts
2
2
  /**
3
3
  * A raw tool call request returned by the model during a complete() call or
4
4
  * emitted as a chunk during stream(). Agents look up the tool by `name` and
@@ -1 +1 @@
1
- {"version":3,"file":"model-tool-call-request.type.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/model-tool-call-request.type.ts"],"mappings":";;AAYA;;;;;;;;;;;KAAY,oBAAA;mFAEV,EAAA;EAEA,IAAA;EAEA,KAAA;;;;;;;;;;;;;;;;;;;;EAoBA,aAAA;;;;;;;;;;;;;;;;;EAiBA,gBAAA,GAAmB,MAAM;AAAA"}
1
+ {"version":3,"file":"model-tool-call-request.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/model-tool-call-request.type.ts"],"mappings":";;AAYA;;;;;;;;;;;KAAY,oBAAA;mFAEV,EAAA;EAEA,IAAA;EAEA,KAAA;;;;;;;;;;;;;;;;;;;;EAoBA,aAAA;;;;;;;;;;;;;;;;;EAiBA,gBAAA,GAAmB,MAAM;AAAA"}
@@ -5,7 +5,7 @@ import { Usage } from "./result/usage.type.mjs";
5
5
  import { FinishReason } from "./finish-reason.type.mjs";
6
6
  import { ToolConfig } from "./tool.contract.mjs";
7
7
 
8
- //#region ../../@warlock.js/ai/src/contracts/model.contract.d.ts
8
+ //#region ../@warlock.js/ai/src/contracts/model.contract.d.ts
9
9
  /**
10
10
  * Options passed to model.complete() or model.stream().
11
11
  *
@@ -1 +1 @@
1
- {"version":3,"file":"model.contract.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/model.contract.ts"],"mappings":";;;;;;;;;;AAqBA;;;;;;;;;;;;KAAY,gBAAA;EACV,WAAA;EACA,SAAA,WAkBS;EAhBT,KAAA,GAAQ,UAAA;EAkBI;AAAA;AAad;;;;AAeQ;AAaR;EAlDE,cAAA,GAAiB,MAAA;;;;;;;EAOjB,MAAA,GAAS,WAAA,EA6CT;EAAA,CA3CC,GAAA;AAAA;;;;;AA8C+B;AAYlC;;;;;KA7CY,iBAAA;EA4DgD;;;;;;EArD1D,gBAAA;EA4CI;;;;;;;EApCJ,MAAM;AAAA;AA6CoD;AAgB5D;;;;;;;;;AAhB4D,KAhChD,aAAA;EACV,OAAA;EACA,YAAA,EAAc,YAAA;EACd,KAAA,EAAO,KAAA,EA6E+D;EA3EtE,SAAA,GAAY,oBAAA;AAAA;;;;;;;;;;KAYF,gBAAA;EACN,IAAA;EAAe,OAAA;AAAA;EAEf,IAAA;EACA,EAAA;EACA,IAAA;EACA,KAAA;EAyDqD;;;AAA8B;;;EAlDnF,gBAAA,GAAmB,MAAA;AAAA;EAEnB,IAAA;EAAc,YAAA,EAAc,YAAA;EAAc,KAAA,EAAO,KAAA;AAAA;;;;;;;;;;;;;;;UAgBtC,aAAA;;WAEN,IAAA;;WAEA,QAAA;;;;;;WAMA,YAAA,GAAe,iBAAA;;;;;;;;;;;WAYf,OAAA,GAAU,YAAA;;;;EAKnB,QAAA,CAAS,QAAA,EAAU,OAAA,IAAW,OAAA,GAAU,gBAAA,GAAmB,OAAA,CAAQ,aAAA;;;;EAKnE,MAAA,CAAO,QAAA,EAAU,OAAA,IAAW,OAAA,GAAU,gBAAA,GAAmB,aAAA,CAAc,gBAAA;AAAA"}
1
+ {"version":3,"file":"model.contract.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/model.contract.ts"],"mappings":";;;;;;;;;;AAqBA;;;;;;;;;;;;KAAY,gBAAA;EACV,WAAA;EACA,SAAA,WAkBS;EAhBT,KAAA,GAAQ,UAAA;EAkBI;AAAA;AAad;;;;AAeQ;AAaR;EAlDE,cAAA,GAAiB,MAAA;;;;;;;EAOjB,MAAA,GAAS,WAAA,EA6CT;EAAA,CA3CC,GAAA;AAAA;;;;;AA8C+B;AAYlC;;;;;KA7CY,iBAAA;EA4DgD;;;;;;EArD1D,gBAAA;EA4CI;;;;;;;EApCJ,MAAM;AAAA;AA6CoD;AAgB5D;;;;;;;;;AAhB4D,KAhChD,aAAA;EACV,OAAA;EACA,YAAA,EAAc,YAAA;EACd,KAAA,EAAO,KAAA,EA6E+D;EA3EtE,SAAA,GAAY,oBAAA;AAAA;;;;;;;;;;KAYF,gBAAA;EACN,IAAA;EAAe,OAAA;AAAA;EAEf,IAAA;EACA,EAAA;EACA,IAAA;EACA,KAAA;EAyDqD;;;AAA8B;;;EAlDnF,gBAAA,GAAmB,MAAA;AAAA;EAEnB,IAAA;EAAc,YAAA,EAAc,YAAA;EAAc,KAAA,EAAO,KAAA;AAAA;;;;;;;;;;;;;;;UAgBtC,aAAA;;WAEN,IAAA;;WAEA,QAAA;;;;;;WAMA,YAAA,GAAe,iBAAA;;;;;;;;;;;WAYf,OAAA,GAAU,YAAA;;;;EAKnB,QAAA,CAAS,QAAA,EAAU,OAAA,IAAW,OAAA,GAAU,gBAAA,GAAmB,OAAA,CAAQ,aAAA;;;;EAKnE,MAAA,CAAO,QAAA,EAAU,OAAA,IAAW,OAAA,GAAU,gBAAA,GAAmB,aAAA,CAAc,gBAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/contracts/placeholders.type.d.ts
1
+ //#region ../@warlock.js/ai/src/contracts/placeholders.type.d.ts
2
2
  /**
3
3
  * A map of placeholder keys to their replacement values.
4
4
  * Supports nested access via dot notation in {{mustache}} templates.
@@ -1 +1 @@
1
- {"version":3,"file":"placeholders.type.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/contracts/placeholders.type.ts"],"mappings":";;AAkBA;;;;AAAiC;;;;;;;;;;;;;KAArB,YAAA,GAAe,MAAM"}
1
+ {"version":3,"file":"placeholders.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/contracts/placeholders.type.ts"],"mappings":";;AAkBA;;;;AAAiC;;;;;;;;;;;;;KAArB,YAAA,GAAe,MAAM"}