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,24 @@
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
+
3
+ // src/components/completion-buffer.ts
4
+ var buffer = /* @__PURE__ */ new Map();
5
+ function addCompletion(entry) {
6
+ const list = buffer.get(entry.motherId) ?? [];
7
+ list.push(entry);
8
+ buffer.set(entry.motherId, list);
9
+ }
10
+ function drainCompletions(motherId) {
11
+ const entries = buffer.get(motherId) ?? [];
12
+ buffer.delete(motherId);
13
+ return entries;
14
+ }
15
+ function hasCompletions(motherId) {
16
+ return (buffer.get(motherId)?.length ?? 0) > 0;
17
+ }
18
+
19
+ export {
20
+ addCompletion,
21
+ drainCompletions,
22
+ hasCompletions
23
+ };
24
+ //# sourceMappingURL=chunk-LSPKJQCI.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/completion-buffer.ts"],
4
+ "sourcesContent": ["/**\n * completion-buffer.ts \u2014 Stores results from background sessions (#570).\n * Parent sessions check this buffer before each prompt to inject auto-notify.\n */\n\nexport interface CompletionEntry {\n sessionId: string;\n motherId: string;\n goal: string;\n status: \"done\" | \"failed\" | \"terminated\" | \"timeout\";\n result: string;\n elapsedMs: number;\n inputTokens: number;\n outputTokens: number;\n}\n\nconst buffer = new Map<string, CompletionEntry[]>(); // key = motherId\n\nexport function addCompletion(entry: CompletionEntry): void {\n const list = buffer.get(entry.motherId) ?? [];\n list.push(entry);\n buffer.set(entry.motherId, list);\n}\n\n/** Drain all completions for a parent session (consumed once on next prompt). */\nexport function drainCompletions(motherId: string): CompletionEntry[] {\n const entries = buffer.get(motherId) ?? [];\n buffer.delete(motherId);\n return entries;\n}\n\n/** Check if there are pending completions for a parent. */\nexport function hasCompletions(motherId: string): boolean {\n return (buffer.get(motherId)?.length ?? 0) > 0;\n}\n"],
5
+ "mappings": ";;;AAgBA,IAAM,SAAS,oBAAI,IAA+B;AAE3C,SAAS,cAAc,OAA8B;AAC1D,QAAM,OAAO,OAAO,IAAI,MAAM,QAAQ,KAAK,CAAC;AAC5C,OAAK,KAAK,KAAK;AACf,SAAO,IAAI,MAAM,UAAU,IAAI;AACjC;AAGO,SAAS,iBAAiB,UAAqC;AACpE,QAAM,UAAU,OAAO,IAAI,QAAQ,KAAK,CAAC;AACzC,SAAO,OAAO,QAAQ;AACtB,SAAO;AACT;AAGO,SAAS,eAAe,UAA2B;AACxD,UAAQ,OAAO,IAAI,QAAQ,GAAG,UAAU,KAAK;AAC/C;",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
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
+
3
+ // src/utils/local-time.ts
4
+ var pad = (n) => String(n).padStart(2, "0");
5
+ function localISO(d = /* @__PURE__ */ new Date()) {
6
+ return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;
7
+ }
8
+ function localTime(d = /* @__PURE__ */ new Date()) {
9
+ return `${pad(d.getHours())}:${pad(d.getMinutes())}`;
10
+ }
11
+
12
+ export {
13
+ localISO,
14
+ localTime
15
+ };
16
+ //# sourceMappingURL=chunk-M6VBAPNT.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/utils/local-time.ts"],
4
+ "sourcesContent": ["/** Local time formatting \u2014 system timezone, no UTC. */\n\nconst pad = (n: number): string => String(n).padStart(2, \"0\");\n\n/** YYYY-MM-DDTHH:MM:SS (local) \u2014 drop-in replacement for toISOString() */\nexport function localISO(d: Date = new Date()): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`;\n}\n\n/** YYYY-MM-DD HH:MM (local) */\nexport function localDateTime(d: Date = new Date()): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\n/** HH:MM (local) */\nexport function localTime(d: Date = new Date()): string {\n return `${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\n/** YYYY-MM-DD (local) */\nexport function localDate(d: Date = new Date()): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\n/** YYYY-MM (local) */\nexport function localMonth(d: Date = new Date()): string {\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}`;\n}\n"],
5
+ "mappings": ";;;AAEA,IAAM,MAAM,CAAC,MAAsB,OAAO,CAAC,EAAE,SAAS,GAAG,GAAG;AAGrD,SAAS,SAAS,IAAU,oBAAI,KAAK,GAAW;AACrD,SAAO,GAAG,EAAE,YAAY,CAAC,IAAI,IAAI,EAAE,SAAS,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;AAC3I;AAQO,SAAS,UAAU,IAAU,oBAAI,KAAK,GAAW;AACtD,SAAO,GAAG,IAAI,EAAE,SAAS,CAAC,CAAC,IAAI,IAAI,EAAE,WAAW,CAAC,CAAC;AACpD;",
6
+ "names": []
7
+ }
@@ -0,0 +1,129 @@
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
+ init_log_and_swallow,
4
+ logAndSwallow
5
+ } from "./chunk-FMWKEPM7.js";
6
+ import {
7
+ abtarsHome,
8
+ init_paths
9
+ } from "./chunk-X76UX47U.js";
10
+
11
+ // src/components/tool-sandbox.ts
12
+ init_paths();
13
+ init_log_and_swallow();
14
+ import { resolve } from "node:path";
15
+ import { realpathSync } from "node:fs";
16
+ import { homedir } from "node:os";
17
+ import { appendFileSync, mkdirSync } from "node:fs";
18
+ import { createHash } from "node:crypto";
19
+ import { join } from "node:path";
20
+ var PATH_BLACKLIST = [
21
+ resolve(abtarsHome(), "config"),
22
+ resolve(abtarsHome(), "secret"),
23
+ resolve(homedir(), ".abmind")
24
+ ];
25
+ var AUDIT_DIR = join(abtarsHome(), "logs");
26
+ var AUDIT_PATH = join(AUDIT_DIR, "audit.jsonl");
27
+ try {
28
+ mkdirSync(AUDIT_DIR, { recursive: true });
29
+ } catch (err) {
30
+ logAndSwallow("tool-sandbox", "mkdirSync", err);
31
+ }
32
+ function checkTool(name, policy) {
33
+ if (policy.allowedTools.length === 1 && policy.allowedTools[0] === "*") return { allowed: true };
34
+ if (policy.allowedTools.length === 0) return { allowed: false, reason: `Tool '${name}' not available in this session` };
35
+ if (name === "execute_bash" && !policy.canExecuteBash) return { allowed: false, reason: `Tool '${name}' not available in this session` };
36
+ if (policy.allowedTools.includes(name)) return { allowed: true };
37
+ return { allowed: false, reason: `Tool '${name}' not available in this session` };
38
+ }
39
+ function checkPath(filePath, mode, policy) {
40
+ const expanded = filePath.replace(/^~/, homedir());
41
+ const normalized = resolve(expanded);
42
+ let abs;
43
+ try {
44
+ abs = realpathSync(normalized);
45
+ } catch {
46
+ abs = normalized;
47
+ }
48
+ const list = mode === "read" ? policy.allowedRead : policy.allowedWrite;
49
+ if (list.length === 1 && list[0] === "*") return { allowed: true };
50
+ for (const blocked of PATH_BLACKLIST) {
51
+ if (abs === blocked || abs.startsWith(blocked + "/")) {
52
+ return { allowed: false, reason: `Path '${filePath}' is restricted` };
53
+ }
54
+ }
55
+ if (list.length === 0) return { allowed: false, reason: `No ${mode} access in this session` };
56
+ for (const prefix of list) {
57
+ const absPrefix = resolve(prefix.replace(/^~/, homedir()));
58
+ if (abs === absPrefix || abs.startsWith(absPrefix + "/")) return { allowed: true };
59
+ }
60
+ return { allowed: false, reason: `Path '${filePath}' not in allowed ${mode} paths` };
61
+ }
62
+ function buildPolicy(source, config) {
63
+ let base;
64
+ switch (source) {
65
+ case "owner":
66
+ base = { allowedTools: ["*"], allowedRead: ["*"], allowedWrite: ["*"], canExecuteBash: true };
67
+ break;
68
+ case "peer":
69
+ base = { allowedTools: [], allowedRead: [], allowedWrite: [], canExecuteBash: false };
70
+ break;
71
+ case "guest":
72
+ base = { allowedTools: ["web_fetch"], allowedRead: [], allowedWrite: [], canExecuteBash: false };
73
+ break;
74
+ }
75
+ if (config) base = { ...base, ...config };
76
+ return Object.freeze(base);
77
+ }
78
+ function auditDeny(tool, path, policy, reason) {
79
+ const entry = { ts: Date.now(), event: "sandbox_deny", tool, path, policy, reason };
80
+ try {
81
+ appendFileSync(AUDIT_PATH, JSON.stringify(entry) + "\n");
82
+ } catch (err) {
83
+ logAndSwallow("tool-sandbox", "audit write", err);
84
+ }
85
+ }
86
+ var IDEMPOTENT_TOOLS = /* @__PURE__ */ new Set(["file_read", "web_fetch", "web_browse", "memory_recall"]);
87
+ function argsHash(name, args) {
88
+ return createHash("sha256").update(name + JSON.stringify(args)).digest("hex");
89
+ }
90
+ var ToolLoopGuard = class {
91
+ failCounts = /* @__PURE__ */ new Map();
92
+ resultCounts = /* @__PURE__ */ new Map();
93
+ beforeCall(name, args) {
94
+ const hash = argsHash(name, args);
95
+ const fails = this.failCounts.get(hash) ?? 0;
96
+ if (fails >= 4) return { allowed: false, reason: `Tool '${name}' blocked: repeated identical failure (${fails} times)` };
97
+ if (IDEMPOTENT_TOOLS.has(name)) {
98
+ const repeats = this.resultCounts.get(hash) ?? 0;
99
+ if (repeats >= 4) return { allowed: false, reason: `Tool '${name}' blocked: same result returned ${repeats} times \u2014 stuck loop` };
100
+ }
101
+ return { allowed: true };
102
+ }
103
+ afterCall(name, args, _result, failed) {
104
+ const hash = argsHash(name, args);
105
+ if (failed) {
106
+ const count = (this.failCounts.get(hash) ?? 0) + 1;
107
+ this.failCounts.set(hash, count);
108
+ if (count === 2) return "This tool call failed twice with identical arguments. Consider changing your approach.";
109
+ } else if (IDEMPOTENT_TOOLS.has(name)) {
110
+ const count = (this.resultCounts.get(hash) ?? 0) + 1;
111
+ this.resultCounts.set(hash, count);
112
+ if (count === 2) return "Same result returned twice for identical query. Use the result or change the query.";
113
+ }
114
+ return void 0;
115
+ }
116
+ resetForTurn() {
117
+ this.failCounts.clear();
118
+ this.resultCounts.clear();
119
+ }
120
+ };
121
+
122
+ export {
123
+ checkTool,
124
+ checkPath,
125
+ buildPolicy,
126
+ auditDeny,
127
+ ToolLoopGuard
128
+ };
129
+ //# sourceMappingURL=chunk-MPX525QO.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/components/tool-sandbox.ts"],
4
+ "sourcesContent": ["/**\n * tool-sandbox.ts \u2014 unified policy enforcement for tool access and path restrictions.\n * Provides SandboxPolicy interface, check functions, loop guardrails, and audit logging.\n */\n\nimport { resolve } from \"node:path\";\nimport { realpathSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { appendFileSync, mkdirSync } from \"node:fs\";\nimport { createHash } from \"node:crypto\";\nimport { join } from \"node:path\";\nimport { abtarsHome } from \"../paths.js\";\nimport { logAndSwallow } from \"./log-and-swallow.js\";\n\nexport interface SandboxPolicy {\n readonly allowedTools: string[];\n readonly allowedRead: string[];\n readonly allowedWrite: string[];\n readonly canExecuteBash: boolean;\n}\n\nexport interface CheckResult {\n allowed: boolean;\n reason?: string;\n}\n\nconst PATH_BLACKLIST: readonly string[] = [\n resolve(abtarsHome(), \"config\"),\n resolve(abtarsHome(), \"secret\"),\n resolve(homedir(), \".abmind\"),\n];\n\nconst AUDIT_DIR = join(abtarsHome(), \"logs\");\nconst AUDIT_PATH = join(AUDIT_DIR, \"audit.jsonl\");\ntry { mkdirSync(AUDIT_DIR, { recursive: true }); } catch (err) { logAndSwallow(\"tool-sandbox\", \"mkdirSync\", err); }\n\nexport function checkTool(name: string, policy: SandboxPolicy): CheckResult {\n if (policy.allowedTools.length === 1 && policy.allowedTools[0] === \"*\") return { allowed: true };\n if (policy.allowedTools.length === 0) return { allowed: false, reason: `Tool '${name}' not available in this session` };\n if (name === \"execute_bash\" && !policy.canExecuteBash) return { allowed: false, reason: `Tool '${name}' not available in this session` };\n if (policy.allowedTools.includes(name)) return { allowed: true };\n return { allowed: false, reason: `Tool '${name}' not available in this session` };\n}\n\nexport function checkPath(filePath: string, mode: \"read\" | \"write\", policy: SandboxPolicy): CheckResult {\n // Resolve ~, normalize .., and resolve symlinks to prevent traversal attacks\n const expanded = filePath.replace(/^~/, homedir());\n const normalized = resolve(expanded);\n let abs: string;\n try { abs = realpathSync(normalized); } catch { abs = normalized; /* file may not exist yet (write) */ }\n\n const list = mode === \"read\" ? policy.allowedRead : policy.allowedWrite;\n // If wildcard, skip blacklist (owner sessions)\n if (list.length === 1 && list[0] === \"*\") return { allowed: true };\n // Blacklist always enforced for explicit path lists\n for (const blocked of PATH_BLACKLIST) {\n if (abs === blocked || abs.startsWith(blocked + \"/\")) {\n return { allowed: false, reason: `Path '${filePath}' is restricted` };\n }\n }\n if (list.length === 0) return { allowed: false, reason: `No ${mode} access in this session` };\n for (const prefix of list) {\n const absPrefix = resolve(prefix.replace(/^~/, homedir()));\n if (abs === absPrefix || abs.startsWith(absPrefix + \"/\")) return { allowed: true };\n }\n return { allowed: false, reason: `Path '${filePath}' not in allowed ${mode} paths` };\n}\n\nexport function buildPolicy(source: \"owner\" | \"peer\" | \"guest\", config?: Partial<SandboxPolicy>): Readonly<SandboxPolicy> {\n let base: SandboxPolicy;\n switch (source) {\n case \"owner\":\n base = { allowedTools: [\"*\"], allowedRead: [\"*\"], allowedWrite: [\"*\"], canExecuteBash: true };\n break;\n case \"peer\":\n base = { allowedTools: [], allowedRead: [], allowedWrite: [], canExecuteBash: false };\n break;\n case \"guest\":\n base = { allowedTools: [\"web_fetch\"], allowedRead: [], allowedWrite: [], canExecuteBash: false };\n break;\n }\n if (config) base = { ...base, ...config };\n return Object.freeze(base);\n}\n\nexport function auditDeny(tool: string, path: string | undefined, policy: string, reason: string): void {\n const entry = { ts: Date.now(), event: \"sandbox_deny\", tool, path, policy, reason };\n try { appendFileSync(AUDIT_PATH, JSON.stringify(entry) + \"\\n\"); } catch (err) { logAndSwallow(\"tool-sandbox\", \"audit write\", err); }\n}\n\n// \u2500\u2500 Tool Loop Guard \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst IDEMPOTENT_TOOLS = new Set([\"file_read\", \"web_fetch\", \"web_browse\", \"memory_recall\"]);\n\nfunction argsHash(name: string, args: Record<string, unknown>): string {\n return createHash(\"sha256\").update(name + JSON.stringify(args)).digest(\"hex\");\n}\n\nexport class ToolLoopGuard {\n private failCounts = new Map<string, number>();\n private resultCounts = new Map<string, number>();\n\n beforeCall(name: string, args: Record<string, unknown>): CheckResult {\n const hash = argsHash(name, args);\n const fails = this.failCounts.get(hash) ?? 0;\n if (fails >= 4) return { allowed: false, reason: `Tool '${name}' blocked: repeated identical failure (${fails} times)` };\n if (IDEMPOTENT_TOOLS.has(name)) {\n const repeats = this.resultCounts.get(hash) ?? 0;\n if (repeats >= 4) return { allowed: false, reason: `Tool '${name}' blocked: same result returned ${repeats} times \u2014 stuck loop` };\n }\n return { allowed: true };\n }\n\n afterCall(name: string, args: Record<string, unknown>, _result: string, failed: boolean): string | undefined {\n const hash = argsHash(name, args);\n if (failed) {\n const count = (this.failCounts.get(hash) ?? 0) + 1;\n this.failCounts.set(hash, count);\n if (count === 2) return \"This tool call failed twice with identical arguments. Consider changing your approach.\";\n } else if (IDEMPOTENT_TOOLS.has(name)) {\n const count = (this.resultCounts.get(hash) ?? 0) + 1;\n this.resultCounts.set(hash, count);\n if (count === 2) return \"Same result returned twice for identical query. Use the result or change the query.\";\n }\n return undefined;\n }\n\n resetForTurn(): void {\n this.failCounts.clear();\n this.resultCounts.clear();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,130 @@
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
+ checkBrowseTasks,
4
+ deliverBrowseResult,
5
+ readPendingBrowse,
6
+ writePendingBrowse
7
+ } from "./chunk-6SETMHNN.js";
8
+ import {
9
+ BrowserIpcServer,
10
+ BrowserManager,
11
+ BrowserTool,
12
+ DomainAllowlist
13
+ } from "./chunk-3B7BBE4F.js";
14
+ import {
15
+ init_log_and_swallow,
16
+ logAndSwallow
17
+ } from "./chunk-FMWKEPM7.js";
18
+ import {
19
+ getEnv,
20
+ init_env_schema
21
+ } from "./chunk-JCJS4ZIB.js";
22
+ import {
23
+ init_logger,
24
+ logInfo,
25
+ logWarn
26
+ } from "./chunk-BUUVFUPO.js";
27
+ import {
28
+ abtarsHome,
29
+ init_paths
30
+ } from "./chunk-X76UX47U.js";
31
+ import {
32
+ __export
33
+ } from "./chunk-NWDBD4PA.js";
34
+
35
+ // src/capabilities/browser/index.ts
36
+ var browser_exports = {};
37
+ __export(browser_exports, {
38
+ register: () => register
39
+ });
40
+ init_log_and_swallow();
41
+ init_env_schema();
42
+ init_logger();
43
+ init_paths();
44
+ import * as net from "node:net";
45
+ import { join } from "node:path";
46
+ import { unlinkSync } from "node:fs";
47
+ function register(api) {
48
+ const browserManager = new BrowserManager();
49
+ const allowlist = DomainAllowlist.fromEnv();
50
+ const browserTool = new BrowserTool(browserManager, allowlist);
51
+ let browserIpc = null;
52
+ const ensureBrowserIpc = async () => {
53
+ if (browserIpc || getEnv().browserDocker) return;
54
+ browserIpc = new BrowserIpcServer(browserTool);
55
+ await browserIpc.start();
56
+ logInfo("browser", `\u{1F50C} Browser IPC listening on ${browserIpc.socketPath}`);
57
+ };
58
+ const spawnSocketPath = join(abtarsHome(), "browse-spawn.sock");
59
+ try {
60
+ unlinkSync(spawnSocketPath);
61
+ } catch (err) {
62
+ logAndSwallow("index", "op", err);
63
+ }
64
+ const spawnServer = net.createServer((conn) => {
65
+ let buf = "";
66
+ conn.on("data", (chunk) => {
67
+ buf += chunk.toString();
68
+ const nl = buf.indexOf("\n");
69
+ if (nl === -1) return;
70
+ const line = buf.slice(0, nl);
71
+ buf = buf.slice(nl + 1);
72
+ try {
73
+ const { taskId, task, prompt, chatId, threadId, timeoutMs } = JSON.parse(line);
74
+ const entry = {
75
+ taskId,
76
+ task,
77
+ chatId,
78
+ threadId,
79
+ pid: process.pid,
80
+ // bridge pid — runtime manages the actual transport
81
+ startedAt: Date.now(),
82
+ timeoutMs,
83
+ logFile: ""
84
+ // no log file — result comes from callback
85
+ };
86
+ const entries = readPendingBrowse();
87
+ entries.push(entry);
88
+ writePendingBrowse(entries);
89
+ api.runtime.spawn("browsie", prompt, {
90
+ timeoutMs,
91
+ onComplete: (_id, result) => {
92
+ deliverBrowseResult(entry, result);
93
+ const remaining = readPendingBrowse().filter((e) => e.taskId !== taskId);
94
+ writePendingBrowse(remaining);
95
+ },
96
+ onError: (_id, err) => {
97
+ logWarn("browser", `Browsie spawn failed for ${taskId}: ${err.message}`);
98
+ deliverBrowseResult(entry, `Browse task failed: ${err.message}`);
99
+ const remaining = readPendingBrowse().filter((e) => e.taskId !== taskId);
100
+ writePendingBrowse(remaining);
101
+ }
102
+ }).then(({ taskId: spawnId }) => {
103
+ conn.write(JSON.stringify({ ok: true, taskId, spawnId, status: "spawned" }) + "\n");
104
+ }).catch((err) => {
105
+ conn.write(JSON.stringify({ ok: false, error: err instanceof Error ? err.message : String(err) }) + "\n");
106
+ });
107
+ } catch (err) {
108
+ conn.write(JSON.stringify({ ok: false, error: err instanceof Error ? err.message : String(err) }) + "\n");
109
+ }
110
+ });
111
+ conn.on("error", () => {
112
+ });
113
+ });
114
+ spawnServer.listen(spawnSocketPath, () => {
115
+ logInfo("browser", `\u{1F50C} Browse spawn IPC listening on ${spawnSocketPath}`);
116
+ });
117
+ api.registerHeartbeatTask({
118
+ name: "browse-checker",
119
+ execute: async () => {
120
+ await ensureBrowserIpc();
121
+ checkBrowseTasks();
122
+ }
123
+ });
124
+ }
125
+
126
+ export {
127
+ register,
128
+ browser_exports
129
+ };
130
+ //# sourceMappingURL=chunk-MW6WDLU7.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/capabilities/browser/index.ts"],
4
+ "sourcesContent": ["import { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\n/**\n * Browser capability \u2014 browse-spawn IPC + browse-checker heartbeat.\n * Level 1 (lightpanda fetch) is handled by the agent via skill \u2014 no bridge code needed.\n * Level 2 (Browsie) uses runtime.spawn() via IPC socket.\n */\n\nimport { BrowserManager } from \"./browser-manager.js\";\nimport { BrowserTool } from \"./browser-tool.js\";\nimport { BrowserIpcServer } from \"./browser-ipc-server.js\";\nimport { DomainAllowlist } from \"./domain-allowlist.js\";\nimport { checkBrowseTasks, deliverBrowseResult } from \"./browse-delivery.js\";\nimport { readPendingBrowse, writePendingBrowse } from \"./abtars-browse.js\";\nimport type { PendingBrowseEntry } from \"./abtars-browse.js\";\nimport { logInfo, logWarn } from \"../../components/logger.js\";\nimport { abtarsHome } from \"../../paths.js\";\nimport type { CapabilityApi } from \"../capability.js\";\nimport * as net from \"node:net\";\nimport { join } from \"node:path\";\nimport { unlinkSync } from \"node:fs\";\n\nexport function register(api: CapabilityApi): void {\n const browserManager = new BrowserManager();\n const allowlist = DomainAllowlist.fromEnv();\n const browserTool = new BrowserTool(browserManager, allowlist);\n let browserIpc: BrowserIpcServer | null = null;\n\n const ensureBrowserIpc = async (): Promise<void> => {\n if (browserIpc || getEnv().browserDocker) return;\n browserIpc = new BrowserIpcServer(browserTool);\n await browserIpc.start();\n logInfo(\"browser\", `\uD83D\uDD0C Browser IPC listening on ${browserIpc.socketPath}`);\n };\n\n // Browse-spawn IPC \u2014 CLI sends task, bridge spawns via runtime\n const spawnSocketPath = join(abtarsHome(), \"browse-spawn.sock\");\n try { unlinkSync(spawnSocketPath); } catch (err) { logAndSwallow(\"index\", \"op\", err); }\n\n const spawnServer = net.createServer((conn) => {\n let buf = \"\";\n conn.on(\"data\", (chunk) => {\n buf += chunk.toString();\n const nl = buf.indexOf(\"\\n\");\n if (nl === -1) return;\n const line = buf.slice(0, nl);\n buf = buf.slice(nl + 1);\n\n try {\n const { taskId, task, prompt, chatId, threadId, timeoutMs } = JSON.parse(line);\n\n const entry: PendingBrowseEntry = {\n taskId, task, chatId, threadId,\n pid: process.pid, // bridge pid \u2014 runtime manages the actual transport\n startedAt: Date.now(), timeoutMs,\n logFile: \"\", // no log file \u2014 result comes from callback\n };\n const entries = readPendingBrowse();\n entries.push(entry);\n writePendingBrowse(entries);\n\n // Fire-and-forget via runtime\n api.runtime.spawn(\"browsie\", prompt, {\n timeoutMs,\n onComplete: (_id: string, result: string) => {\n deliverBrowseResult(entry, result);\n const remaining = readPendingBrowse().filter(e => e.taskId !== taskId);\n writePendingBrowse(remaining);\n },\n onError: (_id: string, err: Error) => {\n logWarn(\"browser\", `Browsie spawn failed for ${taskId}: ${err.message}`);\n deliverBrowseResult(entry, `Browse task failed: ${err.message}`);\n const remaining = readPendingBrowse().filter(e => e.taskId !== taskId);\n writePendingBrowse(remaining);\n },\n }).then(({ taskId: spawnId }) => {\n conn.write(JSON.stringify({ ok: true, taskId, spawnId, status: \"spawned\" }) + \"\\n\");\n }).catch((err) => {\n conn.write(JSON.stringify({ ok: false, error: err instanceof Error ? err.message : String(err) }) + \"\\n\");\n });\n } catch (err) {\n conn.write(JSON.stringify({ ok: false, error: err instanceof Error ? err.message : String(err) }) + \"\\n\");\n }\n });\n conn.on(\"error\", () => {});\n });\n\n spawnServer.listen(spawnSocketPath, () => {\n logInfo(\"browser\", `\uD83D\uDD0C Browse spawn IPC listening on ${spawnSocketPath}`);\n });\n\n api.registerHeartbeatTask({\n name: \"browse-checker\",\n execute: async () => { await ensureBrowserIpc(); checkBrowseTasks(); },\n });\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,215 @@
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
+ abmind
4
+ } from "./chunk-OP7BTAWY.js";
5
+ import {
6
+ readEnv,
7
+ readEnvWithDefault
8
+ } from "./chunk-YOCTDKKL.js";
9
+ import {
10
+ readAndClearForceSleep,
11
+ writeSleepStatus
12
+ } from "./chunk-CEVRHKJY.js";
13
+ import {
14
+ init_log_and_swallow,
15
+ logAndSwallow
16
+ } from "./chunk-FMWKEPM7.js";
17
+ import {
18
+ getEnv,
19
+ init_env_schema
20
+ } from "./chunk-JCJS4ZIB.js";
21
+ import {
22
+ init_logger,
23
+ logDebug,
24
+ logInfo,
25
+ logWarn
26
+ } from "./chunk-BUUVFUPO.js";
27
+ import {
28
+ __export
29
+ } from "./chunk-NWDBD4PA.js";
30
+
31
+ // src/capabilities/sleep/index.ts
32
+ var sleep_exports = {};
33
+ __export(sleep_exports, {
34
+ createSleepHandle: () => createSleepHandle,
35
+ register: () => register
36
+ });
37
+ init_log_and_swallow();
38
+ init_env_schema();
39
+ import { execSync } from "node:child_process";
40
+ import { join } from "node:path";
41
+ import { existsSync, readFileSync } from "node:fs";
42
+ init_logger();
43
+ var TAG = "sleep";
44
+ var MAX_RETRIES = 3;
45
+ var RETRY_MS = 5 * 60 * 1e3;
46
+ function createSleepHandle(opts) {
47
+ let running = false;
48
+ let attempts = 0;
49
+ let progress = null;
50
+ let _awaitingHwSleep = false;
51
+ let postSleepQuietTicks = 0;
52
+ let lastMsgTsSeenByHwCheck = 0;
53
+ function buildDreamReport() {
54
+ let dreamReport = "Dreamy finished nightly maintenance.";
55
+ try {
56
+ const sleepDir = join(opts.memoryDir ?? "", "sleep");
57
+ const dateStr = (/* @__PURE__ */ new Date()).toISOString().slice(0, 10).replace(/-/g, "");
58
+ const lockPath = join(sleepDir, `sleep_${dateStr}.lock`);
59
+ if (existsSync(lockPath)) {
60
+ const lockData = JSON.parse(readFileSync(lockPath, "utf-8"));
61
+ const ok = Object.entries(lockData.steps).filter(([, s]) => s.status === "ok").map(([k]) => k);
62
+ const skipped = Object.entries(lockData.steps).filter(([, s]) => s.status === "skipped").map(([k]) => k);
63
+ const failed = Object.entries(lockData.steps).filter(([, s]) => s.status === "failed" || s.status === "timeout").map(([k]) => k);
64
+ dreamReport = `Dreamy finished nightly maintenance (${lockData.llmCalls ?? "?"} LLM calls). Completed: ${ok.join(", ") || "none"}.`;
65
+ if (skipped.length > 0) dreamReport += ` Skipped: ${skipped.join(", ")}.`;
66
+ if (failed.length > 0) dreamReport += ` \u26A0\uFE0F FAILED: ${failed.join(", ")}. Please review.`;
67
+ }
68
+ } catch (err) {
69
+ logAndSwallow("index", "op", err);
70
+ }
71
+ return dreamReport;
72
+ }
73
+ function spawnSleep() {
74
+ const forceSleep = readAndClearForceSleep();
75
+ const forced = forceSleep !== null;
76
+ if (forced) {
77
+ logInfo("sleep", `\u26A1 forceSleep=${forceSleep} \u2014 bypassing time-window + audit-today guards`);
78
+ }
79
+ if (!forced) {
80
+ const hour = (/* @__PURE__ */ new Date()).getHours();
81
+ const WAKE_HOUR = parseInt(readEnvWithDefault("WAKE_TIME", "7", "wake hour").split(":")[0] ?? "7", 10);
82
+ if (opts.sleepHour <= WAKE_HOUR) {
83
+ if (hour < opts.sleepHour || hour >= WAKE_HOUR) {
84
+ logDebug("sleep", `\u{1F634} Outside sleep window (${opts.sleepHour}:00-${WAKE_HOUR}:00) \u2014 skip`);
85
+ return;
86
+ }
87
+ } else {
88
+ if (hour < opts.sleepHour && hour >= WAKE_HOUR) {
89
+ logDebug("sleep", `\u{1F634} Outside sleep window (${opts.sleepHour}:00-${WAKE_HOUR}:00) \u2014 skip`);
90
+ return;
91
+ }
92
+ }
93
+ if (abmind()?.hasSleepAuditToday(opts.sleepAuditDir)) {
94
+ logDebug("sleep", "\u{1F634} Sleep already done today \u2014 skip");
95
+ return;
96
+ }
97
+ }
98
+ if (running) return;
99
+ attempts++;
100
+ progress = null;
101
+ running = true;
102
+ writeSleepStatus("sleeping");
103
+ logInfo("sleep", `\u{1F634} Sleep started in-process (attempt ${attempts}, model=dreamy)`);
104
+ const level = (() => {
105
+ if (forced && forceSleep?.includes("fresh")) return "ultimate";
106
+ const raw = getEnv().sleepQuality;
107
+ if (!raw) return abmind().DEFAULT_LEVEL;
108
+ try {
109
+ return abmind().parseLevel(raw);
110
+ } catch (err) {
111
+ logWarn("sleep", `Invalid SLEEP_QUALITY='${raw}', using ${abmind().DEFAULT_LEVEL}: ${err instanceof Error ? err.message : String(err)}`);
112
+ return abmind().DEFAULT_LEVEL;
113
+ }
114
+ })();
115
+ abmind().runSleepCycle({ runtime: opts.runtime, level }).then((result) => {
116
+ running = false;
117
+ progress = null;
118
+ logInfo("sleep", `\u{1F634} Sleep finished (ok=${result.ok}, failCount=${result.failCount}, attempt ${attempts})`);
119
+ writeSleepStatus("awake");
120
+ if (!result.ok) {
121
+ if (attempts < MAX_RETRIES) {
122
+ logWarn("sleep", `\u{1F634} Sleep had ${result.failCount} failures (attempt ${attempts}/${MAX_RETRIES}) \u2014 retry in 5min`);
123
+ setTimeout(spawnSleep, RETRY_MS);
124
+ } else {
125
+ logWarn("sleep", `\u{1F634} Sleep failures persist \u2014 exhausted ${MAX_RETRIES} attempts`);
126
+ }
127
+ return;
128
+ }
129
+ if (opts.memoryEnabled) opts.onComplete();
130
+ const hwEnabled = !forced && readEnv("HARDWARE_SLEEP_AFTER_DREAMY", "hardware sleep after Dreamy disabled") === "true";
131
+ const quietTicks = Math.ceil(getEnv().bedQuietMin * 60 / parseInt(readEnvWithDefault("HEARTBEAT_INTERVAL_SEC", "60", "hb"), 10));
132
+ const hbInterval = parseInt(readEnvWithDefault("HEARTBEAT_INTERVAL_SEC", "60", "heartbeat tick interval"), 10);
133
+ const hwSleepMin = Math.round(quietTicks * hbInterval / 60);
134
+ const dreamReport = buildDreamReport();
135
+ const sleepNote = hwEnabled ? ` Hardware sleep in ~${hwSleepMin} minutes if no activity.` : "";
136
+ if (opts.sendSystemMessage) {
137
+ opts.sendSystemMessage(`${dreamReport}${sleepNote}`).catch((err) => logAndSwallow(TAG, "sendSystemMessage dream report", err));
138
+ }
139
+ if (hwEnabled) {
140
+ _awaitingHwSleep = true;
141
+ postSleepQuietTicks = 0;
142
+ lastMsgTsSeenByHwCheck = opts.getLastMsgTs?.() ?? 0;
143
+ logInfo("sleep", `\u{1F4A4} Awaiting hardware sleep \u2014 ${quietTicks} quiet ticks (${hwSleepMin} min) required`);
144
+ }
145
+ }).catch((err) => {
146
+ running = false;
147
+ progress = null;
148
+ writeSleepStatus("awake");
149
+ const msg = err instanceof Error ? err.message : String(err);
150
+ if (attempts < MAX_RETRIES) {
151
+ logWarn("sleep", `\u{1F634} Sleep threw (attempt ${attempts}/${MAX_RETRIES}): ${msg} \u2014 retry in 5min`);
152
+ setTimeout(spawnSleep, RETRY_MS);
153
+ } else {
154
+ logWarn("sleep", `\u{1F634} Sleep threw \u2014 exhausted ${MAX_RETRIES} attempts: ${msg}`);
155
+ }
156
+ });
157
+ }
158
+ function checkHwSleep() {
159
+ if (!_awaitingHwSleep) return;
160
+ const WAKE_HOUR = parseInt(readEnvWithDefault("WAKE_TIME", "7", "wake hour").split(":")[0] ?? "7", 10);
161
+ const BED_HOUR = opts.sleepHour;
162
+ const hour = (/* @__PURE__ */ new Date()).getHours();
163
+ const inSleepWindow = BED_HOUR < WAKE_HOUR ? hour >= BED_HOUR && hour < WAKE_HOUR : hour >= BED_HOUR || hour < WAKE_HOUR;
164
+ if (!inSleepWindow) {
165
+ logInfo("sleep", `\u23F0 Past sleep window (now ${hour}:00, window ${BED_HOUR}:00-${WAKE_HOUR}:00) \u2014 abandoning hw-sleep attempt`);
166
+ _awaitingHwSleep = false;
167
+ postSleepQuietTicks = 0;
168
+ return;
169
+ }
170
+ const currentMsgTs = opts.getLastMsgTs?.() ?? 0;
171
+ if (currentMsgTs > lastMsgTsSeenByHwCheck) {
172
+ lastMsgTsSeenByHwCheck = currentMsgTs;
173
+ postSleepQuietTicks = 0;
174
+ logInfo("sleep", "\u{1F4A4} Hardware sleep postponed \u2014 user messaged (will retry after quiet period)");
175
+ return;
176
+ }
177
+ const requiredTicks = Math.ceil(getEnv().bedQuietMin * 60 / parseInt(process.env["HEARTBEAT_INTERVAL_SEC"] ?? "60", 10));
178
+ postSleepQuietTicks++;
179
+ if (postSleepQuietTicks < requiredTicks) return;
180
+ _awaitingHwSleep = false;
181
+ postSleepQuietTicks = 0;
182
+ opts.killWakeInhibit?.();
183
+ const sleepCmd = process.platform === "darwin" ? "pmset sleepnow" : "systemctl suspend";
184
+ logInfo("sleep", `\u{1F4A4} Putting hardware to sleep (${sleepCmd})...`);
185
+ writeSleepStatus("hw_sleep");
186
+ try {
187
+ execSync(sleepCmd, { timeout: 5e3 });
188
+ } catch (err) {
189
+ writeSleepStatus("awake");
190
+ logWarn("sleep", `\u{1F4A4} Hardware sleep failed: ${err instanceof Error ? err.message : String(err)}`);
191
+ }
192
+ }
193
+ return {
194
+ get isActive() {
195
+ return running;
196
+ },
197
+ get progress() {
198
+ return progress;
199
+ },
200
+ get awaitingHwSleep() {
201
+ return _awaitingHwSleep;
202
+ },
203
+ spawn: spawnSleep,
204
+ checkHwSleep
205
+ };
206
+ }
207
+ function register(_api) {
208
+ }
209
+
210
+ export {
211
+ createSleepHandle,
212
+ register,
213
+ sleep_exports
214
+ };
215
+ //# sourceMappingURL=chunk-NT3OBORC.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/capabilities/sleep/index.ts"],
4
+ "sourcesContent": ["import { logAndSwallow } from \"../../components/log-and-swallow.js\";\nimport { getEnv } from \"../../components/env-schema.js\";\nimport type { CapabilityApi } from \"../capability.js\";\n/**\n * Sleep capability \u2014 spawn nightly sleep cycle via tick system.\n * One path: BED_TIME + quiet ticks \u2192 Dreamy \u2192 quiet ticks \u2192 hardware sleep.\n * Parses PROGRESS:<pct>:<label> from stdout for visibility.\n */\n\nimport { execSync } from \"node:child_process\";\nimport { writeSleepStatus, readAndClearForceSleep } from \"../../components/transport/bridge-lock-transport.js\";\nimport { join } from \"node:path\";\nimport { existsSync, readFileSync } from \"node:fs\";\nimport type { Level } from \"abmind\";\nimport { abmind } from \"../../utils/abmind-lazy.js\";\nimport type { SleepRuntime } from \"abmind\";\nimport { logInfo, logWarn, logDebug } from \"../../components/logger.js\";\nimport { readEnv, readEnvWithDefault } from \"../../components/env.js\";\n\nconst TAG = \"sleep\";\n\nexport interface SleepOpts {\n sleepHour: number;\n sleepAuditDir: string;\n memoryEnabled: boolean;\n memoryDir?: string;\n /** LLM runtime adapter \u2014 bridge wraps its SubagentRuntime.complete(\"dreamy\", ...). */\n runtime: SleepRuntime;\n onComplete: () => void;\n getLastMsgTs?: () => number;\n sendSystemMessage?: (prompt: string) => Promise<void>;\n killWakeInhibit?: () => void;\n}\n\nexport interface SleepProgress {\n percent: number;\n step: string;\n}\n\nexport interface SleepHandle {\n /** True while a sleep cycle is running in-process. */\n readonly isActive: boolean;\n readonly progress: SleepProgress | null;\n readonly awaitingHwSleep: boolean;\n spawn(): void;\n /** Called by tick system to check if hardware sleep should fire. */\n checkHwSleep(): void;\n}\n\nconst MAX_RETRIES = 3;\nconst RETRY_MS = 5 * 60 * 1000;\n\nexport function createSleepHandle(opts: SleepOpts): SleepHandle {\n let running = false;\n let attempts = 0;\n let progress: SleepProgress | null = null;\n let _awaitingHwSleep = false;\n // Post-Dreamy hw-sleep quiet-tick tracking (internal to this closure \u2014 decoupled from\n // daily-cycle.quietTickCount which freezes once hasSleepAuditToday returns true).\n // Both reset when _awaitingHwSleep flips to true (see the onComplete handler below).\n let postSleepQuietTicks = 0;\n let lastMsgTsSeenByHwCheck = 0;\n\n function buildDreamReport(): string {\n let dreamReport = \"Dreamy finished nightly maintenance.\";\n try {\n const sleepDir = join(opts.memoryDir ?? \"\", \"sleep\");\n const dateStr = new Date().toISOString().slice(0, 10).replace(/-/g, \"\");\n const lockPath = join(sleepDir, `sleep_${dateStr}.lock`);\n if (existsSync(lockPath)) {\n const lockData = JSON.parse(readFileSync(lockPath, \"utf-8\")) as { steps: Record<string, { status: string }>; llmCalls?: number };\n const ok = Object.entries(lockData.steps).filter(([, s]) => s.status === \"ok\").map(([k]) => k);\n const skipped = Object.entries(lockData.steps).filter(([, s]) => s.status === \"skipped\").map(([k]) => k);\n const failed = Object.entries(lockData.steps).filter(([, s]) => s.status === \"failed\" || s.status === \"timeout\").map(([k]) => k);\n dreamReport = `Dreamy finished nightly maintenance (${lockData.llmCalls ?? \"?\"} LLM calls). Completed: ${ok.join(\", \") || \"none\"}.`;\n if (skipped.length > 0) dreamReport += ` Skipped: ${skipped.join(\", \")}.`;\n if (failed.length > 0) dreamReport += ` \u26A0\uFE0F FAILED: ${failed.join(\", \")}. Please review.`;\n }\n } catch (err) { logAndSwallow(\"index\", \"op\", err); }\n return dreamReport;\n }\n\n function spawnSleep(): void {\n const forceSleep = readAndClearForceSleep();\n const forced = forceSleep !== null;\n if (forced) {\n logInfo(\"sleep\", `\u26A1 forceSleep=${forceSleep} \u2014 bypassing time-window + audit-today guards`);\n }\n\n if (!forced) {\n const hour = new Date().getHours();\n const WAKE_HOUR = parseInt(readEnvWithDefault(\"WAKE_TIME\", \"7\", \"wake hour\").split(\":\")[0] ?? \"7\", 10);\n if (opts.sleepHour <= WAKE_HOUR) {\n if (hour < opts.sleepHour || hour >= WAKE_HOUR) {\n logDebug(\"sleep\", `\uD83D\uDE34 Outside sleep window (${opts.sleepHour}:00-${WAKE_HOUR}:00) \u2014 skip`);\n return;\n }\n } else {\n if (hour < opts.sleepHour && hour >= WAKE_HOUR) {\n logDebug(\"sleep\", `\uD83D\uDE34 Outside sleep window (${opts.sleepHour}:00-${WAKE_HOUR}:00) \u2014 skip`);\n return;\n }\n }\n if (abmind()?.hasSleepAuditToday(opts.sleepAuditDir)) {\n logDebug(\"sleep\", \"\uD83D\uDE34 Sleep already done today \u2014 skip\");\n return;\n }\n }\n if (running) return;\n attempts++;\n progress = null;\n running = true;\n writeSleepStatus(\"sleeping\");\n logInfo(\"sleep\", `\uD83D\uDE34 Sleep started in-process (attempt ${attempts}, model=dreamy)`);\n\n const level = (() => {\n if (forced && forceSleep?.includes(\"fresh\")) return \"ultimate\" as Level;\n const raw = getEnv().sleepQuality;\n if (!raw) return abmind()!.DEFAULT_LEVEL;\n try { return abmind()!.parseLevel(raw); }\n catch (err) { logWarn(\"sleep\", `Invalid SLEEP_QUALITY='${raw}', using ${abmind()!.DEFAULT_LEVEL}: ${err instanceof Error ? err.message : String(err)}`); return abmind()!.DEFAULT_LEVEL; }\n })();\n\n abmind()!.runSleepCycle({ runtime: opts.runtime, level })\n .then((result) => {\n running = false;\n progress = null;\n logInfo(\"sleep\", `\uD83D\uDE34 Sleep finished (ok=${result.ok}, failCount=${result.failCount}, attempt ${attempts})`);\n writeSleepStatus(\"awake\");\n if (!result.ok) {\n if (attempts < MAX_RETRIES) {\n logWarn(\"sleep\", `\uD83D\uDE34 Sleep had ${result.failCount} failures (attempt ${attempts}/${MAX_RETRIES}) \u2014 retry in 5min`);\n setTimeout(spawnSleep, RETRY_MS);\n } else {\n logWarn(\"sleep\", `\uD83D\uDE34 Sleep failures persist \u2014 exhausted ${MAX_RETRIES} attempts`);\n }\n return;\n }\n\n if (opts.memoryEnabled) opts.onComplete();\n\n // Force-sleep runs are explicit test/verify triggers \u2014 skip hw-sleep even if env enabled.\n const hwEnabled = !forced && readEnv(\"HARDWARE_SLEEP_AFTER_DREAMY\", \"hardware sleep after Dreamy disabled\") === \"true\";\n const quietTicks = Math.ceil(getEnv().bedQuietMin * 60 / parseInt(readEnvWithDefault(\"HEARTBEAT_INTERVAL_SEC\", \"60\", \"hb\"), 10));\n const hbInterval = parseInt(readEnvWithDefault(\"HEARTBEAT_INTERVAL_SEC\", \"60\", \"heartbeat tick interval\"), 10);\n const hwSleepMin = Math.round(quietTicks * hbInterval / 60);\n\n const dreamReport = buildDreamReport();\n const sleepNote = hwEnabled ? ` Hardware sleep in ~${hwSleepMin} minutes if no activity.` : \"\";\n\n if (opts.sendSystemMessage) {\n opts.sendSystemMessage(`${dreamReport}${sleepNote}`).catch(err => logAndSwallow(TAG, \"sendSystemMessage dream report\", err));\n }\n\n if (hwEnabled) {\n _awaitingHwSleep = true;\n // Reset hw-check counters \u2014 prevents stale state from a prior cycle (crash, force-sleep\n // re-run) from poisoning this one, and avoids burning the first tick on a spurious\n // reset when the very first checkHwSleep() sees currentMsgTs > 0.\n postSleepQuietTicks = 0;\n lastMsgTsSeenByHwCheck = opts.getLastMsgTs?.() ?? 0;\n logInfo(\"sleep\", `\uD83D\uDCA4 Awaiting hardware sleep \u2014 ${quietTicks} quiet ticks (${hwSleepMin} min) required`);\n }\n })\n .catch((err) => {\n running = false;\n progress = null;\n writeSleepStatus(\"awake\");\n const msg = err instanceof Error ? err.message : String(err);\n if (attempts < MAX_RETRIES) {\n logWarn(\"sleep\", `\uD83D\uDE34 Sleep threw (attempt ${attempts}/${MAX_RETRIES}): ${msg} \u2014 retry in 5min`);\n setTimeout(spawnSleep, RETRY_MS);\n } else {\n logWarn(\"sleep\", `\uD83D\uDE34 Sleep threw \u2014 exhausted ${MAX_RETRIES} attempts: ${msg}`);\n }\n });\n }\n\n function checkHwSleep(): void {\n if (!_awaitingHwSleep) return;\n\n // Sleep-window cutoff \u2014 give up if we've crossed out of the window. Next night retries.\n // Mirrors spawnSleep()'s window logic for consistency.\n const WAKE_HOUR = parseInt(readEnvWithDefault(\"WAKE_TIME\", \"7\", \"wake hour\").split(\":\")[0] ?? \"7\", 10);\n const BED_HOUR = opts.sleepHour;\n const hour = new Date().getHours();\n const inSleepWindow = (BED_HOUR < WAKE_HOUR)\n ? (hour >= BED_HOUR && hour < WAKE_HOUR) // normal: BED=00:30, WAKE=07:00 \u2192 sleep 00-06\n : (hour >= BED_HOUR || hour < WAKE_HOUR); // overnight: BED=23:00, WAKE=07:00 \u2192 sleep 23-06\n if (!inSleepWindow) {\n logInfo(\"sleep\", `\u23F0 Past sleep window (now ${hour}:00, window ${BED_HOUR}:00-${WAKE_HOUR}:00) \u2014 abandoning hw-sleep attempt`);\n _awaitingHwSleep = false;\n postSleepQuietTicks = 0;\n return;\n }\n\n // User messaged since last check \u2014 postpone and reset\n const currentMsgTs = opts.getLastMsgTs?.() ?? 0;\n if (currentMsgTs > lastMsgTsSeenByHwCheck) {\n lastMsgTsSeenByHwCheck = currentMsgTs;\n postSleepQuietTicks = 0;\n logInfo(\"sleep\", \"\uD83D\uDCA4 Hardware sleep postponed \u2014 user messaged (will retry after quiet period)\");\n return;\n }\n\n // Quiet tick \u2014 increment\n const requiredTicks = Math.ceil(getEnv().bedQuietMin * 60 / parseInt(process.env[\"HEARTBEAT_INTERVAL_SEC\"] ?? \"60\", 10));\n postSleepQuietTicks++;\n if (postSleepQuietTicks < requiredTicks) return;\n\n // Threshold reached \u2014 sleep\n _awaitingHwSleep = false;\n postSleepQuietTicks = 0;\n // Kill any wake inhibitor from /wakeup before sleeping\n opts.killWakeInhibit?.();\n const sleepCmd = process.platform === \"darwin\" ? \"pmset sleepnow\" : \"systemctl suspend\";\n logInfo(\"sleep\", `\uD83D\uDCA4 Putting hardware to sleep (${sleepCmd})...`);\n writeSleepStatus(\"hw_sleep\");\n try { execSync(sleepCmd, { timeout: 5000 }); }\n catch (err) {\n writeSleepStatus(\"awake\"); // recover \u2014 don't leave \"hw_sleep\" if pmset failed\n logWarn(\"sleep\", `\uD83D\uDCA4 Hardware sleep failed: ${err instanceof Error ? err.message : String(err)}`);\n }\n }\n\n return {\n get isActive() { return running; },\n get progress() { return progress; },\n get awaitingHwSleep() { return _awaitingHwSleep; },\n spawn: spawnSleep,\n checkHwSleep,\n };\n}\n\n/** Capability registration \u2014 called by discoverCapabilities(). */\nexport function register(_api: CapabilityApi): void {\n // Sleep registration is a no-op here \u2014 the actual SleepHandle is created\n // in phase-sleep.ts because it needs ctx.sendSystemMessage + memory deps\n // that aren't available at capability discovery time.\n // This manifest exists so sleep appears in discoverCapabilities() and\n // can be disabled via DISABLED_CAPABILITIES=sleep.\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }