abtars 0.2.1-alpha.9 → 0.2.1

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 (249) hide show
  1. package/CHANGELOG.md +64 -0
  2. package/README.md +93 -34
  3. package/bundle/{_registry.generated-ADOYFJJ4.js → _registry.generated-FNJOX7VV.js} +19 -16
  4. package/bundle/{_registry.generated-ADOYFJJ4.js.map → _registry.generated-FNJOX7VV.js.map} +1 -1
  5. package/bundle/abtars-browser.js +5 -6
  6. package/bundle/abtars-browser.js.map +2 -2
  7. package/bundle/abtars-cli.js +150 -176
  8. package/bundle/abtars-cli.js.map +4 -4
  9. package/bundle/abtars-restart.js +4 -4
  10. package/bundle/abtars-rss.js +25 -81
  11. package/bundle/abtars-rss.js.map +2 -2
  12. package/bundle/abtars-task.js +4 -5
  13. package/bundle/abtars-task.js.map +2 -2
  14. package/bundle/abtars-todo.js +133 -0
  15. package/bundle/abtars-todo.js.map +7 -0
  16. package/bundle/abtars.js +224 -157
  17. package/bundle/abtars.js.map +3 -3
  18. package/bundle/action-gate-DYV2XQBP.js +191 -0
  19. package/bundle/action-gate-DYV2XQBP.js.map +7 -0
  20. package/bundle/{agent-api-rate-limit-C25WGSFF.js → agent-api-rate-limit-R2OFAQ3N.js} +4 -4
  21. package/bundle/{agent-registry-SYUFNSVB.js → agent-registry-S2MNHQYQ.js} +8 -8
  22. package/bundle/{bridge-lock-transport-HO545SBK.js → bridge-lock-transport-N6OGDOSE.js} +5 -5
  23. package/bundle/{browse-delivery-VTLEAVYA.js → browse-delivery-DXGMDMXA.js} +8 -7
  24. package/bundle/{browser-REIXOJ6S.js → browser-QMYGSP5W.js} +11 -10
  25. package/bundle/{capability-ILW3D5HS.js → capability-733TLH4W.js} +6 -6
  26. package/bundle/{chunk-ZVDVNSXK.js → chunk-2SWKJX64.js} +7 -7
  27. package/bundle/{chunk-PZE3J7ER.js → chunk-3OXQWII3.js} +2 -2
  28. package/bundle/{chunk-R36WIOYX.js → chunk-3X6VGRL6.js} +33 -6
  29. package/bundle/chunk-3X6VGRL6.js.map +7 -0
  30. package/bundle/{chunk-4KJ76TTE.js → chunk-4XW7YA3K.js} +3 -3
  31. package/bundle/{chunk-Q62SXS73.js → chunk-BBDKU4EH.js} +9 -9
  32. package/bundle/{chunk-EX2SRTUE.js → chunk-CYSGXNBY.js} +2 -2
  33. package/bundle/{chunk-LYEAHE5V.js → chunk-DCY7DGMT.js} +2 -2
  34. package/bundle/chunk-DGS7J4P6.js +13 -0
  35. package/bundle/chunk-DGS7J4P6.js.map +7 -0
  36. package/bundle/{chunk-LDKSCXGL.js → chunk-DHPFI7OF.js} +8 -6
  37. package/bundle/{chunk-LDKSCXGL.js.map → chunk-DHPFI7OF.js.map} +1 -1
  38. package/bundle/{chunk-G6IXMYIO.js → chunk-DO4INSXE.js} +2 -2
  39. package/bundle/{chunk-VA5WKN3Z.js → chunk-EGA6JQVV.js} +4 -4
  40. package/bundle/chunk-EKHNWFEQ.js +85 -0
  41. package/bundle/chunk-EKHNWFEQ.js.map +7 -0
  42. package/bundle/{chunk-URAQLQ2U.js → chunk-F3HMZFIL.js} +4 -4
  43. package/bundle/{chunk-OOKLEC6V.js → chunk-FY3QUO2L.js} +7 -7
  44. package/bundle/{chunk-2BY6I4P5.js → chunk-GUTRAMK3.js} +2 -2
  45. package/bundle/{chunk-GPL57SRN.js → chunk-H7RX7UCR.js} +3 -3
  46. package/bundle/{chunk-BYDUMHXT.js → chunk-HAF2AFBW.js} +2 -2
  47. package/bundle/{chunk-A5OJYQNU.js → chunk-HCYENZAB.js} +49 -22
  48. package/bundle/chunk-HCYENZAB.js.map +7 -0
  49. package/bundle/{chunk-OZ4IZFV4.js → chunk-HJQZP5CK.js} +9 -9
  50. package/bundle/{chunk-OZ4IZFV4.js.map → chunk-HJQZP5CK.js.map} +2 -2
  51. package/bundle/{chunk-HEHD3GG5.js → chunk-ITB2K6LI.js} +6 -13
  52. package/bundle/{chunk-HEHD3GG5.js.map → chunk-ITB2K6LI.js.map} +3 -3
  53. package/bundle/{chunk-KSEIWT4T.js → chunk-JFKOPNKL.js} +10 -10
  54. package/bundle/chunk-JFKOPNKL.js.map +7 -0
  55. package/bundle/{chunk-4BUOO6WI.js → chunk-KL5QRHHK.js} +31 -11
  56. package/bundle/chunk-KL5QRHHK.js.map +7 -0
  57. package/bundle/{chunk-KFENC7BM.js → chunk-L33WNMCP.js} +2 -2
  58. package/bundle/{chunk-JRG4EFMP.js → chunk-LBMETTUP.js} +3 -3
  59. package/bundle/{chunk-TYVI3ZWA.js → chunk-LJAG2URA.js} +10 -7
  60. package/bundle/chunk-LJAG2URA.js.map +7 -0
  61. package/bundle/{chunk-RV54J75Q.js → chunk-MHK4UPM6.js} +13 -12
  62. package/bundle/chunk-MHK4UPM6.js.map +7 -0
  63. package/bundle/chunk-NIYVCGBC.js +330 -0
  64. package/bundle/chunk-NIYVCGBC.js.map +7 -0
  65. package/bundle/{chunk-P2BZSLJJ.js → chunk-OGZXYN6E.js} +392 -125
  66. package/bundle/chunk-OGZXYN6E.js.map +7 -0
  67. package/bundle/{chunk-TOUZC6NR.js → chunk-OKMN6J4Z.js} +3 -3
  68. package/bundle/{chunk-CELR236Q.js → chunk-Q7CH5DA3.js} +2 -2
  69. package/bundle/{chunk-XZSYMCLF.js → chunk-QIAFGDRL.js} +7 -7
  70. package/bundle/chunk-RITEGAW6.js +138 -0
  71. package/bundle/chunk-RITEGAW6.js.map +7 -0
  72. package/bundle/{chunk-UDZIZB5F.js → chunk-RTL7HO3N.js} +3 -3
  73. package/bundle/{chunk-ITG6XGBS.js → chunk-SA44ITVX.js} +10 -10
  74. package/bundle/{chunk-3MO2MDXJ.js → chunk-SA6YEFNG.js} +3 -3
  75. package/bundle/{chunk-GBBTK6H2.js → chunk-SRFEIZQT.js} +4 -4
  76. package/bundle/{chunk-ELRAH7VL.js → chunk-VXUVKC66.js} +3 -3
  77. package/bundle/{chunk-X5FBUA53.js → chunk-WLAVZSVZ.js} +69 -30
  78. package/bundle/chunk-WLAVZSVZ.js.map +7 -0
  79. package/bundle/{chunk-RSWUPUNA.js → chunk-WMWI3SJ7.js} +30 -6
  80. package/bundle/chunk-WMWI3SJ7.js.map +7 -0
  81. package/bundle/{chunk-MJ6PHMOK.js → chunk-WW5F2DCO.js} +11 -2
  82. package/bundle/chunk-WW5F2DCO.js.map +7 -0
  83. package/bundle/chunk-YWZPKBO6.js +22 -0
  84. package/bundle/chunk-YWZPKBO6.js.map +7 -0
  85. package/bundle/{chunk-KWBGYWDO.js → chunk-Z4SWEFIY.js} +12 -14
  86. package/bundle/chunk-Z4SWEFIY.js.map +7 -0
  87. package/bundle/chunk-ZAA7B5BN.js +22 -0
  88. package/bundle/chunk-ZAA7B5BN.js.map +7 -0
  89. package/bundle/{commands-WUGPBPHI.js → commands-AXW7L2MZ.js} +15 -14
  90. package/bundle/{config-DQIGDX4W.js → config-NDEYF4AQ.js} +7 -7
  91. package/bundle/{daemon-NPKYZ3CJ.js → daemon-WOQXCKNL.js} +4 -4
  92. package/bundle/{delegation-tools-6FICZQ5G.js → delegation-tools-Z5OM3TXS.js} +5 -5
  93. package/bundle/{deploy-lib-import-SBKXDD3F.js → deploy-lib-import-6VJTYXEG.js} +2 -2
  94. package/bundle/{deps-HN6CEXA4.js → deps-65V7XXG4.js} +4 -4
  95. package/bundle/{direct-api-transport-TRV45NO6.js → direct-api-transport-LSAUIP5S.js} +27 -15
  96. package/bundle/direct-api-transport-LSAUIP5S.js.map +7 -0
  97. package/bundle/{discord-adapter-WA2MFRK3.js → discord-adapter-LNWTIOUK.js} +27 -24
  98. package/bundle/discord-adapter-LNWTIOUK.js.map +7 -0
  99. package/bundle/{dns-wakeup-RYOCQ6GR.js → dns-wakeup-N46RPU5E.js} +3 -3
  100. package/bundle/{doctor-R54GZPKL.js → doctor-PIPSGI3H.js} +18 -7
  101. package/bundle/{doctor-R54GZPKL.js.map → doctor-PIPSGI3H.js.map} +2 -2
  102. package/bundle/{ensure-invariants-BJIEOSJ2.js → ensure-invariants-3NOBCYWS.js} +4 -4
  103. package/bundle/{env-schema-XCPAJ6IZ.js → env-schema-T43X43BU.js} +4 -4
  104. package/bundle/{hook-system-POI5VRIX.js → hook-system-ZCVOFFRD.js} +4 -4
  105. package/bundle/hotskills-DTROJY6G.js +17 -0
  106. package/bundle/{install-SH4UVUXQ.js → install-FZT43PTH.js} +3 -3
  107. package/bundle/{install-manifest-QRWID3KZ.js → install-manifest-KBYD7SAY.js} +3 -3
  108. package/bundle/{irc-adapter-AIEP6OX6.js → irc-adapter-HXO5D4SW.js} +3 -3
  109. package/bundle/{irc-config-6VY67UPQ.js → irc-config-XN5VW2V4.js} +5 -5
  110. package/bundle/{lazy-require-UFYFFX2R.js → lazy-require-R3JYCV5M.js} +4 -4
  111. package/bundle/{media-utils-MOE36VWY.js → media-utils-W7XW3SVV.js} +4 -4
  112. package/bundle/{message-pipeline-2MBT44FO.js → message-pipeline-QX272U5X.js} +17 -14
  113. package/bundle/meta.json +2946 -2305
  114. package/bundle/{notification-U6F5ZBSG.js → notification-ULESRDHB.js} +7 -6
  115. package/bundle/{openrouter-credits-7XXO6QGQ.js → openrouter-credits-PLIKRY5D.js} +4 -4
  116. package/bundle/{paths-ZJYIDND2.js → paths-QQM74XYT.js} +4 -2
  117. package/bundle/{peer-client-T44VI7NB.js → peer-client-D2F5QWRV.js} +8 -8
  118. package/bundle/{peer-config-D5A4454H.js → peer-config-5SUIBJLG.js} +5 -5
  119. package/bundle/{phase-transport-FEZ4SIJJ.js → phase-transport-BSGROTHY.js} +10 -10
  120. package/bundle/{restore-MFSW3EBL.js → restore-Z6MF54HS.js} +4 -4
  121. package/bundle/{restore-MFSW3EBL.js.map → restore-Z6MF54HS.js.map} +2 -2
  122. package/bundle/{update-check-O5MS6B3L.js → rollback-5RXXLUD6.js} +5 -7
  123. package/bundle/{self-healer-utils-7NFH22VJ.js → self-healer-utils-WPKOVXJD.js} +4 -4
  124. package/bundle/{skill-stats-IPVKMWN3.js → skill-stats-NHNH47QW.js} +5 -5
  125. package/bundle/{sleep-BPWX3FCN.js → sleep-K7EXAFGW.js} +8 -8
  126. package/bundle/{soul-bundle-BRIUDEQ2.js → soul-bundle-QTPWDJB2.js} +7 -7
  127. package/bundle/{soul-loader-GBXJ7EBH.js → soul-loader-LCPTN4PK.js} +8 -8
  128. package/bundle/{sse-parser-anthropic-H42TTLBD.js → sse-parser-anthropic-PYDJM3UC.js} +4 -4
  129. package/bundle/{sse-parser-responses-WG2LY2ML.js → sse-parser-responses-FYT7A5WT.js} +4 -4
  130. package/bundle/{ssrf-guard-E2KBBC5E.js → ssrf-guard-R4P5OCTO.js} +4 -4
  131. package/bundle/{start-CBVKNEAT.js → start-4DNURGIY.js} +1 -1
  132. package/bundle/{stt-CF3CPFDC.js → stt-YN77NND6.js} +5 -5
  133. package/bundle/{subagent-runtime-4MTYUBIZ.js → subagent-runtime-FQAT3564.js} +5 -5
  134. package/bundle/system-event-buffer-OEPPNUGK.js +17 -0
  135. package/bundle/system-event-buffer-OEPPNUGK.js.map +7 -0
  136. package/bundle/{system-message-TALP6GP2.js → system-message-BRU267FW.js} +3 -3
  137. package/bundle/{system-status-GLYXXDE3.js → system-status-7K2QTH3J.js} +58 -51
  138. package/bundle/system-status-7K2QTH3J.js.map +7 -0
  139. package/bundle/{hotskills-6ECHLXTJ.js → task-failure-buffer-DPM5MWZ5.js} +8 -7
  140. package/bundle/{task-store-LC7ZMS72.js → task-store-VCBHAB43.js} +5 -5
  141. package/bundle/{telegram-adapter-BJJYXN7J.js → telegram-adapter-LXLSG4SK.js} +51 -33
  142. package/bundle/telegram-adapter-LXLSG4SK.js.map +7 -0
  143. package/bundle/{tool-registry-T7XLTI2Q.js → tool-registry-5PXNSYOI.js} +12 -9
  144. package/bundle/{tool-sandbox-OZMXJZLQ.js → tool-sandbox-TLAL55QP.js} +5 -5
  145. package/bundle/{transport-config-G5NKQXPJ.js → transport-config-JIKHB7GT.js} +8 -8
  146. package/bundle/update-check-AJMIBQGQ.js +81 -0
  147. package/bundle/update-check-AJMIBQGQ.js.map +7 -0
  148. package/bundle/{user-registry-NUVNEHJU.js → user-registry-PEFDZ5AV.js} +5 -5
  149. package/bundle/user-registry-PEFDZ5AV.js.map +7 -0
  150. package/core/skills/tools/gmail/SKILL.md +5 -14
  151. package/core/skills/tools/rss/SKILL.md +51 -0
  152. package/install-manifest.json +4 -2
  153. package/package.json +3 -2
  154. package/scripts/build-and-deploy.sh +28 -0
  155. package/scripts/doctor.sh +38 -0
  156. package/scripts/emergency-deploy.sh +95 -0
  157. package/scripts/watchdog.sh +51 -5
  158. package/bundle/chunk-4BUOO6WI.js.map +0 -7
  159. package/bundle/chunk-A5OJYQNU.js.map +0 -7
  160. package/bundle/chunk-JX3ZZU3O.js +0 -82
  161. package/bundle/chunk-JX3ZZU3O.js.map +0 -7
  162. package/bundle/chunk-KJOCXWJ5.js +0 -131
  163. package/bundle/chunk-KJOCXWJ5.js.map +0 -7
  164. package/bundle/chunk-KSEIWT4T.js.map +0 -7
  165. package/bundle/chunk-KWBGYWDO.js.map +0 -7
  166. package/bundle/chunk-MJ6PHMOK.js.map +0 -7
  167. package/bundle/chunk-P2BZSLJJ.js.map +0 -7
  168. package/bundle/chunk-R36WIOYX.js.map +0 -7
  169. package/bundle/chunk-RE3F3CFW.js +0 -300
  170. package/bundle/chunk-RE3F3CFW.js.map +0 -7
  171. package/bundle/chunk-RSWUPUNA.js.map +0 -7
  172. package/bundle/chunk-RV54J75Q.js.map +0 -7
  173. package/bundle/chunk-TYVI3ZWA.js.map +0 -7
  174. package/bundle/chunk-X5FBUA53.js.map +0 -7
  175. package/bundle/direct-api-transport-TRV45NO6.js.map +0 -7
  176. package/bundle/discord-adapter-WA2MFRK3.js.map +0 -7
  177. package/bundle/system-status-GLYXXDE3.js.map +0 -7
  178. package/bundle/telegram-adapter-BJJYXN7J.js.map +0 -7
  179. /package/bundle/{agent-api-rate-limit-C25WGSFF.js.map → agent-api-rate-limit-R2OFAQ3N.js.map} +0 -0
  180. /package/bundle/{agent-registry-SYUFNSVB.js.map → agent-registry-S2MNHQYQ.js.map} +0 -0
  181. /package/bundle/{bridge-lock-transport-HO545SBK.js.map → bridge-lock-transport-N6OGDOSE.js.map} +0 -0
  182. /package/bundle/{browse-delivery-VTLEAVYA.js.map → browse-delivery-DXGMDMXA.js.map} +0 -0
  183. /package/bundle/{browser-REIXOJ6S.js.map → browser-QMYGSP5W.js.map} +0 -0
  184. /package/bundle/{capability-ILW3D5HS.js.map → capability-733TLH4W.js.map} +0 -0
  185. /package/bundle/{chunk-ZVDVNSXK.js.map → chunk-2SWKJX64.js.map} +0 -0
  186. /package/bundle/{chunk-PZE3J7ER.js.map → chunk-3OXQWII3.js.map} +0 -0
  187. /package/bundle/{chunk-4KJ76TTE.js.map → chunk-4XW7YA3K.js.map} +0 -0
  188. /package/bundle/{chunk-Q62SXS73.js.map → chunk-BBDKU4EH.js.map} +0 -0
  189. /package/bundle/{chunk-EX2SRTUE.js.map → chunk-CYSGXNBY.js.map} +0 -0
  190. /package/bundle/{chunk-LYEAHE5V.js.map → chunk-DCY7DGMT.js.map} +0 -0
  191. /package/bundle/{chunk-G6IXMYIO.js.map → chunk-DO4INSXE.js.map} +0 -0
  192. /package/bundle/{chunk-VA5WKN3Z.js.map → chunk-EGA6JQVV.js.map} +0 -0
  193. /package/bundle/{chunk-URAQLQ2U.js.map → chunk-F3HMZFIL.js.map} +0 -0
  194. /package/bundle/{chunk-OOKLEC6V.js.map → chunk-FY3QUO2L.js.map} +0 -0
  195. /package/bundle/{chunk-2BY6I4P5.js.map → chunk-GUTRAMK3.js.map} +0 -0
  196. /package/bundle/{chunk-GPL57SRN.js.map → chunk-H7RX7UCR.js.map} +0 -0
  197. /package/bundle/{chunk-BYDUMHXT.js.map → chunk-HAF2AFBW.js.map} +0 -0
  198. /package/bundle/{chunk-KFENC7BM.js.map → chunk-L33WNMCP.js.map} +0 -0
  199. /package/bundle/{chunk-JRG4EFMP.js.map → chunk-LBMETTUP.js.map} +0 -0
  200. /package/bundle/{chunk-TOUZC6NR.js.map → chunk-OKMN6J4Z.js.map} +0 -0
  201. /package/bundle/{chunk-CELR236Q.js.map → chunk-Q7CH5DA3.js.map} +0 -0
  202. /package/bundle/{chunk-XZSYMCLF.js.map → chunk-QIAFGDRL.js.map} +0 -0
  203. /package/bundle/{chunk-UDZIZB5F.js.map → chunk-RTL7HO3N.js.map} +0 -0
  204. /package/bundle/{chunk-ITG6XGBS.js.map → chunk-SA44ITVX.js.map} +0 -0
  205. /package/bundle/{chunk-3MO2MDXJ.js.map → chunk-SA6YEFNG.js.map} +0 -0
  206. /package/bundle/{chunk-GBBTK6H2.js.map → chunk-SRFEIZQT.js.map} +0 -0
  207. /package/bundle/{chunk-ELRAH7VL.js.map → chunk-VXUVKC66.js.map} +0 -0
  208. /package/bundle/{commands-WUGPBPHI.js.map → commands-AXW7L2MZ.js.map} +0 -0
  209. /package/bundle/{config-DQIGDX4W.js.map → config-NDEYF4AQ.js.map} +0 -0
  210. /package/bundle/{daemon-NPKYZ3CJ.js.map → daemon-WOQXCKNL.js.map} +0 -0
  211. /package/bundle/{delegation-tools-6FICZQ5G.js.map → delegation-tools-Z5OM3TXS.js.map} +0 -0
  212. /package/bundle/{deploy-lib-import-SBKXDD3F.js.map → deploy-lib-import-6VJTYXEG.js.map} +0 -0
  213. /package/bundle/{deps-HN6CEXA4.js.map → deps-65V7XXG4.js.map} +0 -0
  214. /package/bundle/{dns-wakeup-RYOCQ6GR.js.map → dns-wakeup-N46RPU5E.js.map} +0 -0
  215. /package/bundle/{ensure-invariants-BJIEOSJ2.js.map → ensure-invariants-3NOBCYWS.js.map} +0 -0
  216. /package/bundle/{env-schema-XCPAJ6IZ.js.map → env-schema-T43X43BU.js.map} +0 -0
  217. /package/bundle/{hook-system-POI5VRIX.js.map → hook-system-ZCVOFFRD.js.map} +0 -0
  218. /package/bundle/{hotskills-6ECHLXTJ.js.map → hotskills-DTROJY6G.js.map} +0 -0
  219. /package/bundle/{install-SH4UVUXQ.js.map → install-FZT43PTH.js.map} +0 -0
  220. /package/bundle/{install-manifest-QRWID3KZ.js.map → install-manifest-KBYD7SAY.js.map} +0 -0
  221. /package/bundle/{irc-adapter-AIEP6OX6.js.map → irc-adapter-HXO5D4SW.js.map} +0 -0
  222. /package/bundle/{irc-config-6VY67UPQ.js.map → irc-config-XN5VW2V4.js.map} +0 -0
  223. /package/bundle/{lazy-require-UFYFFX2R.js.map → lazy-require-R3JYCV5M.js.map} +0 -0
  224. /package/bundle/{media-utils-MOE36VWY.js.map → media-utils-W7XW3SVV.js.map} +0 -0
  225. /package/bundle/{message-pipeline-2MBT44FO.js.map → message-pipeline-QX272U5X.js.map} +0 -0
  226. /package/bundle/{notification-U6F5ZBSG.js.map → notification-ULESRDHB.js.map} +0 -0
  227. /package/bundle/{openrouter-credits-7XXO6QGQ.js.map → openrouter-credits-PLIKRY5D.js.map} +0 -0
  228. /package/bundle/{paths-ZJYIDND2.js.map → paths-QQM74XYT.js.map} +0 -0
  229. /package/bundle/{peer-client-T44VI7NB.js.map → peer-client-D2F5QWRV.js.map} +0 -0
  230. /package/bundle/{peer-config-D5A4454H.js.map → peer-config-5SUIBJLG.js.map} +0 -0
  231. /package/bundle/{phase-transport-FEZ4SIJJ.js.map → phase-transport-BSGROTHY.js.map} +0 -0
  232. /package/bundle/{skill-stats-IPVKMWN3.js.map → rollback-5RXXLUD6.js.map} +0 -0
  233. /package/bundle/{self-healer-utils-7NFH22VJ.js.map → self-healer-utils-WPKOVXJD.js.map} +0 -0
  234. /package/bundle/{sleep-BPWX3FCN.js.map → skill-stats-NHNH47QW.js.map} +0 -0
  235. /package/bundle/{soul-bundle-BRIUDEQ2.js.map → sleep-K7EXAFGW.js.map} +0 -0
  236. /package/bundle/{soul-loader-GBXJ7EBH.js.map → soul-bundle-QTPWDJB2.js.map} +0 -0
  237. /package/bundle/{stt-CF3CPFDC.js.map → soul-loader-LCPTN4PK.js.map} +0 -0
  238. /package/bundle/{sse-parser-anthropic-H42TTLBD.js.map → sse-parser-anthropic-PYDJM3UC.js.map} +0 -0
  239. /package/bundle/{sse-parser-responses-WG2LY2ML.js.map → sse-parser-responses-FYT7A5WT.js.map} +0 -0
  240. /package/bundle/{ssrf-guard-E2KBBC5E.js.map → ssrf-guard-R4P5OCTO.js.map} +0 -0
  241. /package/bundle/{start-CBVKNEAT.js.map → start-4DNURGIY.js.map} +0 -0
  242. /package/bundle/{subagent-runtime-4MTYUBIZ.js.map → stt-YN77NND6.js.map} +0 -0
  243. /package/bundle/{task-store-LC7ZMS72.js.map → subagent-runtime-FQAT3564.js.map} +0 -0
  244. /package/bundle/{system-message-TALP6GP2.js.map → system-message-BRU267FW.js.map} +0 -0
  245. /package/bundle/{tool-registry-T7XLTI2Q.js.map → task-failure-buffer-DPM5MWZ5.js.map} +0 -0
  246. /package/bundle/{tool-sandbox-OZMXJZLQ.js.map → task-store-VCBHAB43.js.map} +0 -0
  247. /package/bundle/{transport-config-G5NKQXPJ.js.map → tool-registry-5PXNSYOI.js.map} +0 -0
  248. /package/bundle/{update-check-O5MS6B3L.js.map → tool-sandbox-TLAL55QP.js.map} +0 -0
  249. /package/bundle/{user-registry-NUVNEHJU.js.map → transport-config-JIKHB7GT.js.map} +0 -0
@@ -2,10 +2,10 @@
2
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
3
  import {
4
4
  restart
5
- } from "./chunk-URAQLQ2U.js";
6
- import "./chunk-EX2SRTUE.js";
7
- import "./chunk-2BY6I4P5.js";
8
- import "./chunk-MJ6PHMOK.js";
5
+ } from "./chunk-F3HMZFIL.js";
6
+ import "./chunk-CYSGXNBY.js";
7
+ import "./chunk-GUTRAMK3.js";
8
+ import "./chunk-WW5F2DCO.js";
9
9
  import "./chunk-7K2YZTLD.js";
10
10
  export {
11
11
  restart
@@ -1,34 +1,11 @@
1
- #!/usr/bin/env node
2
1
  #!/usr/bin/env node
3
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
4
3
 
5
4
  // src/cli/abtars-rss.ts
6
- import { readFileSync, writeFileSync, mkdirSync, existsSync } from "node:fs";
7
- import { join } from "node:path";
5
+ import { readFileSync, writeFileSync, mkdirSync } from "node:fs";
6
+ import { join, basename } from "node:path";
8
7
  import { homedir } from "node:os";
9
- var FINANCE_DIR = join(homedir(), ".abtars", "workspace", "finance");
10
- var FEEDS_FILE = join(FINANCE_DIR, "feeds.json");
11
- var WATCHLIST_FILE = join(FINANCE_DIR, "stock_watchlist.md");
12
- var DEFAULT_FEEDS = [
13
- {
14
- url: "https://news.google.com/rss/search?q=%22artificial+intelligence%22+AND+(%22earnings%22+OR+%22guidance%22+OR+%22stock%22+OR+%22funding%22)&hl=en-US&gl=US&ceid=US:en",
15
- name: "Google News AI Finance"
16
- },
17
- {
18
- url: "https://www.cnbc.com/id/19854910/device/rss/rss.html",
19
- name: "CNBC Technology"
20
- },
21
- {
22
- url: "https://www.cnbc.com/id/15839069/device/rss/rss.html",
23
- name: "CNBC Investing"
24
- },
25
- {
26
- url: "https://efts.sec.gov/LATEST/search-index?q=%22artificial+intelligence%22+OR+%22GPU%22+OR+%22machine+learning%22&forms=8-K&dateRange=custom&category=form-type",
27
- name: "SEC EDGAR 8-K AI",
28
- keywords: ["artificial intelligence", "AI", "GPU", "machine learning"]
29
- }
30
- ];
31
- var UA = "AgentBridge-RSS/1.0";
8
+ var UA = "abtars-rss/1.0";
32
9
  function tag(xml, name) {
33
10
  const m = xml.match(new RegExp(`<${name}[^>]*>(?:<!\\[CDATA\\[)?([\\s\\S]*?)(?:\\]\\]>)?</${name}>`, "i"));
34
11
  return m?.[1]?.trim() ?? "";
@@ -39,35 +16,20 @@ function attrHref(xml) {
39
16
  }
40
17
  function parseXmlFeed(xml, source) {
41
18
  const items = [];
42
- const rssItems = xml.matchAll(/<item>([\s\S]*?)<\/item>/gi);
43
- for (const m of rssItems) {
19
+ for (const m of xml.matchAll(/<item>([\s\S]*?)<\/item>/gi)) {
44
20
  const c = m[1] ?? "";
45
- items.push({
46
- title: tag(c, "title"),
47
- link: tag(c, "link") || attrHref(c),
48
- summary: tag(c, "description").replace(/<[^>]+>/g, "").slice(0, 300),
49
- date: tag(c, "pubDate"),
50
- source
51
- });
21
+ items.push({ title: tag(c, "title"), link: tag(c, "link") || attrHref(c), summary: tag(c, "description").replace(/<[^>]+>/g, "").slice(0, 300), date: tag(c, "pubDate"), source });
52
22
  }
53
- const atomEntries = xml.matchAll(/<entry>([\s\S]*?)<\/entry>/gi);
54
- for (const m of atomEntries) {
23
+ for (const m of xml.matchAll(/<entry>([\s\S]*?)<\/entry>/gi)) {
55
24
  const c = m[1] ?? "";
56
- items.push({
57
- title: tag(c, "title"),
58
- link: attrHref(c) || tag(c, "link"),
59
- summary: (tag(c, "summary") || tag(c, "content")).replace(/<[^>]+>/g, "").slice(0, 300),
60
- date: tag(c, "updated") || tag(c, "published"),
61
- source
62
- });
25
+ items.push({ title: tag(c, "title"), link: attrHref(c) || tag(c, "link"), summary: (tag(c, "summary") || tag(c, "content")).replace(/<[^>]+>/g, "").slice(0, 300), date: tag(c, "updated") || tag(c, "published"), source });
63
26
  }
64
27
  return items;
65
28
  }
66
29
  function parseEdgarJson(json, source) {
67
30
  try {
68
31
  const data = JSON.parse(json);
69
- const hits = data.hits?.hits ?? [];
70
- return hits.map((h) => ({
32
+ return (data.hits?.hits ?? []).map((h) => ({
71
33
  title: h._source?.display_names?.join(", ") + " \u2014 " + h._source?.form_type,
72
34
  link: `https://www.sec.gov/Archives/edgar/data/${h._source?.entity_id}/${h._source?.file_num}`,
73
35
  summary: (h._source?.file_description ?? "").slice(0, 300),
@@ -83,18 +45,6 @@ async function fetchFeed(url) {
83
45
  if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);
84
46
  return res.text();
85
47
  }
86
- function parseActiveTickers() {
87
- if (!existsSync(WATCHLIST_FILE)) return [];
88
- const content = readFileSync(WATCHLIST_FILE, "utf-8");
89
- const section = content.match(/## Active\n([\s\S]*?)(?=\n## |$)/);
90
- if (!section?.[1]) return [];
91
- const tickers = [];
92
- for (const line of section[1].split("\n")) {
93
- const m = line.match(/^- (\w+)/);
94
- if (m?.[1]) tickers.push(m[1]);
95
- }
96
- return tickers;
97
- }
98
48
  function filterByAge(items, hours) {
99
49
  const cutoff = Date.now() - hours * 60 * 60 * 1e3;
100
50
  return items.filter((item) => {
@@ -112,32 +62,23 @@ function filterByKeywords(items, keywords) {
112
62
  });
113
63
  }
114
64
  async function main() {
115
- const hours = parseInt(process.argv.find((_, i, a) => a[i - 1] === "--hours") ?? "24", 10);
116
- mkdirSync(FINANCE_DIR, { recursive: true });
117
- if (!existsSync(FEEDS_FILE)) {
118
- writeFileSync(FEEDS_FILE, JSON.stringify(DEFAULT_FEEDS, null, 2), "utf-8");
119
- console.error(`Created default ${FEEDS_FILE}`);
120
- }
121
- const feeds = JSON.parse(readFileSync(FEEDS_FILE, "utf-8"));
122
- const tickers = parseActiveTickers();
123
- for (const t of tickers) {
124
- feeds.push({
125
- url: `https://seekingalpha.com/api/sa/combined/${t}.xml`,
126
- name: `SeekingAlpha:${t}`
127
- });
65
+ const args = process.argv.slice(2);
66
+ const feedsIdx = args.indexOf("--feeds");
67
+ if (feedsIdx === -1 || !args[feedsIdx + 1]) {
68
+ console.error("Usage: abtars-rss --feeds <path.json> [--hours N]");
69
+ process.exit(1);
128
70
  }
129
- console.error(`Fetching ${feeds.length} feeds (${tickers.length} tickers)...`);
71
+ const feedsPath = args[feedsIdx + 1];
72
+ const hours = parseInt(args.find((_, i, a) => a[i - 1] === "--hours") ?? "24", 10);
73
+ const feeds = JSON.parse(readFileSync(feedsPath, "utf-8"));
74
+ const outDir = join(process.env["ABTARS_HOME"] ?? join(homedir(), ".abtars"), "workspace", "rss");
75
+ console.error(`Fetching ${feeds.length} feeds...`);
130
76
  const allItems = [];
131
77
  for (const feed of feeds) {
132
78
  try {
133
79
  console.error(` ${feed.name}...`);
134
80
  const body = await fetchFeed(feed.url);
135
- let items;
136
- if (body.trimStart().startsWith("{")) {
137
- items = parseEdgarJson(body, feed.name);
138
- } else {
139
- items = parseXmlFeed(body, feed.name);
140
- }
81
+ let items = body.trimStart().startsWith("{") ? parseEdgarJson(body, feed.name) : parseXmlFeed(body, feed.name);
141
82
  if (feed.keywords) items = filterByKeywords(items, feed.keywords);
142
83
  allItems.push(...items);
143
84
  } catch (e) {
@@ -153,10 +94,13 @@ async function main() {
153
94
  return true;
154
95
  });
155
96
  const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
156
- const outFile = join(FINANCE_DIR, `rss-${date}.json`);
157
- const payload = { date, hours, totalFeeds: feeds.length, tickers, totalItems: deduped.length, items: deduped };
97
+ const feedName = basename(feedsPath, ".json").replace(/_feeds$/, "");
98
+ const feedOutDir = join(outDir, feedName);
99
+ mkdirSync(feedOutDir, { recursive: true });
100
+ const outFile = join(feedOutDir, `${date}.json`);
101
+ const payload = { date, hours, totalFeeds: feeds.length, totalItems: deduped.length, items: deduped };
158
102
  writeFileSync(outFile, JSON.stringify(payload, null, 2), "utf-8");
159
- console.error(`\u{1F4C4} ${deduped.length} items written to ${outFile}`);
103
+ console.error(`\u{1F4C4} ${deduped.length} items \u2192 ${outFile}`);
160
104
  console.log(JSON.stringify(payload, null, 2));
161
105
  }
162
106
  main().catch((err) => {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cli/abtars-rss.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * abtars-rss \u2014 fetch RSS/Atom feeds, output JSON\n *\n * Usage:\n * abtars-rss # fetch all feeds, output today's JSON\n * abtars-rss --hours 48 # look back 48h instead of 24\n *\n * Reads:\n * ~/.abtars/finance/feeds.json # feed URLs + optional keyword filters\n * ~/.abtars/finance/stock_watchlist.md # active tickers \u2192 Seeking Alpha RSS\n *\n * Writes:\n * ~/.abtars/finance/rss-YYYY-MM-DD.json\n */\n\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst FINANCE_DIR = join(homedir(), \".abtars\", \"workspace\", \"finance\");\nconst FEEDS_FILE = join(FINANCE_DIR, \"feeds.json\");\nconst WATCHLIST_FILE = join(FINANCE_DIR, \"stock_watchlist.md\");\n\ninterface FeedConfig {\n url: string;\n name: string;\n keywords?: string[];\n}\n\ninterface RssItem {\n title: string;\n link: string;\n summary: string;\n date: string;\n source: string;\n}\n\nconst DEFAULT_FEEDS: FeedConfig[] = [\n {\n url: \"https://news.google.com/rss/search?q=%22artificial+intelligence%22+AND+(%22earnings%22+OR+%22guidance%22+OR+%22stock%22+OR+%22funding%22)&hl=en-US&gl=US&ceid=US:en\",\n name: \"Google News AI Finance\",\n },\n {\n url: \"https://www.cnbc.com/id/19854910/device/rss/rss.html\",\n name: \"CNBC Technology\",\n },\n {\n url: \"https://www.cnbc.com/id/15839069/device/rss/rss.html\",\n name: \"CNBC Investing\",\n },\n {\n url: \"https://efts.sec.gov/LATEST/search-index?q=%22artificial+intelligence%22+OR+%22GPU%22+OR+%22machine+learning%22&forms=8-K&dateRange=custom&category=form-type\",\n name: \"SEC EDGAR 8-K AI\",\n keywords: [\"artificial intelligence\", \"AI\", \"GPU\", \"machine learning\"],\n },\n];\n\nconst UA = \"AgentBridge-RSS/1.0\";\n\nfunction tag(xml: string, name: string): string {\n const m = xml.match(new RegExp(`<${name}[^>]*>(?:<!\\\\[CDATA\\\\[)?([\\\\s\\\\S]*?)(?:\\\\]\\\\]>)?</${name}>`, \"i\"));\n return m?.[1]?.trim() ?? \"\";\n}\n\nfunction attrHref(xml: string): string {\n const m = xml.match(/<link[^>]+href=\"([^\"]+)\"/i);\n return m?.[1] ?? \"\";\n}\n\nfunction parseXmlFeed(xml: string, source: string): RssItem[] {\n const items: RssItem[] = [];\n\n // RSS <item> elements\n const rssItems = xml.matchAll(/<item>([\\s\\S]*?)<\\/item>/gi);\n for (const m of rssItems) {\n const c = m[1] ?? \"\";\n items.push({\n title: tag(c, \"title\"),\n link: tag(c, \"link\") || attrHref(c),\n summary: tag(c, \"description\").replace(/<[^>]+>/g, \"\").slice(0, 300),\n date: tag(c, \"pubDate\"),\n source,\n });\n }\n\n // Atom <entry> elements\n const atomEntries = xml.matchAll(/<entry>([\\s\\S]*?)<\\/entry>/gi);\n for (const m of atomEntries) {\n const c = m[1] ?? \"\";\n items.push({\n title: tag(c, \"title\"),\n link: attrHref(c) || tag(c, \"link\"),\n summary: (tag(c, \"summary\") || tag(c, \"content\")).replace(/<[^>]+>/g, \"\").slice(0, 300),\n date: tag(c, \"updated\") || tag(c, \"published\"),\n source,\n });\n }\n\n return items;\n}\n\nfunction parseEdgarJson(json: string, source: string): RssItem[] {\n try {\n const data = JSON.parse(json);\n const hits = data.hits?.hits ?? [];\n return hits.map((h: any) => ({\n title: h._source?.display_names?.join(\", \") + \" \u2014 \" + h._source?.form_type,\n link: `https://www.sec.gov/Archives/edgar/data/${h._source?.entity_id}/${h._source?.file_num}`,\n summary: (h._source?.file_description ?? \"\").slice(0, 300),\n date: h._source?.file_date ?? \"\",\n source,\n }));\n } catch {\n return [];\n }\n}\n\nasync function fetchFeed(url: string): Promise<string> {\n const res = await fetch(url, { headers: { \"User-Agent\": UA }, signal: AbortSignal.timeout(15000) });\n if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);\n return res.text();\n}\n\nfunction parseActiveTickers(): string[] {\n if (!existsSync(WATCHLIST_FILE)) return [];\n const content = readFileSync(WATCHLIST_FILE, \"utf-8\");\n const section = content.match(/## Active\\n([\\s\\S]*?)(?=\\n## |$)/);\n if (!section?.[1]) return [];\n const tickers: string[] = [];\n for (const line of section[1].split(\"\\n\")) {\n const m = line.match(/^- (\\w+)/);\n if (m?.[1]) tickers.push(m[1]);\n }\n return tickers;\n}\n\nfunction filterByAge(items: RssItem[], hours: number): RssItem[] {\n const cutoff = Date.now() - hours * 60 * 60 * 1000;\n return items.filter((item) => {\n if (!item.date) return true; // keep items without dates\n const ts = new Date(item.date).getTime();\n return isNaN(ts) || ts > cutoff;\n });\n}\n\nfunction filterByKeywords(items: RssItem[], keywords: string[]): RssItem[] {\n if (keywords.length === 0) return items;\n const lower = keywords.map((k) => k.toLowerCase());\n return items.filter((item) => {\n const text = `${item.title} ${item.summary}`.toLowerCase();\n return lower.some((kw) => text.includes(kw));\n });\n}\n\nasync function main(): Promise<void> {\n const hours = parseInt(process.argv.find((_, i, a) => a[i - 1] === \"--hours\") ?? \"24\", 10);\n\n mkdirSync(FINANCE_DIR, { recursive: true });\n\n // Init feeds.json if missing\n if (!existsSync(FEEDS_FILE)) {\n writeFileSync(FEEDS_FILE, JSON.stringify(DEFAULT_FEEDS, null, 2), \"utf-8\");\n console.error(`Created default ${FEEDS_FILE}`);\n }\n\n const feeds: FeedConfig[] = JSON.parse(readFileSync(FEEDS_FILE, \"utf-8\"));\n\n // Add Seeking Alpha feeds for active tickers\n const tickers = parseActiveTickers();\n for (const t of tickers) {\n feeds.push({\n url: `https://seekingalpha.com/api/sa/combined/${t}.xml`,\n name: `SeekingAlpha:${t}`,\n });\n }\n\n console.error(`Fetching ${feeds.length} feeds (${tickers.length} tickers)...`);\n\n const allItems: RssItem[] = [];\n\n for (const feed of feeds) {\n try {\n console.error(` ${feed.name}...`);\n const body = await fetchFeed(feed.url);\n\n let items: RssItem[];\n if (body.trimStart().startsWith(\"{\")) {\n items = parseEdgarJson(body, feed.name);\n } else {\n items = parseXmlFeed(body, feed.name);\n }\n\n if (feed.keywords) items = filterByKeywords(items, feed.keywords);\n allItems.push(...items);\n } catch (e: any) {\n console.error(` \u26A0 ${feed.name} failed: ${e.message}`);\n }\n }\n\n const filtered = filterByAge(allItems, hours);\n\n // Dedup by title similarity\n const seen = new Set<string>();\n const deduped = filtered.filter((item) => {\n const key = item.title.toLowerCase().replace(/[^a-z0-9]/g, \"\").slice(0, 60);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n const date = new Date().toISOString().slice(0, 10);\n const outFile = join(FINANCE_DIR, `rss-${date}.json`);\n const payload = { date, hours, totalFeeds: feeds.length, tickers, totalItems: deduped.length, items: deduped };\n writeFileSync(outFile, JSON.stringify(payload, null, 2), \"utf-8\");\n\n console.error(`\uD83D\uDCC4 ${deduped.length} items written to ${outFile}`);\n console.log(JSON.stringify(payload, null, 2));\n}\n\nmain().catch((err) => {\n console.error(`Fatal: ${err.message}`);\n process.exit(1);\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * abtars-rss \u2014 fetch RSS/Atom feeds, output JSON\n *\n * Usage:\n * abtars-rss --feeds <path> # fetch feeds from JSON file\n * abtars-rss --feeds <path> --hours 48\n *\n * Reads: a feeds.json file (array of {url, name, keywords?})\n * Writes: ~/.abtars/workspace/rss/<feedname>/<date>.json\n */\n\nimport { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join, basename } from \"node:path\";\nimport { homedir } from \"node:os\";\n\ninterface FeedConfig {\n url: string;\n name: string;\n keywords?: string[];\n}\n\ninterface RssItem {\n title: string;\n link: string;\n summary: string;\n date: string;\n source: string;\n}\n\nconst UA = \"abtars-rss/1.0\";\n\nfunction tag(xml: string, name: string): string {\n const m = xml.match(new RegExp(`<${name}[^>]*>(?:<!\\\\[CDATA\\\\[)?([\\\\s\\\\S]*?)(?:\\\\]\\\\]>)?</${name}>`, \"i\"));\n return m?.[1]?.trim() ?? \"\";\n}\n\nfunction attrHref(xml: string): string {\n const m = xml.match(/<link[^>]+href=\"([^\"]+)\"/i);\n return m?.[1] ?? \"\";\n}\n\nfunction parseXmlFeed(xml: string, source: string): RssItem[] {\n const items: RssItem[] = [];\n for (const m of xml.matchAll(/<item>([\\s\\S]*?)<\\/item>/gi)) {\n const c = m[1] ?? \"\";\n items.push({ title: tag(c, \"title\"), link: tag(c, \"link\") || attrHref(c), summary: tag(c, \"description\").replace(/<[^>]+>/g, \"\").slice(0, 300), date: tag(c, \"pubDate\"), source });\n }\n for (const m of xml.matchAll(/<entry>([\\s\\S]*?)<\\/entry>/gi)) {\n const c = m[1] ?? \"\";\n items.push({ title: tag(c, \"title\"), link: attrHref(c) || tag(c, \"link\"), summary: (tag(c, \"summary\") || tag(c, \"content\")).replace(/<[^>]+>/g, \"\").slice(0, 300), date: tag(c, \"updated\") || tag(c, \"published\"), source });\n }\n return items;\n}\n\nfunction parseEdgarJson(json: string, source: string): RssItem[] {\n try {\n const data = JSON.parse(json);\n return (data.hits?.hits ?? []).map((h: any) => ({\n title: h._source?.display_names?.join(\", \") + \" \u2014 \" + h._source?.form_type,\n link: `https://www.sec.gov/Archives/edgar/data/${h._source?.entity_id}/${h._source?.file_num}`,\n summary: (h._source?.file_description ?? \"\").slice(0, 300),\n date: h._source?.file_date ?? \"\",\n source,\n }));\n } catch { return []; }\n}\n\nasync function fetchFeed(url: string): Promise<string> {\n const res = await fetch(url, { headers: { \"User-Agent\": UA }, signal: AbortSignal.timeout(15000) });\n if (!res.ok) throw new Error(`${res.status} ${res.statusText}`);\n return res.text();\n}\n\nfunction filterByAge(items: RssItem[], hours: number): RssItem[] {\n const cutoff = Date.now() - hours * 60 * 60 * 1000;\n return items.filter((item) => {\n if (!item.date) return true;\n const ts = new Date(item.date).getTime();\n return isNaN(ts) || ts > cutoff;\n });\n}\n\nfunction filterByKeywords(items: RssItem[], keywords: string[]): RssItem[] {\n if (keywords.length === 0) return items;\n const lower = keywords.map((k) => k.toLowerCase());\n return items.filter((item) => {\n const text = `${item.title} ${item.summary}`.toLowerCase();\n return lower.some((kw) => text.includes(kw));\n });\n}\n\nasync function main(): Promise<void> {\n const args = process.argv.slice(2);\n const feedsIdx = args.indexOf(\"--feeds\");\n if (feedsIdx === -1 || !args[feedsIdx + 1]) {\n console.error(\"Usage: abtars-rss --feeds <path.json> [--hours N]\");\n process.exit(1);\n }\n const feedsPath = args[feedsIdx + 1]!;\n const hours = parseInt(args.find((_, i, a) => a[i - 1] === \"--hours\") ?? \"24\", 10);\n\n const feeds: FeedConfig[] = JSON.parse(readFileSync(feedsPath, \"utf-8\"));\n const outDir = join(process.env[\"ABTARS_HOME\"] ?? join(homedir(), \".abtars\"), \"workspace\", \"rss\");\n\n console.error(`Fetching ${feeds.length} feeds...`);\n\n const allItems: RssItem[] = [];\n for (const feed of feeds) {\n try {\n console.error(` ${feed.name}...`);\n const body = await fetchFeed(feed.url);\n let items = body.trimStart().startsWith(\"{\") ? parseEdgarJson(body, feed.name) : parseXmlFeed(body, feed.name);\n if (feed.keywords) items = filterByKeywords(items, feed.keywords);\n allItems.push(...items);\n } catch (e: any) {\n console.error(` \u26A0 ${feed.name} failed: ${e.message}`);\n }\n }\n\n const filtered = filterByAge(allItems, hours);\n const seen = new Set<string>();\n const deduped = filtered.filter((item) => {\n const key = item.title.toLowerCase().replace(/[^a-z0-9]/g, \"\").slice(0, 60);\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n });\n\n const date = new Date().toISOString().slice(0, 10);\n const feedName = basename(feedsPath, \".json\").replace(/_feeds$/, \"\");\n const feedOutDir = join(outDir, feedName);\n mkdirSync(feedOutDir, { recursive: true });\n const outFile = join(feedOutDir, `${date}.json`);\n const payload = { date, hours, totalFeeds: feeds.length, totalItems: deduped.length, items: deduped };\n writeFileSync(outFile, JSON.stringify(payload, null, 2), \"utf-8\");\n\n console.error(`\uD83D\uDCC4 ${deduped.length} items \u2192 ${outFile}`);\n console.log(JSON.stringify(payload, null, 2));\n}\n\nmain().catch((err) => { console.error(`Fatal: ${err.message}`); process.exit(1); });\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,3 @@
1
- #!/usr/bin/env node
2
1
  #!/usr/bin/env node
3
2
  import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
4
3
  import {
@@ -9,13 +8,13 @@ import {
9
8
  readEntry,
10
9
  removeEntry,
11
10
  writeEntry
12
- } from "./chunk-GPL57SRN.js";
11
+ } from "./chunk-H7RX7UCR.js";
13
12
  import {
14
13
  localISO
15
14
  } from "./chunk-MZWMYN4O.js";
16
- import "./chunk-EX2SRTUE.js";
17
- import "./chunk-2BY6I4P5.js";
18
- import "./chunk-MJ6PHMOK.js";
15
+ import "./chunk-CYSGXNBY.js";
16
+ import "./chunk-GUTRAMK3.js";
17
+ import "./chunk-WW5F2DCO.js";
19
18
  import {
20
19
  __toESM
21
20
  } from "./chunk-7K2YZTLD.js";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/cli/abtars-task.ts"],
4
- "sourcesContent": ["#!/usr/bin/env node\n/**\n * abtars-task \u2014 schedule time-based reminders and tasks.\n *\n * Usage:\n * abtars-task add --at \"2026-03-16T08:00\" --message \"Remind about cookies\" --chat-id 7773842843 --type reminder\n * abtars-task list\n * abtars-task remove <id>\n *\n * File: ~/.abtars/tasks/tasks.json\n */\n\nimport { localISO } from \"../utils/local-time.js\";\nimport { randomBytes } from \"node:crypto\";\nimport { readEntries as dbReadEntries, readEntry, writeEntry, removeEntry as dbRemoveEntry } from \"../components/tasks/task-store.js\";\n\n\nexport interface CronEntry {\n id: string;\n title?: string;\n fireAt: number;\n message: string;\n chatId: number;\n type: \"reminder\" | \"task\";\n executor?: \"agent\" | \"script\";\n schedule?: string;\n catchUp?: number; // hours: max delay after fireAt before skipping to next. 0 = no catch-up (default).\n priority?: \"high\" | \"medium\" | \"low\";\n taskFile?: string;\n paused?: boolean;\n maxRunsPerDay?: number;\n consecutiveFails?: number;\n agentFollowUp?: boolean;\n agentMessage?: string;\n fired: boolean;\n createdAt: number;\n lastRanAt?: number;\n retryAfter?: number;\n _prevFireAt?: number;\n _retrying?: boolean;\n history?: { ts: number; exitCode?: number }[];\n}\n\nexport function readEntries(): CronEntry[] {\n return dbReadEntries();\n}\n\ninterface AddArgs {\n at?: string;\n message?: string;\n chatId?: string;\n type?: string;\n executor?: string;\n schedule?: string;\n}\n\nfunction parseAddArgs(args: string[]): AddArgs {\n const parsed: AddArgs = {};\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--at\": parsed.at = args[++i] ?? \"\"; break;\n case \"--message\": parsed.message = args[++i] ?? \"\"; break;\n case \"--chat-id\": parsed.chatId = args[++i] ?? \"\"; break;\n case \"--type\": parsed.type = args[++i] ?? \"\"; break;\n case \"--executor\": parsed.executor = args[++i] ?? \"\"; break;\n case \"--schedule\": parsed.schedule = args[++i] ?? \"\"; break;\n }\n }\n return parsed;\n}\n\nimport { CronExpressionParser } from \"cron-parser\";\n\nfunction add(args: string[]): void {\n const parsed = parseAddArgs(args);\n if (!parsed.at && !parsed.schedule) { console.log(JSON.stringify({ ok: false, error: \"--at or --schedule is required\" })); process.exit(1); }\n if (parsed.at && parsed.schedule) { console.log(JSON.stringify({ ok: false, error: \"use --at (one-shot) or --schedule (recurring), not both\" })); process.exit(1); }\n if (!parsed.message) { console.log(JSON.stringify({ ok: false, error: \"--message is required\" })); process.exit(1); }\n if (!parsed.chatId) { console.log(JSON.stringify({ ok: false, error: \"--chat-id is required\" })); process.exit(1); }\n\n let fireAt: number;\n let schedule: string | undefined;\n\n if (parsed.schedule) {\n try {\n const expr = CronExpressionParser.parse(parsed.schedule);\n fireAt = expr.next().getTime();\n schedule = parsed.schedule;\n } catch {\n console.log(JSON.stringify({ ok: false, error: \"Invalid --schedule cron expression\" })); process.exit(1);\n }\n } else {\n fireAt = new Date(parsed.at!).getTime();\n if (!Number.isFinite(fireAt)) { console.log(JSON.stringify({ ok: false, error: \"Invalid --at date\" })); process.exit(1); }\n }\n\n const chatId = parseInt(parsed.chatId, 10);\n if (!Number.isFinite(chatId)) { console.log(JSON.stringify({ ok: false, error: \"Invalid --chat-id\" })); process.exit(1); }\n\n const type = (parsed.type ?? \"reminder\") as CronEntry[\"type\"];\n if (type !== \"reminder\" && type !== \"task\") { console.log(JSON.stringify({ ok: false, error: \"--type must be reminder or task\" })); process.exit(1); }\n\n const executor = (parsed.executor ?? \"agent\") as NonNullable<CronEntry[\"executor\"]>;\n if (executor !== \"agent\" && executor !== \"script\") { console.log(JSON.stringify({ ok: false, error: \"--executor must be agent or script\" })); process.exit(1); }\n\n const entry: CronEntry = {\n id: randomBytes(3).toString(\"hex\"),\n fireAt: fireAt!,\n message: parsed.message,\n chatId,\n type,\n executor,\n ...(schedule ? { schedule } : {}),\n fired: false,\n createdAt: Date.now(),\n };\n\n const entries = dbReadEntries();\n\n // Dedup: reject if a recurring entry with same schedule+message+chatId already exists\n if (schedule) {\n const dup = entries.find(e => e.schedule === schedule && e.message === entry.message && e.chatId === chatId && !e.paused);\n if (dup) { console.log(JSON.stringify({ ok: false, error: \"duplicate\", existing_id: dup.id })); process.exit(1); }\n }\n\n writeEntry(entry);\n console.log(JSON.stringify({ ok: true, action: \"added\", id: entry.id, fireAt: localISO(new Date(fireAt!)), ...(schedule ? { schedule } : {}) }));\n}\n\nfunction listEntries(): void {\n const entries = readEntries().filter(e => !e.fired || e.schedule);\n if (entries.length === 0) {\n console.log(JSON.stringify({ ok: true, entries: [], message: \"No pending cron entries\" }));\n return;\n }\n const display = entries.map(e => ({\n id: e.id,\n fireAt: localISO(new Date(e.fireAt)),\n message: e.message,\n chatId: e.chatId,\n type: e.type,\n ...(e.executor ? { executor: e.executor } : {}),\n ...(e.schedule ? { schedule: e.schedule } : {}),\n ...(e.priority ? { priority: e.priority } : {}),\n ...(e.paused ? { paused: true } : {}),\n ...(e.lastRanAt ? { lastRanAt: localISO(new Date(e.lastRanAt)) } : {}),\n ...(e.history?.length ? { history: e.history } : {}),\n }));\n console.log(JSON.stringify({ ok: true, entries: display }));\n}\n\nfunction remove(id: string): void {\n if (!dbRemoveEntry(id)) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n console.log(JSON.stringify({ ok: true, action: \"removed\", id }));\n}\n\nfunction pause(id: string): void {\n const entry = readEntry(id);\n if (!entry) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n entry.paused = true;\n writeEntry(entry);\n console.log(JSON.stringify({ ok: true, action: \"paused\", id }));\n}\n\nfunction resume(id: string): void {\n const entry = readEntry(id);\n if (!entry) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n entry.paused = false;\n entry.consecutiveFails = 0;\n writeEntry(entry);\n console.log(JSON.stringify({ ok: true, action: \"resumed\", id }));\n}\n\nfunction showHistory(id: string): void {\n const entry = readEntry(id);\n if (!entry) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n const runs = (entry.history ?? []).map(h => ({\n ranAt: localISO(new Date(h.ts)),\n ...(h.exitCode !== undefined ? { exitCode: h.exitCode } : {}),\n }));\n console.log(JSON.stringify({ ok: true, id, message: entry.message.slice(0, 80), runs }));\n}\n\n// --- CLI entry point ---\n\nexport function main(argv: string[] = process.argv): void {\n if (argv.includes('--help')) {\n console.log(`abtars-task \u2014 schedule time-based reminders and tasks.\n\nUsage:\n abtars-task add --at \"2026-03-16T08:00\" --message \"...\" --chat-id ID --type reminder\n abtars-task add --schedule \"0 9 * * *\" --message \"...\" --chat-id ID --type task\n abtars-task list\n abtars-task remove <id>\n abtars-task pause <id>\n abtars-task resume <id>\n abtars-task history <id>`);\n process.exit(0);\n }\n\n const args = argv.slice(2);\n const command = args[0];\n\n switch (command) {\n case \"add\":\n add(args.slice(1));\n break;\n case \"list\":\n listEntries();\n break;\n case \"remove\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task remove <id>\" })); process.exit(1); }\n remove(id);\n break;\n }\n case \"pause\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task pause <id>\" })); process.exit(1); }\n pause(id);\n break;\n }\n case \"resume\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task resume <id>\" })); process.exit(1); }\n resume(id);\n break;\n }\n case \"history\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task history <id>\" })); process.exit(1); }\n showHistory(id);\n break;\n }\n default:\n console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task <add|list|remove|pause|resume|history> [args]\" }));\n process.exit(1);\n }\n}\n\nconst isDirectRun = process.argv[1]?.endsWith(\"abtars-task.ts\") ||\n process.argv[1]?.endsWith(\"abtars-task.js\");\nif (isDirectRun) main();\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/**\n * abtars-task \u2014 schedule time-based reminders and tasks.\n *\n * Usage:\n * abtars-task add --at \"2026-03-16T08:00\" --message \"Remind about cookies\" --chat-id 7773842843 --type reminder\n * abtars-task list\n * abtars-task remove <id>\n *\n * File: ~/.abtars/tasks/tasks.json\n */\n\nimport { localISO } from \"../utils/local-time.js\";\nimport { randomBytes } from \"node:crypto\";\nimport { readEntries as dbReadEntries, readEntry, writeEntry, removeEntry as dbRemoveEntry } from \"../components/tasks/task-store.js\";\n\n\nexport interface CronEntry {\n id: string;\n title?: string;\n fireAt: number;\n message: string;\n chatId: number;\n type: \"reminder\" | \"task\";\n executor?: \"agent\" | \"script\";\n schedule?: string;\n catchUp?: number; // hours: max delay after fireAt before skipping to next. 0 = no catch-up (default).\n priority?: \"high\" | \"medium\" | \"low\";\n taskFile?: string;\n paused?: boolean;\n maxRunsPerDay?: number;\n consecutiveFails?: number;\n agentFollowUp?: boolean;\n agentMessage?: string;\n fired: boolean;\n createdAt: number;\n lastRanAt?: number;\n retryAfter?: number;\n _prevFireAt?: number;\n _retrying?: boolean;\n history?: { ts: number; exitCode?: number }[];\n}\n\nexport function readEntries(): CronEntry[] {\n return dbReadEntries();\n}\n\ninterface AddArgs {\n at?: string;\n message?: string;\n chatId?: string;\n type?: string;\n executor?: string;\n schedule?: string;\n}\n\nfunction parseAddArgs(args: string[]): AddArgs {\n const parsed: AddArgs = {};\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--at\": parsed.at = args[++i] ?? \"\"; break;\n case \"--message\": parsed.message = args[++i] ?? \"\"; break;\n case \"--chat-id\": parsed.chatId = args[++i] ?? \"\"; break;\n case \"--type\": parsed.type = args[++i] ?? \"\"; break;\n case \"--executor\": parsed.executor = args[++i] ?? \"\"; break;\n case \"--schedule\": parsed.schedule = args[++i] ?? \"\"; break;\n }\n }\n return parsed;\n}\n\nimport { CronExpressionParser } from \"cron-parser\";\n\nfunction add(args: string[]): void {\n const parsed = parseAddArgs(args);\n if (!parsed.at && !parsed.schedule) { console.log(JSON.stringify({ ok: false, error: \"--at or --schedule is required\" })); process.exit(1); }\n if (parsed.at && parsed.schedule) { console.log(JSON.stringify({ ok: false, error: \"use --at (one-shot) or --schedule (recurring), not both\" })); process.exit(1); }\n if (!parsed.message) { console.log(JSON.stringify({ ok: false, error: \"--message is required\" })); process.exit(1); }\n if (!parsed.chatId) { console.log(JSON.stringify({ ok: false, error: \"--chat-id is required\" })); process.exit(1); }\n\n let fireAt: number;\n let schedule: string | undefined;\n\n if (parsed.schedule) {\n try {\n const expr = CronExpressionParser.parse(parsed.schedule);\n fireAt = expr.next().getTime();\n schedule = parsed.schedule;\n } catch {\n console.log(JSON.stringify({ ok: false, error: \"Invalid --schedule cron expression\" })); process.exit(1);\n }\n } else {\n fireAt = new Date(parsed.at!).getTime();\n if (!Number.isFinite(fireAt)) { console.log(JSON.stringify({ ok: false, error: \"Invalid --at date\" })); process.exit(1); }\n }\n\n const chatId = parseInt(parsed.chatId, 10);\n if (!Number.isFinite(chatId)) { console.log(JSON.stringify({ ok: false, error: \"Invalid --chat-id\" })); process.exit(1); }\n\n const type = (parsed.type ?? \"reminder\") as CronEntry[\"type\"];\n if (type !== \"reminder\" && type !== \"task\") { console.log(JSON.stringify({ ok: false, error: \"--type must be reminder or task\" })); process.exit(1); }\n\n const executor = (parsed.executor ?? \"agent\") as NonNullable<CronEntry[\"executor\"]>;\n if (executor !== \"agent\" && executor !== \"script\") { console.log(JSON.stringify({ ok: false, error: \"--executor must be agent or script\" })); process.exit(1); }\n\n const entry: CronEntry = {\n id: randomBytes(3).toString(\"hex\"),\n fireAt: fireAt!,\n message: parsed.message,\n chatId,\n type,\n executor,\n ...(schedule ? { schedule } : {}),\n fired: false,\n createdAt: Date.now(),\n };\n\n const entries = dbReadEntries();\n\n // Dedup: reject if a recurring entry with same schedule+message+chatId already exists\n if (schedule) {\n const dup = entries.find(e => e.schedule === schedule && e.message === entry.message && e.chatId === chatId && !e.paused);\n if (dup) { console.log(JSON.stringify({ ok: false, error: \"duplicate\", existing_id: dup.id })); process.exit(1); }\n }\n\n writeEntry(entry);\n console.log(JSON.stringify({ ok: true, action: \"added\", id: entry.id, fireAt: localISO(new Date(fireAt!)), ...(schedule ? { schedule } : {}) }));\n}\n\nfunction listEntries(): void {\n const entries = readEntries().filter(e => !e.fired || e.schedule);\n if (entries.length === 0) {\n console.log(JSON.stringify({ ok: true, entries: [], message: \"No pending cron entries\" }));\n return;\n }\n const display = entries.map(e => ({\n id: e.id,\n fireAt: localISO(new Date(e.fireAt)),\n message: e.message,\n chatId: e.chatId,\n type: e.type,\n ...(e.executor ? { executor: e.executor } : {}),\n ...(e.schedule ? { schedule: e.schedule } : {}),\n ...(e.priority ? { priority: e.priority } : {}),\n ...(e.paused ? { paused: true } : {}),\n ...(e.lastRanAt ? { lastRanAt: localISO(new Date(e.lastRanAt)) } : {}),\n ...(e.history?.length ? { history: e.history } : {}),\n }));\n console.log(JSON.stringify({ ok: true, entries: display }));\n}\n\nfunction remove(id: string): void {\n if (!dbRemoveEntry(id)) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n console.log(JSON.stringify({ ok: true, action: \"removed\", id }));\n}\n\nfunction pause(id: string): void {\n const entry = readEntry(id);\n if (!entry) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n entry.paused = true;\n writeEntry(entry);\n console.log(JSON.stringify({ ok: true, action: \"paused\", id }));\n}\n\nfunction resume(id: string): void {\n const entry = readEntry(id);\n if (!entry) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n entry.paused = false;\n entry.consecutiveFails = 0;\n writeEntry(entry);\n console.log(JSON.stringify({ ok: true, action: \"resumed\", id }));\n}\n\nfunction showHistory(id: string): void {\n const entry = readEntry(id);\n if (!entry) { console.log(JSON.stringify({ ok: false, error: `Entry ${id} not found` })); process.exit(1); }\n const runs = (entry.history ?? []).map(h => ({\n ranAt: localISO(new Date(h.ts)),\n ...(h.exitCode !== undefined ? { exitCode: h.exitCode } : {}),\n }));\n console.log(JSON.stringify({ ok: true, id, message: entry.message.slice(0, 80), runs }));\n}\n\n// --- CLI entry point ---\n\nexport function main(argv: string[] = process.argv): void {\n if (argv.includes('--help')) {\n console.log(`abtars-task \u2014 schedule time-based reminders and tasks.\n\nUsage:\n abtars-task add --at \"2026-03-16T08:00\" --message \"...\" --chat-id ID --type reminder\n abtars-task add --schedule \"0 9 * * *\" --message \"...\" --chat-id ID --type task\n abtars-task list\n abtars-task remove <id>\n abtars-task pause <id>\n abtars-task resume <id>\n abtars-task history <id>`);\n process.exit(0);\n }\n\n const args = argv.slice(2);\n const command = args[0];\n\n switch (command) {\n case \"add\":\n add(args.slice(1));\n break;\n case \"list\":\n listEntries();\n break;\n case \"remove\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task remove <id>\" })); process.exit(1); }\n remove(id);\n break;\n }\n case \"pause\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task pause <id>\" })); process.exit(1); }\n pause(id);\n break;\n }\n case \"resume\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task resume <id>\" })); process.exit(1); }\n resume(id);\n break;\n }\n case \"history\": {\n const id = args[1];\n if (!id) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task history <id>\" })); process.exit(1); }\n showHistory(id);\n break;\n }\n default:\n console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-task <add|list|remove|pause|resume|history> [args]\" }));\n process.exit(1);\n }\n}\n\nconst isDirectRun = process.argv[1]?.endsWith(\"abtars-task.ts\") ||\n process.argv[1]?.endsWith(\"abtars-task.js\");\nif (isDirectRun) main();\n"],
5
+ "mappings": "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",
6
6
  "names": ["readEntries"]
7
7
  }
@@ -0,0 +1,133 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire as __bundleCreateRequire } from 'node:module'; import { fileURLToPath as __bundleFileURLToPath } from 'node:url'; import { dirname as __bundleDirname } from 'node:path'; const require = __bundleCreateRequire(import.meta.url); const __chunk_filename = __bundleFileURLToPath(import.meta.url); const __chunk_dirname = __bundleDirname(__chunk_filename);
3
+ import {
4
+ localDate
5
+ } from "./chunk-DGS7J4P6.js";
6
+ import {
7
+ abtarsHome,
8
+ init_paths
9
+ } from "./chunk-WW5F2DCO.js";
10
+ import "./chunk-7K2YZTLD.js";
11
+
12
+ // src/cli/abtars-todo.ts
13
+ init_paths();
14
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
15
+ import { join } from "node:path";
16
+ var todoPath = () => join(abtarsHome(), "workspace", "todo", "todo.md");
17
+ var HEADER = "# Todo List\n";
18
+ function ensureFile() {
19
+ const p = todoPath();
20
+ const dir = join(abtarsHome(), "workspace", "todo");
21
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
22
+ if (!existsSync(p)) writeFileSync(p, HEADER, "utf-8");
23
+ }
24
+ function readLines() {
25
+ ensureFile();
26
+ return readFileSync(todoPath(), "utf-8").split("\n");
27
+ }
28
+ function writeLines(lines) {
29
+ writeFileSync(todoPath(), lines.join("\n"), "utf-8");
30
+ }
31
+ function itemIndices(lines) {
32
+ return lines.reduce((acc, line, i) => {
33
+ if (/^- \[[ x]\] /.test(line)) acc.push(i);
34
+ return acc;
35
+ }, []);
36
+ }
37
+ function add(description) {
38
+ ensureFile();
39
+ const date = localDate();
40
+ const entry = `- [ ] ${date}: ${description}
41
+ `;
42
+ const content = readFileSync(todoPath(), "utf-8");
43
+ writeFileSync(todoPath(), content.endsWith("\n") ? content + entry : content + "\n" + entry, "utf-8");
44
+ console.log(JSON.stringify({ ok: true, action: "added", description }));
45
+ }
46
+ function list() {
47
+ const lines = readLines();
48
+ const items = lines.filter((l) => /^- \[[ x]\] /.test(l));
49
+ if (items.length === 0) {
50
+ console.log(JSON.stringify({ ok: true, items: [], message: "Todo list is empty" }));
51
+ return;
52
+ }
53
+ console.log(items.join("\n"));
54
+ }
55
+ function done(lineNum) {
56
+ const lines = readLines();
57
+ const indices = itemIndices(lines);
58
+ if (lineNum < 1 || lineNum > indices.length) {
59
+ console.log(JSON.stringify({ ok: false, error: `Invalid item number ${lineNum}. Have ${indices.length} items.` }));
60
+ process.exit(1);
61
+ }
62
+ const idx = indices[lineNum - 1];
63
+ lines[idx] = lines[idx].replace("- [ ]", "- [x]");
64
+ writeLines(lines);
65
+ console.log(JSON.stringify({ ok: true, action: "done", item: lineNum }));
66
+ }
67
+ function remove(lineNum) {
68
+ const lines = readLines();
69
+ const indices = itemIndices(lines);
70
+ if (lineNum < 1 || lineNum > indices.length) {
71
+ console.log(JSON.stringify({ ok: false, error: `Invalid item number ${lineNum}. Have ${indices.length} items.` }));
72
+ process.exit(1);
73
+ }
74
+ const idx = indices[lineNum - 1];
75
+ lines.splice(idx, 1);
76
+ writeLines(lines);
77
+ console.log(JSON.stringify({ ok: true, action: "removed", item: lineNum }));
78
+ }
79
+ function main(argv = process.argv) {
80
+ const args = argv.slice(2);
81
+ if (args.includes("--help")) {
82
+ console.log(`Usage:
83
+ abtars-todo add "description"
84
+ abtars-todo list
85
+ abtars-todo done <number>
86
+ abtars-todo remove <number>
87
+
88
+ File: ~/.abtars/memory/todo.md`);
89
+ process.exit(0);
90
+ }
91
+ const command = args[0];
92
+ switch (command) {
93
+ case "add": {
94
+ const desc = args[1];
95
+ if (!desc) {
96
+ console.log(JSON.stringify({ ok: false, error: 'Usage: abtars-todo add "description"' }));
97
+ process.exit(1);
98
+ }
99
+ add(desc);
100
+ break;
101
+ }
102
+ case "list":
103
+ list();
104
+ break;
105
+ case "done": {
106
+ const n = parseInt(args[1] ?? "", 10);
107
+ if (!Number.isFinite(n)) {
108
+ console.log(JSON.stringify({ ok: false, error: "Usage: abtars-todo done <number>" }));
109
+ process.exit(1);
110
+ }
111
+ done(n);
112
+ break;
113
+ }
114
+ case "remove": {
115
+ const n = parseInt(args[1] ?? "", 10);
116
+ if (!Number.isFinite(n)) {
117
+ console.log(JSON.stringify({ ok: false, error: "Usage: abtars-todo remove <number>" }));
118
+ process.exit(1);
119
+ }
120
+ remove(n);
121
+ break;
122
+ }
123
+ default:
124
+ console.log(JSON.stringify({ ok: false, error: "Usage: abtars-todo <add|list|done|remove> [args]" }));
125
+ process.exit(1);
126
+ }
127
+ }
128
+ var isDirectRun = process.argv[1]?.endsWith("abtars-todo.ts") || process.argv[1]?.endsWith("abtars-todo.js");
129
+ if (isDirectRun) main();
130
+ export {
131
+ main
132
+ };
133
+ //# sourceMappingURL=abtars-todo.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/abtars-todo.ts"],
4
+ "sourcesContent": ["/**\n * abtars-todo \u2014 persistent todo list CLI.\n *\n * Usage:\n * abtars-todo add \"Export X/Twitter session cookies\"\n * abtars-todo list\n * abtars-todo done 3\n * abtars-todo remove 3\n *\n * File: ~/.abtars/workspace/todo/todo.md\n */\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../paths.js\";\nimport { localDate } from \"../utils/date.js\";\n\nconst todoPath = (): string => join(abtarsHome(), \"workspace\", \"todo\", \"todo.md\");\nconst HEADER = \"# Todo List\\n\";\n\nfunction ensureFile(): void {\n const p = todoPath();\n const dir = join(abtarsHome(), \"workspace\", \"todo\");\n if (!existsSync(dir)) mkdirSync(dir, { recursive: true });\n if (!existsSync(p)) writeFileSync(p, HEADER, \"utf-8\");\n}\n\nfunction readLines(): string[] {\n ensureFile();\n return readFileSync(todoPath(), \"utf-8\").split(\"\\n\");\n}\n\nfunction writeLines(lines: string[]): void {\n writeFileSync(todoPath(), lines.join(\"\\n\"), \"utf-8\");\n}\n\n/** Find indices of todo item lines (- [ ] or - [x]) */\nfunction itemIndices(lines: string[]): number[] {\n return lines.reduce<number[]>((acc, line, i) => {\n if (/^- \\[[ x]\\] /.test(line)) acc.push(i);\n return acc;\n }, []);\n}\n\nfunction add(description: string): void {\n ensureFile();\n const date = localDate();\n const entry = `- [ ] ${date}: ${description}\\n`;\n const content = readFileSync(todoPath(), \"utf-8\");\n writeFileSync(todoPath(), content.endsWith(\"\\n\") ? content + entry : content + \"\\n\" + entry, \"utf-8\");\n console.log(JSON.stringify({ ok: true, action: \"added\", description }));\n}\n\nfunction list(): void {\n const lines = readLines();\n const items = lines.filter(l => /^- \\[[ x]\\] /.test(l));\n if (items.length === 0) {\n console.log(JSON.stringify({ ok: true, items: [], message: \"Todo list is empty\" }));\n return;\n }\n // Print raw for agent readability\n console.log(items.join(\"\\n\"));\n}\n\nfunction done(lineNum: number): void {\n const lines = readLines();\n const indices = itemIndices(lines);\n if (lineNum < 1 || lineNum > indices.length) {\n console.log(JSON.stringify({ ok: false, error: `Invalid item number ${lineNum}. Have ${indices.length} items.` }));\n process.exit(1);\n }\n const idx = indices[lineNum - 1]!;\n lines[idx] = lines[idx]!.replace(\"- [ ]\", \"- [x]\");\n writeLines(lines);\n console.log(JSON.stringify({ ok: true, action: \"done\", item: lineNum }));\n}\n\nfunction remove(lineNum: number): void {\n const lines = readLines();\n const indices = itemIndices(lines);\n if (lineNum < 1 || lineNum > indices.length) {\n console.log(JSON.stringify({ ok: false, error: `Invalid item number ${lineNum}. Have ${indices.length} items.` }));\n process.exit(1);\n }\n const idx = indices[lineNum - 1]!;\n lines.splice(idx, 1);\n writeLines(lines);\n console.log(JSON.stringify({ ok: true, action: \"removed\", item: lineNum }));\n}\n\n// --- CLI entry point ---\n\nexport function main(argv: string[] = process.argv): void {\n const args = argv.slice(2);\n\n if (args.includes('--help')) {\n console.log(`Usage:\n abtars-todo add \"description\"\n abtars-todo list\n abtars-todo done <number>\n abtars-todo remove <number>\n\nFile: ~/.abtars/memory/todo.md`);\n process.exit(0);\n }\n\n const command = args[0];\n\n switch (command) {\n case \"add\": {\n const desc = args[1];\n if (!desc) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-todo add \\\"description\\\"\" })); process.exit(1); }\n add(desc);\n break;\n }\n case \"list\":\n list();\n break;\n case \"done\": {\n const n = parseInt(args[1] ?? \"\", 10);\n if (!Number.isFinite(n)) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-todo done <number>\" })); process.exit(1); }\n done(n);\n break;\n }\n case \"remove\": {\n const n = parseInt(args[1] ?? \"\", 10);\n if (!Number.isFinite(n)) { console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-todo remove <number>\" })); process.exit(1); }\n remove(n);\n break;\n }\n default:\n console.log(JSON.stringify({ ok: false, error: \"Usage: abtars-todo <add|list|done|remove> [args]\" }));\n process.exit(1);\n }\n}\n\nconst isDirectRun = process.argv[1]?.endsWith(\"abtars-todo.ts\") ||\n process.argv[1]?.endsWith(\"abtars-todo.js\");\nif (isDirectRun) main();\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }