@warlock.js/core 4.7.0 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (812) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/esm/config/config-getter.mjs +5 -5
  3. package/esm/config/config-getter.mjs.map +1 -1
  4. package/esm/config/config-loader.mjs +2 -2
  5. package/esm/config/config-loader.mjs.map +1 -1
  6. package/esm/connectors/access-connector.mjs +2 -2
  7. package/esm/connectors/access-connector.mjs.map +1 -1
  8. package/esm/connectors/ai-connector.mjs +3 -3
  9. package/esm/connectors/ai-connector.mjs.map +1 -1
  10. package/esm/connectors/cache-connector.mjs +2 -2
  11. package/esm/connectors/cache-connector.mjs.map +1 -1
  12. package/esm/connectors/database-connector.mjs +2 -2
  13. package/esm/connectors/database-connector.mjs.map +1 -1
  14. package/esm/connectors/herald-connector.mjs +2 -2
  15. package/esm/connectors/herald-connector.mjs.map +1 -1
  16. package/esm/connectors/http-connector.mjs +7 -7
  17. package/esm/connectors/http-connector.mjs.map +1 -1
  18. package/esm/connectors/logger-connector.mjs +2 -2
  19. package/esm/connectors/logger-connector.mjs.map +1 -1
  20. package/esm/connectors/mail-connector.mjs +2 -2
  21. package/esm/connectors/mail-connector.mjs.map +1 -1
  22. package/esm/connectors/notifications-connector.mjs +2 -2
  23. package/esm/connectors/notifications-connector.mjs.map +1 -1
  24. package/esm/connectors/socket-connector.mjs +3 -3
  25. package/esm/connectors/socket-connector.mjs.map +1 -1
  26. package/esm/http/config.mjs +2 -2
  27. package/esm/http/config.mjs.map +1 -1
  28. package/esm/http/createHttpApplication.mjs +2 -2
  29. package/esm/http/createHttpApplication.mjs.map +1 -1
  30. package/esm/http/middleware/idempotency.middleware.mjs +5 -5
  31. package/esm/http/middleware/idempotency.middleware.mjs.map +1 -1
  32. package/esm/http/middleware/inject-request-context.mjs +2 -2
  33. package/esm/http/middleware/inject-request-context.mjs.map +1 -1
  34. package/esm/http/middleware/maintenance.middleware.mjs +4 -4
  35. package/esm/http/middleware/maintenance.middleware.mjs.map +1 -1
  36. package/esm/http/plugins.mjs +9 -9
  37. package/esm/http/plugins.mjs.map +1 -1
  38. package/esm/http/response.mjs +5 -5
  39. package/esm/http/response.mjs.map +1 -1
  40. package/esm/http/server.mjs +4 -4
  41. package/esm/http/server.mjs.map +1 -1
  42. package/esm/utils/paths.mjs +2 -2
  43. package/esm/utils/paths.mjs.map +1 -1
  44. package/esm/validation/validateAll.mjs +2 -2
  45. package/esm/validation/validateAll.mjs.map +1 -1
  46. package/package.json +12 -9
  47. package/esm/ai/src/agent/agent-input-builder.mjs +0 -133
  48. package/esm/ai/src/agent/agent-input-builder.mjs.map +0 -1
  49. package/esm/ai/src/agent/agent-log-event.mjs +0 -101
  50. package/esm/ai/src/agent/agent-log-event.mjs.map +0 -1
  51. package/esm/ai/src/agent/agent-stream.mjs +0 -82
  52. package/esm/ai/src/agent/agent-stream.mjs.map +0 -1
  53. package/esm/ai/src/agent/agent-to-stream-event.mjs +0 -86
  54. package/esm/ai/src/agent/agent-to-stream-event.mjs.map +0 -1
  55. package/esm/ai/src/agent/agent.mjs +0 -1276
  56. package/esm/ai/src/agent/agent.mjs.map +0 -1
  57. package/esm/ai/src/agent/index.mjs +0 -5
  58. package/esm/ai/src/agent/json-stream-guard.mjs +0 -400
  59. package/esm/ai/src/agent/json-stream-guard.mjs.map +0 -1
  60. package/esm/ai/src/agent/signature.mjs +0 -57
  61. package/esm/ai/src/agent/signature.mjs.map +0 -1
  62. package/esm/ai/src/agent/snapshot.mjs +0 -101
  63. package/esm/ai/src/agent/snapshot.mjs.map +0 -1
  64. package/esm/ai/src/agent/spawn-sub-agent.mjs +0 -68
  65. package/esm/ai/src/agent/spawn-sub-agent.mjs.map +0 -1
  66. package/esm/ai/src/ai.mjs +0 -191
  67. package/esm/ai/src/ai.mjs.map +0 -1
  68. package/esm/ai/src/batch/batch.mjs +0 -198
  69. package/esm/ai/src/batch/batch.mjs.map +0 -1
  70. package/esm/ai/src/batch/index.mjs +0 -3
  71. package/esm/ai/src/batch/run-batch-item.mjs +0 -100
  72. package/esm/ai/src/batch/run-batch-item.mjs.map +0 -1
  73. package/esm/ai/src/batch/run-with-concurrency.mjs +0 -39
  74. package/esm/ai/src/batch/run-with-concurrency.mjs.map +0 -1
  75. package/esm/ai/src/checkpoint/memory.mjs +0 -0
  76. package/esm/ai/src/checkpoint/memory.mjs.map +0 -1
  77. package/esm/ai/src/checkpoint/pg.mjs +0 -265
  78. package/esm/ai/src/checkpoint/pg.mjs.map +0 -1
  79. package/esm/ai/src/checkpoint/redis.mjs +0 -200
  80. package/esm/ai/src/checkpoint/redis.mjs.map +0 -1
  81. package/esm/ai/src/config.mjs +0 -59
  82. package/esm/ai/src/config.mjs.map +0 -1
  83. package/esm/ai/src/contracts/end.type.mjs +0 -47
  84. package/esm/ai/src/contracts/end.type.mjs.map +0 -1
  85. package/esm/ai/src/errors/agent-cancelled-error.mjs +0 -43
  86. package/esm/ai/src/errors/agent-cancelled-error.mjs.map +0 -1
  87. package/esm/ai/src/errors/agent-drift-error.mjs +0 -31
  88. package/esm/ai/src/errors/agent-drift-error.mjs.map +0 -1
  89. package/esm/ai/src/errors/agent-execution-error.mjs +0 -35
  90. package/esm/ai/src/errors/agent-execution-error.mjs.map +0 -1
  91. package/esm/ai/src/errors/agent-max-trips-error.mjs +0 -41
  92. package/esm/ai/src/errors/agent-max-trips-error.mjs.map +0 -1
  93. package/esm/ai/src/errors/ai-error.mjs +0 -68
  94. package/esm/ai/src/errors/ai-error.mjs.map +0 -1
  95. package/esm/ai/src/errors/budget-exceeded-error.mjs +0 -31
  96. package/esm/ai/src/errors/budget-exceeded-error.mjs.map +0 -1
  97. package/esm/ai/src/errors/content-filter-error.mjs +0 -28
  98. package/esm/ai/src/errors/content-filter-error.mjs.map +0 -1
  99. package/esm/ai/src/errors/context-length-exceeded-error.mjs +0 -31
  100. package/esm/ai/src/errors/context-length-exceeded-error.mjs.map +0 -1
  101. package/esm/ai/src/errors/guardrail-violation-error.mjs +0 -41
  102. package/esm/ai/src/errors/guardrail-violation-error.mjs.map +0 -1
  103. package/esm/ai/src/errors/index.mjs +0 -40
  104. package/esm/ai/src/errors/invalid-request-error.mjs +0 -31
  105. package/esm/ai/src/errors/invalid-request-error.mjs.map +0 -1
  106. package/esm/ai/src/errors/max-iterations-error.mjs +0 -32
  107. package/esm/ai/src/errors/max-iterations-error.mjs.map +0 -1
  108. package/esm/ai/src/errors/max-steps-exceeded-error.mjs +0 -21
  109. package/esm/ai/src/errors/max-steps-exceeded-error.mjs.map +0 -1
  110. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs +0 -31
  111. package/esm/ai/src/errors/orchestrator-cancelled-error.mjs.map +0 -1
  112. package/esm/ai/src/errors/orchestrator-config-error.mjs +0 -30
  113. package/esm/ai/src/errors/orchestrator-config-error.mjs.map +0 -1
  114. package/esm/ai/src/errors/orchestrator-drift-error.mjs +0 -37
  115. package/esm/ai/src/errors/orchestrator-drift-error.mjs.map +0 -1
  116. package/esm/ai/src/errors/orchestrator-failed-error.mjs +0 -36
  117. package/esm/ai/src/errors/orchestrator-failed-error.mjs.map +0 -1
  118. package/esm/ai/src/errors/outbound-policy-error.mjs +0 -32
  119. package/esm/ai/src/errors/outbound-policy-error.mjs.map +0 -1
  120. package/esm/ai/src/errors/planner-cancelled-error.mjs +0 -29
  121. package/esm/ai/src/errors/planner-cancelled-error.mjs.map +0 -1
  122. package/esm/ai/src/errors/planner-drift-error.mjs +0 -33
  123. package/esm/ai/src/errors/planner-drift-error.mjs.map +0 -1
  124. package/esm/ai/src/errors/planner-failed-error.mjs +0 -37
  125. package/esm/ai/src/errors/planner-failed-error.mjs.map +0 -1
  126. package/esm/ai/src/errors/planner-plan-invalid-error.mjs +0 -25
  127. package/esm/ai/src/errors/planner-plan-invalid-error.mjs.map +0 -1
  128. package/esm/ai/src/errors/prompt-refinement-error.mjs +0 -27
  129. package/esm/ai/src/errors/prompt-refinement-error.mjs.map +0 -1
  130. package/esm/ai/src/errors/provider-auth-error.mjs +0 -26
  131. package/esm/ai/src/errors/provider-auth-error.mjs.map +0 -1
  132. package/esm/ai/src/errors/provider-error.mjs +0 -42
  133. package/esm/ai/src/errors/provider-error.mjs.map +0 -1
  134. package/esm/ai/src/errors/provider-rate-limit-error.mjs +0 -31
  135. package/esm/ai/src/errors/provider-rate-limit-error.mjs.map +0 -1
  136. package/esm/ai/src/errors/provider-timeout-error.mjs +0 -26
  137. package/esm/ai/src/errors/provider-timeout-error.mjs.map +0 -1
  138. package/esm/ai/src/errors/quota-exceeded-error.mjs +0 -40
  139. package/esm/ai/src/errors/quota-exceeded-error.mjs.map +0 -1
  140. package/esm/ai/src/errors/routing-error.mjs +0 -23
  141. package/esm/ai/src/errors/routing-error.mjs.map +0 -1
  142. package/esm/ai/src/errors/schema-validation-error.mjs +0 -37
  143. package/esm/ai/src/errors/schema-validation-error.mjs.map +0 -1
  144. package/esm/ai/src/errors/step-failed-error.mjs +0 -19
  145. package/esm/ai/src/errors/step-failed-error.mjs.map +0 -1
  146. package/esm/ai/src/errors/supervisor-cancelled-error.mjs +0 -29
  147. package/esm/ai/src/errors/supervisor-cancelled-error.mjs.map +0 -1
  148. package/esm/ai/src/errors/supervisor-drift-error.mjs +0 -30
  149. package/esm/ai/src/errors/supervisor-drift-error.mjs.map +0 -1
  150. package/esm/ai/src/errors/supervisor-failed-error.mjs +0 -43
  151. package/esm/ai/src/errors/supervisor-failed-error.mjs.map +0 -1
  152. package/esm/ai/src/errors/supervisor-routing-error.mjs +0 -39
  153. package/esm/ai/src/errors/supervisor-routing-error.mjs.map +0 -1
  154. package/esm/ai/src/errors/tool-execution-error.mjs +0 -32
  155. package/esm/ai/src/errors/tool-execution-error.mjs.map +0 -1
  156. package/esm/ai/src/errors/workflow-cancelled-error.mjs +0 -23
  157. package/esm/ai/src/errors/workflow-cancelled-error.mjs.map +0 -1
  158. package/esm/ai/src/errors/workflow-drift-error.mjs +0 -24
  159. package/esm/ai/src/errors/workflow-drift-error.mjs.map +0 -1
  160. package/esm/ai/src/errors/workflow-error.mjs +0 -18
  161. package/esm/ai/src/errors/workflow-error.mjs.map +0 -1
  162. package/esm/ai/src/eval/dataset.mjs +0 -112
  163. package/esm/ai/src/eval/dataset.mjs.map +0 -1
  164. package/esm/ai/src/eval/eval-runner.mjs +0 -135
  165. package/esm/ai/src/eval/eval-runner.mjs.map +0 -1
  166. package/esm/ai/src/eval/index.mjs +0 -48
  167. package/esm/ai/src/eval/index.mjs.map +0 -1
  168. package/esm/ai/src/eval/judge-scorer.mjs +0 -87
  169. package/esm/ai/src/eval/judge-scorer.mjs.map +0 -1
  170. package/esm/ai/src/eval/regression.mjs +0 -51
  171. package/esm/ai/src/eval/regression.mjs.map +0 -1
  172. package/esm/ai/src/eval/report-json.mjs +0 -33
  173. package/esm/ai/src/eval/report-json.mjs.map +0 -1
  174. package/esm/ai/src/eval/report-junit.mjs +0 -60
  175. package/esm/ai/src/eval/report-junit.mjs.map +0 -1
  176. package/esm/ai/src/eval/scorers.mjs +0 -101
  177. package/esm/ai/src/eval/scorers.mjs.map +0 -1
  178. package/esm/ai/src/guard/detectors/index.mjs +0 -6
  179. package/esm/ai/src/guard/detectors/injection.mjs +0 -254
  180. package/esm/ai/src/guard/detectors/injection.mjs.map +0 -1
  181. package/esm/ai/src/guard/detectors/moderation.mjs +0 -134
  182. package/esm/ai/src/guard/detectors/moderation.mjs.map +0 -1
  183. package/esm/ai/src/guard/detectors/pii.mjs +0 -199
  184. package/esm/ai/src/guard/detectors/pii.mjs.map +0 -1
  185. package/esm/ai/src/guard/detectors/topic.mjs +0 -99
  186. package/esm/ai/src/guard/detectors/topic.mjs.map +0 -1
  187. package/esm/ai/src/guard/errors.mjs +0 -18
  188. package/esm/ai/src/guard/errors.mjs.map +0 -1
  189. package/esm/ai/src/guard/guard.mjs +0 -209
  190. package/esm/ai/src/guard/guard.mjs.map +0 -1
  191. package/esm/ai/src/guard/guardrail.mjs +0 -22
  192. package/esm/ai/src/guard/guardrail.mjs.map +0 -1
  193. package/esm/ai/src/human/errors.mjs +0 -60
  194. package/esm/ai/src/human/errors.mjs.map +0 -1
  195. package/esm/ai/src/human/human-approval.mjs +0 -170
  196. package/esm/ai/src/human/human-approval.mjs.map +0 -1
  197. package/esm/ai/src/human/policy.mjs +0 -67
  198. package/esm/ai/src/human/policy.mjs.map +0 -1
  199. package/esm/ai/src/human/register.mjs +0 -37
  200. package/esm/ai/src/human/register.mjs.map +0 -1
  201. package/esm/ai/src/human/resume-seed.mjs +0 -53
  202. package/esm/ai/src/human/resume-seed.mjs.map +0 -1
  203. package/esm/ai/src/human/resume.mjs +0 -121
  204. package/esm/ai/src/human/resume.mjs.map +0 -1
  205. package/esm/ai/src/human/stores/index.mjs +0 -5
  206. package/esm/ai/src/human/stores/memory.mjs +0 -91
  207. package/esm/ai/src/human/stores/memory.mjs.map +0 -1
  208. package/esm/ai/src/human/stores/pg.mjs +0 -220
  209. package/esm/ai/src/human/stores/pg.mjs.map +0 -1
  210. package/esm/ai/src/human/stores/redis.mjs +0 -201
  211. package/esm/ai/src/human/stores/redis.mjs.map +0 -1
  212. package/esm/ai/src/image/image-cost.mjs +0 -55
  213. package/esm/ai/src/image/image-cost.mjs.map +0 -1
  214. package/esm/ai/src/image/image.mjs +0 -112
  215. package/esm/ai/src/image/image.mjs.map +0 -1
  216. package/esm/ai/src/image/index.mjs +0 -4
  217. package/esm/ai/src/index.mjs +0 -196
  218. package/esm/ai/src/memory/derive-id.mjs +0 -24
  219. package/esm/ai/src/memory/derive-id.mjs.map +0 -1
  220. package/esm/ai/src/memory/episodic-memory.mjs +0 -106
  221. package/esm/ai/src/memory/episodic-memory.mjs.map +0 -1
  222. package/esm/ai/src/memory/memory.mjs +0 -166
  223. package/esm/ai/src/memory/memory.mjs.map +0 -1
  224. package/esm/ai/src/memory/procedural-memory.mjs +0 -103
  225. package/esm/ai/src/memory/procedural-memory.mjs.map +0 -1
  226. package/esm/ai/src/memory/semantic-memory.mjs +0 -80
  227. package/esm/ai/src/memory/semantic-memory.mjs.map +0 -1
  228. package/esm/ai/src/memory/working-memory.mjs +0 -62
  229. package/esm/ai/src/memory/working-memory.mjs.map +0 -1
  230. package/esm/ai/src/middleware/builtins/budget.mjs +0 -219
  231. package/esm/ai/src/middleware/builtins/budget.mjs.map +0 -1
  232. package/esm/ai/src/middleware/builtins/guardrail.mjs +0 -76
  233. package/esm/ai/src/middleware/builtins/guardrail.mjs.map +0 -1
  234. package/esm/ai/src/middleware/builtins/semantic-cache.mjs +0 -149
  235. package/esm/ai/src/middleware/builtins/semantic-cache.mjs.map +0 -1
  236. package/esm/ai/src/middleware/helpers/compose.mjs +0 -52
  237. package/esm/ai/src/middleware/helpers/compose.mjs.map +0 -1
  238. package/esm/ai/src/middleware/helpers/for-tool.mjs +0 -80
  239. package/esm/ai/src/middleware/helpers/for-tool.mjs.map +0 -1
  240. package/esm/ai/src/middleware/index.mjs +0 -10
  241. package/esm/ai/src/middleware/pipeline.mjs +0 -100
  242. package/esm/ai/src/middleware/pipeline.mjs.map +0 -1
  243. package/esm/ai/src/middleware/utils/extract-user-text.mjs +0 -47
  244. package/esm/ai/src/middleware/utils/extract-user-text.mjs.map +0 -1
  245. package/esm/ai/src/middleware/utils/namespaced-state.mjs +0 -60
  246. package/esm/ai/src/middleware/utils/namespaced-state.mjs.map +0 -1
  247. package/esm/ai/src/mock/index.mjs +0 -4
  248. package/esm/ai/src/mock/mock-agent.mjs +0 -3
  249. package/esm/ai/src/mock/mock-router.mjs +0 -58
  250. package/esm/ai/src/mock/mock-router.mjs.map +0 -1
  251. package/esm/ai/src/model/fallback-model.mjs +0 -218
  252. package/esm/ai/src/model/fallback-model.mjs.map +0 -1
  253. package/esm/ai/src/model/index.mjs +0 -3
  254. package/esm/ai/src/object-stream/index.mjs +0 -4
  255. package/esm/ai/src/object-stream/parse-partial-json.mjs +0 -78
  256. package/esm/ai/src/object-stream/parse-partial-json.mjs.map +0 -1
  257. package/esm/ai/src/object-stream/stream-object.mjs +0 -97
  258. package/esm/ai/src/object-stream/stream-object.mjs.map +0 -1
  259. package/esm/ai/src/observe/index.mjs +0 -4
  260. package/esm/ai/src/observe/observer-registry.mjs +0 -35
  261. package/esm/ai/src/observe/observer-registry.mjs.map +0 -1
  262. package/esm/ai/src/observe/resolve-observers.mjs +0 -73
  263. package/esm/ai/src/observe/resolve-observers.mjs.map +0 -1
  264. package/esm/ai/src/orchestrator/as-tool.mjs +0 -98
  265. package/esm/ai/src/orchestrator/as-tool.mjs.map +0 -1
  266. package/esm/ai/src/orchestrator/checkpoint.mjs +0 -75
  267. package/esm/ai/src/orchestrator/checkpoint.mjs.map +0 -1
  268. package/esm/ai/src/orchestrator/commands.mjs +0 -34
  269. package/esm/ai/src/orchestrator/commands.mjs.map +0 -1
  270. package/esm/ai/src/orchestrator/compaction.mjs +0 -206
  271. package/esm/ai/src/orchestrator/compaction.mjs.map +0 -1
  272. package/esm/ai/src/orchestrator/dispatch.mjs +0 -171
  273. package/esm/ai/src/orchestrator/dispatch.mjs.map +0 -1
  274. package/esm/ai/src/orchestrator/emitter.mjs +0 -85
  275. package/esm/ai/src/orchestrator/emitter.mjs.map +0 -1
  276. package/esm/ai/src/orchestrator/execution.mjs +0 -395
  277. package/esm/ai/src/orchestrator/execution.mjs.map +0 -1
  278. package/esm/ai/src/orchestrator/index.mjs +0 -11
  279. package/esm/ai/src/orchestrator/load.mjs +0 -49
  280. package/esm/ai/src/orchestrator/load.mjs.map +0 -1
  281. package/esm/ai/src/orchestrator/lock.mjs +0 -75
  282. package/esm/ai/src/orchestrator/lock.mjs.map +0 -1
  283. package/esm/ai/src/orchestrator/memory.mjs +0 -141
  284. package/esm/ai/src/orchestrator/memory.mjs.map +0 -1
  285. package/esm/ai/src/orchestrator/orchestrator-stream.mjs +0 -98
  286. package/esm/ai/src/orchestrator/orchestrator-stream.mjs.map +0 -1
  287. package/esm/ai/src/orchestrator/orchestrator.mjs +0 -206
  288. package/esm/ai/src/orchestrator/orchestrator.mjs.map +0 -1
  289. package/esm/ai/src/orchestrator/resume.mjs +0 -74
  290. package/esm/ai/src/orchestrator/resume.mjs.map +0 -1
  291. package/esm/ai/src/orchestrator/session-lock.mjs +0 -83
  292. package/esm/ai/src/orchestrator/session-lock.mjs.map +0 -1
  293. package/esm/ai/src/orchestrator/signature.mjs +0 -120
  294. package/esm/ai/src/orchestrator/signature.mjs.map +0 -1
  295. package/esm/ai/src/orchestrator/window.mjs +0 -56
  296. package/esm/ai/src/orchestrator/window.mjs.map +0 -1
  297. package/esm/ai/src/planner/dag-scheduler.mjs +0 -97
  298. package/esm/ai/src/planner/dag-scheduler.mjs.map +0 -1
  299. package/esm/ai/src/planner/index.mjs +0 -6
  300. package/esm/ai/src/planner/plan-prompt.mjs +0 -31
  301. package/esm/ai/src/planner/plan-prompt.mjs.map +0 -1
  302. package/esm/ai/src/planner/plan-schema.mjs +0 -120
  303. package/esm/ai/src/planner/plan-schema.mjs.map +0 -1
  304. package/esm/ai/src/planner/planner-run.mjs +0 -769
  305. package/esm/ai/src/planner/planner-run.mjs.map +0 -1
  306. package/esm/ai/src/planner/planner.mjs +0 -144
  307. package/esm/ai/src/planner/planner.mjs.map +0 -1
  308. package/esm/ai/src/planner/signature.mjs +0 -27
  309. package/esm/ai/src/planner/signature.mjs.map +0 -1
  310. package/esm/ai/src/planner/snapshot.mjs +0 -95
  311. package/esm/ai/src/planner/snapshot.mjs.map +0 -1
  312. package/esm/ai/src/prompt/errors.mjs +0 -73
  313. package/esm/ai/src/prompt/errors.mjs.map +0 -1
  314. package/esm/ai/src/prompt/index.mjs +0 -4
  315. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs +0 -104
  316. package/esm/ai/src/prompt/prompt-langfuse-sync.mjs.map +0 -1
  317. package/esm/ai/src/prompt/prompt-validate.mjs +0 -170
  318. package/esm/ai/src/prompt/prompt-validate.mjs.map +0 -1
  319. package/esm/ai/src/prompt/prompt.mjs +0 -218
  320. package/esm/ai/src/prompt/prompt.mjs.map +0 -1
  321. package/esm/ai/src/prompts/index.mjs +0 -3
  322. package/esm/ai/src/prompts/prompts-manager.mjs +0 -410
  323. package/esm/ai/src/prompts/prompts-manager.mjs.map +0 -1
  324. package/esm/ai/src/prompts/prompts-validate.mjs +0 -0
  325. package/esm/ai/src/prompts/prompts-validate.mjs.map +0 -1
  326. package/esm/ai/src/rag/as-tool.mjs +0 -48
  327. package/esm/ai/src/rag/as-tool.mjs.map +0 -1
  328. package/esm/ai/src/rag/chunk/chunk.mjs +0 -44
  329. package/esm/ai/src/rag/chunk/chunk.mjs.map +0 -1
  330. package/esm/ai/src/rag/chunk/fixed.mjs +0 -32
  331. package/esm/ai/src/rag/chunk/fixed.mjs.map +0 -1
  332. package/esm/ai/src/rag/chunk/markdown.mjs +0 -75
  333. package/esm/ai/src/rag/chunk/markdown.mjs.map +0 -1
  334. package/esm/ai/src/rag/chunk/recursive.mjs +0 -132
  335. package/esm/ai/src/rag/chunk/recursive.mjs.map +0 -1
  336. package/esm/ai/src/rag/chunk/sentence.mjs +0 -73
  337. package/esm/ai/src/rag/chunk/sentence.mjs.map +0 -1
  338. package/esm/ai/src/rag/hybrid/bm25.mjs +0 -51
  339. package/esm/ai/src/rag/hybrid/bm25.mjs.map +0 -1
  340. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs +0 -29
  341. package/esm/ai/src/rag/hybrid/hybrid-rank.mjs.map +0 -1
  342. package/esm/ai/src/rag/hybrid/rrf.mjs +0 -30
  343. package/esm/ai/src/rag/hybrid/rrf.mjs.map +0 -1
  344. package/esm/ai/src/rag/index.mjs +0 -18
  345. package/esm/ai/src/rag/loaders/errors.mjs +0 -25
  346. package/esm/ai/src/rag/loaders/errors.mjs.map +0 -1
  347. package/esm/ai/src/rag/loaders/index.mjs +0 -7
  348. package/esm/ai/src/rag/loaders/load-html.mjs +0 -138
  349. package/esm/ai/src/rag/loaders/load-html.mjs.map +0 -1
  350. package/esm/ai/src/rag/loaders/load-pdf.mjs +0 -150
  351. package/esm/ai/src/rag/loaders/load-pdf.mjs.map +0 -1
  352. package/esm/ai/src/rag/loaders/load-text.mjs +0 -60
  353. package/esm/ai/src/rag/loaders/load-text.mjs.map +0 -1
  354. package/esm/ai/src/rag/loaders/load-web.mjs +0 -89
  355. package/esm/ai/src/rag/loaders/load-web.mjs.map +0 -1
  356. package/esm/ai/src/rag/rag.mjs +0 -126
  357. package/esm/ai/src/rag/rag.mjs.map +0 -1
  358. package/esm/ai/src/rag/rerank/keyword-reranker.mjs +0 -58
  359. package/esm/ai/src/rag/rerank/keyword-reranker.mjs.map +0 -1
  360. package/esm/ai/src/rag/rerank/llm-reranker.mjs +0 -85
  361. package/esm/ai/src/rag/rerank/llm-reranker.mjs.map +0 -1
  362. package/esm/ai/src/rag/retrieve.mjs +0 -68
  363. package/esm/ai/src/rag/retrieve.mjs.map +0 -1
  364. package/esm/ai/src/rag/store/cache-vector-store.mjs +0 -48
  365. package/esm/ai/src/rag/store/cache-vector-store.mjs.map +0 -1
  366. package/esm/ai/src/rag/store/pg-vector-store.mjs +0 -328
  367. package/esm/ai/src/rag/store/pg-vector-store.mjs.map +0 -1
  368. package/esm/ai/src/rag/transforms/multi-query.mjs +0 -41
  369. package/esm/ai/src/rag/transforms/multi-query.mjs.map +0 -1
  370. package/esm/ai/src/security/index.mjs +0 -5
  371. package/esm/ai/src/security/outbound-policy.mjs +0 -187
  372. package/esm/ai/src/security/outbound-policy.mjs.map +0 -1
  373. package/esm/ai/src/security/private-ip.mjs +0 -48
  374. package/esm/ai/src/security/private-ip.mjs.map +0 -1
  375. package/esm/ai/src/security/redact.mjs +0 -60
  376. package/esm/ai/src/security/redact.mjs.map +0 -1
  377. package/esm/ai/src/serve/serve.mjs +0 -90
  378. package/esm/ai/src/serve/serve.mjs.map +0 -1
  379. package/esm/ai/src/serve/sse.mjs +0 -25
  380. package/esm/ai/src/serve/sse.mjs.map +0 -1
  381. package/esm/ai/src/serve/stream-to-sse.mjs +0 -37
  382. package/esm/ai/src/serve/stream-to-sse.mjs.map +0 -1
  383. package/esm/ai/src/skills/catalog.mjs +0 -140
  384. package/esm/ai/src/skills/catalog.mjs.map +0 -1
  385. package/esm/ai/src/skills/index.mjs +0 -11
  386. package/esm/ai/src/skills/load-skill-tool.mjs +0 -65
  387. package/esm/ai/src/skills/load-skill-tool.mjs.map +0 -1
  388. package/esm/ai/src/skills/save-skill-tool.mjs +0 -65
  389. package/esm/ai/src/skills/save-skill-tool.mjs.map +0 -1
  390. package/esm/ai/src/skills/skills.mjs +0 -109
  391. package/esm/ai/src/skills/skills.mjs.map +0 -1
  392. package/esm/ai/src/skills/sources/directory-source.mjs +0 -108
  393. package/esm/ai/src/skills/sources/directory-source.mjs.map +0 -1
  394. package/esm/ai/src/skills/sources/index.mjs +0 -27
  395. package/esm/ai/src/skills/sources/index.mjs.map +0 -1
  396. package/esm/ai/src/skills/sources/parse-frontmatter.mjs +0 -46
  397. package/esm/ai/src/skills/sources/parse-frontmatter.mjs.map +0 -1
  398. package/esm/ai/src/skills/sources/store-source.mjs +0 -15
  399. package/esm/ai/src/skills/sources/store-source.mjs.map +0 -1
  400. package/esm/ai/src/skills/sources/url-source.mjs +0 -117
  401. package/esm/ai/src/skills/sources/url-source.mjs.map +0 -1
  402. package/esm/ai/src/snapshot/memory.mjs +0 -81
  403. package/esm/ai/src/snapshot/memory.mjs.map +0 -1
  404. package/esm/ai/src/snapshot/pg.mjs +0 -146
  405. package/esm/ai/src/snapshot/pg.mjs.map +0 -1
  406. package/esm/ai/src/snapshot/redis.mjs +0 -101
  407. package/esm/ai/src/snapshot/redis.mjs.map +0 -1
  408. package/esm/ai/src/speech/index.mjs +0 -3
  409. package/esm/ai/src/speech/speech.mjs +0 -122
  410. package/esm/ai/src/speech/speech.mjs.map +0 -1
  411. package/esm/ai/src/supervisor/as-tool.mjs +0 -74
  412. package/esm/ai/src/supervisor/as-tool.mjs.map +0 -1
  413. package/esm/ai/src/supervisor/cancellation.mjs +0 -22
  414. package/esm/ai/src/supervisor/cancellation.mjs.map +0 -1
  415. package/esm/ai/src/supervisor/decide.mjs +0 -272
  416. package/esm/ai/src/supervisor/decide.mjs.map +0 -1
  417. package/esm/ai/src/supervisor/emitter.mjs +0 -47
  418. package/esm/ai/src/supervisor/emitter.mjs.map +0 -1
  419. package/esm/ai/src/supervisor/entries.mjs +0 -206
  420. package/esm/ai/src/supervisor/entries.mjs.map +0 -1
  421. package/esm/ai/src/supervisor/execution.mjs +0 -1921
  422. package/esm/ai/src/supervisor/execution.mjs.map +0 -1
  423. package/esm/ai/src/supervisor/fan-out.mjs +0 -65
  424. package/esm/ai/src/supervisor/fan-out.mjs.map +0 -1
  425. package/esm/ai/src/supervisor/index.mjs +0 -14
  426. package/esm/ai/src/supervisor/router-factory.mjs +0 -141
  427. package/esm/ai/src/supervisor/router-factory.mjs.map +0 -1
  428. package/esm/ai/src/supervisor/router-prompt.mjs +0 -52
  429. package/esm/ai/src/supervisor/router-prompt.mjs.map +0 -1
  430. package/esm/ai/src/supervisor/signature.mjs +0 -89
  431. package/esm/ai/src/supervisor/signature.mjs.map +0 -1
  432. package/esm/ai/src/supervisor/snapshot.mjs +0 -69
  433. package/esm/ai/src/supervisor/snapshot.mjs.map +0 -1
  434. package/esm/ai/src/supervisor/supervisor-stream.mjs +0 -89
  435. package/esm/ai/src/supervisor/supervisor-stream.mjs.map +0 -1
  436. package/esm/ai/src/supervisor/supervisor.mjs +0 -144
  437. package/esm/ai/src/supervisor/supervisor.mjs.map +0 -1
  438. package/esm/ai/src/system-prompt/index.mjs +0 -7
  439. package/esm/ai/src/system-prompt/instruction.mjs +0 -57
  440. package/esm/ai/src/system-prompt/instruction.mjs.map +0 -1
  441. package/esm/ai/src/system-prompt/persona.mjs +0 -57
  442. package/esm/ai/src/system-prompt/persona.mjs.map +0 -1
  443. package/esm/ai/src/system-prompt/refined-system-prompt.mjs +0 -461
  444. package/esm/ai/src/system-prompt/refined-system-prompt.mjs.map +0 -1
  445. package/esm/ai/src/system-prompt/render-placeholders.mjs +0 -58
  446. package/esm/ai/src/system-prompt/render-placeholders.mjs.map +0 -1
  447. package/esm/ai/src/system-prompt/system-prompt.mjs +0 -286
  448. package/esm/ai/src/system-prompt/system-prompt.mjs.map +0 -1
  449. package/esm/ai/src/team/gates.mjs +0 -48
  450. package/esm/ai/src/team/gates.mjs.map +0 -1
  451. package/esm/ai/src/team/index.mjs +0 -3
  452. package/esm/ai/src/team/team.mjs +0 -94
  453. package/esm/ai/src/team/team.mjs.map +0 -1
  454. package/esm/ai/src/tool/executable-as-tool.mjs +0 -81
  455. package/esm/ai/src/tool/executable-as-tool.mjs.map +0 -1
  456. package/esm/ai/src/tool/index.mjs +0 -4
  457. package/esm/ai/src/tool/tool.mjs +0 -185
  458. package/esm/ai/src/tool/tool.mjs.map +0 -1
  459. package/esm/ai/src/transcribe/audio-input.mjs +0 -84
  460. package/esm/ai/src/transcribe/audio-input.mjs.map +0 -1
  461. package/esm/ai/src/transcribe/index.mjs +0 -4
  462. package/esm/ai/src/transcribe/transcribe.mjs +0 -127
  463. package/esm/ai/src/transcribe/transcribe.mjs.map +0 -1
  464. package/esm/ai/src/utils/compute-cost.mjs +0 -112
  465. package/esm/ai/src/utils/compute-cost.mjs.map +0 -1
  466. package/esm/ai/src/utils/extract-json-lenient.mjs +0 -97
  467. package/esm/ai/src/utils/extract-json-lenient.mjs.map +0 -1
  468. package/esm/ai/src/utils/extract-json-payload.mjs +0 -39
  469. package/esm/ai/src/utils/extract-json-payload.mjs.map +0 -1
  470. package/esm/ai/src/utils/generate-run-id.mjs +0 -23
  471. package/esm/ai/src/utils/generate-run-id.mjs.map +0 -1
  472. package/esm/ai/src/utils/index.mjs +0 -12
  473. package/esm/ai/src/utils/json-schema.mjs +0 -89
  474. package/esm/ai/src/utils/json-schema.mjs.map +0 -1
  475. package/esm/ai/src/utils/prepare-attachment-part.mjs +0 -232
  476. package/esm/ai/src/utils/prepare-attachment-part.mjs.map +0 -1
  477. package/esm/ai/src/utils/resolve-attachment.mjs +0 -74
  478. package/esm/ai/src/utils/resolve-attachment.mjs.map +0 -1
  479. package/esm/ai/src/utils/run-context.mjs +0 -89
  480. package/esm/ai/src/utils/run-context.mjs.map +0 -1
  481. package/esm/ai/src/utils/safe-json-parse.mjs +0 -22
  482. package/esm/ai/src/utils/safe-json-parse.mjs.map +0 -1
  483. package/esm/ai/src/utils/stamp-report-lineage.mjs +0 -45
  484. package/esm/ai/src/utils/stamp-report-lineage.mjs.map +0 -1
  485. package/esm/ai/src/vcr/cassette-io.mjs +0 -57
  486. package/esm/ai/src/vcr/cassette-io.mjs.map +0 -1
  487. package/esm/ai/src/vcr/errors.mjs +0 -37
  488. package/esm/ai/src/vcr/errors.mjs.map +0 -1
  489. package/esm/ai/src/vcr/hash-request.mjs +0 -118
  490. package/esm/ai/src/vcr/hash-request.mjs.map +0 -1
  491. package/esm/ai/src/vcr/index.mjs +0 -5
  492. package/esm/ai/src/vcr/vcr.mjs +0 -248
  493. package/esm/ai/src/vcr/vcr.mjs.map +0 -1
  494. package/esm/ai/src/workflow/as-tool.mjs +0 -49
  495. package/esm/ai/src/workflow/as-tool.mjs.map +0 -1
  496. package/esm/ai/src/workflow/cancellation.mjs +0 -44
  497. package/esm/ai/src/workflow/cancellation.mjs.map +0 -1
  498. package/esm/ai/src/workflow/emitter.mjs +0 -40
  499. package/esm/ai/src/workflow/emitter.mjs.map +0 -1
  500. package/esm/ai/src/workflow/engine.mjs +0 -363
  501. package/esm/ai/src/workflow/engine.mjs.map +0 -1
  502. package/esm/ai/src/workflow/index.mjs +0 -5
  503. package/esm/ai/src/workflow/retry.mjs +0 -32
  504. package/esm/ai/src/workflow/retry.mjs.map +0 -1
  505. package/esm/ai/src/workflow/router.mjs +0 -56
  506. package/esm/ai/src/workflow/router.mjs.map +0 -1
  507. package/esm/ai/src/workflow/run-scoped-emitter.mjs +0 -32
  508. package/esm/ai/src/workflow/run-scoped-emitter.mjs.map +0 -1
  509. package/esm/ai/src/workflow/signature.mjs +0 -34
  510. package/esm/ai/src/workflow/signature.mjs.map +0 -1
  511. package/esm/ai/src/workflow/snapshot.mjs +0 -77
  512. package/esm/ai/src/workflow/snapshot.mjs.map +0 -1
  513. package/esm/ai/src/workflow/state.mjs +0 -37
  514. package/esm/ai/src/workflow/state.mjs.map +0 -1
  515. package/esm/ai/src/workflow/step-runner.mjs +0 -370
  516. package/esm/ai/src/workflow/step-runner.mjs.map +0 -1
  517. package/esm/ai/src/workflow/step.mjs +0 -37
  518. package/esm/ai/src/workflow/step.mjs.map +0 -1
  519. package/esm/ai/src/workflow/workflow.mjs +0 -122
  520. package/esm/ai/src/workflow/workflow.mjs.map +0 -1
  521. package/esm/ai-openai/src/embedder.mjs +0 -4
  522. package/esm/ai-openai/src/image.mjs +0 -5
  523. package/esm/ai-openai/src/index.mjs +0 -7
  524. package/esm/ai-openai/src/model.mjs +0 -5
  525. package/esm/ai-openai/src/sdk.mjs +0 -9
  526. package/esm/ai-openai/src/speech.mjs +0 -5
  527. package/esm/ai-openai/src/transcription.mjs +0 -6
  528. package/esm/ai-openai/src/utils/index.mjs +0 -5
  529. package/esm/ai-openai/src/utils/to-openai-messages.mjs +0 -3
  530. package/esm/ai-openai/src/utils/to-openai-tools.mjs +0 -3
  531. package/esm/ai-openai/src/utils/wrap-openai-error.mjs +0 -4
  532. package/esm/node_modules/langfuse/lib/index.mjs +0 -1827
  533. package/esm/node_modules/langfuse/lib/index.mjs.map +0 -1
  534. package/esm/node_modules/langfuse-core/lib/index.mjs +0 -1770
  535. package/esm/node_modules/langfuse-core/lib/index.mjs.map +0 -1
  536. package/esm/node_modules/mustache/mustache.mjs +0 -587
  537. package/esm/node_modules/mustache/mustache.mjs.map +0 -1
  538. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs +0 -180
  539. package/esm/node_modules/openai/_vendor/partial-json-parser/parser.mjs.map +0 -1
  540. package/esm/node_modules/openai/auth/workload-identity-auth.mjs +0 -80
  541. package/esm/node_modules/openai/auth/workload-identity-auth.mjs.map +0 -1
  542. package/esm/node_modules/openai/azure.mjs +0 -82
  543. package/esm/node_modules/openai/azure.mjs.map +0 -1
  544. package/esm/node_modules/openai/client.mjs +0 -638
  545. package/esm/node_modules/openai/client.mjs.map +0 -1
  546. package/esm/node_modules/openai/core/api-promise.mjs +0 -75
  547. package/esm/node_modules/openai/core/api-promise.mjs.map +0 -1
  548. package/esm/node_modules/openai/core/error.mjs +0 -110
  549. package/esm/node_modules/openai/core/error.mjs.map +0 -1
  550. package/esm/node_modules/openai/core/pagination.mjs +0 -160
  551. package/esm/node_modules/openai/core/pagination.mjs.map +0 -1
  552. package/esm/node_modules/openai/core/resource.mjs +0 -10
  553. package/esm/node_modules/openai/core/resource.mjs.map +0 -1
  554. package/esm/node_modules/openai/core/streaming.mjs +0 -238
  555. package/esm/node_modules/openai/core/streaming.mjs.map +0 -1
  556. package/esm/node_modules/openai/index.mjs +0 -8
  557. package/esm/node_modules/openai/internal/decoders/line.mjs +0 -91
  558. package/esm/node_modules/openai/internal/decoders/line.mjs.map +0 -1
  559. package/esm/node_modules/openai/internal/detect-platform.mjs +0 -123
  560. package/esm/node_modules/openai/internal/detect-platform.mjs.map +0 -1
  561. package/esm/node_modules/openai/internal/errors.mjs +0 -26
  562. package/esm/node_modules/openai/internal/errors.mjs.map +0 -1
  563. package/esm/node_modules/openai/internal/headers.mjs +0 -65
  564. package/esm/node_modules/openai/internal/headers.mjs.map +0 -1
  565. package/esm/node_modules/openai/internal/parse.mjs +0 -41
  566. package/esm/node_modules/openai/internal/parse.mjs.map +0 -1
  567. package/esm/node_modules/openai/internal/qs/formats.mjs +0 -12
  568. package/esm/node_modules/openai/internal/qs/formats.mjs.map +0 -1
  569. package/esm/node_modules/openai/internal/qs/stringify.mjs +0 -179
  570. package/esm/node_modules/openai/internal/qs/stringify.mjs.map +0 -1
  571. package/esm/node_modules/openai/internal/qs/utils.mjs +0 -65
  572. package/esm/node_modules/openai/internal/qs/utils.mjs.map +0 -1
  573. package/esm/node_modules/openai/internal/request-options.mjs +0 -11
  574. package/esm/node_modules/openai/internal/request-options.mjs.map +0 -1
  575. package/esm/node_modules/openai/internal/shims.mjs +0 -77
  576. package/esm/node_modules/openai/internal/shims.mjs.map +0 -1
  577. package/esm/node_modules/openai/internal/to-file.mjs +0 -63
  578. package/esm/node_modules/openai/internal/to-file.mjs.map +0 -1
  579. package/esm/node_modules/openai/internal/tslib.mjs +0 -16
  580. package/esm/node_modules/openai/internal/tslib.mjs.map +0 -1
  581. package/esm/node_modules/openai/internal/uploads.mjs +0 -94
  582. package/esm/node_modules/openai/internal/uploads.mjs.map +0 -1
  583. package/esm/node_modules/openai/internal/utils/base64.mjs +0 -22
  584. package/esm/node_modules/openai/internal/utils/base64.mjs.map +0 -1
  585. package/esm/node_modules/openai/internal/utils/bytes.mjs +0 -26
  586. package/esm/node_modules/openai/internal/utils/bytes.mjs.map +0 -1
  587. package/esm/node_modules/openai/internal/utils/env.mjs +0 -16
  588. package/esm/node_modules/openai/internal/utils/env.mjs.map +0 -1
  589. package/esm/node_modules/openai/internal/utils/log.mjs +0 -58
  590. package/esm/node_modules/openai/internal/utils/log.mjs.map +0 -1
  591. package/esm/node_modules/openai/internal/utils/path.mjs +0 -62
  592. package/esm/node_modules/openai/internal/utils/path.mjs.map +0 -1
  593. package/esm/node_modules/openai/internal/utils/query.mjs +0 -10
  594. package/esm/node_modules/openai/internal/utils/query.mjs.map +0 -1
  595. package/esm/node_modules/openai/internal/utils/sleep.mjs +0 -6
  596. package/esm/node_modules/openai/internal/utils/sleep.mjs.map +0 -1
  597. package/esm/node_modules/openai/internal/utils/uuid.mjs +0 -18
  598. package/esm/node_modules/openai/internal/utils/uuid.mjs.map +0 -1
  599. package/esm/node_modules/openai/internal/utils/values.mjs +0 -41
  600. package/esm/node_modules/openai/internal/utils/values.mjs.map +0 -1
  601. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs +0 -247
  602. package/esm/node_modules/openai/lib/AbstractChatCompletionRunner.mjs.map +0 -1
  603. package/esm/node_modules/openai/lib/AssistantStream.mjs +0 -472
  604. package/esm/node_modules/openai/lib/AssistantStream.mjs.map +0 -1
  605. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs +0 -26
  606. package/esm/node_modules/openai/lib/ChatCompletionRunner.mjs.map +0 -1
  607. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs +0 -423
  608. package/esm/node_modules/openai/lib/ChatCompletionStream.mjs.map +0 -1
  609. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs +0 -26
  610. package/esm/node_modules/openai/lib/ChatCompletionStreamingRunner.mjs.map +0 -1
  611. package/esm/node_modules/openai/lib/EventStream.mjs +0 -163
  612. package/esm/node_modules/openai/lib/EventStream.mjs.map +0 -1
  613. package/esm/node_modules/openai/lib/ResponsesParser.mjs +0 -94
  614. package/esm/node_modules/openai/lib/ResponsesParser.mjs.map +0 -1
  615. package/esm/node_modules/openai/lib/RunnableFunction.mjs +0 -8
  616. package/esm/node_modules/openai/lib/RunnableFunction.mjs.map +0 -1
  617. package/esm/node_modules/openai/lib/Util.mjs +0 -19
  618. package/esm/node_modules/openai/lib/Util.mjs.map +0 -1
  619. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs +0 -11
  620. package/esm/node_modules/openai/lib/chatCompletionUtils.mjs.map +0 -1
  621. package/esm/node_modules/openai/lib/parser.mjs +0 -88
  622. package/esm/node_modules/openai/lib/parser.mjs.map +0 -1
  623. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs +0 -231
  624. package/esm/node_modules/openai/lib/responses/ResponseStream.mjs.map +0 -1
  625. package/esm/node_modules/openai/resources/admin/admin.mjs +0 -15
  626. package/esm/node_modules/openai/resources/admin/admin.mjs.map +0 -1
  627. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs +0 -81
  628. package/esm/node_modules/openai/resources/admin/organization/admin-api-keys.mjs.map +0 -1
  629. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs +0 -31
  630. package/esm/node_modules/openai/resources/admin/organization/audit-logs.mjs.map +0 -1
  631. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs +0 -153
  632. package/esm/node_modules/openai/resources/admin/organization/certificates.mjs.map +0 -1
  633. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs +0 -42
  634. package/esm/node_modules/openai/resources/admin/organization/data-retention.mjs.map +0 -1
  635. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs +0 -106
  636. package/esm/node_modules/openai/resources/admin/organization/groups/groups.mjs.map +0 -1
  637. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs +0 -88
  638. package/esm/node_modules/openai/resources/admin/organization/groups/roles.mjs.map +0 -1
  639. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs +0 -88
  640. package/esm/node_modules/openai/resources/admin/organization/groups/users.mjs.map +0 -1
  641. package/esm/node_modules/openai/resources/admin/organization/invites.mjs +0 -83
  642. package/esm/node_modules/openai/resources/admin/organization/invites.mjs.map +0 -1
  643. package/esm/node_modules/openai/resources/admin/organization/organization.mjs +0 -45
  644. package/esm/node_modules/openai/resources/admin/organization/organization.mjs.map +0 -1
  645. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs +0 -72
  646. package/esm/node_modules/openai/resources/admin/organization/projects/api-keys.mjs.map +0 -1
  647. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs +0 -78
  648. package/esm/node_modules/openai/resources/admin/organization/projects/certificates.mjs.map +0 -1
  649. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs +0 -46
  650. package/esm/node_modules/openai/resources/admin/organization/projects/data-retention.mjs.map +0 -1
  651. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs +0 -95
  652. package/esm/node_modules/openai/resources/admin/organization/projects/groups/groups.mjs.map +0 -1
  653. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs +0 -91
  654. package/esm/node_modules/openai/resources/admin/organization/projects/groups/roles.mjs.map +0 -1
  655. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs +0 -45
  656. package/esm/node_modules/openai/resources/admin/organization/projects/hosted-tool-permissions.mjs.map +0 -1
  657. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs +0 -63
  658. package/esm/node_modules/openai/resources/admin/organization/projects/model-permissions.mjs.map +0 -1
  659. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs +0 -137
  660. package/esm/node_modules/openai/resources/admin/organization/projects/projects.mjs.map +0 -1
  661. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs +0 -51
  662. package/esm/node_modules/openai/resources/admin/organization/projects/rate-limits.mjs.map +0 -1
  663. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs +0 -108
  664. package/esm/node_modules/openai/resources/admin/organization/projects/roles.mjs.map +0 -1
  665. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs +0 -112
  666. package/esm/node_modules/openai/resources/admin/organization/projects/service-accounts.mjs.map +0 -1
  667. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs +0 -106
  668. package/esm/node_modules/openai/resources/admin/organization/projects/spend-alerts.mjs.map +0 -1
  669. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs +0 -91
  670. package/esm/node_modules/openai/resources/admin/organization/projects/users/roles.mjs.map +0 -1
  671. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs +0 -118
  672. package/esm/node_modules/openai/resources/admin/organization/projects/users/users.mjs.map +0 -1
  673. package/esm/node_modules/openai/resources/admin/organization/roles.mjs +0 -96
  674. package/esm/node_modules/openai/resources/admin/organization/roles.mjs.map +0 -1
  675. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs +0 -97
  676. package/esm/node_modules/openai/resources/admin/organization/spend-alerts.mjs.map +0 -1
  677. package/esm/node_modules/openai/resources/admin/organization/usage.mjs +0 -207
  678. package/esm/node_modules/openai/resources/admin/organization/usage.mjs.map +0 -1
  679. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs +0 -88
  680. package/esm/node_modules/openai/resources/admin/organization/users/roles.mjs.map +0 -1
  681. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs +0 -82
  682. package/esm/node_modules/openai/resources/admin/organization/users/users.mjs.map +0 -1
  683. package/esm/node_modules/openai/resources/audio/audio.mjs +0 -21
  684. package/esm/node_modules/openai/resources/audio/audio.mjs.map +0 -1
  685. package/esm/node_modules/openai/resources/audio/speech.mjs +0 -39
  686. package/esm/node_modules/openai/resources/audio/speech.mjs.map +0 -1
  687. package/esm/node_modules/openai/resources/audio/transcriptions.mjs +0 -22
  688. package/esm/node_modules/openai/resources/audio/transcriptions.mjs.map +0 -1
  689. package/esm/node_modules/openai/resources/audio/translations.mjs +0 -21
  690. package/esm/node_modules/openai/resources/audio/translations.mjs.map +0 -1
  691. package/esm/node_modules/openai/resources/batches.mjs +0 -54
  692. package/esm/node_modules/openai/resources/batches.mjs.map +0 -1
  693. package/esm/node_modules/openai/resources/beta/assistants.mjs +0 -78
  694. package/esm/node_modules/openai/resources/beta/assistants.mjs.map +0 -1
  695. package/esm/node_modules/openai/resources/beta/beta.mjs +0 -24
  696. package/esm/node_modules/openai/resources/beta/beta.mjs.map +0 -1
  697. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs +0 -18
  698. package/esm/node_modules/openai/resources/beta/chatkit/chatkit.mjs.map +0 -1
  699. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs +0 -49
  700. package/esm/node_modules/openai/resources/beta/chatkit/sessions.mjs.map +0 -1
  701. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs +0 -85
  702. package/esm/node_modules/openai/resources/beta/chatkit/threads.mjs.map +0 -1
  703. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs +0 -21
  704. package/esm/node_modules/openai/resources/beta/realtime/realtime.mjs.map +0 -1
  705. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs +0 -33
  706. package/esm/node_modules/openai/resources/beta/realtime/sessions.mjs.map +0 -1
  707. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs +0 -33
  708. package/esm/node_modules/openai/resources/beta/realtime/transcription-sessions.mjs.map +0 -1
  709. package/esm/node_modules/openai/resources/beta/threads/messages.mjs +0 -83
  710. package/esm/node_modules/openai/resources/beta/threads/messages.mjs.map +0 -1
  711. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs +0 -183
  712. package/esm/node_modules/openai/resources/beta/threads/runs/runs.mjs.map +0 -1
  713. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs +0 -45
  714. package/esm/node_modules/openai/resources/beta/threads/runs/steps.mjs.map +0 -1
  715. package/esm/node_modules/openai/resources/beta/threads/threads.mjs +0 -101
  716. package/esm/node_modules/openai/resources/beta/threads/threads.mjs.map +0 -1
  717. package/esm/node_modules/openai/resources/chat/chat.mjs +0 -15
  718. package/esm/node_modules/openai/resources/chat/chat.mjs.map +0 -1
  719. package/esm/node_modules/openai/resources/chat/completions/completions.mjs +0 -123
  720. package/esm/node_modules/openai/resources/chat/completions/completions.mjs.map +0 -1
  721. package/esm/node_modules/openai/resources/chat/completions/index.mjs +0 -7
  722. package/esm/node_modules/openai/resources/chat/completions/messages.mjs +0 -35
  723. package/esm/node_modules/openai/resources/chat/completions/messages.mjs.map +0 -1
  724. package/esm/node_modules/openai/resources/chat/index.mjs +0 -5
  725. package/esm/node_modules/openai/resources/completions.mjs +0 -20
  726. package/esm/node_modules/openai/resources/completions.mjs.map +0 -1
  727. package/esm/node_modules/openai/resources/containers/containers.mjs +0 -57
  728. package/esm/node_modules/openai/resources/containers/containers.mjs.map +0 -1
  729. package/esm/node_modules/openai/resources/containers/files/content.mjs +0 -23
  730. package/esm/node_modules/openai/resources/containers/files/content.mjs.map +0 -1
  731. package/esm/node_modules/openai/resources/containers/files/files.mjs +0 -63
  732. package/esm/node_modules/openai/resources/containers/files/files.mjs.map +0 -1
  733. package/esm/node_modules/openai/resources/conversations/conversations.mjs +0 -57
  734. package/esm/node_modules/openai/resources/conversations/conversations.mjs.map +0 -1
  735. package/esm/node_modules/openai/resources/conversations/items.mjs +0 -57
  736. package/esm/node_modules/openai/resources/conversations/items.mjs.map +0 -1
  737. package/esm/node_modules/openai/resources/embeddings.mjs +0 -48
  738. package/esm/node_modules/openai/resources/embeddings.mjs.map +0 -1
  739. package/esm/node_modules/openai/resources/evals/evals.mjs +0 -73
  740. package/esm/node_modules/openai/resources/evals/evals.mjs.map +0 -1
  741. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs +0 -35
  742. package/esm/node_modules/openai/resources/evals/runs/output-items.mjs.map +0 -1
  743. package/esm/node_modules/openai/resources/evals/runs/runs.mjs +0 -72
  744. package/esm/node_modules/openai/resources/evals/runs/runs.mjs.map +0 -1
  745. package/esm/node_modules/openai/resources/files.mjs +0 -111
  746. package/esm/node_modules/openai/resources/files.mjs.map +0 -1
  747. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs +0 -15
  748. package/esm/node_modules/openai/resources/fine-tuning/alpha/alpha.mjs.map +0 -1
  749. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs +0 -60
  750. package/esm/node_modules/openai/resources/fine-tuning/alpha/graders.mjs.map +0 -1
  751. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs +0 -15
  752. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/checkpoints.mjs.map +0 -1
  753. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs +0 -102
  754. package/esm/node_modules/openai/resources/fine-tuning/checkpoints/permissions.mjs.map +0 -1
  755. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs +0 -24
  756. package/esm/node_modules/openai/resources/fine-tuning/fine-tuning.mjs.map +0 -1
  757. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs +0 -34
  758. package/esm/node_modules/openai/resources/fine-tuning/jobs/checkpoints.mjs.map +0 -1
  759. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs +0 -148
  760. package/esm/node_modules/openai/resources/fine-tuning/jobs/jobs.mjs.map +0 -1
  761. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs +0 -8
  762. package/esm/node_modules/openai/resources/fine-tuning/methods.mjs.map +0 -1
  763. package/esm/node_modules/openai/resources/graders/grader-models.mjs +0 -8
  764. package/esm/node_modules/openai/resources/graders/grader-models.mjs.map +0 -1
  765. package/esm/node_modules/openai/resources/graders/graders.mjs +0 -15
  766. package/esm/node_modules/openai/resources/graders/graders.mjs.map +0 -1
  767. package/esm/node_modules/openai/resources/images.mjs +0 -46
  768. package/esm/node_modules/openai/resources/images.mjs.map +0 -1
  769. package/esm/node_modules/openai/resources/index.mjs +0 -27
  770. package/esm/node_modules/openai/resources/models.mjs +0 -44
  771. package/esm/node_modules/openai/resources/models.mjs.map +0 -1
  772. package/esm/node_modules/openai/resources/moderations.mjs +0 -23
  773. package/esm/node_modules/openai/resources/moderations.mjs.map +0 -1
  774. package/esm/node_modules/openai/resources/realtime/calls.mjs +0 -79
  775. package/esm/node_modules/openai/resources/realtime/calls.mjs.map +0 -1
  776. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs +0 -39
  777. package/esm/node_modules/openai/resources/realtime/client-secrets.mjs.map +0 -1
  778. package/esm/node_modules/openai/resources/realtime/realtime.mjs +0 -18
  779. package/esm/node_modules/openai/resources/realtime/realtime.mjs.map +0 -1
  780. package/esm/node_modules/openai/resources/responses/input-items.mjs +0 -31
  781. package/esm/node_modules/openai/resources/responses/input-items.mjs.map +0 -1
  782. package/esm/node_modules/openai/resources/responses/input-tokens.mjs +0 -27
  783. package/esm/node_modules/openai/resources/responses/input-tokens.mjs.map +0 -1
  784. package/esm/node_modules/openai/resources/responses/responses.mjs +0 -110
  785. package/esm/node_modules/openai/resources/responses/responses.mjs.map +0 -1
  786. package/esm/node_modules/openai/resources/skills/content.mjs +0 -22
  787. package/esm/node_modules/openai/resources/skills/content.mjs.map +0 -1
  788. package/esm/node_modules/openai/resources/skills/skills.mjs +0 -69
  789. package/esm/node_modules/openai/resources/skills/skills.mjs.map +0 -1
  790. package/esm/node_modules/openai/resources/skills/versions/content.mjs +0 -23
  791. package/esm/node_modules/openai/resources/skills/versions/content.mjs.map +0 -1
  792. package/esm/node_modules/openai/resources/skills/versions/versions.mjs +0 -58
  793. package/esm/node_modules/openai/resources/skills/versions/versions.mjs.map +0 -1
  794. package/esm/node_modules/openai/resources/uploads/parts.mjs +0 -34
  795. package/esm/node_modules/openai/resources/uploads/parts.mjs.map +0 -1
  796. package/esm/node_modules/openai/resources/uploads/uploads.mjs +0 -84
  797. package/esm/node_modules/openai/resources/uploads/uploads.mjs.map +0 -1
  798. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs +0 -126
  799. package/esm/node_modules/openai/resources/vector-stores/file-batches.mjs.map +0 -1
  800. package/esm/node_modules/openai/resources/vector-stores/files.mjs +0 -147
  801. package/esm/node_modules/openai/resources/vector-stores/files.mjs.map +0 -1
  802. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs +0 -87
  803. package/esm/node_modules/openai/resources/vector-stores/vector-stores.mjs.map +0 -1
  804. package/esm/node_modules/openai/resources/videos.mjs +0 -115
  805. package/esm/node_modules/openai/resources/videos.mjs.map +0 -1
  806. package/esm/node_modules/openai/resources/webhooks/index.mjs +0 -3
  807. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs +0 -69
  808. package/esm/node_modules/openai/resources/webhooks/webhooks.mjs.map +0 -1
  809. package/esm/node_modules/openai/resources/webhooks.mjs +0 -4
  810. package/esm/node_modules/openai/streaming.mjs +0 -3
  811. package/esm/node_modules/openai/version.mjs +0 -6
  812. package/esm/node_modules/openai/version.mjs.map +0 -1
@@ -1,37 +0,0 @@
1
- import { SSE_DONE, encodeSSE } from "./sse.mjs";
2
-
3
- //#region ../@warlock.js/ai/src/serve/stream-to-sse.ts
4
- /**
5
- * Convert a primitive's event stream into an SSE byte stream (A3): each
6
- * event becomes an SSE frame named by its `type`, then the final `result`
7
- * (or an `error` frame if it rejects) is emitted, and finally the
8
- * `[DONE]` sentinel. Pure and transport-agnostic — {@link serve} pipes it
9
- * to an HTTP response, but it works against any sink.
10
- *
11
- * @example
12
- * for await (const frame of streamToSSE(agent.stream("hi"))) {
13
- * res.write(frame);
14
- * }
15
- */
16
- async function* streamToSSE(stream) {
17
- for await (const event of stream) yield encodeSSE({
18
- event: event.type,
19
- data: event
20
- });
21
- if (stream.result) try {
22
- yield encodeSSE({
23
- event: "result",
24
- data: await stream.result
25
- });
26
- } catch (error) {
27
- yield encodeSSE({
28
- event: "error",
29
- data: { message: error instanceof Error ? error.message : String(error) }
30
- });
31
- }
32
- yield SSE_DONE;
33
- }
34
-
35
- //#endregion
36
- export { streamToSSE };
37
- //# sourceMappingURL=stream-to-sse.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"stream-to-sse.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/serve/stream-to-sse.ts"],"sourcesContent":["import { encodeSSE, SSE_DONE } from \"./sse\";\n\n/**\n * A streamable execution: an async iterable of typed events that also\n * exposes the final `result` promise — exactly the shape every primitive's\n * `stream()` returns ({@link StreamContract}).\n */\nexport type StreamLike<TEvent extends { type: string }, TResult> =\n AsyncIterable<TEvent> & { result?: Promise<TResult> };\n\n/**\n * Convert a primitive's event stream into an SSE byte stream (A3): each\n * event becomes an SSE frame named by its `type`, then the final `result`\n * (or an `error` frame if it rejects) is emitted, and finally the\n * `[DONE]` sentinel. Pure and transport-agnostic — {@link serve} pipes it\n * to an HTTP response, but it works against any sink.\n *\n * @example\n * for await (const frame of streamToSSE(agent.stream(\"hi\"))) {\n * res.write(frame);\n * }\n */\nexport async function* streamToSSE<TEvent extends { type: string }, TResult>(\n stream: StreamLike<TEvent, TResult>,\n): AsyncIterable<string> {\n for await (const event of stream) {\n yield encodeSSE({ event: event.type, data: event });\n }\n\n if (stream.result) {\n try {\n const result = await stream.result;\n yield encodeSSE({ event: \"result\", data: result });\n } catch (error) {\n yield encodeSSE({\n event: \"error\",\n data: { message: error instanceof Error ? error.message : String(error) },\n });\n }\n }\n\n yield SSE_DONE;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAsBA,gBAAuB,YACrB,QACuB;CACvB,WAAW,MAAM,SAAS,QACxB,MAAM,UAAU;EAAE,OAAO,MAAM;EAAM,MAAM;CAAM,CAAC;CAGpD,IAAI,OAAO,QACT,IAAI;EAEF,MAAM,UAAU;GAAE,OAAO;GAAU,MAAM,MADpB,OAAO;EACoB,CAAC;CACnD,SAAS,OAAO;EACd,MAAM,UAAU;GACd,OAAO;GACP,MAAM,EAAE,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;EAC1E,CAAC;CACH;CAGF,MAAM;AACR"}
@@ -1,140 +0,0 @@
1
- //#region ../@warlock.js/ai/src/skills/catalog.ts
2
- let isEmbedderPeerInstalled = null;
3
- let loadingPromise;
4
- const EMBEDDER_INSTALL_INSTRUCTIONS = `
5
- Semantic skill pre-injection ({ inject: { select: "semantic" } }) needs an
6
- embedder. Pass one explicitly (reuse the one you built for ai.memory()):
7
-
8
- skills({ inject: { select: "semantic", topK: 2, embedder } })
9
-
10
- or install an embedder provider:
11
-
12
- npm install @warlock.js/ai-openai
13
-
14
- Or with your preferred package manager:
15
-
16
- pnpm add @warlock.js/ai-openai
17
- yarn add @warlock.js/ai-openai
18
-
19
- Then build one with \`new OpenAIEmbedder(client, { name: "text-embedding-3-small" })\`
20
- and pass it via \`inject.embedder\`.
21
- `.trim();
22
- /**
23
- * Probe for an installed embedder provider once, concurrency-safe. A bare
24
- * `catch` flips the flag to `false`; the curated install string surfaces
25
- * at use time. The provider's embedder needs a constructed SDK client, so
26
- * we cannot auto-build one — the probe only decides whether the curated
27
- * message should mention installing the package vs. just passing one in.
28
- */
29
- function probeEmbedderPeer() {
30
- if (isEmbedderPeerInstalled !== null) return Promise.resolve();
31
- if (loadingPromise) return loadingPromise;
32
- loadingPromise = (async () => {
33
- try {
34
- await import("../../../ai-openai/src/index.mjs");
35
- isEmbedderPeerInstalled = true;
36
- } catch {
37
- isEmbedderPeerInstalled = false;
38
- }
39
- })();
40
- return loadingPromise;
41
- }
42
- /**
43
- * Resolve the embedder for semantic selection. The explicit
44
- * `inject.embedder` always wins. With none supplied, the lazy probe runs
45
- * and the curated install string is thrown at use time — a provider's
46
- * embedder requires a constructed client, so there is no safe auto-build.
47
- */
48
- async function resolveEmbedder(explicit) {
49
- if (explicit) return explicit;
50
- probeEmbedderPeer();
51
- throw new Error(EMBEDDER_INSTALL_INSTRUCTIONS);
52
- }
53
- /**
54
- * Merge every source's `list()` into one de-duplicated catalog. Sources
55
- * are merged in order; a LATER source wins on a name collision (explicit,
56
- * documented precedence). Candidates are already filtered by each store's
57
- * `list()`, so the merged catalog never carries an inert candidate.
58
- */
59
- async function buildCatalog(stores, scope) {
60
- const merged = /* @__PURE__ */ new Map();
61
- for (const store of stores) {
62
- const entries = await store.list(scope);
63
- for (const entry of entries) merged.set(entry.name, entry);
64
- }
65
- return [...merged.values()];
66
- }
67
- /**
68
- * Render the catalog as one line per skill — `name`, `version`,
69
- * `description` — matching the projection `scripts/generate-llms.mjs`
70
- * emits for `llms.txt` so the runtime catalog and the docs index read
71
- * identically. Returns an empty string when no skills are in scope so the
72
- * agent prepends nothing.
73
- */
74
- function renderCatalogPrompt(name, entries) {
75
- if (entries.length === 0) return "";
76
- const lines = entries.map((entry) => `- ${entry.name} (v${entry.version}): ${entry.description}`);
77
- return [
78
- `# Available skills — "${name}"`,
79
- "",
80
- "You can load any of the following skills on demand with the `loadSkill` tool to pull its full instructions into context:",
81
- "",
82
- ...lines
83
- ].join("\n");
84
- }
85
- /**
86
- * Load the full record for `name` across the merged sources, honoring the
87
- * later-source-wins precedence: the FIRST store (iterating in reverse) to
88
- * return a hit owns the name. A pinned `version` narrows the lookup.
89
- * Returns `undefined` when no source has the skill.
90
- */
91
- async function loadRecord(stores, name, version) {
92
- for (let index = stores.length - 1; index >= 0; index--) {
93
- const record = await stores[index].load(name, version);
94
- if (record) return record;
95
- }
96
- }
97
- /**
98
- * Rank the in-scope catalog by cosine similarity to `input` and return the
99
- * full `SkillRecord`s for the top `topK` clearing `threshold`.
100
- *
101
- * Embeds `input` and every catalog `description` via the resolved
102
- * embedder (explicit `inject.embedder`, else the lazy provider), scores by
103
- * cosine similarity, sorts descending, applies the optional floor, slices
104
- * to `topK`, then loads those bodies. The embedder is the only optional
105
- * dependency this whole feature carries.
106
- */
107
- async function semanticPreselect(stores, input, topK, options = {}) {
108
- const catalog = await buildCatalog(stores, options.scope);
109
- if (catalog.length === 0 || topK <= 0) return [];
110
- const { vectors } = await (await resolveEmbedder(options.embedder)).embedMany([input, ...catalog.map((entry) => entry.description)]);
111
- const inputVector = vectors[0];
112
- const threshold = options.threshold ?? 0;
113
- const scored = catalog.map((entry, index) => ({
114
- entry,
115
- score: cosineSimilarity(inputVector, vectors[index + 1])
116
- })).filter((candidate) => candidate.score >= threshold).sort((first, second) => second.score - first.score).slice(0, topK);
117
- const records = [];
118
- for (const candidate of scored) {
119
- const record = await loadRecord(stores, candidate.entry.name, candidate.entry.version);
120
- if (record) records.push(record);
121
- }
122
- return records;
123
- }
124
- /** Cosine similarity of two equal-length vectors; `0` when either is degenerate. */
125
- function cosineSimilarity(a, b) {
126
- let dot = 0;
127
- let normA = 0;
128
- let normB = 0;
129
- for (let index = 0; index < a.length; index++) {
130
- dot += a[index] * b[index];
131
- normA += a[index] * a[index];
132
- normB += b[index] * b[index];
133
- }
134
- if (normA === 0 || normB === 0) return 0;
135
- return dot / (Math.sqrt(normA) * Math.sqrt(normB));
136
- }
137
-
138
- //#endregion
139
- export { buildCatalog, loadRecord, renderCatalogPrompt, semanticPreselect };
140
- //# sourceMappingURL=catalog.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalog.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/skills/catalog.ts"],"sourcesContent":["import type { EmbedderContract } from \"../contracts/embedder.contract\";\nimport type {\n SkillCatalogEntry,\n SkillRecord,\n} from \"./contracts/skill-record.type\";\nimport type { SkillsStoreContract } from \"./contracts/skills-store.contract\";\n\n// ============================================================\n// Optional embedder (OPTIONAL peer)\n// ============================================================\n//\n// The embedder is needed ONLY for `inject.select === \"semantic\"`. It is\n// passed explicitly via `inject.embedder` in the common case (consumers\n// reuse the one they built for `ai.memory()`). When a consumer relies on\n// an auto-resolved embedder instead, the canonical lazy-peer probe below\n// surfaces a curated install string at USE TIME (first semantic preload)\n// rather than a raw module-resolution stack trace. Catalog-only /\n// loadSkill-only usage never touches this path.\n\nlet isEmbedderPeerInstalled: boolean | null = null;\nlet loadingPromise: Promise<void> | undefined;\n\nconst EMBEDDER_INSTALL_INSTRUCTIONS = `\nSemantic skill pre-injection ({ inject: { select: \"semantic\" } }) needs an\nembedder. Pass one explicitly (reuse the one you built for ai.memory()):\n\n skills({ inject: { select: \"semantic\", topK: 2, embedder } })\n\nor install an embedder provider:\n\n npm install @warlock.js/ai-openai\n\nOr with your preferred package manager:\n\n pnpm add @warlock.js/ai-openai\n yarn add @warlock.js/ai-openai\n\nThen build one with \\`new OpenAIEmbedder(client, { name: \"text-embedding-3-small\" })\\`\nand pass it via \\`inject.embedder\\`.\n`.trim();\n\n/**\n * Probe for an installed embedder provider once, concurrency-safe. A bare\n * `catch` flips the flag to `false`; the curated install string surfaces\n * at use time. The provider's embedder needs a constructed SDK client, so\n * we cannot auto-build one — the probe only decides whether the curated\n * message should mention installing the package vs. just passing one in.\n */\nfunction probeEmbedderPeer(): Promise<void> {\n if (isEmbedderPeerInstalled !== null) {\n return Promise.resolve();\n }\n\n if (loadingPromise) {\n return loadingPromise;\n }\n\n loadingPromise = (async () => {\n try {\n await import(\"@warlock.js/ai-openai\");\n isEmbedderPeerInstalled = true;\n } catch {\n isEmbedderPeerInstalled = false;\n }\n })();\n\n return loadingPromise;\n}\n\n/**\n * Resolve the embedder for semantic selection. The explicit\n * `inject.embedder` always wins. With none supplied, the lazy probe runs\n * and the curated install string is thrown at use time — a provider's\n * embedder requires a constructed client, so there is no safe auto-build.\n */\nasync function resolveEmbedder(explicit?: EmbedderContract): Promise<EmbedderContract> {\n if (explicit) {\n return explicit;\n }\n\n // Warm the peer probe non-blockingly (so a future explicit call can hint\n // whether to install vs. just pass one in) but do NOT await it — a\n // provider's embedder needs a constructed client, so there is no safe\n // auto-build either way and the throw is immediate.\n void probeEmbedderPeer();\n\n throw new Error(EMBEDDER_INSTALL_INSTRUCTIONS);\n}\n\n/**\n * Merge every source's `list()` into one de-duplicated catalog. Sources\n * are merged in order; a LATER source wins on a name collision (explicit,\n * documented precedence). Candidates are already filtered by each store's\n * `list()`, so the merged catalog never carries an inert candidate.\n */\nexport async function buildCatalog(\n stores: SkillsStoreContract[],\n scope?: { tags?: string[] },\n): Promise<SkillCatalogEntry[]> {\n const merged = new Map<string, SkillCatalogEntry>();\n\n for (const store of stores) {\n const entries = await store.list(scope);\n\n for (const entry of entries) {\n merged.set(entry.name, entry);\n }\n }\n\n return [...merged.values()];\n}\n\n/**\n * Render the catalog as one line per skill — `name`, `version`,\n * `description` — matching the projection `scripts/generate-llms.mjs`\n * emits for `llms.txt` so the runtime catalog and the docs index read\n * identically. Returns an empty string when no skills are in scope so the\n * agent prepends nothing.\n */\nexport function renderCatalogPrompt(name: string, entries: SkillCatalogEntry[]): string {\n if (entries.length === 0) {\n return \"\";\n }\n\n const lines = entries.map(\n (entry) => `- ${entry.name} (v${entry.version}): ${entry.description}`,\n );\n\n return [\n `# Available skills — \"${name}\"`,\n \"\",\n \"You can load any of the following skills on demand with the `loadSkill` tool to pull its full instructions into context:\",\n \"\",\n ...lines,\n ].join(\"\\n\");\n}\n\n/**\n * Load the full record for `name` across the merged sources, honoring the\n * later-source-wins precedence: the FIRST store (iterating in reverse) to\n * return a hit owns the name. A pinned `version` narrows the lookup.\n * Returns `undefined` when no source has the skill.\n */\nexport async function loadRecord(\n stores: SkillsStoreContract[],\n name: string,\n version?: number,\n): Promise<SkillRecord | undefined> {\n for (let index = stores.length - 1; index >= 0; index--) {\n const record = await stores[index].load(name, version);\n\n if (record) {\n return record;\n }\n }\n\n return undefined;\n}\n\n/**\n * Rank the in-scope catalog by cosine similarity to `input` and return the\n * full `SkillRecord`s for the top `topK` clearing `threshold`.\n *\n * Embeds `input` and every catalog `description` via the resolved\n * embedder (explicit `inject.embedder`, else the lazy provider), scores by\n * cosine similarity, sorts descending, applies the optional floor, slices\n * to `topK`, then loads those bodies. The embedder is the only optional\n * dependency this whole feature carries.\n */\nexport async function semanticPreselect(\n stores: SkillsStoreContract[],\n input: string,\n topK: number,\n options: { embedder?: EmbedderContract; threshold?: number; scope?: { tags?: string[] } } = {},\n): Promise<SkillRecord[]> {\n const catalog = await buildCatalog(stores, options.scope);\n\n if (catalog.length === 0 || topK <= 0) {\n return [];\n }\n\n const embedder = await resolveEmbedder(options.embedder);\n\n const { vectors } = await embedder.embedMany([\n input,\n ...catalog.map((entry) => entry.description),\n ]);\n\n const inputVector = vectors[0];\n const threshold = options.threshold ?? 0;\n\n const scored = catalog\n .map((entry, index) => ({\n entry,\n score: cosineSimilarity(inputVector, vectors[index + 1]),\n }))\n .filter((candidate) => candidate.score >= threshold)\n .sort((first, second) => second.score - first.score)\n .slice(0, topK);\n\n const records: SkillRecord[] = [];\n\n for (const candidate of scored) {\n const record = await loadRecord(stores, candidate.entry.name, candidate.entry.version);\n\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n}\n\n/** Cosine similarity of two equal-length vectors; `0` when either is degenerate. */\nfunction cosineSimilarity(a: number[], b: number[]): number {\n let dot = 0;\n let normA = 0;\n let normB = 0;\n\n for (let index = 0; index < a.length; index++) {\n dot += a[index] * b[index];\n normA += a[index] * a[index];\n normB += b[index] * b[index];\n }\n\n if (normA === 0 || normB === 0) {\n return 0;\n }\n\n return dot / (Math.sqrt(normA) * Math.sqrt(normB));\n}\n"],"mappings":";AAmBA,IAAI,0BAA0C;AAC9C,IAAI;AAEJ,MAAM,gCAAgC;;;;;;;;;;;;;;;;;EAiBpC,KAAK;;;;;;;;AASP,SAAS,oBAAmC;CAC1C,IAAI,4BAA4B,MAC9B,OAAO,QAAQ,QAAQ;CAGzB,IAAI,gBACF,OAAO;CAGT,kBAAkB,YAAY;EAC5B,IAAI;GACF,MAAM,OAAO;GACb,0BAA0B;EAC5B,QAAQ;GACN,0BAA0B;EAC5B;CACF,EAAC,CAAE;CAEH,OAAO;AACT;;;;;;;AAQA,eAAe,gBAAgB,UAAwD;CACrF,IAAI,UACF,OAAO;CAOT,AAAK,kBAAkB;CAEvB,MAAM,IAAI,MAAM,6BAA6B;AAC/C;;;;;;;AAQA,eAAsB,aACpB,QACA,OAC8B;CAC9B,MAAM,yBAAS,IAAI,IAA+B;CAElD,KAAK,MAAM,SAAS,QAAQ;EAC1B,MAAM,UAAU,MAAM,MAAM,KAAK,KAAK;EAEtC,KAAK,MAAM,SAAS,SAClB,OAAO,IAAI,MAAM,MAAM,KAAK;CAEhC;CAEA,OAAO,CAAC,GAAG,OAAO,OAAO,CAAC;AAC5B;;;;;;;;AASA,SAAgB,oBAAoB,MAAc,SAAsC;CACtF,IAAI,QAAQ,WAAW,GACrB,OAAO;CAGT,MAAM,QAAQ,QAAQ,KACnB,UAAU,KAAK,MAAM,KAAK,KAAK,MAAM,QAAQ,KAAK,MAAM,aAC3D;CAEA,OAAO;EACL,yBAAyB,KAAK;EAC9B;EACA;EACA;EACA,GAAG;CACL,CAAC,CAAC,KAAK,IAAI;AACb;;;;;;;AAQA,eAAsB,WACpB,QACA,MACA,SACkC;CAClC,KAAK,IAAI,QAAQ,OAAO,SAAS,GAAG,SAAS,GAAG,SAAS;EACvD,MAAM,SAAS,MAAM,OAAO,MAAM,CAAC,KAAK,MAAM,OAAO;EAErD,IAAI,QACF,OAAO;CAEX;AAGF;;;;;;;;;;;AAYA,eAAsB,kBACpB,QACA,OACA,MACA,UAA4F,CAAC,GACrE;CACxB,MAAM,UAAU,MAAM,aAAa,QAAQ,QAAQ,KAAK;CAExD,IAAI,QAAQ,WAAW,KAAK,QAAQ,GAClC,OAAO,CAAC;CAKV,MAAM,EAAE,YAAY,OAAM,MAFH,gBAAgB,QAAQ,QAAQ,EAErB,CAAC,UAAU,CAC3C,OACA,GAAG,QAAQ,KAAK,UAAU,MAAM,WAAW,CAC7C,CAAC;CAED,MAAM,cAAc,QAAQ;CAC5B,MAAM,YAAY,QAAQ,aAAa;CAEvC,MAAM,SAAS,QACZ,KAAK,OAAO,WAAW;EACtB;EACA,OAAO,iBAAiB,aAAa,QAAQ,QAAQ,EAAE;CACzD,EAAE,CAAC,CACF,QAAQ,cAAc,UAAU,SAAS,SAAS,CAAC,CACnD,MAAM,OAAO,WAAW,OAAO,QAAQ,MAAM,KAAK,CAAC,CACnD,MAAM,GAAG,IAAI;CAEhB,MAAM,UAAyB,CAAC;CAEhC,KAAK,MAAM,aAAa,QAAQ;EAC9B,MAAM,SAAS,MAAM,WAAW,QAAQ,UAAU,MAAM,MAAM,UAAU,MAAM,OAAO;EAErF,IAAI,QACF,QAAQ,KAAK,MAAM;CAEvB;CAEA,OAAO;AACT;;AAGA,SAAS,iBAAiB,GAAa,GAAqB;CAC1D,IAAI,MAAM;CACV,IAAI,QAAQ;CACZ,IAAI,QAAQ;CAEZ,KAAK,IAAI,QAAQ,GAAG,QAAQ,EAAE,QAAQ,SAAS;EAC7C,OAAO,EAAE,SAAS,EAAE;EACpB,SAAS,EAAE,SAAS,EAAE;EACtB,SAAS,EAAE,SAAS,EAAE;CACxB;CAEA,IAAI,UAAU,KAAK,UAAU,GAC3B,OAAO;CAGT,OAAO,OAAO,KAAK,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK;AAClD"}
@@ -1,11 +0,0 @@
1
- import { buildCatalog, loadRecord, renderCatalogPrompt, semanticPreselect } from "./catalog.mjs";
2
- import { loadSkillTool } from "./load-skill-tool.mjs";
3
- import { saveSkillTool } from "./save-skill-tool.mjs";
4
- import { parseFrontmatter, parseTags } from "./sources/parse-frontmatter.mjs";
5
- import { directorySource } from "./sources/directory-source.mjs";
6
- import { storeSource } from "./sources/store-source.mjs";
7
- import { urlSource } from "./sources/url-source.mjs";
8
- import { resolveSource } from "./sources/index.mjs";
9
- import { skills } from "./skills.mjs";
10
-
11
- export { };
@@ -1,65 +0,0 @@
1
- import { tool } from "../tool/tool.mjs";
2
-
3
- //#region ../@warlock.js/ai/src/skills/load-skill-tool.ts
4
- /**
5
- * Hand-built, schema-library-agnostic Standard Schema for
6
- * `{ name: string; version?: number }` — built without `seal` / `zod` so
7
- * the skills feature stays dependency-free, matching the framework's own
8
- * `ragToolSchema` style. Bad shapes return `{ issues }` so the tool
9
- * runtime surfaces a `SchemaValidationError` like any other tool.
10
- */
11
- function loadSkillSchema() {
12
- return { "~standard": {
13
- version: 1,
14
- vendor: "warlock-ai-skills",
15
- validate: (value) => {
16
- const candidate = value;
17
- if (!candidate || typeof candidate.name !== "string") return { issues: [{ message: "loadSkill input must be { name: string; version?: number }" }] };
18
- if (candidate.version !== void 0 && typeof candidate.version !== "number") return { issues: [{ message: "loadSkill `version` must be a number when provided" }] };
19
- return { value: {
20
- name: candidate.name,
21
- ...candidate.version !== void 0 ? { version: candidate.version } : {}
22
- } };
23
- }
24
- } };
25
- }
26
- /**
27
- * Build the `loadSkill` tool for one run. Returns the skill **body** as
28
- * the tool result, which the agent loop feeds straight back to the model
29
- * (the standard `role:"tool"` message path) — making the loaded procedure
30
- * visible on the next trip.
31
- *
32
- * The per-run counter is closed over here (one tool instance per run), so
33
- * the budget is naturally scoped to this execution:
34
- * - Past `maxLoadsPerRun` ⇒ returns `{ error: "skill load budget exhausted" }`
35
- * as a RESULT, never a throw — the model self-corrects, exactly how the
36
- * agent loop treats any tool error.
37
- * - Unknown skill (`load` ⇒ undefined) ⇒ `{ error: "unknown skill: <name>" }`.
38
- *
39
- * `execute` itself never throws — both failure modes are error results, so
40
- * the run continues.
41
- */
42
- function loadSkillTool(deps) {
43
- let loads = 0;
44
- return tool({
45
- name: "loadSkill",
46
- description: "Load the full instructions of a named skill from the catalog into context. Call it with the skill's `name` (and optional `version`) when you need its detailed procedure.",
47
- input: loadSkillSchema(),
48
- execute: async ({ name, version }) => {
49
- if (loads >= deps.maxLoadsPerRun) return { error: "skill load budget exhausted" };
50
- loads += 1;
51
- const record = await deps.load(name, version);
52
- if (!record) return { error: `unknown skill: ${name}` };
53
- deps.onLoaded?.(record);
54
- return {
55
- body: record.body,
56
- name: record.name,
57
- version: record.version
58
- };
59
- }
60
- });
61
- }
62
-
63
- //#endregion
64
- export { loadSkillTool };
65
- //# sourceMappingURL=load-skill-tool.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"load-skill-tool.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/skills/load-skill-tool.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { tool } from \"../tool/tool\";\nimport type {\n LoadSkillInput,\n SkillRecord,\n} from \"./contracts/skill-record.type\";\n\n/** Result the `loadSkill` tool feeds back to the model. */\nexport type LoadSkillResult =\n | { body: string; name: string; version: number }\n | { error: string };\n\n/**\n * Hand-built, schema-library-agnostic Standard Schema for\n * `{ name: string; version?: number }` — built without `seal` / `zod` so\n * the skills feature stays dependency-free, matching the framework's own\n * `ragToolSchema` style. Bad shapes return `{ issues }` so the tool\n * runtime surfaces a `SchemaValidationError` like any other tool.\n */\nfunction loadSkillSchema(): StandardSchemaV1<LoadSkillInput> {\n return {\n \"~standard\": {\n version: 1,\n vendor: \"warlock-ai-skills\",\n validate: (value: unknown) => {\n const candidate = value as { name?: unknown; version?: unknown } | null;\n\n if (!candidate || typeof candidate.name !== \"string\") {\n return { issues: [{ message: \"loadSkill input must be { name: string; version?: number }\" }] };\n }\n\n if (candidate.version !== undefined && typeof candidate.version !== \"number\") {\n return { issues: [{ message: \"loadSkill `version` must be a number when provided\" }] };\n }\n\n return {\n value: {\n name: candidate.name,\n ...(candidate.version !== undefined ? { version: candidate.version } : {}),\n },\n };\n },\n },\n };\n}\n\n/** Dependencies the `loadSkill` tool closes over — kept narrow for testing. */\nexport type LoadSkillToolDeps = {\n /** Resolve a skill's full record across the merged sources. */\n load: (name: string, version?: number) => Promise<SkillRecord | undefined>;\n /** Per-run budget cap on `loadSkill` calls (default 5, enforced by caller-supplied counter). */\n maxLoadsPerRun: number;\n /** Fired on each successful load (`type: \"loaded\"`); errors swallowed by the sink wrapper. */\n onLoaded?: (record: SkillRecord) => void;\n};\n\n/**\n * Build the `loadSkill` tool for one run. Returns the skill **body** as\n * the tool result, which the agent loop feeds straight back to the model\n * (the standard `role:\"tool\"` message path) — making the loaded procedure\n * visible on the next trip.\n *\n * The per-run counter is closed over here (one tool instance per run), so\n * the budget is naturally scoped to this execution:\n * - Past `maxLoadsPerRun` ⇒ returns `{ error: \"skill load budget exhausted\" }`\n * as a RESULT, never a throw — the model self-corrects, exactly how the\n * agent loop treats any tool error.\n * - Unknown skill (`load` ⇒ undefined) ⇒ `{ error: \"unknown skill: <name>\" }`.\n *\n * `execute` itself never throws — both failure modes are error results, so\n * the run continues.\n */\nexport function loadSkillTool(deps: LoadSkillToolDeps): ToolContract<LoadSkillInput, LoadSkillResult> {\n let loads = 0;\n\n return tool<LoadSkillInput, LoadSkillResult>({\n name: \"loadSkill\",\n description:\n \"Load the full instructions of a named skill from the catalog into context. Call it with the skill's `name` (and optional `version`) when you need its detailed procedure.\",\n input: loadSkillSchema(),\n execute: async ({ name, version }) => {\n if (loads >= deps.maxLoadsPerRun) {\n return { error: \"skill load budget exhausted\" };\n }\n\n loads += 1;\n\n const record = await deps.load(name, version);\n\n if (!record) {\n return { error: `unknown skill: ${name}` };\n }\n\n deps.onLoaded?.(record);\n\n return { body: record.body, name: record.name, version: record.version };\n },\n });\n}\n"],"mappings":";;;;;;;;;;AAoBA,SAAS,kBAAoD;CAC3D,OAAO,EACL,aAAa;EACX,SAAS;EACT,QAAQ;EACR,WAAW,UAAmB;GAC5B,MAAM,YAAY;GAElB,IAAI,CAAC,aAAa,OAAO,UAAU,SAAS,UAC1C,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,6DAA6D,CAAC,EAAE;GAG/F,IAAI,UAAU,YAAY,UAAa,OAAO,UAAU,YAAY,UAClE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,qDAAqD,CAAC,EAAE;GAGvF,OAAO,EACL,OAAO;IACL,MAAM,UAAU;IAChB,GAAI,UAAU,YAAY,SAAY,EAAE,SAAS,UAAU,QAAQ,IAAI,CAAC;GAC1E,EACF;EACF;CACF,EACF;AACF;;;;;;;;;;;;;;;;;AA4BA,SAAgB,cAAc,MAAwE;CACpG,IAAI,QAAQ;CAEZ,OAAO,KAAsC;EAC3C,MAAM;EACN,aACE;EACF,OAAO,gBAAgB;EACvB,SAAS,OAAO,EAAE,MAAM,cAAc;GACpC,IAAI,SAAS,KAAK,gBAChB,OAAO,EAAE,OAAO,8BAA8B;GAGhD,SAAS;GAET,MAAM,SAAS,MAAM,KAAK,KAAK,MAAM,OAAO;GAE5C,IAAI,CAAC,QACH,OAAO,EAAE,OAAO,kBAAkB,OAAO;GAG3C,KAAK,WAAW,MAAM;GAEtB,OAAO;IAAE,MAAM,OAAO;IAAM,MAAM,OAAO;IAAM,SAAS,OAAO;GAAQ;EACzE;CACF,CAAC;AACH"}
@@ -1,65 +0,0 @@
1
- import { tool } from "../tool/tool.mjs";
2
-
3
- //#region ../@warlock.js/ai/src/skills/save-skill-tool.ts
4
- /**
5
- * Hand-built Standard Schema for the `saveSkill` input — dependency-free,
6
- * mirroring `loadSkillSchema`. Requires `name` / `description` / `body`;
7
- * `tags` is an optional string array.
8
- */
9
- function saveSkillSchema() {
10
- return { "~standard": {
11
- version: 1,
12
- vendor: "warlock-ai-skills",
13
- validate: (value) => {
14
- const candidate = value;
15
- if (!candidate || typeof candidate.name !== "string" || typeof candidate.description !== "string" || typeof candidate.body !== "string") return { issues: [{ message: "saveSkill input must be { name: string; description: string; body: string; tags?: string[] }" }] };
16
- if (candidate.tags !== void 0 && (!Array.isArray(candidate.tags) || !candidate.tags.every((tag) => typeof tag === "string"))) return { issues: [{ message: "saveSkill `tags` must be a string[] when provided" }] };
17
- return { value: {
18
- name: candidate.name,
19
- description: candidate.description,
20
- body: candidate.body,
21
- ...candidate.tags !== void 0 ? { tags: candidate.tags } : {}
22
- } };
23
- }
24
- } };
25
- }
26
- /**
27
- * Build the **Phase 2** `saveSkill` tool — exposed ONLY when a `review`
28
- * gate is configured. It writes an INERT `type: "candidate"` record via
29
- * `saveCandidate`. A candidate is filtered out of the catalog and from
30
- * preload — it can NEVER be injected until the default-DENY review gate
31
- * promotes it. So `saveSkill` alone can never turn the model's own output
32
- * into an injected instruction; promotion is a separate, gated step.
33
- *
34
- * `execute` never throws — a store write failure surfaces as an error
35
- * result so the run continues.
36
- */
37
- function saveSkillTool(deps) {
38
- return tool({
39
- name: "saveSkill",
40
- description: "Propose a new reusable skill. The skill is saved as an INERT candidate and is NOT used until a reviewer approves it — it will not affect the current run.",
41
- input: saveSkillSchema(),
42
- execute: async (input) => {
43
- try {
44
- const record = await deps.saveCandidate({
45
- name: input.name,
46
- description: input.description,
47
- body: input.body,
48
- ...input.tags !== void 0 ? { tags: input.tags } : {}
49
- });
50
- deps.onSaved?.(record);
51
- return {
52
- saved: true,
53
- name: record.name,
54
- status: "candidate"
55
- };
56
- } catch (error) {
57
- return { error: error instanceof Error ? error.message : String(error) };
58
- }
59
- }
60
- });
61
- }
62
-
63
- //#endregion
64
- export { saveSkillTool };
65
- //# sourceMappingURL=save-skill-tool.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"save-skill-tool.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/skills/save-skill-tool.ts"],"sourcesContent":["import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type { ToolContract } from \"../tool/tool\";\nimport { tool } from \"../tool/tool\";\nimport type { SkillRecord } from \"./contracts/skill-record.type\";\n\n/** Validated input of the `saveSkill` tool. */\nexport type SaveSkillInput = {\n name: string;\n description: string;\n body: string;\n tags?: string[];\n};\n\n/** Result the `saveSkill` tool feeds back to the model. */\nexport type SaveSkillResult =\n | { saved: true; name: string; status: \"candidate\" }\n | { error: string };\n\n/**\n * Hand-built Standard Schema for the `saveSkill` input — dependency-free,\n * mirroring `loadSkillSchema`. Requires `name` / `description` / `body`;\n * `tags` is an optional string array.\n */\nfunction saveSkillSchema(): StandardSchemaV1<SaveSkillInput> {\n return {\n \"~standard\": {\n version: 1,\n vendor: \"warlock-ai-skills\",\n validate: (value: unknown) => {\n const candidate = value as\n | { name?: unknown; description?: unknown; body?: unknown; tags?: unknown }\n | null;\n\n if (\n !candidate ||\n typeof candidate.name !== \"string\" ||\n typeof candidate.description !== \"string\" ||\n typeof candidate.body !== \"string\"\n ) {\n return {\n issues: [\n {\n message:\n \"saveSkill input must be { name: string; description: string; body: string; tags?: string[] }\",\n },\n ],\n };\n }\n\n if (\n candidate.tags !== undefined &&\n (!Array.isArray(candidate.tags) ||\n !candidate.tags.every((tag) => typeof tag === \"string\"))\n ) {\n return { issues: [{ message: \"saveSkill `tags` must be a string[] when provided\" }] };\n }\n\n return {\n value: {\n name: candidate.name,\n description: candidate.description,\n body: candidate.body,\n ...(candidate.tags !== undefined ? { tags: candidate.tags as string[] } : {}),\n },\n };\n },\n },\n };\n}\n\n/** Dependencies the `saveSkill` tool closes over. */\nexport type SaveSkillToolDeps = {\n /** Write an INERT candidate; the returned record is `type: \"candidate\"`. */\n saveCandidate: (record: Omit<SkillRecord, \"version\" | \"type\">) => Promise<SkillRecord>;\n /** Fired on a successful save (`type: \"saved\"`); errors swallowed by the sink wrapper. */\n onSaved?: (record: SkillRecord) => void;\n};\n\n/**\n * Build the **Phase 2** `saveSkill` tool — exposed ONLY when a `review`\n * gate is configured. It writes an INERT `type: \"candidate\"` record via\n * `saveCandidate`. A candidate is filtered out of the catalog and from\n * preload — it can NEVER be injected until the default-DENY review gate\n * promotes it. So `saveSkill` alone can never turn the model's own output\n * into an injected instruction; promotion is a separate, gated step.\n *\n * `execute` never throws — a store write failure surfaces as an error\n * result so the run continues.\n */\nexport function saveSkillTool(deps: SaveSkillToolDeps): ToolContract<SaveSkillInput, SaveSkillResult> {\n return tool<SaveSkillInput, SaveSkillResult>({\n name: \"saveSkill\",\n description:\n \"Propose a new reusable skill. The skill is saved as an INERT candidate and is NOT used until a reviewer approves it — it will not affect the current run.\",\n input: saveSkillSchema(),\n execute: async (input) => {\n try {\n const record = await deps.saveCandidate({\n name: input.name,\n description: input.description,\n body: input.body,\n ...(input.tags !== undefined ? { tags: input.tags } : {}),\n });\n\n deps.onSaved?.(record);\n\n return { saved: true, name: record.name, status: \"candidate\" };\n } catch (error) {\n return { error: error instanceof Error ? error.message : String(error) };\n }\n },\n });\n}\n"],"mappings":";;;;;;;;AAuBA,SAAS,kBAAoD;CAC3D,OAAO,EACL,aAAa;EACX,SAAS;EACT,QAAQ;EACR,WAAW,UAAmB;GAC5B,MAAM,YAAY;GAIlB,IACE,CAAC,aACD,OAAO,UAAU,SAAS,YAC1B,OAAO,UAAU,gBAAgB,YACjC,OAAO,UAAU,SAAS,UAE1B,OAAO,EACL,QAAQ,CACN,EACE,SACE,+FACJ,CACF,EACF;GAGF,IACE,UAAU,SAAS,WAClB,CAAC,MAAM,QAAQ,UAAU,IAAI,KAC5B,CAAC,UAAU,KAAK,OAAO,QAAQ,OAAO,QAAQ,QAAQ,IAExD,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS,oDAAoD,CAAC,EAAE;GAGtF,OAAO,EACL,OAAO;IACL,MAAM,UAAU;IAChB,aAAa,UAAU;IACvB,MAAM,UAAU;IAChB,GAAI,UAAU,SAAS,SAAY,EAAE,MAAM,UAAU,KAAiB,IAAI,CAAC;GAC7E,EACF;EACF;CACF,EACF;AACF;;;;;;;;;;;;AAqBA,SAAgB,cAAc,MAAwE;CACpG,OAAO,KAAsC;EAC3C,MAAM;EACN,aACE;EACF,OAAO,gBAAgB;EACvB,SAAS,OAAO,UAAU;GACxB,IAAI;IACF,MAAM,SAAS,MAAM,KAAK,cAAc;KACtC,MAAM,MAAM;KACZ,aAAa,MAAM;KACnB,MAAM,MAAM;KACZ,GAAI,MAAM,SAAS,SAAY,EAAE,MAAM,MAAM,KAAK,IAAI,CAAC;IACzD,CAAC;IAED,KAAK,UAAU,MAAM;IAErB,OAAO;KAAE,OAAO;KAAM,MAAM,OAAO;KAAM,QAAQ;IAAY;GAC/D,SAAS,OAAO;IACd,OAAO,EAAE,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,EAAE;GACzE;EACF;CACF,CAAC;AACH"}
@@ -1,109 +0,0 @@
1
- import { buildCatalog, loadRecord, renderCatalogPrompt, semanticPreselect } from "./catalog.mjs";
2
- import { loadSkillTool } from "./load-skill-tool.mjs";
3
- import { saveSkillTool } from "./save-skill-tool.mjs";
4
- import { resolveSource } from "./sources/index.mjs";
5
-
6
- //#region ../@warlock.js/ai/src/skills/skills.ts
7
- const DEFAULT_MAX_LOADS_PER_RUN = 5;
8
- /**
9
- * Create a runtime skills library — the **mechanism** behind the
10
- * first-class `skills` agent option.
11
- *
12
- * The returned {@link SkillsContract} produces the agent-facing wiring:
13
- * - `catalog` / `catalogPrompt` — the always-injected cheap metadata block
14
- * (one line per in-scope, non-candidate skill).
15
- * - `preload` — the bodies to inject up front per `inject` (`[]` when
16
- * `inject` is omitted — the default catalog-only progressive disclosure).
17
- * - `tools(runId)` — the `loadSkill` tool always; plus `saveSkill` ONLY
18
- * when a `review` gate is configured (otherwise self-authoring is inert).
19
- *
20
- * Sources are merged in order; a later source wins on a name collision.
21
- * `maxLoadsPerRun` (default 5) caps `loadSkill` calls per run; exhaustion
22
- * is an error RESULT the model self-corrects from, never a throw.
23
- *
24
- * @example
25
- * const lib = skills({
26
- * name: "build-skills",
27
- * sources: [{ type: "directory", path: "./agent-skills" }],
28
- * inject: { select: "semantic", topK: 2, embedder },
29
- * maxLoadsPerRun: 4,
30
- * scope: { tags: ["frontend"] },
31
- * });
32
- */
33
- function skills(config) {
34
- if (!config.sources || config.sources.length === 0) throw new Error(`skills("${config.name}"): at least one source is required (directory / url / store)`);
35
- const stores = config.sources.map(resolveSource);
36
- const scope = config.scope;
37
- const maxLoadsPerRun = config.maxLoadsPerRun ?? DEFAULT_MAX_LOADS_PER_RUN;
38
- const reviewExposed = config.review !== void 0;
39
- /** Fire an analytics event, swallowing any sink error (mirrors agent hooks). */
40
- const emit = (event) => {
41
- if (!config.analytics) return;
42
- try {
43
- Promise.resolve(config.analytics(event)).catch(() => void 0);
44
- } catch {}
45
- };
46
- const catalog = async () => {
47
- const entries = await buildCatalog(stores, scope);
48
- for (const entry of entries) emit({
49
- type: "catalogued",
50
- skill: entry.name,
51
- version: entry.version
52
- });
53
- return entries;
54
- };
55
- return {
56
- name: config.name,
57
- catalog,
58
- async catalogPrompt() {
59
- const entries = await catalog();
60
- return renderCatalogPrompt(config.name, entries);
61
- },
62
- async preload(input) {
63
- if (!config.inject) return [];
64
- if (config.inject === "all") {
65
- const entries = await buildCatalog(stores, scope);
66
- const records = [];
67
- for (const entry of entries) {
68
- const record = await loadRecord(stores, entry.name, entry.version);
69
- if (record) records.push(record);
70
- }
71
- return records;
72
- }
73
- return semanticPreselect(stores, input, config.inject.topK, {
74
- embedder: config.inject.embedder,
75
- threshold: config.inject.threshold,
76
- scope
77
- });
78
- },
79
- tools(runId) {
80
- const entries = [loadSkillTool({
81
- load: (name, version) => loadRecord(stores, name, version),
82
- maxLoadsPerRun,
83
- onLoaded: (record) => emit({
84
- type: "loaded",
85
- skill: record.name,
86
- version: record.version,
87
- runId
88
- })
89
- })];
90
- if (reviewExposed && config.review) {
91
- const reviewStore = config.review.store;
92
- entries.push(saveSkillTool({
93
- saveCandidate: (record) => reviewStore.saveCandidate(record),
94
- onSaved: (record) => emit({
95
- type: "saved",
96
- skill: record.name,
97
- version: record.version,
98
- runId
99
- })
100
- }));
101
- }
102
- return entries;
103
- }
104
- };
105
- }
106
-
107
- //#endregion
108
- export { skills };
109
- //# sourceMappingURL=skills.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"skills.mjs","names":[],"sources":["../../../../../../../../../@warlock.js/ai/src/skills/skills.ts"],"sourcesContent":["import type { AgentToolEntry } from \"../tool/executable-as-tool\";\nimport {\n buildCatalog,\n loadRecord,\n renderCatalogPrompt,\n semanticPreselect,\n} from \"./catalog\";\nimport type {\n SkillAnalyticsEvent,\n SkillsConfig,\n} from \"./contracts/skills-config.type\";\nimport type {\n SkillCatalogEntry,\n SkillRecord,\n} from \"./contracts/skill-record.type\";\nimport type { SkillsContract } from \"./contracts/skills.contract\";\nimport type { SkillsStoreContract } from \"./contracts/skills-store.contract\";\nimport { loadSkillTool } from \"./load-skill-tool\";\nimport { saveSkillTool } from \"./save-skill-tool\";\nimport { resolveSource } from \"./sources\";\n\nconst DEFAULT_MAX_LOADS_PER_RUN = 5;\n\n/**\n * Create a runtime skills library — the **mechanism** behind the\n * first-class `skills` agent option.\n *\n * The returned {@link SkillsContract} produces the agent-facing wiring:\n * - `catalog` / `catalogPrompt` — the always-injected cheap metadata block\n * (one line per in-scope, non-candidate skill).\n * - `preload` — the bodies to inject up front per `inject` (`[]` when\n * `inject` is omitted — the default catalog-only progressive disclosure).\n * - `tools(runId)` — the `loadSkill` tool always; plus `saveSkill` ONLY\n * when a `review` gate is configured (otherwise self-authoring is inert).\n *\n * Sources are merged in order; a later source wins on a name collision.\n * `maxLoadsPerRun` (default 5) caps `loadSkill` calls per run; exhaustion\n * is an error RESULT the model self-corrects from, never a throw.\n *\n * @example\n * const lib = skills({\n * name: \"build-skills\",\n * sources: [{ type: \"directory\", path: \"./agent-skills\" }],\n * inject: { select: \"semantic\", topK: 2, embedder },\n * maxLoadsPerRun: 4,\n * scope: { tags: [\"frontend\"] },\n * });\n */\nexport function skills(config: SkillsConfig): SkillsContract {\n if (!config.sources || config.sources.length === 0) {\n throw new Error(\n `skills(\"${config.name}\"): at least one source is required (directory / url / store)`,\n );\n }\n\n const stores: SkillsStoreContract[] = config.sources.map(resolveSource);\n const scope = config.scope;\n const maxLoadsPerRun = config.maxLoadsPerRun ?? DEFAULT_MAX_LOADS_PER_RUN;\n const reviewExposed = config.review !== undefined;\n\n /** Fire an analytics event, swallowing any sink error (mirrors agent hooks). */\n const emit = (event: SkillAnalyticsEvent): void => {\n if (!config.analytics) {\n return;\n }\n\n try {\n void Promise.resolve(config.analytics(event)).catch(() => undefined);\n } catch {\n // Sink threw synchronously — swallowed; analytics never crash a run.\n }\n };\n\n const catalog = async (): Promise<SkillCatalogEntry[]> => {\n const entries = await buildCatalog(stores, scope);\n\n for (const entry of entries) {\n emit({ type: \"catalogued\", skill: entry.name, version: entry.version });\n }\n\n return entries;\n };\n\n return {\n name: config.name,\n\n catalog,\n\n async catalogPrompt(): Promise<string> {\n const entries = await catalog();\n\n return renderCatalogPrompt(config.name, entries);\n },\n\n async preload(input: string): Promise<SkillRecord[]> {\n if (!config.inject) {\n return [];\n }\n\n if (config.inject === \"all\") {\n const entries = await buildCatalog(stores, scope);\n const records: SkillRecord[] = [];\n\n for (const entry of entries) {\n const record = await loadRecord(stores, entry.name, entry.version);\n\n if (record) {\n records.push(record);\n }\n }\n\n return records;\n }\n\n // `{ select: \"semantic\", topK }`\n return semanticPreselect(stores, input, config.inject.topK, {\n embedder: config.inject.embedder,\n threshold: config.inject.threshold,\n scope,\n });\n },\n\n tools(runId?: string): AgentToolEntry<any, any>[] {\n const entries: AgentToolEntry<any, any>[] = [\n loadSkillTool({\n load: (name, version) => loadRecord(stores, name, version),\n maxLoadsPerRun,\n onLoaded: (record) =>\n emit({ type: \"loaded\", skill: record.name, version: record.version, runId }),\n }),\n ];\n\n // Phase 2 — `saveSkill` is exposed ONLY when a review gate is wired.\n // Absent gate ⇒ self-authoring is inert: the tool is never registered\n // and a candidate can never be written, let alone injected.\n if (reviewExposed && config.review) {\n const reviewStore = config.review.store;\n\n entries.push(\n saveSkillTool({\n saveCandidate: (record) => reviewStore.saveCandidate(record),\n onSaved: (record) =>\n emit({ type: \"saved\", skill: record.name, version: record.version, runId }),\n }),\n );\n }\n\n return entries;\n },\n };\n}\n"],"mappings":";;;;;;AAqBA,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BlC,SAAgB,OAAO,QAAsC;CAC3D,IAAI,CAAC,OAAO,WAAW,OAAO,QAAQ,WAAW,GAC/C,MAAM,IAAI,MACR,WAAW,OAAO,KAAK,8DACzB;CAGF,MAAM,SAAgC,OAAO,QAAQ,IAAI,aAAa;CACtE,MAAM,QAAQ,OAAO;CACrB,MAAM,iBAAiB,OAAO,kBAAkB;CAChD,MAAM,gBAAgB,OAAO,WAAW;;CAGxC,MAAM,QAAQ,UAAqC;EACjD,IAAI,CAAC,OAAO,WACV;EAGF,IAAI;GACF,AAAK,QAAQ,QAAQ,OAAO,UAAU,KAAK,CAAC,CAAC,CAAC,YAAY,MAAS;EACrE,QAAQ,CAER;CACF;CAEA,MAAM,UAAU,YAA0C;EACxD,MAAM,UAAU,MAAM,aAAa,QAAQ,KAAK;EAEhD,KAAK,MAAM,SAAS,SAClB,KAAK;GAAE,MAAM;GAAc,OAAO,MAAM;GAAM,SAAS,MAAM;EAAQ,CAAC;EAGxE,OAAO;CACT;CAEA,OAAO;EACL,MAAM,OAAO;EAEb;EAEA,MAAM,gBAAiC;GACrC,MAAM,UAAU,MAAM,QAAQ;GAE9B,OAAO,oBAAoB,OAAO,MAAM,OAAO;EACjD;EAEA,MAAM,QAAQ,OAAuC;GACnD,IAAI,CAAC,OAAO,QACV,OAAO,CAAC;GAGV,IAAI,OAAO,WAAW,OAAO;IAC3B,MAAM,UAAU,MAAM,aAAa,QAAQ,KAAK;IAChD,MAAM,UAAyB,CAAC;IAEhC,KAAK,MAAM,SAAS,SAAS;KAC3B,MAAM,SAAS,MAAM,WAAW,QAAQ,MAAM,MAAM,MAAM,OAAO;KAEjE,IAAI,QACF,QAAQ,KAAK,MAAM;IAEvB;IAEA,OAAO;GACT;GAGA,OAAO,kBAAkB,QAAQ,OAAO,OAAO,OAAO,MAAM;IAC1D,UAAU,OAAO,OAAO;IACxB,WAAW,OAAO,OAAO;IACzB;GACF,CAAC;EACH;EAEA,MAAM,OAA4C;GAChD,MAAM,UAAsC,CAC1C,cAAc;IACZ,OAAO,MAAM,YAAY,WAAW,QAAQ,MAAM,OAAO;IACzD;IACA,WAAW,WACT,KAAK;KAAE,MAAM;KAAU,OAAO,OAAO;KAAM,SAAS,OAAO;KAAS;IAAM,CAAC;GAC/E,CAAC,CACH;GAKA,IAAI,iBAAiB,OAAO,QAAQ;IAClC,MAAM,cAAc,OAAO,OAAO;IAElC,QAAQ,KACN,cAAc;KACZ,gBAAgB,WAAW,YAAY,cAAc,MAAM;KAC3D,UAAU,WACR,KAAK;MAAE,MAAM;MAAS,OAAO,OAAO;MAAM,SAAS,OAAO;MAAS;KAAM,CAAC;IAC9E,CAAC,CACH;GACF;GAEA,OAAO;EACT;CACF;AACF"}
@@ -1,108 +0,0 @@
1
- import { parseFrontmatter, parseTags } from "./parse-frontmatter.mjs";
2
-
3
- //#region ../@warlock.js/ai/src/skills/sources/directory-source.ts
4
- /**
5
- * Lazily-loaded `node:fs/promises`. Core takes no new filesystem
6
- * dependency — a `store`-only or `url`-only consumer never touches the
7
- * filesystem because the module is imported on first read, not at module
8
- * load. Settled once and cached.
9
- */
10
- let fsMod;
11
- let pathMod;
12
- async function loadFs() {
13
- if (!fsMod) fsMod = await import("node:fs/promises");
14
- if (!pathMod) pathMod = await import("node:path");
15
- return {
16
- fs: fsMod,
17
- path: pathMod
18
- };
19
- }
20
- /**
21
- * Read `path/<folder>/SKILL.md` into {@link SkillRecord}s, parsing the
22
- * same `key: value` front-matter as `scripts/generate-llms.mjs`. Each
23
- * direct sub-directory holding a `SKILL.md` becomes one skill named after
24
- * the folder; the `description` comes from front-matter, `tags` from a
25
- * comma-separated `tags:` line, and the body is everything after the
26
- * closing `---`. Files at the root (e.g. `README.md`) are ignored.
27
- *
28
- * Reads are a snapshot at first call and cached for the source's lifetime
29
- * (a single agent run reads the catalog and bodies from one consistent
30
- * view). A missing directory yields an empty library, not a throw.
31
- */
32
- function directorySource(dirPath) {
33
- let cache;
34
- const records = () => {
35
- if (!cache) cache = readDirectory(dirPath);
36
- return cache;
37
- };
38
- return {
39
- async list(scope) {
40
- const all = await records();
41
- const wanted = scope?.tags;
42
- return [...all.values()].filter((record) => intersects(record.tags, wanted)).map(toCatalogEntry);
43
- },
44
- async load(name, version) {
45
- const record = (await records()).get(name);
46
- if (!record) return;
47
- if (version !== void 0 && record.version !== version) return;
48
- return record;
49
- },
50
- async saveCandidate() {
51
- throw new Error("directory source is read-only — saveCandidate requires a writable store (set `review.store`)");
52
- },
53
- async promote() {
54
- throw new Error("directory source is read-only — promote requires a writable store (set `review.store`)");
55
- }
56
- };
57
- }
58
- /** Walk the directory once, parsing every `<folder>/SKILL.md` into a record. */
59
- async function readDirectory(dirPath) {
60
- const { fs, path } = await loadFs();
61
- const records = /* @__PURE__ */ new Map();
62
- let entries;
63
- try {
64
- entries = await fs.readdir(dirPath, { withFileTypes: true });
65
- } catch {
66
- return records;
67
- }
68
- for (const entry of entries) {
69
- if (!entry.isDirectory()) continue;
70
- const skillFile = path.join(dirPath, entry.name, "SKILL.md");
71
- let text;
72
- try {
73
- text = await fs.readFile(skillFile, "utf8");
74
- } catch {
75
- continue;
76
- }
77
- const { meta, body } = parseFrontmatter(text);
78
- records.set(entry.name, {
79
- name: entry.name,
80
- description: meta.description ?? "(no description)",
81
- version: 1,
82
- body: body.trim(),
83
- tags: parseTags(meta.tags),
84
- type: "authored"
85
- });
86
- }
87
- return records;
88
- }
89
- /** Project a full record down to its catalog entry (body omitted). */
90
- function toCatalogEntry(record) {
91
- return {
92
- name: record.name,
93
- description: record.description,
94
- version: record.version,
95
- tags: record.tags,
96
- type: record.type
97
- };
98
- }
99
- /** True when no filter is requested or the record shares a requested tag. */
100
- function intersects(recordTags, wanted) {
101
- if (!wanted || wanted.length === 0) return true;
102
- if (!recordTags || recordTags.length === 0) return false;
103
- return recordTags.some((tag) => wanted.includes(tag));
104
- }
105
-
106
- //#endregion
107
- export { directorySource };
108
- //# sourceMappingURL=directory-source.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"directory-source.mjs","names":[],"sources":["../../../../../../../../../../@warlock.js/ai/src/skills/sources/directory-source.ts"],"sourcesContent":["import type {\n SkillCatalogEntry,\n SkillRecord,\n} from \"../contracts/skill-record.type\";\nimport type { SkillsStoreContract } from \"../contracts/skills-store.contract\";\nimport { parseFrontmatter, parseTags } from \"./parse-frontmatter\";\n\n/**\n * Lazily-loaded `node:fs/promises`. Core takes no new filesystem\n * dependency — a `store`-only or `url`-only consumer never touches the\n * filesystem because the module is imported on first read, not at module\n * load. Settled once and cached.\n */\nlet fsMod: typeof import(\"node:fs/promises\") | undefined;\nlet pathMod: typeof import(\"node:path\") | undefined;\n\nasync function loadFs(): Promise<{\n fs: typeof import(\"node:fs/promises\");\n path: typeof import(\"node:path\");\n}> {\n if (!fsMod) {\n fsMod = await import(\"node:fs/promises\");\n }\n\n if (!pathMod) {\n pathMod = await import(\"node:path\");\n }\n\n return { fs: fsMod, path: pathMod };\n}\n\n/**\n * Read `path/<folder>/SKILL.md` into {@link SkillRecord}s, parsing the\n * same `key: value` front-matter as `scripts/generate-llms.mjs`. Each\n * direct sub-directory holding a `SKILL.md` becomes one skill named after\n * the folder; the `description` comes from front-matter, `tags` from a\n * comma-separated `tags:` line, and the body is everything after the\n * closing `---`. Files at the root (e.g. `README.md`) are ignored.\n *\n * Reads are a snapshot at first call and cached for the source's lifetime\n * (a single agent run reads the catalog and bodies from one consistent\n * view). A missing directory yields an empty library, not a throw.\n */\nexport function directorySource(dirPath: string): SkillsStoreContract {\n let cache: Promise<Map<string, SkillRecord>> | undefined;\n\n const records = (): Promise<Map<string, SkillRecord>> => {\n if (!cache) {\n cache = readDirectory(dirPath);\n }\n\n return cache;\n };\n\n return {\n async list(scope?: { tags?: string[] }): Promise<SkillCatalogEntry[]> {\n const all = await records();\n const wanted = scope?.tags;\n\n return [...all.values()]\n .filter((record) => intersects(record.tags, wanted))\n .map(toCatalogEntry);\n },\n async load(name: string, version?: number): Promise<SkillRecord | undefined> {\n const all = await records();\n const record = all.get(name);\n\n if (!record) {\n return undefined;\n }\n\n if (version !== undefined && record.version !== version) {\n return undefined;\n }\n\n return record;\n },\n async saveCandidate(): Promise<SkillRecord> {\n throw new Error(\n \"directory source is read-only — saveCandidate requires a writable store (set `review.store`)\",\n );\n },\n async promote(): Promise<SkillRecord> {\n throw new Error(\n \"directory source is read-only — promote requires a writable store (set `review.store`)\",\n );\n },\n };\n}\n\n/** Walk the directory once, parsing every `<folder>/SKILL.md` into a record. */\nasync function readDirectory(dirPath: string): Promise<Map<string, SkillRecord>> {\n const { fs, path } = await loadFs();\n const records = new Map<string, SkillRecord>();\n\n let entries: Array<{ name: string; isDirectory(): boolean }>;\n\n try {\n entries = await fs.readdir(dirPath, { withFileTypes: true });\n } catch {\n // Missing directory ⇒ empty library; the catalog simply omits it.\n return records;\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const skillFile = path.join(dirPath, entry.name, \"SKILL.md\");\n\n let text: string;\n\n try {\n text = await fs.readFile(skillFile, \"utf8\");\n } catch {\n // A sub-directory without a SKILL.md is not a skill — skip it.\n continue;\n }\n\n const { meta, body } = parseFrontmatter(text);\n\n records.set(entry.name, {\n name: entry.name,\n description: meta.description ?? \"(no description)\",\n version: 1,\n body: body.trim(),\n tags: parseTags(meta.tags),\n type: \"authored\",\n });\n }\n\n return records;\n}\n\n/** Project a full record down to its catalog entry (body omitted). */\nfunction toCatalogEntry(record: SkillRecord): SkillCatalogEntry {\n return {\n name: record.name,\n description: record.description,\n version: record.version,\n tags: record.tags,\n type: record.type,\n };\n}\n\n/** True when no filter is requested or the record shares a requested tag. */\nfunction intersects(recordTags: string[] | undefined, wanted: string[] | undefined): boolean {\n if (!wanted || wanted.length === 0) {\n return true;\n }\n\n if (!recordTags || recordTags.length === 0) {\n return false;\n }\n\n return recordTags.some((tag) => wanted.includes(tag));\n}\n"],"mappings":";;;;;;;;;AAaA,IAAI;AACJ,IAAI;AAEJ,eAAe,SAGZ;CACD,IAAI,CAAC,OACH,QAAQ,MAAM,OAAO;CAGvB,IAAI,CAAC,SACH,UAAU,MAAM,OAAO;CAGzB,OAAO;EAAE,IAAI;EAAO,MAAM;CAAQ;AACpC;;;;;;;;;;;;;AAcA,SAAgB,gBAAgB,SAAsC;CACpE,IAAI;CAEJ,MAAM,gBAAmD;EACvD,IAAI,CAAC,OACH,QAAQ,cAAc,OAAO;EAG/B,OAAO;CACT;CAEA,OAAO;EACL,MAAM,KAAK,OAA2D;GACpE,MAAM,MAAM,MAAM,QAAQ;GAC1B,MAAM,SAAS,OAAO;GAEtB,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,CAAC,CACrB,QAAQ,WAAW,WAAW,OAAO,MAAM,MAAM,CAAC,CAAC,CACnD,IAAI,cAAc;EACvB;EACA,MAAM,KAAK,MAAc,SAAoD;GAE3E,MAAM,UAAS,MADG,QAAQ,EACR,CAAC,IAAI,IAAI;GAE3B,IAAI,CAAC,QACH;GAGF,IAAI,YAAY,UAAa,OAAO,YAAY,SAC9C;GAGF,OAAO;EACT;EACA,MAAM,gBAAsC;GAC1C,MAAM,IAAI,MACR,8FACF;EACF;EACA,MAAM,UAAgC;GACpC,MAAM,IAAI,MACR,wFACF;EACF;CACF;AACF;;AAGA,eAAe,cAAc,SAAoD;CAC/E,MAAM,EAAE,IAAI,SAAS,MAAM,OAAO;CAClC,MAAM,0BAAU,IAAI,IAAyB;CAE7C,IAAI;CAEJ,IAAI;EACF,UAAU,MAAM,GAAG,QAAQ,SAAS,EAAE,eAAe,KAAK,CAAC;CAC7D,QAAQ;EAEN,OAAO;CACT;CAEA,KAAK,MAAM,SAAS,SAAS;EAC3B,IAAI,CAAC,MAAM,YAAY,GACrB;EAGF,MAAM,YAAY,KAAK,KAAK,SAAS,MAAM,MAAM,UAAU;EAE3D,IAAI;EAEJ,IAAI;GACF,OAAO,MAAM,GAAG,SAAS,WAAW,MAAM;EAC5C,QAAQ;GAEN;EACF;EAEA,MAAM,EAAE,MAAM,SAAS,iBAAiB,IAAI;EAE5C,QAAQ,IAAI,MAAM,MAAM;GACtB,MAAM,MAAM;GACZ,aAAa,KAAK,eAAe;GACjC,SAAS;GACT,MAAM,KAAK,KAAK;GAChB,MAAM,UAAU,KAAK,IAAI;GACzB,MAAM;EACR,CAAC;CACH;CAEA,OAAO;AACT;;AAGA,SAAS,eAAe,QAAwC;CAC9D,OAAO;EACL,MAAM,OAAO;EACb,aAAa,OAAO;EACpB,SAAS,OAAO;EAChB,MAAM,OAAO;EACb,MAAM,OAAO;CACf;AACF;;AAGA,SAAS,WAAW,YAAkC,QAAuC;CAC3F,IAAI,CAAC,UAAU,OAAO,WAAW,GAC/B,OAAO;CAGT,IAAI,CAAC,cAAc,WAAW,WAAW,GACvC,OAAO;CAGT,OAAO,WAAW,MAAM,QAAQ,OAAO,SAAS,GAAG,CAAC;AACtD"}
@@ -1,27 +0,0 @@
1
- import { parseFrontmatter, parseTags } from "./parse-frontmatter.mjs";
2
- import { directorySource } from "./directory-source.mjs";
3
- import { storeSource } from "./store-source.mjs";
4
- import { urlSource } from "./url-source.mjs";
5
-
6
- //#region ../@warlock.js/ai/src/skills/sources/index.ts
7
- /**
8
- * Resolve a declarative {@link SkillSource} into a concrete
9
- * {@link SkillsStoreContract} reader. Discriminated by `type` (never
10
- * `kind`): `directory` reads the filesystem, `url` fetches a manifest,
11
- * `store` passes a store through verbatim.
12
- */
13
- function resolveSource(source) {
14
- switch (source.type) {
15
- case "directory": return directorySource(source.path);
16
- case "url": return urlSource(source.url, {
17
- headers: source.headers,
18
- policy: source.policy,
19
- cacheTtlMs: source.cacheTtlMs
20
- });
21
- case "store": return storeSource(source.store);
22
- }
23
- }
24
-
25
- //#endregion
26
- export { resolveSource };
27
- //# sourceMappingURL=index.mjs.map