abtars 0.1.0-alpha.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 (312) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +84 -0
  3. package/bundle/_registry.generated-M4WY2MMI.js +35 -0
  4. package/bundle/_registry.generated-M4WY2MMI.js.map +7 -0
  5. package/bundle/abtars-browser.js +162 -0
  6. package/bundle/abtars-browser.js.map +7 -0
  7. package/bundle/abtars-cli.js +1438 -0
  8. package/bundle/abtars-cli.js.map +7 -0
  9. package/bundle/abtars-restart.js +12 -0
  10. package/bundle/abtars-restart.js.map +7 -0
  11. package/bundle/abtars-rss.js +165 -0
  12. package/bundle/abtars-rss.js.map +7 -0
  13. package/bundle/abtars-task.js +258 -0
  14. package/bundle/abtars-task.js.map +7 -0
  15. package/bundle/abtars.js +4072 -0
  16. package/bundle/abtars.js.map +7 -0
  17. package/bundle/agent-api-rate-limit-OQNFMXTZ.js +38 -0
  18. package/bundle/agent-api-rate-limit-OQNFMXTZ.js.map +7 -0
  19. package/bundle/agent-registry-LT4JNQH6.js +18 -0
  20. package/bundle/agent-registry-LT4JNQH6.js.map +7 -0
  21. package/bundle/agents/default.md +29 -0
  22. package/bundle/anthropic-adapter-2APTH3LA.js +40 -0
  23. package/bundle/anthropic-adapter-2APTH3LA.js.map +7 -0
  24. package/bundle/bridge-lock-transport-4AC2G5G6.js +39 -0
  25. package/bundle/bridge-lock-transport-4AC2G5G6.js.map +7 -0
  26. package/bundle/browse-delivery-JXBY36GK.js +17 -0
  27. package/bundle/browse-delivery-JXBY36GK.js.map +7 -0
  28. package/bundle/browser-ELNDVPLC.js +18 -0
  29. package/bundle/browser-ELNDVPLC.js.map +7 -0
  30. package/bundle/capability-CIL3G4FI.js +17 -0
  31. package/bundle/capability-CIL3G4FI.js.map +7 -0
  32. package/bundle/chunk-265TPOPC.js +289 -0
  33. package/bundle/chunk-265TPOPC.js.map +7 -0
  34. package/bundle/chunk-2UENBO6M.js +223 -0
  35. package/bundle/chunk-2UENBO6M.js.map +7 -0
  36. package/bundle/chunk-2UPU3OW6.js +67 -0
  37. package/bundle/chunk-2UPU3OW6.js.map +7 -0
  38. package/bundle/chunk-2XU2X4OI.js +125 -0
  39. package/bundle/chunk-2XU2X4OI.js.map +7 -0
  40. package/bundle/chunk-3B7BBE4F.js +758 -0
  41. package/bundle/chunk-3B7BBE4F.js.map +7 -0
  42. package/bundle/chunk-3E545J66.js +69 -0
  43. package/bundle/chunk-3E545J66.js.map +7 -0
  44. package/bundle/chunk-5R2ANXQ7.js +510 -0
  45. package/bundle/chunk-5R2ANXQ7.js.map +7 -0
  46. package/bundle/chunk-6CPN4IGS.js +507 -0
  47. package/bundle/chunk-6CPN4IGS.js.map +7 -0
  48. package/bundle/chunk-6NR3OHEW.js +88 -0
  49. package/bundle/chunk-6NR3OHEW.js.map +7 -0
  50. package/bundle/chunk-6SETMHNN.js +206 -0
  51. package/bundle/chunk-6SETMHNN.js.map +7 -0
  52. package/bundle/chunk-6UCRKRWR.js +644 -0
  53. package/bundle/chunk-6UCRKRWR.js.map +7 -0
  54. package/bundle/chunk-AR6GO6YC.js +83 -0
  55. package/bundle/chunk-AR6GO6YC.js.map +7 -0
  56. package/bundle/chunk-AZJIODTQ.js +54 -0
  57. package/bundle/chunk-AZJIODTQ.js.map +7 -0
  58. package/bundle/chunk-BHMZ4RCC.js +3706 -0
  59. package/bundle/chunk-BHMZ4RCC.js.map +7 -0
  60. package/bundle/chunk-BQ2L4GMG.js +9175 -0
  61. package/bundle/chunk-BQ2L4GMG.js.map +7 -0
  62. package/bundle/chunk-BSSBCSCL.js +159 -0
  63. package/bundle/chunk-BSSBCSCL.js.map +7 -0
  64. package/bundle/chunk-BUUVFUPO.js +157 -0
  65. package/bundle/chunk-BUUVFUPO.js.map +7 -0
  66. package/bundle/chunk-CEVRHKJY.js +131 -0
  67. package/bundle/chunk-CEVRHKJY.js.map +7 -0
  68. package/bundle/chunk-CWOHNFUV.js +39 -0
  69. package/bundle/chunk-CWOHNFUV.js.map +7 -0
  70. package/bundle/chunk-D2DCBO6M.js +228 -0
  71. package/bundle/chunk-D2DCBO6M.js.map +7 -0
  72. package/bundle/chunk-FMWKEPM7.js +31 -0
  73. package/bundle/chunk-FMWKEPM7.js.map +7 -0
  74. package/bundle/chunk-GRNENTPA.js +145 -0
  75. package/bundle/chunk-GRNENTPA.js.map +7 -0
  76. package/bundle/chunk-GST5T3WZ.js +93 -0
  77. package/bundle/chunk-GST5T3WZ.js.map +7 -0
  78. package/bundle/chunk-GUQVJC3U.js +299 -0
  79. package/bundle/chunk-GUQVJC3U.js.map +7 -0
  80. package/bundle/chunk-HX7Y7EYP.js +3659 -0
  81. package/bundle/chunk-HX7Y7EYP.js.map +7 -0
  82. package/bundle/chunk-JCJS4ZIB.js +296 -0
  83. package/bundle/chunk-JCJS4ZIB.js.map +7 -0
  84. package/bundle/chunk-JW6RU47G.js +184 -0
  85. package/bundle/chunk-JW6RU47G.js.map +7 -0
  86. package/bundle/chunk-LSPKJQCI.js +24 -0
  87. package/bundle/chunk-LSPKJQCI.js.map +7 -0
  88. package/bundle/chunk-M6VBAPNT.js +16 -0
  89. package/bundle/chunk-M6VBAPNT.js.map +7 -0
  90. package/bundle/chunk-MPX525QO.js +129 -0
  91. package/bundle/chunk-MPX525QO.js.map +7 -0
  92. package/bundle/chunk-MW6WDLU7.js +130 -0
  93. package/bundle/chunk-MW6WDLU7.js.map +7 -0
  94. package/bundle/chunk-NT3OBORC.js +215 -0
  95. package/bundle/chunk-NT3OBORC.js.map +7 -0
  96. package/bundle/chunk-NWDBD4PA.js +50 -0
  97. package/bundle/chunk-NWDBD4PA.js.map +7 -0
  98. package/bundle/chunk-OP7BTAWY.js +29 -0
  99. package/bundle/chunk-OP7BTAWY.js.map +7 -0
  100. package/bundle/chunk-PLCY3GFH.js +77 -0
  101. package/bundle/chunk-PLCY3GFH.js.map +7 -0
  102. package/bundle/chunk-PNEDC45Y.js +97 -0
  103. package/bundle/chunk-PNEDC45Y.js.map +7 -0
  104. package/bundle/chunk-QBGBT5QS.js +81 -0
  105. package/bundle/chunk-QBGBT5QS.js.map +7 -0
  106. package/bundle/chunk-RVE2N7FA.js +70 -0
  107. package/bundle/chunk-RVE2N7FA.js.map +7 -0
  108. package/bundle/chunk-TZHIDLDS.js +71910 -0
  109. package/bundle/chunk-TZHIDLDS.js.map +7 -0
  110. package/bundle/chunk-UCQ2WC3B.js +126 -0
  111. package/bundle/chunk-UCQ2WC3B.js.map +7 -0
  112. package/bundle/chunk-UHRP745J.js +214 -0
  113. package/bundle/chunk-UHRP745J.js.map +7 -0
  114. package/bundle/chunk-V76TVMCM.js +58 -0
  115. package/bundle/chunk-V76TVMCM.js.map +7 -0
  116. package/bundle/chunk-VVEDVGCR.js +981 -0
  117. package/bundle/chunk-VVEDVGCR.js.map +7 -0
  118. package/bundle/chunk-W6FAL35D.js +102 -0
  119. package/bundle/chunk-W6FAL35D.js.map +7 -0
  120. package/bundle/chunk-X6TERNVJ.js +15902 -0
  121. package/bundle/chunk-X6TERNVJ.js.map +7 -0
  122. package/bundle/chunk-X76UX47U.js +47 -0
  123. package/bundle/chunk-X76UX47U.js.map +7 -0
  124. package/bundle/chunk-XREWVCUO.js +518 -0
  125. package/bundle/chunk-XREWVCUO.js.map +7 -0
  126. package/bundle/chunk-Y6XAEX2Q.js +408 -0
  127. package/bundle/chunk-Y6XAEX2Q.js.map +7 -0
  128. package/bundle/chunk-YOCTDKKL.js +28 -0
  129. package/bundle/chunk-YOCTDKKL.js.map +7 -0
  130. package/bundle/chunk-ZXPXCDA6.js +160 -0
  131. package/bundle/chunk-ZXPXCDA6.js.map +7 -0
  132. package/bundle/commands-BHVUOU3V.js +31 -0
  133. package/bundle/commands-BHVUOU3V.js.map +7 -0
  134. package/bundle/completion-buffer-P253ONKF.js +13 -0
  135. package/bundle/completion-buffer-P253ONKF.js.map +7 -0
  136. package/bundle/config-RGSDAPZN.js +19 -0
  137. package/bundle/config-RGSDAPZN.js.map +7 -0
  138. package/bundle/config-show-ERTATR6E.js +40 -0
  139. package/bundle/config-show-ERTATR6E.js.map +7 -0
  140. package/bundle/context-HCEGZNDC.js +72 -0
  141. package/bundle/context-HCEGZNDC.js.map +7 -0
  142. package/bundle/delegation-tools-GYTS2D6A.js +27 -0
  143. package/bundle/delegation-tools-GYTS2D6A.js.map +7 -0
  144. package/bundle/deploy-lib-import-32ZFKHWP.js +49 -0
  145. package/bundle/deploy-lib-import-32ZFKHWP.js.map +7 -0
  146. package/bundle/digital-signature-OFCGSHWO.js +13 -0
  147. package/bundle/digital-signature-OFCGSHWO.js.map +7 -0
  148. package/bundle/direct-api-transport-YR7SXXNN.js +860 -0
  149. package/bundle/direct-api-transport-YR7SXXNN.js.map +7 -0
  150. package/bundle/discord-adapter-YYWVMPPU.js +584 -0
  151. package/bundle/discord-adapter-YYWVMPPU.js.map +7 -0
  152. package/bundle/dist-MTMKARCP.js +1969 -0
  153. package/bundle/dist-MTMKARCP.js.map +7 -0
  154. package/bundle/dns-wakeup-27M7D2MR.js +107 -0
  155. package/bundle/dns-wakeup-27M7D2MR.js.map +7 -0
  156. package/bundle/doctor-QNUSDY73.js +248 -0
  157. package/bundle/doctor-QNUSDY73.js.map +7 -0
  158. package/bundle/ensure-invariants-NMXNS476.js +49 -0
  159. package/bundle/ensure-invariants-NMXNS476.js.map +7 -0
  160. package/bundle/env-schema-2KBHBDGN.js +19 -0
  161. package/bundle/env-schema-2KBHBDGN.js.map +7 -0
  162. package/bundle/esm-DDP6NCZG.js +100663 -0
  163. package/bundle/esm-DDP6NCZG.js.map +7 -0
  164. package/bundle/fallback-policy-L4QV2PEJ.js +46 -0
  165. package/bundle/fallback-policy-L4QV2PEJ.js.map +7 -0
  166. package/bundle/health-check-SPA7NT6N.js +56 -0
  167. package/bundle/health-check-SPA7NT6N.js.map +7 -0
  168. package/bundle/hook-system-6Q5YTR53.js +17 -0
  169. package/bundle/hook-system-6Q5YTR53.js.map +7 -0
  170. package/bundle/hotskills-K7BM4YLB.js +12 -0
  171. package/bundle/hotskills-K7BM4YLB.js.map +7 -0
  172. package/bundle/install-6HRZVKUM.js +15 -0
  173. package/bundle/install-6HRZVKUM.js.map +7 -0
  174. package/bundle/install-log-IAPHYKD4.js +28 -0
  175. package/bundle/install-log-IAPHYKD4.js.map +7 -0
  176. package/bundle/install-manifest-SPQRUNXL.js +102 -0
  177. package/bundle/install-manifest-SPQRUNXL.js.map +7 -0
  178. package/bundle/install-validate-PVLZXYLQ.js +53 -0
  179. package/bundle/install-validate-PVLZXYLQ.js.map +7 -0
  180. package/bundle/irc-adapter-OI5UZSQF.js +293 -0
  181. package/bundle/irc-adapter-OI5UZSQF.js.map +7 -0
  182. package/bundle/irc-config-55YO6EGB.js +88 -0
  183. package/bundle/irc-config-55YO6EGB.js.map +7 -0
  184. package/bundle/logs-ZNYXX5PA.js +19 -0
  185. package/bundle/logs-ZNYXX5PA.js.map +7 -0
  186. package/bundle/media-utils-XNNDTYFI.js +4662 -0
  187. package/bundle/media-utils-XNNDTYFI.js.map +7 -0
  188. package/bundle/message-pipeline-LLH5SYMO.js +33 -0
  189. package/bundle/message-pipeline-LLH5SYMO.js.map +7 -0
  190. package/bundle/meta.json +41304 -0
  191. package/bundle/model-health-registry-35LQNVQR.js +11 -0
  192. package/bundle/model-health-registry-35LQNVQR.js.map +7 -0
  193. package/bundle/notification-Y5S5MMLV.js +13 -0
  194. package/bundle/notification-Y5S5MMLV.js.map +7 -0
  195. package/bundle/openrouter-credits-EDY7ETAU.js +32 -0
  196. package/bundle/openrouter-credits-EDY7ETAU.js.map +7 -0
  197. package/bundle/passwd-RRFV4CC5.js +133 -0
  198. package/bundle/passwd-RRFV4CC5.js.map +7 -0
  199. package/bundle/paths-G33RZWZ7.js +17 -0
  200. package/bundle/paths-G33RZWZ7.js.map +7 -0
  201. package/bundle/peer-client-52XYMNI7.js +156 -0
  202. package/bundle/peer-client-52XYMNI7.js.map +7 -0
  203. package/bundle/peer-config-VK6EDLN5.js +16 -0
  204. package/bundle/peer-config-VK6EDLN5.js.map +7 -0
  205. package/bundle/peer-sessions-EAXTNQ36.js +49 -0
  206. package/bundle/peer-sessions-EAXTNQ36.js.map +7 -0
  207. package/bundle/pending-callback-RIMQZ7FJ.js +40 -0
  208. package/bundle/pending-callback-RIMQZ7FJ.js.map +7 -0
  209. package/bundle/phase-transport-KYERDL2O.js +22 -0
  210. package/bundle/phase-transport-KYERDL2O.js.map +7 -0
  211. package/bundle/public/css/dashboard.css +542 -0
  212. package/bundle/public/index.html +180 -0
  213. package/bundle/public/js/app.js +437 -0
  214. package/bundle/public/memory-universe.js +384 -0
  215. package/bundle/responses-adapter-AAQTY3K4.js +30 -0
  216. package/bundle/responses-adapter-AAQTY3K4.js.map +7 -0
  217. package/bundle/restore-ZE3SEPSS.js +46 -0
  218. package/bundle/restore-ZE3SEPSS.js.map +7 -0
  219. package/bundle/self-healer-utils-DMUUXC47.js +43 -0
  220. package/bundle/self-healer-utils-DMUUXC47.js.map +7 -0
  221. package/bundle/skill-stats-LLEXEXLR.js +22 -0
  222. package/bundle/skill-stats-LLEXEXLR.js.map +7 -0
  223. package/bundle/sleep-OYIUOVQD.js +19 -0
  224. package/bundle/sleep-OYIUOVQD.js.map +7 -0
  225. package/bundle/soul-loader-54WCVNLJ.js +16 -0
  226. package/bundle/soul-loader-54WCVNLJ.js.map +7 -0
  227. package/bundle/src-JL4PVO23.js +8 -0
  228. package/bundle/src-JL4PVO23.js.map +7 -0
  229. package/bundle/sse-parser-anthropic-P7CE2MH2.js +72 -0
  230. package/bundle/sse-parser-anthropic-P7CE2MH2.js.map +7 -0
  231. package/bundle/sse-parser-responses-EQQA5FWN.js +63 -0
  232. package/bundle/sse-parser-responses-EQQA5FWN.js.map +7 -0
  233. package/bundle/ssrf-guard-FZCBYIVW.js +64 -0
  234. package/bundle/ssrf-guard-FZCBYIVW.js.map +7 -0
  235. package/bundle/start-FH3GRMJ4.js +35 -0
  236. package/bundle/start-FH3GRMJ4.js.map +7 -0
  237. package/bundle/stream-single-WSG4D53C.js +33 -0
  238. package/bundle/stream-single-WSG4D53C.js.map +7 -0
  239. package/bundle/stt-2UH3RITX.js +14 -0
  240. package/bundle/stt-2UH3RITX.js.map +7 -0
  241. package/bundle/subagent-runtime-LE2ZXH3G.js +12 -0
  242. package/bundle/subagent-runtime-LE2ZXH3G.js.map +7 -0
  243. package/bundle/system-message-T5R3EYYN.js +30 -0
  244. package/bundle/system-message-T5R3EYYN.js.map +7 -0
  245. package/bundle/system-status-KQ6KHFJ6.js +189 -0
  246. package/bundle/system-status-KQ6KHFJ6.js.map +7 -0
  247. package/bundle/task-store-K7CQDEPI.js +22 -0
  248. package/bundle/task-store-K7CQDEPI.js.map +7 -0
  249. package/bundle/telegram-adapter-2V3XUMT5.js +1060 -0
  250. package/bundle/telegram-adapter-2V3XUMT5.js.map +7 -0
  251. package/bundle/tool-registry-MU3OX4UI.js +38 -0
  252. package/bundle/tool-registry-MU3OX4UI.js.map +7 -0
  253. package/bundle/tool-sandbox-VYOK4ZOA.js +20 -0
  254. package/bundle/tool-sandbox-VYOK4ZOA.js.map +7 -0
  255. package/bundle/transport-config-YLXU33RO.js +57 -0
  256. package/bundle/transport-config-YLXU33RO.js.map +7 -0
  257. package/bundle/update-QCW5LXRN.js +13 -0
  258. package/bundle/update-QCW5LXRN.js.map +7 -0
  259. package/bundle/update-check-27KZSAP6.js +12 -0
  260. package/bundle/update-check-27KZSAP6.js.map +7 -0
  261. package/bundle/usage-tracker-OVVEVMOY.js +17 -0
  262. package/bundle/usage-tracker-OVVEVMOY.js.map +7 -0
  263. package/bundle/user-registry-D4SD73UV.js +16 -0
  264. package/bundle/user-registry-D4SD73UV.js.map +7 -0
  265. package/core/professor.json +14 -0
  266. package/core/prompts/browsing_prompt.md +39 -0
  267. package/core/prompts/compaction.md +32 -0
  268. package/core/skills/memory/classification/SKILL.md +37 -0
  269. package/core/skills/memory/memory-anomalies/SKILL.md +39 -0
  270. package/core/skills/memory/memory-search/SKILL.md +48 -0
  271. package/core/skills/memory/topic-save/SKILL.md +44 -0
  272. package/core/skills/ops/cron/SKILL.md +51 -0
  273. package/core/skills/ops/gdrive-backup/SKILL.md +15 -0
  274. package/core/skills/ops/session-start/SKILL.md +11 -0
  275. package/core/skills/ops/skill-authoring/SKILL.md +54 -0
  276. package/core/skills/ops/system-health/SKILL.md +104 -0
  277. package/core/skills/ops/troubleshooting/SKILL.md +48 -0
  278. package/core/skills/ops/trust-gating/SKILL.md +30 -0
  279. package/core/skills/tools/a2a-communication/SKILL.md +68 -0
  280. package/core/skills/tools/browse-delegate/SKILL.md +27 -0
  281. package/core/skills/tools/browser/SKILL.md +36 -0
  282. package/core/skills/tools/clawhub/SKILL.md +44 -0
  283. package/core/skills/tools/delegation/SKILL.md +48 -0
  284. package/core/skills/tools/fxtwitter/SKILL.md +52 -0
  285. package/core/skills/tools/gmail/SKILL.md +44 -0
  286. package/core/skills/tools/irc-chat/SKILL.md +84 -0
  287. package/core/skills/tools/linear/SKILL.md +90 -0
  288. package/core/skills/tools/mcporter/SKILL.md +46 -0
  289. package/core/skills/tools/model-scout/SKILL.md +132 -0
  290. package/core/skills/tools/model-scout/scout-add-model.py +67 -0
  291. package/core/skills/tools/model-scout/scout-ollama.py +116 -0
  292. package/core/skills/tools/model-scout/scout-openrouter.py +85 -0
  293. package/core/skills/tools/nlm/SKILL.md +40 -0
  294. package/core/skills/tools/todo/SKILL.md +30 -0
  295. package/core/skills/tools/twitterX/SKILL.md +52 -0
  296. package/core/skills/tools/twitterX/scripts/abtars-tweet.js +532 -0
  297. package/core/skills/tools/twitterX/scripts/package.json +1 -0
  298. package/core/skills/tools/web-fetch/SKILL.md +29 -0
  299. package/package.json +59 -0
  300. package/scripts/abtars-daemon.service +23 -0
  301. package/scripts/abtars-fetch.sh +42 -0
  302. package/scripts/abtars-watchdog.service +13 -0
  303. package/scripts/abtars.sh +14 -0
  304. package/scripts/abtars@.service +21 -0
  305. package/scripts/browser-patchright.sh +79 -0
  306. package/scripts/com.abtars.daemon.plist +24 -0
  307. package/scripts/com.abtars.watchdog.plist +27 -0
  308. package/scripts/daily-backup.sh +62 -0
  309. package/scripts/doctor.sh +553 -0
  310. package/scripts/hooks/audit-logger.sh +22 -0
  311. package/scripts/upgrade-deps.sh +64 -0
  312. package/scripts/watchdog.sh +309 -0
@@ -0,0 +1,293 @@
1
+ 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);
2
+ import {
3
+ signMessage,
4
+ verifyMessage
5
+ } from "./chunk-CWOHNFUV.js";
6
+ import {
7
+ init_logger,
8
+ logDebug,
9
+ logInfo,
10
+ logWarn
11
+ } from "./chunk-BUUVFUPO.js";
12
+ import "./chunk-X76UX47U.js";
13
+ import "./chunk-NWDBD4PA.js";
14
+
15
+ // src/platforms/irc/irc-client.ts
16
+ init_logger();
17
+ import net from "node:net";
18
+ import tls from "node:tls";
19
+ var TAG = "irc-client";
20
+ function createIrcClient(opts) {
21
+ let socket = null;
22
+ let reconnectTimer = null;
23
+ let reconnectDelay = 5e3;
24
+ let registered = false;
25
+ let stopped = false;
26
+ let sendQueue = [];
27
+ let sendTimer = null;
28
+ let buffer = "";
29
+ let consecutiveFailures = 0;
30
+ const MAX_RETRIES = 5;
31
+ function connect() {
32
+ if (stopped) return;
33
+ registered = false;
34
+ buffer = "";
35
+ const onConnect = () => {
36
+ logInfo(TAG, `Connected to ${opts.host}:${opts.port}`);
37
+ reconnectDelay = 5e3;
38
+ consecutiveFailures = 0;
39
+ raw(`NICK ${opts.nick}`);
40
+ raw(`USER ${opts.nick} 0 * :abtars`);
41
+ };
42
+ if (opts.useTls) {
43
+ socket = tls.connect({ host: opts.host, port: opts.port, rejectUnauthorized: false }, onConnect);
44
+ } else {
45
+ socket = net.createConnection({ host: opts.host, port: opts.port }, onConnect);
46
+ }
47
+ socket.setEncoding("utf-8");
48
+ socket.on("data", onData);
49
+ socket.on("error", (err) => {
50
+ if (reconnectDelay <= 5e3) logWarn(TAG, `Socket error: ${err.message}`);
51
+ else logDebug(TAG, `Socket error (reconnecting): ${err.message}`);
52
+ });
53
+ socket.on("close", () => {
54
+ if (reconnectDelay <= 5e3) logWarn(TAG, `Disconnected from ${opts.host}`);
55
+ opts.onDisconnect?.();
56
+ scheduleReconnect();
57
+ });
58
+ }
59
+ function scheduleReconnect() {
60
+ if (stopped) return;
61
+ consecutiveFailures++;
62
+ if (consecutiveFailures >= MAX_RETRIES) {
63
+ logWarn(TAG, `IRC unavailable \u2014 giving up after ${MAX_RETRIES} attempts. Restart bridge to retry.`);
64
+ stopped = true;
65
+ return;
66
+ }
67
+ reconnectTimer = setTimeout(() => {
68
+ if (reconnectDelay <= 1e4) logInfo(TAG, `Reconnecting to ${opts.host}:${opts.port}...`);
69
+ else logDebug(TAG, `Reconnecting to ${opts.host}:${opts.port} (delay=${Math.round(reconnectDelay / 1e3)}s)...`);
70
+ connect();
71
+ }, reconnectDelay);
72
+ reconnectDelay = Math.min(reconnectDelay * 2, 3e5);
73
+ }
74
+ function raw(line) {
75
+ socket?.write(line + "\r\n");
76
+ }
77
+ function onData(chunk) {
78
+ buffer += chunk;
79
+ const lines = buffer.split("\r\n");
80
+ buffer = lines.pop();
81
+ for (const line of lines) {
82
+ if (line) handleLine(line);
83
+ }
84
+ }
85
+ function handleLine(line) {
86
+ if (line.startsWith("PING")) {
87
+ raw("PONG" + line.slice(4));
88
+ return;
89
+ }
90
+ const parts = line.split(" ");
91
+ const code = parts[1];
92
+ if (code === "001" && !registered) {
93
+ registered = true;
94
+ if (opts.nickservPassword) {
95
+ raw(`PRIVMSG NickServ :IDENTIFY ${opts.nickservPassword}`);
96
+ setTimeout(joinChannels, 2e3);
97
+ } else {
98
+ joinChannels();
99
+ }
100
+ return;
101
+ }
102
+ if (code === "PRIVMSG") {
103
+ const prefix = parts[0].slice(1);
104
+ const sender = prefix.split("!")[0];
105
+ const target = parts[2];
106
+ const textStart = line.indexOf(":", line.indexOf("PRIVMSG") + 8);
107
+ const text = textStart >= 0 ? line.slice(textStart + 1) : "";
108
+ opts.onPrivmsg(sender, target, text, prefix);
109
+ return;
110
+ }
111
+ }
112
+ function joinChannels() {
113
+ for (const ch of opts.channels) {
114
+ raw(`JOIN ${ch}`);
115
+ }
116
+ logInfo(TAG, `Joined: ${opts.channels.join(", ")}`);
117
+ opts.onReady?.();
118
+ }
119
+ function flushQueue() {
120
+ if (sendQueue.length === 0) {
121
+ sendTimer = null;
122
+ return;
123
+ }
124
+ const msg = sendQueue.shift();
125
+ raw(msg);
126
+ sendTimer = setTimeout(flushQueue, 1e3);
127
+ }
128
+ function sendPrivmsg(target, text) {
129
+ const line = `PRIVMSG ${target} :${text}`;
130
+ sendQueue.push(line);
131
+ if (!sendTimer) {
132
+ sendTimer = setTimeout(flushQueue, 0);
133
+ }
134
+ }
135
+ connect();
136
+ return {
137
+ nick: opts.nick,
138
+ send: sendPrivmsg,
139
+ quit(reason) {
140
+ stopped = true;
141
+ if (reconnectTimer) clearTimeout(reconnectTimer);
142
+ if (sendTimer) clearTimeout(sendTimer);
143
+ raw(`QUIT :${reason ?? "bye"}`);
144
+ setTimeout(() => socket?.destroy(), 1e3);
145
+ }
146
+ };
147
+ }
148
+
149
+ // src/platforms/irc/irc-adapter.ts
150
+ init_logger();
151
+ var TAG2 = "irc";
152
+ var MAX_LINE_PLAIN = 450;
153
+ var MAX_LINE_SECURE = 340;
154
+ var IrcAdapter = class {
155
+ name = "irc";
156
+ capabilities = { voice: false, reactions: false, edit: false, typing: false, threads: false };
157
+ supportsStreaming = false;
158
+ clients = [];
159
+ config;
160
+ deps;
161
+ constructor(config, deps) {
162
+ this.config = config;
163
+ this.deps = deps;
164
+ }
165
+ async start() {
166
+ for (const server of this.config.servers) {
167
+ const channels = Object.keys(server.channels);
168
+ const client = createIrcClient({
169
+ host: server.host,
170
+ port: server.port,
171
+ useTls: server.tls,
172
+ nick: server.nick,
173
+ nickservPassword: server.nickservPassword,
174
+ channels,
175
+ onPrivmsg: (sender, target, text, hostmask) => this.handlePrivmsg(server, client, sender, target, text, hostmask),
176
+ onReady: () => logInfo(TAG2, `[${server.id}] ready`)
177
+ });
178
+ this.clients.push(client);
179
+ }
180
+ }
181
+ stop() {
182
+ for (const c of this.clients) c.quit();
183
+ this.clients = [];
184
+ }
185
+ authorize(_msg) {
186
+ return true;
187
+ }
188
+ async sendMessage(channelId, text, _opts) {
189
+ const [serverId, channel] = channelId.split(":", 2);
190
+ const client = this.clients.find((_, i) => this.config.servers[i]?.id === serverId);
191
+ if (!client || !channel) return void 0;
192
+ const server = this.config.servers.find((s) => s.id === serverId);
193
+ const channelConfig = server?.channels[channel];
194
+ const isSigned = channelConfig?.mode === "signed";
195
+ const maxLine = isSigned ? MAX_LINE_SECURE : MAX_LINE_PLAIN;
196
+ const lines = this.chunkText(text, maxLine);
197
+ for (const line of lines) {
198
+ this.recentOutgoing.add(line);
199
+ setTimeout(() => this.recentOutgoing.delete(line), 3e4);
200
+ if (isSigned && this.config.identity?.privateKey) {
201
+ const { tag } = signMessage(this.config.identity.privateKey, server.nick, channel, line);
202
+ client.send(channel, `${line} ${tag}`);
203
+ } else {
204
+ client.send(channel, line);
205
+ }
206
+ }
207
+ return void 0;
208
+ }
209
+ chunkResponse(text) {
210
+ return this.chunkText(text, MAX_LINE_PLAIN);
211
+ }
212
+ chunkText(text, maxLen) {
213
+ const result = [];
214
+ for (const paragraph of text.split("\n")) {
215
+ if (paragraph.length <= maxLen) {
216
+ if (paragraph.trim()) result.push(paragraph);
217
+ } else {
218
+ let remaining = paragraph;
219
+ while (remaining.length > maxLen) {
220
+ let cut = remaining.lastIndexOf(" ", maxLen);
221
+ if (cut <= 0) cut = maxLen;
222
+ result.push(remaining.slice(0, cut));
223
+ remaining = remaining.slice(cut).trimStart();
224
+ }
225
+ if (remaining.trim()) result.push(remaining);
226
+ }
227
+ }
228
+ return result;
229
+ }
230
+ recentOutgoing = /* @__PURE__ */ new Set();
231
+ handlePrivmsg(server, _client, sender, target, text, hostmask) {
232
+ if (sender.toLowerCase() === server.nick.toLowerCase()) return;
233
+ if (this.recentOutgoing.has(text)) return;
234
+ if (/\[NO-REPLY\]/i.test(text)) return;
235
+ if (!target.startsWith("#")) return;
236
+ const channelConfig = server.channels[target];
237
+ if (!channelConfig) {
238
+ logDebug(TAG2, `[${server.id}] Ignoring message in unconfigured channel ${target}`);
239
+ return;
240
+ }
241
+ if (channelConfig.mode === "signed") {
242
+ const allowed = channelConfig.allowUnsigned?.some(
243
+ (pattern) => hostmask.startsWith(pattern) || sender === pattern
244
+ );
245
+ if (allowed) {
246
+ logDebug(TAG2, `[${server.id}] Unsigned pass for ${hostmask}`);
247
+ } else {
248
+ const pubkey = channelConfig.trustedKeys[sender];
249
+ if (!pubkey) {
250
+ logDebug(TAG2, `[${server.id}] Dropped from ${sender} \u2014 no trusted key`);
251
+ return;
252
+ }
253
+ const result = verifyMessage(pubkey, sender, target, text);
254
+ if (!result.valid) {
255
+ logWarn(TAG2, `[${server.id}] Signature failed from ${sender}: ${result.reason}`);
256
+ return;
257
+ }
258
+ text = result.text;
259
+ }
260
+ } else {
261
+ if (channelConfig.allowFrom.length > 0 && !channelConfig.allowFrom.includes(sender)) {
262
+ logDebug(TAG2, `[${server.id}] Dropped from ${sender} (not in allowFrom)`);
263
+ return;
264
+ }
265
+ }
266
+ if (channelConfig.requireMention) {
267
+ const nickPattern = new RegExp(`\\b${escapeRegex(server.nick)}\\b[:,]?`, "i");
268
+ if (!nickPattern.test(text)) return;
269
+ text = text.replace(nickPattern, "").trim();
270
+ }
271
+ if (!text) return;
272
+ const channelId = `${server.id}:${target}`;
273
+ const msg = {
274
+ platform: "irc",
275
+ channelId,
276
+ userId: sender,
277
+ senderId: sender,
278
+ senderName: sender,
279
+ text,
280
+ timestamp: Date.now(),
281
+ isGroup: true,
282
+ isVoice: false
283
+ };
284
+ this.deps.onMessage(msg);
285
+ }
286
+ };
287
+ function escapeRegex(s) {
288
+ return s.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
289
+ }
290
+ export {
291
+ IrcAdapter
292
+ };
293
+ //# sourceMappingURL=irc-adapter-OI5UZSQF.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/platforms/irc/irc-client.ts", "../src/platforms/irc/irc-adapter.ts"],
4
+ "sourcesContent": ["import net from \"node:net\";\nimport tls from \"node:tls\";\nimport { logInfo, logWarn, logDebug } from \"../../components/logger.js\";\n\nconst TAG = \"irc-client\";\n\nexport interface IrcClientOptions {\n host: string;\n port: number;\n useTls: boolean;\n nick: string;\n nickservPassword?: string;\n channels: string[];\n onPrivmsg: (sender: string, target: string, text: string, hostmask: string) => void;\n onReady?: () => void;\n onDisconnect?: () => void;\n}\n\nexport interface IrcClient {\n send: (target: string, text: string) => void;\n quit: (reason?: string) => void;\n readonly nick: string;\n}\n\nexport function createIrcClient(opts: IrcClientOptions): IrcClient {\n let socket: net.Socket | null = null;\n let reconnectTimer: NodeJS.Timeout | null = null;\n let reconnectDelay = 5000;\n let registered = false;\n let stopped = false;\n let sendQueue: string[] = [];\n let sendTimer: NodeJS.Timeout | null = null;\n let buffer = \"\";\n let consecutiveFailures = 0;\n const MAX_RETRIES = 5;\n\n function connect(): void {\n if (stopped) return;\n registered = false;\n buffer = \"\";\n\n const onConnect = (): void => {\n logInfo(TAG, `Connected to ${opts.host}:${opts.port}`);\n reconnectDelay = 5000;\n consecutiveFailures = 0;\n raw(`NICK ${opts.nick}`);\n raw(`USER ${opts.nick} 0 * :abtars`);\n };\n\n if (opts.useTls) {\n socket = tls.connect({ host: opts.host, port: opts.port, rejectUnauthorized: false }, onConnect);\n } else {\n socket = net.createConnection({ host: opts.host, port: opts.port }, onConnect);\n }\n\n socket.setEncoding(\"utf-8\");\n socket.on(\"data\", onData);\n socket.on(\"error\", (err) => {\n if (reconnectDelay <= 5000) logWarn(TAG, `Socket error: ${err.message}`);\n else logDebug(TAG, `Socket error (reconnecting): ${err.message}`);\n });\n socket.on(\"close\", () => {\n if (reconnectDelay <= 5000) logWarn(TAG, `Disconnected from ${opts.host}`);\n opts.onDisconnect?.();\n scheduleReconnect();\n });\n }\n\n function scheduleReconnect(): void {\n if (stopped) return;\n consecutiveFailures++;\n if (consecutiveFailures >= MAX_RETRIES) {\n logWarn(TAG, `IRC unavailable \u2014 giving up after ${MAX_RETRIES} attempts. Restart bridge to retry.`);\n stopped = true;\n return;\n }\n reconnectTimer = setTimeout(() => {\n if (reconnectDelay <= 10000) logInfo(TAG, `Reconnecting to ${opts.host}:${opts.port}...`);\n else logDebug(TAG, `Reconnecting to ${opts.host}:${opts.port} (delay=${Math.round(reconnectDelay/1000)}s)...`);\n connect();\n }, reconnectDelay);\n reconnectDelay = Math.min(reconnectDelay * 2, 300000);\n }\n\n function raw(line: string): void {\n socket?.write(line + \"\\r\\n\");\n }\n\n function onData(chunk: string): void {\n buffer += chunk;\n const lines = buffer.split(\"\\r\\n\");\n buffer = lines.pop()!;\n for (const line of lines) {\n if (line) handleLine(line);\n }\n }\n\n function handleLine(line: string): void {\n if (line.startsWith(\"PING\")) {\n raw(\"PONG\" + line.slice(4));\n return;\n }\n\n const parts = line.split(\" \");\n const code = parts[1];\n\n // 001 RPL_WELCOME \u2014 registration complete\n if (code === \"001\" && !registered) {\n registered = true;\n if (opts.nickservPassword) {\n raw(`PRIVMSG NickServ :IDENTIFY ${opts.nickservPassword}`);\n // Join after short delay to let NickServ process\n setTimeout(joinChannels, 2000);\n } else {\n joinChannels();\n }\n return;\n }\n\n // PRIVMSG\n if (code === \"PRIVMSG\") {\n const prefix = parts[0]!.slice(1); // remove leading ':'\n const sender = prefix.split(\"!\")[0]!;\n const target = parts[2]!;\n const textStart = line.indexOf(\":\", line.indexOf(\"PRIVMSG\") + 8);\n const text = textStart >= 0 ? line.slice(textStart + 1) : \"\";\n opts.onPrivmsg(sender, target, text, prefix);\n return;\n }\n }\n\n function joinChannels(): void {\n for (const ch of opts.channels) {\n raw(`JOIN ${ch}`);\n }\n logInfo(TAG, `Joined: ${opts.channels.join(\", \")}`);\n opts.onReady?.();\n }\n\n // Rate-limited send: 1 msg/sec\n function flushQueue(): void {\n if (sendQueue.length === 0) {\n sendTimer = null;\n return;\n }\n const msg = sendQueue.shift()!;\n raw(msg);\n sendTimer = setTimeout(flushQueue, 1000);\n }\n\n function sendPrivmsg(target: string, text: string): void {\n const line = `PRIVMSG ${target} :${text}`;\n sendQueue.push(line);\n if (!sendTimer) {\n sendTimer = setTimeout(flushQueue, 0);\n }\n }\n\n connect();\n\n return {\n nick: opts.nick,\n send: sendPrivmsg,\n quit(reason?: string): void {\n stopped = true;\n if (reconnectTimer) clearTimeout(reconnectTimer);\n if (sendTimer) clearTimeout(sendTimer);\n raw(`QUIT :${reason ?? \"bye\"}`);\n setTimeout(() => socket?.destroy(), 1000);\n },\n };\n}\n", "import type { PlatformAdapter, InboundMessage, SendOpts } from \"../../types/platform.js\";\nimport type { IrcConfig, IrcServerConfig } from \"./irc-config.js\";\nimport { createIrcClient, type IrcClient } from \"./irc-client.js\";\nimport { signMessage, verifyMessage } from \"../../components/digital-signature.js\";\nimport { logInfo, logDebug, logWarn } from \"../../components/logger.js\";\n\nconst TAG = \"irc\";\nconst MAX_LINE_PLAIN = 450;\nconst MAX_LINE_SECURE = 340; // leave room for [sig:ts:base64] suffix\n\nexport interface IrcAdapterDeps {\n onMessage: (msg: InboundMessage) => void;\n}\n\nexport class IrcAdapter implements PlatformAdapter {\n readonly name = \"irc\" as const;\n readonly capabilities = { voice: false, reactions: false, edit: false, typing: false, threads: false };\n readonly supportsStreaming = false;\n\n private clients: IrcClient[] = [];\n private config: IrcConfig;\n private deps: IrcAdapterDeps;\n\n constructor(config: IrcConfig, deps: IrcAdapterDeps) {\n this.config = config;\n this.deps = deps;\n }\n\n async start(): Promise<void> {\n for (const server of this.config.servers) {\n const channels = Object.keys(server.channels);\n const client = createIrcClient({\n host: server.host,\n port: server.port,\n useTls: server.tls,\n nick: server.nick,\n nickservPassword: server.nickservPassword,\n channels,\n onPrivmsg: (sender, target, text, hostmask) => this.handlePrivmsg(server, client, sender, target, text, hostmask),\n onReady: () => logInfo(TAG, `[${server.id}] ready`),\n });\n this.clients.push(client);\n }\n }\n\n stop(): void {\n for (const c of this.clients) c.quit();\n this.clients = [];\n }\n\n authorize(_msg: InboundMessage): boolean {\n return true; // Authorization handled in handlePrivmsg\n }\n\n async sendMessage(channelId: string, text: string, _opts?: SendOpts): Promise<number | undefined> {\n const [serverId, channel] = channelId.split(\":\", 2);\n const client = this.clients.find((_, i) => this.config.servers[i]?.id === serverId);\n if (!client || !channel) return undefined;\n\n const server = this.config.servers.find(s => s.id === serverId);\n const channelConfig = server?.channels[channel];\n const isSigned = channelConfig?.mode === \"signed\";\n const maxLine = isSigned ? MAX_LINE_SECURE : MAX_LINE_PLAIN;\n\n const lines = this.chunkText(text, maxLine);\n for (const line of lines) {\n // Track outgoing for dedup (#420)\n this.recentOutgoing.add(line);\n setTimeout(() => this.recentOutgoing.delete(line), 30_000);\n\n if (isSigned && this.config.identity?.privateKey) {\n const { tag } = signMessage(this.config.identity.privateKey, server!.nick, channel, line);\n client.send(channel, `${line} ${tag}`);\n } else {\n client.send(channel, line);\n }\n }\n return undefined;\n }\n\n chunkResponse(text: string): string[] {\n return this.chunkText(text, MAX_LINE_PLAIN);\n }\n\n private chunkText(text: string, maxLen: number): string[] {\n const result: string[] = [];\n for (const paragraph of text.split(\"\\n\")) {\n if (paragraph.length <= maxLen) {\n if (paragraph.trim()) result.push(paragraph);\n } else {\n let remaining = paragraph;\n while (remaining.length > maxLen) {\n let cut = remaining.lastIndexOf(\" \", maxLen);\n if (cut <= 0) cut = maxLen;\n result.push(remaining.slice(0, cut));\n remaining = remaining.slice(cut).trimStart();\n }\n if (remaining.trim()) result.push(remaining);\n }\n }\n return result;\n }\n\n private recentOutgoing = new Set<string>();\n\n private handlePrivmsg(server: IrcServerConfig, _client: IrcClient, sender: string, target: string, text: string, hostmask: string): void {\n // Self-echo filter \u2014 case-insensitive (#420)\n if (sender.toLowerCase() === server.nick.toLowerCase()) return;\n\n // Content dedup \u2014 catch echoed messages regardless of sender nick (#420)\n if (this.recentOutgoing.has(text)) return;\n\n // [NO_REPLY] filter \u2014 other agent signaled no response needed (#421)\n if (/\\[NO-REPLY\\]/i.test(text)) return;\n\n // Only handle channel messages\n if (!target.startsWith(\"#\")) return;\n\n const channelConfig = server.channels[target];\n if (!channelConfig) {\n logDebug(TAG, `[${server.id}] Ignoring message in unconfigured channel ${target}`);\n return;\n }\n\n if (channelConfig.mode === \"signed\") {\n // Allow specific hostmasks/nicks to bypass signature (humans)\n const allowed = channelConfig.allowUnsigned?.some(pattern =>\n hostmask.startsWith(pattern) || sender === pattern\n );\n if (allowed) {\n logDebug(TAG, `[${server.id}] Unsigned pass for ${hostmask}`);\n } else {\n const pubkey = channelConfig.trustedKeys[sender];\n if (!pubkey) {\n logDebug(TAG, `[${server.id}] Dropped from ${sender} \u2014 no trusted key`);\n return;\n }\n const result = verifyMessage(pubkey, sender, target, text);\n if (!result.valid) {\n logWarn(TAG, `[${server.id}] Signature failed from ${sender}: ${result.reason}`);\n return;\n }\n text = result.text;\n }\n } else {\n // Plain mode: sender allowlist\n if (channelConfig.allowFrom.length > 0 && !channelConfig.allowFrom.includes(sender)) {\n logDebug(TAG, `[${server.id}] Dropped from ${sender} (not in allowFrom)`);\n return;\n }\n }\n\n // Mention gating\n if (channelConfig.requireMention) {\n const nickPattern = new RegExp(`\\\\b${escapeRegex(server.nick)}\\\\b[:,]?`, \"i\");\n if (!nickPattern.test(text)) return;\n text = text.replace(nickPattern, \"\").trim();\n }\n\n if (!text) return;\n\n const channelId = `${server.id}:${target}`;\n const msg: InboundMessage = {\n platform: \"irc\",\n channelId,\n userId: sender,\n senderId: sender,\n senderName: sender,\n text,\n timestamp: Date.now(),\n isGroup: true,\n isVoice: false,\n };\n\n this.deps.onMessage(msg);\n }\n}\n\nfunction escapeRegex(s: string): string {\n return s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TAG"]
7
+ }
@@ -0,0 +1,88 @@
1
+ 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);
2
+ import {
3
+ IRC_SCHEMA,
4
+ init_config_validator,
5
+ validateShape
6
+ } from "./chunk-2UPU3OW6.js";
7
+ import {
8
+ init_log_and_swallow,
9
+ logAndSwallow
10
+ } from "./chunk-FMWKEPM7.js";
11
+ import {
12
+ init_logger,
13
+ logWarn
14
+ } from "./chunk-BUUVFUPO.js";
15
+ import {
16
+ abtarsHome,
17
+ init_paths
18
+ } from "./chunk-X76UX47U.js";
19
+ import "./chunk-NWDBD4PA.js";
20
+
21
+ // src/platforms/irc/irc-config.ts
22
+ init_paths();
23
+ init_logger();
24
+ init_log_and_swallow();
25
+ init_config_validator();
26
+ import { readFileSync } from "node:fs";
27
+ import { join } from "node:path";
28
+ var TAG = "irc_config";
29
+ function loadIrcConfig() {
30
+ const path = join(abtarsHome(), "config", "irc.json");
31
+ let raw;
32
+ try {
33
+ raw = readFileSync(path, "utf-8");
34
+ } catch (err) {
35
+ logAndSwallow(TAG, "read irc.json", err);
36
+ return null;
37
+ }
38
+ let parsed;
39
+ try {
40
+ parsed = JSON.parse(raw);
41
+ } catch (err) {
42
+ logWarn("irc-config", `Invalid JSON in irc.json: ${err instanceof Error ? err.message : String(err)}`);
43
+ return null;
44
+ }
45
+ if (!parsed?.servers?.length) return null;
46
+ validateShape(parsed, IRC_SCHEMA, "irc.json");
47
+ const identity = parsed.identity ? {
48
+ privateKey: resolveSecret(parsed.identity.privateKey) ?? "",
49
+ publicKey: parsed.identity.publicKey ?? ""
50
+ } : void 0;
51
+ const servers = [];
52
+ for (const s of parsed.servers) {
53
+ if (!s.host || !s.nick || !s.channels) {
54
+ logWarn("irc", `Skipping server "${s.id ?? "?"}" \u2014 missing host/nick/channels`);
55
+ continue;
56
+ }
57
+ const channels = {};
58
+ for (const [name, cfg] of Object.entries(s.channels)) {
59
+ const mode = cfg.mode === "signed" ? "signed" : "plain";
60
+ channels[name] = {
61
+ mode,
62
+ requireMention: cfg.requireMention !== false,
63
+ allowFrom: Array.isArray(cfg.allowFrom) ? cfg.allowFrom : [],
64
+ allowUnsigned: Array.isArray(cfg.allowUnsigned) ? cfg.allowUnsigned : [],
65
+ trustedKeys: mode === "signed" && cfg.trustedKeys && typeof cfg.trustedKeys === "object" ? cfg.trustedKeys : {}
66
+ };
67
+ }
68
+ servers.push({
69
+ id: s.id ?? s.host,
70
+ host: s.host,
71
+ port: s.port ?? (s.tls ? 6697 : 6667),
72
+ tls: s.tls ?? false,
73
+ nick: s.nick,
74
+ nickservPassword: resolveSecret(s.nickservPassword),
75
+ channels
76
+ });
77
+ }
78
+ return servers.length > 0 ? { identity, servers } : null;
79
+ }
80
+ function resolveSecret(val) {
81
+ if (!val) return void 0;
82
+ if (val.startsWith("$")) return process.env[val.slice(1)] ?? void 0;
83
+ return val;
84
+ }
85
+ export {
86
+ loadIrcConfig
87
+ };
88
+ //# sourceMappingURL=irc-config-55YO6EGB.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/platforms/irc/irc-config.ts"],
4
+ "sourcesContent": ["import { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logWarn } from \"../../components/logger.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { validateShape, IRC_SCHEMA } from \"../../components/config-validator.js\";\n\nconst TAG = \"irc_config\";\n\nexport interface IrcChannelConfig {\n mode: \"plain\" | \"signed\";\n requireMention: boolean;\n allowFrom: string[]; // used in plain mode\n allowUnsigned: string[]; // nicks that bypass signature in signed mode (humans)\n trustedKeys: Record<string, string>; // used in signed mode: nick \u2192 base64 pubkey\n}\n\nexport interface IrcServerConfig {\n id: string;\n host: string;\n port: number;\n tls: boolean;\n nick: string;\n nickservPassword?: string;\n channels: Record<string, IrcChannelConfig>;\n}\n\nexport interface IrcIdentity {\n privateKey: string; // base64 DER Ed25519\n publicKey: string; // base64 DER Ed25519\n}\n\nexport interface IrcConfig {\n identity?: IrcIdentity;\n servers: IrcServerConfig[];\n}\n\nexport function loadIrcConfig(): IrcConfig | null {\n const path = join(abtarsHome(), \"config\", \"irc.json\");\n let raw: string;\n try { raw = readFileSync(path, \"utf-8\"); } catch (err) { logAndSwallow(TAG, \"read irc.json\", err); return null; }\n let parsed: any;\n try { parsed = JSON.parse(raw); } catch (err) {\n logWarn(\"irc-config\", `Invalid JSON in irc.json: ${err instanceof Error ? err.message : String(err)}`);\n return null;\n }\n if (!parsed?.servers?.length) return null;\n validateShape(parsed, IRC_SCHEMA, \"irc.json\");\n\n const identity: IrcIdentity | undefined = parsed.identity ? {\n privateKey: resolveSecret(parsed.identity.privateKey) ?? \"\",\n publicKey: parsed.identity.publicKey ?? \"\",\n } : undefined;\n\n const servers: IrcServerConfig[] = [];\n for (const s of parsed.servers) {\n if (!s.host || !s.nick || !s.channels) {\n logWarn(\"irc\", `Skipping server \"${s.id ?? \"?\"}\" \u2014 missing host/nick/channels`);\n continue;\n }\n const channels: Record<string, IrcChannelConfig> = {};\n for (const [name, cfg] of Object.entries(s.channels as Record<string, any>)) {\n const mode = cfg.mode === \"signed\" ? \"signed\" : \"plain\";\n channels[name] = {\n mode,\n requireMention: cfg.requireMention !== false,\n allowFrom: Array.isArray(cfg.allowFrom) ? cfg.allowFrom : [],\n allowUnsigned: Array.isArray(cfg.allowUnsigned) ? cfg.allowUnsigned : [],\n trustedKeys: (mode === \"signed\" && cfg.trustedKeys && typeof cfg.trustedKeys === \"object\") ? cfg.trustedKeys : {},\n };\n }\n servers.push({\n id: s.id ?? s.host,\n host: s.host,\n port: s.port ?? (s.tls ? 6697 : 6667),\n tls: s.tls ?? false,\n nick: s.nick,\n nickservPassword: resolveSecret(s.nickservPassword),\n channels,\n });\n }\n return servers.length > 0 ? { identity, servers } : null;\n}\n\nfunction resolveSecret(val: string | undefined): string | undefined {\n if (!val) return undefined;\n if (val.startsWith(\"$\")) return process.env[val.slice(1)] ?? undefined;\n return val;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;;;;AAEA;AACA;AACA;AACA;AALA,SAAS,oBAAoB;AAC7B,SAAS,YAAY;AAMrB,IAAM,MAAM;AA8BL,SAAS,gBAAkC;AAChD,QAAM,OAAO,KAAK,WAAW,GAAG,UAAU,UAAU;AACpD,MAAI;AACJ,MAAI;AAAE,UAAM,aAAa,MAAM,OAAO;AAAA,EAAG,SAAS,KAAK;AAAE,kBAAc,KAAK,iBAAiB,GAAG;AAAG,WAAO;AAAA,EAAM;AAChH,MAAI;AACJ,MAAI;AAAE,aAAS,KAAK,MAAM,GAAG;AAAA,EAAG,SAAS,KAAK;AAC5C,YAAQ,cAAc,6BAA6B,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACrG,WAAO;AAAA,EACT;AACA,MAAI,CAAC,QAAQ,SAAS,OAAQ,QAAO;AACrC,gBAAc,QAAQ,YAAY,UAAU;AAE5C,QAAM,WAAoC,OAAO,WAAW;AAAA,IAC1D,YAAY,cAAc,OAAO,SAAS,UAAU,KAAK;AAAA,IACzD,WAAW,OAAO,SAAS,aAAa;AAAA,EAC1C,IAAI;AAEJ,QAAM,UAA6B,CAAC;AACpC,aAAW,KAAK,OAAO,SAAS;AAC9B,QAAI,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,EAAE,UAAU;AACrC,cAAQ,OAAO,oBAAoB,EAAE,MAAM,GAAG,qCAAgC;AAC9E;AAAA,IACF;AACA,UAAM,WAA6C,CAAC;AACpD,eAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,EAAE,QAA+B,GAAG;AAC3E,YAAM,OAAO,IAAI,SAAS,WAAW,WAAW;AAChD,eAAS,IAAI,IAAI;AAAA,QACf;AAAA,QACA,gBAAgB,IAAI,mBAAmB;AAAA,QACvC,WAAW,MAAM,QAAQ,IAAI,SAAS,IAAI,IAAI,YAAY,CAAC;AAAA,QAC3D,eAAe,MAAM,QAAQ,IAAI,aAAa,IAAI,IAAI,gBAAgB,CAAC;AAAA,QACvE,aAAc,SAAS,YAAY,IAAI,eAAe,OAAO,IAAI,gBAAgB,WAAY,IAAI,cAAc,CAAC;AAAA,MAClH;AAAA,IACF;AACA,YAAQ,KAAK;AAAA,MACX,IAAI,EAAE,MAAM,EAAE;AAAA,MACd,MAAM,EAAE;AAAA,MACR,MAAM,EAAE,SAAS,EAAE,MAAM,OAAO;AAAA,MAChC,KAAK,EAAE,OAAO;AAAA,MACd,MAAM,EAAE;AAAA,MACR,kBAAkB,cAAc,EAAE,gBAAgB;AAAA,MAClD;AAAA,IACF,CAAC;AAAA,EACH;AACA,SAAO,QAAQ,SAAS,IAAI,EAAE,UAAU,QAAQ,IAAI;AACtD;AAEA,SAAS,cAAc,KAA6C;AAClE,MAAI,CAAC,IAAK,QAAO;AACjB,MAAI,IAAI,WAAW,GAAG,EAAG,QAAO,QAAQ,IAAI,IAAI,MAAM,CAAC,CAAC,KAAK;AAC7D,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,19 @@
1
+ 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);
2
+ import "./chunk-NWDBD4PA.js";
3
+
4
+ // src/cli/commands/logs.ts
5
+ import { spawn } from "node:child_process";
6
+ import { join } from "node:path";
7
+ function abtarsHome() {
8
+ return process.env["ABTARS_HOME"] ?? join(process.env["HOME"] ?? "", ".abtars");
9
+ }
10
+ async function logs() {
11
+ const date = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10);
12
+ const logFile = join(abtarsHome(), "logs", `bridge-${date}.log`);
13
+ const child = spawn("tail", ["-f", "-n", "50", logFile], { stdio: "inherit" });
14
+ return new Promise((resolve) => child.on("close", (code) => resolve(code ?? 0)));
15
+ }
16
+ export {
17
+ logs
18
+ };
19
+ //# sourceMappingURL=logs-ZNYXX5PA.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli/commands/logs.ts"],
4
+ "sourcesContent": ["import { spawn } from \"node:child_process\";\nimport { join } from \"node:path\";\n\nfunction abtarsHome(): string {\n return process.env[\"ABTARS_HOME\"] ?? join(process.env[\"HOME\"] ?? \"\", \".abtars\");\n}\n\nexport async function logs(): Promise<number> {\n const date = new Date().toISOString().slice(0, 10);\n const logFile = join(abtarsHome(), \"logs\", `bridge-${date}.log`);\n const child = spawn(\"tail\", [\"-f\", \"-n\", \"50\", logFile], { stdio: \"inherit\" });\n return new Promise((resolve) => child.on(\"close\", (code) => resolve(code ?? 0)));\n}\n"],
5
+ "mappings": ";;;;AAAA,SAAS,aAAa;AACtB,SAAS,YAAY;AAErB,SAAS,aAAqB;AAC5B,SAAO,QAAQ,IAAI,aAAa,KAAK,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,SAAS;AAChF;AAEA,eAAsB,OAAwB;AAC5C,QAAM,QAAO,oBAAI,KAAK,GAAE,YAAY,EAAE,MAAM,GAAG,EAAE;AACjD,QAAM,UAAU,KAAK,WAAW,GAAG,QAAQ,UAAU,IAAI,MAAM;AAC/D,QAAM,QAAQ,MAAM,QAAQ,CAAC,MAAM,MAAM,MAAM,OAAO,GAAG,EAAE,OAAO,UAAU,CAAC;AAC7E,SAAO,IAAI,QAAQ,CAAC,YAAY,MAAM,GAAG,SAAS,CAAC,SAAS,QAAQ,QAAQ,CAAC,CAAC,CAAC;AACjF;",
6
+ "names": []
7
+ }