@sprinterai/runtime 0.4.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. package/dist/adapters/a2a-adapter.d.ts +37 -9
  2. package/dist/adapters/a2a-adapter.d.ts.map +1 -1
  3. package/dist/adapters/a2a-adapter.js +132 -9
  4. package/dist/adapters/a2a-adapter.js.map +1 -1
  5. package/dist/adapters/a2a-adapter.test.d.ts +2 -0
  6. package/dist/adapters/a2a-adapter.test.d.ts.map +1 -0
  7. package/dist/adapters/a2a-adapter.test.js +295 -0
  8. package/dist/adapters/a2a-adapter.test.js.map +1 -0
  9. package/dist/adapters/http-agent-adapter.d.ts +19 -9
  10. package/dist/adapters/http-agent-adapter.d.ts.map +1 -1
  11. package/dist/adapters/http-agent-adapter.js +55 -9
  12. package/dist/adapters/http-agent-adapter.js.map +1 -1
  13. package/dist/adapters/http-agent-adapter.test.d.ts +2 -0
  14. package/dist/adapters/http-agent-adapter.test.d.ts.map +1 -0
  15. package/dist/adapters/http-agent-adapter.test.js +164 -0
  16. package/dist/adapters/http-agent-adapter.test.js.map +1 -0
  17. package/dist/adapters/index.d.ts +8 -8
  18. package/dist/adapters/index.d.ts.map +1 -1
  19. package/dist/adapters/index.js +4 -4
  20. package/dist/adapters/index.js.map +1 -1
  21. package/dist/adapters/mcp-adapter.d.ts +29 -9
  22. package/dist/adapters/mcp-adapter.d.ts.map +1 -1
  23. package/dist/adapters/mcp-adapter.js +43 -8
  24. package/dist/adapters/mcp-adapter.js.map +1 -1
  25. package/dist/adapters/mcp-adapter.test.d.ts +2 -0
  26. package/dist/adapters/mcp-adapter.test.d.ts.map +1 -0
  27. package/dist/adapters/mcp-adapter.test.js +118 -0
  28. package/dist/adapters/mcp-adapter.test.js.map +1 -0
  29. package/dist/adapters/openclaw-adapter.d.ts +34 -8
  30. package/dist/adapters/openclaw-adapter.d.ts.map +1 -1
  31. package/dist/adapters/openclaw-adapter.js +38 -8
  32. package/dist/adapters/openclaw-adapter.js.map +1 -1
  33. package/dist/adapters/openclaw-adapter.test.d.ts +2 -0
  34. package/dist/adapters/openclaw-adapter.test.d.ts.map +1 -0
  35. package/dist/adapters/openclaw-adapter.test.js +77 -0
  36. package/dist/adapters/openclaw-adapter.test.js.map +1 -0
  37. package/dist/agent/agent-registry.test.js +1 -1
  38. package/dist/agent/agent-resolver.d.ts +8 -2
  39. package/dist/agent/agent-resolver.d.ts.map +1 -1
  40. package/dist/agent/agent-resolver.js +7 -1
  41. package/dist/agent/agent-resolver.js.map +1 -1
  42. package/dist/agent/agent-resolver.test.js +21 -3
  43. package/dist/agent/agent-resolver.test.js.map +1 -1
  44. package/dist/agent/delegate.test.js +1 -1
  45. package/dist/agent/execute-agent.d.ts +32 -11
  46. package/dist/agent/execute-agent.d.ts.map +1 -1
  47. package/dist/agent/execute-agent.js +39 -3
  48. package/dist/agent/execute-agent.js.map +1 -1
  49. package/dist/agent/index.d.ts +9 -9
  50. package/dist/agent/index.d.ts.map +1 -1
  51. package/dist/agent/index.js +5 -5
  52. package/dist/agent/index.js.map +1 -1
  53. package/dist/agent/prompt-builder.test.js +1 -1
  54. package/dist/approval/approval-manager.d.ts +19 -0
  55. package/dist/approval/approval-manager.d.ts.map +1 -0
  56. package/dist/approval/approval-manager.js +36 -0
  57. package/dist/approval/approval-manager.js.map +1 -0
  58. package/dist/approval/approval-manager.test.d.ts +2 -0
  59. package/dist/approval/approval-manager.test.d.ts.map +1 -0
  60. package/dist/approval/approval-manager.test.js +239 -0
  61. package/dist/approval/approval-manager.test.js.map +1 -0
  62. package/dist/approval/index.d.ts +3 -0
  63. package/dist/approval/index.d.ts.map +1 -0
  64. package/dist/approval/index.js +2 -0
  65. package/dist/approval/index.js.map +1 -0
  66. package/dist/chat/chat-handler.d.ts +16 -7
  67. package/dist/chat/chat-handler.d.ts.map +1 -1
  68. package/dist/chat/chat-handler.js +68 -20
  69. package/dist/chat/chat-handler.js.map +1 -1
  70. package/dist/chat/chat-handler.test.js +101 -11
  71. package/dist/chat/chat-handler.test.js.map +1 -1
  72. package/dist/chat/index.d.ts +3 -3
  73. package/dist/chat/index.js +2 -2
  74. package/dist/chat/message-utils.d.ts +15 -7
  75. package/dist/chat/message-utils.d.ts.map +1 -1
  76. package/dist/chat/message-utils.js +94 -22
  77. package/dist/chat/message-utils.js.map +1 -1
  78. package/dist/chat/message-utils.test.js +71 -1
  79. package/dist/chat/message-utils.test.js.map +1 -1
  80. package/dist/document/chunk-generator.d.ts +6 -0
  81. package/dist/document/chunk-generator.d.ts.map +1 -0
  82. package/dist/document/chunk-generator.js +107 -0
  83. package/dist/document/chunk-generator.js.map +1 -0
  84. package/dist/document/chunk-generator.test.d.ts +2 -0
  85. package/dist/document/chunk-generator.test.d.ts.map +1 -0
  86. package/dist/document/chunk-generator.test.js +166 -0
  87. package/dist/document/chunk-generator.test.js.map +1 -0
  88. package/dist/document/document-processor.d.ts +27 -0
  89. package/dist/document/document-processor.d.ts.map +1 -0
  90. package/dist/document/document-processor.js +44 -0
  91. package/dist/document/document-processor.js.map +1 -0
  92. package/dist/document/document-processor.test.d.ts +2 -0
  93. package/dist/document/document-processor.test.d.ts.map +1 -0
  94. package/dist/document/document-processor.test.js +197 -0
  95. package/dist/document/document-processor.test.js.map +1 -0
  96. package/dist/document/index.d.ts +5 -0
  97. package/dist/document/index.d.ts.map +1 -0
  98. package/dist/document/index.js +4 -0
  99. package/dist/document/index.js.map +1 -0
  100. package/dist/document/parsers/index.d.ts +2 -0
  101. package/dist/document/parsers/index.d.ts.map +1 -0
  102. package/dist/document/parsers/index.js +2 -0
  103. package/dist/document/parsers/index.js.map +1 -0
  104. package/dist/document/parsers/text-parser.d.ts +4 -0
  105. package/dist/document/parsers/text-parser.d.ts.map +1 -0
  106. package/dist/document/parsers/text-parser.js +23 -0
  107. package/dist/document/parsers/text-parser.js.map +1 -0
  108. package/dist/document/parsers/text-parser.test.d.ts +2 -0
  109. package/dist/document/parsers/text-parser.test.d.ts.map +1 -0
  110. package/dist/document/parsers/text-parser.test.js +64 -0
  111. package/dist/document/parsers/text-parser.test.js.map +1 -0
  112. package/dist/eval/eval-runner.test.js +2 -2
  113. package/dist/eval/index.d.ts +3 -3
  114. package/dist/eval/index.js +2 -2
  115. package/dist/eval/scorers.test.js +1 -1
  116. package/dist/events/event-bus.d.ts +12 -0
  117. package/dist/events/event-bus.d.ts.map +1 -0
  118. package/dist/events/event-bus.js +77 -0
  119. package/dist/events/event-bus.js.map +1 -0
  120. package/dist/events/event-bus.test.d.ts +2 -0
  121. package/dist/events/event-bus.test.d.ts.map +1 -0
  122. package/dist/events/event-bus.test.js +155 -0
  123. package/dist/events/event-bus.test.js.map +1 -0
  124. package/dist/events/index.d.ts +2 -0
  125. package/dist/events/index.d.ts.map +1 -0
  126. package/dist/events/index.js +2 -0
  127. package/dist/events/index.js.map +1 -0
  128. package/dist/guardrail/guardrail-pipeline.test.js +1 -1
  129. package/dist/guardrail/index.d.ts +2 -2
  130. package/dist/guardrail/index.js +1 -1
  131. package/dist/index.d.ts +81 -45
  132. package/dist/index.d.ts.map +1 -1
  133. package/dist/index.js +55 -27
  134. package/dist/index.js.map +1 -1
  135. package/dist/jobs/in-memory-job-queue.d.ts +20 -0
  136. package/dist/jobs/in-memory-job-queue.d.ts.map +1 -0
  137. package/dist/jobs/in-memory-job-queue.js +120 -0
  138. package/dist/jobs/in-memory-job-queue.js.map +1 -0
  139. package/dist/jobs/in-memory-job-queue.test.d.ts +2 -0
  140. package/dist/jobs/in-memory-job-queue.test.d.ts.map +1 -0
  141. package/dist/jobs/in-memory-job-queue.test.js +146 -0
  142. package/dist/jobs/in-memory-job-queue.test.js.map +1 -0
  143. package/dist/jobs/index.d.ts +4 -0
  144. package/dist/jobs/index.d.ts.map +1 -0
  145. package/dist/jobs/index.js +3 -0
  146. package/dist/jobs/index.js.map +1 -0
  147. package/dist/jobs/job-runner.d.ts +42 -0
  148. package/dist/jobs/job-runner.d.ts.map +1 -0
  149. package/dist/jobs/job-runner.js +119 -0
  150. package/dist/jobs/job-runner.js.map +1 -0
  151. package/dist/jobs/job-runner.test.d.ts +2 -0
  152. package/dist/jobs/job-runner.test.d.ts.map +1 -0
  153. package/dist/jobs/job-runner.test.js +190 -0
  154. package/dist/jobs/job-runner.test.js.map +1 -0
  155. package/dist/memory/index.d.ts +3 -3
  156. package/dist/memory/index.js +2 -2
  157. package/dist/memory/memory-prompt.d.ts +1 -1
  158. package/dist/module/create-runtime.d.ts +21 -6
  159. package/dist/module/create-runtime.d.ts.map +1 -1
  160. package/dist/module/create-runtime.js +7 -7
  161. package/dist/module/create-runtime.js.map +1 -1
  162. package/dist/module/create-runtime.test.js +8 -8
  163. package/dist/module/index.d.ts +5 -4
  164. package/dist/module/index.d.ts.map +1 -1
  165. package/dist/module/index.js +3 -2
  166. package/dist/module/index.js.map +1 -1
  167. package/dist/module/map-supabase-stores.d.ts +33 -0
  168. package/dist/module/map-supabase-stores.d.ts.map +1 -0
  169. package/dist/module/map-supabase-stores.js +28 -0
  170. package/dist/module/map-supabase-stores.js.map +1 -0
  171. package/dist/module/module-loader.d.ts +9 -1
  172. package/dist/module/module-loader.d.ts.map +1 -1
  173. package/dist/module/module-loader.js +40 -1
  174. package/dist/module/module-loader.js.map +1 -1
  175. package/dist/module/module-loader.test.js +38 -1
  176. package/dist/module/module-loader.test.js.map +1 -1
  177. package/dist/notification/digest-scheduler.d.ts +18 -0
  178. package/dist/notification/digest-scheduler.d.ts.map +1 -0
  179. package/dist/notification/digest-scheduler.js +44 -0
  180. package/dist/notification/digest-scheduler.js.map +1 -0
  181. package/dist/notification/digest-scheduler.test.d.ts +2 -0
  182. package/dist/notification/digest-scheduler.test.d.ts.map +1 -0
  183. package/dist/notification/digest-scheduler.test.js +306 -0
  184. package/dist/notification/digest-scheduler.test.js.map +1 -0
  185. package/dist/notification/index.d.ts +5 -0
  186. package/dist/notification/index.d.ts.map +1 -0
  187. package/dist/notification/index.js +3 -0
  188. package/dist/notification/index.js.map +1 -0
  189. package/dist/notification/notification-engine.d.ts +20 -0
  190. package/dist/notification/notification-engine.d.ts.map +1 -0
  191. package/dist/notification/notification-engine.js +78 -0
  192. package/dist/notification/notification-engine.js.map +1 -0
  193. package/dist/notification/notification-engine.test.d.ts +2 -0
  194. package/dist/notification/notification-engine.test.d.ts.map +1 -0
  195. package/dist/notification/notification-engine.test.js +364 -0
  196. package/dist/notification/notification-engine.test.js.map +1 -0
  197. package/dist/providers/index.d.ts +5 -0
  198. package/dist/providers/index.d.ts.map +1 -0
  199. package/dist/providers/index.js +3 -0
  200. package/dist/providers/index.js.map +1 -0
  201. package/dist/providers/model-resolver.d.ts +93 -0
  202. package/dist/providers/model-resolver.d.ts.map +1 -0
  203. package/dist/providers/model-resolver.js +152 -0
  204. package/dist/providers/model-resolver.js.map +1 -0
  205. package/dist/providers/model-resolver.test.d.ts +2 -0
  206. package/dist/providers/model-resolver.test.d.ts.map +1 -0
  207. package/dist/providers/model-resolver.test.js +199 -0
  208. package/dist/providers/model-resolver.test.js.map +1 -0
  209. package/dist/providers/noop-providers.d.ts +6 -0
  210. package/dist/providers/noop-providers.d.ts.map +1 -0
  211. package/dist/providers/noop-providers.js +15 -0
  212. package/dist/providers/noop-providers.js.map +1 -0
  213. package/dist/providers/noop-providers.test.d.ts +2 -0
  214. package/dist/providers/noop-providers.test.d.ts.map +1 -0
  215. package/dist/providers/noop-providers.test.js +63 -0
  216. package/dist/providers/noop-providers.test.js.map +1 -0
  217. package/dist/providers/provider-interfaces.d.ts +65 -0
  218. package/dist/providers/provider-interfaces.d.ts.map +1 -0
  219. package/dist/providers/provider-interfaces.js +2 -0
  220. package/dist/providers/provider-interfaces.js.map +1 -0
  221. package/dist/realtime/index.d.ts +3 -0
  222. package/dist/realtime/index.d.ts.map +1 -0
  223. package/dist/realtime/index.js +2 -0
  224. package/dist/realtime/index.js.map +1 -0
  225. package/dist/realtime/realtime-manager.d.ts +20 -0
  226. package/dist/realtime/realtime-manager.d.ts.map +1 -0
  227. package/dist/realtime/realtime-manager.js +110 -0
  228. package/dist/realtime/realtime-manager.js.map +1 -0
  229. package/dist/realtime/realtime-manager.test.d.ts +2 -0
  230. package/dist/realtime/realtime-manager.test.d.ts.map +1 -0
  231. package/dist/realtime/realtime-manager.test.js +273 -0
  232. package/dist/realtime/realtime-manager.test.js.map +1 -0
  233. package/dist/scoring/compute-score.test.js +1 -1
  234. package/dist/scoring/index.d.ts +2 -2
  235. package/dist/scoring/index.js +1 -1
  236. package/dist/search/cosine-similarity.d.ts +8 -0
  237. package/dist/search/cosine-similarity.d.ts.map +1 -0
  238. package/dist/search/cosine-similarity.js +28 -0
  239. package/dist/search/cosine-similarity.js.map +1 -0
  240. package/dist/search/cosine-similarity.test.d.ts +2 -0
  241. package/dist/search/cosine-similarity.test.d.ts.map +1 -0
  242. package/dist/search/cosine-similarity.test.js +49 -0
  243. package/dist/search/cosine-similarity.test.js.map +1 -0
  244. package/dist/search/hybrid-search.d.ts +47 -0
  245. package/dist/search/hybrid-search.d.ts.map +1 -0
  246. package/dist/search/hybrid-search.js +111 -0
  247. package/dist/search/hybrid-search.js.map +1 -0
  248. package/dist/search/hybrid-search.test.d.ts +2 -0
  249. package/dist/search/hybrid-search.test.d.ts.map +1 -0
  250. package/dist/search/hybrid-search.test.js +238 -0
  251. package/dist/search/hybrid-search.test.js.map +1 -0
  252. package/dist/search/in-memory-search.d.ts +17 -0
  253. package/dist/search/in-memory-search.d.ts.map +1 -0
  254. package/dist/search/in-memory-search.js +59 -0
  255. package/dist/search/in-memory-search.js.map +1 -0
  256. package/dist/search/in-memory-search.test.d.ts +2 -0
  257. package/dist/search/in-memory-search.test.d.ts.map +1 -0
  258. package/dist/search/in-memory-search.test.js +169 -0
  259. package/dist/search/in-memory-search.test.js.map +1 -0
  260. package/dist/search/index.d.ts +6 -0
  261. package/dist/search/index.d.ts.map +1 -0
  262. package/dist/search/index.js +4 -0
  263. package/dist/search/index.js.map +1 -0
  264. package/dist/testing/in-memory-agent-store.d.ts +5 -1
  265. package/dist/testing/in-memory-agent-store.d.ts.map +1 -1
  266. package/dist/testing/in-memory-agent-store.js +19 -0
  267. package/dist/testing/in-memory-agent-store.js.map +1 -1
  268. package/dist/testing/in-memory-agent-store.test.js +1 -1
  269. package/dist/testing/in-memory-chat-store.d.ts +4 -3
  270. package/dist/testing/in-memory-chat-store.d.ts.map +1 -1
  271. package/dist/testing/in-memory-chat-store.js +3 -2
  272. package/dist/testing/in-memory-chat-store.js.map +1 -1
  273. package/dist/testing/in-memory-entity-store.d.ts +5 -1
  274. package/dist/testing/in-memory-entity-store.d.ts.map +1 -1
  275. package/dist/testing/in-memory-entity-store.js +69 -4
  276. package/dist/testing/in-memory-entity-store.js.map +1 -1
  277. package/dist/testing/in-memory-entity-store.test.js +1 -1
  278. package/dist/testing/in-memory-memory-store.d.ts +3 -1
  279. package/dist/testing/in-memory-memory-store.d.ts.map +1 -1
  280. package/dist/testing/in-memory-memory-store.js +20 -0
  281. package/dist/testing/in-memory-memory-store.js.map +1 -1
  282. package/dist/testing/in-memory-tool-store.d.ts +13 -2
  283. package/dist/testing/in-memory-tool-store.d.ts.map +1 -1
  284. package/dist/testing/in-memory-tool-store.js +51 -0
  285. package/dist/testing/in-memory-tool-store.js.map +1 -1
  286. package/dist/testing/index.d.ts +7 -7
  287. package/dist/testing/index.js +7 -7
  288. package/dist/tool/ai-bridge.d.ts +1 -0
  289. package/dist/tool/ai-bridge.d.ts.map +1 -1
  290. package/dist/tool/ai-bridge.js +1 -0
  291. package/dist/tool/ai-bridge.js.map +1 -1
  292. package/dist/tool/ai-bridge.test.js +1 -1
  293. package/dist/tool/catalog.d.ts +19 -0
  294. package/dist/tool/catalog.d.ts.map +1 -0
  295. package/dist/tool/catalog.js +88 -0
  296. package/dist/tool/catalog.js.map +1 -0
  297. package/dist/tool/catalog.test.d.ts +2 -0
  298. package/dist/tool/catalog.test.d.ts.map +1 -0
  299. package/dist/tool/catalog.test.js +129 -0
  300. package/dist/tool/catalog.test.js.map +1 -0
  301. package/dist/tool/entity-tools-factory.d.ts.map +1 -1
  302. package/dist/tool/entity-tools-factory.js +80 -0
  303. package/dist/tool/entity-tools-factory.js.map +1 -1
  304. package/dist/tool/entity-tools-factory.test.js +70 -4
  305. package/dist/tool/entity-tools-factory.test.js.map +1 -1
  306. package/dist/tool/execute-registered-tool.d.ts +17 -0
  307. package/dist/tool/execute-registered-tool.d.ts.map +1 -0
  308. package/dist/tool/execute-registered-tool.js +24 -0
  309. package/dist/tool/execute-registered-tool.js.map +1 -0
  310. package/dist/tool/execute-registered-tool.test.d.ts +2 -0
  311. package/dist/tool/execute-registered-tool.test.d.ts.map +1 -0
  312. package/dist/tool/execute-registered-tool.test.js +73 -0
  313. package/dist/tool/execute-registered-tool.test.js.map +1 -0
  314. package/dist/tool/index.d.ts +11 -7
  315. package/dist/tool/index.d.ts.map +1 -1
  316. package/dist/tool/index.js +7 -5
  317. package/dist/tool/index.js.map +1 -1
  318. package/dist/tool/resolve-tools.d.ts +3 -1
  319. package/dist/tool/resolve-tools.d.ts.map +1 -1
  320. package/dist/tool/resolve-tools.js +1 -1
  321. package/dist/tool/resolve-tools.js.map +1 -1
  322. package/dist/tool/resolve-tools.test.js +1 -1
  323. package/dist/tool/tool-executor.d.ts +3 -2
  324. package/dist/tool/tool-executor.d.ts.map +1 -1
  325. package/dist/tool/tool-executor.js +4 -2
  326. package/dist/tool/tool-executor.js.map +1 -1
  327. package/dist/tool/tool-executor.test.js +2 -2
  328. package/dist/tool/tool-registry.test.js +1 -1
  329. package/dist/tool/zod-to-json-schema.d.ts +7 -0
  330. package/dist/tool/zod-to-json-schema.d.ts.map +1 -0
  331. package/dist/tool/zod-to-json-schema.js +12 -0
  332. package/dist/tool/zod-to-json-schema.js.map +1 -0
  333. package/dist/tool/zod-to-json-schema.test.d.ts +2 -0
  334. package/dist/tool/zod-to-json-schema.test.d.ts.map +1 -0
  335. package/dist/tool/zod-to-json-schema.test.js +127 -0
  336. package/dist/tool/zod-to-json-schema.test.js.map +1 -0
  337. package/dist/webhook/index.d.ts +4 -0
  338. package/dist/webhook/index.d.ts.map +1 -0
  339. package/dist/webhook/index.js +3 -0
  340. package/dist/webhook/index.js.map +1 -0
  341. package/dist/webhook/webhook-delivery.d.ts +12 -0
  342. package/dist/webhook/webhook-delivery.d.ts.map +1 -0
  343. package/dist/webhook/webhook-delivery.js +102 -0
  344. package/dist/webhook/webhook-delivery.js.map +1 -0
  345. package/dist/webhook/webhook-delivery.test.d.ts +2 -0
  346. package/dist/webhook/webhook-delivery.test.d.ts.map +1 -0
  347. package/dist/webhook/webhook-delivery.test.js +284 -0
  348. package/dist/webhook/webhook-delivery.test.js.map +1 -0
  349. package/dist/webhook/webhook-signer.d.ts +14 -0
  350. package/dist/webhook/webhook-signer.d.ts.map +1 -0
  351. package/dist/webhook/webhook-signer.js +31 -0
  352. package/dist/webhook/webhook-signer.js.map +1 -0
  353. package/dist/webhook/webhook-signer.test.d.ts +2 -0
  354. package/dist/webhook/webhook-signer.test.d.ts.map +1 -0
  355. package/dist/webhook/webhook-signer.test.js +74 -0
  356. package/dist/webhook/webhook-signer.test.js.map +1 -0
  357. package/dist/workflow/compile.js +4 -1
  358. package/dist/workflow/compile.js.map +1 -1
  359. package/dist/workflow/compile.test.js +1 -1
  360. package/dist/workflow/evaluate-nodes.d.ts +24 -0
  361. package/dist/workflow/evaluate-nodes.d.ts.map +1 -0
  362. package/dist/workflow/evaluate-nodes.js +126 -0
  363. package/dist/workflow/evaluate-nodes.js.map +1 -0
  364. package/dist/workflow/evaluate-nodes.test.d.ts +2 -0
  365. package/dist/workflow/evaluate-nodes.test.d.ts.map +1 -0
  366. package/dist/workflow/evaluate-nodes.test.js +363 -0
  367. package/dist/workflow/evaluate-nodes.test.js.map +1 -0
  368. package/dist/workflow/index.d.ts +8 -3
  369. package/dist/workflow/index.d.ts.map +1 -1
  370. package/dist/workflow/index.js +4 -2
  371. package/dist/workflow/index.js.map +1 -1
  372. package/dist/workflow/node-executor.d.ts +40 -0
  373. package/dist/workflow/node-executor.d.ts.map +1 -0
  374. package/dist/workflow/node-executor.js +2 -0
  375. package/dist/workflow/node-executor.js.map +1 -0
  376. package/dist/workflow/node-executor.test.d.ts +2 -0
  377. package/dist/workflow/node-executor.test.d.ts.map +1 -0
  378. package/dist/workflow/node-executor.test.js +91 -0
  379. package/dist/workflow/node-executor.test.js.map +1 -0
  380. package/dist/workflow/status.test.js +1 -1
  381. package/dist/workflow/workflow-runner.d.ts +57 -0
  382. package/dist/workflow/workflow-runner.d.ts.map +1 -0
  383. package/dist/workflow/workflow-runner.js +263 -0
  384. package/dist/workflow/workflow-runner.js.map +1 -0
  385. package/dist/workflow/workflow-runner.test.d.ts +2 -0
  386. package/dist/workflow/workflow-runner.test.d.ts.map +1 -0
  387. package/dist/workflow/workflow-runner.test.js +657 -0
  388. package/dist/workflow/workflow-runner.test.js.map +1 -0
  389. package/package.json +9 -4
@@ -0,0 +1,20 @@
1
+ import type { NotificationStore, NotificationRecord, NotificationRule, EventBus } from '@sprinterai/core';
2
+ export interface NotificationEngineOptions {
3
+ store: NotificationStore;
4
+ rules: NotificationRule[];
5
+ eventBus?: EventBus;
6
+ }
7
+ export interface NotificationEngine {
8
+ /** Process a domain event and create notifications based on matching rules. */
9
+ processEvent(eventType: string, eventData: Record<string, unknown>, tenantId: string): Promise<NotificationRecord[]>;
10
+ /** Wire up to event bus -- auto-process events as they arrive. Returns disconnect function. */
11
+ connectToEventBus(): () => void;
12
+ }
13
+ /**
14
+ * Interpolate template strings by replacing {{fieldName}} with values from data.
15
+ * Missing fields are replaced with empty string.
16
+ */
17
+ export declare function interpolateTemplate(template: string, data: Record<string, unknown>): string;
18
+ /** Create a notification engine that maps domain events to notifications. */
19
+ export declare function createNotificationEngine(options: NotificationEngineOptions): NotificationEngine;
20
+ //# sourceMappingURL=notification-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-engine.d.ts","sourceRoot":"","sources":["../../src/notification/notification-engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,kBAAkB,EAClB,gBAAgB,EAChB,QAAQ,EAGT,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,yBAAyB;IACxC,KAAK,EAAE,iBAAiB,CAAC;IACzB,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED,MAAM,WAAW,kBAAkB;IACjC,+EAA+E;IAC/E,YAAY,CACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAClC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;IACjC,+FAA+F;IAC/F,iBAAiB,IAAI,MAAM,IAAI,CAAC;CACjC;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAQ3F;AAED,6EAA6E;AAC7E,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,kBAAkB,CAkF/F"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Interpolate template strings by replacing {{fieldName}} with values from data.
3
+ * Missing fields are replaced with empty string.
4
+ */
5
+ export function interpolateTemplate(template, data) {
6
+ return template.replace(/\{\{(\w+)\}\}/g, (_match, field) => {
7
+ const value = data[field];
8
+ if (value === undefined || value === null) {
9
+ return '';
10
+ }
11
+ return String(value);
12
+ });
13
+ }
14
+ /** Create a notification engine that maps domain events to notifications. */
15
+ export function createNotificationEngine(options) {
16
+ const { store, rules, eventBus } = options;
17
+ async function processEvent(eventType, eventData, tenantId) {
18
+ const matchingRules = rules.filter((rule) => rule.eventType === eventType);
19
+ if (matchingRules.length === 0) {
20
+ return [];
21
+ }
22
+ const notifications = [];
23
+ for (const rule of matchingRules) {
24
+ // Apply filter if present
25
+ if (rule.filter && !rule.filter(eventData)) {
26
+ continue;
27
+ }
28
+ const recipients = rule.resolveRecipients(eventData);
29
+ if (recipients.length === 0) {
30
+ continue;
31
+ }
32
+ const title = interpolateTemplate(rule.titleTemplate, eventData);
33
+ const body = rule.bodyTemplate ? interpolateTemplate(rule.bodyTemplate, eventData) : null;
34
+ const extraData = rule.buildData?.(eventData);
35
+ for (const userId of recipients) {
36
+ const created = await store.createNotification({
37
+ tenant_id: tenantId,
38
+ user_id: userId,
39
+ type: rule.notificationType,
40
+ title,
41
+ body,
42
+ data: extraData?.data ?? {},
43
+ });
44
+ notifications.push(created);
45
+ }
46
+ }
47
+ return notifications;
48
+ }
49
+ let connected = false;
50
+ function connectToEventBus() {
51
+ if (!eventBus) {
52
+ throw new Error('Cannot connect to event bus: no eventBus provided in options');
53
+ }
54
+ if (connected) {
55
+ return () => { };
56
+ }
57
+ connected = true;
58
+ // Collect all unique event types from rules
59
+ const eventTypes = new Set(rules.map((rule) => rule.eventType));
60
+ const unsubscribes = [];
61
+ for (const eventType of eventTypes) {
62
+ const unsub = eventBus.on(eventType, async (event) => {
63
+ const data = event.data;
64
+ const tenantId = data.tenantId ?? '';
65
+ await processEvent(eventType, data, tenantId);
66
+ });
67
+ unsubscribes.push(unsub);
68
+ }
69
+ return () => {
70
+ for (const unsub of unsubscribes) {
71
+ unsub();
72
+ }
73
+ connected = false;
74
+ };
75
+ }
76
+ return { processEvent, connectToEventBus };
77
+ }
78
+ //# sourceMappingURL=notification-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-engine.js","sourceRoot":"","sources":["../../src/notification/notification-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=notification-engine.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-engine.test.d.ts","sourceRoot":"","sources":["../../src/notification/notification-engine.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,364 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { createNotificationEngine, interpolateTemplate } from './notification-engine.js';
3
+ // ─── Helpers ───────────────────────────────────────────────
4
+ function createMockStore() {
5
+ let idCounter = 0;
6
+ const notifications = [];
7
+ return {
8
+ getNotifications: vi.fn(async () => notifications),
9
+ getUnreadCount: vi.fn(async () => notifications.filter((n) => !n.read_at).length),
10
+ markRead: vi.fn(async () => undefined),
11
+ markAllRead: vi.fn(async () => undefined),
12
+ createNotification: vi.fn(async (input) => {
13
+ idCounter += 1;
14
+ const record = {
15
+ id: `notif-${idCounter}`,
16
+ tenant_id: input.tenant_id,
17
+ user_id: input.user_id,
18
+ type: input.type,
19
+ title: input.title,
20
+ body: input.body,
21
+ data: input.data,
22
+ read_at: null,
23
+ created_at: new Date().toISOString(),
24
+ };
25
+ notifications.push(record);
26
+ return record;
27
+ }),
28
+ deleteNotification: vi.fn(async () => undefined),
29
+ };
30
+ }
31
+ function createMockEventBus() {
32
+ const handlers = new Map();
33
+ return {
34
+ emit: vi.fn(async (type, data) => {
35
+ const typeHandlers = handlers.get(type);
36
+ if (typeHandlers) {
37
+ for (const handler of typeHandlers) {
38
+ await handler({
39
+ id: 'evt-1',
40
+ type,
41
+ data,
42
+ timestamp: new Date().toISOString(),
43
+ });
44
+ }
45
+ }
46
+ }),
47
+ on: vi.fn((type, handler) => {
48
+ let typeSet = handlers.get(type);
49
+ if (!typeSet) {
50
+ typeSet = new Set();
51
+ handlers.set(type, typeSet);
52
+ }
53
+ typeSet.add(handler);
54
+ return () => {
55
+ typeSet.delete(handler);
56
+ };
57
+ }),
58
+ onAny: vi.fn(() => () => undefined),
59
+ removeAllListeners: vi.fn(),
60
+ };
61
+ }
62
+ // ─── Tests ─────────────────────────────────────────────────
63
+ describe('interpolateTemplate', () => {
64
+ it('should replace placeholders with values', () => {
65
+ const result = interpolateTemplate('Hello {{name}}, welcome to {{place}}!', {
66
+ name: 'Alice',
67
+ place: 'Wonderland',
68
+ });
69
+ expect(result).toBe('Hello Alice, welcome to Wonderland!');
70
+ });
71
+ it('should replace missing fields with empty string', () => {
72
+ const result = interpolateTemplate('Hello {{name}}, your id is {{id}}', {
73
+ name: 'Bob',
74
+ });
75
+ expect(result).toBe('Hello Bob, your id is ');
76
+ });
77
+ it('should handle null values as empty string', () => {
78
+ const result = interpolateTemplate('Value: {{field}}', { field: null });
79
+ expect(result).toBe('Value: ');
80
+ });
81
+ it('should handle undefined values as empty string', () => {
82
+ const result = interpolateTemplate('Value: {{field}}', { field: undefined });
83
+ expect(result).toBe('Value: ');
84
+ });
85
+ it('should convert numeric values to string', () => {
86
+ const result = interpolateTemplate('Count: {{count}}', { count: 42 });
87
+ expect(result).toBe('Count: 42');
88
+ });
89
+ it('should handle template with no placeholders', () => {
90
+ const result = interpolateTemplate('No placeholders here', { name: 'test' });
91
+ expect(result).toBe('No placeholders here');
92
+ });
93
+ it('should handle empty data', () => {
94
+ const result = interpolateTemplate('Hello {{name}}', {});
95
+ expect(result).toBe('Hello ');
96
+ });
97
+ });
98
+ describe('createNotificationEngine', () => {
99
+ let store;
100
+ beforeEach(() => {
101
+ store = createMockStore();
102
+ });
103
+ describe('processEvent', () => {
104
+ it('should create notifications for matching rules', async () => {
105
+ const rules = [
106
+ {
107
+ eventType: 'entity.created',
108
+ notificationType: 'entity_created',
109
+ titleTemplate: 'New {{entityTypeSlug}} created',
110
+ resolveRecipients: () => ['user-1'],
111
+ },
112
+ ];
113
+ const engine = createNotificationEngine({ store, rules });
114
+ const results = await engine.processEvent('entity.created', { entityTypeSlug: 'person', entityId: 'ent-1' }, 'tenant-1');
115
+ expect(results).toHaveLength(1);
116
+ expect(results[0].type).toBe('entity_created');
117
+ expect(results[0].title).toBe('New person created');
118
+ expect(results[0].tenant_id).toBe('tenant-1');
119
+ expect(results[0].user_id).toBe('user-1');
120
+ expect(store.createNotification).toHaveBeenCalledOnce();
121
+ });
122
+ it('should return empty array for non-matching event types', async () => {
123
+ const rules = [
124
+ {
125
+ eventType: 'entity.created',
126
+ notificationType: 'entity_created',
127
+ titleTemplate: 'New entity',
128
+ resolveRecipients: () => ['user-1'],
129
+ },
130
+ ];
131
+ const engine = createNotificationEngine({ store, rules });
132
+ const results = await engine.processEvent('workflow.completed', {}, 'tenant-1');
133
+ expect(results).toHaveLength(0);
134
+ expect(store.createNotification).not.toHaveBeenCalled();
135
+ });
136
+ it('should interpolate body template', async () => {
137
+ const rules = [
138
+ {
139
+ eventType: 'entity.created',
140
+ notificationType: 'entity_created',
141
+ titleTemplate: 'New entity',
142
+ bodyTemplate: '{{triggeredBy}} created a {{entityTypeSlug}}',
143
+ resolveRecipients: () => ['user-1'],
144
+ },
145
+ ];
146
+ const engine = createNotificationEngine({ store, rules });
147
+ const results = await engine.processEvent('entity.created', { triggeredBy: 'Alice', entityTypeSlug: 'person' }, 'tenant-1');
148
+ expect(results[0].body).toBe('Alice created a person');
149
+ });
150
+ it('should set body to null when no bodyTemplate', async () => {
151
+ const rules = [
152
+ {
153
+ eventType: 'entity.created',
154
+ notificationType: 'entity_created',
155
+ titleTemplate: 'New entity',
156
+ resolveRecipients: () => ['user-1'],
157
+ },
158
+ ];
159
+ const engine = createNotificationEngine({ store, rules });
160
+ const results = await engine.processEvent('entity.created', {}, 'tenant-1');
161
+ expect(results[0].body).toBeNull();
162
+ });
163
+ it('should filter events based on rule filter', async () => {
164
+ const rules = [
165
+ {
166
+ eventType: 'entity.created',
167
+ notificationType: 'person_created',
168
+ titleTemplate: 'New person',
169
+ resolveRecipients: () => ['user-1'],
170
+ filter: (data) => data.entityTypeSlug === 'person',
171
+ },
172
+ ];
173
+ const engine = createNotificationEngine({ store, rules });
174
+ // Should match
175
+ const results1 = await engine.processEvent('entity.created', { entityTypeSlug: 'person' }, 'tenant-1');
176
+ expect(results1).toHaveLength(1);
177
+ // Should not match
178
+ const results2 = await engine.processEvent('entity.created', { entityTypeSlug: 'company' }, 'tenant-1');
179
+ expect(results2).toHaveLength(0);
180
+ });
181
+ it('should resolve multiple recipients', async () => {
182
+ const rules = [
183
+ {
184
+ eventType: 'approval.requested',
185
+ notificationType: 'approval_needed',
186
+ titleTemplate: 'Approval needed',
187
+ resolveRecipients: () => ['user-1', 'user-2', 'user-3'],
188
+ },
189
+ ];
190
+ const engine = createNotificationEngine({ store, rules });
191
+ const results = await engine.processEvent('approval.requested', {}, 'tenant-1');
192
+ expect(results).toHaveLength(3);
193
+ expect(results[0].user_id).toBe('user-1');
194
+ expect(results[1].user_id).toBe('user-2');
195
+ expect(results[2].user_id).toBe('user-3');
196
+ expect(store.createNotification).toHaveBeenCalledTimes(3);
197
+ });
198
+ it('should skip rules with zero recipients', async () => {
199
+ const rules = [
200
+ {
201
+ eventType: 'entity.created',
202
+ notificationType: 'entity_created',
203
+ titleTemplate: 'New entity',
204
+ resolveRecipients: () => [],
205
+ },
206
+ ];
207
+ const engine = createNotificationEngine({ store, rules });
208
+ const results = await engine.processEvent('entity.created', {}, 'tenant-1');
209
+ expect(results).toHaveLength(0);
210
+ expect(store.createNotification).not.toHaveBeenCalled();
211
+ });
212
+ it('should apply buildData to set notification data', async () => {
213
+ const rules = [
214
+ {
215
+ eventType: 'entity.created',
216
+ notificationType: 'entity_created',
217
+ titleTemplate: 'New entity',
218
+ resolveRecipients: () => ['user-1'],
219
+ buildData: (data) => ({
220
+ data: { entityId: data.entityId },
221
+ link: `/entities/${data.entityId}`,
222
+ }),
223
+ },
224
+ ];
225
+ const engine = createNotificationEngine({ store, rules });
226
+ const results = await engine.processEvent('entity.created', { entityId: 'ent-1' }, 'tenant-1');
227
+ expect(results[0].data).toEqual({ entityId: 'ent-1' });
228
+ });
229
+ it('should handle multiple rules for the same event type', async () => {
230
+ const rules = [
231
+ {
232
+ eventType: 'entity.created',
233
+ notificationType: 'entity_created_admin',
234
+ titleTemplate: 'Admin: new entity',
235
+ resolveRecipients: () => ['admin-1'],
236
+ },
237
+ {
238
+ eventType: 'entity.created',
239
+ notificationType: 'entity_created_owner',
240
+ titleTemplate: 'Owner: new entity',
241
+ resolveRecipients: (data) => [data.triggeredBy],
242
+ },
243
+ ];
244
+ const engine = createNotificationEngine({ store, rules });
245
+ const results = await engine.processEvent('entity.created', { triggeredBy: 'user-1' }, 'tenant-1');
246
+ expect(results).toHaveLength(2);
247
+ expect(results[0].type).toBe('entity_created_admin');
248
+ expect(results[0].user_id).toBe('admin-1');
249
+ expect(results[1].type).toBe('entity_created_owner');
250
+ expect(results[1].user_id).toBe('user-1');
251
+ });
252
+ it('should use empty data when buildData is not provided', async () => {
253
+ const rules = [
254
+ {
255
+ eventType: 'entity.created',
256
+ notificationType: 'entity_created',
257
+ titleTemplate: 'New entity',
258
+ resolveRecipients: () => ['user-1'],
259
+ },
260
+ ];
261
+ const engine = createNotificationEngine({ store, rules });
262
+ const results = await engine.processEvent('entity.created', {}, 'tenant-1');
263
+ expect(results[0].data).toEqual({});
264
+ });
265
+ it('should handle empty rules array', async () => {
266
+ const engine = createNotificationEngine({ store, rules: [] });
267
+ const results = await engine.processEvent('entity.created', {}, 'tenant-1');
268
+ expect(results).toHaveLength(0);
269
+ });
270
+ });
271
+ describe('connectToEventBus', () => {
272
+ it('should subscribe to event types from rules', () => {
273
+ const eventBus = createMockEventBus();
274
+ const rules = [
275
+ {
276
+ eventType: 'entity.created',
277
+ notificationType: 'entity_created',
278
+ titleTemplate: 'New entity',
279
+ resolveRecipients: () => ['user-1'],
280
+ },
281
+ {
282
+ eventType: 'workflow.completed',
283
+ notificationType: 'workflow_done',
284
+ titleTemplate: 'Workflow done',
285
+ resolveRecipients: () => ['user-1'],
286
+ },
287
+ ];
288
+ const engine = createNotificationEngine({ store, rules, eventBus });
289
+ const disconnect = engine.connectToEventBus();
290
+ expect(eventBus.on).toHaveBeenCalledTimes(2);
291
+ expect(typeof disconnect).toBe('function');
292
+ });
293
+ it('should process events from event bus', async () => {
294
+ const eventBus = createMockEventBus();
295
+ const rules = [
296
+ {
297
+ eventType: 'entity.created',
298
+ notificationType: 'entity_created',
299
+ titleTemplate: 'New {{entityTypeSlug}}',
300
+ resolveRecipients: () => ['user-1'],
301
+ },
302
+ ];
303
+ const engine = createNotificationEngine({ store, rules, eventBus });
304
+ engine.connectToEventBus();
305
+ // Emit an event through the bus
306
+ await eventBus.emit('entity.created', {
307
+ entityId: 'ent-1',
308
+ tenantId: 'tenant-1',
309
+ entityTypeSlug: 'person',
310
+ });
311
+ expect(store.createNotification).toHaveBeenCalledOnce();
312
+ });
313
+ it('should disconnect from event bus', () => {
314
+ const eventBus = createMockEventBus();
315
+ const rules = [
316
+ {
317
+ eventType: 'entity.created',
318
+ notificationType: 'entity_created',
319
+ titleTemplate: 'New entity',
320
+ resolveRecipients: () => ['user-1'],
321
+ },
322
+ ];
323
+ const engine = createNotificationEngine({ store, rules, eventBus });
324
+ const disconnect = engine.connectToEventBus();
325
+ // Disconnect should be callable
326
+ disconnect();
327
+ // No error means success
328
+ });
329
+ it('should throw when no eventBus provided', () => {
330
+ const rules = [
331
+ {
332
+ eventType: 'entity.created',
333
+ notificationType: 'entity_created',
334
+ titleTemplate: 'New entity',
335
+ resolveRecipients: () => ['user-1'],
336
+ },
337
+ ];
338
+ const engine = createNotificationEngine({ store, rules });
339
+ expect(() => engine.connectToEventBus()).toThrow('Cannot connect to event bus: no eventBus provided in options');
340
+ });
341
+ it('should deduplicate subscriptions for same event type', () => {
342
+ const eventBus = createMockEventBus();
343
+ const rules = [
344
+ {
345
+ eventType: 'entity.created',
346
+ notificationType: 'entity_created_v1',
347
+ titleTemplate: 'V1: New entity',
348
+ resolveRecipients: () => ['user-1'],
349
+ },
350
+ {
351
+ eventType: 'entity.created',
352
+ notificationType: 'entity_created_v2',
353
+ titleTemplate: 'V2: New entity',
354
+ resolveRecipients: () => ['user-2'],
355
+ },
356
+ ];
357
+ const engine = createNotificationEngine({ store, rules, eventBus });
358
+ engine.connectToEventBus();
359
+ // Only one subscription for 'entity.created' even though two rules match
360
+ expect(eventBus.on).toHaveBeenCalledTimes(1);
361
+ });
362
+ });
363
+ });
364
+ //# sourceMappingURL=notification-engine.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification-engine.test.js","sourceRoot":"","sources":["../../src/notification/notification-engine.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { ErrorTracker, AnalyticsTracker, BillingProvider, EmailProvider, } from './provider-interfaces.js';
2
+ export { noopErrorTracker, noopAnalytics } from './noop-providers.js';
3
+ export { MODEL_REGISTRY, getModelConfig, listModels, getDefaultModel, resolveModel, createProviderRegistry, } from './model-resolver.js';
4
+ export type { ModelProvider, ModelConfig, ModelFilter, ModelFactory, ProviderRegistry, } from './model-resolver.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,YAAY,EACZ,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EACL,cAAc,EACd,cAAc,EACd,UAAU,EACV,eAAe,EACf,YAAY,EACZ,sBAAsB,GACvB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,aAAa,EACb,WAAW,EACX,WAAW,EACX,YAAY,EACZ,gBAAgB,GACjB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { noopErrorTracker, noopAnalytics } from './noop-providers.js';
2
+ export { MODEL_REGISTRY, getModelConfig, listModels, getDefaultModel, resolveModel, createProviderRegistry, } from './model-resolver.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/providers/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEnE,OAAO,EACL,cAAc,EACd,cAAc,EACd,UAAU,EACV,eAAe,EACf,YAAY,EACZ,sBAAsB,GACvB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,93 @@
1
+ import type { LanguageModel } from 'ai';
2
+ /** Supported AI provider identifiers. */
3
+ export type ModelProvider = 'anthropic' | 'openai' | 'google' | 'deepseek' | 'xai';
4
+ /** Metadata and routing information for a known AI model. */
5
+ export interface ModelConfig {
6
+ /** Unique model identifier used for resolution (e.g. 'claude-sonnet-4'). */
7
+ id: string;
8
+ /** Which AI provider hosts this model. */
9
+ provider: ModelProvider;
10
+ /** The provider-specific model ID passed to the SDK (e.g. 'claude-sonnet-4-20250514'). */
11
+ modelId: string;
12
+ /** Human-readable display name. */
13
+ displayName: string;
14
+ /** Maximum context window in tokens. */
15
+ contextWindow?: number;
16
+ /** Whether the model supports image/vision inputs. */
17
+ supportsVision?: boolean;
18
+ /** Whether the model supports tool/function calling. */
19
+ supportsTools?: boolean;
20
+ /** Cost per 1,000 input tokens in USD. */
21
+ costPer1kInput?: number;
22
+ /** Cost per 1,000 output tokens in USD. */
23
+ costPer1kOutput?: number;
24
+ }
25
+ /** Filter criteria for listing models. */
26
+ export interface ModelFilter {
27
+ provider?: ModelProvider;
28
+ supportsTools?: boolean;
29
+ supportsVision?: boolean;
30
+ }
31
+ /**
32
+ * Canonical registry of known AI models with metadata.
33
+ * Consumers use model IDs from this list to resolve provider-specific instances.
34
+ */
35
+ export declare const MODEL_REGISTRY: readonly ModelConfig[];
36
+ /**
37
+ * Look up a model configuration by its canonical ID.
38
+ * Returns undefined if the model ID is not in the registry.
39
+ */
40
+ export declare function getModelConfig(modelId: string): ModelConfig | undefined;
41
+ /**
42
+ * List models from the registry, optionally filtering by provider or capabilities.
43
+ */
44
+ export declare function listModels(filter?: ModelFilter): ModelConfig[];
45
+ /**
46
+ * Get the default model configuration (GPT-4o).
47
+ */
48
+ export declare function getDefaultModel(): ModelConfig;
49
+ /**
50
+ * Factory function that creates an AI SDK LanguageModel from a provider-specific model ID.
51
+ * Consumers register one factory per provider (e.g. anthropic, openai).
52
+ */
53
+ export type ModelFactory = (modelId: string) => LanguageModel;
54
+ /**
55
+ * A map of provider names to their ModelFactory functions.
56
+ * Consumers populate this with their actual AI SDK provider instances.
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * import { anthropic } from '@ai-sdk/anthropic';
61
+ * import { openai } from '@ai-sdk/openai';
62
+ *
63
+ * const providers: ProviderRegistry = new Map([
64
+ * ['anthropic', (id) => anthropic(id)],
65
+ * ['openai', (id) => openai(id)],
66
+ * ]);
67
+ * ```
68
+ */
69
+ export type ProviderRegistry = Map<string, ModelFactory>;
70
+ /**
71
+ * Resolve a canonical model ID to an AI SDK LanguageModel instance.
72
+ *
73
+ * Looks up the model in MODEL_REGISTRY, finds its provider, then delegates
74
+ * to the matching factory in the ProviderRegistry.
75
+ *
76
+ * @throws {Error} If the model ID is not in the registry
77
+ * @throws {Error} If no provider factory is registered for the model's provider
78
+ */
79
+ export declare function resolveModel(modelId: string, providers: ProviderRegistry): LanguageModel;
80
+ /**
81
+ * Create a ProviderRegistry from a plain object of provider name to factory pairs.
82
+ * Convenience helper to avoid manual Map construction.
83
+ *
84
+ * @example
85
+ * ```ts
86
+ * const providers = createProviderRegistry({
87
+ * anthropic: (id) => anthropic(id),
88
+ * openai: (id) => openai(id),
89
+ * });
90
+ * ```
91
+ */
92
+ export declare function createProviderRegistry(factories: Record<string, ModelFactory>): ProviderRegistry;
93
+ //# sourceMappingURL=model-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-resolver.d.ts","sourceRoot":"","sources":["../../src/providers/model-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAExC,yCAAyC;AACzC,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,KAAK,CAAC;AAEnF,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,4EAA4E;IAC5E,EAAE,EAAE,MAAM,CAAC;IACX,0CAA0C;IAC1C,QAAQ,EAAE,aAAa,CAAC;IACxB,0FAA0F;IAC1F,OAAO,EAAE,MAAM,CAAC;IAChB,mCAAmC;IACnC,WAAW,EAAE,MAAM,CAAC;IACpB,wCAAwC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,wDAAwD;IACxD,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,2CAA2C;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,0CAA0C;AAC1C,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,cAAc,EAAE,SAAS,WAAW,EA4EvC,CAAC;AAKX;;;GAGG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAEvE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,EAAE,CAW9D;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAM7C;AAED;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,aAAa,CAAC;AAE9D;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,gBAAgB,GAAG,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;AAEzD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,gBAAgB,GAAG,aAAa,CAcxF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,gBAAgB,CAEhG"}