@farazirfan/costar-server-executor 1.0.0

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 (1067) hide show
  1. package/.env.example +53 -0
  2. package/README.md +313 -0
  3. package/costar.mjs +19 -0
  4. package/dist/agent/agent-old.d.ts +61 -0
  5. package/dist/agent/agent-old.d.ts.map +1 -0
  6. package/dist/agent/agent-old.js +282 -0
  7. package/dist/agent/agent-old.js.map +1 -0
  8. package/dist/agent/agent.d.ts +110 -0
  9. package/dist/agent/agent.d.ts.map +1 -0
  10. package/dist/agent/agent.js +349 -0
  11. package/dist/agent/agent.js.map +1 -0
  12. package/dist/agent/context-loader.d.ts +41 -0
  13. package/dist/agent/context-loader.d.ts.map +1 -0
  14. package/dist/agent/context-loader.js +166 -0
  15. package/dist/agent/context-loader.js.map +1 -0
  16. package/dist/agent/index.d.ts +13 -0
  17. package/dist/agent/index.d.ts.map +1 -0
  18. package/dist/agent/index.js +11 -0
  19. package/dist/agent/index.js.map +1 -0
  20. package/dist/agent/model-fallback.d.ts +48 -0
  21. package/dist/agent/model-fallback.d.ts.map +1 -0
  22. package/dist/agent/model-fallback.js +103 -0
  23. package/dist/agent/model-fallback.js.map +1 -0
  24. package/dist/agent/pi-embedded-runner/model.d.ts +31 -0
  25. package/dist/agent/pi-embedded-runner/model.d.ts.map +1 -0
  26. package/dist/agent/pi-embedded-runner/model.js +65 -0
  27. package/dist/agent/pi-embedded-runner/model.js.map +1 -0
  28. package/dist/agent/pi-embedded-runner/run.d.ts +10 -0
  29. package/dist/agent/pi-embedded-runner/run.d.ts.map +1 -0
  30. package/dist/agent/pi-embedded-runner/run.js +230 -0
  31. package/dist/agent/pi-embedded-runner/run.js.map +1 -0
  32. package/dist/agent/pi-embedded-runner/subscribe.d.ts +42 -0
  33. package/dist/agent/pi-embedded-runner/subscribe.d.ts.map +1 -0
  34. package/dist/agent/pi-embedded-runner/subscribe.js +237 -0
  35. package/dist/agent/pi-embedded-runner/subscribe.js.map +1 -0
  36. package/dist/agent/pi-embedded-runner/system-prompt.d.ts +52 -0
  37. package/dist/agent/pi-embedded-runner/system-prompt.d.ts.map +1 -0
  38. package/dist/agent/pi-embedded-runner/system-prompt.js +331 -0
  39. package/dist/agent/pi-embedded-runner/system-prompt.js.map +1 -0
  40. package/dist/agent/pi-embedded-runner/tools.d.ts +16 -0
  41. package/dist/agent/pi-embedded-runner/tools.d.ts.map +1 -0
  42. package/dist/agent/pi-embedded-runner/tools.js +52 -0
  43. package/dist/agent/pi-embedded-runner/tools.js.map +1 -0
  44. package/dist/agent/pi-embedded-runner/types.d.ts +176 -0
  45. package/dist/agent/pi-embedded-runner/types.d.ts.map +1 -0
  46. package/dist/agent/pi-embedded-runner/types.js +5 -0
  47. package/dist/agent/pi-embedded-runner/types.js.map +1 -0
  48. package/dist/agent/tool-executor.d.ts +44 -0
  49. package/dist/agent/tool-executor.d.ts.map +1 -0
  50. package/dist/agent/tool-executor.js +159 -0
  51. package/dist/agent/tool-executor.js.map +1 -0
  52. package/dist/api/chat.d.ts +22 -0
  53. package/dist/api/chat.d.ts.map +1 -0
  54. package/dist/api/chat.js +66 -0
  55. package/dist/api/chat.js.map +1 -0
  56. package/dist/browser/bridge-server.d.ts +18 -0
  57. package/dist/browser/bridge-server.d.ts.map +1 -0
  58. package/dist/browser/bridge-server.js +46 -0
  59. package/dist/browser/bridge-server.js.map +1 -0
  60. package/dist/browser/cdp.d.ts +124 -0
  61. package/dist/browser/cdp.d.ts.map +1 -0
  62. package/dist/browser/cdp.helpers.d.ts +10 -0
  63. package/dist/browser/cdp.helpers.d.ts.map +1 -0
  64. package/dist/browser/cdp.helpers.js +137 -0
  65. package/dist/browser/cdp.helpers.js.map +1 -0
  66. package/dist/browser/cdp.js +294 -0
  67. package/dist/browser/cdp.js.map +1 -0
  68. package/dist/browser/chrome.d.ts +21 -0
  69. package/dist/browser/chrome.d.ts.map +1 -0
  70. package/dist/browser/chrome.executables.d.ts +10 -0
  71. package/dist/browser/chrome.executables.d.ts.map +1 -0
  72. package/dist/browser/chrome.executables.js +510 -0
  73. package/dist/browser/chrome.executables.js.map +1 -0
  74. package/dist/browser/chrome.js +254 -0
  75. package/dist/browser/chrome.js.map +1 -0
  76. package/dist/browser/chrome.profile-decoration.d.ts +11 -0
  77. package/dist/browser/chrome.profile-decoration.d.ts.map +1 -0
  78. package/dist/browser/chrome.profile-decoration.js +145 -0
  79. package/dist/browser/chrome.profile-decoration.js.map +1 -0
  80. package/dist/browser/client-actions-core.d.ts +144 -0
  81. package/dist/browser/client-actions-core.d.ts.map +1 -0
  82. package/dist/browser/client-actions-core.js +101 -0
  83. package/dist/browser/client-actions-core.js.map +1 -0
  84. package/dist/browser/client-actions-observe.d.ts +69 -0
  85. package/dist/browser/client-actions-observe.d.ts.map +1 -0
  86. package/dist/browser/client-actions-observe.js +101 -0
  87. package/dist/browser/client-actions-observe.js.map +1 -0
  88. package/dist/browser/client-actions-state.d.ts +91 -0
  89. package/dist/browser/client-actions-state.d.ts.map +1 -0
  90. package/dist/browser/client-actions-state.js +170 -0
  91. package/dist/browser/client-actions-state.js.map +1 -0
  92. package/dist/browser/client-actions-types.d.ts +19 -0
  93. package/dist/browser/client-actions-types.d.ts.map +1 -0
  94. package/dist/browser/client-actions-types.js +2 -0
  95. package/dist/browser/client-actions-types.js.map +1 -0
  96. package/dist/browser/client-actions.d.ts +5 -0
  97. package/dist/browser/client-actions.d.ts.map +1 -0
  98. package/dist/browser/client-actions.js +5 -0
  99. package/dist/browser/client-actions.js.map +1 -0
  100. package/dist/browser/client-fetch.d.ts +4 -0
  101. package/dist/browser/client-fetch.d.ts.map +1 -0
  102. package/dist/browser/client-fetch.js +92 -0
  103. package/dist/browser/client-fetch.js.map +1 -0
  104. package/dist/browser/client.d.ts +148 -0
  105. package/dist/browser/client.d.ts.map +1 -0
  106. package/dist/browser/client.js +138 -0
  107. package/dist/browser/client.js.map +1 -0
  108. package/dist/browser/config.d.ts +40 -0
  109. package/dist/browser/config.d.ts.map +1 -0
  110. package/dist/browser/config.js +181 -0
  111. package/dist/browser/config.js.map +1 -0
  112. package/dist/browser/constants.d.ts +9 -0
  113. package/dist/browser/constants.d.ts.map +1 -0
  114. package/dist/browser/constants.js +9 -0
  115. package/dist/browser/constants.js.map +1 -0
  116. package/dist/browser/control-service.d.ts +6 -0
  117. package/dist/browser/control-service.d.ts.map +1 -0
  118. package/dist/browser/control-service.js +73 -0
  119. package/dist/browser/control-service.js.map +1 -0
  120. package/dist/browser/extension-relay.d.ts +15 -0
  121. package/dist/browser/extension-relay.d.ts.map +1 -0
  122. package/dist/browser/extension-relay.js +542 -0
  123. package/dist/browser/extension-relay.js.map +1 -0
  124. package/dist/browser/profiles-service.d.ts +26 -0
  125. package/dist/browser/profiles-service.d.ts.map +1 -0
  126. package/dist/browser/profiles-service.js +133 -0
  127. package/dist/browser/profiles-service.js.map +1 -0
  128. package/dist/browser/profiles.d.ts +31 -0
  129. package/dist/browser/profiles.d.ts.map +1 -0
  130. package/dist/browser/profiles.js +94 -0
  131. package/dist/browser/profiles.js.map +1 -0
  132. package/dist/browser/pw-ai-module.d.ts +7 -0
  133. package/dist/browser/pw-ai-module.d.ts.map +1 -0
  134. package/dist/browser/pw-ai-module.js +38 -0
  135. package/dist/browser/pw-ai-module.js.map +1 -0
  136. package/dist/browser/pw-ai.d.ts +3 -0
  137. package/dist/browser/pw-ai.d.ts.map +1 -0
  138. package/dist/browser/pw-ai.js +3 -0
  139. package/dist/browser/pw-ai.js.map +1 -0
  140. package/dist/browser/pw-role-snapshot.d.ts +36 -0
  141. package/dist/browser/pw-role-snapshot.d.ts.map +1 -0
  142. package/dist/browser/pw-role-snapshot.js +311 -0
  143. package/dist/browser/pw-role-snapshot.js.map +1 -0
  144. package/dist/browser/pw-session.d.ts +136 -0
  145. package/dist/browser/pw-session.d.ts.map +1 -0
  146. package/dist/browser/pw-session.js +432 -0
  147. package/dist/browser/pw-session.js.map +1 -0
  148. package/dist/browser/pw-tools-core.activity.d.ts +22 -0
  149. package/dist/browser/pw-tools-core.activity.d.ts.map +1 -0
  150. package/dist/browser/pw-tools-core.activity.js +45 -0
  151. package/dist/browser/pw-tools-core.activity.js.map +1 -0
  152. package/dist/browser/pw-tools-core.d.ts +9 -0
  153. package/dist/browser/pw-tools-core.d.ts.map +1 -0
  154. package/dist/browser/pw-tools-core.downloads.d.ts +35 -0
  155. package/dist/browser/pw-tools-core.downloads.d.ts.map +1 -0
  156. package/dist/browser/pw-tools-core.downloads.js +177 -0
  157. package/dist/browser/pw-tools-core.downloads.js.map +1 -0
  158. package/dist/browser/pw-tools-core.interactions.d.ts +113 -0
  159. package/dist/browser/pw-tools-core.interactions.d.ts.map +1 -0
  160. package/dist/browser/pw-tools-core.interactions.js +421 -0
  161. package/dist/browser/pw-tools-core.interactions.js.map +1 -0
  162. package/dist/browser/pw-tools-core.js +9 -0
  163. package/dist/browser/pw-tools-core.js.map +1 -0
  164. package/dist/browser/pw-tools-core.responses.d.ts +14 -0
  165. package/dist/browser/pw-tools-core.responses.d.ts.map +1 -0
  166. package/dist/browser/pw-tools-core.responses.js +84 -0
  167. package/dist/browser/pw-tools-core.responses.js.map +1 -0
  168. package/dist/browser/pw-tools-core.shared.d.ts +7 -0
  169. package/dist/browser/pw-tools-core.shared.d.ts.map +1 -0
  170. package/dist/browser/pw-tools-core.shared.js +49 -0
  171. package/dist/browser/pw-tools-core.shared.js.map +1 -0
  172. package/dist/browser/pw-tools-core.snapshot.d.ts +65 -0
  173. package/dist/browser/pw-tools-core.snapshot.d.ts.map +1 -0
  174. package/dist/browser/pw-tools-core.snapshot.js +143 -0
  175. package/dist/browser/pw-tools-core.snapshot.js.map +1 -0
  176. package/dist/browser/pw-tools-core.state.d.ts +47 -0
  177. package/dist/browser/pw-tools-core.state.d.ts.map +1 -0
  178. package/dist/browser/pw-tools-core.state.js +148 -0
  179. package/dist/browser/pw-tools-core.state.js.map +1 -0
  180. package/dist/browser/pw-tools-core.storage.d.ts +48 -0
  181. package/dist/browser/pw-tools-core.storage.d.ts.map +1 -0
  182. package/dist/browser/pw-tools-core.storage.js +73 -0
  183. package/dist/browser/pw-tools-core.storage.js.map +1 -0
  184. package/dist/browser/pw-tools-core.trace.d.ts +13 -0
  185. package/dist/browser/pw-tools-core.trace.d.ts.map +1 -0
  186. package/dist/browser/pw-tools-core.trace.js +26 -0
  187. package/dist/browser/pw-tools-core.trace.js.map +1 -0
  188. package/dist/browser/routes/agent.act.d.ts +4 -0
  189. package/dist/browser/routes/agent.act.d.ts.map +1 -0
  190. package/dist/browser/routes/agent.act.js +467 -0
  191. package/dist/browser/routes/agent.act.js.map +1 -0
  192. package/dist/browser/routes/agent.act.shared.d.ts +11 -0
  193. package/dist/browser/routes/agent.act.shared.d.ts.map +1 -0
  194. package/dist/browser/routes/agent.act.shared.js +39 -0
  195. package/dist/browser/routes/agent.act.shared.js.map +1 -0
  196. package/dist/browser/routes/agent.d.ts +4 -0
  197. package/dist/browser/routes/agent.d.ts.map +1 -0
  198. package/dist/browser/routes/agent.debug.d.ts +4 -0
  199. package/dist/browser/routes/agent.debug.d.ts.map +1 -0
  200. package/dist/browser/routes/agent.debug.js +134 -0
  201. package/dist/browser/routes/agent.debug.js.map +1 -0
  202. package/dist/browser/routes/agent.js +11 -0
  203. package/dist/browser/routes/agent.js.map +1 -0
  204. package/dist/browser/routes/agent.shared.d.ts +10 -0
  205. package/dist/browser/routes/agent.shared.d.ts.map +1 -0
  206. package/dist/browser/routes/agent.shared.js +46 -0
  207. package/dist/browser/routes/agent.shared.js.map +1 -0
  208. package/dist/browser/routes/agent.snapshot.d.ts +4 -0
  209. package/dist/browser/routes/agent.snapshot.d.ts.map +1 -0
  210. package/dist/browser/routes/agent.snapshot.js +270 -0
  211. package/dist/browser/routes/agent.snapshot.js.map +1 -0
  212. package/dist/browser/routes/agent.storage.d.ts +4 -0
  213. package/dist/browser/routes/agent.storage.d.ts.map +1 -0
  214. package/dist/browser/routes/agent.storage.js +387 -0
  215. package/dist/browser/routes/agent.storage.js.map +1 -0
  216. package/dist/browser/routes/basic.d.ts +4 -0
  217. package/dist/browser/routes/basic.d.ts.map +1 -0
  218. package/dist/browser/routes/basic.js +174 -0
  219. package/dist/browser/routes/basic.js.map +1 -0
  220. package/dist/browser/routes/dispatcher.d.ts +16 -0
  221. package/dist/browser/routes/dispatcher.d.ts.map +1 -0
  222. package/dist/browser/routes/dispatcher.js +87 -0
  223. package/dist/browser/routes/dispatcher.js.map +1 -0
  224. package/dist/browser/routes/index.d.ts +4 -0
  225. package/dist/browser/routes/index.d.ts.map +1 -0
  226. package/dist/browser/routes/index.js +9 -0
  227. package/dist/browser/routes/index.js.map +1 -0
  228. package/dist/browser/routes/tabs.d.ts +4 -0
  229. package/dist/browser/routes/tabs.d.ts.map +1 -0
  230. package/dist/browser/routes/tabs.js +121 -0
  231. package/dist/browser/routes/tabs.js.map +1 -0
  232. package/dist/browser/routes/types.d.ts +16 -0
  233. package/dist/browser/routes/types.d.ts.map +1 -0
  234. package/dist/browser/routes/types.js +2 -0
  235. package/dist/browser/routes/types.js.map +1 -0
  236. package/dist/browser/routes/utils.d.ts +16 -0
  237. package/dist/browser/routes/utils.d.ts.map +1 -0
  238. package/dist/browser/routes/utils.js +58 -0
  239. package/dist/browser/routes/utils.js.map +1 -0
  240. package/dist/browser/screenshot.d.ts +10 -0
  241. package/dist/browser/screenshot.d.ts.map +1 -0
  242. package/dist/browser/screenshot.js +40 -0
  243. package/dist/browser/screenshot.js.map +1 -0
  244. package/dist/browser/server-context.d.ts +4 -0
  245. package/dist/browser/server-context.d.ts.map +1 -0
  246. package/dist/browser/server-context.js +534 -0
  247. package/dist/browser/server-context.js.map +1 -0
  248. package/dist/browser/server-context.types.d.ts +79 -0
  249. package/dist/browser/server-context.types.d.ts.map +1 -0
  250. package/dist/browser/server-context.types.js +2 -0
  251. package/dist/browser/server-context.types.js.map +1 -0
  252. package/dist/browser/server.d.ts +4 -0
  253. package/dist/browser/server.d.ts.map +1 -0
  254. package/dist/browser/server.js +91 -0
  255. package/dist/browser/server.js.map +1 -0
  256. package/dist/browser/target-id.d.ts +12 -0
  257. package/dist/browser/target-id.d.ts.map +1 -0
  258. package/dist/browser/target-id.js +17 -0
  259. package/dist/browser/target-id.js.map +1 -0
  260. package/dist/browser/trash.d.ts +2 -0
  261. package/dist/browser/trash.d.ts.map +1 -0
  262. package/dist/browser/trash.js +22 -0
  263. package/dist/browser/trash.js.map +1 -0
  264. package/dist/chat-server.d.ts +2 -0
  265. package/dist/chat-server.d.ts.map +1 -0
  266. package/dist/chat-server.js +91 -0
  267. package/dist/chat-server.js.map +1 -0
  268. package/dist/cli/command-format.d.ts +2 -0
  269. package/dist/cli/command-format.d.ts.map +1 -0
  270. package/dist/cli/command-format.js +19 -0
  271. package/dist/cli/command-format.js.map +1 -0
  272. package/dist/cli/config-cmd.d.ts +6 -0
  273. package/dist/cli/config-cmd.d.ts.map +1 -0
  274. package/dist/cli/config-cmd.js +52 -0
  275. package/dist/cli/config-cmd.js.map +1 -0
  276. package/dist/cli/doctor.d.ts +6 -0
  277. package/dist/cli/doctor.d.ts.map +1 -0
  278. package/dist/cli/doctor.js +198 -0
  279. package/dist/cli/doctor.js.map +1 -0
  280. package/dist/cli/env-loader.d.ts +23 -0
  281. package/dist/cli/env-loader.d.ts.map +1 -0
  282. package/dist/cli/env-loader.js +104 -0
  283. package/dist/cli/env-loader.js.map +1 -0
  284. package/dist/cli/paths.d.ts +22 -0
  285. package/dist/cli/paths.d.ts.map +1 -0
  286. package/dist/cli/paths.js +38 -0
  287. package/dist/cli/paths.js.map +1 -0
  288. package/dist/cli/service.d.ts +11 -0
  289. package/dist/cli/service.d.ts.map +1 -0
  290. package/dist/cli/service.js +481 -0
  291. package/dist/cli/service.js.map +1 -0
  292. package/dist/cli/setup.d.ts +16 -0
  293. package/dist/cli/setup.d.ts.map +1 -0
  294. package/dist/cli/setup.js +317 -0
  295. package/dist/cli/setup.js.map +1 -0
  296. package/dist/cli/skill-cmd.d.ts +12 -0
  297. package/dist/cli/skill-cmd.d.ts.map +1 -0
  298. package/dist/cli/skill-cmd.js +297 -0
  299. package/dist/cli/skill-cmd.js.map +1 -0
  300. package/dist/cli/status.d.ts +6 -0
  301. package/dist/cli/status.d.ts.map +1 -0
  302. package/dist/cli/status.js +81 -0
  303. package/dist/cli/status.js.map +1 -0
  304. package/dist/cli.d.ts +18 -0
  305. package/dist/cli.d.ts.map +1 -0
  306. package/dist/cli.js +157 -0
  307. package/dist/cli.js.map +1 -0
  308. package/dist/config/config.d.ts +16 -0
  309. package/dist/config/config.d.ts.map +1 -0
  310. package/dist/config/config.js +64 -0
  311. package/dist/config/config.js.map +1 -0
  312. package/dist/config/paths.d.ts +58 -0
  313. package/dist/config/paths.d.ts.map +1 -0
  314. package/dist/config/paths.js +195 -0
  315. package/dist/config/paths.js.map +1 -0
  316. package/dist/config/port-defaults.d.ts +14 -0
  317. package/dist/config/port-defaults.d.ts.map +1 -0
  318. package/dist/config/port-defaults.js +31 -0
  319. package/dist/config/port-defaults.js.map +1 -0
  320. package/dist/config/types.d.ts +86 -0
  321. package/dist/config/types.d.ts.map +1 -0
  322. package/dist/config/types.js +5 -0
  323. package/dist/config/types.js.map +1 -0
  324. package/dist/cron/index.d.ts +7 -0
  325. package/dist/cron/index.d.ts.map +1 -0
  326. package/dist/cron/index.js +6 -0
  327. package/dist/cron/index.js.map +1 -0
  328. package/dist/cron/job-executor.d.ts +14 -0
  329. package/dist/cron/job-executor.d.ts.map +1 -0
  330. package/dist/cron/job-executor.js +106 -0
  331. package/dist/cron/job-executor.js.map +1 -0
  332. package/dist/cron/scheduler.d.ts +64 -0
  333. package/dist/cron/scheduler.d.ts.map +1 -0
  334. package/dist/cron/scheduler.js +220 -0
  335. package/dist/cron/scheduler.js.map +1 -0
  336. package/dist/cron/types.d.ts +75 -0
  337. package/dist/cron/types.d.ts.map +1 -0
  338. package/dist/cron/types.js +6 -0
  339. package/dist/cron/types.js.map +1 -0
  340. package/dist/heartbeat/index.d.ts +6 -0
  341. package/dist/heartbeat/index.d.ts.map +1 -0
  342. package/dist/heartbeat/index.js +5 -0
  343. package/dist/heartbeat/index.js.map +1 -0
  344. package/dist/heartbeat/runner.d.ts +94 -0
  345. package/dist/heartbeat/runner.d.ts.map +1 -0
  346. package/dist/heartbeat/runner.js +528 -0
  347. package/dist/heartbeat/runner.js.map +1 -0
  348. package/dist/heartbeat/types.d.ts +30 -0
  349. package/dist/heartbeat/types.d.ts.map +1 -0
  350. package/dist/heartbeat/types.js +5 -0
  351. package/dist/heartbeat/types.js.map +1 -0
  352. package/dist/index.d.ts +27 -0
  353. package/dist/index.d.ts.map +1 -0
  354. package/dist/index.js +183 -0
  355. package/dist/index.js.map +1 -0
  356. package/dist/infra/agent-events.d.ts +22 -0
  357. package/dist/infra/agent-events.d.ts.map +1 -0
  358. package/dist/infra/agent-events.js +58 -0
  359. package/dist/infra/agent-events.js.map +1 -0
  360. package/dist/infra/archive.d.ts +17 -0
  361. package/dist/infra/archive.d.ts.map +1 -0
  362. package/dist/infra/archive.js +98 -0
  363. package/dist/infra/archive.js.map +1 -0
  364. package/dist/infra/backoff.d.ts +9 -0
  365. package/dist/infra/backoff.d.ts.map +1 -0
  366. package/dist/infra/backoff.js +20 -0
  367. package/dist/infra/backoff.js.map +1 -0
  368. package/dist/infra/binaries.d.ts +4 -0
  369. package/dist/infra/binaries.d.ts.map +1 -0
  370. package/dist/infra/binaries.js +10 -0
  371. package/dist/infra/binaries.js.map +1 -0
  372. package/dist/infra/bonjour-ciao.d.ts +2 -0
  373. package/dist/infra/bonjour-ciao.d.ts.map +1 -0
  374. package/dist/infra/bonjour-ciao.js +11 -0
  375. package/dist/infra/bonjour-ciao.js.map +1 -0
  376. package/dist/infra/bonjour-discovery.d.ts +27 -0
  377. package/dist/infra/bonjour-discovery.d.ts.map +1 -0
  378. package/dist/infra/bonjour-discovery.js +450 -0
  379. package/dist/infra/bonjour-discovery.js.map +1 -0
  380. package/dist/infra/bonjour-errors.d.ts +2 -0
  381. package/dist/infra/bonjour-errors.d.ts.map +1 -0
  382. package/dist/infra/bonjour-errors.js +8 -0
  383. package/dist/infra/bonjour-errors.js.map +1 -0
  384. package/dist/infra/bonjour.d.ts +20 -0
  385. package/dist/infra/bonjour.d.ts.map +1 -0
  386. package/dist/infra/bonjour.js +211 -0
  387. package/dist/infra/bonjour.js.map +1 -0
  388. package/dist/infra/brew.d.ts +9 -0
  389. package/dist/infra/brew.d.ts.map +1 -0
  390. package/dist/infra/brew.js +56 -0
  391. package/dist/infra/brew.js.map +1 -0
  392. package/dist/infra/canvas-host-url.d.ts +12 -0
  393. package/dist/infra/canvas-host-url.d.ts.map +1 -0
  394. package/dist/infra/canvas-host-url.js +53 -0
  395. package/dist/infra/canvas-host-url.js.map +1 -0
  396. package/dist/infra/channel-activity.d.ts +19 -0
  397. package/dist/infra/channel-activity.d.ts.map +1 -0
  398. package/dist/infra/channel-activity.js +33 -0
  399. package/dist/infra/channel-activity.js.map +1 -0
  400. package/dist/infra/channel-summary.d.ts +8 -0
  401. package/dist/infra/channel-summary.d.ts.map +1 -0
  402. package/dist/infra/channel-summary.js +184 -0
  403. package/dist/infra/channel-summary.js.map +1 -0
  404. package/dist/infra/channels-status-issues.d.ts +3 -0
  405. package/dist/infra/channels-status-issues.d.ts.map +1 -0
  406. package/dist/infra/channels-status-issues.js +16 -0
  407. package/dist/infra/channels-status-issues.js.map +1 -0
  408. package/dist/infra/clipboard.d.ts +2 -0
  409. package/dist/infra/clipboard.d.ts.map +1 -0
  410. package/dist/infra/clipboard.js +25 -0
  411. package/dist/infra/clipboard.js.map +1 -0
  412. package/dist/infra/control-ui-assets.d.ts +12 -0
  413. package/dist/infra/control-ui-assets.d.ts.map +1 -0
  414. package/dist/infra/control-ui-assets.js +99 -0
  415. package/dist/infra/control-ui-assets.js.map +1 -0
  416. package/dist/infra/dedupe.d.ts +12 -0
  417. package/dist/infra/dedupe.d.ts.map +1 -0
  418. package/dist/infra/dedupe.js +48 -0
  419. package/dist/infra/dedupe.js.map +1 -0
  420. package/dist/infra/device-auth-store.d.ts +24 -0
  421. package/dist/infra/device-auth-store.d.ts.map +1 -0
  422. package/dist/infra/device-auth-store.js +98 -0
  423. package/dist/infra/device-auth-store.js.map +1 -0
  424. package/dist/infra/device-identity.d.ts +12 -0
  425. package/dist/infra/device-identity.d.ts.map +1 -0
  426. package/dist/infra/device-identity.js +150 -0
  427. package/dist/infra/device-identity.js.map +1 -0
  428. package/dist/infra/device-pairing.d.ts +97 -0
  429. package/dist/infra/device-pairing.d.ts.map +1 -0
  430. package/dist/infra/device-pairing.js +402 -0
  431. package/dist/infra/device-pairing.js.map +1 -0
  432. package/dist/infra/diagnostic-events.d.ts +122 -0
  433. package/dist/infra/diagnostic-events.d.ts.map +1 -0
  434. package/dist/infra/diagnostic-events.js +29 -0
  435. package/dist/infra/diagnostic-events.js.map +1 -0
  436. package/dist/infra/diagnostic-flags.d.ts +5 -0
  437. package/dist/infra/diagnostic-flags.d.ts.map +1 -0
  438. package/dist/infra/diagnostic-flags.js +67 -0
  439. package/dist/infra/diagnostic-flags.js.map +1 -0
  440. package/dist/infra/dotenv.d.ts +4 -0
  441. package/dist/infra/dotenv.d.ts.map +1 -0
  442. package/dist/infra/dotenv.js +16 -0
  443. package/dist/infra/dotenv.js.map +1 -0
  444. package/dist/infra/env-file.d.ts +10 -0
  445. package/dist/infra/env-file.d.ts.map +1 -0
  446. package/dist/infra/env-file.js +44 -0
  447. package/dist/infra/env-file.js.map +1 -0
  448. package/dist/infra/env.d.ts +12 -0
  449. package/dist/infra/env.d.ts.map +1 -0
  450. package/dist/infra/env.js +35 -0
  451. package/dist/infra/env.js.map +1 -0
  452. package/dist/infra/errors.d.ts +4 -0
  453. package/dist/infra/errors.d.ts.map +1 -0
  454. package/dist/infra/errors.js +36 -0
  455. package/dist/infra/errors.js.map +1 -0
  456. package/dist/infra/exec-approval-forwarder.d.ts +45 -0
  457. package/dist/infra/exec-approval-forwarder.d.ts.map +1 -0
  458. package/dist/infra/exec-approval-forwarder.js +213 -0
  459. package/dist/infra/exec-approval-forwarder.js.map +1 -0
  460. package/dist/infra/exec-approvals.d.ts +154 -0
  461. package/dist/infra/exec-approvals.d.ts.map +1 -0
  462. package/dist/infra/exec-approvals.js +1041 -0
  463. package/dist/infra/exec-approvals.js.map +1 -0
  464. package/dist/infra/exec-host.d.ts +38 -0
  465. package/dist/infra/exec-host.d.ts.map +1 -0
  466. package/dist/infra/exec-host.js +76 -0
  467. package/dist/infra/exec-host.js.map +1 -0
  468. package/dist/infra/exec-safety.d.ts +2 -0
  469. package/dist/infra/exec-safety.d.ts.map +1 -0
  470. package/dist/infra/exec-safety.js +32 -0
  471. package/dist/infra/exec-safety.js.map +1 -0
  472. package/dist/infra/fetch.d.ts +3 -0
  473. package/dist/infra/fetch.d.ts.map +1 -0
  474. package/dist/infra/fetch.js +59 -0
  475. package/dist/infra/fetch.js.map +1 -0
  476. package/dist/infra/format-duration.d.ts +11 -0
  477. package/dist/infra/format-duration.d.ts.map +1 -0
  478. package/dist/infra/format-duration.js +21 -0
  479. package/dist/infra/format-duration.js.map +1 -0
  480. package/dist/infra/fs-safe.d.ts +17 -0
  481. package/dist/infra/fs-safe.d.ts.map +1 -0
  482. package/dist/infra/fs-safe.js +77 -0
  483. package/dist/infra/fs-safe.js.map +1 -0
  484. package/dist/infra/gateway-lock.d.ts +19 -0
  485. package/dist/infra/gateway-lock.d.ts.map +1 -0
  486. package/dist/infra/gateway-lock.js +204 -0
  487. package/dist/infra/gateway-lock.js.map +1 -0
  488. package/dist/infra/git-commit.d.ts +5 -0
  489. package/dist/infra/git-commit.d.ts.map +1 -0
  490. package/dist/infra/git-commit.js +107 -0
  491. package/dist/infra/git-commit.js.map +1 -0
  492. package/dist/infra/heartbeat-events.d.ts +21 -0
  493. package/dist/infra/heartbeat-events.d.ts.map +1 -0
  494. package/dist/infra/heartbeat-events.js +35 -0
  495. package/dist/infra/heartbeat-events.js.map +1 -0
  496. package/dist/infra/heartbeat-runner.d.ts +45 -0
  497. package/dist/infra/heartbeat-runner.d.ts.map +1 -0
  498. package/dist/infra/heartbeat-runner.js +745 -0
  499. package/dist/infra/heartbeat-runner.js.map +1 -0
  500. package/dist/infra/heartbeat-visibility.d.ts +18 -0
  501. package/dist/infra/heartbeat-visibility.d.ts.map +1 -0
  502. package/dist/infra/heartbeat-visibility.js +46 -0
  503. package/dist/infra/heartbeat-visibility.js.map +1 -0
  504. package/dist/infra/heartbeat-wake.d.ts +21 -0
  505. package/dist/infra/heartbeat-wake.d.ts.map +1 -0
  506. package/dist/infra/heartbeat-wake.js +62 -0
  507. package/dist/infra/heartbeat-wake.js.map +1 -0
  508. package/dist/infra/is-main.d.ts +9 -0
  509. package/dist/infra/is-main.d.ts.map +1 -0
  510. package/dist/infra/is-main.js +34 -0
  511. package/dist/infra/is-main.js.map +1 -0
  512. package/dist/infra/json-file.d.ts +3 -0
  513. package/dist/infra/json-file.d.ts.map +1 -0
  514. package/dist/infra/json-file.js +22 -0
  515. package/dist/infra/json-file.js.map +1 -0
  516. package/dist/infra/machine-name.d.ts +2 -0
  517. package/dist/infra/machine-name.d.ts.map +1 -0
  518. package/dist/infra/machine-name.js +44 -0
  519. package/dist/infra/machine-name.js.map +1 -0
  520. package/dist/infra/node-pairing.d.ts +63 -0
  521. package/dist/infra/node-pairing.d.ts.map +1 -0
  522. package/dist/infra/node-pairing.js +229 -0
  523. package/dist/infra/node-pairing.js.map +1 -0
  524. package/dist/infra/node-shell.d.ts +2 -0
  525. package/dist/infra/node-shell.d.ts.map +1 -0
  526. package/dist/infra/node-shell.js +10 -0
  527. package/dist/infra/node-shell.js.map +1 -0
  528. package/dist/infra/openclaw-root.d.ts +6 -0
  529. package/dist/infra/openclaw-root.d.ts.map +1 -0
  530. package/dist/infra/openclaw-root.js +58 -0
  531. package/dist/infra/openclaw-root.js.map +1 -0
  532. package/dist/infra/os-summary.d.ts +8 -0
  533. package/dist/infra/os-summary.d.ts.map +1 -0
  534. package/dist/infra/os-summary.js +24 -0
  535. package/dist/infra/os-summary.js.map +1 -0
  536. package/dist/infra/path-env.d.ts +14 -0
  537. package/dist/infra/path-env.d.ts.map +1 -0
  538. package/dist/infra/path-env.js +95 -0
  539. package/dist/infra/path-env.js.map +1 -0
  540. package/dist/infra/ports-format.d.ts +6 -0
  541. package/dist/infra/ports-format.d.ts.map +1 -0
  542. package/dist/infra/ports-format.js +55 -0
  543. package/dist/infra/ports-format.js.map +1 -0
  544. package/dist/infra/ports-inspect.d.ts +3 -0
  545. package/dist/infra/ports-inspect.d.ts.map +1 -0
  546. package/dist/infra/ports-inspect.js +241 -0
  547. package/dist/infra/ports-inspect.js.map +1 -0
  548. package/dist/infra/ports-lsof.d.ts +3 -0
  549. package/dist/infra/ports-lsof.d.ts.map +1 -0
  550. package/dist/infra/ports-lsof.js +34 -0
  551. package/dist/infra/ports-lsof.js.map +1 -0
  552. package/dist/infra/ports-types.d.ts +18 -0
  553. package/dist/infra/ports-types.d.ts.map +1 -0
  554. package/dist/infra/ports-types.js +2 -0
  555. package/dist/infra/ports-types.js.map +1 -0
  556. package/dist/infra/ports.d.ts +15 -0
  557. package/dist/infra/ports.d.ts.map +1 -0
  558. package/dist/infra/ports.js +76 -0
  559. package/dist/infra/ports.js.map +1 -0
  560. package/dist/infra/provider-usage.auth.d.ts +12 -0
  561. package/dist/infra/provider-usage.auth.d.ts.map +1 -0
  562. package/dist/infra/provider-usage.auth.js +222 -0
  563. package/dist/infra/provider-usage.auth.js.map +1 -0
  564. package/dist/infra/provider-usage.d.ts +5 -0
  565. package/dist/infra/provider-usage.d.ts.map +1 -0
  566. package/dist/infra/provider-usage.fetch.antigravity.d.ts +3 -0
  567. package/dist/infra/provider-usage.fetch.antigravity.d.ts.map +1 -0
  568. package/dist/infra/provider-usage.fetch.antigravity.js +213 -0
  569. package/dist/infra/provider-usage.fetch.antigravity.js.map +1 -0
  570. package/dist/infra/provider-usage.fetch.claude.d.ts +3 -0
  571. package/dist/infra/provider-usage.fetch.claude.d.ts.map +1 -0
  572. package/dist/infra/provider-usage.fetch.claude.js +130 -0
  573. package/dist/infra/provider-usage.fetch.claude.js.map +1 -0
  574. package/dist/infra/provider-usage.fetch.codex.d.ts +3 -0
  575. package/dist/infra/provider-usage.fetch.codex.d.ts.map +1 -0
  576. package/dist/infra/provider-usage.fetch.codex.js +63 -0
  577. package/dist/infra/provider-usage.fetch.codex.js.map +1 -0
  578. package/dist/infra/provider-usage.fetch.copilot.d.ts +3 -0
  579. package/dist/infra/provider-usage.fetch.copilot.d.ts.map +1 -0
  580. package/dist/infra/provider-usage.fetch.copilot.js +43 -0
  581. package/dist/infra/provider-usage.fetch.copilot.js.map +1 -0
  582. package/dist/infra/provider-usage.fetch.d.ts +8 -0
  583. package/dist/infra/provider-usage.fetch.d.ts.map +1 -0
  584. package/dist/infra/provider-usage.fetch.gemini.d.ts +3 -0
  585. package/dist/infra/provider-usage.fetch.gemini.d.ts.map +1 -0
  586. package/dist/infra/provider-usage.fetch.gemini.js +58 -0
  587. package/dist/infra/provider-usage.fetch.gemini.js.map +1 -0
  588. package/dist/infra/provider-usage.fetch.js +8 -0
  589. package/dist/infra/provider-usage.fetch.js.map +1 -0
  590. package/dist/infra/provider-usage.fetch.minimax.d.ts +3 -0
  591. package/dist/infra/provider-usage.fetch.minimax.d.ts.map +1 -0
  592. package/dist/infra/provider-usage.fetch.minimax.js +333 -0
  593. package/dist/infra/provider-usage.fetch.minimax.js.map +1 -0
  594. package/dist/infra/provider-usage.fetch.shared.d.ts +2 -0
  595. package/dist/infra/provider-usage.fetch.shared.d.ts.map +1 -0
  596. package/dist/infra/provider-usage.fetch.shared.js +11 -0
  597. package/dist/infra/provider-usage.fetch.shared.js.map +1 -0
  598. package/dist/infra/provider-usage.fetch.zai.d.ts +3 -0
  599. package/dist/infra/provider-usage.fetch.zai.d.ts.map +1 -0
  600. package/dist/infra/provider-usage.fetch.zai.js +63 -0
  601. package/dist/infra/provider-usage.fetch.zai.js.map +1 -0
  602. package/dist/infra/provider-usage.format.d.ts +14 -0
  603. package/dist/infra/provider-usage.format.d.ts.map +1 -0
  604. package/dist/infra/provider-usage.format.js +97 -0
  605. package/dist/infra/provider-usage.format.js.map +1 -0
  606. package/dist/infra/provider-usage.js +4 -0
  607. package/dist/infra/provider-usage.js.map +1 -0
  608. package/dist/infra/provider-usage.load.d.ts +13 -0
  609. package/dist/infra/provider-usage.load.d.ts.map +1 -0
  610. package/dist/infra/provider-usage.load.js +66 -0
  611. package/dist/infra/provider-usage.load.js.map +1 -0
  612. package/dist/infra/provider-usage.shared.d.ts +9 -0
  613. package/dist/infra/provider-usage.shared.d.ts.map +1 -0
  614. package/dist/infra/provider-usage.shared.js +54 -0
  615. package/dist/infra/provider-usage.shared.js.map +1 -0
  616. package/dist/infra/provider-usage.types.d.ts +18 -0
  617. package/dist/infra/provider-usage.types.d.ts.map +1 -0
  618. package/dist/infra/provider-usage.types.js +2 -0
  619. package/dist/infra/provider-usage.types.js.map +1 -0
  620. package/dist/infra/restart-sentinel.d.ts +51 -0
  621. package/dist/infra/restart-sentinel.d.ts.map +1 -0
  622. package/dist/infra/restart-sentinel.js +66 -0
  623. package/dist/infra/restart-sentinel.js.map +1 -0
  624. package/dist/infra/restart.d.ts +29 -0
  625. package/dist/infra/restart.d.ts.map +1 -0
  626. package/dist/infra/restart.js +172 -0
  627. package/dist/infra/restart.js.map +1 -0
  628. package/dist/infra/retry-policy.d.ts +26 -0
  629. package/dist/infra/retry-policy.d.ts.map +1 -0
  630. package/dist/infra/retry-policy.js +72 -0
  631. package/dist/infra/retry-policy.js.map +1 -0
  632. package/dist/infra/retry.d.ts +22 -0
  633. package/dist/infra/retry.d.ts.map +1 -0
  634. package/dist/infra/retry.js +86 -0
  635. package/dist/infra/retry.js.map +1 -0
  636. package/dist/infra/runtime-guard.d.ts +21 -0
  637. package/dist/infra/runtime-guard.d.ts.map +1 -0
  638. package/dist/infra/runtime-guard.js +61 -0
  639. package/dist/infra/runtime-guard.js.map +1 -0
  640. package/dist/infra/session-cost-usage.d.ts +37 -0
  641. package/dist/infra/session-cost-usage.d.ts.map +1 -0
  642. package/dist/infra/session-cost-usage.js +191 -0
  643. package/dist/infra/session-cost-usage.js.map +1 -0
  644. package/dist/infra/shell-env.d.ts +34 -0
  645. package/dist/infra/shell-env.d.ts.map +1 -0
  646. package/dist/infra/shell-env.js +126 -0
  647. package/dist/infra/shell-env.js.map +1 -0
  648. package/dist/infra/skills-remote.d.ts +25 -0
  649. package/dist/infra/skills-remote.d.ts.map +1 -0
  650. package/dist/infra/skills-remote.js +283 -0
  651. package/dist/infra/skills-remote.js.map +1 -0
  652. package/dist/infra/ssh-config.d.ts +13 -0
  653. package/dist/infra/ssh-config.d.ts.map +1 -0
  654. package/dist/infra/ssh-config.js +85 -0
  655. package/dist/infra/ssh-config.js.map +1 -0
  656. package/dist/infra/ssh-tunnel.d.ts +22 -0
  657. package/dist/infra/ssh-tunnel.d.ts.map +1 -0
  658. package/dist/infra/ssh-tunnel.js +174 -0
  659. package/dist/infra/ssh-tunnel.js.map +1 -0
  660. package/dist/infra/state-migrations.d.ts +88 -0
  661. package/dist/infra/state-migrations.d.ts.map +1 -0
  662. package/dist/infra/state-migrations.fs.d.ts +15 -0
  663. package/dist/infra/state-migrations.fs.d.ts.map +1 -0
  664. package/dist/infra/state-migrations.fs.js +50 -0
  665. package/dist/infra/state-migrations.fs.js.map +1 -0
  666. package/dist/infra/state-migrations.js +658 -0
  667. package/dist/infra/state-migrations.js.map +1 -0
  668. package/dist/infra/system-events.d.ts +17 -0
  669. package/dist/infra/system-events.d.ts.map +1 -0
  670. package/dist/infra/system-events.js +76 -0
  671. package/dist/infra/system-events.js.map +1 -0
  672. package/dist/infra/system-presence.d.ts +46 -0
  673. package/dist/infra/system-presence.d.ts.map +1 -0
  674. package/dist/infra/system-presence.js +232 -0
  675. package/dist/infra/system-presence.js.map +1 -0
  676. package/dist/infra/tailnet.d.ts +8 -0
  677. package/dist/infra/tailnet.d.ts.map +1 -0
  678. package/dist/infra/tailnet.js +47 -0
  679. package/dist/infra/tailnet.js.map +1 -0
  680. package/dist/infra/tailscale.d.ts +35 -0
  681. package/dist/infra/tailscale.d.ts.map +1 -0
  682. package/dist/infra/tailscale.js +369 -0
  683. package/dist/infra/tailscale.js.map +1 -0
  684. package/dist/infra/transport-ready.d.ts +17 -0
  685. package/dist/infra/transport-ready.d.ts.map +1 -0
  686. package/dist/infra/transport-ready.js +39 -0
  687. package/dist/infra/transport-ready.js.map +1 -0
  688. package/dist/infra/unhandled-rejections.d.ts +16 -0
  689. package/dist/infra/unhandled-rejections.d.ts.map +1 -0
  690. package/dist/infra/unhandled-rejections.js +140 -0
  691. package/dist/infra/unhandled-rejections.js.map +1 -0
  692. package/dist/infra/update-channels.d.ts +27 -0
  693. package/dist/infra/update-channels.d.ts.map +1 -0
  694. package/dist/infra/update-channels.js +58 -0
  695. package/dist/infra/update-channels.js.map +1 -0
  696. package/dist/infra/update-check.d.ts +69 -0
  697. package/dist/infra/update-check.d.ts.map +1 -0
  698. package/dist/infra/update-check.js +294 -0
  699. package/dist/infra/update-check.js.map +1 -0
  700. package/dist/infra/update-global.d.ts +16 -0
  701. package/dist/infra/update-global.d.ts.map +1 -0
  702. package/dist/infra/update-global.js +96 -0
  703. package/dist/infra/update-global.js.map +1 -0
  704. package/dist/infra/update-runner.d.ts +59 -0
  705. package/dist/infra/update-runner.d.ts.map +1 -0
  706. package/dist/infra/update-runner.js +578 -0
  707. package/dist/infra/update-runner.js.map +1 -0
  708. package/dist/infra/update-startup.d.ts +17 -0
  709. package/dist/infra/update-startup.d.ts.map +1 -0
  710. package/dist/infra/update-startup.js +87 -0
  711. package/dist/infra/update-startup.js.map +1 -0
  712. package/dist/infra/voicewake.d.ts +8 -0
  713. package/dist/infra/voicewake.d.ts.map +1 -0
  714. package/dist/infra/voicewake.js +75 -0
  715. package/dist/infra/voicewake.js.map +1 -0
  716. package/dist/infra/warnings.d.ts +2 -0
  717. package/dist/infra/warnings.d.ts.map +1 -0
  718. package/dist/infra/warnings.js +26 -0
  719. package/dist/infra/warnings.js.map +1 -0
  720. package/dist/infra/widearea-dns.d.ts +28 -0
  721. package/dist/infra/widearea-dns.d.ts.map +1 -0
  722. package/dist/infra/widearea-dns.js +149 -0
  723. package/dist/infra/widearea-dns.js.map +1 -0
  724. package/dist/infra/ws.d.ts +3 -0
  725. package/dist/infra/ws.d.ts.map +1 -0
  726. package/dist/infra/ws.js +14 -0
  727. package/dist/infra/ws.js.map +1 -0
  728. package/dist/infra/wsl.d.ts +3 -0
  729. package/dist/infra/wsl.d.ts.map +1 -0
  730. package/dist/infra/wsl.js +26 -0
  731. package/dist/infra/wsl.js.map +1 -0
  732. package/dist/logging/config.d.ts +5 -0
  733. package/dist/logging/config.d.ts.map +1 -0
  734. package/dist/logging/config.js +20 -0
  735. package/dist/logging/config.js.map +1 -0
  736. package/dist/logging/console.d.ts +20 -0
  737. package/dist/logging/console.d.ts.map +1 -0
  738. package/dist/logging/console.js +238 -0
  739. package/dist/logging/console.js.map +1 -0
  740. package/dist/logging/diagnostic.d.ts +59 -0
  741. package/dist/logging/diagnostic.d.ts.map +1 -0
  742. package/dist/logging/diagnostic.js +237 -0
  743. package/dist/logging/diagnostic.js.map +1 -0
  744. package/dist/logging/levels.d.ts +5 -0
  745. package/dist/logging/levels.d.ts.map +1 -0
  746. package/dist/logging/levels.js +27 -0
  747. package/dist/logging/levels.js.map +1 -0
  748. package/dist/logging/logger.d.ts +43 -0
  749. package/dist/logging/logger.d.ts.map +1 -0
  750. package/dist/logging/logger.js +186 -0
  751. package/dist/logging/logger.js.map +1 -0
  752. package/dist/logging/parse-log-line.d.ts +10 -0
  753. package/dist/logging/parse-log-line.d.ts.map +1 -0
  754. package/dist/logging/parse-log-line.js +53 -0
  755. package/dist/logging/parse-log-line.js.map +1 -0
  756. package/dist/logging/redact.d.ts +10 -0
  757. package/dist/logging/redact.d.ts.map +1 -0
  758. package/dist/logging/redact.js +116 -0
  759. package/dist/logging/redact.js.map +1 -0
  760. package/dist/logging/state.d.ts +18 -0
  761. package/dist/logging/state.d.ts.map +1 -0
  762. package/dist/logging/state.js +13 -0
  763. package/dist/logging/state.js.map +1 -0
  764. package/dist/logging/subsystem.d.ts +17 -0
  765. package/dist/logging/subsystem.d.ts.map +1 -0
  766. package/dist/logging/subsystem.js +235 -0
  767. package/dist/logging/subsystem.js.map +1 -0
  768. package/dist/media/audio-tags.d.ts +11 -0
  769. package/dist/media/audio-tags.d.ts.map +1 -0
  770. package/dist/media/audio-tags.js +15 -0
  771. package/dist/media/audio-tags.js.map +1 -0
  772. package/dist/media/audio.d.ts +5 -0
  773. package/dist/media/audio.d.ts.map +1 -0
  774. package/dist/media/audio.js +16 -0
  775. package/dist/media/audio.js.map +1 -0
  776. package/dist/media/constants.d.ts +8 -0
  777. package/dist/media/constants.d.ts.map +1 -0
  778. package/dist/media/constants.js +34 -0
  779. package/dist/media/constants.js.map +1 -0
  780. package/dist/media/fetch.d.ts +20 -0
  781. package/dist/media/fetch.d.ts.map +1 -0
  782. package/dist/media/fetch.js +152 -0
  783. package/dist/media/fetch.js.map +1 -0
  784. package/dist/media/host.d.ts +12 -0
  785. package/dist/media/host.d.ts.map +1 -0
  786. package/dist/media/host.js +44 -0
  787. package/dist/media/host.js.map +1 -0
  788. package/dist/media/image-ops.d.ts +40 -0
  789. package/dist/media/image-ops.d.ts.map +1 -0
  790. package/dist/media/image-ops.js +386 -0
  791. package/dist/media/image-ops.js.map +1 -0
  792. package/dist/media/input-files.d.ts +77 -0
  793. package/dist/media/input-files.d.ts.map +1 -0
  794. package/dist/media/input-files.js +277 -0
  795. package/dist/media/input-files.js.map +1 -0
  796. package/dist/media/mime.d.ts +16 -0
  797. package/dist/media/mime.d.ts.map +1 -0
  798. package/dist/media/mime.js +151 -0
  799. package/dist/media/mime.js.map +1 -0
  800. package/dist/media/parse.d.ts +9 -0
  801. package/dist/media/parse.d.ts.map +1 -0
  802. package/dist/media/parse.js +176 -0
  803. package/dist/media/parse.js.map +1 -0
  804. package/dist/media/server.d.ts +6 -0
  805. package/dist/media/server.d.ts.map +1 -0
  806. package/dist/media/server.js +89 -0
  807. package/dist/media/server.js.map +1 -0
  808. package/dist/media/store.d.ts +19 -0
  809. package/dist/media/store.d.ts.map +1 -0
  810. package/dist/media/store.js +201 -0
  811. package/dist/media/store.js.map +1 -0
  812. package/dist/process/exec.d.ts +23 -0
  813. package/dist/process/exec.d.ts.map +1 -0
  814. package/dist/process/exec.js +99 -0
  815. package/dist/process/exec.js.map +1 -0
  816. package/dist/schema/typebox.d.ts +40 -0
  817. package/dist/schema/typebox.d.ts.map +1 -0
  818. package/dist/schema/typebox.js +796 -0
  819. package/dist/schema/typebox.js.map +1 -0
  820. package/dist/server.d.ts +52 -0
  821. package/dist/server.d.ts.map +1 -0
  822. package/dist/server.js +322 -0
  823. package/dist/server.js.map +1 -0
  824. package/dist/services/supabase.d.ts +67 -0
  825. package/dist/services/supabase.d.ts.map +1 -0
  826. package/dist/services/supabase.js +106 -0
  827. package/dist/services/supabase.js.map +1 -0
  828. package/dist/skills/index.d.ts +24 -0
  829. package/dist/skills/index.d.ts.map +1 -0
  830. package/dist/skills/index.js +26 -0
  831. package/dist/skills/index.js.map +1 -0
  832. package/dist/skills/loader.d.ts +29 -0
  833. package/dist/skills/loader.d.ts.map +1 -0
  834. package/dist/skills/loader.js +176 -0
  835. package/dist/skills/loader.js.map +1 -0
  836. package/dist/skills/manager.d.ts +85 -0
  837. package/dist/skills/manager.d.ts.map +1 -0
  838. package/dist/skills/manager.js +179 -0
  839. package/dist/skills/manager.js.map +1 -0
  840. package/dist/skills/status.d.ts +26 -0
  841. package/dist/skills/status.d.ts.map +1 -0
  842. package/dist/skills/status.js +238 -0
  843. package/dist/skills/status.js.map +1 -0
  844. package/dist/skills/types.d.ts +182 -0
  845. package/dist/skills/types.d.ts.map +1 -0
  846. package/dist/skills/types.js +9 -0
  847. package/dist/skills/types.js.map +1 -0
  848. package/dist/supabase/client.d.ts +18 -0
  849. package/dist/supabase/client.d.ts.map +1 -0
  850. package/dist/supabase/client.js +43 -0
  851. package/dist/supabase/client.js.map +1 -0
  852. package/dist/supabase/context.d.ts +25 -0
  853. package/dist/supabase/context.d.ts.map +1 -0
  854. package/dist/supabase/context.js +109 -0
  855. package/dist/supabase/context.js.map +1 -0
  856. package/dist/supabase/cron-jobs.d.ts +79 -0
  857. package/dist/supabase/cron-jobs.d.ts.map +1 -0
  858. package/dist/supabase/cron-jobs.js +396 -0
  859. package/dist/supabase/cron-jobs.js.map +1 -0
  860. package/dist/supabase/heartbeat-items.d.ts +50 -0
  861. package/dist/supabase/heartbeat-items.d.ts.map +1 -0
  862. package/dist/supabase/heartbeat-items.js +179 -0
  863. package/dist/supabase/heartbeat-items.js.map +1 -0
  864. package/dist/supabase/index.d.ts +13 -0
  865. package/dist/supabase/index.d.ts.map +1 -0
  866. package/dist/supabase/index.js +12 -0
  867. package/dist/supabase/index.js.map +1 -0
  868. package/dist/supabase/memory.d.ts +49 -0
  869. package/dist/supabase/memory.d.ts.map +1 -0
  870. package/dist/supabase/memory.js +157 -0
  871. package/dist/supabase/memory.js.map +1 -0
  872. package/dist/supabase/notifications.d.ts +35 -0
  873. package/dist/supabase/notifications.d.ts.map +1 -0
  874. package/dist/supabase/notifications.js +46 -0
  875. package/dist/supabase/notifications.js.map +1 -0
  876. package/dist/supabase/requests.d.ts +69 -0
  877. package/dist/supabase/requests.d.ts.map +1 -0
  878. package/dist/supabase/requests.js +246 -0
  879. package/dist/supabase/requests.js.map +1 -0
  880. package/dist/supabase/types.d.ts +65 -0
  881. package/dist/supabase/types.d.ts.map +1 -0
  882. package/dist/supabase/types.js +5 -0
  883. package/dist/supabase/types.js.map +1 -0
  884. package/dist/supabase/workspace-storage.d.ts +54 -0
  885. package/dist/supabase/workspace-storage.d.ts.map +1 -0
  886. package/dist/supabase/workspace-storage.js +217 -0
  887. package/dist/supabase/workspace-storage.js.map +1 -0
  888. package/dist/tools/bash-tools.shared.d.ts +26 -0
  889. package/dist/tools/bash-tools.shared.d.ts.map +1 -0
  890. package/dist/tools/bash-tools.shared.js +135 -0
  891. package/dist/tools/bash-tools.shared.js.map +1 -0
  892. package/dist/tools/browser-new.d.ts +7 -0
  893. package/dist/tools/browser-new.d.ts.map +1 -0
  894. package/dist/tools/browser-new.js +329 -0
  895. package/dist/tools/browser-new.js.map +1 -0
  896. package/dist/tools/browser-openclaw.d.ts +6 -0
  897. package/dist/tools/browser-openclaw.d.ts.map +1 -0
  898. package/dist/tools/browser-openclaw.js +597 -0
  899. package/dist/tools/browser-openclaw.js.map +1 -0
  900. package/dist/tools/browser-tool.schema.d.ts +51 -0
  901. package/dist/tools/browser-tool.schema.d.ts.map +1 -0
  902. package/dist/tools/browser-tool.schema.js +106 -0
  903. package/dist/tools/browser-tool.schema.js.map +1 -0
  904. package/dist/tools/browser.d.ts +9 -0
  905. package/dist/tools/browser.d.ts.map +1 -0
  906. package/dist/tools/browser.js +1629 -0
  907. package/dist/tools/browser.js.map +1 -0
  908. package/dist/tools/built-in-tools.d.ts +27 -0
  909. package/dist/tools/built-in-tools.d.ts.map +1 -0
  910. package/dist/tools/built-in-tools.js +86 -0
  911. package/dist/tools/built-in-tools.js.map +1 -0
  912. package/dist/tools/calendar.d.ts +16 -0
  913. package/dist/tools/calendar.d.ts.map +1 -0
  914. package/dist/tools/calendar.js +244 -0
  915. package/dist/tools/calendar.js.map +1 -0
  916. package/dist/tools/cron.d.ts +22 -0
  917. package/dist/tools/cron.d.ts.map +1 -0
  918. package/dist/tools/cron.js +273 -0
  919. package/dist/tools/cron.js.map +1 -0
  920. package/dist/tools/email.d.ts +16 -0
  921. package/dist/tools/email.d.ts.map +1 -0
  922. package/dist/tools/email.js +435 -0
  923. package/dist/tools/email.js.map +1 -0
  924. package/dist/tools/exec.d.ts +40 -0
  925. package/dist/tools/exec.d.ts.map +1 -0
  926. package/dist/tools/exec.js +446 -0
  927. package/dist/tools/exec.js.map +1 -0
  928. package/dist/tools/fetch-api-data.d.ts +9 -0
  929. package/dist/tools/fetch-api-data.d.ts.map +1 -0
  930. package/dist/tools/fetch-api-data.js +120 -0
  931. package/dist/tools/fetch-api-data.js.map +1 -0
  932. package/dist/tools/file-ops.d.ts +14 -0
  933. package/dist/tools/file-ops.d.ts.map +1 -0
  934. package/dist/tools/file-ops.js +19 -0
  935. package/dist/tools/file-ops.js.map +1 -0
  936. package/dist/tools/generate-image.d.ts +8 -0
  937. package/dist/tools/generate-image.d.ts.map +1 -0
  938. package/dist/tools/generate-image.js +99 -0
  939. package/dist/tools/generate-image.js.map +1 -0
  940. package/dist/tools/generate-video.d.ts +9 -0
  941. package/dist/tools/generate-video.d.ts.map +1 -0
  942. package/dist/tools/generate-video.js +178 -0
  943. package/dist/tools/generate-video.js.map +1 -0
  944. package/dist/tools/google-maps.d.ts +11 -0
  945. package/dist/tools/google-maps.d.ts.map +1 -0
  946. package/dist/tools/google-maps.js +285 -0
  947. package/dist/tools/google-maps.js.map +1 -0
  948. package/dist/tools/image.d.ts +9 -0
  949. package/dist/tools/image.d.ts.map +1 -0
  950. package/dist/tools/image.js +124 -0
  951. package/dist/tools/image.js.map +1 -0
  952. package/dist/tools/index.d.ts +40 -0
  953. package/dist/tools/index.d.ts.map +1 -0
  954. package/dist/tools/index.js +104 -0
  955. package/dist/tools/index.js.map +1 -0
  956. package/dist/tools/memory.d.ts +16 -0
  957. package/dist/tools/memory.d.ts.map +1 -0
  958. package/dist/tools/memory.js +118 -0
  959. package/dist/tools/memory.js.map +1 -0
  960. package/dist/tools/message.d.ts +8 -0
  961. package/dist/tools/message.d.ts.map +1 -0
  962. package/dist/tools/message.js +60 -0
  963. package/dist/tools/message.js.map +1 -0
  964. package/dist/tools/process-registry.d.ts +73 -0
  965. package/dist/tools/process-registry.d.ts.map +1 -0
  966. package/dist/tools/process-registry.js +185 -0
  967. package/dist/tools/process-registry.js.map +1 -0
  968. package/dist/tools/process.d.ts +24 -0
  969. package/dist/tools/process.d.ts.map +1 -0
  970. package/dist/tools/process.js +586 -0
  971. package/dist/tools/process.js.map +1 -0
  972. package/dist/tools/pty-dsr.d.ts +12 -0
  973. package/dist/tools/pty-dsr.d.ts.map +1 -0
  974. package/dist/tools/pty-dsr.js +20 -0
  975. package/dist/tools/pty-dsr.js.map +1 -0
  976. package/dist/tools/pty-keys.d.ts +20 -0
  977. package/dist/tools/pty-keys.d.ts.map +1 -0
  978. package/dist/tools/pty-keys.js +242 -0
  979. package/dist/tools/pty-keys.js.map +1 -0
  980. package/dist/tools/session-slug.d.ts +8 -0
  981. package/dist/tools/session-slug.d.ts.map +1 -0
  982. package/dist/tools/session-slug.js +136 -0
  983. package/dist/tools/session-slug.js.map +1 -0
  984. package/dist/tools/session-status.d.ts +7 -0
  985. package/dist/tools/session-status.d.ts.map +1 -0
  986. package/dist/tools/session-status.js +55 -0
  987. package/dist/tools/session-status.js.map +1 -0
  988. package/dist/tools/shell-utils.d.ts +13 -0
  989. package/dist/tools/shell-utils.d.ts.map +1 -0
  990. package/dist/tools/shell-utils.js +106 -0
  991. package/dist/tools/shell-utils.js.map +1 -0
  992. package/dist/tools/tts.d.ts +9 -0
  993. package/dist/tools/tts.d.ts.map +1 -0
  994. package/dist/tools/tts.js +102 -0
  995. package/dist/tools/tts.js.map +1 -0
  996. package/dist/tools/web-fetch.d.ts +9 -0
  997. package/dist/tools/web-fetch.d.ts.map +1 -0
  998. package/dist/tools/web-fetch.js +129 -0
  999. package/dist/tools/web-fetch.js.map +1 -0
  1000. package/dist/tools/web-search.d.ts +15 -0
  1001. package/dist/tools/web-search.d.ts.map +1 -0
  1002. package/dist/tools/web-search.js +119 -0
  1003. package/dist/tools/web-search.js.map +1 -0
  1004. package/dist/types/tool.d.ts +31 -0
  1005. package/dist/types/tool.d.ts.map +1 -0
  1006. package/dist/types/tool.js +5 -0
  1007. package/dist/types/tool.js.map +1 -0
  1008. package/dist/updates/checker.d.ts +51 -0
  1009. package/dist/updates/checker.d.ts.map +1 -0
  1010. package/dist/updates/checker.js +237 -0
  1011. package/dist/updates/checker.js.map +1 -0
  1012. package/dist/updates/index.d.ts +6 -0
  1013. package/dist/updates/index.d.ts.map +1 -0
  1014. package/dist/updates/index.js +6 -0
  1015. package/dist/updates/index.js.map +1 -0
  1016. package/dist/updates/notifier.d.ts +17 -0
  1017. package/dist/updates/notifier.d.ts.map +1 -0
  1018. package/dist/updates/notifier.js +44 -0
  1019. package/dist/updates/notifier.js.map +1 -0
  1020. package/dist/utils/google-oauth.d.ts +58 -0
  1021. package/dist/utils/google-oauth.d.ts.map +1 -0
  1022. package/dist/utils/google-oauth.js +161 -0
  1023. package/dist/utils/google-oauth.js.map +1 -0
  1024. package/dist/utils/log-buffer.d.ts +35 -0
  1025. package/dist/utils/log-buffer.d.ts.map +1 -0
  1026. package/dist/utils/log-buffer.js +100 -0
  1027. package/dist/utils/log-buffer.js.map +1 -0
  1028. package/dist/utils/tool-helpers.d.ts +48 -0
  1029. package/dist/utils/tool-helpers.d.ts.map +1 -0
  1030. package/dist/utils/tool-helpers.js +125 -0
  1031. package/dist/utils/tool-helpers.js.map +1 -0
  1032. package/dist/utils/utils.d.ts +44 -0
  1033. package/dist/utils/utils.d.ts.map +1 -0
  1034. package/dist/utils/utils.js +257 -0
  1035. package/dist/utils/utils.js.map +1 -0
  1036. package/dist/web-server.d.ts +30 -0
  1037. package/dist/web-server.d.ts.map +1 -0
  1038. package/dist/web-server.js +367 -0
  1039. package/dist/web-server.js.map +1 -0
  1040. package/dist/workspace/context.d.ts +23 -0
  1041. package/dist/workspace/context.d.ts.map +1 -0
  1042. package/dist/workspace/context.js +88 -0
  1043. package/dist/workspace/context.js.map +1 -0
  1044. package/dist/workspace/generator.d.ts +47 -0
  1045. package/dist/workspace/generator.d.ts.map +1 -0
  1046. package/dist/workspace/generator.js +261 -0
  1047. package/dist/workspace/generator.js.map +1 -0
  1048. package/dist/workspace/index.d.ts +9 -0
  1049. package/dist/workspace/index.d.ts.map +1 -0
  1050. package/dist/workspace/index.js +9 -0
  1051. package/dist/workspace/index.js.map +1 -0
  1052. package/dist/workspace/templates.d.ts +36 -0
  1053. package/dist/workspace/templates.d.ts.map +1 -0
  1054. package/dist/workspace/templates.js +280 -0
  1055. package/dist/workspace/templates.js.map +1 -0
  1056. package/dist/workspace/workspace.d.ts +79 -0
  1057. package/dist/workspace/workspace.d.ts.map +1 -0
  1058. package/dist/workspace/workspace.js +234 -0
  1059. package/dist/workspace/workspace.js.map +1 -0
  1060. package/package.json +98 -0
  1061. package/public/index.html +1625 -0
  1062. package/scripts/install.sh +311 -0
  1063. package/scripts/postinstall.js +135 -0
  1064. package/skills/commit/SKILL.md +69 -0
  1065. package/skills/review-pr/SKILL.md +105 -0
  1066. package/skills/skill-creator/SKILL.md +236 -0
  1067. package/skills/test/SKILL.md +57 -0
@@ -0,0 +1,745 @@
1
+ import fs from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { resolveAgentConfig, resolveAgentWorkspaceDir, resolveDefaultAgentId, } from "../agents/agent-scope.js";
4
+ import { resolveUserTimezone } from "../agents/date-time.js";
5
+ import { resolveEffectiveMessagesConfig } from "../agents/identity.js";
6
+ import { DEFAULT_HEARTBEAT_FILENAME } from "../agents/workspace.js";
7
+ import { DEFAULT_HEARTBEAT_ACK_MAX_CHARS, DEFAULT_HEARTBEAT_EVERY, isHeartbeatContentEffectivelyEmpty, resolveHeartbeatPrompt as resolveHeartbeatPromptText, stripHeartbeatToken, } from "../auto-reply/heartbeat.js";
8
+ import { HEARTBEAT_TOKEN } from "../auto-reply/tokens.js";
9
+ import { getReplyFromConfig } from "../auto-reply/reply.js";
10
+ import { getChannelPlugin } from "../channels/plugins/index.js";
11
+ import { parseDurationMs } from "../cli/parse-duration.js";
12
+ import { loadConfig } from "../config/config.js";
13
+ import { canonicalizeMainSessionAlias, loadSessionStore, resolveAgentIdFromSessionKey, resolveAgentMainSessionKey, resolveStorePath, saveSessionStore, updateSessionStore, } from "../config/sessions.js";
14
+ import { formatErrorMessage } from "../infra/errors.js";
15
+ import { peekSystemEvents } from "../infra/system-events.js";
16
+ import { createSubsystemLogger } from "../logging/subsystem.js";
17
+ import { getQueueSize } from "../process/command-queue.js";
18
+ import { CommandLane } from "../process/lanes.js";
19
+ import { defaultRuntime } from "../runtime.js";
20
+ import { normalizeAgentId, toAgentStoreSessionKey } from "../routing/session-key.js";
21
+ import { emitHeartbeatEvent, resolveIndicatorType } from "./heartbeat-events.js";
22
+ import { resolveHeartbeatVisibility } from "./heartbeat-visibility.js";
23
+ import { requestHeartbeatNow, setHeartbeatWakeHandler, } from "./heartbeat-wake.js";
24
+ import { deliverOutboundPayloads } from "./outbound/deliver.js";
25
+ import { resolveHeartbeatDeliveryTarget, resolveHeartbeatSenderContext, } from "./outbound/targets.js";
26
+ const log = createSubsystemLogger("gateway/heartbeat");
27
+ let heartbeatsEnabled = true;
28
+ export function setHeartbeatsEnabled(enabled) {
29
+ heartbeatsEnabled = enabled;
30
+ }
31
+ const DEFAULT_HEARTBEAT_TARGET = "last";
32
+ const ACTIVE_HOURS_TIME_PATTERN = /^([01]\d|2[0-3]|24):([0-5]\d)$/;
33
+ // Prompt used when an async exec has completed and the result should be relayed to the user.
34
+ // This overrides the standard heartbeat prompt to ensure the model responds with the exec result
35
+ // instead of just "HEARTBEAT_OK".
36
+ const EXEC_EVENT_PROMPT = "An async command you ran earlier has completed. The result is shown in the system messages above. " +
37
+ "Please relay the command output to the user in a helpful way. If the command succeeded, share the relevant output. " +
38
+ "If it failed, explain what went wrong.";
39
+ function resolveActiveHoursTimezone(cfg, raw) {
40
+ const trimmed = raw?.trim();
41
+ if (!trimmed || trimmed === "user") {
42
+ return resolveUserTimezone(cfg.agents?.defaults?.userTimezone);
43
+ }
44
+ if (trimmed === "local") {
45
+ const host = Intl.DateTimeFormat().resolvedOptions().timeZone;
46
+ return host?.trim() || "UTC";
47
+ }
48
+ try {
49
+ new Intl.DateTimeFormat("en-US", { timeZone: trimmed }).format(new Date());
50
+ return trimmed;
51
+ }
52
+ catch {
53
+ return resolveUserTimezone(cfg.agents?.defaults?.userTimezone);
54
+ }
55
+ }
56
+ function parseActiveHoursTime(opts, raw) {
57
+ if (!raw || !ACTIVE_HOURS_TIME_PATTERN.test(raw))
58
+ return null;
59
+ const [hourStr, minuteStr] = raw.split(":");
60
+ const hour = Number(hourStr);
61
+ const minute = Number(minuteStr);
62
+ if (!Number.isFinite(hour) || !Number.isFinite(minute))
63
+ return null;
64
+ if (hour === 24) {
65
+ if (!opts.allow24 || minute !== 0)
66
+ return null;
67
+ return 24 * 60;
68
+ }
69
+ return hour * 60 + minute;
70
+ }
71
+ function resolveMinutesInTimeZone(nowMs, timeZone) {
72
+ try {
73
+ const parts = new Intl.DateTimeFormat("en-US", {
74
+ timeZone,
75
+ hour: "2-digit",
76
+ minute: "2-digit",
77
+ hourCycle: "h23",
78
+ }).formatToParts(new Date(nowMs));
79
+ const map = {};
80
+ for (const part of parts) {
81
+ if (part.type !== "literal")
82
+ map[part.type] = part.value;
83
+ }
84
+ const hour = Number(map.hour);
85
+ const minute = Number(map.minute);
86
+ if (!Number.isFinite(hour) || !Number.isFinite(minute))
87
+ return null;
88
+ return hour * 60 + minute;
89
+ }
90
+ catch {
91
+ return null;
92
+ }
93
+ }
94
+ function isWithinActiveHours(cfg, heartbeat, nowMs) {
95
+ const active = heartbeat?.activeHours;
96
+ if (!active)
97
+ return true;
98
+ const startMin = parseActiveHoursTime({ allow24: false }, active.start);
99
+ const endMin = parseActiveHoursTime({ allow24: true }, active.end);
100
+ if (startMin === null || endMin === null)
101
+ return true;
102
+ if (startMin === endMin)
103
+ return true;
104
+ const timeZone = resolveActiveHoursTimezone(cfg, active.timezone);
105
+ const currentMin = resolveMinutesInTimeZone(nowMs ?? Date.now(), timeZone);
106
+ if (currentMin === null)
107
+ return true;
108
+ if (endMin > startMin) {
109
+ return currentMin >= startMin && currentMin < endMin;
110
+ }
111
+ return currentMin >= startMin || currentMin < endMin;
112
+ }
113
+ function hasExplicitHeartbeatAgents(cfg) {
114
+ const list = cfg.agents?.list ?? [];
115
+ return list.some((entry) => Boolean(entry?.heartbeat));
116
+ }
117
+ export function isHeartbeatEnabledForAgent(cfg, agentId) {
118
+ const resolvedAgentId = normalizeAgentId(agentId ?? resolveDefaultAgentId(cfg));
119
+ const list = cfg.agents?.list ?? [];
120
+ const hasExplicit = hasExplicitHeartbeatAgents(cfg);
121
+ if (hasExplicit) {
122
+ return list.some((entry) => Boolean(entry?.heartbeat) && normalizeAgentId(entry?.id) === resolvedAgentId);
123
+ }
124
+ return resolvedAgentId === resolveDefaultAgentId(cfg);
125
+ }
126
+ function resolveHeartbeatConfig(cfg, agentId) {
127
+ const defaults = cfg.agents?.defaults?.heartbeat;
128
+ if (!agentId)
129
+ return defaults;
130
+ const overrides = resolveAgentConfig(cfg, agentId)?.heartbeat;
131
+ if (!defaults && !overrides)
132
+ return overrides;
133
+ return { ...defaults, ...overrides };
134
+ }
135
+ export function resolveHeartbeatSummaryForAgent(cfg, agentId) {
136
+ const defaults = cfg.agents?.defaults?.heartbeat;
137
+ const overrides = agentId ? resolveAgentConfig(cfg, agentId)?.heartbeat : undefined;
138
+ const enabled = isHeartbeatEnabledForAgent(cfg, agentId);
139
+ if (!enabled) {
140
+ return {
141
+ enabled: false,
142
+ every: "disabled",
143
+ everyMs: null,
144
+ prompt: resolveHeartbeatPromptText(defaults?.prompt),
145
+ target: defaults?.target ?? DEFAULT_HEARTBEAT_TARGET,
146
+ model: defaults?.model,
147
+ ackMaxChars: Math.max(0, defaults?.ackMaxChars ?? DEFAULT_HEARTBEAT_ACK_MAX_CHARS),
148
+ };
149
+ }
150
+ const merged = defaults || overrides ? { ...defaults, ...overrides } : undefined;
151
+ const every = merged?.every ?? defaults?.every ?? overrides?.every ?? DEFAULT_HEARTBEAT_EVERY;
152
+ const everyMs = resolveHeartbeatIntervalMs(cfg, undefined, merged);
153
+ const prompt = resolveHeartbeatPromptText(merged?.prompt ?? defaults?.prompt ?? overrides?.prompt);
154
+ const target = merged?.target ?? defaults?.target ?? overrides?.target ?? DEFAULT_HEARTBEAT_TARGET;
155
+ const model = merged?.model ?? defaults?.model ?? overrides?.model;
156
+ const ackMaxChars = Math.max(0, merged?.ackMaxChars ??
157
+ defaults?.ackMaxChars ??
158
+ overrides?.ackMaxChars ??
159
+ DEFAULT_HEARTBEAT_ACK_MAX_CHARS);
160
+ return {
161
+ enabled: true,
162
+ every,
163
+ everyMs,
164
+ prompt,
165
+ target,
166
+ model,
167
+ ackMaxChars,
168
+ };
169
+ }
170
+ function resolveHeartbeatAgents(cfg) {
171
+ const list = cfg.agents?.list ?? [];
172
+ if (hasExplicitHeartbeatAgents(cfg)) {
173
+ return list
174
+ .filter((entry) => entry?.heartbeat)
175
+ .map((entry) => {
176
+ const id = normalizeAgentId(entry.id);
177
+ return { agentId: id, heartbeat: resolveHeartbeatConfig(cfg, id) };
178
+ })
179
+ .filter((entry) => entry.agentId);
180
+ }
181
+ const fallbackId = resolveDefaultAgentId(cfg);
182
+ return [{ agentId: fallbackId, heartbeat: resolveHeartbeatConfig(cfg, fallbackId) }];
183
+ }
184
+ export function resolveHeartbeatIntervalMs(cfg, overrideEvery, heartbeat) {
185
+ const raw = overrideEvery ??
186
+ heartbeat?.every ??
187
+ cfg.agents?.defaults?.heartbeat?.every ??
188
+ DEFAULT_HEARTBEAT_EVERY;
189
+ if (!raw)
190
+ return null;
191
+ const trimmed = String(raw).trim();
192
+ if (!trimmed)
193
+ return null;
194
+ let ms;
195
+ try {
196
+ ms = parseDurationMs(trimmed, { defaultUnit: "m" });
197
+ }
198
+ catch {
199
+ return null;
200
+ }
201
+ if (ms <= 0)
202
+ return null;
203
+ return ms;
204
+ }
205
+ export function resolveHeartbeatPrompt(cfg, heartbeat) {
206
+ return resolveHeartbeatPromptText(heartbeat?.prompt ?? cfg.agents?.defaults?.heartbeat?.prompt);
207
+ }
208
+ function resolveHeartbeatAckMaxChars(cfg, heartbeat) {
209
+ return Math.max(0, heartbeat?.ackMaxChars ??
210
+ cfg.agents?.defaults?.heartbeat?.ackMaxChars ??
211
+ DEFAULT_HEARTBEAT_ACK_MAX_CHARS);
212
+ }
213
+ function resolveHeartbeatSession(cfg, agentId, heartbeat) {
214
+ const sessionCfg = cfg.session;
215
+ const scope = sessionCfg?.scope ?? "per-sender";
216
+ const resolvedAgentId = normalizeAgentId(agentId ?? resolveDefaultAgentId(cfg));
217
+ const mainSessionKey = scope === "global" ? "global" : resolveAgentMainSessionKey({ cfg, agentId: resolvedAgentId });
218
+ const storeAgentId = scope === "global" ? resolveDefaultAgentId(cfg) : resolvedAgentId;
219
+ const storePath = resolveStorePath(sessionCfg?.store, { agentId: storeAgentId });
220
+ const store = loadSessionStore(storePath);
221
+ const mainEntry = store[mainSessionKey];
222
+ if (scope === "global") {
223
+ return { sessionKey: mainSessionKey, storePath, store, entry: mainEntry };
224
+ }
225
+ const trimmed = heartbeat?.session?.trim() ?? "";
226
+ if (!trimmed) {
227
+ return { sessionKey: mainSessionKey, storePath, store, entry: mainEntry };
228
+ }
229
+ const normalized = trimmed.toLowerCase();
230
+ if (normalized === "main" || normalized === "global") {
231
+ return { sessionKey: mainSessionKey, storePath, store, entry: mainEntry };
232
+ }
233
+ const candidate = toAgentStoreSessionKey({
234
+ agentId: resolvedAgentId,
235
+ requestKey: trimmed,
236
+ mainKey: cfg.session?.mainKey,
237
+ });
238
+ const canonical = canonicalizeMainSessionAlias({
239
+ cfg,
240
+ agentId: resolvedAgentId,
241
+ sessionKey: candidate,
242
+ });
243
+ if (canonical !== "global") {
244
+ const sessionAgentId = resolveAgentIdFromSessionKey(canonical);
245
+ if (sessionAgentId === normalizeAgentId(resolvedAgentId)) {
246
+ return { sessionKey: canonical, storePath, store, entry: store[canonical] };
247
+ }
248
+ }
249
+ return { sessionKey: mainSessionKey, storePath, store, entry: mainEntry };
250
+ }
251
+ function resolveHeartbeatReplyPayload(replyResult) {
252
+ if (!replyResult)
253
+ return undefined;
254
+ if (!Array.isArray(replyResult))
255
+ return replyResult;
256
+ for (let idx = replyResult.length - 1; idx >= 0; idx -= 1) {
257
+ const payload = replyResult[idx];
258
+ if (!payload)
259
+ continue;
260
+ if (payload.text || payload.mediaUrl || (payload.mediaUrls && payload.mediaUrls.length > 0)) {
261
+ return payload;
262
+ }
263
+ }
264
+ return undefined;
265
+ }
266
+ function resolveHeartbeatReasoningPayloads(replyResult) {
267
+ const payloads = Array.isArray(replyResult) ? replyResult : replyResult ? [replyResult] : [];
268
+ return payloads.filter((payload) => {
269
+ const text = typeof payload.text === "string" ? payload.text : "";
270
+ return text.trimStart().startsWith("Reasoning:");
271
+ });
272
+ }
273
+ async function restoreHeartbeatUpdatedAt(params) {
274
+ const { storePath, sessionKey, updatedAt } = params;
275
+ if (typeof updatedAt !== "number")
276
+ return;
277
+ const store = loadSessionStore(storePath);
278
+ const entry = store[sessionKey];
279
+ if (!entry)
280
+ return;
281
+ const nextUpdatedAt = Math.max(entry.updatedAt ?? 0, updatedAt);
282
+ if (entry.updatedAt === nextUpdatedAt)
283
+ return;
284
+ await updateSessionStore(storePath, (nextStore) => {
285
+ const nextEntry = nextStore[sessionKey] ?? entry;
286
+ if (!nextEntry)
287
+ return;
288
+ const resolvedUpdatedAt = Math.max(nextEntry.updatedAt ?? 0, updatedAt);
289
+ if (nextEntry.updatedAt === resolvedUpdatedAt)
290
+ return;
291
+ nextStore[sessionKey] = { ...nextEntry, updatedAt: resolvedUpdatedAt };
292
+ });
293
+ }
294
+ function normalizeHeartbeatReply(payload, responsePrefix, ackMaxChars) {
295
+ const stripped = stripHeartbeatToken(payload.text, {
296
+ mode: "heartbeat",
297
+ maxAckChars: ackMaxChars,
298
+ });
299
+ const hasMedia = Boolean(payload.mediaUrl || (payload.mediaUrls?.length ?? 0) > 0);
300
+ if (stripped.shouldSkip && !hasMedia) {
301
+ return {
302
+ shouldSkip: true,
303
+ text: "",
304
+ hasMedia,
305
+ };
306
+ }
307
+ let finalText = stripped.text;
308
+ if (responsePrefix && finalText && !finalText.startsWith(responsePrefix)) {
309
+ finalText = `${responsePrefix} ${finalText}`;
310
+ }
311
+ return { shouldSkip: false, text: finalText, hasMedia };
312
+ }
313
+ export async function runHeartbeatOnce(opts) {
314
+ const cfg = opts.cfg ?? loadConfig();
315
+ const agentId = normalizeAgentId(opts.agentId ?? resolveDefaultAgentId(cfg));
316
+ const heartbeat = opts.heartbeat ?? resolveHeartbeatConfig(cfg, agentId);
317
+ if (!heartbeatsEnabled) {
318
+ return { status: "skipped", reason: "disabled" };
319
+ }
320
+ if (!isHeartbeatEnabledForAgent(cfg, agentId)) {
321
+ return { status: "skipped", reason: "disabled" };
322
+ }
323
+ if (!resolveHeartbeatIntervalMs(cfg, undefined, heartbeat)) {
324
+ return { status: "skipped", reason: "disabled" };
325
+ }
326
+ const startedAt = opts.deps?.nowMs?.() ?? Date.now();
327
+ if (!isWithinActiveHours(cfg, heartbeat, startedAt)) {
328
+ return { status: "skipped", reason: "quiet-hours" };
329
+ }
330
+ const queueSize = (opts.deps?.getQueueSize ?? getQueueSize)(CommandLane.Main);
331
+ if (queueSize > 0) {
332
+ return { status: "skipped", reason: "requests-in-flight" };
333
+ }
334
+ // Skip heartbeat if HEARTBEAT.md exists but has no actionable content.
335
+ // This saves API calls/costs when the file is effectively empty (only comments/headers).
336
+ // EXCEPTION: Don't skip for exec events - they have pending system events to process.
337
+ const isExecEventReason = opts.reason === "exec-event";
338
+ const workspaceDir = resolveAgentWorkspaceDir(cfg, agentId);
339
+ const heartbeatFilePath = path.join(workspaceDir, DEFAULT_HEARTBEAT_FILENAME);
340
+ try {
341
+ const heartbeatFileContent = await fs.readFile(heartbeatFilePath, "utf-8");
342
+ if (isHeartbeatContentEffectivelyEmpty(heartbeatFileContent) && !isExecEventReason) {
343
+ emitHeartbeatEvent({
344
+ status: "skipped",
345
+ reason: "empty-heartbeat-file",
346
+ durationMs: Date.now() - startedAt,
347
+ });
348
+ return { status: "skipped", reason: "empty-heartbeat-file" };
349
+ }
350
+ }
351
+ catch {
352
+ // File doesn't exist or can't be read - proceed with heartbeat.
353
+ // The LLM prompt says "if it exists" so this is expected behavior.
354
+ }
355
+ const { entry, sessionKey, storePath } = resolveHeartbeatSession(cfg, agentId, heartbeat);
356
+ const previousUpdatedAt = entry?.updatedAt;
357
+ const delivery = resolveHeartbeatDeliveryTarget({ cfg, entry, heartbeat });
358
+ const visibility = delivery.channel !== "none"
359
+ ? resolveHeartbeatVisibility({
360
+ cfg,
361
+ channel: delivery.channel,
362
+ accountId: delivery.accountId,
363
+ })
364
+ : { showOk: false, showAlerts: true, useIndicator: true };
365
+ const { sender } = resolveHeartbeatSenderContext({ cfg, entry, delivery });
366
+ const responsePrefix = resolveEffectiveMessagesConfig(cfg, agentId).responsePrefix;
367
+ // Check if this is an exec event with pending exec completion system events.
368
+ // If so, use a specialized prompt that instructs the model to relay the result
369
+ // instead of the standard heartbeat prompt with "reply HEARTBEAT_OK".
370
+ const isExecEvent = opts.reason === "exec-event";
371
+ const pendingEvents = isExecEvent ? peekSystemEvents(sessionKey) : [];
372
+ const hasExecCompletion = pendingEvents.some((evt) => evt.includes("Exec finished"));
373
+ const prompt = hasExecCompletion ? EXEC_EVENT_PROMPT : resolveHeartbeatPrompt(cfg, heartbeat);
374
+ const ctx = {
375
+ Body: prompt,
376
+ From: sender,
377
+ To: sender,
378
+ Provider: hasExecCompletion ? "exec-event" : "heartbeat",
379
+ SessionKey: sessionKey,
380
+ };
381
+ if (!visibility.showAlerts && !visibility.showOk && !visibility.useIndicator) {
382
+ emitHeartbeatEvent({
383
+ status: "skipped",
384
+ reason: "alerts-disabled",
385
+ durationMs: Date.now() - startedAt,
386
+ channel: delivery.channel !== "none" ? delivery.channel : undefined,
387
+ });
388
+ return { status: "skipped", reason: "alerts-disabled" };
389
+ }
390
+ const heartbeatOkText = responsePrefix ? `${responsePrefix} ${HEARTBEAT_TOKEN}` : HEARTBEAT_TOKEN;
391
+ const canAttemptHeartbeatOk = Boolean(visibility.showOk && delivery.channel !== "none" && delivery.to);
392
+ const maybeSendHeartbeatOk = async () => {
393
+ if (!canAttemptHeartbeatOk || delivery.channel === "none" || !delivery.to)
394
+ return false;
395
+ const heartbeatPlugin = getChannelPlugin(delivery.channel);
396
+ if (heartbeatPlugin?.heartbeat?.checkReady) {
397
+ const readiness = await heartbeatPlugin.heartbeat.checkReady({
398
+ cfg,
399
+ accountId: delivery.accountId,
400
+ deps: opts.deps,
401
+ });
402
+ if (!readiness.ok)
403
+ return false;
404
+ }
405
+ await deliverOutboundPayloads({
406
+ cfg,
407
+ channel: delivery.channel,
408
+ to: delivery.to,
409
+ accountId: delivery.accountId,
410
+ payloads: [{ text: heartbeatOkText }],
411
+ deps: opts.deps,
412
+ });
413
+ return true;
414
+ };
415
+ try {
416
+ const replyResult = await getReplyFromConfig(ctx, { isHeartbeat: true }, cfg);
417
+ const replyPayload = resolveHeartbeatReplyPayload(replyResult);
418
+ const includeReasoning = heartbeat?.includeReasoning === true;
419
+ const reasoningPayloads = includeReasoning
420
+ ? resolveHeartbeatReasoningPayloads(replyResult).filter((payload) => payload !== replyPayload)
421
+ : [];
422
+ if (!replyPayload ||
423
+ (!replyPayload.text && !replyPayload.mediaUrl && !replyPayload.mediaUrls?.length)) {
424
+ await restoreHeartbeatUpdatedAt({
425
+ storePath,
426
+ sessionKey,
427
+ updatedAt: previousUpdatedAt,
428
+ });
429
+ const okSent = await maybeSendHeartbeatOk();
430
+ emitHeartbeatEvent({
431
+ status: "ok-empty",
432
+ reason: opts.reason,
433
+ durationMs: Date.now() - startedAt,
434
+ channel: delivery.channel !== "none" ? delivery.channel : undefined,
435
+ silent: !okSent,
436
+ indicatorType: visibility.useIndicator ? resolveIndicatorType("ok-empty") : undefined,
437
+ });
438
+ return { status: "ran", durationMs: Date.now() - startedAt };
439
+ }
440
+ const ackMaxChars = resolveHeartbeatAckMaxChars(cfg, heartbeat);
441
+ const normalized = normalizeHeartbeatReply(replyPayload, responsePrefix, ackMaxChars);
442
+ // For exec completion events, don't skip even if the response looks like HEARTBEAT_OK.
443
+ // The model should be responding with exec results, not ack tokens.
444
+ // Also, if normalized.text is empty due to token stripping but we have exec completion,
445
+ // fall back to the original reply text.
446
+ const execFallbackText = hasExecCompletion && !normalized.text.trim() && replyPayload.text?.trim()
447
+ ? replyPayload.text.trim()
448
+ : null;
449
+ if (execFallbackText) {
450
+ normalized.text = execFallbackText;
451
+ normalized.shouldSkip = false;
452
+ }
453
+ const shouldSkipMain = normalized.shouldSkip && !normalized.hasMedia && !hasExecCompletion;
454
+ if (shouldSkipMain && reasoningPayloads.length === 0) {
455
+ await restoreHeartbeatUpdatedAt({
456
+ storePath,
457
+ sessionKey,
458
+ updatedAt: previousUpdatedAt,
459
+ });
460
+ const okSent = await maybeSendHeartbeatOk();
461
+ emitHeartbeatEvent({
462
+ status: "ok-token",
463
+ reason: opts.reason,
464
+ durationMs: Date.now() - startedAt,
465
+ channel: delivery.channel !== "none" ? delivery.channel : undefined,
466
+ silent: !okSent,
467
+ indicatorType: visibility.useIndicator ? resolveIndicatorType("ok-token") : undefined,
468
+ });
469
+ return { status: "ran", durationMs: Date.now() - startedAt };
470
+ }
471
+ const mediaUrls = replyPayload.mediaUrls ?? (replyPayload.mediaUrl ? [replyPayload.mediaUrl] : []);
472
+ // Suppress duplicate heartbeats (same payload) within a short window.
473
+ // This prevents "nagging" when nothing changed but the model repeats the same items.
474
+ const prevHeartbeatText = typeof entry?.lastHeartbeatText === "string" ? entry.lastHeartbeatText : "";
475
+ const prevHeartbeatAt = typeof entry?.lastHeartbeatSentAt === "number" ? entry.lastHeartbeatSentAt : undefined;
476
+ const isDuplicateMain = !shouldSkipMain &&
477
+ !mediaUrls.length &&
478
+ Boolean(prevHeartbeatText.trim()) &&
479
+ normalized.text.trim() === prevHeartbeatText.trim() &&
480
+ typeof prevHeartbeatAt === "number" &&
481
+ startedAt - prevHeartbeatAt < 24 * 60 * 60 * 1000;
482
+ if (isDuplicateMain) {
483
+ await restoreHeartbeatUpdatedAt({
484
+ storePath,
485
+ sessionKey,
486
+ updatedAt: previousUpdatedAt,
487
+ });
488
+ emitHeartbeatEvent({
489
+ status: "skipped",
490
+ reason: "duplicate",
491
+ preview: normalized.text.slice(0, 200),
492
+ durationMs: Date.now() - startedAt,
493
+ hasMedia: false,
494
+ channel: delivery.channel !== "none" ? delivery.channel : undefined,
495
+ });
496
+ return { status: "ran", durationMs: Date.now() - startedAt };
497
+ }
498
+ // Reasoning payloads are text-only; any attachments stay on the main reply.
499
+ const previewText = shouldSkipMain
500
+ ? reasoningPayloads
501
+ .map((payload) => payload.text)
502
+ .filter((text) => Boolean(text?.trim()))
503
+ .join("\n")
504
+ : normalized.text;
505
+ if (delivery.channel === "none" || !delivery.to) {
506
+ emitHeartbeatEvent({
507
+ status: "skipped",
508
+ reason: delivery.reason ?? "no-target",
509
+ preview: previewText?.slice(0, 200),
510
+ durationMs: Date.now() - startedAt,
511
+ hasMedia: mediaUrls.length > 0,
512
+ });
513
+ return { status: "ran", durationMs: Date.now() - startedAt };
514
+ }
515
+ if (!visibility.showAlerts) {
516
+ await restoreHeartbeatUpdatedAt({ storePath, sessionKey, updatedAt: previousUpdatedAt });
517
+ emitHeartbeatEvent({
518
+ status: "skipped",
519
+ reason: "alerts-disabled",
520
+ preview: previewText?.slice(0, 200),
521
+ durationMs: Date.now() - startedAt,
522
+ channel: delivery.channel,
523
+ hasMedia: mediaUrls.length > 0,
524
+ indicatorType: visibility.useIndicator ? resolveIndicatorType("sent") : undefined,
525
+ });
526
+ return { status: "ran", durationMs: Date.now() - startedAt };
527
+ }
528
+ const deliveryAccountId = delivery.accountId;
529
+ const heartbeatPlugin = getChannelPlugin(delivery.channel);
530
+ if (heartbeatPlugin?.heartbeat?.checkReady) {
531
+ const readiness = await heartbeatPlugin.heartbeat.checkReady({
532
+ cfg,
533
+ accountId: deliveryAccountId,
534
+ deps: opts.deps,
535
+ });
536
+ if (!readiness.ok) {
537
+ emitHeartbeatEvent({
538
+ status: "skipped",
539
+ reason: readiness.reason,
540
+ preview: previewText?.slice(0, 200),
541
+ durationMs: Date.now() - startedAt,
542
+ hasMedia: mediaUrls.length > 0,
543
+ channel: delivery.channel,
544
+ });
545
+ log.info("heartbeat: channel not ready", {
546
+ channel: delivery.channel,
547
+ reason: readiness.reason,
548
+ });
549
+ return { status: "skipped", reason: readiness.reason };
550
+ }
551
+ }
552
+ await deliverOutboundPayloads({
553
+ cfg,
554
+ channel: delivery.channel,
555
+ to: delivery.to,
556
+ accountId: deliveryAccountId,
557
+ payloads: [
558
+ ...reasoningPayloads,
559
+ ...(shouldSkipMain
560
+ ? []
561
+ : [
562
+ {
563
+ text: normalized.text,
564
+ mediaUrls,
565
+ },
566
+ ]),
567
+ ],
568
+ deps: opts.deps,
569
+ });
570
+ // Record last delivered heartbeat payload for dedupe.
571
+ if (!shouldSkipMain && normalized.text.trim()) {
572
+ const store = loadSessionStore(storePath);
573
+ const current = store[sessionKey];
574
+ if (current) {
575
+ store[sessionKey] = {
576
+ ...current,
577
+ lastHeartbeatText: normalized.text,
578
+ lastHeartbeatSentAt: startedAt,
579
+ };
580
+ await saveSessionStore(storePath, store);
581
+ }
582
+ }
583
+ emitHeartbeatEvent({
584
+ status: "sent",
585
+ to: delivery.to,
586
+ preview: previewText?.slice(0, 200),
587
+ durationMs: Date.now() - startedAt,
588
+ hasMedia: mediaUrls.length > 0,
589
+ channel: delivery.channel,
590
+ indicatorType: visibility.useIndicator ? resolveIndicatorType("sent") : undefined,
591
+ });
592
+ return { status: "ran", durationMs: Date.now() - startedAt };
593
+ }
594
+ catch (err) {
595
+ const reason = formatErrorMessage(err);
596
+ emitHeartbeatEvent({
597
+ status: "failed",
598
+ reason,
599
+ durationMs: Date.now() - startedAt,
600
+ channel: delivery.channel !== "none" ? delivery.channel : undefined,
601
+ indicatorType: visibility.useIndicator ? resolveIndicatorType("failed") : undefined,
602
+ });
603
+ log.error(`heartbeat failed: ${reason}`, { error: reason });
604
+ return { status: "failed", reason };
605
+ }
606
+ }
607
+ export function startHeartbeatRunner(opts) {
608
+ const runtime = opts.runtime ?? defaultRuntime;
609
+ const runOnce = opts.runOnce ?? runHeartbeatOnce;
610
+ const state = {
611
+ cfg: opts.cfg ?? loadConfig(),
612
+ runtime,
613
+ agents: new Map(),
614
+ timer: null,
615
+ stopped: false,
616
+ };
617
+ let initialized = false;
618
+ const resolveNextDue = (now, intervalMs, prevState) => {
619
+ if (typeof prevState?.lastRunMs === "number") {
620
+ return prevState.lastRunMs + intervalMs;
621
+ }
622
+ if (prevState && prevState.intervalMs === intervalMs && prevState.nextDueMs > now) {
623
+ return prevState.nextDueMs;
624
+ }
625
+ return now + intervalMs;
626
+ };
627
+ const scheduleNext = () => {
628
+ if (state.stopped)
629
+ return;
630
+ if (state.timer) {
631
+ clearTimeout(state.timer);
632
+ state.timer = null;
633
+ }
634
+ if (state.agents.size === 0)
635
+ return;
636
+ const now = Date.now();
637
+ let nextDue = Number.POSITIVE_INFINITY;
638
+ for (const agent of state.agents.values()) {
639
+ if (agent.nextDueMs < nextDue)
640
+ nextDue = agent.nextDueMs;
641
+ }
642
+ if (!Number.isFinite(nextDue))
643
+ return;
644
+ const delay = Math.max(0, nextDue - now);
645
+ state.timer = setTimeout(() => {
646
+ requestHeartbeatNow({ reason: "interval", coalesceMs: 0 });
647
+ }, delay);
648
+ state.timer.unref?.();
649
+ };
650
+ const updateConfig = (cfg) => {
651
+ if (state.stopped)
652
+ return;
653
+ const now = Date.now();
654
+ const prevAgents = state.agents;
655
+ const prevEnabled = prevAgents.size > 0;
656
+ const nextAgents = new Map();
657
+ const intervals = [];
658
+ for (const agent of resolveHeartbeatAgents(cfg)) {
659
+ const intervalMs = resolveHeartbeatIntervalMs(cfg, undefined, agent.heartbeat);
660
+ if (!intervalMs)
661
+ continue;
662
+ intervals.push(intervalMs);
663
+ const prevState = prevAgents.get(agent.agentId);
664
+ const nextDueMs = resolveNextDue(now, intervalMs, prevState);
665
+ nextAgents.set(agent.agentId, {
666
+ agentId: agent.agentId,
667
+ heartbeat: agent.heartbeat,
668
+ intervalMs,
669
+ lastRunMs: prevState?.lastRunMs,
670
+ nextDueMs,
671
+ });
672
+ }
673
+ state.cfg = cfg;
674
+ state.agents = nextAgents;
675
+ const nextEnabled = nextAgents.size > 0;
676
+ if (!initialized) {
677
+ if (!nextEnabled) {
678
+ log.info("heartbeat: disabled", { enabled: false });
679
+ }
680
+ else {
681
+ log.info("heartbeat: started", { intervalMs: Math.min(...intervals) });
682
+ }
683
+ initialized = true;
684
+ }
685
+ else if (prevEnabled !== nextEnabled) {
686
+ if (!nextEnabled) {
687
+ log.info("heartbeat: disabled", { enabled: false });
688
+ }
689
+ else {
690
+ log.info("heartbeat: started", { intervalMs: Math.min(...intervals) });
691
+ }
692
+ }
693
+ scheduleNext();
694
+ };
695
+ const run = async (params) => {
696
+ if (!heartbeatsEnabled) {
697
+ return { status: "skipped", reason: "disabled" };
698
+ }
699
+ if (state.agents.size === 0) {
700
+ return { status: "skipped", reason: "disabled" };
701
+ }
702
+ const reason = params?.reason;
703
+ const isInterval = reason === "interval";
704
+ const startedAt = Date.now();
705
+ const now = startedAt;
706
+ let ran = false;
707
+ for (const agent of state.agents.values()) {
708
+ if (isInterval && now < agent.nextDueMs) {
709
+ continue;
710
+ }
711
+ const res = await runOnce({
712
+ cfg: state.cfg,
713
+ agentId: agent.agentId,
714
+ heartbeat: agent.heartbeat,
715
+ reason,
716
+ deps: { runtime: state.runtime },
717
+ });
718
+ if (res.status === "skipped" && res.reason === "requests-in-flight") {
719
+ return res;
720
+ }
721
+ if (res.status !== "skipped" || res.reason !== "disabled") {
722
+ agent.lastRunMs = now;
723
+ agent.nextDueMs = now + agent.intervalMs;
724
+ }
725
+ if (res.status === "ran")
726
+ ran = true;
727
+ }
728
+ scheduleNext();
729
+ if (ran)
730
+ return { status: "ran", durationMs: Date.now() - startedAt };
731
+ return { status: "skipped", reason: isInterval ? "not-due" : "disabled" };
732
+ };
733
+ setHeartbeatWakeHandler(async (params) => run({ reason: params.reason }));
734
+ updateConfig(state.cfg);
735
+ const cleanup = () => {
736
+ state.stopped = true;
737
+ setHeartbeatWakeHandler(null);
738
+ if (state.timer)
739
+ clearTimeout(state.timer);
740
+ state.timer = null;
741
+ };
742
+ opts.abortSignal?.addEventListener("abort", cleanup, { once: true });
743
+ return { stop: cleanup, updateConfig };
744
+ }
745
+ //# sourceMappingURL=heartbeat-runner.js.map