@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,33 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { deleteDocument } from './deletion.js';
3
+ function makeStore() {
4
+ return {
5
+ deleteDocumentWithFile: vi.fn(async () => undefined),
6
+ };
7
+ }
8
+ describe('deleteDocument', () => {
9
+ it('delegates to store.deleteDocumentWithFile', async () => {
10
+ const store = makeStore();
11
+ await deleteDocument(store, 'doc-1');
12
+ expect(store.deleteDocumentWithFile).toHaveBeenCalledWith('doc-1');
13
+ });
14
+ it('calls with the exact documentId provided', async () => {
15
+ const store = makeStore();
16
+ await deleteDocument(store, 'doc-abc-123');
17
+ expect(store.deleteDocumentWithFile).toHaveBeenCalledWith('doc-abc-123');
18
+ expect(store.deleteDocumentWithFile).toHaveBeenCalledTimes(1);
19
+ });
20
+ it('propagates store errors', async () => {
21
+ const store = {
22
+ deleteDocumentWithFile: vi.fn(async () => {
23
+ throw new Error('File not found in storage');
24
+ }),
25
+ };
26
+ await expect(deleteDocument(store, 'doc-1')).rejects.toThrow('File not found in storage');
27
+ });
28
+ it('resolves without error on success', async () => {
29
+ const store = makeStore();
30
+ await expect(deleteDocument(store, 'doc-1')).resolves.toBeUndefined();
31
+ });
32
+ });
33
+ //# sourceMappingURL=deletion.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deletion.test.js","sourceRoot":"","sources":["../../src/document/deletion.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,SAAS,SAAS;IAChB,OAAO;QACL,sBAAsB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,SAAS,CAAC;KACrD,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAE1B,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAErC,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAE1B,MAAM,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAE3C,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;QACzE,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,KAAK,IAAI,EAAE;QACvC,MAAM,KAAK,GAA0B;YACnC,sBAAsB,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE;gBACvC,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;YAC/C,CAAC,CAAC;SACH,CAAC;QAEF,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAC5F,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,KAAK,GAAG,SAAS,EAAE,CAAC;QAC1B,MAAM,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -2,4 +2,16 @@ export { chunkText, chunkPages } from './chunk-generator.js';
2
2
  export { createDocumentProcessor } from './document-processor.js';
3
3
  export type { ProcessDocumentOptions, ProcessDocumentResult } from './document-processor.js';
4
4
  export { textParser } from './parsers/index.js';
5
+ export { uploadDocument } from './upload.js';
6
+ export type { UploadDocumentStore } from './upload.js';
7
+ export { getDocumentPages, getDocumentPage } from './pagination.js';
8
+ export type { DocumentPageStore } from './pagination.js';
9
+ export { searchDocumentPages, searchAllDocuments } from './search.js';
10
+ export type { DocumentSearchStore } from './search.js';
11
+ export { linkDocumentToEntity, unlinkDocumentFromEntity, DOCUMENT_RELATIONSHIP_TYPE, } from './linking.js';
12
+ export type { DocumentLinkStore } from './linking.js';
13
+ export { deleteDocument } from './deletion.js';
14
+ export type { DocumentDeletionStore } from './deletion.js';
15
+ export { getDocumentUrl, DEFAULT_URL_EXPIRY_SECONDS } from './url-generation.js';
16
+ export type { DocumentUrlStore } from './url-generation.js';
5
17
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/document/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/document/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EAAE,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAGvC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AACnE,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AACnB,YAAY,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAEnD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,YAAY,EAAE,qBAAqB,EAAE,MAAM,YAAY,CAAC;AAExD,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC;AAC9E,YAAY,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
@@ -1,4 +1,11 @@
1
1
  export { chunkText, chunkPages } from './chunk-generator.js';
2
2
  export { createDocumentProcessor } from './document-processor.js';
3
3
  export { textParser } from './parsers/index.js';
4
+ // ─── Document Operations ────────────────────────────────────
5
+ export { uploadDocument } from './upload.js';
6
+ export { getDocumentPages, getDocumentPage } from './pagination.js';
7
+ export { searchDocumentPages, searchAllDocuments } from './search.js';
8
+ export { linkDocumentToEntity, unlinkDocumentFromEntity, DOCUMENT_RELATIONSHIP_TYPE, } from './linking.js';
9
+ export { deleteDocument } from './deletion.js';
10
+ export { getDocumentUrl, DEFAULT_URL_EXPIRY_SECONDS } from './url-generation.js';
4
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/document/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/document/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAEvC,+DAA+D;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGjE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAGnE,OAAO,EACL,oBAAoB,EACpB,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,WAAW,CAAC;AAGnB,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { DocumentRecord } from '@sprinterai/core';
2
+ /** Relationship type used when linking a document to an entity. */
3
+ export declare const DOCUMENT_RELATIONSHIP_TYPE: "document";
4
+ /** Minimal store surface required for document-entity linking. */
5
+ export interface DocumentLinkStore {
6
+ /** Get a document record by ID. */
7
+ getDocument(id: string): Promise<DocumentRecord | null>;
8
+ /** Create a directional relation between two entities. */
9
+ createEntityRelation(input: {
10
+ tenantId: string;
11
+ fromEntityId: string;
12
+ toEntityId: string;
13
+ relationshipType: string;
14
+ }): Promise<void>;
15
+ /** Remove a directional relation between two entities. */
16
+ deleteEntityRelation(input: {
17
+ tenantId: string;
18
+ fromEntityId: string;
19
+ toEntityId: string;
20
+ relationshipType: string;
21
+ }): Promise<void>;
22
+ }
23
+ /**
24
+ * Link a document to an entity by creating an entity relation.
25
+ * The document must have an associated `document_entity_id`.
26
+ *
27
+ * @param store - Document + relation store.
28
+ * @param documentId - The document to link.
29
+ * @param entityId - The entity to link from.
30
+ * @param tenantId - The owning tenant.
31
+ */
32
+ export declare function linkDocumentToEntity(store: DocumentLinkStore, documentId: string, entityId: string, tenantId: string): Promise<void>;
33
+ /**
34
+ * Remove the link between a document and an entity.
35
+ *
36
+ * @param store - Document + relation store.
37
+ * @param documentId - The document to unlink.
38
+ * @param entityId - The entity to unlink from.
39
+ * @param tenantId - The owning tenant.
40
+ */
41
+ export declare function unlinkDocumentFromEntity(store: DocumentLinkStore, documentId: string, entityId: string, tenantId: string): Promise<void>;
42
+ //# sourceMappingURL=linking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linking.d.ts","sourceRoot":"","sources":["../../src/document/linking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAEvD,mEAAmE;AACnE,eAAO,MAAM,0BAA0B,EAAG,UAAmB,CAAC;AAE9D,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,mCAAmC;IACnC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACxD,0DAA0D;IAC1D,oBAAoB,CAAC,KAAK,EAAE;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClB,0DAA0D;IAC1D,oBAAoB,CAAC,KAAK,EAAE;QAC1B,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,UAAU,EAAE,MAAM,CAAC;QACnB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAef;AAED;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAaf"}
@@ -0,0 +1,49 @@
1
+ /** Relationship type used when linking a document to an entity. */
2
+ export const DOCUMENT_RELATIONSHIP_TYPE = 'document';
3
+ /**
4
+ * Link a document to an entity by creating an entity relation.
5
+ * The document must have an associated `document_entity_id`.
6
+ *
7
+ * @param store - Document + relation store.
8
+ * @param documentId - The document to link.
9
+ * @param entityId - The entity to link from.
10
+ * @param tenantId - The owning tenant.
11
+ */
12
+ export async function linkDocumentToEntity(store, documentId, entityId, tenantId) {
13
+ const doc = await store.getDocument(documentId);
14
+ if (!doc) {
15
+ throw new Error(`Document not found: ${documentId}`);
16
+ }
17
+ if (!doc.entity_id) {
18
+ throw new Error(`Document ${documentId} has no entity representation to link from`);
19
+ }
20
+ await store.createEntityRelation({
21
+ tenantId,
22
+ fromEntityId: entityId,
23
+ toEntityId: doc.entity_id,
24
+ relationshipType: DOCUMENT_RELATIONSHIP_TYPE,
25
+ });
26
+ }
27
+ /**
28
+ * Remove the link between a document and an entity.
29
+ *
30
+ * @param store - Document + relation store.
31
+ * @param documentId - The document to unlink.
32
+ * @param entityId - The entity to unlink from.
33
+ * @param tenantId - The owning tenant.
34
+ */
35
+ export async function unlinkDocumentFromEntity(store, documentId, entityId, tenantId) {
36
+ const doc = await store.getDocument(documentId);
37
+ if (!doc) {
38
+ throw new Error(`Document not found: ${documentId}`);
39
+ }
40
+ if (!doc.entity_id)
41
+ return; // Nothing to unlink
42
+ await store.deleteEntityRelation({
43
+ tenantId,
44
+ fromEntityId: entityId,
45
+ toEntityId: doc.entity_id,
46
+ relationshipType: DOCUMENT_RELATIONSHIP_TYPE,
47
+ });
48
+ }
49
+ //# sourceMappingURL=linking.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linking.js","sourceRoot":"","sources":["../../src/document/linking.ts"],"names":[],"mappings":"AAEA,mEAAmE;AACnE,MAAM,CAAC,MAAM,0BAA0B,GAAG,UAAmB,CAAC;AAsB9D;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,KAAwB,EACxB,UAAkB,EAClB,QAAgB,EAChB,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,YAAY,UAAU,4CAA4C,CAAC,CAAC;IACtF,CAAC;IAED,MAAM,KAAK,CAAC,oBAAoB,CAAC;QAC/B,QAAQ;QACR,YAAY,EAAE,QAAQ;QACtB,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,gBAAgB,EAAE,0BAA0B;KAC7C,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,KAAwB,EACxB,UAAkB,EAClB,QAAgB,EAChB,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChD,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,SAAS;QAAE,OAAO,CAAC,oBAAoB;IAEhD,MAAM,KAAK,CAAC,oBAAoB,CAAC;QAC/B,QAAQ;QACR,YAAY,EAAE,QAAQ;QACtB,UAAU,EAAE,GAAG,CAAC,SAAS;QACzB,gBAAgB,EAAE,0BAA0B;KAC7C,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=linking.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linking.test.d.ts","sourceRoot":"","sources":["../../src/document/linking.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,86 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { linkDocumentToEntity, unlinkDocumentFromEntity, DOCUMENT_RELATIONSHIP_TYPE, } from './linking.js';
3
+ function makeDoc(overrides = {}) {
4
+ return {
5
+ id: 'doc-1',
6
+ tenant_id: 'tenant-1',
7
+ entity_id: 'doc-entity-1',
8
+ title: 'Report',
9
+ file_name: 'report.pdf',
10
+ file_type: 'application/pdf',
11
+ file_size: 2048,
12
+ storage_path: 'tenant-1/doc-1/report.pdf',
13
+ url: null,
14
+ status: 'ready',
15
+ page_count: 5,
16
+ metadata: null,
17
+ uploaded_by: null,
18
+ created_at: '2026-01-01T00:00:00Z',
19
+ updated_at: '2026-01-01T00:00:00Z',
20
+ ...overrides,
21
+ };
22
+ }
23
+ function makeStore(doc) {
24
+ return {
25
+ getDocument: vi.fn(async () => doc),
26
+ createEntityRelation: vi.fn(async () => undefined),
27
+ deleteEntityRelation: vi.fn(async () => undefined),
28
+ };
29
+ }
30
+ describe('DOCUMENT_RELATIONSHIP_TYPE', () => {
31
+ it('is the string "document"', () => {
32
+ expect(DOCUMENT_RELATIONSHIP_TYPE).toBe('document');
33
+ });
34
+ });
35
+ describe('linkDocumentToEntity', () => {
36
+ it('creates an entity relation from entity to document entity', async () => {
37
+ const doc = makeDoc({ id: 'doc-1', entity_id: 'doc-entity-1' });
38
+ const store = makeStore(doc);
39
+ await linkDocumentToEntity(store, 'doc-1', 'company-1', 'tenant-1');
40
+ expect(store.createEntityRelation).toHaveBeenCalledWith({
41
+ tenantId: 'tenant-1',
42
+ fromEntityId: 'company-1',
43
+ toEntityId: 'doc-entity-1',
44
+ relationshipType: 'document',
45
+ });
46
+ });
47
+ it('throws when document is not found', async () => {
48
+ const store = makeStore(null);
49
+ await expect(linkDocumentToEntity(store, 'missing-doc', 'company-1', 'tenant-1')).rejects.toThrow('Document not found: missing-doc');
50
+ });
51
+ it('throws when document has no entity representation', async () => {
52
+ const doc = makeDoc({ entity_id: null });
53
+ const store = makeStore(doc);
54
+ await expect(linkDocumentToEntity(store, 'doc-1', 'company-1', 'tenant-1')).rejects.toThrow('has no entity representation');
55
+ });
56
+ it('looks up the document by the provided documentId', async () => {
57
+ const doc = makeDoc({ id: 'doc-42' });
58
+ const store = makeStore(doc);
59
+ await linkDocumentToEntity(store, 'doc-42', 'entity-1', 'tenant-1');
60
+ expect(store.getDocument).toHaveBeenCalledWith('doc-42');
61
+ });
62
+ });
63
+ describe('unlinkDocumentFromEntity', () => {
64
+ it('deletes the entity relation', async () => {
65
+ const doc = makeDoc({ entity_id: 'doc-entity-1' });
66
+ const store = makeStore(doc);
67
+ await unlinkDocumentFromEntity(store, 'doc-1', 'company-1', 'tenant-1');
68
+ expect(store.deleteEntityRelation).toHaveBeenCalledWith({
69
+ tenantId: 'tenant-1',
70
+ fromEntityId: 'company-1',
71
+ toEntityId: 'doc-entity-1',
72
+ relationshipType: 'document',
73
+ });
74
+ });
75
+ it('throws when document is not found', async () => {
76
+ const store = makeStore(null);
77
+ await expect(unlinkDocumentFromEntity(store, 'missing-doc', 'company-1', 'tenant-1')).rejects.toThrow('Document not found: missing-doc');
78
+ });
79
+ it('silently succeeds when document has no entity_id', async () => {
80
+ const doc = makeDoc({ entity_id: null });
81
+ const store = makeStore(doc);
82
+ await expect(unlinkDocumentFromEntity(store, 'doc-1', 'company-1', 'tenant-1')).resolves.toBeUndefined();
83
+ expect(store.deleteEntityRelation).not.toHaveBeenCalled();
84
+ });
85
+ });
86
+ //# sourceMappingURL=linking.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linking.test.js","sourceRoot":"","sources":["../../src/document/linking.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import type { DocumentChunkRecord } from '@sprinterai/core';
2
+ /** Minimal store surface required for document page retrieval. */
3
+ export interface DocumentPageStore {
4
+ /** List all chunks/pages for a document, ordered by page number. */
5
+ getDocumentChunks(documentId: string): Promise<DocumentChunkRecord[]>;
6
+ }
7
+ /**
8
+ * Get all pages (chunks) for a document, ordered by page number.
9
+ *
10
+ * @param store - Document store.
11
+ * @param documentId - The document whose pages to retrieve.
12
+ * @returns Ordered array of document chunks. Empty if document has no pages yet.
13
+ */
14
+ export declare function getDocumentPages(store: DocumentPageStore, documentId: string): Promise<DocumentChunkRecord[]>;
15
+ /**
16
+ * Get a specific page by page number.
17
+ *
18
+ * @param store - Document store.
19
+ * @param documentId - The document to query.
20
+ * @param pageNumber - 1-based page number.
21
+ * @returns The chunk for that page, or null if not found.
22
+ */
23
+ export declare function getDocumentPage(store: DocumentPageStore, documentId: string, pageNumber: number): Promise<DocumentChunkRecord | null>;
24
+ //# sourceMappingURL=pagination.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.d.ts","sourceRoot":"","sources":["../../src/document/pagination.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,oEAAoE;IACpE,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CACvE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAGhC;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,KAAK,EAAE,iBAAiB,EACxB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAGrC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Get all pages (chunks) for a document, ordered by page number.
3
+ *
4
+ * @param store - Document store.
5
+ * @param documentId - The document whose pages to retrieve.
6
+ * @returns Ordered array of document chunks. Empty if document has no pages yet.
7
+ */
8
+ export async function getDocumentPages(store, documentId) {
9
+ const chunks = await store.getDocumentChunks(documentId);
10
+ return chunks.slice().sort((a, b) => a.chunk_index - b.chunk_index);
11
+ }
12
+ /**
13
+ * Get a specific page by page number.
14
+ *
15
+ * @param store - Document store.
16
+ * @param documentId - The document to query.
17
+ * @param pageNumber - 1-based page number.
18
+ * @returns The chunk for that page, or null if not found.
19
+ */
20
+ export async function getDocumentPage(store, documentId, pageNumber) {
21
+ const chunks = await store.getDocumentChunks(documentId);
22
+ return chunks.find((c) => c.chunk_index === pageNumber - 1) ?? null;
23
+ }
24
+ //# sourceMappingURL=pagination.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.js","sourceRoot":"","sources":["../../src/document/pagination.ts"],"names":[],"mappings":"AAQA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,KAAwB,EACxB,UAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAwB,EACxB,UAAkB,EAClB,UAAkB;IAElB,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACzD,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,UAAU,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC;AACtE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=pagination.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.test.d.ts","sourceRoot":"","sources":["../../src/document/pagination.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,84 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { getDocumentPages, getDocumentPage } from './pagination.js';
3
+ function makeChunk(overrides) {
4
+ return {
5
+ document_id: 'doc-1',
6
+ tenant_id: 'tenant-1',
7
+ chunk_index: 0,
8
+ content: 'Test content',
9
+ metadata: null,
10
+ created_at: '2026-01-01T00:00:00Z',
11
+ ...overrides,
12
+ };
13
+ }
14
+ function makeStore(chunks) {
15
+ return {
16
+ getDocumentChunks: vi.fn(async () => chunks),
17
+ };
18
+ }
19
+ describe('getDocumentPages', () => {
20
+ it('returns chunks sorted by chunk index', async () => {
21
+ const chunks = [
22
+ makeChunk({ id: 'c3', chunk_index: 2 }),
23
+ makeChunk({ id: 'c1', chunk_index: 0 }),
24
+ makeChunk({ id: 'c2', chunk_index: 1 }),
25
+ ];
26
+ const store = makeStore(chunks);
27
+ const result = await getDocumentPages(store, 'doc-1');
28
+ expect(result[0].id).toBe('c1');
29
+ expect(result[1].id).toBe('c2');
30
+ expect(result[2].id).toBe('c3');
31
+ });
32
+ it('calls store with the correct documentId', async () => {
33
+ const store = makeStore([]);
34
+ await getDocumentPages(store, 'doc-42');
35
+ expect(store.getDocumentChunks).toHaveBeenCalledWith('doc-42');
36
+ });
37
+ it('returns empty array when no pages exist', async () => {
38
+ const store = makeStore([]);
39
+ const result = await getDocumentPages(store, 'doc-1');
40
+ expect(result).toHaveLength(0);
41
+ });
42
+ it('handles chunks in reverse order', async () => {
43
+ const chunks = [
44
+ makeChunk({ id: 'c1', chunk_index: 2 }),
45
+ makeChunk({ id: 'c2', chunk_index: 0 }),
46
+ ];
47
+ const store = makeStore(chunks);
48
+ const result = await getDocumentPages(store, 'doc-1');
49
+ expect(result[0].id).toBe('c2');
50
+ expect(result[1].id).toBe('c1');
51
+ });
52
+ it('does not mutate the original array', async () => {
53
+ const chunks = [
54
+ makeChunk({ id: 'c2', chunk_index: 1 }),
55
+ makeChunk({ id: 'c1', chunk_index: 0 }),
56
+ ];
57
+ const store = makeStore(chunks);
58
+ await getDocumentPages(store, 'doc-1');
59
+ // Original order unchanged
60
+ expect(chunks[0].id).toBe('c2');
61
+ });
62
+ });
63
+ describe('getDocumentPage', () => {
64
+ it('returns the chunk matching the page number', async () => {
65
+ const chunks = [
66
+ makeChunk({ id: 'c1', chunk_index: 0 }),
67
+ makeChunk({ id: 'c2', chunk_index: 1 }),
68
+ ];
69
+ const store = makeStore(chunks);
70
+ const result = await getDocumentPage(store, 'doc-1', 2);
71
+ expect(result?.id).toBe('c2');
72
+ });
73
+ it('returns null when page does not exist', async () => {
74
+ const store = makeStore([makeChunk({ id: 'c1', chunk_index: 0 })]);
75
+ const result = await getDocumentPage(store, 'doc-1', 99);
76
+ expect(result).toBeNull();
77
+ });
78
+ it('returns null for empty document', async () => {
79
+ const store = makeStore([]);
80
+ const result = await getDocumentPage(store, 'doc-1', 1);
81
+ expect(result).toBeNull();
82
+ });
83
+ });
84
+ //# sourceMappingURL=pagination.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pagination.test.js","sourceRoot":"","sources":["../../src/document/pagination.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { DocumentChunkRecord } from '@sprinterai/core';
2
+ /** Minimal store surface required for document search. */
3
+ export interface DocumentSearchStore {
4
+ /** Full-text search across document chunks. */
5
+ searchDocumentChunks(query: string, options?: {
6
+ documentId?: string;
7
+ tenantId?: string;
8
+ limit?: number;
9
+ }): Promise<DocumentChunkRecord[]>;
10
+ }
11
+ /**
12
+ * Search within a specific document's pages using full-text search.
13
+ *
14
+ * @param store - Document store.
15
+ * @param documentId - Restrict search to this document.
16
+ * @param query - The search query (web-search style).
17
+ * @param options.limit - Maximum results to return (default 25).
18
+ * @returns Matching chunks ordered by relevance.
19
+ */
20
+ export declare function searchDocumentPages(store: DocumentSearchStore, documentId: string, query: string, options?: {
21
+ limit?: number;
22
+ }): Promise<DocumentChunkRecord[]>;
23
+ /**
24
+ * Search across all documents in a tenant.
25
+ *
26
+ * @param store - Document store.
27
+ * @param tenantId - Scope the search to this tenant.
28
+ * @param query - The search query.
29
+ * @param options.limit - Maximum results to return (default 25).
30
+ * @param options.documentIds - Restrict to specific document IDs.
31
+ * @returns Matching chunks ordered by relevance.
32
+ */
33
+ export declare function searchAllDocuments(store: DocumentSearchStore, tenantId: string, query: string, options?: {
34
+ limit?: number;
35
+ documentIds?: string[];
36
+ }): Promise<DocumentChunkRecord[]>;
37
+ //# sourceMappingURL=search.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/document/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,0DAA0D;AAC1D,MAAM,WAAW,mBAAmB;IAClC,+CAA+C;IAC/C,oBAAoB,CAClB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GACnE,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAAC;CACnC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,mBAAmB,EAC1B,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GAC/B,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAKhC;AAED;;;;;;;;;GASG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,mBAAmB,EAC1B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;CAAO,GACvD,OAAO,CAAC,mBAAmB,EAAE,CAAC,CAYhC"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Search within a specific document's pages using full-text search.
3
+ *
4
+ * @param store - Document store.
5
+ * @param documentId - Restrict search to this document.
6
+ * @param query - The search query (web-search style).
7
+ * @param options.limit - Maximum results to return (default 25).
8
+ * @returns Matching chunks ordered by relevance.
9
+ */
10
+ export async function searchDocumentPages(store, documentId, query, options = {}) {
11
+ return store.searchDocumentChunks(query, {
12
+ documentId,
13
+ limit: options.limit ?? 25,
14
+ });
15
+ }
16
+ /**
17
+ * Search across all documents in a tenant.
18
+ *
19
+ * @param store - Document store.
20
+ * @param tenantId - Scope the search to this tenant.
21
+ * @param query - The search query.
22
+ * @param options.limit - Maximum results to return (default 25).
23
+ * @param options.documentIds - Restrict to specific document IDs.
24
+ * @returns Matching chunks ordered by relevance.
25
+ */
26
+ export async function searchAllDocuments(store, tenantId, query, options = {}) {
27
+ const results = await store.searchDocumentChunks(query, {
28
+ tenantId,
29
+ limit: options.limit ?? 25,
30
+ });
31
+ if (options.documentIds && options.documentIds.length > 0) {
32
+ const allowed = new Set(options.documentIds);
33
+ return results.filter((c) => allowed.has(c.document_id));
34
+ }
35
+ return results;
36
+ }
37
+ //# sourceMappingURL=search.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/document/search.ts"],"names":[],"mappings":"AAWA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,KAA0B,EAC1B,UAAkB,EAClB,KAAa,EACb,UAA8B,EAAE;IAEhC,OAAO,KAAK,CAAC,oBAAoB,CAAC,KAAK,EAAE;QACvC,UAAU;QACV,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;KAC3B,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAA0B,EAC1B,QAAgB,EAChB,KAAa,EACb,UAAsD,EAAE;IAExD,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,oBAAoB,CAAC,KAAK,EAAE;QACtD,QAAQ;QACR,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;KAC3B,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC7C,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=search.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search.test.d.ts","sourceRoot":"","sources":["../../src/document/search.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,97 @@
1
+ import { describe, it, expect, vi } from 'vitest';
2
+ import { searchDocumentPages, searchAllDocuments } from './search.js';
3
+ function makeChunk(overrides) {
4
+ return {
5
+ document_id: 'doc-1',
6
+ tenant_id: 'tenant-1',
7
+ chunk_index: 0,
8
+ content: 'Matching content',
9
+ metadata: null,
10
+ created_at: '2026-01-01T00:00:00Z',
11
+ ...overrides,
12
+ };
13
+ }
14
+ function makeStore(results) {
15
+ return {
16
+ searchDocumentChunks: vi.fn(async () => results),
17
+ };
18
+ }
19
+ describe('searchDocumentPages', () => {
20
+ it('delegates to searchDocumentChunks with documentId', async () => {
21
+ const store = makeStore([]);
22
+ await searchDocumentPages(store, 'doc-42', 'test query');
23
+ expect(store.searchDocumentChunks).toHaveBeenCalledWith('test query', {
24
+ documentId: 'doc-42',
25
+ limit: 25,
26
+ });
27
+ });
28
+ it('returns matching chunks', async () => {
29
+ const chunks = [
30
+ makeChunk({ id: 'c1', content: 'Revenue grew 20%' }),
31
+ makeChunk({ id: 'c2', content: 'Revenue declined Q3' }),
32
+ ];
33
+ const store = makeStore(chunks);
34
+ const result = await searchDocumentPages(store, 'doc-1', 'revenue');
35
+ expect(result).toHaveLength(2);
36
+ expect(result[0].id).toBe('c1');
37
+ });
38
+ it('passes custom limit to store', async () => {
39
+ const store = makeStore([]);
40
+ await searchDocumentPages(store, 'doc-1', 'query', { limit: 5 });
41
+ expect(store.searchDocumentChunks).toHaveBeenCalledWith('query', {
42
+ documentId: 'doc-1',
43
+ limit: 5,
44
+ });
45
+ });
46
+ it('returns empty array when no matches', async () => {
47
+ const store = makeStore([]);
48
+ const result = await searchDocumentPages(store, 'doc-1', 'nonexistent');
49
+ expect(result).toHaveLength(0);
50
+ });
51
+ });
52
+ describe('searchAllDocuments', () => {
53
+ it('passes tenantId to the store', async () => {
54
+ const store = makeStore([]);
55
+ await searchAllDocuments(store, 'tenant-1', 'test');
56
+ expect(store.searchDocumentChunks).toHaveBeenCalledWith('test', {
57
+ tenantId: 'tenant-1',
58
+ limit: 25,
59
+ });
60
+ });
61
+ it('filters by documentIds when provided', async () => {
62
+ const chunks = [
63
+ makeChunk({ id: 'c1', document_id: 'doc-1' }),
64
+ makeChunk({ id: 'c2', document_id: 'doc-2' }),
65
+ makeChunk({ id: 'c3', document_id: 'doc-3' }),
66
+ ];
67
+ const store = makeStore(chunks);
68
+ const result = await searchAllDocuments(store, 'tenant-1', 'query', {
69
+ documentIds: ['doc-1', 'doc-3'],
70
+ });
71
+ expect(result).toHaveLength(2);
72
+ expect(result.map((c) => c.id)).toEqual(['c1', 'c3']);
73
+ });
74
+ it('returns all results when no documentIds filter', async () => {
75
+ const chunks = [
76
+ makeChunk({ id: 'c1', document_id: 'doc-1' }),
77
+ makeChunk({ id: 'c2', document_id: 'doc-2' }),
78
+ ];
79
+ const store = makeStore(chunks);
80
+ const result = await searchAllDocuments(store, 'tenant-1', 'query');
81
+ expect(result).toHaveLength(2);
82
+ });
83
+ it('passes custom limit to store', async () => {
84
+ const store = makeStore([]);
85
+ await searchAllDocuments(store, 'tenant-1', 'query', { limit: 10 });
86
+ expect(store.searchDocumentChunks).toHaveBeenCalledWith('query', {
87
+ tenantId: 'tenant-1',
88
+ limit: 10,
89
+ });
90
+ });
91
+ it('returns empty array when store returns no results', async () => {
92
+ const store = makeStore([]);
93
+ const result = await searchAllDocuments(store, 'tenant-1', 'query');
94
+ expect(result).toHaveLength(0);
95
+ });
96
+ });
97
+ //# sourceMappingURL=search.test.js.map