@callable-recharge/callbag-recharge 0.1.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 (452) hide show
  1. package/README.md +259 -0
  2. package/dist/backoff-BXsH2Ago.d.cts +25 -0
  3. package/dist/backoff-BXsH2Ago.d.ts +25 -0
  4. package/dist/chunk-2BINVZ33.js +2 -0
  5. package/dist/chunk-2BINVZ33.js.map +1 -0
  6. package/dist/chunk-2E3ALULW.js +2 -0
  7. package/dist/chunk-2E3ALULW.js.map +1 -0
  8. package/dist/chunk-2IM76CX3.js +2 -0
  9. package/dist/chunk-2IM76CX3.js.map +1 -0
  10. package/dist/chunk-2KKEBHMR.js +2 -0
  11. package/dist/chunk-2KKEBHMR.js.map +1 -0
  12. package/dist/chunk-2P6G236K.js +2 -0
  13. package/dist/chunk-2P6G236K.js.map +1 -0
  14. package/dist/chunk-4AANJADQ.js +2 -0
  15. package/dist/chunk-4AANJADQ.js.map +1 -0
  16. package/dist/chunk-4WFD6EA7.js +2 -0
  17. package/dist/chunk-4WFD6EA7.js.map +1 -0
  18. package/dist/chunk-52WEI2L4.js +2 -0
  19. package/dist/chunk-52WEI2L4.js.map +1 -0
  20. package/dist/chunk-52YSBIVX.js +2 -0
  21. package/dist/chunk-52YSBIVX.js.map +1 -0
  22. package/dist/chunk-5PJCNPKY.js +2 -0
  23. package/dist/chunk-5PJCNPKY.js.map +1 -0
  24. package/dist/chunk-6YHJJXF4.js +2 -0
  25. package/dist/chunk-6YHJJXF4.js.map +1 -0
  26. package/dist/chunk-7CQ6XF2G.js +2 -0
  27. package/dist/chunk-7CQ6XF2G.js.map +1 -0
  28. package/dist/chunk-7WTS4C5R.js +3 -0
  29. package/dist/chunk-7WTS4C5R.js.map +1 -0
  30. package/dist/chunk-A6BNAR7H.js +2 -0
  31. package/dist/chunk-A6BNAR7H.js.map +1 -0
  32. package/dist/chunk-BNY43SC2.js +2 -0
  33. package/dist/chunk-BNY43SC2.js.map +1 -0
  34. package/dist/chunk-C2BNB3CS.js +2 -0
  35. package/dist/chunk-C2BNB3CS.js.map +1 -0
  36. package/dist/chunk-COAIGQ25.js +2 -0
  37. package/dist/chunk-COAIGQ25.js.map +1 -0
  38. package/dist/chunk-DBAHFYN4.js +2 -0
  39. package/dist/chunk-DBAHFYN4.js.map +1 -0
  40. package/dist/chunk-E63D25PW.js +1 -0
  41. package/dist/chunk-E63D25PW.js.map +1 -0
  42. package/dist/chunk-E6EZEFS5.js +2 -0
  43. package/dist/chunk-E6EZEFS5.js.map +1 -0
  44. package/dist/chunk-EMNGVHNM.js +2 -0
  45. package/dist/chunk-EMNGVHNM.js.map +1 -0
  46. package/dist/chunk-F356J323.js +2 -0
  47. package/dist/chunk-F356J323.js.map +1 -0
  48. package/dist/chunk-HKDBOVSA.js +2 -0
  49. package/dist/chunk-HKDBOVSA.js.map +1 -0
  50. package/dist/chunk-IJNZ5GDS.js +2 -0
  51. package/dist/chunk-IJNZ5GDS.js.map +1 -0
  52. package/dist/chunk-IQUXZNBK.js +2 -0
  53. package/dist/chunk-IQUXZNBK.js.map +1 -0
  54. package/dist/chunk-IUHESEXZ.js +2 -0
  55. package/dist/chunk-IUHESEXZ.js.map +1 -0
  56. package/dist/chunk-IZ5GFMMK.js +2 -0
  57. package/dist/chunk-IZ5GFMMK.js.map +1 -0
  58. package/dist/chunk-JCITTHWJ.js +2 -0
  59. package/dist/chunk-JCITTHWJ.js.map +1 -0
  60. package/dist/chunk-JS2FB4B3.js +2 -0
  61. package/dist/chunk-JS2FB4B3.js.map +1 -0
  62. package/dist/chunk-K7VPCAZD.js +2 -0
  63. package/dist/chunk-K7VPCAZD.js.map +1 -0
  64. package/dist/chunk-KDB2NMLA.js +2 -0
  65. package/dist/chunk-KDB2NMLA.js.map +1 -0
  66. package/dist/chunk-LHEWNZ3X.js +2 -0
  67. package/dist/chunk-LHEWNZ3X.js.map +1 -0
  68. package/dist/chunk-LM26JNAK.js +2 -0
  69. package/dist/chunk-LM26JNAK.js.map +1 -0
  70. package/dist/chunk-M6ZEDHQT.js +2 -0
  71. package/dist/chunk-M6ZEDHQT.js.map +1 -0
  72. package/dist/chunk-MJB2RHP4.js +2 -0
  73. package/dist/chunk-MJB2RHP4.js.map +1 -0
  74. package/dist/chunk-MKQEMUUJ.js +2 -0
  75. package/dist/chunk-MKQEMUUJ.js.map +1 -0
  76. package/dist/chunk-MVAQ5TH7.js +2 -0
  77. package/dist/chunk-MVAQ5TH7.js.map +1 -0
  78. package/dist/chunk-NEUWMVR4.js +2 -0
  79. package/dist/chunk-NEUWMVR4.js.map +1 -0
  80. package/dist/chunk-NSJJXMWD.js +2 -0
  81. package/dist/chunk-NSJJXMWD.js.map +1 -0
  82. package/dist/chunk-NUVYBG4B.js +2 -0
  83. package/dist/chunk-NUVYBG4B.js.map +1 -0
  84. package/dist/chunk-O5WOX6C7.js +2 -0
  85. package/dist/chunk-O5WOX6C7.js.map +1 -0
  86. package/dist/chunk-O7ITRRPK.js +2 -0
  87. package/dist/chunk-O7ITRRPK.js.map +1 -0
  88. package/dist/chunk-OHGZIPRU.js +2 -0
  89. package/dist/chunk-OHGZIPRU.js.map +1 -0
  90. package/dist/chunk-PXF7567W.js +2 -0
  91. package/dist/chunk-PXF7567W.js.map +1 -0
  92. package/dist/chunk-PYRVYHZG.js +2 -0
  93. package/dist/chunk-PYRVYHZG.js.map +1 -0
  94. package/dist/chunk-QECUTAQY.js +2 -0
  95. package/dist/chunk-QECUTAQY.js.map +1 -0
  96. package/dist/chunk-QPY7RRUK.js +2 -0
  97. package/dist/chunk-QPY7RRUK.js.map +1 -0
  98. package/dist/chunk-QYUTDL4D.js +2 -0
  99. package/dist/chunk-QYUTDL4D.js.map +1 -0
  100. package/dist/chunk-UEA4RIP5.js +2 -0
  101. package/dist/chunk-UEA4RIP5.js.map +1 -0
  102. package/dist/chunk-UHUNMZJO.js +2 -0
  103. package/dist/chunk-UHUNMZJO.js.map +1 -0
  104. package/dist/chunk-W5MQVYXW.js +2 -0
  105. package/dist/chunk-W5MQVYXW.js.map +1 -0
  106. package/dist/chunk-WHAGQ74D.js +2 -0
  107. package/dist/chunk-WHAGQ74D.js.map +1 -0
  108. package/dist/chunk-WRNNR3U5.js +2 -0
  109. package/dist/chunk-WRNNR3U5.js.map +1 -0
  110. package/dist/chunk-X6UCLV7L.js +2 -0
  111. package/dist/chunk-X6UCLV7L.js.map +1 -0
  112. package/dist/chunk-XHUZ4TRE.js +2 -0
  113. package/dist/chunk-XHUZ4TRE.js.map +1 -0
  114. package/dist/chunk-XISWBEKL.js +2 -0
  115. package/dist/chunk-XISWBEKL.js.map +1 -0
  116. package/dist/chunk-YCL7NHHW.js +2 -0
  117. package/dist/chunk-YCL7NHHW.js.map +1 -0
  118. package/dist/chunk-YMOLNCDC.js +2 -0
  119. package/dist/chunk-YMOLNCDC.js.map +1 -0
  120. package/dist/chunk-ZRKP6HCI.js +2 -0
  121. package/dist/chunk-ZRKP6HCI.js.map +1 -0
  122. package/dist/data/index.cjs +3 -0
  123. package/dist/data/index.cjs.map +1 -0
  124. package/dist/data/index.d.cts +32 -0
  125. package/dist/data/index.d.ts +32 -0
  126. package/dist/data/index.js +2 -0
  127. package/dist/data/index.js.map +1 -0
  128. package/dist/eviction-DGPP1vHP.d.cts +21 -0
  129. package/dist/eviction-DGPP1vHP.d.ts +21 -0
  130. package/dist/extra/buffer.cjs +3 -0
  131. package/dist/extra/buffer.cjs.map +1 -0
  132. package/dist/extra/buffer.d.cts +21 -0
  133. package/dist/extra/buffer.d.ts +21 -0
  134. package/dist/extra/buffer.js +2 -0
  135. package/dist/extra/buffer.js.map +1 -0
  136. package/dist/extra/bufferTime.cjs +3 -0
  137. package/dist/extra/bufferTime.cjs.map +1 -0
  138. package/dist/extra/bufferTime.d.cts +15 -0
  139. package/dist/extra/bufferTime.d.ts +15 -0
  140. package/dist/extra/bufferTime.js +2 -0
  141. package/dist/extra/bufferTime.js.map +1 -0
  142. package/dist/extra/combine.cjs +3 -0
  143. package/dist/extra/combine.cjs.map +1 -0
  144. package/dist/extra/combine.d.cts +19 -0
  145. package/dist/extra/combine.d.ts +19 -0
  146. package/dist/extra/combine.js +2 -0
  147. package/dist/extra/combine.js.map +1 -0
  148. package/dist/extra/concat.cjs +3 -0
  149. package/dist/extra/concat.cjs.map +1 -0
  150. package/dist/extra/concat.d.cts +18 -0
  151. package/dist/extra/concat.d.ts +18 -0
  152. package/dist/extra/concat.js +2 -0
  153. package/dist/extra/concat.js.map +1 -0
  154. package/dist/extra/concatMap.cjs +3 -0
  155. package/dist/extra/concatMap.cjs.map +1 -0
  156. package/dist/extra/concatMap.d.cts +25 -0
  157. package/dist/extra/concatMap.d.ts +25 -0
  158. package/dist/extra/concatMap.js +2 -0
  159. package/dist/extra/concatMap.js.map +1 -0
  160. package/dist/extra/debounce.cjs +3 -0
  161. package/dist/extra/debounce.cjs.map +1 -0
  162. package/dist/extra/debounce.d.cts +17 -0
  163. package/dist/extra/debounce.d.ts +17 -0
  164. package/dist/extra/debounce.js +2 -0
  165. package/dist/extra/debounce.js.map +1 -0
  166. package/dist/extra/delay.cjs +3 -0
  167. package/dist/extra/delay.cjs.map +1 -0
  168. package/dist/extra/delay.d.cts +15 -0
  169. package/dist/extra/delay.d.ts +15 -0
  170. package/dist/extra/delay.js +2 -0
  171. package/dist/extra/delay.js.map +1 -0
  172. package/dist/extra/distinctUntilChanged.cjs +3 -0
  173. package/dist/extra/distinctUntilChanged.cjs.map +1 -0
  174. package/dist/extra/distinctUntilChanged.d.cts +16 -0
  175. package/dist/extra/distinctUntilChanged.d.ts +16 -0
  176. package/dist/extra/distinctUntilChanged.js +2 -0
  177. package/dist/extra/distinctUntilChanged.js.map +1 -0
  178. package/dist/extra/elementAt.cjs +3 -0
  179. package/dist/extra/elementAt.cjs.map +1 -0
  180. package/dist/extra/elementAt.d.cts +17 -0
  181. package/dist/extra/elementAt.d.ts +17 -0
  182. package/dist/extra/elementAt.js +2 -0
  183. package/dist/extra/elementAt.js.map +1 -0
  184. package/dist/extra/empty.cjs +3 -0
  185. package/dist/extra/empty.cjs.map +1 -0
  186. package/dist/extra/empty.d.cts +13 -0
  187. package/dist/extra/empty.d.ts +13 -0
  188. package/dist/extra/empty.js +2 -0
  189. package/dist/extra/empty.js.map +1 -0
  190. package/dist/extra/exhaustMap.cjs +3 -0
  191. package/dist/extra/exhaustMap.cjs.map +1 -0
  192. package/dist/extra/exhaustMap.d.cts +21 -0
  193. package/dist/extra/exhaustMap.d.ts +21 -0
  194. package/dist/extra/exhaustMap.js +2 -0
  195. package/dist/extra/exhaustMap.js.map +1 -0
  196. package/dist/extra/filter.cjs +3 -0
  197. package/dist/extra/filter.cjs.map +1 -0
  198. package/dist/extra/filter.d.cts +16 -0
  199. package/dist/extra/filter.d.ts +16 -0
  200. package/dist/extra/filter.js +2 -0
  201. package/dist/extra/filter.js.map +1 -0
  202. package/dist/extra/find.cjs +3 -0
  203. package/dist/extra/find.cjs.map +1 -0
  204. package/dist/extra/find.d.cts +17 -0
  205. package/dist/extra/find.d.ts +17 -0
  206. package/dist/extra/find.js +2 -0
  207. package/dist/extra/find.js.map +1 -0
  208. package/dist/extra/first.cjs +3 -0
  209. package/dist/extra/first.cjs.map +1 -0
  210. package/dist/extra/first.d.cts +15 -0
  211. package/dist/extra/first.d.ts +15 -0
  212. package/dist/extra/first.js +2 -0
  213. package/dist/extra/first.js.map +1 -0
  214. package/dist/extra/flat.cjs +3 -0
  215. package/dist/extra/flat.cjs.map +1 -0
  216. package/dist/extra/flat.d.cts +21 -0
  217. package/dist/extra/flat.d.ts +21 -0
  218. package/dist/extra/flat.js +2 -0
  219. package/dist/extra/flat.js.map +1 -0
  220. package/dist/extra/forEach.cjs +2 -0
  221. package/dist/extra/forEach.cjs.map +1 -0
  222. package/dist/extra/forEach.d.cts +13 -0
  223. package/dist/extra/forEach.d.ts +13 -0
  224. package/dist/extra/forEach.js +2 -0
  225. package/dist/extra/forEach.js.map +1 -0
  226. package/dist/extra/fromEvent.cjs +3 -0
  227. package/dist/extra/fromEvent.cjs.map +1 -0
  228. package/dist/extra/fromEvent.d.cts +14 -0
  229. package/dist/extra/fromEvent.d.ts +14 -0
  230. package/dist/extra/fromEvent.js +2 -0
  231. package/dist/extra/fromEvent.js.map +1 -0
  232. package/dist/extra/fromIter.cjs +3 -0
  233. package/dist/extra/fromIter.cjs.map +1 -0
  234. package/dist/extra/fromIter.d.cts +15 -0
  235. package/dist/extra/fromIter.d.ts +15 -0
  236. package/dist/extra/fromIter.js +2 -0
  237. package/dist/extra/fromIter.js.map +1 -0
  238. package/dist/extra/fromObs.cjs +3 -0
  239. package/dist/extra/fromObs.cjs.map +1 -0
  240. package/dist/extra/fromObs.d.cts +25 -0
  241. package/dist/extra/fromObs.d.ts +25 -0
  242. package/dist/extra/fromObs.js +2 -0
  243. package/dist/extra/fromObs.js.map +1 -0
  244. package/dist/extra/fromPromise.cjs +3 -0
  245. package/dist/extra/fromPromise.cjs.map +1 -0
  246. package/dist/extra/fromPromise.d.cts +16 -0
  247. package/dist/extra/fromPromise.d.ts +16 -0
  248. package/dist/extra/fromPromise.js +2 -0
  249. package/dist/extra/fromPromise.js.map +1 -0
  250. package/dist/extra/index.cjs +3 -0
  251. package/dist/extra/index.cjs.map +1 -0
  252. package/dist/extra/index.d.cts +220 -0
  253. package/dist/extra/index.d.ts +220 -0
  254. package/dist/extra/index.js +2 -0
  255. package/dist/extra/index.js.map +1 -0
  256. package/dist/extra/interval.cjs +3 -0
  257. package/dist/extra/interval.cjs.map +1 -0
  258. package/dist/extra/interval.d.cts +15 -0
  259. package/dist/extra/interval.d.ts +15 -0
  260. package/dist/extra/interval.js +2 -0
  261. package/dist/extra/interval.js.map +1 -0
  262. package/dist/extra/last.cjs +3 -0
  263. package/dist/extra/last.cjs.map +1 -0
  264. package/dist/extra/last.d.cts +16 -0
  265. package/dist/extra/last.d.ts +16 -0
  266. package/dist/extra/last.js +2 -0
  267. package/dist/extra/last.js.map +1 -0
  268. package/dist/extra/map.cjs +3 -0
  269. package/dist/extra/map.cjs.map +1 -0
  270. package/dist/extra/map.d.cts +15 -0
  271. package/dist/extra/map.d.ts +15 -0
  272. package/dist/extra/map.js +2 -0
  273. package/dist/extra/map.js.map +1 -0
  274. package/dist/extra/merge.cjs +3 -0
  275. package/dist/extra/merge.cjs.map +1 -0
  276. package/dist/extra/merge.d.cts +21 -0
  277. package/dist/extra/merge.d.ts +21 -0
  278. package/dist/extra/merge.js +2 -0
  279. package/dist/extra/merge.js.map +1 -0
  280. package/dist/extra/never.cjs +3 -0
  281. package/dist/extra/never.cjs.map +1 -0
  282. package/dist/extra/never.d.cts +13 -0
  283. package/dist/extra/never.d.ts +13 -0
  284. package/dist/extra/never.js +2 -0
  285. package/dist/extra/never.js.map +1 -0
  286. package/dist/extra/of.cjs +3 -0
  287. package/dist/extra/of.cjs.map +1 -0
  288. package/dist/extra/of.d.cts +14 -0
  289. package/dist/extra/of.d.ts +14 -0
  290. package/dist/extra/of.js +2 -0
  291. package/dist/extra/of.js.map +1 -0
  292. package/dist/extra/pairwise.cjs +3 -0
  293. package/dist/extra/pairwise.cjs.map +1 -0
  294. package/dist/extra/pairwise.d.cts +16 -0
  295. package/dist/extra/pairwise.d.ts +16 -0
  296. package/dist/extra/pairwise.js +2 -0
  297. package/dist/extra/pairwise.js.map +1 -0
  298. package/dist/extra/partition.cjs +3 -0
  299. package/dist/extra/partition.cjs.map +1 -0
  300. package/dist/extra/partition.d.cts +24 -0
  301. package/dist/extra/partition.d.ts +24 -0
  302. package/dist/extra/partition.js +2 -0
  303. package/dist/extra/partition.js.map +1 -0
  304. package/dist/extra/pipeRaw.cjs +3 -0
  305. package/dist/extra/pipeRaw.cjs.map +1 -0
  306. package/dist/extra/pipeRaw.d.cts +22 -0
  307. package/dist/extra/pipeRaw.d.ts +22 -0
  308. package/dist/extra/pipeRaw.js +2 -0
  309. package/dist/extra/pipeRaw.js.map +1 -0
  310. package/dist/extra/remember.cjs +3 -0
  311. package/dist/extra/remember.cjs.map +1 -0
  312. package/dist/extra/remember.d.cts +17 -0
  313. package/dist/extra/remember.d.ts +17 -0
  314. package/dist/extra/remember.js +2 -0
  315. package/dist/extra/remember.js.map +1 -0
  316. package/dist/extra/repeat.cjs +3 -0
  317. package/dist/extra/repeat.cjs.map +1 -0
  318. package/dist/extra/repeat.d.cts +29 -0
  319. package/dist/extra/repeat.d.ts +29 -0
  320. package/dist/extra/repeat.js +2 -0
  321. package/dist/extra/repeat.js.map +1 -0
  322. package/dist/extra/rescue.cjs +3 -0
  323. package/dist/extra/rescue.cjs.map +1 -0
  324. package/dist/extra/rescue.d.cts +16 -0
  325. package/dist/extra/rescue.d.ts +16 -0
  326. package/dist/extra/rescue.js +2 -0
  327. package/dist/extra/rescue.js.map +1 -0
  328. package/dist/extra/retry.cjs +3 -0
  329. package/dist/extra/retry.cjs.map +1 -0
  330. package/dist/extra/retry.d.cts +29 -0
  331. package/dist/extra/retry.d.ts +29 -0
  332. package/dist/extra/retry.js +2 -0
  333. package/dist/extra/retry.js.map +1 -0
  334. package/dist/extra/sample.cjs +3 -0
  335. package/dist/extra/sample.cjs.map +1 -0
  336. package/dist/extra/sample.d.cts +15 -0
  337. package/dist/extra/sample.d.ts +15 -0
  338. package/dist/extra/sample.js +2 -0
  339. package/dist/extra/sample.js.map +1 -0
  340. package/dist/extra/scan.cjs +3 -0
  341. package/dist/extra/scan.cjs.map +1 -0
  342. package/dist/extra/scan.d.cts +16 -0
  343. package/dist/extra/scan.d.ts +16 -0
  344. package/dist/extra/scan.js +2 -0
  345. package/dist/extra/scan.js.map +1 -0
  346. package/dist/extra/share.cjs +2 -0
  347. package/dist/extra/share.cjs.map +1 -0
  348. package/dist/extra/share.d.cts +12 -0
  349. package/dist/extra/share.d.ts +12 -0
  350. package/dist/extra/share.js +2 -0
  351. package/dist/extra/share.js.map +1 -0
  352. package/dist/extra/skip.cjs +3 -0
  353. package/dist/extra/skip.cjs.map +1 -0
  354. package/dist/extra/skip.d.cts +16 -0
  355. package/dist/extra/skip.d.ts +16 -0
  356. package/dist/extra/skip.js +2 -0
  357. package/dist/extra/skip.js.map +1 -0
  358. package/dist/extra/startWith.cjs +3 -0
  359. package/dist/extra/startWith.cjs.map +1 -0
  360. package/dist/extra/startWith.d.cts +15 -0
  361. package/dist/extra/startWith.d.ts +15 -0
  362. package/dist/extra/startWith.js +2 -0
  363. package/dist/extra/startWith.js.map +1 -0
  364. package/dist/extra/subject.cjs +3 -0
  365. package/dist/extra/subject.cjs.map +1 -0
  366. package/dist/extra/subject.d.cts +27 -0
  367. package/dist/extra/subject.d.ts +27 -0
  368. package/dist/extra/subject.js +2 -0
  369. package/dist/extra/subject.js.map +1 -0
  370. package/dist/extra/subscribe.cjs +2 -0
  371. package/dist/extra/subscribe.cjs.map +1 -0
  372. package/dist/extra/subscribe.d.cts +19 -0
  373. package/dist/extra/subscribe.d.ts +19 -0
  374. package/dist/extra/subscribe.js +2 -0
  375. package/dist/extra/subscribe.js.map +1 -0
  376. package/dist/extra/switchMap.cjs +3 -0
  377. package/dist/extra/switchMap.cjs.map +1 -0
  378. package/dist/extra/switchMap.d.cts +21 -0
  379. package/dist/extra/switchMap.d.ts +21 -0
  380. package/dist/extra/switchMap.js +2 -0
  381. package/dist/extra/switchMap.js.map +1 -0
  382. package/dist/extra/take.cjs +3 -0
  383. package/dist/extra/take.cjs.map +1 -0
  384. package/dist/extra/take.d.cts +15 -0
  385. package/dist/extra/take.d.ts +15 -0
  386. package/dist/extra/take.js +2 -0
  387. package/dist/extra/take.js.map +1 -0
  388. package/dist/extra/takeUntil.cjs +3 -0
  389. package/dist/extra/takeUntil.cjs.map +1 -0
  390. package/dist/extra/takeUntil.d.cts +20 -0
  391. package/dist/extra/takeUntil.d.ts +20 -0
  392. package/dist/extra/takeUntil.js +2 -0
  393. package/dist/extra/takeUntil.js.map +1 -0
  394. package/dist/extra/tap.cjs +3 -0
  395. package/dist/extra/tap.cjs.map +1 -0
  396. package/dist/extra/tap.d.cts +15 -0
  397. package/dist/extra/tap.d.ts +15 -0
  398. package/dist/extra/tap.js +2 -0
  399. package/dist/extra/tap.js.map +1 -0
  400. package/dist/extra/throttle.cjs +3 -0
  401. package/dist/extra/throttle.cjs.map +1 -0
  402. package/dist/extra/throttle.d.cts +16 -0
  403. package/dist/extra/throttle.d.ts +16 -0
  404. package/dist/extra/throttle.js +2 -0
  405. package/dist/extra/throttle.js.map +1 -0
  406. package/dist/extra/throwError.cjs +3 -0
  407. package/dist/extra/throwError.cjs.map +1 -0
  408. package/dist/extra/throwError.d.cts +13 -0
  409. package/dist/extra/throwError.d.ts +13 -0
  410. package/dist/extra/throwError.js +2 -0
  411. package/dist/extra/throwError.js.map +1 -0
  412. package/dist/extra/timeout.cjs +3 -0
  413. package/dist/extra/timeout.cjs.map +1 -0
  414. package/dist/extra/timeout.d.cts +19 -0
  415. package/dist/extra/timeout.d.ts +19 -0
  416. package/dist/extra/timeout.js +2 -0
  417. package/dist/extra/timeout.js.map +1 -0
  418. package/dist/index.cjs +3 -0
  419. package/dist/index.cjs.map +1 -0
  420. package/dist/index.d.cts +197 -0
  421. package/dist/index.d.ts +197 -0
  422. package/dist/index.js +2 -0
  423. package/dist/index.js.map +1 -0
  424. package/dist/memory/index.cjs +3 -0
  425. package/dist/memory/index.cjs.map +1 -0
  426. package/dist/memory/index.d.cts +113 -0
  427. package/dist/memory/index.d.ts +113 -0
  428. package/dist/memory/index.js +2 -0
  429. package/dist/memory/index.js.map +1 -0
  430. package/dist/orchestrate/index.cjs +3 -0
  431. package/dist/orchestrate/index.cjs.map +1 -0
  432. package/dist/orchestrate/index.d.cts +101 -0
  433. package/dist/orchestrate/index.d.ts +101 -0
  434. package/dist/orchestrate/index.js +2 -0
  435. package/dist/orchestrate/index.js.map +1 -0
  436. package/dist/patterns/createStore/index.cjs +3 -0
  437. package/dist/patterns/createStore/index.cjs.map +1 -0
  438. package/dist/patterns/createStore/index.d.cts +55 -0
  439. package/dist/patterns/createStore/index.d.ts +55 -0
  440. package/dist/patterns/createStore/index.js +2 -0
  441. package/dist/patterns/createStore/index.js.map +1 -0
  442. package/dist/types-BiLijSKv.d.cts +192 -0
  443. package/dist/types-CIITLkgL.d.ts +192 -0
  444. package/dist/types-DsAN6Hga.d.cts +86 -0
  445. package/dist/types-DsAN6Hga.d.ts +86 -0
  446. package/dist/utils/index.cjs +3 -0
  447. package/dist/utils/index.cjs.map +1 -0
  448. package/dist/utils/index.d.cts +8 -0
  449. package/dist/utils/index.d.ts +8 -0
  450. package/dist/utils/index.js +2 -0
  451. package/dist/utils/index.js.map +1 -0
  452. package/package.json +141 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/memory/index.ts","../../src/core/bitmask.ts","../../src/core/protocol.ts","../../src/core/inspector.ts","../../src/core/derived.ts","../../src/core/effect.ts","../../src/core/producer.ts","../../src/core/state.ts","../../src/data/reactiveIndex.ts","../../src/utils/reactiveEviction.ts","../../src/memory/decay.ts","../../src/memory/node.ts","../../src/memory/collection.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Memory module — Phase 1 (Memory Primitives)\n// ---------------------------------------------------------------------------\n\nexport { collection } from \"./collection\";\nexport { computeScore, decay } from \"./decay\";\nexport { memoryNode } from \"./node\";\n\n// Types\nexport type {\n\tCollection,\n\tCollectionOptions,\n\tDecayFn,\n\tDecayOptions,\n\tMemoryMeta,\n\tMemoryNode,\n\tMemoryNodeOptions,\n\tScoreWeights,\n} from \"./types\";\n","/**\n * Dirty-dep bitmask — safe for any number of deps.\n *\n * ≤32 deps: stores bitmask as a plain number in `_v` (zero overhead).\n * >32 deps: stores bits in a Uint32Array `_w`, with `_v` tracking the\n * count of set bits for O(1) emptiness checks.\n *\n * In both cases, `empty()` is a single `_v === 0` comparison — no typeof\n * dispatch, no array scan. Method calls on the class prototype are\n * monomorphic (one hidden class for all instances).\n *\n * Used by derived, effect, merge, combine — anywhere dirty-dep tracking\n * needs per-dep bit flags.\n */\n\nexport class Bitmask {\n\t/** Narrow (≤32): bitmask value. Wide (>32): count of set bits. */\n\t_v: number;\n\t/** Uint32Array for >32 deps, null otherwise. */\n\t_w: Uint32Array | null;\n\n\tconstructor(size: number) {\n\t\tthis._v = 0;\n\t\tthis._w = size > 32 ? new Uint32Array(((size - 1) >>> 5) + 1) : null;\n\t}\n\n\tset(i: number): void {\n\t\tconst w = this._w;\n\t\tif (w === null) {\n\t\t\tthis._v |= 1 << i;\n\t\t} else {\n\t\t\tconst idx = i >>> 5;\n\t\t\tconst bit = 1 << (i & 31);\n\t\t\tif (!(w[idx] & bit)) {\n\t\t\t\tw[idx] |= bit;\n\t\t\t\tthis._v++;\n\t\t\t}\n\t\t}\n\t}\n\n\tclear(i: number): void {\n\t\tconst w = this._w;\n\t\tif (w === null) {\n\t\t\tthis._v &= ~(1 << i);\n\t\t} else {\n\t\t\tconst idx = i >>> 5;\n\t\t\tconst bit = 1 << (i & 31);\n\t\t\tif (w[idx] & bit) {\n\t\t\t\tw[idx] &= ~bit;\n\t\t\t\tthis._v--;\n\t\t\t}\n\t\t}\n\t}\n\n\ttest(i: number): boolean {\n\t\tconst w = this._w;\n\t\tif (w === null) return (this._v & (1 << i)) !== 0;\n\t\treturn (w[i >>> 5] & (1 << (i & 31))) !== 0;\n\t}\n\n\t/** O(1) in both narrow and wide paths. */\n\tempty(): boolean {\n\t\treturn this._v === 0;\n\t}\n\n\treset(): void {\n\t\tthis._v = 0;\n\t\tthis._w?.fill(0);\n\t}\n}\n","// ---------------------------------------------------------------------------\n// Protocol — v3 type 3 control channel\n// ---------------------------------------------------------------------------\n// Type 3 (STATE) carries control signals: DIRTY, RESOLVED\n// Type 1 (DATA) carries only real values — never sentinels\n// ---------------------------------------------------------------------------\n\n/** Control signal: \"my value is about to change\" */\nexport const DIRTY = Symbol(\"DIRTY\");\n\n/** Control signal: \"I was dirty but my value didn't change\" */\nexport const RESOLVED = Symbol(\"RESOLVED\");\n\nexport type Signal = typeof DIRTY | typeof RESOLVED;\n\n/** Node status — tracks current lifecycle state (v4) */\nexport type NodeStatus =\n\t| \"DISCONNECTED\"\n\t| \"DIRTY\"\n\t| \"SETTLED\"\n\t| \"RESOLVED\"\n\t| \"COMPLETED\"\n\t| \"ERRORED\";\n\n// ---------------------------------------------------------------------------\n// Integer status constants — pack into _flags for hot-path performance.\n// 3 bits (7-9) encode 6 statuses. Use STATUS_MASK to read/write.\n// ---------------------------------------------------------------------------\nexport const S_DISCONNECTED = 0;\nexport const S_DIRTY = 1;\nexport const S_SETTLED = 2;\nexport const S_RESOLVED = 3;\nexport const S_COMPLETED = 4;\nexport const S_ERRORED = 5;\nexport const STATUS_SHIFT = 7;\nexport const STATUS_MASK = 0b111 << STATUS_SHIFT; // bits 7-9\n\nconst STATUS_STRINGS: NodeStatus[] = [\n\t\"DISCONNECTED\",\n\t\"DIRTY\",\n\t\"SETTLED\",\n\t\"RESOLVED\",\n\t\"COMPLETED\",\n\t\"ERRORED\",\n];\n\n/** Decode integer status bits back to string (for Inspector / tests) */\nexport function decodeStatus(flags: number): NodeStatus {\n\treturn STATUS_STRINGS[(flags & STATUS_MASK) >>> STATUS_SHIFT];\n}\n\n/** Callbag signal types */\nexport const START = 0;\nexport const DATA = 1;\nexport const END = 2;\nexport const STATE = 3;\n\n// ---------------------------------------------------------------------------\n// Batch — defers type 1 value emissions; type 3 DIRTY propagates immediately\n// ---------------------------------------------------------------------------\n\nlet batchDepth = 0;\nconst deferredEmissions: Array<() => void> = [];\n\n// `draining` prevents re-entrant drain when a nested batch() call ends while\n// the outer drain loop is already running. Without it, the inner batch's\n// finally block would see batchDepth===0 and start a second drain, racing the\n// outer loop — potentially double-processing items or clearing the array mid-\n// iteration. With draining=true, the inner batch skips its drain; any items it\n// pushes are picked up by the outer loop (the `for` condition re-evaluates\n// `deferredEmissions.length` on every iteration, so appends during drain are\n// naturally included in the same pass).\nlet draining = false;\n\nexport function batch<T>(fn: () => T): T {\n\tbatchDepth++;\n\ttry {\n\t\treturn fn();\n\t} finally {\n\t\tbatchDepth--;\n\t\tif (batchDepth === 0 && !draining) {\n\t\t\tdraining = true;\n\t\t\tfor (let i = 0; i < deferredEmissions.length; i++) {\n\t\t\t\tdeferredEmissions[i]();\n\t\t\t}\n\t\t\tdeferredEmissions.length = 0;\n\t\t\tdraining = false;\n\t\t}\n\t}\n}\n\nexport function isBatching(): boolean {\n\treturn batchDepth > 0;\n}\n\nexport function deferEmission(fn: () => void): void {\n\tdeferredEmissions.push(fn);\n}\n\n// ---------------------------------------------------------------------------\n// Connection batching (producer start deferral) — unchanged from v2\n// ---------------------------------------------------------------------------\n\nlet connectDepth = 0;\nconst pendingStarts: Array<() => void> = [];\n\nexport function beginDeferredStart(): void {\n\tconnectDepth++;\n}\n\nexport function endDeferredStart(): void {\n\tconnectDepth--;\n\tif (connectDepth === 0) {\n\t\tfor (let i = 0; i < pendingStarts.length; i++) {\n\t\t\tpendingStarts[i]();\n\t\t}\n\t\tpendingStarts.length = 0;\n\t}\n}\n\nexport function deferStart(start: () => void): void {\n\tif (connectDepth > 0) {\n\t\tpendingStarts.push(start);\n\t} else {\n\t\tstart();\n\t}\n}\n\n// ---------------------------------------------------------------------------\n// teardown — protocol-level graph destruction\n// ---------------------------------------------------------------------------\n// Sends END to all downstream sinks of a store node, cascading through the\n// entire subgraph. After teardown, the node is in COMPLETED state and won't\n// accept new values or subscriptions.\n//\n// Works with any node that uses the output slot model:\n// - ProducerImpl / StateImpl / OperatorImpl → calls .complete()\n// - DerivedImpl → calls ._handleEnd() (no public complete() on derived)\n// ---------------------------------------------------------------------------\n\nexport function teardown(store: { source: (type: number, payload?: any) => void }): void {\n\tconst node = store as any;\n\tif (typeof node.complete === \"function\") {\n\t\tnode.complete();\n\t} else if (typeof node._handleEnd === \"function\") {\n\t\tnode._handleEnd(undefined);\n\t}\n}\n","// ---------------------------------------------------------------------------\n// Inspector — static class for observability\n// ---------------------------------------------------------------------------\n// All debug metadata lives here in WeakMaps, not on the store objects.\n// Stores stay lean. Inspector is opt-in overhead.\n//\n// v5: Zero intrusion into primitives. No hooks in hot paths. All methods\n// are static — call directly as Inspector.observe(), Inspector.tap(), etc.\n// - register/registerEdge: metadata collection (called from constructors)\n// - inspect/graph/dumpGraph/snapshot: read-only graph queries\n// - observe/spy/trace: callbag sinks for debugging (subscribe externally)\n// - tap: transparent passthrough wrapper for graph visualization\n// ---------------------------------------------------------------------------\n\nimport type { NodeStatus, Signal } from \"./protocol\";\nimport { DATA, DIRTY, END, RESOLVED, START, STATE } from \"./protocol\";\nimport type { Store } from \"./types\";\n\nexport interface StoreInfo<T = unknown> {\n\tname: string | undefined;\n\tkind: string;\n\tvalue: T;\n\t/** v4: node lifecycle status */\n\tstatus: NodeStatus | undefined;\n}\n\nexport interface ObserveResult<T> {\n\t/** All DATA (type 1) values received, in order */\n\tvalues: T[];\n\t/** All STATE (type 3) payloads received (DIRTY, RESOLVED, or unknown) */\n\tsignals: Signal[];\n\t/** All events in protocol order: { type, data } */\n\tevents: Array<{ type: \"data\" | \"signal\" | \"end\"; data: unknown }>;\n\t/** Whether END (type 2) has been received */\n\tended: boolean;\n\t/** Error payload from END, if any */\n\tendError: unknown;\n\t/** Count of DIRTY signals received */\n\tdirtyCount: number;\n\t/** Count of RESOLVED signals received */\n\tresolvedCount: number;\n\t/** Store name (from Inspector, if registered) */\n\tname: string | undefined;\n\t/** Disconnect the observer */\n\tdispose: () => void;\n}\n\n// Static-only class is intentional API for Inspector namespace\n// biome-ignore lint/complexity/noStaticOnlyClass: public API surface\nexport class Inspector {\n\t// WeakMaps for metadata — keyed by any graph node (stores, effects, etc.)\n\tprivate static _names = new WeakMap<object, string>();\n\tprivate static _kinds = new WeakMap<object, string>();\n\tprivate static _keys = new WeakMap<object, string>();\n\n\t// WeakRef set for graph() — allows GC of unused nodes\n\tprivate static _stores = new Set<WeakRef<object>>();\n\n\t// Dependency edges: parent key → child keys\n\tprivate static _edges = new Map<string, string[]>();\n\n\t// Unique key generation\n\tprivate static _nextId = 0;\n\tprivate static _usedKeys = new Set<string>();\n\n\t// Enabled flag — when false, register/getName are no-ops\n\tprivate static _explicitEnabled: boolean | null = null;\n\tprivate static _cachedDefault: boolean | null = null;\n\n\tstatic get enabled(): boolean {\n\t\tif (Inspector._explicitEnabled !== null) return Inspector._explicitEnabled;\n\t\tif (Inspector._cachedDefault !== null) return Inspector._cachedDefault;\n\t\ttry {\n\t\t\tInspector._cachedDefault = (globalThis as any).process?.env?.NODE_ENV !== \"production\";\n\t\t} catch {\n\t\t\tInspector._cachedDefault = true;\n\t\t}\n\t\treturn Inspector._cachedDefault;\n\t}\n\n\tstatic set enabled(value: boolean) {\n\t\tInspector._explicitEnabled = value;\n\t}\n\n\t/** Compute a dep-name-based suffix for unique key generation */\n\tprivate static _depSuffix(deps?: object[]): string | undefined {\n\t\tif (!deps?.length) return undefined;\n\t\tconst names = deps.map((d) => Inspector._names.get(d) ?? \"?\");\n\t\tconst joined = names.join(\",\");\n\t\treturn joined.length > 40 ? `${joined.slice(0, 37)}...` : joined;\n\t}\n\n\t/** Resolve a node to its unique graph key */\n\tprivate static _resolveKey(node: object): string {\n\t\treturn Inspector._keys.get(node) ?? Inspector._names.get(node) ?? \"anonymous\";\n\t}\n\n\t/** Register a graph node (store, effect, etc.) with the inspector */\n\tstatic register(node: object, opts?: { name?: string; kind?: string; deps?: object[] }): void {\n\t\tif (!Inspector.enabled) return;\n\t\tif (opts?.name) Inspector._names.set(node, opts.name);\n\t\tif (opts?.kind) Inspector._kinds.set(node, opts.kind);\n\n\t\t// Compute unique key\n\t\tconst id = Inspector._nextId++;\n\t\tlet key = opts?.name;\n\t\tif (key && !Inspector._usedKeys.has(key)) {\n\t\t\t// Unique name — use as-is\n\t\t} else if (key) {\n\t\t\t// Name collision — differentiate with dep names or ID\n\t\t\tconst depSuffix = Inspector._depSuffix(opts?.deps);\n\t\t\tkey = depSuffix ? `${key}(${depSuffix})` : `${key}_${id}`;\n\t\t\tif (Inspector._usedKeys.has(key)) key = `${key}_${id}`;\n\t\t} else {\n\t\t\t// Unnamed — use kind + dep names or ID\n\t\t\tconst kind = opts?.kind ?? \"store\";\n\t\t\tconst depSuffix = Inspector._depSuffix(opts?.deps);\n\t\t\tkey = depSuffix ? `${kind}(${depSuffix})` : `${kind}_${id}`;\n\t\t\tif (Inspector._usedKeys.has(key)) key = `${key}_${id}`;\n\t\t}\n\n\t\tInspector._usedKeys.add(key);\n\t\tInspector._keys.set(node, key);\n\t\tInspector._stores.add(new WeakRef(node));\n\t}\n\n\t/** Register a dependency edge between parent and child nodes */\n\tstatic registerEdge(parent: object, child: object): void {\n\t\tif (!Inspector.enabled) return;\n\t\tconst parentKey = Inspector._resolveKey(parent);\n\t\tconst childKey = Inspector._resolveKey(child);\n\t\tconst children = Inspector._edges.get(parentKey);\n\t\tif (children) {\n\t\t\tif (!children.includes(childKey)) children.push(childKey);\n\t\t} else {\n\t\t\tInspector._edges.set(parentKey, [childKey]);\n\t\t}\n\t}\n\n\t/** Get dependency edges: parent → children */\n\tstatic getEdges(): Map<string, string[]> {\n\t\treturn new Map(Inspector._edges);\n\t}\n\n\t/** Get the name of a node */\n\tstatic getName(node: object): string | undefined {\n\t\tif (!Inspector.enabled) return undefined;\n\t\treturn Inspector._names.get(node);\n\t}\n\n\t/** Get the kind of a node */\n\tstatic getKind(node: object): string | undefined {\n\t\treturn Inspector._kinds.get(node);\n\t}\n\n\t/** Inspect a single graph node — includes status and value (if available) */\n\tstatic inspect<T = unknown>(node: object): StoreInfo<T> {\n\t\treturn {\n\t\t\tname: Inspector._names.get(node),\n\t\t\tkind: Inspector._kinds.get(node) ?? \"unknown\",\n\t\t\tvalue: (typeof (node as any).get === \"function\" ? (node as any).get() : undefined) as T,\n\t\t\tstatus: (node as any)._status,\n\t\t};\n\t}\n\n\t/** Get all living nodes as a Map. Also prunes dead edges from GC'd nodes. */\n\tstatic graph(): Map<string, StoreInfo> {\n\t\tconst result = new Map<string, StoreInfo>();\n\t\tconst livingKeys = new Set<string>();\n\t\tfor (const ref of Inspector._stores) {\n\t\t\tconst node = ref.deref();\n\t\t\tif (!node) {\n\t\t\t\tInspector._stores.delete(ref); // cleanup GC'd refs\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst key = Inspector._resolveKey(node);\n\t\t\tlivingKeys.add(key);\n\t\t\tresult.set(key, Inspector.inspect(node));\n\t\t}\n\t\t// Prune edges referencing GC'd stores\n\t\tfor (const [key, children] of Inspector._edges) {\n\t\t\tif (!livingKeys.has(key)) {\n\t\t\t\tInspector._edges.delete(key);\n\t\t\t\tInspector._usedKeys.delete(key);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst alive = children.filter((c) => livingKeys.has(c));\n\t\t\tif (alive.length === 0) {\n\t\t\t\tInspector._edges.delete(key);\n\t\t\t} else if (alive.length !== children.length) {\n\t\t\t\tInspector._edges.set(key, alive);\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\t/** Trace a specific store's value changes (raw callbag — no extra/ dependency) */\n\tstatic trace<T>(store: Store<T>, cb: (value: T, prev: T | undefined) => void): () => void {\n\t\tlet talkback: ((type: number) => void) | null = null;\n\t\tlet prev: T | undefined = store.get();\n\t\tstore.source(START, (type: number, data: any) => {\n\t\t\tif (type === START) talkback = data;\n\t\t\tif (type === END) {\n\t\t\t\ttalkback = null;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (type === 1) {\n\t\t\t\tconst next = data as T;\n\t\t\t\tif (!Object.is(next, prev)) {\n\t\t\t\t\tconst p = prev;\n\t\t\t\t\tprev = next;\n\t\t\t\t\tcb(next, p);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\treturn () => talkback?.(END);\n\t}\n\n\t/** Pretty-print the entire store graph for console/CLI debugging */\n\tstatic dumpGraph(): string {\n\t\tconst g = Inspector.graph();\n\t\tconst edges = Inspector.getEdges();\n\n\t\t// Build reverse map: child key → parent keys (deps)\n\t\tconst depsMap = new Map<string, string[]>();\n\t\tfor (const [parent, children] of edges) {\n\t\t\tfor (const child of children) {\n\t\t\t\tconst deps = depsMap.get(child);\n\t\t\t\tif (deps) {\n\t\t\t\t\tif (!deps.includes(parent)) deps.push(parent);\n\t\t\t\t} else {\n\t\t\t\t\tdepsMap.set(child, [parent]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst lines: string[] = [];\n\t\tfor (const [key, info] of g) {\n\t\t\tconst deps = depsMap.get(key);\n\t\t\tconst children = edges.get(key);\n\t\t\tconst depsStr = deps?.length ? ` ← [${deps.join(\", \")}]` : \"\";\n\t\t\tconst childStr = children?.length ? ` → [${children.join(\", \")}]` : \"\";\n\t\t\tlines.push(\n\t\t\t\t` ${key} (${info.kind}) = ${JSON.stringify(info.value)} [${info.status ?? \"?\"}]${depsStr}${childStr}`,\n\t\t\t);\n\t\t}\n\t\tconst header = `Store Graph (${g.size} nodes):`;\n\t\treturn [header, ...lines].join(\"\\n\");\n\t}\n\n\t/**\n\t * Internal observe implementation shared by observe() and spy().\n\t */\n\tprivate static _observe<T>(\n\t\tstore: Store<T>,\n\t\tlabel?: string,\n\t\tlog?: (...args: any[]) => void,\n\t): ObserveResult<T> {\n\t\tlet talkback: ((type: number) => void) | null = null;\n\t\tconst name = label ?? Inspector.getName(store);\n\t\tconst result: ObserveResult<T> = {\n\t\t\tvalues: [],\n\t\t\tsignals: [],\n\t\t\tevents: [],\n\t\t\tended: false,\n\t\t\tendError: undefined,\n\t\t\tdirtyCount: 0,\n\t\t\tresolvedCount: 0,\n\t\t\tname,\n\t\t\tdispose: () => talkback?.(END),\n\t\t};\n\n\t\tstore.source(START, (type: number, data: any) => {\n\t\t\tif (type === START) {\n\t\t\t\ttalkback = data;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (type === DATA) {\n\t\t\t\tresult.values.push(data);\n\t\t\t\tresult.events.push({ type: \"data\", data });\n\t\t\t\tif (log) log(`[${name}] DATA:`, data);\n\t\t\t} else if (type === STATE) {\n\t\t\t\tresult.signals.push(data);\n\t\t\t\tresult.events.push({ type: \"signal\", data });\n\t\t\t\tif (data === DIRTY) result.dirtyCount++;\n\t\t\t\telse if (data === RESOLVED) result.resolvedCount++;\n\t\t\t\tif (log) log(`[${name}] STATE:`, data);\n\t\t\t} else if (type === END) {\n\t\t\t\tresult.ended = true;\n\t\t\t\tresult.endError = data;\n\t\t\t\tresult.events.push({ type: \"end\", data });\n\t\t\t\tif (log) log(`[${name}] END`, data !== undefined ? data : \"\");\n\t\t\t\ttalkback = null;\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\t/**\n\t * Observe a store's full callbag protocol — the test-friendly alternative\n\t * to hooks. Captures DATA values, STATE signals, END, and provides\n\t * convenience accessors.\n\t *\n\t * Returns a live observation object — arrays grow as the store emits.\n\t *\n\t * ```ts\n\t * const obs = Inspector.observe(myStore);\n\t * myState.set(5);\n\t * obs.values // [5]\n\t * obs.signals // [DIRTY]\n\t * obs.ended // false\n\t * obs.dirtyCount // 1\n\t * obs.dispose() // stop observing\n\t * ```\n\t */\n\tstatic observe<T>(store: Store<T>): ObserveResult<T> {\n\t\treturn Inspector._observe(store);\n\t}\n\n\t/**\n\t * Create a transparent passthrough wrapper for graph visualization.\n\t * The wrapper delegates `get()` and `source()` to the original store,\n\t * appearing as a distinct node in the Inspector graph. Zero overhead —\n\t * subscribers connect directly to the original store's source.\n\t */\n\tstatic tap<T>(store: Store<T>, name?: string): Store<T> {\n\t\tconst tapName = name ?? `tap(${Inspector.getName(store) ?? \"anon\"})`;\n\t\tconst wrapper: Store<T> = {\n\t\t\tget: () => store.get(),\n\t\t\tsource: store.source,\n\t\t};\n\t\tInspector.register(wrapper, { name: tapName, kind: \"tap\" });\n\t\tInspector.registerEdge(store, wrapper);\n\t\treturn wrapper;\n\t}\n\n\t/**\n\t * Enhanced observe() with logging — for interactive debugging.\n\t * Returns the same observation object as observe(), but also logs each\n\t * event as it happens. Pass a custom logger or defaults to console.log.\n\t */\n\tstatic spy<T>(\n\t\tstore: Store<T>,\n\t\topts?: { name?: string; log?: (...args: any[]) => void },\n\t): ObserveResult<T> {\n\t\tconst label = opts?.name ?? Inspector.getName(store) ?? \"spy\";\n\t\tconst log = opts?.log ?? console.log;\n\t\treturn Inspector._observe(store, label, log);\n\t}\n\n\t/**\n\t * JSON-serializable snapshot of the entire graph — nodes + edges.\n\t * Designed for AI consumption during debugging sessions.\n\t */\n\tstatic snapshot(): {\n\t\tnodes: Array<{ name: string; kind: string; value: unknown; status: string | undefined }>;\n\t\tedges: Array<{ from: string; to: string }>;\n\t} {\n\t\tconst g = Inspector.graph();\n\t\tconst edgeMap = Inspector.getEdges();\n\t\tconst nodes: Array<{ name: string; kind: string; value: unknown; status: string | undefined }> =\n\t\t\t[];\n\t\tfor (const [key, info] of g) {\n\t\t\tnodes.push({ name: key, kind: info.kind, value: info.value, status: info.status });\n\t\t}\n\t\tconst edges: Array<{ from: string; to: string }> = [];\n\t\tfor (const [parent, children] of edgeMap) {\n\t\t\tfor (const child of children) {\n\t\t\t\tedges.push({ from: parent, to: child });\n\t\t\t}\n\t\t}\n\t\treturn { nodes, edges };\n\t}\n\n\t/** Reset all state (for testing) */\n\tstatic _reset(): void {\n\t\tInspector._names = new WeakMap<object, string>();\n\t\tInspector._kinds = new WeakMap<object, string>();\n\t\tInspector._keys = new WeakMap<object, string>();\n\t\tInspector._stores = new Set<WeakRef<object>>();\n\t\tInspector._edges = new Map();\n\t\tInspector._usedKeys = new Set();\n\t\tInspector._nextId = 0;\n\t\tInspector._explicitEnabled = null;\n\t\tInspector._cachedDefault = null;\n\t}\n}\n","/**\n * Computed store with dirty tracking and caching. Recomputes fn() when\n * all dirty deps have resolved, emitting the new value on type 1 DATA.\n *\n * v6 (Option D3): Disconnect on last subscriber leaving. get() pull-computes\n * from deps when disconnected (always fresh). source() subscription triggers\n * connection; last unsubscribe triggers disconnect.\n *\n * _status packed into _flags bits 7-9 for hot-path performance.\n * String status exposed via getter for Inspector/test backward compat.\n *\n * Class-based for V8 hidden class optimization and prototype method sharing.\n * Boolean fields packed into _flags bitmask to reduce hidden class size.\n */\n\nimport { Bitmask } from \"./bitmask\";\nimport { Inspector } from \"./inspector\";\nimport {\n\tbeginDeferredStart,\n\tDATA,\n\tDIRTY,\n\tdecodeStatus,\n\tEND,\n\tendDeferredStart,\n\tRESOLVED,\n\tS_COMPLETED,\n\tS_DIRTY,\n\tS_DISCONNECTED,\n\tS_ERRORED,\n\tS_RESOLVED,\n\tS_SETTLED,\n\tSTART,\n\tSTATE,\n\tSTATUS_MASK,\n\tSTATUS_SHIFT,\n} from \"./protocol\";\nimport type { Store, StoreOptions } from \"./types\";\n\n// Flag bits for _flags bitmask (bits 0-6)\nconst D_HAS_CACHED = 1;\nconst D_CONNECTED = 2;\nconst D_ANY_DATA = 4;\nconst D_COMPLETED = 8;\n// bit 4 unused (was D_STANDALONE, then D_RESET — removed: derived get() always pull-computes)\nconst D_MULTI = 32;\nconst D_IDENTITY = 64;\n\n// Pre-shifted status constants for hot-path writes\nconst _S_DISCONNECTED = S_DISCONNECTED << STATUS_SHIFT;\nconst _S_DIRTY = S_DIRTY << STATUS_SHIFT;\nconst _S_SETTLED = S_SETTLED << STATUS_SHIFT;\nconst _S_RESOLVED = S_RESOLVED << STATUS_SHIFT;\nconst _S_COMPLETED = S_COMPLETED << STATUS_SHIFT;\nconst _S_ERRORED = S_ERRORED << STATUS_SHIFT;\nconst _STATUS_MASK = STATUS_MASK;\n\nexport class DerivedImpl<T> {\n\t_output: ((type: number, data?: any) => void) | Set<any> | null = null;\n\t_upstreamTalkbacks: Array<(type: number) => void> = [];\n\t_cachedValue: T | undefined;\n\t_flags: number;\n\t_dirtyDeps!: Bitmask;\n\t_eqFn: ((a: T, b: T) => boolean) | undefined;\n\t_deps: Store<unknown>[];\n\t_fn: () => T;\n\n\tget _status() {\n\t\treturn decodeStatus(this._flags);\n\t}\n\n\tconstructor(deps: Store<unknown>[], fn: () => T, opts?: StoreOptions<T>, identity?: boolean) {\n\t\tthis._deps = deps;\n\t\tthis._fn = fn;\n\t\tthis._eqFn = opts?.equals;\n\t\tthis._flags = identity ? D_IDENTITY : 0;\n\t\t// S_DISCONNECTED = 0, so no need to set status bits\n\t\tthis._dirtyDeps = new Bitmask(deps.length);\n\n\t\tthis.source = this.source.bind(this);\n\n\t\tInspector.register(this as any, { kind: \"derived\", ...opts, deps });\n\t\tfor (const dep of deps) Inspector.registerEdge(dep, this as any);\n\n\t\t// v4.1: Fully lazy — no computation or connection at construction.\n\t}\n\n\t_dispatch(type: number, data?: any): void {\n\t\tconst output = this._output;\n\t\tif (!output) return;\n\t\tif (this._flags & D_MULTI) {\n\t\t\tfor (const sink of output as Set<any>) sink(type, data);\n\t\t} else {\n\t\t\t(output as (type: number, data?: any) => void)(type, data);\n\t\t}\n\t}\n\n\t_recompute(): void {\n\t\tconst result = this._fn();\n\t\tif (this._eqFn && this._flags & D_HAS_CACHED && this._eqFn(this._cachedValue as T, result)) {\n\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_RESOLVED;\n\t\t\tthis._dispatch(STATE, RESOLVED);\n\t\t\treturn;\n\t\t}\n\t\tthis._cachedValue = result;\n\t\tthis._flags = ((this._flags | D_HAS_CACHED) & ~_STATUS_MASK) | _S_SETTLED;\n\t\tthis._dispatch(DATA, this._cachedValue);\n\t}\n\n\t_recomputeIdentity(data: T): void {\n\t\tif (this._eqFn && this._flags & D_HAS_CACHED && this._eqFn(this._cachedValue as T, data)) {\n\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_RESOLVED;\n\t\t\tthis._dispatch(STATE, RESOLVED);\n\t\t\treturn;\n\t\t}\n\t\tthis._cachedValue = data;\n\t\tthis._flags = ((this._flags | D_HAS_CACHED) & ~_STATUS_MASK) | _S_SETTLED;\n\t\tthis._dispatch(DATA, data);\n\t}\n\n\t_lazyConnect(): void {\n\t\tif (this._flags & (D_CONNECTED | D_COMPLETED)) return;\n\t\tthis._cachedValue = this._fn();\n\t\tthis._flags = ((this._flags | D_HAS_CACHED) & ~_STATUS_MASK) | _S_SETTLED;\n\t\tbeginDeferredStart();\n\t\tthis._connectUpstream();\n\t\tif (!(this._flags & D_COMPLETED)) {\n\t\t\tthis._flags |= D_CONNECTED;\n\t\t}\n\t\tendDeferredStart();\n\t}\n\n\t_connectUpstream(): void {\n\t\tthis._upstreamTalkbacks = [];\n\t\tif (this._deps.length === 1) {\n\t\t\tif (this._flags & D_IDENTITY) {\n\t\t\t\tthis._connectSingleDepIdentity();\n\t\t\t} else {\n\t\t\t\tthis._connectSingleDep();\n\t\t\t}\n\t\t} else {\n\t\t\tthis._connectMultiDep();\n\t\t}\n\t}\n\n\t/** Single-dep: no bitmask, direct forward (P0 optimization) */\n\t_connectSingleDep(): void {\n\t\tlet dirty = false;\n\t\tthis._deps[0].source(START, (type: number, data: any) => {\n\t\t\tif (type === START) {\n\t\t\t\tthis._upstreamTalkbacks.push(data);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._flags & D_COMPLETED) return;\n\n\t\t\tif (type === STATE) {\n\t\t\t\tif (data === DIRTY) {\n\t\t\t\t\tdirty = true;\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t} else if (data === RESOLVED) {\n\t\t\t\t\tif (dirty) {\n\t\t\t\t\t\tdirty = false;\n\t\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_RESOLVED;\n\t\t\t\t\t\tthis._dispatch(STATE, RESOLVED);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._dispatch(STATE, data);\n\t\t\t\t}\n\t\t\t} else if (type === DATA) {\n\t\t\t\tif (dirty) {\n\t\t\t\t\tdirty = false;\n\t\t\t\t\tthis._recompute();\n\t\t\t\t} else {\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t\tthis._recompute();\n\t\t\t\t}\n\t\t\t} else if (type === END) {\n\t\t\t\tthis._handleEnd(data);\n\t\t\t}\n\t\t});\n\t}\n\n\t_connectSingleDepIdentity(): void {\n\t\tlet dirty = false;\n\t\tthis._deps[0].source(START, (type: number, data: any) => {\n\t\t\tif (type === START) {\n\t\t\t\tthis._upstreamTalkbacks.push(data);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (this._flags & D_COMPLETED) return;\n\n\t\t\tif (type === STATE) {\n\t\t\t\tif (data === DIRTY) {\n\t\t\t\t\tdirty = true;\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t} else if (data === RESOLVED) {\n\t\t\t\t\tif (dirty) {\n\t\t\t\t\t\tdirty = false;\n\t\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_RESOLVED;\n\t\t\t\t\t\tthis._dispatch(STATE, RESOLVED);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tthis._dispatch(STATE, data);\n\t\t\t\t}\n\t\t\t} else if (type === DATA) {\n\t\t\t\tif (dirty) {\n\t\t\t\t\tdirty = false;\n\t\t\t\t\tthis._recomputeIdentity(data);\n\t\t\t\t} else {\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t\tthis._recomputeIdentity(data);\n\t\t\t\t}\n\t\t\t} else if (type === END) {\n\t\t\t\tthis._handleEnd(data);\n\t\t\t}\n\t\t});\n\t}\n\n\t/** Multi-dep: bitmask-based diamond resolution */\n\t_connectMultiDep(): void {\n\t\tfor (let i = 0; i < this._deps.length; i++) {\n\t\t\tif (this._flags & D_COMPLETED) break;\n\t\t\tconst depIndex = i;\n\t\t\tthis._deps[depIndex].source(START, (type: number, data: any) => {\n\t\t\t\tif (type === START) {\n\t\t\t\t\tthis._upstreamTalkbacks.push(data);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this._flags & D_COMPLETED) return;\n\n\t\t\t\tif (type === STATE) {\n\t\t\t\t\tif (data === DIRTY) {\n\t\t\t\t\t\tconst wasEmpty = this._dirtyDeps.empty();\n\t\t\t\t\t\tthis._dirtyDeps.set(depIndex);\n\t\t\t\t\t\tif (wasEmpty) {\n\t\t\t\t\t\t\tthis._flags &= ~D_ANY_DATA;\n\t\t\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (data === RESOLVED) {\n\t\t\t\t\t\tif (this._dirtyDeps.test(depIndex)) {\n\t\t\t\t\t\t\tthis._dirtyDeps.clear(depIndex);\n\t\t\t\t\t\t\tif (this._dirtyDeps.empty()) {\n\t\t\t\t\t\t\t\tif (this._flags & D_ANY_DATA) {\n\t\t\t\t\t\t\t\t\tthis._recompute();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_RESOLVED;\n\t\t\t\t\t\t\t\t\tthis._dispatch(STATE, RESOLVED);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis._dispatch(STATE, data);\n\t\t\t\t\t}\n\t\t\t\t} else if (type === DATA) {\n\t\t\t\t\tif (this._dirtyDeps.test(depIndex)) {\n\t\t\t\t\t\tthis._dirtyDeps.clear(depIndex);\n\t\t\t\t\t\tthis._flags |= D_ANY_DATA;\n\t\t\t\t\t\tif (this._dirtyDeps.empty()) {\n\t\t\t\t\t\t\tthis._recompute();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (this._dirtyDeps.empty()) {\n\t\t\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t\t\t\tthis._recompute();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis._flags |= D_ANY_DATA;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (type === END) {\n\t\t\t\t\tthis._handleEnd(data);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\t_handleEnd(errorData: any): void {\n\t\tthis._flags |= D_COMPLETED;\n\t\tthis._flags =\n\t\t\t(this._flags & ~_STATUS_MASK) | (errorData !== undefined ? _S_ERRORED : _S_COMPLETED);\n\t\tfor (const tb of this._upstreamTalkbacks) tb(END);\n\t\tthis._upstreamTalkbacks = [];\n\t\tthis._flags &= ~D_CONNECTED;\n\t\tthis._dirtyDeps.reset();\n\t\tconst output = this._output;\n\t\tconst wasMulti = this._flags & D_MULTI;\n\t\tthis._output = null;\n\t\tthis._flags &= ~D_MULTI;\n\t\tif (output) {\n\t\t\tif (wasMulti) {\n\t\t\t\tfor (const sink of output as Set<any>) {\n\t\t\t\t\terrorData !== undefined ? sink(END, errorData) : sink(END);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrorData !== undefined\n\t\t\t\t\t? (output as (type: number, data?: any) => void)(END, errorData)\n\t\t\t\t\t: (output as (type: number, data?: any) => void)(END);\n\t\t\t}\n\t\t}\n\t}\n\n\t_disconnectUpstream(): void {\n\t\tfor (const tb of this._upstreamTalkbacks) tb(END);\n\t\tthis._upstreamTalkbacks = [];\n\t\tthis._flags &= ~(D_CONNECTED | D_ANY_DATA);\n\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DISCONNECTED;\n\t\tthis._dirtyDeps.reset();\n\t}\n\n\t/**\n\t * v6: Pull-compute when disconnected (always fresh). When connected,\n\t * returns push-updated cache (fast path).\n\t */\n\tget(): T {\n\t\tif (this._flags & D_CONNECTED) {\n\t\t\treturn this._cachedValue as T;\n\t\t}\n\t\tif (this._flags & D_COMPLETED) {\n\t\t\treturn this._cachedValue as T;\n\t\t}\n\t\t// Disconnected: pull-compute from deps\n\t\tconst result = this._fn();\n\t\tthis._cachedValue = result;\n\t\tthis._flags |= D_HAS_CACHED;\n\t\treturn result;\n\t}\n\n\tsource(type: number, payload?: any): void {\n\t\tif (type === START) {\n\t\t\tconst sink = payload;\n\t\t\tif (this._flags & D_COMPLETED) {\n\t\t\t\tsink(START, (_t: number) => {});\n\t\t\t\tsink(END);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!(this._flags & D_CONNECTED)) {\n\t\t\t\tthis._lazyConnect();\n\t\t\t\tif (this._flags & D_COMPLETED) {\n\t\t\t\t\tsink(START, (_t: number) => {});\n\t\t\t\t\tsink(END);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this._output === null) {\n\t\t\t\tthis._output = sink;\n\t\t\t} else if (!(this._flags & D_MULTI)) {\n\t\t\t\tconst set = new Set<any>();\n\t\t\t\tset.add(this._output);\n\t\t\t\tset.add(sink);\n\t\t\t\tthis._output = set;\n\t\t\t\tthis._flags |= D_MULTI;\n\t\t\t} else {\n\t\t\t\t(this._output as Set<any>).add(sink);\n\t\t\t}\n\n\t\t\tsink(START, (t: number) => {\n\t\t\t\tif (t === DATA) sink(DATA, this._cachedValue);\n\t\t\t\tif (t === END) {\n\t\t\t\t\tif (this._output === null) return;\n\t\t\t\t\tif (this._flags & D_MULTI) {\n\t\t\t\t\t\tconst set = this._output as Set<any>;\n\t\t\t\t\t\tset.delete(sink);\n\t\t\t\t\t\tif (set.size === 1) {\n\t\t\t\t\t\t\tthis._output = set.values().next().value;\n\t\t\t\t\t\t\tthis._flags &= ~D_MULTI;\n\t\t\t\t\t\t} else if (set.size === 0) {\n\t\t\t\t\t\t\tthis._output = null;\n\t\t\t\t\t\t\tthis._flags &= ~D_MULTI;\n\t\t\t\t\t\t\tthis._disconnectUpstream();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (this._output === sink) {\n\t\t\t\t\t\tthis._output = null;\n\t\t\t\t\t\tthis._disconnectUpstream();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n\nexport function derived<T>(deps: Store<unknown>[], fn: () => T, opts?: StoreOptions<T>): Store<T> {\n\treturn new DerivedImpl<T>(deps, fn, opts) as any;\n}\n\nexport namespace derived {\n\texport function from<T>(dep: Store<T>, opts?: StoreOptions<T>): Store<T> {\n\t\treturn new DerivedImpl<T>([dep as Store<unknown>], () => dep.get() as any, opts, true) as any;\n\t}\n}\n","/**\n * Side-effect runner. Connects eagerly to deps on creation, runs fn() inline\n * when all dirty deps resolve. Returns a dispose function.\n *\n * Stateless: does not produce a store. No cached value or get().\n *\n * v3: type 3 dirty tracking across deps. Skips execution when all deps sent\n * RESOLVED (no value changed). Effects run as part of the callbag signal\n * flow — no enqueueEffect.\n *\n * Pure closure implementation — no class needed. All handler state lives in\n * closure-local variables for fastest V8 access. No instanceof usage in the\n * library, so the class shell provided no benefit.\n */\n\nimport { Bitmask } from \"./bitmask\";\nimport { Inspector } from \"./inspector\";\nimport {\n\tbeginDeferredStart,\n\tDATA,\n\tDIRTY,\n\tEND,\n\tendDeferredStart,\n\tRESOLVED,\n\tSTART,\n\tSTATE,\n} from \"./protocol\";\nimport type { Store } from \"./types\";\n\nexport function effect(\n\tdeps: Store<unknown>[],\n\tfn: () => undefined | (() => void),\n\topts?: { name?: string },\n): () => void {\n\tlet cleanup: (() => void) | undefined;\n\tconst talkbacks: Array<(type: number) => void> = [];\n\tlet disposed = false;\n\tconst dirtyDeps = new Bitmask(deps.length);\n\tlet anyDataReceived = false;\n\n\tfunction run(): void {\n\t\tif (disposed) return;\n\t\tif (cleanup) cleanup();\n\t\tcleanup = fn();\n\t}\n\n\tbeginDeferredStart();\n\n\trun();\n\n\tfor (let i = 0; i < deps.length; i++) {\n\t\tif (disposed) break;\n\t\tconst depIndex = i;\n\t\tdeps[depIndex].source(START, (type: number, data: any) => {\n\t\t\tif (type === START) {\n\t\t\t\ttalkbacks.push(data);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (disposed) return;\n\t\t\tif (type === STATE) {\n\t\t\t\tif (data === DIRTY) {\n\t\t\t\t\tif (dirtyDeps.empty()) anyDataReceived = false;\n\t\t\t\t\tdirtyDeps.set(depIndex);\n\t\t\t\t} else if (data === RESOLVED) {\n\t\t\t\t\tif (dirtyDeps.test(depIndex)) {\n\t\t\t\t\t\tdirtyDeps.clear(depIndex);\n\t\t\t\t\t\tif (dirtyDeps.empty()) {\n\t\t\t\t\t\t\tif (anyDataReceived) run();\n\t\t\t\t\t\t\t// else: all deps RESOLVED, skip\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (type === DATA) {\n\t\t\t\tif (dirtyDeps.test(depIndex)) {\n\t\t\t\t\tdirtyDeps.clear(depIndex);\n\t\t\t\t\tanyDataReceived = true;\n\t\t\t\t\tif (dirtyDeps.empty()) {\n\t\t\t\t\t\trun();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// DATA without prior DIRTY: raw callbag source or batch\n\t\t\t\t\t// edge case. Match derived's behavior — treat as immediate.\n\t\t\t\t\tif (dirtyDeps.empty()) {\n\t\t\t\t\t\trun();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tanyDataReceived = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (type === END) {\n\t\t\t\t// Dep completed or errored — dispose the effect.\n\t\t\t\tdisposed = true;\n\t\t\t\tif (cleanup) cleanup();\n\t\t\t\tcleanup = undefined;\n\t\t\t\tfor (const tb of talkbacks) tb(END);\n\t\t\t\ttalkbacks.length = 0;\n\t\t\t}\n\t\t});\n\t}\n\n\tendDeferredStart();\n\n\tconst dispose = () => {\n\t\tif (disposed) return;\n\t\tdisposed = true;\n\t\tif (cleanup) cleanup();\n\t\tcleanup = undefined;\n\t\tfor (const tb of talkbacks) tb(END);\n\t\ttalkbacks.length = 0;\n\t};\n\n\tInspector.register(dispose, { kind: \"effect\", ...opts, deps });\n\tfor (const dep of deps) Inspector.registerEdge(dep, dispose);\n\n\treturn dispose;\n}\n","/**\n * General-purpose source primitive. Can emit values, send control signals,\n * complete, and error. Lazy start on first sink, auto-cleanup on last\n * sink disconnect.\n *\n * Stateful: maintains currentValue. get() returns currentValue (or\n * getter(currentValue) when getter option is provided).\n *\n * v4: Output slot model replaces _sinks Set. _output is null (no sinks),\n * a function (single sink — P0 optimization), or a Set (multi sink).\n * _status tracks node lifecycle. autoDirty (default true) sends DIRTY on\n * type 3 before each type 1 DATA. equals option guards emit();\n * resetOnTeardown resets value on stop.\n *\n * v5: _status packed into _flags bits 7-9 for hot-path performance.\n * String status exposed via getter for Inspector/test backward compat.\n *\n * Class-based for V8 hidden class optimization and prototype method sharing.\n * Boolean fields packed into _flags bitmask to reduce hidden class size.\n */\n\nimport { Inspector } from \"./inspector\";\nimport type { Signal } from \"./protocol\";\nimport {\n\tDATA,\n\tDIRTY,\n\tdecodeStatus,\n\tdeferEmission,\n\tdeferStart,\n\tEND,\n\tisBatching,\n\tRESOLVED,\n\tS_COMPLETED,\n\tS_DIRTY,\n\tS_DISCONNECTED,\n\tS_ERRORED,\n\tS_RESOLVED,\n\tS_SETTLED,\n\tSTART,\n\tSTATE,\n\tSTATUS_MASK,\n\tSTATUS_SHIFT,\n} from \"./protocol\";\nimport type { ProducerStore, SourceOptions, Store } from \"./types\";\n\nexport type ProducerFn<T> = (actions: {\n\temit: (value: T) => void;\n\tsignal: (s: Signal) => void;\n\tcomplete: () => void;\n\terror: (e: unknown) => void;\n}) => (() => void) | undefined;\n\nexport type ProducerOpts<T> = SourceOptions<T> & {\n\tautoDirty?: boolean;\n\t_skipInspect?: boolean;\n};\n\n// Flag bits for _flags bitmask (bits 0-6)\nconst P_STARTED = 1;\nconst P_MULTI = 64;\n\n// Exported for subclass fast paths (StateImpl)\nexport const P_COMPLETED = 2;\nexport const P_AUTO_DIRTY = 4;\nconst P_RESET = 8;\nconst P_RESUB = 16;\nexport const P_PENDING = 32;\n\n// Status bits (bits 7-9) — exported for StateImpl fast path\nexport const _STATUS_MASK = STATUS_MASK;\nexport const _S_DIRTY = S_DIRTY << STATUS_SHIFT;\nexport const _S_SETTLED = S_SETTLED << STATUS_SHIFT;\nexport const _S_DISCONNECTED = S_DISCONNECTED << STATUS_SHIFT;\nexport const _S_COMPLETED = S_COMPLETED << STATUS_SHIFT;\nexport const _S_ERRORED = S_ERRORED << STATUS_SHIFT;\nexport const _S_RESOLVED = S_RESOLVED << STATUS_SHIFT;\n\nexport class ProducerImpl<T> {\n\t_value: T | undefined;\n\t_output: ((type: number, data?: any) => void) | Set<any> | null = null;\n\t_flags: number;\n\n\tget _status() {\n\t\treturn decodeStatus(this._flags);\n\t}\n\t_cleanup: (() => void) | undefined;\n\t_fn: ProducerFn<T> | undefined;\n\t_eqFn: ((a: T, b: T) => boolean) | undefined;\n\t_getterFn: ((cached: T | undefined) => T) | undefined;\n\t_initial: T | undefined;\n\n\tconstructor(fn?: ProducerFn<T>, opts?: ProducerOpts<T>) {\n\t\tthis._value = opts?.initial;\n\t\tthis._fn = fn;\n\t\tthis._eqFn = opts?.equals;\n\t\tthis._getterFn = opts?.getter;\n\t\tthis._initial = opts?.initial;\n\n\t\tlet flags = 0;\n\t\tif (opts?.autoDirty !== false) flags |= P_AUTO_DIRTY;\n\t\tif (opts?.resetOnTeardown) flags |= P_RESET;\n\t\tif (opts?.resubscribable) flags |= P_RESUB;\n\t\t// S_DISCONNECTED = 0, so no need to set status bits\n\t\tthis._flags = flags;\n\n\t\t// Bind public API methods so they work when detached (callbag interop,\n\t\t// destructuring, etc.). Replaces per-instance closure functions.\n\t\tthis.source = this.source.bind(this);\n\t\tthis.emit = this.emit.bind(this);\n\t\tthis.signal = this.signal.bind(this);\n\t\tthis.complete = this.complete.bind(this);\n\t\tthis.error = this.error.bind(this);\n\n\t\tif (!opts?._skipInspect) Inspector.register(this as any, { kind: \"producer\", ...opts });\n\t}\n\n\tget(): T | undefined {\n\t\treturn this._getterFn ? this._getterFn(this._value) : this._value;\n\t}\n\n\t/**\n\t * Dispatch a signal to all current subscribers via the output slot.\n\t *\n\t * Safety: P_MULTI flag and _output type are always updated together.\n\t * No reentrancy can occur between the two assignments (source() doesn't\n\t * trigger dispatch, and dispatch doesn't trigger source()). The null-check\n\t * provides an additional guard for the MULTI→null transition path.\n\t */\n\t_dispatch(type: number, data?: any): void {\n\t\tconst output = this._output;\n\t\tif (!output) return;\n\t\tif (this._flags & P_MULTI) {\n\t\t\tfor (const sink of output as Set<any>) sink(type, data);\n\t\t} else {\n\t\t\t(output as (type: number, data?: any) => void)(type, data);\n\t\t}\n\t}\n\n\temit(value: T): void {\n\t\tif (this._flags & P_COMPLETED) return;\n\t\tif (this._eqFn && this._value !== undefined && this._eqFn(this._value as T, value)) return;\n\t\tthis._value = value;\n\t\tif (!this._output) return;\n\t\tif (isBatching()) {\n\t\t\tif (!(this._flags & P_PENDING)) {\n\t\t\t\tthis._flags |= P_PENDING;\n\t\t\t\tif (this._flags & P_AUTO_DIRTY) {\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t}\n\t\t\t\tdeferEmission(() => {\n\t\t\t\t\tthis._flags &= ~P_PENDING;\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_SETTLED;\n\t\t\t\t\tthis._dispatch(DATA, this._value);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._flags & P_AUTO_DIRTY) {\n\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t}\n\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_SETTLED;\n\t\t\tthis._dispatch(DATA, this._value);\n\t\t}\n\t}\n\n\tsignal(s: Signal): void {\n\t\tif (this._flags & P_COMPLETED || !this._output) return;\n\t\tif (s === DIRTY) this._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\telse if (s === RESOLVED) this._flags = (this._flags & ~_STATUS_MASK) | _S_RESOLVED;\n\t\t// Unknown signals: dispatch without _status change (v4 forward-compat)\n\t\tthis._dispatch(STATE, s);\n\t}\n\n\tcomplete(): void {\n\t\tif (this._flags & P_COMPLETED) return;\n\t\tthis._flags = ((this._flags | P_COMPLETED) & ~_STATUS_MASK) | _S_COMPLETED;\n\t\tconst output = this._output;\n\t\tconst wasMulti = this._flags & P_MULTI;\n\t\tthis._output = null;\n\t\tthis._flags &= ~P_MULTI;\n\t\tthis._stop();\n\t\tif (output) {\n\t\t\tif (wasMulti) {\n\t\t\t\tfor (const sink of output as Set<any>) sink(END);\n\t\t\t} else {\n\t\t\t\t(output as (type: number, data?: any) => void)(END);\n\t\t\t}\n\t\t}\n\t}\n\n\terror(e: unknown): void {\n\t\tif (this._flags & P_COMPLETED) return;\n\t\tthis._flags = ((this._flags | P_COMPLETED) & ~_STATUS_MASK) | _S_ERRORED;\n\t\tconst output = this._output;\n\t\tconst wasMulti = this._flags & P_MULTI;\n\t\tthis._output = null;\n\t\tthis._flags &= ~P_MULTI;\n\t\tthis._stop();\n\t\tif (output) {\n\t\t\tif (wasMulti) {\n\t\t\t\tfor (const sink of output as Set<any>) sink(END, e);\n\t\t\t} else {\n\t\t\t\t(output as (type: number, data?: any) => void)(END, e);\n\t\t\t}\n\t\t}\n\t}\n\n\t_start(): void {\n\t\tif (this._flags & P_STARTED || !this._fn) return;\n\t\tthis._flags |= P_STARTED;\n\t\tconst result = this._fn(this as any);\n\t\tthis._cleanup = typeof result === \"function\" ? result : undefined;\n\t}\n\n\t_stop(): void {\n\t\tif (!(this._flags & P_STARTED)) return;\n\t\tthis._flags &= ~P_STARTED;\n\t\tif (this._cleanup) this._cleanup();\n\t\tthis._cleanup = undefined;\n\t\tif (this._flags & P_RESET) this._value = this._initial;\n\t\tif (!(this._flags & P_COMPLETED)) this._flags = (this._flags & ~_STATUS_MASK) | _S_DISCONNECTED;\n\t}\n\n\tsource(type: number, payload?: any): void {\n\t\tif (type === START) {\n\t\t\tconst sink = payload;\n\t\t\tif (this._flags & P_COMPLETED) {\n\t\t\t\tif (this._flags & P_RESUB && this._output === null) {\n\t\t\t\t\tthis._flags = (this._flags & ~(P_COMPLETED | _STATUS_MASK)) | _S_DISCONNECTED;\n\t\t\t\t} else {\n\t\t\t\t\tsink(START, (_t: number) => {});\n\t\t\t\t\tsink(END);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (this._output === null) {\n\t\t\t\tthis._output = sink;\n\t\t\t} else if (!(this._flags & P_MULTI)) {\n\t\t\t\tconst set = new Set<any>();\n\t\t\t\tset.add(this._output);\n\t\t\t\tset.add(sink);\n\t\t\t\tthis._output = set;\n\t\t\t\tthis._flags |= P_MULTI;\n\t\t\t} else {\n\t\t\t\t(this._output as Set<any>).add(sink);\n\t\t\t}\n\t\t\tsink(START, (t: number) => {\n\t\t\t\tif (t === DATA) sink(DATA, this._value);\n\t\t\t\tif (t === END) {\n\t\t\t\t\tif (this._output === null) return;\n\t\t\t\t\tif (this._flags & P_MULTI) {\n\t\t\t\t\t\tconst set = this._output as Set<any>;\n\t\t\t\t\t\tset.delete(sink);\n\t\t\t\t\t\tif (set.size === 1) {\n\t\t\t\t\t\t\tthis._output = set.values().next().value;\n\t\t\t\t\t\t\tthis._flags &= ~P_MULTI;\n\t\t\t\t\t\t} else if (set.size === 0) {\n\t\t\t\t\t\t\tthis._output = null;\n\t\t\t\t\t\t\tthis._flags &= ~P_MULTI;\n\t\t\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DISCONNECTED;\n\t\t\t\t\t\t\tthis._stop();\n\t\t\t\t\t\t}\n\t\t\t\t\t} else if (this._output === sink) {\n\t\t\t\t\t\tthis._output = null;\n\t\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DISCONNECTED;\n\t\t\t\t\t\tthis._stop();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tdeferStart(() => this._start());\n\t\t}\n\t}\n}\n\nexport function producer<T>(\n\tfn: ProducerFn<T> | undefined,\n\topts: ProducerOpts<T> & { initial: T },\n): ProducerStore<T> & Store<T>;\nexport function producer<T>(fn?: ProducerFn<T>, opts?: ProducerOpts<T>): ProducerStore<T>;\nexport function producer<T>(fn?: ProducerFn<T>, opts?: ProducerOpts<T>): ProducerStore<T> {\n\treturn new ProducerImpl<T>(fn, opts) as any;\n}\n","/**\n * A writable store, subclass of ProducerImpl.\n * Adds set()/update() API and defaults equals to Object.is.\n *\n * v5: _status packed into _flags bits 7-9 (inherited from ProducerImpl).\n * set() fast path uses pre-shifted status constants for zero-overhead writes.\n */\n\nimport { Inspector } from \"./inspector\";\nimport {\n\t_S_DIRTY,\n\t_S_SETTLED,\n\t_STATUS_MASK,\n\tP_AUTO_DIRTY,\n\tP_COMPLETED,\n\tP_PENDING,\n\tProducerImpl,\n} from \"./producer\";\nimport { DATA, DIRTY, deferEmission, isBatching, STATE } from \"./protocol\";\nimport type { StoreOptions, WritableStore } from \"./types\";\n\nexport class StateImpl<T> extends ProducerImpl<T> {\n\tconstructor(initial: T, opts?: StoreOptions<T>) {\n\t\tsuper(undefined, {\n\t\t\tinitial,\n\t\t\tautoDirty: true,\n\t\t\tequals: opts?.equals ?? Object.is,\n\t\t\t_skipInspect: true,\n\t\t});\n\t\tthis.set = this.set.bind(this);\n\t\tInspector.register(this as any, { kind: \"state\", ...opts });\n\t}\n\n\toverride get(): T {\n\t\treturn this._value as T;\n\t}\n\n\t/**\n\t * Fast path: inlines ProducerImpl.emit() to skip the bound method call.\n\t * For no-subscriber writes, this is just an equals check + value assign.\n\t * Status writes use pre-shifted integer constants (bits 7-9 of _flags).\n\t */\n\tset(value: T): void {\n\t\tif (this._flags & P_COMPLETED) return;\n\t\tif (this._value !== undefined && this._eqFn!(this._value as T, value)) return;\n\t\tthis._value = value;\n\t\tif (!this._output) return;\n\t\tif (isBatching()) {\n\t\t\tif (!(this._flags & P_PENDING)) {\n\t\t\t\tthis._flags |= P_PENDING;\n\t\t\t\tif (this._flags & P_AUTO_DIRTY) {\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t\t}\n\t\t\t\tdeferEmission(() => {\n\t\t\t\t\tthis._flags &= ~P_PENDING;\n\t\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_SETTLED;\n\t\t\t\t\tthis._dispatch(DATA, this._value);\n\t\t\t\t});\n\t\t\t}\n\t\t} else {\n\t\t\tif (this._flags & P_AUTO_DIRTY) {\n\t\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_DIRTY;\n\t\t\t\tthis._dispatch(STATE, DIRTY);\n\t\t\t}\n\t\t\tthis._flags = (this._flags & ~_STATUS_MASK) | _S_SETTLED;\n\t\t\tthis._dispatch(DATA, this._value);\n\t\t}\n\t}\n\n\tupdate(fn: (current: T) => T): void {\n\t\tthis.set(fn(this._value as T));\n\t}\n}\n\nexport function state<T>(initial: T, opts?: StoreOptions<T>): WritableStore<T> {\n\treturn new StateImpl<T>(initial, opts) as any;\n}\n","// ---------------------------------------------------------------------------\n// ReactiveIndex — Level 3 reactive secondary index\n// ---------------------------------------------------------------------------\n// Maintains a reverse mapping: indexKey → Set<primaryKey>.\n// Designed to be driven by a source data structure (reactiveMap, collection)\n// that calls add/remove/update when entries change.\n//\n// Architecture:\n// - _index: Map<string, Set<string>> — source of truth\n// - _reverse: Map<string, Set<string>> — primaryKey → indexKeys (for fast update/remove)\n// - _states: Map<string, WritableStore<Set<string>>> — per-indexKey reactive stores\n// - _version: state<number> — bumped on structural changes (key add/remove)\n//\n// Usage:\n// const tagIndex = reactiveIndex<User>({ keyFn: (u) => u.tags });\n// tagIndex.add(\"u1\", [\"admin\", \"active\"]);\n// tagIndex.get(\"admin\"); // Set{\"u1\"}\n// tagIndex.select(\"admin\").get(); // reactive Set{\"u1\"}\n// ---------------------------------------------------------------------------\n\nimport { derived } from \"../core/derived\";\nimport { batch, teardown } from \"../core/protocol\";\nimport { state } from \"../core/state\";\nimport type { Store, WritableStore } from \"../core/types\";\nimport type { IndexSnapshot, ReactiveIndex } from \"./types\";\n\nlet indexCounter = 0;\n\nexport interface ReactiveIndexCreateOptions {\n\t/** User-specified ID. Auto-generated if omitted. */\n\tid?: string;\n}\n\n/**\n * Restore a reactiveIndex from a snapshot. Preserves id; version resets to 0.\n */\nreactiveIndex.from = function from(snap: IndexSnapshot): ReactiveIndex {\n\tconst idx = reactiveIndex({ id: snap.id });\n\tfor (const [indexKey, primaryKeys] of Object.entries(snap.index)) {\n\t\tfor (const pk of primaryKeys) idx.add(pk, [indexKey]);\n\t}\n\treturn idx;\n};\n\nexport function reactiveIndex(opts?: ReactiveIndexCreateOptions): ReactiveIndex {\n\tconst counter = ++indexCounter;\n\tconst nodeId = opts?.id ?? `ridx-${counter}`;\n\n\t// indexKey → Set<primaryKey>\n\tconst _index = new Map<string, Set<string>>();\n\n\t// primaryKey → Set<indexKey> (reverse map for fast update/remove)\n\tconst _reverse = new Map<string, Set<string>>();\n\n\t// Internal reactive stores per index key\n\tconst _states = new Map<string, WritableStore<Set<string>>>();\n\n\t// Cached select() derived stores\n\tconst _selects = new Map<string, Store<Set<string>>>();\n\n\t// Version counter — bumped on index key add/remove\n\tconst _version = state<number>(0, { name: `${nodeId}:ver` });\n\n\tconst _keysStore: Store<string[]> = derived([_version], () => Array.from(_index.keys()), {\n\t\tname: `${nodeId}:keys`,\n\t});\n\n\tconst _sizeStore: Store<number> = derived([_version], () => _index.size, {\n\t\tname: `${nodeId}:size`,\n\t});\n\n\tlet destroyed = false;\n\n\tconst _emptySet: Set<string> = Object.freeze(new Set<string>()) as Set<string>;\n\n\t// ---- Internal helpers ----\n\n\tfunction _getOrCreateState(indexKey: string): WritableStore<Set<string>> {\n\t\tlet s = _states.get(indexKey);\n\t\tif (!s) {\n\t\t\ts = state<Set<string>>(_index.get(indexKey) ?? new Set(), {\n\t\t\t\tname: `${nodeId}:${indexKey}`,\n\t\t\t\tequals: () => false, // Sets are mutable — always emit on update\n\t\t\t});\n\t\t\t_states.set(indexKey, s);\n\t\t}\n\t\treturn s;\n\t}\n\n\tfunction _syncState(indexKey: string): void {\n\t\tconst s = _states.get(indexKey);\n\t\tif (s) {\n\t\t\tconst current = _index.get(indexKey);\n\t\t\ts.set(current ? new Set(current) : new Set());\n\t\t}\n\t}\n\n\tfunction _addToIndex(primaryKey: string, indexKey: string): boolean {\n\t\tlet set = _index.get(indexKey);\n\t\tconst isNewKey = !set;\n\t\tif (!set) {\n\t\t\tset = new Set();\n\t\t\t_index.set(indexKey, set);\n\t\t}\n\t\tset.add(primaryKey);\n\t\treturn isNewKey;\n\t}\n\n\tfunction _removeFromIndex(primaryKey: string, indexKey: string): boolean {\n\t\tconst set = _index.get(indexKey);\n\t\tif (!set) return false;\n\t\tset.delete(primaryKey);\n\t\tif (set.size === 0) {\n\t\t\t_index.delete(indexKey);\n\t\t\treturn true; // key removed\n\t\t}\n\t\treturn false;\n\t}\n\n\t// ---- Public API ----\n\n\tconst idx: ReactiveIndex = {\n\t\tget id() {\n\t\t\treturn nodeId;\n\t\t},\n\t\tget version() {\n\t\t\treturn _version.get();\n\t\t},\n\n\t\tget(indexKey: string): Set<string> {\n\t\t\tconst set = _index.get(indexKey);\n\t\t\treturn set ? (Object.freeze(new Set(set)) as Set<string>) : _emptySet;\n\t\t},\n\n\t\thas(indexKey: string): boolean {\n\t\t\tconst set = _index.get(indexKey);\n\t\t\treturn set !== undefined && set.size > 0;\n\t\t},\n\n\t\tkeys(): string[] {\n\t\t\treturn Array.from(_index.keys());\n\t\t},\n\n\t\tget size() {\n\t\t\treturn _index.size;\n\t\t},\n\n\t\t// --- Reactive ---\n\n\t\tselect(indexKey: string): Store<Set<string>> {\n\t\t\tlet cached = _selects.get(indexKey);\n\t\t\tif (cached) return cached;\n\n\t\t\tconst internal = _getOrCreateState(indexKey);\n\t\t\tcached = derived([internal], () => internal.get(), {\n\t\t\t\tname: `${nodeId}:${indexKey}:select`,\n\t\t\t});\n\t\t\t_selects.set(indexKey, cached);\n\t\t\treturn cached;\n\t\t},\n\n\t\tkeysStore: _keysStore,\n\t\tsizeStore: _sizeStore,\n\n\t\t// --- Mutation ---\n\n\t\tadd(primaryKey: string, indexKeys: string[]): void {\n\t\t\tif (destroyed || indexKeys.length === 0) return;\n\n\t\t\t// Track reverse mapping\n\t\t\tlet reverseSet = _reverse.get(primaryKey);\n\t\t\tif (!reverseSet) {\n\t\t\t\treverseSet = new Set();\n\t\t\t\t_reverse.set(primaryKey, reverseSet);\n\t\t\t}\n\n\t\t\tbatch(() => {\n\t\t\t\tlet structuralChange = false;\n\t\t\t\tfor (const indexKey of indexKeys) {\n\t\t\t\t\treverseSet!.add(indexKey);\n\t\t\t\t\tif (_addToIndex(primaryKey, indexKey)) structuralChange = true;\n\t\t\t\t\t_syncState(indexKey);\n\t\t\t\t}\n\t\t\t\tif (structuralChange) _version.update((v) => v + 1);\n\t\t\t});\n\t\t},\n\n\t\tremove(primaryKey: string): void {\n\t\t\tif (destroyed) return;\n\t\t\tconst reverseSet = _reverse.get(primaryKey);\n\t\t\tif (!reverseSet) return;\n\n\t\t\tbatch(() => {\n\t\t\t\tlet structuralChange = false;\n\t\t\t\tfor (const indexKey of reverseSet!) {\n\t\t\t\t\tif (_removeFromIndex(primaryKey, indexKey)) structuralChange = true;\n\t\t\t\t\t_syncState(indexKey);\n\t\t\t\t}\n\t\t\t\t_reverse.delete(primaryKey);\n\t\t\t\tif (structuralChange) _version.update((v) => v + 1);\n\t\t\t});\n\t\t},\n\n\t\tupdate(primaryKey: string, indexKeys: string[]): void {\n\t\t\tif (destroyed) return;\n\t\t\tconst oldKeys = _reverse.get(primaryKey);\n\t\t\tconst newKeySet = new Set(indexKeys);\n\n\t\t\tbatch(() => {\n\t\t\t\tlet structuralChange = false;\n\n\t\t\t\t// Remove from old keys not in new set\n\t\t\t\tif (oldKeys) {\n\t\t\t\t\tfor (const oldKey of oldKeys) {\n\t\t\t\t\t\tif (!newKeySet.has(oldKey)) {\n\t\t\t\t\t\t\tif (_removeFromIndex(primaryKey, oldKey)) structuralChange = true;\n\t\t\t\t\t\t\t_syncState(oldKey);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Add to new keys\n\t\t\t\tlet reverseSet = _reverse.get(primaryKey);\n\t\t\t\tif (!reverseSet) {\n\t\t\t\t\treverseSet = new Set();\n\t\t\t\t\t_reverse.set(primaryKey, reverseSet);\n\t\t\t\t}\n\t\t\t\treverseSet.clear();\n\n\t\t\t\tfor (const indexKey of indexKeys) {\n\t\t\t\t\treverseSet.add(indexKey);\n\t\t\t\t\tif (_addToIndex(primaryKey, indexKey)) structuralChange = true;\n\t\t\t\t\t_syncState(indexKey);\n\t\t\t\t}\n\n\t\t\t\tif (structuralChange) _version.update((v) => v + 1);\n\t\t\t});\n\t\t},\n\n\t\tclear(): void {\n\t\t\tif (_index.size === 0) return;\n\t\t\tbatch(() => {\n\t\t\t\t_index.clear();\n\t\t\t\t_reverse.clear();\n\t\t\t\t// Reset all tracked states to empty\n\t\t\t\tfor (const s of _states.values()) s.set(new Set());\n\t\t\t\t_version.update((v) => v + 1);\n\t\t\t});\n\t\t},\n\n\t\t// --- Serialization ---\n\n\t\tsnapshot(): IndexSnapshot {\n\t\t\tconst index: Record<string, string[]> = {};\n\t\t\tfor (const [key, set] of _index) {\n\t\t\t\tindex[key] = Array.from(set);\n\t\t\t}\n\t\t\treturn {\n\t\t\t\ttype: \"reactiveIndex\",\n\t\t\t\tid: nodeId,\n\t\t\t\tversion: _version.get(),\n\t\t\t\tindex,\n\t\t\t};\n\t\t},\n\n\t\t// --- Lifecycle ---\n\n\t\tdestroy(): void {\n\t\t\tif (destroyed) return;\n\t\t\tdestroyed = true;\n\t\t\t_index.clear();\n\t\t\t_reverse.clear();\n\n\t\t\tfor (const s of _states.values()) teardown(s);\n\t\t\t_states.clear();\n\n\t\t\tfor (const s of _selects.values()) teardown(s);\n\t\t\t_selects.clear();\n\n\t\t\tteardown(_version);\n\t\t},\n\t};\n\n\treturn idx;\n}\n","// ---------------------------------------------------------------------------\n// Reactive Scored Eviction — O(log n) min-heap, score-push driven\n// ---------------------------------------------------------------------------\n// Unlike scored() which recomputes all scores at eviction time (O(n)),\n// this policy maintains a live min-heap backed by reactive score stores.\n// When a score store emits a new value, the key is sifted to its new heap\n// position in O(log n). evict(1) is then O(log n) extract-min.\n//\n// Complexity:\n// insert — O(log n): push + sift up + subscribe\n// touch — O(1) no-op: scores are pushed reactively, not pulled\n// delete — O(log n): unsubscribe + remove-at + sift\n// evict — O(k log n): k extract-mins\n// update — O(log n): triggered automatically on score store emission\n//\n// vs scored():\n// insert — O(1)\n// delete — O(1)\n// evict — O(n) scan [evict(1)] or O(n log n) sort [evict(k)]\n//\n// Use reactiveScored when: collection is large, scores change frequently\n// (regular touch()/setImportance()), evictions are infrequent.\n// Use scored() when: collection is small (< ~50 keys) or scores are static.\n//\n// Time approximation note:\n// Scores are computed at the moment of the LAST metadata change, not at\n// eviction time. Recency decay continues to pass, so the heap may slightly\n// underestimate how stale a node has become. The heap still evicts the\n// correct relative order among nodes with similar last-touched times.\n// ---------------------------------------------------------------------------\n\nimport { effect } from \"../core/effect\";\nimport type { Store } from \"../core/types\";\nimport type { EvictionPolicy } from \"./eviction\";\n\ninterface HeapEntry<K> {\n\tkey: K;\n\tscore: number;\n\tindex: number; // current position in _heap array — kept in sync by _swap\n}\n\nexport function reactiveScored<K, S = number>(\n\tgetStore: (key: K) => Store<S>,\n\tscoreOf: (value: S) => number = (x) => x as unknown as number,\n): EvictionPolicy<K> {\n\tconst _heap: HeapEntry<K>[] = [];\n\tconst _entries = new Map<K, HeapEntry<K>>();\n\tconst _disposes = new Map<K, () => void>();\n\n\t// ---- Heap primitives ----\n\n\tfunction _swap(i: number, j: number): void {\n\t\tconst a = _heap[i];\n\t\tconst b = _heap[j];\n\t\t_heap[i] = b;\n\t\t_heap[j] = a;\n\t\ta.index = j;\n\t\tb.index = i;\n\t}\n\n\tfunction _siftUp(i: number): void {\n\t\twhile (i > 0) {\n\t\t\tconst p = (i - 1) >>> 1;\n\t\t\tif (_heap[p].score <= _heap[i].score) break;\n\t\t\t_swap(i, p);\n\t\t\ti = p;\n\t\t}\n\t}\n\n\tfunction _siftDown(i: number): void {\n\t\tconst n = _heap.length;\n\t\twhile (true) {\n\t\t\tlet min = i;\n\t\t\tconst l = 2 * i + 1;\n\t\t\tconst r = l + 1;\n\t\t\tif (l < n && _heap[l].score < _heap[min].score) min = l;\n\t\t\tif (r < n && _heap[r].score < _heap[min].score) min = r;\n\t\t\tif (min === i) break;\n\t\t\t_swap(i, min);\n\t\t\ti = min;\n\t\t}\n\t}\n\n\t// Remove the entry at index i in O(log n).\n\tfunction _removeAt(i: number): void {\n\t\tconst last = _heap.length - 1;\n\t\tif (i === last) {\n\t\t\t_heap.pop();\n\t\t\treturn;\n\t\t}\n\t\t_swap(i, last);\n\t\t_heap.pop();\n\t\t// Swapped element may need to go either direction\n\t\t_siftUp(i);\n\t\t_siftDown(i);\n\t}\n\n\t// ---- Policy ----\n\n\treturn {\n\t\t// No-op: score updates are pushed reactively via subscriptions\n\t\ttouch() {},\n\n\t\tinsert(key) {\n\t\t\tif (_entries.has(key)) return;\n\n\t\t\tconst store = getStore(key);\n\t\t\tconst entry: HeapEntry<K> = {\n\t\t\t\tkey,\n\t\t\t\tscore: scoreOf(store.get()),\n\t\t\t\tindex: _heap.length,\n\t\t\t};\n\t\t\t_heap.push(entry);\n\t\t\t_entries.set(key, entry);\n\t\t\t_siftUp(entry.index);\n\n\t\t\t// Subscribe: when store emits, compute score and sift to new position\n\t\t\tconst dispose = effect([store], () => {\n\t\t\t\tconst e = _entries.get(key);\n\t\t\t\tif (!e) return undefined;\n\t\t\t\tconst prev = e.score;\n\t\t\t\te.score = scoreOf(store.get());\n\t\t\t\tif (e.score < prev) _siftUp(e.index);\n\t\t\t\telse if (e.score > prev) _siftDown(e.index);\n\t\t\t\treturn undefined;\n\t\t\t});\n\t\t\t_disposes.set(key, dispose);\n\t\t},\n\n\t\tdelete(key) {\n\t\t\tconst entry = _entries.get(key);\n\t\t\tif (!entry) return;\n\n\t\t\t// Unsubscribe first so no callbacks fire during removal\n\t\t\tconst dispose = _disposes.get(key);\n\t\t\tif (dispose) {\n\t\t\t\tdispose();\n\t\t\t\t_disposes.delete(key);\n\t\t\t}\n\n\t\t\t_removeAt(entry.index);\n\t\t\t_entries.delete(key);\n\t\t},\n\n\t\tevict(count = 1) {\n\t\t\tconst result: K[] = [];\n\t\t\twhile (result.length < count && _heap.length > 0) {\n\t\t\t\tconst { key } = _heap[0];\n\t\t\t\tresult.push(key);\n\n\t\t\t\t// Inline deletion of heap[0] — avoids double _entries.get lookup\n\t\t\t\tconst dispose = _disposes.get(key);\n\t\t\t\tif (dispose) {\n\t\t\t\t\tdispose();\n\t\t\t\t\t_disposes.delete(key);\n\t\t\t\t}\n\t\t\t\t_removeAt(0);\n\t\t\t\t_entries.delete(key);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\tsize: () => _entries.size,\n\n\t\tclear() {\n\t\t\tfor (const dispose of _disposes.values()) dispose();\n\t\t\t_disposes.clear();\n\t\t\t_entries.clear();\n\t\t\t_heap.length = 0;\n\t\t},\n\t};\n}\n","// ---------------------------------------------------------------------------\n// Phase 1: Decay Scoring\n// ---------------------------------------------------------------------------\n// FadeMem-inspired exponential decay scoring for memory nodes.\n// Combines recency, importance, and access frequency into a single score.\n//\n// score = α × recencyDecay + β × importance + γ × frequencyFactor\n//\n// recencyDecay = 2^(-timeSinceAccess / halfLife) [exponential decay]\n// frequencyFactor = 1 - 1/(1 + accessCount) [saturating curve]\n// ---------------------------------------------------------------------------\n\nimport type { DecayFn, DecayOptions, MemoryMeta, ScoreWeights } from \"./types\";\n\nconst DEFAULT_HALF_LIFE = 86_400_000; // 24 hours\n\n/**\n * Create a decay scoring function with fixed weights.\n * Returns a pure function: (meta, now?) => score\n */\nexport function decay(opts?: DecayOptions): DecayFn {\n\tconst halfLife = opts?.halfLife ?? DEFAULT_HALF_LIFE;\n\tconst α = opts?.recency ?? 1;\n\tconst β = opts?.importance ?? 1;\n\tconst γ = opts?.frequency ?? 0.5;\n\tconst ln2OverHalfLife = Math.LN2 / halfLife;\n\n\treturn (meta: MemoryMeta, now?: number): number => {\n\t\tconst t = (now ?? Date.now()) - meta.accessedAt;\n\t\tconst recencyDecay = Math.exp(-ln2OverHalfLife * t);\n\t\tconst frequencyFactor = 1 - 1 / (1 + meta.accessCount);\n\t\treturn α * recencyDecay + β * meta.importance + γ * frequencyFactor;\n\t};\n}\n\n/**\n * One-shot score computation with inline weights.\n * Avoids closure allocation when you just need a single score.\n */\nexport function computeScore(meta: MemoryMeta, weights?: ScoreWeights, now?: number): number {\n\tconst halfLife = weights?.halfLife ?? DEFAULT_HALF_LIFE;\n\tconst α = weights?.recency ?? 1;\n\tconst β = weights?.importance ?? 1;\n\tconst γ = weights?.frequency ?? 0.5;\n\n\tconst t = (now ?? Date.now()) - meta.accessedAt;\n\tconst recencyDecay = Math.exp((-Math.LN2 / halfLife) * t);\n\tconst frequencyFactor = 1 - 1 / (1 + meta.accessCount);\n\treturn α * recencyDecay + β * meta.importance + γ * frequencyFactor;\n}\n","// ---------------------------------------------------------------------------\n// Phase 1: MemoryNode — reactive unit of memory\n// ---------------------------------------------------------------------------\n// A MemoryNode wraps content + metadata in reactive stores.\n// Content is a WritableStore<T>, metadata is a WritableStore<MemoryMeta>.\n// Score is a derived store that recomputes when metadata changes.\n//\n// Design decisions:\n// - Meta is a single WritableStore<MemoryMeta> (not individual fields) to\n// minimize store count per node. Meta mutations use update() for atomicity.\n// - Score is derived from meta — push-based, auto-invalidates on any meta change.\n// - touch() is the primary access pattern for agents reading memories.\n// ---------------------------------------------------------------------------\n\nimport { derived } from \"../core/derived\";\nimport { batch, teardown } from \"../core/protocol\";\nimport { state } from \"../core/state\";\nimport type { Store, WritableStore } from \"../core/types\";\nimport { computeScore } from \"./decay\";\nimport type {\n\tMemoryMeta,\n\tMemoryNode as MemoryNodeInterface,\n\tMemoryNodeOptions,\n\tScoreWeights,\n} from \"./types\";\n\nlet nodeCounter = 0;\n\nfunction generateId(): string {\n\treturn `mem-${++nodeCounter}`;\n}\n\nexport function memoryNode<T>(initialContent: T, opts?: MemoryNodeOptions): MemoryNodeInterface<T> {\n\tconst id = opts?.id ?? generateId();\n\tconst now = Date.now();\n\n\tconst initialMeta: MemoryMeta = {\n\t\tid,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\taccessedAt: now,\n\t\taccessCount: 0,\n\t\timportance: opts?.importance ?? 0.5,\n\t\ttags: new Set(opts?.tags),\n\t};\n\n\tconst _content: WritableStore<T> = state<T>(initialContent, {\n\t\tname: `mem:${id}:content`,\n\t});\n\tconst _meta: WritableStore<MemoryMeta> = state<MemoryMeta>(initialMeta, {\n\t\tname: `mem:${id}:meta`,\n\t\t// Always emit on meta changes (Set comparison would fail with Object.is)\n\t\tequals: () => false,\n\t});\n\n\t// Default score weights — can be overridden per-call\n\tconst defaultWeights: ScoreWeights = {};\n\n\tconst _scoreStore: Store<number> = derived(\n\t\t[_meta],\n\t\t() => computeScore(_meta.get(), defaultWeights),\n\t\t{ name: `mem:${id}:score` },\n\t);\n\n\tconst node: MemoryNodeInterface<T> = {\n\t\tid,\n\t\tcontent: _content,\n\t\tmeta: _meta as Store<MemoryMeta>,\n\t\tscoreStore: _scoreStore,\n\n\t\ttouch(): void {\n\t\t\tconst now = Date.now();\n\t\t\t_meta.update((m) => ({\n\t\t\t\t...m,\n\t\t\t\taccessedAt: now,\n\t\t\t\taccessCount: m.accessCount + 1,\n\t\t\t}));\n\t\t},\n\n\t\ttag(...tags: string[]): void {\n\t\t\t_meta.update((m) => {\n\t\t\t\tconst next = new Set(m.tags);\n\t\t\t\tfor (const t of tags) next.add(t);\n\t\t\t\treturn { ...m, tags: next, updatedAt: Date.now() };\n\t\t\t});\n\t\t},\n\n\t\tuntag(...tags: string[]): void {\n\t\t\t_meta.update((m) => {\n\t\t\t\tconst next = new Set(m.tags);\n\t\t\t\tfor (const t of tags) next.delete(t);\n\t\t\t\treturn { ...m, tags: next, updatedAt: Date.now() };\n\t\t\t});\n\t\t},\n\n\t\tsetImportance(value: number): void {\n\t\t\t_meta.update((m) => ({\n\t\t\t\t...m,\n\t\t\t\timportance: Math.max(0, Math.min(1, value)),\n\t\t\t\tupdatedAt: Date.now(),\n\t\t\t}));\n\t\t},\n\n\t\tupdate(value: T): void {\n\t\t\tbatch(() => {\n\t\t\t\t_content.set(value);\n\t\t\t\t_meta.update((m) => ({ ...m, updatedAt: Date.now() }));\n\t\t\t});\n\t\t},\n\n\t\tscore(weights?: ScoreWeights): number {\n\t\t\treturn computeScore(_meta.get(), weights ?? defaultWeights);\n\t\t},\n\n\t\tdestroy(): void {\n\t\t\tteardown(_content);\n\t\t\tteardown(_meta);\n\t\t},\n\t};\n\n\treturn node;\n}\n","// ---------------------------------------------------------------------------\n// Phase 1: Collection — reactive set of MemoryNodes\n// ---------------------------------------------------------------------------\n// A collection manages a set of MemoryNodes with reactive tracking.\n// Supports query, tag-based lookup, top-K scoring, and auto-eviction.\n//\n// Design:\n// - _nodes: Map<string, MemoryNode<T>> for O(1) ID lookup\n// - _nodesStore: state<MemoryNode<T>[]> for reactive node list\n// - _sizeStore: derived from _nodesStore for reactive count\n// - _tagIndex: reactiveIndex for O(1) tag-based lookups (replaces O(n) scan)\n// - maxSize eviction uses decay scoring — lowest-score nodes evicted first\n// ---------------------------------------------------------------------------\n\nimport { derived } from \"../core/derived\";\nimport { effect } from \"../core/effect\";\nimport { batch, teardown } from \"../core/protocol\";\nimport { state } from \"../core/state\";\nimport type { Store } from \"../core/types\";\nimport { reactiveIndex } from \"../data/reactiveIndex\";\nimport { reactiveScored } from \"../utils/reactiveEviction\";\nimport { computeScore } from \"./decay\";\nimport { memoryNode } from \"./node\";\nimport type {\n\tCollection as CollectionInterface,\n\tCollectionOptions,\n\tMemoryNode as MemoryNodeInterface,\n\tMemoryNodeOptions,\n\tScoreWeights,\n} from \"./types\";\n\nlet collectionCounter = 0;\n\nexport function collection<T>(opts?: CollectionOptions): CollectionInterface<T> {\n\tconst id = ++collectionCounter;\n\tconst maxSize = opts?.maxSize ?? Infinity;\n\tconst defaultWeights = opts?.weights ?? {};\n\n\t// Internal storage\n\tconst _nodes = new Map<string, MemoryNodeInterface<T>>();\n\n\t// Tag index — O(1) tag-based lookups via reactiveIndex\n\tconst _tagIndex = reactiveIndex();\n\t// Per-node effect disposers for tag change tracking\n\tconst _tagEffects = new Map<string, () => void>();\n\n\t// Reactive eviction policy — O(log n) heap, updated on every meta push.\n\t// Subscribes directly to node.meta via effect — no intermediate derived needed.\n\t// computeScore runs inline in the effect handler with collection's weights\n\t// (node.scoreStore uses node-level empty weights — not the same thing).\n\tconst _evictionPolicy =\n\t\tmaxSize < Infinity\n\t\t\t? reactiveScored(\n\t\t\t\t\t(nodeId: string) => _nodes.get(nodeId)!.meta,\n\t\t\t\t\t(meta) => computeScore(meta, defaultWeights),\n\t\t\t\t)\n\t\t\t: null;\n\n\t// Version-gated reactive stores — bump version on structural change,\n\t// derived stores materialize lazily from the version (like reactiveMap).\n\t// Avoids Array.from() allocation on every add/remove.\n\tconst _version = state<number>(0, { name: `collection-${id}:ver` });\n\tconst _nodesStore = derived([_version], () => Array.from(_nodes.values()), {\n\t\tname: `collection-${id}:nodes`,\n\t}) as Store<MemoryNodeInterface<T>[]>;\n\tconst _sizeStore = derived([_version], () => _nodes.size, {\n\t\tname: `collection-${id}:size`,\n\t});\n\n\tlet destroyed = false;\n\n\tfunction _bumpVersion(): void {\n\t\t_version.update((v) => v + 1);\n\t}\n\n\tfunction _trackTags(node: MemoryNodeInterface<T>): void {\n\t\t// Effect runs eagerly on creation — handles both initial and subsequent tag changes.\n\t\t// No separate _tagIndex.add() needed; update() does add on first call.\n\t\tconst dispose = effect([node.meta], () => {\n\t\t\tconst currentTags = Array.from(node.meta.get().tags);\n\t\t\t_tagIndex.update(node.id, currentTags);\n\t\t\treturn undefined;\n\t\t});\n\t\t_tagEffects.set(node.id, dispose);\n\t}\n\n\tfunction _untrackTags(nodeId: string): void {\n\t\tconst dispose = _tagEffects.get(nodeId);\n\t\tif (dispose) {\n\t\t\tdispose();\n\t\t\t_tagEffects.delete(nodeId);\n\t\t}\n\t\t_tagIndex.remove(nodeId);\n\t}\n\n\tfunction _evictIfNeeded(): void {\n\t\tif (!_evictionPolicy || _nodes.size <= maxSize) return;\n\t\tconst toRemove = _evictionPolicy.evict(_nodes.size - maxSize);\n\t\tfor (const nodeId of toRemove) {\n\t\t\tconst node = _nodes.get(nodeId);\n\t\t\tif (node) {\n\t\t\t\t_untrackTags(nodeId);\n\t\t\t\tnode.destroy();\n\t\t\t\t_nodes.delete(nodeId);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst col: CollectionInterface<T> = {\n\t\tadd(content: T, nodeOpts?: MemoryNodeOptions): MemoryNodeInterface<T> {\n\t\t\tif (destroyed) throw new Error(\"Collection is destroyed\");\n\t\t\tconst node = memoryNode<T>(content, nodeOpts);\n\t\t\t_nodes.set(node.id, node);\n\t\t\t_trackTags(node);\n\t\t\t_evictionPolicy?.insert(node.id);\n\t\t\t_evictIfNeeded();\n\t\t\t_bumpVersion();\n\t\t\treturn node;\n\t\t},\n\n\t\tremove(nodeOrId: MemoryNodeInterface<T> | string): boolean {\n\t\t\tconst nodeId = typeof nodeOrId === \"string\" ? nodeOrId : nodeOrId.id;\n\t\t\tconst node = _nodes.get(nodeId);\n\t\t\tif (!node) return false;\n\t\t\t_untrackTags(nodeId);\n\t\t\t_evictionPolicy?.delete(nodeId);\n\t\t\tnode.destroy();\n\t\t\t_nodes.delete(nodeId);\n\t\t\t_bumpVersion();\n\t\t\treturn true;\n\t\t},\n\n\t\tget(nodeId: string): MemoryNodeInterface<T> | undefined {\n\t\t\treturn _nodes.get(nodeId);\n\t\t},\n\n\t\thas(nodeId: string): boolean {\n\t\t\treturn _nodes.has(nodeId);\n\t\t},\n\n\t\tnodes: _nodesStore as Store<MemoryNodeInterface<T>[]>,\n\t\tsize: _sizeStore,\n\t\ttagIndex: _tagIndex,\n\n\t\tquery(filter: (node: MemoryNodeInterface<T>) => boolean): MemoryNodeInterface<T>[] {\n\t\t\tconst result: MemoryNodeInterface<T>[] = [];\n\t\t\tfor (const node of _nodes.values()) {\n\t\t\t\tif (filter(node)) result.push(node);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\tbyTag(tag: string): MemoryNodeInterface<T>[] {\n\t\t\tconst nodeIds = _tagIndex.get(tag);\n\t\t\tconst result: MemoryNodeInterface<T>[] = [];\n\t\t\tfor (const nodeId of nodeIds) {\n\t\t\t\tconst node = _nodes.get(nodeId);\n\t\t\t\tif (node) result.push(node);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\ttopK(k: number, weights?: ScoreWeights): MemoryNodeInterface<T>[] {\n\t\t\tconst w = weights ?? defaultWeights;\n\t\t\tconst now = Date.now();\n\t\t\tconst scored = Array.from(_nodes.values()).map((n) => ({\n\t\t\t\tnode: n,\n\t\t\t\tscore: computeScore(n.meta.get(), w, now),\n\t\t\t}));\n\t\t\tscored.sort((a, b) => b.score - a.score);\n\t\t\treturn scored.slice(0, k).map((s) => s.node);\n\t\t},\n\n\t\tdestroy(): void {\n\t\t\tif (destroyed) return;\n\t\t\tdestroyed = true;\n\t\t\t_evictionPolicy?.clear();\n\t\t\tfor (const dispose of _tagEffects.values()) dispose();\n\t\t\t_tagEffects.clear();\n\t\t\t_tagIndex.destroy();\n\t\t\tbatch(() => {\n\t\t\t\tfor (const node of _nodes.values()) node.destroy();\n\t\t\t\t_nodes.clear();\n\t\t\t\tteardown(_version);\n\t\t\t});\n\t\t},\n\t};\n\n\treturn col;\n}\n"],"mappings":"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","names":["memory_exports","__export","collection","computeScore","decay","memoryNode","__toCommonJS","Bitmask","size","i","w","idx","bit","DIRTY","RESOLVED","S_DISCONNECTED","S_DIRTY","S_SETTLED","S_RESOLVED","S_COMPLETED","S_ERRORED","STATUS_SHIFT","STATUS_MASK","STATUS_STRINGS","decodeStatus","flags","START","DATA","END","STATE","batchDepth","deferredEmissions","draining","batch","fn","i","isBatching","deferEmission","connectDepth","pendingStarts","beginDeferredStart","endDeferredStart","deferStart","start","teardown","store","node","Inspector","_Inspector","value","deps","joined","d","node","opts","id","key","depSuffix","kind","parent","child","parentKey","childKey","children","result","livingKeys","ref","alive","c","store","cb","talkback","prev","START","type","data","END","next","p","g","edges","depsMap","lines","info","depsStr","childStr","label","log","name","DATA","STATE","DIRTY","RESOLVED","tapName","wrapper","edgeMap","nodes","D_HAS_CACHED","D_CONNECTED","D_ANY_DATA","D_COMPLETED","D_MULTI","D_IDENTITY","_S_DISCONNECTED","S_DISCONNECTED","STATUS_SHIFT","_S_DIRTY","S_DIRTY","_S_SETTLED","S_SETTLED","_S_RESOLVED","S_RESOLVED","_S_COMPLETED","S_COMPLETED","_S_ERRORED","S_ERRORED","_STATUS_MASK","STATUS_MASK","DerivedImpl","decodeStatus","deps","fn","opts","identity","Bitmask","Inspector","dep","type","data","output","sink","result","STATE","RESOLVED","DATA","beginDeferredStart","endDeferredStart","dirty","START","DIRTY","END","i","depIndex","wasEmpty","errorData","tb","wasMulti","payload","_t","set","t","derived","from","effect","deps","fn","opts","cleanup","talkbacks","disposed","dirtyDeps","Bitmask","anyDataReceived","run","beginDeferredStart","i","depIndex","START","type","data","STATE","DIRTY","RESOLVED","DATA","END","tb","endDeferredStart","dispose","Inspector","dep","P_STARTED","P_MULTI","P_COMPLETED","P_AUTO_DIRTY","P_RESET","P_RESUB","P_PENDING","_STATUS_MASK","STATUS_MASK","_S_DIRTY","S_DIRTY","STATUS_SHIFT","_S_SETTLED","S_SETTLED","_S_DISCONNECTED","S_DISCONNECTED","_S_COMPLETED","S_COMPLETED","_S_ERRORED","S_ERRORED","_S_RESOLVED","S_RESOLVED","ProducerImpl","decodeStatus","fn","opts","flags","Inspector","type","data","output","sink","value","isBatching","STATE","DIRTY","deferEmission","DATA","s","RESOLVED","wasMulti","END","result","payload","START","_t","set","t","deferStart","StateImpl","ProducerImpl","initial","opts","Inspector","value","P_COMPLETED","isBatching","P_PENDING","P_AUTO_DIRTY","_STATUS_MASK","_S_DIRTY","STATE","DIRTY","deferEmission","_S_SETTLED","DATA","fn","state","indexCounter","reactiveIndex","snap","idx","indexKey","primaryKeys","pk","opts","counter","nodeId","_index","_reverse","_states","_selects","_version","state","_keysStore","derived","_sizeStore","destroyed","_emptySet","_getOrCreateState","s","_syncState","current","_addToIndex","primaryKey","set","isNewKey","_removeFromIndex","cached","internal","indexKeys","reverseSet","batch","structuralChange","v","oldKeys","newKeySet","oldKey","index","key","teardown","reactiveScored","getStore","scoreOf","x","_heap","_entries","_disposes","_swap","i","j","a","b","_siftUp","p","_siftDown","n","min","l","r","_removeAt","last","key","store","entry","dispose","effect","e","prev","count","result","decay","opts","halfLife","α","β","γ","ln2OverHalfLife","meta","now","t","recencyDecay","frequencyFactor","computeScore","weights","nodeCounter","generateId","memoryNode","initialContent","opts","id","now","initialMeta","_content","state","_meta","defaultWeights","_scoreStore","derived","computeScore","m","tags","next","t","value","batch","weights","teardown","collectionCounter","collection","opts","id","maxSize","defaultWeights","_nodes","_tagIndex","reactiveIndex","_tagEffects","_evictionPolicy","reactiveScored","nodeId","meta","computeScore","_version","state","_nodesStore","derived","_sizeStore","destroyed","_bumpVersion","v","_trackTags","node","dispose","effect","currentTags","_untrackTags","_evictIfNeeded","toRemove","content","nodeOpts","memoryNode","nodeOrId","filter","result","tag","nodeIds","k","weights","w","now","scored","n","a","b","s","batch","teardown"]}
@@ -0,0 +1,113 @@
1
+ import { W as WritableStore, S as Store } from '../types-DsAN6Hga.cjs';
2
+ import { R as ReactiveIndex } from '../types-BiLijSKv.cjs';
3
+ import '../eviction-DGPP1vHP.cjs';
4
+
5
+ interface MemoryMeta {
6
+ id: string;
7
+ createdAt: number;
8
+ updatedAt: number;
9
+ accessedAt: number;
10
+ accessCount: number;
11
+ importance: number;
12
+ tags: Set<string>;
13
+ }
14
+ interface MemoryNode<T> {
15
+ /** The memory's unique ID. */
16
+ readonly id: string;
17
+ /** Reactive content store. */
18
+ content: WritableStore<T>;
19
+ /** Reactive metadata store. */
20
+ meta: Store<MemoryMeta>;
21
+ /** Update accessedAt + increment accessCount. */
22
+ touch(): void;
23
+ /** Add tags. */
24
+ tag(...tags: string[]): void;
25
+ /** Remove tags. */
26
+ untag(...tags: string[]): void;
27
+ /** Set importance (0–1). */
28
+ setImportance(value: number): void;
29
+ /** Update content and bump updatedAt. */
30
+ update(value: T): void;
31
+ /** Compute relevance score with given weights (synchronous). */
32
+ score(weights?: ScoreWeights): number;
33
+ /** Reactive score store (recomputes when meta changes). */
34
+ scoreStore: Store<number>;
35
+ /** Tear down all internal stores. */
36
+ destroy(): void;
37
+ }
38
+ interface ScoreWeights {
39
+ /** Weight for recency (time since last access). Default: 1 */
40
+ recency?: number;
41
+ /** Weight for importance. Default: 1 */
42
+ importance?: number;
43
+ /** Weight for access frequency. Default: 0.5 */
44
+ frequency?: number;
45
+ /** Half-life for recency decay in ms. Default: 86400000 (24h) */
46
+ halfLife?: number;
47
+ }
48
+ interface MemoryNodeOptions {
49
+ /** Custom ID. Auto-generated if omitted. */
50
+ id?: string;
51
+ /** Initial importance (0–1). Default: 0.5 */
52
+ importance?: number;
53
+ /** Initial tags. */
54
+ tags?: string[];
55
+ }
56
+ interface Collection<T> {
57
+ /** Add a new memory node to the collection. */
58
+ add(content: T, opts?: MemoryNodeOptions): MemoryNode<T>;
59
+ /** Remove a node by reference or ID. Returns true if found. */
60
+ remove(nodeOrId: MemoryNode<T> | string): boolean;
61
+ /** Get a node by ID. */
62
+ get(id: string): MemoryNode<T> | undefined;
63
+ /** Check if a node exists by ID. */
64
+ has(id: string): boolean;
65
+ /** Reactive store of all nodes. */
66
+ nodes: Store<MemoryNode<T>[]>;
67
+ /** Reactive size store. */
68
+ size: Store<number>;
69
+ /** Query nodes with a filter function (snapshot). */
70
+ query(filter: (node: MemoryNode<T>) => boolean): MemoryNode<T>[];
71
+ /** Get nodes by tag (snapshot). O(1) via reactiveIndex. */
72
+ byTag(tag: string): MemoryNode<T>[];
73
+ /** Get top-K nodes by score (snapshot). */
74
+ topK(k: number, weights?: ScoreWeights): MemoryNode<T>[];
75
+ /** Reactive tag index — select(tag) returns reactive Set<nodeId>. */
76
+ readonly tagIndex: ReactiveIndex;
77
+ /** Tear down all nodes and internal stores. */
78
+ destroy(): void;
79
+ }
80
+ interface CollectionOptions {
81
+ /** Maximum number of nodes. Oldest (by score) are evicted on overflow. */
82
+ maxSize?: number;
83
+ /** Default score weights for topK and eviction. */
84
+ weights?: ScoreWeights;
85
+ }
86
+ interface DecayOptions {
87
+ /** Half-life in ms. Default: 86400000 (24h) */
88
+ halfLife?: number;
89
+ /** Recency weight (α). Default: 1 */
90
+ recency?: number;
91
+ /** Importance weight (β). Default: 1 */
92
+ importance?: number;
93
+ /** Frequency weight (γ). Default: 0.5 */
94
+ frequency?: number;
95
+ }
96
+ type DecayFn = (meta: MemoryMeta, now?: number) => number;
97
+
98
+ declare function collection<T>(opts?: CollectionOptions): Collection<T>;
99
+
100
+ /**
101
+ * Create a decay scoring function with fixed weights.
102
+ * Returns a pure function: (meta, now?) => score
103
+ */
104
+ declare function decay(opts?: DecayOptions): DecayFn;
105
+ /**
106
+ * One-shot score computation with inline weights.
107
+ * Avoids closure allocation when you just need a single score.
108
+ */
109
+ declare function computeScore(meta: MemoryMeta, weights?: ScoreWeights, now?: number): number;
110
+
111
+ declare function memoryNode<T>(initialContent: T, opts?: MemoryNodeOptions): MemoryNode<T>;
112
+
113
+ export { type Collection, type CollectionOptions, type DecayFn, type DecayOptions, type MemoryMeta, type MemoryNode, type MemoryNodeOptions, type ScoreWeights, collection, computeScore, decay, memoryNode };
@@ -0,0 +1,113 @@
1
+ import { W as WritableStore, S as Store } from '../types-DsAN6Hga.js';
2
+ import { R as ReactiveIndex } from '../types-CIITLkgL.js';
3
+ import '../eviction-DGPP1vHP.js';
4
+
5
+ interface MemoryMeta {
6
+ id: string;
7
+ createdAt: number;
8
+ updatedAt: number;
9
+ accessedAt: number;
10
+ accessCount: number;
11
+ importance: number;
12
+ tags: Set<string>;
13
+ }
14
+ interface MemoryNode<T> {
15
+ /** The memory's unique ID. */
16
+ readonly id: string;
17
+ /** Reactive content store. */
18
+ content: WritableStore<T>;
19
+ /** Reactive metadata store. */
20
+ meta: Store<MemoryMeta>;
21
+ /** Update accessedAt + increment accessCount. */
22
+ touch(): void;
23
+ /** Add tags. */
24
+ tag(...tags: string[]): void;
25
+ /** Remove tags. */
26
+ untag(...tags: string[]): void;
27
+ /** Set importance (0–1). */
28
+ setImportance(value: number): void;
29
+ /** Update content and bump updatedAt. */
30
+ update(value: T): void;
31
+ /** Compute relevance score with given weights (synchronous). */
32
+ score(weights?: ScoreWeights): number;
33
+ /** Reactive score store (recomputes when meta changes). */
34
+ scoreStore: Store<number>;
35
+ /** Tear down all internal stores. */
36
+ destroy(): void;
37
+ }
38
+ interface ScoreWeights {
39
+ /** Weight for recency (time since last access). Default: 1 */
40
+ recency?: number;
41
+ /** Weight for importance. Default: 1 */
42
+ importance?: number;
43
+ /** Weight for access frequency. Default: 0.5 */
44
+ frequency?: number;
45
+ /** Half-life for recency decay in ms. Default: 86400000 (24h) */
46
+ halfLife?: number;
47
+ }
48
+ interface MemoryNodeOptions {
49
+ /** Custom ID. Auto-generated if omitted. */
50
+ id?: string;
51
+ /** Initial importance (0–1). Default: 0.5 */
52
+ importance?: number;
53
+ /** Initial tags. */
54
+ tags?: string[];
55
+ }
56
+ interface Collection<T> {
57
+ /** Add a new memory node to the collection. */
58
+ add(content: T, opts?: MemoryNodeOptions): MemoryNode<T>;
59
+ /** Remove a node by reference or ID. Returns true if found. */
60
+ remove(nodeOrId: MemoryNode<T> | string): boolean;
61
+ /** Get a node by ID. */
62
+ get(id: string): MemoryNode<T> | undefined;
63
+ /** Check if a node exists by ID. */
64
+ has(id: string): boolean;
65
+ /** Reactive store of all nodes. */
66
+ nodes: Store<MemoryNode<T>[]>;
67
+ /** Reactive size store. */
68
+ size: Store<number>;
69
+ /** Query nodes with a filter function (snapshot). */
70
+ query(filter: (node: MemoryNode<T>) => boolean): MemoryNode<T>[];
71
+ /** Get nodes by tag (snapshot). O(1) via reactiveIndex. */
72
+ byTag(tag: string): MemoryNode<T>[];
73
+ /** Get top-K nodes by score (snapshot). */
74
+ topK(k: number, weights?: ScoreWeights): MemoryNode<T>[];
75
+ /** Reactive tag index — select(tag) returns reactive Set<nodeId>. */
76
+ readonly tagIndex: ReactiveIndex;
77
+ /** Tear down all nodes and internal stores. */
78
+ destroy(): void;
79
+ }
80
+ interface CollectionOptions {
81
+ /** Maximum number of nodes. Oldest (by score) are evicted on overflow. */
82
+ maxSize?: number;
83
+ /** Default score weights for topK and eviction. */
84
+ weights?: ScoreWeights;
85
+ }
86
+ interface DecayOptions {
87
+ /** Half-life in ms. Default: 86400000 (24h) */
88
+ halfLife?: number;
89
+ /** Recency weight (α). Default: 1 */
90
+ recency?: number;
91
+ /** Importance weight (β). Default: 1 */
92
+ importance?: number;
93
+ /** Frequency weight (γ). Default: 0.5 */
94
+ frequency?: number;
95
+ }
96
+ type DecayFn = (meta: MemoryMeta, now?: number) => number;
97
+
98
+ declare function collection<T>(opts?: CollectionOptions): Collection<T>;
99
+
100
+ /**
101
+ * Create a decay scoring function with fixed weights.
102
+ * Returns a pure function: (meta, now?) => score
103
+ */
104
+ declare function decay(opts?: DecayOptions): DecayFn;
105
+ /**
106
+ * One-shot score computation with inline weights.
107
+ * Avoids closure allocation when you just need a single score.
108
+ */
109
+ declare function computeScore(meta: MemoryMeta, weights?: ScoreWeights, now?: number): number;
110
+
111
+ declare function memoryNode<T>(initialContent: T, opts?: MemoryNodeOptions): MemoryNode<T>;
112
+
113
+ export { type Collection, type CollectionOptions, type DecayFn, type DecayOptions, type MemoryMeta, type MemoryNode, type MemoryNodeOptions, type ScoreWeights, collection, computeScore, decay, memoryNode };
@@ -0,0 +1,2 @@
1
+ import{a as x}from"../chunk-PXF7567W.js";import{a as b}from"../chunk-5PJCNPKY.js";import{a as A}from"../chunk-7CQ6XF2G.js";import{a as S}from"../chunk-IZ5GFMMK.js";import{a as v}from"../chunk-K7VPCAZD.js";import"../chunk-PYRVYHZG.js";import"../chunk-LM26JNAK.js";import"../chunk-7WTS4C5R.js";import{p as h,v as N}from"../chunk-QYUTDL4D.js";function F(i){let a=i?.halfLife??864e5,d=i?.recency??1,u=i?.importance??1,t=i?.frequency??.5,m=Math.LN2/a;return(o,f)=>{let y=(f??Date.now())-o.accessedAt,M=Math.exp(-m*y),s=1-1/(1+o.accessCount);return d*M+u*o.importance+t*s}}function l(i,a,d){let u=a?.halfLife??864e5,t=a?.recency??1,m=a?.importance??1,o=a?.frequency??.5,f=(d??Date.now())-i.accessedAt,y=Math.exp(-Math.LN2/u*f),M=1-1/(1+i.accessCount);return t*y+m*i.importance+o*M}var W=0;function O(){return`mem-${++W}`}function w(i,a){let d=a?.id??O(),u=Date.now(),t={id:d,createdAt:u,updatedAt:u,accessedAt:u,accessCount:0,importance:a?.importance??.5,tags:new Set(a?.tags)},m=v(i,{name:`mem:${d}:content`}),o=v(t,{name:`mem:${d}:meta`,equals:()=>!1}),f={},y=S([o],()=>l(o.get(),f),{name:`mem:${d}:score`});return{id:d,content:m,meta:o,scoreStore:y,touch(){let s=Date.now();o.update(c=>({...c,accessedAt:s,accessCount:c.accessCount+1}))},tag(...s){o.update(c=>{let p=new Set(c.tags);for(let T of s)p.add(T);return{...c,tags:p,updatedAt:Date.now()}})},untag(...s){o.update(c=>{let p=new Set(c.tags);for(let T of s)p.delete(T);return{...c,tags:p,updatedAt:Date.now()}})},setImportance(s){o.update(c=>({...c,importance:Math.max(0,Math.min(1,s)),updatedAt:Date.now()}))},update(s){h(()=>{m.set(s),o.update(c=>({...c,updatedAt:Date.now()}))})},score(s){return l(o.get(),s??f)},destroy(){N(m),N(o)}}}var z=0;function E(i){let a=++z,d=i?.maxSize??1/0,u=i?.weights??{},t=new Map,m=A(),o=new Map,f=d<1/0?x(e=>t.get(e).meta,e=>l(e,u)):null,y=v(0,{name:`collection-${a}:ver`}),M=S([y],()=>Array.from(t.values()),{name:`collection-${a}:nodes`}),s=S([y],()=>t.size,{name:`collection-${a}:size`}),c=!1;function p(){y.update(e=>e+1)}function T(e){let r=b([e.meta],()=>{let n=Array.from(e.meta.get().tags);m.update(e.id,n)});o.set(e.id,r)}function D(e){let r=o.get(e);r&&(r(),o.delete(e)),m.remove(e)}function C(){if(!f||t.size<=d)return;let e=f.evict(t.size-d);for(let r of e){let n=t.get(r);n&&(D(r),n.destroy(),t.delete(r))}}return{add(e,r){if(c)throw new Error("Collection is destroyed");let n=w(e,r);return t.set(n.id,n),T(n),f?.insert(n.id),C(),p(),n},remove(e){let r=typeof e=="string"?e:e.id,n=t.get(r);return n?(D(r),f?.delete(r),n.destroy(),t.delete(r),p(),!0):!1},get(e){return t.get(e)},has(e){return t.has(e)},nodes:M,size:s,tagIndex:m,query(e){let r=[];for(let n of t.values())e(n)&&r.push(n);return r},byTag(e){let r=m.get(e),n=[];for(let _ of r){let I=t.get(_);I&&n.push(I)}return n},topK(e,r){let n=r??u,_=Date.now(),I=Array.from(t.values()).map(g=>({node:g,score:l(g.meta.get(),n,_)}));return I.sort((g,L)=>L.score-g.score),I.slice(0,e).map(g=>g.node)},destroy(){if(!c){c=!0,f?.clear();for(let e of o.values())e();o.clear(),m.destroy(),h(()=>{for(let e of t.values())e.destroy();t.clear(),N(y)})}}}}export{E as collection,l as computeScore,F as decay,w as memoryNode};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/memory/decay.ts","../../src/memory/node.ts","../../src/memory/collection.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Phase 1: Decay Scoring\n// ---------------------------------------------------------------------------\n// FadeMem-inspired exponential decay scoring for memory nodes.\n// Combines recency, importance, and access frequency into a single score.\n//\n// score = α × recencyDecay + β × importance + γ × frequencyFactor\n//\n// recencyDecay = 2^(-timeSinceAccess / halfLife) [exponential decay]\n// frequencyFactor = 1 - 1/(1 + accessCount) [saturating curve]\n// ---------------------------------------------------------------------------\n\nimport type { DecayFn, DecayOptions, MemoryMeta, ScoreWeights } from \"./types\";\n\nconst DEFAULT_HALF_LIFE = 86_400_000; // 24 hours\n\n/**\n * Create a decay scoring function with fixed weights.\n * Returns a pure function: (meta, now?) => score\n */\nexport function decay(opts?: DecayOptions): DecayFn {\n\tconst halfLife = opts?.halfLife ?? DEFAULT_HALF_LIFE;\n\tconst α = opts?.recency ?? 1;\n\tconst β = opts?.importance ?? 1;\n\tconst γ = opts?.frequency ?? 0.5;\n\tconst ln2OverHalfLife = Math.LN2 / halfLife;\n\n\treturn (meta: MemoryMeta, now?: number): number => {\n\t\tconst t = (now ?? Date.now()) - meta.accessedAt;\n\t\tconst recencyDecay = Math.exp(-ln2OverHalfLife * t);\n\t\tconst frequencyFactor = 1 - 1 / (1 + meta.accessCount);\n\t\treturn α * recencyDecay + β * meta.importance + γ * frequencyFactor;\n\t};\n}\n\n/**\n * One-shot score computation with inline weights.\n * Avoids closure allocation when you just need a single score.\n */\nexport function computeScore(meta: MemoryMeta, weights?: ScoreWeights, now?: number): number {\n\tconst halfLife = weights?.halfLife ?? DEFAULT_HALF_LIFE;\n\tconst α = weights?.recency ?? 1;\n\tconst β = weights?.importance ?? 1;\n\tconst γ = weights?.frequency ?? 0.5;\n\n\tconst t = (now ?? Date.now()) - meta.accessedAt;\n\tconst recencyDecay = Math.exp((-Math.LN2 / halfLife) * t);\n\tconst frequencyFactor = 1 - 1 / (1 + meta.accessCount);\n\treturn α * recencyDecay + β * meta.importance + γ * frequencyFactor;\n}\n","// ---------------------------------------------------------------------------\n// Phase 1: MemoryNode — reactive unit of memory\n// ---------------------------------------------------------------------------\n// A MemoryNode wraps content + metadata in reactive stores.\n// Content is a WritableStore<T>, metadata is a WritableStore<MemoryMeta>.\n// Score is a derived store that recomputes when metadata changes.\n//\n// Design decisions:\n// - Meta is a single WritableStore<MemoryMeta> (not individual fields) to\n// minimize store count per node. Meta mutations use update() for atomicity.\n// - Score is derived from meta — push-based, auto-invalidates on any meta change.\n// - touch() is the primary access pattern for agents reading memories.\n// ---------------------------------------------------------------------------\n\nimport { derived } from \"../core/derived\";\nimport { batch, teardown } from \"../core/protocol\";\nimport { state } from \"../core/state\";\nimport type { Store, WritableStore } from \"../core/types\";\nimport { computeScore } from \"./decay\";\nimport type {\n\tMemoryMeta,\n\tMemoryNode as MemoryNodeInterface,\n\tMemoryNodeOptions,\n\tScoreWeights,\n} from \"./types\";\n\nlet nodeCounter = 0;\n\nfunction generateId(): string {\n\treturn `mem-${++nodeCounter}`;\n}\n\nexport function memoryNode<T>(initialContent: T, opts?: MemoryNodeOptions): MemoryNodeInterface<T> {\n\tconst id = opts?.id ?? generateId();\n\tconst now = Date.now();\n\n\tconst initialMeta: MemoryMeta = {\n\t\tid,\n\t\tcreatedAt: now,\n\t\tupdatedAt: now,\n\t\taccessedAt: now,\n\t\taccessCount: 0,\n\t\timportance: opts?.importance ?? 0.5,\n\t\ttags: new Set(opts?.tags),\n\t};\n\n\tconst _content: WritableStore<T> = state<T>(initialContent, {\n\t\tname: `mem:${id}:content`,\n\t});\n\tconst _meta: WritableStore<MemoryMeta> = state<MemoryMeta>(initialMeta, {\n\t\tname: `mem:${id}:meta`,\n\t\t// Always emit on meta changes (Set comparison would fail with Object.is)\n\t\tequals: () => false,\n\t});\n\n\t// Default score weights — can be overridden per-call\n\tconst defaultWeights: ScoreWeights = {};\n\n\tconst _scoreStore: Store<number> = derived(\n\t\t[_meta],\n\t\t() => computeScore(_meta.get(), defaultWeights),\n\t\t{ name: `mem:${id}:score` },\n\t);\n\n\tconst node: MemoryNodeInterface<T> = {\n\t\tid,\n\t\tcontent: _content,\n\t\tmeta: _meta as Store<MemoryMeta>,\n\t\tscoreStore: _scoreStore,\n\n\t\ttouch(): void {\n\t\t\tconst now = Date.now();\n\t\t\t_meta.update((m) => ({\n\t\t\t\t...m,\n\t\t\t\taccessedAt: now,\n\t\t\t\taccessCount: m.accessCount + 1,\n\t\t\t}));\n\t\t},\n\n\t\ttag(...tags: string[]): void {\n\t\t\t_meta.update((m) => {\n\t\t\t\tconst next = new Set(m.tags);\n\t\t\t\tfor (const t of tags) next.add(t);\n\t\t\t\treturn { ...m, tags: next, updatedAt: Date.now() };\n\t\t\t});\n\t\t},\n\n\t\tuntag(...tags: string[]): void {\n\t\t\t_meta.update((m) => {\n\t\t\t\tconst next = new Set(m.tags);\n\t\t\t\tfor (const t of tags) next.delete(t);\n\t\t\t\treturn { ...m, tags: next, updatedAt: Date.now() };\n\t\t\t});\n\t\t},\n\n\t\tsetImportance(value: number): void {\n\t\t\t_meta.update((m) => ({\n\t\t\t\t...m,\n\t\t\t\timportance: Math.max(0, Math.min(1, value)),\n\t\t\t\tupdatedAt: Date.now(),\n\t\t\t}));\n\t\t},\n\n\t\tupdate(value: T): void {\n\t\t\tbatch(() => {\n\t\t\t\t_content.set(value);\n\t\t\t\t_meta.update((m) => ({ ...m, updatedAt: Date.now() }));\n\t\t\t});\n\t\t},\n\n\t\tscore(weights?: ScoreWeights): number {\n\t\t\treturn computeScore(_meta.get(), weights ?? defaultWeights);\n\t\t},\n\n\t\tdestroy(): void {\n\t\t\tteardown(_content);\n\t\t\tteardown(_meta);\n\t\t},\n\t};\n\n\treturn node;\n}\n","// ---------------------------------------------------------------------------\n// Phase 1: Collection — reactive set of MemoryNodes\n// ---------------------------------------------------------------------------\n// A collection manages a set of MemoryNodes with reactive tracking.\n// Supports query, tag-based lookup, top-K scoring, and auto-eviction.\n//\n// Design:\n// - _nodes: Map<string, MemoryNode<T>> for O(1) ID lookup\n// - _nodesStore: state<MemoryNode<T>[]> for reactive node list\n// - _sizeStore: derived from _nodesStore for reactive count\n// - _tagIndex: reactiveIndex for O(1) tag-based lookups (replaces O(n) scan)\n// - maxSize eviction uses decay scoring — lowest-score nodes evicted first\n// ---------------------------------------------------------------------------\n\nimport { derived } from \"../core/derived\";\nimport { effect } from \"../core/effect\";\nimport { batch, teardown } from \"../core/protocol\";\nimport { state } from \"../core/state\";\nimport type { Store } from \"../core/types\";\nimport { reactiveIndex } from \"../data/reactiveIndex\";\nimport { reactiveScored } from \"../utils/reactiveEviction\";\nimport { computeScore } from \"./decay\";\nimport { memoryNode } from \"./node\";\nimport type {\n\tCollection as CollectionInterface,\n\tCollectionOptions,\n\tMemoryNode as MemoryNodeInterface,\n\tMemoryNodeOptions,\n\tScoreWeights,\n} from \"./types\";\n\nlet collectionCounter = 0;\n\nexport function collection<T>(opts?: CollectionOptions): CollectionInterface<T> {\n\tconst id = ++collectionCounter;\n\tconst maxSize = opts?.maxSize ?? Infinity;\n\tconst defaultWeights = opts?.weights ?? {};\n\n\t// Internal storage\n\tconst _nodes = new Map<string, MemoryNodeInterface<T>>();\n\n\t// Tag index — O(1) tag-based lookups via reactiveIndex\n\tconst _tagIndex = reactiveIndex();\n\t// Per-node effect disposers for tag change tracking\n\tconst _tagEffects = new Map<string, () => void>();\n\n\t// Reactive eviction policy — O(log n) heap, updated on every meta push.\n\t// Subscribes directly to node.meta via effect — no intermediate derived needed.\n\t// computeScore runs inline in the effect handler with collection's weights\n\t// (node.scoreStore uses node-level empty weights — not the same thing).\n\tconst _evictionPolicy =\n\t\tmaxSize < Infinity\n\t\t\t? reactiveScored(\n\t\t\t\t\t(nodeId: string) => _nodes.get(nodeId)!.meta,\n\t\t\t\t\t(meta) => computeScore(meta, defaultWeights),\n\t\t\t\t)\n\t\t\t: null;\n\n\t// Version-gated reactive stores — bump version on structural change,\n\t// derived stores materialize lazily from the version (like reactiveMap).\n\t// Avoids Array.from() allocation on every add/remove.\n\tconst _version = state<number>(0, { name: `collection-${id}:ver` });\n\tconst _nodesStore = derived([_version], () => Array.from(_nodes.values()), {\n\t\tname: `collection-${id}:nodes`,\n\t}) as Store<MemoryNodeInterface<T>[]>;\n\tconst _sizeStore = derived([_version], () => _nodes.size, {\n\t\tname: `collection-${id}:size`,\n\t});\n\n\tlet destroyed = false;\n\n\tfunction _bumpVersion(): void {\n\t\t_version.update((v) => v + 1);\n\t}\n\n\tfunction _trackTags(node: MemoryNodeInterface<T>): void {\n\t\t// Effect runs eagerly on creation — handles both initial and subsequent tag changes.\n\t\t// No separate _tagIndex.add() needed; update() does add on first call.\n\t\tconst dispose = effect([node.meta], () => {\n\t\t\tconst currentTags = Array.from(node.meta.get().tags);\n\t\t\t_tagIndex.update(node.id, currentTags);\n\t\t\treturn undefined;\n\t\t});\n\t\t_tagEffects.set(node.id, dispose);\n\t}\n\n\tfunction _untrackTags(nodeId: string): void {\n\t\tconst dispose = _tagEffects.get(nodeId);\n\t\tif (dispose) {\n\t\t\tdispose();\n\t\t\t_tagEffects.delete(nodeId);\n\t\t}\n\t\t_tagIndex.remove(nodeId);\n\t}\n\n\tfunction _evictIfNeeded(): void {\n\t\tif (!_evictionPolicy || _nodes.size <= maxSize) return;\n\t\tconst toRemove = _evictionPolicy.evict(_nodes.size - maxSize);\n\t\tfor (const nodeId of toRemove) {\n\t\t\tconst node = _nodes.get(nodeId);\n\t\t\tif (node) {\n\t\t\t\t_untrackTags(nodeId);\n\t\t\t\tnode.destroy();\n\t\t\t\t_nodes.delete(nodeId);\n\t\t\t}\n\t\t}\n\t}\n\n\tconst col: CollectionInterface<T> = {\n\t\tadd(content: T, nodeOpts?: MemoryNodeOptions): MemoryNodeInterface<T> {\n\t\t\tif (destroyed) throw new Error(\"Collection is destroyed\");\n\t\t\tconst node = memoryNode<T>(content, nodeOpts);\n\t\t\t_nodes.set(node.id, node);\n\t\t\t_trackTags(node);\n\t\t\t_evictionPolicy?.insert(node.id);\n\t\t\t_evictIfNeeded();\n\t\t\t_bumpVersion();\n\t\t\treturn node;\n\t\t},\n\n\t\tremove(nodeOrId: MemoryNodeInterface<T> | string): boolean {\n\t\t\tconst nodeId = typeof nodeOrId === \"string\" ? nodeOrId : nodeOrId.id;\n\t\t\tconst node = _nodes.get(nodeId);\n\t\t\tif (!node) return false;\n\t\t\t_untrackTags(nodeId);\n\t\t\t_evictionPolicy?.delete(nodeId);\n\t\t\tnode.destroy();\n\t\t\t_nodes.delete(nodeId);\n\t\t\t_bumpVersion();\n\t\t\treturn true;\n\t\t},\n\n\t\tget(nodeId: string): MemoryNodeInterface<T> | undefined {\n\t\t\treturn _nodes.get(nodeId);\n\t\t},\n\n\t\thas(nodeId: string): boolean {\n\t\t\treturn _nodes.has(nodeId);\n\t\t},\n\n\t\tnodes: _nodesStore as Store<MemoryNodeInterface<T>[]>,\n\t\tsize: _sizeStore,\n\t\ttagIndex: _tagIndex,\n\n\t\tquery(filter: (node: MemoryNodeInterface<T>) => boolean): MemoryNodeInterface<T>[] {\n\t\t\tconst result: MemoryNodeInterface<T>[] = [];\n\t\t\tfor (const node of _nodes.values()) {\n\t\t\t\tif (filter(node)) result.push(node);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\tbyTag(tag: string): MemoryNodeInterface<T>[] {\n\t\t\tconst nodeIds = _tagIndex.get(tag);\n\t\t\tconst result: MemoryNodeInterface<T>[] = [];\n\t\t\tfor (const nodeId of nodeIds) {\n\t\t\t\tconst node = _nodes.get(nodeId);\n\t\t\t\tif (node) result.push(node);\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\n\t\ttopK(k: number, weights?: ScoreWeights): MemoryNodeInterface<T>[] {\n\t\t\tconst w = weights ?? defaultWeights;\n\t\t\tconst now = Date.now();\n\t\t\tconst scored = Array.from(_nodes.values()).map((n) => ({\n\t\t\t\tnode: n,\n\t\t\t\tscore: computeScore(n.meta.get(), w, now),\n\t\t\t}));\n\t\t\tscored.sort((a, b) => b.score - a.score);\n\t\t\treturn scored.slice(0, k).map((s) => s.node);\n\t\t},\n\n\t\tdestroy(): void {\n\t\t\tif (destroyed) return;\n\t\t\tdestroyed = true;\n\t\t\t_evictionPolicy?.clear();\n\t\t\tfor (const dispose of _tagEffects.values()) dispose();\n\t\t\t_tagEffects.clear();\n\t\t\t_tagIndex.destroy();\n\t\t\tbatch(() => {\n\t\t\t\tfor (const node of _nodes.values()) node.destroy();\n\t\t\t\t_nodes.clear();\n\t\t\t\tteardown(_version);\n\t\t\t});\n\t\t},\n\t};\n\n\treturn col;\n}\n"],"mappings":"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","names":["decay","opts","halfLife","α","β","γ","ln2OverHalfLife","meta","now","t","recencyDecay","frequencyFactor","computeScore","weights","nodeCounter","generateId","memoryNode","initialContent","opts","id","now","initialMeta","_content","state","_meta","defaultWeights","_scoreStore","derived","computeScore","m","tags","next","t","value","batch","weights","teardown","collectionCounter","collection","opts","id","maxSize","defaultWeights","_nodes","_tagIndex","reactiveIndex","_tagEffects","_evictionPolicy","reactiveScored","nodeId","meta","computeScore","_version","state","_nodesStore","derived","_sizeStore","destroyed","_bumpVersion","v","_trackTags","node","dispose","effect","currentTags","_untrackTags","_evictIfNeeded","toRemove","content","nodeOpts","memoryNode","nodeOrId","filter","result","tag","nodeIds","k","weights","w","now","scored","n","a","b","s","batch","teardown"]}
@@ -0,0 +1,3 @@
1
+ "use strict";var F=Object.defineProperty;var rt=Object.getOwnPropertyDescriptor;var it=Object.getOwnPropertyNames;var ot=Object.prototype.hasOwnProperty;var at=(e,t)=>{for(var i in t)F(e,i,{get:t[i],enumerable:!0})},ut=(e,t,i,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of it(t))!ot.call(e,n)&&n!==i&&F(e,n,{get:()=>t[n],enumerable:!(s=rt(t,n))||s.enumerable});return e};var ft=e=>ut(F({},"__esModule",{value:!0}),e);var St={};at(St,{dag:()=>X,fromCron:()=>st,matchesCron:()=>M,parseCron:()=>R,taskState:()=>P});module.exports=ft(St);function x(e,t,i){let s=new Set;for(let n of e.split(",")){let[o,r]=n.split("/"),u=r?Number.parseInt(r,10):1;if(Number.isNaN(u)||u<1)throw new Error(`Invalid cron step: ${n}`);let a,f;if(o==="*")a=t,f=i;else if(o.includes("-")){let[p,v]=o.split("-");a=Number.parseInt(p,10),f=Number.parseInt(v,10)}else a=Number.parseInt(o,10),f=a;if(Number.isNaN(a)||Number.isNaN(f))throw new Error(`Invalid cron field: ${e}`);if(a<t||f>i)throw new Error(`Cron field out of range: ${e} (${t}-${i})`);if(a>f)throw new Error(`Invalid cron range: ${a}-${f} in ${e}`);for(let p=a;p<=f;p+=u)s.add(p)}return s}function R(e){let t=e.trim().split(/\s+/);if(t.length!==5)throw new Error(`Invalid cron: expected 5 fields, got ${t.length}`);return{minutes:x(t[0],0,59),hours:x(t[1],0,23),daysOfMonth:x(t[2],1,31),months:x(t[3],1,12),daysOfWeek:x(t[4],0,6)}}function M(e,t){return e.minutes.has(t.getMinutes())&&e.hours.has(t.getHours())&&e.daysOfMonth.has(t.getDate())&&e.months.has(t.getMonth()+1)&&e.daysOfWeek.has(t.getDay())}var _=Symbol("DIRTY"),C=Symbol("RESOLVED"),V=0,q=1,G=2,z=3,B=4,H=5,T=7,K=7<<T,lt=["DISCONNECTED","DIRTY","SETTLED","RESOLVED","COMPLETED","ERRORED"];function J(e){return lt[(e&K)>>>T]}var m=0,h=1,d=2,S=3,dt=0,ct=[];function I(){return dt>0}function N(e){ct.push(e)}var pt=0,ht=[];function Q(e){pt>0?ht.push(e):e()}function W(e){let t=e;typeof t.complete=="function"?t.complete():typeof t._handleEnd=="function"&&t._handleEnd(void 0)}var y=class e{static _names=new WeakMap;static _kinds=new WeakMap;static _keys=new WeakMap;static _stores=new Set;static _edges=new Map;static _nextId=0;static _usedKeys=new Set;static _explicitEnabled=null;static _cachedDefault=null;static get enabled(){if(e._explicitEnabled!==null)return e._explicitEnabled;if(e._cachedDefault!==null)return e._cachedDefault;try{e._cachedDefault=globalThis.process?.env?.NODE_ENV!=="production"}catch{e._cachedDefault=!0}return e._cachedDefault}static set enabled(t){e._explicitEnabled=t}static _depSuffix(t){if(!t?.length)return;let s=t.map(n=>e._names.get(n)??"?").join(",");return s.length>40?`${s.slice(0,37)}...`:s}static _resolveKey(t){return e._keys.get(t)??e._names.get(t)??"anonymous"}static register(t,i){if(!e.enabled)return;i?.name&&e._names.set(t,i.name),i?.kind&&e._kinds.set(t,i.kind);let s=e._nextId++,n=i?.name;if(!(n&&!e._usedKeys.has(n)))if(n){let o=e._depSuffix(i?.deps);n=o?`${n}(${o})`:`${n}_${s}`,e._usedKeys.has(n)&&(n=`${n}_${s}`)}else{let o=i?.kind??"store",r=e._depSuffix(i?.deps);n=r?`${o}(${r})`:`${o}_${s}`,e._usedKeys.has(n)&&(n=`${n}_${s}`)}e._usedKeys.add(n),e._keys.set(t,n),e._stores.add(new WeakRef(t))}static registerEdge(t,i){if(!e.enabled)return;let s=e._resolveKey(t),n=e._resolveKey(i),o=e._edges.get(s);o?o.includes(n)||o.push(n):e._edges.set(s,[n])}static getEdges(){return new Map(e._edges)}static getName(t){if(e.enabled)return e._names.get(t)}static getKind(t){return e._kinds.get(t)}static inspect(t){return{name:e._names.get(t),kind:e._kinds.get(t)??"unknown",value:typeof t.get=="function"?t.get():void 0,status:t._status}}static graph(){let t=new Map,i=new Set;for(let s of e._stores){let n=s.deref();if(!n){e._stores.delete(s);continue}let o=e._resolveKey(n);i.add(o),t.set(o,e.inspect(n))}for(let[s,n]of e._edges){if(!i.has(s)){e._edges.delete(s),e._usedKeys.delete(s);continue}let o=n.filter(r=>i.has(r));o.length===0?e._edges.delete(s):o.length!==n.length&&e._edges.set(s,o)}return t}static trace(t,i){let s=null,n=t.get();return t.source(m,(o,r)=>{if(o===m&&(s=r),o===d){s=null;return}if(o===1){let u=r;if(!Object.is(u,n)){let a=n;n=u,i(u,a)}}}),()=>s?.(d)}static dumpGraph(){let t=e.graph(),i=e.getEdges(),s=new Map;for(let[r,u]of i)for(let a of u){let f=s.get(a);f?f.includes(r)||f.push(r):s.set(a,[r])}let n=[];for(let[r,u]of t){let a=s.get(r),f=i.get(r),p=a?.length?` \u2190 [${a.join(", ")}]`:"",v=f?.length?` \u2192 [${f.join(", ")}]`:"";n.push(` ${r} (${u.kind}) = ${JSON.stringify(u.value)} [${u.status??"?"}]${p}${v}`)}return[`Store Graph (${t.size} nodes):`,...n].join(`
2
+ `)}static _observe(t,i,s){let n=null,o=i??e.getName(t),r={values:[],signals:[],events:[],ended:!1,endError:void 0,dirtyCount:0,resolvedCount:0,name:o,dispose:()=>n?.(d)};return t.source(m,(u,a)=>{if(u===m){n=a;return}u===h?(r.values.push(a),r.events.push({type:"data",data:a}),s&&s(`[${o}] DATA:`,a)):u===S?(r.signals.push(a),r.events.push({type:"signal",data:a}),a===_?r.dirtyCount++:a===C&&r.resolvedCount++,s&&s(`[${o}] STATE:`,a)):u===d&&(r.ended=!0,r.endError=a,r.events.push({type:"end",data:a}),s&&s(`[${o}] END`,a!==void 0?a:""),n=null)}),r}static observe(t){return e._observe(t)}static tap(t,i){let s=i??`tap(${e.getName(t)??"anon"})`,n={get:()=>t.get(),source:t.source};return e.register(n,{name:s,kind:"tap"}),e.registerEdge(t,n),n}static spy(t,i){let s=i?.name??e.getName(t)??"spy",n=i?.log??console.log;return e._observe(t,s,n)}static snapshot(){let t=e.graph(),i=e.getEdges(),s=[];for(let[o,r]of t)s.push({name:o,kind:r.kind,value:r.value,status:r.status});let n=[];for(let[o,r]of i)for(let u of r)n.push({from:o,to:u});return{nodes:s,edges:n}}static _reset(){e._names=new WeakMap,e._kinds=new WeakMap,e._keys=new WeakMap,e._stores=new Set,e._edges=new Map,e._usedKeys=new Set,e._nextId=0,e._explicitEnabled=null,e._cachedDefault=null}};function X(e){let t=new Map;for(let r=0;r<e.length;r++){if(t.has(e[r].store))throw new Error(`Duplicate store in DAG: ${e[r].name??`node[${r}]`}`);t.set(e[r].store,r)}let i=new Array(e.length).fill(0),s=e.map(()=>[]);for(let r=0;r<e.length;r++){let u=e[r].deps;if(u)for(let a of u){let f=t.get(a);if(f===void 0)throw new Error(`Dependency not found in DAG for ${e[r].name??`node[${r}]`}. All deps must be declared as DAG nodes.`);s[f].push(r),i[r]++}}let n=[];for(let r=0;r<e.length;r++)i[r]===0&&n.push(r);let o=[];for(;n.length>0;){let r=n.shift();o.push(r);for(let u of s[r])i[u]--,i[u]===0&&n.push(u)}if(o.length!==e.length){let r=e.filter((u,a)=>!o.includes(a)).map((u,a)=>u.name??`node[${a}]`);throw new Error(`Cycle detected in DAG involving: ${r.join(", ")}`)}for(let r of e)if(r.name&&y.register(r.store,{name:r.name,kind:"dag-node"}),r.deps)for(let u of r.deps)y.registerEdge(u,r.store);return{order:o.map(r=>e[r].store),size:e.length}}var A=1,g=64,c=2,D=4,Z=8,tt=16,E=32,l=K,k=q<<T,w=G<<T,$=V<<T,gt=B<<T,_t=H<<T,Tt=z<<T,O=class{_value;_output=null;_flags;get _status(){return J(this._flags)}_cleanup;_fn;_eqFn;_getterFn;_initial;constructor(t,i){this._value=i?.initial,this._fn=t,this._eqFn=i?.equals,this._getterFn=i?.getter,this._initial=i?.initial;let s=0;i?.autoDirty!==!1&&(s|=D),i?.resetOnTeardown&&(s|=Z),i?.resubscribable&&(s|=tt),this._flags=s,this.source=this.source.bind(this),this.emit=this.emit.bind(this),this.signal=this.signal.bind(this),this.complete=this.complete.bind(this),this.error=this.error.bind(this),i?._skipInspect||y.register(this,{kind:"producer",...i})}get(){return this._getterFn?this._getterFn(this._value):this._value}_dispatch(t,i){let s=this._output;if(s)if(this._flags&g)for(let n of s)n(t,i);else s(t,i)}emit(t){this._flags&c||this._eqFn&&this._value!==void 0&&this._eqFn(this._value,t)||(this._value=t,this._output&&(I()?this._flags&E||(this._flags|=E,this._flags&D&&(this._flags=this._flags&~l|k,this._dispatch(S,_)),N(()=>{this._flags&=~E,this._flags=this._flags&~l|w,this._dispatch(h,this._value)})):(this._flags&D&&(this._flags=this._flags&~l|k,this._dispatch(S,_)),this._flags=this._flags&~l|w,this._dispatch(h,this._value))))}signal(t){this._flags&c||!this._output||(t===_?this._flags=this._flags&~l|k:t===C&&(this._flags=this._flags&~l|Tt),this._dispatch(S,t))}complete(){if(this._flags&c)return;this._flags=(this._flags|c)&~l|gt;let t=this._output,i=this._flags&g;if(this._output=null,this._flags&=~g,this._stop(),t)if(i)for(let s of t)s(d);else t(d)}error(t){if(this._flags&c)return;this._flags=(this._flags|c)&~l|_t;let i=this._output,s=this._flags&g;if(this._output=null,this._flags&=~g,this._stop(),i)if(s)for(let n of i)n(d,t);else i(d,t)}_start(){if(this._flags&A||!this._fn)return;this._flags|=A;let t=this._fn(this);this._cleanup=typeof t=="function"?t:void 0}_stop(){this._flags&A&&(this._flags&=~A,this._cleanup&&this._cleanup(),this._cleanup=void 0,this._flags&Z&&(this._value=this._initial),this._flags&c||(this._flags=this._flags&~l|$))}source(t,i){if(t===m){let s=i;if(this._flags&c)if(this._flags&tt&&this._output===null)this._flags=this._flags&~(c|l)|$;else{s(m,n=>{}),s(d);return}if(this._output===null)this._output=s;else if(this._flags&g)this._output.add(s);else{let n=new Set;n.add(this._output),n.add(s),this._output=n,this._flags|=g}s(m,n=>{if(n===h&&s(h,this._value),n===d){if(this._output===null)return;if(this._flags&g){let o=this._output;o.delete(s),o.size===1?(this._output=o.values().next().value,this._flags&=~g):o.size===0&&(this._output=null,this._flags&=~g,this._flags=this._flags&~l|$,this._stop())}else this._output===s&&(this._output=null,this._flags=this._flags&~l|$,this._stop())}}),Q(()=>this._start())}}};function et(e,t){return new O(e,t)}function st(e,t){let i=R(e),s=t?.tickMs??6e4;return et(({emit:n})=>{let o=-1,r=()=>{let a=new Date,f=a.getFullYear()*1e8+(a.getMonth()+1)*1e6+a.getDate()*1e4+a.getHours()*100+a.getMinutes();f!==o&&M(i,a)&&(o=f,n(a))};r();let u=setInterval(r,s);return()=>clearInterval(u)},{name:t?.id??`cron:${e}`})}var Y=class extends O{constructor(t,i){super(void 0,{initial:t,autoDirty:!0,equals:i?.equals??Object.is,_skipInspect:!0}),this.set=this.set.bind(this),y.register(this,{kind:"state",...i})}get(){return this._value}set(t){this._flags&c||this._value!==void 0&&this._eqFn(this._value,t)||(this._value=t,this._output&&(I()?this._flags&E||(this._flags|=E,this._flags&D&&(this._flags=this._flags&~l|k,this._dispatch(S,_)),N(()=>{this._flags&=~E,this._flags=this._flags&~l|w,this._dispatch(h,this._value)})):(this._flags&D&&(this._flags=this._flags&~l|k,this._dispatch(S,_)),this._flags=this._flags&~l|w,this._dispatch(h,this._value))))}update(t){this.set(t(this._value))}};function U(e,t){return new Y(e,t)}var mt=0,nt=Object.freeze({status:"idle",runCount:0});P.from=function(t){let i=P({id:t.id});return t.meta.runCount>0&&i._restore({...t.meta,status:t.meta.status==="running"?"error":t.meta.status,error:t.meta.status==="running"?new Error("Interrupted: restored from snapshot"):t.meta.error}),i};function P(e){let t=++mt,i=e?.id??`task-${t}`,s=U({...nt},{name:i,equals:()=>!1}),n=U(0,{name:`${i}:ver`}),o=!1,r=0;return{_restore(a){s.set(a)},get id(){return i},get version(){return n.get()},get(){return s.get()},source:s.source,async run(a){if(o)throw new Error("TaskState is destroyed");let f=s.get();if(f.status==="running")throw new Error("Task is already running");let p=r,v=Date.now();s.set({...f,status:"running",error:void 0});try{let b=await a();if(p!==r)return b;let j=Date.now()-v;return s.set({status:"success",result:b,error:void 0,lastRun:v,duration:j,runCount:f.runCount+1}),n.update(L=>L+1),b}catch(b){if(p!==r)throw b;let j=Date.now()-v;throw s.set({status:"error",result:f.result,error:b,lastRun:v,duration:j,runCount:f.runCount+1}),n.update(L=>L+1),b}},reset(){o||(r++,s.set({...nt}),n.update(a=>a+1))},snapshot(){return{type:"taskState",id:i,version:n.get(),meta:{...s.get()}}},destroy(){o||(o=!0,W(s),W(n))}}}0&&(module.exports={dag,fromCron,matchesCron,parseCron,taskState});
3
+ //# sourceMappingURL=index.cjs.map