@sprinterai/runtime 0.7.1 → 0.8.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 (467) hide show
  1. package/dist/agent/heartbeat-scheduler.d.ts +36 -0
  2. package/dist/agent/heartbeat-scheduler.d.ts.map +1 -0
  3. package/dist/agent/heartbeat-scheduler.js +57 -0
  4. package/dist/agent/heartbeat-scheduler.js.map +1 -0
  5. package/dist/agent/heartbeat-scheduler.test.d.ts +2 -0
  6. package/dist/agent/heartbeat-scheduler.test.d.ts.map +1 -0
  7. package/dist/agent/heartbeat-scheduler.test.js +216 -0
  8. package/dist/agent/heartbeat-scheduler.test.js.map +1 -0
  9. package/dist/agent/index.d.ts +3 -0
  10. package/dist/agent/index.d.ts.map +1 -1
  11. package/dist/agent/index.js +2 -0
  12. package/dist/agent/index.js.map +1 -1
  13. package/dist/agent/versioning.d.ts +22 -0
  14. package/dist/agent/versioning.d.ts.map +1 -0
  15. package/dist/agent/versioning.js +47 -0
  16. package/dist/agent/versioning.js.map +1 -0
  17. package/dist/agent/versioning.test.d.ts +2 -0
  18. package/dist/agent/versioning.test.d.ts.map +1 -0
  19. package/dist/agent/versioning.test.js +147 -0
  20. package/dist/agent/versioning.test.js.map +1 -0
  21. package/dist/analytics/analytics-recorder.d.ts +12 -0
  22. package/dist/analytics/analytics-recorder.d.ts.map +1 -0
  23. package/dist/analytics/analytics-recorder.js +27 -0
  24. package/dist/analytics/analytics-recorder.js.map +1 -0
  25. package/dist/analytics/analytics-recorder.test.d.ts +2 -0
  26. package/dist/analytics/analytics-recorder.test.d.ts.map +1 -0
  27. package/dist/analytics/analytics-recorder.test.js +98 -0
  28. package/dist/analytics/analytics-recorder.test.js.map +1 -0
  29. package/dist/analytics/analytics-types.d.ts +13 -0
  30. package/dist/analytics/analytics-types.d.ts.map +1 -0
  31. package/dist/analytics/analytics-types.js +2 -0
  32. package/dist/analytics/analytics-types.js.map +1 -0
  33. package/dist/analytics/index.d.ts +4 -0
  34. package/dist/analytics/index.d.ts.map +1 -0
  35. package/dist/analytics/index.js +2 -0
  36. package/dist/analytics/index.js.map +1 -0
  37. package/dist/automation/index.d.ts +77 -0
  38. package/dist/automation/index.d.ts.map +1 -0
  39. package/dist/automation/index.js +119 -0
  40. package/dist/automation/index.js.map +1 -0
  41. package/dist/automation/index.test.d.ts +2 -0
  42. package/dist/automation/index.test.d.ts.map +1 -0
  43. package/dist/automation/index.test.js +135 -0
  44. package/dist/automation/index.test.js.map +1 -0
  45. package/dist/capture/capture-parser.d.ts +13 -0
  46. package/dist/capture/capture-parser.d.ts.map +1 -0
  47. package/dist/capture/capture-parser.js +55 -0
  48. package/dist/capture/capture-parser.js.map +1 -0
  49. package/dist/capture/capture-parser.test.d.ts +2 -0
  50. package/dist/capture/capture-parser.test.d.ts.map +1 -0
  51. package/dist/capture/capture-parser.test.js +134 -0
  52. package/dist/capture/capture-parser.test.js.map +1 -0
  53. package/dist/capture/capture-schema.d.ts +38 -0
  54. package/dist/capture/capture-schema.d.ts.map +1 -0
  55. package/dist/capture/capture-schema.js +16 -0
  56. package/dist/capture/capture-schema.js.map +1 -0
  57. package/dist/capture/capture-schema.test.d.ts +2 -0
  58. package/dist/capture/capture-schema.test.d.ts.map +1 -0
  59. package/dist/capture/capture-schema.test.js +72 -0
  60. package/dist/capture/capture-schema.test.js.map +1 -0
  61. package/dist/capture/create-from-capture.d.ts +14 -0
  62. package/dist/capture/create-from-capture.d.ts.map +1 -0
  63. package/dist/capture/create-from-capture.js +30 -0
  64. package/dist/capture/create-from-capture.js.map +1 -0
  65. package/dist/capture/create-from-capture.test.d.ts +2 -0
  66. package/dist/capture/create-from-capture.test.d.ts.map +1 -0
  67. package/dist/capture/create-from-capture.test.js +148 -0
  68. package/dist/capture/create-from-capture.test.js.map +1 -0
  69. package/dist/capture/index.d.ts +7 -0
  70. package/dist/capture/index.d.ts.map +1 -0
  71. package/dist/capture/index.js +4 -0
  72. package/dist/capture/index.js.map +1 -0
  73. package/dist/chat/inbox.d.ts +96 -0
  74. package/dist/chat/inbox.d.ts.map +1 -0
  75. package/dist/chat/inbox.js +170 -0
  76. package/dist/chat/inbox.js.map +1 -0
  77. package/dist/chat/inbox.test.d.ts +2 -0
  78. package/dist/chat/inbox.test.d.ts.map +1 -0
  79. package/dist/chat/inbox.test.js +520 -0
  80. package/dist/chat/inbox.test.js.map +1 -0
  81. package/dist/chat/index.d.ts +5 -3
  82. package/dist/chat/index.d.ts.map +1 -1
  83. package/dist/chat/index.js +3 -2
  84. package/dist/chat/index.js.map +1 -1
  85. package/dist/context/context-keys.d.ts +7 -0
  86. package/dist/context/context-keys.d.ts.map +1 -0
  87. package/dist/context/context-keys.js +6 -0
  88. package/dist/context/context-keys.js.map +1 -0
  89. package/dist/context/format-context.d.ts +14 -0
  90. package/dist/context/format-context.d.ts.map +1 -0
  91. package/dist/context/format-context.js +82 -0
  92. package/dist/context/format-context.js.map +1 -0
  93. package/dist/context/format-context.test.d.ts +2 -0
  94. package/dist/context/format-context.test.d.ts.map +1 -0
  95. package/dist/context/format-context.test.js +130 -0
  96. package/dist/context/format-context.test.js.map +1 -0
  97. package/dist/context/index.d.ts +6 -0
  98. package/dist/context/index.d.ts.map +1 -0
  99. package/dist/context/index.js +5 -0
  100. package/dist/context/index.js.map +1 -0
  101. package/dist/context/load-context.d.ts +8 -0
  102. package/dist/context/load-context.d.ts.map +1 -0
  103. package/dist/context/load-context.js +22 -0
  104. package/dist/context/load-context.js.map +1 -0
  105. package/dist/context/load-context.test.d.ts +2 -0
  106. package/dist/context/load-context.test.d.ts.map +1 -0
  107. package/dist/context/load-context.test.js +111 -0
  108. package/dist/context/load-context.test.js.map +1 -0
  109. package/dist/context/shared-context.d.ts +11 -0
  110. package/dist/context/shared-context.d.ts.map +1 -0
  111. package/dist/context/shared-context.js +14 -0
  112. package/dist/context/shared-context.js.map +1 -0
  113. package/dist/context/shared-context.test.d.ts +2 -0
  114. package/dist/context/shared-context.test.d.ts.map +1 -0
  115. package/dist/context/shared-context.test.js +90 -0
  116. package/dist/context/shared-context.test.js.map +1 -0
  117. package/dist/document/deletion.d.ts +17 -0
  118. package/dist/document/deletion.d.ts.map +1 -0
  119. package/dist/document/deletion.js +11 -0
  120. package/dist/document/deletion.js.map +1 -0
  121. package/dist/document/deletion.test.d.ts +2 -0
  122. package/dist/document/deletion.test.d.ts.map +1 -0
  123. package/dist/document/deletion.test.js +33 -0
  124. package/dist/document/deletion.test.js.map +1 -0
  125. package/dist/document/index.d.ts +12 -0
  126. package/dist/document/index.d.ts.map +1 -1
  127. package/dist/document/index.js +7 -0
  128. package/dist/document/index.js.map +1 -1
  129. package/dist/document/linking.d.ts +42 -0
  130. package/dist/document/linking.d.ts.map +1 -0
  131. package/dist/document/linking.js +49 -0
  132. package/dist/document/linking.js.map +1 -0
  133. package/dist/document/linking.test.d.ts +2 -0
  134. package/dist/document/linking.test.d.ts.map +1 -0
  135. package/dist/document/linking.test.js +86 -0
  136. package/dist/document/linking.test.js.map +1 -0
  137. package/dist/document/pagination.d.ts +24 -0
  138. package/dist/document/pagination.d.ts.map +1 -0
  139. package/dist/document/pagination.js +24 -0
  140. package/dist/document/pagination.js.map +1 -0
  141. package/dist/document/pagination.test.d.ts +2 -0
  142. package/dist/document/pagination.test.d.ts.map +1 -0
  143. package/dist/document/pagination.test.js +84 -0
  144. package/dist/document/pagination.test.js.map +1 -0
  145. package/dist/document/search.d.ts +37 -0
  146. package/dist/document/search.d.ts.map +1 -0
  147. package/dist/document/search.js +37 -0
  148. package/dist/document/search.js.map +1 -0
  149. package/dist/document/search.test.d.ts +2 -0
  150. package/dist/document/search.test.d.ts.map +1 -0
  151. package/dist/document/search.test.js +97 -0
  152. package/dist/document/search.test.js.map +1 -0
  153. package/dist/document/upload.d.ts +15 -0
  154. package/dist/document/upload.d.ts.map +1 -0
  155. package/dist/document/upload.js +12 -0
  156. package/dist/document/upload.js.map +1 -0
  157. package/dist/document/upload.test.d.ts +2 -0
  158. package/dist/document/upload.test.d.ts.map +1 -0
  159. package/dist/document/upload.test.js +70 -0
  160. package/dist/document/upload.test.js.map +1 -0
  161. package/dist/document/url-generation.d.ts +21 -0
  162. package/dist/document/url-generation.d.ts.map +1 -0
  163. package/dist/document/url-generation.js +14 -0
  164. package/dist/document/url-generation.js.map +1 -0
  165. package/dist/document/url-generation.test.d.ts +2 -0
  166. package/dist/document/url-generation.test.d.ts.map +1 -0
  167. package/dist/document/url-generation.test.js +38 -0
  168. package/dist/document/url-generation.test.js.map +1 -0
  169. package/dist/email/engine.d.ts +19 -0
  170. package/dist/email/engine.d.ts.map +1 -0
  171. package/dist/email/engine.js +30 -0
  172. package/dist/email/engine.js.map +1 -0
  173. package/dist/email/engine.test.d.ts +2 -0
  174. package/dist/email/engine.test.d.ts.map +1 -0
  175. package/dist/email/engine.test.js +128 -0
  176. package/dist/email/engine.test.js.map +1 -0
  177. package/dist/email/index.d.ts +5 -0
  178. package/dist/email/index.d.ts.map +1 -0
  179. package/dist/email/index.js +3 -0
  180. package/dist/email/index.js.map +1 -0
  181. package/dist/email/templates.d.ts +33 -0
  182. package/dist/email/templates.d.ts.map +1 -0
  183. package/dist/email/templates.js +132 -0
  184. package/dist/email/templates.js.map +1 -0
  185. package/dist/email/templates.test.d.ts +2 -0
  186. package/dist/email/templates.test.d.ts.map +1 -0
  187. package/dist/email/templates.test.js +158 -0
  188. package/dist/email/templates.test.js.map +1 -0
  189. package/dist/entity/bulk-operations.d.ts +39 -0
  190. package/dist/entity/bulk-operations.d.ts.map +1 -0
  191. package/dist/entity/bulk-operations.js +127 -0
  192. package/dist/entity/bulk-operations.js.map +1 -0
  193. package/dist/entity/bulk-operations.test.d.ts +2 -0
  194. package/dist/entity/bulk-operations.test.d.ts.map +1 -0
  195. package/dist/entity/bulk-operations.test.js +212 -0
  196. package/dist/entity/bulk-operations.test.js.map +1 -0
  197. package/dist/entity/collections.d.ts +17 -0
  198. package/dist/entity/collections.d.ts.map +1 -0
  199. package/dist/entity/collections.js +22 -0
  200. package/dist/entity/collections.js.map +1 -0
  201. package/dist/entity/collections.test.d.ts +2 -0
  202. package/dist/entity/collections.test.d.ts.map +1 -0
  203. package/dist/entity/collections.test.js +92 -0
  204. package/dist/entity/collections.test.js.map +1 -0
  205. package/dist/entity/index.d.ts +9 -0
  206. package/dist/entity/index.d.ts.map +1 -0
  207. package/dist/entity/index.js +6 -0
  208. package/dist/entity/index.js.map +1 -0
  209. package/dist/entity/relations.d.ts +65 -0
  210. package/dist/entity/relations.d.ts.map +1 -0
  211. package/dist/entity/relations.js +110 -0
  212. package/dist/entity/relations.js.map +1 -0
  213. package/dist/entity/relations.test.d.ts +2 -0
  214. package/dist/entity/relations.test.d.ts.map +1 -0
  215. package/dist/entity/relations.test.js +202 -0
  216. package/dist/entity/relations.test.js.map +1 -0
  217. package/dist/entity/resolve-relation-columns.d.ts +31 -0
  218. package/dist/entity/resolve-relation-columns.d.ts.map +1 -0
  219. package/dist/entity/resolve-relation-columns.js +156 -0
  220. package/dist/entity/resolve-relation-columns.js.map +1 -0
  221. package/dist/entity/resolve-relation-columns.test.d.ts +2 -0
  222. package/dist/entity/resolve-relation-columns.test.d.ts.map +1 -0
  223. package/dist/entity/resolve-relation-columns.test.js +281 -0
  224. package/dist/entity/resolve-relation-columns.test.js.map +1 -0
  225. package/dist/entity/sharing.d.ts +41 -0
  226. package/dist/entity/sharing.d.ts.map +1 -0
  227. package/dist/entity/sharing.js +52 -0
  228. package/dist/entity/sharing.js.map +1 -0
  229. package/dist/entity/sharing.test.d.ts +2 -0
  230. package/dist/entity/sharing.test.d.ts.map +1 -0
  231. package/dist/entity/sharing.test.js +178 -0
  232. package/dist/entity/sharing.test.js.map +1 -0
  233. package/dist/external-data/external-data-receiver.d.ts +43 -0
  234. package/dist/external-data/external-data-receiver.d.ts.map +1 -0
  235. package/dist/external-data/external-data-receiver.js +81 -0
  236. package/dist/external-data/external-data-receiver.js.map +1 -0
  237. package/dist/external-data/external-data-receiver.test.d.ts +2 -0
  238. package/dist/external-data/external-data-receiver.test.d.ts.map +1 -0
  239. package/dist/external-data/external-data-receiver.test.js +189 -0
  240. package/dist/external-data/external-data-receiver.test.js.map +1 -0
  241. package/dist/external-data/extract-by-path.d.ts +13 -0
  242. package/dist/external-data/extract-by-path.d.ts.map +1 -0
  243. package/dist/external-data/extract-by-path.js +25 -0
  244. package/dist/external-data/extract-by-path.js.map +1 -0
  245. package/dist/external-data/extract-by-path.test.d.ts +2 -0
  246. package/dist/external-data/extract-by-path.test.d.ts.map +1 -0
  247. package/dist/external-data/extract-by-path.test.js +47 -0
  248. package/dist/external-data/extract-by-path.test.js.map +1 -0
  249. package/dist/external-data/index.d.ts +4 -0
  250. package/dist/external-data/index.d.ts.map +1 -0
  251. package/dist/external-data/index.js +3 -0
  252. package/dist/external-data/index.js.map +1 -0
  253. package/dist/feed/digest.d.ts +35 -0
  254. package/dist/feed/digest.d.ts.map +1 -0
  255. package/dist/feed/digest.js +273 -0
  256. package/dist/feed/digest.js.map +1 -0
  257. package/dist/feed/filters.d.ts +41 -0
  258. package/dist/feed/filters.d.ts.map +1 -0
  259. package/dist/feed/filters.js +97 -0
  260. package/dist/feed/filters.js.map +1 -0
  261. package/dist/feed/index.d.ts +20 -0
  262. package/dist/feed/index.d.ts.map +1 -0
  263. package/dist/feed/index.js +23 -0
  264. package/dist/feed/index.js.map +1 -0
  265. package/dist/feed/ranking.d.ts +42 -0
  266. package/dist/feed/ranking.d.ts.map +1 -0
  267. package/dist/feed/ranking.js +133 -0
  268. package/dist/feed/ranking.js.map +1 -0
  269. package/dist/feed/resolver.d.ts +76 -0
  270. package/dist/feed/resolver.d.ts.map +1 -0
  271. package/dist/feed/resolver.js +173 -0
  272. package/dist/feed/resolver.js.map +1 -0
  273. package/dist/feed/transformers.d.ts +80 -0
  274. package/dist/feed/transformers.d.ts.map +1 -0
  275. package/dist/feed/transformers.js +179 -0
  276. package/dist/feed/transformers.js.map +1 -0
  277. package/dist/feed/types.d.ts +131 -0
  278. package/dist/feed/types.d.ts.map +1 -0
  279. package/dist/feed/types.js +6 -0
  280. package/dist/feed/types.js.map +1 -0
  281. package/dist/import/batch-upsert.d.ts +18 -0
  282. package/dist/import/batch-upsert.d.ts.map +1 -0
  283. package/dist/import/batch-upsert.js +67 -0
  284. package/dist/import/batch-upsert.js.map +1 -0
  285. package/dist/import/index.d.ts +7 -0
  286. package/dist/import/index.d.ts.map +1 -0
  287. package/dist/import/index.js +4 -0
  288. package/dist/import/index.js.map +1 -0
  289. package/dist/import/merge-content.d.ts +8 -0
  290. package/dist/import/merge-content.d.ts.map +1 -0
  291. package/dist/import/merge-content.js +20 -0
  292. package/dist/import/merge-content.js.map +1 -0
  293. package/dist/import/merge-content.test.d.ts +2 -0
  294. package/dist/import/merge-content.test.d.ts.map +1 -0
  295. package/dist/import/merge-content.test.js +53 -0
  296. package/dist/import/merge-content.test.js.map +1 -0
  297. package/dist/import/types.d.ts +20 -0
  298. package/dist/import/types.d.ts.map +1 -0
  299. package/dist/import/types.js +2 -0
  300. package/dist/import/types.js.map +1 -0
  301. package/dist/import/upsert-matcher.d.ts +39 -0
  302. package/dist/import/upsert-matcher.d.ts.map +1 -0
  303. package/dist/import/upsert-matcher.js +67 -0
  304. package/dist/import/upsert-matcher.js.map +1 -0
  305. package/dist/import/upsert-matcher.test.d.ts +2 -0
  306. package/dist/import/upsert-matcher.test.d.ts.map +1 -0
  307. package/dist/import/upsert-matcher.test.js +77 -0
  308. package/dist/import/upsert-matcher.test.js.map +1 -0
  309. package/dist/index.d.ts +66 -1
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +48 -1
  312. package/dist/index.js.map +1 -1
  313. package/dist/memory/index.d.ts +4 -3
  314. package/dist/memory/index.d.ts.map +1 -1
  315. package/dist/memory/index.js +3 -2
  316. package/dist/memory/index.js.map +1 -1
  317. package/dist/memory/user-memory.d.ts +15 -0
  318. package/dist/memory/user-memory.d.ts.map +1 -0
  319. package/dist/memory/user-memory.js +20 -0
  320. package/dist/memory/user-memory.js.map +1 -0
  321. package/dist/memory/user-memory.test.d.ts +2 -0
  322. package/dist/memory/user-memory.test.d.ts.map +1 -0
  323. package/dist/memory/user-memory.test.js +74 -0
  324. package/dist/memory/user-memory.test.js.map +1 -0
  325. package/dist/module/create-runtime.d.ts +4 -1
  326. package/dist/module/create-runtime.d.ts.map +1 -1
  327. package/dist/module/create-runtime.js.map +1 -1
  328. package/dist/module/map-supabase-stores.d.ts +3 -0
  329. package/dist/module/map-supabase-stores.d.ts.map +1 -1
  330. package/dist/module/map-supabase-stores.js +3 -0
  331. package/dist/module/map-supabase-stores.js.map +1 -1
  332. package/dist/providers/index.d.ts +2 -1
  333. package/dist/providers/index.d.ts.map +1 -1
  334. package/dist/providers/index.js.map +1 -1
  335. package/dist/providers/model-resolver.d.ts +11 -3
  336. package/dist/providers/model-resolver.d.ts.map +1 -1
  337. package/dist/providers/model-resolver.js +166 -11
  338. package/dist/providers/model-resolver.js.map +1 -1
  339. package/dist/providers/model-resolver.test.js +10 -10
  340. package/dist/providers/model-resolver.test.js.map +1 -1
  341. package/dist/providers/provider-interfaces.d.ts +0 -20
  342. package/dist/providers/provider-interfaces.d.ts.map +1 -1
  343. package/dist/providers/provider-interfaces.js +1 -0
  344. package/dist/providers/provider-interfaces.js.map +1 -1
  345. package/dist/scoring/index.d.ts +4 -2
  346. package/dist/scoring/index.d.ts.map +1 -1
  347. package/dist/scoring/index.js +2 -1
  348. package/dist/scoring/index.js.map +1 -1
  349. package/dist/scoring/promotion.d.ts +20 -0
  350. package/dist/scoring/promotion.d.ts.map +1 -0
  351. package/dist/scoring/promotion.js +39 -0
  352. package/dist/scoring/promotion.js.map +1 -0
  353. package/dist/scoring/promotion.test.d.ts +2 -0
  354. package/dist/scoring/promotion.test.d.ts.map +1 -0
  355. package/dist/scoring/promotion.test.js +141 -0
  356. package/dist/scoring/promotion.test.js.map +1 -0
  357. package/dist/settings/index.d.ts +15 -0
  358. package/dist/settings/index.d.ts.map +1 -0
  359. package/dist/settings/index.js +47 -0
  360. package/dist/settings/index.js.map +1 -0
  361. package/dist/settings/index.test.d.ts +2 -0
  362. package/dist/settings/index.test.d.ts.map +1 -0
  363. package/dist/settings/index.test.js +75 -0
  364. package/dist/settings/index.test.js.map +1 -0
  365. package/dist/skill/index.d.ts +4 -0
  366. package/dist/skill/index.d.ts.map +1 -0
  367. package/dist/skill/index.js +3 -0
  368. package/dist/skill/index.js.map +1 -0
  369. package/dist/skill/skill-loader.d.ts +18 -0
  370. package/dist/skill/skill-loader.d.ts.map +1 -0
  371. package/dist/skill/skill-loader.js +31 -0
  372. package/dist/skill/skill-loader.js.map +1 -0
  373. package/dist/skill/skill-loader.test.d.ts +2 -0
  374. package/dist/skill/skill-loader.test.d.ts.map +1 -0
  375. package/dist/skill/skill-loader.test.js +64 -0
  376. package/dist/skill/skill-loader.test.js.map +1 -0
  377. package/dist/skill/skill-prompt.d.ts +7 -0
  378. package/dist/skill/skill-prompt.d.ts.map +1 -0
  379. package/dist/skill/skill-prompt.js +17 -0
  380. package/dist/skill/skill-prompt.js.map +1 -0
  381. package/dist/skill/skill-prompt.test.d.ts +2 -0
  382. package/dist/skill/skill-prompt.test.d.ts.map +1 -0
  383. package/dist/skill/skill-prompt.test.js +44 -0
  384. package/dist/skill/skill-prompt.test.js.map +1 -0
  385. package/dist/source/index.d.ts +5 -0
  386. package/dist/source/index.d.ts.map +1 -0
  387. package/dist/source/index.js +3 -0
  388. package/dist/source/index.js.map +1 -0
  389. package/dist/source/source-poller.d.ts +66 -0
  390. package/dist/source/source-poller.d.ts.map +1 -0
  391. package/dist/source/source-poller.js +64 -0
  392. package/dist/source/source-poller.js.map +1 -0
  393. package/dist/source/source-poller.test.d.ts +2 -0
  394. package/dist/source/source-poller.test.d.ts.map +1 -0
  395. package/dist/source/source-poller.test.js +184 -0
  396. package/dist/source/source-poller.test.js.map +1 -0
  397. package/dist/source/source-status.d.ts +41 -0
  398. package/dist/source/source-status.d.ts.map +1 -0
  399. package/dist/source/source-status.js +73 -0
  400. package/dist/source/source-status.js.map +1 -0
  401. package/dist/source/source-status.test.d.ts +2 -0
  402. package/dist/source/source-status.test.d.ts.map +1 -0
  403. package/dist/source/source-status.test.js +116 -0
  404. package/dist/source/source-status.test.js.map +1 -0
  405. package/dist/template/index.d.ts +61 -0
  406. package/dist/template/index.d.ts.map +1 -0
  407. package/dist/template/index.js +100 -0
  408. package/dist/template/index.js.map +1 -0
  409. package/dist/template/index.test.d.ts +2 -0
  410. package/dist/template/index.test.d.ts.map +1 -0
  411. package/dist/template/index.test.js +167 -0
  412. package/dist/template/index.test.js.map +1 -0
  413. package/dist/testing/in-memory-agent-version-store.d.ts +13 -0
  414. package/dist/testing/in-memory-agent-version-store.d.ts.map +1 -0
  415. package/dist/testing/in-memory-agent-version-store.js +36 -0
  416. package/dist/testing/in-memory-agent-version-store.js.map +1 -0
  417. package/dist/testing/in-memory-chat-store.d.ts +11 -1
  418. package/dist/testing/in-memory-chat-store.d.ts.map +1 -1
  419. package/dist/testing/in-memory-chat-store.js +66 -0
  420. package/dist/testing/in-memory-chat-store.js.map +1 -1
  421. package/dist/testing/in-memory-entity-store.d.ts +2 -0
  422. package/dist/testing/in-memory-entity-store.d.ts.map +1 -1
  423. package/dist/testing/in-memory-entity-store.js +8 -3
  424. package/dist/testing/in-memory-entity-store.js.map +1 -1
  425. package/dist/testing/in-memory-entity-store.test.js +2 -1
  426. package/dist/testing/in-memory-entity-store.test.js.map +1 -1
  427. package/dist/testing/in-memory-heartbeat-run-store.d.ts +21 -0
  428. package/dist/testing/in-memory-heartbeat-run-store.d.ts.map +1 -0
  429. package/dist/testing/in-memory-heartbeat-run-store.js +107 -0
  430. package/dist/testing/in-memory-heartbeat-run-store.js.map +1 -0
  431. package/dist/testing/index.d.ts +9 -7
  432. package/dist/testing/index.d.ts.map +1 -1
  433. package/dist/testing/index.js +9 -7
  434. package/dist/testing/index.js.map +1 -1
  435. package/dist/tool/index.d.ts +2 -0
  436. package/dist/tool/index.d.ts.map +1 -1
  437. package/dist/tool/index.js +1 -0
  438. package/dist/tool/index.js.map +1 -1
  439. package/dist/tool/session-manager.d.ts +35 -0
  440. package/dist/tool/session-manager.d.ts.map +1 -0
  441. package/dist/tool/session-manager.js +40 -0
  442. package/dist/tool/session-manager.js.map +1 -0
  443. package/dist/tool/session-manager.test.d.ts +2 -0
  444. package/dist/tool/session-manager.test.d.ts.map +1 -0
  445. package/dist/tool/session-manager.test.js +139 -0
  446. package/dist/tool/session-manager.test.js.map +1 -0
  447. package/dist/workflow/claim-manager.d.ts +24 -0
  448. package/dist/workflow/claim-manager.d.ts.map +1 -0
  449. package/dist/workflow/claim-manager.js +31 -0
  450. package/dist/workflow/claim-manager.js.map +1 -0
  451. package/dist/workflow/claim-manager.test.d.ts +2 -0
  452. package/dist/workflow/claim-manager.test.d.ts.map +1 -0
  453. package/dist/workflow/claim-manager.test.js +124 -0
  454. package/dist/workflow/claim-manager.test.js.map +1 -0
  455. package/dist/workflow/index.d.ts +3 -0
  456. package/dist/workflow/index.d.ts.map +1 -1
  457. package/dist/workflow/index.js +4 -0
  458. package/dist/workflow/index.js.map +1 -1
  459. package/dist/workflow/run-queries.d.ts +45 -0
  460. package/dist/workflow/run-queries.d.ts.map +1 -0
  461. package/dist/workflow/run-queries.js +80 -0
  462. package/dist/workflow/run-queries.js.map +1 -0
  463. package/dist/workflow/run-queries.test.d.ts +2 -0
  464. package/dist/workflow/run-queries.test.d.ts.map +1 -0
  465. package/dist/workflow/run-queries.test.js +177 -0
  466. package/dist/workflow/run-queries.test.js.map +1 -0
  467. package/package.json +106 -2
@@ -0,0 +1,273 @@
1
+ import { validateFeedParams } from './filters.js';
2
+ import { computeForYouScores } from './ranking.js';
3
+ import { rowsToFeedItems } from './transformers.js';
4
+ /**
5
+ * Resolve a daily digest of high-impact activities.
6
+ *
7
+ * Generates a summary of the most important activities from the past 24 hours.
8
+ * Useful for daily email digests, notifications, and summaries.
9
+ *
10
+ * Flow:
11
+ * 1. Query activities from the past 24 hours
12
+ * 2. Rank by importance + recency
13
+ * 3. Filter by score threshold (optional)
14
+ * 4. Select top N items
15
+ * 5. Compute summary statistics
16
+ * 6. Return FeedDigest with items and metadata
17
+ *
18
+ * @param store ActivityStore implementation
19
+ * @param config Digest configuration
20
+ * @returns FeedDigest with items and summary
21
+ * @throws Error if store query fails
22
+ */
23
+ export async function resolveDigest(store, config) {
24
+ const { tenantId, digestLimit = 10, minScoreThreshold = 0.3, includeImportance = true, importanceWeight = 1.5, // Importance matters more in digests
25
+ recencyWeight = 1.0, entityId, actorId, action, } = config;
26
+ // Validate parameters
27
+ const { limit: digestLimitSafe } = validateFeedParams(digestLimit);
28
+ const { threshold } = validateFeedParams(undefined, minScoreThreshold);
29
+ // Query activities from past 24 hours
30
+ const now = new Date();
31
+ const yesterday = new Date(now.getTime() - 24 * 60 * 60 * 1000);
32
+ const queryOptions = {
33
+ limit: digestLimitSafe * 2, // Fetch extra to account for filtering
34
+ entityId,
35
+ actorId,
36
+ action,
37
+ };
38
+ const records = await store.listActivities(queryOptions);
39
+ // Filter to past 24 hours
40
+ const yesterdayTime = yesterday.getTime();
41
+ const recentRecords = records.filter((r) => new Date(r.created_at).getTime() >= yesterdayTime);
42
+ if (recentRecords.length === 0) {
43
+ return buildEmptyDigest(tenantId, new Date());
44
+ }
45
+ // Convert to FeedItems and rank
46
+ let items = rowsToFeedItems(recentRecords);
47
+ items = items.map((item) => {
48
+ const score = computeForYouScores({
49
+ createdAt: item.createdAt,
50
+ metadata: item.metadata,
51
+ importance: includeImportance ? extractImportanceFromMetadata(item.metadata) : undefined,
52
+ now,
53
+ recencyWeight,
54
+ importanceWeight,
55
+ });
56
+ return {
57
+ ...item,
58
+ score,
59
+ };
60
+ });
61
+ // Sort by score (highest first)
62
+ items = items.sort((a, b) => b.score - a.score);
63
+ // Filter by score threshold
64
+ const filteredItems = items.filter((item) => item.score >= threshold);
65
+ // Take top N
66
+ const digestItems = filteredItems.slice(0, digestLimitSafe);
67
+ // Build summary statistics
68
+ const summary = buildDigestSummary(digestItems);
69
+ // Generate email subject and preview
70
+ const emailSubject = buildDigestEmailSubject(summary, new Date());
71
+ const emailPreview = buildDigestEmailPreview(digestItems);
72
+ return {
73
+ date: now.toISOString().split('T')[0], // YYYY-MM-DD
74
+ tenantId,
75
+ items: digestItems,
76
+ summary,
77
+ emailSubject,
78
+ emailPreview,
79
+ };
80
+ }
81
+ /**
82
+ * Build an empty digest for when no activities exist.
83
+ * Used as a placeholder when there's nothing to report.
84
+ *
85
+ * @param tenantId Tenant identifier
86
+ * @param date Date of the digest
87
+ * @returns Empty FeedDigest
88
+ */
89
+ function buildEmptyDigest(tenantId, date) {
90
+ return {
91
+ date: date.toISOString().split('T')[0],
92
+ tenantId,
93
+ items: [],
94
+ summary: {
95
+ total: 0,
96
+ byAction: {},
97
+ byActor: {},
98
+ },
99
+ emailSubject: 'No activity today',
100
+ emailPreview: '',
101
+ };
102
+ }
103
+ /**
104
+ * Compute summary statistics for digest items.
105
+ * Counts activities by action type and actor.
106
+ *
107
+ * @param items Digest items
108
+ * @returns Summary with total and breakdown by action/actor
109
+ */
110
+ function buildDigestSummary(items) {
111
+ const byAction = {};
112
+ const byActor = {};
113
+ for (const item of items) {
114
+ // Count by action
115
+ const action = item.action;
116
+ byAction[action] = (byAction[action] ?? 0) + 1;
117
+ // Count by actor
118
+ const actor = item.actorName ?? item.actorId ?? 'System';
119
+ byActor[actor] = (byActor[actor] ?? 0) + 1;
120
+ }
121
+ return {
122
+ total: items.length,
123
+ byAction,
124
+ byActor,
125
+ };
126
+ }
127
+ /**
128
+ * Build a human-readable email subject line for digest.
129
+ *
130
+ * Examples:
131
+ * - "Daily Digest — 5 updates"
132
+ * - "Daily Digest — 12 activities"
133
+ * - "Daily Digest for Tuesday, Apr 8"
134
+ *
135
+ * @param summary Digest summary
136
+ * @param date Digest date
137
+ * @returns Email subject line
138
+ */
139
+ function buildDigestEmailSubject(summary, _date) {
140
+ const total = summary.total;
141
+ if (total === 0) {
142
+ return 'Daily Digest — No activity';
143
+ }
144
+ const itemWord = total === 1 ? 'activity' : 'activities';
145
+ return `Daily Digest — ${total} ${itemWord}`;
146
+ }
147
+ /**
148
+ * Build a preview text for digest email.
149
+ * Creates a bulleted summary suitable for email rendering.
150
+ *
151
+ * Format:
152
+ * ```
153
+ * • Alice updated Project ABC
154
+ * • Bob commented on Task 123
155
+ * • System created Entity XYZ
156
+ * ```
157
+ *
158
+ * @param items Digest items (typically 5-10)
159
+ * @returns Plain text preview suitable for email
160
+ */
161
+ function buildDigestEmailPreview(items) {
162
+ if (items.length === 0) {
163
+ return 'No activity in the past 24 hours.';
164
+ }
165
+ const lines = items
166
+ .slice(0, 10) // Cap at 10 items for email preview
167
+ .map((item) => {
168
+ const actor = item.actorName ?? 'System';
169
+ const action = formatActionForPreview(item.action);
170
+ const entity = item.entityName ?? item.entityId ?? 'item';
171
+ return `• ${actor} ${action} ${entity}`;
172
+ });
173
+ return lines.join('\n');
174
+ }
175
+ /**
176
+ * Format action type for preview display.
177
+ *
178
+ * @param action Action code
179
+ * @returns Display-friendly action phrase
180
+ */
181
+ function formatActionForPreview(action) {
182
+ const map = {
183
+ INSERT: 'created',
184
+ UPDATE: 'updated',
185
+ DELETE: 'deleted',
186
+ comment: 'commented on',
187
+ assigned: 'assigned',
188
+ shared: 'shared',
189
+ };
190
+ return map[action] ?? action.toLowerCase();
191
+ }
192
+ /**
193
+ * Extract importance value from activity metadata.
194
+ * Looks for 'importance' or 'priority' fields.
195
+ *
196
+ * @param metadata Activity metadata
197
+ * @returns Importance value or null
198
+ */
199
+ function extractImportanceFromMetadata(metadata) {
200
+ if (!metadata)
201
+ return null;
202
+ if ('importance' in metadata) {
203
+ const imp = metadata.importance;
204
+ if (typeof imp === 'number' || typeof imp === 'string') {
205
+ return imp;
206
+ }
207
+ }
208
+ if ('priority' in metadata) {
209
+ const pri = metadata.priority;
210
+ if (typeof pri === 'number' || typeof pri === 'string') {
211
+ return pri;
212
+ }
213
+ }
214
+ return null;
215
+ }
216
+ /**
217
+ * Build a multi-day digest.
218
+ *
219
+ * Generates a digest spanning multiple days.
220
+ * Useful for weekly/monthly summaries.
221
+ *
222
+ * @param store ActivityStore
223
+ * @param config Digest config
224
+ * @param days Number of days to include (default 7 for weekly)
225
+ * @returns FeedDigest combining items from multiple days
226
+ */
227
+ export async function resolveMultiDayDigest(store, config, days = 7) {
228
+ const { tenantId, digestLimit = 20, minScoreThreshold = 0.4, includeImportance = true, importanceWeight = 1.5, recencyWeight = 1.0, } = config;
229
+ const { limit: digestLimitSafe } = validateFeedParams(digestLimit);
230
+ const { threshold } = validateFeedParams(undefined, minScoreThreshold);
231
+ const now = new Date();
232
+ const startDate = new Date(now.getTime() - days * 24 * 60 * 60 * 1000);
233
+ const queryOptions = {
234
+ limit: digestLimitSafe * 3, // Fetch extra for filtering
235
+ };
236
+ const records = await store.listActivities(queryOptions);
237
+ // Filter to date range
238
+ const startTime = startDate.getTime();
239
+ const filteredRecords = records.filter((r) => new Date(r.created_at).getTime() >= startTime);
240
+ if (filteredRecords.length === 0) {
241
+ return buildEmptyDigest(tenantId, now);
242
+ }
243
+ // Rank and filter
244
+ let items = rowsToFeedItems(filteredRecords);
245
+ items = items.map((item) => {
246
+ const score = computeForYouScores({
247
+ createdAt: item.createdAt,
248
+ metadata: item.metadata,
249
+ importance: includeImportance ? extractImportanceFromMetadata(item.metadata) : undefined,
250
+ now,
251
+ recencyWeight,
252
+ importanceWeight,
253
+ });
254
+ return {
255
+ ...item,
256
+ score,
257
+ };
258
+ });
259
+ items = items.sort((a, b) => b.score - a.score);
260
+ const digestItems = items.filter((item) => item.score >= threshold).slice(0, digestLimitSafe);
261
+ const summary = buildDigestSummary(digestItems);
262
+ const emailSubject = `Weekly Digest — ${digestItems.length} activities`;
263
+ const emailPreview = buildDigestEmailPreview(digestItems);
264
+ return {
265
+ date: now.toISOString().split('T')[0],
266
+ tenantId,
267
+ items: digestItems,
268
+ summary,
269
+ emailSubject,
270
+ emailPreview,
271
+ };
272
+ }
273
+ //# sourceMappingURL=digest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digest.js","sourceRoot":"","sources":["../../src/feed/digest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { FeedTimeRange } from './types.js';
2
+ /**
3
+ * Get the start of a time range as an ISO timestamp.
4
+ * Used to filter activities by time window.
5
+ *
6
+ * @param timeRange Time range identifier ('today', 'week', etc)
7
+ * @param referenceDate Optional reference date (default: now)
8
+ * @returns ISO timestamp string (start of range)
9
+ */
10
+ export declare function getTimeRangeStart(timeRange: FeedTimeRange, referenceDate?: Date): string;
11
+ /**
12
+ * Get the sort column for a feed tab.
13
+ * Determines primary sort order for different view types.
14
+ *
15
+ * 'all' and 'digest' use created_at (reverse chronological)
16
+ * 'for-you' uses computed score (highest first) with created_at as tie-breaker
17
+ *
18
+ * @param tab Feed tab type
19
+ * @returns Column name for sorting ('created_at' or 'score')
20
+ */
21
+ export declare function getTabSortColumn(tab: 'all' | 'for-you' | 'digest'): 'created_at' | 'score';
22
+ /**
23
+ * Get the sort direction for a feed tab.
24
+ *
25
+ * @param tab Feed tab type
26
+ * @returns Sort direction ('DESC' for recent-first, 'ASC' for oldest-first)
27
+ */
28
+ export declare function getTabSortDirection(tab: 'all' | 'for-you' | 'digest'): 'ASC' | 'DESC';
29
+ /**
30
+ * Validate feed configuration parameters.
31
+ * Ensures limits and thresholds are within acceptable ranges.
32
+ *
33
+ * @param limit Maximum items to return
34
+ * @param threshold Score threshold (0-1)
35
+ * @returns Object with validated/clamped values
36
+ */
37
+ export declare function validateFeedParams(limit?: number, threshold?: number): {
38
+ limit: number;
39
+ threshold: number;
40
+ };
41
+ //# sourceMappingURL=filters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.d.ts","sourceRoot":"","sources":["../../src/feed/filters.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,aAAa,EAAE,aAAa,OAAa,GAAG,MAAM,CAwC9F;AAED;;;;;;;;;GASG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,YAAY,GAAG,OAAO,CAM1F;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,KAAK,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAOrF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,EAAE,MAAM,EACd,SAAS,CAAC,EAAE,MAAM,GACjB;IACD,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB,CAeA"}
@@ -0,0 +1,97 @@
1
+ /**
2
+ * Get the start of a time range as an ISO timestamp.
3
+ * Used to filter activities by time window.
4
+ *
5
+ * @param timeRange Time range identifier ('today', 'week', etc)
6
+ * @param referenceDate Optional reference date (default: now)
7
+ * @returns ISO timestamp string (start of range)
8
+ */
9
+ export function getTimeRangeStart(timeRange, referenceDate = new Date()) {
10
+ const ref = new Date(referenceDate);
11
+ switch (timeRange) {
12
+ case 'today': {
13
+ // Start of today
14
+ const today = new Date(ref.getFullYear(), ref.getMonth(), ref.getDate());
15
+ return today.toISOString();
16
+ }
17
+ case 'yesterday': {
18
+ // Start of yesterday
19
+ const yesterday = new Date(ref);
20
+ yesterday.setDate(yesterday.getDate() - 1);
21
+ const start = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate());
22
+ return start.toISOString();
23
+ }
24
+ case 'week': {
25
+ // Start of this calendar week (Monday, or Sunday if in ISO)
26
+ // Using ISO: Monday = 1, Sunday = 0
27
+ const dayOfWeek = ref.getDay(); // 0 = Sunday, 6 = Saturday
28
+ const daysToMonday = dayOfWeek === 0 ? 6 : dayOfWeek - 1;
29
+ const monday = new Date(ref);
30
+ monday.setDate(monday.getDate() - daysToMonday);
31
+ const start = new Date(monday.getFullYear(), monday.getMonth(), monday.getDate());
32
+ return start.toISOString();
33
+ }
34
+ case 'month': {
35
+ // Start of this month
36
+ const start = new Date(ref.getFullYear(), ref.getMonth(), 1);
37
+ return start.toISOString();
38
+ }
39
+ case 'all':
40
+ default:
41
+ // Beginning of epoch or very far back
42
+ return new Date(0).toISOString();
43
+ }
44
+ }
45
+ /**
46
+ * Get the sort column for a feed tab.
47
+ * Determines primary sort order for different view types.
48
+ *
49
+ * 'all' and 'digest' use created_at (reverse chronological)
50
+ * 'for-you' uses computed score (highest first) with created_at as tie-breaker
51
+ *
52
+ * @param tab Feed tab type
53
+ * @returns Column name for sorting ('created_at' or 'score')
54
+ */
55
+ export function getTabSortColumn(tab) {
56
+ if (tab === 'for-you') {
57
+ return 'score';
58
+ }
59
+ // 'all' and 'digest' default to chronological
60
+ return 'created_at';
61
+ }
62
+ /**
63
+ * Get the sort direction for a feed tab.
64
+ *
65
+ * @param tab Feed tab type
66
+ * @returns Sort direction ('DESC' for recent-first, 'ASC' for oldest-first)
67
+ */
68
+ export function getTabSortDirection(tab) {
69
+ if (tab === 'for-you') {
70
+ // Score: highest first (DESC)
71
+ return 'DESC';
72
+ }
73
+ // Chronological: most recent first (DESC)
74
+ return 'DESC';
75
+ }
76
+ /**
77
+ * Validate feed configuration parameters.
78
+ * Ensures limits and thresholds are within acceptable ranges.
79
+ *
80
+ * @param limit Maximum items to return
81
+ * @param threshold Score threshold (0-1)
82
+ * @returns Object with validated/clamped values
83
+ */
84
+ export function validateFeedParams(limit, threshold) {
85
+ const MIN_LIMIT = 1;
86
+ const MAX_LIMIT = 500;
87
+ const DEFAULT_LIMIT = 50;
88
+ const MIN_THRESHOLD = 0;
89
+ const MAX_THRESHOLD = 1;
90
+ const safeLimit = limit ? Math.max(MIN_LIMIT, Math.min(MAX_LIMIT, limit)) : DEFAULT_LIMIT;
91
+ const safeThreshold = threshold ? Math.max(MIN_THRESHOLD, Math.min(MAX_THRESHOLD, threshold)) : 0;
92
+ return {
93
+ limit: safeLimit,
94
+ threshold: safeThreshold,
95
+ };
96
+ }
97
+ //# sourceMappingURL=filters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"filters.js","sourceRoot":"","sources":["../../src/feed/filters.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Feed system module.
3
+ *
4
+ * Provides activity aggregation, personalized ranking, and digest generation.
5
+ * Storage-agnostic: works with any ActivityStore implementation.
6
+ *
7
+ * Key exports:
8
+ * - resolveFeed() — Main entry point for personalized feeds
9
+ * - resolveDigest() — Daily digest of high-impact activities
10
+ * - computeForYouScores() — Temporal decay + importance ranking
11
+ * - FeedItem, FeedConfig, FeedDigest — Type contracts
12
+ */
13
+ export type { FeedItem, FeedConfig, FeedTimeRange, FeedTab, RankingInput } from './types.js';
14
+ export type { DigestConfig, FeedDigest } from './types.js';
15
+ export { resolveFeed, resolveFeedWithTimeFilter, resolveFeedPage, buildFeedDelta, } from './resolver.js';
16
+ export { resolveDigest, resolveMultiDayDigest } from './digest.js';
17
+ export { computeForYouScores, sortByScore, filterByScore } from './ranking.js';
18
+ export { rowToFeedItem, rowsToFeedItems, extractFeedPreview, extractActorDisplay, extractEntityDisplay, formatActivityPlainText, } from './transformers.js';
19
+ export { getTimeRangeStart, getTabSortColumn, getTabSortDirection, validateFeedParams, } from './filters.js';
20
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC1F,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGxD,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAGhE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAG5E,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Feed system module.
3
+ *
4
+ * Provides activity aggregation, personalized ranking, and digest generation.
5
+ * Storage-agnostic: works with any ActivityStore implementation.
6
+ *
7
+ * Key exports:
8
+ * - resolveFeed() — Main entry point for personalized feeds
9
+ * - resolveDigest() — Daily digest of high-impact activities
10
+ * - computeForYouScores() — Temporal decay + importance ranking
11
+ * - FeedItem, FeedConfig, FeedDigest — Type contracts
12
+ */
13
+ // ─── Resolver (Main Entry Points) ────────────────────────────────
14
+ export { resolveFeed, resolveFeedWithTimeFilter, resolveFeedPage, buildFeedDelta, } from './resolver.js';
15
+ // ─── Digest ──────────────────────────────────────────────────────
16
+ export { resolveDigest, resolveMultiDayDigest } from './digest.js';
17
+ // ─── Ranking Algorithm ───────────────────────────────────────────
18
+ export { computeForYouScores, sortByScore, filterByScore } from './ranking.js';
19
+ // ─── Transformers (ActivityRecord → FeedItem) ───────────────────
20
+ export { rowToFeedItem, rowsToFeedItems, extractFeedPreview, extractActorDisplay, extractEntityDisplay, formatActivityPlainText, } from './transformers.js';
21
+ // ─── Filters & Sorting ───────────────────────────────────────────
22
+ export { getTimeRangeStart, getTabSortColumn, getTabSortDirection, validateFeedParams, } from './filters.js';
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,oEAAoE;AACpE,OAAO,EACL,WAAW,EACX,yBAAyB,EACzB,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC;AAEpB,oEAAoE;AACpE,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AAEhE,oEAAoE;AACpE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE5E,mEAAmE;AACnE,OAAO,EACL,aAAa,EACb,eAAe,EACf,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,uBAAuB,GACxB,MAAM,gBAAgB,CAAC;AAExB,oEAAoE;AACpE,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,WAAW,CAAC"}
@@ -0,0 +1,42 @@
1
+ import type { RankingInput } from './types.js';
2
+ /**
3
+ * Compute "For You" relevance score for an activity.
4
+ *
5
+ * Combines:
6
+ * 1. Temporal score (recent > old): exponential decay with 24h half-life
7
+ * 2. Importance score (high > low): from metadata or direct value
8
+ * 3. Configurable weights for tuning (default 1.0 for both)
9
+ *
10
+ * Final score = (temporal * recencyWeight + importance * importanceWeight) / 2
11
+ *
12
+ * The score is normalized to 0-1 range and should be interpreted as:
13
+ * - 0.9-1.0: Highly relevant (just happened, high importance)
14
+ * - 0.5-0.9: Moderately relevant (recent or important)
15
+ * - 0.0-0.5: Lower relevance (older and/or low importance)
16
+ *
17
+ * @param input Ranking input with activity data and configuration
18
+ * @returns Score from 0 to 1
19
+ */
20
+ export declare function computeForYouScores(input: RankingInput): number;
21
+ /**
22
+ * Sort feed items by score (descending).
23
+ * Items with equal scores maintain relative order (stable sort).
24
+ *
25
+ * @param items Feed items to sort
26
+ * @returns Sorted items (highest score first)
27
+ */
28
+ export declare function sortByScore<T extends {
29
+ score: number;
30
+ }>(items: T[]): T[];
31
+ /**
32
+ * Filter items by score threshold.
33
+ * Useful for digest generation and importance-based filtering.
34
+ *
35
+ * @param items Feed items to filter
36
+ * @param minScore Minimum score (0-1)
37
+ * @returns Items with score >= minScore
38
+ */
39
+ export declare function filterByScore<T extends {
40
+ score: number;
41
+ }>(items: T[], minScore: number): T[];
42
+ //# sourceMappingURL=ranking.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ranking.d.ts","sourceRoot":"","sources":["../../src/feed/ranking.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAkF5C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAmB/D;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAOxE;AAED;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,CAAC,EAAE,CAG5F"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Scoring constants for ranking algorithm.
3
+ */
4
+ const TEMPORAL_DECAY_HALF_LIFE_HOURS = 24;
5
+ const DEFAULT_IMPORTANCE = 0.5;
6
+ const IMPORTANCE_MULTIPLIER_MAP = {
7
+ critical: 1.0,
8
+ high: 0.8,
9
+ medium: 0.5,
10
+ low: 0.3,
11
+ };
12
+ /**
13
+ * Compute exponential temporal decay score.
14
+ * Recent activities score high, older activities decay exponentially.
15
+ *
16
+ * Uses exponential decay with half-life: score(t) = 2^(-t / halfLife)
17
+ * At half-life hours ago: score = 0.5
18
+ * At 2x half-life hours ago: score = 0.25
19
+ * At 3x half-life hours ago: score = 0.125
20
+ *
21
+ * @param createdAt ISO timestamp string
22
+ * @param now Current date for computing elapsed time
23
+ * @returns Temporal score (0-1)
24
+ */
25
+ function computeTemporalScore(createdAt, now) {
26
+ const activityTime = new Date(createdAt).getTime();
27
+ const nowTime = now.getTime();
28
+ const elapsedMs = Math.max(0, nowTime - activityTime);
29
+ const elapsedHours = elapsedMs / (1000 * 60 * 60);
30
+ // Exponential decay: 2^(-elapsed / half-life)
31
+ const temporalScore = Math.pow(2, -elapsedHours / TEMPORAL_DECAY_HALF_LIFE_HOURS);
32
+ return Math.max(0, Math.min(1, temporalScore));
33
+ }
34
+ /**
35
+ * Extract and normalize importance value from metadata or direct input.
36
+ * Handles string ('high', 'low', etc) and numeric (0-1) formats.
37
+ *
38
+ * @param importance Direct importance value if available
39
+ * @param metadata Activity metadata which may contain importance signal
40
+ * @returns Normalized importance score (0-1)
41
+ */
42
+ function getImportanceScore(importance, metadata) {
43
+ // Use direct importance if provided
44
+ if (importance !== null && importance !== undefined) {
45
+ if (typeof importance === 'number') {
46
+ return Math.max(0, Math.min(1, importance));
47
+ }
48
+ if (typeof importance === 'string') {
49
+ return IMPORTANCE_MULTIPLIER_MAP[importance.toLowerCase()] ?? DEFAULT_IMPORTANCE;
50
+ }
51
+ }
52
+ // Check metadata for importance signal
53
+ if (metadata) {
54
+ const metaImportance = metadata.importance;
55
+ if (typeof metaImportance === 'number') {
56
+ return Math.max(0, Math.min(1, metaImportance));
57
+ }
58
+ if (typeof metaImportance === 'string') {
59
+ return IMPORTANCE_MULTIPLIER_MAP[metaImportance.toLowerCase()] ?? DEFAULT_IMPORTANCE;
60
+ }
61
+ const metaPriority = metadata.priority;
62
+ if (typeof metaPriority === 'number') {
63
+ return Math.max(0, Math.min(1, metaPriority));
64
+ }
65
+ if (typeof metaPriority === 'string') {
66
+ return IMPORTANCE_MULTIPLIER_MAP[metaPriority.toLowerCase()] ?? DEFAULT_IMPORTANCE;
67
+ }
68
+ }
69
+ return DEFAULT_IMPORTANCE;
70
+ }
71
+ /**
72
+ * Compute "For You" relevance score for an activity.
73
+ *
74
+ * Combines:
75
+ * 1. Temporal score (recent > old): exponential decay with 24h half-life
76
+ * 2. Importance score (high > low): from metadata or direct value
77
+ * 3. Configurable weights for tuning (default 1.0 for both)
78
+ *
79
+ * Final score = (temporal * recencyWeight + importance * importanceWeight) / 2
80
+ *
81
+ * The score is normalized to 0-1 range and should be interpreted as:
82
+ * - 0.9-1.0: Highly relevant (just happened, high importance)
83
+ * - 0.5-0.9: Moderately relevant (recent or important)
84
+ * - 0.0-0.5: Lower relevance (older and/or low importance)
85
+ *
86
+ * @param input Ranking input with activity data and configuration
87
+ * @returns Score from 0 to 1
88
+ */
89
+ export function computeForYouScores(input) {
90
+ const { createdAt, metadata, importance, now, recencyWeight, importanceWeight } = input;
91
+ // Compute component scores
92
+ const temporalScore = computeTemporalScore(createdAt, now);
93
+ const importanceScore = getImportanceScore(importance, metadata);
94
+ // Apply weights (clamped to 0-2 range for safety)
95
+ const safeRecencyWeight = Math.max(0, Math.min(2, recencyWeight || 1));
96
+ const safeImportanceWeight = Math.max(0, Math.min(2, importanceWeight || 1));
97
+ // Weighted average of temporal and importance
98
+ // Both components equally important by default, but weights allow tuning
99
+ const weightedTemporal = temporalScore * safeRecencyWeight;
100
+ const weightedImportance = importanceScore * safeImportanceWeight;
101
+ const totalWeight = safeRecencyWeight + safeImportanceWeight;
102
+ const finalScore = (weightedTemporal + weightedImportance) / totalWeight;
103
+ return Math.max(0, Math.min(1, finalScore));
104
+ }
105
+ /**
106
+ * Sort feed items by score (descending).
107
+ * Items with equal scores maintain relative order (stable sort).
108
+ *
109
+ * @param items Feed items to sort
110
+ * @returns Sorted items (highest score first)
111
+ */
112
+ export function sortByScore(items) {
113
+ return items.slice().sort((a, b) => {
114
+ const scoreDiff = b.score - a.score;
115
+ if (scoreDiff !== 0)
116
+ return scoreDiff;
117
+ // Tie-breaker: maintain insertion order (stable sort)
118
+ return 0;
119
+ });
120
+ }
121
+ /**
122
+ * Filter items by score threshold.
123
+ * Useful for digest generation and importance-based filtering.
124
+ *
125
+ * @param items Feed items to filter
126
+ * @param minScore Minimum score (0-1)
127
+ * @returns Items with score >= minScore
128
+ */
129
+ export function filterByScore(items, minScore) {
130
+ const safeThreshold = Math.max(0, Math.min(1, minScore));
131
+ return items.filter((item) => item.score >= safeThreshold);
132
+ }
133
+ //# sourceMappingURL=ranking.js.map