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,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/capabilities/capability.ts"],
4
+ "sourcesContent": ["import { getEnv } from \"../components/env-schema.js\";\nimport { logError } from \"../components/logger.js\";\nimport { logAndSwallow } from \"../components/log-and-swallow.js\";\n\nconst TAG = \"capabilities\";\n/**\n * Capability system \u2014 typed registration API for bridge subsystems.\n *\n * Each capability is a self-contained module that registers commands,\n * heartbeat tasks, and services via a constrained CapabilityApi.\n * The bridge wires registered items into the appropriate subsystems.\n */\n\nimport type { HeartbeatTask } from \"abmind\";\nimport type { Config } from \"../types/config.js\";\nimport type { IMemorySystem } from \"abmind\";\nimport type { IKiroTransport } from \"../components/transport/kiro-transport.js\";\nimport type { SubagentRuntime } from \"../components/subagent-runtime.js\";\nimport type { CommandContext } from \"../components/commands/types.js\";\n\n/** Handler for a slash command registered by a capability. */\nexport type CapabilityCommandHandler = (text: string, ctx: CommandContext) => Promise<boolean>;\n\n/** Service with start/stop lifecycle. */\nexport interface CapabilityService {\n start(): Promise<void>;\n stop(): void;\n}\n\n/** Factory that creates a service instance. */\nexport type CapabilityServiceFactory = () => Promise<CapabilityService>;\n\n/** Read-only API given to each capability during registration. */\nexport interface CapabilityApi {\n readonly config: Config;\n readonly memory: IMemorySystem | null;\n readonly transport: IKiroTransport;\n readonly runtime: SubagentRuntime;\n readonly sessionManager: { getActiveSessionId(userId: string, platform: string): string };\n readonly sendSystemMessage?: (prompt: string) => Promise<void>;\n registerCommand(name: string, handler: CapabilityCommandHandler): void;\n registerHeartbeatTask(task: HeartbeatTask): void;\n registerService(name: string, factory: CapabilityServiceFactory): void;\n}\n\n/** A capability module exports a register function with this signature. */\nexport type CapabilityRegisterFn = (api: CapabilityApi) => void;\n\n/** Collected registrations from all capabilities. */\nexport interface CapabilityRegistry {\n commands: Map<string, CapabilityCommandHandler>;\n heartbeatTasks: HeartbeatTask[];\n services: Map<string, CapabilityServiceFactory>;\n}\n\n/** Create an empty registry. */\nexport function createCapabilityRegistry(): CapabilityRegistry {\n return {\n commands: new Map(),\n heartbeatTasks: [],\n services: new Map(),\n };\n}\n\n/** Create a CapabilityApi that collects registrations into the given registry. */\nexport function createCapabilityApi(\n registry: CapabilityRegistry,\n config: Config,\n memory: IMemorySystem | null,\n transport: IKiroTransport,\n runtime: SubagentRuntime,\n sessionManager?: { getActiveSessionId(userId: string, platform: string): string },\n sendSystemMessage?: (prompt: string) => Promise<void>,\n): CapabilityApi {\n return {\n config,\n memory,\n transport,\n runtime,\n sessionManager: sessionManager ?? { getActiveSessionId: () => \"master:telegram\" },\n sendSystemMessage,\n registerCommand(name, handler) { registry.commands.set(name, handler); },\n registerHeartbeatTask(task) { registry.heartbeatTasks.push(task); },\n registerService(name, factory) { registry.services.set(name, factory); },\n };\n}\n\n/** Discover and register capabilities with capability.json manifests. */\nexport async function discoverCapabilities(\n registry: CapabilityRegistry,\n config: Config,\n memory: IMemorySystem | null,\n transport: IKiroTransport,\n runtime: SubagentRuntime,\n capabilitiesDir: string,\n): Promise<string[]> {\n const { readdirSync, existsSync, readFileSync } = await import(\"node:fs\");\n const { join } = await import(\"node:path\");\n\n const disabled = new Set(\n getEnv().disabledCapabilities.split(\",\").map(s => s.trim()).filter(Boolean),\n );\n\n const loaded: string[] = [];\n let dirs: string[];\n try { dirs = readdirSync(capabilitiesDir, { withFileTypes: true }).filter(d => d.isDirectory()).map(d => d.name); }\n catch (err) { logAndSwallow(TAG, \"readdirSync capabilities\", err); return loaded; }\n\n for (const dir of dirs) {\n const manifestPath = join(capabilitiesDir, dir, \"capability.json\");\n if (!existsSync(manifestPath)) continue; // no manifest = core capability, skip\n\n let manifest: { name: string; description?: string };\n try { manifest = JSON.parse(readFileSync(manifestPath, \"utf-8\")); }\n catch (err) { logAndSwallow(TAG, \"JSON.parse capability manifest\", err); continue; }\n\n if (disabled.has(manifest.name)) continue;\n\n try {\n const mod = await import(join(capabilitiesDir, dir, \"index.js\"));\n const api = createCapabilityApi(registry, config, memory, transport, runtime);\n mod.register(api);\n loaded.push(manifest.name);\n } catch (err) { logError(\"capabilities\", `Failed to load capability \"${manifest.name}\": ${err instanceof Error ? err.message : String(err)}`); }\n }\n\n return loaded;\n}\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;AAAA;AACA;AACA;AAEA,IAAM,MAAM;AAoDL,SAAS,2BAA+C;AAC7D,SAAO;AAAA,IACL,UAAU,oBAAI,IAAI;AAAA,IAClB,gBAAgB,CAAC;AAAA,IACjB,UAAU,oBAAI,IAAI;AAAA,EACpB;AACF;AAGO,SAAS,oBACd,UACA,QACA,QACA,WACA,SACA,gBACA,mBACe;AACf,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB,kBAAkB,EAAE,oBAAoB,MAAM,kBAAkB;AAAA,IAChF;AAAA,IACA,gBAAgB,MAAM,SAAS;AAAE,eAAS,SAAS,IAAI,MAAM,OAAO;AAAA,IAAG;AAAA,IACvE,sBAAsB,MAAM;AAAE,eAAS,eAAe,KAAK,IAAI;AAAA,IAAG;AAAA,IAClE,gBAAgB,MAAM,SAAS;AAAE,eAAS,SAAS,IAAI,MAAM,OAAO;AAAA,IAAG;AAAA,EACzE;AACF;AAGA,eAAsB,qBACpB,UACA,QACA,QACA,WACA,SACA,iBACmB;AACnB,QAAM,EAAE,aAAa,YAAY,aAAa,IAAI,MAAM,OAAO,SAAS;AACxE,QAAM,EAAE,KAAK,IAAI,MAAM,OAAO,WAAW;AAEzC,QAAM,WAAW,IAAI;AAAA,IACnB,OAAO,EAAE,qBAAqB,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,EAC5E;AAEA,QAAM,SAAmB,CAAC;AAC1B,MAAI;AACJ,MAAI;AAAE,WAAO,YAAY,iBAAiB,EAAE,eAAe,KAAK,CAAC,EAAE,OAAO,OAAK,EAAE,YAAY,CAAC,EAAE,IAAI,OAAK,EAAE,IAAI;AAAA,EAAG,SAC3G,KAAK;AAAE,kBAAc,KAAK,4BAA4B,GAAG;AAAG,WAAO;AAAA,EAAQ;AAElF,aAAW,OAAO,MAAM;AACtB,UAAM,eAAe,KAAK,iBAAiB,KAAK,iBAAiB;AACjE,QAAI,CAAC,WAAW,YAAY,EAAG;AAE/B,QAAI;AACJ,QAAI;AAAE,iBAAW,KAAK,MAAM,aAAa,cAAc,OAAO,CAAC;AAAA,IAAG,SAC3D,KAAK;AAAE,oBAAc,KAAK,kCAAkC,GAAG;AAAG;AAAA,IAAU;AAEnF,QAAI,SAAS,IAAI,SAAS,IAAI,EAAG;AAEjC,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,KAAK,iBAAiB,KAAK,UAAU;AAC9D,YAAM,MAAM,oBAAoB,UAAU,QAAQ,QAAQ,WAAW,OAAO;AAC5E,UAAI,SAAS,GAAG;AAChB,aAAO,KAAK,SAAS,IAAI;AAAA,IAC3B,SAAS,KAAK;AAAE,eAAS,gBAAgB,8BAA8B,SAAS,IAAI,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AAAA,IAAG;AAAA,EACjJ;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,206 @@
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
+ appendReminder,
4
+ localDate,
5
+ require_main
6
+ } from "./chunk-6CPN4IGS.js";
7
+ import {
8
+ init_log_and_swallow,
9
+ logAndSwallow
10
+ } from "./chunk-FMWKEPM7.js";
11
+ import {
12
+ init_logger,
13
+ logInfo,
14
+ logWarn
15
+ } from "./chunk-BUUVFUPO.js";
16
+ import {
17
+ abtarsHome,
18
+ init_paths
19
+ } from "./chunk-X76UX47U.js";
20
+ import {
21
+ __toESM
22
+ } from "./chunk-NWDBD4PA.js";
23
+
24
+ // src/capabilities/browser/browse-delivery.ts
25
+ init_paths();
26
+ init_logger();
27
+ import { writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "node:fs";
28
+ import { join as join2 } from "node:path";
29
+
30
+ // src/capabilities/browser/abtars-browse.ts
31
+ init_paths();
32
+ init_log_and_swallow();
33
+ var import_dotenv = __toESM(require_main(), 1);
34
+ import { readFileSync, writeFileSync, existsSync, mkdirSync } from "node:fs";
35
+ import { join } from "node:path";
36
+ import { randomBytes } from "node:crypto";
37
+ var TAG = "browse";
38
+ function parseArgs(argv) {
39
+ const args = argv.slice(2);
40
+ const parsed = { dryRun: false };
41
+ for (let i = 0; i < args.length; i++) {
42
+ switch (args[i]) {
43
+ case "--task":
44
+ parsed.task = args[++i] ?? "";
45
+ break;
46
+ case "--chat-id":
47
+ parsed.chatId = args[++i] ?? "";
48
+ break;
49
+ case "--thread-id":
50
+ parsed.threadId = args[++i] ?? "";
51
+ break;
52
+ case "--timeout":
53
+ parsed.timeout = args[++i] ?? "";
54
+ break;
55
+ case "--engine":
56
+ parsed.engine = args[++i] ?? "";
57
+ break;
58
+ case "--dry-run":
59
+ parsed.dryRun = true;
60
+ break;
61
+ }
62
+ }
63
+ return parsed;
64
+ }
65
+ function validateArgs(args) {
66
+ if (!args.task) return { ok: false, error: "--task is required" };
67
+ if (!args.chatId) return { ok: false, error: "--chat-id is required" };
68
+ const chatId = parseInt(args.chatId, 10);
69
+ if (!Number.isFinite(chatId)) return { ok: false, error: "invalid --chat-id" };
70
+ const threadId = args.threadId ? parseInt(args.threadId, 10) : void 0;
71
+ const timeoutMs = args.timeout ? parseInt(args.timeout, 10) * 1e3 : 5 * 60 * 1e3;
72
+ if (!Number.isFinite(timeoutMs)) return { ok: false, error: "invalid --timeout" };
73
+ const task = args.task.length > 2e3 ? args.task.slice(0, 2e3) + "\u2026" : args.task;
74
+ return { ok: true, task, chatId, threadId, timeoutMs };
75
+ }
76
+ function loadBrowsePrompt(task, _chatId, taskId) {
77
+ const path = join(abtarsHome(), "prompts", "browsing_prompt.md");
78
+ if (!existsSync(path)) {
79
+ throw new Error(`browsing_prompt.md not found at ${path}`);
80
+ }
81
+ const template = readFileSync(path, "utf-8");
82
+ const date = localDate();
83
+ const reportFile = `browse_${taskId ?? "unknown"}_${date}.md`;
84
+ const vars = {
85
+ TASK: task,
86
+ TASK_ID: taskId ?? "unknown",
87
+ DATE: date,
88
+ REPORT_FILE: reportFile
89
+ };
90
+ let result = template;
91
+ for (const [key, value] of Object.entries(vars)) {
92
+ result = result.replaceAll(`\${${key}}`, value);
93
+ }
94
+ return result;
95
+ }
96
+ var pendingPath = () => join(abtarsHome(), "workspace", "browse", "pending_browse.json");
97
+ function readPendingBrowse() {
98
+ const p = pendingPath();
99
+ if (!existsSync(p)) return [];
100
+ try {
101
+ return JSON.parse(readFileSync(p, "utf-8"));
102
+ } catch (err) {
103
+ logAndSwallow(TAG, "readPendingBrowse", err);
104
+ return [];
105
+ }
106
+ }
107
+ function writePendingBrowse(entries) {
108
+ const dir = join(abtarsHome(), "workspace", "browse");
109
+ mkdirSync(dir, { recursive: true });
110
+ writeFileSync(pendingPath(), JSON.stringify(entries, null, 2), "utf-8");
111
+ }
112
+ async function main(argv = process.argv) {
113
+ if (argv.includes("--help")) {
114
+ console.log(`abtars-browse \u2014 delegate a browser task to the Browsie agent.
115
+
116
+ Usage:
117
+ abtars-browse --task "check X notifications" --chat-id ID
118
+ abtars-browse --task "research topic" --chat-id ID --timeout 600
119
+ abtars-browse --task "research topic" --chat-id ID --dry-run`);
120
+ process.exit(0);
121
+ }
122
+ (0, import_dotenv.config)({ path: join(abtarsHome(), ".env") });
123
+ const raw = parseArgs(argv);
124
+ const validation = validateArgs(raw);
125
+ if (!validation.ok) {
126
+ console.log(JSON.stringify({ ok: false, error: validation.error }));
127
+ process.exit(1);
128
+ }
129
+ const { task, chatId, threadId, timeoutMs } = validation;
130
+ const taskId = randomBytes(3).toString("hex");
131
+ if (raw.dryRun) {
132
+ const prompt2 = loadBrowsePrompt(task, chatId, taskId);
133
+ process.stdout.write(prompt2 + "\n");
134
+ return;
135
+ }
136
+ mkdirSync(join(abtarsHome(), "subagents"), { recursive: true });
137
+ const prompt = loadBrowsePrompt(task, chatId, taskId);
138
+ const spawnSocket = join(abtarsHome(), "browse-spawn.sock");
139
+ const net = await import("node:net");
140
+ const result = await new Promise((resolve, reject) => {
141
+ const conn = net.createConnection(spawnSocket);
142
+ conn.on("connect", () => {
143
+ conn.write(JSON.stringify({ taskId, task, prompt, chatId, threadId, timeoutMs }) + "\n");
144
+ });
145
+ let buf = "";
146
+ conn.on("data", (chunk) => {
147
+ buf += chunk.toString();
148
+ const nl = buf.indexOf("\n");
149
+ if (nl === -1) return;
150
+ conn.end();
151
+ try {
152
+ resolve(JSON.parse(buf.slice(0, nl)));
153
+ } catch (e) {
154
+ reject(e);
155
+ }
156
+ });
157
+ conn.on("error", reject);
158
+ conn.setTimeout(1e4, () => {
159
+ conn.destroy();
160
+ reject(new Error("IPC timeout"));
161
+ });
162
+ });
163
+ console.log(JSON.stringify(result));
164
+ }
165
+ var isDirectRun = process.argv[1]?.endsWith("abtars-browse.ts") || process.argv[1]?.endsWith("abtars-browse.js");
166
+ if (isDirectRun) main();
167
+
168
+ // src/capabilities/browser/browse-delivery.ts
169
+ var TAG2 = "browse-delivery";
170
+ var subagentsDir = () => join2(abtarsHome(), "subagents");
171
+ function deliverBrowseResult(entry, result) {
172
+ const dir = subagentsDir();
173
+ mkdirSync2(dir, { recursive: true });
174
+ const date = localDate();
175
+ const reportPath = join2(dir, `browse_${entry.taskId}_${date}.md`);
176
+ writeFileSync2(reportPath, result || "(no output captured)", "utf-8");
177
+ const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + "\u2026" : entry.task;
178
+ const msg = `\u{1F310} Browse task complete: ${taskLabel}
179
+ Report: ${reportPath}`;
180
+ appendReminder({ chatId: entry.chatId, message: msg, createdAt: Date.now(), threadId: entry.threadId });
181
+ logInfo(TAG2, `\u{1F310} Browse "${taskLabel}" finished \u2014 ${reportPath}`);
182
+ }
183
+ function checkBrowseTasks() {
184
+ const entries = readPendingBrowse();
185
+ if (entries.length === 0) return;
186
+ const now = Date.now();
187
+ const remaining = [];
188
+ for (const entry of entries) {
189
+ const elapsed = now - entry.startedAt;
190
+ if (elapsed > entry.timeoutMs + 6e4) {
191
+ const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + "\u2026" : entry.task;
192
+ logWarn(TAG2, `Removing stale browse entry: ${taskLabel} (${Math.round(elapsed / 1e3)}s old)`);
193
+ } else {
194
+ remaining.push(entry);
195
+ }
196
+ }
197
+ if (remaining.length !== entries.length) writePendingBrowse(remaining);
198
+ }
199
+
200
+ export {
201
+ readPendingBrowse,
202
+ writePendingBrowse,
203
+ deliverBrowseResult,
204
+ checkBrowseTasks
205
+ };
206
+ //# sourceMappingURL=chunk-6SETMHNN.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/capabilities/browser/browse-delivery.ts", "../src/capabilities/browser/abtars-browse.ts"],
4
+ "sourcesContent": ["/**\n * Browse task delivery \u2014 write report + notify user via reminder.\n * Called from runtime.spawn() onComplete/onError callbacks.\n */\n\nimport { writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logInfo, logWarn } from \"../../components/logger.js\";\nimport { localDate } from \"../../utils/date.js\";\nimport { appendReminder } from \"../../components/tasks/task-checker.js\";\nimport { readPendingBrowse, writePendingBrowse } from \"./abtars-browse.js\";\nimport type { PendingBrowseEntry } from \"./abtars-browse.js\";\n\nconst TAG = \"browse-delivery\";\n\nconst subagentsDir = (): string => join(abtarsHome(), \"subagents\");\n\n/** Deliver result for a browse task. Called by runtime.spawn() callback. */\nexport function deliverBrowseResult(entry: PendingBrowseEntry, result: string): void {\n const dir = subagentsDir();\n mkdirSync(dir, { recursive: true });\n const date = localDate();\n const reportPath = join(dir, `browse_${entry.taskId}_${date}.md`);\n writeFileSync(reportPath, result || \"(no output captured)\", \"utf-8\");\n\n const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + \"\u2026\" : entry.task;\n const msg = `\uD83C\uDF10 Browse task complete: ${taskLabel}\\nReport: ${reportPath}`;\n appendReminder({ chatId: entry.chatId, message: msg, createdAt: Date.now(), threadId: entry.threadId });\n logInfo(TAG, `\uD83C\uDF10 Browse \"${taskLabel}\" finished \u2014 ${reportPath}`);\n}\n\n/** Safety net: check for stale pending entries (runtime handles timeouts, this catches orphans). */\nexport function checkBrowseTasks(): void {\n const entries = readPendingBrowse();\n if (entries.length === 0) return;\n\n const now = Date.now();\n const remaining: PendingBrowseEntry[] = [];\n\n for (const entry of entries) {\n const elapsed = now - entry.startedAt;\n if (elapsed > entry.timeoutMs + 60_000) {\n // Stale entry \u2014 runtime should have cleaned up, remove orphan\n const taskLabel = entry.task.length > 200 ? entry.task.slice(0, 200) + \"\u2026\" : entry.task;\n logWarn(TAG, `Removing stale browse entry: ${taskLabel} (${Math.round(elapsed / 1000)}s old)`);\n } else {\n remaining.push(entry);\n }\n }\n\n if (remaining.length !== entries.length) writePendingBrowse(remaining);\n}\n", "#!/usr/bin/env node\n/**\n * abtars-browse \u2014 spawn a browser subagent for autonomous web tasks.\n *\n * Usage:\n * abtars-browse --task \"check X notifications\" --chat-id 7773842843\n * abtars-browse --task \"post on FB\" --chat-id 123 --timeout 600\n * abtars-browse --task \"research topic\" --chat-id 123 --dry-run\n *\n * Returns immediately. The subagent runs detached and results are delivered\n * via pending_reminders.json \u2192 bridge picks up \u2192 sends to chat.\n */\nimport { readFileSync, writeFileSync, existsSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../../paths.js\";\nimport { logAndSwallow } from \"../../components/log-and-swallow.js\";\n\nconst TAG = \"browse\";\nimport { randomBytes } from \"node:crypto\";\nimport { config as loadDotenv } from \"dotenv\";\nimport { localDate } from \"../../utils/date.js\";\n\n// --- Types ---\n\nexport interface BrowseArgs {\n task?: string;\n chatId?: string;\n threadId?: string;\n timeout?: string;\n engine?: string;\n dryRun: boolean;\n}\n\nexport interface PendingBrowseEntry {\n taskId: string;\n task: string;\n chatId: number;\n threadId?: number;\n pid: number;\n startedAt: number;\n timeoutMs: number;\n logFile: string;\n}\n\n// --- Arg parsing ---\n\nexport function parseArgs(argv: string[]): BrowseArgs {\n const args = argv.slice(2);\n const parsed: BrowseArgs = { dryRun: false };\n for (let i = 0; i < args.length; i++) {\n switch (args[i]) {\n case \"--task\": parsed.task = args[++i] ?? \"\"; break;\n case \"--chat-id\": parsed.chatId = args[++i] ?? \"\"; break;\n case \"--thread-id\": parsed.threadId = args[++i] ?? \"\"; break;\n case \"--timeout\": parsed.timeout = args[++i] ?? \"\"; break;\n case \"--engine\": parsed.engine = args[++i] ?? \"\"; break;\n case \"--dry-run\": parsed.dryRun = true; break;\n }\n }\n return parsed;\n}\n\nexport function validateArgs(args: BrowseArgs): { ok: true; task: string; chatId: number; threadId?: number; timeoutMs: number } | { ok: false; error: string } {\n if (!args.task) return { ok: false, error: \"--task is required\" };\n if (!args.chatId) return { ok: false, error: \"--chat-id is required\" };\n const chatId = parseInt(args.chatId, 10);\n if (!Number.isFinite(chatId)) return { ok: false, error: \"invalid --chat-id\" };\n const threadId = args.threadId ? parseInt(args.threadId, 10) : undefined;\n const timeoutMs = args.timeout ? parseInt(args.timeout, 10) * 1000 : 5 * 60 * 1000;\n if (!Number.isFinite(timeoutMs)) return { ok: false, error: \"invalid --timeout\" };\n const task = args.task.length > 2000 ? args.task.slice(0, 2000) + \"\u2026\" : args.task;\n return { ok: true, task, chatId, threadId, timeoutMs };\n}\n\n// --- Prompt loading ---\n\nexport function loadBrowsePrompt(task: string, _chatId: number, taskId?: string): string {\n const path = join(abtarsHome(), \"prompts\", \"browsing_prompt.md\");\n\n if (!existsSync(path)) {\n throw new Error(`browsing_prompt.md not found at ${path}`);\n }\n const template = readFileSync(path, \"utf-8\");\n\n const date = localDate();\n const reportFile = `browse_${taskId ?? \"unknown\"}_${date}.md`;\n\n const vars: Record<string, string> = {\n TASK: task,\n TASK_ID: taskId ?? \"unknown\",\n DATE: date,\n REPORT_FILE: reportFile,\n };\n\n let result = template;\n for (const [key, value] of Object.entries(vars)) {\n result = result.replaceAll(`\\${${key}}`, value);\n }\n return result;\n}\n\n// --- Pending browse file ---\n\nconst pendingPath = (): string => join(abtarsHome(), \"workspace\", \"browse\", \"pending_browse.json\");\n\nexport function readPendingBrowse(): PendingBrowseEntry[] {\n const p = pendingPath();\n if (!existsSync(p)) return [];\n try { return JSON.parse(readFileSync(p, \"utf-8\")) as PendingBrowseEntry[]; }\n catch (err) { logAndSwallow(TAG, \"readPendingBrowse\", err); return []; }\n}\n\nexport function writePendingBrowse(entries: PendingBrowseEntry[]): void {\n const dir = join(abtarsHome(), \"workspace\", \"browse\");\n mkdirSync(dir, { recursive: true });\n writeFileSync(pendingPath(), JSON.stringify(entries, null, 2), \"utf-8\");\n}\n\n// --- Main ---\n\nexport async function main(argv: string[] = process.argv): Promise<void> {\n if (argv.includes(\"--help\")) {\n console.log(`abtars-browse \u2014 delegate a browser task to the Browsie agent.\n\nUsage:\n abtars-browse --task \"check X notifications\" --chat-id ID\n abtars-browse --task \"research topic\" --chat-id ID --timeout 600\n abtars-browse --task \"research topic\" --chat-id ID --dry-run`);\n process.exit(0);\n }\n\n loadDotenv({ path: join(abtarsHome(), \".env\") });\n const raw = parseArgs(argv);\n const validation = validateArgs(raw);\n\n if (!validation.ok) {\n console.log(JSON.stringify({ ok: false, error: validation.error }));\n process.exit(1);\n }\n\n const { task, chatId, threadId, timeoutMs } = validation;\n const taskId = randomBytes(3).toString(\"hex\");\n\n // Dry-run: print prompt and exit\n if (raw.dryRun) {\n const prompt = loadBrowsePrompt(task, chatId, taskId);\n process.stdout.write(prompt + \"\\n\");\n return;\n }\n\n mkdirSync(join(abtarsHome(), \"subagents\"), { recursive: true });\n\n const prompt = loadBrowsePrompt(task, chatId, taskId);\n\n // Send spawn request to bridge via IPC\n const spawnSocket = join(abtarsHome(), \"browse-spawn.sock\");\n const net = await import(\"node:net\");\n const result = await new Promise<{ ok: boolean; taskId?: string; error?: string }>((resolve, reject) => {\n const conn = net.createConnection(spawnSocket);\n conn.on(\"connect\", () => {\n conn.write(JSON.stringify({ taskId, task, prompt, chatId, threadId, timeoutMs }) + \"\\n\");\n });\n let buf = \"\";\n conn.on(\"data\", (chunk) => {\n buf += chunk.toString();\n const nl = buf.indexOf(\"\\n\");\n if (nl === -1) return;\n conn.end();\n try { resolve(JSON.parse(buf.slice(0, nl))); } catch (e) { reject(e); }\n });\n conn.on(\"error\", reject);\n conn.setTimeout(10_000, () => { conn.destroy(); reject(new Error(\"IPC timeout\")); });\n });\n\n console.log(JSON.stringify(result));\n}\n\nconst isDirectRun = process.argv[1]?.endsWith(\"abtars-browse.ts\") ||\n process.argv[1]?.endsWith(\"abtars-browse.js\");\nif (isDirectRun) main();\n"],
5
+ "mappings": "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",
6
+ "names": ["writeFileSync", "mkdirSync", "join", "loadDotenv", "prompt", "TAG", "join", "mkdirSync", "writeFileSync"]
7
+ }