@poolzin/pool-bot 2026.2.25 → 2026.2.26

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 (506) hide show
  1. package/dist/acp/event-mapper.js +87 -22
  2. package/dist/acp/meta.js +12 -6
  3. package/dist/agents/agent-paths.js +8 -9
  4. package/dist/agents/agent-scope.js +7 -5
  5. package/dist/agents/auth-profiles/oauth.js +148 -64
  6. package/dist/agents/auth-profiles/session-override.js +13 -7
  7. package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
  8. package/dist/agents/bash-tools.exec-runtime.js +2 -25
  9. package/dist/agents/bedrock-discovery.js +3 -1
  10. package/dist/agents/byteplus-models.js +97 -0
  11. package/dist/agents/chutes-oauth.js +1 -0
  12. package/dist/agents/cli-runner/helpers.js +4 -0
  13. package/dist/agents/compaction.js +41 -14
  14. package/dist/agents/doubao-models.js +121 -0
  15. package/dist/agents/failover-error.js +2 -0
  16. package/dist/agents/huggingface-models.js +5 -3
  17. package/dist/agents/live-model-filter.js +5 -0
  18. package/dist/agents/minimax-vlm.js +10 -8
  19. package/dist/agents/model-auth.js +6 -0
  20. package/dist/agents/model-catalog.js +3 -1
  21. package/dist/agents/model-selection.js +7 -1
  22. package/dist/agents/models-config.providers.js +93 -11
  23. package/dist/agents/ollama-stream.js +117 -4
  24. package/dist/agents/opencode-zen-models.js +22 -11
  25. package/dist/agents/pi-embedded-helpers/errors.js +55 -33
  26. package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
  27. package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
  28. package/dist/agents/pi-embedded-helpers.js +1 -1
  29. package/dist/agents/pi-embedded-runner/compact.js +29 -7
  30. package/dist/agents/pi-embedded-runner/extensions.js +28 -26
  31. package/dist/agents/pi-embedded-runner/google.js +20 -8
  32. package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
  33. package/dist/agents/pi-embedded-runner/run.js +71 -12
  34. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
  35. package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
  36. package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
  37. package/dist/agents/pi-embedded-runner/thinking.js +42 -0
  38. package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
  39. package/dist/agents/pi-embedded-runner/utils.js +7 -10
  40. package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
  41. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
  42. package/dist/agents/pi-embedded-subscribe.js +9 -4
  43. package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
  44. package/dist/agents/pi-embedded-utils.js +3 -0
  45. package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
  46. package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
  47. package/dist/agents/pi-settings.js +40 -0
  48. package/dist/agents/pi-tools.policy.js +2 -1
  49. package/dist/agents/provider/config-loader.js +1 -1
  50. package/dist/agents/sandbox/browser.js +170 -33
  51. package/dist/agents/sandbox/config-hash.js +14 -27
  52. package/dist/agents/sandbox/config.js +21 -2
  53. package/dist/agents/sandbox/constants.js +2 -0
  54. package/dist/agents/sandbox/docker.js +16 -2
  55. package/dist/agents/sandbox/novnc-auth.js +62 -0
  56. package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
  57. package/dist/agents/sandbox/shared.js +10 -6
  58. package/dist/agents/sandbox-paths.js +24 -11
  59. package/dist/agents/schema/clean-for-gemini.js +132 -85
  60. package/dist/agents/session-slug.js +10 -5
  61. package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
  62. package/dist/agents/session-tool-result-guard.js +3 -1
  63. package/dist/agents/session-transcript-repair.js +40 -6
  64. package/dist/agents/skills/bundled-dir.js +19 -5
  65. package/dist/agents/skills/env-overrides.js +124 -43
  66. package/dist/agents/skills/frontmatter.js +6 -6
  67. package/dist/agents/skills/plugin-skills.js +14 -7
  68. package/dist/agents/skills/workspace.js +1 -0
  69. package/dist/agents/subagent-announce.js +251 -49
  70. package/dist/agents/subagent-lifecycle-events.js +19 -0
  71. package/dist/agents/subagent-registry-cleanup.js +31 -0
  72. package/dist/agents/subagent-registry-completion.js +68 -0
  73. package/dist/agents/subagent-registry-queries.js +117 -0
  74. package/dist/agents/subagent-registry-state.js +46 -0
  75. package/dist/agents/subagent-registry.js +252 -221
  76. package/dist/agents/subagent-registry.store.js +1 -0
  77. package/dist/agents/subagent-registry.types.js +1 -0
  78. package/dist/agents/subagent-spawn.js +195 -7
  79. package/dist/agents/system-prompt.js +22 -6
  80. package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
  81. package/dist/agents/test-helpers/fast-core-tools.js +1 -17
  82. package/dist/agents/timeout.js +18 -6
  83. package/dist/agents/tool-call-id.js +1 -1
  84. package/dist/agents/tool-display-common.js +162 -29
  85. package/dist/agents/tool-images.js +82 -9
  86. package/dist/agents/tool-policy.js +51 -26
  87. package/dist/agents/tools/browser-tool.js +2 -2
  88. package/dist/agents/tools/canvas-tool.js +27 -1
  89. package/dist/agents/tools/common.js +45 -0
  90. package/dist/agents/tools/discord-actions-guild.js +4 -1
  91. package/dist/agents/tools/gateway-tool.js +3 -1
  92. package/dist/agents/tools/nodes-utils.js +1 -10
  93. package/dist/agents/tools/sessions-send-helpers.js +12 -6
  94. package/dist/agents/tools/sessions-spawn-tool.js +8 -2
  95. package/dist/agents/tools/subagents-tool.js +2 -1
  96. package/dist/agents/tools/whatsapp-actions.js +10 -2
  97. package/dist/agents/tools/whatsapp-target-auth.js +18 -0
  98. package/dist/agents/transcript-policy.js +22 -8
  99. package/dist/agents/venice-models.js +11 -3
  100. package/dist/auto-reply/commands-registry.data.js +51 -0
  101. package/dist/auto-reply/commands-registry.js +4 -3
  102. package/dist/auto-reply/group-activation.js +10 -5
  103. package/dist/auto-reply/inbound-debounce.js +10 -5
  104. package/dist/auto-reply/reply/abort.js +1 -1
  105. package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
  106. package/dist/auto-reply/reply/bash-command.js +41 -39
  107. package/dist/auto-reply/reply/command-gates.js +25 -0
  108. package/dist/auto-reply/reply/commands-allowlist.js +111 -72
  109. package/dist/auto-reply/reply/commands-bash.js +6 -5
  110. package/dist/auto-reply/reply/commands-config.js +30 -28
  111. package/dist/auto-reply/reply/commands-core.js +2 -1
  112. package/dist/auto-reply/reply/commands-info.js +1 -0
  113. package/dist/auto-reply/reply/commands-models.js +65 -14
  114. package/dist/auto-reply/reply/commands-session.js +237 -82
  115. package/dist/auto-reply/reply/commands-setunset.js +45 -0
  116. package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
  117. package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
  118. package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
  119. package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
  120. package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
  121. package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
  122. package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
  123. package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
  124. package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
  125. package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
  126. package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
  127. package/dist/auto-reply/reply/commands-subagents.js +51 -587
  128. package/dist/auto-reply/reply/commands-tts.js +10 -5
  129. package/dist/auto-reply/reply/config-value.js +10 -5
  130. package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
  131. package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
  132. package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
  133. package/dist/auto-reply/reply/followup-runner.js +1 -0
  134. package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
  135. package/dist/auto-reply/reply/get-reply-directives.js +17 -28
  136. package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
  137. package/dist/auto-reply/reply/get-reply.js +71 -12
  138. package/dist/auto-reply/reply/model-selection.js +80 -39
  139. package/dist/auto-reply/reply/queue/enqueue.js +10 -5
  140. package/dist/auto-reply/reply/queue/state.js +13 -12
  141. package/dist/auto-reply/reply/reply-payloads.js +67 -36
  142. package/dist/auto-reply/reply/reply-reference.js +9 -8
  143. package/dist/auto-reply/reply/route-reply.js +15 -8
  144. package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
  145. package/dist/auto-reply/reply/session.js +22 -6
  146. package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
  147. package/dist/auto-reply/reply/subagents-utils.js +56 -30
  148. package/dist/auto-reply/reply/typing.js +46 -21
  149. package/dist/auto-reply/send-policy.js +14 -7
  150. package/dist/auto-reply/status.js +140 -16
  151. package/dist/auto-reply/templating.js +10 -5
  152. package/dist/auto-reply/thinking.js +7 -16
  153. package/dist/auto-reply/tokens.js +21 -5
  154. package/dist/browser/bridge-server.js +36 -20
  155. package/dist/browser/cdp.helpers.js +7 -14
  156. package/dist/browser/cdp.js +35 -15
  157. package/dist/browser/chrome.profile-decoration.js +7 -4
  158. package/dist/browser/config.js +4 -0
  159. package/dist/browser/extension-relay-auth.js +55 -0
  160. package/dist/browser/extension-relay.js +74 -29
  161. package/dist/browser/navigation-guard.js +9 -1
  162. package/dist/browser/paths.js +77 -0
  163. package/dist/browser/profiles.js +13 -8
  164. package/dist/browser/pw-ai-module.js +10 -5
  165. package/dist/browser/pw-session.js +76 -39
  166. package/dist/browser/pw-tools-core.interactions.js +14 -7
  167. package/dist/browser/pw-tools-core.state.js +12 -6
  168. package/dist/browser/routes/agent.act.js +2 -2
  169. package/dist/browser/server-context.js +7 -0
  170. package/dist/build-info.json +3 -3
  171. package/dist/channels/allow-from.js +2 -1
  172. package/dist/channels/allowlists/resolve-utils.js +43 -19
  173. package/dist/channels/channel-config.js +14 -7
  174. package/dist/channels/draft-stream-loop.js +7 -0
  175. package/dist/channels/model-overrides.js +82 -0
  176. package/dist/channels/plugins/normalize/imessage.js +14 -7
  177. package/dist/channels/plugins/normalize/slack.js +10 -5
  178. package/dist/channels/plugins/normalize/telegram.js +14 -7
  179. package/dist/channels/plugins/outbound/discord.js +80 -8
  180. package/dist/channels/plugins/outbound/signal.js +11 -11
  181. package/dist/channels/plugins/setup-helpers.js +10 -5
  182. package/dist/channels/sender-label.js +14 -7
  183. package/dist/channels/session.js +4 -2
  184. package/dist/channels/status-reactions.js +297 -0
  185. package/dist/cli/banner.js +1 -1
  186. package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
  187. package/dist/cli/cli-name.js +11 -11
  188. package/dist/cli/cli-utils.js +13 -3
  189. package/dist/cli/command-format.js +1 -1
  190. package/dist/cli/config-cli.js +1 -1
  191. package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
  192. package/dist/cli/daemon-cli/lifecycle.js +64 -2
  193. package/dist/cli/daemon-cli/restart-health.js +126 -0
  194. package/dist/cli/daemon-cli/status.gather.js +9 -13
  195. package/dist/cli/daemon-cli/status.print.js +2 -10
  196. package/dist/cli/deps.js +27 -22
  197. package/dist/cli/gateway-cli/run-loop.js +23 -5
  198. package/dist/cli/node-cli/register.js +14 -5
  199. package/dist/cli/nodes-media-utils.js +7 -2
  200. package/dist/cli/outbound-send-deps.js +2 -9
  201. package/dist/cli/outbound-send-mapping.js +11 -0
  202. package/dist/cli/pairing-cli.js +40 -14
  203. package/dist/cli/plugins-cli.js +34 -41
  204. package/dist/cli/ports.js +11 -10
  205. package/dist/cli/program/command-registry.js +2 -11
  206. package/dist/cli/program/command-tree.js +16 -0
  207. package/dist/cli/program/preaction.js +13 -9
  208. package/dist/cli/program/register.configure.js +3 -18
  209. package/dist/cli/program/register.maintenance.js +2 -2
  210. package/dist/cli/program/register.onboard.js +2 -0
  211. package/dist/cli/program/register.status-health-sessions.js +16 -17
  212. package/dist/cli/program/register.subclis.js +93 -52
  213. package/dist/cli/route.js +11 -7
  214. package/dist/cli/system-cli.js +36 -46
  215. package/dist/cli/update-cli/shared.js +22 -9
  216. package/dist/cli/update-cli/update-command.js +89 -14
  217. package/dist/cli/update-cli/wizard.js +6 -12
  218. package/dist/commands/agent/run-context.js +18 -5
  219. package/dist/commands/agent/session-store.js +17 -4
  220. package/dist/commands/agent.js +22 -2
  221. package/dist/commands/agents.bindings.js +14 -7
  222. package/dist/commands/agents.commands.add.js +13 -9
  223. package/dist/commands/agents.commands.identity.js +12 -6
  224. package/dist/commands/agents.commands.list.js +11 -6
  225. package/dist/commands/agents.config.js +8 -10
  226. package/dist/commands/agents.providers.js +12 -6
  227. package/dist/commands/auth-choice-options.js +103 -75
  228. package/dist/commands/auth-choice.apply.byteplus.js +55 -0
  229. package/dist/commands/auth-choice.apply.js +4 -0
  230. package/dist/commands/auth-choice.apply.minimax.js +61 -13
  231. package/dist/commands/auth-choice.apply.openai.js +3 -1
  232. package/dist/commands/auth-choice.apply.volcengine.js +55 -0
  233. package/dist/commands/auth-choice.preferred-provider.js +2 -0
  234. package/dist/commands/channels/remove.js +13 -6
  235. package/dist/commands/channels/shared.js +4 -14
  236. package/dist/commands/configure.commands.js +14 -0
  237. package/dist/commands/configure.gateway.js +2 -4
  238. package/dist/commands/configure.js +1 -1
  239. package/dist/commands/configure.shared.js +11 -0
  240. package/dist/commands/daemon-install-helpers.js +2 -2
  241. package/dist/commands/dashboard.js +12 -10
  242. package/dist/commands/docs.js +14 -8
  243. package/dist/commands/doctor-config-flow.js +11 -9
  244. package/dist/commands/doctor-legacy-config.js +281 -0
  245. package/dist/commands/doctor-state-integrity.js +99 -23
  246. package/dist/commands/doctor-update.js +12 -9
  247. package/dist/commands/models/list.list-command.js +7 -5
  248. package/dist/commands/models/set-image.js +2 -21
  249. package/dist/commands/node-daemon-install-helpers.js +10 -8
  250. package/dist/commands/onboard-auth.config-minimax.js +54 -80
  251. package/dist/commands/onboard-auth.config-opencode.js +2 -18
  252. package/dist/commands/onboard-auth.credentials.js +90 -13
  253. package/dist/commands/onboard-auth.js +1 -1
  254. package/dist/commands/onboard-auth.models.js +6 -5
  255. package/dist/commands/onboard-hooks.js +1 -1
  256. package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
  257. package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
  258. package/dist/commands/onboard-provider-auth-flags.js +14 -0
  259. package/dist/commands/onboard-remote.js +14 -7
  260. package/dist/commands/onboard.js +11 -13
  261. package/dist/commands/sandbox-display.js +6 -5
  262. package/dist/commands/status-all/diagnosis.js +14 -10
  263. package/dist/commands/status-all/format.js +1 -0
  264. package/dist/commands/status.gateway-probe.js +1 -16
  265. package/dist/commands/systemd-linger.js +12 -6
  266. package/dist/config/agent-limits.js +2 -0
  267. package/dist/config/commands.js +30 -16
  268. package/dist/config/config-paths.js +9 -11
  269. package/dist/config/defaults.js +22 -2
  270. package/dist/config/discord-preview-streaming.js +104 -0
  271. package/dist/config/env-vars.js +37 -8
  272. package/dist/config/includes.js +4 -0
  273. package/dist/config/io.js +97 -12
  274. package/dist/config/legacy.migrations.part-1.js +189 -78
  275. package/dist/config/legacy.shared.js +3 -1
  276. package/dist/config/merge-patch.js +4 -0
  277. package/dist/config/prototype-keys.js +4 -0
  278. package/dist/config/schema.help.js +44 -7
  279. package/dist/config/schema.labels.js +38 -6
  280. package/dist/config/sessions/delivery-info.js +10 -3
  281. package/dist/config/sessions/main-session.js +10 -5
  282. package/dist/config/sessions/session-file.js +33 -0
  283. package/dist/config/sessions/session-key.js +10 -5
  284. package/dist/config/sessions/store.js +1 -1
  285. package/dist/config/sessions.js +1 -0
  286. package/dist/config/zod-schema.agent-runtime.js +11 -0
  287. package/dist/config/zod-schema.js +148 -13
  288. package/dist/config/zod-schema.providers-core.js +78 -4
  289. package/dist/config/zod-schema.providers.js +6 -1
  290. package/dist/config/zod-schema.session.js +41 -2
  291. package/dist/cron/run-log.js +3 -0
  292. package/dist/cron/schedule.js +21 -10
  293. package/dist/cron/service/ops.js +35 -21
  294. package/dist/cron/service/timer.js +116 -16
  295. package/dist/cron/stagger.js +3 -1
  296. package/dist/discord/api.js +12 -6
  297. package/dist/discord/draft-chunking.js +22 -0
  298. package/dist/discord/draft-stream.js +124 -0
  299. package/dist/discord/monitor/agent-components.js +1 -1
  300. package/dist/discord/monitor/commands.js +5 -0
  301. package/dist/discord/monitor/gateway-plugin.js +2 -1
  302. package/dist/discord/monitor/listeners.js +37 -27
  303. package/dist/discord/monitor/message-handler.js +4 -1
  304. package/dist/discord/monitor/message-handler.preflight.js +65 -8
  305. package/dist/discord/monitor/message-handler.process.js +246 -217
  306. package/dist/discord/monitor/message-utils.js +143 -6
  307. package/dist/discord/monitor/model-picker-preferences.js +143 -0
  308. package/dist/discord/monitor/model-picker.js +651 -0
  309. package/dist/discord/monitor/native-command.js +573 -16
  310. package/dist/discord/monitor/provider.allowlist.js +223 -0
  311. package/dist/discord/monitor/provider.js +275 -347
  312. package/dist/discord/monitor/provider.lifecycle.js +100 -0
  313. package/dist/discord/monitor/reply-delivery.js +123 -16
  314. package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
  315. package/dist/discord/monitor/thread-bindings.js +4 -0
  316. package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
  317. package/dist/discord/monitor/thread-bindings.manager.js +423 -0
  318. package/dist/discord/monitor/thread-bindings.messages.js +55 -0
  319. package/dist/discord/monitor/thread-bindings.state.js +358 -0
  320. package/dist/discord/monitor/thread-bindings.types.js +6 -0
  321. package/dist/discord/resolve-users.js +33 -21
  322. package/dist/discord/send.channels.js +15 -0
  323. package/dist/discord/send.js +3 -2
  324. package/dist/discord/send.outbound.js +82 -26
  325. package/dist/discord/send.permissions.js +83 -30
  326. package/dist/discord/send.reactions.js +8 -4
  327. package/dist/discord/token.js +10 -5
  328. package/dist/discord/voice/command.js +263 -0
  329. package/dist/discord/voice/manager.js +531 -0
  330. package/dist/gateway/auth.js +34 -10
  331. package/dist/gateway/call.js +4 -16
  332. package/dist/gateway/client.js +28 -4
  333. package/dist/gateway/config-reload.js +3 -4
  334. package/dist/gateway/control-ui.js +219 -96
  335. package/dist/gateway/hooks-mapping.js +88 -38
  336. package/dist/gateway/http-auth-helpers.js +3 -2
  337. package/dist/gateway/http-endpoint-helpers.js +1 -0
  338. package/dist/gateway/net.js +54 -12
  339. package/dist/gateway/node-invoke-system-run-approval.js +14 -35
  340. package/dist/gateway/node-registry.js +10 -5
  341. package/dist/gateway/openai-http.js +1 -0
  342. package/dist/gateway/openresponses-http.js +1 -0
  343. package/dist/gateway/origin-check.js +1 -18
  344. package/dist/gateway/protocol/index.js +4 -3
  345. package/dist/gateway/protocol/schema/cron.js +1 -0
  346. package/dist/gateway/protocol/schema/devices.js +1 -0
  347. package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
  348. package/dist/gateway/protocol/schema/sessions.js +6 -0
  349. package/dist/gateway/role-policy.js +17 -0
  350. package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
  351. package/dist/gateway/server/ws-connection/message-handler.js +175 -148
  352. package/dist/gateway/server-chat.js +83 -25
  353. package/dist/gateway/server-constants.js +10 -9
  354. package/dist/gateway/server-cron.js +1 -0
  355. package/dist/gateway/server-http.js +16 -7
  356. package/dist/gateway/server-maintenance.js +20 -5
  357. package/dist/gateway/server-methods/chat.js +10 -6
  358. package/dist/gateway/server-methods/config.js +12 -14
  359. package/dist/gateway/server-methods/devices.js +17 -3
  360. package/dist/gateway/server-methods/models.js +11 -1
  361. package/dist/gateway/server-methods/sessions.js +64 -8
  362. package/dist/gateway/server-methods/usage.js +162 -75
  363. package/dist/gateway/server-node-events.js +29 -0
  364. package/dist/gateway/server-runtime-config.js +34 -13
  365. package/dist/gateway/server-startup-memory.js +17 -11
  366. package/dist/gateway/session-utils.fs.js +32 -34
  367. package/dist/gateway/sessions-resolve.js +17 -5
  368. package/dist/gateway/test-helpers.openai-mock.js +14 -7
  369. package/dist/gateway/tools-invoke-http.js +21 -10
  370. package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
  371. package/dist/hooks/bundled/command-logger/handler.js +7 -2
  372. package/dist/hooks/bundled/session-memory/handler.js +6 -5
  373. package/dist/hooks/frontmatter.js +6 -6
  374. package/dist/hooks/gmail-watcher.js +11 -6
  375. package/dist/hooks/internal-hooks.js +11 -1
  376. package/dist/hooks/llm-slug-generator.js +4 -1
  377. package/dist/hooks/workspace.js +47 -17
  378. package/dist/imessage/accounts.js +9 -20
  379. package/dist/imessage/monitor/inbound-processing.js +2 -1
  380. package/dist/infra/archive.js +174 -73
  381. package/dist/infra/control-ui-assets.js +14 -6
  382. package/dist/infra/device-pairing.js +108 -29
  383. package/dist/infra/env.js +10 -5
  384. package/dist/infra/exec-approvals-allowlist.js +122 -0
  385. package/dist/infra/exec-approvals-analysis.js +34 -3
  386. package/dist/infra/exec-approvals.js +5 -17
  387. package/dist/infra/exec-safe-bin-policy.js +53 -45
  388. package/dist/infra/fs-safe.js +71 -39
  389. package/dist/infra/gateway-lock.js +6 -2
  390. package/dist/infra/heartbeat-wake.js +6 -12
  391. package/dist/infra/host-env-security-policy.json +19 -0
  392. package/dist/infra/host-env-security.js +66 -0
  393. package/dist/infra/net/ssrf.js +131 -38
  394. package/dist/infra/outbound/bound-delivery-router.js +88 -0
  395. package/dist/infra/outbound/channel-selection.js +12 -6
  396. package/dist/infra/outbound/envelope.js +1 -1
  397. package/dist/infra/outbound/format.js +12 -6
  398. package/dist/infra/outbound/payloads.js +14 -7
  399. package/dist/infra/outbound/session-binding-service.js +123 -0
  400. package/dist/infra/path-guards.js +25 -0
  401. package/dist/infra/provider-usage.fetch.codex.js +7 -15
  402. package/dist/infra/provider-usage.fetch.gemini.js +14 -11
  403. package/dist/infra/provider-usage.fetch.shared.js +30 -1
  404. package/dist/infra/provider-usage.fetch.zai.js +10 -9
  405. package/dist/infra/retry-policy.js +4 -2
  406. package/dist/infra/retry.js +9 -5
  407. package/dist/infra/session-cost-usage.js +107 -59
  408. package/dist/infra/session-maintenance-warning.js +3 -1
  409. package/dist/infra/shell-env.js +98 -34
  410. package/dist/infra/ssh-config.js +12 -6
  411. package/dist/infra/system-run-command.js +49 -4
  412. package/dist/infra/update-channels.js +10 -5
  413. package/dist/line/accounts.js +5 -7
  414. package/dist/line/bot-access.js +8 -20
  415. package/dist/line/bot-handlers.js +3 -1
  416. package/dist/link-understanding/detect.js +15 -7
  417. package/dist/media/constants.js +15 -6
  418. package/dist/media/image-ops.js +7 -0
  419. package/dist/media/local-roots.js +3 -2
  420. package/dist/media-understanding/apply.js +4 -1
  421. package/dist/media-understanding/concurrency.js +8 -20
  422. package/dist/memory/backend-config.js +45 -6
  423. package/dist/memory/embeddings.js +10 -4
  424. package/dist/memory/fs-utils.js +23 -0
  425. package/dist/memory/manager-search.js +12 -6
  426. package/dist/memory/manager-sync-ops.js +12 -2
  427. package/dist/memory/qmd-manager.js +466 -53
  428. package/dist/memory/query-expansion.js +167 -3
  429. package/dist/memory/status-format.js +10 -5
  430. package/dist/memory/sync-memory-files.js +1 -1
  431. package/dist/node-host/invoke-system-run.js +281 -0
  432. package/dist/node-host/invoke.js +55 -337
  433. package/dist/pairing/pairing-store.js +22 -0
  434. package/dist/plugin-sdk/allow-from.js +1 -1
  435. package/dist/plugin-sdk/command-auth.js +3 -1
  436. package/dist/plugin-sdk/index.js +6 -3
  437. package/dist/plugin-sdk/webhook-targets.js +32 -0
  438. package/dist/plugins/bundled-dir.js +9 -6
  439. package/dist/plugins/hooks.js +50 -0
  440. package/dist/plugins/install.js +28 -16
  441. package/dist/plugins/runtime.js +3 -17
  442. package/dist/plugins/update.js +78 -12
  443. package/dist/process/spawn-utils.js +14 -7
  444. package/dist/providers/github-copilot-token.js +11 -6
  445. package/dist/providers/qwen-portal-oauth.js +14 -6
  446. package/dist/routing/account-id.js +30 -0
  447. package/dist/routing/resolve-route.js +3 -7
  448. package/dist/routing/session-key.js +2 -16
  449. package/dist/security/audit-channel.js +93 -2
  450. package/dist/security/audit-extra.async.js +159 -5
  451. package/dist/security/audit-extra.js +1 -1
  452. package/dist/security/audit-extra.sync.js +85 -6
  453. package/dist/security/audit.js +40 -4
  454. package/dist/security/dm-policy-shared.js +44 -0
  455. package/dist/security/external-content.js +26 -6
  456. package/dist/shared/entry-status.js +6 -0
  457. package/dist/shared/frontmatter.js +5 -5
  458. package/dist/shared/node-match.js +11 -4
  459. package/dist/shared/operator-scope-compat.js +8 -3
  460. package/dist/signal/accounts.js +7 -20
  461. package/dist/signal/monitor/event-handler.js +3 -1
  462. package/dist/slack/accounts.js +6 -19
  463. package/dist/slack/actions.js +11 -3
  464. package/dist/slack/monitor/auth.js +1 -1
  465. package/dist/slack/monitor/message-handler/dispatch.js +50 -29
  466. package/dist/slack/monitor/replies.js +15 -7
  467. package/dist/slack/monitor/slash.js +22 -13
  468. package/dist/slack/resolve-channels.js +10 -5
  469. package/dist/slack/send.js +102 -12
  470. package/dist/slack/stream-mode.js +10 -0
  471. package/dist/slack/streaming.js +4 -2
  472. package/dist/telegram/accounts.js +19 -14
  473. package/dist/telegram/bot/helpers.js +3 -5
  474. package/dist/telegram/bot-access.js +35 -36
  475. package/dist/telegram/bot-handlers.js +120 -148
  476. package/dist/telegram/bot-message-context.js +68 -9
  477. package/dist/telegram/bot-message-dispatch.js +155 -90
  478. package/dist/telegram/bot-native-commands.js +16 -0
  479. package/dist/telegram/draft-stream.js +14 -1
  480. package/dist/telegram/inline-buttons.js +5 -15
  481. package/dist/telegram/monitor.js +11 -7
  482. package/dist/telegram/network-config.js +19 -7
  483. package/dist/telegram/send.js +3 -2
  484. package/dist/telegram/sent-message-cache.js +5 -6
  485. package/dist/telegram/status-reaction-variants.js +208 -0
  486. package/dist/telegram/sticker-cache.js +11 -9
  487. package/dist/terminal/theme.js +12 -12
  488. package/dist/tts/tts.js +80 -567
  489. package/dist/tui/components/chat-log.js +41 -8
  490. package/dist/tui/theme/theme.js +10 -12
  491. package/dist/tui/tui-local-shell.js +16 -6
  492. package/dist/tui/tui.js +58 -6
  493. package/dist/utils/account-id.js +2 -4
  494. package/dist/utils/boolean.js +10 -5
  495. package/dist/utils/directive-tags.js +11 -0
  496. package/dist/utils/queue-helpers.js +67 -12
  497. package/dist/web/auto-reply/deliver-reply.js +8 -4
  498. package/dist/web/auto-reply/mentions.js +10 -5
  499. package/dist/web/auto-reply/monitor/group-members.js +14 -7
  500. package/dist/web/auto-reply/monitor/process-message.js +45 -24
  501. package/dist/web/inbound/access-control.js +5 -2
  502. package/dist/web/login-qr.js +12 -6
  503. package/dist/web/media.js +123 -16
  504. package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
  505. package/extensions/bluebubbles/src/monitor.ts +208 -1950
  506. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { fetchJson } from "./provider-usage.fetch.shared.js";
1
+ import { buildUsageHttpErrorSnapshot, fetchJson } from "./provider-usage.fetch.shared.js";
2
2
  import { clampPercent, PROVIDER_LABELS } from "./provider-usage.shared.js";
3
3
  export async function fetchGeminiUsage(token, timeoutMs, fetchFn, provider) {
4
4
  const res = await fetchJson("https://cloudcode-pa.googleapis.com/v1internal:retrieveUserQuota", {
@@ -10,20 +10,19 @@ export async function fetchGeminiUsage(token, timeoutMs, fetchFn, provider) {
10
10
  body: "{}",
11
11
  }, timeoutMs, fetchFn);
12
12
  if (!res.ok) {
13
- return {
13
+ return buildUsageHttpErrorSnapshot({
14
14
  provider,
15
- displayName: PROVIDER_LABELS[provider],
16
- windows: [],
17
- error: `HTTP ${res.status}`,
18
- };
15
+ status: res.status,
16
+ });
19
17
  }
20
18
  const data = (await res.json());
21
19
  const quotas = {};
22
20
  for (const bucket of data.buckets || []) {
23
21
  const model = bucket.modelId || "unknown";
24
22
  const frac = bucket.remainingFraction ?? 1;
25
- if (!quotas[model] || frac < quotas[model])
23
+ if (!quotas[model] || frac < quotas[model]) {
26
24
  quotas[model] = frac;
25
+ }
27
26
  }
28
27
  const windows = [];
29
28
  let proMin = 1;
@@ -34,24 +33,28 @@ export async function fetchGeminiUsage(token, timeoutMs, fetchFn, provider) {
34
33
  const lower = model.toLowerCase();
35
34
  if (lower.includes("pro")) {
36
35
  hasPro = true;
37
- if (frac < proMin)
36
+ if (frac < proMin) {
38
37
  proMin = frac;
38
+ }
39
39
  }
40
40
  if (lower.includes("flash")) {
41
41
  hasFlash = true;
42
- if (frac < flashMin)
42
+ if (frac < flashMin) {
43
43
  flashMin = frac;
44
+ }
44
45
  }
45
46
  }
46
- if (hasPro)
47
+ if (hasPro) {
47
48
  windows.push({
48
49
  label: "Pro",
49
50
  usedPercent: clampPercent((1 - proMin) * 100),
50
51
  });
51
- if (hasFlash)
52
+ }
53
+ if (hasFlash) {
52
54
  windows.push({
53
55
  label: "Flash",
54
56
  usedPercent: clampPercent((1 - flashMin) * 100),
55
57
  });
58
+ }
56
59
  return { provider, displayName: PROVIDER_LABELS[provider], windows };
57
60
  }
@@ -1,6 +1,7 @@
1
+ import { PROVIDER_LABELS } from "./provider-usage.shared.js";
1
2
  export async function fetchJson(url, init, timeoutMs, fetchFn) {
2
3
  const controller = new AbortController();
3
- const timer = setTimeout(() => controller.abort(), timeoutMs);
4
+ const timer = setTimeout(controller.abort.bind(controller), timeoutMs);
4
5
  try {
5
6
  return await fetchFn(url, { ...init, signal: controller.signal });
6
7
  }
@@ -8,3 +9,31 @@ export async function fetchJson(url, init, timeoutMs, fetchFn) {
8
9
  clearTimeout(timer);
9
10
  }
10
11
  }
12
+ export function parseFiniteNumber(value) {
13
+ if (typeof value === "number" && Number.isFinite(value)) {
14
+ return value;
15
+ }
16
+ if (typeof value === "string") {
17
+ const parsed = Number.parseFloat(value);
18
+ if (Number.isFinite(parsed)) {
19
+ return parsed;
20
+ }
21
+ }
22
+ return undefined;
23
+ }
24
+ export function buildUsageErrorSnapshot(provider, error) {
25
+ return {
26
+ provider,
27
+ displayName: PROVIDER_LABELS[provider],
28
+ windows: [],
29
+ error,
30
+ };
31
+ }
32
+ export function buildUsageHttpErrorSnapshot(options) {
33
+ const tokenExpiredStatuses = options.tokenExpiredStatuses ?? [];
34
+ if (tokenExpiredStatuses.includes(options.status)) {
35
+ return buildUsageErrorSnapshot(options.provider, "Token expired");
36
+ }
37
+ const suffix = options.message?.trim() ? `: ${options.message.trim()}` : "";
38
+ return buildUsageErrorSnapshot(options.provider, `HTTP ${options.status}${suffix}`);
39
+ }
@@ -1,4 +1,4 @@
1
- import { fetchJson } from "./provider-usage.fetch.shared.js";
1
+ import { buildUsageHttpErrorSnapshot, fetchJson } from "./provider-usage.fetch.shared.js";
2
2
  import { clampPercent, PROVIDER_LABELS } from "./provider-usage.shared.js";
3
3
  export async function fetchZaiUsage(apiKey, timeoutMs, fetchFn) {
4
4
  const res = await fetchJson("https://api.z.ai/api/monitor/usage/quota/limit", {
@@ -9,12 +9,10 @@ export async function fetchZaiUsage(apiKey, timeoutMs, fetchFn) {
9
9
  },
10
10
  }, timeoutMs, fetchFn);
11
11
  if (!res.ok) {
12
- return {
12
+ return buildUsageHttpErrorSnapshot({
13
13
  provider: "zai",
14
- displayName: PROVIDER_LABELS.zai,
15
- windows: [],
16
- error: `HTTP ${res.status}`,
17
- };
14
+ status: res.status,
15
+ });
18
16
  }
19
17
  const data = (await res.json());
20
18
  if (!data.success || data.code !== 200) {
@@ -31,12 +29,15 @@ export async function fetchZaiUsage(apiKey, timeoutMs, fetchFn) {
31
29
  const percent = clampPercent(limit.percentage || 0);
32
30
  const nextReset = limit.nextResetTime ? new Date(limit.nextResetTime).getTime() : undefined;
33
31
  let windowLabel = "Limit";
34
- if (limit.unit === 1)
32
+ if (limit.unit === 1) {
35
33
  windowLabel = `${limit.number}d`;
36
- else if (limit.unit === 3)
34
+ }
35
+ else if (limit.unit === 3) {
37
36
  windowLabel = `${limit.number}h`;
38
- else if (limit.unit === 5)
37
+ }
38
+ else if (limit.unit === 5) {
39
39
  windowLabel = `${limit.number}m`;
40
+ }
40
41
  if (limit.type === "TOKENS_LIMIT") {
41
42
  windows.push({
42
43
  label: `Tokens (${windowLabel})`,
@@ -1,4 +1,5 @@
1
1
  import { RateLimitError } from "@buape/carbon";
2
+ import { createSubsystemLogger } from "../logging/subsystem.js";
2
3
  import { formatErrorMessage } from "./errors.js";
3
4
  import { resolveRetryConfig, retryAsync } from "./retry.js";
4
5
  export const DISCORD_RETRY_DEFAULTS = {
@@ -13,6 +14,7 @@ export const TELEGRAM_RETRY_DEFAULTS = {
13
14
  maxDelayMs: 30_000,
14
15
  jitter: 0.1,
15
16
  };
17
+ const log = createSubsystemLogger("retry-policy");
16
18
  const TELEGRAM_RETRY_RE = /429|timeout|connect|reset|closed|unavailable|temporarily/i;
17
19
  function getTelegramRetryAfterMs(err) {
18
20
  if (!err || typeof err !== "object")
@@ -43,7 +45,7 @@ export function createDiscordRetryRunner(params) {
43
45
  ? (info) => {
44
46
  const labelText = info.label ?? "request";
45
47
  const maxRetries = Math.max(1, info.maxAttempts - 1);
46
- console.warn(`discord ${labelText} rate limited, retry ${info.attempt}/${maxRetries} in ${info.delayMs}ms`);
48
+ log.warn(`discord ${labelText} rate limited, retry ${info.attempt}/${maxRetries} in ${info.delayMs}ms`);
47
49
  }
48
50
  : undefined,
49
51
  });
@@ -64,7 +66,7 @@ export function createTelegramRetryRunner(params) {
64
66
  onRetry: params.verbose
65
67
  ? (info) => {
66
68
  const maxRetries = Math.max(1, info.maxAttempts - 1);
67
- console.warn(`telegram send retry ${info.attempt}/${maxRetries} for ${info.label ?? label ?? "request"} in ${info.delayMs}ms: ${formatErrorMessage(info.err)}`);
69
+ log.warn(`telegram send retry ${info.attempt}/${maxRetries} for ${info.label ?? label ?? "request"} in ${info.delayMs}ms: ${formatErrorMessage(info.err)}`);
68
70
  }
69
71
  : undefined,
70
72
  });
@@ -1,15 +1,16 @@
1
+ import { sleep } from "../utils.js";
1
2
  const DEFAULT_RETRY_CONFIG = {
2
3
  attempts: 3,
3
4
  minDelayMs: 300,
4
5
  maxDelayMs: 30_000,
5
6
  jitter: 0,
6
7
  };
7
- const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
8
8
  const asFiniteNumber = (value) => typeof value === "number" && Number.isFinite(value) ? value : undefined;
9
9
  const clampNumber = (value, fallback, min, max) => {
10
10
  const next = asFiniteNumber(value);
11
- if (next === undefined)
11
+ if (next === undefined) {
12
12
  return fallback;
13
+ }
13
14
  const floor = typeof min === "number" ? min : Number.NEGATIVE_INFINITY;
14
15
  const ceiling = typeof max === "number" ? max : Number.POSITIVE_INFINITY;
15
16
  return Math.min(Math.max(next, floor), ceiling);
@@ -22,8 +23,9 @@ export function resolveRetryConfig(defaults = DEFAULT_RETRY_CONFIG, overrides) {
22
23
  return { attempts, minDelayMs, maxDelayMs, jitter };
23
24
  }
24
25
  function applyJitter(delayMs, jitter) {
25
- if (jitter <= 0)
26
+ if (jitter <= 0) {
26
27
  return delayMs;
28
+ }
27
29
  const offset = (Math.random() * 2 - 1) * jitter;
28
30
  return Math.max(0, Math.round(delayMs * (1 + offset)));
29
31
  }
@@ -37,8 +39,9 @@ export async function retryAsync(fn, attemptsOrOptions = 3, initialDelayMs = 300
37
39
  }
38
40
  catch (err) {
39
41
  lastErr = err;
40
- if (i === attempts - 1)
42
+ if (i === attempts - 1) {
41
43
  break;
44
+ }
42
45
  const delay = initialDelayMs * 2 ** i;
43
46
  await sleep(delay);
44
47
  }
@@ -61,8 +64,9 @@ export async function retryAsync(fn, attemptsOrOptions = 3, initialDelayMs = 300
61
64
  }
62
65
  catch (err) {
63
66
  lastErr = err;
64
- if (attempt >= maxAttempts || !shouldRetry(err, attempt))
67
+ if (attempt >= maxAttempts || !shouldRetry(err, attempt)) {
65
68
  break;
69
+ }
66
70
  const retryAfterMs = options.retryAfterMs?.(err);
67
71
  const hasRetryAfter = typeof retryAfterMs === "number" && Number.isFinite(retryAfterMs);
68
72
  const baseDelay = hasRetryAfter
@@ -2,7 +2,9 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import readline from "node:readline";
4
4
  import { normalizeUsage } from "../agents/usage.js";
5
+ import { stripInboundMetadata } from "../auto-reply/reply/strip-inbound-meta.js";
5
6
  import { resolveSessionFilePath, resolveSessionTranscriptsDirForAgent, } from "../config/sessions/paths.js";
7
+ import { stripEnvelope, stripMessageIdHints } from "../shared/chat-envelope.js";
6
8
  import { countToolResults, extractToolCallNames } from "../utils/transcript-tools.js";
7
9
  import { estimateUsageCost, resolveModelCostConfig } from "../utils/usage-format.js";
8
10
  const emptyTotals = () => ({
@@ -105,7 +107,7 @@ const computeLatencyStats = (values) => {
105
107
  if (!values.length) {
106
108
  return undefined;
107
109
  }
108
- const sorted = [...values].sort((a, b) => a - b);
110
+ const sorted = values.toSorted((a, b) => a - b);
109
111
  const total = sorted.reduce((sum, v) => sum + v, 0);
110
112
  const count = sorted.length;
111
113
  const p95Index = Math.max(0, Math.ceil(count * 0.95) - 1);
@@ -144,33 +146,47 @@ const applyCostTotal = (totals, costTotal) => {
144
146
  }
145
147
  totals.totalCost += costTotal;
146
148
  };
147
- async function scanTranscriptFile(params) {
148
- const fileStream = fs.createReadStream(params.filePath, { encoding: "utf-8" });
149
+ async function* readJsonlRecords(filePath) {
150
+ const fileStream = fs.createReadStream(filePath, { encoding: "utf-8" });
149
151
  const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
150
- for await (const line of rl) {
151
- const trimmed = line.trim();
152
- if (!trimmed) {
153
- continue;
154
- }
155
- try {
156
- const parsed = JSON.parse(trimmed);
157
- const entry = parseTranscriptEntry(parsed);
158
- if (!entry) {
152
+ try {
153
+ for await (const line of rl) {
154
+ const trimmed = line.trim();
155
+ if (!trimmed) {
159
156
  continue;
160
157
  }
161
- if (entry.usage && entry.costTotal === undefined) {
162
- const cost = resolveModelCostConfig({
163
- provider: entry.provider,
164
- model: entry.model,
165
- config: params.config,
166
- });
167
- entry.costTotal = estimateUsageCost({ usage: entry.usage, cost });
158
+ try {
159
+ const parsed = JSON.parse(trimmed);
160
+ if (!parsed || typeof parsed !== "object") {
161
+ continue;
162
+ }
163
+ yield parsed;
164
+ }
165
+ catch {
166
+ // Ignore malformed lines
168
167
  }
169
- params.onEntry(entry);
170
168
  }
171
- catch {
172
- // Ignore malformed lines
169
+ }
170
+ finally {
171
+ rl.close();
172
+ fileStream.destroy();
173
+ }
174
+ }
175
+ async function scanTranscriptFile(params) {
176
+ for await (const parsed of readJsonlRecords(params.filePath)) {
177
+ const entry = parseTranscriptEntry(parsed);
178
+ if (!entry) {
179
+ continue;
173
180
  }
181
+ if (entry.usage && entry.costTotal === undefined) {
182
+ const cost = resolveModelCostConfig({
183
+ provider: entry.provider,
184
+ model: entry.model,
185
+ config: params.config,
186
+ });
187
+ entry.costTotal = estimateUsageCost({ usage: entry.usage, cost });
188
+ }
189
+ params.onEntry(entry);
174
190
  }
175
191
  }
176
192
  async function scanUsageFile(params) {
@@ -257,7 +273,7 @@ export async function loadCostUsageSummary(params) {
257
273
  }
258
274
  const daily = Array.from(dailyMap.entries())
259
275
  .map(([date, bucket]) => Object.assign({ date }, bucket))
260
- .sort((a, b) => a.date.localeCompare(b.date));
276
+ .toSorted((a, b) => a.date.localeCompare(b.date));
261
277
  // Calculate days for backwards compatibility in response
262
278
  const days = Math.ceil((untilTime - sinceTime) / (24 * 60 * 60 * 1000)) + 1;
263
279
  return {
@@ -294,15 +310,8 @@ export async function discoverAllSessions(params) {
294
310
  // Try to read first user message for label extraction
295
311
  let firstUserMessage;
296
312
  try {
297
- const fileStream = fs.createReadStream(filePath, { encoding: "utf-8" });
298
- const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
299
- for await (const line of rl) {
300
- const trimmed = line.trim();
301
- if (!trimmed) {
302
- continue;
303
- }
313
+ for await (const parsed of readJsonlRecords(filePath)) {
304
314
  try {
305
- const parsed = JSON.parse(trimmed);
306
315
  const message = parsed.message;
307
316
  if (message?.role === "user") {
308
317
  const content = message.content;
@@ -329,8 +338,6 @@ export async function discoverAllSessions(params) {
329
338
  // Skip malformed lines
330
339
  }
331
340
  }
332
- rl.close();
333
- fileStream.destroy();
334
341
  }
335
342
  catch {
336
343
  // Ignore read errors
@@ -343,11 +350,15 @@ export async function discoverAllSessions(params) {
343
350
  });
344
351
  }
345
352
  // Sort by mtime descending (most recent first)
346
- return discovered.sort((a, b) => b.mtime - a.mtime);
353
+ return discovered.toSorted((a, b) => b.mtime - a.mtime);
347
354
  }
348
355
  export async function loadSessionCostSummary(params) {
349
356
  const sessionFile = params.sessionFile ??
350
- (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry) : undefined);
357
+ (params.sessionId
358
+ ? resolveSessionFilePath(params.sessionId, params.sessionEntry, {
359
+ agentId: params.agentId,
360
+ })
361
+ : undefined);
351
362
  if (!sessionFile || !fs.existsSync(sessionFile)) {
352
363
  return null;
353
364
  }
@@ -527,8 +538,8 @@ export async function loadSessionCostSummary(params) {
527
538
  // Convert daily map to sorted array
528
539
  const dailyBreakdown = Array.from(dailyMap.entries())
529
540
  .map(([date, data]) => ({ date, tokens: data.tokens, cost: data.cost }))
530
- .sort((a, b) => a.date.localeCompare(b.date));
531
- const dailyMessageCounts = Array.from(dailyMessageMap.values()).sort((a, b) => a.date.localeCompare(b.date));
541
+ .toSorted((a, b) => a.date.localeCompare(b.date));
542
+ const dailyMessageCounts = Array.from(dailyMessageMap.values()).toSorted((a, b) => a.date.localeCompare(b.date));
532
543
  const dailyLatency = Array.from(dailyLatencyMap.entries())
533
544
  .map(([date, values]) => {
534
545
  const stats = computeLatencyStats(values);
@@ -538,19 +549,19 @@ export async function loadSessionCostSummary(params) {
538
549
  return { date, ...stats };
539
550
  })
540
551
  .filter((entry) => Boolean(entry))
541
- .sort((a, b) => a.date.localeCompare(b.date));
542
- const dailyModelUsage = Array.from(dailyModelUsageMap.values()).sort((a, b) => a.date.localeCompare(b.date) || b.cost - a.cost);
552
+ .toSorted((a, b) => a.date.localeCompare(b.date));
553
+ const dailyModelUsage = Array.from(dailyModelUsageMap.values()).toSorted((a, b) => a.date.localeCompare(b.date) || b.cost - a.cost);
543
554
  const toolUsage = toolUsageMap.size
544
555
  ? {
545
556
  totalCalls: Array.from(toolUsageMap.values()).reduce((sum, count) => sum + count, 0),
546
557
  uniqueTools: toolUsageMap.size,
547
558
  tools: Array.from(toolUsageMap.entries())
548
559
  .map(([name, count]) => ({ name, count }))
549
- .sort((a, b) => b.count - a.count),
560
+ .toSorted((a, b) => b.count - a.count),
550
561
  }
551
562
  : undefined;
552
563
  const modelUsage = modelUsageMap.size
553
- ? Array.from(modelUsageMap.values()).sort((a, b) => {
564
+ ? Array.from(modelUsageMap.values()).toSorted((a, b) => {
554
565
  const costDiff = b.totals.totalCost - a.totals.totalCost;
555
566
  if (costDiff !== 0) {
556
567
  return costDiff;
@@ -566,7 +577,7 @@ export async function loadSessionCostSummary(params) {
566
577
  durationMs: firstActivity !== undefined && lastActivity !== undefined
567
578
  ? Math.max(0, lastActivity - firstActivity)
568
579
  : undefined,
569
- activityDates: Array.from(activityDatesSet).sort(),
580
+ activityDates: Array.from(activityDatesSet).toSorted(),
570
581
  dailyBreakdown,
571
582
  dailyMessageCounts,
572
583
  dailyLatency: dailyLatency.length ? dailyLatency : undefined,
@@ -580,7 +591,11 @@ export async function loadSessionCostSummary(params) {
580
591
  }
581
592
  export async function loadSessionUsageTimeSeries(params) {
582
593
  const sessionFile = params.sessionFile ??
583
- (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry) : undefined);
594
+ (params.sessionId
595
+ ? resolveSessionFilePath(params.sessionId, params.sessionEntry, {
596
+ agentId: params.agentId,
597
+ })
598
+ : undefined);
584
599
  if (!sessionFile || !fs.existsSync(sessionFile)) {
585
600
  return null;
586
601
  }
@@ -617,18 +632,47 @@ export async function loadSessionUsageTimeSeries(params) {
617
632
  },
618
633
  });
619
634
  // Sort by timestamp
620
- const sortedPoints = points.sort((a, b) => a.timestamp - b.timestamp);
635
+ const sortedPoints = points.toSorted((a, b) => a.timestamp - b.timestamp);
621
636
  // Optionally downsample if too many points
622
637
  const maxPoints = params.maxPoints ?? 100;
623
638
  if (sortedPoints.length > maxPoints) {
624
639
  const step = Math.ceil(sortedPoints.length / maxPoints);
625
640
  const downsampled = [];
641
+ let downsampledCumulativeTokens = 0;
642
+ let downsampledCumulativeCost = 0;
626
643
  for (let i = 0; i < sortedPoints.length; i += step) {
627
- downsampled.push(sortedPoints[i]);
628
- }
629
- // Always include the last point
630
- if (downsampled[downsampled.length - 1] !== sortedPoints[sortedPoints.length - 1]) {
631
- downsampled.push(sortedPoints[sortedPoints.length - 1]);
644
+ const bucket = sortedPoints.slice(i, i + step);
645
+ const bucketLast = bucket[bucket.length - 1];
646
+ if (!bucketLast) {
647
+ continue;
648
+ }
649
+ let bucketInput = 0;
650
+ let bucketOutput = 0;
651
+ let bucketCacheRead = 0;
652
+ let bucketCacheWrite = 0;
653
+ let bucketTotalTokens = 0;
654
+ let bucketCost = 0;
655
+ for (const point of bucket) {
656
+ bucketInput += point.input;
657
+ bucketOutput += point.output;
658
+ bucketCacheRead += point.cacheRead;
659
+ bucketCacheWrite += point.cacheWrite;
660
+ bucketTotalTokens += point.totalTokens;
661
+ bucketCost += point.cost;
662
+ }
663
+ downsampledCumulativeTokens += bucketTotalTokens;
664
+ downsampledCumulativeCost += bucketCost;
665
+ downsampled.push({
666
+ timestamp: bucketLast.timestamp,
667
+ input: bucketInput,
668
+ output: bucketOutput,
669
+ cacheRead: bucketCacheRead,
670
+ cacheWrite: bucketCacheWrite,
671
+ totalTokens: bucketTotalTokens,
672
+ cost: bucketCost,
673
+ cumulativeTokens: downsampledCumulativeTokens,
674
+ cumulativeCost: downsampledCumulativeCost,
675
+ });
632
676
  }
633
677
  return { sessionId: params.sessionId, points: downsampled };
634
678
  }
@@ -636,21 +680,18 @@ export async function loadSessionUsageTimeSeries(params) {
636
680
  }
637
681
  export async function loadSessionLogs(params) {
638
682
  const sessionFile = params.sessionFile ??
639
- (params.sessionId ? resolveSessionFilePath(params.sessionId, params.sessionEntry) : undefined);
683
+ (params.sessionId
684
+ ? resolveSessionFilePath(params.sessionId, params.sessionEntry, {
685
+ agentId: params.agentId,
686
+ })
687
+ : undefined);
640
688
  if (!sessionFile || !fs.existsSync(sessionFile)) {
641
689
  return null;
642
690
  }
643
691
  const logs = [];
644
692
  const limit = params.limit ?? 50;
645
- const fileStream = fs.createReadStream(sessionFile, { encoding: "utf-8" });
646
- const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity });
647
- for await (const line of rl) {
648
- const trimmed = line.trim();
649
- if (!trimmed) {
650
- continue;
651
- }
693
+ for await (const parsed of readJsonlRecords(sessionFile)) {
652
694
  try {
653
- const parsed = JSON.parse(trimmed);
654
695
  const message = parsed.message;
655
696
  if (!message) {
656
697
  continue;
@@ -718,6 +759,13 @@ export async function loadSessionLogs(params) {
718
759
  if (!content) {
719
760
  continue;
720
761
  }
762
+ content = stripInboundMetadata(content);
763
+ if (role === "user") {
764
+ content = stripMessageIdHints(stripEnvelope(content)).trim();
765
+ }
766
+ if (!content) {
767
+ continue;
768
+ }
721
769
  // Truncate very long content
722
770
  const maxLen = 2000;
723
771
  if (content.length > maxLen) {
@@ -771,7 +819,7 @@ export async function loadSessionLogs(params) {
771
819
  }
772
820
  }
773
821
  // Sort by timestamp and limit
774
- const sortedLogs = logs.sort((a, b) => a.timestamp - b.timestamp);
822
+ const sortedLogs = logs.toSorted((a, b) => a.timestamp - b.timestamp);
775
823
  // Return most recent logs
776
824
  if (sortedLogs.length > limit) {
777
825
  return sortedLogs.slice(-limit);
@@ -1,7 +1,9 @@
1
1
  import { resolveSessionAgentId } from "../agents/agent-scope.js";
2
+ import { createSubsystemLogger } from "../logging/subsystem.js";
2
3
  import { isDeliverableMessageChannel, normalizeMessageChannel } from "../utils/message-channel.js";
3
4
  import { resolveSessionDeliveryTarget } from "./outbound/targets.js";
4
5
  import { enqueueSystemEvent } from "./system-events.js";
6
+ const log = createSubsystemLogger("session-maintenance");
5
7
  const warnedContexts = new Map();
6
8
  function shouldSendWarning() {
7
9
  return !process.env.VITEST && process.env.NODE_ENV !== "test";
@@ -83,7 +85,7 @@ export async function deliverSessionMaintenanceWarning(params) {
83
85
  });
84
86
  }
85
87
  catch (err) {
86
- console.warn(`Failed to deliver session maintenance warning: ${String(err)}`);
88
+ log.warn(`Failed to deliver session maintenance warning: ${String(err)}`);
87
89
  enqueueSystemEvent(text, { sessionKey: params.sessionKey });
88
90
  }
89
91
  }