@poolzin/pool-bot 2026.2.20 → 2026.2.22

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 (388) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/agents/api-key-rotation.js +47 -0
  3. package/dist/agents/apply-patch-update.js +19 -9
  4. package/dist/agents/apply-patch.js +72 -47
  5. package/dist/agents/bash-tools.exec.js +141 -559
  6. package/dist/agents/cli-backends.js +49 -6
  7. package/dist/agents/cli-runner/helpers.js +69 -152
  8. package/dist/agents/cli-runner.js +70 -19
  9. package/dist/agents/identity.js +20 -1
  10. package/dist/agents/image-sanitization.js +9 -0
  11. package/dist/agents/live-auth-keys.js +123 -26
  12. package/dist/agents/live-model-filter.js +13 -4
  13. package/dist/agents/model-auth.js +12 -0
  14. package/dist/agents/model-catalog.js +40 -9
  15. package/dist/agents/model-fallback.js +24 -0
  16. package/dist/agents/model-forward-compat.js +60 -23
  17. package/dist/agents/model-selection.js +134 -41
  18. package/dist/agents/pi-auth-json.js +2 -2
  19. package/dist/agents/pi-embedded-helpers/bootstrap.js +65 -15
  20. package/dist/agents/pi-embedded-helpers/errors.js +140 -15
  21. package/dist/agents/pi-embedded-helpers/images.js +22 -12
  22. package/dist/agents/pi-embedded-helpers.js +2 -2
  23. package/dist/agents/pi-embedded-runner/abort.js +10 -3
  24. package/dist/agents/pi-embedded-runner/compact.js +230 -32
  25. package/dist/agents/pi-embedded-runner/extra-params.js +203 -12
  26. package/dist/agents/pi-embedded-runner/google.js +109 -19
  27. package/dist/agents/pi-embedded-runner/history.js +35 -17
  28. package/dist/agents/pi-embedded-runner/run/attempt.js +386 -80
  29. package/dist/agents/pi-embedded-runner/run/images.js +81 -55
  30. package/dist/agents/pi-embedded-runner/run/payloads.js +89 -39
  31. package/dist/agents/pi-embedded-runner/run.js +193 -25
  32. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +2 -2
  33. package/dist/agents/pi-embedded-runner/runs.js +17 -8
  34. package/dist/agents/pi-embedded-runner/tool-result-context-guard.js +262 -0
  35. package/dist/agents/pi-embedded-runner.js +1 -1
  36. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +180 -10
  37. package/dist/agents/pi-embedded-subscribe.js +37 -0
  38. package/dist/agents/pi-embedded-subscribe.tools.js +127 -30
  39. package/dist/agents/pi-model-discovery.js +9 -2
  40. package/dist/agents/pi-tool-definition-adapter.js +60 -8
  41. package/dist/agents/pi-tools.before-tool-call.js +1 -1
  42. package/dist/agents/pi-tools.js +113 -94
  43. package/dist/agents/pi-tools.read.js +337 -38
  44. package/dist/agents/poolbot-tools.js +14 -5
  45. package/dist/agents/provider/config-loader.js +76 -0
  46. package/dist/agents/provider/index.js +15 -0
  47. package/dist/agents/provider/integration.js +136 -0
  48. package/dist/agents/provider/models-dev.js +129 -0
  49. package/dist/agents/provider/rate-limits.js +458 -0
  50. package/dist/agents/provider/request-monitor.js +449 -0
  51. package/dist/agents/provider/session-binding.js +376 -0
  52. package/dist/agents/provider/token-pool.js +541 -0
  53. package/dist/agents/sandbox/docker.js +10 -5
  54. package/dist/agents/sandbox/registry.js +96 -46
  55. package/dist/agents/sandbox/sanitize-env-vars.js +82 -0
  56. package/dist/agents/sandbox-paths.js +43 -10
  57. package/dist/agents/session-tool-result-guard-wrapper.js +23 -11
  58. package/dist/agents/session-tool-result-guard.js +39 -39
  59. package/dist/agents/session-transcript-repair.js +36 -33
  60. package/dist/agents/session-write-lock.js +62 -44
  61. package/dist/agents/skills/frontmatter.js +49 -88
  62. package/dist/agents/skills/workspace.js +335 -28
  63. package/dist/agents/subagent-announce.js +508 -174
  64. package/dist/agents/subagent-registry.js +45 -4
  65. package/dist/agents/subagent-spawn.js +16 -33
  66. package/dist/agents/system-prompt-report.js +27 -10
  67. package/dist/agents/system-prompt.js +26 -32
  68. package/dist/agents/tool-call-id.js +69 -17
  69. package/dist/agents/tool-display-common.js +1 -1
  70. package/dist/agents/tool-images.js +64 -31
  71. package/dist/agents/tools/canvas-tool.js +17 -11
  72. package/dist/agents/tools/common.js +37 -19
  73. package/dist/agents/tools/cron-tool.js +40 -38
  74. package/dist/agents/tools/gateway.js +70 -2
  75. package/dist/agents/tools/message-tool.js +181 -40
  76. package/dist/agents/tools/nodes-tool.js +128 -36
  77. package/dist/agents/tools/nodes-utils.js +12 -38
  78. package/dist/agents/tools/session-status-tool.js +24 -71
  79. package/dist/agents/tools/sessions-helpers.js +38 -210
  80. package/dist/agents/tools/sessions-spawn-tool.js +28 -198
  81. package/dist/agents/tools/telegram-actions.js +58 -7
  82. package/dist/agents/tools/web-fetch-utils.js +112 -7
  83. package/dist/agents/tools/web-fetch.js +279 -175
  84. package/dist/agents/tools/web-shared.js +71 -8
  85. package/dist/agents/usage.js +25 -16
  86. package/dist/auto-reply/commands-registry.data.js +85 -11
  87. package/dist/auto-reply/dispatch.js +40 -21
  88. package/dist/auto-reply/reply/abort.js +102 -33
  89. package/dist/auto-reply/reply/commands-core.js +82 -33
  90. package/dist/auto-reply/reply/commands-export-session.js +1 -1
  91. package/dist/auto-reply/reply/commands-info.js +41 -12
  92. package/dist/auto-reply/reply/commands-subagents.js +352 -100
  93. package/dist/auto-reply/reply/commands-system-prompt.js +2 -2
  94. package/dist/auto-reply/reply/dispatch-from-config.js +100 -29
  95. package/dist/auto-reply/reply/elevated-unavailable.js +1 -1
  96. package/dist/auto-reply/reply/inbound-meta.js +12 -1
  97. package/dist/auto-reply/reply/mentions.js +18 -11
  98. package/dist/auto-reply/reply/normalize-reply.js +17 -8
  99. package/dist/auto-reply/reply/reply-dispatcher.js +62 -10
  100. package/dist/auto-reply/reply/session.js +102 -21
  101. package/dist/auto-reply/reply/streaming-directives.js +16 -5
  102. package/dist/auto-reply/status.js +73 -50
  103. package/dist/browser/extension-relay.js +3 -3
  104. package/dist/browser/http-auth.js +1 -1
  105. package/dist/browser/paths.js +2 -2
  106. package/dist/build-info.json +3 -3
  107. package/dist/channels/allowlist-match.js +20 -0
  108. package/dist/channels/allowlists/resolve-utils.js +65 -2
  109. package/dist/channels/chat-type.js +8 -4
  110. package/dist/channels/dock.js +127 -35
  111. package/dist/channels/draft-stream-loop.js +6 -2
  112. package/dist/channels/plugins/actions/telegram.js +42 -18
  113. package/dist/channels/plugins/allowlist-match.js +1 -1
  114. package/dist/channels/plugins/group-mentions.js +51 -41
  115. package/dist/channels/plugins/message-action-names.js +2 -0
  116. package/dist/channels/plugins/message-actions.js +24 -5
  117. package/dist/channels/plugins/normalize/discord.js +26 -4
  118. package/dist/channels/plugins/normalize/signal.js +35 -22
  119. package/dist/channels/plugins/onboarding/helpers.js +8 -26
  120. package/dist/channels/plugins/outbound/imessage.js +15 -14
  121. package/dist/channels/registry.js +20 -7
  122. package/dist/cli/acp-cli.js +7 -5
  123. package/dist/cli/browser-cli-extension.js +25 -12
  124. package/dist/cli/browser-cli-state.cookies-storage.js +25 -6
  125. package/dist/cli/browser-cli-state.js +101 -145
  126. package/dist/cli/command-options.js +28 -0
  127. package/dist/cli/completion-cli.js +6 -6
  128. package/dist/cli/cron-cli/register.cron-add.js +25 -1
  129. package/dist/cli/cron-cli/register.cron-edit.js +44 -0
  130. package/dist/cli/cron-cli/shared.js +7 -1
  131. package/dist/cli/daemon-cli/lifecycle-core.js +23 -21
  132. package/dist/cli/daemon-cli/lifecycle.js +23 -247
  133. package/dist/cli/daemon-cli/register-service-commands.js +25 -4
  134. package/dist/cli/daemon-cli.js +1 -0
  135. package/dist/cli/devices-cli.js +33 -20
  136. package/dist/cli/gateway-cli/register.js +37 -105
  137. package/dist/cli/gateway-cli/run.js +49 -11
  138. package/dist/cli/nodes-camera.js +59 -4
  139. package/dist/cli/nodes-cli/register.camera.js +27 -24
  140. package/dist/cli/nodes-cli/rpc.js +21 -38
  141. package/dist/cli/qr-cli.js +2 -2
  142. package/dist/cli/skills-cli.format.js +2 -2
  143. package/dist/cli/update-cli/progress.js +2 -2
  144. package/dist/cli/update-cli/restart-helper.js +28 -7
  145. package/dist/cli/update-cli/shared.js +7 -7
  146. package/dist/cli/update-cli/status.js +1 -1
  147. package/dist/cli/update-cli/update-command.js +14 -8
  148. package/dist/cli/update-cli/wizard.js +2 -2
  149. package/dist/cli/update-cli.js +21 -1027
  150. package/dist/commands/auth-choice.apply.anthropic.js +10 -2
  151. package/dist/commands/channels/add-mutators.js +3 -35
  152. package/dist/commands/channels/add.js +39 -51
  153. package/dist/commands/config-validation.js +1 -1
  154. package/dist/commands/configure.gateway-auth.js +52 -15
  155. package/dist/commands/configure.gateway.js +84 -40
  156. package/dist/commands/doctor-completion.js +3 -3
  157. package/dist/commands/doctor-config-flow.js +536 -16
  158. package/dist/commands/doctor-gateway-services.js +103 -79
  159. package/dist/commands/doctor-memory-search.js +9 -9
  160. package/dist/commands/doctor-platform-notes.js +57 -30
  161. package/dist/commands/doctor-prompter.js +26 -15
  162. package/dist/commands/doctor-session-locks.js +1 -1
  163. package/dist/commands/doctor.js +21 -9
  164. package/dist/commands/model-picker.js +120 -95
  165. package/dist/commands/models/set.js +2 -21
  166. package/dist/commands/models/shared.js +65 -37
  167. package/dist/commands/onboard-helpers.js +81 -39
  168. package/dist/commands/openai-codex-oauth.js +1 -1
  169. package/dist/commands/sessions.js +52 -53
  170. package/dist/commands/status.summary.js +52 -34
  171. package/dist/commands/test-wizard-helpers.js +2 -2
  172. package/dist/config/defaults.js +79 -42
  173. package/dist/config/group-policy.js +50 -18
  174. package/dist/config/includes.js +37 -10
  175. package/dist/config/schema.help.js +5 -4
  176. package/dist/config/schema.hints.js +2 -2
  177. package/dist/config/schema.labels.js +1 -0
  178. package/dist/config/sessions/group.js +12 -11
  179. package/dist/config/sessions/paths.js +137 -11
  180. package/dist/config/sessions/store.js +185 -65
  181. package/dist/config/sessions/types.js +15 -1
  182. package/dist/config/sessions.js +1 -0
  183. package/dist/config/telegram-custom-commands.js +3 -2
  184. package/dist/config/types.js +2 -0
  185. package/dist/config/zod-schema.agent-defaults.js +6 -27
  186. package/dist/config/zod-schema.agent-runtime.js +171 -79
  187. package/dist/config/zod-schema.providers-core.js +138 -65
  188. package/dist/config/zod-schema.session.js +49 -22
  189. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  190. package/dist/cron/isolated-agent/run.js +224 -57
  191. package/dist/cron/normalize.js +48 -45
  192. package/dist/cron/run-log.js +14 -0
  193. package/dist/cron/service/jobs.js +190 -28
  194. package/dist/cron/service/normalize.js +29 -11
  195. package/dist/cron/service/store.js +30 -44
  196. package/dist/cron/service/timer.js +182 -96
  197. package/dist/cron/service.js +3 -0
  198. package/dist/cron/stagger.js +37 -0
  199. package/dist/daemon/inspect.js +132 -92
  200. package/dist/daemon/runtime-paths.js +25 -4
  201. package/dist/daemon/service-audit.js +47 -16
  202. package/dist/discord/accounts.js +23 -20
  203. package/dist/discord/monitor/agent-components.js +1115 -219
  204. package/dist/discord/monitor/allow-list.js +114 -34
  205. package/dist/discord/monitor/listeners.js +204 -97
  206. package/dist/discord/monitor/message-handler.js +21 -10
  207. package/dist/discord/monitor/message-handler.preflight.js +195 -101
  208. package/dist/discord/monitor/message-handler.process.js +384 -123
  209. package/dist/discord/monitor/message-utils.js +86 -23
  210. package/dist/discord/monitor/native-command.js +77 -57
  211. package/dist/discord/monitor/provider.js +122 -117
  212. package/dist/discord/monitor/reply-context.js +20 -16
  213. package/dist/discord/monitor/reply-delivery.js +40 -8
  214. package/dist/discord/monitor/rest-fetch.js +22 -0
  215. package/dist/discord/monitor/threading.js +117 -24
  216. package/dist/discord/send.js +2 -1
  217. package/dist/discord/send.outbound.js +124 -11
  218. package/dist/discord/send.shared.js +112 -72
  219. package/dist/discord/voice-message.js +3 -3
  220. package/dist/gateway/auth.js +119 -44
  221. package/dist/gateway/call.js +76 -34
  222. package/dist/gateway/channel-health-monitor.js +57 -50
  223. package/dist/gateway/client.js +63 -29
  224. package/dist/gateway/control-ui-contract.js +1 -1
  225. package/dist/gateway/gateway-config-prompts.shared.js +2 -2
  226. package/dist/gateway/net.js +109 -1
  227. package/dist/gateway/protocol/index.js +5 -8
  228. package/dist/gateway/protocol/schema/agent.js +19 -1
  229. package/dist/gateway/protocol/schema/channels.js +21 -0
  230. package/dist/gateway/protocol/schema/cron.js +43 -30
  231. package/dist/gateway/protocol/schema/protocol-schemas.js +6 -11
  232. package/dist/gateway/protocol/schema/sessions.js +5 -1
  233. package/dist/gateway/protocol/schema.js +0 -1
  234. package/dist/gateway/server/presence-events.js +12 -0
  235. package/dist/gateway/server/ws-connection/message-handler.js +203 -212
  236. package/dist/gateway/server/ws-connection.js +58 -21
  237. package/dist/gateway/server-broadcast.js +18 -13
  238. package/dist/gateway/server-cron.js +177 -10
  239. package/dist/gateway/server-methods/agent-job.js +131 -38
  240. package/dist/gateway/server-methods/send.js +60 -14
  241. package/dist/gateway/server-methods/sessions.js +160 -96
  242. package/dist/gateway/server-methods/system.js +5 -7
  243. package/dist/gateway/server-methods-list.js +8 -0
  244. package/dist/gateway/server-methods.js +24 -8
  245. package/dist/gateway/server-node-events.js +278 -68
  246. package/dist/gateway/session-utils.fs.js +316 -75
  247. package/dist/gateway/session-utils.js +224 -70
  248. package/dist/gateway/sessions-patch.js +63 -20
  249. package/dist/gateway/test-temp-config.js +1 -1
  250. package/dist/gateway/tools-invoke-http.js +118 -70
  251. package/dist/gateway/ws-log.js +135 -107
  252. package/dist/hooks/frontmatter.js +36 -82
  253. package/dist/hooks/install.js +149 -139
  254. package/dist/hooks/internal-hooks.js +29 -4
  255. package/dist/hooks/plugin-hooks.js +2 -1
  256. package/dist/imessage/monitor/deliver.js +10 -4
  257. package/dist/imessage/monitor/monitor-provider.js +138 -375
  258. package/dist/imessage/monitor/runtime.js +4 -8
  259. package/dist/imessage/send.js +65 -19
  260. package/dist/infra/exec-approvals-allowlist.js +7 -0
  261. package/dist/infra/exec-approvals.js +35 -920
  262. package/dist/infra/exec-safe-bin-trust.js +64 -0
  263. package/dist/infra/heartbeat-runner.js +207 -134
  264. package/dist/infra/heartbeat-wake.js +183 -22
  265. package/dist/infra/install-source-utils.js +47 -0
  266. package/dist/infra/net/ssrf.js +170 -36
  267. package/dist/infra/outbound/deliver.js +224 -58
  268. package/dist/infra/outbound/message-action-spec.js +12 -5
  269. package/dist/infra/outbound/outbound-session.js +27 -25
  270. package/dist/infra/poolbot-root.js +32 -22
  271. package/dist/infra/ports.js +14 -11
  272. package/dist/infra/skills-remote.js +48 -37
  273. package/dist/infra/system-events.js +25 -11
  274. package/dist/infra/system-presence.js +26 -33
  275. package/dist/infra/tmp-poolbot-dir.js +81 -2
  276. package/dist/infra/wsl.js +37 -1
  277. package/dist/line/bot-message-context.js +163 -191
  278. package/dist/logging/subsystem.js +59 -22
  279. package/dist/markdown/ir.js +124 -50
  280. package/dist/media/store.js +1 -1
  281. package/dist/media-understanding/runner.entries.js +42 -25
  282. package/dist/media-understanding/runner.js +53 -488
  283. package/dist/memory/embeddings-gemini.js +53 -38
  284. package/dist/memory/manager-embedding-ops.js +48 -69
  285. package/dist/pairing/pairing-store.js +178 -119
  286. package/dist/plugin-sdk/index.js +34 -6
  287. package/dist/plugins/hooks.js +135 -14
  288. package/dist/plugins/install.js +190 -152
  289. package/dist/polls.js +11 -0
  290. package/dist/routing/resolve-route.js +190 -56
  291. package/dist/routing/session-key.js +38 -22
  292. package/dist/runtime.js +35 -9
  293. package/dist/security/audit-channel.js +1 -1
  294. package/dist/sessions/session-key-utils.js +29 -11
  295. package/dist/shared/frontmatter.js +5 -5
  296. package/dist/shared/node-list-types.js +1 -0
  297. package/dist/shared/string-normalization.js +15 -0
  298. package/dist/signal/monitor/event-handler.js +68 -36
  299. package/dist/signal/send.js +29 -37
  300. package/dist/slack/monitor/allow-list.js +10 -11
  301. package/dist/slack/monitor/commands.js +14 -3
  302. package/dist/slack/monitor/events/interactions.js +4 -4
  303. package/dist/slack/monitor/media.js +224 -16
  304. package/dist/slack/monitor/message-handler/dispatch.js +247 -13
  305. package/dist/slack/monitor/message-handler/prepare.js +128 -45
  306. package/dist/slack/monitor/slash.js +357 -144
  307. package/dist/slack/streaming.js +77 -0
  308. package/dist/telegram/accounts.js +40 -13
  309. package/dist/telegram/allowed-updates.js +3 -0
  310. package/dist/telegram/bot/delivery.js +129 -66
  311. package/dist/telegram/bot/helpers.js +136 -122
  312. package/dist/telegram/bot-handlers.js +600 -339
  313. package/dist/telegram/bot-message-context.js +115 -73
  314. package/dist/telegram/bot-message-dispatch.js +235 -104
  315. package/dist/telegram/bot-native-command-menu.js +3 -1
  316. package/dist/telegram/bot-native-commands.js +213 -193
  317. package/dist/telegram/bot.js +24 -132
  318. package/dist/telegram/draft-stream.js +84 -75
  319. package/dist/telegram/format.js +150 -6
  320. package/dist/telegram/send.js +415 -255
  321. package/dist/telegram/targets.js +21 -2
  322. package/dist/telegram/update-offset-store.js +19 -3
  323. package/dist/terminal/restore.js +5 -2
  324. package/dist/test-utils/fetch-mock.js +5 -0
  325. package/dist/version.js +18 -5
  326. package/dist/web/auto-reply/monitor/broadcast.js +7 -3
  327. package/dist/web/auto-reply/monitor/on-message.js +6 -3
  328. package/dist/web/inbound/media.js +34 -8
  329. package/dist/web/inbound/monitor.js +34 -17
  330. package/dist/web/inbound/send-api.js +18 -17
  331. package/dist/web/outbound.js +12 -5
  332. package/dist/wizard/clack-prompter.js +40 -7
  333. package/extensions/bluebubbles/package.json +1 -1
  334. package/extensions/copilot-proxy/package.json +1 -1
  335. package/extensions/diagnostics-otel/package.json +1 -1
  336. package/extensions/discord/package.json +1 -1
  337. package/extensions/feishu/package.json +1 -1
  338. package/extensions/google-antigravity-auth/package.json +1 -1
  339. package/extensions/google-gemini-cli-auth/package.json +1 -1
  340. package/extensions/googlechat/package.json +1 -1
  341. package/extensions/imessage/package.json +1 -1
  342. package/extensions/irc/package.json +1 -1
  343. package/extensions/line/package.json +1 -1
  344. package/extensions/llm-task/package.json +1 -1
  345. package/extensions/lobster/package.json +1 -1
  346. package/extensions/matrix/CHANGELOG.md +5 -0
  347. package/extensions/matrix/package.json +1 -1
  348. package/extensions/mattermost/package.json +1 -1
  349. package/extensions/memory-core/package.json +1 -1
  350. package/extensions/memory-lancedb/package.json +1 -1
  351. package/extensions/minimax-portal-auth/package.json +1 -1
  352. package/extensions/msteams/CHANGELOG.md +5 -0
  353. package/extensions/msteams/package.json +1 -1
  354. package/extensions/nextcloud-talk/package.json +1 -1
  355. package/extensions/nostr/CHANGELOG.md +5 -0
  356. package/extensions/nostr/package.json +1 -1
  357. package/extensions/open-prose/package.json +1 -1
  358. package/extensions/openai-codex-auth/package.json +1 -1
  359. package/extensions/signal/package.json +1 -1
  360. package/extensions/slack/package.json +1 -1
  361. package/extensions/telegram/package.json +1 -1
  362. package/extensions/tlon/package.json +1 -1
  363. package/extensions/twitch/CHANGELOG.md +5 -0
  364. package/extensions/twitch/package.json +1 -1
  365. package/extensions/voice-call/CHANGELOG.md +5 -0
  366. package/extensions/voice-call/package.json +1 -1
  367. package/extensions/whatsapp/package.json +1 -1
  368. package/extensions/zalo/CHANGELOG.md +5 -0
  369. package/extensions/zalo/package.json +1 -1
  370. package/extensions/zalouser/CHANGELOG.md +5 -0
  371. package/extensions/zalouser/package.json +1 -1
  372. package/package.json +1 -1
  373. package/skills/apple-reminders/SKILL.md +100 -49
  374. package/skills/coding-agent/SKILL.md +34 -28
  375. package/skills/github/SKILL.md +131 -16
  376. package/skills/imsg/SKILL.md +112 -15
  377. package/skills/openhue/SKILL.md +101 -19
  378. package/skills/plcode-controller/SKILL.md +156 -0
  379. package/skills/plcode-controller/assets/operator-prompts.md +65 -0
  380. package/skills/plcode-controller/references/command-cheatsheet.md +53 -0
  381. package/skills/plcode-controller/references/failure-handling.md +60 -0
  382. package/skills/plcode-controller/references/model-selection.md +57 -0
  383. package/skills/plcode-controller/references/plan-vs-build.md +52 -0
  384. package/skills/plcode-controller/references/question-handling.md +40 -0
  385. package/skills/plcode-controller/references/session-management.md +63 -0
  386. package/skills/plcode-controller/references/workflow.md +35 -0
  387. package/skills/tmux/SKILL.md +111 -79
  388. package/skills/weather/SKILL.md +88 -25
@@ -5,7 +5,7 @@ import { readSessionUpdatedAt, recordSessionMetaFromInbound, resolveStorePath, u
5
5
  import { logVerbose, shouldLogVerbose } from "../globals.js";
6
6
  import { recordChannelActivity } from "../infra/channel-activity.js";
7
7
  import { resolveAgentRoute } from "../routing/resolve-route.js";
8
- function getSourceInfo(source) {
8
+ export function getLineSourceInfo(source) {
9
9
  const userId = source.type === "user"
10
10
  ? source.userId
11
11
  : source.type === "group"
@@ -30,6 +30,25 @@ function buildPeerId(source) {
30
30
  }
31
31
  return "unknown";
32
32
  }
33
+ function resolveLineInboundRoute(params) {
34
+ recordChannelActivity({
35
+ channel: "line",
36
+ accountId: params.account.accountId,
37
+ direction: "inbound",
38
+ });
39
+ const { userId, groupId, roomId, isGroup } = getLineSourceInfo(params.source);
40
+ const peerId = buildPeerId(params.source);
41
+ const route = resolveAgentRoute({
42
+ cfg: params.cfg,
43
+ channel: "line",
44
+ accountId: params.account.accountId,
45
+ peer: {
46
+ kind: isGroup ? "group" : "direct",
47
+ id: peerId,
48
+ },
49
+ });
50
+ return { userId, groupId, roomId, isGroup, peerId, route };
51
+ }
33
52
  // Common LINE sticker package descriptions
34
53
  const STICKER_PACKAGES = {
35
54
  "1": "Moon & James",
@@ -97,141 +116,172 @@ function extractMediaPlaceholder(message) {
97
116
  return "";
98
117
  }
99
118
  }
100
- export async function buildLineMessageContext(params) {
101
- const { event, allMedia, cfg, account } = params;
102
- recordChannelActivity({
103
- channel: "line",
104
- accountId: account.accountId,
105
- direction: "inbound",
119
+ function resolveLineConversationLabel(params) {
120
+ return params.isGroup
121
+ ? params.groupId
122
+ ? `group:${params.groupId}`
123
+ : params.roomId
124
+ ? `room:${params.roomId}`
125
+ : "unknown-group"
126
+ : params.senderLabel;
127
+ }
128
+ function resolveLineAddresses(params) {
129
+ const fromAddress = params.isGroup
130
+ ? params.groupId
131
+ ? `line:group:${params.groupId}`
132
+ : params.roomId
133
+ ? `line:room:${params.roomId}`
134
+ : `line:${params.peerId}`
135
+ : `line:${params.userId ?? params.peerId}`;
136
+ const toAddress = params.isGroup ? fromAddress : `line:${params.userId ?? params.peerId}`;
137
+ const originatingTo = params.isGroup ? fromAddress : `line:${params.userId ?? params.peerId}`;
138
+ return { fromAddress, toAddress, originatingTo };
139
+ }
140
+ async function finalizeLineInboundContext(params) {
141
+ const { fromAddress, toAddress, originatingTo } = resolveLineAddresses({
142
+ isGroup: params.source.isGroup,
143
+ groupId: params.source.groupId,
144
+ roomId: params.source.roomId,
145
+ userId: params.source.userId,
146
+ peerId: params.source.peerId,
106
147
  });
107
- const source = event.source;
108
- const { userId, groupId, roomId, isGroup } = getSourceInfo(source);
109
- const peerId = buildPeerId(source);
110
- const route = resolveAgentRoute({
111
- cfg,
112
- channel: "line",
113
- accountId: account.accountId,
114
- peer: {
115
- kind: isGroup ? "group" : "dm",
116
- id: peerId,
117
- },
148
+ const senderId = params.source.userId ?? "unknown";
149
+ const senderLabel = params.source.userId ? `user:${params.source.userId}` : "unknown";
150
+ const conversationLabel = resolveLineConversationLabel({
151
+ isGroup: params.source.isGroup,
152
+ groupId: params.source.groupId,
153
+ roomId: params.source.roomId,
154
+ senderLabel,
118
155
  });
119
- const message = event.message;
120
- const messageId = message.id;
121
- const timestamp = event.timestamp;
122
- // Build message body
123
- const textContent = extractMessageText(message);
124
- const placeholder = extractMediaPlaceholder(message);
125
- let rawBody = textContent || placeholder;
126
- if (!rawBody && allMedia.length > 0) {
127
- rawBody = `<media:image>${allMedia.length > 1 ? ` (${allMedia.length} images)` : ""}`;
128
- }
129
- if (!rawBody && allMedia.length === 0) {
130
- return null;
131
- }
132
- // Build sender info
133
- const senderId = userId ?? "unknown";
134
- const senderLabel = userId ? `user:${userId}` : "unknown";
135
- // Build conversation label
136
- const conversationLabel = isGroup
137
- ? groupId
138
- ? `group:${groupId}`
139
- : roomId
140
- ? `room:${roomId}`
141
- : "unknown-group"
142
- : senderLabel;
143
- const storePath = resolveStorePath(cfg.session?.store, {
144
- agentId: route.agentId,
156
+ const storePath = resolveStorePath(params.cfg.session?.store, {
157
+ agentId: params.route.agentId,
145
158
  });
146
- const envelopeOptions = resolveEnvelopeFormatOptions(cfg);
159
+ const envelopeOptions = resolveEnvelopeFormatOptions(params.cfg);
147
160
  const previousTimestamp = readSessionUpdatedAt({
148
161
  storePath,
149
- sessionKey: route.sessionKey,
162
+ sessionKey: params.route.sessionKey,
150
163
  });
151
164
  const body = formatInboundEnvelope({
152
165
  channel: "LINE",
153
166
  from: conversationLabel,
154
- timestamp,
155
- body: rawBody,
156
- chatType: isGroup ? "group" : "direct",
167
+ timestamp: params.timestamp,
168
+ body: params.rawBody,
169
+ chatType: params.source.isGroup ? "group" : "direct",
157
170
  sender: {
158
171
  id: senderId,
159
172
  },
160
173
  previousTimestamp,
161
174
  envelope: envelopeOptions,
162
175
  });
163
- // Build location context if applicable
164
- let locationContext;
165
- if (message.type === "location") {
166
- const loc = message;
167
- locationContext = toLocationContext({
168
- latitude: loc.latitude,
169
- longitude: loc.longitude,
170
- name: loc.title,
171
- address: loc.address,
172
- });
173
- }
174
- const fromAddress = isGroup
175
- ? groupId
176
- ? `line:group:${groupId}`
177
- : roomId
178
- ? `line:room:${roomId}`
179
- : `line:${peerId}`
180
- : `line:${userId ?? peerId}`;
181
- const toAddress = isGroup ? fromAddress : `line:${userId ?? peerId}`;
182
- const originatingTo = isGroup ? fromAddress : `line:${userId ?? peerId}`;
183
176
  const ctxPayload = finalizeInboundContext({
184
177
  Body: body,
185
- RawBody: rawBody,
186
- CommandBody: rawBody,
178
+ BodyForAgent: params.rawBody,
179
+ RawBody: params.rawBody,
180
+ CommandBody: params.rawBody,
187
181
  From: fromAddress,
188
182
  To: toAddress,
189
- SessionKey: route.sessionKey,
190
- AccountId: route.accountId,
191
- ChatType: isGroup ? "group" : "direct",
183
+ SessionKey: params.route.sessionKey,
184
+ AccountId: params.route.accountId,
185
+ ChatType: params.source.isGroup ? "group" : "direct",
192
186
  ConversationLabel: conversationLabel,
193
- GroupSubject: isGroup ? (groupId ?? roomId) : undefined,
187
+ GroupSubject: params.source.isGroup
188
+ ? (params.source.groupId ?? params.source.roomId)
189
+ : undefined,
194
190
  SenderId: senderId,
195
191
  Provider: "line",
196
192
  Surface: "line",
197
- MessageSid: messageId,
198
- Timestamp: timestamp,
199
- MediaPath: allMedia[0]?.path,
200
- MediaType: allMedia[0]?.contentType,
201
- MediaUrl: allMedia[0]?.path,
202
- MediaPaths: allMedia.length > 0 ? allMedia.map((m) => m.path) : undefined,
203
- MediaUrls: allMedia.length > 0 ? allMedia.map((m) => m.path) : undefined,
204
- MediaTypes: allMedia.length > 0
205
- ? allMedia.map((m) => m.contentType).filter(Boolean)
206
- : undefined,
207
- ...locationContext,
193
+ MessageSid: params.messageSid,
194
+ Timestamp: params.timestamp,
195
+ MediaPath: params.media.firstPath,
196
+ MediaType: params.media.firstContentType,
197
+ MediaUrl: params.media.firstPath,
198
+ MediaPaths: params.media.paths,
199
+ MediaUrls: params.media.paths,
200
+ MediaTypes: params.media.types,
201
+ ...params.locationContext,
208
202
  OriginatingChannel: "line",
209
203
  OriginatingTo: originatingTo,
210
204
  });
211
205
  void recordSessionMetaFromInbound({
212
206
  storePath,
213
- sessionKey: ctxPayload.SessionKey ?? route.sessionKey,
207
+ sessionKey: ctxPayload.SessionKey ?? params.route.sessionKey,
214
208
  ctx: ctxPayload,
215
209
  }).catch((err) => {
216
210
  logVerbose(`line: failed updating session meta: ${String(err)}`);
217
211
  });
218
- if (!isGroup) {
212
+ if (!params.source.isGroup) {
219
213
  await updateLastRoute({
220
214
  storePath,
221
- sessionKey: route.mainSessionKey,
215
+ sessionKey: params.route.mainSessionKey,
222
216
  deliveryContext: {
223
217
  channel: "line",
224
- to: userId ?? peerId,
225
- accountId: route.accountId,
218
+ to: params.source.userId ?? params.source.peerId,
219
+ accountId: params.route.accountId,
226
220
  },
227
221
  ctx: ctxPayload,
228
222
  });
229
223
  }
230
224
  if (shouldLogVerbose()) {
231
225
  const preview = body.slice(0, 200).replace(/\n/g, "\\n");
232
- const mediaInfo = allMedia.length > 1 ? ` mediaCount=${allMedia.length}` : "";
233
- logVerbose(`line inbound: from=${ctxPayload.From} len=${body.length}${mediaInfo} preview="${preview}"`);
226
+ const mediaInfo = params.verboseLog.kind === "inbound" && (params.verboseLog.mediaCount ?? 0) > 1
227
+ ? ` mediaCount=${params.verboseLog.mediaCount}`
228
+ : "";
229
+ const label = params.verboseLog.kind === "inbound" ? "line inbound" : "line postback";
230
+ logVerbose(`${label}: from=${ctxPayload.From} len=${body.length}${mediaInfo} preview="${preview}"`);
234
231
  }
232
+ return { ctxPayload, replyToken: params.event.replyToken };
233
+ }
234
+ export async function buildLineMessageContext(params) {
235
+ const { event, allMedia, cfg, account } = params;
236
+ const source = event.source;
237
+ const { userId, groupId, roomId, isGroup, peerId, route } = resolveLineInboundRoute({
238
+ source,
239
+ cfg,
240
+ account,
241
+ });
242
+ const message = event.message;
243
+ const messageId = message.id;
244
+ const timestamp = event.timestamp;
245
+ // Build message body
246
+ const textContent = extractMessageText(message);
247
+ const placeholder = extractMediaPlaceholder(message);
248
+ let rawBody = textContent || placeholder;
249
+ if (!rawBody && allMedia.length > 0) {
250
+ rawBody = `<media:image>${allMedia.length > 1 ? ` (${allMedia.length} images)` : ""}`;
251
+ }
252
+ if (!rawBody && allMedia.length === 0) {
253
+ return null;
254
+ }
255
+ let locationContext;
256
+ if (message.type === "location") {
257
+ const loc = message;
258
+ locationContext = toLocationContext({
259
+ latitude: loc.latitude,
260
+ longitude: loc.longitude,
261
+ name: loc.title,
262
+ address: loc.address,
263
+ });
264
+ }
265
+ const { ctxPayload } = await finalizeLineInboundContext({
266
+ cfg,
267
+ account,
268
+ event,
269
+ route,
270
+ source: { userId, groupId, roomId, isGroup, peerId },
271
+ rawBody,
272
+ timestamp,
273
+ messageSid: messageId,
274
+ media: {
275
+ firstPath: allMedia[0]?.path,
276
+ firstContentType: allMedia[0]?.contentType,
277
+ paths: allMedia.length > 0 ? allMedia.map((m) => m.path) : undefined,
278
+ types: allMedia.length > 0
279
+ ? allMedia.map((m) => m.contentType).filter(Boolean)
280
+ : undefined,
281
+ },
282
+ locationContext,
283
+ verboseLog: { kind: "inbound", mediaCount: allMedia.length },
284
+ });
235
285
  return {
236
286
  ctxPayload,
237
287
  event,
@@ -246,27 +296,17 @@ export async function buildLineMessageContext(params) {
246
296
  }
247
297
  export async function buildLinePostbackContext(params) {
248
298
  const { event, cfg, account } = params;
249
- recordChannelActivity({
250
- channel: "line",
251
- accountId: account.accountId,
252
- direction: "inbound",
253
- });
254
299
  const source = event.source;
255
- const { userId, groupId, roomId, isGroup } = getSourceInfo(source);
256
- const peerId = buildPeerId(source);
257
- const route = resolveAgentRoute({
300
+ const { userId, groupId, roomId, isGroup, peerId, route } = resolveLineInboundRoute({
301
+ source,
258
302
  cfg,
259
- channel: "line",
260
- accountId: account.accountId,
261
- peer: {
262
- kind: isGroup ? "group" : "dm",
263
- id: peerId,
264
- },
303
+ account,
265
304
  });
266
305
  const timestamp = event.timestamp;
267
306
  const rawData = event.postback?.data?.trim() ?? "";
268
- if (!rawData)
307
+ if (!rawData) {
269
308
  return null;
309
+ }
270
310
  let rawBody = rawData;
271
311
  if (rawData.includes("line.action=")) {
272
312
  const params = new URLSearchParams(rawData);
@@ -274,92 +314,24 @@ export async function buildLinePostbackContext(params) {
274
314
  const device = params.get("line.device");
275
315
  rawBody = device ? `line action ${action} device ${device}` : `line action ${action}`;
276
316
  }
277
- const senderId = userId ?? "unknown";
278
- const senderLabel = userId ? `user:${userId}` : "unknown";
279
- const conversationLabel = isGroup
280
- ? groupId
281
- ? `group:${groupId}`
282
- : roomId
283
- ? `room:${roomId}`
284
- : "unknown-group"
285
- : senderLabel;
286
- const storePath = resolveStorePath(cfg.session?.store, {
287
- agentId: route.agentId,
288
- });
289
- const envelopeOptions = resolveEnvelopeFormatOptions(cfg);
290
- const previousTimestamp = readSessionUpdatedAt({
291
- storePath,
292
- sessionKey: route.sessionKey,
293
- });
294
- const body = formatInboundEnvelope({
295
- channel: "LINE",
296
- from: conversationLabel,
317
+ const messageSid = event.replyToken ? `postback:${event.replyToken}` : `postback:${timestamp}`;
318
+ const { ctxPayload } = await finalizeLineInboundContext({
319
+ cfg,
320
+ account,
321
+ event,
322
+ route,
323
+ source: { userId, groupId, roomId, isGroup, peerId },
324
+ rawBody,
297
325
  timestamp,
298
- body: rawBody,
299
- chatType: isGroup ? "group" : "direct",
300
- sender: {
301
- id: senderId,
326
+ messageSid,
327
+ media: {
328
+ firstPath: "",
329
+ firstContentType: undefined,
330
+ paths: undefined,
331
+ types: undefined,
302
332
  },
303
- previousTimestamp,
304
- envelope: envelopeOptions,
305
- });
306
- const fromAddress = isGroup
307
- ? groupId
308
- ? `line:group:${groupId}`
309
- : roomId
310
- ? `line:room:${roomId}`
311
- : `line:${peerId}`
312
- : `line:${userId ?? peerId}`;
313
- const toAddress = isGroup ? fromAddress : `line:${userId ?? peerId}`;
314
- const originatingTo = isGroup ? fromAddress : `line:${userId ?? peerId}`;
315
- const ctxPayload = finalizeInboundContext({
316
- Body: body,
317
- RawBody: rawBody,
318
- CommandBody: rawBody,
319
- From: fromAddress,
320
- To: toAddress,
321
- SessionKey: route.sessionKey,
322
- AccountId: route.accountId,
323
- ChatType: isGroup ? "group" : "direct",
324
- ConversationLabel: conversationLabel,
325
- GroupSubject: isGroup ? (groupId ?? roomId) : undefined,
326
- SenderId: senderId,
327
- Provider: "line",
328
- Surface: "line",
329
- MessageSid: event.replyToken ? `postback:${event.replyToken}` : `postback:${timestamp}`,
330
- Timestamp: timestamp,
331
- MediaPath: "",
332
- MediaType: undefined,
333
- MediaUrl: "",
334
- MediaPaths: undefined,
335
- MediaUrls: undefined,
336
- MediaTypes: undefined,
337
- OriginatingChannel: "line",
338
- OriginatingTo: originatingTo,
333
+ verboseLog: { kind: "postback" },
339
334
  });
340
- void recordSessionMetaFromInbound({
341
- storePath,
342
- sessionKey: ctxPayload.SessionKey ?? route.sessionKey,
343
- ctx: ctxPayload,
344
- }).catch((err) => {
345
- logVerbose(`line: failed updating session meta: ${String(err)}`);
346
- });
347
- if (!isGroup) {
348
- await updateLastRoute({
349
- storePath,
350
- sessionKey: route.mainSessionKey,
351
- deliveryContext: {
352
- channel: "line",
353
- to: userId ?? peerId,
354
- accountId: route.accountId,
355
- },
356
- ctx: ctxPayload,
357
- });
358
- }
359
- if (shouldLogVerbose()) {
360
- const preview = body.slice(0, 200).replace(/\n/g, "\\n");
361
- logVerbose(`line postback: from=${ctxPayload.From} len=${body.length} preview="${preview}"`);
362
- }
363
335
  return {
364
336
  ctxPayload,
365
337
  event,
@@ -1,31 +1,35 @@
1
+ import { inspect } from "node:util";
1
2
  import { Chalk } from "chalk";
2
3
  import { CHAT_CHANNEL_ORDER } from "../channels/registry.js";
4
+ import { isVerbose } from "../globals.js";
3
5
  import { defaultRuntime } from "../runtime.js";
6
+ import { clearActiveProgressLine } from "../terminal/progress-line.js";
4
7
  import { getConsoleSettings, shouldLogSubsystemToConsole } from "./console.js";
5
- import { isVerbose } from "../globals.js";
6
8
  import { levelToMinLevel } from "./levels.js";
7
- import { getChildLogger } from "./logger.js";
9
+ import { getChildLogger, isFileLogLevelEnabled } from "./logger.js";
8
10
  import { loggingState } from "./state.js";
9
- import { clearActiveProgressLine } from "../terminal/progress-line.js";
10
11
  function shouldLogToConsole(level, settings) {
11
- if (settings.level === "silent")
12
+ if (settings.level === "silent") {
12
13
  return false;
14
+ }
13
15
  const current = levelToMinLevel(level);
14
16
  const min = levelToMinLevel(settings.level);
15
17
  return current <= min;
16
18
  }
17
19
  function isRichConsoleEnv() {
18
20
  const term = (process.env.TERM ?? "").toLowerCase();
19
- if (process.env.COLORTERM || process.env.TERM_PROGRAM)
21
+ if (process.env.COLORTERM || process.env.TERM_PROGRAM) {
20
22
  return true;
23
+ }
21
24
  return term.length > 0 && term !== "dumb";
22
25
  }
23
26
  function getColorForConsole() {
24
27
  const hasForceColor = typeof process.env.FORCE_COLOR === "string" &&
25
28
  process.env.FORCE_COLOR.trim().length > 0 &&
26
29
  process.env.FORCE_COLOR.trim() !== "0";
27
- if (process.env.NO_COLOR && !hasForceColor)
30
+ if (process.env.NO_COLOR && !hasForceColor) {
28
31
  return new Chalk({ level: 0 });
32
+ }
29
33
  const hasTty = Boolean(process.stdout.isTTY || process.stderr.isTTY);
30
34
  return hasTty || isRichConsoleEnv() ? new Chalk({ level: 1 }) : new Chalk({ level: 0 });
31
35
  }
@@ -38,8 +42,9 @@ const SUBSYSTEM_MAX_SEGMENTS = 2;
38
42
  const CHANNEL_SUBSYSTEM_PREFIXES = new Set(CHAT_CHANNEL_ORDER);
39
43
  function pickSubsystemColor(color, subsystem) {
40
44
  const override = SUBSYSTEM_COLOR_OVERRIDES[subsystem];
41
- if (override)
45
+ if (override) {
42
46
  return color[override];
47
+ }
43
48
  let hash = 0;
44
49
  for (let i = 0; i < subsystem.length; i += 1) {
45
50
  hash = (hash * 31 + subsystem.charCodeAt(i)) | 0;
@@ -55,8 +60,9 @@ function formatSubsystemForConsole(subsystem) {
55
60
  SUBSYSTEM_PREFIXES_TO_DROP.includes(parts[0])) {
56
61
  parts.shift();
57
62
  }
58
- if (parts.length === 0)
63
+ if (parts.length === 0) {
59
64
  return original;
65
+ }
60
66
  if (CHANNEL_SUBSYSTEM_PREFIXES.has(parts[0])) {
61
67
  return parts[0];
62
68
  }
@@ -66,8 +72,9 @@ function formatSubsystemForConsole(subsystem) {
66
72
  return parts.join("/");
67
73
  }
68
74
  export function stripRedundantSubsystemPrefixForConsole(message, displaySubsystem) {
69
- if (!displaySubsystem)
75
+ if (!displaySubsystem) {
70
76
  return message;
77
+ }
71
78
  // Common duplication: "[discord] discord: ..." (when a message manually includes the subsystem tag).
72
79
  if (message.startsWith("[")) {
73
80
  const closeIdx = message.indexOf("]");
@@ -75,25 +82,31 @@ export function stripRedundantSubsystemPrefixForConsole(message, displaySubsyste
75
82
  const bracketTag = message.slice(1, closeIdx);
76
83
  if (bracketTag.toLowerCase() === displaySubsystem.toLowerCase()) {
77
84
  let i = closeIdx + 1;
78
- while (message[i] === " ")
85
+ while (message[i] === " ") {
79
86
  i += 1;
87
+ }
80
88
  return message.slice(i);
81
89
  }
82
90
  }
83
91
  }
84
92
  const prefix = message.slice(0, displaySubsystem.length);
85
- if (prefix.toLowerCase() !== displaySubsystem.toLowerCase())
93
+ if (prefix.toLowerCase() !== displaySubsystem.toLowerCase()) {
86
94
  return message;
95
+ }
87
96
  const next = message.slice(displaySubsystem.length, displaySubsystem.length + 1);
88
- if (next !== ":" && next !== " ")
97
+ if (next !== ":" && next !== " ") {
89
98
  return message;
99
+ }
90
100
  let i = displaySubsystem.length;
91
- while (message[i] === " ")
101
+ while (message[i] === " ") {
92
102
  i += 1;
93
- if (message[i] === ":")
103
+ }
104
+ if (message[i] === ":") {
94
105
  i += 1;
95
- while (message[i] === " ")
106
+ }
107
+ while (message[i] === " ") {
96
108
  i += 1;
109
+ }
97
110
  return message.slice(i);
98
111
  }
99
112
  function formatConsoleLine(opts) {
@@ -148,12 +161,14 @@ function writeConsoleLine(level, line) {
148
161
  }
149
162
  }
150
163
  function logToFile(fileLogger, level, message, meta) {
151
- if (level === "silent")
164
+ if (level === "silent") {
152
165
  return;
166
+ }
153
167
  const safeLevel = level;
154
168
  const method = fileLogger[safeLevel];
155
- if (typeof method !== "function")
169
+ if (typeof method !== "function") {
156
170
  return;
171
+ }
157
172
  if (meta && Object.keys(meta).length > 0) {
158
173
  method.call(fileLogger, meta, message);
159
174
  }
@@ -164,8 +179,9 @@ function logToFile(fileLogger, level, message, meta) {
164
179
  export function createSubsystemLogger(subsystem) {
165
180
  let fileLogger = null;
166
181
  const getFileLogger = () => {
167
- if (!fileLogger)
182
+ if (!fileLogger) {
168
183
  fileLogger = getChildLogger({ subsystem });
184
+ }
169
185
  return fileLogger;
170
186
  };
171
187
  const emit = (level, message, meta) => {
@@ -180,10 +196,12 @@ export function createSubsystemLogger(subsystem) {
180
196
  fileMeta = Object.keys(rest).length > 0 ? rest : undefined;
181
197
  }
182
198
  logToFile(getFileLogger(), level, message, fileMeta);
183
- if (!shouldLogToConsole(level, { level: consoleSettings.level }))
199
+ if (!shouldLogToConsole(level, { level: consoleSettings.level })) {
184
200
  return;
185
- if (!shouldLogSubsystemToConsole(subsystem))
201
+ }
202
+ if (!shouldLogSubsystemToConsole(subsystem)) {
186
203
  return;
204
+ }
187
205
  const consoleMessage = consoleMessageOverride ?? message;
188
206
  if (!isVerbose() &&
189
207
  subsystem === "agent/embedded" &&
@@ -199,8 +217,23 @@ export function createSubsystemLogger(subsystem) {
199
217
  });
200
218
  writeConsoleLine(level, line);
201
219
  };
220
+ const isConsoleEnabled = (level) => {
221
+ const consoleSettings = getConsoleSettings();
222
+ return (shouldLogToConsole(level, { level: consoleSettings.level }) &&
223
+ shouldLogSubsystemToConsole(subsystem));
224
+ };
225
+ const isFileEnabled = (level) => isFileLogLevelEnabled(level);
202
226
  const logger = {
203
227
  subsystem,
228
+ isEnabled: (level, target = "any") => {
229
+ if (target === "console") {
230
+ return isConsoleEnabled(level);
231
+ }
232
+ if (target === "file") {
233
+ return isFileEnabled(level);
234
+ }
235
+ return isConsoleEnabled(level) || isFileEnabled(level);
236
+ },
204
237
  trace: (message, meta) => emit("trace", message, meta),
205
238
  debug: (message, meta) => emit("debug", message, meta),
206
239
  info: (message, meta) => emit("info", message, meta),
@@ -223,9 +256,13 @@ export function createSubsystemLogger(subsystem) {
223
256
  return logger;
224
257
  }
225
258
  export function runtimeForLogger(logger, exit = defaultRuntime.exit) {
259
+ const formatArgs = (...args) => args
260
+ .map((arg) => (typeof arg === "string" ? arg : inspect(arg)))
261
+ .join(" ")
262
+ .trim();
226
263
  return {
227
- log: (message) => logger.info(message),
228
- error: (message) => logger.error(message),
264
+ log: (...args) => logger.info(formatArgs(...args)),
265
+ error: (...args) => logger.error(formatArgs(...args)),
229
266
  exit,
230
267
  };
231
268
  }