abtars 0.2.0 → 0.2.1-alpha.10

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 (146) hide show
  1. package/README.md +15 -18
  2. package/bundle/{_registry.generated-6GO2PAMD.js → _registry.generated-4P6KTBTH.js} +8 -8
  3. package/bundle/_registry.generated-G2FSGHNY.js +36 -0
  4. package/bundle/_registry.generated-G2FSGHNY.js.map +7 -0
  5. package/bundle/_registry.generated-N74SMTUJ.js +36 -0
  6. package/bundle/_registry.generated-N74SMTUJ.js.map +7 -0
  7. package/bundle/_registry.generated-Y4VT5MBX.js +36 -0
  8. package/bundle/_registry.generated-Y4VT5MBX.js.map +7 -0
  9. package/bundle/abtars-browser.js +0 -1
  10. package/bundle/abtars-browser.js.map +2 -2
  11. package/bundle/abtars-cli.js +589 -547
  12. package/bundle/abtars-cli.js.map +4 -4
  13. package/bundle/abtars-restart.js +1 -1
  14. package/bundle/abtars-rss.js +0 -1
  15. package/bundle/abtars-rss.js.map +2 -2
  16. package/bundle/abtars-task.js +1 -2
  17. package/bundle/abtars-task.js.map +2 -2
  18. package/bundle/abtars.js +58 -33
  19. package/bundle/abtars.js.map +2 -2
  20. package/bundle/{agent-registry-SYUFNSVB.js → agent-registry-TM7EISOV.js} +2 -2
  21. package/bundle/{browse-delivery-64GQIUHG.js → browse-delivery-VTLEAVYA.js} +4 -4
  22. package/bundle/{browser-5H2Q7GEC.js → browser-JQGYFZAG.js} +5 -5
  23. package/bundle/browser-M4KDLN75.js +19 -0
  24. package/bundle/browser-REIXOJ6S.js +19 -0
  25. package/bundle/browser-VG2GTEND.js +19 -0
  26. package/bundle/{chunk-KFENC7BM.js → chunk-4YOTNYAE.js} +2 -2
  27. package/bundle/{chunk-KWBGYWDO.js → chunk-7I5C2U3C.js} +1 -1
  28. package/bundle/chunk-7I5C2U3C.js.map +7 -0
  29. package/bundle/{chunk-7STAQF5O.js → chunk-CNWXVXGH.js} +4 -4
  30. package/bundle/{chunk-7STAQF5O.js.map → chunk-CNWXVXGH.js.map} +2 -2
  31. package/bundle/{chunk-JX3ZZU3O.js → chunk-CU3O53U3.js} +28 -14
  32. package/bundle/chunk-CU3O53U3.js.map +7 -0
  33. package/bundle/chunk-EZZBO2QK.js +85 -0
  34. package/bundle/chunk-EZZBO2QK.js.map +7 -0
  35. package/bundle/{chunk-XLLSPBBT.js → chunk-GPL57SRN.js} +2 -2
  36. package/bundle/chunk-GPL57SRN.js.map +7 -0
  37. package/bundle/{chunk-PQ62LZNA.js → chunk-HEHD3GG5.js} +2 -2
  38. package/bundle/{chunk-A5OJYQNU.js → chunk-HTGVYNPE.js} +4 -4
  39. package/bundle/{chunk-WUTCGJDZ.js → chunk-HZRUBJ4Q.js} +148 -9
  40. package/bundle/chunk-HZRUBJ4Q.js.map +7 -0
  41. package/bundle/{chunk-ZVDVNSXK.js → chunk-J7CFCY4U.js} +2 -2
  42. package/bundle/{chunk-HXJRZWKA.js → chunk-JRK3UFBS.js} +106 -58
  43. package/bundle/chunk-JRK3UFBS.js.map +7 -0
  44. package/bundle/{chunk-GZUQQWBZ.js → chunk-KJOCXWJ5.js} +3 -3
  45. package/bundle/chunk-KJOCXWJ5.js.map +7 -0
  46. package/bundle/{chunk-K7P74UNQ.js → chunk-LDKSCXGL.js} +3 -3
  47. package/bundle/{chunk-K7P74UNQ.js.map → chunk-LDKSCXGL.js.map} +2 -2
  48. package/bundle/chunk-MNKLPRGY.js +138 -0
  49. package/bundle/chunk-MNKLPRGY.js.map +7 -0
  50. package/bundle/chunk-O73EZGKR.js +135 -0
  51. package/bundle/chunk-O73EZGKR.js.map +7 -0
  52. package/bundle/{chunk-OZ4IZFV4.js → chunk-Q7F5R2LL.js} +1 -1
  53. package/bundle/{chunk-OZ4IZFV4.js.map → chunk-Q7F5R2LL.js.map} +2 -2
  54. package/bundle/{chunk-XOCP5BMO.js → chunk-URAQLQ2U.js} +2 -2
  55. package/bundle/chunk-URAQLQ2U.js.map +7 -0
  56. package/bundle/{chunk-PPSB2ZIN.js → chunk-VREI2GUO.js} +18 -7
  57. package/bundle/chunk-VREI2GUO.js.map +7 -0
  58. package/bundle/chunk-VYR25H37.js +135 -0
  59. package/bundle/chunk-VYR25H37.js.map +7 -0
  60. package/bundle/{commands-E3Y4QUNF.js → commands-J6JAZ7D2.js} +5 -5
  61. package/bundle/{deploy-lib-import-ODLDL2DB.js → deploy-lib-import-PJXUADPS.js} +18 -16
  62. package/bundle/{direct-api-transport-TRV45NO6.js → direct-api-transport-ZSJHKYBX.js} +1 -1
  63. package/bundle/direct-api-transport-ZSJHKYBX.js.map +7 -0
  64. package/bundle/{discord-adapter-5DS7UTBE.js → discord-adapter-OCWSJTJU.js} +8 -8
  65. package/bundle/{doctor-R54GZPKL.js → doctor-XOGVHA4W.js} +13 -2
  66. package/bundle/{doctor-R54GZPKL.js.map → doctor-XOGVHA4W.js.map} +2 -2
  67. package/bundle/{install-RSLOS3Q5.js → install-6H3APAIJ.js} +3 -3
  68. package/bundle/{irc-adapter-RKRUSZXB.js → irc-adapter-AIEP6OX6.js} +6 -2
  69. package/bundle/irc-adapter-AIEP6OX6.js.map +7 -0
  70. package/bundle/{message-pipeline-CFVO73CK.js → message-pipeline-TCPHRBAK.js} +5 -5
  71. package/bundle/meta.json +4005 -3868
  72. package/bundle/{phase-transport-FEZ4SIJJ.js → phase-transport-ME2XDRR2.js} +3 -3
  73. package/bundle/restore-UH2UE2K5.js +151 -0
  74. package/bundle/restore-UH2UE2K5.js.map +7 -0
  75. package/bundle/rollback-D7AYTC7Z.js +11 -0
  76. package/bundle/{sleep-BPWX3FCN.js → sleep-IOWYTSMK.js} +2 -2
  77. package/bundle/{soul-bundle-BRIUDEQ2.js → soul-bundle-AH5S3MVI.js} +2 -2
  78. package/bundle/{soul-loader-GBXJ7EBH.js → soul-loader-N5FA4I6C.js} +3 -3
  79. package/bundle/soul-loader-N5FA4I6C.js.map +7 -0
  80. package/bundle/{start-4IWBKLWO.js → start-CBVKNEAT.js} +1 -1
  81. package/bundle/{subagent-runtime-MDBO6LHS.js → subagent-runtime-OOJXCKJF.js} +2 -2
  82. package/bundle/subagent-runtime-OOJXCKJF.js.map +7 -0
  83. package/bundle/{system-status-WAY63BYC.js → system-status-4JP36OKC.js} +12 -5
  84. package/bundle/{system-status-WAY63BYC.js.map → system-status-4JP36OKC.js.map} +2 -2
  85. package/bundle/{task-store-KIBFZL5A.js → task-store-LC7ZMS72.js} +2 -2
  86. package/bundle/task-store-LC7ZMS72.js.map +7 -0
  87. package/bundle/{telegram-adapter-MVA33IO2.js → telegram-adapter-QXHJQLLX.js} +5 -5
  88. package/bundle/{update-check-O5MS6B3L.js → update-check-XVY2IK2L.js} +2 -2
  89. package/bundle/update-check-XVY2IK2L.js.map +7 -0
  90. package/core/skills/tools/rss/SKILL.md +51 -0
  91. package/install-manifest.json +4 -3
  92. package/package.json +3 -4
  93. package/scripts/abtars-daemon.service +1 -1
  94. package/scripts/abtars-watchdog.service +1 -1
  95. package/scripts/abtars.sh +3 -5
  96. package/scripts/abtars@.service +1 -1
  97. package/scripts/build-and-deploy.sh +6 -0
  98. package/scripts/com.abtars.daemon.plist +1 -1
  99. package/scripts/com.abtars.watchdog.plist +1 -1
  100. package/scripts/daily-backup.sh +1 -61
  101. package/scripts/doctor.sh +48 -33
  102. package/scripts/watchdog.sh +53 -8
  103. package/bundle/chunk-GZUQQWBZ.js.map +0 -7
  104. package/bundle/chunk-HXJRZWKA.js.map +0 -7
  105. package/bundle/chunk-JX3ZZU3O.js.map +0 -7
  106. package/bundle/chunk-KWBGYWDO.js.map +0 -7
  107. package/bundle/chunk-PPSB2ZIN.js.map +0 -7
  108. package/bundle/chunk-WUTCGJDZ.js.map +0 -7
  109. package/bundle/chunk-XLLSPBBT.js.map +0 -7
  110. package/bundle/chunk-XOCP5BMO.js.map +0 -7
  111. package/bundle/direct-api-transport-TRV45NO6.js.map +0 -7
  112. package/bundle/irc-adapter-RKRUSZXB.js.map +0 -7
  113. package/bundle/passwd-QSHZJ2CG.js +0 -134
  114. package/bundle/passwd-QSHZJ2CG.js.map +0 -7
  115. package/bundle/restore-ROJF22R2.js +0 -47
  116. package/bundle/restore-ROJF22R2.js.map +0 -7
  117. package/core/core_templates/SOUL.md +0 -24
  118. package/core/core_templates/agent_notes.md +0 -7
  119. package/core/core_templates/core_facts.md +0 -10
  120. package/core/core_templates/user_profile.md +0 -7
  121. package/core/skills/tools/fxtwitter/SKILL.md +0 -52
  122. package/core/skills/tools/twitterX/SKILL.md +0 -52
  123. package/core/skills/tools/twitterX/scripts/abtars-tweet.js +0 -532
  124. package/core/skills/tools/twitterX/scripts/package.json +0 -1
  125. /package/bundle/{_registry.generated-6GO2PAMD.js.map → _registry.generated-4P6KTBTH.js.map} +0 -0
  126. /package/bundle/{agent-registry-SYUFNSVB.js.map → agent-registry-TM7EISOV.js.map} +0 -0
  127. /package/bundle/{browse-delivery-64GQIUHG.js.map → browse-delivery-VTLEAVYA.js.map} +0 -0
  128. /package/bundle/{browser-5H2Q7GEC.js.map → browser-JQGYFZAG.js.map} +0 -0
  129. /package/bundle/{commands-E3Y4QUNF.js.map → browser-M4KDLN75.js.map} +0 -0
  130. /package/bundle/{deploy-lib-import-ODLDL2DB.js.map → browser-REIXOJ6S.js.map} +0 -0
  131. /package/bundle/{install-RSLOS3Q5.js.map → browser-VG2GTEND.js.map} +0 -0
  132. /package/bundle/{chunk-KFENC7BM.js.map → chunk-4YOTNYAE.js.map} +0 -0
  133. /package/bundle/{chunk-PQ62LZNA.js.map → chunk-HEHD3GG5.js.map} +0 -0
  134. /package/bundle/{chunk-A5OJYQNU.js.map → chunk-HTGVYNPE.js.map} +0 -0
  135. /package/bundle/{chunk-ZVDVNSXK.js.map → chunk-J7CFCY4U.js.map} +0 -0
  136. /package/bundle/{message-pipeline-CFVO73CK.js.map → commands-J6JAZ7D2.js.map} +0 -0
  137. /package/bundle/{phase-transport-FEZ4SIJJ.js.map → deploy-lib-import-PJXUADPS.js.map} +0 -0
  138. /package/bundle/{discord-adapter-5DS7UTBE.js.map → discord-adapter-OCWSJTJU.js.map} +0 -0
  139. /package/bundle/{sleep-BPWX3FCN.js.map → install-6H3APAIJ.js.map} +0 -0
  140. /package/bundle/{soul-bundle-BRIUDEQ2.js.map → message-pipeline-TCPHRBAK.js.map} +0 -0
  141. /package/bundle/{soul-loader-GBXJ7EBH.js.map → phase-transport-ME2XDRR2.js.map} +0 -0
  142. /package/bundle/{subagent-runtime-MDBO6LHS.js.map → rollback-D7AYTC7Z.js.map} +0 -0
  143. /package/bundle/{task-store-KIBFZL5A.js.map → sleep-IOWYTSMK.js.map} +0 -0
  144. /package/bundle/{update-check-O5MS6B3L.js.map → soul-bundle-AH5S3MVI.js.map} +0 -0
  145. /package/bundle/{start-4IWBKLWO.js.map → start-CBVKNEAT.js.map} +0 -0
  146. /package/bundle/{telegram-adapter-MVA33IO2.js.map → telegram-adapter-QXHJQLLX.js.map} +0 -0
@@ -2,7 +2,7 @@
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-XOCP5BMO.js";
5
+ } from "./chunk-URAQLQ2U.js";
6
6
  import "./chunk-EX2SRTUE.js";
7
7
  import "./chunk-2BY6I4P5.js";
8
8
  import "./chunk-MJ6PHMOK.js";
@@ -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
 
@@ -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 # 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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",
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,7 +8,7 @@ import {
9
8
  readEntry,
10
9
  removeEntry,
11
10
  writeEntry
12
- } from "./chunk-XLLSPBBT.js";
11
+ } from "./chunk-GPL57SRN.js";
13
12
  import {
14
13
  localISO
15
14
  } from "./chunk-MZWMYN4O.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/state/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
  }
package/bundle/abtars.js CHANGED
@@ -7,7 +7,7 @@ import {
7
7
  readPendingReminders,
8
8
  recordRun as recordRun2,
9
9
  require_main
10
- } from "./chunk-PQ62LZNA.js";
10
+ } from "./chunk-HEHD3GG5.js";
11
11
  import {
12
12
  SessionManager,
13
13
  SessionRegistry,
@@ -16,7 +16,7 @@ import {
16
16
  sanitizeOutbound,
17
17
  setIdleCompactReset,
18
18
  startSession
19
- } from "./chunk-WUTCGJDZ.js";
19
+ } from "./chunk-HZRUBJ4Q.js";
20
20
  import {
21
21
  require_extension,
22
22
  require_permessage_deflate,
@@ -31,13 +31,13 @@ import {
31
31
  phaseTransport,
32
32
  resetAllCtxStarts,
33
33
  updateCtxStart
34
- } from "./chunk-A5OJYQNU.js";
34
+ } from "./chunk-HTGVYNPE.js";
35
35
  import "./chunk-3MO2MDXJ.js";
36
- import "./chunk-ZVDVNSXK.js";
36
+ import "./chunk-J7CFCY4U.js";
37
37
  import "./chunk-RV54J75Q.js";
38
38
  import {
39
39
  SubagentRuntime
40
- } from "./chunk-7STAQF5O.js";
40
+ } from "./chunk-CNWXVXGH.js";
41
41
  import {
42
42
  createCapabilityRegistry
43
43
  } from "./chunk-OOKLEC6V.js";
@@ -45,8 +45,8 @@ import {
45
45
  sendNotification,
46
46
  sendToMainChat
47
47
  } from "./chunk-TYVI3ZWA.js";
48
- import "./chunk-KFENC7BM.js";
49
- import "./chunk-OZ4IZFV4.js";
48
+ import "./chunk-4YOTNYAE.js";
49
+ import "./chunk-Q7F5R2LL.js";
50
50
  import {
51
51
  loadAndValidateConfig
52
52
  } from "./chunk-Q62SXS73.js";
@@ -102,7 +102,7 @@ import {
102
102
  readEntry,
103
103
  recordRun,
104
104
  writeEntry
105
- } from "./chunk-XLLSPBBT.js";
105
+ } from "./chunk-GPL57SRN.js";
106
106
  import {
107
107
  localISO
108
108
  } from "./chunk-MZWMYN4O.js";
@@ -669,7 +669,7 @@ async function phaseMemory(ctx) {
669
669
  const memory = new mod.MemoryManager(ctx.memoryConfig);
670
670
  await memory.initialize();
671
671
  ctx.memory = memory;
672
- logInfo("main", `\u{1F9E0} Memory enabled (dir=${ctx.memoryConfig.memoryDir})`);
672
+ logDebug("main", `\u{1F9E0} Memory enabled (dir=${ctx.memoryConfig.memoryDir})`);
673
673
  return "ran";
674
674
  } catch (err) {
675
675
  logWarn("main", `\u26A0\uFE0F Memory init failed: ${err instanceof Error ? err.message : String(err)}. Running without persistent memory.`);
@@ -709,7 +709,7 @@ var TAG3 = "cron-queue";
709
709
  var AGENT_TIMEOUT_MS = 30 * 60 * 1e3;
710
710
  var RETRY_DELAY_MS = 10 * 60 * 1e3;
711
711
  var PRIO_RANK = { high: 0, medium: 1, low: 2 };
712
- var STATE_FILE = join3(homedir4(), ".abtars", "task-queue-state.json");
712
+ var STATE_FILE = join3(homedir4(), ".abtars", "state", "task-queue-state.json");
713
713
  function persistState(current, queue) {
714
714
  try {
715
715
  const state = {
@@ -997,7 +997,7 @@ ${(output || "(no output)").slice(0, 500)}`);
997
997
  const workspace = join3(abtarsHome(), "workspace", entry.id);
998
998
  mkdirSync(workspace, { recursive: true });
999
999
  process.env["WORKSPACE"] = workspace;
1000
- const { SubagentRuntime: SubagentRuntime2 } = await import("./subagent-runtime-MDBO6LHS.js");
1000
+ const { SubagentRuntime: SubagentRuntime2 } = await import("./subagent-runtime-OOJXCKJF.js");
1001
1001
  const runtime = new SubagentRuntime2();
1002
1002
  this.timeout = setTimeout(() => {
1003
1003
  logWarn(TAG3, `\u23F1\uFE0F Agent "${entry.id}" timed out (30min) \u2014 shutting down runtime`);
@@ -1150,7 +1150,7 @@ Result: ${result}${pending}
1150
1150
  Diagnose the root cause. If you can fix it programmatically (config change, script fix, token refresh), do it. If the fix requires human action (manual browser login, external service down), state clearly: "Requires human intervention: <reason>" \u2014 do NOT create a skill or suggest adding error handling (you ARE the error handling). Be concise.`;
1151
1151
  void (async () => {
1152
1152
  try {
1153
- const { SubagentRuntime: SubagentRuntime2 } = await import("./subagent-runtime-MDBO6LHS.js");
1153
+ const { SubagentRuntime: SubagentRuntime2 } = await import("./subagent-runtime-OOJXCKJF.js");
1154
1154
  const runtime = new SubagentRuntime2();
1155
1155
  await runtime.complete("coding", msg, { sessionType: "S" });
1156
1156
  await runtime.shutdown();
@@ -1238,7 +1238,7 @@ Output: ${summary}`).catch((err) => logWarn("main", `Task result injection faile
1238
1238
  selfHealerTask: null,
1239
1239
  hailMary: ctx.hailMary,
1240
1240
  rebuildTransport: async () => {
1241
- const { rebuildTransport } = await import("./phase-transport-FEZ4SIJJ.js");
1241
+ const { rebuildTransport } = await import("./phase-transport-ME2XDRR2.js");
1242
1242
  await rebuildTransport(ctx);
1243
1243
  },
1244
1244
  phaseHealth: ctx.phaseHealth,
@@ -1288,7 +1288,7 @@ async function phasePlatforms(ctx) {
1288
1288
  registry.register("telegram", {
1289
1289
  configured: Boolean(config.telegram.botToken && config.telegram.allowedUserIds.size > 0),
1290
1290
  async create() {
1291
- const { TelegramAdapter } = await import("./telegram-adapter-MVA33IO2.js");
1291
+ const { TelegramAdapter } = await import("./telegram-adapter-QXHJQLLX.js");
1292
1292
  const adapter = new TelegramAdapter(
1293
1293
  { botToken: config.telegram.botToken, allowedUserIds: config.telegram.allowedUserIds, pollTimeoutS: config.telegram.pollTimeoutS },
1294
1294
  { pipeline: pipelineDeps, conversationBuffer, transport, memory, sessionManager: ctx.sessionManager }
@@ -1327,7 +1327,7 @@ async function phasePlatforms(ctx) {
1327
1327
  registry.register("discord", {
1328
1328
  configured: Boolean(config.discord.enabled && config.discord.botToken),
1329
1329
  async create() {
1330
- const { DiscordAdapter } = await import("./discord-adapter-5DS7UTBE.js");
1330
+ const { DiscordAdapter } = await import("./discord-adapter-OCWSJTJU.js");
1331
1331
  const adapter = new DiscordAdapter(
1332
1332
  {
1333
1333
  botToken: config.discord.botToken,
@@ -1368,8 +1368,8 @@ async function phasePlatforms(ctx) {
1368
1368
  configured: platforms.irc,
1369
1369
  async create() {
1370
1370
  const { loadIrcConfig } = await import("./irc-config-6VY67UPQ.js");
1371
- const { IrcAdapter } = await import("./irc-adapter-RKRUSZXB.js");
1372
- const { handleInboundMessage } = await import("./message-pipeline-CFVO73CK.js");
1371
+ const { IrcAdapter } = await import("./irc-adapter-AIEP6OX6.js");
1372
+ const { handleInboundMessage } = await import("./message-pipeline-TCPHRBAK.js");
1373
1373
  const ircConfig = loadIrcConfig();
1374
1374
  if (!ircConfig) throw new Error("irc.json missing or empty");
1375
1375
  const adapter = new IrcAdapter(ircConfig, {
@@ -1420,13 +1420,13 @@ async function phaseCapabilities(ctx) {
1420
1420
  let loaded = [];
1421
1421
  let staticCaps;
1422
1422
  try {
1423
- ({ capabilities: staticCaps } = await import("./_registry.generated-6GO2PAMD.js"));
1423
+ ({ capabilities: staticCaps } = await import("./_registry.generated-4P6KTBTH.js"));
1424
1424
  } catch (err) {
1425
1425
  logError("capabilities", `Registry import failed: ${err instanceof Error ? err.message : String(err)}. Loading individually.`);
1426
1426
  staticCaps = [];
1427
1427
  const individualCaps = [
1428
1428
  { name: "hotskills", load: () => import("./hotskills-6ECHLXTJ.js") },
1429
- { name: "browser", load: () => import("./browser-5H2Q7GEC.js") }
1429
+ { name: "browser", load: () => import("./browser-JQGYFZAG.js") }
1430
1430
  ];
1431
1431
  for (const { name, load } of individualCaps) {
1432
1432
  if (disabled.has(name)) continue;
@@ -1819,7 +1819,7 @@ function createSelfHealerTask(getTelegramAdapter, allowedUserIds) {
1819
1819
  autoFixRunning = false;
1820
1820
  }, 5 * 60 * 1e3);
1821
1821
  try {
1822
- const { SubagentRuntime: SubagentRuntime2 } = await import("./subagent-runtime-MDBO6LHS.js");
1822
+ const { SubagentRuntime: SubagentRuntime2 } = await import("./subagent-runtime-OOJXCKJF.js");
1823
1823
  const runtime = new SubagentRuntime2();
1824
1824
  const result = await runtime.complete("coding", rule.instruction);
1825
1825
  await runtime.shutdown();
@@ -1981,19 +1981,37 @@ function createAgeCheckTask(deps) {
1981
1981
  }
1982
1982
  };
1983
1983
  }
1984
- function createDbIntegrityTask(memory) {
1985
- let counter = 0;
1984
+ function createDbIntegrityTask(memory, sendSystemMessage) {
1985
+ let lastCheckAt = 0;
1986
+ const INTERVAL_MS = 60 * 60 * 1e3;
1987
+ const MAX_FAILURES = 5;
1988
+ let consecutiveFailures = 0;
1989
+ let escalated = false;
1986
1990
  return {
1987
1991
  name: "db-integrity",
1988
1992
  execute: async () => {
1989
- counter++;
1990
- if (counter % 72 !== 0) return;
1993
+ if (escalated) return;
1994
+ if (Date.now() - lastCheckAt < INTERVAL_MS) return;
1995
+ lastCheckAt = Date.now();
1991
1996
  if (!memory) return;
1992
1997
  const result = memory.maintenance.checkIntegrity();
1993
1998
  if (result !== "ok") {
1994
1999
  logError("db-integrity", `Memory DB integrity check failed: ${result}`);
1995
2000
  const { rebuilt } = memory.rebuildFtsIndexes();
1996
- if (rebuilt.length > 0) logInfo("db-integrity", `Auto-rebuilt FTS indexes: ${rebuilt.join(", ")}`);
2001
+ if (rebuilt.length > 0) {
2002
+ logInfo("db-integrity", `Auto-rebuilt FTS indexes: ${rebuilt.join(", ")}`);
2003
+ consecutiveFailures = 0;
2004
+ } else {
2005
+ consecutiveFailures++;
2006
+ if (consecutiveFailures >= MAX_FAILURES) {
2007
+ escalated = true;
2008
+ const msg = `\u26A0\uFE0F FTS corruption persists after ${MAX_FAILURES} rebuild attempts. Needs manual fix.`;
2009
+ logError("db-integrity", msg);
2010
+ sendSystemMessage?.(msg);
2011
+ }
2012
+ }
2013
+ } else {
2014
+ consecutiveFailures = 0;
1997
2015
  }
1998
2016
  }
1999
2017
  };
@@ -2003,7 +2021,7 @@ function createUpdateCheckTask(notify) {
2003
2021
  name: "update-check",
2004
2022
  async execute() {
2005
2023
  if (process.env["UPDATES_CHECK_ENABLED"] === "false") return;
2006
- const { checkForUpdate } = await import("./update-check-O5MS6B3L.js");
2024
+ const { checkForUpdate } = await import("./update-check-XVY2IK2L.js");
2007
2025
  const { readFileSync: readFileSync7 } = await import("node:fs");
2008
2026
  const { join: join11 } = await import("node:path");
2009
2027
  const { abtarsHome: abtarsHome2 } = await import("./paths-ZJYIDND2.js");
@@ -2299,7 +2317,7 @@ async function phaseHeartbeat(ctx) {
2299
2317
  },
2300
2318
  cronBusy: () => cronQueue.currentJob !== null || cronQueue.pending > 0
2301
2319
  }));
2302
- heartbeat.registerTask(createDbIntegrityTask(memory));
2320
+ heartbeat.registerTask(createDbIntegrityTask(memory, sendSystemMessage));
2303
2321
  heartbeat.registerTask(createSkillStatsFlushTask());
2304
2322
  heartbeat.registerTask(createSkillTrashPruneTask());
2305
2323
  heartbeat.registerTask(createUpdateCheckTask((msg) => {
@@ -2325,7 +2343,7 @@ async function phaseHeartbeat(ctx) {
2325
2343
  }
2326
2344
  ctx.selfHealerTask = selfHealerTask;
2327
2345
  pipelineDeps.selfHealerTask = selfHealerTask;
2328
- const { registerCommand } = await import("./commands-E3Y4QUNF.js");
2346
+ const { registerCommand } = await import("./commands-J6JAZ7D2.js");
2329
2347
  for (const [name, handler2] of capabilities.commands) {
2330
2348
  registerCommand(name, handler2);
2331
2349
  }
@@ -2337,7 +2355,7 @@ async function phaseHeartbeat(ctx) {
2337
2355
  queueMicrotask(() => {
2338
2356
  runModelHealth().catch((err) => logAndSwallow(TAG7, "runModelHealth boot", err));
2339
2357
  });
2340
- const { checkBrowseTasks } = await import("./browse-delivery-64GQIUHG.js");
2358
+ const { checkBrowseTasks } = await import("./browse-delivery-VTLEAVYA.js");
2341
2359
  checkBrowseTasks();
2342
2360
  heartbeat.start();
2343
2361
  memory?.setHeartbeat(heartbeat);
@@ -2355,8 +2373,8 @@ async function phaseSleep(ctx) {
2355
2373
  logWarn("boot", `${phaseSleep.name}: skipping \u2014 heartbeat not available`);
2356
2374
  return "skipped";
2357
2375
  }
2358
- const { createSleepHandle } = await import("./sleep-BPWX3FCN.js");
2359
- const { killWakeInhibit } = await import("./commands-E3Y4QUNF.js");
2376
+ const { createSleepHandle } = await import("./sleep-IOWYTSMK.js");
2377
+ const { killWakeInhibit } = await import("./commands-J6JAZ7D2.js");
2360
2378
  const SLEEP_HOUR = parseInt(readEnvWithDefault("BED_TIME", "2", "bedtime hour").split(":")[0] ?? "2", 10);
2361
2379
  let subagent = null;
2362
2380
  const { getEnv: getEnv2 } = await import("./env-schema-XCPAJ6IZ.js");
@@ -2592,7 +2610,8 @@ var MemorySearchController = class {
2592
2610
  const webResults = result.results.map(hitToWebResult);
2593
2611
  const stageStatuses = {};
2594
2612
  for (const [name, stage] of Object.entries(result.stages)) {
2595
- stageStatuses[name] = { status: "ok", hits: stage.hits.length, ms: stage.ms };
2613
+ const s = stage;
2614
+ stageStatuses[name] = { status: "ok", hits: s.hits.length, ms: s.ms };
2596
2615
  }
2597
2616
  const response = { results: webResults, layers: stageStatuses };
2598
2617
  return { status: 200, body: response };
@@ -2933,7 +2952,7 @@ var DashboardServer = class {
2933
2952
  if (method === "GET" && pathname === "/api/cron") {
2934
2953
  if (!this.deps.authGate.guard(req, res)) return;
2935
2954
  try {
2936
- const { readEntries: readEntries2 } = await import("./task-store-KIBFZL5A.js");
2955
+ const { readEntries: readEntries2 } = await import("./task-store-LC7ZMS72.js");
2937
2956
  res.writeHead(200, { "Content-Type": "application/json" });
2938
2957
  res.end(JSON.stringify({ ok: true, entries: readEntries2() }));
2939
2958
  } catch (err) {
@@ -4072,6 +4091,12 @@ process.on("uncaughtException", (err) => {
4072
4091
  process.exit(1);
4073
4092
  });
4074
4093
  process.on("unhandledRejection", (reason) => {
4094
+ const msg = reason instanceof Error ? reason.message : String(reason);
4095
+ const isAcpRecoverable = reason instanceof Error && reason.name === "AcpExitError" || msg.includes("kiro-cli exited") || msg.includes("-32603") || msg.includes("AcpExit");
4096
+ if (isAcpRecoverable) {
4097
+ console.error(`[WARN] Suppressed ACP rejection (transport will reinit): ${msg}`);
4098
+ return;
4099
+ }
4075
4100
  console.error(`[FATAL] Unhandled rejection: ${reason instanceof Error ? reason.stack ?? reason.message : reason}`);
4076
4101
  process.exit(1);
4077
4102
  });