@warlock.js/core 4.3.0 → 4.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (903) hide show
  1. package/CHANGELOG.md +61 -6
  2. package/README.md +47 -11
  3. package/esm/ai/src/agent/agent-input-builder.mjs +132 -0
  4. package/esm/ai/src/agent/agent-input-builder.mjs.map +1 -0
  5. package/esm/ai/src/agent/agent-log-event.mjs +101 -0
  6. package/esm/ai/src/agent/agent-log-event.mjs.map +1 -0
  7. package/esm/ai/src/agent/agent-stream.mjs +82 -0
  8. package/esm/ai/src/agent/agent-stream.mjs.map +1 -0
  9. package/esm/ai/src/agent/agent-to-stream-event.mjs +86 -0
  10. package/esm/ai/src/agent/agent-to-stream-event.mjs.map +1 -0
  11. package/esm/ai/src/agent/agent.mjs +1157 -0
  12. package/esm/ai/src/agent/agent.mjs.map +1 -0
  13. package/esm/ai/src/agent/index.mjs +5 -0
  14. package/esm/ai/src/agent/json-stream-guard.mjs +400 -0
  15. package/esm/ai/src/agent/json-stream-guard.mjs.map +1 -0
  16. package/esm/ai/src/agent/spawn-sub-agent.mjs +68 -0
  17. package/esm/ai/src/agent/spawn-sub-agent.mjs.map +1 -0
  18. package/esm/ai/src/ai.mjs +155 -0
  19. package/esm/ai/src/ai.mjs.map +1 -0
  20. package/esm/ai/src/batch/batch.mjs +198 -0
  21. package/esm/ai/src/batch/batch.mjs.map +1 -0
  22. package/esm/ai/src/batch/index.mjs +3 -0
  23. package/esm/ai/src/batch/run-batch-item.mjs +100 -0
  24. package/esm/ai/src/batch/run-batch-item.mjs.map +1 -0
  25. package/esm/ai/src/batch/run-with-concurrency.mjs +39 -0
  26. package/esm/ai/src/batch/run-with-concurrency.mjs.map +1 -0
  27. package/esm/ai/src/checkpoint/memory.mjs +0 -0
  28. package/esm/ai/src/checkpoint/memory.mjs.map +1 -0
  29. package/esm/ai/src/checkpoint/pg.mjs +265 -0
  30. package/esm/ai/src/checkpoint/pg.mjs.map +1 -0
  31. package/esm/ai/src/checkpoint/redis.mjs +200 -0
  32. package/esm/ai/src/checkpoint/redis.mjs.map +1 -0
  33. package/esm/ai/src/config.mjs +59 -0
  34. package/esm/ai/src/config.mjs.map +1 -0
  35. package/esm/ai/src/contracts/end.type.mjs +47 -0
  36. package/esm/ai/src/contracts/end.type.mjs.map +1 -0
  37. package/esm/ai/src/errors/agent-cancelled-error.mjs +43 -0
  38. package/esm/ai/src/errors/agent-cancelled-error.mjs.map +1 -0
  39. package/esm/ai/src/errors/agent-execution-error.mjs +35 -0
  40. package/esm/ai/src/errors/agent-execution-error.mjs.map +1 -0
  41. package/esm/ai/src/errors/agent-max-trips-error.mjs +41 -0
  42. package/esm/ai/src/errors/agent-max-trips-error.mjs.map +1 -0
  43. package/esm/ai/src/errors/ai-error.mjs +68 -0
  44. package/esm/ai/src/errors/ai-error.mjs.map +1 -0
  45. package/esm/ai/src/errors/budget-exceeded-error.mjs +31 -0
  46. package/esm/ai/src/errors/budget-exceeded-error.mjs.map +1 -0
  47. package/esm/ai/src/errors/content-filter-error.mjs +28 -0
  48. package/esm/ai/src/errors/content-filter-error.mjs.map +1 -0
  49. package/esm/ai/src/errors/context-length-exceeded-error.mjs +31 -0
  50. package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +1 -0
  51. package/esm/ai/src/errors/guardrail-violation-error.mjs +41 -0
  52. package/esm/ai/src/errors/guardrail-violation-error.mjs.map +1 -0
  53. package/esm/ai/src/errors/index.mjs +37 -0
  54. package/esm/ai/src/errors/invalid-request-error.mjs +31 -0
  55. package/esm/ai/src/errors/invalid-request-error.mjs.map +1 -0
  56. package/esm/ai/src/errors/max-iterations-error.mjs +32 -0
  57. package/esm/ai/src/errors/max-iterations-error.mjs.map +1 -0
  58. package/esm/ai/src/errors/max-steps-exceeded-error.mjs +21 -0
  59. package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +1 -0
  60. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +31 -0
  61. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +1 -0
  62. package/esm/ai/src/errors/orchestrator-config-error.mjs +30 -0
  63. package/esm/ai/src/errors/orchestrator-config-error.mjs.map +1 -0
  64. package/esm/ai/src/errors/orchestrator-drift-error.mjs +37 -0
  65. package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +1 -0
  66. package/esm/ai/src/errors/orchestrator-failed-error.mjs +36 -0
  67. package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +1 -0
  68. package/esm/ai/src/errors/outbound-policy-error.mjs +32 -0
  69. package/esm/ai/src/errors/outbound-policy-error.mjs.map +1 -0
  70. package/esm/ai/src/errors/planner-cancelled-error.mjs +29 -0
  71. package/esm/ai/src/errors/planner-cancelled-error.mjs.map +1 -0
  72. package/esm/ai/src/errors/planner-failed-error.mjs +37 -0
  73. package/esm/ai/src/errors/planner-failed-error.mjs.map +1 -0
  74. package/esm/ai/src/errors/planner-plan-invalid-error.mjs +25 -0
  75. package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +1 -0
  76. package/esm/ai/src/errors/provider-auth-error.mjs +26 -0
  77. package/esm/ai/src/errors/provider-auth-error.mjs.map +1 -0
  78. package/esm/ai/src/errors/provider-error.mjs +42 -0
  79. package/esm/ai/src/errors/provider-error.mjs.map +1 -0
  80. package/esm/ai/src/errors/provider-rate-limit-error.mjs +31 -0
  81. package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +1 -0
  82. package/esm/ai/src/errors/provider-timeout-error.mjs +26 -0
  83. package/esm/ai/src/errors/provider-timeout-error.mjs.map +1 -0
  84. package/esm/ai/src/errors/quota-exceeded-error.mjs +40 -0
  85. package/esm/ai/src/errors/quota-exceeded-error.mjs.map +1 -0
  86. package/esm/ai/src/errors/routing-error.mjs +23 -0
  87. package/esm/ai/src/errors/routing-error.mjs.map +1 -0
  88. package/esm/ai/src/errors/schema-validation-error.mjs +37 -0
  89. package/esm/ai/src/errors/schema-validation-error.mjs.map +1 -0
  90. package/esm/ai/src/errors/step-failed-error.mjs +19 -0
  91. package/esm/ai/src/errors/step-failed-error.mjs.map +1 -0
  92. package/esm/ai/src/errors/supervisor-cancelled-error.mjs +29 -0
  93. package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +1 -0
  94. package/esm/ai/src/errors/supervisor-drift-error.mjs +30 -0
  95. package/esm/ai/src/errors/supervisor-drift-error.mjs.map +1 -0
  96. package/esm/ai/src/errors/supervisor-failed-error.mjs +43 -0
  97. package/esm/ai/src/errors/supervisor-failed-error.mjs.map +1 -0
  98. package/esm/ai/src/errors/supervisor-routing-error.mjs +39 -0
  99. package/esm/ai/src/errors/supervisor-routing-error.mjs.map +1 -0
  100. package/esm/ai/src/errors/tool-execution-error.mjs +32 -0
  101. package/esm/ai/src/errors/tool-execution-error.mjs.map +1 -0
  102. package/esm/ai/src/errors/workflow-cancelled-error.mjs +23 -0
  103. package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +1 -0
  104. package/esm/ai/src/errors/workflow-drift-error.mjs +24 -0
  105. package/esm/ai/src/errors/workflow-drift-error.mjs.map +1 -0
  106. package/esm/ai/src/errors/workflow-error.mjs +18 -0
  107. package/esm/ai/src/errors/workflow-error.mjs.map +1 -0
  108. package/esm/ai/src/eval/dataset.mjs +112 -0
  109. package/esm/ai/src/eval/dataset.mjs.map +1 -0
  110. package/esm/ai/src/eval/eval-runner.mjs +135 -0
  111. package/esm/ai/src/eval/eval-runner.mjs.map +1 -0
  112. package/esm/ai/src/eval/index.mjs +48 -0
  113. package/esm/ai/src/eval/index.mjs.map +1 -0
  114. package/esm/ai/src/eval/judge-scorer.mjs +87 -0
  115. package/esm/ai/src/eval/judge-scorer.mjs.map +1 -0
  116. package/esm/ai/src/eval/regression.mjs +51 -0
  117. package/esm/ai/src/eval/regression.mjs.map +1 -0
  118. package/esm/ai/src/eval/report-json.mjs +33 -0
  119. package/esm/ai/src/eval/report-json.mjs.map +1 -0
  120. package/esm/ai/src/eval/report-junit.mjs +60 -0
  121. package/esm/ai/src/eval/report-junit.mjs.map +1 -0
  122. package/esm/ai/src/eval/scorers.mjs +101 -0
  123. package/esm/ai/src/eval/scorers.mjs.map +1 -0
  124. package/esm/ai/src/guard/detectors/index.mjs +6 -0
  125. package/esm/ai/src/guard/detectors/injection.mjs +254 -0
  126. package/esm/ai/src/guard/detectors/injection.mjs.map +1 -0
  127. package/esm/ai/src/guard/detectors/moderation.mjs +134 -0
  128. package/esm/ai/src/guard/detectors/moderation.mjs.map +1 -0
  129. package/esm/ai/src/guard/detectors/pii.mjs +199 -0
  130. package/esm/ai/src/guard/detectors/pii.mjs.map +1 -0
  131. package/esm/ai/src/guard/detectors/topic.mjs +99 -0
  132. package/esm/ai/src/guard/detectors/topic.mjs.map +1 -0
  133. package/esm/ai/src/guard/errors.mjs +18 -0
  134. package/esm/ai/src/guard/errors.mjs.map +1 -0
  135. package/esm/ai/src/guard/guard.mjs +209 -0
  136. package/esm/ai/src/guard/guard.mjs.map +1 -0
  137. package/esm/ai/src/guard/guardrail.mjs +22 -0
  138. package/esm/ai/src/guard/guardrail.mjs.map +1 -0
  139. package/esm/ai/src/human/errors.mjs +60 -0
  140. package/esm/ai/src/human/errors.mjs.map +1 -0
  141. package/esm/ai/src/human/human-approval.mjs +170 -0
  142. package/esm/ai/src/human/human-approval.mjs.map +1 -0
  143. package/esm/ai/src/human/policy.mjs +67 -0
  144. package/esm/ai/src/human/policy.mjs.map +1 -0
  145. package/esm/ai/src/human/register.mjs +37 -0
  146. package/esm/ai/src/human/register.mjs.map +1 -0
  147. package/esm/ai/src/human/resume-seed.mjs +53 -0
  148. package/esm/ai/src/human/resume-seed.mjs.map +1 -0
  149. package/esm/ai/src/human/resume.mjs +121 -0
  150. package/esm/ai/src/human/resume.mjs.map +1 -0
  151. package/esm/ai/src/human/stores/index.mjs +5 -0
  152. package/esm/ai/src/human/stores/memory.mjs +91 -0
  153. package/esm/ai/src/human/stores/memory.mjs.map +1 -0
  154. package/esm/ai/src/human/stores/pg.mjs +220 -0
  155. package/esm/ai/src/human/stores/pg.mjs.map +1 -0
  156. package/esm/ai/src/human/stores/redis.mjs +201 -0
  157. package/esm/ai/src/human/stores/redis.mjs.map +1 -0
  158. package/esm/ai/src/index.mjs +174 -0
  159. package/esm/ai/src/memory/derive-id.mjs +24 -0
  160. package/esm/ai/src/memory/derive-id.mjs.map +1 -0
  161. package/esm/ai/src/memory/episodic-memory.mjs +106 -0
  162. package/esm/ai/src/memory/episodic-memory.mjs.map +1 -0
  163. package/esm/ai/src/memory/memory.mjs +166 -0
  164. package/esm/ai/src/memory/memory.mjs.map +1 -0
  165. package/esm/ai/src/memory/procedural-memory.mjs +103 -0
  166. package/esm/ai/src/memory/procedural-memory.mjs.map +1 -0
  167. package/esm/ai/src/memory/semantic-memory.mjs +80 -0
  168. package/esm/ai/src/memory/semantic-memory.mjs.map +1 -0
  169. package/esm/ai/src/memory/working-memory.mjs +62 -0
  170. package/esm/ai/src/memory/working-memory.mjs.map +1 -0
  171. package/esm/ai/src/middleware/builtins/budget.mjs +219 -0
  172. package/esm/ai/src/middleware/builtins/budget.mjs.map +1 -0
  173. package/esm/ai/src/middleware/builtins/guardrail.mjs +76 -0
  174. package/esm/ai/src/middleware/builtins/guardrail.mjs.map +1 -0
  175. package/esm/ai/src/middleware/builtins/semantic-cache.mjs +149 -0
  176. package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +1 -0
  177. package/esm/ai/src/middleware/helpers/compose.mjs +52 -0
  178. package/esm/ai/src/middleware/helpers/compose.mjs.map +1 -0
  179. package/esm/ai/src/middleware/helpers/for-tool.mjs +80 -0
  180. package/esm/ai/src/middleware/helpers/for-tool.mjs.map +1 -0
  181. package/esm/ai/src/middleware/index.mjs +10 -0
  182. package/esm/ai/src/middleware/pipeline.mjs +100 -0
  183. package/esm/ai/src/middleware/pipeline.mjs.map +1 -0
  184. package/esm/ai/src/middleware/utils/extract-user-text.mjs +47 -0
  185. package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +1 -0
  186. package/esm/ai/src/middleware/utils/namespaced-state.mjs +60 -0
  187. package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +1 -0
  188. package/esm/ai/src/mock/index.mjs +4 -0
  189. package/esm/ai/src/mock/mock-agent.mjs +3 -0
  190. package/esm/ai/src/mock/mock-router.mjs +58 -0
  191. package/esm/ai/src/mock/mock-router.mjs.map +1 -0
  192. package/esm/ai/src/model/fallback-model.mjs +218 -0
  193. package/esm/ai/src/model/fallback-model.mjs.map +1 -0
  194. package/esm/ai/src/model/index.mjs +3 -0
  195. package/esm/ai/src/object-stream/index.mjs +4 -0
  196. package/esm/ai/src/object-stream/parse-partial-json.mjs +78 -0
  197. package/esm/ai/src/object-stream/parse-partial-json.mjs.map +1 -0
  198. package/esm/ai/src/object-stream/stream-object.mjs +97 -0
  199. package/esm/ai/src/object-stream/stream-object.mjs.map +1 -0
  200. package/esm/ai/src/observe/index.mjs +4 -0
  201. package/esm/ai/src/observe/observer-registry.mjs +35 -0
  202. package/esm/ai/src/observe/observer-registry.mjs.map +1 -0
  203. package/esm/ai/src/observe/resolve-observers.mjs +73 -0
  204. package/esm/ai/src/observe/resolve-observers.mjs.map +1 -0
  205. package/esm/ai/src/orchestrator/as-tool.mjs +98 -0
  206. package/esm/ai/src/orchestrator/as-tool.mjs.map +1 -0
  207. package/esm/ai/src/orchestrator/checkpoint.mjs +75 -0
  208. package/esm/ai/src/orchestrator/checkpoint.mjs.map +1 -0
  209. package/esm/ai/src/orchestrator/commands.mjs +34 -0
  210. package/esm/ai/src/orchestrator/commands.mjs.map +1 -0
  211. package/esm/ai/src/orchestrator/compaction.mjs +206 -0
  212. package/esm/ai/src/orchestrator/compaction.mjs.map +1 -0
  213. package/esm/ai/src/orchestrator/dispatch.mjs +171 -0
  214. package/esm/ai/src/orchestrator/dispatch.mjs.map +1 -0
  215. package/esm/ai/src/orchestrator/emitter.mjs +85 -0
  216. package/esm/ai/src/orchestrator/emitter.mjs.map +1 -0
  217. package/esm/ai/src/orchestrator/execution.mjs +395 -0
  218. package/esm/ai/src/orchestrator/execution.mjs.map +1 -0
  219. package/esm/ai/src/orchestrator/index.mjs +11 -0
  220. package/esm/ai/src/orchestrator/load.mjs +49 -0
  221. package/esm/ai/src/orchestrator/load.mjs.map +1 -0
  222. package/esm/ai/src/orchestrator/lock.mjs +75 -0
  223. package/esm/ai/src/orchestrator/lock.mjs.map +1 -0
  224. package/esm/ai/src/orchestrator/memory.mjs +141 -0
  225. package/esm/ai/src/orchestrator/memory.mjs.map +1 -0
  226. package/esm/ai/src/orchestrator/orchestrator-stream.mjs +98 -0
  227. package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +1 -0
  228. package/esm/ai/src/orchestrator/orchestrator.mjs +206 -0
  229. package/esm/ai/src/orchestrator/orchestrator.mjs.map +1 -0
  230. package/esm/ai/src/orchestrator/resume.mjs +74 -0
  231. package/esm/ai/src/orchestrator/resume.mjs.map +1 -0
  232. package/esm/ai/src/orchestrator/session-lock.mjs +83 -0
  233. package/esm/ai/src/orchestrator/session-lock.mjs.map +1 -0
  234. package/esm/ai/src/orchestrator/signature.mjs +120 -0
  235. package/esm/ai/src/orchestrator/signature.mjs.map +1 -0
  236. package/esm/ai/src/orchestrator/window.mjs +56 -0
  237. package/esm/ai/src/orchestrator/window.mjs.map +1 -0
  238. package/esm/ai/src/planner/dag-scheduler.mjs +97 -0
  239. package/esm/ai/src/planner/dag-scheduler.mjs.map +1 -0
  240. package/esm/ai/src/planner/index.mjs +6 -0
  241. package/esm/ai/src/planner/plan-prompt.mjs +31 -0
  242. package/esm/ai/src/planner/plan-prompt.mjs.map +1 -0
  243. package/esm/ai/src/planner/plan-schema.mjs +120 -0
  244. package/esm/ai/src/planner/plan-schema.mjs.map +1 -0
  245. package/esm/ai/src/planner/planner-run.mjs +614 -0
  246. package/esm/ai/src/planner/planner-run.mjs.map +1 -0
  247. package/esm/ai/src/planner/planner.mjs +120 -0
  248. package/esm/ai/src/planner/planner.mjs.map +1 -0
  249. package/esm/ai/src/planner/signature.mjs +27 -0
  250. package/esm/ai/src/planner/signature.mjs.map +1 -0
  251. package/esm/ai/src/prompt/errors.mjs +73 -0
  252. package/esm/ai/src/prompt/errors.mjs.map +1 -0
  253. package/esm/ai/src/prompt/index.mjs +4 -0
  254. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +104 -0
  255. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +1 -0
  256. package/esm/ai/src/prompt/prompt-validate.mjs +170 -0
  257. package/esm/ai/src/prompt/prompt-validate.mjs.map +1 -0
  258. package/esm/ai/src/prompt/prompt.mjs +218 -0
  259. package/esm/ai/src/prompt/prompt.mjs.map +1 -0
  260. package/esm/ai/src/prompts/index.mjs +3 -0
  261. package/esm/ai/src/prompts/prompts-manager.mjs +410 -0
  262. package/esm/ai/src/prompts/prompts-manager.mjs.map +1 -0
  263. package/esm/ai/src/prompts/prompts-validate.mjs +200 -0
  264. package/esm/ai/src/prompts/prompts-validate.mjs.map +1 -0
  265. package/esm/ai/src/rag/as-tool.mjs +48 -0
  266. package/esm/ai/src/rag/as-tool.mjs.map +1 -0
  267. package/esm/ai/src/rag/chunk/chunk.mjs +44 -0
  268. package/esm/ai/src/rag/chunk/chunk.mjs.map +1 -0
  269. package/esm/ai/src/rag/chunk/fixed.mjs +32 -0
  270. package/esm/ai/src/rag/chunk/fixed.mjs.map +1 -0
  271. package/esm/ai/src/rag/chunk/markdown.mjs +75 -0
  272. package/esm/ai/src/rag/chunk/markdown.mjs.map +1 -0
  273. package/esm/ai/src/rag/chunk/recursive.mjs +132 -0
  274. package/esm/ai/src/rag/chunk/recursive.mjs.map +1 -0
  275. package/esm/ai/src/rag/chunk/sentence.mjs +73 -0
  276. package/esm/ai/src/rag/chunk/sentence.mjs.map +1 -0
  277. package/esm/ai/src/rag/index.mjs +7 -0
  278. package/esm/ai/src/rag/rag.mjs +126 -0
  279. package/esm/ai/src/rag/rag.mjs.map +1 -0
  280. package/esm/ai/src/rag/rerank/keyword-reranker.mjs +58 -0
  281. package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +1 -0
  282. package/esm/ai/src/rag/rerank/llm-reranker.mjs +85 -0
  283. package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +1 -0
  284. package/esm/ai/src/rag/retrieve.mjs +68 -0
  285. package/esm/ai/src/rag/retrieve.mjs.map +1 -0
  286. package/esm/ai/src/rag/store/cache-vector-store.mjs +48 -0
  287. package/esm/ai/src/rag/store/cache-vector-store.mjs.map +1 -0
  288. package/esm/ai/src/security/index.mjs +5 -0
  289. package/esm/ai/src/security/outbound-policy.mjs +187 -0
  290. package/esm/ai/src/security/outbound-policy.mjs.map +1 -0
  291. package/esm/ai/src/security/private-ip.mjs +48 -0
  292. package/esm/ai/src/security/private-ip.mjs.map +1 -0
  293. package/esm/ai/src/security/redact.mjs +60 -0
  294. package/esm/ai/src/security/redact.mjs.map +1 -0
  295. package/esm/ai/src/serve/serve.mjs +90 -0
  296. package/esm/ai/src/serve/serve.mjs.map +1 -0
  297. package/esm/ai/src/serve/sse.mjs +25 -0
  298. package/esm/ai/src/serve/sse.mjs.map +1 -0
  299. package/esm/ai/src/serve/stream-to-sse.mjs +37 -0
  300. package/esm/ai/src/serve/stream-to-sse.mjs.map +1 -0
  301. package/esm/ai/src/skills/catalog.mjs +140 -0
  302. package/esm/ai/src/skills/catalog.mjs.map +1 -0
  303. package/esm/ai/src/skills/index.mjs +11 -0
  304. package/esm/ai/src/skills/load-skill-tool.mjs +65 -0
  305. package/esm/ai/src/skills/load-skill-tool.mjs.map +1 -0
  306. package/esm/ai/src/skills/save-skill-tool.mjs +65 -0
  307. package/esm/ai/src/skills/save-skill-tool.mjs.map +1 -0
  308. package/esm/ai/src/skills/skills.mjs +109 -0
  309. package/esm/ai/src/skills/skills.mjs.map +1 -0
  310. package/esm/ai/src/skills/sources/directory-source.mjs +108 -0
  311. package/esm/ai/src/skills/sources/directory-source.mjs.map +1 -0
  312. package/esm/ai/src/skills/sources/index.mjs +27 -0
  313. package/esm/ai/src/skills/sources/index.mjs.map +1 -0
  314. package/esm/ai/src/skills/sources/parse-frontmatter.mjs +46 -0
  315. package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +1 -0
  316. package/esm/ai/src/skills/sources/store-source.mjs +15 -0
  317. package/esm/ai/src/skills/sources/store-source.mjs.map +1 -0
  318. package/esm/ai/src/skills/sources/url-source.mjs +117 -0
  319. package/esm/ai/src/skills/sources/url-source.mjs.map +1 -0
  320. package/esm/ai/src/snapshot/memory.mjs +81 -0
  321. package/esm/ai/src/snapshot/memory.mjs.map +1 -0
  322. package/esm/ai/src/snapshot/pg.mjs +146 -0
  323. package/esm/ai/src/snapshot/pg.mjs.map +1 -0
  324. package/esm/ai/src/snapshot/redis.mjs +101 -0
  325. package/esm/ai/src/snapshot/redis.mjs.map +1 -0
  326. package/esm/ai/src/supervisor/as-tool.mjs +74 -0
  327. package/esm/ai/src/supervisor/as-tool.mjs.map +1 -0
  328. package/esm/ai/src/supervisor/cancellation.mjs +22 -0
  329. package/esm/ai/src/supervisor/cancellation.mjs.map +1 -0
  330. package/esm/ai/src/supervisor/decide.mjs +272 -0
  331. package/esm/ai/src/supervisor/decide.mjs.map +1 -0
  332. package/esm/ai/src/supervisor/emitter.mjs +47 -0
  333. package/esm/ai/src/supervisor/emitter.mjs.map +1 -0
  334. package/esm/ai/src/supervisor/entries.mjs +206 -0
  335. package/esm/ai/src/supervisor/entries.mjs.map +1 -0
  336. package/esm/ai/src/supervisor/execution.mjs +1921 -0
  337. package/esm/ai/src/supervisor/execution.mjs.map +1 -0
  338. package/esm/ai/src/supervisor/fan-out.mjs +65 -0
  339. package/esm/ai/src/supervisor/fan-out.mjs.map +1 -0
  340. package/esm/ai/src/supervisor/index.mjs +14 -0
  341. package/esm/ai/src/supervisor/router-factory.mjs +141 -0
  342. package/esm/ai/src/supervisor/router-factory.mjs.map +1 -0
  343. package/esm/ai/src/supervisor/router-prompt.mjs +52 -0
  344. package/esm/ai/src/supervisor/router-prompt.mjs.map +1 -0
  345. package/esm/ai/src/supervisor/signature.mjs +89 -0
  346. package/esm/ai/src/supervisor/signature.mjs.map +1 -0
  347. package/esm/ai/src/supervisor/snapshot.mjs +69 -0
  348. package/esm/ai/src/supervisor/snapshot.mjs.map +1 -0
  349. package/esm/ai/src/supervisor/supervisor-stream.mjs +89 -0
  350. package/esm/ai/src/supervisor/supervisor-stream.mjs.map +1 -0
  351. package/esm/ai/src/supervisor/supervisor.mjs +144 -0
  352. package/esm/ai/src/supervisor/supervisor.mjs.map +1 -0
  353. package/esm/ai/src/system-prompt/index.mjs +6 -0
  354. package/esm/ai/src/system-prompt/instruction.mjs +57 -0
  355. package/esm/ai/src/system-prompt/instruction.mjs.map +1 -0
  356. package/esm/ai/src/system-prompt/persona.mjs +57 -0
  357. package/esm/ai/src/system-prompt/persona.mjs.map +1 -0
  358. package/esm/ai/src/system-prompt/render-placeholders.mjs +58 -0
  359. package/esm/ai/src/system-prompt/render-placeholders.mjs.map +1 -0
  360. package/esm/ai/src/system-prompt/system-prompt.mjs +267 -0
  361. package/esm/ai/src/system-prompt/system-prompt.mjs.map +1 -0
  362. package/esm/ai/src/team/gates.mjs +48 -0
  363. package/esm/ai/src/team/gates.mjs.map +1 -0
  364. package/esm/ai/src/team/index.mjs +3 -0
  365. package/esm/ai/src/team/team.mjs +94 -0
  366. package/esm/ai/src/team/team.mjs.map +1 -0
  367. package/esm/ai/src/tool/executable-as-tool.mjs +81 -0
  368. package/esm/ai/src/tool/executable-as-tool.mjs.map +1 -0
  369. package/esm/ai/src/tool/index.mjs +4 -0
  370. package/esm/ai/src/tool/tool.mjs +185 -0
  371. package/esm/ai/src/tool/tool.mjs.map +1 -0
  372. package/esm/ai/src/utils/compute-cost.mjs +112 -0
  373. package/esm/ai/src/utils/compute-cost.mjs.map +1 -0
  374. package/esm/ai/src/utils/extract-json-lenient.mjs +97 -0
  375. package/esm/ai/src/utils/extract-json-lenient.mjs.map +1 -0
  376. package/esm/ai/src/utils/extract-json-payload.mjs +39 -0
  377. package/esm/ai/src/utils/extract-json-payload.mjs.map +1 -0
  378. package/esm/ai/src/utils/generate-run-id.mjs +23 -0
  379. package/esm/ai/src/utils/generate-run-id.mjs.map +1 -0
  380. package/esm/ai/src/utils/index.mjs +12 -0
  381. package/esm/ai/src/utils/json-schema.mjs +89 -0
  382. package/esm/ai/src/utils/json-schema.mjs.map +1 -0
  383. package/esm/ai/src/utils/prepare-attachment-part.mjs +232 -0
  384. package/esm/ai/src/utils/prepare-attachment-part.mjs.map +1 -0
  385. package/esm/ai/src/utils/resolve-attachment.mjs +74 -0
  386. package/esm/ai/src/utils/resolve-attachment.mjs.map +1 -0
  387. package/esm/ai/src/utils/run-context.mjs +89 -0
  388. package/esm/ai/src/utils/run-context.mjs.map +1 -0
  389. package/esm/ai/src/utils/safe-json-parse.mjs +22 -0
  390. package/esm/ai/src/utils/safe-json-parse.mjs.map +1 -0
  391. package/esm/ai/src/utils/stamp-report-lineage.mjs +45 -0
  392. package/esm/ai/src/utils/stamp-report-lineage.mjs.map +1 -0
  393. package/esm/ai/src/vcr/cassette-io.mjs +57 -0
  394. package/esm/ai/src/vcr/cassette-io.mjs.map +1 -0
  395. package/esm/ai/src/vcr/errors.mjs +37 -0
  396. package/esm/ai/src/vcr/errors.mjs.map +1 -0
  397. package/esm/ai/src/vcr/hash-request.mjs +118 -0
  398. package/esm/ai/src/vcr/hash-request.mjs.map +1 -0
  399. package/esm/ai/src/vcr/index.mjs +5 -0
  400. package/esm/ai/src/vcr/vcr.mjs +248 -0
  401. package/esm/ai/src/vcr/vcr.mjs.map +1 -0
  402. package/esm/ai/src/workflow/as-tool.mjs +49 -0
  403. package/esm/ai/src/workflow/as-tool.mjs.map +1 -0
  404. package/esm/ai/src/workflow/cancellation.mjs +44 -0
  405. package/esm/ai/src/workflow/cancellation.mjs.map +1 -0
  406. package/esm/ai/src/workflow/emitter.mjs +40 -0
  407. package/esm/ai/src/workflow/emitter.mjs.map +1 -0
  408. package/esm/ai/src/workflow/engine.mjs +363 -0
  409. package/esm/ai/src/workflow/engine.mjs.map +1 -0
  410. package/esm/ai/src/workflow/index.mjs +5 -0
  411. package/esm/ai/src/workflow/retry.mjs +32 -0
  412. package/esm/ai/src/workflow/retry.mjs.map +1 -0
  413. package/esm/ai/src/workflow/router.mjs +56 -0
  414. package/esm/ai/src/workflow/router.mjs.map +1 -0
  415. package/esm/ai/src/workflow/run-scoped-emitter.mjs +32 -0
  416. package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +1 -0
  417. package/esm/ai/src/workflow/signature.mjs +34 -0
  418. package/esm/ai/src/workflow/signature.mjs.map +1 -0
  419. package/esm/ai/src/workflow/snapshot.mjs +77 -0
  420. package/esm/ai/src/workflow/snapshot.mjs.map +1 -0
  421. package/esm/ai/src/workflow/state.mjs +37 -0
  422. package/esm/ai/src/workflow/state.mjs.map +1 -0
  423. package/esm/ai/src/workflow/step-runner.mjs +370 -0
  424. package/esm/ai/src/workflow/step-runner.mjs.map +1 -0
  425. package/esm/ai/src/workflow/step.mjs +37 -0
  426. package/esm/ai/src/workflow/step.mjs.map +1 -0
  427. package/esm/ai/src/workflow/workflow.mjs +122 -0
  428. package/esm/ai/src/workflow/workflow.mjs.map +1 -0
  429. package/esm/ai-openai/src/embedder.mjs +4 -0
  430. package/esm/ai-openai/src/index.mjs +4 -0
  431. package/esm/ai-openai/src/model.mjs +5 -0
  432. package/esm/ai-openai/src/sdk.mjs +6 -0
  433. package/esm/ai-openai/src/utils/index.mjs +4 -0
  434. package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
  435. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
  436. package/esm/application/application.d.mts +126 -4
  437. package/esm/application/application.d.mts.map +1 -1
  438. package/esm/application/application.mjs +133 -0
  439. package/esm/application/application.mjs.map +1 -1
  440. package/esm/application/index.d.mts +1 -1
  441. package/esm/cli/commands/dev-server.command.mjs +1 -1
  442. package/esm/cli/commands/dev-server.command.mjs.map +1 -1
  443. package/esm/cli/commands/generate/templates/stubs.mjs +3 -4
  444. package/esm/cli/commands/generate/templates/stubs.mjs.map +1 -1
  445. package/esm/cli/types.d.mts +2 -1
  446. package/esm/cli/types.d.mts.map +1 -1
  447. package/esm/config/config-getter.mjs +5 -5
  448. package/esm/config/config-getter.mjs.map +1 -1
  449. package/esm/config/config-loader.mjs +2 -2
  450. package/esm/config/config-loader.mjs.map +1 -1
  451. package/esm/connectors/access-connector.mjs +2 -2
  452. package/esm/connectors/access-connector.mjs.map +1 -1
  453. package/esm/connectors/ai-connector.d.mts +43 -0
  454. package/esm/connectors/ai-connector.d.mts.map +1 -0
  455. package/esm/connectors/ai-connector.mjs +56 -0
  456. package/esm/connectors/ai-connector.mjs.map +1 -0
  457. package/esm/connectors/cache-connector.d.mts +5 -0
  458. package/esm/connectors/cache-connector.d.mts.map +1 -1
  459. package/esm/connectors/cache-connector.mjs +9 -2
  460. package/esm/connectors/cache-connector.mjs.map +1 -1
  461. package/esm/connectors/connectors-manager.d.mts +6 -2
  462. package/esm/connectors/connectors-manager.d.mts.map +1 -1
  463. package/esm/connectors/connectors-manager.mjs +12 -3
  464. package/esm/connectors/connectors-manager.mjs.map +1 -1
  465. package/esm/connectors/database-connector.mjs +2 -2
  466. package/esm/connectors/database-connector.mjs.map +1 -1
  467. package/esm/connectors/herald-connector.mjs +2 -2
  468. package/esm/connectors/herald-connector.mjs.map +1 -1
  469. package/esm/connectors/http-connector.d.mts +8 -0
  470. package/esm/connectors/http-connector.d.mts.map +1 -1
  471. package/esm/connectors/http-connector.mjs +40 -7
  472. package/esm/connectors/http-connector.mjs.map +1 -1
  473. package/esm/connectors/index.d.mts +1 -0
  474. package/esm/connectors/index.mjs +1 -0
  475. package/esm/connectors/logger-connector.mjs +2 -2
  476. package/esm/connectors/logger-connector.mjs.map +1 -1
  477. package/esm/connectors/mail-connector.mjs +2 -2
  478. package/esm/connectors/mail-connector.mjs.map +1 -1
  479. package/esm/connectors/notifications-connector.mjs +2 -2
  480. package/esm/connectors/notifications-connector.mjs.map +1 -1
  481. package/esm/connectors/socket-connector.d.mts +16 -1
  482. package/esm/connectors/socket-connector.d.mts.map +1 -1
  483. package/esm/connectors/socket-connector.mjs +31 -8
  484. package/esm/connectors/socket-connector.mjs.map +1 -1
  485. package/esm/connectors/storage.connector.d.mts +7 -0
  486. package/esm/connectors/storage.connector.d.mts.map +1 -1
  487. package/esm/connectors/storage.connector.mjs +7 -0
  488. package/esm/connectors/storage.connector.mjs.map +1 -1
  489. package/esm/connectors/types.d.mts +3 -2
  490. package/esm/connectors/types.d.mts.map +1 -1
  491. package/esm/connectors/types.mjs +1 -0
  492. package/esm/connectors/types.mjs.map +1 -1
  493. package/esm/dev-server/development-server.mjs +9 -14
  494. package/esm/dev-server/development-server.mjs.map +1 -1
  495. package/esm/dev-server/file-event-handler.mjs +15 -3
  496. package/esm/dev-server/file-event-handler.mjs.map +1 -1
  497. package/esm/dev-server/loader/transpile-cache.mjs +1 -1
  498. package/esm/generations/add-command.action.mjs +61 -12
  499. package/esm/generations/add-command.action.mjs.map +1 -1
  500. package/esm/generations/stubs.mjs +31 -1
  501. package/esm/generations/stubs.mjs.map +1 -1
  502. package/esm/http/config.mjs +2 -2
  503. package/esm/http/config.mjs.map +1 -1
  504. package/esm/http/createHttpApplication.mjs +2 -2
  505. package/esm/http/createHttpApplication.mjs.map +1 -1
  506. package/esm/http/health.d.mts +57 -0
  507. package/esm/http/health.d.mts.map +1 -0
  508. package/esm/http/health.mjs +75 -0
  509. package/esm/http/health.mjs.map +1 -0
  510. package/esm/http/index.d.mts +2 -1
  511. package/esm/http/index.mjs +2 -1
  512. package/esm/http/middleware/cache-response-middleware.d.mts +1 -1
  513. package/esm/http/middleware/cache-response-middleware.d.mts.map +1 -1
  514. package/esm/http/middleware/cache-response-middleware.mjs +15 -6
  515. package/esm/http/middleware/cache-response-middleware.mjs.map +1 -1
  516. package/esm/http/middleware/concurrency-limit.middleware.mjs +2 -0
  517. package/esm/http/middleware/concurrency-limit.middleware.mjs.map +1 -1
  518. package/esm/http/middleware/idempotency.middleware.d.mts.map +1 -1
  519. package/esm/http/middleware/idempotency.middleware.mjs +9 -6
  520. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  521. package/esm/http/middleware/inject-request-context.mjs +2 -2
  522. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  523. package/esm/http/middleware/maintenance.middleware.mjs +6 -5
  524. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  525. package/esm/http/plugins.mjs +9 -9
  526. package/esm/http/plugins.mjs.map +1 -1
  527. package/esm/http/request.d.mts +9 -2
  528. package/esm/http/request.d.mts.map +1 -1
  529. package/esm/http/request.mjs +15 -3
  530. package/esm/http/request.mjs.map +1 -1
  531. package/esm/http/response.d.mts +12 -0
  532. package/esm/http/response.d.mts.map +1 -1
  533. package/esm/http/response.mjs +24 -7
  534. package/esm/http/response.mjs.map +1 -1
  535. package/esm/http/server.d.mts +16 -1
  536. package/esm/http/server.d.mts.map +1 -1
  537. package/esm/http/server.mjs +24 -4
  538. package/esm/http/server.mjs.map +1 -1
  539. package/esm/http/types.d.mts +45 -0
  540. package/esm/http/types.d.mts.map +1 -1
  541. package/esm/index.d.mts +10 -5
  542. package/esm/index.mjs +10 -5
  543. package/esm/node_modules/langfuse/lib/index.mjs +1827 -0
  544. package/esm/node_modules/langfuse/lib/index.mjs.map +1 -0
  545. package/esm/node_modules/langfuse-core/lib/index.mjs +1770 -0
  546. package/esm/node_modules/langfuse-core/lib/index.mjs.map +1 -0
  547. package/esm/node_modules/mustache/mustache.mjs +587 -0
  548. package/esm/node_modules/mustache/mustache.mjs.map +1 -0
  549. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +180 -0
  550. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +1 -0
  551. package/esm/node_modules/openai/auth/workload-identity-auth.mjs +80 -0
  552. package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +1 -0
  553. package/esm/node_modules/openai/azure.mjs +82 -0
  554. package/esm/node_modules/openai/azure.mjs.map +1 -0
  555. package/esm/node_modules/openai/client.mjs +638 -0
  556. package/esm/node_modules/openai/client.mjs.map +1 -0
  557. package/esm/node_modules/openai/core/api-promise.mjs +75 -0
  558. package/esm/node_modules/openai/core/api-promise.mjs.map +1 -0
  559. package/esm/node_modules/openai/core/error.mjs +110 -0
  560. package/esm/node_modules/openai/core/error.mjs.map +1 -0
  561. package/esm/node_modules/openai/core/pagination.mjs +160 -0
  562. package/esm/node_modules/openai/core/pagination.mjs.map +1 -0
  563. package/esm/node_modules/openai/core/resource.mjs +10 -0
  564. package/esm/node_modules/openai/core/resource.mjs.map +1 -0
  565. package/esm/node_modules/openai/core/streaming.mjs +238 -0
  566. package/esm/node_modules/openai/core/streaming.mjs.map +1 -0
  567. package/esm/node_modules/openai/index.mjs +8 -0
  568. package/esm/node_modules/openai/internal/decoders/line.mjs +91 -0
  569. package/esm/node_modules/openai/internal/decoders/line.mjs.map +1 -0
  570. package/esm/node_modules/openai/internal/detect-platform.mjs +123 -0
  571. package/esm/node_modules/openai/internal/detect-platform.mjs.map +1 -0
  572. package/esm/node_modules/openai/internal/errors.mjs +26 -0
  573. package/esm/node_modules/openai/internal/errors.mjs.map +1 -0
  574. package/esm/node_modules/openai/internal/headers.mjs +65 -0
  575. package/esm/node_modules/openai/internal/headers.mjs.map +1 -0
  576. package/esm/node_modules/openai/internal/parse.mjs +41 -0
  577. package/esm/node_modules/openai/internal/parse.mjs.map +1 -0
  578. package/esm/node_modules/openai/internal/qs/formats.mjs +12 -0
  579. package/esm/node_modules/openai/internal/qs/formats.mjs.map +1 -0
  580. package/esm/node_modules/openai/internal/qs/stringify.mjs +179 -0
  581. package/esm/node_modules/openai/internal/qs/stringify.mjs.map +1 -0
  582. package/esm/node_modules/openai/internal/qs/utils.mjs +65 -0
  583. package/esm/node_modules/openai/internal/qs/utils.mjs.map +1 -0
  584. package/esm/node_modules/openai/internal/request-options.mjs +11 -0
  585. package/esm/node_modules/openai/internal/request-options.mjs.map +1 -0
  586. package/esm/node_modules/openai/internal/shims.mjs +77 -0
  587. package/esm/node_modules/openai/internal/shims.mjs.map +1 -0
  588. package/esm/node_modules/openai/internal/to-file.mjs +63 -0
  589. package/esm/node_modules/openai/internal/to-file.mjs.map +1 -0
  590. package/esm/node_modules/openai/internal/tslib.mjs +16 -0
  591. package/esm/node_modules/openai/internal/tslib.mjs.map +1 -0
  592. package/esm/node_modules/openai/internal/uploads.mjs +94 -0
  593. package/esm/node_modules/openai/internal/uploads.mjs.map +1 -0
  594. package/esm/node_modules/openai/internal/utils/base64.mjs +22 -0
  595. package/esm/node_modules/openai/internal/utils/base64.mjs.map +1 -0
  596. package/esm/node_modules/openai/internal/utils/bytes.mjs +26 -0
  597. package/esm/node_modules/openai/internal/utils/bytes.mjs.map +1 -0
  598. package/esm/node_modules/openai/internal/utils/env.mjs +16 -0
  599. package/esm/node_modules/openai/internal/utils/env.mjs.map +1 -0
  600. package/esm/node_modules/openai/internal/utils/log.mjs +58 -0
  601. package/esm/node_modules/openai/internal/utils/log.mjs.map +1 -0
  602. package/esm/node_modules/openai/internal/utils/path.mjs +62 -0
  603. package/esm/node_modules/openai/internal/utils/path.mjs.map +1 -0
  604. package/esm/node_modules/openai/internal/utils/query.mjs +10 -0
  605. package/esm/node_modules/openai/internal/utils/query.mjs.map +1 -0
  606. package/esm/node_modules/openai/internal/utils/sleep.mjs +6 -0
  607. package/esm/node_modules/openai/internal/utils/sleep.mjs.map +1 -0
  608. package/esm/node_modules/openai/internal/utils/uuid.mjs +18 -0
  609. package/esm/node_modules/openai/internal/utils/uuid.mjs.map +1 -0
  610. package/esm/node_modules/openai/internal/utils/values.mjs +41 -0
  611. package/esm/node_modules/openai/internal/utils/values.mjs.map +1 -0
  612. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +247 -0
  613. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +1 -0
  614. package/esm/node_modules/openai/lib/AssistantStream.mjs +472 -0
  615. package/esm/node_modules/openai/lib/AssistantStream.mjs.map +1 -0
  616. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +26 -0
  617. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +1 -0
  618. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +423 -0
  619. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +1 -0
  620. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +26 -0
  621. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +1 -0
  622. package/esm/node_modules/openai/lib/EventStream.mjs +163 -0
  623. package/esm/node_modules/openai/lib/EventStream.mjs.map +1 -0
  624. package/esm/node_modules/openai/lib/ResponsesParser.mjs +94 -0
  625. package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +1 -0
  626. package/esm/node_modules/openai/lib/RunnableFunction.mjs +8 -0
  627. package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +1 -0
  628. package/esm/node_modules/openai/lib/Util.mjs +19 -0
  629. package/esm/node_modules/openai/lib/Util.mjs.map +1 -0
  630. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +11 -0
  631. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +1 -0
  632. package/esm/node_modules/openai/lib/parser.mjs +88 -0
  633. package/esm/node_modules/openai/lib/parser.mjs.map +1 -0
  634. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +231 -0
  635. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +1 -0
  636. package/esm/node_modules/openai/resources/admin/admin.mjs +15 -0
  637. package/esm/node_modules/openai/resources/admin/admin.mjs.map +1 -0
  638. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +81 -0
  639. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +1 -0
  640. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +31 -0
  641. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +1 -0
  642. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +153 -0
  643. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +1 -0
  644. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +42 -0
  645. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +1 -0
  646. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +106 -0
  647. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +1 -0
  648. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +88 -0
  649. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +1 -0
  650. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +88 -0
  651. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +1 -0
  652. package/esm/node_modules/openai/resources/admin/organization/invites.mjs +83 -0
  653. package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +1 -0
  654. package/esm/node_modules/openai/resources/admin/organization/organization.mjs +45 -0
  655. package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +1 -0
  656. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +72 -0
  657. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +1 -0
  658. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +78 -0
  659. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +1 -0
  660. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +46 -0
  661. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +1 -0
  662. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +95 -0
  663. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +1 -0
  664. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +91 -0
  665. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +1 -0
  666. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +45 -0
  667. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +1 -0
  668. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +63 -0
  669. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +1 -0
  670. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +137 -0
  671. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +1 -0
  672. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +51 -0
  673. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +1 -0
  674. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +108 -0
  675. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +1 -0
  676. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +112 -0
  677. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +1 -0
  678. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +106 -0
  679. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +1 -0
  680. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +91 -0
  681. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +1 -0
  682. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +118 -0
  683. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +1 -0
  684. package/esm/node_modules/openai/resources/admin/organization/roles.mjs +96 -0
  685. package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +1 -0
  686. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +97 -0
  687. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +1 -0
  688. package/esm/node_modules/openai/resources/admin/organization/usage.mjs +207 -0
  689. package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +1 -0
  690. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +88 -0
  691. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +1 -0
  692. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +82 -0
  693. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +1 -0
  694. package/esm/node_modules/openai/resources/audio/audio.mjs +21 -0
  695. package/esm/node_modules/openai/resources/audio/audio.mjs.map +1 -0
  696. package/esm/node_modules/openai/resources/audio/speech.mjs +39 -0
  697. package/esm/node_modules/openai/resources/audio/speech.mjs.map +1 -0
  698. package/esm/node_modules/openai/resources/audio/transcriptions.mjs +22 -0
  699. package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +1 -0
  700. package/esm/node_modules/openai/resources/audio/translations.mjs +21 -0
  701. package/esm/node_modules/openai/resources/audio/translations.mjs.map +1 -0
  702. package/esm/node_modules/openai/resources/batches.mjs +54 -0
  703. package/esm/node_modules/openai/resources/batches.mjs.map +1 -0
  704. package/esm/node_modules/openai/resources/beta/assistants.mjs +78 -0
  705. package/esm/node_modules/openai/resources/beta/assistants.mjs.map +1 -0
  706. package/esm/node_modules/openai/resources/beta/beta.mjs +24 -0
  707. package/esm/node_modules/openai/resources/beta/beta.mjs.map +1 -0
  708. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +18 -0
  709. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +1 -0
  710. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +49 -0
  711. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +1 -0
  712. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +85 -0
  713. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +1 -0
  714. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +21 -0
  715. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +1 -0
  716. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +33 -0
  717. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +1 -0
  718. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +33 -0
  719. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +1 -0
  720. package/esm/node_modules/openai/resources/beta/threads/messages.mjs +83 -0
  721. package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +1 -0
  722. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +183 -0
  723. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +1 -0
  724. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +45 -0
  725. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +1 -0
  726. package/esm/node_modules/openai/resources/beta/threads/threads.mjs +101 -0
  727. package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +1 -0
  728. package/esm/node_modules/openai/resources/chat/chat.mjs +15 -0
  729. package/esm/node_modules/openai/resources/chat/chat.mjs.map +1 -0
  730. package/esm/node_modules/openai/resources/chat/completions/completions.mjs +123 -0
  731. package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +1 -0
  732. package/esm/node_modules/openai/resources/chat/completions/index.mjs +7 -0
  733. package/esm/node_modules/openai/resources/chat/completions/messages.mjs +35 -0
  734. package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +1 -0
  735. package/esm/node_modules/openai/resources/chat/index.mjs +5 -0
  736. package/esm/node_modules/openai/resources/completions.mjs +20 -0
  737. package/esm/node_modules/openai/resources/completions.mjs.map +1 -0
  738. package/esm/node_modules/openai/resources/containers/containers.mjs +57 -0
  739. package/esm/node_modules/openai/resources/containers/containers.mjs.map +1 -0
  740. package/esm/node_modules/openai/resources/containers/files/content.mjs +23 -0
  741. package/esm/node_modules/openai/resources/containers/files/content.mjs.map +1 -0
  742. package/esm/node_modules/openai/resources/containers/files/files.mjs +63 -0
  743. package/esm/node_modules/openai/resources/containers/files/files.mjs.map +1 -0
  744. package/esm/node_modules/openai/resources/conversations/conversations.mjs +57 -0
  745. package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +1 -0
  746. package/esm/node_modules/openai/resources/conversations/items.mjs +57 -0
  747. package/esm/node_modules/openai/resources/conversations/items.mjs.map +1 -0
  748. package/esm/node_modules/openai/resources/embeddings.mjs +48 -0
  749. package/esm/node_modules/openai/resources/embeddings.mjs.map +1 -0
  750. package/esm/node_modules/openai/resources/evals/evals.mjs +73 -0
  751. package/esm/node_modules/openai/resources/evals/evals.mjs.map +1 -0
  752. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +35 -0
  753. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +1 -0
  754. package/esm/node_modules/openai/resources/evals/runs/runs.mjs +72 -0
  755. package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +1 -0
  756. package/esm/node_modules/openai/resources/files.mjs +111 -0
  757. package/esm/node_modules/openai/resources/files.mjs.map +1 -0
  758. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +15 -0
  759. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +1 -0
  760. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +60 -0
  761. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +1 -0
  762. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +15 -0
  763. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +1 -0
  764. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +102 -0
  765. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +1 -0
  766. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +24 -0
  767. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +1 -0
  768. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +34 -0
  769. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +1 -0
  770. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +148 -0
  771. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +1 -0
  772. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +8 -0
  773. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +1 -0
  774. package/esm/node_modules/openai/resources/graders/grader-models.mjs +8 -0
  775. package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +1 -0
  776. package/esm/node_modules/openai/resources/graders/graders.mjs +15 -0
  777. package/esm/node_modules/openai/resources/graders/graders.mjs.map +1 -0
  778. package/esm/node_modules/openai/resources/images.mjs +46 -0
  779. package/esm/node_modules/openai/resources/images.mjs.map +1 -0
  780. package/esm/node_modules/openai/resources/index.mjs +27 -0
  781. package/esm/node_modules/openai/resources/models.mjs +44 -0
  782. package/esm/node_modules/openai/resources/models.mjs.map +1 -0
  783. package/esm/node_modules/openai/resources/moderations.mjs +23 -0
  784. package/esm/node_modules/openai/resources/moderations.mjs.map +1 -0
  785. package/esm/node_modules/openai/resources/realtime/calls.mjs +79 -0
  786. package/esm/node_modules/openai/resources/realtime/calls.mjs.map +1 -0
  787. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +39 -0
  788. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +1 -0
  789. package/esm/node_modules/openai/resources/realtime/realtime.mjs +18 -0
  790. package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +1 -0
  791. package/esm/node_modules/openai/resources/responses/input-items.mjs +31 -0
  792. package/esm/node_modules/openai/resources/responses/input-items.mjs.map +1 -0
  793. package/esm/node_modules/openai/resources/responses/input-tokens.mjs +27 -0
  794. package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +1 -0
  795. package/esm/node_modules/openai/resources/responses/responses.mjs +110 -0
  796. package/esm/node_modules/openai/resources/responses/responses.mjs.map +1 -0
  797. package/esm/node_modules/openai/resources/skills/content.mjs +22 -0
  798. package/esm/node_modules/openai/resources/skills/content.mjs.map +1 -0
  799. package/esm/node_modules/openai/resources/skills/skills.mjs +69 -0
  800. package/esm/node_modules/openai/resources/skills/skills.mjs.map +1 -0
  801. package/esm/node_modules/openai/resources/skills/versions/content.mjs +23 -0
  802. package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +1 -0
  803. package/esm/node_modules/openai/resources/skills/versions/versions.mjs +58 -0
  804. package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +1 -0
  805. package/esm/node_modules/openai/resources/uploads/parts.mjs +34 -0
  806. package/esm/node_modules/openai/resources/uploads/parts.mjs.map +1 -0
  807. package/esm/node_modules/openai/resources/uploads/uploads.mjs +84 -0
  808. package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +1 -0
  809. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +126 -0
  810. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +1 -0
  811. package/esm/node_modules/openai/resources/vector-stores/files.mjs +147 -0
  812. package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +1 -0
  813. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +87 -0
  814. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +1 -0
  815. package/esm/node_modules/openai/resources/videos.mjs +115 -0
  816. package/esm/node_modules/openai/resources/videos.mjs.map +1 -0
  817. package/esm/node_modules/openai/resources/webhooks/index.mjs +3 -0
  818. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +69 -0
  819. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +1 -0
  820. package/esm/node_modules/openai/resources/webhooks.mjs +4 -0
  821. package/esm/node_modules/openai/streaming.mjs +3 -0
  822. package/esm/node_modules/openai/version.mjs +6 -0
  823. package/esm/node_modules/openai/version.mjs.map +1 -0
  824. package/esm/production/production-builder.mjs +2 -2
  825. package/esm/production/production-builder.mjs.map +1 -1
  826. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts +9 -0
  827. package/esm/repositories/adapters/cascade/cascade-query-builder.d.mts.map +1 -1
  828. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs +32 -5
  829. package/esm/repositories/adapters/cascade/cascade-query-builder.mjs.map +1 -1
  830. package/esm/repositories/adapters/cascade/filter-applicator.mjs +17 -3
  831. package/esm/repositories/adapters/cascade/filter-applicator.mjs.map +1 -1
  832. package/esm/repositories/repository.manager.d.mts +11 -1
  833. package/esm/repositories/repository.manager.d.mts.map +1 -1
  834. package/esm/repositories/repository.manager.mjs +79 -25
  835. package/esm/repositories/repository.manager.mjs.map +1 -1
  836. package/esm/router/route-registry.mjs +19 -10
  837. package/esm/router/route-registry.mjs.map +1 -1
  838. package/esm/router/router.d.mts.map +1 -1
  839. package/esm/router/router.mjs +7 -4
  840. package/esm/router/router.mjs.map +1 -1
  841. package/esm/storage/drivers/cloud-driver.d.mts.map +1 -1
  842. package/esm/storage/drivers/cloud-driver.mjs +48 -12
  843. package/esm/storage/drivers/cloud-driver.mjs.map +1 -1
  844. package/esm/storage/drivers/do-spaces-driver.mjs +1 -1
  845. package/esm/storage/drivers/do-spaces-driver.mjs.map +1 -1
  846. package/esm/storage/drivers/local-driver.d.mts +8 -0
  847. package/esm/storage/drivers/local-driver.d.mts.map +1 -1
  848. package/esm/storage/drivers/local-driver.mjs +19 -4
  849. package/esm/storage/drivers/local-driver.mjs.map +1 -1
  850. package/esm/storage/drivers/r2-driver.mjs +1 -1
  851. package/esm/storage/drivers/r2-driver.mjs.map +1 -1
  852. package/esm/storage/drivers/s3-driver.mjs +1 -1
  853. package/esm/storage/drivers/s3-driver.mjs.map +1 -1
  854. package/esm/storage/index.d.mts +4 -1
  855. package/esm/storage/index.mjs +3 -0
  856. package/esm/storage/scoped-storage.d.mts +8 -4
  857. package/esm/storage/scoped-storage.d.mts.map +1 -1
  858. package/esm/storage/scoped-storage.mjs +21 -6
  859. package/esm/storage/scoped-storage.mjs.map +1 -1
  860. package/esm/storage/storage.d.mts +12 -4
  861. package/esm/storage/storage.d.mts.map +1 -1
  862. package/esm/storage/storage.mjs +23 -9
  863. package/esm/storage/storage.mjs.map +1 -1
  864. package/esm/storage/types.d.mts +33 -5
  865. package/esm/storage/types.d.mts.map +1 -1
  866. package/esm/storage/utils/contain-path.d.mts +23 -0
  867. package/esm/storage/utils/contain-path.d.mts.map +1 -0
  868. package/esm/storage/utils/contain-path.mjs +35 -0
  869. package/esm/storage/utils/contain-path.mjs.map +1 -0
  870. package/esm/storage/utils/safe-fetch.d.mts +68 -0
  871. package/esm/storage/utils/safe-fetch.d.mts.map +1 -0
  872. package/esm/storage/utils/safe-fetch.mjs +205 -0
  873. package/esm/storage/utils/safe-fetch.mjs.map +1 -0
  874. package/esm/storage/utils/storage-error.d.mts +35 -0
  875. package/esm/storage/utils/storage-error.d.mts.map +1 -0
  876. package/esm/storage/utils/storage-error.mjs +17 -0
  877. package/esm/storage/utils/storage-error.mjs.map +1 -0
  878. package/esm/use-cases/use-case-pipeline.mjs +4 -1
  879. package/esm/use-cases/use-case-pipeline.mjs.map +1 -1
  880. package/esm/use-cases/use-case.mjs +12 -4
  881. package/esm/use-cases/use-case.mjs.map +1 -1
  882. package/esm/use-cases/use-cases-registry.d.mts +12 -4
  883. package/esm/use-cases/use-cases-registry.d.mts.map +1 -1
  884. package/esm/use-cases/use-cases-registry.mjs +13 -3
  885. package/esm/use-cases/use-cases-registry.mjs.map +1 -1
  886. package/esm/utils/environment.d.mts +6 -1
  887. package/esm/utils/environment.d.mts.map +1 -1
  888. package/esm/utils/environment.mjs.map +1 -1
  889. package/esm/utils/index.d.mts +1 -1
  890. package/esm/utils/npm-registry.d.mts +1 -1
  891. package/esm/utils/npm-registry.mjs +2 -2
  892. package/esm/utils/npm-registry.mjs.map +1 -1
  893. package/esm/utils/paths.mjs +2 -2
  894. package/esm/utils/paths.mjs.map +1 -1
  895. package/esm/validation/validateAll.mjs +2 -2
  896. package/esm/validation/validateAll.mjs.map +1 -1
  897. package/llms-full.txt +193 -3
  898. package/llms.txt +2 -1
  899. package/package.json +9 -9
  900. package/skills/add-connector/SKILL.md +6 -1
  901. package/skills/configure-app/SKILL.md +23 -0
  902. package/skills/health-checks/SKILL.md +98 -0
  903. package/skills/use-app-context/SKILL.md +62 -2
@@ -0,0 +1,57 @@
1
+ import { renderPlaceholders } from "./render-placeholders.mjs";
2
+
3
+ //#region ../@warlock.js/ai/src/system-prompt/persona.ts
4
+ /**
5
+ * Concrete `PersonaContract` — a reusable "who the agent is" block.
6
+ *
7
+ * **Role.** A single addressable prompt block representing the agent's
8
+ * identity (`"You are Alex, a senior TypeScript engineer."`). Exists as
9
+ * its own type so personas can be defined once and reused across many
10
+ * `SystemPrompt` compositions, agents, and sessions — each render can
11
+ * supply a different placeholder map.
12
+ *
13
+ * **Responsibility.**
14
+ * - Owns: the `type: "persona"` discriminator, the raw template text, and
15
+ * the placeholder-rendering step.
16
+ * - Does NOT own: composition with instructions, ordering, joining, or
17
+ * any knowledge of the surrounding `SystemPrompt`. Those concerns live
18
+ * in `SystemPrompt`.
19
+ *
20
+ * Users construct via the `ai.persona()` factory — `new Persona()` is not
21
+ * the public API (see §4.2 of code-style.md).
22
+ *
23
+ * @example
24
+ * const alex = ai.persona("You are Alex, a TypeScript expert.");
25
+ *
26
+ * const prompt = ai.systemPrompt()
27
+ * .persona(alex)
28
+ * .instruction("Always cite sources.");
29
+ */
30
+ var Persona = class {
31
+ constructor(text) {
32
+ this.text = text;
33
+ this.type = "persona";
34
+ }
35
+ /**
36
+ * Substitute `{{mustache}}` placeholders in the persona text against the
37
+ * supplied map. Delegates to the shared `renderPlaceholders` helper so
38
+ * persona / instruction / system-prompt rendering stays identical.
39
+ */
40
+ resolve(placeholders) {
41
+ return renderPlaceholders(this.text, placeholders);
42
+ }
43
+ };
44
+ /**
45
+ * Create a `Persona` from raw template text.
46
+ *
47
+ * @example
48
+ * const alex = persona("You are Alex, a TypeScript expert.");
49
+ * const greeter = persona("You are a greeter in {{language|English}}.");
50
+ */
51
+ function persona(text) {
52
+ return new Persona(text);
53
+ }
54
+
55
+ //#endregion
56
+ export { Persona, persona };
57
+ //# sourceMappingURL=persona.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"persona.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/system-prompt/persona.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type { PersonaContract } from \"../contracts/system-prompt.contract\";\nimport { renderPlaceholders } from \"./render-placeholders\";\n\n/**\n * Concrete `PersonaContract` — a reusable \"who the agent is\" block.\n *\n * **Role.** A single addressable prompt block representing the agent's\n * identity (`\"You are Alex, a senior TypeScript engineer.\"`). Exists as\n * its own type so personas can be defined once and reused across many\n * `SystemPrompt` compositions, agents, and sessions — each render can\n * supply a different placeholder map.\n *\n * **Responsibility.**\n * - Owns: the `type: \"persona\"` discriminator, the raw template text, and\n * the placeholder-rendering step.\n * - Does NOT own: composition with instructions, ordering, joining, or\n * any knowledge of the surrounding `SystemPrompt`. Those concerns live\n * in `SystemPrompt`.\n *\n * Users construct via the `ai.persona()` factory — `new Persona()` is not\n * the public API (see §4.2 of code-style.md).\n *\n * @example\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n *\n * const prompt = ai.systemPrompt()\n * .persona(alex)\n * .instruction(\"Always cite sources.\");\n */\nexport class Persona implements PersonaContract {\n public readonly type = \"persona\" as const;\n\n public constructor(public readonly text: string) {\n //\n }\n\n /**\n * Substitute `{{mustache}}` placeholders in the persona text against the\n * supplied map. Delegates to the shared `renderPlaceholders` helper so\n * persona / instruction / system-prompt rendering stays identical.\n */\n public resolve(placeholders?: Placeholders): string {\n return renderPlaceholders(this.text, placeholders);\n }\n}\n\n/**\n * Create a `Persona` from raw template text.\n *\n * @example\n * const alex = persona(\"You are Alex, a TypeScript expert.\");\n * const greeter = persona(\"You are a greeter in {{language|English}}.\");\n */\nexport function persona(text: string): Persona {\n return new Persona(text);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BA,IAAa,UAAb,MAAgD;CAG9C,AAAO,YAAY,AAAgB,MAAc;EAAd;cAFZ;CAIvB;;;;;;CAOA,AAAO,QAAQ,cAAqC;EAClD,OAAO,mBAAmB,KAAK,MAAM,YAAY;CACnD;AACF;;;;;;;;AASA,SAAgB,QAAQ,MAAuB;CAC7C,OAAO,IAAI,QAAQ,IAAI;AACzB"}
@@ -0,0 +1,58 @@
1
+ //#region ../@warlock.js/ai/src/system-prompt/render-placeholders.ts
2
+ const PLACEHOLDER_PATTERN = /\{\{\s*([^{}]+?)\s*\}\}/g;
3
+ /**
4
+ * Render a template string against a placeholders map, supporting dot-path
5
+ * lookups and inline fallback values.
6
+ *
7
+ * Supported syntax:
8
+ * - `{{key}}` — replaced by `placeholders.key`, left untouched if missing.
9
+ * - `{{a.b.c}}` — dot-path lookup into nested objects.
10
+ * - `{{key|default}}` — substitutes `default` when the key resolves to
11
+ * `undefined`, `null`, or empty string.
12
+ *
13
+ * Whitespace inside the braces is ignored (`{{ key }}` == `{{key}}`).
14
+ * Values are coerced to strings via `String(value)`.
15
+ *
16
+ * @example
17
+ * renderPlaceholders(
18
+ * "Hello {{user.name|friend}}, your role is {{role}}",
19
+ * { user: { name: "Hasan" }, role: "admin" },
20
+ * );
21
+ * // "Hello Hasan, your role is admin"
22
+ *
23
+ * @example
24
+ * renderPlaceholders("Hello {{user.name|friend}}", {});
25
+ * // "Hello friend"
26
+ */
27
+ function renderPlaceholders(template, placeholders = {}) {
28
+ return template.replace(PLACEHOLDER_PATTERN, (match, rawExpression) => {
29
+ const [rawPath, rawFallback] = rawExpression.split("|");
30
+ const path = rawPath.trim();
31
+ const fallback = rawFallback?.trim();
32
+ const value = lookupPath(placeholders, path);
33
+ if (value === void 0 || value === null || value === "") {
34
+ if (fallback !== void 0) return fallback;
35
+ return match;
36
+ }
37
+ return String(value);
38
+ });
39
+ }
40
+ /**
41
+ * Walk a dot-path (`"a.b.c"`) through an arbitrary record, returning the
42
+ * leaf value or `undefined` when any segment is missing or blocks traversal
43
+ * (non-object). Never throws.
44
+ */
45
+ function lookupPath(source, path) {
46
+ const segments = path.split(".");
47
+ let current = source;
48
+ for (const segment of segments) {
49
+ if (current === null || current === void 0) return;
50
+ if (typeof current !== "object") return;
51
+ current = current[segment];
52
+ }
53
+ return current;
54
+ }
55
+
56
+ //#endregion
57
+ export { renderPlaceholders };
58
+ //# sourceMappingURL=render-placeholders.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-placeholders.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/system-prompt/render-placeholders.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\n\nconst PLACEHOLDER_PATTERN = /\\{\\{\\s*([^{}]+?)\\s*\\}\\}/g;\n\n/**\n * Render a template string against a placeholders map, supporting dot-path\n * lookups and inline fallback values.\n *\n * Supported syntax:\n * - `{{key}}` — replaced by `placeholders.key`, left untouched if missing.\n * - `{{a.b.c}}` — dot-path lookup into nested objects.\n * - `{{key|default}}` — substitutes `default` when the key resolves to\n * `undefined`, `null`, or empty string.\n *\n * Whitespace inside the braces is ignored (`{{ key }}` == `{{key}}`).\n * Values are coerced to strings via `String(value)`.\n *\n * @example\n * renderPlaceholders(\n * \"Hello {{user.name|friend}}, your role is {{role}}\",\n * { user: { name: \"Hasan\" }, role: \"admin\" },\n * );\n * // \"Hello Hasan, your role is admin\"\n *\n * @example\n * renderPlaceholders(\"Hello {{user.name|friend}}\", {});\n * // \"Hello friend\"\n */\nexport function renderPlaceholders(\n template: string,\n placeholders: Placeholders = {},\n): string {\n return template.replace(\n PLACEHOLDER_PATTERN,\n (match, rawExpression: string) => {\n const [rawPath, rawFallback] = rawExpression.split(\"|\");\n const path = rawPath.trim();\n const fallback = rawFallback?.trim();\n\n const value = lookupPath(placeholders, path);\n\n if (value === undefined || value === null || value === \"\") {\n if (fallback !== undefined) {\n return fallback;\n }\n\n return match;\n }\n\n return String(value);\n },\n );\n}\n\n/**\n * Walk a dot-path (`\"a.b.c\"`) through an arbitrary record, returning the\n * leaf value or `undefined` when any segment is missing or blocks traversal\n * (non-object). Never throws.\n */\nfunction lookupPath(source: Placeholders, path: string): unknown {\n const segments = path.split(\".\");\n let current: unknown = source;\n\n for (const segment of segments) {\n if (current === null || current === undefined) {\n return undefined;\n }\n\n if (typeof current !== \"object\") {\n return undefined;\n }\n\n current = (current as Record<string, unknown>)[segment];\n }\n\n return current;\n}\n"],"mappings":";AAEA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;AA0B5B,SAAgB,mBACd,UACA,eAA6B,CAAC,GACtB;CACR,OAAO,SAAS,QACd,sBACC,OAAO,kBAA0B;EAChC,MAAM,CAAC,SAAS,eAAe,cAAc,MAAM,GAAG;EACtD,MAAM,OAAO,QAAQ,KAAK;EAC1B,MAAM,WAAW,aAAa,KAAK;EAEnC,MAAM,QAAQ,WAAW,cAAc,IAAI;EAE3C,IAAI,UAAU,UAAa,UAAU,QAAQ,UAAU,IAAI;GACzD,IAAI,aAAa,QACf,OAAO;GAGT,OAAO;EACT;EAEA,OAAO,OAAO,KAAK;CACrB,CACF;AACF;;;;;;AAOA,SAAS,WAAW,QAAsB,MAAuB;CAC/D,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,UAAmB;CAEvB,KAAK,MAAM,WAAW,UAAU;EAC9B,IAAI,YAAY,QAAQ,YAAY,QAClC;EAGF,IAAI,OAAO,YAAY,UACrB;EAGF,UAAW,QAAoC;CACjD;CAEA,OAAO;AACT"}
@@ -0,0 +1,267 @@
1
+ import { InvalidRequestError } from "../errors/invalid-request-error.mjs";
2
+ import "../errors/index.mjs";
3
+ import { Instruction } from "./instruction.mjs";
4
+ import { Persona } from "./persona.mjs";
5
+ import { defaultPromptsManager, promptKey } from "../prompts/prompts-manager.mjs";
6
+ import { readFileSync } from "node:fs";
7
+
8
+ //#region ../@warlock.js/ai/src/system-prompt/system-prompt.ts
9
+ /**
10
+ * Monotonic source of the internal, non-registry display id every
11
+ * `SystemPrompt` carries. Anonymous (unnamed) prompts have nothing else to
12
+ * identify them by; this id never feeds the registry and is never derived from
13
+ * the wall clock, so it stays stable and order-deterministic across a run.
14
+ */
15
+ let displayIdCounter = 0;
16
+ /**
17
+ * Narrow an arbitrary value to a `SystemPromptContract` — true when it exposes
18
+ * the builder surface (`blocks` array + a callable `resolve`). Used by the
19
+ * registry-aware `merge` overload to tell a folded contract from a raw block
20
+ * or a registry name string, robustly across duplicate package copies.
21
+ */
22
+ function isSystemPromptContract(value) {
23
+ return typeof value === "object" && value !== null && Array.isArray(value.blocks) && typeof value.resolve === "function";
24
+ }
25
+ /**
26
+ * Build the deterministic provenance label for a prompt — `name@version` when
27
+ * it is registered, otherwise its internal display id. No random suffixes, so
28
+ * the same source always yields the same `composedFrom` entry.
29
+ */
30
+ function provenanceLabel(prompt) {
31
+ const meta = prompt.meta();
32
+ if (meta?.name) return promptKey(meta.name, meta.version ?? "1");
33
+ return prompt instanceof SystemPrompt ? prompt.id : "anonymous";
34
+ }
35
+ /**
36
+ * Concrete `SystemPromptContract` — an immutable layered prompt builder.
37
+ *
38
+ * **Role.** The top-level composer for a system prompt: it holds an ordered
39
+ * list of typed blocks (persona + instructions) and resolves the whole
40
+ * stack into one final string when the agent is about to call the model.
41
+ *
42
+ * **Responsibility.**
43
+ * - Owns: the ordered `blocks` list and the block-join rules (insertion
44
+ * order, blank-line separator, trim).
45
+ * - Does NOT own: how any individual block is rendered (delegated to each
46
+ * block's `resolve()`), the placeholder syntax (delegated to
47
+ * `renderPlaceholders`), or any knowledge of the agent, model, or
48
+ * session consuming the resolved text.
49
+ *
50
+ * Blocks are discriminated by a string `type` tag (`"persona"` /
51
+ * `"instruction"`) rather than `instanceof`, so user-supplied blocks that
52
+ * implement `SystemPromptBlockContract` interoperate seamlessly with blocks
53
+ * built via `ai.persona()` / `ai.instruction()` — even across duplicate
54
+ * package copies or bundler scope boundaries.
55
+ *
56
+ * The builder is **immutable** — every `.persona()` / `.instruction()`
57
+ * call returns a fresh `SystemPrompt` instance sharing nothing mutable
58
+ * with its parent. This makes forking a base prompt into specialized
59
+ * variants a safe, side-effect-free operation.
60
+ *
61
+ * Users construct via the `ai.systemPrompt()` factory — `new SystemPrompt()`
62
+ * is not the public API (see §4.2 of code-style.md). Modeled as a class so
63
+ * that methods live on the prototype (one copy shared across every forked
64
+ * instance) and downstream code can branch via `instanceof SystemPrompt`.
65
+ *
66
+ * @example
67
+ * // Chainable form
68
+ * const alex = ai.persona("You are Alex, a TypeScript expert.");
69
+ * const replyIn = ai.instruction("Respond in {{language|English}}.");
70
+ *
71
+ * const base = ai.systemPrompt().persona(alex).instruction(replyIn);
72
+ * const arabicVariant = base.instruction("Prefer Arabic comments.");
73
+ *
74
+ * base.resolve({ language: "English" });
75
+ * arabicVariant.resolve({ language: "Arabic" });
76
+ *
77
+ * @example
78
+ * // Array form — insertion order is preserved exactly
79
+ * const prompt = ai.systemPrompt([
80
+ * ai.persona("You are Alex, a TypeScript expert."),
81
+ * ai.instruction("Respond in {{language|English}}."),
82
+ * ]);
83
+ */
84
+ var SystemPrompt = class SystemPrompt {
85
+ constructor(blocks = [], metaData) {
86
+ this.blocks = blocks;
87
+ this.metaData = metaData;
88
+ this.id = `prompt#${displayIdCounter++}`;
89
+ if (metaData?.name) defaultPromptsManager().register(this);
90
+ }
91
+ meta(meta) {
92
+ if (meta === void 0) return this.metaData;
93
+ return new SystemPrompt(this.blocks, {
94
+ ...this.metaData,
95
+ ...meta
96
+ });
97
+ }
98
+ /**
99
+ * Build a system prompt by reading the file at `path` once, synchronously,
100
+ * at construction time. The file's UTF-8 contents seed a single instruction
101
+ * block — the same semantics as the string-seed form of `systemPrompt()` —
102
+ * so placeholders inside the file (`{{language|English}}`) resolve at
103
+ * `resolve()` time and the result can be forked with further
104
+ * `.persona()` / `.instruction()` calls.
105
+ *
106
+ * One-shot by design: the file is read exactly once here, never re-read on
107
+ * `resolve()`. Reads are synchronous so the call stays a drop-in for the
108
+ * synchronous `systemPrompt()` factory and the synchronous `resolve()` API.
109
+ *
110
+ * Throws `InvalidRequestError` when the file cannot be read (missing path,
111
+ * permission denied) — surfacing the underlying cause so a typo in the
112
+ * prompt path fails loudly at construction instead of silently producing an
113
+ * empty prompt.
114
+ *
115
+ * @param path - Filesystem path to the prompt template file.
116
+ *
117
+ * @example
118
+ * const prompt = SystemPrompt.fromFile("./prompts/support-agent.md");
119
+ *
120
+ * const localized = prompt.instruction("Respond in {{language|English}}.");
121
+ * localized.resolve({ language: "Arabic" });
122
+ */
123
+ static fromFile(path) {
124
+ let contents;
125
+ try {
126
+ contents = readFileSync(path, "utf8");
127
+ } catch (error) {
128
+ throw new InvalidRequestError(`Failed to read system prompt file "${path}" — ${error instanceof Error ? error.message : String(error)}`, {
129
+ context: { path },
130
+ cause: error
131
+ });
132
+ }
133
+ return new SystemPrompt([new Instruction(contents)]);
134
+ }
135
+ /**
136
+ * Return a new builder with the persona block set. If a persona already
137
+ * exists it's replaced in place (preserving its position in `blocks`);
138
+ * otherwise the new persona is prepended so persona-first remains the
139
+ * default for chain-built prompts. Accepts either raw text (auto-wrapped
140
+ * via `new Persona`) or an existing `PersonaContract` instance for reuse
141
+ * across prompts.
142
+ */
143
+ persona(value) {
144
+ const block = typeof value === "string" ? new Persona(value) : value;
145
+ const existingIndex = this.blocks.findIndex((candidate) => candidate.type === "persona");
146
+ if (existingIndex >= 0) {
147
+ const next = [...this.blocks];
148
+ next[existingIndex] = block;
149
+ return new SystemPrompt(next);
150
+ }
151
+ return new SystemPrompt([block, ...this.blocks]);
152
+ }
153
+ /**
154
+ * Return a new builder with the given instruction appended. Instructions
155
+ * render in insertion order. Accepts either raw text (auto-wrapped via
156
+ * `new Instruction`) or an existing `InstructionContract` instance for
157
+ * cross-prompt reuse.
158
+ */
159
+ instruction(value) {
160
+ const block = typeof value === "string" ? new Instruction(value) : value;
161
+ return new SystemPrompt([...this.blocks, block]);
162
+ }
163
+ merge(first, ...rest) {
164
+ if (typeof first === "string") {
165
+ const options = rest[0];
166
+ const resolved = defaultPromptsManager().get(first, options?.fromVersion);
167
+ return this.mergeContract(resolved);
168
+ }
169
+ if (isSystemPromptContract(first)) return this.mergeContract(first);
170
+ const all = [...first ? [first] : [], ...rest];
171
+ return this.foldBlocks(this, all);
172
+ }
173
+ /**
174
+ * Fold an ordered list of blocks onto a starting prompt: persona blocks
175
+ * set/replace the single leading persona; every other block appends in
176
+ * order. The shared core of the variadic-block `merge` and the contract fold.
177
+ */
178
+ foldBlocks(start, blocks) {
179
+ return blocks.reduce((prompt, block) => {
180
+ if (block.type === "persona") return prompt.persona(block);
181
+ return new SystemPrompt([...prompt.blocks, block]);
182
+ }, start);
183
+ }
184
+ /**
185
+ * Fold another prompt contract into this one (persona replaces, instructions
186
+ * append) and stamp the deterministic `composedFrom` provenance — this
187
+ * prompt's existing provenance (or its own label) followed by the folded
188
+ * source's label. The result is anonymous so it never auto-registers.
189
+ */
190
+ mergeContract(source) {
191
+ const folded = this.foldBlocks(this, source.blocks);
192
+ const composedFrom = [...this.metaData?.composedFrom ?? (this.metaData?.name ? [provenanceLabel(this)] : []), provenanceLabel(source)];
193
+ return new SystemPrompt(folded.blocks, { composedFrom });
194
+ }
195
+ /**
196
+ * Resolve every block against the placeholder map, join the results with
197
+ * blank-line separators (in insertion order), and trim. Returns an empty
198
+ * string when no blocks are present — callers treat that as "no system
199
+ * message".
200
+ */
201
+ resolve(placeholders) {
202
+ return this.blocks.map((block) => block.resolve(placeholders)).join("\n\n").trim();
203
+ }
204
+ /**
205
+ * Validate this prompt via the process-wide `ai.prompts` manager — sugar for
206
+ * `ai.prompts.validate(this, options)`. Runs the deterministic placeholder
207
+ * check and, when `options.judge` is supplied, the Nova-safe LLM-as-judge
208
+ * pass. Never throws on a judge failure; `ok` tracks the deterministic
209
+ * verdict alone.
210
+ */
211
+ validate(options) {
212
+ return defaultPromptsManager().validate(this, options);
213
+ }
214
+ };
215
+ function systemPromptFactory(input, meta) {
216
+ if (input === void 0) return new SystemPrompt([], meta);
217
+ if (typeof input === "string") return new SystemPrompt([new Instruction(input)], meta);
218
+ return new SystemPrompt([...input], meta);
219
+ }
220
+ /**
221
+ * Create a new immutable system-prompt builder.
222
+ *
223
+ * **Role.** Public factory for `SystemPrompt` — keeps user-facing code
224
+ * free of `new` and consistent with `ai.tool()`, `ai.agent()`,
225
+ * `ai.persona()`, `ai.instruction()`.
226
+ *
227
+ * Input forms:
228
+ * - No argument → empty builder, chain `.persona()` / `.instruction()`
229
+ * - Single string → seeded with one instruction for quick one-shot prompts
230
+ * - Array of blocks → used verbatim, preserving insertion order
231
+ * - `.fromFile(path)` → seeded from a file read once at construction
232
+ *
233
+ * Pass a second `meta` argument to name the prompt — a named prompt
234
+ * auto-registers in `ai.prompts` under `name@version` (version defaults to the
235
+ * next integer). Forks (`.persona()`, `.instruction()`, `.merge()`) are
236
+ * anonymous unless re-named via `.meta({ name })`.
237
+ *
238
+ * @example
239
+ * // Composed builder
240
+ * const prompt = systemPrompt()
241
+ * .persona("You are Alex, a senior TypeScript engineer.")
242
+ * .instruction("Always include working code examples.")
243
+ * .instruction("Respond in {{language|English}}.");
244
+ *
245
+ * prompt.resolve({ language: "Arabic" });
246
+ *
247
+ * @example
248
+ * // One-shot seed
249
+ * const prompt = systemPrompt("Answer only with JSON matching the schema.");
250
+ *
251
+ * @example
252
+ * // From a file, read once at construction
253
+ * const prompt = systemPrompt.fromFile("./prompts/support-agent.md");
254
+ *
255
+ * @example
256
+ * // Array form — fully declarative
257
+ * const prompt = systemPrompt([
258
+ * ai.persona("You are Alex."),
259
+ * ai.instruction("Always cite sources."),
260
+ * ai.instruction("Respond in {{language|English}}."),
261
+ * ]);
262
+ */
263
+ const systemPrompt = Object.assign(systemPromptFactory, { fromFile: SystemPrompt.fromFile });
264
+
265
+ //#endregion
266
+ export { SystemPrompt, systemPrompt };
267
+ //# sourceMappingURL=system-prompt.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"system-prompt.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/system-prompt/system-prompt.ts"],"sourcesContent":["import { readFileSync } from \"node:fs\";\nimport type { Placeholders } from \"../contracts/placeholders.type\";\nimport type {\n InstructionContract,\n PersonaContract,\n SystemPromptBlockContract,\n SystemPromptContract,\n SystemPromptMergeOptions,\n SystemPromptMeta,\n} from \"../contracts/system-prompt.contract\";\nimport { InvalidRequestError } from \"../errors\";\nimport { defaultPromptsManager, promptKey } from \"../prompts/prompts-manager\";\nimport type {\n PromptValidationResult,\n PromptsValidateOptions,\n} from \"../prompts/prompts-manager.type\";\nimport { Instruction } from \"./instruction\";\nimport { Persona } from \"./persona\";\n\n/**\n * Monotonic source of the internal, non-registry display id every\n * `SystemPrompt` carries. Anonymous (unnamed) prompts have nothing else to\n * identify them by; this id never feeds the registry and is never derived from\n * the wall clock, so it stays stable and order-deterministic across a run.\n */\nlet displayIdCounter = 0;\n\n/**\n * Narrow an arbitrary value to a `SystemPromptContract` — true when it exposes\n * the builder surface (`blocks` array + a callable `resolve`). Used by the\n * registry-aware `merge` overload to tell a folded contract from a raw block\n * or a registry name string, robustly across duplicate package copies.\n */\nfunction isSystemPromptContract(\n value: unknown,\n): value is SystemPromptContract {\n return (\n typeof value === \"object\" &&\n value !== null &&\n Array.isArray((value as { blocks?: unknown }).blocks) &&\n typeof (value as { resolve?: unknown }).resolve === \"function\"\n );\n}\n\n/**\n * Build the deterministic provenance label for a prompt — `name@version` when\n * it is registered, otherwise its internal display id. No random suffixes, so\n * the same source always yields the same `composedFrom` entry.\n */\nfunction provenanceLabel(prompt: SystemPromptContract): string {\n const meta = prompt.meta();\n\n if (meta?.name) {\n return promptKey(meta.name, meta.version ?? \"1\");\n }\n\n return prompt instanceof SystemPrompt ? prompt.id : \"anonymous\";\n}\n\n/**\n * Concrete `SystemPromptContract` — an immutable layered prompt builder.\n *\n * **Role.** The top-level composer for a system prompt: it holds an ordered\n * list of typed blocks (persona + instructions) and resolves the whole\n * stack into one final string when the agent is about to call the model.\n *\n * **Responsibility.**\n * - Owns: the ordered `blocks` list and the block-join rules (insertion\n * order, blank-line separator, trim).\n * - Does NOT own: how any individual block is rendered (delegated to each\n * block's `resolve()`), the placeholder syntax (delegated to\n * `renderPlaceholders`), or any knowledge of the agent, model, or\n * session consuming the resolved text.\n *\n * Blocks are discriminated by a string `type` tag (`\"persona\"` /\n * `\"instruction\"`) rather than `instanceof`, so user-supplied blocks that\n * implement `SystemPromptBlockContract` interoperate seamlessly with blocks\n * built via `ai.persona()` / `ai.instruction()` — even across duplicate\n * package copies or bundler scope boundaries.\n *\n * The builder is **immutable** — every `.persona()` / `.instruction()`\n * call returns a fresh `SystemPrompt` instance sharing nothing mutable\n * with its parent. This makes forking a base prompt into specialized\n * variants a safe, side-effect-free operation.\n *\n * Users construct via the `ai.systemPrompt()` factory — `new SystemPrompt()`\n * is not the public API (see §4.2 of code-style.md). Modeled as a class so\n * that methods live on the prototype (one copy shared across every forked\n * instance) and downstream code can branch via `instanceof SystemPrompt`.\n *\n * @example\n * // Chainable form\n * const alex = ai.persona(\"You are Alex, a TypeScript expert.\");\n * const replyIn = ai.instruction(\"Respond in {{language|English}}.\");\n *\n * const base = ai.systemPrompt().persona(alex).instruction(replyIn);\n * const arabicVariant = base.instruction(\"Prefer Arabic comments.\");\n *\n * base.resolve({ language: \"English\" });\n * arabicVariant.resolve({ language: \"Arabic\" });\n *\n * @example\n * // Array form — insertion order is preserved exactly\n * const prompt = ai.systemPrompt([\n * ai.persona(\"You are Alex, a TypeScript expert.\"),\n * ai.instruction(\"Respond in {{language|English}}.\"),\n * ]);\n */\nexport class SystemPrompt implements SystemPromptContract {\n /**\n * Internal, non-registry id for display / provenance. Stable for the life of\n * the instance; sourced from a monotonic counter, never the wall clock.\n * Anonymous prompts are identified solely by this id.\n */\n public readonly id: string;\n\n public constructor(\n public readonly blocks: readonly SystemPromptBlockContract[] = [],\n private readonly metaData?: SystemPromptMeta,\n ) {\n this.id = `prompt#${displayIdCounter++}`;\n\n // Auto-register the moment a builder acquires a name — whether through the\n // `systemPrompt(input, { name })` factory or a `.meta({ name })` rename.\n // Forks built by `persona()` / `instruction()` / `merge()` deliberately\n // drop the name (they pass no meta), so they stay anonymous and never land\n // in the registry unless explicitly re-named.\n if (metaData?.name) {\n defaultPromptsManager().register(this);\n }\n }\n\n /**\n * Read the current metadata snapshot (no argument) or derive a renamed\n * builder (with `meta`). The accessor returns `undefined` for an anonymous\n * prompt; the updater shallow-merges `meta` onto the current metadata and\n * returns a fresh builder. Naming the result registers it in `ai.prompts`.\n */\n public meta(): SystemPromptMeta | undefined;\n public meta(meta: SystemPromptMeta): SystemPromptContract;\n public meta(\n meta?: SystemPromptMeta,\n ): SystemPromptMeta | undefined | SystemPromptContract {\n if (meta === undefined) {\n return this.metaData;\n }\n\n return new SystemPrompt(this.blocks, { ...this.metaData, ...meta });\n }\n\n /**\n * Build a system prompt by reading the file at `path` once, synchronously,\n * at construction time. The file's UTF-8 contents seed a single instruction\n * block — the same semantics as the string-seed form of `systemPrompt()` —\n * so placeholders inside the file (`{{language|English}}`) resolve at\n * `resolve()` time and the result can be forked with further\n * `.persona()` / `.instruction()` calls.\n *\n * One-shot by design: the file is read exactly once here, never re-read on\n * `resolve()`. Reads are synchronous so the call stays a drop-in for the\n * synchronous `systemPrompt()` factory and the synchronous `resolve()` API.\n *\n * Throws `InvalidRequestError` when the file cannot be read (missing path,\n * permission denied) — surfacing the underlying cause so a typo in the\n * prompt path fails loudly at construction instead of silently producing an\n * empty prompt.\n *\n * @param path - Filesystem path to the prompt template file.\n *\n * @example\n * const prompt = SystemPrompt.fromFile(\"./prompts/support-agent.md\");\n *\n * const localized = prompt.instruction(\"Respond in {{language|English}}.\");\n * localized.resolve({ language: \"Arabic\" });\n */\n public static fromFile(path: string): SystemPrompt {\n let contents: string;\n\n try {\n contents = readFileSync(path, \"utf8\");\n } catch (error) {\n throw new InvalidRequestError(\n `Failed to read system prompt file \"${path}\" — ${\n error instanceof Error ? error.message : String(error)\n }`,\n { context: { path }, cause: error },\n );\n }\n\n return new SystemPrompt([new Instruction(contents)]);\n }\n\n /**\n * Return a new builder with the persona block set. If a persona already\n * exists it's replaced in place (preserving its position in `blocks`);\n * otherwise the new persona is prepended so persona-first remains the\n * default for chain-built prompts. Accepts either raw text (auto-wrapped\n * via `new Persona`) or an existing `PersonaContract` instance for reuse\n * across prompts.\n */\n public persona(value: PersonaContract | string): SystemPromptContract {\n const block = typeof value === \"string\" ? new Persona(value) : value;\n const existingIndex = this.blocks.findIndex(\n candidate => candidate.type === \"persona\",\n );\n\n if (existingIndex >= 0) {\n const next = [...this.blocks];\n next[existingIndex] = block;\n\n return new SystemPrompt(next) as this;\n }\n\n return new SystemPrompt([block, ...this.blocks]);\n }\n\n /**\n * Return a new builder with the given instruction appended. Instructions\n * render in insertion order. Accepts either raw text (auto-wrapped via\n * `new Instruction`) or an existing `InstructionContract` instance for\n * cross-prompt reuse.\n */\n public instruction(\n value: InstructionContract | string,\n ): SystemPromptContract {\n const block = typeof value === \"string\" ? new Instruction(value) : value;\n\n return new SystemPrompt([...this.blocks, block]);\n }\n\n /**\n * Fold predefined blocks, another prompt contract, or a registered prompt\n * name into this builder. Three forms share one method:\n *\n * - `merge(...blocks)` — N pre-built `ai.persona()` / `ai.instruction()`\n * blocks. A `persona` block sets/replaces the single, leading persona;\n * every other block appends in order. `base.merge(reviewer, style, lang)`\n * equals `base.persona(reviewer).instruction(style).instruction(lang)`.\n * - `merge(contract)` — another prompt; its blocks fold in (persona\n * replaces, instructions append) and `meta.composedFrom` records the\n * provenance of both sides.\n * - `merge(name, { fromVersion })` — a prompt resolved from `ai.prompts`\n * (latest version unless `fromVersion` selects another); throws\n * `InvalidRequestError` when the name / version is unregistered.\n *\n * Immutable — the original builder is untouched; passing zero blocks returns\n * an equivalent builder. The folded result is anonymous (no `name`), so it\n * is never auto-registered even though it carries `composedFrom` provenance.\n */\n public merge(\n ...blocks: readonly SystemPromptBlockContract[]\n ): SystemPromptContract;\n public merge(source: SystemPromptContract): SystemPromptContract;\n public merge(\n name: string,\n options?: SystemPromptMergeOptions,\n ): SystemPromptContract;\n public merge(\n first?:\n | SystemPromptBlockContract\n | SystemPromptContract\n | string,\n // `undefined` is part of the element union so the `merge(name, options?)`\n // overload's optional trailing `options?` (i.e. `… | undefined`) stays\n // assignable to this implementation signature.\n ...rest: readonly (\n | SystemPromptBlockContract\n | SystemPromptMergeOptions\n | undefined\n )[]\n ): SystemPromptContract {\n // Registry-name form: resolve from ai.prompts at the chosen version.\n if (typeof first === \"string\") {\n const options = rest[0] as SystemPromptMergeOptions | undefined;\n const resolved = defaultPromptsManager().get(first, options?.fromVersion);\n\n return this.mergeContract(resolved);\n }\n\n // Contract form: fold another prompt's blocks + record provenance.\n if (isSystemPromptContract(first)) {\n return this.mergeContract(first);\n }\n\n // Variadic block form (the original behavior).\n const all = [\n ...(first ? [first] : []),\n ...rest,\n ] as readonly SystemPromptBlockContract[];\n\n return this.foldBlocks(this, all);\n }\n\n /**\n * Fold an ordered list of blocks onto a starting prompt: persona blocks\n * set/replace the single leading persona; every other block appends in\n * order. The shared core of the variadic-block `merge` and the contract fold.\n */\n private foldBlocks(\n start: SystemPromptContract,\n blocks: readonly SystemPromptBlockContract[],\n ): SystemPromptContract {\n return blocks.reduce<SystemPromptContract>((prompt, block) => {\n if (block.type === \"persona\") {\n return prompt.persona(block as PersonaContract);\n }\n\n return new SystemPrompt([...prompt.blocks, block]);\n }, start);\n }\n\n /**\n * Fold another prompt contract into this one (persona replaces, instructions\n * append) and stamp the deterministic `composedFrom` provenance — this\n * prompt's existing provenance (or its own label) followed by the folded\n * source's label. The result is anonymous so it never auto-registers.\n */\n private mergeContract(\n source: SystemPromptContract,\n ): SystemPromptContract {\n const folded = this.foldBlocks(this, source.blocks);\n\n const baseProvenance =\n this.metaData?.composedFrom ??\n (this.metaData?.name ? [provenanceLabel(this)] : []);\n\n const composedFrom = [...baseProvenance, provenanceLabel(source)];\n\n // Carry forward only provenance — never the name — so the merged result is\n // a fresh anonymous prompt (immutable rename = new key; original stays).\n return new SystemPrompt(folded.blocks, { composedFrom });\n }\n\n /**\n * Resolve every block against the placeholder map, join the results with\n * blank-line separators (in insertion order), and trim. Returns an empty\n * string when no blocks are present — callers treat that as \"no system\n * message\".\n */\n public resolve(placeholders?: Placeholders): string {\n return this.blocks\n .map(block => block.resolve(placeholders))\n .join(\"\\n\\n\")\n .trim();\n }\n\n /**\n * Validate this prompt via the process-wide `ai.prompts` manager — sugar for\n * `ai.prompts.validate(this, options)`. Runs the deterministic placeholder\n * check and, when `options.judge` is supplied, the Nova-safe LLM-as-judge\n * pass. Never throws on a judge failure; `ok` tracks the deterministic\n * verdict alone.\n */\n public validate(\n options?: PromptsValidateOptions,\n ): Promise<PromptValidationResult> {\n return defaultPromptsManager().validate(this, options);\n }\n}\n\n/**\n * Public factory for `SystemPrompt`, callable directly or via its\n * `fromFile` static. Exists as a named interface so the callable signature\n * and the `fromFile` attachment travel together as one public type.\n */\nexport interface SystemPromptFactory {\n (\n input?: string | ReadonlyArray<SystemPromptBlockContract>,\n meta?: SystemPromptMeta,\n ): SystemPrompt;\n\n /**\n * Build a system prompt from a file read once at construction. Delegates\n * to {@link SystemPrompt.fromFile}, so `ai.systemPrompt.fromFile(path)` and\n * `SystemPrompt.fromFile(path)` behave identically.\n *\n * @example\n * const prompt = ai.systemPrompt.fromFile(\"./prompts/support-agent.md\");\n */\n fromFile(path: string): SystemPrompt;\n}\n\nfunction systemPromptFactory(\n input?: string | ReadonlyArray<SystemPromptBlockContract>,\n meta?: SystemPromptMeta,\n): SystemPrompt {\n if (input === undefined) {\n return new SystemPrompt([], meta);\n }\n\n if (typeof input === \"string\") {\n return new SystemPrompt([new Instruction(input)], meta);\n }\n\n return new SystemPrompt([...input], meta);\n}\n\n/**\n * Create a new immutable system-prompt builder.\n *\n * **Role.** Public factory for `SystemPrompt` — keeps user-facing code\n * free of `new` and consistent with `ai.tool()`, `ai.agent()`,\n * `ai.persona()`, `ai.instruction()`.\n *\n * Input forms:\n * - No argument → empty builder, chain `.persona()` / `.instruction()`\n * - Single string → seeded with one instruction for quick one-shot prompts\n * - Array of blocks → used verbatim, preserving insertion order\n * - `.fromFile(path)` → seeded from a file read once at construction\n *\n * Pass a second `meta` argument to name the prompt — a named prompt\n * auto-registers in `ai.prompts` under `name@version` (version defaults to the\n * next integer). Forks (`.persona()`, `.instruction()`, `.merge()`) are\n * anonymous unless re-named via `.meta({ name })`.\n *\n * @example\n * // Composed builder\n * const prompt = systemPrompt()\n * .persona(\"You are Alex, a senior TypeScript engineer.\")\n * .instruction(\"Always include working code examples.\")\n * .instruction(\"Respond in {{language|English}}.\");\n *\n * prompt.resolve({ language: \"Arabic\" });\n *\n * @example\n * // One-shot seed\n * const prompt = systemPrompt(\"Answer only with JSON matching the schema.\");\n *\n * @example\n * // From a file, read once at construction\n * const prompt = systemPrompt.fromFile(\"./prompts/support-agent.md\");\n *\n * @example\n * // Array form — fully declarative\n * const prompt = systemPrompt([\n * ai.persona(\"You are Alex.\"),\n * ai.instruction(\"Always cite sources.\"),\n * ai.instruction(\"Respond in {{language|English}}.\"),\n * ]);\n */\nexport const systemPrompt: SystemPromptFactory = Object.assign(\n systemPromptFactory,\n { fromFile: SystemPrompt.fromFile },\n);\n"],"mappings":";;;;;;;;;;;;;;AAyBA,IAAI,mBAAmB;;;;;;;AAQvB,SAAS,uBACP,OAC+B;CAC/B,OACE,OAAO,UAAU,YACjB,UAAU,QACV,MAAM,QAAS,MAA+B,MAAM,KACpD,OAAQ,MAAgC,YAAY;AAExD;;;;;;AAOA,SAAS,gBAAgB,QAAsC;CAC7D,MAAM,OAAO,OAAO,KAAK;CAEzB,IAAI,MAAM,MACR,OAAO,UAAU,KAAK,MAAM,KAAK,WAAW,GAAG;CAGjD,OAAO,kBAAkB,eAAe,OAAO,KAAK;AACtD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,IAAa,eAAb,MAAa,aAA6C;CAQxD,AAAO,YACL,AAAgB,SAA+C,CAAC,GAChE,AAAiB,UACjB;EAFgB;EACC;EAEjB,KAAK,KAAK,UAAU;EAOpB,IAAI,UAAU,MACZ,sBAAsB,CAAC,CAAC,SAAS,IAAI;CAEzC;CAUA,AAAO,KACL,MACqD;EACrD,IAAI,SAAS,QACX,OAAO,KAAK;EAGd,OAAO,IAAI,aAAa,KAAK,QAAQ;GAAE,GAAG,KAAK;GAAU,GAAG;EAAK,CAAC;CACpE;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BA,OAAc,SAAS,MAA4B;EACjD,IAAI;EAEJ,IAAI;GACF,WAAW,aAAa,MAAM,MAAM;EACtC,SAAS,OAAO;GACd,MAAM,IAAI,oBACR,sCAAsC,KAAK,MACzC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KAEvD;IAAE,SAAS,EAAE,KAAK;IAAG,OAAO;GAAM,CACpC;EACF;EAEA,OAAO,IAAI,aAAa,CAAC,IAAI,YAAY,QAAQ,CAAC,CAAC;CACrD;;;;;;;;;CAUA,AAAO,QAAQ,OAAuD;EACpE,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,QAAQ,KAAK,IAAI;EAC/D,MAAM,gBAAgB,KAAK,OAAO,WAChC,cAAa,UAAU,SAAS,SAClC;EAEA,IAAI,iBAAiB,GAAG;GACtB,MAAM,OAAO,CAAC,GAAG,KAAK,MAAM;GAC5B,KAAK,iBAAiB;GAEtB,OAAO,IAAI,aAAa,IAAI;EAC9B;EAEA,OAAO,IAAI,aAAa,CAAC,OAAO,GAAG,KAAK,MAAM,CAAC;CACjD;;;;;;;CAQA,AAAO,YACL,OACsB;EACtB,MAAM,QAAQ,OAAO,UAAU,WAAW,IAAI,YAAY,KAAK,IAAI;EAEnE,OAAO,IAAI,aAAa,CAAC,GAAG,KAAK,QAAQ,KAAK,CAAC;CACjD;CA6BA,AAAO,MACL,OAOA,GAAG,MAKmB;EAEtB,IAAI,OAAO,UAAU,UAAU;GAC7B,MAAM,UAAU,KAAK;GACrB,MAAM,WAAW,sBAAsB,CAAC,CAAC,IAAI,OAAO,SAAS,WAAW;GAExE,OAAO,KAAK,cAAc,QAAQ;EACpC;EAGA,IAAI,uBAAuB,KAAK,GAC9B,OAAO,KAAK,cAAc,KAAK;EAIjC,MAAM,MAAM,CACV,GAAI,QAAQ,CAAC,KAAK,IAAI,CAAC,GACvB,GAAG,IACL;EAEA,OAAO,KAAK,WAAW,MAAM,GAAG;CAClC;;;;;;CAOA,AAAQ,WACN,OACA,QACsB;EACtB,OAAO,OAAO,QAA8B,QAAQ,UAAU;GAC5D,IAAI,MAAM,SAAS,WACjB,OAAO,OAAO,QAAQ,KAAwB;GAGhD,OAAO,IAAI,aAAa,CAAC,GAAG,OAAO,QAAQ,KAAK,CAAC;EACnD,GAAG,KAAK;CACV;;;;;;;CAQA,AAAQ,cACN,QACsB;EACtB,MAAM,SAAS,KAAK,WAAW,MAAM,OAAO,MAAM;EAMlD,MAAM,eAAe,CAAC,GAHpB,KAAK,UAAU,iBACd,KAAK,UAAU,OAAO,CAAC,gBAAgB,IAAI,CAAC,IAAI,CAAC,IAEX,gBAAgB,MAAM,CAAC;EAIhE,OAAO,IAAI,aAAa,OAAO,QAAQ,EAAE,aAAa,CAAC;CACzD;;;;;;;CAQA,AAAO,QAAQ,cAAqC;EAClD,OAAO,KAAK,OACT,KAAI,UAAS,MAAM,QAAQ,YAAY,CAAC,CAAC,CACzC,KAAK,MAAM,CAAC,CACZ,KAAK;CACV;;;;;;;;CASA,AAAO,SACL,SACiC;EACjC,OAAO,sBAAsB,CAAC,CAAC,SAAS,MAAM,OAAO;CACvD;AACF;AAwBA,SAAS,oBACP,OACA,MACc;CACd,IAAI,UAAU,QACZ,OAAO,IAAI,aAAa,CAAC,GAAG,IAAI;CAGlC,IAAI,OAAO,UAAU,UACnB,OAAO,IAAI,aAAa,CAAC,IAAI,YAAY,KAAK,CAAC,GAAG,IAAI;CAGxD,OAAO,IAAI,aAAa,CAAC,GAAG,KAAK,GAAG,IAAI;AAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA6CA,MAAa,eAAoC,OAAO,OACtD,qBACA,EAAE,UAAU,aAAa,SAAS,CACpC"}
@@ -0,0 +1,48 @@
1
+ //#region ../@warlock.js/ai/src/team/gates.ts
2
+ /**
3
+ * Build the `"quality"` gate — a review-then-fix `evaluate` callback.
4
+ *
5
+ * After each iteration's intents settle and merge into supervisor
6
+ * `state`, the gate reads `state[gateKey]`. If truthy the run
7
+ * terminates (`{ satisfied: true }`); otherwise it re-dispatches the
8
+ * fixer with the reviewer feedback (`state[feedbackKey]`) threaded into
9
+ * the next iteration's composed input. No termination or re-dispatch
10
+ * code is written here — it leans entirely on the shipped
11
+ * {@link EvaluateResult} semantics.
12
+ *
13
+ * @param gateKey - State key holding the reviewer verdict. Default `"approved"`.
14
+ * @param fixerRole - Member key the gate reassigns to on rejection. Default `"fixer"`.
15
+ * @param feedbackKey - State key holding reviewer feedback. Default `"notes"`.
16
+ */
17
+ function buildQualityGate(gateKey = "approved", fixerRole = "fixer", feedbackKey = "notes") {
18
+ return (ctx) => {
19
+ const state = ctx.state;
20
+ if (state[gateKey]) return { satisfied: true };
21
+ return {
22
+ reassignTo: fixerRole,
23
+ feedback: String(state[feedbackKey] ?? "")
24
+ };
25
+ };
26
+ }
27
+ /**
28
+ * Build the `"verify"` gate — a test-then-fix `evaluate` callback.
29
+ *
30
+ * Identical in shape to {@link buildQualityGate} but keyed on the
31
+ * tester's pass/fail slice (`state[gateKey]`, default `"passed"`)
32
+ * rather than a subjective reviewer score. On failure it re-dispatches
33
+ * the fixer; there is no feedback channel for the pass/fail signal, so
34
+ * none is threaded forward.
35
+ *
36
+ * @param gateKey - State key holding the pass/fail verdict. Default `"passed"`.
37
+ * @param fixerRole - Member key the gate reassigns to on failure. Default `"fixer"`.
38
+ */
39
+ function buildVerifyGate(gateKey = "passed", fixerRole = "fixer") {
40
+ return (ctx) => {
41
+ if (ctx.state[gateKey]) return { satisfied: true };
42
+ return { reassignTo: fixerRole };
43
+ };
44
+ }
45
+
46
+ //#endregion
47
+ export { buildQualityGate, buildVerifyGate };
48
+ //# sourceMappingURL=gates.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gates.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/team/gates.ts"],"sourcesContent":["import type { EvaluateContext, EvaluateResult } from \"../contracts/supervisor/evaluate-context.type\";\n\n/**\n * Build the `\"quality\"` gate — a review-then-fix `evaluate` callback.\n *\n * After each iteration's intents settle and merge into supervisor\n * `state`, the gate reads `state[gateKey]`. If truthy the run\n * terminates (`{ satisfied: true }`); otherwise it re-dispatches the\n * fixer with the reviewer feedback (`state[feedbackKey]`) threaded into\n * the next iteration's composed input. No termination or re-dispatch\n * code is written here — it leans entirely on the shipped\n * {@link EvaluateResult} semantics.\n *\n * @param gateKey - State key holding the reviewer verdict. Default `\"approved\"`.\n * @param fixerRole - Member key the gate reassigns to on rejection. Default `\"fixer\"`.\n * @param feedbackKey - State key holding reviewer feedback. Default `\"notes\"`.\n */\nexport function buildQualityGate<TState>(\n gateKey = \"approved\",\n fixerRole = \"fixer\",\n feedbackKey = \"notes\",\n): (ctx: EvaluateContext<TState>) => EvaluateResult {\n return (ctx) => {\n const state = ctx.state as Record<string, unknown>;\n\n if (state[gateKey]) {\n return { satisfied: true };\n }\n\n return { reassignTo: fixerRole, feedback: String(state[feedbackKey] ?? \"\") };\n };\n}\n\n/**\n * Build the `\"verify\"` gate — a test-then-fix `evaluate` callback.\n *\n * Identical in shape to {@link buildQualityGate} but keyed on the\n * tester's pass/fail slice (`state[gateKey]`, default `\"passed\"`)\n * rather than a subjective reviewer score. On failure it re-dispatches\n * the fixer; there is no feedback channel for the pass/fail signal, so\n * none is threaded forward.\n *\n * @param gateKey - State key holding the pass/fail verdict. Default `\"passed\"`.\n * @param fixerRole - Member key the gate reassigns to on failure. Default `\"fixer\"`.\n */\nexport function buildVerifyGate<TState>(\n gateKey = \"passed\",\n fixerRole = \"fixer\",\n): (ctx: EvaluateContext<TState>) => EvaluateResult {\n return (ctx) => {\n const state = ctx.state as Record<string, unknown>;\n\n if (state[gateKey]) {\n return { satisfied: true };\n }\n\n return { reassignTo: fixerRole };\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAiBA,SAAgB,iBACd,UAAU,YACV,YAAY,SACZ,cAAc,SACoC;CAClD,QAAQ,QAAQ;EACd,MAAM,QAAQ,IAAI;EAElB,IAAI,MAAM,UACR,OAAO,EAAE,WAAW,KAAK;EAG3B,OAAO;GAAE,YAAY;GAAW,UAAU,OAAO,MAAM,gBAAgB,EAAE;EAAE;CAC7E;AACF;;;;;;;;;;;;;AAcA,SAAgB,gBACd,UAAU,UACV,YAAY,SACsC;CAClD,QAAQ,QAAQ;EAGd,IAFc,IAAI,MAER,UACR,OAAO,EAAE,WAAW,KAAK;EAG3B,OAAO,EAAE,YAAY,UAAU;CACjC;AACF"}
@@ -0,0 +1,3 @@
1
+ import { team } from "./team.mjs";
2
+
3
+ export { };
@@ -0,0 +1,94 @@
1
+ import { SupervisorFailedError } from "../errors/supervisor-failed-error.mjs";
2
+ import "../errors/index.mjs";
3
+ import { supervisor } from "../supervisor/supervisor.mjs";
4
+ import { buildQualityGate, buildVerifyGate } from "./gates.mjs";
5
+
6
+ //#region ../@warlock.js/ai/src/team/team.ts
7
+ /**
8
+ * `ai.team(config)` — thin, transparent sugar over `ai.supervisor`.
9
+ *
10
+ * Builds a {@link SupervisorConfig} from the team-shaped config and
11
+ * calls `supervisor(...)`, returning the **unchanged**
12
+ * `SupervisorContract<TOutput>` — the same object `ai.supervisor`
13
+ * returns, so `ctx.intents.<member>.execute()`, `.asTool()`,
14
+ * `.resume()`, snapshots, and events all stay intact. `team()` owns no
15
+ * loop: the manager becomes `route`/`router`, the members become
16
+ * `intents`, and the `gate` becomes `evaluate`. Everything else passes
17
+ * through 1:1.
18
+ *
19
+ * A `gate: "quality" | "verify"` string selects a pre-built `evaluate`
20
+ * strategy ({@link buildQualityGate} / {@link buildVerifyGate}); a
21
+ * function forwards straight to `SupervisorConfig.evaluate` (full
22
+ * escape hatch). When the gate is a string, the resolved `fixer` (and,
23
+ * for `"quality"`, the `reviewer`) roles are validated against
24
+ * `members` at construction — a missing role throws an authoring-style
25
+ * {@link SupervisorFailedError} (`context: { authoring: true }`) rather
26
+ * than silently starving until `maxIterations`.
27
+ *
28
+ * @example
29
+ * const codeTeam = ai.team({
30
+ * name: "code-team",
31
+ * goal: "Ship a tested module that passes review.",
32
+ * manager: techLeadRouter,
33
+ * members: { builder, reviewer, fixer },
34
+ * gate: "quality",
35
+ * output: v.object({ code: v.string() }),
36
+ * maxIterations: 6,
37
+ * });
38
+ *
39
+ * const { data, report } = await codeTeam.execute("Build a debounce<T> utility.");
40
+ */
41
+ function team(config) {
42
+ const supervisorConfig = {
43
+ name: config.name,
44
+ version: config.version,
45
+ reportType: "team",
46
+ intents: config.members,
47
+ evaluate: resolveGate(config),
48
+ goal: config.goal,
49
+ output: config.output,
50
+ state: config.state,
51
+ maxIterations: config.maxIterations,
52
+ snapshotStore: config.snapshotStore,
53
+ on: config.on,
54
+ observe: config.observe
55
+ };
56
+ if (isRouteManager(config.manager)) supervisorConfig.route = config.manager.route;
57
+ else supervisorConfig.router = config.manager;
58
+ return supervisor(supervisorConfig);
59
+ }
60
+ /**
61
+ * Resolve the team's `gate` into a concrete `evaluate` callback. A
62
+ * function forwards untouched; a {@link TeamGate} string is validated
63
+ * against `members` and desugared into the matching pre-built gate.
64
+ */
65
+ function resolveGate(config) {
66
+ if (typeof config.gate === "function") return config.gate;
67
+ const gate = config.gate;
68
+ const fixerRole = config.roles?.fixer ?? "fixer";
69
+ assertMemberExists(config, fixerRole, "fixer");
70
+ if (gate === "quality") {
71
+ assertMemberExists(config, config.roles?.reviewer ?? "reviewer", "reviewer");
72
+ return buildQualityGate(config.gateKey ?? "approved", fixerRole);
73
+ }
74
+ return buildVerifyGate(config.gateKey ?? "passed", fixerRole);
75
+ }
76
+ /**
77
+ * Construction-time guard: assert the resolved role key exists in
78
+ * `members`, throwing an authoring-style {@link SupervisorFailedError}
79
+ * (tagged `authoring: true`) listing the missing role when it doesn't.
80
+ */
81
+ function assertMemberExists(config, role, label) {
82
+ if (!Object.prototype.hasOwnProperty.call(config.members, role)) throw new SupervisorFailedError(`ai.team("${config.name}"): gate "${config.gate}" needs a "${label}" member but no \`members.${role}\` key exists`, { context: { authoring: true } });
83
+ }
84
+ /**
85
+ * Discriminate the `manager` union: `true` when it is the deterministic
86
+ * `{ route }` form, `false` for a bare `AgentContract` / `RouterEntry`.
87
+ */
88
+ function isRouteManager(manager) {
89
+ return typeof manager === "object" && manager !== null && "route" in manager && typeof manager.route === "function";
90
+ }
91
+
92
+ //#endregion
93
+ export { team };
94
+ //# sourceMappingURL=team.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"team.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/team/team.ts"],"sourcesContent":["import type {\n EvaluateContext,\n EvaluateResult,\n} from \"../contracts/supervisor/evaluate-context.type\";\nimport type { SupervisorIntentValue } from \"../contracts/supervisor/intent-entry.type\";\nimport type { SupervisorConfig } from \"../contracts/supervisor/supervisor-config.type\";\nimport type { SupervisorContract } from \"../contracts/supervisor/supervisor.contract\";\nimport type {\n TeamConfig,\n TeamGate,\n TeamGateFn,\n TeamMemberValue,\n} from \"../contracts/team/team-config.type\";\nimport { SupervisorFailedError } from \"../errors\";\nimport { supervisor } from \"../supervisor/supervisor\";\nimport { buildQualityGate, buildVerifyGate } from \"./gates\";\n\n/**\n * `ai.team(config)` — thin, transparent sugar over `ai.supervisor`.\n *\n * Builds a {@link SupervisorConfig} from the team-shaped config and\n * calls `supervisor(...)`, returning the **unchanged**\n * `SupervisorContract<TOutput>` — the same object `ai.supervisor`\n * returns, so `ctx.intents.<member>.execute()`, `.asTool()`,\n * `.resume()`, snapshots, and events all stay intact. `team()` owns no\n * loop: the manager becomes `route`/`router`, the members become\n * `intents`, and the `gate` becomes `evaluate`. Everything else passes\n * through 1:1.\n *\n * A `gate: \"quality\" | \"verify\"` string selects a pre-built `evaluate`\n * strategy ({@link buildQualityGate} / {@link buildVerifyGate}); a\n * function forwards straight to `SupervisorConfig.evaluate` (full\n * escape hatch). When the gate is a string, the resolved `fixer` (and,\n * for `\"quality\"`, the `reviewer`) roles are validated against\n * `members` at construction — a missing role throws an authoring-style\n * {@link SupervisorFailedError} (`context: { authoring: true }`) rather\n * than silently starving until `maxIterations`.\n *\n * @example\n * const codeTeam = ai.team({\n * name: \"code-team\",\n * goal: \"Ship a tested module that passes review.\",\n * manager: techLeadRouter,\n * members: { builder, reviewer, fixer },\n * gate: \"quality\",\n * output: v.object({ code: v.string() }),\n * maxIterations: 6,\n * });\n *\n * const { data, report } = await codeTeam.execute(\"Build a debounce<T> utility.\");\n */\nexport function team<\n TOutput = unknown,\n TState = TOutput,\n TMembers extends Record<string, TeamMemberValue> = Record<string, TeamMemberValue>,\n>(config: TeamConfig<TOutput, TState, TMembers>): SupervisorContract<TOutput> {\n const supervisorConfig: SupervisorConfig<TOutput, TState> = {\n name: config.name,\n version: config.version,\n // Stamp the report/result discriminator as \"team\" so team runs are\n // distinguishable on the wire (Panoptic groups/filters them as their\n // own type) — the only behavioural difference from a plain supervisor.\n reportType: \"team\",\n intents: config.members as unknown as Record<string, SupervisorIntentValue>,\n evaluate: resolveGate<TOutput, TState, TMembers>(config),\n goal: config.goal,\n output: config.output,\n state: config.state,\n maxIterations: config.maxIterations,\n snapshotStore: config.snapshotStore,\n on: config.on,\n // Forward observability verbatim — the supervisor `team()` returns\n // routes its report through the generic Observer seam, so a team\n // inherits observation with no team-specific wiring (F1/F3).\n observe: config.observe,\n };\n\n // Manager → `route` XOR `router`. Reuse the supervisor's own XOR\n // validation; team() forwards exactly one of the two, so a malformed\n // manager surfaces the existing SupervisorFailedError downstream.\n if (isRouteManager(config.manager)) {\n supervisorConfig.route = config.manager.route;\n } else {\n supervisorConfig.router = config.manager;\n }\n\n return supervisor<TOutput, TState>(supervisorConfig);\n}\n\n/**\n * Resolve the team's `gate` into a concrete `evaluate` callback. A\n * function forwards untouched; a {@link TeamGate} string is validated\n * against `members` and desugared into the matching pre-built gate.\n */\nfunction resolveGate<\n TOutput,\n TState,\n TMembers extends Record<string, TeamMemberValue>,\n>(\n config: TeamConfig<TOutput, TState, TMembers>,\n): (ctx: EvaluateContext<TState>) => EvaluateResult | Promise<EvaluateResult> {\n if (typeof config.gate === \"function\") {\n return config.gate as TeamGateFn<TState>;\n }\n\n const gate: TeamGate = config.gate;\n const fixerRole = config.roles?.fixer ?? \"fixer\";\n\n assertMemberExists(config, fixerRole, \"fixer\");\n\n if (gate === \"quality\") {\n const reviewerRole = config.roles?.reviewer ?? \"reviewer\";\n\n assertMemberExists(config, reviewerRole, \"reviewer\");\n\n const gateKey = config.gateKey ?? \"approved\";\n\n return buildQualityGate<TState>(gateKey, fixerRole);\n }\n\n const gateKey = config.gateKey ?? \"passed\";\n\n return buildVerifyGate<TState>(gateKey, fixerRole);\n}\n\n/**\n * Construction-time guard: assert the resolved role key exists in\n * `members`, throwing an authoring-style {@link SupervisorFailedError}\n * (tagged `authoring: true`) listing the missing role when it doesn't.\n */\nfunction assertMemberExists<\n TOutput,\n TState,\n TMembers extends Record<string, TeamMemberValue>,\n>(\n config: TeamConfig<TOutput, TState, TMembers>,\n role: string,\n label: string,\n): void {\n if (!Object.prototype.hasOwnProperty.call(config.members, role)) {\n throw new SupervisorFailedError(\n `ai.team(\"${config.name}\"): gate \"${config.gate as string}\" needs a \"${label}\" member but no \\`members.${role}\\` key exists`,\n { context: { authoring: true } },\n );\n }\n}\n\n/**\n * Discriminate the `manager` union: `true` when it is the deterministic\n * `{ route }` form, `false` for a bare `AgentContract` / `RouterEntry`.\n */\nfunction isRouteManager<TOutput, TState>(\n manager: TeamConfig<TOutput, TState>[\"manager\"],\n): manager is { route: NonNullable<SupervisorConfig<TOutput, TState>[\"route\"]> } {\n return (\n typeof manager === \"object\" &&\n manager !== null &&\n \"route\" in manager &&\n typeof (manager as { route?: unknown }).route === \"function\"\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmDA,SAAgB,KAId,QAA4E;CAC5E,MAAM,mBAAsD;EAC1D,MAAM,OAAO;EACb,SAAS,OAAO;EAIhB,YAAY;EACZ,SAAS,OAAO;EAChB,UAAU,YAAuC,MAAM;EACvD,MAAM,OAAO;EACb,QAAQ,OAAO;EACf,OAAO,OAAO;EACd,eAAe,OAAO;EACtB,eAAe,OAAO;EACtB,IAAI,OAAO;EAIX,SAAS,OAAO;CAClB;CAKA,IAAI,eAAe,OAAO,OAAO,GAC/B,iBAAiB,QAAQ,OAAO,QAAQ;MAExC,iBAAiB,SAAS,OAAO;CAGnC,OAAO,WAA4B,gBAAgB;AACrD;;;;;;AAOA,SAAS,YAKP,QAC4E;CAC5E,IAAI,OAAO,OAAO,SAAS,YACzB,OAAO,OAAO;CAGhB,MAAM,OAAiB,OAAO;CAC9B,MAAM,YAAY,OAAO,OAAO,SAAS;CAEzC,mBAAmB,QAAQ,WAAW,OAAO;CAE7C,IAAI,SAAS,WAAW;EAGtB,mBAAmB,QAFE,OAAO,OAAO,YAAY,YAEN,UAAU;EAInD,OAAO,iBAFS,OAAO,WAAW,YAEO,SAAS;CACpD;CAIA,OAAO,gBAFS,OAAO,WAAW,UAEM,SAAS;AACnD;;;;;;AAOA,SAAS,mBAKP,QACA,MACA,OACM;CACN,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,OAAO,SAAS,IAAI,GAC5D,MAAM,IAAI,sBACR,YAAY,OAAO,KAAK,YAAY,OAAO,KAAe,aAAa,MAAM,4BAA4B,KAAK,gBAC9G,EAAE,SAAS,EAAE,WAAW,KAAK,EAAE,CACjC;AAEJ;;;;;AAMA,SAAS,eACP,SAC+E;CAC/E,OACE,OAAO,YAAY,YACnB,YAAY,QACZ,WAAW,WACX,OAAQ,QAAgC,UAAU;AAEtD"}