@warlock.js/ai 4.4.0 → 4.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (648) hide show
  1. package/CHANGELOG.md +63 -52
  2. package/cjs/index.cjs +240 -14147
  3. package/cjs/src-Bmajk4Qg.cjs +30 -0
  4. package/cjs/src-OZyDYHxm.cjs +25089 -0
  5. package/cjs/src-OZyDYHxm.cjs.map +1 -0
  6. package/esm/agent/agent-config.type.d.mts +119 -1
  7. package/esm/agent/agent-config.type.d.mts.map +1 -1
  8. package/esm/agent/agent-input-builder.mjs +27 -6
  9. package/esm/agent/agent-input-builder.mjs.map +1 -1
  10. package/esm/agent/agent.d.mts +40 -1
  11. package/esm/agent/agent.d.mts.map +1 -1
  12. package/esm/agent/agent.mjs +328 -36
  13. package/esm/agent/agent.mjs.map +1 -1
  14. package/esm/agent/index.d.mts +2 -1
  15. package/esm/agent/index.mjs +1 -0
  16. package/esm/agent/judge-config.type.d.mts +33 -0
  17. package/esm/agent/judge-config.type.d.mts.map +1 -0
  18. package/esm/agent/judge-config.type.mjs +13 -0
  19. package/esm/agent/judge-config.type.mjs.map +1 -0
  20. package/esm/agent/signature.mjs +57 -0
  21. package/esm/agent/signature.mjs.map +1 -0
  22. package/esm/agent/snapshot.mjs +101 -0
  23. package/esm/agent/snapshot.mjs.map +1 -0
  24. package/esm/ai-openai/src/embedder.mjs +4 -0
  25. package/esm/ai-openai/src/image.mjs +5 -0
  26. package/esm/ai-openai/src/index.mjs +7 -0
  27. package/esm/ai-openai/src/model.mjs +5 -0
  28. package/esm/ai-openai/src/sdk.mjs +9 -0
  29. package/esm/ai-openai/src/speech.mjs +5 -0
  30. package/esm/ai-openai/src/transcription.mjs +6 -0
  31. package/esm/ai-openai/src/utils/index.mjs +5 -0
  32. package/esm/ai-openai/src/utils/to-openai-messages.mjs +3 -0
  33. package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
  34. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
  35. package/esm/ai.d.mts +164 -53
  36. package/esm/ai.d.mts.map +1 -1
  37. package/esm/ai.mjs +79 -8
  38. package/esm/ai.mjs.map +1 -1
  39. package/esm/batch/batch.d.mts.map +1 -1
  40. package/esm/batch/batch.mjs +21 -1
  41. package/esm/batch/batch.mjs.map +1 -1
  42. package/esm/batch/batch.type.d.mts +11 -4
  43. package/esm/batch/batch.type.d.mts.map +1 -1
  44. package/esm/config.d.mts +39 -3
  45. package/esm/config.d.mts.map +1 -1
  46. package/esm/config.mjs +26 -2
  47. package/esm/config.mjs.map +1 -1
  48. package/esm/contracts/agent/agent-options.type.d.mts +33 -5
  49. package/esm/contracts/agent/agent-options.type.d.mts.map +1 -1
  50. package/esm/contracts/agent/agent-snapshot.type.d.mts +90 -0
  51. package/esm/contracts/agent/agent-snapshot.type.d.mts.map +1 -0
  52. package/esm/contracts/agent/agent.contract.d.mts +29 -1
  53. package/esm/contracts/agent/agent.contract.d.mts.map +1 -1
  54. package/esm/contracts/agent/eval.type.d.mts +43 -2
  55. package/esm/contracts/agent/eval.type.d.mts.map +1 -1
  56. package/esm/contracts/agent/index.d.mts +2 -1
  57. package/esm/contracts/attachment-policy.type.d.mts +51 -0
  58. package/esm/contracts/attachment-policy.type.d.mts.map +1 -0
  59. package/esm/contracts/attachment.type.d.mts +16 -7
  60. package/esm/contracts/attachment.type.d.mts.map +1 -1
  61. package/esm/contracts/content-part.type.d.mts +14 -5
  62. package/esm/contracts/content-part.type.d.mts.map +1 -1
  63. package/esm/contracts/events/supervisor-events.type.d.mts.map +1 -1
  64. package/esm/contracts/image-model.contract.d.mts +156 -0
  65. package/esm/contracts/image-model.contract.d.mts.map +1 -0
  66. package/esm/contracts/index.d.mts +13 -6
  67. package/esm/contracts/model.contract.d.mts +11 -8
  68. package/esm/contracts/model.contract.d.mts.map +1 -1
  69. package/esm/contracts/orchestrator/index.d.mts +1 -0
  70. package/esm/contracts/orchestrator/orchestrator-config.type.d.mts +31 -2
  71. package/esm/contracts/orchestrator/orchestrator-config.type.d.mts.map +1 -1
  72. package/esm/contracts/orchestrator/session-lock.contract.d.mts +47 -0
  73. package/esm/contracts/orchestrator/session-lock.contract.d.mts.map +1 -0
  74. package/esm/contracts/planner/index.d.mts +3 -2
  75. package/esm/contracts/planner/planner-config.type.d.mts +61 -0
  76. package/esm/contracts/planner/planner-config.type.d.mts.map +1 -1
  77. package/esm/contracts/planner/planner-execute-options.type.d.mts +60 -1
  78. package/esm/contracts/planner/planner-execute-options.type.d.mts.map +1 -1
  79. package/esm/contracts/planner/planner-result.type.d.mts +8 -0
  80. package/esm/contracts/planner/planner-result.type.d.mts.map +1 -1
  81. package/esm/contracts/planner/planner-snapshot.type.d.mts +77 -0
  82. package/esm/contracts/planner/planner-snapshot.type.d.mts.map +1 -0
  83. package/esm/contracts/planner/planner.contract.d.mts +21 -1
  84. package/esm/contracts/planner/planner.contract.d.mts.map +1 -1
  85. package/esm/contracts/result/agent-result.type.d.mts +6 -4
  86. package/esm/contracts/result/agent-result.type.d.mts.map +1 -1
  87. package/esm/contracts/result/base-report.type.d.mts +21 -3
  88. package/esm/contracts/result/base-report.type.d.mts.map +1 -1
  89. package/esm/contracts/result/base-report.type.mjs.map +1 -1
  90. package/esm/contracts/result/execution-report.type.d.mts +53 -1
  91. package/esm/contracts/result/execution-report.type.d.mts.map +1 -1
  92. package/esm/contracts/result/supervisor-result.type.d.mts +14 -2
  93. package/esm/contracts/result/supervisor-result.type.d.mts.map +1 -1
  94. package/esm/contracts/result/workflow-result.type.d.mts +2 -1
  95. package/esm/contracts/result/workflow-result.type.d.mts.map +1 -1
  96. package/esm/contracts/sdk-adapter.contract.d.mts +37 -0
  97. package/esm/contracts/sdk-adapter.contract.d.mts.map +1 -1
  98. package/esm/contracts/speech-model.contract.d.mts +97 -0
  99. package/esm/contracts/speech-model.contract.d.mts.map +1 -0
  100. package/esm/contracts/supervisor/supervisor-config.type.d.mts +29 -0
  101. package/esm/contracts/supervisor/supervisor-config.type.d.mts.map +1 -1
  102. package/esm/contracts/system-prompt.contract.d.mts +103 -1
  103. package/esm/contracts/system-prompt.contract.d.mts.map +1 -1
  104. package/esm/contracts/team/index.d.mts +1 -0
  105. package/esm/contracts/team/team-config.type.d.mts +127 -0
  106. package/esm/contracts/team/team-config.type.d.mts.map +1 -0
  107. package/esm/contracts/tool.contract.d.mts +4 -2
  108. package/esm/contracts/tool.contract.d.mts.map +1 -1
  109. package/esm/contracts/transcription-model.contract.d.mts +101 -0
  110. package/esm/contracts/transcription-model.contract.d.mts.map +1 -0
  111. package/esm/contracts/workflow/step.contract.d.mts +30 -5
  112. package/esm/contracts/workflow/step.contract.d.mts.map +1 -1
  113. package/esm/contracts/workflow/workflow.contract.d.mts +16 -0
  114. package/esm/contracts/workflow/workflow.contract.d.mts.map +1 -1
  115. package/esm/errors/agent-drift-error.d.mts +32 -0
  116. package/esm/errors/agent-drift-error.d.mts.map +1 -0
  117. package/esm/errors/agent-drift-error.mjs +31 -0
  118. package/esm/errors/agent-drift-error.mjs.map +1 -0
  119. package/esm/errors/error-code.type.d.mts +1 -1
  120. package/esm/errors/index.d.mts +3 -0
  121. package/esm/errors/index.mjs +3 -0
  122. package/esm/errors/outbound-policy-error.d.mts +27 -0
  123. package/esm/errors/outbound-policy-error.d.mts.map +1 -0
  124. package/esm/errors/outbound-policy-error.mjs +32 -0
  125. package/esm/errors/outbound-policy-error.mjs.map +1 -0
  126. package/esm/errors/planner-drift-error.d.mts +34 -0
  127. package/esm/errors/planner-drift-error.d.mts.map +1 -0
  128. package/esm/errors/planner-drift-error.mjs +33 -0
  129. package/esm/errors/planner-drift-error.mjs.map +1 -0
  130. package/esm/eval/dataset.d.mts +28 -0
  131. package/esm/eval/dataset.d.mts.map +1 -0
  132. package/esm/eval/dataset.mjs +112 -0
  133. package/esm/eval/dataset.mjs.map +1 -0
  134. package/esm/eval/dataset.type.d.mts +53 -0
  135. package/esm/eval/dataset.type.d.mts.map +1 -0
  136. package/esm/eval/eval-runner.d.mts.map +1 -1
  137. package/esm/eval/eval-runner.mjs +16 -2
  138. package/esm/eval/eval-runner.mjs.map +1 -1
  139. package/esm/eval/index.d.mts +20 -1
  140. package/esm/eval/index.d.mts.map +1 -1
  141. package/esm/eval/index.mjs +20 -2
  142. package/esm/eval/index.mjs.map +1 -1
  143. package/esm/eval/regression.d.mts +30 -0
  144. package/esm/eval/regression.d.mts.map +1 -0
  145. package/esm/eval/regression.mjs +51 -0
  146. package/esm/eval/regression.mjs.map +1 -0
  147. package/esm/eval/report-json.d.mts +30 -0
  148. package/esm/eval/report-json.d.mts.map +1 -0
  149. package/esm/eval/report-json.mjs +33 -0
  150. package/esm/eval/report-json.mjs.map +1 -0
  151. package/esm/eval/report-junit.d.mts +22 -0
  152. package/esm/eval/report-junit.d.mts.map +1 -0
  153. package/esm/eval/report-junit.mjs +60 -0
  154. package/esm/eval/report-junit.mjs.map +1 -0
  155. package/esm/guard/contracts/guard-options.type.d.mts +165 -0
  156. package/esm/guard/contracts/guard-options.type.d.mts.map +1 -0
  157. package/esm/guard/contracts/guardrail.contract.d.mts +78 -0
  158. package/esm/guard/contracts/guardrail.contract.d.mts.map +1 -0
  159. package/esm/guard/contracts/index.d.mts +4 -0
  160. package/esm/guard/contracts/openai-client.contract.d.mts +51 -0
  161. package/esm/guard/contracts/openai-client.contract.d.mts.map +1 -0
  162. package/esm/guard/contracts/verdict.type.d.mts +76 -0
  163. package/esm/guard/contracts/verdict.type.d.mts.map +1 -0
  164. package/esm/guard/detectors/index.d.mts +4 -0
  165. package/esm/guard/detectors/index.mjs +6 -0
  166. package/esm/guard/detectors/injection.d.mts +34 -0
  167. package/esm/guard/detectors/injection.d.mts.map +1 -0
  168. package/esm/guard/detectors/injection.mjs +254 -0
  169. package/esm/guard/detectors/injection.mjs.map +1 -0
  170. package/esm/guard/detectors/moderation.d.mts +32 -0
  171. package/esm/guard/detectors/moderation.d.mts.map +1 -0
  172. package/esm/guard/detectors/moderation.mjs +134 -0
  173. package/esm/guard/detectors/moderation.mjs.map +1 -0
  174. package/esm/guard/detectors/pii.d.mts +41 -0
  175. package/esm/guard/detectors/pii.d.mts.map +1 -0
  176. package/esm/guard/detectors/pii.mjs +199 -0
  177. package/esm/guard/detectors/pii.mjs.map +1 -0
  178. package/esm/guard/detectors/topic.d.mts +29 -0
  179. package/esm/guard/detectors/topic.d.mts.map +1 -0
  180. package/esm/guard/detectors/topic.mjs +99 -0
  181. package/esm/guard/detectors/topic.mjs.map +1 -0
  182. package/esm/guard/errors.d.mts +12 -0
  183. package/esm/guard/errors.d.mts.map +1 -0
  184. package/esm/guard/errors.mjs +18 -0
  185. package/esm/guard/errors.mjs.map +1 -0
  186. package/esm/guard/guard.d.mts +67 -0
  187. package/esm/guard/guard.d.mts.map +1 -0
  188. package/esm/guard/guard.mjs +209 -0
  189. package/esm/guard/guard.mjs.map +1 -0
  190. package/esm/guard/guardrail.d.mts +39 -0
  191. package/esm/guard/guardrail.d.mts.map +1 -0
  192. package/esm/guard/guardrail.mjs +22 -0
  193. package/esm/guard/guardrail.mjs.map +1 -0
  194. package/esm/human/contracts/approval.type.d.mts +154 -0
  195. package/esm/human/contracts/approval.type.d.mts.map +1 -0
  196. package/esm/human/contracts/human-approval.type.d.mts +38 -0
  197. package/esm/human/contracts/human-approval.type.d.mts.map +1 -0
  198. package/esm/human/contracts/index.d.mts +4 -0
  199. package/esm/human/contracts/interrupt-store.contract.d.mts +112 -0
  200. package/esm/human/contracts/interrupt-store.contract.d.mts.map +1 -0
  201. package/esm/human/contracts/resume.type.d.mts +77 -0
  202. package/esm/human/contracts/resume.type.d.mts.map +1 -0
  203. package/esm/human/errors.d.mts +84 -0
  204. package/esm/human/errors.d.mts.map +1 -0
  205. package/esm/human/errors.mjs +60 -0
  206. package/esm/human/errors.mjs.map +1 -0
  207. package/esm/human/human-approval.d.mts +57 -0
  208. package/esm/human/human-approval.d.mts.map +1 -0
  209. package/esm/human/human-approval.mjs +170 -0
  210. package/esm/human/human-approval.mjs.map +1 -0
  211. package/esm/human/policy.d.mts +55 -0
  212. package/esm/human/policy.d.mts.map +1 -0
  213. package/esm/human/policy.mjs +67 -0
  214. package/esm/human/policy.mjs.map +1 -0
  215. package/esm/human/register.mjs +37 -0
  216. package/esm/human/register.mjs.map +1 -0
  217. package/esm/human/resume-seed.mjs +53 -0
  218. package/esm/human/resume-seed.mjs.map +1 -0
  219. package/esm/human/resume.d.mts +54 -0
  220. package/esm/human/resume.d.mts.map +1 -0
  221. package/esm/human/resume.mjs +121 -0
  222. package/esm/human/resume.mjs.map +1 -0
  223. package/esm/human/stores/index.mjs +5 -0
  224. package/esm/human/stores/memory.d.mts +30 -0
  225. package/esm/human/stores/memory.d.mts.map +1 -0
  226. package/esm/human/stores/memory.mjs +91 -0
  227. package/esm/human/stores/memory.mjs.map +1 -0
  228. package/esm/human/stores/pg.d.mts +59 -0
  229. package/esm/human/stores/pg.d.mts.map +1 -0
  230. package/esm/human/stores/pg.mjs +220 -0
  231. package/esm/human/stores/pg.mjs.map +1 -0
  232. package/esm/human/stores/redis.d.mts +56 -0
  233. package/esm/human/stores/redis.d.mts.map +1 -0
  234. package/esm/human/stores/redis.mjs +201 -0
  235. package/esm/human/stores/redis.mjs.map +1 -0
  236. package/esm/image/image-cost.d.mts +32 -0
  237. package/esm/image/image-cost.d.mts.map +1 -0
  238. package/esm/image/image-cost.mjs +55 -0
  239. package/esm/image/image-cost.mjs.map +1 -0
  240. package/esm/image/image.d.mts +92 -0
  241. package/esm/image/image.d.mts.map +1 -0
  242. package/esm/image/image.mjs +113 -0
  243. package/esm/image/image.mjs.map +1 -0
  244. package/esm/image/index.mjs +4 -0
  245. package/esm/index.d.mts +137 -24
  246. package/esm/index.mjs +101 -11
  247. package/esm/middleware/builtins/budget.mjs +6 -2
  248. package/esm/middleware/builtins/budget.mjs.map +1 -1
  249. package/esm/middleware/utils/extract-user-text.d.mts +8 -1
  250. package/esm/middleware/utils/extract-user-text.d.mts.map +1 -1
  251. package/esm/middleware/utils/extract-user-text.mjs +8 -1
  252. package/esm/middleware/utils/extract-user-text.mjs.map +1 -1
  253. package/esm/mock/index.d.mts +3 -0
  254. package/esm/mock/index.mjs +3 -0
  255. package/esm/mock/mock-config.type.d.mts +22 -0
  256. package/esm/mock/mock-config.type.d.mts.map +1 -1
  257. package/esm/mock/mock-image-model.d.mts +41 -0
  258. package/esm/mock/mock-image-model.d.mts.map +1 -0
  259. package/esm/mock/mock-image-model.mjs +52 -0
  260. package/esm/mock/mock-image-model.mjs.map +1 -0
  261. package/esm/mock/mock-sdk.d.mts +7 -1
  262. package/esm/mock/mock-sdk.d.mts.map +1 -1
  263. package/esm/mock/mock-sdk.mjs +27 -0
  264. package/esm/mock/mock-sdk.mjs.map +1 -1
  265. package/esm/mock/mock-speech-model.d.mts +31 -0
  266. package/esm/mock/mock-speech-model.d.mts.map +1 -0
  267. package/esm/mock/mock-speech-model.mjs +39 -0
  268. package/esm/mock/mock-speech-model.mjs.map +1 -0
  269. package/esm/mock/mock-transcription-model.d.mts +32 -0
  270. package/esm/mock/mock-transcription-model.d.mts.map +1 -0
  271. package/esm/mock/mock-transcription-model.mjs +36 -0
  272. package/esm/mock/mock-transcription-model.mjs.map +1 -0
  273. package/esm/object-stream/index.d.mts +2 -0
  274. package/esm/object-stream/index.mjs +4 -0
  275. package/esm/object-stream/parse-partial-json.d.mts +22 -0
  276. package/esm/object-stream/parse-partial-json.d.mts.map +1 -0
  277. package/esm/object-stream/parse-partial-json.mjs +78 -0
  278. package/esm/object-stream/parse-partial-json.mjs.map +1 -0
  279. package/esm/object-stream/stream-object.d.mts +68 -0
  280. package/esm/object-stream/stream-object.d.mts.map +1 -0
  281. package/esm/object-stream/stream-object.mjs +104 -0
  282. package/esm/object-stream/stream-object.mjs.map +1 -0
  283. package/esm/observe/index.mjs +4 -0
  284. package/esm/observe/observer-registry.d.mts +30 -0
  285. package/esm/observe/observer-registry.d.mts.map +1 -0
  286. package/esm/observe/observer-registry.mjs +51 -0
  287. package/esm/observe/observer-registry.mjs.map +1 -0
  288. package/esm/observe/observer.contract.d.mts +40 -0
  289. package/esm/observe/observer.contract.d.mts.map +1 -0
  290. package/esm/observe/resolve-observers.d.mts +40 -0
  291. package/esm/observe/resolve-observers.d.mts.map +1 -0
  292. package/esm/observe/resolve-observers.mjs +73 -0
  293. package/esm/observe/resolve-observers.mjs.map +1 -0
  294. package/esm/orchestrator/execution.d.mts.map +1 -1
  295. package/esm/orchestrator/execution.mjs +5 -2
  296. package/esm/orchestrator/execution.mjs.map +1 -1
  297. package/esm/orchestrator/index.d.mts +1 -0
  298. package/esm/orchestrator/index.mjs +1 -0
  299. package/esm/orchestrator/orchestrator.d.mts.map +1 -1
  300. package/esm/orchestrator/orchestrator.mjs +39 -6
  301. package/esm/orchestrator/orchestrator.mjs.map +1 -1
  302. package/esm/orchestrator/session-lock.d.mts +25 -0
  303. package/esm/orchestrator/session-lock.d.mts.map +1 -0
  304. package/esm/orchestrator/session-lock.mjs +83 -0
  305. package/esm/orchestrator/session-lock.mjs.map +1 -0
  306. package/esm/planner/dag-scheduler.mjs +97 -0
  307. package/esm/planner/dag-scheduler.mjs.map +1 -0
  308. package/esm/planner/plan-prompt.d.mts +1 -1
  309. package/esm/planner/plan-prompt.d.mts.map +1 -1
  310. package/esm/planner/plan-prompt.mjs +2 -1
  311. package/esm/planner/plan-prompt.mjs.map +1 -1
  312. package/esm/planner/planner-run.d.mts +8 -0
  313. package/esm/planner/planner-run.d.mts.map +1 -1
  314. package/esm/planner/planner-run.mjs +457 -31
  315. package/esm/planner/planner-run.mjs.map +1 -1
  316. package/esm/planner/planner.d.mts.map +1 -1
  317. package/esm/planner/planner.mjs +26 -2
  318. package/esm/planner/planner.mjs.map +1 -1
  319. package/esm/planner/snapshot.mjs +95 -0
  320. package/esm/planner/snapshot.mjs.map +1 -0
  321. package/esm/prompt/errors.d.mts +57 -0
  322. package/esm/prompt/errors.d.mts.map +1 -0
  323. package/esm/prompt/errors.mjs +73 -0
  324. package/esm/prompt/errors.mjs.map +1 -0
  325. package/esm/prompt/index.d.mts +3 -0
  326. package/esm/prompt/index.mjs +4 -0
  327. package/esm/prompt/prompt-langfuse-sync.mjs +104 -0
  328. package/esm/prompt/prompt-langfuse-sync.mjs.map +1 -0
  329. package/esm/prompt/prompt-langfuse-sync.type.d.mts +32 -0
  330. package/esm/prompt/prompt-langfuse-sync.type.d.mts.map +1 -0
  331. package/esm/prompt/prompt-validate.mjs +170 -0
  332. package/esm/prompt/prompt-validate.mjs.map +1 -0
  333. package/esm/prompt/prompt.d.mts +54 -0
  334. package/esm/prompt/prompt.d.mts.map +1 -0
  335. package/esm/prompt/prompt.mjs +218 -0
  336. package/esm/prompt/prompt.mjs.map +1 -0
  337. package/esm/prompt/prompt.type.d.mts +174 -0
  338. package/esm/prompt/prompt.type.d.mts.map +1 -0
  339. package/esm/prompts/index.d.mts +3 -0
  340. package/esm/prompts/index.mjs +3 -0
  341. package/esm/prompts/prompts-manager.contract.d.mts +154 -0
  342. package/esm/prompts/prompts-manager.contract.d.mts.map +1 -0
  343. package/esm/prompts/prompts-manager.d.mts +38 -0
  344. package/esm/prompts/prompts-manager.d.mts.map +1 -0
  345. package/esm/prompts/prompts-manager.mjs +410 -0
  346. package/esm/prompts/prompts-manager.mjs.map +1 -0
  347. package/esm/prompts/prompts-manager.type.d.mts +172 -0
  348. package/esm/prompts/prompts-manager.type.d.mts.map +1 -0
  349. package/esm/prompts/prompts-validate.mjs +200 -0
  350. package/esm/prompts/prompts-validate.mjs.map +1 -0
  351. package/esm/rag/as-tool.mjs +48 -0
  352. package/esm/rag/as-tool.mjs.map +1 -0
  353. package/esm/rag/chunk/chunk.d.mts +24 -0
  354. package/esm/rag/chunk/chunk.d.mts.map +1 -0
  355. package/esm/rag/chunk/chunk.mjs +44 -0
  356. package/esm/rag/chunk/chunk.mjs.map +1 -0
  357. package/esm/rag/chunk/fixed.mjs +32 -0
  358. package/esm/rag/chunk/fixed.mjs.map +1 -0
  359. package/esm/rag/chunk/markdown.mjs +75 -0
  360. package/esm/rag/chunk/markdown.mjs.map +1 -0
  361. package/esm/rag/chunk/recursive.mjs +132 -0
  362. package/esm/rag/chunk/recursive.mjs.map +1 -0
  363. package/esm/rag/chunk/sentence.mjs +73 -0
  364. package/esm/rag/chunk/sentence.mjs.map +1 -0
  365. package/esm/rag/contracts/chunk-options.type.d.mts +35 -0
  366. package/esm/rag/contracts/chunk-options.type.d.mts.map +1 -0
  367. package/esm/rag/contracts/citation.type.d.mts +35 -0
  368. package/esm/rag/contracts/citation.type.d.mts.map +1 -0
  369. package/esm/rag/contracts/index.d.mts +4 -0
  370. package/esm/rag/contracts/rag-config.type.d.mts +68 -0
  371. package/esm/rag/contracts/rag-config.type.d.mts.map +1 -0
  372. package/esm/rag/contracts/rag-document.type.d.mts +21 -0
  373. package/esm/rag/contracts/rag-document.type.d.mts.map +1 -0
  374. package/esm/rag/hybrid/bm25.d.mts +23 -0
  375. package/esm/rag/hybrid/bm25.d.mts.map +1 -0
  376. package/esm/rag/hybrid/bm25.mjs +51 -0
  377. package/esm/rag/hybrid/bm25.mjs.map +1 -0
  378. package/esm/rag/hybrid/hybrid-rank.d.mts +33 -0
  379. package/esm/rag/hybrid/hybrid-rank.d.mts.map +1 -0
  380. package/esm/rag/hybrid/hybrid-rank.mjs +29 -0
  381. package/esm/rag/hybrid/hybrid-rank.mjs.map +1 -0
  382. package/esm/rag/hybrid/rrf.d.mts +25 -0
  383. package/esm/rag/hybrid/rrf.d.mts.map +1 -0
  384. package/esm/rag/hybrid/rrf.mjs +30 -0
  385. package/esm/rag/hybrid/rrf.mjs.map +1 -0
  386. package/esm/rag/index.d.mts +22 -0
  387. package/esm/rag/index.mjs +18 -0
  388. package/esm/rag/loaders/errors.d.mts +19 -0
  389. package/esm/rag/loaders/errors.d.mts.map +1 -0
  390. package/esm/rag/loaders/errors.mjs +25 -0
  391. package/esm/rag/loaders/errors.mjs.map +1 -0
  392. package/esm/rag/loaders/index.mjs +7 -0
  393. package/esm/rag/loaders/load-html.d.mts +26 -0
  394. package/esm/rag/loaders/load-html.d.mts.map +1 -0
  395. package/esm/rag/loaders/load-html.mjs +138 -0
  396. package/esm/rag/loaders/load-html.mjs.map +1 -0
  397. package/esm/rag/loaders/load-pdf.d.mts +38 -0
  398. package/esm/rag/loaders/load-pdf.d.mts.map +1 -0
  399. package/esm/rag/loaders/load-pdf.mjs +150 -0
  400. package/esm/rag/loaders/load-pdf.mjs.map +1 -0
  401. package/esm/rag/loaders/load-text.d.mts +47 -0
  402. package/esm/rag/loaders/load-text.d.mts.map +1 -0
  403. package/esm/rag/loaders/load-text.mjs +60 -0
  404. package/esm/rag/loaders/load-text.mjs.map +1 -0
  405. package/esm/rag/loaders/load-web.d.mts +42 -0
  406. package/esm/rag/loaders/load-web.d.mts.map +1 -0
  407. package/esm/rag/loaders/load-web.mjs +89 -0
  408. package/esm/rag/loaders/load-web.mjs.map +1 -0
  409. package/esm/rag/loaders/loader.type.d.mts +89 -0
  410. package/esm/rag/loaders/loader.type.d.mts.map +1 -0
  411. package/esm/rag/rag.d.mts +38 -0
  412. package/esm/rag/rag.d.mts.map +1 -0
  413. package/esm/rag/rag.mjs +126 -0
  414. package/esm/rag/rag.mjs.map +1 -0
  415. package/esm/rag/rerank/keyword-reranker.d.mts +32 -0
  416. package/esm/rag/rerank/keyword-reranker.d.mts.map +1 -0
  417. package/esm/rag/rerank/keyword-reranker.mjs +58 -0
  418. package/esm/rag/rerank/keyword-reranker.mjs.map +1 -0
  419. package/esm/rag/rerank/llm-reranker.d.mts +36 -0
  420. package/esm/rag/rerank/llm-reranker.d.mts.map +1 -0
  421. package/esm/rag/rerank/llm-reranker.mjs +85 -0
  422. package/esm/rag/rerank/llm-reranker.mjs.map +1 -0
  423. package/esm/rag/rerank/reranker.contract.d.mts +28 -0
  424. package/esm/rag/rerank/reranker.contract.d.mts.map +1 -0
  425. package/esm/rag/retrieve.mjs +68 -0
  426. package/esm/rag/retrieve.mjs.map +1 -0
  427. package/esm/rag/store/cache-vector-store.d.mts +27 -0
  428. package/esm/rag/store/cache-vector-store.d.mts.map +1 -0
  429. package/esm/rag/store/cache-vector-store.mjs +48 -0
  430. package/esm/rag/store/cache-vector-store.mjs.map +1 -0
  431. package/esm/rag/store/pg-vector-store.d.mts +139 -0
  432. package/esm/rag/store/pg-vector-store.d.mts.map +1 -0
  433. package/esm/rag/store/pg-vector-store.mjs +328 -0
  434. package/esm/rag/store/pg-vector-store.mjs.map +1 -0
  435. package/esm/rag/store/vector-store.contract.d.mts +38 -0
  436. package/esm/rag/store/vector-store.contract.d.mts.map +1 -0
  437. package/esm/rag/transforms/multi-query.d.mts +27 -0
  438. package/esm/rag/transforms/multi-query.d.mts.map +1 -0
  439. package/esm/rag/transforms/multi-query.mjs +41 -0
  440. package/esm/rag/transforms/multi-query.mjs.map +1 -0
  441. package/esm/security/index.mjs +5 -0
  442. package/esm/security/outbound-policy.d.mts +46 -0
  443. package/esm/security/outbound-policy.d.mts.map +1 -0
  444. package/esm/security/outbound-policy.mjs +187 -0
  445. package/esm/security/outbound-policy.mjs.map +1 -0
  446. package/esm/security/outbound-policy.type.d.mts +74 -0
  447. package/esm/security/outbound-policy.type.d.mts.map +1 -0
  448. package/esm/security/private-ip.d.mts +15 -0
  449. package/esm/security/private-ip.d.mts.map +1 -0
  450. package/esm/security/private-ip.mjs +48 -0
  451. package/esm/security/private-ip.mjs.map +1 -0
  452. package/esm/security/redact.d.mts +59 -0
  453. package/esm/security/redact.d.mts.map +1 -0
  454. package/esm/security/redact.mjs +122 -0
  455. package/esm/security/redact.mjs.map +1 -0
  456. package/esm/serve/serve.d.mts +50 -0
  457. package/esm/serve/serve.d.mts.map +1 -0
  458. package/esm/serve/serve.mjs +90 -0
  459. package/esm/serve/serve.mjs.map +1 -0
  460. package/esm/serve/sse.d.mts +20 -0
  461. package/esm/serve/sse.d.mts.map +1 -0
  462. package/esm/serve/sse.mjs +25 -0
  463. package/esm/serve/sse.mjs.map +1 -0
  464. package/esm/serve/stream-to-sse.d.mts +29 -0
  465. package/esm/serve/stream-to-sse.d.mts.map +1 -0
  466. package/esm/serve/stream-to-sse.mjs +37 -0
  467. package/esm/serve/stream-to-sse.mjs.map +1 -0
  468. package/esm/skills/catalog.d.mts +49 -0
  469. package/esm/skills/catalog.d.mts.map +1 -0
  470. package/esm/skills/catalog.mjs +140 -0
  471. package/esm/skills/catalog.mjs.map +1 -0
  472. package/esm/skills/contracts/skill-record.type.d.mts +37 -0
  473. package/esm/skills/contracts/skill-record.type.d.mts.map +1 -0
  474. package/esm/skills/contracts/skills-config.type.d.mts +108 -0
  475. package/esm/skills/contracts/skills-config.type.d.mts.map +1 -0
  476. package/esm/skills/contracts/skills-store.contract.d.mts +28 -0
  477. package/esm/skills/contracts/skills-store.contract.d.mts.map +1 -0
  478. package/esm/skills/contracts/skills.contract.d.mts +43 -0
  479. package/esm/skills/contracts/skills.contract.d.mts.map +1 -0
  480. package/esm/skills/index.d.mts +16 -0
  481. package/esm/skills/index.mjs +14 -0
  482. package/esm/skills/load-skill-tool.d.mts +38 -0
  483. package/esm/skills/load-skill-tool.d.mts.map +1 -0
  484. package/esm/skills/load-skill-tool.mjs +65 -0
  485. package/esm/skills/load-skill-tool.mjs.map +1 -0
  486. package/esm/skills/review-gate.d.mts +33 -0
  487. package/esm/skills/review-gate.d.mts.map +1 -0
  488. package/esm/skills/review-gate.mjs +60 -0
  489. package/esm/skills/review-gate.mjs.map +1 -0
  490. package/esm/skills/save-skill-tool.d.mts +39 -0
  491. package/esm/skills/save-skill-tool.d.mts.map +1 -0
  492. package/esm/skills/save-skill-tool.mjs +65 -0
  493. package/esm/skills/save-skill-tool.mjs.map +1 -0
  494. package/esm/skills/skills.d.mts +33 -0
  495. package/esm/skills/skills.d.mts.map +1 -0
  496. package/esm/skills/skills.mjs +109 -0
  497. package/esm/skills/skills.mjs.map +1 -0
  498. package/esm/skills/sources/directory-source.d.mts +19 -0
  499. package/esm/skills/sources/directory-source.d.mts.map +1 -0
  500. package/esm/skills/sources/directory-source.mjs +108 -0
  501. package/esm/skills/sources/directory-source.mjs.map +1 -0
  502. package/esm/skills/sources/index.d.mts +18 -0
  503. package/esm/skills/sources/index.d.mts.map +1 -0
  504. package/esm/skills/sources/index.mjs +27 -0
  505. package/esm/skills/sources/index.mjs.map +1 -0
  506. package/esm/skills/sources/parse-frontmatter.d.mts +27 -0
  507. package/esm/skills/sources/parse-frontmatter.d.mts.map +1 -0
  508. package/esm/skills/sources/parse-frontmatter.mjs +46 -0
  509. package/esm/skills/sources/parse-frontmatter.mjs.map +1 -0
  510. package/esm/skills/sources/store-source.d.mts +14 -0
  511. package/esm/skills/sources/store-source.d.mts.map +1 -0
  512. package/esm/skills/sources/store-source.mjs +15 -0
  513. package/esm/skills/sources/store-source.mjs.map +1 -0
  514. package/esm/skills/sources/url-source.d.mts +29 -0
  515. package/esm/skills/sources/url-source.d.mts.map +1 -0
  516. package/esm/skills/sources/url-source.mjs +117 -0
  517. package/esm/skills/sources/url-source.mjs.map +1 -0
  518. package/esm/skills/store/mock-skills-store.d.mts +57 -0
  519. package/esm/skills/store/mock-skills-store.d.mts.map +1 -0
  520. package/esm/skills/store/mock-skills-store.mjs +100 -0
  521. package/esm/skills/store/mock-skills-store.mjs.map +1 -0
  522. package/esm/skills/store/procedural-skill-store.d.mts +30 -0
  523. package/esm/skills/store/procedural-skill-store.d.mts.map +1 -0
  524. package/esm/skills/store/procedural-skill-store.mjs +125 -0
  525. package/esm/skills/store/procedural-skill-store.mjs.map +1 -0
  526. package/esm/speech/index.mjs +3 -0
  527. package/esm/speech/speech.d.mts +65 -0
  528. package/esm/speech/speech.d.mts.map +1 -0
  529. package/esm/speech/speech.mjs +123 -0
  530. package/esm/speech/speech.mjs.map +1 -0
  531. package/esm/supervisor/as-tool.mjs +2 -2
  532. package/esm/supervisor/as-tool.mjs.map +1 -1
  533. package/esm/supervisor/entries.mjs +2 -2
  534. package/esm/supervisor/entries.mjs.map +1 -1
  535. package/esm/supervisor/execution.d.mts.map +1 -1
  536. package/esm/supervisor/execution.mjs +31 -28
  537. package/esm/supervisor/execution.mjs.map +1 -1
  538. package/esm/supervisor/supervisor.d.mts.map +1 -1
  539. package/esm/supervisor/supervisor.mjs +8 -3
  540. package/esm/supervisor/supervisor.mjs.map +1 -1
  541. package/esm/system-prompt/index.d.mts +4 -0
  542. package/esm/system-prompt/system-prompt.d.mts +68 -4
  543. package/esm/system-prompt/system-prompt.d.mts.map +1 -1
  544. package/esm/system-prompt/system-prompt.mjs +89 -5
  545. package/esm/system-prompt/system-prompt.mjs.map +1 -1
  546. package/esm/team/gates.mjs +48 -0
  547. package/esm/team/gates.mjs.map +1 -0
  548. package/esm/team/index.d.mts +1 -0
  549. package/esm/team/index.mjs +3 -0
  550. package/esm/team/team.d.mts +42 -0
  551. package/esm/team/team.d.mts.map +1 -0
  552. package/esm/team/team.mjs +94 -0
  553. package/esm/team/team.mjs.map +1 -0
  554. package/esm/tool/executable-as-tool.d.mts.map +1 -1
  555. package/esm/tool/executable-as-tool.mjs +2 -2
  556. package/esm/tool/executable-as-tool.mjs.map +1 -1
  557. package/esm/tool/tool.d.mts.map +1 -1
  558. package/esm/tool/tool.mjs +2 -2
  559. package/esm/tool/tool.mjs.map +1 -1
  560. package/esm/transcribe/audio-input.d.mts +47 -0
  561. package/esm/transcribe/audio-input.d.mts.map +1 -0
  562. package/esm/transcribe/audio-input.mjs +84 -0
  563. package/esm/transcribe/audio-input.mjs.map +1 -0
  564. package/esm/transcribe/index.mjs +4 -0
  565. package/esm/transcribe/transcribe.d.mts +64 -0
  566. package/esm/transcribe/transcribe.d.mts.map +1 -0
  567. package/esm/transcribe/transcribe.mjs +128 -0
  568. package/esm/transcribe/transcribe.mjs.map +1 -0
  569. package/esm/utils/compute-cost.d.mts +17 -1
  570. package/esm/utils/compute-cost.d.mts.map +1 -1
  571. package/esm/utils/compute-cost.mjs +26 -1
  572. package/esm/utils/compute-cost.mjs.map +1 -1
  573. package/esm/utils/extract-json-lenient.d.mts +42 -0
  574. package/esm/utils/extract-json-lenient.d.mts.map +1 -0
  575. package/esm/utils/extract-json-lenient.mjs +97 -0
  576. package/esm/utils/extract-json-lenient.mjs.map +1 -0
  577. package/esm/utils/index.d.mts +4 -2
  578. package/esm/utils/index.mjs +3 -1
  579. package/esm/utils/json-schema.d.mts +1 -1
  580. package/esm/utils/prepare-attachment-part.d.mts +10 -1
  581. package/esm/utils/prepare-attachment-part.d.mts.map +1 -1
  582. package/esm/utils/prepare-attachment-part.mjs +103 -11
  583. package/esm/utils/prepare-attachment-part.mjs.map +1 -1
  584. package/esm/utils/resolve-attachment.d.mts +4 -3
  585. package/esm/utils/resolve-attachment.d.mts.map +1 -1
  586. package/esm/utils/resolve-attachment.mjs +4 -3
  587. package/esm/utils/resolve-attachment.mjs.map +1 -1
  588. package/esm/utils/run-context.d.mts +94 -0
  589. package/esm/utils/run-context.d.mts.map +1 -0
  590. package/esm/utils/run-context.mjs +98 -0
  591. package/esm/utils/run-context.mjs.map +1 -0
  592. package/esm/vcr/cassette-io.mjs +57 -0
  593. package/esm/vcr/cassette-io.mjs.map +1 -0
  594. package/esm/vcr/errors.d.mts +42 -0
  595. package/esm/vcr/errors.d.mts.map +1 -0
  596. package/esm/vcr/errors.mjs +37 -0
  597. package/esm/vcr/errors.mjs.map +1 -0
  598. package/esm/vcr/hash-request.d.mts +28 -0
  599. package/esm/vcr/hash-request.d.mts.map +1 -0
  600. package/esm/vcr/hash-request.mjs +118 -0
  601. package/esm/vcr/hash-request.mjs.map +1 -0
  602. package/esm/vcr/index.d.mts +4 -0
  603. package/esm/vcr/index.mjs +5 -0
  604. package/esm/vcr/vcr.d.mts +32 -0
  605. package/esm/vcr/vcr.d.mts.map +1 -0
  606. package/esm/vcr/vcr.mjs +248 -0
  607. package/esm/vcr/vcr.mjs.map +1 -0
  608. package/esm/vcr/vcr.type.d.mts +118 -0
  609. package/esm/vcr/vcr.type.d.mts.map +1 -0
  610. package/esm/workflow/as-tool.mjs +2 -2
  611. package/esm/workflow/as-tool.mjs.map +1 -1
  612. package/esm/workflow/engine.mjs +1 -0
  613. package/esm/workflow/engine.mjs.map +1 -1
  614. package/esm/workflow/step-runner.mjs +19 -20
  615. package/esm/workflow/step-runner.mjs.map +1 -1
  616. package/esm/workflow/workflow.d.mts.map +1 -1
  617. package/esm/workflow/workflow.mjs +8 -3
  618. package/esm/workflow/workflow.mjs.map +1 -1
  619. package/llms-full.txt +2572 -204
  620. package/llms.txt +21 -4
  621. package/package.json +7 -3
  622. package/skills/README.md +44 -4
  623. package/skills/ai-dx-helpers/SKILL.md +2 -2
  624. package/skills/approve-tool-calls/SKILL.md +134 -0
  625. package/skills/attach-ai-middleware/SKILL.md +1 -1
  626. package/skills/detect-and-redact-pii/SKILL.md +104 -0
  627. package/skills/durable-agent-runs/SKILL.md +135 -0
  628. package/skills/durable-resume/SKILL.md +128 -0
  629. package/skills/escalate-block-to-human/SKILL.md +85 -0
  630. package/skills/eval-datasets-and-ci/SKILL.md +117 -0
  631. package/skills/generate-images/SKILL.md +138 -0
  632. package/skills/generate-speech/SKILL.md +139 -0
  633. package/skills/guard-input-output/SKILL.md +117 -0
  634. package/skills/manage-prompts/SKILL.md +186 -0
  635. package/skills/observe-ai-flows/SKILL.md +94 -0
  636. package/skills/rag-loaders-and-stores/SKILL.md +164 -0
  637. package/skills/record-replay-llm/SKILL.md +92 -0
  638. package/skills/run-ai-agent/SKILL.md +26 -1
  639. package/skills/run-ai-rag/SKILL.md +139 -0
  640. package/skills/run-ai-team/SKILL.md +107 -0
  641. package/skills/run-orchestrator/SKILL.md +2 -0
  642. package/skills/run-planner/SKILL.md +73 -8
  643. package/skills/run-supervisor/SKILL.md +20 -1
  644. package/skills/transcribe-audio/SKILL.md +157 -0
  645. package/skills/use-runtime-skills/SKILL.md +106 -0
  646. package/skills/write-system-prompt/SKILL.md +30 -1
  647. package/cjs/index.cjs.map +0 -1
  648. package/esm/contracts/result/index.d.mts +0 -15
@@ -4,26 +4,42 @@ import { AgentCancelledError } from "../errors/agent-cancelled-error.mjs";
4
4
  import { AgentMaxTripsError } from "../errors/agent-max-trips-error.mjs";
5
5
  import { SchemaValidationError } from "../errors/schema-validation-error.mjs";
6
6
  import "../errors/index.mjs";
7
- import { accumulateCost, computeCost } from "../utils/compute-cost.mjs";
7
+ import { computeCost, mergeUsage } from "../utils/compute-cost.mjs";
8
8
  import { extractJsonPayload } from "../utils/extract-json-payload.mjs";
9
+ import { extractJsonLenient } from "../utils/extract-json-lenient.mjs";
9
10
  import { generateRunId } from "../utils/generate-run-id.mjs";
11
+ import { captureChildReport } from "../utils/run-context.mjs";
10
12
  import { safeJsonParse } from "../utils/safe-json-parse.mjs";
11
13
  import { stampReportLineage } from "../utils/stamp-report-lineage.mjs";
12
14
  import "../utils/index.mjs";
13
15
  import { runEval } from "../eval/eval-runner.mjs";
14
16
  import { runPipeline } from "../middleware/pipeline.mjs";
15
17
  import "../middleware/index.mjs";
18
+ import { notifyObservers } from "../observe/resolve-observers.mjs";
19
+ import { skills } from "../skills/skills.mjs";
20
+ import "../skills/index.mjs";
16
21
  import { normalizeAgentTools } from "../tool/executable-as-tool.mjs";
22
+ import { JUDGE_DEFAULT_REPAIR_ATTEMPTS } from "./judge-config.type.mjs";
17
23
  import { buildAgentInputMessages } from "./agent-input-builder.mjs";
18
24
  import { logAgentEvent } from "./agent-log-event.mjs";
19
25
  import { createAgentStream } from "./agent-stream.mjs";
20
26
  import { agentEventToStreamEvent } from "./agent-to-stream-event.mjs";
21
27
  import { JsonStreamGuard } from "./json-stream-guard.mjs";
28
+ import { computeAgentSignature } from "./signature.mjs";
29
+ import { deleteAgentSnapshot, loadAgentSnapshotForResume, persistAgentSnapshot } from "./snapshot.mjs";
22
30
  import { log } from "@warlock.js/logger";
23
31
 
24
32
  //#region ../@warlock.js/ai/src/agent/agent.ts
25
33
  const LOG_MODULE = "ai.agent";
26
34
  /**
35
+ * Duck-type a value as a {@link SkillsContract} (vs a raw `SkillsConfig`).
36
+ * A contract exposes the agent-facing methods; a config is a plain spec.
37
+ * Checking `catalogPrompt` is sufficient to discriminate the two shapes.
38
+ */
39
+ function isSkillsContract(value) {
40
+ return typeof value === "object" && value !== null && typeof value.catalogPrompt === "function";
41
+ }
42
+ /**
27
43
  * Detect abort-flavored errors surfaced by SDK HTTP layers — the
28
44
  * DOM `AbortError`, axios `ERR_CANCELED`, node-fetch's own
29
45
  * `AbortError`. Used to classify them as cancellation rather than
@@ -93,6 +109,16 @@ function validateMiddleware(middleware) {
93
109
  }
94
110
  }
95
111
  /**
112
+ * Normalize the public `judge` flag (`boolean | JudgeConfig | undefined`)
113
+ * into a resolved {@link JudgeConfig} or `undefined` when the preset is
114
+ * off. `true` ⇒ all defaults (`{}`); a partial config fills missing fields
115
+ * from the defaults; `false` / absent ⇒ `undefined` (judge mode off).
116
+ */
117
+ function resolveJudgeConfig(judge) {
118
+ if (!judge) return;
119
+ return { repairAttempts: (judge === true ? {} : judge).repairAttempts ?? 2 };
120
+ }
121
+ /**
96
122
  * Creates an executable AI agent from the given configuration.
97
123
  *
98
124
  * The agent runs a bounded trip loop: each trip calls the model, dispatches
@@ -130,10 +156,24 @@ function agent(config) {
130
156
  ...config,
131
157
  tools
132
158
  }) : config.name;
159
+ const skillsLib = config.skills ? isSkillsContract(config.skills) ? config.skills : skills(config.skills) : void 0;
160
+ const signature = computeAgentSignature({
161
+ name: isAnonymous ? void 0 : name,
162
+ version: config.version,
163
+ model: {
164
+ name: config.model?.name,
165
+ provider: config.model?.provider
166
+ },
167
+ tools,
168
+ maxTrips: config.maxTrips,
169
+ output: config.output
170
+ });
133
171
  const resolvedConfig = {
134
172
  ...config,
135
173
  name,
136
- tools
174
+ tools,
175
+ skillsLib,
176
+ signature
137
177
  };
138
178
  const instanceHandlers = /* @__PURE__ */ new Map();
139
179
  function on(event, handler) {
@@ -153,6 +193,7 @@ function agent(config) {
153
193
  name,
154
194
  isAnonymous,
155
195
  description: config.description,
196
+ signature,
156
197
  async execute(input, options) {
157
198
  return new Execution(resolvedConfig, input, options, void 0, instanceHandlers).run();
158
199
  },
@@ -161,6 +202,19 @@ function agent(config) {
161
202
  new Execution(resolvedConfig, input, options, controller, instanceHandlers).run();
162
203
  return stream;
163
204
  },
205
+ async resume(runId, options) {
206
+ const snapshot = await loadAgentSnapshotForResume({
207
+ durable: resolvedConfig.durable,
208
+ agentName: name,
209
+ signature,
210
+ runId,
211
+ options
212
+ });
213
+ return new Execution(resolvedConfig, snapshot.input, {
214
+ ...options,
215
+ runId
216
+ }, void 0, instanceHandlers, snapshot).run();
217
+ },
164
218
  on,
165
219
  off,
166
220
  eval(options) {
@@ -170,6 +224,41 @@ function agent(config) {
170
224
  return agentContract;
171
225
  }
172
226
  /**
227
+ * Build a judge-safe agent — sugar for `agent({ ...config, judge })`.
228
+ *
229
+ * Use this for LLM-as-judge graders and verdict classifiers running on
230
+ * models that may emit corrupted structured output (e.g. the Amazon Nova
231
+ * family). The returned agent parses verdicts leniently (tolerates fenced
232
+ * ` ```json ` blocks + surrounding prose), auto-enables a couple of repair
233
+ * re-asks, and never throws on a parse miss — surfacing `result.error` with
234
+ * `result.data` left undefined so a flaky judge degrades gracefully.
235
+ *
236
+ * See {@link AgentConfig.judge} for the full behavior + the resilience-over-
237
+ * strictness trade-off.
238
+ *
239
+ * @param config - Any agent config (model, system prompt, output schema, …).
240
+ * @param judge - Optional fine-tuning ({@link JudgeConfig}); defaults to `true`.
241
+ *
242
+ * @example
243
+ * const grader = ai.agent.judge({
244
+ * model: nova.model({ name: "amazon.nova-pro-v1:0" }),
245
+ * systemPrompt: "Grade the answer. Respond with JSON only.",
246
+ * output: verdictSchema,
247
+ * });
248
+ *
249
+ * const result = await grader.execute(prompt);
250
+ * if (result.error) {
251
+ * // graceful default — the judge couldn't produce a clean verdict
252
+ * }
253
+ */
254
+ function judgeAgent(config, judge = true) {
255
+ return agent({
256
+ ...config,
257
+ judge
258
+ });
259
+ }
260
+ agent.judge = judgeAgent;
261
+ /**
173
262
  * Per-call driver that owns the full lifecycle of a single
174
263
  * `agent.execute()` or `agent.stream()` invocation.
175
264
  *
@@ -212,12 +301,13 @@ function agent(config) {
212
301
  * return stream;
213
302
  */
214
303
  var Execution = class {
215
- constructor(config, input, options, streamController, instanceHandlers) {
304
+ constructor(config, input, options, streamController, instanceHandlers, resumeFrom) {
216
305
  this.config = config;
217
306
  this.input = input;
218
307
  this.options = options;
219
308
  this.streamController = streamController;
220
309
  this.instanceHandlers = instanceHandlers;
310
+ this.resumeFrom = resumeFrom;
221
311
  this.trips = [];
222
312
  this.toolCalls = [];
223
313
  this.usage = {
@@ -226,13 +316,27 @@ var Execution = class {
226
316
  total: 0
227
317
  };
228
318
  this.messages = [];
229
- this.startedAt = /* @__PURE__ */ new Date();
230
319
  this.start = performance.now();
231
- this.runId = generateRunId("agent");
232
320
  this.logger = log;
321
+ this.warnedHandlerEvents = /* @__PURE__ */ new Set();
233
322
  this.middlewareState = /* @__PURE__ */ new Map();
234
323
  this.maxTrips = config.maxTrips ?? 10;
235
324
  this.middleware = config.middleware ?? [];
325
+ this.judgeConfig = resolveJudgeConfig(config.judge);
326
+ this.runId = resumeFrom?.runId ?? options?.runId ?? generateRunId("agent");
327
+ this.startedAt = resumeFrom ? new Date(resumeFrom.startedAt) : /* @__PURE__ */ new Date();
328
+ if (resumeFrom) {
329
+ this.messages.push(...resumeFrom.messages);
330
+ this.trips.push(...resumeFrom.trips);
331
+ this.toolCalls.push(...resumeFrom.toolCalls);
332
+ mergeUsage(this.usage, resumeFrom.usage);
333
+ this.systemPrompt = resumeFrom.systemPrompt;
334
+ this.responseSchema = resumeFrom.responseSchema;
335
+ this.promptName = resumeFrom.promptName;
336
+ this.promptVersion = resumeFrom.promptVersion;
337
+ }
338
+ const skillTools = config.skillsLib ? normalizeAgentTools(config.skillsLib.tools(this.runId)) ?? [] : [];
339
+ this.effectiveTools = [...config.tools ?? [], ...skillTools];
236
340
  }
237
341
  /**
238
342
  * Base middleware context shared by every level. `state` is the
@@ -280,6 +384,8 @@ var Execution = class {
280
384
  if (result.error) this.emit("agent.error", { error: result.error });
281
385
  this.emit("agent.completed", { result });
282
386
  await this.fireCompleteHook(result);
387
+ await notifyObservers(this.config.observe, result.report);
388
+ captureChildReport(result.report);
283
389
  this.streamController?.end(result);
284
390
  return result;
285
391
  }
@@ -292,14 +398,28 @@ var Execution = class {
292
398
  * with `error` populated when things went wrong.
293
399
  */
294
400
  async runCore() {
401
+ if (this.resumeFrom && this.resumeFrom.status === "completed") return this.rebuildResumedResult(this.resumeFrom);
295
402
  try {
296
- await this.buildInitialMessages();
297
- this.emit("agent.starting", { input: this.input });
403
+ if (!this.resumeFrom) {
404
+ await this.buildInitialMessages();
405
+ this.emit("agent.starting", { input: this.input });
406
+ }
298
407
  await this.runTripLoop();
299
- if (await this.parseOutput() === "failed" && this.options?.repair) await this.runRepairLoop();
408
+ if (await this.parseOutput() === "failed" && this.resolveRepairAttempts() > 0) await this.runRepairLoop();
300
409
  } catch (thrown) {
301
410
  this.error = this.toAIError(thrown);
302
411
  }
412
+ await this.checkpoint(this.resolveSnapshotStatus());
413
+ if (!this.error && this.config.durable?.deleteOnComplete) {
414
+ const outcome = await deleteAgentSnapshot({
415
+ durable: this.config.durable,
416
+ runId: this.runId
417
+ });
418
+ if (!outcome.ok) this.logger.warn(LOG_MODULE, "snapshot.delete.failed", "durable snapshot delete failed", {
419
+ runId: this.runId,
420
+ error: outcome.error instanceof Error ? outcome.error.message : String(outcome.error)
421
+ });
422
+ }
303
423
  return this.buildResult();
304
424
  }
305
425
  /**
@@ -311,13 +431,50 @@ var Execution = class {
311
431
  * to the model. Runs exactly once per execution.
312
432
  */
313
433
  async buildInitialMessages() {
314
- const { messages, responseSchema } = await buildAgentInputMessages({
434
+ const { messages, responseSchema, systemPrompt, promptName, promptVersion } = await buildAgentInputMessages({
315
435
  config: this.config,
316
436
  input: this.input,
317
437
  options: this.options
318
438
  });
319
439
  this.messages.push(...messages);
320
440
  this.responseSchema = responseSchema;
441
+ this.systemPrompt = systemPrompt;
442
+ this.promptName = promptName;
443
+ this.promptVersion = promptVersion;
444
+ await this.injectSkills();
445
+ }
446
+ /**
447
+ * Prepend the skills library's contribution to the system prompt — the
448
+ * always-injected metadata catalog first, then (only under `inject`) the
449
+ * preloaded skill bodies, then the developer's resolved system prompt.
450
+ * Never replaces the developer prompt.
451
+ *
452
+ * No-op when no skills library is attached. `catalogPrompt` returns `""`
453
+ * when nothing is in scope and `preload` returns `[]` when `inject` is
454
+ * omitted (the default), so the prepend is a no-op in those cases too.
455
+ *
456
+ * Awaited inside `buildInitialMessages`, which runs inside `runCore`'s
457
+ * try/catch — a source/embedder failure funnels into `this.error` like
458
+ * any other build failure, no new error handling needed.
459
+ */
460
+ async injectSkills() {
461
+ const lib = this.config.skillsLib;
462
+ if (!lib) return;
463
+ const catalogBlock = await lib.catalogPrompt(this.input);
464
+ const preloaded = await lib.preload(this.input);
465
+ const blocks = [];
466
+ if (catalogBlock) blocks.push(catalogBlock);
467
+ for (const record of preloaded) if (record.body) blocks.push(record.body);
468
+ if (blocks.length === 0) return;
469
+ const prefix = blocks.join("\n\n");
470
+ const merged = this.systemPrompt ? `${prefix}\n\n${this.systemPrompt}` : prefix;
471
+ this.systemPrompt = merged;
472
+ const firstMessage = this.messages[0];
473
+ if (firstMessage?.role === "system") firstMessage.content = merged;
474
+ else this.messages.unshift({
475
+ role: "system",
476
+ content: merged
477
+ });
321
478
  }
322
479
  /**
323
480
  * Drive sequential trips up to `maxTrips`. Each trip may stop the loop
@@ -327,7 +484,7 @@ var Execution = class {
327
484
  * error so the caller can distinguish runaway tool loops from a real result.
328
485
  */
329
486
  async runTripLoop() {
330
- for (let tripIndex = 0; tripIndex < this.maxTrips; tripIndex++) {
487
+ for (let tripIndex = this.trips.length; tripIndex < this.maxTrips; tripIndex++) {
331
488
  if (this.options?.signal?.aborted) {
332
489
  this.error = this.makeCancelledError();
333
490
  return;
@@ -375,14 +532,11 @@ var Execution = class {
375
532
  this.trips.push(failedTrip);
376
533
  this.emit("agent.trip.completed", { trip: failedTrip });
377
534
  this.emit("agent.error", { error: this.error });
535
+ await this.checkpoint("failed");
378
536
  return "error";
379
537
  }
380
538
  if (response.usage.cost === void 0) response.usage.cost = computeCost(response.usage, this.config.model.pricing);
381
- this.usage.input += response.usage.input;
382
- this.usage.output += response.usage.output;
383
- this.usage.total += response.usage.total;
384
- if (response.usage.cachedTokens !== void 0) this.usage.cachedTokens = (this.usage.cachedTokens ?? 0) + response.usage.cachedTokens;
385
- this.usage.cost = accumulateCost(this.usage.cost, response.usage.cost);
539
+ mergeUsage(this.usage, response.usage);
386
540
  await this.fireUsageHook(tripIndex, response.usage);
387
541
  const isToolCallTrip = response.finishReason === "tool_calls" && response.toolCalls !== void 0 && response.toolCalls.length > 0;
388
542
  const tripToolCalls = [];
@@ -410,9 +564,10 @@ var Execution = class {
410
564
  };
411
565
  this.trips.push(trip);
412
566
  this.emit("agent.trip.completed", { trip });
567
+ await this.checkpoint("running");
413
568
  if (!isToolCallTrip) return "stop";
414
569
  return response.toolCalls.every((request) => {
415
- return (this.config.tools?.find((tool) => tool.name === request.name))?.mode === "silent";
570
+ return this.effectiveTools.find((tool) => tool.name === request.name)?.mode === "silent";
416
571
  }) ? "stop" : "continue";
417
572
  }
418
573
  /**
@@ -442,7 +597,7 @@ var Execution = class {
442
597
  async getModelResponse(tripIndex) {
443
598
  const callOptions = {
444
599
  ...this.config.modelOptions,
445
- tools: this.config.tools ?? [],
600
+ tools: this.effectiveTools,
446
601
  ...this.responseSchema ? { responseSchema: this.responseSchema } : {},
447
602
  ...this.options?.signal ? { signal: this.options.signal } : {}
448
603
  };
@@ -458,7 +613,7 @@ var Execution = class {
458
613
  const recoveredCalls = [];
459
614
  const guardConfig = this.resolveStreamingToolGuard();
460
615
  const guard = guardConfig ? new JsonStreamGuard({
461
- tools: this.config.tools ?? [],
616
+ tools: this.effectiveTools,
462
617
  maxBufferBytes: guardConfig.maxBufferBytes,
463
618
  onSafeDelta: (delta) => {
464
619
  content += delta;
@@ -527,7 +682,7 @@ var Execution = class {
527
682
  * an error). Never throws — always returns a `ToolCall` record.
528
683
  */
529
684
  async dispatchToolCall(toolCallRequest, tripIndex) {
530
- const registeredTool = this.config.tools?.find((tool) => tool.name === toolCallRequest.name);
685
+ const registeredTool = this.effectiveTools.find((tool) => tool.name === toolCallRequest.name);
531
686
  if (!registeredTool) {
532
687
  const error = new AgentExecutionError(`Tool not registered: ${toolCallRequest.name}`, { context: {
533
688
  toolName: toolCallRequest.name,
@@ -592,9 +747,15 @@ var Execution = class {
592
747
  },
593
748
  request: toolCallRequest
594
749
  };
750
+ const runSignal = this.options?.signal;
751
+ const dispatchToolCtx = runSignal ? {
752
+ artifacts: this.options?.toolCtx?.artifacts ?? {},
753
+ ...this.options?.toolCtx,
754
+ signal: runSignal
755
+ } : this.options?.toolCtx;
595
756
  let invokeResult;
596
757
  try {
597
- invokeResult = await runPipeline(this.middleware, "tool", toolContext, () => registeredTool.invoke(toolCallRequest.input, this.options?.toolCtx), this.logger);
758
+ invokeResult = await runPipeline(this.middleware, "tool", toolContext, () => registeredTool.invoke(toolCallRequest.input, dispatchToolCtx), this.logger);
598
759
  } catch (thrown) {
599
760
  const error = this.toAIError(thrown);
600
761
  const nowIso = (/* @__PURE__ */ new Date()).toISOString();
@@ -643,10 +804,7 @@ var Execution = class {
643
804
  ...toolCallRequest.recoveredFrom ? { recoveredFrom: toolCallRequest.recoveredFrom } : {}
644
805
  };
645
806
  this.toolCalls.push(record);
646
- this.usage.input += invokeResult.usage.input;
647
- this.usage.output += invokeResult.usage.output;
648
- this.usage.total += invokeResult.usage.total;
649
- this.usage.cost = accumulateCost(this.usage.cost, invokeResult.usage.cost);
807
+ mergeUsage(this.usage, invokeResult.usage);
650
808
  this.messages.push({
651
809
  role: "tool",
652
810
  toolCallId: toolCallRequest.id,
@@ -675,13 +833,20 @@ var Execution = class {
675
833
  * - `"failed"` — schema present, output text either failed JSON.parse
676
834
  * or failed `~standard.validate`. Repairable via `runRepairLoop`.
677
835
  * - `"success"` — parsed and validated; `this.data` populated.
836
+ *
837
+ * Under the judge-safe preset (`judge: true`) the JSON extraction is
838
+ * lenient — it tolerates fenced ` ```json ` blocks plus leading /
839
+ * trailing prose by slicing the first balanced object / array out of the
840
+ * response. Never throws regardless of preset: a parse / validation miss
841
+ * sets `this.error` and returns `"failed"`, leaving `this.data`
842
+ * undefined for the graceful-default path.
678
843
  */
679
844
  async parseOutput() {
680
845
  const schema = this.options?.output ?? this.config.output;
681
846
  if (!schema || this.error) return "skipped";
682
847
  const text = this.trips[this.trips.length - 1]?.output ?? "";
683
848
  if (!text) return "skipped";
684
- const payload = extractJsonPayload(text);
849
+ const payload = this.judgeConfig ? extractJsonLenient(text) : extractJsonPayload(text);
685
850
  const sentinel = Symbol("parse-failed");
686
851
  const parsed = safeJsonParse(payload, sentinel);
687
852
  if (parsed === sentinel) {
@@ -698,8 +863,22 @@ var Execution = class {
698
863
  return "success";
699
864
  }
700
865
  /**
866
+ * Resolve how many repair re-asks this run should perform after a parse
867
+ * failure. Per-call `options.repair` wins when explicitly set (preserving
868
+ * the existing surface). Otherwise the judge-safe preset supplies its
869
+ * default attempt count — so `judge: true` enables repair without the
870
+ * caller also having to pass `repair`. Returns `0` when neither applies,
871
+ * which leaves the historical "no repair unless asked" behavior intact.
872
+ */
873
+ resolveRepairAttempts() {
874
+ if (this.options?.repair) return this.options.repair.maxAttempts ?? 1;
875
+ if (this.judgeConfig) return this.judgeConfig.repairAttempts ?? 2;
876
+ return 0;
877
+ }
878
+ /**
701
879
  * Opt-in self-repair loop for `output` schema failures. Triggered only
702
- * when `options.repair` is set and `parseOutput()` returned `"failed"`.
880
+ * when repair attempts remain (`resolveRepairAttempts() > 0`) and
881
+ * `parseOutput()` returned `"failed"`.
703
882
  *
704
883
  * Each attempt:
705
884
  * 1. Pushes the bad assistant response into `this.messages` (so the
@@ -714,7 +893,7 @@ var Execution = class {
714
893
  * outcome (success or last failure) is what surfaces to the caller.
715
894
  */
716
895
  async runRepairLoop() {
717
- const maxAttempts = this.options?.repair?.maxAttempts ?? 1;
896
+ const maxAttempts = this.resolveRepairAttempts();
718
897
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
719
898
  if (this.trips.length >= this.maxTrips) return;
720
899
  const badResponse = this.trips[this.trips.length - 1]?.output ?? "";
@@ -764,6 +943,7 @@ var Execution = class {
764
943
  version: this.config.version,
765
944
  type: "agent",
766
945
  status,
946
+ ...this.error ? { error: this.error } : {},
767
947
  startedAt: this.startedAt.toISOString(),
768
948
  endedAt: endedAt.toISOString(),
769
949
  duration: performance.now() - this.start,
@@ -773,7 +953,13 @@ var Execution = class {
773
953
  name: this.config.model.name,
774
954
  provider: this.config.model.provider
775
955
  },
776
- trips: this.trips
956
+ trips: this.trips,
957
+ systemPrompt: this.systemPrompt,
958
+ ...this.promptName ? {
959
+ promptName: this.promptName,
960
+ promptVersion: this.promptVersion
961
+ } : {},
962
+ ...this.config.captureMessages ? { messages: this.captureMessages() } : {}
777
963
  };
778
964
  stampReportLineage(report, {
779
965
  rootRunId: this.runId,
@@ -789,6 +975,89 @@ var Execution = class {
789
975
  };
790
976
  }
791
977
  /**
978
+ * Map the run's terminal outcome to the persisted snapshot status.
979
+ * A cancelled error reads as `"cancelled"`, any other error as
980
+ * `"failed"`, otherwise `"completed"`. Mirrors the report-status
981
+ * mapping in {@link buildResult}.
982
+ */
983
+ resolveSnapshotStatus() {
984
+ if (!this.error) return "completed";
985
+ return this.error instanceof AgentCancelledError ? "cancelled" : "failed";
986
+ }
987
+ /**
988
+ * Build and persist an {@link AgentSnapshot} from the current
989
+ * accumulators. The per-trip and terminal checkpoints both route
990
+ * through here. Reuses {@link captureMessages} to normalize the live
991
+ * `Message[]` into JSON-safe form so the snapshot round-trips through
992
+ * any store backend.
993
+ *
994
+ * No-op (returns immediately) when `durable` is absent — the common
995
+ * non-durable path stays free. A failed persist is logged and
996
+ * swallowed (never aborts the run), matching the supervisor / workflow
997
+ * checkpoint policy.
998
+ */
999
+ async checkpoint(status) {
1000
+ if (!this.config.durable) return;
1001
+ const outcome = await persistAgentSnapshot({
1002
+ durable: this.config.durable,
1003
+ runId: this.runId,
1004
+ agentName: this.config.name ?? this.config.model.name,
1005
+ signature: this.config.signature,
1006
+ version: this.config.version,
1007
+ input: this.input,
1008
+ systemPrompt: this.systemPrompt,
1009
+ responseSchema: this.responseSchema,
1010
+ promptName: this.promptName,
1011
+ promptVersion: this.promptVersion,
1012
+ messages: this.captureMessages(),
1013
+ trips: this.trips,
1014
+ toolCalls: this.toolCalls,
1015
+ usage: this.usage,
1016
+ status,
1017
+ startedAt: this.startedAt.toISOString()
1018
+ });
1019
+ if (!outcome.ok) this.logger.warn(LOG_MODULE, "snapshot.persist.failed", "durable snapshot persist failed", {
1020
+ runId: this.runId,
1021
+ status,
1022
+ error: outcome.error instanceof Error ? outcome.error.message : String(outcome.error)
1023
+ });
1024
+ }
1025
+ /**
1026
+ * Rebuild the final {@link AgentResult} from a COMPLETED snapshot
1027
+ * WITHOUT re-running anything. Used by the completed-run resume
1028
+ * short-circuit: the persisted trips / tool calls / usage are the
1029
+ * authoritative outcome, so a resume of a settled run re-returns that
1030
+ * outcome idempotently. Re-derives `this.data` from the final trip
1031
+ * output against the schema (cheap, no model call) so the rebuilt
1032
+ * result carries the same structured payload the original produced.
1033
+ *
1034
+ * Only reached for a `completed` snapshot — `failed` / `cancelled`
1035
+ * snapshots re-enter the trip loop to retry the remaining work instead.
1036
+ */
1037
+ async rebuildResumedResult(_snapshot) {
1038
+ await this.parseOutput();
1039
+ return this.buildResult();
1040
+ }
1041
+ /**
1042
+ * Normalize the accumulated runtime `Message[]` into the JSON-safe
1043
+ * {@link CapturedMessage}[] persisted on `AgentReport.messages` (F2).
1044
+ * Flattens `ContentPart[]` content to a string, and forwards
1045
+ * `toolCalls` (assistant turns) / `toolCallId` (tool-result turns)
1046
+ * only when present so the captured shape stays lean. Called only when
1047
+ * `captureMessages` is enabled.
1048
+ */
1049
+ captureMessages() {
1050
+ return this.messages.map((message) => {
1051
+ const captured = {
1052
+ role: message.role,
1053
+ content: typeof message.content === "string" ? message.content : JSON.stringify(message.content)
1054
+ };
1055
+ if (message.toolCalls !== void 0) captured.toolCalls = message.toolCalls;
1056
+ if (message.toolCallId !== void 0) captured.toolCallId = message.toolCallId;
1057
+ return captured;
1058
+ });
1059
+ }
1060
+ /**
792
1061
  * Normalize any thrown value into an `AIError`. `AIError` instances
793
1062
  * pass through untouched; provider-adapter SDK errors are caught by
794
1063
  * the adapter and already arrive typed, so this branch mainly
@@ -832,12 +1101,13 @@ var Execution = class {
832
1101
  rootRunId: this.runId
833
1102
  };
834
1103
  this.logEvent(event, fullPayload);
1104
+ const onError = (error) => this.surfaceHandlerError(event, error);
835
1105
  const factoryHandler = this.config.on?.[event];
836
- if (factoryHandler) safeCall(factoryHandler, fullPayload);
1106
+ if (factoryHandler) safeCall(factoryHandler, fullPayload, onError);
837
1107
  const bucket = this.instanceHandlers?.get(event);
838
- if (bucket) for (const handler of bucket) safeCall(handler, fullPayload);
1108
+ if (bucket) for (const handler of bucket) safeCall(handler, fullPayload, onError);
839
1109
  const perCallHandler = this.options?.on?.[event];
840
- if (perCallHandler) safeCall(perCallHandler, fullPayload);
1110
+ if (perCallHandler) safeCall(perCallHandler, fullPayload, onError);
841
1111
  if (this.streamController) {
842
1112
  const body = this.toStreamEvent(event, fullPayload);
843
1113
  if (body) this.streamController.push({
@@ -848,6 +1118,23 @@ var Execution = class {
848
1118
  }
849
1119
  }
850
1120
  /**
1121
+ * Surface an isolated event-handler failure (C5). A throwing user
1122
+ * handler never crashes the agent — that isolation is preserved — but
1123
+ * total silence is the wrong default: a broken `on` handler would
1124
+ * otherwise disappear from production with no signal. Routed to the
1125
+ * structured logger (matching the `onUsage` / `onComplete` policy) and
1126
+ * warned at most once per event type so a hot event can't spam the log.
1127
+ */
1128
+ surfaceHandlerError(event, error) {
1129
+ if (this.warnedHandlerEvents.has(event)) return;
1130
+ this.warnedHandlerEvents.add(event);
1131
+ this.logger.warn(LOG_MODULE, "event.handler.error", "an event handler threw and was isolated", {
1132
+ runId: this.runId,
1133
+ event,
1134
+ error: error instanceof Error ? error.message : String(error)
1135
+ });
1136
+ }
1137
+ /**
851
1138
  * Emit a structured log line for a lifecycle event. The action
852
1139
  * string mirrors the event name with the `agent.` prefix stripped
853
1140
  * (`agent.trip.started` → `trip.started`) so log grep filters and
@@ -953,18 +1240,23 @@ function stableStringify(value) {
953
1240
  }
954
1241
  /**
955
1242
  * Invoke a user-supplied event handler without letting exceptions
956
- * escape the agent. Thrown errors are swallowed structured logging
957
- * attaches here in Phase 0.5 so operators still see the failure.
1243
+ * escape the agent. A throw is isolated (it never crashes the agent)
1244
+ * but no longer silent: the optional `onError` surfaces it the agent
1245
+ * routes it to its structured logger, matching the swallow-and-log
1246
+ * policy of the `onUsage` / `onComplete` hooks (C5).
958
1247
  */
959
- function safeCall(handler, payload) {
1248
+ function safeCall(handler, payload, onError) {
960
1249
  try {
961
1250
  handler(payload);
962
- } catch {}
1251
+ } catch (error) {
1252
+ onError?.(error);
1253
+ }
963
1254
  }
964
1255
  /**
965
1256
  * Resolve a tool's `action` declaration into a plain string for
966
1257
  * inclusion in `ToolEventMeta`. Static strings pass through;
967
- * function-shaped actions are invoked with the validated input.
1258
+ * function-shaped actions are invoked with the model's raw,
1259
+ * pre-validation input (before `execute`'s schema validation runs).
968
1260
  *
969
1261
  * Defensive: if the user's callback throws, swallow and return
970
1262
  * `undefined` rather than crashing the agent — UI strings are not