@sprinterai/runtime 0.7.1 → 0.9.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 (502) hide show
  1. package/dist/adapters/mcp-adapter.js +2 -2
  2. package/dist/adapters/mcp-adapter.js.map +1 -1
  3. package/dist/agent/delegate.js +1 -1
  4. package/dist/agent/delegate.js.map +1 -1
  5. package/dist/agent/heartbeat-scheduler.d.ts +36 -0
  6. package/dist/agent/heartbeat-scheduler.d.ts.map +1 -0
  7. package/dist/agent/heartbeat-scheduler.js +57 -0
  8. package/dist/agent/heartbeat-scheduler.js.map +1 -0
  9. package/dist/agent/heartbeat-scheduler.test.d.ts +2 -0
  10. package/dist/agent/heartbeat-scheduler.test.d.ts.map +1 -0
  11. package/dist/agent/heartbeat-scheduler.test.js +216 -0
  12. package/dist/agent/heartbeat-scheduler.test.js.map +1 -0
  13. package/dist/agent/index.d.ts +3 -0
  14. package/dist/agent/index.d.ts.map +1 -1
  15. package/dist/agent/index.js +2 -0
  16. package/dist/agent/index.js.map +1 -1
  17. package/dist/agent/versioning.d.ts +22 -0
  18. package/dist/agent/versioning.d.ts.map +1 -0
  19. package/dist/agent/versioning.js +47 -0
  20. package/dist/agent/versioning.js.map +1 -0
  21. package/dist/agent/versioning.test.d.ts +2 -0
  22. package/dist/agent/versioning.test.d.ts.map +1 -0
  23. package/dist/agent/versioning.test.js +147 -0
  24. package/dist/agent/versioning.test.js.map +1 -0
  25. package/dist/analytics/analytics-recorder.d.ts +12 -0
  26. package/dist/analytics/analytics-recorder.d.ts.map +1 -0
  27. package/dist/analytics/analytics-recorder.js +27 -0
  28. package/dist/analytics/analytics-recorder.js.map +1 -0
  29. package/dist/analytics/analytics-recorder.test.d.ts +2 -0
  30. package/dist/analytics/analytics-recorder.test.d.ts.map +1 -0
  31. package/dist/analytics/analytics-recorder.test.js +98 -0
  32. package/dist/analytics/analytics-recorder.test.js.map +1 -0
  33. package/dist/analytics/analytics-types.d.ts +13 -0
  34. package/dist/analytics/analytics-types.d.ts.map +1 -0
  35. package/dist/analytics/analytics-types.js +2 -0
  36. package/dist/analytics/analytics-types.js.map +1 -0
  37. package/dist/analytics/index.d.ts +4 -0
  38. package/dist/analytics/index.d.ts.map +1 -0
  39. package/dist/analytics/index.js +2 -0
  40. package/dist/analytics/index.js.map +1 -0
  41. package/dist/automation/index.d.ts +51 -0
  42. package/dist/automation/index.d.ts.map +1 -0
  43. package/dist/automation/index.js +119 -0
  44. package/dist/automation/index.js.map +1 -0
  45. package/dist/automation/index.test.d.ts +2 -0
  46. package/dist/automation/index.test.d.ts.map +1 -0
  47. package/dist/automation/index.test.js +135 -0
  48. package/dist/automation/index.test.js.map +1 -0
  49. package/dist/capture/capture-parser.d.ts +13 -0
  50. package/dist/capture/capture-parser.d.ts.map +1 -0
  51. package/dist/capture/capture-parser.js +55 -0
  52. package/dist/capture/capture-parser.js.map +1 -0
  53. package/dist/capture/capture-parser.test.d.ts +2 -0
  54. package/dist/capture/capture-parser.test.d.ts.map +1 -0
  55. package/dist/capture/capture-parser.test.js +134 -0
  56. package/dist/capture/capture-parser.test.js.map +1 -0
  57. package/dist/capture/capture-schema.d.ts +12 -0
  58. package/dist/capture/capture-schema.d.ts.map +1 -0
  59. package/dist/capture/capture-schema.js +16 -0
  60. package/dist/capture/capture-schema.js.map +1 -0
  61. package/dist/capture/capture-schema.test.d.ts +2 -0
  62. package/dist/capture/capture-schema.test.d.ts.map +1 -0
  63. package/dist/capture/capture-schema.test.js +72 -0
  64. package/dist/capture/capture-schema.test.js.map +1 -0
  65. package/dist/capture/create-from-capture.d.ts +14 -0
  66. package/dist/capture/create-from-capture.d.ts.map +1 -0
  67. package/dist/capture/create-from-capture.js +30 -0
  68. package/dist/capture/create-from-capture.js.map +1 -0
  69. package/dist/capture/create-from-capture.test.d.ts +2 -0
  70. package/dist/capture/create-from-capture.test.d.ts.map +1 -0
  71. package/dist/capture/create-from-capture.test.js +148 -0
  72. package/dist/capture/create-from-capture.test.js.map +1 -0
  73. package/dist/capture/index.d.ts +7 -0
  74. package/dist/capture/index.d.ts.map +1 -0
  75. package/dist/capture/index.js +4 -0
  76. package/dist/capture/index.js.map +1 -0
  77. package/dist/chat/chat-handler.test.js +1 -1
  78. package/dist/chat/chat-handler.test.js.map +1 -1
  79. package/dist/chat/inbox.d.ts +96 -0
  80. package/dist/chat/inbox.d.ts.map +1 -0
  81. package/dist/chat/inbox.js +170 -0
  82. package/dist/chat/inbox.js.map +1 -0
  83. package/dist/chat/inbox.test.d.ts +2 -0
  84. package/dist/chat/inbox.test.d.ts.map +1 -0
  85. package/dist/chat/inbox.test.js +520 -0
  86. package/dist/chat/inbox.test.js.map +1 -0
  87. package/dist/chat/index.d.ts +5 -3
  88. package/dist/chat/index.d.ts.map +1 -1
  89. package/dist/chat/index.js +3 -2
  90. package/dist/chat/index.js.map +1 -1
  91. package/dist/context/context-keys.d.ts +7 -0
  92. package/dist/context/context-keys.d.ts.map +1 -0
  93. package/dist/context/context-keys.js +6 -0
  94. package/dist/context/context-keys.js.map +1 -0
  95. package/dist/context/format-context.d.ts +14 -0
  96. package/dist/context/format-context.d.ts.map +1 -0
  97. package/dist/context/format-context.js +82 -0
  98. package/dist/context/format-context.js.map +1 -0
  99. package/dist/context/format-context.test.d.ts +2 -0
  100. package/dist/context/format-context.test.d.ts.map +1 -0
  101. package/dist/context/format-context.test.js +130 -0
  102. package/dist/context/format-context.test.js.map +1 -0
  103. package/dist/context/index.d.ts +6 -0
  104. package/dist/context/index.d.ts.map +1 -0
  105. package/dist/context/index.js +5 -0
  106. package/dist/context/index.js.map +1 -0
  107. package/dist/context/load-context.d.ts +8 -0
  108. package/dist/context/load-context.d.ts.map +1 -0
  109. package/dist/context/load-context.js +22 -0
  110. package/dist/context/load-context.js.map +1 -0
  111. package/dist/context/load-context.test.d.ts +2 -0
  112. package/dist/context/load-context.test.d.ts.map +1 -0
  113. package/dist/context/load-context.test.js +111 -0
  114. package/dist/context/load-context.test.js.map +1 -0
  115. package/dist/context/shared-context.d.ts +11 -0
  116. package/dist/context/shared-context.d.ts.map +1 -0
  117. package/dist/context/shared-context.js +14 -0
  118. package/dist/context/shared-context.js.map +1 -0
  119. package/dist/context/shared-context.test.d.ts +2 -0
  120. package/dist/context/shared-context.test.d.ts.map +1 -0
  121. package/dist/context/shared-context.test.js +90 -0
  122. package/dist/context/shared-context.test.js.map +1 -0
  123. package/dist/document/deletion.d.ts +17 -0
  124. package/dist/document/deletion.d.ts.map +1 -0
  125. package/dist/document/deletion.js +11 -0
  126. package/dist/document/deletion.js.map +1 -0
  127. package/dist/document/deletion.test.d.ts +2 -0
  128. package/dist/document/deletion.test.d.ts.map +1 -0
  129. package/dist/document/deletion.test.js +33 -0
  130. package/dist/document/deletion.test.js.map +1 -0
  131. package/dist/document/index.d.ts +12 -0
  132. package/dist/document/index.d.ts.map +1 -1
  133. package/dist/document/index.js +7 -0
  134. package/dist/document/index.js.map +1 -1
  135. package/dist/document/linking.d.ts +42 -0
  136. package/dist/document/linking.d.ts.map +1 -0
  137. package/dist/document/linking.js +49 -0
  138. package/dist/document/linking.js.map +1 -0
  139. package/dist/document/linking.test.d.ts +2 -0
  140. package/dist/document/linking.test.d.ts.map +1 -0
  141. package/dist/document/linking.test.js +86 -0
  142. package/dist/document/linking.test.js.map +1 -0
  143. package/dist/document/pagination.d.ts +24 -0
  144. package/dist/document/pagination.d.ts.map +1 -0
  145. package/dist/document/pagination.js +24 -0
  146. package/dist/document/pagination.js.map +1 -0
  147. package/dist/document/pagination.test.d.ts +2 -0
  148. package/dist/document/pagination.test.d.ts.map +1 -0
  149. package/dist/document/pagination.test.js +84 -0
  150. package/dist/document/pagination.test.js.map +1 -0
  151. package/dist/document/search.d.ts +37 -0
  152. package/dist/document/search.d.ts.map +1 -0
  153. package/dist/document/search.js +37 -0
  154. package/dist/document/search.js.map +1 -0
  155. package/dist/document/search.test.d.ts +2 -0
  156. package/dist/document/search.test.d.ts.map +1 -0
  157. package/dist/document/search.test.js +97 -0
  158. package/dist/document/search.test.js.map +1 -0
  159. package/dist/document/upload.d.ts +15 -0
  160. package/dist/document/upload.d.ts.map +1 -0
  161. package/dist/document/upload.js +12 -0
  162. package/dist/document/upload.js.map +1 -0
  163. package/dist/document/upload.test.d.ts +2 -0
  164. package/dist/document/upload.test.d.ts.map +1 -0
  165. package/dist/document/upload.test.js +70 -0
  166. package/dist/document/upload.test.js.map +1 -0
  167. package/dist/document/url-generation.d.ts +21 -0
  168. package/dist/document/url-generation.d.ts.map +1 -0
  169. package/dist/document/url-generation.js +14 -0
  170. package/dist/document/url-generation.js.map +1 -0
  171. package/dist/document/url-generation.test.d.ts +2 -0
  172. package/dist/document/url-generation.test.d.ts.map +1 -0
  173. package/dist/document/url-generation.test.js +38 -0
  174. package/dist/document/url-generation.test.js.map +1 -0
  175. package/dist/email/engine.d.ts +19 -0
  176. package/dist/email/engine.d.ts.map +1 -0
  177. package/dist/email/engine.js +30 -0
  178. package/dist/email/engine.js.map +1 -0
  179. package/dist/email/engine.test.d.ts +2 -0
  180. package/dist/email/engine.test.d.ts.map +1 -0
  181. package/dist/email/engine.test.js +128 -0
  182. package/dist/email/engine.test.js.map +1 -0
  183. package/dist/email/index.d.ts +5 -0
  184. package/dist/email/index.d.ts.map +1 -0
  185. package/dist/email/index.js +3 -0
  186. package/dist/email/index.js.map +1 -0
  187. package/dist/email/templates.d.ts +33 -0
  188. package/dist/email/templates.d.ts.map +1 -0
  189. package/dist/email/templates.js +132 -0
  190. package/dist/email/templates.js.map +1 -0
  191. package/dist/email/templates.test.d.ts +2 -0
  192. package/dist/email/templates.test.d.ts.map +1 -0
  193. package/dist/email/templates.test.js +158 -0
  194. package/dist/email/templates.test.js.map +1 -0
  195. package/dist/entity/bulk-operations.d.ts +39 -0
  196. package/dist/entity/bulk-operations.d.ts.map +1 -0
  197. package/dist/entity/bulk-operations.js +127 -0
  198. package/dist/entity/bulk-operations.js.map +1 -0
  199. package/dist/entity/bulk-operations.test.d.ts +2 -0
  200. package/dist/entity/bulk-operations.test.d.ts.map +1 -0
  201. package/dist/entity/bulk-operations.test.js +212 -0
  202. package/dist/entity/bulk-operations.test.js.map +1 -0
  203. package/dist/entity/collections.d.ts +17 -0
  204. package/dist/entity/collections.d.ts.map +1 -0
  205. package/dist/entity/collections.js +22 -0
  206. package/dist/entity/collections.js.map +1 -0
  207. package/dist/entity/collections.test.d.ts +2 -0
  208. package/dist/entity/collections.test.d.ts.map +1 -0
  209. package/dist/entity/collections.test.js +92 -0
  210. package/dist/entity/collections.test.js.map +1 -0
  211. package/dist/entity/index.d.ts +9 -0
  212. package/dist/entity/index.d.ts.map +1 -0
  213. package/dist/entity/index.js +6 -0
  214. package/dist/entity/index.js.map +1 -0
  215. package/dist/entity/relations.d.ts +65 -0
  216. package/dist/entity/relations.d.ts.map +1 -0
  217. package/dist/entity/relations.js +110 -0
  218. package/dist/entity/relations.js.map +1 -0
  219. package/dist/entity/relations.test.d.ts +2 -0
  220. package/dist/entity/relations.test.d.ts.map +1 -0
  221. package/dist/entity/relations.test.js +202 -0
  222. package/dist/entity/relations.test.js.map +1 -0
  223. package/dist/entity/resolve-relation-columns.d.ts +31 -0
  224. package/dist/entity/resolve-relation-columns.d.ts.map +1 -0
  225. package/dist/entity/resolve-relation-columns.js +156 -0
  226. package/dist/entity/resolve-relation-columns.js.map +1 -0
  227. package/dist/entity/resolve-relation-columns.test.d.ts +2 -0
  228. package/dist/entity/resolve-relation-columns.test.d.ts.map +1 -0
  229. package/dist/entity/resolve-relation-columns.test.js +281 -0
  230. package/dist/entity/resolve-relation-columns.test.js.map +1 -0
  231. package/dist/entity/sharing.d.ts +41 -0
  232. package/dist/entity/sharing.d.ts.map +1 -0
  233. package/dist/entity/sharing.js +52 -0
  234. package/dist/entity/sharing.js.map +1 -0
  235. package/dist/entity/sharing.test.d.ts +2 -0
  236. package/dist/entity/sharing.test.d.ts.map +1 -0
  237. package/dist/entity/sharing.test.js +178 -0
  238. package/dist/entity/sharing.test.js.map +1 -0
  239. package/dist/external-data/external-data-receiver.d.ts +43 -0
  240. package/dist/external-data/external-data-receiver.d.ts.map +1 -0
  241. package/dist/external-data/external-data-receiver.js +81 -0
  242. package/dist/external-data/external-data-receiver.js.map +1 -0
  243. package/dist/external-data/external-data-receiver.test.d.ts +2 -0
  244. package/dist/external-data/external-data-receiver.test.d.ts.map +1 -0
  245. package/dist/external-data/external-data-receiver.test.js +189 -0
  246. package/dist/external-data/external-data-receiver.test.js.map +1 -0
  247. package/dist/external-data/extract-by-path.d.ts +13 -0
  248. package/dist/external-data/extract-by-path.d.ts.map +1 -0
  249. package/dist/external-data/extract-by-path.js +25 -0
  250. package/dist/external-data/extract-by-path.js.map +1 -0
  251. package/dist/external-data/extract-by-path.test.d.ts +2 -0
  252. package/dist/external-data/extract-by-path.test.d.ts.map +1 -0
  253. package/dist/external-data/extract-by-path.test.js +47 -0
  254. package/dist/external-data/extract-by-path.test.js.map +1 -0
  255. package/dist/external-data/index.d.ts +4 -0
  256. package/dist/external-data/index.d.ts.map +1 -0
  257. package/dist/external-data/index.js +3 -0
  258. package/dist/external-data/index.js.map +1 -0
  259. package/dist/feed/digest.d.ts +35 -0
  260. package/dist/feed/digest.d.ts.map +1 -0
  261. package/dist/feed/digest.js +273 -0
  262. package/dist/feed/digest.js.map +1 -0
  263. package/dist/feed/filters.d.ts +41 -0
  264. package/dist/feed/filters.d.ts.map +1 -0
  265. package/dist/feed/filters.js +97 -0
  266. package/dist/feed/filters.js.map +1 -0
  267. package/dist/feed/index.d.ts +20 -0
  268. package/dist/feed/index.d.ts.map +1 -0
  269. package/dist/feed/index.js +23 -0
  270. package/dist/feed/index.js.map +1 -0
  271. package/dist/feed/ranking.d.ts +42 -0
  272. package/dist/feed/ranking.d.ts.map +1 -0
  273. package/dist/feed/ranking.js +133 -0
  274. package/dist/feed/ranking.js.map +1 -0
  275. package/dist/feed/resolver.d.ts +76 -0
  276. package/dist/feed/resolver.d.ts.map +1 -0
  277. package/dist/feed/resolver.js +173 -0
  278. package/dist/feed/resolver.js.map +1 -0
  279. package/dist/feed/transformers.d.ts +80 -0
  280. package/dist/feed/transformers.d.ts.map +1 -0
  281. package/dist/feed/transformers.js +179 -0
  282. package/dist/feed/transformers.js.map +1 -0
  283. package/dist/feed/types.d.ts +131 -0
  284. package/dist/feed/types.d.ts.map +1 -0
  285. package/dist/feed/types.js +6 -0
  286. package/dist/feed/types.js.map +1 -0
  287. package/dist/import/batch-upsert.d.ts +18 -0
  288. package/dist/import/batch-upsert.d.ts.map +1 -0
  289. package/dist/import/batch-upsert.js +67 -0
  290. package/dist/import/batch-upsert.js.map +1 -0
  291. package/dist/import/index.d.ts +7 -0
  292. package/dist/import/index.d.ts.map +1 -0
  293. package/dist/import/index.js +4 -0
  294. package/dist/import/index.js.map +1 -0
  295. package/dist/import/merge-content.d.ts +8 -0
  296. package/dist/import/merge-content.d.ts.map +1 -0
  297. package/dist/import/merge-content.js +20 -0
  298. package/dist/import/merge-content.js.map +1 -0
  299. package/dist/import/merge-content.test.d.ts +2 -0
  300. package/dist/import/merge-content.test.d.ts.map +1 -0
  301. package/dist/import/merge-content.test.js +53 -0
  302. package/dist/import/merge-content.test.js.map +1 -0
  303. package/dist/import/types.d.ts +20 -0
  304. package/dist/import/types.d.ts.map +1 -0
  305. package/dist/import/types.js +2 -0
  306. package/dist/import/types.js.map +1 -0
  307. package/dist/import/upsert-matcher.d.ts +39 -0
  308. package/dist/import/upsert-matcher.d.ts.map +1 -0
  309. package/dist/import/upsert-matcher.js +67 -0
  310. package/dist/import/upsert-matcher.js.map +1 -0
  311. package/dist/import/upsert-matcher.test.d.ts +2 -0
  312. package/dist/import/upsert-matcher.test.d.ts.map +1 -0
  313. package/dist/import/upsert-matcher.test.js +77 -0
  314. package/dist/import/upsert-matcher.test.js.map +1 -0
  315. package/dist/index.d.ts +66 -1
  316. package/dist/index.d.ts.map +1 -1
  317. package/dist/index.js +48 -1
  318. package/dist/index.js.map +1 -1
  319. package/dist/memory/index.d.ts +4 -3
  320. package/dist/memory/index.d.ts.map +1 -1
  321. package/dist/memory/index.js +3 -2
  322. package/dist/memory/index.js.map +1 -1
  323. package/dist/memory/user-memory.d.ts +15 -0
  324. package/dist/memory/user-memory.d.ts.map +1 -0
  325. package/dist/memory/user-memory.js +20 -0
  326. package/dist/memory/user-memory.js.map +1 -0
  327. package/dist/memory/user-memory.test.d.ts +2 -0
  328. package/dist/memory/user-memory.test.d.ts.map +1 -0
  329. package/dist/memory/user-memory.test.js +74 -0
  330. package/dist/memory/user-memory.test.js.map +1 -0
  331. package/dist/module/create-runtime.d.ts +4 -1
  332. package/dist/module/create-runtime.d.ts.map +1 -1
  333. package/dist/module/create-runtime.js.map +1 -1
  334. package/dist/module/create-runtime.test.js +1 -1
  335. package/dist/module/create-runtime.test.js.map +1 -1
  336. package/dist/module/map-supabase-stores.d.ts +3 -0
  337. package/dist/module/map-supabase-stores.d.ts.map +1 -1
  338. package/dist/module/map-supabase-stores.js +3 -0
  339. package/dist/module/map-supabase-stores.js.map +1 -1
  340. package/dist/module/module-loader.test.js +1 -1
  341. package/dist/module/module-loader.test.js.map +1 -1
  342. package/dist/providers/index.d.ts +2 -1
  343. package/dist/providers/index.d.ts.map +1 -1
  344. package/dist/providers/index.js.map +1 -1
  345. package/dist/providers/model-resolver.d.ts +11 -3
  346. package/dist/providers/model-resolver.d.ts.map +1 -1
  347. package/dist/providers/model-resolver.js +166 -11
  348. package/dist/providers/model-resolver.js.map +1 -1
  349. package/dist/providers/model-resolver.test.js +10 -10
  350. package/dist/providers/model-resolver.test.js.map +1 -1
  351. package/dist/providers/provider-interfaces.d.ts +0 -20
  352. package/dist/providers/provider-interfaces.d.ts.map +1 -1
  353. package/dist/providers/provider-interfaces.js +1 -0
  354. package/dist/providers/provider-interfaces.js.map +1 -1
  355. package/dist/scoring/index.d.ts +4 -2
  356. package/dist/scoring/index.d.ts.map +1 -1
  357. package/dist/scoring/index.js +2 -1
  358. package/dist/scoring/index.js.map +1 -1
  359. package/dist/scoring/promotion.d.ts +20 -0
  360. package/dist/scoring/promotion.d.ts.map +1 -0
  361. package/dist/scoring/promotion.js +39 -0
  362. package/dist/scoring/promotion.js.map +1 -0
  363. package/dist/scoring/promotion.test.d.ts +2 -0
  364. package/dist/scoring/promotion.test.d.ts.map +1 -0
  365. package/dist/scoring/promotion.test.js +141 -0
  366. package/dist/scoring/promotion.test.js.map +1 -0
  367. package/dist/settings/index.d.ts +15 -0
  368. package/dist/settings/index.d.ts.map +1 -0
  369. package/dist/settings/index.js +47 -0
  370. package/dist/settings/index.js.map +1 -0
  371. package/dist/settings/index.test.d.ts +2 -0
  372. package/dist/settings/index.test.d.ts.map +1 -0
  373. package/dist/settings/index.test.js +75 -0
  374. package/dist/settings/index.test.js.map +1 -0
  375. package/dist/skill/index.d.ts +4 -0
  376. package/dist/skill/index.d.ts.map +1 -0
  377. package/dist/skill/index.js +3 -0
  378. package/dist/skill/index.js.map +1 -0
  379. package/dist/skill/skill-loader.d.ts +18 -0
  380. package/dist/skill/skill-loader.d.ts.map +1 -0
  381. package/dist/skill/skill-loader.js +31 -0
  382. package/dist/skill/skill-loader.js.map +1 -0
  383. package/dist/skill/skill-loader.test.d.ts +2 -0
  384. package/dist/skill/skill-loader.test.d.ts.map +1 -0
  385. package/dist/skill/skill-loader.test.js +64 -0
  386. package/dist/skill/skill-loader.test.js.map +1 -0
  387. package/dist/skill/skill-prompt.d.ts +7 -0
  388. package/dist/skill/skill-prompt.d.ts.map +1 -0
  389. package/dist/skill/skill-prompt.js +17 -0
  390. package/dist/skill/skill-prompt.js.map +1 -0
  391. package/dist/skill/skill-prompt.test.d.ts +2 -0
  392. package/dist/skill/skill-prompt.test.d.ts.map +1 -0
  393. package/dist/skill/skill-prompt.test.js +44 -0
  394. package/dist/skill/skill-prompt.test.js.map +1 -0
  395. package/dist/source/index.d.ts +5 -0
  396. package/dist/source/index.d.ts.map +1 -0
  397. package/dist/source/index.js +3 -0
  398. package/dist/source/index.js.map +1 -0
  399. package/dist/source/source-poller.d.ts +66 -0
  400. package/dist/source/source-poller.d.ts.map +1 -0
  401. package/dist/source/source-poller.js +64 -0
  402. package/dist/source/source-poller.js.map +1 -0
  403. package/dist/source/source-poller.test.d.ts +2 -0
  404. package/dist/source/source-poller.test.d.ts.map +1 -0
  405. package/dist/source/source-poller.test.js +184 -0
  406. package/dist/source/source-poller.test.js.map +1 -0
  407. package/dist/source/source-status.d.ts +41 -0
  408. package/dist/source/source-status.d.ts.map +1 -0
  409. package/dist/source/source-status.js +73 -0
  410. package/dist/source/source-status.js.map +1 -0
  411. package/dist/source/source-status.test.d.ts +2 -0
  412. package/dist/source/source-status.test.d.ts.map +1 -0
  413. package/dist/source/source-status.test.js +116 -0
  414. package/dist/source/source-status.test.js.map +1 -0
  415. package/dist/template/index.d.ts +61 -0
  416. package/dist/template/index.d.ts.map +1 -0
  417. package/dist/template/index.js +100 -0
  418. package/dist/template/index.js.map +1 -0
  419. package/dist/template/index.test.d.ts +2 -0
  420. package/dist/template/index.test.d.ts.map +1 -0
  421. package/dist/template/index.test.js +167 -0
  422. package/dist/template/index.test.js.map +1 -0
  423. package/dist/testing/in-memory-agent-version-store.d.ts +13 -0
  424. package/dist/testing/in-memory-agent-version-store.d.ts.map +1 -0
  425. package/dist/testing/in-memory-agent-version-store.js +36 -0
  426. package/dist/testing/in-memory-agent-version-store.js.map +1 -0
  427. package/dist/testing/in-memory-chat-store.d.ts +11 -1
  428. package/dist/testing/in-memory-chat-store.d.ts.map +1 -1
  429. package/dist/testing/in-memory-chat-store.js +66 -0
  430. package/dist/testing/in-memory-chat-store.js.map +1 -1
  431. package/dist/testing/in-memory-entity-store.d.ts +2 -0
  432. package/dist/testing/in-memory-entity-store.d.ts.map +1 -1
  433. package/dist/testing/in-memory-entity-store.js +8 -3
  434. package/dist/testing/in-memory-entity-store.js.map +1 -1
  435. package/dist/testing/in-memory-entity-store.test.js +2 -1
  436. package/dist/testing/in-memory-entity-store.test.js.map +1 -1
  437. package/dist/testing/in-memory-heartbeat-run-store.d.ts +21 -0
  438. package/dist/testing/in-memory-heartbeat-run-store.d.ts.map +1 -0
  439. package/dist/testing/in-memory-heartbeat-run-store.js +107 -0
  440. package/dist/testing/in-memory-heartbeat-run-store.js.map +1 -0
  441. package/dist/testing/index.d.ts +9 -7
  442. package/dist/testing/index.d.ts.map +1 -1
  443. package/dist/testing/index.js +9 -7
  444. package/dist/testing/index.js.map +1 -1
  445. package/dist/tool/ai-bridge.test.js +1 -1
  446. package/dist/tool/ai-bridge.test.js.map +1 -1
  447. package/dist/tool/catalog.test.js +1 -1
  448. package/dist/tool/catalog.test.js.map +1 -1
  449. package/dist/tool/entity-tools-factory.d.ts.map +1 -1
  450. package/dist/tool/entity-tools-factory.js +11 -5
  451. package/dist/tool/entity-tools-factory.js.map +1 -1
  452. package/dist/tool/execute-registered-tool.test.js +1 -1
  453. package/dist/tool/execute-registered-tool.test.js.map +1 -1
  454. package/dist/tool/gallery/gallery-tools.js +1 -1
  455. package/dist/tool/gallery/gallery-tools.js.map +1 -1
  456. package/dist/tool/index.d.ts +2 -0
  457. package/dist/tool/index.d.ts.map +1 -1
  458. package/dist/tool/index.js +1 -0
  459. package/dist/tool/index.js.map +1 -1
  460. package/dist/tool/resolve-tools.test.js +1 -1
  461. package/dist/tool/resolve-tools.test.js.map +1 -1
  462. package/dist/tool/session-manager.d.ts +35 -0
  463. package/dist/tool/session-manager.d.ts.map +1 -0
  464. package/dist/tool/session-manager.js +40 -0
  465. package/dist/tool/session-manager.js.map +1 -0
  466. package/dist/tool/session-manager.test.d.ts +2 -0
  467. package/dist/tool/session-manager.test.d.ts.map +1 -0
  468. package/dist/tool/session-manager.test.js +139 -0
  469. package/dist/tool/session-manager.test.js.map +1 -0
  470. package/dist/tool/tool-executor.test.js +1 -1
  471. package/dist/tool/tool-executor.test.js.map +1 -1
  472. package/dist/tool/tool-registry.test.js +1 -1
  473. package/dist/tool/tool-registry.test.js.map +1 -1
  474. package/dist/tool/zod-to-json-schema.d.ts +3 -3
  475. package/dist/tool/zod-to-json-schema.d.ts.map +1 -1
  476. package/dist/tool/zod-to-json-schema.js +13 -4
  477. package/dist/tool/zod-to-json-schema.js.map +1 -1
  478. package/dist/tool/zod-to-json-schema.test.js +7 -5
  479. package/dist/tool/zod-to-json-schema.test.js.map +1 -1
  480. package/dist/workflow/claim-manager.d.ts +24 -0
  481. package/dist/workflow/claim-manager.d.ts.map +1 -0
  482. package/dist/workflow/claim-manager.js +31 -0
  483. package/dist/workflow/claim-manager.js.map +1 -0
  484. package/dist/workflow/claim-manager.test.d.ts +2 -0
  485. package/dist/workflow/claim-manager.test.d.ts.map +1 -0
  486. package/dist/workflow/claim-manager.test.js +124 -0
  487. package/dist/workflow/claim-manager.test.js.map +1 -0
  488. package/dist/workflow/create-node-executor.js +2 -2
  489. package/dist/workflow/create-node-executor.js.map +1 -1
  490. package/dist/workflow/index.d.ts +3 -0
  491. package/dist/workflow/index.d.ts.map +1 -1
  492. package/dist/workflow/index.js +4 -0
  493. package/dist/workflow/index.js.map +1 -1
  494. package/dist/workflow/run-queries.d.ts +45 -0
  495. package/dist/workflow/run-queries.d.ts.map +1 -0
  496. package/dist/workflow/run-queries.js +80 -0
  497. package/dist/workflow/run-queries.js.map +1 -0
  498. package/dist/workflow/run-queries.test.d.ts +2 -0
  499. package/dist/workflow/run-queries.test.d.ts.map +1 -0
  500. package/dist/workflow/run-queries.test.js +177 -0
  501. package/dist/workflow/run-queries.test.js.map +1 -0
  502. package/package.json +107 -4
@@ -0,0 +1,212 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { bulkDeleteEntities, bulkAddTags, bulkRemoveTags, bulkUpdateField, } from './bulk-operations.js';
3
+ function makeEntity(id, overrides = {}) {
4
+ return {
5
+ id,
6
+ tenant_id: 'tenant-1',
7
+ slug: `entity-${id}`,
8
+ entity_type_id: 'type-1',
9
+ title: `Entity ${id}`,
10
+ description: null,
11
+ content: {},
12
+ metadata: null,
13
+ owner_id: null,
14
+ parent_id: null,
15
+ image_url: null,
16
+ tags: [],
17
+ visibility: 'private',
18
+ share_token: null,
19
+ created_at: '2026-01-01T00:00:00Z',
20
+ updated_at: '2026-01-01T00:00:00Z',
21
+ ...overrides,
22
+ };
23
+ }
24
+ function makeStore(entities = []) {
25
+ const map = new Map(entities.map((e) => [e.id, e]));
26
+ return {
27
+ getEntityType: vi.fn(async () => null),
28
+ listEntityTypes: vi.fn(async () => []),
29
+ createEntityType: vi.fn(),
30
+ updateEntityType: vi.fn(),
31
+ deleteEntityType: vi.fn(),
32
+ getEntity: vi.fn(async (id) => map.get(id) ?? null),
33
+ searchEntities: vi.fn(async () => []),
34
+ createEntity: vi.fn(),
35
+ updateEntity: vi.fn(async (id, input) => {
36
+ const existing = map.get(id);
37
+ if (!existing)
38
+ throw new Error('not found');
39
+ const updated = { ...existing, ...input };
40
+ map.set(id, updated);
41
+ return updated;
42
+ }),
43
+ deleteEntity: vi.fn(async (id) => {
44
+ if (!map.has(id))
45
+ throw new Error('not found');
46
+ map.delete(id);
47
+ }),
48
+ createRelation: vi.fn(),
49
+ deleteRelation: vi.fn(),
50
+ getRelatedEntities: vi.fn(async () => []),
51
+ getEntityCounts: vi.fn(async () => ({})),
52
+ };
53
+ }
54
+ // ─── bulkDeleteEntities ───────────────────────────────────────
55
+ describe('bulkDeleteEntities', () => {
56
+ it('returns zero counts for empty input', async () => {
57
+ const store = makeStore();
58
+ const result = await bulkDeleteEntities([], store);
59
+ expect(result).toEqual({ succeeded: 0, failed: 0, errors: [] });
60
+ expect(store.deleteEntity).not.toHaveBeenCalled();
61
+ });
62
+ it('deletes all entities and counts successes', async () => {
63
+ const entities = [makeEntity('e1'), makeEntity('e2'), makeEntity('e3')];
64
+ const store = makeStore(entities);
65
+ const result = await bulkDeleteEntities(['e1', 'e2', 'e3'], store);
66
+ expect(result.succeeded).toBe(3);
67
+ expect(result.failed).toBe(0);
68
+ expect(result.errors).toHaveLength(0);
69
+ expect(store.deleteEntity).toHaveBeenCalledTimes(3);
70
+ });
71
+ it('records errors for failing deletes and continues', async () => {
72
+ const entities = [makeEntity('e1'), makeEntity('e2')];
73
+ const store = makeStore(entities);
74
+ vi.spyOn(store, 'deleteEntity').mockRejectedValueOnce(new Error('Access denied'));
75
+ const result = await bulkDeleteEntities(['e1', 'e2'], store);
76
+ expect(result.succeeded).toBe(1);
77
+ expect(result.failed).toBe(1);
78
+ expect(result.errors[0]).toContain('e1');
79
+ expect(result.errors[0]).toContain('Access denied');
80
+ });
81
+ it('respects custom batch size', async () => {
82
+ const entities = Array.from({ length: 5 }, (_, i) => makeEntity(`e${i}`));
83
+ const store = makeStore(entities);
84
+ const ids = entities.map((e) => e.id);
85
+ const result = await bulkDeleteEntities(ids, store, 2);
86
+ expect(result.succeeded).toBe(5);
87
+ expect(result.failed).toBe(0);
88
+ });
89
+ });
90
+ // ─── bulkAddTags ─────────────────────────────────────────────
91
+ describe('bulkAddTags', () => {
92
+ it('returns zero counts for empty entity list', async () => {
93
+ const store = makeStore();
94
+ const result = await bulkAddTags([], ['tag1'], store);
95
+ expect(result).toEqual({ succeeded: 0, failed: 0, errors: [] });
96
+ });
97
+ it('returns all succeeded when tags list is empty', async () => {
98
+ const store = makeStore([makeEntity('e1')]);
99
+ const result = await bulkAddTags(['e1'], [], store);
100
+ expect(result).toEqual({ succeeded: 1, failed: 0, errors: [] });
101
+ expect(store.updateEntity).not.toHaveBeenCalled();
102
+ });
103
+ it('adds tags to entities', async () => {
104
+ const entity = makeEntity('e1', { tags: ['existing'] });
105
+ const store = makeStore([entity]);
106
+ const result = await bulkAddTags(['e1'], ['new', 'tag'], store);
107
+ expect(result.succeeded).toBe(1);
108
+ expect(store.updateEntity).toHaveBeenCalledWith('e1', {
109
+ tags: expect.arrayContaining(['existing', 'new', 'tag']),
110
+ });
111
+ });
112
+ it('deduplicates tags', async () => {
113
+ const entity = makeEntity('e1', { tags: ['a', 'b'] });
114
+ const store = makeStore([entity]);
115
+ await bulkAddTags(['e1'], ['b', 'c'], store);
116
+ const callArgs = vi.mocked(store.updateEntity).mock.calls[0];
117
+ const updatedTags = callArgs[1].tags;
118
+ expect(updatedTags).toEqual(['a', 'b', 'c']);
119
+ });
120
+ it('records error for missing entity', async () => {
121
+ const store = makeStore([]);
122
+ const result = await bulkAddTags(['missing'], ['tag'], store);
123
+ expect(result.failed).toBe(1);
124
+ expect(result.errors[0]).toContain('missing');
125
+ });
126
+ it('adds tags to multiple entities', async () => {
127
+ const entities = [makeEntity('e1'), makeEntity('e2')];
128
+ const store = makeStore(entities);
129
+ const result = await bulkAddTags(['e1', 'e2'], ['shared-tag'], store);
130
+ expect(result.succeeded).toBe(2);
131
+ expect(store.updateEntity).toHaveBeenCalledTimes(2);
132
+ });
133
+ });
134
+ // ─── bulkRemoveTags ───────────────────────────────────────────
135
+ describe('bulkRemoveTags', () => {
136
+ it('returns zero counts for empty entity list', async () => {
137
+ const store = makeStore();
138
+ const result = await bulkRemoveTags([], ['tag1'], store);
139
+ expect(result).toEqual({ succeeded: 0, failed: 0, errors: [] });
140
+ });
141
+ it('returns all succeeded when tags list is empty', async () => {
142
+ const store = makeStore([makeEntity('e1')]);
143
+ const result = await bulkRemoveTags(['e1'], [], store);
144
+ expect(result).toEqual({ succeeded: 1, failed: 0, errors: [] });
145
+ expect(store.updateEntity).not.toHaveBeenCalled();
146
+ });
147
+ it('removes specified tags from entities', async () => {
148
+ const entity = makeEntity('e1', { tags: ['a', 'b', 'c'] });
149
+ const store = makeStore([entity]);
150
+ const result = await bulkRemoveTags(['e1'], ['b', 'c'], store);
151
+ expect(result.succeeded).toBe(1);
152
+ expect(store.updateEntity).toHaveBeenCalledWith('e1', { tags: ['a'] });
153
+ });
154
+ it('no-ops silently for tags not present', async () => {
155
+ const entity = makeEntity('e1', { tags: ['a'] });
156
+ const store = makeStore([entity]);
157
+ const result = await bulkRemoveTags(['e1'], ['nonexistent'], store);
158
+ expect(result.succeeded).toBe(1);
159
+ expect(store.updateEntity).toHaveBeenCalledWith('e1', { tags: ['a'] });
160
+ });
161
+ it('records error for missing entity', async () => {
162
+ const store = makeStore([]);
163
+ const result = await bulkRemoveTags(['missing'], ['tag'], store);
164
+ expect(result.failed).toBe(1);
165
+ });
166
+ });
167
+ // ─── bulkUpdateField ──────────────────────────────────────────
168
+ describe('bulkUpdateField', () => {
169
+ it('returns zero counts for empty entity list', async () => {
170
+ const store = makeStore();
171
+ const result = await bulkUpdateField([], 'status', 'active', store);
172
+ expect(result).toEqual({ succeeded: 0, failed: 0, errors: [] });
173
+ });
174
+ it('sets field on entity content', async () => {
175
+ const entity = makeEntity('e1', { content: { existing: 'value' } });
176
+ const store = makeStore([entity]);
177
+ const result = await bulkUpdateField(['e1'], 'status', 'active', store);
178
+ expect(result.succeeded).toBe(1);
179
+ expect(store.updateEntity).toHaveBeenCalledWith('e1', {
180
+ content: { existing: 'value', status: 'active' },
181
+ });
182
+ });
183
+ it('merges with existing content without overwriting other fields', async () => {
184
+ const entity = makeEntity('e1', { content: { a: 1, b: 2 } });
185
+ const store = makeStore([entity]);
186
+ await bulkUpdateField(['e1'], 'c', 3, store);
187
+ const callArgs = vi.mocked(store.updateEntity).mock.calls[0];
188
+ expect(callArgs[1].content).toEqual({ a: 1, b: 2, c: 3 });
189
+ });
190
+ it('handles null content gracefully', async () => {
191
+ const entity = makeEntity('e1', { content: null });
192
+ const store = makeStore([entity]);
193
+ const result = await bulkUpdateField(['e1'], 'status', 'done', store);
194
+ expect(result.succeeded).toBe(1);
195
+ expect(store.updateEntity).toHaveBeenCalledWith('e1', {
196
+ content: { status: 'done' },
197
+ });
198
+ });
199
+ it('records error for missing entity', async () => {
200
+ const store = makeStore([]);
201
+ const result = await bulkUpdateField(['missing'], 'status', 'active', store);
202
+ expect(result.failed).toBe(1);
203
+ expect(result.errors[0]).toContain('missing');
204
+ });
205
+ it('updates multiple entities', async () => {
206
+ const entities = [makeEntity('e1'), makeEntity('e2')];
207
+ const store = makeStore(entities);
208
+ const result = await bulkUpdateField(['e1', 'e2'], 'priority', 'high', store);
209
+ expect(result.succeeded).toBe(2);
210
+ });
211
+ });
212
+ //# sourceMappingURL=bulk-operations.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bulk-operations.test.js","sourceRoot":"","sources":["../../src/entity/bulk-operations.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CollectionShareRecord, CreateCollectionShareInput, CollectionShareStore } from '@sprinterai/core';
2
+ /**
3
+ * Create a shareable collection view for an entity type.
4
+ *
5
+ * The collection can be filtered by score, tags, or field values.
6
+ * An optional expiry can be set via `expiresInDays`.
7
+ */
8
+ export declare function createCollectionShare(input: CreateCollectionShareInput, store: CollectionShareStore): Promise<CollectionShareRecord>;
9
+ /**
10
+ * Delete a collection share link.
11
+ */
12
+ export declare function deleteCollectionShare(shareId: string, store: CollectionShareStore): Promise<void>;
13
+ /**
14
+ * List all collection shares created by a user.
15
+ */
16
+ export declare function listCollectionShares(userId: string, store: CollectionShareStore): Promise<CollectionShareRecord[]>;
17
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/entity/collections.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAC1B,oBAAoB,EACrB,MAAM,kBAAkB,CAAC;AAE1B;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,0BAA0B,EACjC,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,CAAC,CAEhC;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,oBAAoB,GAC1B,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAElC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Create a shareable collection view for an entity type.
3
+ *
4
+ * The collection can be filtered by score, tags, or field values.
5
+ * An optional expiry can be set via `expiresInDays`.
6
+ */
7
+ export async function createCollectionShare(input, store) {
8
+ return store.createCollectionShare(input);
9
+ }
10
+ /**
11
+ * Delete a collection share link.
12
+ */
13
+ export async function deleteCollectionShare(shareId, store) {
14
+ return store.deleteCollectionShare(shareId);
15
+ }
16
+ /**
17
+ * List all collection shares created by a user.
18
+ */
19
+ export async function listCollectionShares(userId, store) {
20
+ return store.listCollectionShares(userId);
21
+ }
22
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/entity/collections.ts"],"names":[],"mappings":"AAMA;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAiC,EACjC,KAA2B;IAE3B,OAAO,KAAK,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAe,EACf,KAA2B;IAE3B,OAAO,KAAK,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,MAAc,EACd,KAA2B;IAE3B,OAAO,KAAK,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=collections.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.test.d.ts","sourceRoot":"","sources":["../../src/entity/collections.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,92 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { createCollectionShare, deleteCollectionShare, listCollectionShares } from './collections.js';
3
+ function makeCollectionShare(overrides = {}) {
4
+ return {
5
+ id: 'cs-1',
6
+ tenant_id: 'tenant-1',
7
+ token: 'collection-token-abc',
8
+ entity_type_slug: 'articles',
9
+ filters: { entityTypeSlug: 'articles' },
10
+ title: null,
11
+ description: null,
12
+ created_by: 'user-1',
13
+ created_at: '2026-01-01T00:00:00Z',
14
+ expires_at: null,
15
+ ...overrides,
16
+ };
17
+ }
18
+ function makeStore(records = []) {
19
+ return {
20
+ createCollectionShare: vi.fn(async (input) => makeCollectionShare({
21
+ entity_type_slug: input.entityTypeSlug,
22
+ filters: input.filters,
23
+ title: input.title ?? null,
24
+ description: input.description ?? null,
25
+ expires_at: input.expiresInDays
26
+ ? new Date(Date.now() + input.expiresInDays * 86400000).toISOString()
27
+ : null,
28
+ })),
29
+ deleteCollectionShare: vi.fn(async () => undefined),
30
+ listCollectionShares: vi.fn(async () => records),
31
+ };
32
+ }
33
+ // ─── createCollectionShare ────────────────────────────────────
34
+ describe('createCollectionShare', () => {
35
+ it('calls store.createCollectionShare with input', async () => {
36
+ const store = makeStore();
37
+ const input = {
38
+ entityTypeSlug: 'articles',
39
+ filters: { entityTypeSlug: 'articles', tags: ['featured'] },
40
+ title: 'Featured Articles',
41
+ };
42
+ await createCollectionShare(input, store);
43
+ expect(store.createCollectionShare).toHaveBeenCalledWith(input);
44
+ });
45
+ it('returns the created share record', async () => {
46
+ const store = makeStore();
47
+ const result = await createCollectionShare({ entityTypeSlug: 'articles', filters: { entityTypeSlug: 'articles' } }, store);
48
+ expect(result).toMatchObject({
49
+ entity_type_slug: 'articles',
50
+ token: expect.any(String),
51
+ });
52
+ });
53
+ it('passes all optional fields through', async () => {
54
+ const store = makeStore();
55
+ await createCollectionShare({
56
+ entityTypeSlug: 'projects',
57
+ filters: { entityTypeSlug: 'projects', minScore: 80 },
58
+ title: 'Top Projects',
59
+ description: 'Highest scoring projects',
60
+ expiresInDays: 7,
61
+ }, store);
62
+ expect(store.createCollectionShare).toHaveBeenCalledWith(expect.objectContaining({
63
+ title: 'Top Projects',
64
+ description: 'Highest scoring projects',
65
+ expiresInDays: 7,
66
+ }));
67
+ });
68
+ });
69
+ // ─── deleteCollectionShare ────────────────────────────────────
70
+ describe('deleteCollectionShare', () => {
71
+ it('calls store.deleteCollectionShare with the shareId', async () => {
72
+ const store = makeStore();
73
+ await deleteCollectionShare('cs-1', store);
74
+ expect(store.deleteCollectionShare).toHaveBeenCalledWith('cs-1');
75
+ });
76
+ });
77
+ // ─── listCollectionShares ─────────────────────────────────────
78
+ describe('listCollectionShares', () => {
79
+ it('returns shares from the store for the given userId', async () => {
80
+ const records = [makeCollectionShare(), makeCollectionShare({ id: 'cs-2' })];
81
+ const store = makeStore(records);
82
+ const result = await listCollectionShares('user-1', store);
83
+ expect(result).toHaveLength(2);
84
+ expect(store.listCollectionShares).toHaveBeenCalledWith('user-1');
85
+ });
86
+ it('returns empty array when user has no collection shares', async () => {
87
+ const store = makeStore([]);
88
+ const result = await listCollectionShares('user-1', store);
89
+ expect(result).toEqual([]);
90
+ });
91
+ });
92
+ //# sourceMappingURL=collections.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.test.js","sourceRoot":"","sources":["../../src/entity/collections.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export { resolveRelationColumns } from './resolve-relation-columns.js';
2
+ export type { EntityRelationRow, RelatedEntityRow, RelationColumnStore, } from './resolve-relation-columns.js';
3
+ export { buildRelationInserts, createEntityRelation, deleteEntityRelation, getRelatedEntities, getEntityRelationsForRoute, syncEntityRelationsFromConfig, } from './relations.js';
4
+ export type { EntityRelationCrudStore } from './relations.js';
5
+ export type { BulkOperationResult } from './bulk-operations.js';
6
+ export { bulkDeleteEntities, bulkAddTags, bulkRemoveTags, bulkUpdateField, } from './bulk-operations.js';
7
+ export { shareEntityWithUser, removeEntityShare, getEntityShares, updateEntityVisibility, generateShareToken, getEntityByShareToken, } from './sharing.js';
8
+ export { createCollectionShare, deleteCollectionShare, listCollectionShares, } from './collections.js';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/entity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,YAAY,EACV,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAE9D,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,6 @@
1
+ export { resolveRelationColumns } from './resolve-relation-columns.js';
2
+ export { buildRelationInserts, createEntityRelation, deleteEntityRelation, getRelatedEntities, getEntityRelationsForRoute, syncEntityRelationsFromConfig, } from './relations.js';
3
+ export { bulkDeleteEntities, bulkAddTags, bulkRemoveTags, bulkUpdateField, } from './bulk-operations.js';
4
+ export { shareEntityWithUser, removeEntityShare, getEntityShares, updateEntityVisibility, generateShareToken, getEntityByShareToken, } from './sharing.js';
5
+ export { createCollectionShare, deleteCollectionShare, listCollectionShares, } from './collections.js';
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/entity/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAOvE,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,kBAAkB,EAClB,0BAA0B,EAC1B,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AAIxB,OAAO,EACL,kBAAkB,EAClB,WAAW,EACX,cAAc,EACd,eAAe,GAChB,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,mBAAmB,EACnB,iBAAiB,EACjB,eAAe,EACf,sBAAsB,EACtB,kBAAkB,EAClB,qBAAqB,GACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,65 @@
1
+ import type { EntityRelationRecord, EntityTypeRelationConfig, RelatedEntityWithRelation } from '@sprinterai/core';
2
+ /** Minimal store interface required for entity relation CRUD operations. */
3
+ export interface EntityRelationCrudStore {
4
+ createRelation(fromId: string, toId: string, type: string): Promise<void>;
5
+ deleteRelation(relationId: string): Promise<void>;
6
+ getRelatedEntities(entityId: string): Promise<RelatedEntityWithRelation[]>;
7
+ }
8
+ /**
9
+ * Build relation insert rows from a relation config map.
10
+ * Pure function — no store required. Used by entity create (API + AI tools)
11
+ * to batch-insert all relations in one DB call.
12
+ *
13
+ * @param relationConfigs - Relation configs for the entity type.
14
+ * @param relationsMap - Map of relation key → target entity IDs.
15
+ * @param entityId - The source entity ID (goes in `from_entity_id`).
16
+ * @param tenantId - Tenant scope for all rows.
17
+ * @returns Insert-ready rows (without `created_at`).
18
+ */
19
+ export declare function buildRelationInserts(relationConfigs: EntityTypeRelationConfig[], relationsMap: Record<string, string[]>, entityId: string, tenantId: string): Array<Omit<EntityRelationRecord, 'created_at'>>;
20
+ /**
21
+ * Create a single relation between two entities.
22
+ *
23
+ * @param store - Store implementing `createRelation`.
24
+ * @param fromId - Source entity ID.
25
+ * @param toId - Target entity ID.
26
+ * @param type - Relationship type string.
27
+ */
28
+ export declare function createEntityRelation(store: Pick<EntityRelationCrudStore, 'createRelation'>, fromId: string, toId: string, type: string): Promise<void>;
29
+ /**
30
+ * Delete a relation by its ID.
31
+ *
32
+ * @param store - Store implementing `deleteRelation`.
33
+ * @param relationId - The relation record ID to delete.
34
+ */
35
+ export declare function deleteEntityRelation(store: Pick<EntityRelationCrudStore, 'deleteRelation'>, relationId: string): Promise<void>;
36
+ /**
37
+ * Fetch all entities related to a given entity (in either direction).
38
+ *
39
+ * @param store - Store implementing `getRelatedEntities`.
40
+ * @param entityId - The entity to resolve relations for.
41
+ * @returns Related entities with their relation metadata.
42
+ */
43
+ export declare function getRelatedEntities(store: Pick<EntityRelationCrudStore, 'getRelatedEntities'>, entityId: string): Promise<RelatedEntityWithRelation[]>;
44
+ /**
45
+ * Get related entities formatted for the entity detail route view.
46
+ * Returns the same data as `getRelatedEntities` — exists as a named alias
47
+ * that clarifies intent for route-level callers.
48
+ *
49
+ * @param store - Store implementing `getRelatedEntities`.
50
+ * @param entityId - The entity to resolve relations for.
51
+ */
52
+ export declare function getEntityRelationsForRoute(store: Pick<EntityRelationCrudStore, 'getRelatedEntities'>, entityId: string): Promise<RelatedEntityWithRelation[]>;
53
+ /**
54
+ * Sync an entity's relations to match the desired state in `relationsMap`.
55
+ *
56
+ * For each key in `relationsMap`, adds missing relations and removes stale ones.
57
+ * Inserts and deletes are executed in parallel.
58
+ *
59
+ * @param store - Store implementing relation CRUD.
60
+ * @param entityId - The source entity whose relations to sync.
61
+ * @param relationConfigs - Relation configs for the entity type.
62
+ * @param relationsMap - Desired state: map of relation key → target entity IDs.
63
+ */
64
+ export declare function syncEntityRelationsFromConfig(store: EntityRelationCrudStore, entityId: string, relationConfigs: EntityTypeRelationConfig[], relationsMap: Record<string, string[]>): Promise<void>;
65
+ //# sourceMappingURL=relations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.d.ts","sourceRoot":"","sources":["../../src/entity/relations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,wBAAwB,EACxB,yBAAyB,EAC1B,MAAM,kBAAkB,CAAC;AAI1B,4EAA4E;AAC5E,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1E,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAAC;CAC5E;AAID;;;;;;;;;;GAUG;AACH,wBAAgB,oBAAoB,CAClC,eAAe,EAAE,wBAAwB,EAAE,EAC3C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EACtC,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,EAAE,YAAY,CAAC,CAAC,CAkBjD;AAID;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,EACtD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,gBAAgB,CAAC,EACtD,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,IAAI,CAAC,CAEf;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,EAC1D,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAEtC;AAED;;;;;;;GAOG;AACH,wBAAsB,0BAA0B,CAC9C,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,oBAAoB,CAAC,EAC1D,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,yBAAyB,EAAE,CAAC,CAEtC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,6BAA6B,CACjD,KAAK,EAAE,uBAAuB,EAC9B,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,wBAAwB,EAAE,EAC3C,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,GACrC,OAAO,CAAC,IAAI,CAAC,CAgCf"}
@@ -0,0 +1,110 @@
1
+ // ─── Pure Helpers ─────────────────────────────────────────────────────────────
2
+ /**
3
+ * Build relation insert rows from a relation config map.
4
+ * Pure function — no store required. Used by entity create (API + AI tools)
5
+ * to batch-insert all relations in one DB call.
6
+ *
7
+ * @param relationConfigs - Relation configs for the entity type.
8
+ * @param relationsMap - Map of relation key → target entity IDs.
9
+ * @param entityId - The source entity ID (goes in `from_entity_id`).
10
+ * @param tenantId - Tenant scope for all rows.
11
+ * @returns Insert-ready rows (without `created_at`).
12
+ */
13
+ export function buildRelationInserts(relationConfigs, relationsMap, entityId, tenantId) {
14
+ const inserts = [];
15
+ for (const [key, targetIds] of Object.entries(relationsMap)) {
16
+ const rc = relationConfigs.find((r) => r.key === key);
17
+ if (!rc)
18
+ continue;
19
+ for (const targetId of targetIds) {
20
+ inserts.push({
21
+ id: crypto.randomUUID(),
22
+ tenant_id: tenantId,
23
+ from_entity_id: entityId,
24
+ to_entity_id: targetId,
25
+ relationship_type: rc.relationshipType,
26
+ });
27
+ }
28
+ }
29
+ return inserts;
30
+ }
31
+ // ─── CRUD Functions ───────────────────────────────────────────────────────────
32
+ /**
33
+ * Create a single relation between two entities.
34
+ *
35
+ * @param store - Store implementing `createRelation`.
36
+ * @param fromId - Source entity ID.
37
+ * @param toId - Target entity ID.
38
+ * @param type - Relationship type string.
39
+ */
40
+ export async function createEntityRelation(store, fromId, toId, type) {
41
+ await store.createRelation(fromId, toId, type);
42
+ }
43
+ /**
44
+ * Delete a relation by its ID.
45
+ *
46
+ * @param store - Store implementing `deleteRelation`.
47
+ * @param relationId - The relation record ID to delete.
48
+ */
49
+ export async function deleteEntityRelation(store, relationId) {
50
+ await store.deleteRelation(relationId);
51
+ }
52
+ /**
53
+ * Fetch all entities related to a given entity (in either direction).
54
+ *
55
+ * @param store - Store implementing `getRelatedEntities`.
56
+ * @param entityId - The entity to resolve relations for.
57
+ * @returns Related entities with their relation metadata.
58
+ */
59
+ export async function getRelatedEntities(store, entityId) {
60
+ return store.getRelatedEntities(entityId);
61
+ }
62
+ /**
63
+ * Get related entities formatted for the entity detail route view.
64
+ * Returns the same data as `getRelatedEntities` — exists as a named alias
65
+ * that clarifies intent for route-level callers.
66
+ *
67
+ * @param store - Store implementing `getRelatedEntities`.
68
+ * @param entityId - The entity to resolve relations for.
69
+ */
70
+ export async function getEntityRelationsForRoute(store, entityId) {
71
+ return store.getRelatedEntities(entityId);
72
+ }
73
+ /**
74
+ * Sync an entity's relations to match the desired state in `relationsMap`.
75
+ *
76
+ * For each key in `relationsMap`, adds missing relations and removes stale ones.
77
+ * Inserts and deletes are executed in parallel.
78
+ *
79
+ * @param store - Store implementing relation CRUD.
80
+ * @param entityId - The source entity whose relations to sync.
81
+ * @param relationConfigs - Relation configs for the entity type.
82
+ * @param relationsMap - Desired state: map of relation key → target entity IDs.
83
+ */
84
+ export async function syncEntityRelationsFromConfig(store, entityId, relationConfigs, relationsMap) {
85
+ const existing = await store.getRelatedEntities(entityId);
86
+ const toAdd = [];
87
+ const toRemoveIds = [];
88
+ for (const [key, targetIds] of Object.entries(relationsMap)) {
89
+ const rc = relationConfigs.find((r) => r.key === key);
90
+ if (!rc)
91
+ continue;
92
+ const existingForType = existing.filter((r) => r.relation.relationship_type === rc.relationshipType);
93
+ const existingTargetIds = existingForType.map((r) => r.entity.id);
94
+ for (const targetId of targetIds) {
95
+ if (!existingTargetIds.includes(targetId)) {
96
+ toAdd.push({ fromId: entityId, toId: targetId, type: rc.relationshipType });
97
+ }
98
+ }
99
+ for (const rel of existingForType) {
100
+ if (!targetIds.includes(rel.entity.id)) {
101
+ toRemoveIds.push(rel.relation.id);
102
+ }
103
+ }
104
+ }
105
+ await Promise.all([
106
+ ...toAdd.map((r) => store.createRelation(r.fromId, r.toId, r.type)),
107
+ ...toRemoveIds.map((id) => store.deleteRelation(id)),
108
+ ]);
109
+ }
110
+ //# sourceMappingURL=relations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.js","sourceRoot":"","sources":["../../src/entity/relations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=relations.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relations.test.d.ts","sourceRoot":"","sources":["../../src/entity/relations.test.ts"],"names":[],"mappings":""}