@warlock.js/core 4.7.0 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/esm/config/config-getter.mjs +5 -5
  3. package/esm/config/config-getter.mjs.map +1 -1
  4. package/esm/config/config-loader.mjs +2 -2
  5. package/esm/config/config-loader.mjs.map +1 -1
  6. package/esm/connectors/access-connector.mjs +2 -2
  7. package/esm/connectors/access-connector.mjs.map +1 -1
  8. package/esm/connectors/ai-connector.mjs +3 -3
  9. package/esm/connectors/ai-connector.mjs.map +1 -1
  10. package/esm/connectors/cache-connector.mjs +2 -2
  11. package/esm/connectors/cache-connector.mjs.map +1 -1
  12. package/esm/connectors/database-connector.mjs +2 -2
  13. package/esm/connectors/database-connector.mjs.map +1 -1
  14. package/esm/connectors/herald-connector.mjs +2 -2
  15. package/esm/connectors/herald-connector.mjs.map +1 -1
  16. package/esm/connectors/http-connector.mjs +7 -7
  17. package/esm/connectors/http-connector.mjs.map +1 -1
  18. package/esm/connectors/logger-connector.mjs +2 -2
  19. package/esm/connectors/logger-connector.mjs.map +1 -1
  20. package/esm/connectors/mail-connector.mjs +2 -2
  21. package/esm/connectors/mail-connector.mjs.map +1 -1
  22. package/esm/connectors/notifications-connector.mjs +2 -2
  23. package/esm/connectors/notifications-connector.mjs.map +1 -1
  24. package/esm/connectors/socket-connector.mjs +3 -3
  25. package/esm/connectors/socket-connector.mjs.map +1 -1
  26. package/esm/http/config.mjs +2 -2
  27. package/esm/http/config.mjs.map +1 -1
  28. package/esm/http/createHttpApplication.mjs +2 -2
  29. package/esm/http/createHttpApplication.mjs.map +1 -1
  30. package/esm/http/middleware/idempotency.middleware.mjs +5 -5
  31. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  32. package/esm/http/middleware/inject-request-context.mjs +2 -2
  33. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  34. package/esm/http/middleware/maintenance.middleware.mjs +4 -4
  35. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  36. package/esm/http/plugins.mjs +9 -9
  37. package/esm/http/plugins.mjs.map +1 -1
  38. package/esm/http/response.mjs +5 -5
  39. package/esm/http/response.mjs.map +1 -1
  40. package/esm/http/server.mjs +4 -4
  41. package/esm/http/server.mjs.map +1 -1
  42. package/esm/utils/paths.mjs +2 -2
  43. package/esm/utils/paths.mjs.map +1 -1
  44. package/esm/validation/validateAll.mjs +2 -2
  45. package/esm/validation/validateAll.mjs.map +1 -1
  46. package/package.json +12 -9
  47. package/esm/ai/src/agent/agent-input-builder.mjs +0 -133
  48. package/esm/ai/src/agent/agent-input-builder.mjs.map +0 -1
  49. package/esm/ai/src/agent/agent-log-event.mjs +0 -101
  50. package/esm/ai/src/agent/agent-log-event.mjs.map +0 -1
  51. package/esm/ai/src/agent/agent-stream.mjs +0 -82
  52. package/esm/ai/src/agent/agent-stream.mjs.map +0 -1
  53. package/esm/ai/src/agent/agent-to-stream-event.mjs +0 -86
  54. package/esm/ai/src/agent/agent-to-stream-event.mjs.map +0 -1
  55. package/esm/ai/src/agent/agent.mjs +0 -1276
  56. package/esm/ai/src/agent/agent.mjs.map +0 -1
  57. package/esm/ai/src/agent/index.mjs +0 -5
  58. package/esm/ai/src/agent/json-stream-guard.mjs +0 -400
  59. package/esm/ai/src/agent/json-stream-guard.mjs.map +0 -1
  60. package/esm/ai/src/agent/signature.mjs +0 -57
  61. package/esm/ai/src/agent/signature.mjs.map +0 -1
  62. package/esm/ai/src/agent/snapshot.mjs +0 -101
  63. package/esm/ai/src/agent/snapshot.mjs.map +0 -1
  64. package/esm/ai/src/agent/spawn-sub-agent.mjs +0 -68
  65. package/esm/ai/src/agent/spawn-sub-agent.mjs.map +0 -1
  66. package/esm/ai/src/ai.mjs +0 -191
  67. package/esm/ai/src/ai.mjs.map +0 -1
  68. package/esm/ai/src/batch/batch.mjs +0 -198
  69. package/esm/ai/src/batch/batch.mjs.map +0 -1
  70. package/esm/ai/src/batch/index.mjs +0 -3
  71. package/esm/ai/src/batch/run-batch-item.mjs +0 -100
  72. package/esm/ai/src/batch/run-batch-item.mjs.map +0 -1
  73. package/esm/ai/src/batch/run-with-concurrency.mjs +0 -39
  74. package/esm/ai/src/batch/run-with-concurrency.mjs.map +0 -1
  75. package/esm/ai/src/checkpoint/memory.mjs +0 -0
  76. package/esm/ai/src/checkpoint/memory.mjs.map +0 -1
  77. package/esm/ai/src/checkpoint/pg.mjs +0 -265
  78. package/esm/ai/src/checkpoint/pg.mjs.map +0 -1
  79. package/esm/ai/src/checkpoint/redis.mjs +0 -200
  80. package/esm/ai/src/checkpoint/redis.mjs.map +0 -1
  81. package/esm/ai/src/config.mjs +0 -59
  82. package/esm/ai/src/config.mjs.map +0 -1
  83. package/esm/ai/src/contracts/end.type.mjs +0 -47
  84. package/esm/ai/src/contracts/end.type.mjs.map +0 -1
  85. package/esm/ai/src/errors/agent-cancelled-error.mjs +0 -43
  86. package/esm/ai/src/errors/agent-cancelled-error.mjs.map +0 -1
  87. package/esm/ai/src/errors/agent-drift-error.mjs +0 -31
  88. package/esm/ai/src/errors/agent-drift-error.mjs.map +0 -1
  89. package/esm/ai/src/errors/agent-execution-error.mjs +0 -35
  90. package/esm/ai/src/errors/agent-execution-error.mjs.map +0 -1
  91. package/esm/ai/src/errors/agent-max-trips-error.mjs +0 -41
  92. package/esm/ai/src/errors/agent-max-trips-error.mjs.map +0 -1
  93. package/esm/ai/src/errors/ai-error.mjs +0 -68
  94. package/esm/ai/src/errors/ai-error.mjs.map +0 -1
  95. package/esm/ai/src/errors/budget-exceeded-error.mjs +0 -31
  96. package/esm/ai/src/errors/budget-exceeded-error.mjs.map +0 -1
  97. package/esm/ai/src/errors/content-filter-error.mjs +0 -28
  98. package/esm/ai/src/errors/content-filter-error.mjs.map +0 -1
  99. package/esm/ai/src/errors/context-length-exceeded-error.mjs +0 -31
  100. package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +0 -1
  101. package/esm/ai/src/errors/guardrail-violation-error.mjs +0 -41
  102. package/esm/ai/src/errors/guardrail-violation-error.mjs.map +0 -1
  103. package/esm/ai/src/errors/index.mjs +0 -40
  104. package/esm/ai/src/errors/invalid-request-error.mjs +0 -31
  105. package/esm/ai/src/errors/invalid-request-error.mjs.map +0 -1
  106. package/esm/ai/src/errors/max-iterations-error.mjs +0 -32
  107. package/esm/ai/src/errors/max-iterations-error.mjs.map +0 -1
  108. package/esm/ai/src/errors/max-steps-exceeded-error.mjs +0 -21
  109. package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +0 -1
  110. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +0 -31
  111. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +0 -1
  112. package/esm/ai/src/errors/orchestrator-config-error.mjs +0 -30
  113. package/esm/ai/src/errors/orchestrator-config-error.mjs.map +0 -1
  114. package/esm/ai/src/errors/orchestrator-drift-error.mjs +0 -37
  115. package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +0 -1
  116. package/esm/ai/src/errors/orchestrator-failed-error.mjs +0 -36
  117. package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +0 -1
  118. package/esm/ai/src/errors/outbound-policy-error.mjs +0 -32
  119. package/esm/ai/src/errors/outbound-policy-error.mjs.map +0 -1
  120. package/esm/ai/src/errors/planner-cancelled-error.mjs +0 -29
  121. package/esm/ai/src/errors/planner-cancelled-error.mjs.map +0 -1
  122. package/esm/ai/src/errors/planner-drift-error.mjs +0 -33
  123. package/esm/ai/src/errors/planner-drift-error.mjs.map +0 -1
  124. package/esm/ai/src/errors/planner-failed-error.mjs +0 -37
  125. package/esm/ai/src/errors/planner-failed-error.mjs.map +0 -1
  126. package/esm/ai/src/errors/planner-plan-invalid-error.mjs +0 -25
  127. package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +0 -1
  128. package/esm/ai/src/errors/prompt-refinement-error.mjs +0 -27
  129. package/esm/ai/src/errors/prompt-refinement-error.mjs.map +0 -1
  130. package/esm/ai/src/errors/provider-auth-error.mjs +0 -26
  131. package/esm/ai/src/errors/provider-auth-error.mjs.map +0 -1
  132. package/esm/ai/src/errors/provider-error.mjs +0 -42
  133. package/esm/ai/src/errors/provider-error.mjs.map +0 -1
  134. package/esm/ai/src/errors/provider-rate-limit-error.mjs +0 -31
  135. package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +0 -1
  136. package/esm/ai/src/errors/provider-timeout-error.mjs +0 -26
  137. package/esm/ai/src/errors/provider-timeout-error.mjs.map +0 -1
  138. package/esm/ai/src/errors/quota-exceeded-error.mjs +0 -40
  139. package/esm/ai/src/errors/quota-exceeded-error.mjs.map +0 -1
  140. package/esm/ai/src/errors/routing-error.mjs +0 -23
  141. package/esm/ai/src/errors/routing-error.mjs.map +0 -1
  142. package/esm/ai/src/errors/schema-validation-error.mjs +0 -37
  143. package/esm/ai/src/errors/schema-validation-error.mjs.map +0 -1
  144. package/esm/ai/src/errors/step-failed-error.mjs +0 -19
  145. package/esm/ai/src/errors/step-failed-error.mjs.map +0 -1
  146. package/esm/ai/src/errors/supervisor-cancelled-error.mjs +0 -29
  147. package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +0 -1
  148. package/esm/ai/src/errors/supervisor-drift-error.mjs +0 -30
  149. package/esm/ai/src/errors/supervisor-drift-error.mjs.map +0 -1
  150. package/esm/ai/src/errors/supervisor-failed-error.mjs +0 -43
  151. package/esm/ai/src/errors/supervisor-failed-error.mjs.map +0 -1
  152. package/esm/ai/src/errors/supervisor-routing-error.mjs +0 -39
  153. package/esm/ai/src/errors/supervisor-routing-error.mjs.map +0 -1
  154. package/esm/ai/src/errors/tool-execution-error.mjs +0 -32
  155. package/esm/ai/src/errors/tool-execution-error.mjs.map +0 -1
  156. package/esm/ai/src/errors/workflow-cancelled-error.mjs +0 -23
  157. package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +0 -1
  158. package/esm/ai/src/errors/workflow-drift-error.mjs +0 -24
  159. package/esm/ai/src/errors/workflow-drift-error.mjs.map +0 -1
  160. package/esm/ai/src/errors/workflow-error.mjs +0 -18
  161. package/esm/ai/src/errors/workflow-error.mjs.map +0 -1
  162. package/esm/ai/src/eval/dataset.mjs +0 -112
  163. package/esm/ai/src/eval/dataset.mjs.map +0 -1
  164. package/esm/ai/src/eval/eval-runner.mjs +0 -135
  165. package/esm/ai/src/eval/eval-runner.mjs.map +0 -1
  166. package/esm/ai/src/eval/index.mjs +0 -48
  167. package/esm/ai/src/eval/index.mjs.map +0 -1
  168. package/esm/ai/src/eval/judge-scorer.mjs +0 -87
  169. package/esm/ai/src/eval/judge-scorer.mjs.map +0 -1
  170. package/esm/ai/src/eval/regression.mjs +0 -51
  171. package/esm/ai/src/eval/regression.mjs.map +0 -1
  172. package/esm/ai/src/eval/report-json.mjs +0 -33
  173. package/esm/ai/src/eval/report-json.mjs.map +0 -1
  174. package/esm/ai/src/eval/report-junit.mjs +0 -60
  175. package/esm/ai/src/eval/report-junit.mjs.map +0 -1
  176. package/esm/ai/src/eval/scorers.mjs +0 -101
  177. package/esm/ai/src/eval/scorers.mjs.map +0 -1
  178. package/esm/ai/src/guard/detectors/index.mjs +0 -6
  179. package/esm/ai/src/guard/detectors/injection.mjs +0 -254
  180. package/esm/ai/src/guard/detectors/injection.mjs.map +0 -1
  181. package/esm/ai/src/guard/detectors/moderation.mjs +0 -134
  182. package/esm/ai/src/guard/detectors/moderation.mjs.map +0 -1
  183. package/esm/ai/src/guard/detectors/pii.mjs +0 -199
  184. package/esm/ai/src/guard/detectors/pii.mjs.map +0 -1
  185. package/esm/ai/src/guard/detectors/topic.mjs +0 -99
  186. package/esm/ai/src/guard/detectors/topic.mjs.map +0 -1
  187. package/esm/ai/src/guard/errors.mjs +0 -18
  188. package/esm/ai/src/guard/errors.mjs.map +0 -1
  189. package/esm/ai/src/guard/guard.mjs +0 -209
  190. package/esm/ai/src/guard/guard.mjs.map +0 -1
  191. package/esm/ai/src/guard/guardrail.mjs +0 -22
  192. package/esm/ai/src/guard/guardrail.mjs.map +0 -1
  193. package/esm/ai/src/human/errors.mjs +0 -60
  194. package/esm/ai/src/human/errors.mjs.map +0 -1
  195. package/esm/ai/src/human/human-approval.mjs +0 -170
  196. package/esm/ai/src/human/human-approval.mjs.map +0 -1
  197. package/esm/ai/src/human/policy.mjs +0 -67
  198. package/esm/ai/src/human/policy.mjs.map +0 -1
  199. package/esm/ai/src/human/register.mjs +0 -37
  200. package/esm/ai/src/human/register.mjs.map +0 -1
  201. package/esm/ai/src/human/resume-seed.mjs +0 -53
  202. package/esm/ai/src/human/resume-seed.mjs.map +0 -1
  203. package/esm/ai/src/human/resume.mjs +0 -121
  204. package/esm/ai/src/human/resume.mjs.map +0 -1
  205. package/esm/ai/src/human/stores/index.mjs +0 -5
  206. package/esm/ai/src/human/stores/memory.mjs +0 -91
  207. package/esm/ai/src/human/stores/memory.mjs.map +0 -1
  208. package/esm/ai/src/human/stores/pg.mjs +0 -220
  209. package/esm/ai/src/human/stores/pg.mjs.map +0 -1
  210. package/esm/ai/src/human/stores/redis.mjs +0 -201
  211. package/esm/ai/src/human/stores/redis.mjs.map +0 -1
  212. package/esm/ai/src/image/image-cost.mjs +0 -55
  213. package/esm/ai/src/image/image-cost.mjs.map +0 -1
  214. package/esm/ai/src/image/image.mjs +0 -112
  215. package/esm/ai/src/image/image.mjs.map +0 -1
  216. package/esm/ai/src/image/index.mjs +0 -4
  217. package/esm/ai/src/index.mjs +0 -196
  218. package/esm/ai/src/memory/derive-id.mjs +0 -24
  219. package/esm/ai/src/memory/derive-id.mjs.map +0 -1
  220. package/esm/ai/src/memory/episodic-memory.mjs +0 -106
  221. package/esm/ai/src/memory/episodic-memory.mjs.map +0 -1
  222. package/esm/ai/src/memory/memory.mjs +0 -166
  223. package/esm/ai/src/memory/memory.mjs.map +0 -1
  224. package/esm/ai/src/memory/procedural-memory.mjs +0 -103
  225. package/esm/ai/src/memory/procedural-memory.mjs.map +0 -1
  226. package/esm/ai/src/memory/semantic-memory.mjs +0 -80
  227. package/esm/ai/src/memory/semantic-memory.mjs.map +0 -1
  228. package/esm/ai/src/memory/working-memory.mjs +0 -62
  229. package/esm/ai/src/memory/working-memory.mjs.map +0 -1
  230. package/esm/ai/src/middleware/builtins/budget.mjs +0 -219
  231. package/esm/ai/src/middleware/builtins/budget.mjs.map +0 -1
  232. package/esm/ai/src/middleware/builtins/guardrail.mjs +0 -76
  233. package/esm/ai/src/middleware/builtins/guardrail.mjs.map +0 -1
  234. package/esm/ai/src/middleware/builtins/semantic-cache.mjs +0 -149
  235. package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +0 -1
  236. package/esm/ai/src/middleware/helpers/compose.mjs +0 -52
  237. package/esm/ai/src/middleware/helpers/compose.mjs.map +0 -1
  238. package/esm/ai/src/middleware/helpers/for-tool.mjs +0 -80
  239. package/esm/ai/src/middleware/helpers/for-tool.mjs.map +0 -1
  240. package/esm/ai/src/middleware/index.mjs +0 -10
  241. package/esm/ai/src/middleware/pipeline.mjs +0 -100
  242. package/esm/ai/src/middleware/pipeline.mjs.map +0 -1
  243. package/esm/ai/src/middleware/utils/extract-user-text.mjs +0 -47
  244. package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +0 -1
  245. package/esm/ai/src/middleware/utils/namespaced-state.mjs +0 -60
  246. package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +0 -1
  247. package/esm/ai/src/mock/index.mjs +0 -4
  248. package/esm/ai/src/mock/mock-agent.mjs +0 -3
  249. package/esm/ai/src/mock/mock-router.mjs +0 -58
  250. package/esm/ai/src/mock/mock-router.mjs.map +0 -1
  251. package/esm/ai/src/model/fallback-model.mjs +0 -218
  252. package/esm/ai/src/model/fallback-model.mjs.map +0 -1
  253. package/esm/ai/src/model/index.mjs +0 -3
  254. package/esm/ai/src/object-stream/index.mjs +0 -4
  255. package/esm/ai/src/object-stream/parse-partial-json.mjs +0 -78
  256. package/esm/ai/src/object-stream/parse-partial-json.mjs.map +0 -1
  257. package/esm/ai/src/object-stream/stream-object.mjs +0 -97
  258. package/esm/ai/src/object-stream/stream-object.mjs.map +0 -1
  259. package/esm/ai/src/observe/index.mjs +0 -4
  260. package/esm/ai/src/observe/observer-registry.mjs +0 -35
  261. package/esm/ai/src/observe/observer-registry.mjs.map +0 -1
  262. package/esm/ai/src/observe/resolve-observers.mjs +0 -73
  263. package/esm/ai/src/observe/resolve-observers.mjs.map +0 -1
  264. package/esm/ai/src/orchestrator/as-tool.mjs +0 -98
  265. package/esm/ai/src/orchestrator/as-tool.mjs.map +0 -1
  266. package/esm/ai/src/orchestrator/checkpoint.mjs +0 -75
  267. package/esm/ai/src/orchestrator/checkpoint.mjs.map +0 -1
  268. package/esm/ai/src/orchestrator/commands.mjs +0 -34
  269. package/esm/ai/src/orchestrator/commands.mjs.map +0 -1
  270. package/esm/ai/src/orchestrator/compaction.mjs +0 -206
  271. package/esm/ai/src/orchestrator/compaction.mjs.map +0 -1
  272. package/esm/ai/src/orchestrator/dispatch.mjs +0 -171
  273. package/esm/ai/src/orchestrator/dispatch.mjs.map +0 -1
  274. package/esm/ai/src/orchestrator/emitter.mjs +0 -85
  275. package/esm/ai/src/orchestrator/emitter.mjs.map +0 -1
  276. package/esm/ai/src/orchestrator/execution.mjs +0 -395
  277. package/esm/ai/src/orchestrator/execution.mjs.map +0 -1
  278. package/esm/ai/src/orchestrator/index.mjs +0 -11
  279. package/esm/ai/src/orchestrator/load.mjs +0 -49
  280. package/esm/ai/src/orchestrator/load.mjs.map +0 -1
  281. package/esm/ai/src/orchestrator/lock.mjs +0 -75
  282. package/esm/ai/src/orchestrator/lock.mjs.map +0 -1
  283. package/esm/ai/src/orchestrator/memory.mjs +0 -141
  284. package/esm/ai/src/orchestrator/memory.mjs.map +0 -1
  285. package/esm/ai/src/orchestrator/orchestrator-stream.mjs +0 -98
  286. package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +0 -1
  287. package/esm/ai/src/orchestrator/orchestrator.mjs +0 -206
  288. package/esm/ai/src/orchestrator/orchestrator.mjs.map +0 -1
  289. package/esm/ai/src/orchestrator/resume.mjs +0 -74
  290. package/esm/ai/src/orchestrator/resume.mjs.map +0 -1
  291. package/esm/ai/src/orchestrator/session-lock.mjs +0 -83
  292. package/esm/ai/src/orchestrator/session-lock.mjs.map +0 -1
  293. package/esm/ai/src/orchestrator/signature.mjs +0 -120
  294. package/esm/ai/src/orchestrator/signature.mjs.map +0 -1
  295. package/esm/ai/src/orchestrator/window.mjs +0 -56
  296. package/esm/ai/src/orchestrator/window.mjs.map +0 -1
  297. package/esm/ai/src/planner/dag-scheduler.mjs +0 -97
  298. package/esm/ai/src/planner/dag-scheduler.mjs.map +0 -1
  299. package/esm/ai/src/planner/index.mjs +0 -6
  300. package/esm/ai/src/planner/plan-prompt.mjs +0 -31
  301. package/esm/ai/src/planner/plan-prompt.mjs.map +0 -1
  302. package/esm/ai/src/planner/plan-schema.mjs +0 -120
  303. package/esm/ai/src/planner/plan-schema.mjs.map +0 -1
  304. package/esm/ai/src/planner/planner-run.mjs +0 -769
  305. package/esm/ai/src/planner/planner-run.mjs.map +0 -1
  306. package/esm/ai/src/planner/planner.mjs +0 -144
  307. package/esm/ai/src/planner/planner.mjs.map +0 -1
  308. package/esm/ai/src/planner/signature.mjs +0 -27
  309. package/esm/ai/src/planner/signature.mjs.map +0 -1
  310. package/esm/ai/src/planner/snapshot.mjs +0 -95
  311. package/esm/ai/src/planner/snapshot.mjs.map +0 -1
  312. package/esm/ai/src/prompt/errors.mjs +0 -73
  313. package/esm/ai/src/prompt/errors.mjs.map +0 -1
  314. package/esm/ai/src/prompt/index.mjs +0 -4
  315. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +0 -104
  316. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +0 -1
  317. package/esm/ai/src/prompt/prompt-validate.mjs +0 -170
  318. package/esm/ai/src/prompt/prompt-validate.mjs.map +0 -1
  319. package/esm/ai/src/prompt/prompt.mjs +0 -218
  320. package/esm/ai/src/prompt/prompt.mjs.map +0 -1
  321. package/esm/ai/src/prompts/index.mjs +0 -3
  322. package/esm/ai/src/prompts/prompts-manager.mjs +0 -410
  323. package/esm/ai/src/prompts/prompts-manager.mjs.map +0 -1
  324. package/esm/ai/src/prompts/prompts-validate.mjs +0 -0
  325. package/esm/ai/src/prompts/prompts-validate.mjs.map +0 -1
  326. package/esm/ai/src/rag/as-tool.mjs +0 -48
  327. package/esm/ai/src/rag/as-tool.mjs.map +0 -1
  328. package/esm/ai/src/rag/chunk/chunk.mjs +0 -44
  329. package/esm/ai/src/rag/chunk/chunk.mjs.map +0 -1
  330. package/esm/ai/src/rag/chunk/fixed.mjs +0 -32
  331. package/esm/ai/src/rag/chunk/fixed.mjs.map +0 -1
  332. package/esm/ai/src/rag/chunk/markdown.mjs +0 -75
  333. package/esm/ai/src/rag/chunk/markdown.mjs.map +0 -1
  334. package/esm/ai/src/rag/chunk/recursive.mjs +0 -132
  335. package/esm/ai/src/rag/chunk/recursive.mjs.map +0 -1
  336. package/esm/ai/src/rag/chunk/sentence.mjs +0 -73
  337. package/esm/ai/src/rag/chunk/sentence.mjs.map +0 -1
  338. package/esm/ai/src/rag/hybrid/bm25.mjs +0 -51
  339. package/esm/ai/src/rag/hybrid/bm25.mjs.map +0 -1
  340. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs +0 -29
  341. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs.map +0 -1
  342. package/esm/ai/src/rag/hybrid/rrf.mjs +0 -30
  343. package/esm/ai/src/rag/hybrid/rrf.mjs.map +0 -1
  344. package/esm/ai/src/rag/index.mjs +0 -18
  345. package/esm/ai/src/rag/loaders/errors.mjs +0 -25
  346. package/esm/ai/src/rag/loaders/errors.mjs.map +0 -1
  347. package/esm/ai/src/rag/loaders/index.mjs +0 -7
  348. package/esm/ai/src/rag/loaders/load-html.mjs +0 -138
  349. package/esm/ai/src/rag/loaders/load-html.mjs.map +0 -1
  350. package/esm/ai/src/rag/loaders/load-pdf.mjs +0 -150
  351. package/esm/ai/src/rag/loaders/load-pdf.mjs.map +0 -1
  352. package/esm/ai/src/rag/loaders/load-text.mjs +0 -60
  353. package/esm/ai/src/rag/loaders/load-text.mjs.map +0 -1
  354. package/esm/ai/src/rag/loaders/load-web.mjs +0 -89
  355. package/esm/ai/src/rag/loaders/load-web.mjs.map +0 -1
  356. package/esm/ai/src/rag/rag.mjs +0 -126
  357. package/esm/ai/src/rag/rag.mjs.map +0 -1
  358. package/esm/ai/src/rag/rerank/keyword-reranker.mjs +0 -58
  359. package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +0 -1
  360. package/esm/ai/src/rag/rerank/llm-reranker.mjs +0 -85
  361. package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +0 -1
  362. package/esm/ai/src/rag/retrieve.mjs +0 -68
  363. package/esm/ai/src/rag/retrieve.mjs.map +0 -1
  364. package/esm/ai/src/rag/store/cache-vector-store.mjs +0 -48
  365. package/esm/ai/src/rag/store/cache-vector-store.mjs.map +0 -1
  366. package/esm/ai/src/rag/store/pg-vector-store.mjs +0 -328
  367. package/esm/ai/src/rag/store/pg-vector-store.mjs.map +0 -1
  368. package/esm/ai/src/rag/transforms/multi-query.mjs +0 -41
  369. package/esm/ai/src/rag/transforms/multi-query.mjs.map +0 -1
  370. package/esm/ai/src/security/index.mjs +0 -5
  371. package/esm/ai/src/security/outbound-policy.mjs +0 -187
  372. package/esm/ai/src/security/outbound-policy.mjs.map +0 -1
  373. package/esm/ai/src/security/private-ip.mjs +0 -48
  374. package/esm/ai/src/security/private-ip.mjs.map +0 -1
  375. package/esm/ai/src/security/redact.mjs +0 -60
  376. package/esm/ai/src/security/redact.mjs.map +0 -1
  377. package/esm/ai/src/serve/serve.mjs +0 -90
  378. package/esm/ai/src/serve/serve.mjs.map +0 -1
  379. package/esm/ai/src/serve/sse.mjs +0 -25
  380. package/esm/ai/src/serve/sse.mjs.map +0 -1
  381. package/esm/ai/src/serve/stream-to-sse.mjs +0 -37
  382. package/esm/ai/src/serve/stream-to-sse.mjs.map +0 -1
  383. package/esm/ai/src/skills/catalog.mjs +0 -140
  384. package/esm/ai/src/skills/catalog.mjs.map +0 -1
  385. package/esm/ai/src/skills/index.mjs +0 -11
  386. package/esm/ai/src/skills/load-skill-tool.mjs +0 -65
  387. package/esm/ai/src/skills/load-skill-tool.mjs.map +0 -1
  388. package/esm/ai/src/skills/save-skill-tool.mjs +0 -65
  389. package/esm/ai/src/skills/save-skill-tool.mjs.map +0 -1
  390. package/esm/ai/src/skills/skills.mjs +0 -109
  391. package/esm/ai/src/skills/skills.mjs.map +0 -1
  392. package/esm/ai/src/skills/sources/directory-source.mjs +0 -108
  393. package/esm/ai/src/skills/sources/directory-source.mjs.map +0 -1
  394. package/esm/ai/src/skills/sources/index.mjs +0 -27
  395. package/esm/ai/src/skills/sources/index.mjs.map +0 -1
  396. package/esm/ai/src/skills/sources/parse-frontmatter.mjs +0 -46
  397. package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +0 -1
  398. package/esm/ai/src/skills/sources/store-source.mjs +0 -15
  399. package/esm/ai/src/skills/sources/store-source.mjs.map +0 -1
  400. package/esm/ai/src/skills/sources/url-source.mjs +0 -117
  401. package/esm/ai/src/skills/sources/url-source.mjs.map +0 -1
  402. package/esm/ai/src/snapshot/memory.mjs +0 -81
  403. package/esm/ai/src/snapshot/memory.mjs.map +0 -1
  404. package/esm/ai/src/snapshot/pg.mjs +0 -146
  405. package/esm/ai/src/snapshot/pg.mjs.map +0 -1
  406. package/esm/ai/src/snapshot/redis.mjs +0 -101
  407. package/esm/ai/src/snapshot/redis.mjs.map +0 -1
  408. package/esm/ai/src/speech/index.mjs +0 -3
  409. package/esm/ai/src/speech/speech.mjs +0 -122
  410. package/esm/ai/src/speech/speech.mjs.map +0 -1
  411. package/esm/ai/src/supervisor/as-tool.mjs +0 -74
  412. package/esm/ai/src/supervisor/as-tool.mjs.map +0 -1
  413. package/esm/ai/src/supervisor/cancellation.mjs +0 -22
  414. package/esm/ai/src/supervisor/cancellation.mjs.map +0 -1
  415. package/esm/ai/src/supervisor/decide.mjs +0 -272
  416. package/esm/ai/src/supervisor/decide.mjs.map +0 -1
  417. package/esm/ai/src/supervisor/emitter.mjs +0 -47
  418. package/esm/ai/src/supervisor/emitter.mjs.map +0 -1
  419. package/esm/ai/src/supervisor/entries.mjs +0 -206
  420. package/esm/ai/src/supervisor/entries.mjs.map +0 -1
  421. package/esm/ai/src/supervisor/execution.mjs +0 -1921
  422. package/esm/ai/src/supervisor/execution.mjs.map +0 -1
  423. package/esm/ai/src/supervisor/fan-out.mjs +0 -65
  424. package/esm/ai/src/supervisor/fan-out.mjs.map +0 -1
  425. package/esm/ai/src/supervisor/index.mjs +0 -14
  426. package/esm/ai/src/supervisor/router-factory.mjs +0 -141
  427. package/esm/ai/src/supervisor/router-factory.mjs.map +0 -1
  428. package/esm/ai/src/supervisor/router-prompt.mjs +0 -52
  429. package/esm/ai/src/supervisor/router-prompt.mjs.map +0 -1
  430. package/esm/ai/src/supervisor/signature.mjs +0 -89
  431. package/esm/ai/src/supervisor/signature.mjs.map +0 -1
  432. package/esm/ai/src/supervisor/snapshot.mjs +0 -69
  433. package/esm/ai/src/supervisor/snapshot.mjs.map +0 -1
  434. package/esm/ai/src/supervisor/supervisor-stream.mjs +0 -89
  435. package/esm/ai/src/supervisor/supervisor-stream.mjs.map +0 -1
  436. package/esm/ai/src/supervisor/supervisor.mjs +0 -144
  437. package/esm/ai/src/supervisor/supervisor.mjs.map +0 -1
  438. package/esm/ai/src/system-prompt/index.mjs +0 -7
  439. package/esm/ai/src/system-prompt/instruction.mjs +0 -57
  440. package/esm/ai/src/system-prompt/instruction.mjs.map +0 -1
  441. package/esm/ai/src/system-prompt/persona.mjs +0 -57
  442. package/esm/ai/src/system-prompt/persona.mjs.map +0 -1
  443. package/esm/ai/src/system-prompt/refined-system-prompt.mjs +0 -461
  444. package/esm/ai/src/system-prompt/refined-system-prompt.mjs.map +0 -1
  445. package/esm/ai/src/system-prompt/render-placeholders.mjs +0 -58
  446. package/esm/ai/src/system-prompt/render-placeholders.mjs.map +0 -1
  447. package/esm/ai/src/system-prompt/system-prompt.mjs +0 -286
  448. package/esm/ai/src/system-prompt/system-prompt.mjs.map +0 -1
  449. package/esm/ai/src/team/gates.mjs +0 -48
  450. package/esm/ai/src/team/gates.mjs.map +0 -1
  451. package/esm/ai/src/team/index.mjs +0 -3
  452. package/esm/ai/src/team/team.mjs +0 -94
  453. package/esm/ai/src/team/team.mjs.map +0 -1
  454. package/esm/ai/src/tool/executable-as-tool.mjs +0 -81
  455. package/esm/ai/src/tool/executable-as-tool.mjs.map +0 -1
  456. package/esm/ai/src/tool/index.mjs +0 -4
  457. package/esm/ai/src/tool/tool.mjs +0 -185
  458. package/esm/ai/src/tool/tool.mjs.map +0 -1
  459. package/esm/ai/src/transcribe/audio-input.mjs +0 -84
  460. package/esm/ai/src/transcribe/audio-input.mjs.map +0 -1
  461. package/esm/ai/src/transcribe/index.mjs +0 -4
  462. package/esm/ai/src/transcribe/transcribe.mjs +0 -127
  463. package/esm/ai/src/transcribe/transcribe.mjs.map +0 -1
  464. package/esm/ai/src/utils/compute-cost.mjs +0 -112
  465. package/esm/ai/src/utils/compute-cost.mjs.map +0 -1
  466. package/esm/ai/src/utils/extract-json-lenient.mjs +0 -97
  467. package/esm/ai/src/utils/extract-json-lenient.mjs.map +0 -1
  468. package/esm/ai/src/utils/extract-json-payload.mjs +0 -39
  469. package/esm/ai/src/utils/extract-json-payload.mjs.map +0 -1
  470. package/esm/ai/src/utils/generate-run-id.mjs +0 -23
  471. package/esm/ai/src/utils/generate-run-id.mjs.map +0 -1
  472. package/esm/ai/src/utils/index.mjs +0 -12
  473. package/esm/ai/src/utils/json-schema.mjs +0 -89
  474. package/esm/ai/src/utils/json-schema.mjs.map +0 -1
  475. package/esm/ai/src/utils/prepare-attachment-part.mjs +0 -232
  476. package/esm/ai/src/utils/prepare-attachment-part.mjs.map +0 -1
  477. package/esm/ai/src/utils/resolve-attachment.mjs +0 -74
  478. package/esm/ai/src/utils/resolve-attachment.mjs.map +0 -1
  479. package/esm/ai/src/utils/run-context.mjs +0 -89
  480. package/esm/ai/src/utils/run-context.mjs.map +0 -1
  481. package/esm/ai/src/utils/safe-json-parse.mjs +0 -22
  482. package/esm/ai/src/utils/safe-json-parse.mjs.map +0 -1
  483. package/esm/ai/src/utils/stamp-report-lineage.mjs +0 -45
  484. package/esm/ai/src/utils/stamp-report-lineage.mjs.map +0 -1
  485. package/esm/ai/src/vcr/cassette-io.mjs +0 -57
  486. package/esm/ai/src/vcr/cassette-io.mjs.map +0 -1
  487. package/esm/ai/src/vcr/errors.mjs +0 -37
  488. package/esm/ai/src/vcr/errors.mjs.map +0 -1
  489. package/esm/ai/src/vcr/hash-request.mjs +0 -118
  490. package/esm/ai/src/vcr/hash-request.mjs.map +0 -1
  491. package/esm/ai/src/vcr/index.mjs +0 -5
  492. package/esm/ai/src/vcr/vcr.mjs +0 -248
  493. package/esm/ai/src/vcr/vcr.mjs.map +0 -1
  494. package/esm/ai/src/workflow/as-tool.mjs +0 -49
  495. package/esm/ai/src/workflow/as-tool.mjs.map +0 -1
  496. package/esm/ai/src/workflow/cancellation.mjs +0 -44
  497. package/esm/ai/src/workflow/cancellation.mjs.map +0 -1
  498. package/esm/ai/src/workflow/emitter.mjs +0 -40
  499. package/esm/ai/src/workflow/emitter.mjs.map +0 -1
  500. package/esm/ai/src/workflow/engine.mjs +0 -363
  501. package/esm/ai/src/workflow/engine.mjs.map +0 -1
  502. package/esm/ai/src/workflow/index.mjs +0 -5
  503. package/esm/ai/src/workflow/retry.mjs +0 -32
  504. package/esm/ai/src/workflow/retry.mjs.map +0 -1
  505. package/esm/ai/src/workflow/router.mjs +0 -56
  506. package/esm/ai/src/workflow/router.mjs.map +0 -1
  507. package/esm/ai/src/workflow/run-scoped-emitter.mjs +0 -32
  508. package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +0 -1
  509. package/esm/ai/src/workflow/signature.mjs +0 -34
  510. package/esm/ai/src/workflow/signature.mjs.map +0 -1
  511. package/esm/ai/src/workflow/snapshot.mjs +0 -77
  512. package/esm/ai/src/workflow/snapshot.mjs.map +0 -1
  513. package/esm/ai/src/workflow/state.mjs +0 -37
  514. package/esm/ai/src/workflow/state.mjs.map +0 -1
  515. package/esm/ai/src/workflow/step-runner.mjs +0 -370
  516. package/esm/ai/src/workflow/step-runner.mjs.map +0 -1
  517. package/esm/ai/src/workflow/step.mjs +0 -37
  518. package/esm/ai/src/workflow/step.mjs.map +0 -1
  519. package/esm/ai/src/workflow/workflow.mjs +0 -122
  520. package/esm/ai/src/workflow/workflow.mjs.map +0 -1
  521. package/esm/ai-openai/src/embedder.mjs +0 -4
  522. package/esm/ai-openai/src/image.mjs +0 -5
  523. package/esm/ai-openai/src/index.mjs +0 -7
  524. package/esm/ai-openai/src/model.mjs +0 -5
  525. package/esm/ai-openai/src/sdk.mjs +0 -9
  526. package/esm/ai-openai/src/speech.mjs +0 -5
  527. package/esm/ai-openai/src/transcription.mjs +0 -6
  528. package/esm/ai-openai/src/utils/index.mjs +0 -5
  529. package/esm/ai-openai/src/utils/to-openai-messages.mjs +0 -3
  530. package/esm/ai-openai/src/utils/to-openai-tools.mjs +0 -3
  531. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +0 -4
  532. package/esm/node_modules/langfuse/lib/index.mjs +0 -1827
  533. package/esm/node_modules/langfuse/lib/index.mjs.map +0 -1
  534. package/esm/node_modules/langfuse-core/lib/index.mjs +0 -1770
  535. package/esm/node_modules/langfuse-core/lib/index.mjs.map +0 -1
  536. package/esm/node_modules/mustache/mustache.mjs +0 -587
  537. package/esm/node_modules/mustache/mustache.mjs.map +0 -1
  538. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +0 -180
  539. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +0 -1
  540. package/esm/node_modules/openai/auth/workload-identity-auth.mjs +0 -80
  541. package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +0 -1
  542. package/esm/node_modules/openai/azure.mjs +0 -82
  543. package/esm/node_modules/openai/azure.mjs.map +0 -1
  544. package/esm/node_modules/openai/client.mjs +0 -638
  545. package/esm/node_modules/openai/client.mjs.map +0 -1
  546. package/esm/node_modules/openai/core/api-promise.mjs +0 -75
  547. package/esm/node_modules/openai/core/api-promise.mjs.map +0 -1
  548. package/esm/node_modules/openai/core/error.mjs +0 -110
  549. package/esm/node_modules/openai/core/error.mjs.map +0 -1
  550. package/esm/node_modules/openai/core/pagination.mjs +0 -160
  551. package/esm/node_modules/openai/core/pagination.mjs.map +0 -1
  552. package/esm/node_modules/openai/core/resource.mjs +0 -10
  553. package/esm/node_modules/openai/core/resource.mjs.map +0 -1
  554. package/esm/node_modules/openai/core/streaming.mjs +0 -238
  555. package/esm/node_modules/openai/core/streaming.mjs.map +0 -1
  556. package/esm/node_modules/openai/index.mjs +0 -8
  557. package/esm/node_modules/openai/internal/decoders/line.mjs +0 -91
  558. package/esm/node_modules/openai/internal/decoders/line.mjs.map +0 -1
  559. package/esm/node_modules/openai/internal/detect-platform.mjs +0 -123
  560. package/esm/node_modules/openai/internal/detect-platform.mjs.map +0 -1
  561. package/esm/node_modules/openai/internal/errors.mjs +0 -26
  562. package/esm/node_modules/openai/internal/errors.mjs.map +0 -1
  563. package/esm/node_modules/openai/internal/headers.mjs +0 -65
  564. package/esm/node_modules/openai/internal/headers.mjs.map +0 -1
  565. package/esm/node_modules/openai/internal/parse.mjs +0 -41
  566. package/esm/node_modules/openai/internal/parse.mjs.map +0 -1
  567. package/esm/node_modules/openai/internal/qs/formats.mjs +0 -12
  568. package/esm/node_modules/openai/internal/qs/formats.mjs.map +0 -1
  569. package/esm/node_modules/openai/internal/qs/stringify.mjs +0 -179
  570. package/esm/node_modules/openai/internal/qs/stringify.mjs.map +0 -1
  571. package/esm/node_modules/openai/internal/qs/utils.mjs +0 -65
  572. package/esm/node_modules/openai/internal/qs/utils.mjs.map +0 -1
  573. package/esm/node_modules/openai/internal/request-options.mjs +0 -11
  574. package/esm/node_modules/openai/internal/request-options.mjs.map +0 -1
  575. package/esm/node_modules/openai/internal/shims.mjs +0 -77
  576. package/esm/node_modules/openai/internal/shims.mjs.map +0 -1
  577. package/esm/node_modules/openai/internal/to-file.mjs +0 -63
  578. package/esm/node_modules/openai/internal/to-file.mjs.map +0 -1
  579. package/esm/node_modules/openai/internal/tslib.mjs +0 -16
  580. package/esm/node_modules/openai/internal/tslib.mjs.map +0 -1
  581. package/esm/node_modules/openai/internal/uploads.mjs +0 -94
  582. package/esm/node_modules/openai/internal/uploads.mjs.map +0 -1
  583. package/esm/node_modules/openai/internal/utils/base64.mjs +0 -22
  584. package/esm/node_modules/openai/internal/utils/base64.mjs.map +0 -1
  585. package/esm/node_modules/openai/internal/utils/bytes.mjs +0 -26
  586. package/esm/node_modules/openai/internal/utils/bytes.mjs.map +0 -1
  587. package/esm/node_modules/openai/internal/utils/env.mjs +0 -16
  588. package/esm/node_modules/openai/internal/utils/env.mjs.map +0 -1
  589. package/esm/node_modules/openai/internal/utils/log.mjs +0 -58
  590. package/esm/node_modules/openai/internal/utils/log.mjs.map +0 -1
  591. package/esm/node_modules/openai/internal/utils/path.mjs +0 -62
  592. package/esm/node_modules/openai/internal/utils/path.mjs.map +0 -1
  593. package/esm/node_modules/openai/internal/utils/query.mjs +0 -10
  594. package/esm/node_modules/openai/internal/utils/query.mjs.map +0 -1
  595. package/esm/node_modules/openai/internal/utils/sleep.mjs +0 -6
  596. package/esm/node_modules/openai/internal/utils/sleep.mjs.map +0 -1
  597. package/esm/node_modules/openai/internal/utils/uuid.mjs +0 -18
  598. package/esm/node_modules/openai/internal/utils/uuid.mjs.map +0 -1
  599. package/esm/node_modules/openai/internal/utils/values.mjs +0 -41
  600. package/esm/node_modules/openai/internal/utils/values.mjs.map +0 -1
  601. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +0 -247
  602. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +0 -1
  603. package/esm/node_modules/openai/lib/AssistantStream.mjs +0 -472
  604. package/esm/node_modules/openai/lib/AssistantStream.mjs.map +0 -1
  605. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +0 -26
  606. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +0 -1
  607. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +0 -423
  608. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +0 -1
  609. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +0 -26
  610. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +0 -1
  611. package/esm/node_modules/openai/lib/EventStream.mjs +0 -163
  612. package/esm/node_modules/openai/lib/EventStream.mjs.map +0 -1
  613. package/esm/node_modules/openai/lib/ResponsesParser.mjs +0 -94
  614. package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +0 -1
  615. package/esm/node_modules/openai/lib/RunnableFunction.mjs +0 -8
  616. package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +0 -1
  617. package/esm/node_modules/openai/lib/Util.mjs +0 -19
  618. package/esm/node_modules/openai/lib/Util.mjs.map +0 -1
  619. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +0 -11
  620. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +0 -1
  621. package/esm/node_modules/openai/lib/parser.mjs +0 -88
  622. package/esm/node_modules/openai/lib/parser.mjs.map +0 -1
  623. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +0 -231
  624. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +0 -1
  625. package/esm/node_modules/openai/resources/admin/admin.mjs +0 -15
  626. package/esm/node_modules/openai/resources/admin/admin.mjs.map +0 -1
  627. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +0 -81
  628. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +0 -1
  629. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +0 -31
  630. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +0 -1
  631. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +0 -153
  632. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +0 -1
  633. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +0 -42
  634. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +0 -1
  635. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +0 -106
  636. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +0 -1
  637. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +0 -88
  638. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +0 -1
  639. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +0 -88
  640. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +0 -1
  641. package/esm/node_modules/openai/resources/admin/organization/invites.mjs +0 -83
  642. package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +0 -1
  643. package/esm/node_modules/openai/resources/admin/organization/organization.mjs +0 -45
  644. package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +0 -1
  645. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +0 -72
  646. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +0 -1
  647. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +0 -78
  648. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +0 -1
  649. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +0 -46
  650. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +0 -1
  651. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +0 -95
  652. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +0 -1
  653. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +0 -91
  654. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +0 -1
  655. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +0 -45
  656. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +0 -1
  657. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +0 -63
  658. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +0 -1
  659. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +0 -137
  660. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +0 -1
  661. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +0 -51
  662. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +0 -1
  663. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +0 -108
  664. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +0 -1
  665. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +0 -112
  666. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +0 -1
  667. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +0 -106
  668. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +0 -1
  669. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +0 -91
  670. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +0 -1
  671. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +0 -118
  672. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +0 -1
  673. package/esm/node_modules/openai/resources/admin/organization/roles.mjs +0 -96
  674. package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +0 -1
  675. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +0 -97
  676. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +0 -1
  677. package/esm/node_modules/openai/resources/admin/organization/usage.mjs +0 -207
  678. package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +0 -1
  679. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +0 -88
  680. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +0 -1
  681. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +0 -82
  682. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +0 -1
  683. package/esm/node_modules/openai/resources/audio/audio.mjs +0 -21
  684. package/esm/node_modules/openai/resources/audio/audio.mjs.map +0 -1
  685. package/esm/node_modules/openai/resources/audio/speech.mjs +0 -39
  686. package/esm/node_modules/openai/resources/audio/speech.mjs.map +0 -1
  687. package/esm/node_modules/openai/resources/audio/transcriptions.mjs +0 -22
  688. package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +0 -1
  689. package/esm/node_modules/openai/resources/audio/translations.mjs +0 -21
  690. package/esm/node_modules/openai/resources/audio/translations.mjs.map +0 -1
  691. package/esm/node_modules/openai/resources/batches.mjs +0 -54
  692. package/esm/node_modules/openai/resources/batches.mjs.map +0 -1
  693. package/esm/node_modules/openai/resources/beta/assistants.mjs +0 -78
  694. package/esm/node_modules/openai/resources/beta/assistants.mjs.map +0 -1
  695. package/esm/node_modules/openai/resources/beta/beta.mjs +0 -24
  696. package/esm/node_modules/openai/resources/beta/beta.mjs.map +0 -1
  697. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +0 -18
  698. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +0 -1
  699. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +0 -49
  700. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +0 -1
  701. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +0 -85
  702. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +0 -1
  703. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +0 -21
  704. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +0 -1
  705. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +0 -33
  706. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +0 -1
  707. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +0 -33
  708. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +0 -1
  709. package/esm/node_modules/openai/resources/beta/threads/messages.mjs +0 -83
  710. package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +0 -1
  711. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +0 -183
  712. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +0 -1
  713. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +0 -45
  714. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +0 -1
  715. package/esm/node_modules/openai/resources/beta/threads/threads.mjs +0 -101
  716. package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +0 -1
  717. package/esm/node_modules/openai/resources/chat/chat.mjs +0 -15
  718. package/esm/node_modules/openai/resources/chat/chat.mjs.map +0 -1
  719. package/esm/node_modules/openai/resources/chat/completions/completions.mjs +0 -123
  720. package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +0 -1
  721. package/esm/node_modules/openai/resources/chat/completions/index.mjs +0 -7
  722. package/esm/node_modules/openai/resources/chat/completions/messages.mjs +0 -35
  723. package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +0 -1
  724. package/esm/node_modules/openai/resources/chat/index.mjs +0 -5
  725. package/esm/node_modules/openai/resources/completions.mjs +0 -20
  726. package/esm/node_modules/openai/resources/completions.mjs.map +0 -1
  727. package/esm/node_modules/openai/resources/containers/containers.mjs +0 -57
  728. package/esm/node_modules/openai/resources/containers/containers.mjs.map +0 -1
  729. package/esm/node_modules/openai/resources/containers/files/content.mjs +0 -23
  730. package/esm/node_modules/openai/resources/containers/files/content.mjs.map +0 -1
  731. package/esm/node_modules/openai/resources/containers/files/files.mjs +0 -63
  732. package/esm/node_modules/openai/resources/containers/files/files.mjs.map +0 -1
  733. package/esm/node_modules/openai/resources/conversations/conversations.mjs +0 -57
  734. package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +0 -1
  735. package/esm/node_modules/openai/resources/conversations/items.mjs +0 -57
  736. package/esm/node_modules/openai/resources/conversations/items.mjs.map +0 -1
  737. package/esm/node_modules/openai/resources/embeddings.mjs +0 -48
  738. package/esm/node_modules/openai/resources/embeddings.mjs.map +0 -1
  739. package/esm/node_modules/openai/resources/evals/evals.mjs +0 -73
  740. package/esm/node_modules/openai/resources/evals/evals.mjs.map +0 -1
  741. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +0 -35
  742. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +0 -1
  743. package/esm/node_modules/openai/resources/evals/runs/runs.mjs +0 -72
  744. package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +0 -1
  745. package/esm/node_modules/openai/resources/files.mjs +0 -111
  746. package/esm/node_modules/openai/resources/files.mjs.map +0 -1
  747. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +0 -15
  748. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +0 -1
  749. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +0 -60
  750. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +0 -1
  751. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +0 -15
  752. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +0 -1
  753. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +0 -102
  754. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +0 -1
  755. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +0 -24
  756. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +0 -1
  757. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +0 -34
  758. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +0 -1
  759. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +0 -148
  760. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +0 -1
  761. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +0 -8
  762. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +0 -1
  763. package/esm/node_modules/openai/resources/graders/grader-models.mjs +0 -8
  764. package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +0 -1
  765. package/esm/node_modules/openai/resources/graders/graders.mjs +0 -15
  766. package/esm/node_modules/openai/resources/graders/graders.mjs.map +0 -1
  767. package/esm/node_modules/openai/resources/images.mjs +0 -46
  768. package/esm/node_modules/openai/resources/images.mjs.map +0 -1
  769. package/esm/node_modules/openai/resources/index.mjs +0 -27
  770. package/esm/node_modules/openai/resources/models.mjs +0 -44
  771. package/esm/node_modules/openai/resources/models.mjs.map +0 -1
  772. package/esm/node_modules/openai/resources/moderations.mjs +0 -23
  773. package/esm/node_modules/openai/resources/moderations.mjs.map +0 -1
  774. package/esm/node_modules/openai/resources/realtime/calls.mjs +0 -79
  775. package/esm/node_modules/openai/resources/realtime/calls.mjs.map +0 -1
  776. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +0 -39
  777. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +0 -1
  778. package/esm/node_modules/openai/resources/realtime/realtime.mjs +0 -18
  779. package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +0 -1
  780. package/esm/node_modules/openai/resources/responses/input-items.mjs +0 -31
  781. package/esm/node_modules/openai/resources/responses/input-items.mjs.map +0 -1
  782. package/esm/node_modules/openai/resources/responses/input-tokens.mjs +0 -27
  783. package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +0 -1
  784. package/esm/node_modules/openai/resources/responses/responses.mjs +0 -110
  785. package/esm/node_modules/openai/resources/responses/responses.mjs.map +0 -1
  786. package/esm/node_modules/openai/resources/skills/content.mjs +0 -22
  787. package/esm/node_modules/openai/resources/skills/content.mjs.map +0 -1
  788. package/esm/node_modules/openai/resources/skills/skills.mjs +0 -69
  789. package/esm/node_modules/openai/resources/skills/skills.mjs.map +0 -1
  790. package/esm/node_modules/openai/resources/skills/versions/content.mjs +0 -23
  791. package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +0 -1
  792. package/esm/node_modules/openai/resources/skills/versions/versions.mjs +0 -58
  793. package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +0 -1
  794. package/esm/node_modules/openai/resources/uploads/parts.mjs +0 -34
  795. package/esm/node_modules/openai/resources/uploads/parts.mjs.map +0 -1
  796. package/esm/node_modules/openai/resources/uploads/uploads.mjs +0 -84
  797. package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +0 -1
  798. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +0 -126
  799. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +0 -1
  800. package/esm/node_modules/openai/resources/vector-stores/files.mjs +0 -147
  801. package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +0 -1
  802. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +0 -87
  803. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +0 -1
  804. package/esm/node_modules/openai/resources/videos.mjs +0 -115
  805. package/esm/node_modules/openai/resources/videos.mjs.map +0 -1
  806. package/esm/node_modules/openai/resources/webhooks/index.mjs +0 -3
  807. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +0 -69
  808. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +0 -1
  809. package/esm/node_modules/openai/resources/webhooks.mjs +0 -4
  810. package/esm/node_modules/openai/streaming.mjs +0 -3
  811. package/esm/node_modules/openai/version.mjs +0 -6
  812. package/esm/node_modules/openai/version.mjs.map +0 -1
@@ -1,97 +0,0 @@
1
- import { extractJsonPayload } from "./extract-json-payload.mjs";
2
-
3
- //#region ../@warlock.js/ai/src/utils/extract-json-lenient.ts
4
- /**
5
- * Lenient counterpart to {@link extractJsonPayload}, tuned for the
6
- * structured-output judges that emit *corrupted* JSON — notably the
7
- * Amazon Nova family, which routinely wraps its verdict in fenced
8
- * ` ```json ` blocks, prepends an explanation paragraph, or trails the
9
- * object with commentary.
10
- *
11
- * Where `extractJsonPayload` deliberately refuses the "first `{` … last
12
- * `}`" heuristic (it would corrupt strict callers when prose contains
13
- * stray braces), this helper *opts into* that resilience: after fence
14
- * stripping it scans for the first balanced JSON object (`{…}`) or array
15
- * (`[…]`) and returns just that slice. Brace/bracket counting is
16
- * string-aware (it ignores braces inside JSON string literals and honors
17
- * `\"` escapes), so prose-embedded braces inside the JSON's own strings
18
- * don't throw off the balance.
19
- *
20
- * Returns the fence-stripped, trimmed text unchanged when no balanced
21
- * structure is found, so the caller's `JSON.parse` still fails loudly on
22
- * genuine garbage rather than this helper inventing a value.
23
- *
24
- * **Trade-off:** resilience over strictness. Use it only where a tolerant
25
- * parse is wanted (the judge preset) — for normal structured output keep
26
- * `extractJsonPayload`, which fails fast on malformed responses so real
27
- * prompt/model defects surface instead of being silently papered over.
28
- *
29
- * @example
30
- * extractJsonLenient('Here is my verdict:\n```json\n{"score":0.9}\n``` — done.');
31
- * // => '{"score":0.9}'
32
- *
33
- * @example
34
- * extractJsonLenient('The answer is {"verdict":"pass"} for sure.');
35
- * // => '{"verdict":"pass"}'
36
- *
37
- * @example
38
- * extractJsonLenient('{"valid":true}');
39
- * // => '{"valid":true}' (clean JSON passes through)
40
- */
41
- function extractJsonLenient(text) {
42
- const stripped = extractJsonPayload(text);
43
- return sliceFirstBalanced(stripped) ?? stripped;
44
- }
45
- /**
46
- * Scan for the first balanced JSON object or array and return its raw
47
- * slice. Returns `undefined` when no opening `{`/`[` is found or the
48
- * structure never closes (truncated / partial output) — the caller then
49
- * falls back to the fence-stripped text so the failure stays visible.
50
- *
51
- * String-literal aware: braces and brackets appearing *inside* a JSON
52
- * string are not counted toward the balance, and a backslash escapes the
53
- * next character so an escaped quote (`\"`) doesn't prematurely end the
54
- * string scan.
55
- */
56
- function sliceFirstBalanced(text) {
57
- const start = firstOpenerIndex(text);
58
- if (start === -1) return;
59
- const opener = text[start];
60
- const closer = opener === "{" ? "}" : "]";
61
- let depth = 0;
62
- let inString = false;
63
- let escaped = false;
64
- for (let index = start; index < text.length; index++) {
65
- const char = text[index];
66
- if (inString) {
67
- if (escaped) escaped = false;
68
- else if (char === "\\") escaped = true;
69
- else if (char === "\"") inString = false;
70
- continue;
71
- }
72
- if (char === "\"") {
73
- inString = true;
74
- continue;
75
- }
76
- if (char === opener) depth++;
77
- else if (char === closer) {
78
- depth--;
79
- if (depth === 0) return text.slice(start, index + 1);
80
- }
81
- }
82
- }
83
- /**
84
- * Index of the first JSON structure opener (`{` or `[`), whichever
85
- * appears earliest, or `-1` when neither is present.
86
- */
87
- function firstOpenerIndex(text) {
88
- const brace = text.indexOf("{");
89
- const bracket = text.indexOf("[");
90
- if (brace === -1) return bracket;
91
- if (bracket === -1) return brace;
92
- return Math.min(brace, bracket);
93
- }
94
-
95
- //#endregion
96
- export { extractJsonLenient };
97
- //# sourceMappingURL=extract-json-lenient.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-json-lenient.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/utils/extract-json-lenient.ts"],"sourcesContent":["import { extractJsonPayload } from \"./extract-json-payload\";\n\n/**\n * Lenient counterpart to {@link extractJsonPayload}, tuned for the\n * structured-output judges that emit *corrupted* JSON — notably the\n * Amazon Nova family, which routinely wraps its verdict in fenced\n * ` ```json ` blocks, prepends an explanation paragraph, or trails the\n * object with commentary.\n *\n * Where `extractJsonPayload` deliberately refuses the \"first `{` … last\n * `}`\" heuristic (it would corrupt strict callers when prose contains\n * stray braces), this helper *opts into* that resilience: after fence\n * stripping it scans for the first balanced JSON object (`{…}`) or array\n * (`[…]`) and returns just that slice. Brace/bracket counting is\n * string-aware (it ignores braces inside JSON string literals and honors\n * `\\\"` escapes), so prose-embedded braces inside the JSON's own strings\n * don't throw off the balance.\n *\n * Returns the fence-stripped, trimmed text unchanged when no balanced\n * structure is found, so the caller's `JSON.parse` still fails loudly on\n * genuine garbage rather than this helper inventing a value.\n *\n * **Trade-off:** resilience over strictness. Use it only where a tolerant\n * parse is wanted (the judge preset) — for normal structured output keep\n * `extractJsonPayload`, which fails fast on malformed responses so real\n * prompt/model defects surface instead of being silently papered over.\n *\n * @example\n * extractJsonLenient('Here is my verdict:\\n```json\\n{\"score\":0.9}\\n``` — done.');\n * // => '{\"score\":0.9}'\n *\n * @example\n * extractJsonLenient('The answer is {\"verdict\":\"pass\"} for sure.');\n * // => '{\"verdict\":\"pass\"}'\n *\n * @example\n * extractJsonLenient('{\"valid\":true}');\n * // => '{\"valid\":true}' (clean JSON passes through)\n */\nexport function extractJsonLenient(text: string): string {\n // First reuse the strict fence stripper. When the model produced a\n // clean fenced block this already yields the exact payload, so the\n // balanced scan below becomes a no-op pass-through.\n const stripped = extractJsonPayload(text);\n\n const sliced = sliceFirstBalanced(stripped);\n\n return sliced ?? stripped;\n}\n\n/**\n * Scan for the first balanced JSON object or array and return its raw\n * slice. Returns `undefined` when no opening `{`/`[` is found or the\n * structure never closes (truncated / partial output) — the caller then\n * falls back to the fence-stripped text so the failure stays visible.\n *\n * String-literal aware: braces and brackets appearing *inside* a JSON\n * string are not counted toward the balance, and a backslash escapes the\n * next character so an escaped quote (`\\\"`) doesn't prematurely end the\n * string scan.\n */\nfunction sliceFirstBalanced(text: string): string | undefined {\n const start = firstOpenerIndex(text);\n\n if (start === -1) {\n return undefined;\n }\n\n const opener = text[start];\n const closer = opener === \"{\" ? \"}\" : \"]\";\n\n let depth = 0;\n let inString = false;\n let escaped = false;\n\n for (let index = start; index < text.length; index++) {\n const char = text[index];\n\n if (inString) {\n if (escaped) {\n escaped = false;\n } else if (char === \"\\\\\") {\n escaped = true;\n } else if (char === '\"') {\n inString = false;\n }\n\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n continue;\n }\n\n if (char === opener) {\n depth++;\n } else if (char === closer) {\n depth--;\n\n if (depth === 0) {\n return text.slice(start, index + 1);\n }\n }\n }\n\n // Opener with no matching close — truncated / partial output. Leave it\n // to the caller's fallback (and its loud parse failure).\n return undefined;\n}\n\n/**\n * Index of the first JSON structure opener (`{` or `[`), whichever\n * appears earliest, or `-1` when neither is present.\n */\nfunction firstOpenerIndex(text: string): number {\n const brace = text.indexOf(\"{\");\n const bracket = text.indexOf(\"[\");\n\n if (brace === -1) {\n return bracket;\n }\n\n if (bracket === -1) {\n return brace;\n }\n\n return Math.min(brace, bracket);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAgB,mBAAmB,MAAsB;CAIvD,MAAM,WAAW,mBAAmB,IAAI;CAIxC,OAFe,mBAAmB,QAEtB,KAAK;AACnB;;;;;;;;;;;;AAaA,SAAS,mBAAmB,MAAkC;CAC5D,MAAM,QAAQ,iBAAiB,IAAI;CAEnC,IAAI,UAAU,IACZ;CAGF,MAAM,SAAS,KAAK;CACpB,MAAM,SAAS,WAAW,MAAM,MAAM;CAEtC,IAAI,QAAQ;CACZ,IAAI,WAAW;CACf,IAAI,UAAU;CAEd,KAAK,IAAI,QAAQ,OAAO,QAAQ,KAAK,QAAQ,SAAS;EACpD,MAAM,OAAO,KAAK;EAElB,IAAI,UAAU;GACZ,IAAI,SACF,UAAU;QACL,IAAI,SAAS,MAClB,UAAU;QACL,IAAI,SAAS,MAClB,WAAW;GAGb;EACF;EAEA,IAAI,SAAS,MAAK;GAChB,WAAW;GACX;EACF;EAEA,IAAI,SAAS,QACX;OACK,IAAI,SAAS,QAAQ;GAC1B;GAEA,IAAI,UAAU,GACZ,OAAO,KAAK,MAAM,OAAO,QAAQ,CAAC;EAEtC;CACF;AAKF;;;;;AAMA,SAAS,iBAAiB,MAAsB;CAC9C,MAAM,QAAQ,KAAK,QAAQ,GAAG;CAC9B,MAAM,UAAU,KAAK,QAAQ,GAAG;CAEhC,IAAI,UAAU,IACZ,OAAO;CAGT,IAAI,YAAY,IACd,OAAO;CAGT,OAAO,KAAK,IAAI,OAAO,OAAO;AAChC"}
@@ -1,39 +0,0 @@
1
- //#region ../@warlock.js/ai/src/utils/extract-json-payload.ts
2
- /**
3
- * Strip markdown code fences from an LLM response before JSON parsing.
4
- *
5
- * Models — especially Claude, smaller models, and local models — routinely
6
- * wrap JSON output in fenced code blocks (` ```json\n{...}\n``` `) even when
7
- * instructed otherwise. Sometimes they also precede the fence with prose
8
- * ("Here you go:\n```json\n...\n```"). This helper finds the first fenced
9
- * block regardless of language tag and returns its trimmed contents.
10
- *
11
- * Returns the trimmed original text unchanged when no fence is present, so
12
- * clean JSON passes through as a no-op.
13
- *
14
- * Deliberately does NOT fall back to "find first `{` and last `}` and slice
15
- * between them" — that heuristic silently corrupts data when prose contains
16
- * stray braces. Failing loudly at `JSON.parse` is safer.
17
- *
18
- * @example
19
- * extractJsonPayload('```json\n{"a":1}\n```');
20
- * // => '{"a":1}'
21
- *
22
- * @example
23
- * extractJsonPayload('Here you go:\n```\n{"a":1}\n```\nHope this helps.');
24
- * // => '{"a":1}'
25
- *
26
- * @example
27
- * extractJsonPayload('{"a":1}');
28
- * // => '{"a":1}' (no fence → unchanged)
29
- */
30
- function extractJsonPayload(text) {
31
- const trimmed = text.trim();
32
- const fenceMatch = trimmed.match(/```(?:json)?\s*\n?([\s\S]*?)\n?```/);
33
- if (fenceMatch) return fenceMatch[1].trim();
34
- return trimmed;
35
- }
36
-
37
- //#endregion
38
- export { extractJsonPayload };
39
- //# sourceMappingURL=extract-json-payload.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extract-json-payload.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/utils/extract-json-payload.ts"],"sourcesContent":["/**\n * Strip markdown code fences from an LLM response before JSON parsing.\n *\n * Models — especially Claude, smaller models, and local models — routinely\n * wrap JSON output in fenced code blocks (` ```json\\n{...}\\n``` `) even when\n * instructed otherwise. Sometimes they also precede the fence with prose\n * (\"Here you go:\\n```json\\n...\\n```\"). This helper finds the first fenced\n * block regardless of language tag and returns its trimmed contents.\n *\n * Returns the trimmed original text unchanged when no fence is present, so\n * clean JSON passes through as a no-op.\n *\n * Deliberately does NOT fall back to \"find first `{` and last `}` and slice\n * between them\" — that heuristic silently corrupts data when prose contains\n * stray braces. Failing loudly at `JSON.parse` is safer.\n *\n * @example\n * extractJsonPayload('```json\\n{\"a\":1}\\n```');\n * // => '{\"a\":1}'\n *\n * @example\n * extractJsonPayload('Here you go:\\n```\\n{\"a\":1}\\n```\\nHope this helps.');\n * // => '{\"a\":1}'\n *\n * @example\n * extractJsonPayload('{\"a\":1}');\n * // => '{\"a\":1}' (no fence → unchanged)\n */\nexport function extractJsonPayload(text: string): string {\n const trimmed = text.trim();\n\n const fenceMatch = trimmed.match(/```(?:json)?\\s*\\n?([\\s\\S]*?)\\n?```/);\n\n if (fenceMatch) {\n return fenceMatch[1].trim();\n }\n\n return trimmed;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,SAAgB,mBAAmB,MAAsB;CACvD,MAAM,UAAU,KAAK,KAAK;CAE1B,MAAM,aAAa,QAAQ,MAAM,oCAAoC;CAErE,IAAI,YACF,OAAO,WAAW,EAAE,CAAC,KAAK;CAG5B,OAAO;AACT"}
@@ -1,23 +0,0 @@
1
- //#region ../@warlock.js/ai/src/utils/generate-run-id.ts
2
- /**
3
- * Generates a stable, human-readable run id for any execution node
4
- * (tool invocation, agent run, workflow run, supervisor run). Format:
5
- * `${prefix}_${timestamp36}_${random36}` — compact, sortable by
6
- * prefix, collision-resistant within a run.
7
- *
8
- * Shared helper so every primitive emits the same id shape. The
9
- * prefix is conventionally the primitive kind (`"tool"`, `"agent"`,
10
- * `"workflow"`, `"sup"`) but callers can pass anything; the id is
11
- * purely for correlation, never parsed.
12
- *
13
- * @example
14
- * const runId = generateRunId("tool");
15
- * // → "tool_ld8x3m_7fq2j1kp"
16
- */
17
- function generateRunId(prefix) {
18
- return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 10)}`;
19
- }
20
-
21
- //#endregion
22
- export { generateRunId };
23
- //# sourceMappingURL=generate-run-id.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"generate-run-id.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/utils/generate-run-id.ts"],"sourcesContent":["/**\n * Generates a stable, human-readable run id for any execution node\n * (tool invocation, agent run, workflow run, supervisor run). Format:\n * `${prefix}_${timestamp36}_${random36}` — compact, sortable by\n * prefix, collision-resistant within a run.\n *\n * Shared helper so every primitive emits the same id shape. The\n * prefix is conventionally the primitive kind (`\"tool\"`, `\"agent\"`,\n * `\"workflow\"`, `\"sup\"`) but callers can pass anything; the id is\n * purely for correlation, never parsed.\n *\n * @example\n * const runId = generateRunId(\"tool\");\n * // → \"tool_ld8x3m_7fq2j1kp\"\n */\nexport function generateRunId(prefix: string): string {\n return `${prefix}_${Date.now().toString(36)}_${Math.random()\n .toString(36)\n .slice(2, 10)}`;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAeA,SAAgB,cAAc,QAAwB;CACpD,OAAO,GAAG,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,CACzD,SAAS,EAAE,CAAC,CACZ,MAAM,GAAG,EAAE;AAChB"}
@@ -1,12 +0,0 @@
1
- import { accumulateCost, computeCost, mergeUsage } from "./compute-cost.mjs";
2
- import { extractJsonPayload } from "./extract-json-payload.mjs";
3
- import { extractJsonLenient } from "./extract-json-lenient.mjs";
4
- import { generateRunId } from "./generate-run-id.mjs";
5
- import { extractJsonSchema } from "./json-schema.mjs";
6
- import { resolveAttachment } from "./resolve-attachment.mjs";
7
- import { prepareAttachmentPart } from "./prepare-attachment-part.mjs";
8
- import { captureChildReport, withRunFrame, withoutRunFrame } from "./run-context.mjs";
9
- import { safeJsonParse } from "./safe-json-parse.mjs";
10
- import { stampReportLineage } from "./stamp-report-lineage.mjs";
11
-
12
- export { };
@@ -1,89 +0,0 @@
1
- //#region ../@warlock.js/ai/src/utils/json-schema.ts
2
- /**
3
- * Best-effort JSON Schema extraction from a Standard Schema instance.
4
- *
5
- * Different libraries expose their JSON representation through different
6
- * paths:
7
- * - **Seal / Standard JSON Schema V1**: `["~standard"].jsonSchema.input({ target })`
8
- * — nested under the spec object, takes a target switch. Default target
9
- * is `"openai-strict"` since the primary consumer is OpenAI's native
10
- * structured-output mechanism; pass `options.target` to override.
11
- * - **Zod / similar**: top-level `.jsonSchema` property. Zod v4 actually
12
- * ships `toJSONSchema` as a module function, not a method, so it does
13
- * NOT hit this probe — Zod users pass their converted schema via the
14
- * `AgentExecuteOptions.responseSchema` escape hatch.
15
- *
16
- * Deliberately does NOT probe `toJSON` — that's a generic JavaScript
17
- * serialization hook (Seal's schemas have one that dumps internal rule
18
- * state) and matching it would return garbage disguised as a JSON Schema.
19
- *
20
- * Returns `undefined` when no path matches. The caller then either skips
21
- * native structured-output wiring or falls back to a schema-less
22
- * instruction.
23
- *
24
- * Shared across every SDK adapter package (OpenAI, Anthropic, Bedrock…)
25
- * so each provider converts schemas identically.
26
- *
27
- * @example
28
- * const schema = extractJsonSchema(mySealSchema);
29
- * // { type: "object", properties: { ... }, required: [ ... ], additionalProperties: false }
30
- *
31
- * @example
32
- * // Ask for a different target explicitly
33
- * const draft = extractJsonSchema(mySealSchema, { target: "draft-2020-12" });
34
- */
35
- function extractJsonSchema(schema, options = {}) {
36
- if (!schema) return void 0;
37
- const sealJsonSchema = extractFromSealPath(schema, options.target ?? "openai-strict");
38
- if (sealJsonSchema) return sealJsonSchema;
39
- const topLevel = extractFromCandidateKeys(schema);
40
- if (topLevel) return topLevel;
41
- }
42
- /**
43
- * Probe the Standard JSON Schema V1 extension path on `schema["~standard"]`.
44
- * The spec defines `jsonSchema.input({ target, libraryOptions? })` as a
45
- * function returning a JSON Schema tailored to the requested target. We
46
- * pass the caller's target (default `"openai-strict"`) so the library
47
- * produces output ready for OpenAI's native structured-output mode
48
- * without additional post-processing.
49
- *
50
- * Calling `.input()` without a target would throw (or return garbage) per
51
- * the spec — a failure here returns `undefined` so the fallback probe
52
- * runs.
53
- */
54
- function extractFromSealPath(schema, target) {
55
- const standardSlot = schema["~standard"];
56
- if (!standardSlot || typeof standardSlot !== "object") return;
57
- const jsonSchemaSlot = standardSlot["jsonSchema"];
58
- if (!jsonSchemaSlot || typeof jsonSchemaSlot !== "object") return;
59
- const inputFn = jsonSchemaSlot["input"];
60
- if (typeof inputFn !== "function") return;
61
- try {
62
- const result = inputFn.call(jsonSchemaSlot, { target });
63
- if (result && typeof result === "object") return result;
64
- } catch {}
65
- }
66
- /**
67
- * Probe well-known top-level keys libraries use to expose their JSON
68
- * Schema. Supports both method form (rare) and property form (common).
69
- * Deliberately narrow — `toJSON` is NOT probed here because it's a
70
- * generic serialization hook that returns library-internal state for
71
- * many validators (Seal included), not a JSON Schema.
72
- */
73
- function extractFromCandidateKeys(schemaRecord) {
74
- for (const key of ["jsonSchema", "_jsonSchema"]) {
75
- const value = schemaRecord[key];
76
- if (typeof value === "function") {
77
- try {
78
- const result = value.call(schemaRecord);
79
- if (result && typeof result === "object") return result;
80
- } catch {}
81
- continue;
82
- }
83
- if (value && typeof value === "object") return value;
84
- }
85
- }
86
-
87
- //#endregion
88
- export { extractJsonSchema };
89
- //# sourceMappingURL=json-schema.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"json-schema.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/utils/json-schema.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n/**\n * Supported JSON Schema output targets per the Standard JSON Schema V1\n * spec. `openai-strict` is the richest for OpenAI structured outputs —\n * every property listed in `required`, optionals expressed as\n * `[\"T\", \"null\"]`, `additionalProperties: false` everywhere. Other\n * targets produce standards-compliant but looser output.\n */\nexport type JsonSchemaTarget = \"draft-2020-12\" | \"draft-07\" | \"openapi-3.0\" | \"openai-strict\";\n\n/**\n * Options for `extractJsonSchema`. `target` is forwarded to libraries that\n * implement the Standard JSON Schema V1 spec (Seal, and any future lib\n * that follows the spec). Libraries using their own top-level `.jsonSchema`\n * / `._jsonSchema` property ignore the target.\n */\nexport type ExtractJsonSchemaOptions = {\n target?: JsonSchemaTarget | (string & {});\n};\n\n/**\n * Best-effort JSON Schema extraction from a Standard Schema instance.\n *\n * Different libraries expose their JSON representation through different\n * paths:\n * - **Seal / Standard JSON Schema V1**: `[\"~standard\"].jsonSchema.input({ target })`\n * — nested under the spec object, takes a target switch. Default target\n * is `\"openai-strict\"` since the primary consumer is OpenAI's native\n * structured-output mechanism; pass `options.target` to override.\n * - **Zod / similar**: top-level `.jsonSchema` property. Zod v4 actually\n * ships `toJSONSchema` as a module function, not a method, so it does\n * NOT hit this probe — Zod users pass their converted schema via the\n * `AgentExecuteOptions.responseSchema` escape hatch.\n *\n * Deliberately does NOT probe `toJSON` — that's a generic JavaScript\n * serialization hook (Seal's schemas have one that dumps internal rule\n * state) and matching it would return garbage disguised as a JSON Schema.\n *\n * Returns `undefined` when no path matches. The caller then either skips\n * native structured-output wiring or falls back to a schema-less\n * instruction.\n *\n * Shared across every SDK adapter package (OpenAI, Anthropic, Bedrock…)\n * so each provider converts schemas identically.\n *\n * @example\n * const schema = extractJsonSchema(mySealSchema);\n * // { type: \"object\", properties: { ... }, required: [ ... ], additionalProperties: false }\n *\n * @example\n * // Ask for a different target explicitly\n * const draft = extractJsonSchema(mySealSchema, { target: \"draft-2020-12\" });\n */\nexport function extractJsonSchema(\n schema: StandardSchemaV1<unknown> | undefined,\n options: ExtractJsonSchemaOptions = {},\n): Record<string, unknown> | undefined {\n if (!schema) return undefined;\n\n const target = options.target ?? \"openai-strict\";\n\n // 1. Seal / Standard JSON Schema V1 pattern: [\"~standard\"].jsonSchema.input({ target })\n const sealJsonSchema = extractFromSealPath(schema, target);\n\n if (sealJsonSchema) {\n return sealJsonSchema;\n }\n\n // 2. Top-level jsonSchema / _jsonSchema (Zod-like, property or method form)\n const topLevel = extractFromCandidateKeys(schema as unknown as Record<string, unknown>);\n\n if (topLevel) {\n return topLevel;\n }\n\n return undefined;\n}\n\n/**\n * Probe the Standard JSON Schema V1 extension path on `schema[\"~standard\"]`.\n * The spec defines `jsonSchema.input({ target, libraryOptions? })` as a\n * function returning a JSON Schema tailored to the requested target. We\n * pass the caller's target (default `\"openai-strict\"`) so the library\n * produces output ready for OpenAI's native structured-output mode\n * without additional post-processing.\n *\n * Calling `.input()` without a target would throw (or return garbage) per\n * the spec — a failure here returns `undefined` so the fallback probe\n * runs.\n */\nfunction extractFromSealPath(\n schema: StandardSchemaV1<unknown>,\n target: string,\n): Record<string, unknown> | undefined {\n const standardSlot = (schema as unknown as Record<string, unknown>)[\"~standard\"];\n\n if (!standardSlot || typeof standardSlot !== \"object\") {\n return undefined;\n }\n\n const jsonSchemaSlot = (standardSlot as Record<string, unknown>)[\"jsonSchema\"];\n\n if (!jsonSchemaSlot || typeof jsonSchemaSlot !== \"object\") {\n return undefined;\n }\n\n const inputFn = (jsonSchemaSlot as Record<string, unknown>)[\"input\"];\n\n if (typeof inputFn !== \"function\") {\n return undefined;\n }\n\n try {\n const result = (inputFn as (options: { target: string }) => unknown).call(jsonSchemaSlot, {\n target,\n });\n\n if (result && typeof result === \"object\") {\n return result as Record<string, unknown>;\n }\n } catch {\n // fall through — library didn't support the target or threw otherwise\n }\n\n return undefined;\n}\n\n/**\n * Probe well-known top-level keys libraries use to expose their JSON\n * Schema. Supports both method form (rare) and property form (common).\n * Deliberately narrow — `toJSON` is NOT probed here because it's a\n * generic serialization hook that returns library-internal state for\n * many validators (Seal included), not a JSON Schema.\n */\nfunction extractFromCandidateKeys(\n schemaRecord: Record<string, unknown>,\n): Record<string, unknown> | undefined {\n const candidateKeys = [\"jsonSchema\", \"_jsonSchema\"] as const;\n\n for (const key of candidateKeys) {\n const value = schemaRecord[key];\n\n if (typeof value === \"function\") {\n try {\n const result = (value as () => unknown).call(schemaRecord);\n\n if (result && typeof result === \"object\") {\n return result as Record<string, unknown>;\n }\n } catch {\n // try next candidate\n }\n\n continue;\n }\n\n if (value && typeof value === \"object\") {\n return value as Record<string, unknown>;\n }\n }\n\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsDA,SAAgB,kBACd,QACA,UAAoC,CAAC,GACA;CACrC,IAAI,CAAC,QAAQ,OAAO;CAKpB,MAAM,iBAAiB,oBAAoB,QAH5B,QAAQ,UAAU,eAGwB;CAEzD,IAAI,gBACF,OAAO;CAIT,MAAM,WAAW,yBAAyB,MAA4C;CAEtF,IAAI,UACF,OAAO;AAIX;;;;;;;;;;;;;AAcA,SAAS,oBACP,QACA,QACqC;CACrC,MAAM,eAAgB,OAA8C;CAEpE,IAAI,CAAC,gBAAgB,OAAO,iBAAiB,UAC3C;CAGF,MAAM,iBAAkB,aAAyC;CAEjE,IAAI,CAAC,kBAAkB,OAAO,mBAAmB,UAC/C;CAGF,MAAM,UAAW,eAA2C;CAE5D,IAAI,OAAO,YAAY,YACrB;CAGF,IAAI;EACF,MAAM,SAAU,QAAqD,KAAK,gBAAgB,EACxF,OACF,CAAC;EAED,IAAI,UAAU,OAAO,WAAW,UAC9B,OAAO;CAEX,QAAQ,CAER;AAGF;;;;;;;;AASA,SAAS,yBACP,cACqC;CAGrC,KAAK,MAAM,OAAO,CAFK,cAAc,aAEP,GAAG;EAC/B,MAAM,QAAQ,aAAa;EAE3B,IAAI,OAAO,UAAU,YAAY;GAC/B,IAAI;IACF,MAAM,SAAU,MAAwB,KAAK,YAAY;IAEzD,IAAI,UAAU,OAAO,WAAW,UAC9B,OAAO;GAEX,QAAQ,CAER;GAEA;EACF;EAEA,IAAI,SAAS,OAAO,UAAU,UAC5B,OAAO;CAEX;AAGF"}
@@ -1,232 +0,0 @@
1
- import { InvalidRequestError } from "../errors/invalid-request-error.mjs";
2
- import { OutboundPolicyError } from "../errors/outbound-policy-error.mjs";
3
- import "../errors/index.mjs";
4
- import { fetchTextWithPolicy } from "../security/outbound-policy.mjs";
5
- import { resolveAttachment } from "./resolve-attachment.mjs";
6
- import { extname, isAbsolute, relative, resolve } from "node:path";
7
- import { readFile } from "node:fs/promises";
8
-
9
- //#region ../@warlock.js/ai/src/utils/prepare-attachment-part.ts
10
- const IMAGE_EXTENSIONS_TO_MEDIA_TYPE = {
11
- ".png": "image/png",
12
- ".jpg": "image/jpeg",
13
- ".jpeg": "image/jpeg",
14
- ".webp": "image/webp",
15
- ".gif": "image/gif"
16
- };
17
- const TEXT_EXTENSIONS = new Set([".txt"]);
18
- const AUDIO_EXTENSIONS_TO_MEDIA_TYPE = {
19
- ".mp3": "audio/mpeg",
20
- ".wav": "audio/wav",
21
- ".m4a": "audio/mp4",
22
- ".ogg": "audio/ogg",
23
- ".weba": "audio/webm"
24
- };
25
- const PDF_EXTENSIONS = new Set([".pdf"]);
26
- /**
27
- * Convert a user-supplied `Attachment` into a provider-ready
28
- * `ContentPart` the model adapter can consume without doing any I/O of
29
- * its own.
30
- *
31
- * Kind resolution:
32
- * - Tagged `{ type: "image", source }` / `{ type: "text", source }`
33
- * trusts the caller's intent.
34
- * - Shorthand (raw string / `StorageFileShape`) infers from the file
35
- * extension. Image extensions (`.png`/`.jpg`/`.jpeg`/`.webp`/`.gif`)
36
- * map to `"image"`. `.txt` maps to `"text"`. Anything else throws
37
- * `InvalidRequestError` — silent inference on ambiguous inputs
38
- * causes silent bugs.
39
- *
40
- * Local paths are read from disk; images are base64-encoded inline,
41
- * text files are read as UTF-8 strings and returned as a `text`
42
- * `ContentPart`. Remote URLs for image attachments are passed through
43
- * unchanged; remote URLs for text attachments are fetched so the
44
- * adapter never needs network access.
45
- *
46
- * @example
47
- * await prepareAttachmentPart("./photo.png");
48
- * // → { type: "image", source: { base64: "...", mediaType: "image/png" } }
49
- *
50
- * @example
51
- * await prepareAttachmentPart({ type: "text", source: "./notes.txt" });
52
- * // → { type: "text", text: "<file contents>" }
53
- *
54
- * **Trust boundary (S1).** Attachment references are often user-controlled,
55
- * so server-side I/O is policy-gated by `policy` ({@link AttachmentPolicy}):
56
- * remote text fetches are default-deny and, when enabled, run through the
57
- * shared `OutboundPolicy` (scheme/host/private-IP/max-bytes/timeout); local
58
- * reads honor an `allowedRoots` sandbox; bare-string local paths warn
59
- * (staged deprecation). URL *image* attachments are passed to the provider
60
- * untouched (never fetched here).
61
- */
62
- async function prepareAttachmentPart(attachment, policy) {
63
- const kind = resolveKind(attachment);
64
- const bareString = typeof attachment === "string";
65
- if (kind === "text") return prepareTextPart(attachment, policy, bareString);
66
- if (kind === "image") return prepareImagePart(attachment, policy, bareString);
67
- return prepareBinaryPart(attachment, kind, policy, bareString);
68
- }
69
- /**
70
- * Decide whether the attachment is text or image. Tagged forms win
71
- * immediately; for shorthand we inspect the extension. Throws if the
72
- * shorthand doesn't look like anything we recognize.
73
- */
74
- function resolveKind(attachment) {
75
- if (isTaggedAttachment(attachment)) return attachment.type;
76
- const path = extractPath(attachment);
77
- const extension = path ? extname(stripQuery(path)).toLowerCase() : "";
78
- if (IMAGE_EXTENSIONS_TO_MEDIA_TYPE[extension]) return "image";
79
- if (TEXT_EXTENSIONS.has(extension)) return "text";
80
- if (PDF_EXTENSIONS.has(extension)) return "pdf";
81
- if (AUDIO_EXTENSIONS_TO_MEDIA_TYPE[extension]) return "audio";
82
- throw new InvalidRequestError("Cannot infer attachment type from input — pass an explicit `{ type: 'image' | 'text' | 'pdf' | 'audio', source: ... }` or use a recognized extension (.png, .jpg, .jpeg, .webp, .gif, .txt, .pdf, .mp3, .wav, .m4a, .ogg, .weba)");
83
- }
84
- /**
85
- * Produce a `pdf` / `audio` ContentPart (A2). URLs pass through; local
86
- * paths are read and base64-encoded with a media type inferred from the
87
- * kind (`application/pdf`) or extension (audio); inline base64 passes
88
- * through. Same `AttachmentPolicy` gating as image/text reads.
89
- */
90
- async function prepareBinaryPart(attachment, kind, policy, bareString) {
91
- const resolved = resolveAttachment(attachment);
92
- if (resolved.type === "url") return {
93
- type: kind,
94
- source: { url: resolved.value }
95
- };
96
- if (resolved.type === "base64") return {
97
- type: kind,
98
- source: {
99
- base64: resolved.value,
100
- mediaType: resolved.mediaType
101
- }
102
- };
103
- const mediaType = kind === "pdf" ? "application/pdf" : inferAudioMediaType(resolved.value);
104
- if (!mediaType) throw new InvalidRequestError(`Cannot infer media type for ${kind} path "${resolved.value}" — use a recognized extension or pass \`{ type: '${kind}', source: { base64, mediaType } }\``, { context: { path: resolved.value } });
105
- enforceLocalPathPolicy(resolved.value, bareString, policy);
106
- return {
107
- type: kind,
108
- source: {
109
- base64: (await readFile(resolved.value)).toString("base64"),
110
- mediaType
111
- }
112
- };
113
- }
114
- /** Infer an audio media type from a path's extension. */
115
- function inferAudioMediaType(path) {
116
- return AUDIO_EXTENSIONS_TO_MEDIA_TYPE[extname(stripQuery(path)).toLowerCase()];
117
- }
118
- /**
119
- * Produce an `image` ContentPart. URLs pass through; paths are
120
- * read from disk and base64-encoded with an inferred media type.
121
- * Inline base64 attachments pass through unchanged.
122
- */
123
- async function prepareImagePart(attachment, policy, bareString) {
124
- const inferredMediaType = isTaggedAttachment(attachment) ? void 0 : inferImageMediaType(attachment);
125
- const resolved = resolveAttachment(attachment);
126
- if (resolved.type === "url") return {
127
- type: "image",
128
- source: { url: resolved.value }
129
- };
130
- if (resolved.type === "base64") return {
131
- type: "image",
132
- source: {
133
- base64: resolved.value,
134
- mediaType: resolved.mediaType
135
- }
136
- };
137
- const mediaType = inferredMediaType ?? inferImageMediaType(resolved.value);
138
- if (!mediaType) throw new InvalidRequestError(`Cannot infer media type for path "${resolved.value}" — use a recognized image extension or pass \`{ type: 'image', source: { base64, mediaType } }\``, { context: { path: resolved.value } });
139
- enforceLocalPathPolicy(resolved.value, bareString, policy);
140
- return {
141
- type: "image",
142
- source: {
143
- base64: (await readFile(resolved.value)).toString("base64"),
144
- mediaType
145
- }
146
- };
147
- }
148
- /**
149
- * Produce a `text` ContentPart. URLs are fetched as UTF-8, paths are
150
- * read from disk as UTF-8, inline base64 is decoded to UTF-8. The
151
- * result joins the conversation as an additional text part the model
152
- * sees before responding.
153
- */
154
- async function prepareTextPart(attachment, policy, bareString) {
155
- const resolved = resolveAttachment(attachment);
156
- if (resolved.type === "url") {
157
- if (!policy?.allowRemoteFetch) throw new OutboundPolicyError(`remote text attachment fetch is disabled by default — set \`attachmentPolicy.allowRemoteFetch: true\` (with an \`outbound\` policy) to fetch "${resolved.value}"`, { context: { url: resolved.value } });
158
- const result = await fetchTextWithPolicy(resolved.value, policy.outbound ?? {});
159
- if (!result.ok) throw new InvalidRequestError(`Failed to fetch text attachment "${resolved.value}" — status ${result.status}`, { context: {
160
- url: resolved.value,
161
- status: result.status
162
- } });
163
- return {
164
- type: "text",
165
- text: result.text
166
- };
167
- }
168
- if (resolved.type === "base64") return {
169
- type: "text",
170
- text: Buffer.from(resolved.value, "base64").toString("utf8")
171
- };
172
- enforceLocalPathPolicy(resolved.value, bareString, policy);
173
- return {
174
- type: "text",
175
- text: await readFile(resolved.value, "utf8")
176
- };
177
- }
178
- /** Process-lifetime flag so the bare-string deprecation warns at most once. */
179
- let warnedBareLocalPath = false;
180
- /**
181
- * Enforce the local-file half of {@link AttachmentPolicy} (S1):
182
- *
183
- * - **Bare-string local paths** are staged for deprecation. With
184
- * `allowBareLocalPaths: false` they hard-deny now; otherwise they warn
185
- * once (outside tests) — the typed `StorageFile.absolutePath` route is
186
- * the supported way to read a local file.
187
- * - **`allowedRoots` sandbox** — when set, the resolved path must live
188
- * inside one of the roots, else the read is refused.
189
- */
190
- function enforceLocalPathPolicy(path, bareString, policy) {
191
- if (bareString) {
192
- if (policy?.allowBareLocalPaths === false) throw new OutboundPolicyError(`local file attachment via a bare string path ("${path}") is disabled — pass a typed \`{ type, source: { absolutePath } }\` StorageFile, or set \`attachmentPolicy.allowBareLocalPaths: true\``, { context: { path } });
193
- if (!warnedBareLocalPath && !process.env.VITEST && process.env.NODE_ENV !== "test") {
194
- warnedBareLocalPath = true;
195
- console.warn("[warlock-ai] reading a local file attachment from a bare string path is deprecated and will be denied by default in a future minor. Pass a typed `{ type, source: { absolutePath } }` StorageFile and confine reads with `attachmentPolicy.allowedRoots`.");
196
- }
197
- }
198
- const roots = policy?.allowedRoots;
199
- if (roots && roots.length > 0) {
200
- const target = resolve(path);
201
- if (!roots.some((root) => {
202
- const rel = relative(resolve(root), target);
203
- return rel === "" || !rel.startsWith("..") && !isAbsolute(rel);
204
- })) throw new OutboundPolicyError(`local file attachment "${path}" is outside the allowed roots`, { context: {
205
- path,
206
- allowedRoots: roots
207
- } });
208
- }
209
- }
210
- function isTaggedAttachment(attachment) {
211
- return typeof attachment === "object" && attachment !== null && "type" in attachment;
212
- }
213
- function inferImageMediaType(input) {
214
- const path = extractPath(input);
215
- if (!path) return;
216
- return IMAGE_EXTENSIONS_TO_MEDIA_TYPE[extname(stripQuery(path)).toLowerCase()];
217
- }
218
- function extractPath(input) {
219
- if (typeof input === "string") return input;
220
- if (typeof input === "object" && input !== null) {
221
- const storage = input;
222
- return storage.url ?? storage.absolutePath;
223
- }
224
- }
225
- function stripQuery(path) {
226
- const queryIndex = path.indexOf("?");
227
- return queryIndex === -1 ? path : path.slice(0, queryIndex);
228
- }
229
-
230
- //#endregion
231
- export { prepareAttachmentPart };
232
- //# sourceMappingURL=prepare-attachment-part.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prepare-attachment-part.mjs","names":["resolvePath"],"sources":["../../../../../../../../../@warlock.js/ai/src/utils/prepare-attachment-part.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { extname, isAbsolute, relative, resolve as resolvePath } from \"node:path\";\nimport type { AttachmentPolicy } from \"../contracts/attachment-policy.type\";\nimport type { Attachment } from \"../contracts/attachment.type\";\nimport type { ContentPart } from \"../contracts/content-part.type\";\nimport { InvalidRequestError, OutboundPolicyError } from \"../errors\";\nimport { fetchTextWithPolicy } from \"../security/outbound-policy\";\nimport { resolveAttachment } from \"./resolve-attachment\";\n\nconst IMAGE_EXTENSIONS_TO_MEDIA_TYPE: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".webp\": \"image/webp\",\n \".gif\": \"image/gif\",\n};\n\nconst TEXT_EXTENSIONS = new Set([\".txt\"]);\n\nconst AUDIO_EXTENSIONS_TO_MEDIA_TYPE: Record<string, string> = {\n \".mp3\": \"audio/mpeg\",\n \".wav\": \"audio/wav\",\n \".m4a\": \"audio/mp4\",\n \".ogg\": \"audio/ogg\",\n \".weba\": \"audio/webm\",\n};\n\nconst PDF_EXTENSIONS = new Set([\".pdf\"]);\n\ntype AttachmentKind = \"image\" | \"text\" | \"pdf\" | \"audio\";\n\n/**\n * Convert a user-supplied `Attachment` into a provider-ready\n * `ContentPart` the model adapter can consume without doing any I/O of\n * its own.\n *\n * Kind resolution:\n * - Tagged `{ type: \"image\", source }` / `{ type: \"text\", source }`\n * trusts the caller's intent.\n * - Shorthand (raw string / `StorageFileShape`) infers from the file\n * extension. Image extensions (`.png`/`.jpg`/`.jpeg`/`.webp`/`.gif`)\n * map to `\"image\"`. `.txt` maps to `\"text\"`. Anything else throws\n * `InvalidRequestError` — silent inference on ambiguous inputs\n * causes silent bugs.\n *\n * Local paths are read from disk; images are base64-encoded inline,\n * text files are read as UTF-8 strings and returned as a `text`\n * `ContentPart`. Remote URLs for image attachments are passed through\n * unchanged; remote URLs for text attachments are fetched so the\n * adapter never needs network access.\n *\n * @example\n * await prepareAttachmentPart(\"./photo.png\");\n * // → { type: \"image\", source: { base64: \"...\", mediaType: \"image/png\" } }\n *\n * @example\n * await prepareAttachmentPart({ type: \"text\", source: \"./notes.txt\" });\n * // → { type: \"text\", text: \"<file contents>\" }\n *\n * **Trust boundary (S1).** Attachment references are often user-controlled,\n * so server-side I/O is policy-gated by `policy` ({@link AttachmentPolicy}):\n * remote text fetches are default-deny and, when enabled, run through the\n * shared `OutboundPolicy` (scheme/host/private-IP/max-bytes/timeout); local\n * reads honor an `allowedRoots` sandbox; bare-string local paths warn\n * (staged deprecation). URL *image* attachments are passed to the provider\n * untouched (never fetched here).\n */\nexport async function prepareAttachmentPart(\n attachment: Attachment,\n policy?: AttachmentPolicy,\n): Promise<ContentPart> {\n const kind = resolveKind(attachment);\n const bareString = typeof attachment === \"string\";\n\n if (kind === \"text\") {\n return prepareTextPart(attachment, policy, bareString);\n }\n\n if (kind === \"image\") {\n return prepareImagePart(attachment, policy, bareString);\n }\n\n return prepareBinaryPart(attachment, kind, policy, bareString);\n}\n\n/**\n * Decide whether the attachment is text or image. Tagged forms win\n * immediately; for shorthand we inspect the extension. Throws if the\n * shorthand doesn't look like anything we recognize.\n */\nfunction resolveKind(attachment: Attachment): AttachmentKind {\n if (isTaggedAttachment(attachment)) {\n return attachment.type;\n }\n\n const path = extractPath(attachment);\n const extension = path ? extname(stripQuery(path)).toLowerCase() : \"\";\n\n if (IMAGE_EXTENSIONS_TO_MEDIA_TYPE[extension]) {\n return \"image\";\n }\n\n if (TEXT_EXTENSIONS.has(extension)) {\n return \"text\";\n }\n\n if (PDF_EXTENSIONS.has(extension)) {\n return \"pdf\";\n }\n\n if (AUDIO_EXTENSIONS_TO_MEDIA_TYPE[extension]) {\n return \"audio\";\n }\n\n throw new InvalidRequestError(\n \"Cannot infer attachment type from input — pass an explicit `{ type: 'image' | 'text' | 'pdf' | 'audio', source: ... }` or use a recognized extension (.png, .jpg, .jpeg, .webp, .gif, .txt, .pdf, .mp3, .wav, .m4a, .ogg, .weba)\",\n );\n}\n\n/**\n * Produce a `pdf` / `audio` ContentPart (A2). URLs pass through; local\n * paths are read and base64-encoded with a media type inferred from the\n * kind (`application/pdf`) or extension (audio); inline base64 passes\n * through. Same `AttachmentPolicy` gating as image/text reads.\n */\nasync function prepareBinaryPart(\n attachment: Attachment,\n kind: \"pdf\" | \"audio\",\n policy: AttachmentPolicy | undefined,\n bareString: boolean,\n): Promise<ContentPart> {\n const resolved = resolveAttachment(attachment);\n\n if (resolved.type === \"url\") {\n return { type: kind, source: { url: resolved.value } };\n }\n\n if (resolved.type === \"base64\") {\n return { type: kind, source: { base64: resolved.value, mediaType: resolved.mediaType } };\n }\n\n const mediaType =\n kind === \"pdf\" ? \"application/pdf\" : inferAudioMediaType(resolved.value);\n\n if (!mediaType) {\n throw new InvalidRequestError(\n `Cannot infer media type for ${kind} path \"${resolved.value}\" — use a recognized extension or pass ` +\n `\\`{ type: '${kind}', source: { base64, mediaType } }\\``,\n { context: { path: resolved.value } },\n );\n }\n\n enforceLocalPathPolicy(resolved.value, bareString, policy);\n const bytes = await readFile(resolved.value);\n\n return { type: kind, source: { base64: bytes.toString(\"base64\"), mediaType } };\n}\n\n/** Infer an audio media type from a path's extension. */\nfunction inferAudioMediaType(path: string): string | undefined {\n return AUDIO_EXTENSIONS_TO_MEDIA_TYPE[extname(stripQuery(path)).toLowerCase()];\n}\n\n/**\n * Produce an `image` ContentPart. URLs pass through; paths are\n * read from disk and base64-encoded with an inferred media type.\n * Inline base64 attachments pass through unchanged.\n */\nasync function prepareImagePart(\n attachment: Attachment,\n policy: AttachmentPolicy | undefined,\n bareString: boolean,\n): Promise<ContentPart> {\n const inferredMediaType = isTaggedAttachment(attachment)\n ? undefined\n : inferImageMediaType(attachment);\n\n const resolved = resolveAttachment(attachment);\n\n if (resolved.type === \"url\") {\n // URL images are handed to the provider as a URL — the provider\n // fetches them, not us — so there's no server-side SSRF surface here.\n return { type: \"image\", source: { url: resolved.value } };\n }\n\n if (resolved.type === \"base64\") {\n return {\n type: \"image\",\n source: { base64: resolved.value, mediaType: resolved.mediaType },\n };\n }\n\n const mediaType = inferredMediaType ?? inferImageMediaType(resolved.value);\n\n if (!mediaType) {\n throw new InvalidRequestError(\n `Cannot infer media type for path \"${resolved.value}\" — use a recognized image extension or pass ` +\n \"`{ type: 'image', source: { base64, mediaType } }`\",\n { context: { path: resolved.value } },\n );\n }\n\n enforceLocalPathPolicy(resolved.value, bareString, policy);\n const bytes = await readFile(resolved.value);\n\n return {\n type: \"image\",\n source: { base64: bytes.toString(\"base64\"), mediaType },\n };\n}\n\n/**\n * Produce a `text` ContentPart. URLs are fetched as UTF-8, paths are\n * read from disk as UTF-8, inline base64 is decoded to UTF-8. The\n * result joins the conversation as an additional text part the model\n * sees before responding.\n */\nasync function prepareTextPart(\n attachment: Attachment,\n policy: AttachmentPolicy | undefined,\n bareString: boolean,\n): Promise<ContentPart> {\n const resolved = resolveAttachment(attachment);\n\n if (resolved.type === \"url\") {\n // Default-deny: a remote text attachment is a server-side fetch of\n // user-controlled input — refuse unless the app explicitly opted in,\n // then run it through the shared OutboundPolicy (scheme/host/private-\n // IP/max-bytes/timeout).\n if (!policy?.allowRemoteFetch) {\n throw new OutboundPolicyError(\n `remote text attachment fetch is disabled by default — set \\`attachmentPolicy.allowRemoteFetch: true\\` (with an \\`outbound\\` policy) to fetch \"${resolved.value}\"`,\n { context: { url: resolved.value } },\n );\n }\n\n const result = await fetchTextWithPolicy(resolved.value, policy.outbound ?? {});\n\n if (!result.ok) {\n throw new InvalidRequestError(\n `Failed to fetch text attachment \"${resolved.value}\" — status ${result.status}`,\n { context: { url: resolved.value, status: result.status } },\n );\n }\n\n return { type: \"text\", text: result.text };\n }\n\n if (resolved.type === \"base64\") {\n const decoded = Buffer.from(resolved.value, \"base64\").toString(\"utf8\");\n\n return { type: \"text\", text: decoded };\n }\n\n enforceLocalPathPolicy(resolved.value, bareString, policy);\n const bytes = await readFile(resolved.value, \"utf8\");\n\n return { type: \"text\", text: bytes };\n}\n\n/** Process-lifetime flag so the bare-string deprecation warns at most once. */\nlet warnedBareLocalPath = false;\n\n/**\n * Enforce the local-file half of {@link AttachmentPolicy} (S1):\n *\n * - **Bare-string local paths** are staged for deprecation. With\n * `allowBareLocalPaths: false` they hard-deny now; otherwise they warn\n * once (outside tests) — the typed `StorageFile.absolutePath` route is\n * the supported way to read a local file.\n * - **`allowedRoots` sandbox** — when set, the resolved path must live\n * inside one of the roots, else the read is refused.\n */\nfunction enforceLocalPathPolicy(\n path: string,\n bareString: boolean,\n policy: AttachmentPolicy | undefined,\n): void {\n if (bareString) {\n if (policy?.allowBareLocalPaths === false) {\n throw new OutboundPolicyError(\n `local file attachment via a bare string path (\"${path}\") is disabled — pass a typed \\`{ type, source: { absolutePath } }\\` StorageFile, or set \\`attachmentPolicy.allowBareLocalPaths: true\\``,\n { context: { path } },\n );\n }\n\n if (!warnedBareLocalPath && !process.env.VITEST && process.env.NODE_ENV !== \"test\") {\n warnedBareLocalPath = true;\n console.warn(\n \"[warlock-ai] reading a local file attachment from a bare string path is deprecated and will be denied by default in a future minor. \" +\n \"Pass a typed `{ type, source: { absolutePath } }` StorageFile and confine reads with `attachmentPolicy.allowedRoots`.\",\n );\n }\n }\n\n const roots = policy?.allowedRoots;\n if (roots && roots.length > 0) {\n const target = resolvePath(path);\n const inside = roots.some(root => {\n const rel = relative(resolvePath(root), target);\n return rel === \"\" || (!rel.startsWith(\"..\") && !isAbsolute(rel));\n });\n\n if (!inside) {\n throw new OutboundPolicyError(\n `local file attachment \"${path}\" is outside the allowed roots`,\n { context: { path, allowedRoots: roots } },\n );\n }\n }\n}\n\nfunction isTaggedAttachment(\n attachment: Attachment,\n): attachment is Extract<Attachment, { type: string }> {\n return (\n typeof attachment === \"object\" &&\n attachment !== null &&\n \"type\" in attachment\n );\n}\n\nfunction inferImageMediaType(input: unknown): string | undefined {\n const path = extractPath(input);\n\n if (!path) {\n return undefined;\n }\n\n const extension = extname(stripQuery(path)).toLowerCase();\n\n return IMAGE_EXTENSIONS_TO_MEDIA_TYPE[extension];\n}\n\nfunction extractPath(input: unknown): string | undefined {\n if (typeof input === \"string\") {\n return input;\n }\n\n if (typeof input === \"object\" && input !== null) {\n const storage = input as { url?: string; absolutePath?: string };\n return storage.url ?? storage.absolutePath;\n }\n\n return undefined;\n}\n\nfunction stripQuery(path: string): string {\n const queryIndex = path.indexOf(\"?\");\n\n return queryIndex === -1 ? path : path.slice(0, queryIndex);\n}\n"],"mappings":";;;;;;;;;AASA,MAAM,iCAAyD;CAC7D,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,SAAS;CACT,QAAQ;AACV;AAEA,MAAM,kBAAkB,IAAI,IAAI,CAAC,MAAM,CAAC;AAExC,MAAM,iCAAyD;CAC7D,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;AACX;AAEA,MAAM,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCvC,eAAsB,sBACpB,YACA,QACsB;CACtB,MAAM,OAAO,YAAY,UAAU;CACnC,MAAM,aAAa,OAAO,eAAe;CAEzC,IAAI,SAAS,QACX,OAAO,gBAAgB,YAAY,QAAQ,UAAU;CAGvD,IAAI,SAAS,SACX,OAAO,iBAAiB,YAAY,QAAQ,UAAU;CAGxD,OAAO,kBAAkB,YAAY,MAAM,QAAQ,UAAU;AAC/D;;;;;;AAOA,SAAS,YAAY,YAAwC;CAC3D,IAAI,mBAAmB,UAAU,GAC/B,OAAO,WAAW;CAGpB,MAAM,OAAO,YAAY,UAAU;CACnC,MAAM,YAAY,OAAO,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC,YAAY,IAAI;CAEnE,IAAI,+BAA+B,YACjC,OAAO;CAGT,IAAI,gBAAgB,IAAI,SAAS,GAC/B,OAAO;CAGT,IAAI,eAAe,IAAI,SAAS,GAC9B,OAAO;CAGT,IAAI,+BAA+B,YACjC,OAAO;CAGT,MAAM,IAAI,oBACR,kOACF;AACF;;;;;;;AAQA,eAAe,kBACb,YACA,MACA,QACA,YACsB;CACtB,MAAM,WAAW,kBAAkB,UAAU;CAE7C,IAAI,SAAS,SAAS,OACpB,OAAO;EAAE,MAAM;EAAM,QAAQ,EAAE,KAAK,SAAS,MAAM;CAAE;CAGvD,IAAI,SAAS,SAAS,UACpB,OAAO;EAAE,MAAM;EAAM,QAAQ;GAAE,QAAQ,SAAS;GAAO,WAAW,SAAS;EAAU;CAAE;CAGzF,MAAM,YACJ,SAAS,QAAQ,oBAAoB,oBAAoB,SAAS,KAAK;CAEzE,IAAI,CAAC,WACH,MAAM,IAAI,oBACR,+BAA+B,KAAK,SAAS,SAAS,MAAM,oDAC5C,KAAK,uCACrB,EAAE,SAAS,EAAE,MAAM,SAAS,MAAM,EAAE,CACtC;CAGF,uBAAuB,SAAS,OAAO,YAAY,MAAM;CAGzD,OAAO;EAAE,MAAM;EAAM,QAAQ;GAAE,SAAQ,MAFnB,SAAS,SAAS,KAAK,EAEC,CAAC,SAAS,QAAQ;GAAG;EAAU;CAAE;AAC/E;;AAGA,SAAS,oBAAoB,MAAkC;CAC7D,OAAO,+BAA+B,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC,YAAY;AAC9E;;;;;;AAOA,eAAe,iBACb,YACA,QACA,YACsB;CACtB,MAAM,oBAAoB,mBAAmB,UAAU,IACnD,SACA,oBAAoB,UAAU;CAElC,MAAM,WAAW,kBAAkB,UAAU;CAE7C,IAAI,SAAS,SAAS,OAGpB,OAAO;EAAE,MAAM;EAAS,QAAQ,EAAE,KAAK,SAAS,MAAM;CAAE;CAG1D,IAAI,SAAS,SAAS,UACpB,OAAO;EACL,MAAM;EACN,QAAQ;GAAE,QAAQ,SAAS;GAAO,WAAW,SAAS;EAAU;CAClE;CAGF,MAAM,YAAY,qBAAqB,oBAAoB,SAAS,KAAK;CAEzE,IAAI,CAAC,WACH,MAAM,IAAI,oBACR,qCAAqC,SAAS,MAAM,oGAEpD,EAAE,SAAS,EAAE,MAAM,SAAS,MAAM,EAAE,CACtC;CAGF,uBAAuB,SAAS,OAAO,YAAY,MAAM;CAGzD,OAAO;EACL,MAAM;EACN,QAAQ;GAAE,SAAQ,MAJA,SAAS,SAAS,KAAK,EAIlB,CAAC,SAAS,QAAQ;GAAG;EAAU;CACxD;AACF;;;;;;;AAQA,eAAe,gBACb,YACA,QACA,YACsB;CACtB,MAAM,WAAW,kBAAkB,UAAU;CAE7C,IAAI,SAAS,SAAS,OAAO;EAK3B,IAAI,CAAC,QAAQ,kBACX,MAAM,IAAI,oBACR,iJAAiJ,SAAS,MAAM,IAChK,EAAE,SAAS,EAAE,KAAK,SAAS,MAAM,EAAE,CACrC;EAGF,MAAM,SAAS,MAAM,oBAAoB,SAAS,OAAO,OAAO,YAAY,CAAC,CAAC;EAE9E,IAAI,CAAC,OAAO,IACV,MAAM,IAAI,oBACR,oCAAoC,SAAS,MAAM,aAAa,OAAO,UACvE,EAAE,SAAS;GAAE,KAAK,SAAS;GAAO,QAAQ,OAAO;EAAO,EAAE,CAC5D;EAGF,OAAO;GAAE,MAAM;GAAQ,MAAM,OAAO;EAAK;CAC3C;CAEA,IAAI,SAAS,SAAS,UAGpB,OAAO;EAAE,MAAM;EAAQ,MAFP,OAAO,KAAK,SAAS,OAAO,QAAQ,CAAC,CAAC,SAAS,MAE5B;CAAE;CAGvC,uBAAuB,SAAS,OAAO,YAAY,MAAM;CAGzD,OAAO;EAAE,MAAM;EAAQ,MAAM,MAFT,SAAS,SAAS,OAAO,MAAM;CAEhB;AACrC;;AAGA,IAAI,sBAAsB;;;;;;;;;;;AAY1B,SAAS,uBACP,MACA,YACA,QACM;CACN,IAAI,YAAY;EACd,IAAI,QAAQ,wBAAwB,OAClC,MAAM,IAAI,oBACR,kDAAkD,KAAK,0IACvD,EAAE,SAAS,EAAE,KAAK,EAAE,CACtB;EAGF,IAAI,CAAC,uBAAuB,CAAC,QAAQ,IAAI,UAAU,QAAQ,IAAI,aAAa,QAAQ;GAClF,sBAAsB;GACtB,QAAQ,KACN,2PAEF;EACF;CACF;CAEA,MAAM,QAAQ,QAAQ;CACtB,IAAI,SAAS,MAAM,SAAS,GAAG;EAC7B,MAAM,SAASA,QAAY,IAAI;EAM/B,IAAI,CALW,MAAM,MAAK,SAAQ;GAChC,MAAM,MAAM,SAASA,QAAY,IAAI,GAAG,MAAM;GAC9C,OAAO,QAAQ,MAAO,CAAC,IAAI,WAAW,IAAI,KAAK,CAAC,WAAW,GAAG;EAChE,CAEU,GACR,MAAM,IAAI,oBACR,0BAA0B,KAAK,iCAC/B,EAAE,SAAS;GAAE;GAAM,cAAc;EAAM,EAAE,CAC3C;CAEJ;AACF;AAEA,SAAS,mBACP,YACqD;CACrD,OACE,OAAO,eAAe,YACtB,eAAe,QACf,UAAU;AAEd;AAEA,SAAS,oBAAoB,OAAoC;CAC/D,MAAM,OAAO,YAAY,KAAK;CAE9B,IAAI,CAAC,MACH;CAKF,OAAO,+BAFW,QAAQ,WAAW,IAAI,CAAC,CAAC,CAAC,YAEE;AAChD;AAEA,SAAS,YAAY,OAAoC;CACvD,IAAI,OAAO,UAAU,UACnB,OAAO;CAGT,IAAI,OAAO,UAAU,YAAY,UAAU,MAAM;EAC/C,MAAM,UAAU;EAChB,OAAO,QAAQ,OAAO,QAAQ;CAChC;AAGF;AAEA,SAAS,WAAW,MAAsB;CACxC,MAAM,aAAa,KAAK,QAAQ,GAAG;CAEnC,OAAO,eAAe,KAAK,OAAO,KAAK,MAAM,GAAG,UAAU;AAC5D"}
@@ -1,74 +0,0 @@
1
- import { InvalidRequestError } from "../errors/invalid-request-error.mjs";
2
- import "../errors/index.mjs";
3
-
4
- //#region ../@warlock.js/ai/src/utils/resolve-attachment.ts
5
- const REMOTE_URL_PATTERN = /^https?:\/\//i;
6
- /**
7
- * Normalize a user-supplied `Attachment` (or bare `AttachmentSource`)
8
- * into a `ResolvedAttachment` the agent can hand to file-reading code
9
- * without re-discriminating the input variant.
10
- *
11
- * Resolution rules:
12
- * - `{ base64, mediaType }` → `{ type: "base64", value, mediaType }`.
13
- * - `StorageFileShape` (`{ url?, absolutePath? }`) → `absolutePath` wins
14
- * over `url` when both are present (prefer the local file over an extra
15
- * remote hop). Absolute path becomes `{ type: "path" }`; url becomes
16
- * `{ type: "url" }`.
17
- * - String starting with `http://` / `https://` → `{ type: "url" }`.
18
- * - Any other string → `{ type: "path" }`.
19
- * - Tagged `{ type: "image" | "text", source }` → recurses into `source`.
20
- *
21
- * Throws `InvalidRequestError` on obviously invalid input (empty
22
- * string, storage object with neither url nor absolutePath, missing
23
- * source field).
24
- *
25
- * @example
26
- * resolveAttachment("https://cdn.example.com/doc.pdf");
27
- * // → { type: "url", value: "https://cdn.example.com/doc.pdf" }
28
- *
29
- * @example
30
- * resolveAttachment({ type: "image", source: "/tmp/x.png" });
31
- * // → { type: "path", value: "/tmp/x.png" }
32
- */
33
- function resolveAttachment(attachment) {
34
- if (typeof attachment === "object" && attachment !== null && "type" in attachment) return resolveSource(attachment.source);
35
- return resolveSource(attachment);
36
- }
37
- function resolveSource(source) {
38
- if (typeof source === "string") {
39
- if (!source) throw new InvalidRequestError("Cannot resolve empty attachment string");
40
- if (REMOTE_URL_PATTERN.test(source)) return {
41
- type: "url",
42
- value: source
43
- };
44
- return {
45
- type: "path",
46
- value: source
47
- };
48
- }
49
- if ("url" in source || "absolutePath" in source) {
50
- const storage = source;
51
- if (storage.absolutePath) return {
52
- type: "path",
53
- value: storage.absolutePath
54
- };
55
- if (storage.url) return {
56
- type: "url",
57
- value: storage.url
58
- };
59
- throw new InvalidRequestError("Storage attachment has neither url nor absolutePath");
60
- }
61
- if ("base64" in source) {
62
- if (!source.base64 || !source.mediaType) throw new InvalidRequestError("Inline attachment requires both `base64` and `mediaType`");
63
- return {
64
- type: "base64",
65
- value: source.base64,
66
- mediaType: source.mediaType
67
- };
68
- }
69
- throw new InvalidRequestError("Unrecognized attachment source — expected a string path/URL, a StorageFile, or `{ base64, mediaType }`");
70
- }
71
-
72
- //#endregion
73
- export { resolveAttachment };
74
- //# sourceMappingURL=resolve-attachment.mjs.map