@warlock.js/ai 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 (541) hide show
  1. package/CHANGELOG.md +52 -48
  2. package/cjs/index.cjs +221 -14144
  3. package/cjs/src-C02yzsLs.cjs +22991 -0
  4. package/cjs/src-C02yzsLs.cjs.map +1 -0
  5. package/cjs/src-DFibP2FQ.cjs +30 -0
  6. package/esm/agent/agent-config.type.d.mts +90 -1
  7. package/esm/agent/agent-config.type.d.mts.map +1 -1
  8. package/esm/agent/agent-input-builder.mjs +27 -6
  9. package/esm/agent/agent-input-builder.mjs.map +1 -1
  10. package/esm/agent/agent.d.mts +40 -1
  11. package/esm/agent/agent.d.mts.map +1 -1
  12. package/esm/agent/agent.mjs +203 -30
  13. package/esm/agent/agent.mjs.map +1 -1
  14. package/esm/agent/index.d.mts +2 -1
  15. package/esm/agent/index.mjs +1 -0
  16. package/esm/agent/judge-config.type.d.mts +33 -0
  17. package/esm/agent/judge-config.type.d.mts.map +1 -0
  18. package/esm/agent/judge-config.type.mjs +13 -0
  19. package/esm/agent/judge-config.type.mjs.map +1 -0
  20. package/esm/ai-openai/src/embedder.mjs +4 -0
  21. package/esm/ai-openai/src/index.mjs +4 -0
  22. package/esm/ai-openai/src/model.mjs +5 -0
  23. package/esm/ai-openai/src/sdk.mjs +6 -0
  24. package/esm/ai-openai/src/utils/index.mjs +4 -0
  25. package/esm/ai-openai/src/utils/to-openai-tools.mjs +3 -0
  26. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +4 -0
  27. package/esm/ai.d.mts +119 -53
  28. package/esm/ai.d.mts.map +1 -1
  29. package/esm/ai.mjs +43 -8
  30. package/esm/ai.mjs.map +1 -1
  31. package/esm/batch/batch.d.mts.map +1 -1
  32. package/esm/batch/batch.mjs +21 -1
  33. package/esm/batch/batch.mjs.map +1 -1
  34. package/esm/batch/batch.type.d.mts +11 -4
  35. package/esm/batch/batch.type.d.mts.map +1 -1
  36. package/esm/config.d.mts +39 -3
  37. package/esm/config.d.mts.map +1 -1
  38. package/esm/config.mjs +26 -2
  39. package/esm/config.mjs.map +1 -1
  40. package/esm/contracts/agent/agent-options.type.d.mts +11 -3
  41. package/esm/contracts/agent/agent-options.type.d.mts.map +1 -1
  42. package/esm/contracts/agent/eval.type.d.mts +43 -2
  43. package/esm/contracts/agent/eval.type.d.mts.map +1 -1
  44. package/esm/contracts/attachment-policy.type.d.mts +51 -0
  45. package/esm/contracts/attachment-policy.type.d.mts.map +1 -0
  46. package/esm/contracts/attachment.type.d.mts +16 -7
  47. package/esm/contracts/attachment.type.d.mts.map +1 -1
  48. package/esm/contracts/content-part.type.d.mts +14 -5
  49. package/esm/contracts/content-part.type.d.mts.map +1 -1
  50. package/esm/contracts/events/supervisor-events.type.d.mts.map +1 -1
  51. package/esm/contracts/index.d.mts +6 -4
  52. package/esm/contracts/model.contract.d.mts +11 -8
  53. package/esm/contracts/model.contract.d.mts.map +1 -1
  54. package/esm/contracts/orchestrator/index.d.mts +1 -0
  55. package/esm/contracts/orchestrator/orchestrator-config.type.d.mts +31 -2
  56. package/esm/contracts/orchestrator/orchestrator-config.type.d.mts.map +1 -1
  57. package/esm/contracts/orchestrator/session-lock.contract.d.mts +47 -0
  58. package/esm/contracts/orchestrator/session-lock.contract.d.mts.map +1 -0
  59. package/esm/contracts/planner/index.d.mts +1 -1
  60. package/esm/contracts/planner/planner-config.type.d.mts +31 -0
  61. package/esm/contracts/planner/planner-config.type.d.mts.map +1 -1
  62. package/esm/contracts/planner/planner-execute-options.type.d.mts +48 -1
  63. package/esm/contracts/planner/planner-execute-options.type.d.mts.map +1 -1
  64. package/esm/contracts/planner/planner-result.type.d.mts +19 -5
  65. package/esm/contracts/planner/planner-result.type.d.mts.map +1 -1
  66. package/esm/contracts/planner/planner.contract.d.mts +1 -1
  67. package/esm/contracts/result/agent-result.type.d.mts +6 -4
  68. package/esm/contracts/result/agent-result.type.d.mts.map +1 -1
  69. package/esm/contracts/result/base-report.type.d.mts +21 -3
  70. package/esm/contracts/result/base-report.type.d.mts.map +1 -1
  71. package/esm/contracts/result/base-report.type.mjs.map +1 -1
  72. package/esm/contracts/result/execution-report.type.d.mts +53 -1
  73. package/esm/contracts/result/execution-report.type.d.mts.map +1 -1
  74. package/esm/contracts/result/orchestrator-result.type.d.mts +15 -11
  75. package/esm/contracts/result/orchestrator-result.type.d.mts.map +1 -1
  76. package/esm/contracts/result/supervisor-result.type.d.mts +13 -1
  77. package/esm/contracts/result/supervisor-result.type.d.mts.map +1 -1
  78. package/esm/contracts/result/tool-call.type.d.mts +2 -2
  79. package/esm/contracts/result/tool-call.type.d.mts.map +1 -1
  80. package/esm/contracts/result/workflow-result.type.d.mts +1 -0
  81. package/esm/contracts/result/workflow-result.type.d.mts.map +1 -1
  82. package/esm/contracts/supervisor/supervisor-config.type.d.mts +29 -0
  83. package/esm/contracts/supervisor/supervisor-config.type.d.mts.map +1 -1
  84. package/esm/contracts/system-prompt.contract.d.mts +103 -1
  85. package/esm/contracts/system-prompt.contract.d.mts.map +1 -1
  86. package/esm/contracts/team/index.d.mts +1 -0
  87. package/esm/contracts/team/team-config.type.d.mts +127 -0
  88. package/esm/contracts/team/team-config.type.d.mts.map +1 -0
  89. package/esm/contracts/tool.contract.d.mts +4 -2
  90. package/esm/contracts/tool.contract.d.mts.map +1 -1
  91. package/esm/contracts/workflow/step.contract.d.mts +30 -5
  92. package/esm/contracts/workflow/step.contract.d.mts.map +1 -1
  93. package/esm/contracts/workflow/workflow.contract.d.mts +16 -0
  94. package/esm/contracts/workflow/workflow.contract.d.mts.map +1 -1
  95. package/esm/errors/error-code.type.d.mts +1 -1
  96. package/esm/errors/index.d.mts +1 -0
  97. package/esm/errors/index.mjs +1 -0
  98. package/esm/errors/outbound-policy-error.d.mts +27 -0
  99. package/esm/errors/outbound-policy-error.d.mts.map +1 -0
  100. package/esm/errors/outbound-policy-error.mjs +32 -0
  101. package/esm/errors/outbound-policy-error.mjs.map +1 -0
  102. package/esm/eval/dataset.d.mts +28 -0
  103. package/esm/eval/dataset.d.mts.map +1 -0
  104. package/esm/eval/dataset.mjs +112 -0
  105. package/esm/eval/dataset.mjs.map +1 -0
  106. package/esm/eval/dataset.type.d.mts +53 -0
  107. package/esm/eval/dataset.type.d.mts.map +1 -0
  108. package/esm/eval/eval-runner.d.mts.map +1 -1
  109. package/esm/eval/eval-runner.mjs +16 -2
  110. package/esm/eval/eval-runner.mjs.map +1 -1
  111. package/esm/eval/index.d.mts +20 -1
  112. package/esm/eval/index.d.mts.map +1 -1
  113. package/esm/eval/index.mjs +20 -2
  114. package/esm/eval/index.mjs.map +1 -1
  115. package/esm/eval/regression.d.mts +30 -0
  116. package/esm/eval/regression.d.mts.map +1 -0
  117. package/esm/eval/regression.mjs +51 -0
  118. package/esm/eval/regression.mjs.map +1 -0
  119. package/esm/eval/report-json.d.mts +30 -0
  120. package/esm/eval/report-json.d.mts.map +1 -0
  121. package/esm/eval/report-json.mjs +33 -0
  122. package/esm/eval/report-json.mjs.map +1 -0
  123. package/esm/eval/report-junit.d.mts +22 -0
  124. package/esm/eval/report-junit.d.mts.map +1 -0
  125. package/esm/eval/report-junit.mjs +60 -0
  126. package/esm/eval/report-junit.mjs.map +1 -0
  127. package/esm/guard/contracts/guard-options.type.d.mts +165 -0
  128. package/esm/guard/contracts/guard-options.type.d.mts.map +1 -0
  129. package/esm/guard/contracts/guardrail.contract.d.mts +78 -0
  130. package/esm/guard/contracts/guardrail.contract.d.mts.map +1 -0
  131. package/esm/guard/contracts/index.d.mts +4 -0
  132. package/esm/guard/contracts/openai-client.contract.d.mts +51 -0
  133. package/esm/guard/contracts/openai-client.contract.d.mts.map +1 -0
  134. package/esm/guard/contracts/verdict.type.d.mts +76 -0
  135. package/esm/guard/contracts/verdict.type.d.mts.map +1 -0
  136. package/esm/guard/detectors/index.d.mts +4 -0
  137. package/esm/guard/detectors/index.mjs +6 -0
  138. package/esm/guard/detectors/injection.d.mts +34 -0
  139. package/esm/guard/detectors/injection.d.mts.map +1 -0
  140. package/esm/guard/detectors/injection.mjs +254 -0
  141. package/esm/guard/detectors/injection.mjs.map +1 -0
  142. package/esm/guard/detectors/moderation.d.mts +32 -0
  143. package/esm/guard/detectors/moderation.d.mts.map +1 -0
  144. package/esm/guard/detectors/moderation.mjs +134 -0
  145. package/esm/guard/detectors/moderation.mjs.map +1 -0
  146. package/esm/guard/detectors/pii.d.mts +41 -0
  147. package/esm/guard/detectors/pii.d.mts.map +1 -0
  148. package/esm/guard/detectors/pii.mjs +199 -0
  149. package/esm/guard/detectors/pii.mjs.map +1 -0
  150. package/esm/guard/detectors/topic.d.mts +29 -0
  151. package/esm/guard/detectors/topic.d.mts.map +1 -0
  152. package/esm/guard/detectors/topic.mjs +99 -0
  153. package/esm/guard/detectors/topic.mjs.map +1 -0
  154. package/esm/guard/errors.d.mts +12 -0
  155. package/esm/guard/errors.d.mts.map +1 -0
  156. package/esm/guard/errors.mjs +18 -0
  157. package/esm/guard/errors.mjs.map +1 -0
  158. package/esm/guard/guard.d.mts +67 -0
  159. package/esm/guard/guard.d.mts.map +1 -0
  160. package/esm/guard/guard.mjs +209 -0
  161. package/esm/guard/guard.mjs.map +1 -0
  162. package/esm/guard/guardrail.d.mts +39 -0
  163. package/esm/guard/guardrail.d.mts.map +1 -0
  164. package/esm/guard/guardrail.mjs +22 -0
  165. package/esm/guard/guardrail.mjs.map +1 -0
  166. package/esm/human/contracts/approval.type.d.mts +154 -0
  167. package/esm/human/contracts/approval.type.d.mts.map +1 -0
  168. package/esm/human/contracts/human-approval.type.d.mts +38 -0
  169. package/esm/human/contracts/human-approval.type.d.mts.map +1 -0
  170. package/esm/human/contracts/index.d.mts +4 -0
  171. package/esm/human/contracts/interrupt-store.contract.d.mts +112 -0
  172. package/esm/human/contracts/interrupt-store.contract.d.mts.map +1 -0
  173. package/esm/human/contracts/resume.type.d.mts +77 -0
  174. package/esm/human/contracts/resume.type.d.mts.map +1 -0
  175. package/esm/human/errors.d.mts +84 -0
  176. package/esm/human/errors.d.mts.map +1 -0
  177. package/esm/human/errors.mjs +60 -0
  178. package/esm/human/errors.mjs.map +1 -0
  179. package/esm/human/human-approval.d.mts +57 -0
  180. package/esm/human/human-approval.d.mts.map +1 -0
  181. package/esm/human/human-approval.mjs +170 -0
  182. package/esm/human/human-approval.mjs.map +1 -0
  183. package/esm/human/policy.d.mts +55 -0
  184. package/esm/human/policy.d.mts.map +1 -0
  185. package/esm/human/policy.mjs +67 -0
  186. package/esm/human/policy.mjs.map +1 -0
  187. package/esm/human/register.mjs +37 -0
  188. package/esm/human/register.mjs.map +1 -0
  189. package/esm/human/resume-seed.mjs +53 -0
  190. package/esm/human/resume-seed.mjs.map +1 -0
  191. package/esm/human/resume.d.mts +54 -0
  192. package/esm/human/resume.d.mts.map +1 -0
  193. package/esm/human/resume.mjs +121 -0
  194. package/esm/human/resume.mjs.map +1 -0
  195. package/esm/human/stores/index.mjs +5 -0
  196. package/esm/human/stores/memory.d.mts +30 -0
  197. package/esm/human/stores/memory.d.mts.map +1 -0
  198. package/esm/human/stores/memory.mjs +91 -0
  199. package/esm/human/stores/memory.mjs.map +1 -0
  200. package/esm/human/stores/pg.d.mts +59 -0
  201. package/esm/human/stores/pg.d.mts.map +1 -0
  202. package/esm/human/stores/pg.mjs +220 -0
  203. package/esm/human/stores/pg.mjs.map +1 -0
  204. package/esm/human/stores/redis.d.mts +56 -0
  205. package/esm/human/stores/redis.d.mts.map +1 -0
  206. package/esm/human/stores/redis.mjs +201 -0
  207. package/esm/human/stores/redis.mjs.map +1 -0
  208. package/esm/index.d.mts +113 -22
  209. package/esm/index.mjs +82 -11
  210. package/esm/middleware/builtins/budget.mjs +6 -2
  211. package/esm/middleware/builtins/budget.mjs.map +1 -1
  212. package/esm/middleware/utils/extract-user-text.d.mts +8 -1
  213. package/esm/middleware/utils/extract-user-text.d.mts.map +1 -1
  214. package/esm/middleware/utils/extract-user-text.mjs +8 -1
  215. package/esm/middleware/utils/extract-user-text.mjs.map +1 -1
  216. package/esm/object-stream/index.d.mts +2 -0
  217. package/esm/object-stream/index.mjs +4 -0
  218. package/esm/object-stream/parse-partial-json.d.mts +22 -0
  219. package/esm/object-stream/parse-partial-json.d.mts.map +1 -0
  220. package/esm/object-stream/parse-partial-json.mjs +78 -0
  221. package/esm/object-stream/parse-partial-json.mjs.map +1 -0
  222. package/esm/object-stream/stream-object.d.mts +68 -0
  223. package/esm/object-stream/stream-object.d.mts.map +1 -0
  224. package/esm/object-stream/stream-object.mjs +104 -0
  225. package/esm/object-stream/stream-object.mjs.map +1 -0
  226. package/esm/observe/index.mjs +4 -0
  227. package/esm/observe/observer-registry.d.mts +30 -0
  228. package/esm/observe/observer-registry.d.mts.map +1 -0
  229. package/esm/observe/observer-registry.mjs +51 -0
  230. package/esm/observe/observer-registry.mjs.map +1 -0
  231. package/esm/observe/observer.contract.d.mts +40 -0
  232. package/esm/observe/observer.contract.d.mts.map +1 -0
  233. package/esm/observe/resolve-observers.d.mts +40 -0
  234. package/esm/observe/resolve-observers.d.mts.map +1 -0
  235. package/esm/observe/resolve-observers.mjs +73 -0
  236. package/esm/observe/resolve-observers.mjs.map +1 -0
  237. package/esm/orchestrator/execution.d.mts.map +1 -1
  238. package/esm/orchestrator/execution.mjs +5 -2
  239. package/esm/orchestrator/execution.mjs.map +1 -1
  240. package/esm/orchestrator/index.d.mts +1 -0
  241. package/esm/orchestrator/index.mjs +1 -0
  242. package/esm/orchestrator/orchestrator.d.mts.map +1 -1
  243. package/esm/orchestrator/orchestrator.mjs +39 -6
  244. package/esm/orchestrator/orchestrator.mjs.map +1 -1
  245. package/esm/orchestrator/session-lock.d.mts +25 -0
  246. package/esm/orchestrator/session-lock.d.mts.map +1 -0
  247. package/esm/orchestrator/session-lock.mjs +83 -0
  248. package/esm/orchestrator/session-lock.mjs.map +1 -0
  249. package/esm/planner/dag-scheduler.mjs +97 -0
  250. package/esm/planner/dag-scheduler.mjs.map +1 -0
  251. package/esm/planner/plan-prompt.d.mts +1 -1
  252. package/esm/planner/plan-prompt.d.mts.map +1 -1
  253. package/esm/planner/plan-prompt.mjs +2 -1
  254. package/esm/planner/plan-prompt.mjs.map +1 -1
  255. package/esm/planner/plan-schema.mjs +17 -14
  256. package/esm/planner/plan-schema.mjs.map +1 -1
  257. package/esm/planner/planner-run.d.mts.map +1 -1
  258. package/esm/planner/planner-run.mjs +300 -29
  259. package/esm/planner/planner-run.mjs.map +1 -1
  260. package/esm/planner/planner.mjs +1 -1
  261. package/esm/planner/planner.mjs.map +1 -1
  262. package/esm/prompt/errors.d.mts +57 -0
  263. package/esm/prompt/errors.d.mts.map +1 -0
  264. package/esm/prompt/errors.mjs +73 -0
  265. package/esm/prompt/errors.mjs.map +1 -0
  266. package/esm/prompt/index.d.mts +3 -0
  267. package/esm/prompt/index.mjs +4 -0
  268. package/esm/prompt/prompt-langfuse-sync.mjs +104 -0
  269. package/esm/prompt/prompt-langfuse-sync.mjs.map +1 -0
  270. package/esm/prompt/prompt-langfuse-sync.type.d.mts +32 -0
  271. package/esm/prompt/prompt-langfuse-sync.type.d.mts.map +1 -0
  272. package/esm/prompt/prompt-validate.mjs +170 -0
  273. package/esm/prompt/prompt-validate.mjs.map +1 -0
  274. package/esm/prompt/prompt.d.mts +54 -0
  275. package/esm/prompt/prompt.d.mts.map +1 -0
  276. package/esm/prompt/prompt.mjs +218 -0
  277. package/esm/prompt/prompt.mjs.map +1 -0
  278. package/esm/prompt/prompt.type.d.mts +174 -0
  279. package/esm/prompt/prompt.type.d.mts.map +1 -0
  280. package/esm/prompts/index.d.mts +3 -0
  281. package/esm/prompts/index.mjs +3 -0
  282. package/esm/prompts/prompts-manager.contract.d.mts +154 -0
  283. package/esm/prompts/prompts-manager.contract.d.mts.map +1 -0
  284. package/esm/prompts/prompts-manager.d.mts +38 -0
  285. package/esm/prompts/prompts-manager.d.mts.map +1 -0
  286. package/esm/prompts/prompts-manager.mjs +410 -0
  287. package/esm/prompts/prompts-manager.mjs.map +1 -0
  288. package/esm/prompts/prompts-manager.type.d.mts +172 -0
  289. package/esm/prompts/prompts-manager.type.d.mts.map +1 -0
  290. package/esm/prompts/prompts-validate.mjs +200 -0
  291. package/esm/prompts/prompts-validate.mjs.map +1 -0
  292. package/esm/rag/as-tool.mjs +48 -0
  293. package/esm/rag/as-tool.mjs.map +1 -0
  294. package/esm/rag/chunk/chunk.d.mts +24 -0
  295. package/esm/rag/chunk/chunk.d.mts.map +1 -0
  296. package/esm/rag/chunk/chunk.mjs +44 -0
  297. package/esm/rag/chunk/chunk.mjs.map +1 -0
  298. package/esm/rag/chunk/fixed.mjs +32 -0
  299. package/esm/rag/chunk/fixed.mjs.map +1 -0
  300. package/esm/rag/chunk/markdown.mjs +75 -0
  301. package/esm/rag/chunk/markdown.mjs.map +1 -0
  302. package/esm/rag/chunk/recursive.mjs +132 -0
  303. package/esm/rag/chunk/recursive.mjs.map +1 -0
  304. package/esm/rag/chunk/sentence.mjs +73 -0
  305. package/esm/rag/chunk/sentence.mjs.map +1 -0
  306. package/esm/rag/contracts/chunk-options.type.d.mts +35 -0
  307. package/esm/rag/contracts/chunk-options.type.d.mts.map +1 -0
  308. package/esm/rag/contracts/citation.type.d.mts +35 -0
  309. package/esm/rag/contracts/citation.type.d.mts.map +1 -0
  310. package/esm/rag/contracts/index.d.mts +4 -0
  311. package/esm/rag/contracts/rag-config.type.d.mts +68 -0
  312. package/esm/rag/contracts/rag-config.type.d.mts.map +1 -0
  313. package/esm/rag/contracts/rag-document.type.d.mts +21 -0
  314. package/esm/rag/contracts/rag-document.type.d.mts.map +1 -0
  315. package/esm/rag/hybrid/bm25.d.mts +23 -0
  316. package/esm/rag/hybrid/bm25.d.mts.map +1 -0
  317. package/esm/rag/hybrid/bm25.mjs +51 -0
  318. package/esm/rag/hybrid/bm25.mjs.map +1 -0
  319. package/esm/rag/hybrid/hybrid-rank.d.mts +33 -0
  320. package/esm/rag/hybrid/hybrid-rank.d.mts.map +1 -0
  321. package/esm/rag/hybrid/hybrid-rank.mjs +29 -0
  322. package/esm/rag/hybrid/hybrid-rank.mjs.map +1 -0
  323. package/esm/rag/hybrid/rrf.d.mts +25 -0
  324. package/esm/rag/hybrid/rrf.d.mts.map +1 -0
  325. package/esm/rag/hybrid/rrf.mjs +30 -0
  326. package/esm/rag/hybrid/rrf.mjs.map +1 -0
  327. package/esm/rag/index.d.mts +15 -0
  328. package/esm/rag/index.mjs +11 -0
  329. package/esm/rag/rag.d.mts +38 -0
  330. package/esm/rag/rag.d.mts.map +1 -0
  331. package/esm/rag/rag.mjs +126 -0
  332. package/esm/rag/rag.mjs.map +1 -0
  333. package/esm/rag/rerank/keyword-reranker.d.mts +32 -0
  334. package/esm/rag/rerank/keyword-reranker.d.mts.map +1 -0
  335. package/esm/rag/rerank/keyword-reranker.mjs +58 -0
  336. package/esm/rag/rerank/keyword-reranker.mjs.map +1 -0
  337. package/esm/rag/rerank/llm-reranker.d.mts +36 -0
  338. package/esm/rag/rerank/llm-reranker.d.mts.map +1 -0
  339. package/esm/rag/rerank/llm-reranker.mjs +85 -0
  340. package/esm/rag/rerank/llm-reranker.mjs.map +1 -0
  341. package/esm/rag/rerank/reranker.contract.d.mts +28 -0
  342. package/esm/rag/rerank/reranker.contract.d.mts.map +1 -0
  343. package/esm/rag/retrieve.mjs +68 -0
  344. package/esm/rag/retrieve.mjs.map +1 -0
  345. package/esm/rag/store/cache-vector-store.d.mts +27 -0
  346. package/esm/rag/store/cache-vector-store.d.mts.map +1 -0
  347. package/esm/rag/store/cache-vector-store.mjs +48 -0
  348. package/esm/rag/store/cache-vector-store.mjs.map +1 -0
  349. package/esm/rag/store/vector-store.contract.d.mts +38 -0
  350. package/esm/rag/store/vector-store.contract.d.mts.map +1 -0
  351. package/esm/rag/transforms/multi-query.d.mts +27 -0
  352. package/esm/rag/transforms/multi-query.d.mts.map +1 -0
  353. package/esm/rag/transforms/multi-query.mjs +41 -0
  354. package/esm/rag/transforms/multi-query.mjs.map +1 -0
  355. package/esm/security/index.mjs +5 -0
  356. package/esm/security/outbound-policy.d.mts +46 -0
  357. package/esm/security/outbound-policy.d.mts.map +1 -0
  358. package/esm/security/outbound-policy.mjs +187 -0
  359. package/esm/security/outbound-policy.mjs.map +1 -0
  360. package/esm/security/outbound-policy.type.d.mts +74 -0
  361. package/esm/security/outbound-policy.type.d.mts.map +1 -0
  362. package/esm/security/private-ip.d.mts +15 -0
  363. package/esm/security/private-ip.d.mts.map +1 -0
  364. package/esm/security/private-ip.mjs +48 -0
  365. package/esm/security/private-ip.mjs.map +1 -0
  366. package/esm/security/redact.d.mts +59 -0
  367. package/esm/security/redact.d.mts.map +1 -0
  368. package/esm/security/redact.mjs +122 -0
  369. package/esm/security/redact.mjs.map +1 -0
  370. package/esm/serve/serve.d.mts +50 -0
  371. package/esm/serve/serve.d.mts.map +1 -0
  372. package/esm/serve/serve.mjs +90 -0
  373. package/esm/serve/serve.mjs.map +1 -0
  374. package/esm/serve/sse.d.mts +20 -0
  375. package/esm/serve/sse.d.mts.map +1 -0
  376. package/esm/serve/sse.mjs +25 -0
  377. package/esm/serve/sse.mjs.map +1 -0
  378. package/esm/serve/stream-to-sse.d.mts +29 -0
  379. package/esm/serve/stream-to-sse.d.mts.map +1 -0
  380. package/esm/serve/stream-to-sse.mjs +37 -0
  381. package/esm/serve/stream-to-sse.mjs.map +1 -0
  382. package/esm/skills/catalog.d.mts +49 -0
  383. package/esm/skills/catalog.d.mts.map +1 -0
  384. package/esm/skills/catalog.mjs +140 -0
  385. package/esm/skills/catalog.mjs.map +1 -0
  386. package/esm/skills/contracts/skill-record.type.d.mts +37 -0
  387. package/esm/skills/contracts/skill-record.type.d.mts.map +1 -0
  388. package/esm/skills/contracts/skills-config.type.d.mts +108 -0
  389. package/esm/skills/contracts/skills-config.type.d.mts.map +1 -0
  390. package/esm/skills/contracts/skills-store.contract.d.mts +28 -0
  391. package/esm/skills/contracts/skills-store.contract.d.mts.map +1 -0
  392. package/esm/skills/contracts/skills.contract.d.mts +43 -0
  393. package/esm/skills/contracts/skills.contract.d.mts.map +1 -0
  394. package/esm/skills/index.d.mts +16 -0
  395. package/esm/skills/index.mjs +14 -0
  396. package/esm/skills/load-skill-tool.d.mts +38 -0
  397. package/esm/skills/load-skill-tool.d.mts.map +1 -0
  398. package/esm/skills/load-skill-tool.mjs +65 -0
  399. package/esm/skills/load-skill-tool.mjs.map +1 -0
  400. package/esm/skills/review-gate.d.mts +33 -0
  401. package/esm/skills/review-gate.d.mts.map +1 -0
  402. package/esm/skills/review-gate.mjs +60 -0
  403. package/esm/skills/review-gate.mjs.map +1 -0
  404. package/esm/skills/save-skill-tool.d.mts +39 -0
  405. package/esm/skills/save-skill-tool.d.mts.map +1 -0
  406. package/esm/skills/save-skill-tool.mjs +65 -0
  407. package/esm/skills/save-skill-tool.mjs.map +1 -0
  408. package/esm/skills/skills.d.mts +33 -0
  409. package/esm/skills/skills.d.mts.map +1 -0
  410. package/esm/skills/skills.mjs +109 -0
  411. package/esm/skills/skills.mjs.map +1 -0
  412. package/esm/skills/sources/directory-source.d.mts +19 -0
  413. package/esm/skills/sources/directory-source.d.mts.map +1 -0
  414. package/esm/skills/sources/directory-source.mjs +108 -0
  415. package/esm/skills/sources/directory-source.mjs.map +1 -0
  416. package/esm/skills/sources/index.d.mts +18 -0
  417. package/esm/skills/sources/index.d.mts.map +1 -0
  418. package/esm/skills/sources/index.mjs +27 -0
  419. package/esm/skills/sources/index.mjs.map +1 -0
  420. package/esm/skills/sources/parse-frontmatter.d.mts +27 -0
  421. package/esm/skills/sources/parse-frontmatter.d.mts.map +1 -0
  422. package/esm/skills/sources/parse-frontmatter.mjs +46 -0
  423. package/esm/skills/sources/parse-frontmatter.mjs.map +1 -0
  424. package/esm/skills/sources/store-source.d.mts +14 -0
  425. package/esm/skills/sources/store-source.d.mts.map +1 -0
  426. package/esm/skills/sources/store-source.mjs +15 -0
  427. package/esm/skills/sources/store-source.mjs.map +1 -0
  428. package/esm/skills/sources/url-source.d.mts +29 -0
  429. package/esm/skills/sources/url-source.d.mts.map +1 -0
  430. package/esm/skills/sources/url-source.mjs +117 -0
  431. package/esm/skills/sources/url-source.mjs.map +1 -0
  432. package/esm/skills/store/mock-skills-store.d.mts +57 -0
  433. package/esm/skills/store/mock-skills-store.d.mts.map +1 -0
  434. package/esm/skills/store/mock-skills-store.mjs +100 -0
  435. package/esm/skills/store/mock-skills-store.mjs.map +1 -0
  436. package/esm/skills/store/procedural-skill-store.d.mts +30 -0
  437. package/esm/skills/store/procedural-skill-store.d.mts.map +1 -0
  438. package/esm/skills/store/procedural-skill-store.mjs +125 -0
  439. package/esm/skills/store/procedural-skill-store.mjs.map +1 -0
  440. package/esm/supervisor/as-tool.mjs +2 -2
  441. package/esm/supervisor/as-tool.mjs.map +1 -1
  442. package/esm/supervisor/execution.d.mts.map +1 -1
  443. package/esm/supervisor/execution.mjs +31 -28
  444. package/esm/supervisor/execution.mjs.map +1 -1
  445. package/esm/supervisor/supervisor.d.mts.map +1 -1
  446. package/esm/supervisor/supervisor.mjs +8 -3
  447. package/esm/supervisor/supervisor.mjs.map +1 -1
  448. package/esm/system-prompt/index.d.mts +4 -0
  449. package/esm/system-prompt/system-prompt.d.mts +68 -4
  450. package/esm/system-prompt/system-prompt.d.mts.map +1 -1
  451. package/esm/system-prompt/system-prompt.mjs +89 -5
  452. package/esm/system-prompt/system-prompt.mjs.map +1 -1
  453. package/esm/team/gates.mjs +48 -0
  454. package/esm/team/gates.mjs.map +1 -0
  455. package/esm/team/index.d.mts +1 -0
  456. package/esm/team/index.mjs +3 -0
  457. package/esm/team/team.d.mts +42 -0
  458. package/esm/team/team.d.mts.map +1 -0
  459. package/esm/team/team.mjs +94 -0
  460. package/esm/team/team.mjs.map +1 -0
  461. package/esm/tool/executable-as-tool.d.mts.map +1 -1
  462. package/esm/tool/executable-as-tool.mjs +2 -2
  463. package/esm/tool/executable-as-tool.mjs.map +1 -1
  464. package/esm/tool/tool.d.mts.map +1 -1
  465. package/esm/tool/tool.mjs +2 -2
  466. package/esm/tool/tool.mjs.map +1 -1
  467. package/esm/utils/compute-cost.d.mts +17 -1
  468. package/esm/utils/compute-cost.d.mts.map +1 -1
  469. package/esm/utils/compute-cost.mjs +26 -1
  470. package/esm/utils/compute-cost.mjs.map +1 -1
  471. package/esm/utils/extract-json-lenient.d.mts +42 -0
  472. package/esm/utils/extract-json-lenient.d.mts.map +1 -0
  473. package/esm/utils/extract-json-lenient.mjs +97 -0
  474. package/esm/utils/extract-json-lenient.mjs.map +1 -0
  475. package/esm/utils/index.d.mts +4 -2
  476. package/esm/utils/index.mjs +3 -1
  477. package/esm/utils/json-schema.d.mts +1 -1
  478. package/esm/utils/prepare-attachment-part.d.mts +10 -1
  479. package/esm/utils/prepare-attachment-part.d.mts.map +1 -1
  480. package/esm/utils/prepare-attachment-part.mjs +103 -11
  481. package/esm/utils/prepare-attachment-part.mjs.map +1 -1
  482. package/esm/utils/resolve-attachment.d.mts +4 -3
  483. package/esm/utils/resolve-attachment.d.mts.map +1 -1
  484. package/esm/utils/resolve-attachment.mjs +4 -3
  485. package/esm/utils/resolve-attachment.mjs.map +1 -1
  486. package/esm/utils/run-context.d.mts +94 -0
  487. package/esm/utils/run-context.d.mts.map +1 -0
  488. package/esm/utils/run-context.mjs +98 -0
  489. package/esm/utils/run-context.mjs.map +1 -0
  490. package/esm/vcr/cassette-io.mjs +57 -0
  491. package/esm/vcr/cassette-io.mjs.map +1 -0
  492. package/esm/vcr/errors.d.mts +42 -0
  493. package/esm/vcr/errors.d.mts.map +1 -0
  494. package/esm/vcr/errors.mjs +37 -0
  495. package/esm/vcr/errors.mjs.map +1 -0
  496. package/esm/vcr/hash-request.d.mts +28 -0
  497. package/esm/vcr/hash-request.d.mts.map +1 -0
  498. package/esm/vcr/hash-request.mjs +118 -0
  499. package/esm/vcr/hash-request.mjs.map +1 -0
  500. package/esm/vcr/index.d.mts +4 -0
  501. package/esm/vcr/index.mjs +5 -0
  502. package/esm/vcr/vcr.d.mts +32 -0
  503. package/esm/vcr/vcr.d.mts.map +1 -0
  504. package/esm/vcr/vcr.mjs +248 -0
  505. package/esm/vcr/vcr.mjs.map +1 -0
  506. package/esm/vcr/vcr.type.d.mts +118 -0
  507. package/esm/vcr/vcr.type.d.mts.map +1 -0
  508. package/esm/workflow/as-tool.mjs +2 -2
  509. package/esm/workflow/as-tool.mjs.map +1 -1
  510. package/esm/workflow/engine.mjs +1 -0
  511. package/esm/workflow/engine.mjs.map +1 -1
  512. package/esm/workflow/step-runner.mjs +19 -20
  513. package/esm/workflow/step-runner.mjs.map +1 -1
  514. package/esm/workflow/workflow.d.mts.map +1 -1
  515. package/esm/workflow/workflow.mjs +8 -3
  516. package/esm/workflow/workflow.mjs.map +1 -1
  517. package/llms-full.txt +1683 -68
  518. package/llms.txt +16 -4
  519. package/package.json +7 -3
  520. package/skills/README.md +40 -4
  521. package/skills/ai-dx-helpers/SKILL.md +2 -2
  522. package/skills/approve-tool-calls/SKILL.md +134 -0
  523. package/skills/attach-ai-middleware/SKILL.md +1 -1
  524. package/skills/detect-and-redact-pii/SKILL.md +104 -0
  525. package/skills/durable-resume/SKILL.md +128 -0
  526. package/skills/escalate-block-to-human/SKILL.md +85 -0
  527. package/skills/eval-datasets-and-ci/SKILL.md +117 -0
  528. package/skills/guard-input-output/SKILL.md +117 -0
  529. package/skills/manage-prompts/SKILL.md +186 -0
  530. package/skills/observe-ai-flows/SKILL.md +94 -0
  531. package/skills/record-replay-llm/SKILL.md +92 -0
  532. package/skills/run-ai-agent/SKILL.md +26 -1
  533. package/skills/run-ai-rag/SKILL.md +139 -0
  534. package/skills/run-ai-team/SKILL.md +107 -0
  535. package/skills/run-orchestrator/SKILL.md +2 -0
  536. package/skills/run-planner/SKILL.md +73 -8
  537. package/skills/run-supervisor/SKILL.md +20 -1
  538. package/skills/use-runtime-skills/SKILL.md +106 -0
  539. package/skills/write-system-prompt/SKILL.md +30 -1
  540. package/cjs/index.cjs.map +0 -1
  541. package/esm/contracts/result/index.d.mts +0 -15
@@ -0,0 +1,410 @@
1
+ import { InvalidRequestError } from "../errors/invalid-request-error.mjs";
2
+ import "../errors/index.mjs";
3
+ import { Instruction } from "../system-prompt/instruction.mjs";
4
+ import { Persona } from "../system-prompt/persona.mjs";
5
+ import { SystemPrompt } from "../system-prompt/system-prompt.mjs";
6
+ import { describeContractTarget, findMissingPlaceholders, findUnreferencedRequired, judgePromptBodyCached } from "./prompts-validate.mjs";
7
+
8
+ //#region ../@warlock.js/ai/src/prompts/prompts-manager.ts
9
+ /**
10
+ * Build the `name@version` registry key. Centralized so the duplicate check,
11
+ * `get`, and `composedFrom` provenance all agree on one label shape.
12
+ */
13
+ function promptKey(name, version) {
14
+ return `${name}@${version}`;
15
+ }
16
+ /**
17
+ * Serialize a prompt's observable content — its ordered blocks (discriminator
18
+ * + raw template text) — into a stable signature. Two prompts with the same
19
+ * blocks in the same order share a signature, which is how `register()` tells
20
+ * an idempotent re-registration from a genuine clash. Meta is intentionally
21
+ * excluded: provenance / description should not defeat idempotency.
22
+ */
23
+ function contentSignature(contract) {
24
+ return JSON.stringify(contract.blocks.map((block) => [block.type, block.text]));
25
+ }
26
+ /**
27
+ * Reconstruct a block from its `{ type, text }` snapshot — `persona` blocks
28
+ * become a `Persona`, everything else an `Instruction`. The inverse of the
29
+ * flattening `export()` performs, so an imported registry resolves identically.
30
+ */
31
+ function blockFromSnapshot(block) {
32
+ return block.type === "persona" ? new Persona(block.text) : new Instruction(block.text);
33
+ }
34
+ /**
35
+ * Narrow a {@link PromptTemplateVersion} body to its ordered block list: a raw
36
+ * string becomes one instruction block; an explicit block list is used verbatim.
37
+ */
38
+ function blocksFromTemplate(template) {
39
+ if (typeof template === "string") return [new Instruction(template)];
40
+ return [...template];
41
+ }
42
+ /**
43
+ * Concrete `PromptsManagerContract` — a single registry of named, versioned
44
+ * `SystemPromptContract` builders keyed by `name@version`.
45
+ *
46
+ * **Role.** The store behind `ai.prompts`. It holds one flat
47
+ * `Map<string, PromptsManagerEntry>` keyed by `name@version`, plus a monotonic
48
+ * counter that stamps each entry's `addedAt` so "latest" is deterministic
49
+ * (highest `addedAt` for a name) without ever reading the wall clock.
50
+ *
51
+ * **Responsibility.**
52
+ * - Owns: the registry map, the `addedAt` counter, the duplicate /
53
+ * idempotency rule, default version derivation, latest selection, the
54
+ * per-version tag pins, and the validate / diff / export / import surface.
55
+ * - Does NOT own: prompt rendering (delegated to the contract's `resolve()`),
56
+ * block composition, or the LLM-judge mechanics (delegated to the eval
57
+ * `judge` scorer via `prompts-validate`).
58
+ *
59
+ * Users construct via the `prompts()` factory — `new PromptsManager()` is not
60
+ * the public API.
61
+ */
62
+ var PromptsManager = class {
63
+ constructor(options = {}) {
64
+ this.entries = /* @__PURE__ */ new Map();
65
+ this.names = [];
66
+ this.pins = /* @__PURE__ */ new Map();
67
+ this.counter = 0;
68
+ this.judgeCache = options.judgeCache;
69
+ }
70
+ register(contract, options = {}) {
71
+ const meta = contract.meta();
72
+ const name = options.name ?? meta?.name;
73
+ if (!name) throw new InvalidRequestError("Cannot register a prompt without a name — set meta.name via systemPrompt(input, { name }) or .meta({ name }).", { context: { meta } });
74
+ const version = options.version ?? meta?.version ?? this.nextVersion(name);
75
+ const key = promptKey(name, version);
76
+ const existing = this.entries.get(key);
77
+ if (existing) {
78
+ if (contentSignature(existing.contract) === contentSignature(contract)) return this;
79
+ throw new InvalidRequestError(`A different prompt is already registered as "${key}".`, { context: {
80
+ name,
81
+ version
82
+ } });
83
+ }
84
+ if (!this.names.includes(name)) this.names.push(name);
85
+ this.entries.set(key, {
86
+ name,
87
+ version,
88
+ addedAt: this.counter++,
89
+ contract,
90
+ ...options.tags ? { tags: options.tags } : {}
91
+ });
92
+ return this;
93
+ }
94
+ create(input, meta) {
95
+ if (input === void 0) return new SystemPrompt([], meta);
96
+ if (typeof input === "string") return new SystemPrompt([new Instruction(input)], meta);
97
+ return new SystemPrompt([...input], meta);
98
+ }
99
+ get(name, versionOrTag) {
100
+ return this.requireEntry(name, versionOrTag).contract;
101
+ }
102
+ has(name, versionOrTag) {
103
+ const { baseName, selector } = this.parseSelector(name, versionOrTag);
104
+ if (selector !== void 0) return this.resolveSelector(baseName, selector) !== void 0;
105
+ return this.latestEntry(baseName) !== void 0;
106
+ }
107
+ list() {
108
+ return [...this.names];
109
+ }
110
+ versions(name) {
111
+ return [...this.entries.values()].filter((entry) => entry.name === name).sort((a, b) => a.addedAt - b.addedAt).map((entry) => entry.version);
112
+ }
113
+ resolve(name, versionOrTag, placeholders) {
114
+ return this.requireEntry(name, versionOrTag).contract.resolve(placeholders);
115
+ }
116
+ define(name, versions) {
117
+ for (const entry of versions) {
118
+ const contract = new SystemPrompt(blocksFromTemplate(entry.template));
119
+ this.register(contract, {
120
+ name,
121
+ version: entry.version
122
+ });
123
+ }
124
+ return this;
125
+ }
126
+ tag(name, tag, version) {
127
+ if (!this.entries.has(promptKey(name, version))) throw new InvalidRequestError(`Cannot tag "${tag}" — no prompt registered as "${promptKey(name, version)}".`, { context: {
128
+ name,
129
+ tag,
130
+ version
131
+ } });
132
+ const nameTags = this.pins.get(name) ?? /* @__PURE__ */ new Map();
133
+ nameTags.set(tag, version);
134
+ this.pins.set(name, nameTags);
135
+ return this;
136
+ }
137
+ async validate(target, options = {}) {
138
+ const { text, required } = this.describeTarget(target);
139
+ const missing = findMissingPlaceholders(text, new Set(Object.keys(options.placeholders ?? {})), new Set([...required, ...options.declare ?? []]));
140
+ const unreferenced = findUnreferencedRequired(text, required);
141
+ const ok = missing.length === 0;
142
+ if (!options.judge) {
143
+ if (unreferenced.length === 0) return {
144
+ ok,
145
+ missing
146
+ };
147
+ return {
148
+ ok,
149
+ missing,
150
+ issues: unreferenced.map((key) => `Required key "${key}" is never referenced in the prompt.`)
151
+ };
152
+ }
153
+ const cache = options.judgeCache ?? this.judgeCache;
154
+ const judgeOutcome = await judgePromptBodyCached(text, options.judge, cache);
155
+ const issues = [...unreferenced.map((key) => `Required key "${key}" is never referenced in the prompt.`), ...judgeOutcome.issues];
156
+ return {
157
+ ok,
158
+ missing,
159
+ ...judgeOutcome.score !== void 0 ? { score: judgeOutcome.score } : {},
160
+ issues
161
+ };
162
+ }
163
+ diff(name, from, to) {
164
+ const fromBlocks = this.snapshotBlocks(this.requireExact(name, from));
165
+ const toBlocks = this.snapshotBlocks(this.requireExact(name, to));
166
+ const added = [];
167
+ const removed = [];
168
+ const changed = [];
169
+ const max = Math.max(fromBlocks.length, toBlocks.length);
170
+ for (let index = 0; index < max; index++) {
171
+ const left = fromBlocks[index];
172
+ const right = toBlocks[index];
173
+ if (left && !right) {
174
+ removed.push(left);
175
+ continue;
176
+ }
177
+ if (!left && right) {
178
+ added.push(right);
179
+ continue;
180
+ }
181
+ if (left && right && (left.type !== right.type || left.text !== right.text)) changed.push({
182
+ from: left,
183
+ to: right
184
+ });
185
+ }
186
+ return {
187
+ name,
188
+ from,
189
+ to,
190
+ added,
191
+ removed,
192
+ changed,
193
+ identical: added.length === 0 && removed.length === 0 && changed.length === 0
194
+ };
195
+ }
196
+ export() {
197
+ return { prompts: this.names.map((name) => ({
198
+ name,
199
+ versions: this.versions(name).map((version) => this.exportVersion(name, version))
200
+ })) };
201
+ }
202
+ import(snapshot) {
203
+ for (const exported of snapshot.prompts) for (const version of exported.versions) {
204
+ const contract = new SystemPrompt(version.blocks.map(blockFromSnapshot), {
205
+ ...version.description ? { description: version.description } : {},
206
+ ...version.required ? { required: version.required } : {}
207
+ });
208
+ this.register(contract, {
209
+ name: exported.name,
210
+ version: version.version
211
+ });
212
+ for (const tag of version.tags ?? []) this.tag(exported.name, tag, version.version);
213
+ }
214
+ return this;
215
+ }
216
+ /**
217
+ * Flatten a registered version into its portable `{ version, blocks, tags?,
218
+ * description?, required? }` snapshot for `export()`.
219
+ */
220
+ exportVersion(name, version) {
221
+ const entry = this.requireExact(name, version);
222
+ const meta = entry.contract.meta();
223
+ const tags = this.tagsForVersion(name, version);
224
+ return {
225
+ version,
226
+ blocks: this.snapshotBlocks(entry),
227
+ ...tags.length > 0 ? { tags } : {},
228
+ ...meta?.description ? { description: meta.description } : {},
229
+ ...meta?.required ? { required: [...meta.required] } : {}
230
+ };
231
+ }
232
+ /** Every tag currently pinned to a specific `name@version`, in pin order. */
233
+ tagsForVersion(name, version) {
234
+ const nameTags = this.pins.get(name);
235
+ if (!nameTags) return [];
236
+ const tags = [];
237
+ for (const [tag, pinnedVersion] of nameTags) if (pinnedVersion === version) tags.push(tag);
238
+ return tags;
239
+ }
240
+ /** Flatten an entry's blocks to `{ type, text }` snapshots. */
241
+ snapshotBlocks(entry) {
242
+ return entry.contract.blocks.map((block) => ({
243
+ type: block.type,
244
+ text: block.text
245
+ }));
246
+ }
247
+ /**
248
+ * Resolve the body + declared-required keys for any `validate` target: a
249
+ * registered name (or `name@selector`), a `SystemPromptContract` instance, or
250
+ * a raw string.
251
+ */
252
+ describeTarget(target) {
253
+ if (typeof target === "string") {
254
+ const { baseName, selector } = this.parseSelector(target, void 0);
255
+ const entry = selector ? this.resolveSelector(baseName, selector) : this.latestEntry(baseName);
256
+ if (entry) return describeContractTarget(entry.contract);
257
+ return {
258
+ text: target,
259
+ required: []
260
+ };
261
+ }
262
+ if (isSystemPromptContract(target)) return describeContractTarget(target);
263
+ if (isBlock(target)) return {
264
+ text: target.text,
265
+ required: []
266
+ };
267
+ throw new InvalidRequestError("validate() target must be a registered name, a SystemPromptContract, a prompt block, or a raw string.", { context: { target } });
268
+ }
269
+ /**
270
+ * The next integer version label for a name — `"1"` for the first, then the
271
+ * count of existing versions plus one. String-typed to match the free-form
272
+ * `version` label shape.
273
+ */
274
+ nextVersion(name) {
275
+ const count = [...this.entries.values()].filter((entry) => entry.name === name).length;
276
+ return String(count + 1);
277
+ }
278
+ /** Pick the highest-`addedAt` entry for a name, or `undefined` when absent. */
279
+ latestEntry(name) {
280
+ let latest;
281
+ for (const entry of this.entries.values()) {
282
+ if (entry.name !== name) continue;
283
+ if (!latest || entry.addedAt > latest.addedAt) latest = entry;
284
+ }
285
+ return latest;
286
+ }
287
+ /**
288
+ * Split a name argument into its base name + optional selector. The selector
289
+ * comes from the explicit second argument when present, else from an inline
290
+ * `name@selector` in the first argument. A bare name yields no selector.
291
+ */
292
+ parseSelector(name, versionOrTag) {
293
+ if (versionOrTag !== void 0) return {
294
+ baseName: name,
295
+ selector: versionOrTag
296
+ };
297
+ const at = name.indexOf("@");
298
+ if (at > 0) return {
299
+ baseName: name.slice(0, at),
300
+ selector: name.slice(at + 1)
301
+ };
302
+ return {
303
+ baseName: name,
304
+ selector: void 0
305
+ };
306
+ }
307
+ /**
308
+ * Resolve a selector (a version label OR a pinned tag) to a concrete entry.
309
+ * Version labels win over tags when both could match — the explicit label is
310
+ * the more specific intent. Returns `undefined` when neither resolves.
311
+ */
312
+ resolveSelector(name, selector) {
313
+ const byVersion = this.entries.get(promptKey(name, selector));
314
+ if (byVersion) return byVersion;
315
+ const pinnedVersion = this.pins.get(name)?.get(selector);
316
+ if (pinnedVersion !== void 0) return this.entries.get(promptKey(name, pinnedVersion));
317
+ }
318
+ /**
319
+ * Resolve an entry by name (+ optional version / tag / inline selector),
320
+ * throwing {@link InvalidRequestError} when the name or the requested
321
+ * selector is unknown. The single lookup path `get` / `resolve` share.
322
+ */
323
+ requireEntry(name, versionOrTag) {
324
+ const { baseName, selector } = this.parseSelector(name, versionOrTag);
325
+ if (selector !== void 0) {
326
+ const entry = this.resolveSelector(baseName, selector);
327
+ if (!entry) throw new InvalidRequestError(`No prompt registered as "${baseName}" with version/tag "${selector}".`, { context: {
328
+ name: baseName,
329
+ selector
330
+ } });
331
+ return entry;
332
+ }
333
+ const latest = this.latestEntry(baseName);
334
+ if (!latest) throw new InvalidRequestError(`No prompt registered under name "${baseName}".`, { context: { name: baseName } });
335
+ return latest;
336
+ }
337
+ /**
338
+ * Resolve a name + EXACT version label to its entry (no tag fallback), for
339
+ * `diff` / `export` where a concrete version is always required. Throws
340
+ * {@link InvalidRequestError} on a miss.
341
+ */
342
+ requireExact(name, version) {
343
+ const entry = this.entries.get(promptKey(name, version));
344
+ if (!entry) throw new InvalidRequestError(`No prompt registered as "${promptKey(name, version)}".`, { context: {
345
+ name,
346
+ version
347
+ } });
348
+ return entry;
349
+ }
350
+ };
351
+ /**
352
+ * Narrow an arbitrary value to a `SystemPromptContract` — true when it exposes
353
+ * the builder surface (`blocks` array + a callable `resolve`) AND a callable
354
+ * `meta`. Robust across duplicate package copies (no `instanceof`).
355
+ */
356
+ function isSystemPromptContract(value) {
357
+ return typeof value === "object" && value !== null && Array.isArray(value.blocks) && typeof value.resolve === "function" && typeof value.meta === "function";
358
+ }
359
+ /**
360
+ * Narrow an arbitrary value to a single `SystemPromptBlockContract` — true when
361
+ * it carries a string `type` + `text` and a callable `resolve` but is NOT a
362
+ * full prompt (no `blocks` array). Lets `validate` accept a lone block.
363
+ */
364
+ function isBlock(value) {
365
+ return typeof value === "object" && value !== null && typeof value.type === "string" && typeof value.text === "string" && typeof value.resolve === "function";
366
+ }
367
+ /**
368
+ * Create a new, isolated prompts manager.
369
+ *
370
+ * **Role.** Public factory for {@link PromptsManagerContract} — keeps
371
+ * user-facing code free of `new` and consistent with the other `ai.*`
372
+ * factories. Each call returns a fresh registry, so parallel test suites and
373
+ * multi-tenant apps never share mutable global prompt state.
374
+ *
375
+ * The process-wide instance that named `systemPrompt(...)` builders
376
+ * auto-register into is `ai.prompts` (see {@link defaultPromptsManager}).
377
+ *
378
+ * @param options - Optional wiring, notably a `judgeCache` that memoizes
379
+ * LLM-judge verdicts (absent ⇒ every judge pass runs live).
380
+ *
381
+ * @example
382
+ * const registry = prompts();
383
+ * registry.register(systemPrompt("You are support.", { name: "support" }));
384
+ * registry.resolve("support"); // "You are support."
385
+ *
386
+ * @example
387
+ * // Memoize judge verdicts across validations.
388
+ * const registry = prompts({ judgeCache: new MemoryCacheDriver() });
389
+ */
390
+ function prompts(options) {
391
+ return new PromptsManager(options);
392
+ }
393
+ /**
394
+ * The process-wide default manager that named prompts auto-register into.
395
+ *
396
+ * Held as a module-level singleton (lazily created on first access) so
397
+ * `system-prompt.ts` can register a named builder without importing the
398
+ * `PromptsManager` class — keeping the auto-registration seam free of a
399
+ * runtime import cycle.
400
+ */
401
+ let defaultManager;
402
+ /** Accessor for the process-wide default {@link PromptsManagerContract}. */
403
+ function defaultPromptsManager() {
404
+ if (!defaultManager) defaultManager = new PromptsManager();
405
+ return defaultManager;
406
+ }
407
+
408
+ //#endregion
409
+ export { defaultPromptsManager, promptKey, prompts };
410
+ //# sourceMappingURL=prompts-manager.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts-manager.mjs","names":[],"sources":["../../../../../../../@warlock.js/ai/src/prompts/prompts-manager.ts"],"sourcesContent":["import type { Placeholders } from \"../contracts/placeholders.type\";\nimport type {\n SystemPromptBlockContract,\n SystemPromptContract,\n SystemPromptMeta,\n} from \"../contracts/system-prompt.contract\";\nimport { InvalidRequestError } from \"../errors\";\nimport { Instruction } from \"../system-prompt/instruction\";\nimport { Persona } from \"../system-prompt/persona\";\nimport { SystemPrompt } from \"../system-prompt/system-prompt\";\nimport type {\n PromptsManagerContract,\n PromptsManagerEntry,\n PromptsManagerRegisterOptions,\n} from \"./prompts-manager.contract\";\nimport type {\n ExportedPromptVersion,\n ExportedRegistry,\n PromptDiff,\n PromptDiffBlock,\n PromptJudgeCacheLike,\n PromptsManagerOptions,\n PromptTemplateVersion,\n PromptValidateTarget,\n PromptValidationResult,\n PromptsValidateOptions,\n} from \"./prompts-manager.type\";\nimport {\n describeContractTarget,\n findMissingPlaceholders,\n findUnreferencedRequired,\n judgePromptBodyCached,\n} from \"./prompts-validate\";\n\n/**\n * Build the `name@version` registry key. Centralized so the duplicate check,\n * `get`, and `composedFrom` provenance all agree on one label shape.\n */\nexport function promptKey(name: string, version: string): string {\n return `${name}@${version}`;\n}\n\n/**\n * Serialize a prompt's observable content — its ordered blocks (discriminator\n * + raw template text) — into a stable signature. Two prompts with the same\n * blocks in the same order share a signature, which is how `register()` tells\n * an idempotent re-registration from a genuine clash. Meta is intentionally\n * excluded: provenance / description should not defeat idempotency.\n */\nfunction contentSignature(contract: SystemPromptContract): string {\n return JSON.stringify(\n contract.blocks.map(block => [block.type, block.text]),\n );\n}\n\n/**\n * Reconstruct a block from its `{ type, text }` snapshot — `persona` blocks\n * become a `Persona`, everything else an `Instruction`. The inverse of the\n * flattening `export()` performs, so an imported registry resolves identically.\n */\nfunction blockFromSnapshot(block: PromptDiffBlock): SystemPromptBlockContract {\n return block.type === \"persona\"\n ? new Persona(block.text)\n : new Instruction(block.text);\n}\n\n/**\n * Narrow a {@link PromptTemplateVersion} body to its ordered block list: a raw\n * string becomes one instruction block; an explicit block list is used verbatim.\n */\nfunction blocksFromTemplate(\n template: string | readonly SystemPromptBlockContract[],\n): SystemPromptBlockContract[] {\n if (typeof template === \"string\") {\n return [new Instruction(template)];\n }\n\n return [...template];\n}\n\n/**\n * Concrete `PromptsManagerContract` — a single registry of named, versioned\n * `SystemPromptContract` builders keyed by `name@version`.\n *\n * **Role.** The store behind `ai.prompts`. It holds one flat\n * `Map<string, PromptsManagerEntry>` keyed by `name@version`, plus a monotonic\n * counter that stamps each entry's `addedAt` so \"latest\" is deterministic\n * (highest `addedAt` for a name) without ever reading the wall clock.\n *\n * **Responsibility.**\n * - Owns: the registry map, the `addedAt` counter, the duplicate /\n * idempotency rule, default version derivation, latest selection, the\n * per-version tag pins, and the validate / diff / export / import surface.\n * - Does NOT own: prompt rendering (delegated to the contract's `resolve()`),\n * block composition, or the LLM-judge mechanics (delegated to the eval\n * `judge` scorer via `prompts-validate`).\n *\n * Users construct via the `prompts()` factory — `new PromptsManager()` is not\n * the public API.\n */\nclass PromptsManager implements PromptsManagerContract {\n /** Flat registry keyed by `name@version`. */\n private readonly entries = new Map<string, PromptsManagerEntry>();\n\n /** First-seen order of names, for a stable `list()`. */\n private readonly names: string[] = [];\n\n /** Per-name tag pins: `name` → (`tag` → `version`). */\n private readonly pins = new Map<string, Map<string, string>>();\n\n /** Optional process-level judge-verdict memo (absent ⇒ judge always runs live). */\n private readonly judgeCache?: PromptJudgeCacheLike;\n\n /** Monotonic insertion counter — the deterministic stand-in for a timestamp. */\n private counter = 0;\n\n public constructor(options: PromptsManagerOptions = {}) {\n this.judgeCache = options.judgeCache;\n }\n\n public register(\n contract: SystemPromptContract,\n options: PromptsManagerRegisterOptions = {},\n ): PromptsManagerContract {\n const meta = contract.meta();\n // An explicit override (from define() / import()) wins over the contract's\n // own meta — it lets those bulk paths register an anonymous contract under\n // a name without the SystemPrompt constructor's default-manager auto-reg.\n const name = options.name ?? meta?.name;\n\n if (!name) {\n throw new InvalidRequestError(\n \"Cannot register a prompt without a name — set meta.name via \" +\n \"systemPrompt(input, { name }) or .meta({ name }).\",\n { context: { meta } },\n );\n }\n\n const version =\n options.version ?? meta?.version ?? this.nextVersion(name);\n const key = promptKey(name, version);\n const existing = this.entries.get(key);\n\n if (existing) {\n // Idempotent re-registration: identical content under the same\n // name@version is a no-op, not an error. Anything else is a clash.\n if (contentSignature(existing.contract) === contentSignature(contract)) {\n return this;\n }\n\n throw new InvalidRequestError(\n `A different prompt is already registered as \"${key}\".`,\n { context: { name, version } },\n );\n }\n\n if (!this.names.includes(name)) {\n this.names.push(name);\n }\n\n this.entries.set(key, {\n name,\n version,\n addedAt: this.counter++,\n contract,\n ...(options.tags ? { tags: options.tags } : {}),\n });\n\n return this;\n }\n\n public create(\n input?: string | ReadonlyArray<SystemPromptBlockContract>,\n meta?: SystemPromptMeta,\n ): SystemPromptContract {\n // Mirror `systemPromptFactory` exactly (no import — `system-prompt.ts`\n // already depends on this module, so importing its factory back here would\n // close an import cycle). A name in `meta` auto-registers into the\n // process-wide default manager via the SystemPrompt constructor.\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 public get(name: string, versionOrTag?: string): SystemPromptContract {\n return this.requireEntry(name, versionOrTag).contract;\n }\n\n public has(name: string, versionOrTag?: string): boolean {\n const { baseName, selector } = this.parseSelector(name, versionOrTag);\n\n if (selector !== undefined) {\n return this.resolveSelector(baseName, selector) !== undefined;\n }\n\n return this.latestEntry(baseName) !== undefined;\n }\n\n public list(): string[] {\n return [...this.names];\n }\n\n public versions(name: string): string[] {\n return [...this.entries.values()]\n .filter(entry => entry.name === name)\n .sort((a, b) => a.addedAt - b.addedAt)\n .map(entry => entry.version);\n }\n\n public resolve(\n name: string,\n versionOrTag?: string,\n placeholders?: Placeholders,\n ): string {\n return this.requireEntry(name, versionOrTag).contract.resolve(placeholders);\n }\n\n public define(\n name: string,\n versions: readonly PromptTemplateVersion[],\n ): PromptsManagerContract {\n for (const entry of versions) {\n const blocks = blocksFromTemplate(entry.template);\n // Anonymous contract (no name in meta ⇒ no SystemPrompt constructor\n // auto-registration into the default manager); the name/version are\n // supplied explicitly so define() targets only THIS manager.\n const contract = new SystemPrompt(blocks);\n\n this.register(contract, { name, version: entry.version });\n }\n\n return this;\n }\n\n public tag(\n name: string,\n tag: string,\n version: string,\n ): PromptsManagerContract {\n // Validate the target exists before pinning — a tag to a missing version is\n // an authoring mistake, not a silent dangling pin.\n if (!this.entries.has(promptKey(name, version))) {\n throw new InvalidRequestError(\n `Cannot tag \"${tag}\" — no prompt registered as \"${promptKey(\n name,\n version,\n )}\".`,\n { context: { name, tag, version } },\n );\n }\n\n const nameTags = this.pins.get(name) ?? new Map<string, string>();\n nameTags.set(tag, version);\n this.pins.set(name, nameTags);\n\n return this;\n }\n\n public async validate(\n target: PromptValidateTarget,\n options: PromptsValidateOptions = {},\n ): Promise<PromptValidationResult> {\n const { text, required } = this.describeTarget(target);\n\n const provided = new Set(Object.keys(options.placeholders ?? {}));\n const declared = new Set<string>([\n ...required,\n ...(options.declare ?? []),\n ]);\n\n const missing = findMissingPlaceholders(text, provided, declared);\n\n // A declared-required key that the body never references is itself a\n // defect — surface it as an issue (it does not affect `missing` / `ok`,\n // which track unresolved placeholders).\n const unreferenced = findUnreferencedRequired(text, required);\n\n const ok = missing.length === 0;\n\n if (!options.judge) {\n if (unreferenced.length === 0) {\n return { ok, missing };\n }\n\n return {\n ok,\n missing,\n issues: unreferenced.map(\n key => `Required key \"${key}\" is never referenced in the prompt.`,\n ),\n };\n }\n\n // Per-call cache override wins over the manager-level memo.\n const cache = options.judgeCache ?? this.judgeCache;\n const judgeOutcome = await judgePromptBodyCached(text, options.judge, cache);\n\n const issues = [\n ...unreferenced.map(\n key => `Required key \"${key}\" is never referenced in the prompt.`,\n ),\n ...judgeOutcome.issues,\n ];\n\n return {\n ok,\n missing,\n ...(judgeOutcome.score !== undefined ? { score: judgeOutcome.score } : {}),\n issues,\n };\n }\n\n public diff(name: string, from: string, to: string): PromptDiff {\n const fromBlocks = this.snapshotBlocks(this.requireExact(name, from));\n const toBlocks = this.snapshotBlocks(this.requireExact(name, to));\n\n const added: PromptDiffBlock[] = [];\n const removed: PromptDiffBlock[] = [];\n const changed: { from: PromptDiffBlock; to: PromptDiffBlock }[] = [];\n\n const max = Math.max(fromBlocks.length, toBlocks.length);\n\n for (let index = 0; index < max; index++) {\n const left = fromBlocks[index];\n const right = toBlocks[index];\n\n if (left && !right) {\n removed.push(left);\n continue;\n }\n\n if (!left && right) {\n added.push(right);\n continue;\n }\n\n if (left && right && (left.type !== right.type || left.text !== right.text)) {\n changed.push({ from: left, to: right });\n }\n }\n\n return {\n name,\n from,\n to,\n added,\n removed,\n changed,\n identical:\n added.length === 0 && removed.length === 0 && changed.length === 0,\n };\n }\n\n public export(): ExportedRegistry {\n return {\n prompts: this.names.map(name => ({\n name,\n versions: this.versions(name).map(version =>\n this.exportVersion(name, version),\n ),\n })),\n };\n }\n\n public import(snapshot: ExportedRegistry): PromptsManagerContract {\n for (const exported of snapshot.prompts) {\n for (const version of exported.versions) {\n const blocks = version.blocks.map(blockFromSnapshot);\n // Anonymous (no `name` in meta) so the SystemPrompt constructor does\n // not auto-register into the default manager; description / required\n // ride along for round-trip fidelity. Name/version are explicit so the\n // import lands only on THIS manager.\n const contract = new SystemPrompt(blocks, {\n ...(version.description ? { description: version.description } : {}),\n ...(version.required ? { required: version.required } : {}),\n });\n\n this.register(contract, {\n name: exported.name,\n version: version.version,\n });\n\n for (const tag of version.tags ?? []) {\n this.tag(exported.name, tag, version.version);\n }\n }\n }\n\n return this;\n }\n\n /**\n * Flatten a registered version into its portable `{ version, blocks, tags?,\n * description?, required? }` snapshot for `export()`.\n */\n private exportVersion(name: string, version: string): ExportedPromptVersion {\n const entry = this.requireExact(name, version);\n const meta = entry.contract.meta();\n const tags = this.tagsForVersion(name, version);\n\n return {\n version,\n blocks: this.snapshotBlocks(entry),\n ...(tags.length > 0 ? { tags } : {}),\n ...(meta?.description ? { description: meta.description } : {}),\n ...(meta?.required ? { required: [...meta.required] } : {}),\n };\n }\n\n /** Every tag currently pinned to a specific `name@version`, in pin order. */\n private tagsForVersion(name: string, version: string): string[] {\n const nameTags = this.pins.get(name);\n\n if (!nameTags) {\n return [];\n }\n\n const tags: string[] = [];\n\n for (const [tag, pinnedVersion] of nameTags) {\n if (pinnedVersion === version) {\n tags.push(tag);\n }\n }\n\n return tags;\n }\n\n /** Flatten an entry's blocks to `{ type, text }` snapshots. */\n private snapshotBlocks(entry: PromptsManagerEntry): PromptDiffBlock[] {\n return entry.contract.blocks.map(block => ({\n type: block.type,\n text: block.text,\n }));\n }\n\n /**\n * Resolve the body + declared-required keys for any `validate` target: a\n * registered name (or `name@selector`), a `SystemPromptContract` instance, or\n * a raw string.\n */\n private describeTarget(target: PromptValidateTarget): {\n text: string;\n required: readonly string[];\n } {\n if (typeof target === \"string\") {\n // An inline `name@selector` (or a bare registered name) resolves through\n // the registry; anything else is a raw prompt body validated verbatim.\n const { baseName, selector } = this.parseSelector(target, undefined);\n const entry = selector\n ? this.resolveSelector(baseName, selector)\n : this.latestEntry(baseName);\n\n if (entry) {\n return describeContractTarget(entry.contract);\n }\n\n return { text: target, required: [] };\n }\n\n if (isSystemPromptContract(target)) {\n return describeContractTarget(target);\n }\n\n if (isBlock(target)) {\n return { text: target.text, required: [] };\n }\n\n throw new InvalidRequestError(\n \"validate() target must be a registered name, a SystemPromptContract, \" +\n \"a prompt block, or a raw string.\",\n { context: { target } },\n );\n }\n\n /**\n * The next integer version label for a name — `\"1\"` for the first, then the\n * count of existing versions plus one. String-typed to match the free-form\n * `version` label shape.\n */\n private nextVersion(name: string): string {\n const count = [...this.entries.values()].filter(\n entry => entry.name === name,\n ).length;\n\n return String(count + 1);\n }\n\n /** Pick the highest-`addedAt` entry for a name, or `undefined` when absent. */\n private latestEntry(name: string): PromptsManagerEntry | undefined {\n let latest: PromptsManagerEntry | undefined;\n\n for (const entry of this.entries.values()) {\n if (entry.name !== name) {\n continue;\n }\n\n if (!latest || entry.addedAt > latest.addedAt) {\n latest = entry;\n }\n }\n\n return latest;\n }\n\n /**\n * Split a name argument into its base name + optional selector. The selector\n * comes from the explicit second argument when present, else from an inline\n * `name@selector` in the first argument. A bare name yields no selector.\n */\n private parseSelector(\n name: string,\n versionOrTag: string | undefined,\n ): { baseName: string; selector: string | undefined } {\n if (versionOrTag !== undefined) {\n return { baseName: name, selector: versionOrTag };\n }\n\n const at = name.indexOf(\"@\");\n\n if (at > 0) {\n return { baseName: name.slice(0, at), selector: name.slice(at + 1) };\n }\n\n return { baseName: name, selector: undefined };\n }\n\n /**\n * Resolve a selector (a version label OR a pinned tag) to a concrete entry.\n * Version labels win over tags when both could match — the explicit label is\n * the more specific intent. Returns `undefined` when neither resolves.\n */\n private resolveSelector(\n name: string,\n selector: string,\n ): PromptsManagerEntry | undefined {\n const byVersion = this.entries.get(promptKey(name, selector));\n\n if (byVersion) {\n return byVersion;\n }\n\n const pinnedVersion = this.pins.get(name)?.get(selector);\n\n if (pinnedVersion !== undefined) {\n return this.entries.get(promptKey(name, pinnedVersion));\n }\n\n return undefined;\n }\n\n /**\n * Resolve an entry by name (+ optional version / tag / inline selector),\n * throwing {@link InvalidRequestError} when the name or the requested\n * selector is unknown. The single lookup path `get` / `resolve` share.\n */\n private requireEntry(\n name: string,\n versionOrTag?: string,\n ): PromptsManagerEntry {\n const { baseName, selector } = this.parseSelector(name, versionOrTag);\n\n if (selector !== undefined) {\n const entry = this.resolveSelector(baseName, selector);\n\n if (!entry) {\n throw new InvalidRequestError(\n `No prompt registered as \"${baseName}\" with version/tag \"${selector}\".`,\n { context: { name: baseName, selector } },\n );\n }\n\n return entry;\n }\n\n const latest = this.latestEntry(baseName);\n\n if (!latest) {\n throw new InvalidRequestError(\n `No prompt registered under name \"${baseName}\".`,\n { context: { name: baseName } },\n );\n }\n\n return latest;\n }\n\n /**\n * Resolve a name + EXACT version label to its entry (no tag fallback), for\n * `diff` / `export` where a concrete version is always required. Throws\n * {@link InvalidRequestError} on a miss.\n */\n private requireExact(name: string, version: string): PromptsManagerEntry {\n const entry = this.entries.get(promptKey(name, version));\n\n if (!entry) {\n throw new InvalidRequestError(\n `No prompt registered as \"${promptKey(name, version)}\".`,\n { context: { name, version } },\n );\n }\n\n return entry;\n }\n}\n\n/**\n * Narrow an arbitrary value to a `SystemPromptContract` — true when it exposes\n * the builder surface (`blocks` array + a callable `resolve`) AND a callable\n * `meta`. Robust across duplicate package copies (no `instanceof`).\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 typeof (value as { meta?: unknown }).meta === \"function\"\n );\n}\n\n/**\n * Narrow an arbitrary value to a single `SystemPromptBlockContract` — true when\n * it carries a string `type` + `text` and a callable `resolve` but is NOT a\n * full prompt (no `blocks` array). Lets `validate` accept a lone block.\n */\nfunction isBlock(value: unknown): value is SystemPromptBlockContract {\n return (\n typeof value === \"object\" &&\n value !== null &&\n typeof (value as { type?: unknown }).type === \"string\" &&\n typeof (value as { text?: unknown }).text === \"string\" &&\n typeof (value as { resolve?: unknown }).resolve === \"function\"\n );\n}\n\n/**\n * Create a new, isolated prompts manager.\n *\n * **Role.** Public factory for {@link PromptsManagerContract} — keeps\n * user-facing code free of `new` and consistent with the other `ai.*`\n * factories. Each call returns a fresh registry, so parallel test suites and\n * multi-tenant apps never share mutable global prompt state.\n *\n * The process-wide instance that named `systemPrompt(...)` builders\n * auto-register into is `ai.prompts` (see {@link defaultPromptsManager}).\n *\n * @param options - Optional wiring, notably a `judgeCache` that memoizes\n * LLM-judge verdicts (absent ⇒ every judge pass runs live).\n *\n * @example\n * const registry = prompts();\n * registry.register(systemPrompt(\"You are support.\", { name: \"support\" }));\n * registry.resolve(\"support\"); // \"You are support.\"\n *\n * @example\n * // Memoize judge verdicts across validations.\n * const registry = prompts({ judgeCache: new MemoryCacheDriver() });\n */\nexport function prompts(options?: PromptsManagerOptions): PromptsManagerContract {\n return new PromptsManager(options);\n}\n\n/**\n * The process-wide default manager that named prompts auto-register into.\n *\n * Held as a module-level singleton (lazily created on first access) so\n * `system-prompt.ts` can register a named builder without importing the\n * `PromptsManager` class — keeping the auto-registration seam free of a\n * runtime import cycle.\n */\nlet defaultManager: PromptsManagerContract | undefined;\n\n/** Accessor for the process-wide default {@link PromptsManagerContract}. */\nexport function defaultPromptsManager(): PromptsManagerContract {\n if (!defaultManager) {\n defaultManager = new PromptsManager();\n }\n\n return defaultManager;\n}\n"],"mappings":"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"}
@@ -0,0 +1,172 @@
1
+ import { ModelContract } from "../contracts/model.contract.mjs";
2
+ import { Placeholders } from "../contracts/placeholders.type.mjs";
3
+ import { SystemPromptBlockContract } from "../contracts/system-prompt.contract.mjs";
4
+
5
+ //#region ../@warlock.js/ai/src/prompts/prompts-manager.type.d.ts
6
+ /**
7
+ * The minimal cache surface the judge-verdict memo needs — a structural subset
8
+ * of `@warlock.js/cache`'s `CacheDriver` (`get` / `set`). Typed structurally
9
+ * (not imported) so `@warlock.js/cache` stays a strictly OPTIONAL peer: a
10
+ * consumer that never validates with a judge never needs the cache package.
11
+ * Any `CacheDriver` instance satisfies this.
12
+ */
13
+ interface PromptJudgeCacheLike {
14
+ /** Read a cached value, or `null` on a miss. */
15
+ get<T = unknown>(key: string): Promise<T | null>;
16
+ /** Write a value (TTL / options ignored by this memo path). */
17
+ set(key: string, value: unknown, ttlOrOptions?: unknown): Promise<unknown>;
18
+ }
19
+ /**
20
+ * Options for the `prompts(options?)` factory.
21
+ */
22
+ interface PromptsManagerOptions {
23
+ /**
24
+ * Optional cache that memoizes LLM-judge verdicts. Keyed by a content hash of
25
+ * the resolved prompt body + the judge model's id, so a re-validation of the
26
+ * same prompt with the same judge skips the model call. Absent ⇒ every judge
27
+ * pass runs live (a pure no-op seam — `@warlock.js/cache` stays optional).
28
+ */
29
+ readonly judgeCache?: PromptJudgeCacheLike;
30
+ }
31
+ /**
32
+ * What {@link PromptsManagerContract.validate} accepts as its target:
33
+ * - a registered prompt **name** (resolved to its latest version, or a tagged /
34
+ * `name@version` selector — same syntax `get` accepts);
35
+ * - a `SystemPromptContract` instance (named or anonymous);
36
+ * - a raw prompt **string** (validated verbatim, no registry lookup).
37
+ */
38
+ type PromptValidateTarget = string | SystemPromptBlockContract | object;
39
+ /**
40
+ * Options for {@link PromptsManagerContract.validate}.
41
+ */
42
+ interface PromptsValidateOptions {
43
+ /**
44
+ * Placeholder values the caller intends to supply at resolve time. Any
45
+ * `{{key}}` present in these (or carrying an inline default, or declared in
46
+ * `meta.required`) is NOT reported as missing.
47
+ */
48
+ readonly placeholders?: Placeholders;
49
+ /**
50
+ * Extra placeholder keys to treat as known/declared (beyond the prompt's own
51
+ * `meta.required`). A key listed here is never reported missing.
52
+ */
53
+ readonly declare?: readonly string[];
54
+ /**
55
+ * Optional model that powers the LLM-as-judge quality pass. When omitted,
56
+ * `validate` runs the deterministic placeholder check only and returns no
57
+ * `score`. The judge is Nova-safe — it never throws and degrades to an
58
+ * `issues` note (leaving `score` undefined) on any failure.
59
+ */
60
+ readonly judge?: ModelContract;
61
+ /**
62
+ * Per-call judge-verdict cache override. When set, takes precedence over the
63
+ * manager's `judgeCache` for this call only. Same memo semantics: only used
64
+ * when `judge` is also supplied.
65
+ */
66
+ readonly judgeCache?: PromptJudgeCacheLike;
67
+ }
68
+ /**
69
+ * Unified result of {@link PromptsManagerContract.validate}.
70
+ *
71
+ * `ok` is the deterministic verdict alone — `true` iff no required placeholder
72
+ * is missing. The optional LLM-judge `score` / `issues` are advisory and never
73
+ * flip `ok`, so a flaky judge can't fail an otherwise-valid prompt.
74
+ */
75
+ interface PromptValidationResult {
76
+ /** `true` when no required placeholder is missing (deterministic verdict). */
77
+ readonly ok: boolean;
78
+ /** Placeholder keys referenced with no default, unsupplied and undeclared. */
79
+ readonly missing: string[];
80
+ /**
81
+ * LLM-judge quality score in `[0, 1]`. Present only when a `judge` model was
82
+ * supplied AND the judge produced a usable verdict; `undefined` when no judge
83
+ * ran or the judge degraded.
84
+ */
85
+ readonly score?: number;
86
+ /**
87
+ * Advisory findings — the judge's reason(s) and/or a degrade note. Present
88
+ * (possibly empty) only when a `judge` model was supplied.
89
+ */
90
+ readonly issues?: string[];
91
+ }
92
+ /**
93
+ * One version in a bulk {@link PromptsManagerContract.define} call (or a
94
+ * `.templates([...])` builder call): a version label plus its body, given
95
+ * either as a raw string (wrapped into a single instruction block) or as an
96
+ * explicit ordered list of blocks (used verbatim).
97
+ */
98
+ interface PromptTemplateVersion {
99
+ /** Version label, e.g. `"1"`, `"2"`, `"2025-draft"`. */
100
+ readonly version: string;
101
+ /**
102
+ * The version body. A string becomes one instruction block; an array of
103
+ * blocks is registered verbatim, preserving order.
104
+ */
105
+ readonly template: string | readonly SystemPromptBlockContract[];
106
+ }
107
+ /**
108
+ * One block in a {@link PromptDiff} — its discriminator and raw text, so a diff
109
+ * is comparable without resolving placeholders.
110
+ */
111
+ interface PromptDiffBlock {
112
+ /** Block discriminator (`"persona"` / `"instruction"` / …). */
113
+ readonly type: string;
114
+ /** Raw template text. */
115
+ readonly text: string;
116
+ }
117
+ /**
118
+ * Block-level diff between two registered versions of a prompt, returned by
119
+ * {@link PromptsManagerContract.diff}. Blocks are matched positionally.
120
+ */
121
+ interface PromptDiff {
122
+ /** The prompt name diffed. */
123
+ readonly name: string;
124
+ /** The left/from version label. */
125
+ readonly from: string;
126
+ /** The right/to version label. */
127
+ readonly to: string;
128
+ /** Blocks present in `to` but not at the same position in `from`. */
129
+ readonly added: PromptDiffBlock[];
130
+ /** Blocks present in `from` but not at the same position in `to`. */
131
+ readonly removed: PromptDiffBlock[];
132
+ /** Blocks at the same position whose `type` or `text` changed. */
133
+ readonly changed: {
134
+ from: PromptDiffBlock;
135
+ to: PromptDiffBlock;
136
+ }[];
137
+ /** `true` when the two versions have identical blocks in identical order. */
138
+ readonly identical: boolean;
139
+ }
140
+ /**
141
+ * The portable JSON shape of a single registered version, used by
142
+ * {@link PromptsManagerContract.export} / `import`. Blocks are flattened to
143
+ * `{ type, text }` so the registry round-trips without live builder instances.
144
+ */
145
+ interface ExportedPromptVersion {
146
+ readonly version: string;
147
+ readonly blocks: PromptDiffBlock[];
148
+ /** Tags pinned to this exact version (via `tag(name, tag, version)`). */
149
+ readonly tags?: string[];
150
+ /** Carried-through `meta.description`, when present. */
151
+ readonly description?: string;
152
+ /** Carried-through `meta.required`, when present. */
153
+ readonly required?: string[];
154
+ }
155
+ /**
156
+ * The portable JSON shape of one registered name and all its versions, used by
157
+ * {@link PromptsManagerContract.export} / `import`.
158
+ */
159
+ interface ExportedPrompt {
160
+ readonly name: string;
161
+ readonly versions: ExportedPromptVersion[];
162
+ }
163
+ /**
164
+ * The full portable registry snapshot returned by
165
+ * {@link PromptsManagerContract.export} and accepted by `import`.
166
+ */
167
+ interface ExportedRegistry {
168
+ readonly prompts: ExportedPrompt[];
169
+ }
170
+ //#endregion
171
+ export { ExportedPrompt, ExportedPromptVersion, ExportedRegistry, PromptDiff, PromptDiffBlock, PromptJudgeCacheLike, PromptTemplateVersion, PromptValidateTarget, PromptValidationResult, PromptsManagerOptions, PromptsValidateOptions };
172
+ //# sourceMappingURL=prompts-manager.type.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts-manager.type.d.mts","names":[],"sources":["../../../../../../../@warlock.js/ai/src/prompts/prompts-manager.type.ts"],"mappings":";;;;;;;AAWA;;;;;UAAiB,oBAAA;EAIkD;EAFjE,GAAA,cAAiB,GAAA,WAAc,OAAA,CAAQ,CAAA;EAAvC;EAEA,GAAA,CAAI,GAAA,UAAa,KAAA,WAAgB,YAAA,aAAyB,OAAA;AAAA;;;;UAM3C,qBAAA;EANE;;;;AAAgD;AAMnE;EANmB,SAaR,UAAA,GAAa,oBAAoB;AAAA;;AAAA;AAU5C;;;;AAAqE;KAAzD,oBAAA,YAAgC,yBAAyB;;;;UAKpD,sBAAA;EA2BO;;;;;EAAA,SArBb,YAAA,GAAe,YAAA;EAcf;;;;EAAA,SARA,OAAA;EAeiC;AAU5C;;;;;EAV4C,SAPjC,KAAA,GAAQ,aAAA;EA6BR;;;AAMM;AASjB;EAfW,SAtBA,UAAA,GAAa,oBAAA;AAAA;;;;;;AA6CwC;AAOhE;UA1CiB,sBAAA;;WAEN,EAAA;EA4CI;EAAA,SAzCJ,OAAA;EAgDgB;;;;;EAAA,SAzChB,KAAA;EAqDqD;;;;EAAA,SA/CrD,MAAA;AAAA;;;;;;;UASM,qBAAA;EAsCgC;EAAA,SApCtC,OAAA;EAsCS;AAAA;AAQpB;;EARoB,SAhCT,QAAA,oBAA4B,yBAAyB;AAAA;;;;;UAO/C,eAAA;EAyCN;EAAA,SAvCA,IAAA;EAuCQ;EAAA,SArCR,IAAI;AAAA;;;;;UAOE,UAAA;EAuCyB;EAAA,SArC/B,IAAA;EA4CM;EAAA,SA1CN,IAAA;;WAEA,EAAA;EAyCuB;EAAA,SAvCvB,KAAA,EAAO,eAAA;;WAEP,OAAA,EAAS,eAAA;;WAET,OAAA;IAAW,IAAA,EAAM,eAAA;IAAiB,EAAA,EAAI,eAAA;EAAA;;WAEtC,SAAA;AAAA;;;;;;UAQM,qBAAA;EAAA,SACN,OAAA;EAAA,SACA,MAAA,EAAQ,eAAe;;WAEvB,IAAA;;WAEA,WAAA;;WAEA,QAAA;AAAA;;;;;UAOM,cAAA;EAAA,SACN,IAAA;EAAA,SACA,QAAA,EAAU,qBAAqB;AAAA;;;;;UAOzB,gBAAA;EAAA,SACN,OAAA,EAAS,cAAc;AAAA"}