@warlock.js/ai 4.1.14 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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
@@ -2,7 +2,7 @@ import { IterationSnapshot } from "../contracts/supervisor/iteration-snapshot.ty
2
2
  import { SupervisorInput } from "../contracts/supervisor/supervisor-input.type.mjs";
3
3
  import { ResolvedIntentEntry } from "./entries.mjs";
4
4
 
5
- //#region ../../@warlock.js/ai/src/supervisor/router-prompt.d.ts
5
+ //#region ../@warlock.js/ai/src/supervisor/router-prompt.d.ts
6
6
  /**
7
7
  * Build the per-turn user message the supervisor feeds to the router
8
8
  * agent. Carries everything the LLM needs to make a routing decision:
@@ -1 +1 @@
1
- {"version":3,"file":"router-prompt.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/router-prompt.ts"],"mappings":";;;;;;;AAmBA;;;;;;;;;;;;iBAAgB,yBAAA,CAA0B,MAAA;EACxC,OAAA,EAAS,GAAA,SAAY,mBAAA;EACrB,SAAA;EACA,aAAA;EACA,UAAA,EAAY,iBAAA;EACZ,KAAA,EAAO,eAAA;EAAA;;;;;;EAOP,KAAA,GAAQ,MAAA;EAqBT;AAAA;;;;EAfC,QAAA;;;;;;;EAOA,gBAAA;;;;;;;EAOA,IAAA;AAAA"}
1
+ {"version":3,"file":"router-prompt.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/router-prompt.ts"],"mappings":";;;;;;;AAmBA;;;;;;;;;;;;iBAAgB,yBAAA,CAA0B,MAAA;EACxC,OAAA,EAAS,GAAA,SAAY,mBAAA;EACrB,SAAA;EACA,aAAA;EACA,UAAA,EAAY,iBAAA;EACZ,KAAA,EAAO,eAAA;EAAA;;;;;;EAOP,KAAA,GAAQ,MAAA;EAqBT;AAAA;;;;EAfC,QAAA;;;;;;;EAOA,gBAAA;;;;;;;EAOA,IAAA;AAAA"}
@@ -1,6 +1,6 @@
1
1
  import { END } from "../contracts/end.type.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/supervisor/router-prompt.ts
3
+ //#region ../@warlock.js/ai/src/supervisor/router-prompt.ts
4
4
  /**
5
5
  * Build the per-turn user message the supervisor feeds to the router
6
6
  * agent. Carries everything the LLM needs to make a routing decision:
@@ -1 +1 @@
1
- {"version":3,"file":"router-prompt.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/router-prompt.ts"],"sourcesContent":["import { END } from \"../contracts/end.type\";\nimport type { IterationSnapshot } from \"../contracts/supervisor/iteration-snapshot.type\";\nimport type { SupervisorInput } from \"../contracts/supervisor/supervisor-input.type\";\nimport type { ResolvedIntentEntry } from \"./entries\";\n\n/**\n * Build the per-turn user message the supervisor feeds to the router\n * agent. Carries everything the LLM needs to make a routing decision:\n *\n * - Available intents with descriptions (so the router knows what\n * to pick from).\n * - The reserved `END` sentinel value it can emit to terminate.\n * - Iteration counter + ceiling so the router can pace itself.\n * - Compact history of prior iterations (intent + short output clip).\n * - The supervisor's original input so the router stays anchored.\n *\n * Note the router's own `systemPrompt` is kept persistent across\n * turns — this function produces only the per-turn USER message.\n */\nexport function buildRouterContextMessage(params: {\n entries: Map<string, ResolvedIntentEntry>;\n iteration: number;\n maxIterations: number;\n iterations: IterationSnapshot[];\n input: SupervisorInput;\n /**\n * Per-execute state at the START of this iteration (post-merge of\n * the previous iteration). Rendered as a JSON snippet so the\n * router can pick the next intent based on what's already filled\n * in (Q14).\n */\n state?: Record<string, unknown>;\n /**\n * Reviewer feedback string from the previous iteration's evaluate\n * verdict. Rendered as its own section so the router weighs it\n * alongside the intent list (Q18).\n */\n feedback?: string;\n /**\n * Supervisor-level system prompt text, when configured. Surfaced at\n * the TOP of the router's per-turn user message so the router reads\n * team/domain context before the routing mechanics block. Skipped\n * when the supervisor didn't configure `systemPrompt`.\n */\n supervisorPrompt?: string;\n /**\n * Resolved natural-language objective from `SupervisorConfig.goal`.\n * Surfaced as its own labeled section near the top of the router's\n * user message so routing decisions are objective-aware. Skipped\n * when no goal was configured.\n */\n goal?: string;\n}): string {\n const {\n entries,\n iteration,\n maxIterations,\n iterations,\n input,\n state,\n feedback,\n supervisorPrompt,\n goal,\n } = params;\n\n const intentLines = [...entries.values()].map(\n entry => `- ${entry.intent}: ${entry.description}`,\n );\n\n const historyLines =\n iterations.length === 0\n ? [\"(none yet)\"]\n : iterations.map(snapshot => formatHistoryLine(snapshot));\n\n const sections: string[] = [];\n\n if (supervisorPrompt) {\n sections.push(supervisorPrompt.trim(), \"\");\n }\n\n if (goal) {\n sections.push(\"Goal:\", goal.trim(), \"\");\n }\n\n sections.push(\n \"Available intents:\",\n ...intentLines,\n \"\",\n \"Reserved values:\",\n `- ${END} = terminate the run`,\n \"\",\n `Iteration: ${iteration + 1} / ${maxIterations}`,\n \"\",\n \"History:\",\n ...historyLines,\n );\n\n if (state && Object.keys(state).length > 0) {\n sections.push(\"\", \"Current state:\", safeStringify(state));\n }\n\n if (feedback) {\n sections.push(\"\", `Reviewer feedback from last iteration: ${feedback}`);\n }\n\n const renderedInput =\n typeof input === \"string\" ? input : safeStringify(input);\n\n sections.push(\"\", `Original input: ${renderedInput}`);\n\n return sections.join(\"\\n\");\n}\n\nfunction formatHistoryLine(snapshot: IterationSnapshot): string {\n const branches = Object.entries(snapshot.result).map(\n ([intent, branch]) => `${intent} → ${clip(branch.output)}`,\n );\n\n return `[${snapshot.iteration}] ${branches.join(\" | \")}`;\n}\n\nfunction clip(value: unknown, maxLength = 160): string {\n if (value === undefined || value === null) {\n return String(value);\n }\n\n const raw = typeof value === \"string\" ? value : safeStringify(value);\n\n if (raw.length <= maxLength) {\n return raw;\n }\n\n return `${raw.slice(0, maxLength - 1)}…`;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return `[unserializable: ${typeof value}]`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,SAAgB,0BAA0B,QAiC/B;CACT,MAAM,EACJ,SACA,WACA,eACA,YACA,OACA,OACA,UACA,kBACA,SACE;CAEJ,MAAM,cAAc,CAAC,GAAG,QAAQ,OAAO,CAAC,EAAE,KACxC,UAAS,KAAK,MAAM,OAAO,IAAI,MAAM,aACvC;CAEA,MAAM,eACJ,WAAW,WAAW,IAClB,CAAC,YAAY,IACb,WAAW,KAAI,aAAY,kBAAkB,QAAQ,CAAC;CAE5D,MAAM,WAAqB,CAAC;CAE5B,IAAI,kBACF,SAAS,KAAK,iBAAiB,KAAK,GAAG,EAAE;CAG3C,IAAI,MACF,SAAS,KAAK,SAAS,KAAK,KAAK,GAAG,EAAE;CAGxC,SAAS,KACP,sBACA,GAAG,aACH,IACA,oBACA,KAAK,IAAI,uBACT,IACA,cAAc,YAAY,EAAE,KAAK,iBACjC,IACA,YACA,GAAG,YACL;CAEA,IAAI,SAAS,OAAO,KAAK,KAAK,EAAE,SAAS,GACvC,SAAS,KAAK,IAAI,kBAAkB,cAAc,KAAK,CAAC;CAG1D,IAAI,UACF,SAAS,KAAK,IAAI,0CAA0C,UAAU;CAGxE,MAAM,gBACJ,OAAO,UAAU,WAAW,QAAQ,cAAc,KAAK;CAEzD,SAAS,KAAK,IAAI,mBAAmB,eAAe;CAEpD,OAAO,SAAS,KAAK,IAAI;AAC3B;AAEA,SAAS,kBAAkB,UAAqC;CAC9D,MAAM,WAAW,OAAO,QAAQ,SAAS,MAAM,EAAE,KAC9C,CAAC,QAAQ,YAAY,GAAG,OAAO,KAAK,KAAK,OAAO,MAAM,GACzD;CAEA,OAAO,IAAI,SAAS,UAAU,IAAI,SAAS,KAAK,KAAK;AACvD;AAEA,SAAS,KAAK,OAAgB,YAAY,KAAa;CACrD,IAAI,UAAU,UAAa,UAAU,MACnC,OAAO,OAAO,KAAK;CAGrB,MAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,cAAc,KAAK;CAEnE,IAAI,IAAI,UAAU,WAChB,OAAO;CAGT,OAAO,GAAG,IAAI,MAAM,GAAG,YAAY,CAAC,EAAE;AACxC;AAEA,SAAS,cAAc,OAAwB;CAC7C,IAAI;EACF,OAAO,KAAK,UAAU,KAAK;CAC7B,QAAQ;EACN,OAAO,oBAAoB,OAAO,MAAM;CAC1C;AACF"}
1
+ {"version":3,"file":"router-prompt.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/router-prompt.ts"],"sourcesContent":["import { END } from \"../contracts/end.type\";\nimport type { IterationSnapshot } from \"../contracts/supervisor/iteration-snapshot.type\";\nimport type { SupervisorInput } from \"../contracts/supervisor/supervisor-input.type\";\nimport type { ResolvedIntentEntry } from \"./entries\";\n\n/**\n * Build the per-turn user message the supervisor feeds to the router\n * agent. Carries everything the LLM needs to make a routing decision:\n *\n * - Available intents with descriptions (so the router knows what\n * to pick from).\n * - The reserved `END` sentinel value it can emit to terminate.\n * - Iteration counter + ceiling so the router can pace itself.\n * - Compact history of prior iterations (intent + short output clip).\n * - The supervisor's original input so the router stays anchored.\n *\n * Note the router's own `systemPrompt` is kept persistent across\n * turns — this function produces only the per-turn USER message.\n */\nexport function buildRouterContextMessage(params: {\n entries: Map<string, ResolvedIntentEntry>;\n iteration: number;\n maxIterations: number;\n iterations: IterationSnapshot[];\n input: SupervisorInput;\n /**\n * Per-execute state at the START of this iteration (post-merge of\n * the previous iteration). Rendered as a JSON snippet so the\n * router can pick the next intent based on what's already filled\n * in (Q14).\n */\n state?: Record<string, unknown>;\n /**\n * Reviewer feedback string from the previous iteration's evaluate\n * verdict. Rendered as its own section so the router weighs it\n * alongside the intent list (Q18).\n */\n feedback?: string;\n /**\n * Supervisor-level system prompt text, when configured. Surfaced at\n * the TOP of the router's per-turn user message so the router reads\n * team/domain context before the routing mechanics block. Skipped\n * when the supervisor didn't configure `systemPrompt`.\n */\n supervisorPrompt?: string;\n /**\n * Resolved natural-language objective from `SupervisorConfig.goal`.\n * Surfaced as its own labeled section near the top of the router's\n * user message so routing decisions are objective-aware. Skipped\n * when no goal was configured.\n */\n goal?: string;\n}): string {\n const {\n entries,\n iteration,\n maxIterations,\n iterations,\n input,\n state,\n feedback,\n supervisorPrompt,\n goal,\n } = params;\n\n const intentLines = [...entries.values()].map(\n entry => `- ${entry.intent}: ${entry.description}`,\n );\n\n const historyLines =\n iterations.length === 0\n ? [\"(none yet)\"]\n : iterations.map(snapshot => formatHistoryLine(snapshot));\n\n const sections: string[] = [];\n\n if (supervisorPrompt) {\n sections.push(supervisorPrompt.trim(), \"\");\n }\n\n if (goal) {\n sections.push(\"Goal:\", goal.trim(), \"\");\n }\n\n sections.push(\n \"Available intents:\",\n ...intentLines,\n \"\",\n \"Reserved values:\",\n `- ${END} = terminate the run`,\n \"\",\n `Iteration: ${iteration + 1} / ${maxIterations}`,\n \"\",\n \"History:\",\n ...historyLines,\n );\n\n if (state && Object.keys(state).length > 0) {\n sections.push(\"\", \"Current state:\", safeStringify(state));\n }\n\n if (feedback) {\n sections.push(\"\", `Reviewer feedback from last iteration: ${feedback}`);\n }\n\n const renderedInput =\n typeof input === \"string\" ? input : safeStringify(input);\n\n sections.push(\"\", `Original input: ${renderedInput}`);\n\n return sections.join(\"\\n\");\n}\n\nfunction formatHistoryLine(snapshot: IterationSnapshot): string {\n const branches = Object.entries(snapshot.result).map(\n ([intent, branch]) => `${intent} → ${clip(branch.output)}`,\n );\n\n return `[${snapshot.iteration}] ${branches.join(\" | \")}`;\n}\n\nfunction clip(value: unknown, maxLength = 160): string {\n if (value === undefined || value === null) {\n return String(value);\n }\n\n const raw = typeof value === \"string\" ? value : safeStringify(value);\n\n if (raw.length <= maxLength) {\n return raw;\n }\n\n return `${raw.slice(0, maxLength - 1)}…`;\n}\n\nfunction safeStringify(value: unknown): string {\n try {\n return JSON.stringify(value);\n } catch {\n return `[unserializable: ${typeof value}]`;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAmBA,SAAgB,0BAA0B,QAiC/B;CACT,MAAM,EACJ,SACA,WACA,eACA,YACA,OACA,OACA,UACA,kBACA,SACE;CAEJ,MAAM,cAAc,CAAC,GAAG,QAAQ,OAAO,CAAC,CAAC,CAAC,KACxC,UAAS,KAAK,MAAM,OAAO,IAAI,MAAM,aACvC;CAEA,MAAM,eACJ,WAAW,WAAW,IAClB,CAAC,YAAY,IACb,WAAW,KAAI,aAAY,kBAAkB,QAAQ,CAAC;CAE5D,MAAM,WAAqB,CAAC;CAE5B,IAAI,kBACF,SAAS,KAAK,iBAAiB,KAAK,GAAG,EAAE;CAG3C,IAAI,MACF,SAAS,KAAK,SAAS,KAAK,KAAK,GAAG,EAAE;CAGxC,SAAS,KACP,sBACA,GAAG,aACH,IACA,oBACA,KAAK,IAAI,uBACT,IACA,cAAc,YAAY,EAAE,KAAK,iBACjC,IACA,YACA,GAAG,YACL;CAEA,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GACvC,SAAS,KAAK,IAAI,kBAAkB,cAAc,KAAK,CAAC;CAG1D,IAAI,UACF,SAAS,KAAK,IAAI,0CAA0C,UAAU;CAGxE,MAAM,gBACJ,OAAO,UAAU,WAAW,QAAQ,cAAc,KAAK;CAEzD,SAAS,KAAK,IAAI,mBAAmB,eAAe;CAEpD,OAAO,SAAS,KAAK,IAAI;AAC3B;AAEA,SAAS,kBAAkB,UAAqC;CAC9D,MAAM,WAAW,OAAO,QAAQ,SAAS,MAAM,CAAC,CAAC,KAC9C,CAAC,QAAQ,YAAY,GAAG,OAAO,KAAK,KAAK,OAAO,MAAM,GACzD;CAEA,OAAO,IAAI,SAAS,UAAU,IAAI,SAAS,KAAK,KAAK;AACvD;AAEA,SAAS,KAAK,OAAgB,YAAY,KAAa;CACrD,IAAI,UAAU,UAAa,UAAU,MACnC,OAAO,OAAO,KAAK;CAGrB,MAAM,MAAM,OAAO,UAAU,WAAW,QAAQ,cAAc,KAAK;CAEnE,IAAI,IAAI,UAAU,WAChB,OAAO;CAGT,OAAO,GAAG,IAAI,MAAM,GAAG,YAAY,CAAC,EAAE;AACxC;AAEA,SAAS,cAAc,OAAwB;CAC7C,IAAI;EACF,OAAO,KAAK,UAAU,KAAK;CAC7B,QAAQ;EACN,OAAO,oBAAoB,OAAO,MAAM;CAC1C;AACF"}
@@ -1,7 +1,7 @@
1
1
  import { SupervisorConfig } from "../contracts/supervisor/supervisor-config.type.mjs";
2
2
  import { ResolvedIntentEntry } from "./entries.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/supervisor/signature.d.ts
4
+ //#region ../@warlock.js/ai/src/supervisor/signature.d.ts
5
5
  /**
6
6
  * Deterministic structural fingerprint of a supervisor definition.
7
7
  * Persisted on every snapshot so `resume()` can detect drift between
@@ -1 +1 @@
1
- {"version":3,"file":"signature.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/signature.ts"],"mappings":";;;;;;AAwBA;;;;;;;;;;;;;;AAE2C;;;;iBAF3B,gBAAA,CACd,MAAA,EAAQ,gBAAA,WACR,OAAA,EAAS,GAAA,SAAY,mBAAA"}
1
+ {"version":3,"file":"signature.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/signature.ts"],"mappings":";;;;;;AAwBA;;;;;;;;;;;;;;AAE2C;;;;iBAF3B,gBAAA,CACd,MAAA,EAAQ,gBAAA,WACR,OAAA,EAAS,GAAA,SAAY,mBAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/supervisor/signature.ts
1
+ //#region ../@warlock.js/ai/src/supervisor/signature.ts
2
2
  /**
3
3
  * Deterministic structural fingerprint of a supervisor definition.
4
4
  * Persisted on every snapshot so `resume()` can detect drift between
@@ -1 +1 @@
1
- {"version":3,"file":"signature.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/signature.ts"],"sourcesContent":["import { ClassifierAgentEntry, ClassifierRunEntry } from \"../contracts\";\nimport type { SupervisorConfig } from \"../contracts/supervisor/supervisor-config.type\";\nimport type { ResolvedIntentEntry } from \"./entries\";\n\n/**\n * Deterministic structural fingerprint of a supervisor definition.\n * Persisted on every snapshot so `resume()` can detect drift between\n * the saved run and the current definition. Covers:\n *\n * - Supervisor name.\n * - Every intent key + its resolved description + the underlying\n * unit's stable identity (agent name, workflow name + signature,\n * or `\"callback\"` marker for dev-callback intents).\n * - Router agent's name (if the supervisor uses LLM routing).\n * - Whether a deterministic `route` callback is configured (but not\n * its contents — route callbacks are code, not data).\n * - Whether an `evaluate` callback is configured.\n * - `initialAgent` when set.\n * - `maxIterations` (a semantic shape change, not a cosmetic one).\n *\n * Does NOT cover: system prompt text, logger, store identity, per-\n * event handlers — all runtime knobs that don't change the shape of\n * a resumable run.\n */\nexport function computeSignature(\n config: SupervisorConfig<unknown>,\n entries: Map<string, ResolvedIntentEntry>,\n): string {\n const intentsFingerprint = [...entries.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([intent, entry]) => ({\n k: intent,\n d: entry.description,\n u: fingerprintUnit(entry),\n }));\n\n const fingerprint = {\n n: config.name,\n a: intentsFingerprint,\n r: resolveRouterName(config.router),\n rc: config.route ? 1 : 0,\n e: config.evaluate ? 1 : 0,\n i: config.initialAgent ?? null,\n m: config.maxIterations ?? null,\n // Phase 7 / decisions §37 — classifier is part of structural identity.\n // Resume drift detection notices when the classifier swap changes\n // routing semantics. Same fingerprint shape as router (agent name\n // when applicable; \"callback\" marker for callback form).\n c: resolveClassifierFingerprint(config.classifier),\n };\n\n return hash(JSON.stringify(fingerprint));\n}\n\nfunction resolveRouterName(router: SupervisorConfig<unknown>[\"router\"]): string | null {\n if (!router) {\n return null;\n }\n\n if (typeof (router as { execute?: unknown }).execute === \"function\") {\n return (router as { name?: string }).name ?? null;\n }\n\n return (router as { agent?: { name?: string } }).agent?.name ?? null;\n}\n\nfunction resolveClassifierFingerprint(\n classifier: SupervisorConfig<unknown>[\"classifier\"],\n): unknown {\n if (!classifier) {\n return null;\n }\n\n if (typeof classifier === \"function\") {\n return { t: \"callback\" };\n }\n\n if (typeof (classifier as { execute?: unknown }).execute === \"function\") {\n return { t: \"agent\", n: (classifier as { name?: string }).name ?? null };\n }\n\n if (typeof (classifier as ClassifierRunEntry).run === \"function\") {\n return { t: \"callback\" };\n }\n\n if (typeof (classifier as ClassifierAgentEntry).agent?.execute === \"function\") {\n return {\n t: \"agent\",\n n: (classifier as ClassifierAgentEntry).agent?.name ?? null,\n };\n }\n\n return { t: \"unknown\" };\n}\n\nfunction fingerprintUnit(entry: ResolvedIntentEntry): unknown {\n if (entry.type === \"callback\") {\n // Callbacks are dev code — fingerprint the type + intent name\n // only (the closure itself can't be hashed deterministically).\n // Drift detection covers add/remove/rename of callback intents,\n // not edits to the function body. Same trade-off as `route`.\n return { t: \"callback\" };\n }\n\n if (entry.type === \"workflow\") {\n const workflow = entry.unit;\n return { t: \"workflow\", n: workflow.name, s: workflow.signature };\n }\n\n return { t: \"agent\", n: entry.unit.name };\n}\n\n/**\n * FNV-1a 32-bit — same hash `workflow/signature.ts` uses. Deterministic,\n * no crypto dependency, cheap; signatures are 8-char hex.\n */\nfunction hash(input: string): string {\n let h = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n\n return h.toString(16).padStart(8, \"0\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,iBACd,QACA,SACQ;CACR,MAAM,qBAAqB,CAAC,GAAG,QAAQ,QAAQ,CAAC,EAC7C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,EACrC,KAAK,CAAC,QAAQ,YAAY;EACzB,GAAG;EACH,GAAG,MAAM;EACT,GAAG,gBAAgB,KAAK;CAC1B,EAAE;CAEJ,MAAM,cAAc;EAClB,GAAG,OAAO;EACV,GAAG;EACH,GAAG,kBAAkB,OAAO,MAAM;EAClC,IAAI,OAAO,QAAQ,IAAI;EACvB,GAAG,OAAO,WAAW,IAAI;EACzB,GAAG,OAAO,gBAAgB;EAC1B,GAAG,OAAO,iBAAiB;EAK3B,GAAG,6BAA6B,OAAO,UAAU;CACnD;CAEA,OAAO,KAAK,KAAK,UAAU,WAAW,CAAC;AACzC;AAEA,SAAS,kBAAkB,QAA4D;CACrF,IAAI,CAAC,QACH,OAAO;CAGT,IAAI,OAAQ,OAAiC,YAAY,YACvD,OAAQ,OAA6B,QAAQ;CAG/C,OAAQ,OAAyC,OAAO,QAAQ;AAClE;AAEA,SAAS,6BACP,YACS;CACT,IAAI,CAAC,YACH,OAAO;CAGT,IAAI,OAAO,eAAe,YACxB,OAAO,EAAE,GAAG,WAAW;CAGzB,IAAI,OAAQ,WAAqC,YAAY,YAC3D,OAAO;EAAE,GAAG;EAAS,GAAI,WAAiC,QAAQ;CAAK;CAGzE,IAAI,OAAQ,WAAkC,QAAQ,YACpD,OAAO,EAAE,GAAG,WAAW;CAGzB,IAAI,OAAQ,WAAoC,OAAO,YAAY,YACjE,OAAO;EACL,GAAG;EACH,GAAI,WAAoC,OAAO,QAAQ;CACzD;CAGF,OAAO,EAAE,GAAG,UAAU;AACxB;AAEA,SAAS,gBAAgB,OAAqC;CAC5D,IAAI,MAAM,SAAS,YAKjB,OAAO,EAAE,GAAG,WAAW;CAGzB,IAAI,MAAM,SAAS,YAAY;EAC7B,MAAM,WAAW,MAAM;EACvB,OAAO;GAAE,GAAG;GAAY,GAAG,SAAS;GAAM,GAAG,SAAS;EAAU;CAClE;CAEA,OAAO;EAAE,GAAG;EAAS,GAAG,MAAM,KAAK;CAAK;AAC1C;;;;;AAMA,SAAS,KAAK,OAAuB;CACnC,IAAI,IAAI;CAER,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,KAAK,MAAM,WAAW,CAAC;EACvB,IAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,SAAU;CACxE;CAEA,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AACvC"}
1
+ {"version":3,"file":"signature.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/signature.ts"],"sourcesContent":["import { ClassifierAgentEntry, ClassifierRunEntry } from \"../contracts\";\nimport type { SupervisorConfig } from \"../contracts/supervisor/supervisor-config.type\";\nimport type { ResolvedIntentEntry } from \"./entries\";\n\n/**\n * Deterministic structural fingerprint of a supervisor definition.\n * Persisted on every snapshot so `resume()` can detect drift between\n * the saved run and the current definition. Covers:\n *\n * - Supervisor name.\n * - Every intent key + its resolved description + the underlying\n * unit's stable identity (agent name, workflow name + signature,\n * or `\"callback\"` marker for dev-callback intents).\n * - Router agent's name (if the supervisor uses LLM routing).\n * - Whether a deterministic `route` callback is configured (but not\n * its contents — route callbacks are code, not data).\n * - Whether an `evaluate` callback is configured.\n * - `initialAgent` when set.\n * - `maxIterations` (a semantic shape change, not a cosmetic one).\n *\n * Does NOT cover: system prompt text, logger, store identity, per-\n * event handlers — all runtime knobs that don't change the shape of\n * a resumable run.\n */\nexport function computeSignature(\n config: SupervisorConfig<unknown>,\n entries: Map<string, ResolvedIntentEntry>,\n): string {\n const intentsFingerprint = [...entries.entries()]\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([intent, entry]) => ({\n k: intent,\n d: entry.description,\n u: fingerprintUnit(entry),\n }));\n\n const fingerprint = {\n n: config.name,\n a: intentsFingerprint,\n r: resolveRouterName(config.router),\n rc: config.route ? 1 : 0,\n e: config.evaluate ? 1 : 0,\n i: config.initialAgent ?? null,\n m: config.maxIterations ?? null,\n // Phase 7 / decisions §37 — classifier is part of structural identity.\n // Resume drift detection notices when the classifier swap changes\n // routing semantics. Same fingerprint shape as router (agent name\n // when applicable; \"callback\" marker for callback form).\n c: resolveClassifierFingerprint(config.classifier),\n };\n\n return hash(JSON.stringify(fingerprint));\n}\n\nfunction resolveRouterName(router: SupervisorConfig<unknown>[\"router\"]): string | null {\n if (!router) {\n return null;\n }\n\n if (typeof (router as { execute?: unknown }).execute === \"function\") {\n return (router as { name?: string }).name ?? null;\n }\n\n return (router as { agent?: { name?: string } }).agent?.name ?? null;\n}\n\nfunction resolveClassifierFingerprint(\n classifier: SupervisorConfig<unknown>[\"classifier\"],\n): unknown {\n if (!classifier) {\n return null;\n }\n\n if (typeof classifier === \"function\") {\n return { t: \"callback\" };\n }\n\n if (typeof (classifier as { execute?: unknown }).execute === \"function\") {\n return { t: \"agent\", n: (classifier as { name?: string }).name ?? null };\n }\n\n if (typeof (classifier as ClassifierRunEntry).run === \"function\") {\n return { t: \"callback\" };\n }\n\n if (typeof (classifier as ClassifierAgentEntry).agent?.execute === \"function\") {\n return {\n t: \"agent\",\n n: (classifier as ClassifierAgentEntry).agent?.name ?? null,\n };\n }\n\n return { t: \"unknown\" };\n}\n\nfunction fingerprintUnit(entry: ResolvedIntentEntry): unknown {\n if (entry.type === \"callback\") {\n // Callbacks are dev code — fingerprint the type + intent name\n // only (the closure itself can't be hashed deterministically).\n // Drift detection covers add/remove/rename of callback intents,\n // not edits to the function body. Same trade-off as `route`.\n return { t: \"callback\" };\n }\n\n if (entry.type === \"workflow\") {\n const workflow = entry.unit;\n return { t: \"workflow\", n: workflow.name, s: workflow.signature };\n }\n\n return { t: \"agent\", n: entry.unit.name };\n}\n\n/**\n * FNV-1a 32-bit — same hash `workflow/signature.ts` uses. Deterministic,\n * no crypto dependency, cheap; signatures are 8-char hex.\n */\nfunction hash(input: string): string {\n let h = 0x811c9dc5;\n\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = (h + ((h << 1) + (h << 4) + (h << 7) + (h << 8) + (h << 24))) >>> 0;\n }\n\n return h.toString(16).padStart(8, \"0\");\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAwBA,SAAgB,iBACd,QACA,SACQ;CACR,MAAM,qBAAqB,CAAC,GAAG,QAAQ,QAAQ,CAAC,CAAC,CAC9C,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC,CAAC,CACtC,KAAK,CAAC,QAAQ,YAAY;EACzB,GAAG;EACH,GAAG,MAAM;EACT,GAAG,gBAAgB,KAAK;CAC1B,EAAE;CAEJ,MAAM,cAAc;EAClB,GAAG,OAAO;EACV,GAAG;EACH,GAAG,kBAAkB,OAAO,MAAM;EAClC,IAAI,OAAO,QAAQ,IAAI;EACvB,GAAG,OAAO,WAAW,IAAI;EACzB,GAAG,OAAO,gBAAgB;EAC1B,GAAG,OAAO,iBAAiB;EAK3B,GAAG,6BAA6B,OAAO,UAAU;CACnD;CAEA,OAAO,KAAK,KAAK,UAAU,WAAW,CAAC;AACzC;AAEA,SAAS,kBAAkB,QAA4D;CACrF,IAAI,CAAC,QACH,OAAO;CAGT,IAAI,OAAQ,OAAiC,YAAY,YACvD,OAAQ,OAA6B,QAAQ;CAG/C,OAAQ,OAAyC,OAAO,QAAQ;AAClE;AAEA,SAAS,6BACP,YACS;CACT,IAAI,CAAC,YACH,OAAO;CAGT,IAAI,OAAO,eAAe,YACxB,OAAO,EAAE,GAAG,WAAW;CAGzB,IAAI,OAAQ,WAAqC,YAAY,YAC3D,OAAO;EAAE,GAAG;EAAS,GAAI,WAAiC,QAAQ;CAAK;CAGzE,IAAI,OAAQ,WAAkC,QAAQ,YACpD,OAAO,EAAE,GAAG,WAAW;CAGzB,IAAI,OAAQ,WAAoC,OAAO,YAAY,YACjE,OAAO;EACL,GAAG;EACH,GAAI,WAAoC,OAAO,QAAQ;CACzD;CAGF,OAAO,EAAE,GAAG,UAAU;AACxB;AAEA,SAAS,gBAAgB,OAAqC;CAC5D,IAAI,MAAM,SAAS,YAKjB,OAAO,EAAE,GAAG,WAAW;CAGzB,IAAI,MAAM,SAAS,YAAY;EAC7B,MAAM,WAAW,MAAM;EACvB,OAAO;GAAE,GAAG;GAAY,GAAG,SAAS;GAAM,GAAG,SAAS;EAAU;CAClE;CAEA,OAAO;EAAE,GAAG;EAAS,GAAG,MAAM,KAAK;CAAK;AAC1C;;;;;AAMA,SAAS,KAAK,OAAuB;CACnC,IAAI,IAAI;CAER,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;EACrC,KAAK,MAAM,WAAW,CAAC;EACvB,IAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,SAAU;CACxE;CAEA,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,SAAS,GAAG,GAAG;AACvC"}
@@ -4,7 +4,7 @@ import { SupervisorConfig } from "../contracts/supervisor/supervisor-config.type
4
4
  import { SupervisorResumeOptions } from "../contracts/supervisor/supervisor-execute-options.type.mjs";
5
5
  import { SupervisorSnapshot, SupervisorSnapshotStatus } from "../contracts/supervisor/supervisor-snapshot.type.mjs";
6
6
 
7
- //#region ../../@warlock.js/ai/src/supervisor/snapshot.d.ts
7
+ //#region ../@warlock.js/ai/src/supervisor/snapshot.d.ts
8
8
  type PersistParams = {
9
9
  config: SupervisorConfig<unknown>;
10
10
  signature: string;
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/snapshot.ts"],"mappings":";;;;;;;KAoBY,aAAA;EACV,MAAA,EAAQ,gBAAA;EACR,SAAA;EACA,KAAA;EACA,KAAA,EAAO,eAAA;EACP,SAAA;EACA,SAAA;EACA,SAAA,EAAW,iBAAA;EACX,MAAA,EAAQ,wBAAA;AAAA;AAAA,KAGE,cAAA;EAAmB,EAAA;AAAA;EAAe,EAAA;EAAW,KAAA;AAAA;;;;;;;;;iBAUnC,yBAAA,CACpB,MAAA,EAAQ,aAAA,GACP,OAAA,CAAQ,cAAA;AAZX;;;;;;;AAAA,iBA+CsB,qBAAA,CAAsB,MAAA;EAC1C,MAAA,EAAQ,gBAAA;EACR,SAAA;EACA,KAAA;EACA,OAAA,GAAU,uBAAA;AAAA,IACR,OAAA,CAAQ,kBAAA;;;;;;iBAuCI,WAAA,CAAY,KAAa"}
1
+ {"version":3,"file":"snapshot.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/snapshot.ts"],"mappings":";;;;;;;KAoBY,aAAA;EACV,MAAA,EAAQ,gBAAA;EACR,SAAA;EACA,KAAA;EACA,KAAA,EAAO,eAAA;EACP,SAAA;EACA,SAAA;EACA,SAAA,EAAW,iBAAA;EACX,MAAA,EAAQ,wBAAA;AAAA;AAAA,KAGE,cAAA;EAAmB,EAAA;AAAA;EAAe,EAAA;EAAW,KAAA;AAAA;;;;;;;;;iBAUnC,yBAAA,CACpB,MAAA,EAAQ,aAAA,GACP,OAAA,CAAQ,cAAA;AAZX;;;;;;;AAAA,iBA+CsB,qBAAA,CAAsB,MAAA;EAC1C,MAAA,EAAQ,gBAAA;EACR,SAAA;EACA,KAAA;EACA,OAAA,GAAU,uBAAA;AAAA,IACR,OAAA,CAAQ,kBAAA;;;;;;iBAuCI,WAAA,CAAY,KAAa"}
@@ -3,7 +3,7 @@ import { SupervisorDriftError } from "../errors/supervisor-drift-error.mjs";
3
3
  import "../errors/index.mjs";
4
4
  import { resolveDefaultStore } from "../config.mjs";
5
5
 
6
- //#region ../../@warlock.js/ai/src/supervisor/snapshot.ts
6
+ //#region ../@warlock.js/ai/src/supervisor/snapshot.ts
7
7
  /**
8
8
  * Resolve the effective snapshot store: the supervisor's own
9
9
  * `snapshotStore` field wins; absent that, fall back to the global
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/snapshot.ts"],"sourcesContent":["import { resolveDefaultStore } from \"../config\";\nimport type { IterationSnapshot } from \"../contracts/supervisor/iteration-snapshot.type\";\nimport type { SupervisorConfig } from \"../contracts/supervisor/supervisor-config.type\";\nimport type { SupervisorResumeOptions } from \"../contracts/supervisor/supervisor-execute-options.type\";\nimport type { SupervisorInput } from \"../contracts/supervisor/supervisor-input.type\";\nimport type {\n SupervisorSnapshot,\n SupervisorSnapshotStatus,\n} from \"../contracts/supervisor/supervisor-snapshot.type\";\nimport { SupervisorDriftError, SupervisorFailedError } from \"../errors\";\n\n/**\n * Resolve the effective snapshot store: the supervisor's own\n * `snapshotStore` field wins; absent that, fall back to the global\n * default set via `ai.config({ defaultStore })`.\n */\nfunction resolveSnapshotStore(config: SupervisorConfig<unknown>) {\n return config.snapshotStore ?? resolveDefaultStore();\n}\n\nexport type PersistParams = {\n config: SupervisorConfig<unknown>;\n signature: string;\n runId: string;\n input: SupervisorInput;\n startedAt: string;\n iteration: number;\n snapshots: IterationSnapshot[];\n status: SupervisorSnapshotStatus;\n};\n\nexport type PersistOutcome = { ok: true } | { ok: false; error: unknown };\n\n/**\n * Write the current run state to the resolved snapshot store. No-op\n * (ok) when neither the supervisor's `snapshotStore` nor the global\n * `defaultStore` is configured. Failures are returned as\n * `{ ok: false }` rather than thrown so the engine can surface them\n * via events/logs without aborting the run — callers decide whether\n * a failed checkpoint is fatal.\n */\nexport async function persistSupervisorSnapshot(\n params: PersistParams,\n): Promise<PersistOutcome> {\n const store = resolveSnapshotStore(params.config);\n\n if (!store) {\n return { ok: true };\n }\n\n const snapshot: SupervisorSnapshot = {\n runId: params.runId,\n supervisorName: params.config.name,\n signature: params.signature,\n input: params.input,\n iteration: params.iteration,\n snapshots: params.snapshots,\n status: params.status,\n startedAt: params.startedAt,\n savedAt: new Date().toISOString(),\n };\n\n try {\n await store.set(snapshotKey(params.runId), snapshot);\n\n return { ok: true };\n } catch (error) {\n return { ok: false, error };\n }\n}\n\n/**\n * Load a persisted snapshot for `resume()` and run the drift check.\n * Throws `SupervisorFailedError` when no store is configured or when\n * the run is missing; throws `SupervisorDriftError` when the stored\n * signature doesn't match the current definition (unless `force` is\n * set).\n */\nexport async function loadSnapshotForResume(params: {\n config: SupervisorConfig<unknown>;\n signature: string;\n runId: string;\n options?: SupervisorResumeOptions;\n}): Promise<SupervisorSnapshot> {\n const store = resolveSnapshotStore(params.config);\n\n if (!store) {\n throw new SupervisorFailedError(\n `supervisor \"${params.config.name}\" has no store configured — set \\`snapshotStore\\` on the config or call \\`ai.config({ defaultStore })\\` at boot before calling resume()`,\n { context: { runId: params.runId } },\n );\n }\n\n const snapshot =\n (await store.get<SupervisorSnapshot>(snapshotKey(params.runId))) ?? null;\n\n if (!snapshot) {\n throw new SupervisorFailedError(\n `supervisor \"${params.config.name}\": no snapshot for runId \"${params.runId}\"`,\n { context: { runId: params.runId } },\n );\n }\n\n if (!params.options?.force && snapshot.signature !== params.signature) {\n throw new SupervisorDriftError(\n `supervisor \"${params.config.name}\" signature drift on resume`,\n {\n savedSignature: snapshot.signature,\n currentSignature: params.signature,\n runId: params.runId,\n },\n );\n }\n\n return snapshot;\n}\n\n/**\n * Canonical key shape used in the KVStore. Prefixed so supervisor\n * snapshots don't collide with workflow / session snapshots in a\n * shared store.\n */\nexport function snapshotKey(runId: string): string {\n return `supervisor:${runId}`;\n}\n"],"mappings":";;;;;;;;;;;AAgBA,SAAS,qBAAqB,QAAmC;CAC/D,OAAO,OAAO,iBAAiB,oBAAoB;AACrD;;;;;;;;;AAuBA,eAAsB,0BACpB,QACyB;CACzB,MAAM,QAAQ,qBAAqB,OAAO,MAAM;CAEhD,IAAI,CAAC,OACH,OAAO,EAAE,IAAI,KAAK;CAGpB,MAAM,WAA+B;EACnC,OAAO,OAAO;EACd,gBAAgB,OAAO,OAAO;EAC9B,WAAW,OAAO;EAClB,OAAO,OAAO;EACd,WAAW,OAAO;EAClB,WAAW,OAAO;EAClB,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,0BAAS,IAAI,KAAK,GAAE,YAAY;CAClC;CAEA,IAAI;EACF,MAAM,MAAM,IAAI,YAAY,OAAO,KAAK,GAAG,QAAQ;EAEnD,OAAO,EAAE,IAAI,KAAK;CACpB,SAAS,OAAO;EACd,OAAO;GAAE,IAAI;GAAO;EAAM;CAC5B;AACF;;;;;;;;AASA,eAAsB,sBAAsB,QAKZ;CAC9B,MAAM,QAAQ,qBAAqB,OAAO,MAAM;CAEhD,IAAI,CAAC,OACH,MAAM,IAAI,sBACR,eAAe,OAAO,OAAO,KAAK,0IAClC,EAAE,SAAS,EAAE,OAAO,OAAO,MAAM,EAAE,CACrC;CAGF,MAAM,WACH,MAAM,MAAM,IAAwB,YAAY,OAAO,KAAK,CAAC,KAAM;CAEtE,IAAI,CAAC,UACH,MAAM,IAAI,sBACR,eAAe,OAAO,OAAO,KAAK,4BAA4B,OAAO,MAAM,IAC3E,EAAE,SAAS,EAAE,OAAO,OAAO,MAAM,EAAE,CACrC;CAGF,IAAI,CAAC,OAAO,SAAS,SAAS,SAAS,cAAc,OAAO,WAC1D,MAAM,IAAI,qBACR,eAAe,OAAO,OAAO,KAAK,8BAClC;EACE,gBAAgB,SAAS;EACzB,kBAAkB,OAAO;EACzB,OAAO,OAAO;CAChB,CACF;CAGF,OAAO;AACT;;;;;;AAOA,SAAgB,YAAY,OAAuB;CACjD,OAAO,cAAc;AACvB"}
1
+ {"version":3,"file":"snapshot.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/snapshot.ts"],"sourcesContent":["import { resolveDefaultStore } from \"../config\";\nimport type { IterationSnapshot } from \"../contracts/supervisor/iteration-snapshot.type\";\nimport type { SupervisorConfig } from \"../contracts/supervisor/supervisor-config.type\";\nimport type { SupervisorResumeOptions } from \"../contracts/supervisor/supervisor-execute-options.type\";\nimport type { SupervisorInput } from \"../contracts/supervisor/supervisor-input.type\";\nimport type {\n SupervisorSnapshot,\n SupervisorSnapshotStatus,\n} from \"../contracts/supervisor/supervisor-snapshot.type\";\nimport { SupervisorDriftError, SupervisorFailedError } from \"../errors\";\n\n/**\n * Resolve the effective snapshot store: the supervisor's own\n * `snapshotStore` field wins; absent that, fall back to the global\n * default set via `ai.config({ defaultStore })`.\n */\nfunction resolveSnapshotStore(config: SupervisorConfig<unknown>) {\n return config.snapshotStore ?? resolveDefaultStore();\n}\n\nexport type PersistParams = {\n config: SupervisorConfig<unknown>;\n signature: string;\n runId: string;\n input: SupervisorInput;\n startedAt: string;\n iteration: number;\n snapshots: IterationSnapshot[];\n status: SupervisorSnapshotStatus;\n};\n\nexport type PersistOutcome = { ok: true } | { ok: false; error: unknown };\n\n/**\n * Write the current run state to the resolved snapshot store. No-op\n * (ok) when neither the supervisor's `snapshotStore` nor the global\n * `defaultStore` is configured. Failures are returned as\n * `{ ok: false }` rather than thrown so the engine can surface them\n * via events/logs without aborting the run — callers decide whether\n * a failed checkpoint is fatal.\n */\nexport async function persistSupervisorSnapshot(\n params: PersistParams,\n): Promise<PersistOutcome> {\n const store = resolveSnapshotStore(params.config);\n\n if (!store) {\n return { ok: true };\n }\n\n const snapshot: SupervisorSnapshot = {\n runId: params.runId,\n supervisorName: params.config.name,\n signature: params.signature,\n input: params.input,\n iteration: params.iteration,\n snapshots: params.snapshots,\n status: params.status,\n startedAt: params.startedAt,\n savedAt: new Date().toISOString(),\n };\n\n try {\n await store.set(snapshotKey(params.runId), snapshot);\n\n return { ok: true };\n } catch (error) {\n return { ok: false, error };\n }\n}\n\n/**\n * Load a persisted snapshot for `resume()` and run the drift check.\n * Throws `SupervisorFailedError` when no store is configured or when\n * the run is missing; throws `SupervisorDriftError` when the stored\n * signature doesn't match the current definition (unless `force` is\n * set).\n */\nexport async function loadSnapshotForResume(params: {\n config: SupervisorConfig<unknown>;\n signature: string;\n runId: string;\n options?: SupervisorResumeOptions;\n}): Promise<SupervisorSnapshot> {\n const store = resolveSnapshotStore(params.config);\n\n if (!store) {\n throw new SupervisorFailedError(\n `supervisor \"${params.config.name}\" has no store configured — set \\`snapshotStore\\` on the config or call \\`ai.config({ defaultStore })\\` at boot before calling resume()`,\n { context: { runId: params.runId } },\n );\n }\n\n const snapshot =\n (await store.get<SupervisorSnapshot>(snapshotKey(params.runId))) ?? null;\n\n if (!snapshot) {\n throw new SupervisorFailedError(\n `supervisor \"${params.config.name}\": no snapshot for runId \"${params.runId}\"`,\n { context: { runId: params.runId } },\n );\n }\n\n if (!params.options?.force && snapshot.signature !== params.signature) {\n throw new SupervisorDriftError(\n `supervisor \"${params.config.name}\" signature drift on resume`,\n {\n savedSignature: snapshot.signature,\n currentSignature: params.signature,\n runId: params.runId,\n },\n );\n }\n\n return snapshot;\n}\n\n/**\n * Canonical key shape used in the KVStore. Prefixed so supervisor\n * snapshots don't collide with workflow / session snapshots in a\n * shared store.\n */\nexport function snapshotKey(runId: string): string {\n return `supervisor:${runId}`;\n}\n"],"mappings":";;;;;;;;;;;AAgBA,SAAS,qBAAqB,QAAmC;CAC/D,OAAO,OAAO,iBAAiB,oBAAoB;AACrD;;;;;;;;;AAuBA,eAAsB,0BACpB,QACyB;CACzB,MAAM,QAAQ,qBAAqB,OAAO,MAAM;CAEhD,IAAI,CAAC,OACH,OAAO,EAAE,IAAI,KAAK;CAGpB,MAAM,WAA+B;EACnC,OAAO,OAAO;EACd,gBAAgB,OAAO,OAAO;EAC9B,WAAW,OAAO;EAClB,OAAO,OAAO;EACd,WAAW,OAAO;EAClB,WAAW,OAAO;EAClB,QAAQ,OAAO;EACf,WAAW,OAAO;EAClB,0BAAS,IAAI,KAAK,EAAC,CAAC,YAAY;CAClC;CAEA,IAAI;EACF,MAAM,MAAM,IAAI,YAAY,OAAO,KAAK,GAAG,QAAQ;EAEnD,OAAO,EAAE,IAAI,KAAK;CACpB,SAAS,OAAO;EACd,OAAO;GAAE,IAAI;GAAO;EAAM;CAC5B;AACF;;;;;;;;AASA,eAAsB,sBAAsB,QAKZ;CAC9B,MAAM,QAAQ,qBAAqB,OAAO,MAAM;CAEhD,IAAI,CAAC,OACH,MAAM,IAAI,sBACR,eAAe,OAAO,OAAO,KAAK,0IAClC,EAAE,SAAS,EAAE,OAAO,OAAO,MAAM,EAAE,CACrC;CAGF,MAAM,WACH,MAAM,MAAM,IAAwB,YAAY,OAAO,KAAK,CAAC,KAAM;CAEtE,IAAI,CAAC,UACH,MAAM,IAAI,sBACR,eAAe,OAAO,OAAO,KAAK,4BAA4B,OAAO,MAAM,IAC3E,EAAE,SAAS,EAAE,OAAO,OAAO,MAAM,EAAE,CACrC;CAGF,IAAI,CAAC,OAAO,SAAS,SAAS,SAAS,cAAc,OAAO,WAC1D,MAAM,IAAI,qBACR,eAAe,OAAO,OAAO,KAAK,8BAClC;EACE,gBAAgB,SAAS;EACzB,kBAAkB,OAAO;EACzB,OAAO,OAAO;CAChB,CACF;CAGF,OAAO;AACT;;;;;;AAOA,SAAgB,YAAY,OAAuB;CACjD,OAAO,cAAc;AACvB"}
@@ -1,7 +1,7 @@
1
1
  import { StreamContract } from "../contracts/stream/stream.contract.mjs";
2
2
  import { SupervisorStreamEvent } from "../contracts/supervisor/supervisor-stream-event.type.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/supervisor/supervisor-stream.d.ts
4
+ //#region ../@warlock.js/ai/src/supervisor/supervisor-stream.d.ts
5
5
  /**
6
6
  * Internal async-queue controller driving `supervisor.stream()`.
7
7
  * Mirrors `StreamController` from `agent-stream.ts` — same
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor-stream.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/supervisor-stream.ts"],"mappings":";;;;;AAaA;;;;;KAAY,0BAAA;EACV,IAAA,CAAK,KAAA,EAAO,qBAAA;EACZ,GAAA,CAAI,MAAA,EAAQ,OAAA;EACZ,IAAA,CAAK,KAAA,EAAO,KAAA;AAAA;;;;;;;;iBAeE,sBAAA,SAAA,CAAA;EACd,UAAA,EAAY,0BAAA,CAA2B,OAAA;EACvC,MAAA,EAAQ,cAAA,CAAe,OAAA,EAAS,qBAAA;AAAA"}
1
+ {"version":3,"file":"supervisor-stream.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/supervisor-stream.ts"],"mappings":";;;;;AAaA;;;;;KAAY,0BAAA;EACV,IAAA,CAAK,KAAA,EAAO,qBAAA;EACZ,GAAA,CAAI,MAAA,EAAQ,OAAA;EACZ,IAAA,CAAK,KAAA,EAAO,KAAA;AAAA;;;;;;;;iBAeE,sBAAA;EACd,UAAA,EAAY,0BAAA,CAA2B,OAAA;EACvC,MAAA,EAAQ,cAAA,CAAe,OAAA,EAAS,qBAAA;AAAA"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/supervisor/supervisor-stream.ts
1
+ //#region ../@warlock.js/ai/src/supervisor/supervisor-stream.ts
2
2
  /**
3
3
  * Factory mirroring `createAgentStream`. Returns a paired
4
4
  * `{ controller, stream }` — the `SupervisorExecution` pushes events
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor-stream.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/supervisor-stream.ts"],"sourcesContent":["import type { StreamContract } from \"../contracts/stream/stream.contract\";\nimport type { SupervisorStreamEvent } from \"../contracts/supervisor/supervisor-stream-event.type\";\n\n// Re-export so internal callers that already imported from this file\n// keep working unchanged. Canonical home is the contracts barrel.\nexport type { SupervisorStreamEvent };\n\n/**\n * Internal async-queue controller driving `supervisor.stream()`.\n * Mirrors `StreamController` from `agent-stream.ts` — same\n * producer/consumer pipe, same semantics, parameterized by the\n * supervisor event union and terminal result type.\n */\nexport type SupervisorStreamController<TResult> = {\n push(event: SupervisorStreamEvent): void;\n end(result: TResult): void;\n fail(error: Error): void;\n};\n\ntype PendingRead = {\n resolve(value: IteratorResult<SupervisorStreamEvent>): void;\n reject(error: Error): void;\n};\n\n/**\n * Factory mirroring `createAgentStream`. Returns a paired\n * `{ controller, stream }` — the `SupervisorExecution` pushes events\n * into the controller while the caller iterates (or awaits `.result`)\n * on the stream side. See `agent-stream.ts` for the full role\n * description.\n */\nexport function createSupervisorStream<TResult>(): {\n controller: SupervisorStreamController<TResult>;\n stream: StreamContract<TResult, SupervisorStreamEvent>;\n} {\n const queue: SupervisorStreamEvent[] = [];\n const pending: PendingRead[] = [];\n const handlers = new Map<string, (event: SupervisorStreamEvent) => void>();\n\n let closed = false;\n let failure: Error | undefined;\n let resolveResult!: (value: TResult) => void;\n let rejectResult!: (error: Error) => void;\n\n const result = new Promise<TResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const controller: SupervisorStreamController<TResult> = {\n push(event) {\n const handler = handlers.get(event.type);\n\n if (handler) {\n try {\n handler(event);\n } catch {\n // Stream handlers must never crash the supervisor.\n }\n }\n\n const reader = pending.shift();\n\n if (reader) {\n reader.resolve({ value: event, done: false });\n return;\n }\n\n queue.push(event);\n },\n\n end(finalResult) {\n closed = true;\n resolveResult(finalResult);\n\n while (pending.length > 0) {\n pending.shift()?.resolve({ value: undefined, done: true });\n }\n },\n\n fail(error) {\n closed = true;\n failure = error;\n rejectResult(error);\n\n while (pending.length > 0) {\n pending.shift()?.reject(error);\n }\n },\n };\n\n const iterator: AsyncIterator<SupervisorStreamEvent> = {\n next() {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n\n if (closed) {\n if (failure) {\n return Promise.reject(failure);\n }\n\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise<IteratorResult<SupervisorStreamEvent>>(\n (resolve, reject) => {\n pending.push({ resolve, reject });\n },\n );\n },\n };\n\n // The `StreamContract<TResult>` shape is shared across primitives —\n // it types `on()` over the generic `StreamEvent` union (agent\n // events). Supervisor events are a distinct discriminated union\n // with the same `type`-keyed shape, so we satisfy the contract via\n // a structural cast — handlers see the supervisor events at their\n // correct narrowed types.\n const stream = {\n result,\n on(handlerMap) {\n for (const [key, handler] of Object.entries(handlerMap)) {\n if (handler) {\n handlers.set(key, handler as (event: SupervisorStreamEvent) => void);\n }\n }\n\n return stream;\n },\n [Symbol.asyncIterator]() {\n return iterator;\n },\n } as StreamContract<TResult, SupervisorStreamEvent>;\n\n return { controller, stream };\n}\n"],"mappings":";;;;;;;;AA+BA,SAAgB,yBAGd;CACA,MAAM,QAAiC,CAAC;CACxC,MAAM,UAAyB,CAAC;CAChC,MAAM,2BAAW,IAAI,IAAoD;CAEzE,IAAI,SAAS;CACb,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,MAAM,SAAS,IAAI,SAAkB,SAAS,WAAW;EACvD,gBAAgB;EAChB,eAAe;CACjB,CAAC;CAED,MAAM,aAAkD;EACtD,KAAK,OAAO;GACV,MAAM,UAAU,SAAS,IAAI,MAAM,IAAI;GAEvC,IAAI,SACF,IAAI;IACF,QAAQ,KAAK;GACf,QAAQ,CAER;GAGF,MAAM,SAAS,QAAQ,MAAM;GAE7B,IAAI,QAAQ;IACV,OAAO,QAAQ;KAAE,OAAO;KAAO,MAAM;IAAM,CAAC;IAC5C;GACF;GAEA,MAAM,KAAK,KAAK;EAClB;EAEA,IAAI,aAAa;GACf,SAAS;GACT,cAAc,WAAW;GAEzB,OAAO,QAAQ,SAAS,GACtB,QAAQ,MAAM,GAAG,QAAQ;IAAE,OAAO;IAAW,MAAM;GAAK,CAAC;EAE7D;EAEA,KAAK,OAAO;GACV,SAAS;GACT,UAAU;GACV,aAAa,KAAK;GAElB,OAAO,QAAQ,SAAS,GACtB,QAAQ,MAAM,GAAG,OAAO,KAAK;EAEjC;CACF;CAEA,MAAM,WAAiD,EACrD,OAAO;EACL,IAAI,MAAM,SAAS,GACjB,OAAO,QAAQ,QAAQ;GAAE,OAAO,MAAM,MAAM;GAAI,MAAM;EAAM,CAAC;EAG/D,IAAI,QAAQ;GACV,IAAI,SACF,OAAO,QAAQ,OAAO,OAAO;GAG/B,OAAO,QAAQ,QAAQ;IAAE,OAAO;IAAW,MAAM;GAAK,CAAC;EACzD;EAEA,OAAO,IAAI,SACR,SAAS,WAAW;GACnB,QAAQ,KAAK;IAAE;IAAS;GAAO,CAAC;EAClC,CACF;CACF,EACF;CAQA,MAAM,SAAS;EACb;EACA,GAAG,YAAY;GACb,KAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,UAAU,GACpD,IAAI,SACF,SAAS,IAAI,KAAK,OAAiD;GAIvE,OAAO;EACT;EACA,CAAC,OAAO,iBAAiB;GACvB,OAAO;EACT;CACF;CAEA,OAAO;EAAE;EAAY;CAAO;AAC9B"}
1
+ {"version":3,"file":"supervisor-stream.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/supervisor-stream.ts"],"sourcesContent":["import type { StreamContract } from \"../contracts/stream/stream.contract\";\nimport type { SupervisorStreamEvent } from \"../contracts/supervisor/supervisor-stream-event.type\";\n\n// Re-export so internal callers that already imported from this file\n// keep working unchanged. Canonical home is the contracts barrel.\nexport type { SupervisorStreamEvent };\n\n/**\n * Internal async-queue controller driving `supervisor.stream()`.\n * Mirrors `StreamController` from `agent-stream.ts` — same\n * producer/consumer pipe, same semantics, parameterized by the\n * supervisor event union and terminal result type.\n */\nexport type SupervisorStreamController<TResult> = {\n push(event: SupervisorStreamEvent): void;\n end(result: TResult): void;\n fail(error: Error): void;\n};\n\ntype PendingRead = {\n resolve(value: IteratorResult<SupervisorStreamEvent>): void;\n reject(error: Error): void;\n};\n\n/**\n * Factory mirroring `createAgentStream`. Returns a paired\n * `{ controller, stream }` — the `SupervisorExecution` pushes events\n * into the controller while the caller iterates (or awaits `.result`)\n * on the stream side. See `agent-stream.ts` for the full role\n * description.\n */\nexport function createSupervisorStream<TResult>(): {\n controller: SupervisorStreamController<TResult>;\n stream: StreamContract<TResult, SupervisorStreamEvent>;\n} {\n const queue: SupervisorStreamEvent[] = [];\n const pending: PendingRead[] = [];\n const handlers = new Map<string, (event: SupervisorStreamEvent) => void>();\n\n let closed = false;\n let failure: Error | undefined;\n let resolveResult!: (value: TResult) => void;\n let rejectResult!: (error: Error) => void;\n\n const result = new Promise<TResult>((resolve, reject) => {\n resolveResult = resolve;\n rejectResult = reject;\n });\n\n const controller: SupervisorStreamController<TResult> = {\n push(event) {\n const handler = handlers.get(event.type);\n\n if (handler) {\n try {\n handler(event);\n } catch {\n // Stream handlers must never crash the supervisor.\n }\n }\n\n const reader = pending.shift();\n\n if (reader) {\n reader.resolve({ value: event, done: false });\n return;\n }\n\n queue.push(event);\n },\n\n end(finalResult) {\n closed = true;\n resolveResult(finalResult);\n\n while (pending.length > 0) {\n pending.shift()?.resolve({ value: undefined, done: true });\n }\n },\n\n fail(error) {\n closed = true;\n failure = error;\n rejectResult(error);\n\n while (pending.length > 0) {\n pending.shift()?.reject(error);\n }\n },\n };\n\n const iterator: AsyncIterator<SupervisorStreamEvent> = {\n next() {\n if (queue.length > 0) {\n return Promise.resolve({ value: queue.shift()!, done: false });\n }\n\n if (closed) {\n if (failure) {\n return Promise.reject(failure);\n }\n\n return Promise.resolve({ value: undefined, done: true });\n }\n\n return new Promise<IteratorResult<SupervisorStreamEvent>>(\n (resolve, reject) => {\n pending.push({ resolve, reject });\n },\n );\n },\n };\n\n // The `StreamContract<TResult>` shape is shared across primitives —\n // it types `on()` over the generic `StreamEvent` union (agent\n // events). Supervisor events are a distinct discriminated union\n // with the same `type`-keyed shape, so we satisfy the contract via\n // a structural cast — handlers see the supervisor events at their\n // correct narrowed types.\n const stream = {\n result,\n on(handlerMap) {\n for (const [key, handler] of Object.entries(handlerMap)) {\n if (handler) {\n handlers.set(key, handler as (event: SupervisorStreamEvent) => void);\n }\n }\n\n return stream;\n },\n [Symbol.asyncIterator]() {\n return iterator;\n },\n } as StreamContract<TResult, SupervisorStreamEvent>;\n\n return { controller, stream };\n}\n"],"mappings":";;;;;;;;AA+BA,SAAgB,yBAGd;CACA,MAAM,QAAiC,CAAC;CACxC,MAAM,UAAyB,CAAC;CAChC,MAAM,2BAAW,IAAI,IAAoD;CAEzE,IAAI,SAAS;CACb,IAAI;CACJ,IAAI;CACJ,IAAI;CAEJ,MAAM,SAAS,IAAI,SAAkB,SAAS,WAAW;EACvD,gBAAgB;EAChB,eAAe;CACjB,CAAC;CAED,MAAM,aAAkD;EACtD,KAAK,OAAO;GACV,MAAM,UAAU,SAAS,IAAI,MAAM,IAAI;GAEvC,IAAI,SACF,IAAI;IACF,QAAQ,KAAK;GACf,QAAQ,CAER;GAGF,MAAM,SAAS,QAAQ,MAAM;GAE7B,IAAI,QAAQ;IACV,OAAO,QAAQ;KAAE,OAAO;KAAO,MAAM;IAAM,CAAC;IAC5C;GACF;GAEA,MAAM,KAAK,KAAK;EAClB;EAEA,IAAI,aAAa;GACf,SAAS;GACT,cAAc,WAAW;GAEzB,OAAO,QAAQ,SAAS,GACtB,QAAQ,MAAM,CAAC,EAAE,QAAQ;IAAE,OAAO;IAAW,MAAM;GAAK,CAAC;EAE7D;EAEA,KAAK,OAAO;GACV,SAAS;GACT,UAAU;GACV,aAAa,KAAK;GAElB,OAAO,QAAQ,SAAS,GACtB,QAAQ,MAAM,CAAC,EAAE,OAAO,KAAK;EAEjC;CACF;CAEA,MAAM,WAAiD,EACrD,OAAO;EACL,IAAI,MAAM,SAAS,GACjB,OAAO,QAAQ,QAAQ;GAAE,OAAO,MAAM,MAAM;GAAI,MAAM;EAAM,CAAC;EAG/D,IAAI,QAAQ;GACV,IAAI,SACF,OAAO,QAAQ,OAAO,OAAO;GAG/B,OAAO,QAAQ,QAAQ;IAAE,OAAO;IAAW,MAAM;GAAK,CAAC;EACzD;EAEA,OAAO,IAAI,SACR,SAAS,WAAW;GACnB,QAAQ,KAAK;IAAE;IAAS;GAAO,CAAC;EAClC,CACF;CACF,EACF;CAQA,MAAM,SAAS;EACb;EACA,GAAG,YAAY;GACb,KAAK,MAAM,CAAC,KAAK,YAAY,OAAO,QAAQ,UAAU,GACpD,IAAI,SACF,SAAS,IAAI,KAAK,OAAiD;GAIvE,OAAO;EACT;EACA,CAAC,OAAO,iBAAiB;GACvB,OAAO;EACT;CACF;CAEA,OAAO;EAAE;EAAY;CAAO;AAC9B"}
@@ -2,7 +2,7 @@ import { SupervisorIntentValue } from "../contracts/supervisor/intent-entry.type
2
2
  import { SupervisorConfig } from "../contracts/supervisor/supervisor-config.type.mjs";
3
3
  import { SupervisorContract } from "../contracts/supervisor/supervisor.contract.mjs";
4
4
 
5
- //#region ../../@warlock.js/ai/src/supervisor/supervisor.d.ts
5
+ //#region ../@warlock.js/ai/src/supervisor/supervisor.d.ts
6
6
  /**
7
7
  * `ai.supervisor(config)` — construct a `SupervisorContract`. Validates
8
8
  * the config at author time (throws `SupervisorFailedError` on bad
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/supervisor.ts"],"mappings":";;;;;;;AA8CA;;;;;;;;;;;;;;;;iBAAgB,UAAA,6BAEL,OAAA,mBACQ,MAAA,SAAe,qBAAA,IAAyB,MAAA,SAAe,qBAAA,gBAC3D,MAAA,kBAAA,CACb,MAAA,EAAQ,gBAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,UAAA,IAAc,kBAAA,CAAmB,OAAA"}
1
+ {"version":3,"file":"supervisor.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/supervisor.ts"],"mappings":";;;;;;;AA8CA;;;;;;;;;;;;;;;;iBAAgB,UAAA,6BAEL,OAAA,mBACQ,MAAA,SAAe,qBAAA,IAAyB,MAAA,SAAe,qBAAA,gBAC3D,MAAA,mBACb,MAAA,EAAQ,gBAAA,CAAiB,OAAA,EAAS,MAAA,EAAQ,QAAA,EAAU,UAAA,IAAc,kBAAA,CAAmB,OAAA"}
@@ -8,7 +8,7 @@ import { SupervisorExecution } from "./execution.mjs";
8
8
  import { computeSignature } from "./signature.mjs";
9
9
  import { createSupervisorStream } from "./supervisor-stream.mjs";
10
10
 
11
- //#region ../../@warlock.js/ai/src/supervisor/supervisor.ts
11
+ //#region ../@warlock.js/ai/src/supervisor/supervisor.ts
12
12
  /**
13
13
  * `ai.supervisor(config)` — construct a `SupervisorContract`. Validates
14
14
  * the config at author time (throws `SupervisorFailedError` on bad
@@ -1 +1 @@
1
- {"version":3,"file":"supervisor.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/supervisor/supervisor.ts"],"sourcesContent":["import type { SupervisorEventMap } from \"../contracts/events/event-map.type\";\nimport type { SupervisorResult } from \"../contracts/result/supervisor-result.type\";\nimport type { StreamContract } from \"../contracts/stream/stream.contract\";\nimport type { SupervisorIntentValue } from \"../contracts/supervisor/intent-entry.type\";\nimport type {\n SupervisorConfig,\n SupervisorEventHandler,\n} from \"../contracts/supervisor/supervisor-config.type\";\nimport type {\n SupervisorExecuteOptions,\n SupervisorResumeOptions,\n} from \"../contracts/supervisor/supervisor-execute-options.type\";\nimport type { SupervisorInput } from \"../contracts/supervisor/supervisor-input.type\";\nimport type { SupervisorStreamEvent } from \"../contracts/supervisor/supervisor-stream-event.type\";\nimport type {\n SupervisorAsToolOptions,\n SupervisorContract,\n} from \"../contracts/supervisor/supervisor.contract\";\nimport { SupervisorFailedError } from \"../errors\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { asTool } from \"./as-tool\";\nimport { SupervisorEmitter } from \"./emitter\";\nimport { assertRouterDescriptions, resolveIntentEntries } from \"./entries\";\nimport { SupervisorExecution } from \"./execution\";\nimport { computeSignature } from \"./signature\";\nimport { loadSnapshotForResume } from \"./snapshot\";\nimport { createSupervisorStream } from \"./supervisor-stream\";\n\n/**\n * `ai.supervisor(config)` — construct a `SupervisorContract`. Validates\n * the config at author time (throws `SupervisorFailedError` on bad\n * shape), resolves agent entries, computes a stable structural\n * signature, wires the three-tier event emitter, and returns an\n * instance that satisfies `ExecutableContract` so it can compose into\n * tools, outer agents, and (future) orchestrators uniformly.\n *\n * @example\n * const support = ai.supervisor({\n * name: \"customer-support\",\n * router: routerAgent,\n * intents: { triage, orderLookup, billingLookup, resolver },\n * evaluate: (ctx) => ctx.result.resolver?.output ? { satisfied: true } : undefined,\n * output: z.object({ response: z.string(), refund: z.boolean() }),\n * maxIterations: 6,\n * });\n */\nexport function supervisor<\n TOutput = unknown,\n TState = TOutput,\n TIntents extends Record<string, SupervisorIntentValue> = Record<string, SupervisorIntentValue>,\n TArtifacts = Record<string, unknown>,\n>(config: SupervisorConfig<TOutput, TState, TIntents, TArtifacts>): SupervisorContract<TOutput> {\n validateFactoryConfig(config as unknown as SupervisorConfig<TOutput>);\n\n const entries = resolveIntentEntries(config.intents, config.name);\n\n assertRouterDescriptions(config as SupervisorConfig<unknown>, entries);\n\n if (config.initialAgent && !entries.has(config.initialAgent)) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`initialAgent\\` \"${config.initialAgent}\" is not a key in \\`intents\\``,\n { context: { authoring: true } },\n );\n }\n\n const signature = computeSignature(config as SupervisorConfig<unknown>, entries);\n const emitter = new SupervisorEmitter(config.on);\n\n async function execute(\n input: SupervisorInput,\n options?: SupervisorExecuteOptions,\n ): Promise<SupervisorResult<TOutput>> {\n const runId = options?.runId ?? generateRunId();\n\n const execution = new SupervisorExecution<TOutput>({\n config: config as unknown as SupervisorConfig<TOutput>,\n entries,\n signature,\n emitter,\n input,\n runId,\n options,\n });\n\n return execution.run();\n }\n\n function stream(\n input: SupervisorInput,\n options?: SupervisorExecuteOptions,\n ): StreamContract<SupervisorResult<TOutput>, SupervisorStreamEvent> {\n const runId = options?.runId ?? generateRunId();\n const { controller, stream: contract } = createSupervisorStream<SupervisorResult<TOutput>>();\n\n const execution = new SupervisorExecution<TOutput>({\n config: config as unknown as SupervisorConfig<TOutput>,\n entries,\n signature,\n emitter,\n input,\n runId,\n options,\n streamController: controller,\n });\n\n void execution.run();\n\n return contract;\n }\n\n async function resume(\n runId: string,\n options?: SupervisorResumeOptions,\n ): Promise<SupervisorResult<TOutput>> {\n const snapshot = await loadSnapshotForResume({\n config: config as SupervisorConfig<unknown>,\n signature,\n runId,\n options,\n });\n\n const execution = new SupervisorExecution<TOutput>({\n config: config as unknown as SupervisorConfig<TOutput>,\n entries,\n signature,\n emitter,\n input: snapshot.input,\n runId,\n options,\n resumeFrom: snapshot,\n });\n\n return execution.run();\n }\n\n const instance: SupervisorContract<TOutput> = {\n name: config.name,\n signature,\n execute,\n stream,\n resume,\n on<K extends keyof SupervisorEventMap>(\n event: K,\n handler: SupervisorEventHandler<K>,\n ): () => void {\n return emitter.on(event, handler);\n },\n off<K extends keyof SupervisorEventMap>(event: K, handler: SupervisorEventHandler<K>): void {\n emitter.off(event, handler);\n },\n asTool<TToolInput = string>(\n options: SupervisorAsToolOptions<TToolInput>,\n ): ToolContract<TToolInput, TOutput> {\n return asTool<TOutput, TToolInput>(instance, options);\n },\n };\n\n return instance;\n}\n\n/**\n * Factory-time validation. Enforces the XOR + pairing rules the design\n * locked in §2 and surfaces any violation as a typed\n * `SupervisorFailedError` tagged `authoring: true`.\n */\nfunction validateFactoryConfig<T>(config: SupervisorConfig<T>): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new SupervisorFailedError(\"ai.supervisor: `name` is required and must be a string\", {\n context: { authoring: true },\n });\n }\n\n if (!config.intents || typeof config.intents !== \"object\") {\n throw new SupervisorFailedError(`ai.supervisor(\"${config.name}\"): \\`intents\\` is required`, {\n context: { authoring: true },\n });\n }\n\n const hasRoute = typeof config.route === \"function\";\n const hasRouter = !!config.router;\n\n if (hasRouter) {\n const router = config.router as { execute?: unknown } | { agent?: { execute?: unknown } };\n const isBareAgent = typeof (router as { execute?: unknown }).execute === \"function\";\n const isEntryForm =\n !isBareAgent &&\n typeof (router as { agent?: { execute?: unknown } }).agent === \"object\" &&\n typeof (router as { agent?: { execute?: unknown } }).agent?.execute === \"function\";\n\n if (!isBareAgent && !isEntryForm) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`router\\` must be an agent contract or a \\`{ agent, placeholders?, input? }\\` entry`,\n { context: { authoring: true } },\n );\n }\n }\n\n if (hasRoute && hasRouter) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`route\\` and \\`router\\` are mutually exclusive — configure exactly one`,\n { context: { authoring: true } },\n );\n }\n\n // Phase 7 / decisions §37 — `classifier` is the iter-0 prelude;\n // satisfies the \"must have a dispatch source\" rule on its own.\n // Composes with router/route (classifier drives iter 0; router/route\n // takes iter 1+). When configured alone, supervisor terminates after\n // iter 0's branch settles.\n const hasClassifier = config.classifier !== undefined;\n\n if (!hasRoute && !hasRouter && !hasClassifier) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): one of \\`route\\`, \\`router\\`, or \\`classifier\\` is required`,\n { context: { authoring: true } },\n );\n }\n\n // Phase 7 — classifier and initialAgent both decide what runs first.\n // Coexistence is meaningless; throw loudly.\n if (hasClassifier && config.initialAgent) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`classifier\\` and \\`initialAgent\\` are mutually exclusive — both decide which intent runs first. Pick one.`,\n { context: { authoring: true } },\n );\n }\n\n // Phase 3.4 (Q9) — evaluate now pairs with both `route` and\n // `router`. State-driven termination is useful in either dispatch\n // mode; the historical router-only restriction was incidental,\n // not principled.\n\n if (config.ack !== undefined) {\n const ack = config.ack;\n const isCallback = typeof ack === \"function\";\n const isAgentEntry =\n typeof ack === \"object\" &&\n ack !== null &&\n typeof (ack as { agent?: { execute?: unknown } }).agent?.execute === \"function\";\n const isRunEntry =\n typeof ack === \"object\" &&\n ack !== null &&\n typeof (ack as { run?: unknown }).run === \"function\";\n\n if (!isCallback && !isAgentEntry && !isRunEntry) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`ack\\` must be an \\`{ agent, ... }\\` entry, an \\`{ run, ... }\\` entry, or a bare callback function`,\n { context: { authoring: true } },\n );\n }\n\n if (isAgentEntry && isRunEntry) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`ack\\` cannot declare both \\`agent\\` and \\`run\\` — pick one`,\n { context: { authoring: true } },\n );\n }\n }\n\n if (config.maxIterations !== undefined && config.maxIterations < 1) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`maxIterations\\` must be >= 1`,\n { context: { authoring: true, maxIterations: config.maxIterations } },\n );\n }\n}\n\nfunction generateRunId(): string {\n return `sup_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,SAAgB,WAKd,QAA8F;CAC9F,sBAAsB,MAA8C;CAEpE,MAAM,UAAU,qBAAqB,OAAO,SAAS,OAAO,IAAI;CAEhE,yBAAyB,QAAqC,OAAO;CAErE,IAAI,OAAO,gBAAgB,CAAC,QAAQ,IAAI,OAAO,YAAY,GACzD,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,wBAAwB,OAAO,aAAa,gCAC1E,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAGF,MAAM,YAAY,iBAAiB,QAAqC,OAAO;CAC/E,MAAM,UAAU,IAAI,kBAAkB,OAAO,EAAE;CAE/C,eAAe,QACb,OACA,SACoC;EAapC,OAAO,IAVe,oBAA6B;GACzC;GACR;GACA;GACA;GACA;GACA,OARY,SAAS,SAAS,cAAc;GAS5C;EACF,CAEe,EAAE,IAAI;CACvB;CAEA,SAAS,OACP,OACA,SACkE;EAClE,MAAM,QAAQ,SAAS,SAAS,cAAc;EAC9C,MAAM,EAAE,YAAY,QAAQ,aAAa,uBAAkD;EAa3F,AAAK,IAXiB,oBAA6B;GACzC;GACR;GACA;GACA;GACA;GACA;GACA;GACA,kBAAkB;EACpB,CAEa,EAAE,IAAI;EAEnB,OAAO;CACT;CAEA,eAAe,OACb,OACA,SACoC;EACpC,MAAM,WAAW,MAAM,sBAAsB;GACnC;GACR;GACA;GACA;EACF,CAAC;EAaD,OAAO,IAXe,oBAA6B;GACzC;GACR;GACA;GACA;GACA,OAAO,SAAS;GAChB;GACA;GACA,YAAY;EACd,CAEe,EAAE,IAAI;CACvB;CAEA,MAAM,WAAwC;EAC5C,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA,GACE,OACA,SACY;GACZ,OAAO,QAAQ,GAAG,OAAO,OAAO;EAClC;EACA,IAAwC,OAAU,SAA0C;GAC1F,QAAQ,IAAI,OAAO,OAAO;EAC5B;EACA,OACE,SACmC;GACnC,OAAO,OAA4B,UAAU,OAAO;EACtD;CACF;CAEA,OAAO;AACT;;;;;;AAOA,SAAS,sBAAyB,QAAmC;CACnE,IAAI,CAAC,OAAO,QAAQ,OAAO,OAAO,SAAS,UACzC,MAAM,IAAI,sBAAsB,0DAA0D,EACxF,SAAS,EAAE,WAAW,KAAK,EAC7B,CAAC;CAGH,IAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAC/C,MAAM,IAAI,sBAAsB,kBAAkB,OAAO,KAAK,8BAA8B,EAC1F,SAAS,EAAE,WAAW,KAAK,EAC7B,CAAC;CAGH,MAAM,WAAW,OAAO,OAAO,UAAU;CACzC,MAAM,YAAY,CAAC,CAAC,OAAO;CAE3B,IAAI,WAAW;EACb,MAAM,SAAS,OAAO;EACtB,MAAM,cAAc,OAAQ,OAAiC,YAAY;EACzE,MAAM,cACJ,CAAC,eACD,OAAQ,OAA6C,UAAU,YAC/D,OAAQ,OAA6C,OAAO,YAAY;EAE1E,IAAI,CAAC,eAAe,CAAC,aACnB,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,2FAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAEJ;CAEA,IAAI,YAAY,WACd,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,8EAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAQF,MAAM,gBAAgB,OAAO,eAAe;CAE5C,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,eAC9B,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,kEAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAKF,IAAI,iBAAiB,OAAO,cAC1B,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,kHAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAQF,IAAI,OAAO,QAAQ,QAAW;EAC5B,MAAM,MAAM,OAAO;EACnB,MAAM,aAAa,OAAO,QAAQ;EAClC,MAAM,eACJ,OAAO,QAAQ,YACf,QAAQ,QACR,OAAQ,IAA0C,OAAO,YAAY;EACvE,MAAM,aACJ,OAAO,QAAQ,YACf,QAAQ,QACR,OAAQ,IAA0B,QAAQ;EAE5C,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,YACnC,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,0GAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;EAGF,IAAI,gBAAgB,YAClB,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,mEAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAEJ;CAEA,IAAI,OAAO,kBAAkB,UAAa,OAAO,gBAAgB,GAC/D,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,qCAC9B,EAAE,SAAS;EAAE,WAAW;EAAM,eAAe,OAAO;CAAc,EAAE,CACtE;AAEJ;AAEA,SAAS,gBAAwB;CAC/B,OAAO,OAAO,KAAK,IAAI,EAAE,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AACjF"}
1
+ {"version":3,"file":"supervisor.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/supervisor/supervisor.ts"],"sourcesContent":["import type { SupervisorEventMap } from \"../contracts/events/event-map.type\";\nimport type { SupervisorResult } from \"../contracts/result/supervisor-result.type\";\nimport type { StreamContract } from \"../contracts/stream/stream.contract\";\nimport type { SupervisorIntentValue } from \"../contracts/supervisor/intent-entry.type\";\nimport type {\n SupervisorConfig,\n SupervisorEventHandler,\n} from \"../contracts/supervisor/supervisor-config.type\";\nimport type {\n SupervisorExecuteOptions,\n SupervisorResumeOptions,\n} from \"../contracts/supervisor/supervisor-execute-options.type\";\nimport type { SupervisorInput } from \"../contracts/supervisor/supervisor-input.type\";\nimport type { SupervisorStreamEvent } from \"../contracts/supervisor/supervisor-stream-event.type\";\nimport type {\n SupervisorAsToolOptions,\n SupervisorContract,\n} from \"../contracts/supervisor/supervisor.contract\";\nimport { SupervisorFailedError } from \"../errors\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { asTool } from \"./as-tool\";\nimport { SupervisorEmitter } from \"./emitter\";\nimport { assertRouterDescriptions, resolveIntentEntries } from \"./entries\";\nimport { SupervisorExecution } from \"./execution\";\nimport { computeSignature } from \"./signature\";\nimport { loadSnapshotForResume } from \"./snapshot\";\nimport { createSupervisorStream } from \"./supervisor-stream\";\n\n/**\n * `ai.supervisor(config)` — construct a `SupervisorContract`. Validates\n * the config at author time (throws `SupervisorFailedError` on bad\n * shape), resolves agent entries, computes a stable structural\n * signature, wires the three-tier event emitter, and returns an\n * instance that satisfies `ExecutableContract` so it can compose into\n * tools, outer agents, and (future) orchestrators uniformly.\n *\n * @example\n * const support = ai.supervisor({\n * name: \"customer-support\",\n * router: routerAgent,\n * intents: { triage, orderLookup, billingLookup, resolver },\n * evaluate: (ctx) => ctx.result.resolver?.output ? { satisfied: true } : undefined,\n * output: z.object({ response: z.string(), refund: z.boolean() }),\n * maxIterations: 6,\n * });\n */\nexport function supervisor<\n TOutput = unknown,\n TState = TOutput,\n TIntents extends Record<string, SupervisorIntentValue> = Record<string, SupervisorIntentValue>,\n TArtifacts = Record<string, unknown>,\n>(config: SupervisorConfig<TOutput, TState, TIntents, TArtifacts>): SupervisorContract<TOutput> {\n validateFactoryConfig(config as unknown as SupervisorConfig<TOutput>);\n\n const entries = resolveIntentEntries(config.intents, config.name);\n\n assertRouterDescriptions(config as SupervisorConfig<unknown>, entries);\n\n if (config.initialAgent && !entries.has(config.initialAgent)) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`initialAgent\\` \"${config.initialAgent}\" is not a key in \\`intents\\``,\n { context: { authoring: true } },\n );\n }\n\n const signature = computeSignature(config as SupervisorConfig<unknown>, entries);\n const emitter = new SupervisorEmitter(config.on);\n\n async function execute(\n input: SupervisorInput,\n options?: SupervisorExecuteOptions,\n ): Promise<SupervisorResult<TOutput>> {\n const runId = options?.runId ?? generateRunId();\n\n const execution = new SupervisorExecution<TOutput>({\n config: config as unknown as SupervisorConfig<TOutput>,\n entries,\n signature,\n emitter,\n input,\n runId,\n options,\n });\n\n return execution.run();\n }\n\n function stream(\n input: SupervisorInput,\n options?: SupervisorExecuteOptions,\n ): StreamContract<SupervisorResult<TOutput>, SupervisorStreamEvent> {\n const runId = options?.runId ?? generateRunId();\n const { controller, stream: contract } = createSupervisorStream<SupervisorResult<TOutput>>();\n\n const execution = new SupervisorExecution<TOutput>({\n config: config as unknown as SupervisorConfig<TOutput>,\n entries,\n signature,\n emitter,\n input,\n runId,\n options,\n streamController: controller,\n });\n\n void execution.run();\n\n return contract;\n }\n\n async function resume(\n runId: string,\n options?: SupervisorResumeOptions,\n ): Promise<SupervisorResult<TOutput>> {\n const snapshot = await loadSnapshotForResume({\n config: config as SupervisorConfig<unknown>,\n signature,\n runId,\n options,\n });\n\n const execution = new SupervisorExecution<TOutput>({\n config: config as unknown as SupervisorConfig<TOutput>,\n entries,\n signature,\n emitter,\n input: snapshot.input,\n runId,\n options,\n resumeFrom: snapshot,\n });\n\n return execution.run();\n }\n\n const instance: SupervisorContract<TOutput> = {\n name: config.name,\n signature,\n execute,\n stream,\n resume,\n on<K extends keyof SupervisorEventMap>(\n event: K,\n handler: SupervisorEventHandler<K>,\n ): () => void {\n return emitter.on(event, handler);\n },\n off<K extends keyof SupervisorEventMap>(event: K, handler: SupervisorEventHandler<K>): void {\n emitter.off(event, handler);\n },\n asTool<TToolInput = string>(\n options: SupervisorAsToolOptions<TToolInput>,\n ): ToolContract<TToolInput, TOutput> {\n return asTool<TOutput, TToolInput>(instance, options);\n },\n };\n\n return instance;\n}\n\n/**\n * Factory-time validation. Enforces the XOR + pairing rules the design\n * locked in §2 and surfaces any violation as a typed\n * `SupervisorFailedError` tagged `authoring: true`.\n */\nfunction validateFactoryConfig<T>(config: SupervisorConfig<T>): void {\n if (!config.name || typeof config.name !== \"string\") {\n throw new SupervisorFailedError(\"ai.supervisor: `name` is required and must be a string\", {\n context: { authoring: true },\n });\n }\n\n if (!config.intents || typeof config.intents !== \"object\") {\n throw new SupervisorFailedError(`ai.supervisor(\"${config.name}\"): \\`intents\\` is required`, {\n context: { authoring: true },\n });\n }\n\n const hasRoute = typeof config.route === \"function\";\n const hasRouter = !!config.router;\n\n if (hasRouter) {\n const router = config.router as { execute?: unknown } | { agent?: { execute?: unknown } };\n const isBareAgent = typeof (router as { execute?: unknown }).execute === \"function\";\n const isEntryForm =\n !isBareAgent &&\n typeof (router as { agent?: { execute?: unknown } }).agent === \"object\" &&\n typeof (router as { agent?: { execute?: unknown } }).agent?.execute === \"function\";\n\n if (!isBareAgent && !isEntryForm) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`router\\` must be an agent contract or a \\`{ agent, placeholders?, input? }\\` entry`,\n { context: { authoring: true } },\n );\n }\n }\n\n if (hasRoute && hasRouter) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`route\\` and \\`router\\` are mutually exclusive — configure exactly one`,\n { context: { authoring: true } },\n );\n }\n\n // Phase 7 / decisions §37 — `classifier` is the iter-0 prelude;\n // satisfies the \"must have a dispatch source\" rule on its own.\n // Composes with router/route (classifier drives iter 0; router/route\n // takes iter 1+). When configured alone, supervisor terminates after\n // iter 0's branch settles.\n const hasClassifier = config.classifier !== undefined;\n\n if (!hasRoute && !hasRouter && !hasClassifier) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): one of \\`route\\`, \\`router\\`, or \\`classifier\\` is required`,\n { context: { authoring: true } },\n );\n }\n\n // Phase 7 — classifier and initialAgent both decide what runs first.\n // Coexistence is meaningless; throw loudly.\n if (hasClassifier && config.initialAgent) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`classifier\\` and \\`initialAgent\\` are mutually exclusive — both decide which intent runs first. Pick one.`,\n { context: { authoring: true } },\n );\n }\n\n // Phase 3.4 (Q9) — evaluate now pairs with both `route` and\n // `router`. State-driven termination is useful in either dispatch\n // mode; the historical router-only restriction was incidental,\n // not principled.\n\n if (config.ack !== undefined) {\n const ack = config.ack;\n const isCallback = typeof ack === \"function\";\n const isAgentEntry =\n typeof ack === \"object\" &&\n ack !== null &&\n typeof (ack as { agent?: { execute?: unknown } }).agent?.execute === \"function\";\n const isRunEntry =\n typeof ack === \"object\" &&\n ack !== null &&\n typeof (ack as { run?: unknown }).run === \"function\";\n\n if (!isCallback && !isAgentEntry && !isRunEntry) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`ack\\` must be an \\`{ agent, ... }\\` entry, an \\`{ run, ... }\\` entry, or a bare callback function`,\n { context: { authoring: true } },\n );\n }\n\n if (isAgentEntry && isRunEntry) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`ack\\` cannot declare both \\`agent\\` and \\`run\\` — pick one`,\n { context: { authoring: true } },\n );\n }\n }\n\n if (config.maxIterations !== undefined && config.maxIterations < 1) {\n throw new SupervisorFailedError(\n `ai.supervisor(\"${config.name}\"): \\`maxIterations\\` must be >= 1`,\n { context: { authoring: true, maxIterations: config.maxIterations } },\n );\n }\n}\n\nfunction generateRunId(): string {\n return `sup_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8CA,SAAgB,WAKd,QAA8F;CAC9F,sBAAsB,MAA8C;CAEpE,MAAM,UAAU,qBAAqB,OAAO,SAAS,OAAO,IAAI;CAEhE,yBAAyB,QAAqC,OAAO;CAErE,IAAI,OAAO,gBAAgB,CAAC,QAAQ,IAAI,OAAO,YAAY,GACzD,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,wBAAwB,OAAO,aAAa,gCAC1E,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAGF,MAAM,YAAY,iBAAiB,QAAqC,OAAO;CAC/E,MAAM,UAAU,IAAI,kBAAkB,OAAO,EAAE;CAE/C,eAAe,QACb,OACA,SACoC;EAapC,OAAO,IAVe,oBAA6B;GACzC;GACR;GACA;GACA;GACA;GACA,OARY,SAAS,SAAS,cAAc;GAS5C;EACF,CAEe,CAAC,CAAC,IAAI;CACvB;CAEA,SAAS,OACP,OACA,SACkE;EAClE,MAAM,QAAQ,SAAS,SAAS,cAAc;EAC9C,MAAM,EAAE,YAAY,QAAQ,aAAa,uBAAkD;EAa3F,AAAK,IAXiB,oBAA6B;GACzC;GACR;GACA;GACA;GACA;GACA;GACA;GACA,kBAAkB;EACpB,CAEa,CAAC,CAAC,IAAI;EAEnB,OAAO;CACT;CAEA,eAAe,OACb,OACA,SACoC;EACpC,MAAM,WAAW,MAAM,sBAAsB;GACnC;GACR;GACA;GACA;EACF,CAAC;EAaD,OAAO,IAXe,oBAA6B;GACzC;GACR;GACA;GACA;GACA,OAAO,SAAS;GAChB;GACA;GACA,YAAY;EACd,CAEe,CAAC,CAAC,IAAI;CACvB;CAEA,MAAM,WAAwC;EAC5C,MAAM,OAAO;EACb;EACA;EACA;EACA;EACA,GACE,OACA,SACY;GACZ,OAAO,QAAQ,GAAG,OAAO,OAAO;EAClC;EACA,IAAwC,OAAU,SAA0C;GAC1F,QAAQ,IAAI,OAAO,OAAO;EAC5B;EACA,OACE,SACmC;GACnC,OAAO,OAA4B,UAAU,OAAO;EACtD;CACF;CAEA,OAAO;AACT;;;;;;AAOA,SAAS,sBAAyB,QAAmC;CACnE,IAAI,CAAC,OAAO,QAAQ,OAAO,OAAO,SAAS,UACzC,MAAM,IAAI,sBAAsB,0DAA0D,EACxF,SAAS,EAAE,WAAW,KAAK,EAC7B,CAAC;CAGH,IAAI,CAAC,OAAO,WAAW,OAAO,OAAO,YAAY,UAC/C,MAAM,IAAI,sBAAsB,kBAAkB,OAAO,KAAK,8BAA8B,EAC1F,SAAS,EAAE,WAAW,KAAK,EAC7B,CAAC;CAGH,MAAM,WAAW,OAAO,OAAO,UAAU;CACzC,MAAM,YAAY,CAAC,CAAC,OAAO;CAE3B,IAAI,WAAW;EACb,MAAM,SAAS,OAAO;EACtB,MAAM,cAAc,OAAQ,OAAiC,YAAY;EACzE,MAAM,cACJ,CAAC,eACD,OAAQ,OAA6C,UAAU,YAC/D,OAAQ,OAA6C,OAAO,YAAY;EAE1E,IAAI,CAAC,eAAe,CAAC,aACnB,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,2FAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAEJ;CAEA,IAAI,YAAY,WACd,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,8EAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAQF,MAAM,gBAAgB,OAAO,eAAe;CAE5C,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,eAC9B,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,kEAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAKF,IAAI,iBAAiB,OAAO,cAC1B,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,kHAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAQF,IAAI,OAAO,QAAQ,QAAW;EAC5B,MAAM,MAAM,OAAO;EACnB,MAAM,aAAa,OAAO,QAAQ;EAClC,MAAM,eACJ,OAAO,QAAQ,YACf,QAAQ,QACR,OAAQ,IAA0C,OAAO,YAAY;EACvE,MAAM,aACJ,OAAO,QAAQ,YACf,QAAQ,QACR,OAAQ,IAA0B,QAAQ;EAE5C,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,YACnC,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,0GAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;EAGF,IAAI,gBAAgB,YAClB,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,mEAC9B,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;CAEJ;CAEA,IAAI,OAAO,kBAAkB,UAAa,OAAO,gBAAgB,GAC/D,MAAM,IAAI,sBACR,kBAAkB,OAAO,KAAK,qCAC9B,EAAE,SAAS;EAAE,WAAW;EAAM,eAAe,OAAO;CAAc,EAAE,CACtE;AAEJ;AAEA,SAAS,gBAAwB;CAC/B,OAAO,OAAO,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,GAAG,EAAE;AACjF"}
@@ -1,7 +1,7 @@
1
1
  import { Placeholders } from "../contracts/placeholders.type.mjs";
2
2
  import { InstructionContract } from "../contracts/system-prompt.contract.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/system-prompt/instruction.d.ts
4
+ //#region ../@warlock.js/ai/src/system-prompt/instruction.d.ts
5
5
  /**
6
6
  * Concrete `InstructionContract` — a reusable directive block.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"instruction.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/instruction.ts"],"mappings":";;;;;;AA8BA;;;;;;;;;;;;;AAY4C;AAY5C;;;;AAAsD;;;;;;cAxBzC,WAAA,YAAuB,mBAAmB;EAAA,SAGlB,IAAA;EAAA,SAFnB,IAAA;cAEmB,IAAA;;;;;;EAS5B,OAAA,CAAQ,YAAA,GAAe,YAAA;AAAA;;;;;;;;iBAYhB,WAAA,CAAY,IAAA,WAAe,WAAW"}
1
+ {"version":3,"file":"instruction.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/instruction.ts"],"mappings":";;;;;;AA8BA;;;;;;;;;;;;;AAY4C;AAY5C;;;;AAAsD;;;;;;cAxBzC,WAAA,YAAuB,mBAAmB;EAAA,SAGlB,IAAA;EAAA,SAFnB,IAAA;cAEmB,IAAA;;;;;;EAS5B,OAAA,CAAQ,YAAA,GAAe,YAAA;AAAA;;;;;;;;iBAYhB,WAAA,CAAY,IAAA,WAAe,WAAW"}
@@ -1,6 +1,6 @@
1
1
  import { renderPlaceholders } from "./render-placeholders.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/system-prompt/instruction.ts
3
+ //#region ../@warlock.js/ai/src/system-prompt/instruction.ts
4
4
  /**
5
5
  * Concrete `InstructionContract` — a reusable directive block.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"instruction.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/instruction.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type { InstructionContract } from \"../contracts/system-prompt.contract\";\nimport { renderPlaceholders } from \"./render-placeholders\";\n\n/**\n * Concrete `InstructionContract` — a reusable directive block.\n *\n * **Role.** A single addressable prompt block representing one rule the\n * agent must follow (`\"Always respond in {{language|English}}.\"`). Exists\n * as its own type so the same instruction can be shared across many\n * prompts and agents, each render supplying its own placeholder map.\n *\n * **Responsibility.**\n * - Owns: the `type: \"instruction\"` discriminator, the raw template text,\n * and the placeholder-rendering step.\n * - Does NOT own: ordering relative to other instructions, joining with a\n * persona, or any surrounding prompt composition — those concerns live\n * in `SystemPrompt`.\n *\n * Users construct via the `ai.instruction()` factory — `new Instruction()`\n * is not the public API (see §4.2 of code-style.md).\n *\n * @example\n * const replyInLanguage = ai.instruction(\"Respond in {{language|English}}.\");\n *\n * const prompt = ai.systemPrompt()\n * .persona(\"You are Alex.\")\n * .instruction(replyInLanguage)\n * .instruction(\"Always include code examples.\");\n */\nexport class Instruction implements InstructionContract {\n public readonly type = \"instruction\" as const;\n\n public constructor(public readonly text: string) {\n //\n }\n\n /**\n * Substitute `{{mustache}}` placeholders in the instruction text against\n * the supplied map. Delegates to the shared `renderPlaceholders` helper\n * so persona / instruction / system-prompt rendering stays identical.\n */\n public resolve(placeholders?: Placeholders): string {\n return renderPlaceholders(this.text, placeholders);\n }\n}\n\n/**\n * Create an `Instruction` from raw template text.\n *\n * @example\n * const replyIn = instruction(\"Respond in {{language|English}}.\");\n * const cite = instruction(\"Always cite sources inline.\");\n */\nexport function instruction(text: string): Instruction {\n return new Instruction(text);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,cAAb,MAAwD;CAGtD,AAAO,YAAY,AAAgB,MAAc;EAAd;cAFZ;CAIvB;;;;;;CAOA,AAAO,QAAQ,cAAqC;EAClD,OAAO,mBAAmB,KAAK,MAAM,YAAY;CACnD;AACF;;;;;;;;AASA,SAAgB,YAAY,MAA2B;CACrD,OAAO,IAAI,YAAY,IAAI;AAC7B"}
1
+ {"version":3,"file":"instruction.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/instruction.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type { InstructionContract } from \"../contracts/system-prompt.contract\";\nimport { renderPlaceholders } from \"./render-placeholders\";\n\n/**\n * Concrete `InstructionContract` — a reusable directive block.\n *\n * **Role.** A single addressable prompt block representing one rule the\n * agent must follow (`\"Always respond in {{language|English}}.\"`). Exists\n * as its own type so the same instruction can be shared across many\n * prompts and agents, each render supplying its own placeholder map.\n *\n * **Responsibility.**\n * - Owns: the `type: \"instruction\"` discriminator, the raw template text,\n * and the placeholder-rendering step.\n * - Does NOT own: ordering relative to other instructions, joining with a\n * persona, or any surrounding prompt composition — those concerns live\n * in `SystemPrompt`.\n *\n * Users construct via the `ai.instruction()` factory — `new Instruction()`\n * is not the public API (see §4.2 of code-style.md).\n *\n * @example\n * const replyInLanguage = ai.instruction(\"Respond in {{language|English}}.\");\n *\n * const prompt = ai.systemPrompt()\n * .persona(\"You are Alex.\")\n * .instruction(replyInLanguage)\n * .instruction(\"Always include code examples.\");\n */\nexport class Instruction implements InstructionContract {\n public readonly type = \"instruction\" as const;\n\n public constructor(public readonly text: string) {\n //\n }\n\n /**\n * Substitute `{{mustache}}` placeholders in the instruction text against\n * the supplied map. Delegates to the shared `renderPlaceholders` helper\n * so persona / instruction / system-prompt rendering stays identical.\n */\n public resolve(placeholders?: Placeholders): string {\n return renderPlaceholders(this.text, placeholders);\n }\n}\n\n/**\n * Create an `Instruction` from raw template text.\n *\n * @example\n * const replyIn = instruction(\"Respond in {{language|English}}.\");\n * const cite = instruction(\"Always cite sources inline.\");\n */\nexport function instruction(text: string): Instruction {\n return new Instruction(text);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,cAAb,MAAwD;CAGtD,AAAO,YAAY,AAAgB,MAAc;EAAd;cAFZ;CAIvB;;;;;;CAOA,AAAO,QAAQ,cAAqC;EAClD,OAAO,mBAAmB,KAAK,MAAM,YAAY;CACnD;AACF;;;;;;;;AASA,SAAgB,YAAY,MAA2B;CACrD,OAAO,IAAI,YAAY,IAAI;AAC7B"}
@@ -1,7 +1,7 @@
1
1
  import { Placeholders } from "../contracts/placeholders.type.mjs";
2
2
  import { PersonaContract } from "../contracts/system-prompt.contract.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/system-prompt/persona.d.ts
4
+ //#region ../@warlock.js/ai/src/system-prompt/persona.d.ts
5
5
  /**
6
6
  * Concrete `PersonaContract` — a reusable "who the agent is" block.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"persona.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/persona.ts"],"mappings":";;;;;;AA8BA;;;;;;;;;;;;;AAY4C;AAY5C;;;;AAA8C;;;;;;cAxBjC,OAAA,YAAmB,eAAe;EAAA,SAGV,IAAA;EAAA,SAFnB,IAAA;cAEmB,IAAA;;;;;;EAS5B,OAAA,CAAQ,YAAA,GAAe,YAAA;AAAA;;;;;;;;iBAYhB,OAAA,CAAQ,IAAA,WAAe,OAAO"}
1
+ {"version":3,"file":"persona.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/persona.ts"],"mappings":";;;;;;AA8BA;;;;;;;;;;;;;AAY4C;AAY5C;;;;AAA8C;;;;;;cAxBjC,OAAA,YAAmB,eAAe;EAAA,SAGV,IAAA;EAAA,SAFnB,IAAA;cAEmB,IAAA;;;;;;EAS5B,OAAA,CAAQ,YAAA,GAAe,YAAA;AAAA;;;;;;;;iBAYhB,OAAA,CAAQ,IAAA,WAAe,OAAO"}
@@ -1,6 +1,6 @@
1
1
  import { renderPlaceholders } from "./render-placeholders.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/system-prompt/persona.ts
3
+ //#region ../@warlock.js/ai/src/system-prompt/persona.ts
4
4
  /**
5
5
  * Concrete `PersonaContract` — a reusable "who the agent is" block.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"persona.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/persona.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type { PersonaContract } from \"../contracts/system-prompt.contract\";\nimport { renderPlaceholders } from \"./render-placeholders\";\n\n/**\n * Concrete `PersonaContract` — a reusable \"who the agent is\" block.\n *\n * **Role.** A single addressable prompt block representing the agent's\n * identity (`\"You are Alex, a senior TypeScript engineer.\"`). Exists as\n * its own type so personas can be defined once and reused across many\n * `SystemPrompt` compositions, agents, and sessions — each render can\n * supply a different placeholder map.\n *\n * **Responsibility.**\n * - Owns: the `type: \"persona\"` discriminator, the raw template text, and\n * the placeholder-rendering step.\n * - Does NOT own: composition with instructions, ordering, joining, or\n * any knowledge of the surrounding `SystemPrompt`. Those concerns live\n * in `SystemPrompt`.\n *\n * Users construct via the `ai.persona()` factory — `new Persona()` is not\n * the public API (see §4.2 of code-style.md).\n *\n * @example\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n *\n * const prompt = ai.systemPrompt()\n * .persona(alex)\n * .instruction(\"Always cite sources.\");\n */\nexport class Persona implements PersonaContract {\n public readonly type = \"persona\" as const;\n\n public constructor(public readonly text: string) {\n //\n }\n\n /**\n * Substitute `{{mustache}}` placeholders in the persona text against the\n * supplied map. Delegates to the shared `renderPlaceholders` helper so\n * persona / instruction / system-prompt rendering stays identical.\n */\n public resolve(placeholders?: Placeholders): string {\n return renderPlaceholders(this.text, placeholders);\n }\n}\n\n/**\n * Create a `Persona` from raw template text.\n *\n * @example\n * const alex = persona(\"You are Alex, a TypeScript expert.\");\n * const greeter = persona(\"You are a greeter in {{language|English}}.\");\n */\nexport function persona(text: string): Persona {\n return new Persona(text);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,UAAb,MAAgD;CAG9C,AAAO,YAAY,AAAgB,MAAc;EAAd;cAFZ;CAIvB;;;;;;CAOA,AAAO,QAAQ,cAAqC;EAClD,OAAO,mBAAmB,KAAK,MAAM,YAAY;CACnD;AACF;;;;;;;;AASA,SAAgB,QAAQ,MAAuB;CAC7C,OAAO,IAAI,QAAQ,IAAI;AACzB"}
1
+ {"version":3,"file":"persona.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/persona.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type { PersonaContract } from \"../contracts/system-prompt.contract\";\nimport { renderPlaceholders } from \"./render-placeholders\";\n\n/**\n * Concrete `PersonaContract` — a reusable \"who the agent is\" block.\n *\n * **Role.** A single addressable prompt block representing the agent's\n * identity (`\"You are Alex, a senior TypeScript engineer.\"`). Exists as\n * its own type so personas can be defined once and reused across many\n * `SystemPrompt` compositions, agents, and sessions — each render can\n * supply a different placeholder map.\n *\n * **Responsibility.**\n * - Owns: the `type: \"persona\"` discriminator, the raw template text, and\n * the placeholder-rendering step.\n * - Does NOT own: composition with instructions, ordering, joining, or\n * any knowledge of the surrounding `SystemPrompt`. Those concerns live\n * in `SystemPrompt`.\n *\n * Users construct via the `ai.persona()` factory — `new Persona()` is not\n * the public API (see §4.2 of code-style.md).\n *\n * @example\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n *\n * const prompt = ai.systemPrompt()\n * .persona(alex)\n * .instruction(\"Always cite sources.\");\n */\nexport class Persona implements PersonaContract {\n public readonly type = \"persona\" as const;\n\n public constructor(public readonly text: string) {\n //\n }\n\n /**\n * Substitute `{{mustache}}` placeholders in the persona text against the\n * supplied map. Delegates to the shared `renderPlaceholders` helper so\n * persona / instruction / system-prompt rendering stays identical.\n */\n public resolve(placeholders?: Placeholders): string {\n return renderPlaceholders(this.text, placeholders);\n }\n}\n\n/**\n * Create a `Persona` from raw template text.\n *\n * @example\n * const alex = persona(\"You are Alex, a TypeScript expert.\");\n * const greeter = persona(\"You are a greeter in {{language|English}}.\");\n */\nexport function persona(text: string): Persona {\n return new Persona(text);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,UAAb,MAAgD;CAG9C,AAAO,YAAY,AAAgB,MAAc;EAAd;cAFZ;CAIvB;;;;;;CAOA,AAAO,QAAQ,cAAqC;EAClD,OAAO,mBAAmB,KAAK,MAAM,YAAY;CACnD;AACF;;;;;;;;AASA,SAAgB,QAAQ,MAAuB;CAC7C,OAAO,IAAI,QAAQ,IAAI;AACzB"}
@@ -1,6 +1,6 @@
1
1
  import { Placeholders } from "../contracts/placeholders.type.mjs";
2
2
 
3
- //#region ../../@warlock.js/ai/src/system-prompt/render-placeholders.d.ts
3
+ //#region ../@warlock.js/ai/src/system-prompt/render-placeholders.d.ts
4
4
  /**
5
5
  * Render a template string against a placeholders map, supporting dot-path
6
6
  * lookups and inline fallback values.
@@ -1 +1 @@
1
- {"version":3,"file":"render-placeholders.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/render-placeholders.ts"],"mappings":";;;;;AA4BA;;;;;;;;AAEiC;;;;;;;;;;;;;;iBAFjB,kBAAA,CACd,QAAA,UACA,YAAA,GAAc,YAAiB"}
1
+ {"version":3,"file":"render-placeholders.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/render-placeholders.ts"],"mappings":";;;;;AA4BA;;;;;;;;AAEiC;;;;;;;;;;;;;;iBAFjB,kBAAA,CACd,QAAA,UACA,YAAA,GAAc,YAAiB"}
@@ -1,4 +1,4 @@
1
- //#region ../../@warlock.js/ai/src/system-prompt/render-placeholders.ts
1
+ //#region ../@warlock.js/ai/src/system-prompt/render-placeholders.ts
2
2
  const PLACEHOLDER_PATTERN = /\{\{\s*([^{}]+?)\s*\}\}/g;
3
3
  /**
4
4
  * Render a template string against a placeholders map, supporting dot-path
@@ -1 +1 @@
1
- {"version":3,"file":"render-placeholders.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/render-placeholders.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\n/**\n * Render a template string against a placeholders map, supporting dot-path\n * lookups and inline fallback values.\n *\n * Supported syntax:\n * - `{{key}}` — replaced by `placeholders.key`, left untouched if missing.\n * - `{{a.b.c}}` — dot-path lookup into nested objects.\n * - `{{key|default}}` — substitutes `default` when the key resolves to\n * `undefined`, `null`, or empty string.\n *\n * Whitespace inside the braces is ignored (`{{ key }}` == `{{key}}`).\n * Values are coerced to strings via `String(value)`.\n *\n * @example\n * renderPlaceholders(\n * \"Hello {{user.name|friend}}, your role is {{role}}\",\n * { user: { name: \"Hasan\" }, role: \"admin\" },\n * );\n * // \"Hello Hasan, your role is admin\"\n *\n * @example\n * renderPlaceholders(\"Hello {{user.name|friend}}\", {});\n * // \"Hello friend\"\n */\nexport function renderPlaceholders(\n template: string,\n placeholders: Placeholders = {},\n): string {\n return template.replace(\n PLACEHOLDER_PATTERN,\n (match, rawExpression: string) => {\n const [rawPath, rawFallback] = rawExpression.split(\"|\");\n const path = rawPath.trim();\n const fallback = rawFallback?.trim();\n\n const value = lookupPath(placeholders, path);\n\n if (value === undefined || value === null || value === \"\") {\n if (fallback !== undefined) {\n return fallback;\n }\n\n return match;\n }\n\n return String(value);\n },\n );\n}\n\n/**\n * Walk a dot-path (`\"a.b.c\"`) through an arbitrary record, returning the\n * leaf value or `undefined` when any segment is missing or blocks traversal\n * (non-object). Never throws.\n */\nfunction lookupPath(source: Placeholders, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = source;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (typeof current !== \"object\") {\n return undefined;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n"],"mappings":";AAEA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;AA0B5B,SAAgB,mBACd,UACA,eAA6B,CAAC,GACtB;CACR,OAAO,SAAS,QACd,sBACC,OAAO,kBAA0B;EAChC,MAAM,CAAC,SAAS,eAAe,cAAc,MAAM,GAAG;EACtD,MAAM,OAAO,QAAQ,KAAK;EAC1B,MAAM,WAAW,aAAa,KAAK;EAEnC,MAAM,QAAQ,WAAW,cAAc,IAAI;EAE3C,IAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;GACzD,IAAI,aAAa,QACf,OAAO;GAGT,OAAO;EACT;EAEA,OAAO,OAAO,KAAK;CACrB,CACF;AACF;;;;;;AAOA,SAAS,WAAW,QAAsB,MAAuB;CAC/D,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,UAAmB;CAEvB,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,YAAY,QAAQ,YAAY,QAClC;EAGF,IAAI,OAAO,YAAY,UACrB;EAGF,UAAW,QAAoC;CACjD;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"render-placeholders.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/render-placeholders.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\n/**\n * Render a template string against a placeholders map, supporting dot-path\n * lookups and inline fallback values.\n *\n * Supported syntax:\n * - `{{key}}` — replaced by `placeholders.key`, left untouched if missing.\n * - `{{a.b.c}}` — dot-path lookup into nested objects.\n * - `{{key|default}}` — substitutes `default` when the key resolves to\n * `undefined`, `null`, or empty string.\n *\n * Whitespace inside the braces is ignored (`{{ key }}` == `{{key}}`).\n * Values are coerced to strings via `String(value)`.\n *\n * @example\n * renderPlaceholders(\n * \"Hello {{user.name|friend}}, your role is {{role}}\",\n * { user: { name: \"Hasan\" }, role: \"admin\" },\n * );\n * // \"Hello Hasan, your role is admin\"\n *\n * @example\n * renderPlaceholders(\"Hello {{user.name|friend}}\", {});\n * // \"Hello friend\"\n */\nexport function renderPlaceholders(\n template: string,\n placeholders: Placeholders = {},\n): string {\n return template.replace(\n PLACEHOLDER_PATTERN,\n (match, rawExpression: string) => {\n const [rawPath, rawFallback] = rawExpression.split(\"|\");\n const path = rawPath.trim();\n const fallback = rawFallback?.trim();\n\n const value = lookupPath(placeholders, path);\n\n if (value === undefined || value === null || value === \"\") {\n if (fallback !== undefined) {\n return fallback;\n }\n\n return match;\n }\n\n return String(value);\n },\n );\n}\n\n/**\n * Walk a dot-path (`\"a.b.c\"`) through an arbitrary record, returning the\n * leaf value or `undefined` when any segment is missing or blocks traversal\n * (non-object). Never throws.\n */\nfunction lookupPath(source: Placeholders, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = source;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (typeof current !== \"object\") {\n return undefined;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n"],"mappings":";AAEA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;AA0B5B,SAAgB,mBACd,UACA,eAA6B,CAAC,GACtB;CACR,OAAO,SAAS,QACd,sBACC,OAAO,kBAA0B;EAChC,MAAM,CAAC,SAAS,eAAe,cAAc,MAAM,GAAG;EACtD,MAAM,OAAO,QAAQ,KAAK;EAC1B,MAAM,WAAW,aAAa,KAAK;EAEnC,MAAM,QAAQ,WAAW,cAAc,IAAI;EAE3C,IAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;GACzD,IAAI,aAAa,QACf,OAAO;GAGT,OAAO;EACT;EAEA,OAAO,OAAO,KAAK;CACrB,CACF;AACF;;;;;;AAOA,SAAS,WAAW,QAAsB,MAAuB;CAC/D,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,UAAmB;CAEvB,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,YAAY,QAAQ,YAAY,QAClC;EAGF,IAAI,OAAO,YAAY,UACrB;EAGF,UAAW,QAAoC;CACjD;CAEA,OAAO;AACT"}
@@ -1,7 +1,7 @@
1
1
  import { Placeholders } from "../contracts/placeholders.type.mjs";
2
2
  import { InstructionContract, PersonaContract, SystemPromptBlockContract, SystemPromptContract } from "../contracts/system-prompt.contract.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/system-prompt/system-prompt.d.ts
4
+ //#region ../@warlock.js/ai/src/system-prompt/system-prompt.d.ts
5
5
  /**
6
6
  * Concrete `SystemPromptContract` — an immutable layered prompt builder.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/system-prompt.ts"],"mappings":";;;;;;AA2DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiD4C;AAyC5C;;;;;;;;;;;;;AAEe;;cA5FF,YAAA,YAAwB,oBAAA;EAAA,SAEjB,MAAA,WAAiB,yBAAA;cAAjB,MAAA,YAAiB,yBAAA;;;;;;;;;EAW5B,OAAA,CAAQ,KAAA,EAAO,eAAA,YAA2B,oBAAA;;;;;;;EAsB1C,WAAA,CACL,KAAA,EAAO,mBAAA,YACN,oBAAA;;;;;;;EAYI,OAAA,CAAQ,YAAA,GAAe,YAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyChB,YAAA,CACd,KAAA,YAAiB,aAAA,CAAc,yBAAA,IAC9B,YAAA"}
1
+ {"version":3,"file":"system-prompt.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/system-prompt.ts"],"mappings":";;;;;;AA2DA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiD4C;AAyC5C;;;;;;;;;;;;;AAEe;;cA5FF,YAAA,YAAwB,oBAAA;EAAA,SAEjB,MAAA,WAAiB,yBAAA;cAAjB,MAAA,YAAiB,yBAAA;;;;;;;;;EAW5B,OAAA,CAAQ,KAAA,EAAO,eAAA,YAA2B,oBAAA;;;;;;;EAsB1C,WAAA,CACL,KAAA,EAAO,mBAAA,YACN,oBAAA;;;;;;;EAYI,OAAA,CAAQ,YAAA,GAAe,YAAA;AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAyChB,YAAA,CACd,KAAA,YAAiB,aAAA,CAAc,yBAAA,IAC9B,YAAA"}
@@ -1,7 +1,7 @@
1
1
  import { Instruction } from "./instruction.mjs";
2
2
  import { Persona } from "./persona.mjs";
3
3
 
4
- //#region ../../@warlock.js/ai/src/system-prompt/system-prompt.ts
4
+ //#region ../@warlock.js/ai/src/system-prompt/system-prompt.ts
5
5
  /**
6
6
  * Concrete `SystemPromptContract` — an immutable layered prompt builder.
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"system-prompt.mjs","names":[],"sources":["../../../../../../@warlock.js/ai/src/system-prompt/system-prompt.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type {\n InstructionContract,\n PersonaContract,\n SystemPromptBlockContract,\n SystemPromptContract,\n} from \"../contracts/system-prompt.contract\";\nimport { Instruction } from \"./instruction\";\nimport { Persona } from \"./persona\";\n\n/**\n * Concrete `SystemPromptContract` — an immutable layered prompt builder.\n *\n * **Role.** The top-level composer for a system prompt: it holds an ordered\n * list of typed blocks (persona + instructions) and resolves the whole\n * stack into one final string when the agent is about to call the model.\n *\n * **Responsibility.**\n * - Owns: the ordered `blocks` list and the block-join rules (insertion\n * order, blank-line separator, trim).\n * - Does NOT own: how any individual block is rendered (delegated to each\n * block's `resolve()`), the placeholder syntax (delegated to\n * `renderPlaceholders`), or any knowledge of the agent, model, or\n * session consuming the resolved text.\n *\n * Blocks are discriminated by a string `type` tag (`\"persona\"` /\n * `\"instruction\"`) rather than `instanceof`, so user-supplied blocks that\n * implement `SystemPromptBlockContract` interoperate seamlessly with blocks\n * built via `ai.persona()` / `ai.instruction()` — even across duplicate\n * package copies or bundler scope boundaries.\n *\n * The builder is **immutable** — every `.persona()` / `.instruction()`\n * call returns a fresh `SystemPrompt` instance sharing nothing mutable\n * with its parent. This makes forking a base prompt into specialized\n * variants a safe, side-effect-free operation.\n *\n * Users construct via the `ai.systemPrompt()` factory — `new SystemPrompt()`\n * is not the public API (see §4.2 of code-style.md). Modeled as a class so\n * that methods live on the prototype (one copy shared across every forked\n * instance) and downstream code can branch via `instanceof SystemPrompt`.\n *\n * @example\n * // Chainable form\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n * const replyIn = ai.instruction(\"Respond in {{language|English}}.\");\n *\n * const base = ai.systemPrompt().persona(alex).instruction(replyIn);\n * const arabicVariant = base.instruction(\"Prefer Arabic comments.\");\n *\n * base.resolve({ language: \"English\" });\n * arabicVariant.resolve({ language: \"Arabic\" });\n *\n * @example\n * // Array form — insertion order is preserved exactly\n * const prompt = ai.systemPrompt([\n * ai.persona(\"You are Alex, a TypeScript expert.\"),\n * ai.instruction(\"Respond in {{language|English}}.\"),\n * ]);\n */\nexport class SystemPrompt implements SystemPromptContract {\n public constructor(\n public readonly blocks: readonly SystemPromptBlockContract[] = [],\n ) {}\n\n /**\n * Return a new builder with the persona block set. If a persona already\n * exists it's replaced in place (preserving its position in `blocks`);\n * otherwise the new persona is prepended so persona-first remains the\n * default for chain-built prompts. Accepts either raw text (auto-wrapped\n * via `new Persona`) or an existing `PersonaContract` instance for reuse\n * across prompts.\n */\n public persona(value: PersonaContract | string): SystemPromptContract {\n const block = typeof value === \"string\" ? new Persona(value) : value;\n const existingIndex = this.blocks.findIndex(\n candidate => candidate.type === \"persona\",\n );\n\n if (existingIndex >= 0) {\n const next = [...this.blocks];\n next[existingIndex] = block;\n\n return new SystemPrompt(next) as this;\n }\n\n return new SystemPrompt([block, ...this.blocks]);\n }\n\n /**\n * Return a new builder with the given instruction appended. Instructions\n * render in insertion order. Accepts either raw text (auto-wrapped via\n * `new Instruction`) or an existing `InstructionContract` instance for\n * cross-prompt reuse.\n */\n public instruction(\n value: InstructionContract | string,\n ): SystemPromptContract {\n const block = typeof value === \"string\" ? new Instruction(value) : value;\n\n return new SystemPrompt([...this.blocks, block]);\n }\n\n /**\n * Resolve every block against the placeholder map, join the results with\n * blank-line separators (in insertion order), and trim. Returns an empty\n * string when no blocks are present — callers treat that as \"no system\n * message\".\n */\n public resolve(placeholders?: Placeholders): string {\n return this.blocks\n .map(block => block.resolve(placeholders))\n .join(\"\\n\\n\")\n .trim();\n }\n}\n\n/**\n * Create a new immutable system-prompt builder.\n *\n * **Role.** Public factory for `SystemPrompt` — keeps user-facing code\n * free of `new` and consistent with `ai.tool()`, `ai.agent()`,\n * `ai.persona()`, `ai.instruction()`.\n *\n * Three input forms:\n * - No argument → empty builder, chain `.persona()` / `.instruction()`\n * - Single string → seeded with one instruction for quick one-shot prompts\n * - Array of blocks → used verbatim, preserving insertion order\n *\n * @example\n * // Composed builder\n * const prompt = systemPrompt()\n * .persona(\"You are Alex, a senior TypeScript engineer.\")\n * .instruction(\"Always include working code examples.\")\n * .instruction(\"Respond in {{language|English}}.\");\n *\n * prompt.resolve({ language: \"Arabic\" });\n *\n * @example\n * // One-shot seed\n * const prompt = systemPrompt(\"Answer only with JSON matching the schema.\");\n *\n * @example\n * // Array form — fully declarative\n * const prompt = systemPrompt([\n * ai.persona(\"You are Alex.\"),\n * ai.instruction(\"Always cite sources.\"),\n * ai.instruction(\"Respond in {{language|English}}.\"),\n * ]);\n */\nexport function systemPrompt(\n input?: string | ReadonlyArray<SystemPromptBlockContract>,\n): SystemPrompt {\n if (input === undefined) {\n return new SystemPrompt();\n }\n\n if (typeof input === \"string\") {\n return new SystemPrompt([new Instruction(input)]);\n }\n\n return new SystemPrompt([...input]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,IAAa,eAAb,MAAa,aAA6C;CACxD,AAAO,YACL,AAAgB,SAA+C,CAAC,GAChE;EADgB;CACf;;;;;;;;;CAUH,AAAO,QAAQ,OAAuD;EACpE,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,QAAQ,KAAK,IAAI;EAC/D,MAAM,gBAAgB,KAAK,OAAO,WAChC,cAAa,UAAU,SAAS,SAClC;EAEA,IAAI,iBAAiB,GAAG;GACtB,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM;GAC5B,KAAK,iBAAiB;GAEtB,OAAO,IAAI,aAAa,IAAI;EAC9B;EAEA,OAAO,IAAI,aAAa,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC;CACjD;;;;;;;CAQA,AAAO,YACL,OACsB;EACtB,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,YAAY,KAAK,IAAI;EAEnE,OAAO,IAAI,aAAa,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC;CACjD;;;;;;;CAQA,AAAO,QAAQ,cAAqC;EAClD,OAAO,KAAK,OACT,KAAI,UAAS,MAAM,QAAQ,YAAY,CAAC,EACxC,KAAK,MAAM,EACX,KAAK;CACV;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,aACd,OACc;CACd,IAAI,UAAU,QACZ,OAAO,IAAI,aAAa;CAG1B,IAAI,OAAO,UAAU,UACnB,OAAO,IAAI,aAAa,CAAC,IAAI,YAAY,KAAK,CAAC,CAAC;CAGlD,OAAO,IAAI,aAAa,CAAC,GAAG,KAAK,CAAC;AACpC"}
1
+ {"version":3,"file":"system-prompt.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/system-prompt/system-prompt.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type {\n InstructionContract,\n PersonaContract,\n SystemPromptBlockContract,\n SystemPromptContract,\n} from \"../contracts/system-prompt.contract\";\nimport { Instruction } from \"./instruction\";\nimport { Persona } from \"./persona\";\n\n/**\n * Concrete `SystemPromptContract` — an immutable layered prompt builder.\n *\n * **Role.** The top-level composer for a system prompt: it holds an ordered\n * list of typed blocks (persona + instructions) and resolves the whole\n * stack into one final string when the agent is about to call the model.\n *\n * **Responsibility.**\n * - Owns: the ordered `blocks` list and the block-join rules (insertion\n * order, blank-line separator, trim).\n * - Does NOT own: how any individual block is rendered (delegated to each\n * block's `resolve()`), the placeholder syntax (delegated to\n * `renderPlaceholders`), or any knowledge of the agent, model, or\n * session consuming the resolved text.\n *\n * Blocks are discriminated by a string `type` tag (`\"persona\"` /\n * `\"instruction\"`) rather than `instanceof`, so user-supplied blocks that\n * implement `SystemPromptBlockContract` interoperate seamlessly with blocks\n * built via `ai.persona()` / `ai.instruction()` — even across duplicate\n * package copies or bundler scope boundaries.\n *\n * The builder is **immutable** — every `.persona()` / `.instruction()`\n * call returns a fresh `SystemPrompt` instance sharing nothing mutable\n * with its parent. This makes forking a base prompt into specialized\n * variants a safe, side-effect-free operation.\n *\n * Users construct via the `ai.systemPrompt()` factory — `new SystemPrompt()`\n * is not the public API (see §4.2 of code-style.md). Modeled as a class so\n * that methods live on the prototype (one copy shared across every forked\n * instance) and downstream code can branch via `instanceof SystemPrompt`.\n *\n * @example\n * // Chainable form\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n * const replyIn = ai.instruction(\"Respond in {{language|English}}.\");\n *\n * const base = ai.systemPrompt().persona(alex).instruction(replyIn);\n * const arabicVariant = base.instruction(\"Prefer Arabic comments.\");\n *\n * base.resolve({ language: \"English\" });\n * arabicVariant.resolve({ language: \"Arabic\" });\n *\n * @example\n * // Array form — insertion order is preserved exactly\n * const prompt = ai.systemPrompt([\n * ai.persona(\"You are Alex, a TypeScript expert.\"),\n * ai.instruction(\"Respond in {{language|English}}.\"),\n * ]);\n */\nexport class SystemPrompt implements SystemPromptContract {\n public constructor(\n public readonly blocks: readonly SystemPromptBlockContract[] = [],\n ) {}\n\n /**\n * Return a new builder with the persona block set. If a persona already\n * exists it's replaced in place (preserving its position in `blocks`);\n * otherwise the new persona is prepended so persona-first remains the\n * default for chain-built prompts. Accepts either raw text (auto-wrapped\n * via `new Persona`) or an existing `PersonaContract` instance for reuse\n * across prompts.\n */\n public persona(value: PersonaContract | string): SystemPromptContract {\n const block = typeof value === \"string\" ? new Persona(value) : value;\n const existingIndex = this.blocks.findIndex(\n candidate => candidate.type === \"persona\",\n );\n\n if (existingIndex >= 0) {\n const next = [...this.blocks];\n next[existingIndex] = block;\n\n return new SystemPrompt(next) as this;\n }\n\n return new SystemPrompt([block, ...this.blocks]);\n }\n\n /**\n * Return a new builder with the given instruction appended. Instructions\n * render in insertion order. Accepts either raw text (auto-wrapped via\n * `new Instruction`) or an existing `InstructionContract` instance for\n * cross-prompt reuse.\n */\n public instruction(\n value: InstructionContract | string,\n ): SystemPromptContract {\n const block = typeof value === \"string\" ? new Instruction(value) : value;\n\n return new SystemPrompt([...this.blocks, block]);\n }\n\n /**\n * Resolve every block against the placeholder map, join the results with\n * blank-line separators (in insertion order), and trim. Returns an empty\n * string when no blocks are present — callers treat that as \"no system\n * message\".\n */\n public resolve(placeholders?: Placeholders): string {\n return this.blocks\n .map(block => block.resolve(placeholders))\n .join(\"\\n\\n\")\n .trim();\n }\n}\n\n/**\n * Create a new immutable system-prompt builder.\n *\n * **Role.** Public factory for `SystemPrompt` — keeps user-facing code\n * free of `new` and consistent with `ai.tool()`, `ai.agent()`,\n * `ai.persona()`, `ai.instruction()`.\n *\n * Three input forms:\n * - No argument → empty builder, chain `.persona()` / `.instruction()`\n * - Single string → seeded with one instruction for quick one-shot prompts\n * - Array of blocks → used verbatim, preserving insertion order\n *\n * @example\n * // Composed builder\n * const prompt = systemPrompt()\n * .persona(\"You are Alex, a senior TypeScript engineer.\")\n * .instruction(\"Always include working code examples.\")\n * .instruction(\"Respond in {{language|English}}.\");\n *\n * prompt.resolve({ language: \"Arabic\" });\n *\n * @example\n * // One-shot seed\n * const prompt = systemPrompt(\"Answer only with JSON matching the schema.\");\n *\n * @example\n * // Array form — fully declarative\n * const prompt = systemPrompt([\n * ai.persona(\"You are Alex.\"),\n * ai.instruction(\"Always cite sources.\"),\n * ai.instruction(\"Respond in {{language|English}}.\"),\n * ]);\n */\nexport function systemPrompt(\n input?: string | ReadonlyArray<SystemPromptBlockContract>,\n): SystemPrompt {\n if (input === undefined) {\n return new SystemPrompt();\n }\n\n if (typeof input === \"string\") {\n return new SystemPrompt([new Instruction(input)]);\n }\n\n return new SystemPrompt([...input]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DA,IAAa,eAAb,MAAa,aAA6C;CACxD,AAAO,YACL,AAAgB,SAA+C,CAAC,GAChE;EADgB;CACf;;;;;;;;;CAUH,AAAO,QAAQ,OAAuD;EACpE,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,QAAQ,KAAK,IAAI;EAC/D,MAAM,gBAAgB,KAAK,OAAO,WAChC,cAAa,UAAU,SAAS,SAClC;EAEA,IAAI,iBAAiB,GAAG;GACtB,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM;GAC5B,KAAK,iBAAiB;GAEtB,OAAO,IAAI,aAAa,IAAI;EAC9B;EAEA,OAAO,IAAI,aAAa,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC;CACjD;;;;;;;CAQA,AAAO,YACL,OACsB;EACtB,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,YAAY,KAAK,IAAI;EAEnE,OAAO,IAAI,aAAa,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC;CACjD;;;;;;;CAQA,AAAO,QAAQ,cAAqC;EAClD,OAAO,KAAK,OACT,KAAI,UAAS,MAAM,QAAQ,YAAY,CAAC,CAAC,CACzC,KAAK,MAAM,CAAC,CACZ,KAAK;CACV;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmCA,SAAgB,aACd,OACc;CACd,IAAI,UAAU,QACZ,OAAO,IAAI,aAAa;CAG1B,IAAI,OAAO,UAAU,UACnB,OAAO,IAAI,aAAa,CAAC,IAAI,YAAY,KAAK,CAAC,CAAC;CAGlD,OAAO,IAAI,aAAa,CAAC,GAAG,KAAK,CAAC;AACpC"}
@@ -4,7 +4,7 @@ import { BaseReport } from "../contracts/result/base-report.type.mjs";
4
4
  import { ToolConfig, ToolContext } from "../contracts/tool.contract.mjs";
5
5
  import { StandardSchemaV1 } from "@standard-schema/spec";
6
6
 
7
- //#region ../../@warlock.js/ai/src/tool/tool.d.ts
7
+ //#region ../@warlock.js/ai/src/tool/tool.d.ts
8
8
  /**
9
9
  * Result returned by `ToolContract.invoke()`.
10
10
  *
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.mts","names":[],"sources":["../../../../../../@warlock.js/ai/src/tool/tool.ts"],"mappings":";;;;;;;;;;AAwCA;;;;;;;;;;;;;;;;;KAAY,gBAAA;EAQQ,iFANlB,IAAA,GAAO,OAAA,EAgBQ;EAdf,KAAA,GAAQ,OAAA,EAcmB;EAZ3B,KAAA,EAAO,KAAA,EAcP;EAZA,MAAA,EAAQ,UAAA;AAAA;;;;;;;;UAUO,YAAA,8CAA0D,UAAA,CACzE,MAAA,EACA,OAAA;EADA;;;;;;;;;;AAoB8E;AAuJhF;;;;;;EAvJE,MAAA,CAAO,QAAA,WAAmB,GAAA,GAAM,WAAA,GAAc,OAAA,CAAQ,gBAAA,CAAiB,OAAA;AAAA;AAAA,iBAuJzD,IAAA,iBAAA,CACd,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,OAAA,IAC5B,YAAA,CAAa,MAAA,EAAQ,OAAA"}
1
+ {"version":3,"file":"tool.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/tool/tool.ts"],"mappings":";;;;;;;;;;AAwCA;;;;;;;;;;;;;;;;;KAAY,gBAAA;EAQQ,iFANlB,IAAA,GAAO,OAAA,EAgBQ;EAdf,KAAA,GAAQ,OAAA,EAcmB;EAZ3B,KAAA,EAAO,KAAA,EAcP;EAZA,MAAA,EAAQ,UAAA;AAAA;;;;;;;;UAUO,YAAA,8CAA0D,UAAA,CACzE,MAAA,EACA,OAAA;EADA;;;;;;;;;;AAoB8E;AAuJhF;;;;;;EAvJE,MAAA,CAAO,QAAA,WAAmB,GAAA,GAAM,WAAA,GAAc,OAAA,CAAQ,gBAAA,CAAiB,OAAA;AAAA;AAAA,iBAuJzD,IAAA,kBACd,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,OAAA,IAC5B,YAAA,CAAa,MAAA,EAAQ,OAAA"}
package/esm/tool/tool.mjs CHANGED
@@ -3,7 +3,7 @@ import { ToolExecutionError } from "../errors/tool-execution-error.mjs";
3
3
  import "../errors/index.mjs";
4
4
  import { generateRunId } from "../utils/generate-run-id.mjs";
5
5
 
6
- //#region ../../@warlock.js/ai/src/tool/tool.ts
6
+ //#region ../@warlock.js/ai/src/tool/tool.ts
7
7
  /**
8
8
  * Degraded `ToolContext` supplied when no caller threads one through
9
9
  * (`tool.invoke(input)` standalone, batch scripts, tests). Per
@@ -154,7 +154,7 @@ function tool(contract) {
154
154
  };
155
155
  };
156
156
  let validationResult;
157
- try {
157
+ if (contract.input) try {
158
158
  validationResult = await contract.input["~standard"].validate(rawInput);
159
159
  } catch (thrown) {
160
160
  const message = thrown instanceof Error ? thrown.message : String(thrown);
@@ -163,6 +163,7 @@ function tool(contract) {
163
163
  context: { toolName: contract.name }
164
164
  }) });
165
165
  }
166
+ else validationResult = { value: rawInput };
166
167
  if (validationResult.issues) return finish({ error: new SchemaValidationError(`Validation failed: ${validationResult.issues.map((issue) => issue.message).join("; ")}`, {
167
168
  issues: validationResult.issues,
168
169
  context: { toolName: contract.name }