@xopcai/xopc 0.0.93 → 0.0.95

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 (356) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/plugin.js +1 -1
  5. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  6. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/extensions/weixin/src/api/api.js +2 -2
  9. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  10. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  11. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  12. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  13. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  14. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  17. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  18. package/dist/gateway/static/root/assets/agents-CKe2LMnz.js +222 -0
  19. package/dist/gateway/static/root/assets/apps-page-Mi9mMIZ1.js +1 -0
  20. package/dist/gateway/static/root/assets/channels-settings-BrdyC101.js +1 -0
  21. package/dist/gateway/static/root/assets/{channels-status-swr-CsGkK9h9.js → channels-status-swr-D55Bu0nn.js} +1 -1
  22. package/dist/gateway/static/root/assets/{cron-api-CyAm0xJT.js → cron-api-CPpx2l-E.js} +1 -1
  23. package/dist/gateway/static/root/assets/cron-page-Bx2jB0YN.js +1 -0
  24. package/dist/gateway/static/root/assets/{dist-DHwVV8XK.js → dist-D_AiG_Kg.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-debug-page-BK8kcc4F.js → extension-debug-page-6ieHsxRE.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-Cf8X_QUc.js → extension-page-B8nywHRO.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-C5-YLMmy.js → extension-settings-page-DrskdEIV.js} +1 -1
  28. package/dist/gateway/static/root/assets/{fetch-BAPnkYbC.js → fetch-B0aeeY0q.js} +1 -1
  29. package/dist/gateway/static/root/assets/{field-primitives-8p7ucXa1.js → field-primitives--9ooY8Xl.js} +1 -1
  30. package/dist/gateway/static/root/assets/{heartbeat-config-api-CpgW2sGp.js → heartbeat-config-api-DUZ_W1w-.js} +1 -1
  31. package/dist/gateway/static/root/assets/index-Bj_l8QDp.css +1 -0
  32. package/dist/gateway/static/root/assets/{index-Do52EfZK.js → index-Dj9FuxCm.js} +99 -98
  33. package/dist/gateway/static/root/assets/logs-page-CaXqhpKf.js +2 -0
  34. package/dist/gateway/static/root/assets/{note-detail-page-WLM6FUIi.js → note-detail-page-DYzym2B0.js} +3 -3
  35. package/dist/gateway/static/root/assets/{note-time-EFyIVhec.js → note-time-B-vSi2dR.js} +1 -1
  36. package/dist/gateway/static/root/assets/notes-page-BkhWdGiT.js +1 -0
  37. package/dist/gateway/static/root/assets/sessions-page-53YFokoe.js +1 -0
  38. package/dist/gateway/static/root/assets/{settings-advanced-gate-CEs8pGh6.js → settings-advanced-gate-BaZmaklx.js} +2 -2
  39. package/dist/gateway/static/root/assets/{settings-form-section-C6cGTVwK.js → settings-form-section-DIJPKpTR.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-Dvb230FF.js +3 -0
  41. package/dist/gateway/static/root/assets/share-preview-page-CRyjTAG6.js +2 -0
  42. package/dist/gateway/static/root/assets/skills-page-C5ZJbfAe.js +2 -0
  43. package/dist/gateway/static/root/assets/{theme-store-D6EsNTPr.js → theme-store-Cg_SuBw0.js} +1 -1
  44. package/dist/gateway/static/root/assets/{url-CTjpm0Uz.js → url-BHHmdJYc.js} +2 -2
  45. package/dist/gateway/static/root/assets/{utils-C86AVfY-.js → utils-lMYoWhqo.js} +1 -1
  46. package/dist/gateway/static/root/assets/voice-api-key-field-Dda2pcUU.js +1 -0
  47. package/dist/gateway/static/root/assets/{workflow-page.utils-DsEriMFW.js → workflow-page.utils-KIladUrU.js} +1 -1
  48. package/dist/gateway/static/root/assets/workflows-page-BTis4Z7Y.js +27 -0
  49. package/dist/gateway/static/root/index.html +5 -5
  50. package/dist/package.js +1 -1
  51. package/dist/src/agent/agent-manager.js +7 -7
  52. package/dist/src/agent/agent-scope.js +1 -1
  53. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  54. package/dist/src/agent/context/workspace-seed.js +2 -2
  55. package/dist/src/agent/goals/goal-run-store.js +4 -4
  56. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  57. package/dist/src/agent/goals/post-turn.js +2 -2
  58. package/dist/src/agent/image/load-image-media.js +2 -2
  59. package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -0
  60. package/dist/src/agent/inbound/turn-dispatcher.js +3 -0
  61. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  62. package/dist/src/agent/ipc/bus.js +1 -1
  63. package/dist/src/agent/ipc/inbox.js +2 -2
  64. package/dist/src/agent/ipc/socket.js +1 -1
  65. package/dist/src/agent/lifecycle/handlers/compaction.js +1 -1
  66. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  67. package/dist/src/agent/mcp/bundle-mcp-materialize.js +2 -2
  68. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  69. package/dist/src/agent/mcp/bundle-mcp-runtime.js +18 -5
  70. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  71. package/dist/src/agent/mcp/mcp-transport-config.js +11 -4
  72. package/dist/src/agent/mcp/mcp-transport-config.js.map +1 -1
  73. package/dist/src/agent/mcp/mcp-transport.js +2 -2
  74. package/dist/src/agent/mcp/mcp-transport.js.map +1 -1
  75. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  76. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  77. package/dist/src/agent/memory/dreaming/events.js +1 -1
  78. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  79. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  80. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  81. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  82. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  83. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  84. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  85. package/dist/src/agent/models/manager.js +1 -1
  86. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  87. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  88. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  89. package/dist/src/agent/sandbox/path-policy.js +2 -2
  90. package/dist/src/agent/service/build-direct-message-content.js +1 -1
  91. package/dist/src/agent/service/process-direct-streaming.d.ts +1 -0
  92. package/dist/src/agent/service/process-direct-streaming.js +15 -12
  93. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  94. package/dist/src/agent/service.d.ts +4 -2
  95. package/dist/src/agent/service.js +24 -8
  96. package/dist/src/agent/service.js.map +1 -1
  97. package/dist/src/agent/service.types.d.ts +3 -1
  98. package/dist/src/agent/session/session-inspector.js +1 -1
  99. package/dist/src/agent/skills/config.js +1 -1
  100. package/dist/src/agent/skills/hub-hash.js +2 -2
  101. package/dist/src/agent/skills/hub-lock.js +1 -1
  102. package/dist/src/agent/skills/hub-pull.js +2 -2
  103. package/dist/src/agent/skills/index.js +1 -1
  104. package/dist/src/agent/skills/managed-store.js +1 -1
  105. package/dist/src/agent/skills/scanner.js +1 -1
  106. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  107. package/dist/src/agent/skills/skill-manager.js +1 -1
  108. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  109. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  110. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  111. package/dist/src/agent/tools/factory.js +1 -1
  112. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  113. package/dist/src/agent/tools/search/registry.js +1 -1
  114. package/dist/src/agent/tools/search/registry.js.map +1 -1
  115. package/dist/src/agent/tools/send-media.js +1 -1
  116. package/dist/src/agent/tools/session-search-tool.js +1 -1
  117. package/dist/src/agent/tools/session-search-tool.js.map +1 -1
  118. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  119. package/dist/src/agent/tools/workflow-tool.js +2 -2
  120. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  121. package/dist/src/agent/tools/write.js +1 -1
  122. package/dist/src/agent/workflow/catalog.js +1 -1
  123. package/dist/src/agent/workflow/progress-broker.js +1 -1
  124. package/dist/src/agent/workflow/progress-broker.js.map +1 -1
  125. package/dist/src/agent/workflow/subagent-runner.js +1 -1
  126. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  127. package/dist/src/auth/credentials.js +3 -3
  128. package/dist/src/auth/profiles/store.js +1 -1
  129. package/dist/src/auth/sync-provider-auth.js +1 -1
  130. package/dist/src/browser/cache-dir-policy.js +1 -1
  131. package/dist/src/browser/cdp-local-launcher.js +2 -2
  132. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  133. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  134. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  135. package/dist/src/browser/stealth.js +1 -1
  136. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  137. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  138. package/dist/src/channels/outbound/persist-store.js +1 -1
  139. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  140. package/dist/src/channels/pairing/pairing-store.js +2 -2
  141. package/dist/src/channels/pipeline.js +3 -2
  142. package/dist/src/channels/pipeline.js.map +1 -1
  143. package/dist/src/chat-commands/agent-edit.js +2 -2
  144. package/dist/src/chat-commands/builtins/config.js +2 -2
  145. package/dist/src/chat-commands/context.js +1 -1
  146. package/dist/src/cli/cli-log-level-preset.d.ts +1 -1
  147. package/dist/src/cli/cli-log-level-preset.js +2 -2
  148. package/dist/src/cli/cli-log-level-preset.js.map +1 -1
  149. package/dist/src/cli/commands/config.js +1 -1
  150. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  151. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  152. package/dist/src/cli/commands/doctor/checks/session-integrity.js +2 -2
  153. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  154. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  155. package/dist/src/cli/commands/extension-dev.js +1 -1
  156. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  157. package/dist/src/cli/commands/extension-pack.js +1 -1
  158. package/dist/src/cli/commands/gateway/logs.js +1 -1
  159. package/dist/src/cli/commands/image.js +1 -1
  160. package/dist/src/cli/commands/init.js +4 -4
  161. package/dist/src/cli/commands/logs.js +3 -3
  162. package/dist/src/cli/commands/logs.js.map +1 -1
  163. package/dist/src/cli/commands/onboard.js +1 -1
  164. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  165. package/dist/src/commands/agents.config.js +1 -1
  166. package/dist/src/config/agent-profile.js +1 -1
  167. package/dist/src/config/gateway-bind.js +1 -1
  168. package/dist/src/config/index.js +5 -5
  169. package/dist/src/config/loader.js +2 -2
  170. package/dist/src/config/models-json.js +2 -2
  171. package/dist/src/config/paths-state.js +1 -1
  172. package/dist/src/config/profile.js +2 -2
  173. package/dist/src/config/workspace-path.js +1 -1
  174. package/dist/src/cron/executor.js +9 -6
  175. package/dist/src/cron/executor.js.map +1 -1
  176. package/dist/src/cron/persistence.js +1 -1
  177. package/dist/src/cron/run-log-store.js +1 -1
  178. package/dist/src/daemon/constants.js +1 -1
  179. package/dist/src/daemon/install-plan.js +2 -2
  180. package/dist/src/daemon/launchd.js +2 -2
  181. package/dist/src/daemon/schtasks.js +2 -2
  182. package/dist/src/daemon/systemd.js +2 -2
  183. package/dist/src/extensions/bundle-mcp.js +1 -1
  184. package/dist/src/extensions/discover-extensions.js +1 -1
  185. package/dist/src/extensions/health.js +1 -1
  186. package/dist/src/extensions/loader.js +1 -1
  187. package/dist/src/extensions/lockfile.js +2 -2
  188. package/dist/src/extensions/update.js +1 -1
  189. package/dist/src/gateway/agents-admin.js +3 -3
  190. package/dist/src/gateway/file-path-classifier.js +2 -2
  191. package/dist/src/gateway/hono/app.js +4 -1
  192. package/dist/src/gateway/hono/app.js.map +1 -1
  193. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  194. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  195. package/dist/src/gateway/hono/lib/route-logger.d.ts +6 -0
  196. package/dist/src/gateway/hono/lib/route-logger.js +31 -0
  197. package/dist/src/gateway/hono/lib/route-logger.js.map +1 -0
  198. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  199. package/dist/src/gateway/hono/middleware/auth.js +16 -3
  200. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  201. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  202. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  203. package/dist/src/gateway/hono/middleware/route-errors.d.ts +5 -0
  204. package/dist/src/gateway/hono/middleware/route-errors.js +27 -0
  205. package/dist/src/gateway/hono/middleware/route-errors.js.map +1 -0
  206. package/dist/src/gateway/hono/oauth.js +1 -1
  207. package/dist/src/gateway/hono/routes/agent-stream.js +6 -0
  208. package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
  209. package/dist/src/gateway/hono/routes/agents.js +1 -1
  210. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  211. package/dist/src/gateway/hono/routes/browser-install.js +2 -4
  212. package/dist/src/gateway/hono/routes/browser-install.js.map +1 -1
  213. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  214. package/dist/src/gateway/hono/routes/config.js +25 -11
  215. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  216. package/dist/src/gateway/hono/routes/cron.js +5 -0
  217. package/dist/src/gateway/hono/routes/cron.js.map +1 -1
  218. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  219. package/dist/src/gateway/hono/routes/host-fs.js +4 -6
  220. package/dist/src/gateway/hono/routes/host-fs.js.map +1 -1
  221. package/dist/src/gateway/hono/routes/lazy-bundles.js +14 -1
  222. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  223. package/dist/src/gateway/hono/routes/lazy-fallback.js +3 -0
  224. package/dist/src/gateway/hono/routes/lazy-fallback.js.map +1 -1
  225. package/dist/src/gateway/hono/routes/logs.js +39 -7
  226. package/dist/src/gateway/hono/routes/logs.js.map +1 -1
  227. package/dist/src/gateway/hono/routes/mcp.d.ts +3 -0
  228. package/dist/src/gateway/hono/routes/mcp.js +107 -0
  229. package/dist/src/gateway/hono/routes/mcp.js.map +1 -0
  230. package/dist/src/gateway/hono/routes/models.js +1 -1
  231. package/dist/src/gateway/hono/routes/sessions.js +6 -0
  232. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  233. package/dist/src/gateway/hono/routes/shares.js +1 -1
  234. package/dist/src/gateway/hono/routes/update.js +2 -4
  235. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  236. package/dist/src/gateway/hono/routes/voice.js +2 -4
  237. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/workspace.js +4 -6
  239. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  240. package/dist/src/gateway/hono/sse.js +9 -2
  241. package/dist/src/gateway/hono/sse.js.map +1 -1
  242. package/dist/src/gateway/lock.js +3 -3
  243. package/dist/src/gateway/ports.js +1 -1
  244. package/dist/src/gateway/service/agent-runner.js +3 -3
  245. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  246. package/dist/src/gateway/service/config-coordinator.js +14 -6
  247. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  248. package/dist/src/gateway/service/marketplace-service.js +3 -3
  249. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  250. package/dist/src/gateway/service/run-gateway-agent.js +22 -5
  251. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  252. package/dist/src/gateway/service/sse-hub.js +1 -1
  253. package/dist/src/gateway/service/sse-hub.js.map +1 -1
  254. package/dist/src/gateway/service.js +13 -6
  255. package/dist/src/gateway/service.js.map +1 -1
  256. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  257. package/dist/src/infra/brew.js +1 -1
  258. package/dist/src/infra/package-json.js +1 -1
  259. package/dist/src/infra/package-update-steps.js +1 -1
  260. package/dist/src/infra/path-env.js +2 -2
  261. package/dist/src/infra/restart.js +2 -2
  262. package/dist/src/infra/stable-node-path.js +1 -1
  263. package/dist/src/infra/update-check.js +1 -1
  264. package/dist/src/infra/update-global.js +1 -1
  265. package/dist/src/infra/update-lock.js +3 -3
  266. package/dist/src/infra/update-runner.js +1 -1
  267. package/dist/src/infra/update-startup.js +2 -2
  268. package/dist/src/infra/write-file-atomic.js +2 -2
  269. package/dist/src/mcp/channel-bridge.js +26 -2
  270. package/dist/src/mcp/channel-bridge.js.map +1 -1
  271. package/dist/src/mcp/gateway-http-client.js +24 -2
  272. package/dist/src/mcp/gateway-http-client.js.map +1 -1
  273. package/dist/src/notes/store.js +2 -2
  274. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  275. package/dist/src/providers/index.js +2 -2
  276. package/dist/src/providers/model-registry.js +1 -1
  277. package/dist/src/session/config-store.js +12 -6
  278. package/dist/src/session/config-store.js.map +1 -1
  279. package/dist/src/session/index.d.ts +1 -1
  280. package/dist/src/session/index.js +2 -2
  281. package/dist/src/session/init-session-turn.js +2 -2
  282. package/dist/src/session/manager.js +8 -1
  283. package/dist/src/session/manager.js.map +1 -1
  284. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  285. package/dist/src/session/parity/sessions-json-file.js +1 -1
  286. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  287. package/dist/src/session/parity/transcript-paths.js +1 -1
  288. package/dist/src/session/resolve-session.js +4 -4
  289. package/dist/src/session/search-index-cache.js +1 -1
  290. package/dist/src/session/search-index.js +1 -1
  291. package/dist/src/session/session-title.d.ts +19 -3
  292. package/dist/src/session/session-title.js +84 -9
  293. package/dist/src/session/session-title.js.map +1 -1
  294. package/dist/src/session/store.js +6 -6
  295. package/dist/src/share/share-auto.js +2 -2
  296. package/dist/src/share/share-store.js +3 -3
  297. package/dist/src/share/share-thumbnail.js +2 -2
  298. package/dist/src/share/share-zip.js +1 -1
  299. package/dist/src/share/site-share-store.js +3 -3
  300. package/dist/src/share/site-static-serve.js +1 -1
  301. package/dist/src/tui/clipboard-image.js +3 -3
  302. package/dist/src/tui/theme-manager.js +1 -1
  303. package/dist/src/tui/tui-keybindings-file.js +1 -1
  304. package/dist/src/tui/tui-scoped-models.js +2 -2
  305. package/dist/src/tui/tui-settings.js +1 -1
  306. package/dist/src/tui/tui.js +3 -3
  307. package/dist/src/tunnel/frpc-binary.js +3 -3
  308. package/dist/src/tunnel/frpc-config.js +1 -1
  309. package/dist/src/tunnel/frpc-extract.js +1 -1
  310. package/dist/src/tunnel/tunnel-state.js +1 -1
  311. package/dist/src/utils/index.js +4 -4
  312. package/dist/src/utils/logger/audit.js +1 -1
  313. package/dist/src/utils/logger/config.js +2 -6
  314. package/dist/src/utils/logger/config.js.map +1 -1
  315. package/dist/src/utils/logger/context.d.ts +3 -22
  316. package/dist/src/utils/logger/context.js +4 -32
  317. package/dist/src/utils/logger/context.js.map +1 -1
  318. package/dist/src/utils/logger/index.d.ts +4 -7
  319. package/dist/src/utils/logger/index.js +9 -28
  320. package/dist/src/utils/logger/index.js.map +1 -1
  321. package/dist/src/utils/logger/log-store.d.ts +14 -32
  322. package/dist/src/utils/logger/log-store.js +68 -119
  323. package/dist/src/utils/logger/log-store.js.map +1 -1
  324. package/dist/src/utils/logger/log-stream.d.ts +5 -70
  325. package/dist/src/utils/logger/log-stream.js +67 -178
  326. package/dist/src/utils/logger/log-stream.js.map +1 -1
  327. package/dist/src/utils/logger/pino-record.d.ts +8 -0
  328. package/dist/src/utils/logger/pino-record.js +83 -0
  329. package/dist/src/utils/logger/pino-record.js.map +1 -0
  330. package/dist/src/utils/logger/rotation.js +1 -1
  331. package/dist/src/utils/logger/stats.d.ts +1 -1
  332. package/dist/src/utils/logger/stats.js +2 -2
  333. package/dist/src/utils/logger/stats.js.map +1 -1
  334. package/dist/src/utils/logger/streams.js +18 -0
  335. package/dist/src/utils/logger/streams.js.map +1 -1
  336. package/dist/src/utils/logger/types.d.ts +0 -9
  337. package/dist/src/utils/logger/types.js.map +1 -1
  338. package/dist/src/utils/logger.js +4 -4
  339. package/dist/src/voice/tts/audio.js +1 -1
  340. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  341. package/dist/src/workflows/store/event-store.js +1 -1
  342. package/dist/src/workflows/store/run-store.js +1 -1
  343. package/package.json +3 -2
  344. package/dist/gateway/static/root/assets/agents-C7tTJLP9.js +0 -222
  345. package/dist/gateway/static/root/assets/apps-page-BbzdMyrg.js +0 -1
  346. package/dist/gateway/static/root/assets/channels-settings-B49vG2hE.js +0 -1
  347. package/dist/gateway/static/root/assets/cron-page-Bjx7IOdR.js +0 -1
  348. package/dist/gateway/static/root/assets/index-CwDdudZM.css +0 -1
  349. package/dist/gateway/static/root/assets/logs-page-BxukQ-J-.js +0 -1
  350. package/dist/gateway/static/root/assets/notes-page-BYPVYcYn.js +0 -1
  351. package/dist/gateway/static/root/assets/sessions-page-BFD2_-Cl.js +0 -1
  352. package/dist/gateway/static/root/assets/settings-page-BiP5iH46.js +0 -2
  353. package/dist/gateway/static/root/assets/share-preview-page-tnIfJ4K6.js +0 -2
  354. package/dist/gateway/static/root/assets/skills-page-CNDctFIn.js +0 -2
  355. package/dist/gateway/static/root/assets/voice-api-key-field-CalxUkxm.js +0 -1
  356. package/dist/gateway/static/root/assets/workflows-page-D2fRxXJG.js +0 -27
@@ -1,13 +1,13 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
2
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
+ import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
3
3
  import { createLogger } from "../../utils/logger/index.js";
4
4
  import { init_logger } from "../../utils/logger.js";
5
5
  import { init_paths, resolveBinDir } from "../../config/paths.js";
6
- import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
7
7
  import { resolvePackageRoot } from "../../infra/update-check.js";
8
+ import { dirname, join } from "node:path";
8
9
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
9
10
  import { readFile, readdir, rm } from "node:fs/promises";
10
- import { dirname, join } from "node:path";
11
11
  import { spawn } from "node:child_process";
12
12
  import { fileURLToPath } from "node:url";
13
13
  //#region src/browser/providers/browser-ext-install.ts
@@ -1,15 +1,15 @@
1
+ import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
4
  import { init_paths, resolveBinDir } from "../../config/paths.js";
4
- import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
5
5
  import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
6
6
  import { WEBDRIVER_OVERRIDE_SCRIPT, buildStealthArgs, filterCloakBrowserExtraArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "../stealth.js";
7
7
  import { pickFreePort } from "../free-port.js";
8
- import { createHash } from "node:crypto";
8
+ import { arch, platform, tmpdir } from "node:os";
9
+ import { join, resolve } from "node:path";
9
10
  import { createReadStream, createWriteStream } from "node:fs";
11
+ import { createHash } from "node:crypto";
10
12
  import { mkdir, mkdtemp, rm, stat } from "node:fs/promises";
11
- import { join, resolve } from "node:path";
12
- import { arch, platform, tmpdir } from "node:os";
13
13
  import { spawn } from "node:child_process";
14
14
  import { Readable, Transform } from "node:stream";
15
15
  import AdmZip from "adm-zip";
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from "node:module";
2
+ import { dirname, join } from "node:path";
2
3
  import { existsSync } from "node:fs";
3
4
  import { stat } from "node:fs/promises";
4
- import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region src/browser/providers/playwright-doctor.ts
7
7
  /** Root directory of the `playwright-core` package (Electron extraResources or node_modules). */
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { chmod, stat } from "node:fs/promises";
4
3
  import { platform } from "node:os";
4
+ import { chmod, stat } from "node:fs/promises";
5
5
  import { exec } from "node:child_process";
6
6
  import { promisify } from "node:util";
7
7
  //#region src/browser/stealth.ts
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { mkdir, writeFile } from "fs/promises";
4
3
  import { join, resolve } from "path";
4
+ import { mkdir, writeFile } from "fs/promises";
5
5
  import { randomBytes } from "crypto";
6
6
  //#region src/channels/attachments/inbound-persist.ts
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { mkdir, writeFile } from "fs/promises";
4
3
  import { join, resolve } from "path";
4
+ import { mkdir, writeFile } from "fs/promises";
5
5
  import { randomBytes } from "crypto";
6
6
  //#region src/channels/attachments/outbound-tts-persist.ts
7
7
  /**
@@ -1,7 +1,7 @@
1
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
- import { randomUUID } from "node:crypto";
3
2
  import { join } from "path";
4
3
  import { existsSync, mkdirSync, readFileSync } from "fs";
4
+ import { randomUUID } from "node:crypto";
5
5
  //#region src/channels/outbound/persist-store.ts
6
6
  /**
7
7
  * Durable outbound queue (crash recovery): JSON file under agent internal dir.
@@ -1,5 +1,5 @@
1
- import fs from "node:fs";
2
1
  import path from "node:path";
2
+ import fs from "node:fs";
3
3
  //#region src/channels/pairing/allow-from-file.ts
4
4
  function readAllowFromFile(filePath) {
5
5
  try {
@@ -1,8 +1,8 @@
1
1
  import { appendAllowFromIdSync } from "./allow-from-file.js";
2
2
  import "./pairing-constants.js";
3
- import crypto from "node:crypto";
4
- import fs from "node:fs";
5
3
  import path from "node:path";
4
+ import fs from "node:fs";
5
+ import crypto from "node:crypto";
6
6
  //#region src/channels/pairing/pairing-store.ts
7
7
  const PAIRING_CODE_LENGTH = 8;
8
8
  const PAIRING_CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789";
@@ -61,8 +61,9 @@ var MessagePipeline = class {
61
61
  } catch (err) {
62
62
  log.error({
63
63
  channel,
64
- err
65
- }, "Process handler error");
64
+ err,
65
+ phase: "channel.inbound"
66
+ }, `Process handler error: ${err instanceof Error ? err.message : String(err)}`);
66
67
  this.onError?.(err, processedCtx);
67
68
  return;
68
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.js","names":[],"sources":["../../../src/channels/pipeline.ts"],"sourcesContent":["/**\n * Message Processing Pipeline\n * \n * Three-stage pipeline:\n * - Preflight: Filter empty messages, self-messages, detect commands\n * - Process: Transform format, extract metadata\n * - Delivery: Send to Agent\n */\n\nimport { randomUUID } from 'node:crypto';\n\nimport { createLogger, runWithLogContext, updateAsyncLogContext } from '../utils/logger.js';\nimport type { AgentResponse } from './plugin-types.js';\nimport { formatEnvelopeTimestamp } from './envelope-timestamp.js';\n\n// Re-export for convenience\nexport type { AgentResponse } from './plugin-types.js';\n\nconst log = createLogger('Pipeline');\n\nfunction pipelineLogRequestId(ctx: PipelineMessageContext): string {\n const raw = ctx.metadata?.requestId;\n if (typeof raw === 'string' && raw.trim().length > 0) {\n return raw.trim();\n }\n return randomUUID();\n}\n\nfunction pipelineLogSessionId(ctx: PipelineMessageContext): string {\n const sk = ctx.metadata?.sessionKey;\n if (typeof sk === 'string' && sk.trim().length > 0) {\n return sk.trim();\n }\n return `${ctx.channel}:${ctx.chatId}`;\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface PipelineMessageContext {\n /** Channel identifier */\n channel: string;\n /** Account ID */\n accountId: string;\n /** Chat ID */\n chatId: string;\n /** Sender ID */\n senderId: string;\n /** Message content */\n content: string;\n /** Original message metadata */\n metadata: Record<string, unknown>;\n /** Is group chat */\n isGroup: boolean;\n /** Is direct message */\n isDm: boolean;\n /** Thread ID (optional) */\n threadId?: string;\n /** Message ID (optional) */\n messageId?: string;\n}\n\nexport interface PipelineMediaRef {\n type: 'photo' | 'video' | 'audio' | 'document' | 'voice';\n fileId: string;\n mimeType?: string;\n fileName?: string;\n url?: string;\n}\n\n// ============================================\n// Handler Interfaces\n// ============================================\n\nexport interface PreflightHandler {\n /** Handler name */\n name: string;\n /** Preflight - return null to skip message */\n preflight?(ctx: PipelineMessageContext): Promise<PipelineMessageContext | null>;\n}\n\nexport interface ProcessHandler {\n /** Handler name */\n name: string;\n /** Process message - transform and extract */\n process(ctx: PipelineMessageContext): Promise<PipelineMessageContext>;\n}\n\nexport interface DeliveryHandler {\n /** Handler name */\n name: string;\n /** Deliver message to Agent */\n deliver(ctx: PipelineMessageContext, response: AgentResponse): Promise<void>;\n}\n\n// ============================================\n// Pipeline Options\n// ============================================\n\nexport interface PipelineOptions {\n /** Channel name */\n channel: string;\n /** Preflight handlers */\n preflightHandlers?: PreflightHandler[];\n /** Process handlers */\n processHandlers?: ProcessHandler[];\n /** Delivery handlers */\n deliveryHandlers?: DeliveryHandler[];\n /** Agent callback */\n agentInvoke?: (ctx: PipelineMessageContext) => Promise<AgentResponse>;\n /** Error handler */\n onError?: (err: unknown, ctx: PipelineMessageContext) => void;\n}\n\n// ============================================\n// Pipeline Implementation\n// ============================================\n\nexport class MessagePipeline {\n private channel: string;\n private preflightHandlers: PreflightHandler[];\n private processHandlers: ProcessHandler[];\n private deliveryHandlers: DeliveryHandler[];\n private agentInvoke?: PipelineOptions['agentInvoke'];\n private onError?: PipelineOptions['onError'];\n\n constructor(options: PipelineOptions) {\n this.channel = options.channel;\n this.preflightHandlers = options.preflightHandlers ?? [];\n this.processHandlers = options.processHandlers ?? [];\n this.deliveryHandlers = options.deliveryHandlers ?? [];\n this.agentInvoke = options.agentInvoke;\n this.onError = options.onError;\n }\n\n /**\n * Handle inbound message\n */\n async handleMessage(ctx: PipelineMessageContext): Promise<void> {\n const channel = this.channel;\n const requestId = pipelineLogRequestId(ctx);\n\n await runWithLogContext(\n {\n requestId,\n sessionId: pipelineLogSessionId(ctx),\n },\n async () => {\n // 1. Preflight stage\n let processedCtx = await this.runPreflight(ctx);\n if (!processedCtx) {\n log.debug({ channel, chatId: ctx.chatId }, 'Message filtered in preflight');\n return;\n }\n\n // 2. Process stage\n try {\n processedCtx = await this.runProcess(processedCtx);\n } catch (err) {\n log.error({ channel, err }, 'Process handler error');\n this.onError?.(err, processedCtx);\n return;\n }\n\n const resolvedSk = processedCtx.metadata?.sessionKey;\n if (typeof resolvedSk === 'string' && resolvedSk.trim().length > 0) {\n updateAsyncLogContext({ sessionId: resolvedSk.trim() });\n }\n\n // 3. Deliver to Agent\n if (!this.agentInvoke) {\n log.warn({ channel }, 'No agentInvoke configured');\n return;\n }\n\n let response: AgentResponse;\n try {\n response = await this.agentInvoke(processedCtx);\n } catch (err) {\n log.error({ channel, err }, 'Agent invocation error');\n this.onError?.(err, processedCtx);\n return;\n }\n\n // 4. Delivery stage\n try {\n await this.runDelivery(processedCtx, response);\n } catch (err) {\n log.error({ channel, err }, 'Delivery handler error');\n this.onError?.(err, processedCtx);\n }\n },\n );\n }\n\n private async runPreflight(ctx: PipelineMessageContext): Promise<PipelineMessageContext | null> {\n for (const handler of this.preflightHandlers) {\n try {\n const result = await handler.preflight?.(ctx);\n if (!result) {\n log.debug({ channel: this.channel, handler: handler.name }, 'Preflight filtered message');\n return null;\n }\n ctx = result;\n } catch (err) {\n log.error({ channel: this.channel, handler: handler.name, err }, 'Preflight handler error');\n return null;\n }\n }\n return ctx;\n }\n\n private async runProcess(ctx: PipelineMessageContext): Promise<PipelineMessageContext> {\n for (const handler of this.processHandlers) {\n try {\n ctx = await handler.process(ctx);\n } catch (err) {\n log.error({ channel: this.channel, handler: handler.name, err }, 'Process handler error');\n throw err;\n }\n }\n return ctx;\n }\n\n private async runDelivery(ctx: PipelineMessageContext, response: AgentResponse): Promise<void> {\n for (const handler of this.deliveryHandlers) {\n try {\n await handler.deliver(ctx, response);\n } catch (err) {\n log.error({ channel: this.channel, handler: handler.name, err }, 'Delivery handler error');\n throw err;\n }\n }\n }\n}\n\n// ============================================\n// Standard Handlers\n// ============================================\n\n/**\n * Create filter-self handler\n */\nexport function createFilterSelfHandler(currentBotId: string): PreflightHandler {\n return {\n name: 'filterSelf',\n preflight: async (ctx) => {\n if (ctx.senderId === currentBotId) {\n return null;\n }\n return ctx;\n },\n };\n}\n\n/**\n * Create filter-empty handler\n */\nexport function createFilterEmptyHandler(): PreflightHandler {\n return {\n name: 'filterEmpty',\n preflight: async (ctx) => {\n const content = ctx.content?.trim() ?? '';\n if (!content && (!ctx.metadata.media || (ctx.metadata.media as PipelineMediaRef[]).length === 0)) {\n return null;\n }\n return ctx;\n },\n };\n}\n\n/**\n * Create filter-commands handler\n */\nexport function createFilterCommandsHandler(commands: string[]): PreflightHandler {\n const commandSet = new Set(commands.map(c => c.toLowerCase()));\n return {\n name: 'filterCommands',\n preflight: async (ctx) => {\n const firstWord = ctx.content?.split(/\\s/)[0]?.toLowerCase() ?? '';\n if (firstWord.startsWith('/') && commandSet.has(firstWord.slice(1))) {\n ctx.metadata.isCommand = true;\n ctx.metadata.command = firstWord.slice(1);\n }\n return ctx;\n },\n };\n}\n\n/**\n * Create standard preflight handlers\n */\nexport function standardPreflightHandlers(botId: string): PreflightHandler[] {\n return [\n createFilterSelfHandler(botId),\n createFilterEmptyHandler(),\n createFilterCommandsHandler(['start', 'help', 'status', 'stop']),\n ];\n}\n\n/**\n * Prepends a per-turn `[YYYY-MM-DD HH:MM TZ]` prefix to inbound text so the model has\n * a stable \"now\" without changing the system prompt (prompt-cache friendly).\n */\nexport function createEnvelopeTimestampHandler(timezone?: string): ProcessHandler {\n return {\n name: 'envelopeTimestamp',\n process: async (ctx) => {\n const text = ctx.content?.trim();\n if (!text) {\n return ctx;\n }\n const timestamp = formatEnvelopeTimestamp(timezone);\n return { ...ctx, content: `[${timestamp}] ${ctx.content}` };\n },\n };\n}\n\n/**\n * Create standard process handlers\n */\nexport function standardProcessHandlers(timezone?: string): ProcessHandler[] {\n return [createEnvelopeTimestampHandler(timezone)];\n}\n\n// ============================================\n// Factory\n// ============================================\n\nexport interface CreatePipelineParams {\n channel: string;\n botId: string;\n agentInvoke: PipelineOptions['agentInvoke'];\n onError?: PipelineOptions['onError'];\n /** IANA timezone — matches userTimezone from agent config / USER.md */\n timezone?: string;\n}\n\n/**\n * Create message processing pipeline\n */\nexport function createPipeline(params: CreatePipelineParams): MessagePipeline {\n return new MessagePipeline({\n channel: params.channel,\n preflightHandlers: standardPreflightHandlers(params.botId),\n processHandlers: standardProcessHandlers(params.timezone),\n agentInvoke: params.agentInvoke,\n onError: params.onError,\n });\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.js","names":[],"sources":["../../../src/channels/pipeline.ts"],"sourcesContent":["/**\n * Message Processing Pipeline\n * \n * Three-stage pipeline:\n * - Preflight: Filter empty messages, self-messages, detect commands\n * - Process: Transform format, extract metadata\n * - Delivery: Send to Agent\n */\n\nimport { randomUUID } from 'node:crypto';\n\nimport { createLogger, runWithLogContext, updateAsyncLogContext } from '../utils/logger.js';\nimport type { AgentResponse } from './plugin-types.js';\nimport { formatEnvelopeTimestamp } from './envelope-timestamp.js';\n\n// Re-export for convenience\nexport type { AgentResponse } from './plugin-types.js';\n\nconst log = createLogger('Pipeline');\n\nfunction pipelineLogRequestId(ctx: PipelineMessageContext): string {\n const raw = ctx.metadata?.requestId;\n if (typeof raw === 'string' && raw.trim().length > 0) {\n return raw.trim();\n }\n return randomUUID();\n}\n\nfunction pipelineLogSessionId(ctx: PipelineMessageContext): string {\n const sk = ctx.metadata?.sessionKey;\n if (typeof sk === 'string' && sk.trim().length > 0) {\n return sk.trim();\n }\n return `${ctx.channel}:${ctx.chatId}`;\n}\n\n// ============================================\n// Types\n// ============================================\n\nexport interface PipelineMessageContext {\n /** Channel identifier */\n channel: string;\n /** Account ID */\n accountId: string;\n /** Chat ID */\n chatId: string;\n /** Sender ID */\n senderId: string;\n /** Message content */\n content: string;\n /** Original message metadata */\n metadata: Record<string, unknown>;\n /** Is group chat */\n isGroup: boolean;\n /** Is direct message */\n isDm: boolean;\n /** Thread ID (optional) */\n threadId?: string;\n /** Message ID (optional) */\n messageId?: string;\n}\n\nexport interface PipelineMediaRef {\n type: 'photo' | 'video' | 'audio' | 'document' | 'voice';\n fileId: string;\n mimeType?: string;\n fileName?: string;\n url?: string;\n}\n\n// ============================================\n// Handler Interfaces\n// ============================================\n\nexport interface PreflightHandler {\n /** Handler name */\n name: string;\n /** Preflight - return null to skip message */\n preflight?(ctx: PipelineMessageContext): Promise<PipelineMessageContext | null>;\n}\n\nexport interface ProcessHandler {\n /** Handler name */\n name: string;\n /** Process message - transform and extract */\n process(ctx: PipelineMessageContext): Promise<PipelineMessageContext>;\n}\n\nexport interface DeliveryHandler {\n /** Handler name */\n name: string;\n /** Deliver message to Agent */\n deliver(ctx: PipelineMessageContext, response: AgentResponse): Promise<void>;\n}\n\n// ============================================\n// Pipeline Options\n// ============================================\n\nexport interface PipelineOptions {\n /** Channel name */\n channel: string;\n /** Preflight handlers */\n preflightHandlers?: PreflightHandler[];\n /** Process handlers */\n processHandlers?: ProcessHandler[];\n /** Delivery handlers */\n deliveryHandlers?: DeliveryHandler[];\n /** Agent callback */\n agentInvoke?: (ctx: PipelineMessageContext) => Promise<AgentResponse>;\n /** Error handler */\n onError?: (err: unknown, ctx: PipelineMessageContext) => void;\n}\n\n// ============================================\n// Pipeline Implementation\n// ============================================\n\nexport class MessagePipeline {\n private channel: string;\n private preflightHandlers: PreflightHandler[];\n private processHandlers: ProcessHandler[];\n private deliveryHandlers: DeliveryHandler[];\n private agentInvoke?: PipelineOptions['agentInvoke'];\n private onError?: PipelineOptions['onError'];\n\n constructor(options: PipelineOptions) {\n this.channel = options.channel;\n this.preflightHandlers = options.preflightHandlers ?? [];\n this.processHandlers = options.processHandlers ?? [];\n this.deliveryHandlers = options.deliveryHandlers ?? [];\n this.agentInvoke = options.agentInvoke;\n this.onError = options.onError;\n }\n\n /**\n * Handle inbound message\n */\n async handleMessage(ctx: PipelineMessageContext): Promise<void> {\n const channel = this.channel;\n const requestId = pipelineLogRequestId(ctx);\n\n await runWithLogContext(\n {\n requestId,\n sessionId: pipelineLogSessionId(ctx),\n },\n async () => {\n // 1. Preflight stage\n let processedCtx = await this.runPreflight(ctx);\n if (!processedCtx) {\n log.debug({ channel, chatId: ctx.chatId }, 'Message filtered in preflight');\n return;\n }\n\n // 2. Process stage\n try {\n processedCtx = await this.runProcess(processedCtx);\n } catch (err) {\n log.error({ channel, err, phase: 'channel.inbound' }, `Process handler error: ${err instanceof Error ? err.message : String(err)}`);\n this.onError?.(err, processedCtx);\n return;\n }\n\n const resolvedSk = processedCtx.metadata?.sessionKey;\n if (typeof resolvedSk === 'string' && resolvedSk.trim().length > 0) {\n updateAsyncLogContext({ sessionId: resolvedSk.trim() });\n }\n\n // 3. Deliver to Agent\n if (!this.agentInvoke) {\n log.warn({ channel }, 'No agentInvoke configured');\n return;\n }\n\n let response: AgentResponse;\n try {\n response = await this.agentInvoke(processedCtx);\n } catch (err) {\n log.error({ channel, err }, 'Agent invocation error');\n this.onError?.(err, processedCtx);\n return;\n }\n\n // 4. Delivery stage\n try {\n await this.runDelivery(processedCtx, response);\n } catch (err) {\n log.error({ channel, err }, 'Delivery handler error');\n this.onError?.(err, processedCtx);\n }\n },\n );\n }\n\n private async runPreflight(ctx: PipelineMessageContext): Promise<PipelineMessageContext | null> {\n for (const handler of this.preflightHandlers) {\n try {\n const result = await handler.preflight?.(ctx);\n if (!result) {\n log.debug({ channel: this.channel, handler: handler.name }, 'Preflight filtered message');\n return null;\n }\n ctx = result;\n } catch (err) {\n log.error({ channel: this.channel, handler: handler.name, err }, 'Preflight handler error');\n return null;\n }\n }\n return ctx;\n }\n\n private async runProcess(ctx: PipelineMessageContext): Promise<PipelineMessageContext> {\n for (const handler of this.processHandlers) {\n try {\n ctx = await handler.process(ctx);\n } catch (err) {\n log.error({ channel: this.channel, handler: handler.name, err }, 'Process handler error');\n throw err;\n }\n }\n return ctx;\n }\n\n private async runDelivery(ctx: PipelineMessageContext, response: AgentResponse): Promise<void> {\n for (const handler of this.deliveryHandlers) {\n try {\n await handler.deliver(ctx, response);\n } catch (err) {\n log.error({ channel: this.channel, handler: handler.name, err }, 'Delivery handler error');\n throw err;\n }\n }\n }\n}\n\n// ============================================\n// Standard Handlers\n// ============================================\n\n/**\n * Create filter-self handler\n */\nexport function createFilterSelfHandler(currentBotId: string): PreflightHandler {\n return {\n name: 'filterSelf',\n preflight: async (ctx) => {\n if (ctx.senderId === currentBotId) {\n return null;\n }\n return ctx;\n },\n };\n}\n\n/**\n * Create filter-empty handler\n */\nexport function createFilterEmptyHandler(): PreflightHandler {\n return {\n name: 'filterEmpty',\n preflight: async (ctx) => {\n const content = ctx.content?.trim() ?? '';\n if (!content && (!ctx.metadata.media || (ctx.metadata.media as PipelineMediaRef[]).length === 0)) {\n return null;\n }\n return ctx;\n },\n };\n}\n\n/**\n * Create filter-commands handler\n */\nexport function createFilterCommandsHandler(commands: string[]): PreflightHandler {\n const commandSet = new Set(commands.map(c => c.toLowerCase()));\n return {\n name: 'filterCommands',\n preflight: async (ctx) => {\n const firstWord = ctx.content?.split(/\\s/)[0]?.toLowerCase() ?? '';\n if (firstWord.startsWith('/') && commandSet.has(firstWord.slice(1))) {\n ctx.metadata.isCommand = true;\n ctx.metadata.command = firstWord.slice(1);\n }\n return ctx;\n },\n };\n}\n\n/**\n * Create standard preflight handlers\n */\nexport function standardPreflightHandlers(botId: string): PreflightHandler[] {\n return [\n createFilterSelfHandler(botId),\n createFilterEmptyHandler(),\n createFilterCommandsHandler(['start', 'help', 'status', 'stop']),\n ];\n}\n\n/**\n * Prepends a per-turn `[YYYY-MM-DD HH:MM TZ]` prefix to inbound text so the model has\n * a stable \"now\" without changing the system prompt (prompt-cache friendly).\n */\nexport function createEnvelopeTimestampHandler(timezone?: string): ProcessHandler {\n return {\n name: 'envelopeTimestamp',\n process: async (ctx) => {\n const text = ctx.content?.trim();\n if (!text) {\n return ctx;\n }\n const timestamp = formatEnvelopeTimestamp(timezone);\n return { ...ctx, content: `[${timestamp}] ${ctx.content}` };\n },\n };\n}\n\n/**\n * Create standard process handlers\n */\nexport function standardProcessHandlers(timezone?: string): ProcessHandler[] {\n return [createEnvelopeTimestampHandler(timezone)];\n}\n\n// ============================================\n// Factory\n// ============================================\n\nexport interface CreatePipelineParams {\n channel: string;\n botId: string;\n agentInvoke: PipelineOptions['agentInvoke'];\n onError?: PipelineOptions['onError'];\n /** IANA timezone — matches userTimezone from agent config / USER.md */\n timezone?: string;\n}\n\n/**\n * Create message processing pipeline\n */\nexport function createPipeline(params: CreatePipelineParams): MessagePipeline {\n return new MessagePipeline({\n channel: params.channel,\n preflightHandlers: standardPreflightHandlers(params.botId),\n processHandlers: standardProcessHandlers(params.timezone),\n agentInvoke: params.agentInvoke,\n onError: params.onError,\n });\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { init_agent_scope, normalizeAgentId, resolveAgentProfileDir } from "../agent/agent-scope.js";
2
- import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
3
2
  import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../routing/agent-session-key.js";
3
+ import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
4
4
  import { commandRegistry } from "./registry.js";
5
- import { readFile } from "node:fs/promises";
6
5
  import { join } from "node:path";
6
+ import { readFile } from "node:fs/promises";
7
7
  //#region src/chat-commands/agent-edit.ts
8
8
  /**
9
9
  * /agent-edit — open the current chat as an agent profile editing session.
@@ -1,9 +1,9 @@
1
+ import { ConfigSchema, init_schema } from "../../config/schema.js";
2
+ import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
1
3
  import { createLogger } from "../../utils/logger/index.js";
2
4
  import { init_logger } from "../../utils/logger.js";
3
5
  import { init_paths, resolveConfigPath } from "../../config/paths.js";
4
- import { ConfigSchema, init_schema } from "../../config/schema.js";
5
6
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
6
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
7
7
  import { commandRegistry } from "../registry.js";
8
8
  import { resolveAllowlistMatchSimple } from "../../channels/security.js";
9
9
  import { parseConfigValue } from "../config-value.js";
@@ -4,8 +4,8 @@ import { init_loader, saveConfig } from "../config/loader.js";
4
4
  import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
5
5
  import { getRoutingInfo, getSessionDisplayName } from "./session-key.js";
6
6
  import { wrapMarkdownExportAsHtml } from "../session/chat-export.js";
7
- import { mkdir, writeFile } from "fs/promises";
8
7
  import { join } from "path";
8
+ import { mkdir, writeFile } from "fs/promises";
9
9
  //#region src/chat-commands/context.ts
10
10
  init_logger();
11
11
  init_loader();
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Default the CLI console to `warn` when no log level is set, so routine `info`
3
3
  * output (extensions, diagnostics, etc.) does not clutter the terminal.
4
- * Opt in with `XOPC_LOG_LEVEL`, `LOG_LEVEL`, `DEBUG`, or `--verbose` / `-v`.
4
+ * Opt in with `XOPC_LOG_LEVEL` or `--verbose` / `-v`.
5
5
  * This module must load before any import of `../utils/logger.js`.
6
6
  */
7
7
  declare const env: NodeJS.ProcessEnv;
@@ -2,11 +2,11 @@
2
2
  /**
3
3
  * Default the CLI console to `warn` when no log level is set, so routine `info`
4
4
  * output (extensions, diagnostics, etc.) does not clutter the terminal.
5
- * Opt in with `XOPC_LOG_LEVEL`, `LOG_LEVEL`, `DEBUG`, or `--verbose` / `-v`.
5
+ * Opt in with `XOPC_LOG_LEVEL` or `--verbose` / `-v`.
6
6
  * This module must load before any import of `../utils/logger.js`.
7
7
  */
8
8
  const env = process.env;
9
- if (!env.VITEST && !env.TEST && !env.XOPC_LOG_LEVEL && !env.LOG_LEVEL && !env.DEBUG && !process.argv.includes("--verbose") && !process.argv.includes("-v")) env.XOPC_LOG_LEVEL = "warn";
9
+ if (!env.VITEST && !env.TEST && !env.XOPC_LOG_LEVEL && !process.argv.includes("--verbose") && !process.argv.includes("-v")) env.XOPC_LOG_LEVEL = "warn";
10
10
  //#endregion
11
11
  export {};
12
12
 
@@ -1 +1 @@
1
- {"version":3,"file":"cli-log-level-preset.js","names":[],"sources":["../../../src/cli/cli-log-level-preset.ts"],"sourcesContent":["/**\n * Default the CLI console to `warn` when no log level is set, so routine `info`\n * output (extensions, diagnostics, etc.) does not clutter the terminal.\n * Opt in with `XOPC_LOG_LEVEL`, `LOG_LEVEL`, `DEBUG`, or `--verbose` / `-v`.\n * This module must load before any import of `../utils/logger.js`.\n */\nconst env = process.env;\nif (\n !env.VITEST &&\n !env.TEST &&\n !env.XOPC_LOG_LEVEL &&\n !env.LOG_LEVEL &&\n !env.DEBUG &&\n !process.argv.includes('--verbose') &&\n !process.argv.includes('-v')\n) {\n env.XOPC_LOG_LEVEL = 'warn';\n}\n"],"mappings":";;;;;;;AAMA,MAAM,MAAM,QAAQ;AACpB,IACE,CAAC,IAAI,UACL,CAAC,IAAI,QACL,CAAC,IAAI,kBACL,CAAC,IAAI,aACL,CAAC,IAAI,SACL,CAAC,QAAQ,KAAK,SAAS,YAAY,IACnC,CAAC,QAAQ,KAAK,SAAS,KAAK,CAE5B,KAAI,iBAAiB"}
1
+ {"version":3,"file":"cli-log-level-preset.js","names":[],"sources":["../../../src/cli/cli-log-level-preset.ts"],"sourcesContent":["/**\n * Default the CLI console to `warn` when no log level is set, so routine `info`\n * output (extensions, diagnostics, etc.) does not clutter the terminal.\n * Opt in with `XOPC_LOG_LEVEL` or `--verbose` / `-v`.\n * This module must load before any import of `../utils/logger.js`.\n */\nconst env = process.env;\nif (\n !env.VITEST &&\n !env.TEST &&\n !env.XOPC_LOG_LEVEL &&\n !process.argv.includes('--verbose') &&\n !process.argv.includes('-v')\n) {\n env.XOPC_LOG_LEVEL = 'warn';\n}\n"],"mappings":";;;;;;;AAMA,MAAM,MAAM,QAAQ;AACpB,IACE,CAAC,IAAI,UACL,CAAC,IAAI,QACL,CAAC,IAAI,kBACL,CAAC,QAAQ,KAAK,SAAS,YAAY,IACnC,CAAC,QAAQ,KAAK,SAAS,KAAK,CAE5B,KAAI,iBAAiB"}
@@ -1,5 +1,5 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
1
  import { ConfigSchema, init_schema } from "../../config/schema.js";
2
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
3
3
  import { resolveGatewayLocalClientHost } from "../../config/gateway-bind.js";
4
4
  import { formatExamples, register } from "../registry.js";
5
5
  import { existsSync, readFileSync } from "fs";
@@ -1,7 +1,7 @@
1
1
  import { ConfigSchema, init_schema } from "../../../../config/schema.js";
2
2
  import { init_loader, loadConfig, saveConfig } from "../../../../config/loader.js";
3
- import { existsSync, mkdirSync, readFileSync } from "node:fs";
4
3
  import { dirname } from "node:path";
4
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
5
5
  //#region src/cli/commands/doctor/checks/config-health.ts
6
6
  init_loader();
7
7
  init_schema();
@@ -1,6 +1,6 @@
1
- import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
2
1
  import { getAgentDefaultModelRef, init_schema, parseModelRef } from "../../../../config/schema.js";
3
2
  import { init_loader, loadConfig } from "../../../../config/loader.js";
3
+ import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
4
4
  import { existsSync } from "node:fs";
5
5
  //#region src/cli/commands/doctor/checks/provider-auth.ts
6
6
  init_loader();
@@ -1,10 +1,10 @@
1
1
  import { init_agent_scope, listAgentEntries, resolveDefaultAgentId } from "../../../../agent/agent-scope.js";
2
+ import { init_session_key, parseSessionKey } from "../../../../routing/session-key.js";
2
3
  import { init_transcript_paths, resolveSessionFilePath } from "../../../../session/parity/transcript-paths.js";
3
4
  import { FILENAMES, init_paths, resolveSessionsDir } from "../../../../config/paths.js";
4
5
  import { init_loader, loadConfig } from "../../../../config/loader.js";
5
- import { init_session_key, parseSessionKey } from "../../../../routing/session-key.js";
6
- import { existsSync, readFileSync, readdirSync } from "node:fs";
7
6
  import { basename, join } from "node:path";
7
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
8
8
  //#region src/cli/commands/doctor/checks/session-integrity.ts
9
9
  init_agent_scope();
10
10
  init_loader();
@@ -1,5 +1,5 @@
1
- import { accessSync, chmodSync, constants, existsSync, mkdirSync, statSync } from "node:fs";
2
1
  import { join } from "node:path";
2
+ import { accessSync, chmodSync, constants, existsSync, mkdirSync, statSync } from "node:fs";
3
3
  //#region src/cli/commands/doctor/checks/state-integrity.ts
4
4
  function isWritable(dir) {
5
5
  try {
@@ -1,8 +1,8 @@
1
1
  import { init_agent_scope, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../../../../agent/agent-scope.js";
2
2
  import { WORKSPACE_FILES, init_paths } from "../../../../config/paths.js";
3
3
  import { init_loader, loadConfig } from "../../../../config/loader.js";
4
- import { existsSync } from "node:fs";
5
4
  import { join } from "node:path";
5
+ import { existsSync } from "node:fs";
6
6
  //#region src/cli/commands/doctor/checks/workspace-status.ts
7
7
  init_agent_scope();
8
8
  init_loader();
@@ -12,8 +12,8 @@ import { runGatewayLoop } from "../../gateway/run-loop.js";
12
12
  import "../../gateway/index.js";
13
13
  import { colors } from "../utils/colors.js";
14
14
  import { initWorkspace } from "../utils/init-workspace.js";
15
- import { existsSync, mkdirSync, readFileSync, symlinkSync, unlinkSync, watch } from "node:fs";
16
15
  import { join, resolve } from "node:path";
16
+ import { existsSync, mkdirSync, readFileSync, symlinkSync, unlinkSync, watch } from "node:fs";
17
17
  import { Command } from "commander";
18
18
  //#region src/cli/commands/extension-dev.ts
19
19
  init_loader();
@@ -7,8 +7,8 @@ import { installExtensionFromStoreZip, installFromLocal, installFromNpm, peekExt
7
7
  import { fetchRegistry, findExtension, getExtensionMarketplaceStoreBaseUrl, listExtensions, searchExtensions } from "../../extensions/marketplace.js";
8
8
  import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl } from "../../agent/skills/marketplace/adapters/store/store-api-client.js";
9
9
  import { colors } from "../utils/colors.js";
10
- import { existsSync, readFileSync, rmSync, statSync } from "node:fs";
11
10
  import { join, resolve } from "node:path";
11
+ import { existsSync, readFileSync, rmSync, statSync } from "node:fs";
12
12
  import { execSync } from "node:child_process";
13
13
  import { Command } from "commander";
14
14
  import semver from "semver";
@@ -4,8 +4,8 @@ import { init_logger } from "../../utils/logger.js";
4
4
  import { normalizeExtensionManifest } from "../../extensions/normalize-manifest.js";
5
5
  import { checkEngineCompatibility } from "../../extensions/engine-check.js";
6
6
  import { colors } from "../utils/colors.js";
7
- import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync } from "node:fs";
8
7
  import { isAbsolute, join, resolve } from "node:path";
8
+ import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync } from "node:fs";
9
9
  import { execSync } from "node:child_process";
10
10
  import { Command } from "commander";
11
11
  //#region src/cli/commands/extension-pack.ts
@@ -1,7 +1,7 @@
1
1
  import { getContextWithOpts } from "../../context.js";
2
+ import path from "node:path";
2
3
  import { existsSync, statSync, watch } from "node:fs";
3
4
  import { readFile } from "node:fs/promises";
4
- import path from "node:path";
5
5
  import { Command } from "commander";
6
6
  //#region src/cli/commands/gateway/logs.ts
7
7
  function parseLineCount(value) {
@@ -8,8 +8,8 @@ import { formatExamples, register } from "../registry.js";
8
8
  import { getContextWithOpts } from "../context.js";
9
9
  import "../../agent/image/index.js";
10
10
  import { colors } from "../utils/colors.js";
11
- import { mkdir, writeFile } from "node:fs/promises";
12
11
  import { join, resolve } from "node:path";
12
+ import { mkdir, writeFile } from "node:fs/promises";
13
13
  import { Command } from "commander";
14
14
  //#region src/cli/commands/image.ts
15
15
  init_loader();
@@ -1,14 +1,14 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
- import { createLogger } from "../../utils/logger/index.js";
3
- import { init_logger } from "../../utils/logger.js";
4
1
  import { resolveStateDir } from "../../config/paths-state.js";
5
2
  import { resolveAgentWorkspaceDir } from "../../agent/agent-scope.js";
3
+ import { createLogger } from "../../utils/logger/index.js";
4
+ import { init_logger } from "../../utils/logger.js";
6
5
  import { WORKSPACE_FILES, init_paths, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAgentProfileDir, resolveBinDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveExtensionsDir, resolveInboxDir, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogsDir, resolveSessionsDir, resolveSkillsDir, resolveToolsDir, resolveWorkspaceStateDir, resolveWorkspaceStatePath } from "../../config/paths.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
7
7
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
8
8
  import { formatExamples, register } from "../registry.js";
9
- import { mkdir, writeFile } from "fs/promises";
10
9
  import { join } from "path";
11
10
  import { existsSync } from "fs";
11
+ import { mkdir, writeFile } from "fs/promises";
12
12
  import { Command } from "commander";
13
13
  //#region src/cli/commands/init.ts
14
14
  init_write_file_atomic();
@@ -1,7 +1,7 @@
1
1
  import { getLoggerConfig, init_config } from "../../utils/logger/config.js";
2
- import { init_rotation, rotateLogs } from "../../utils/logger/rotation.js";
2
+ import { cleanOldLogs, init_rotation, rotateLogs } from "../../utils/logger/rotation.js";
3
3
  import { register } from "../registry.js";
4
- import { cleanOldLogs, getLogFiles, getLogStats, queryLogs } from "../../utils/logger/log-store.js";
4
+ import { getFileLogStats, getLogFiles, queryLogs } from "../../utils/logger/log-store.js";
5
5
  import { Command } from "commander";
6
6
  //#region src/cli/commands/logs.ts
7
7
  /**
@@ -92,7 +92,7 @@ function createLogsCommand(_ctx) {
92
92
  });
93
93
  command.command("stats").description("Show log statistics").option("--json", "Output as JSON").action(async (options) => {
94
94
  try {
95
- const stats = await getLogStats();
95
+ const stats = await getFileLogStats();
96
96
  const config = getLoggerConfig();
97
97
  if (options.json) {
98
98
  console.log(JSON.stringify({
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","names":["fetchLogStats"],"sources":["../../../../src/cli/commands/logs.ts"],"sourcesContent":["/**\n * Logs CLI Command\n * \n * Query and analyze logs: list, query, stats, tail, clean\n */\n\nimport { Command } from 'commander';\nimport { register, type CLIContext } from '../registry.js';\nimport {\n getLogFiles,\n queryLogs,\n getLogStats as fetchLogStats,\n cleanOldLogs,\n type LogQuery,\n type LogEntry,\n} from '../../utils/logger/log-store.js';\nimport { getLoggerConfig } from '../../utils/logger/config.js';\nimport { rotateLogs } from '../../utils/logger/rotation.js';\n\nfunction createLogsCommand(_ctx: CLIContext): Command {\n const command = new Command('logs');\n command.description('Manage and query logs');\n\n // List log files\n command\n .command('list')\n .description('List log files')\n .option('-t, --type <type>', 'Filter by type (app|error|audit|access)')\n .option('-s, --sort <field>', 'Sort by (name|size|date)', 'date')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n let files = getLogFiles();\n \n // Filter by type\n if (options.type) {\n files = files.filter(f => f.type === options.type);\n }\n \n // Sort\n const sortField = options.sort || 'date';\n files.sort((a, b) => {\n if (sortField === 'name') return a.name.localeCompare(b.name);\n if (sortField === 'size') return b.size - a.size;\n return new Date(b.modified).getTime() - new Date(a.modified).getTime();\n });\n \n if (options.json) {\n console.log(JSON.stringify({ files }, null, 2));\n return;\n }\n \n const config = getLoggerConfig();\n console.log(`\\n📁 Log directory: ${config.logDir}\\n`);\n \n if (files.length === 0) {\n console.log('No log files found.');\n return;\n }\n \n console.log(`Found ${files.length} log file(s):\\n`);\n \n const typeEmoji: Record<string, string> = {\n app: '📝',\n error: '❌',\n audit: '🔒',\n access: '🌐',\n };\n \n for (const file of files) {\n const emoji = typeEmoji[file.type] || '📄';\n const sizeKB = (file.size / 1024).toFixed(1);\n const date = new Date(file.modified).toLocaleString();\n console.log(`${emoji} ${file.name}`);\n console.log(` Size: ${sizeKB} KB | Modified: ${date}`);\n }\n } catch (err) {\n console.error('Failed to list logs:', err);\n process.exit(1);\n }\n });\n\n // Query logs\n command\n .command('query')\n .description('Query log entries')\n .option('-l, --level <level>', 'Filter by level (trace|debug|info|warn|error|fatal)')\n .option('-m, --module <module>', 'Filter by module')\n .option('-e, --extension <ext>', 'Filter by extension')\n .option('-q, --search <text>', 'Text search')\n .option('--session-id <id>', 'Filter by session ID')\n .option('--request-id <id>', 'Filter by request ID')\n .option('--from <date>', 'Start date (ISO 8601)')\n .option('--to <date>', 'End date (ISO 8601)')\n .option('-n, --limit <number>', 'Number of results', '50')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const query: LogQuery = {\n levels: options.level ? [options.level as 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'] : undefined,\n module: options.module,\n extension: options.extension,\n q: options.search,\n sessionId: options.sessionId,\n requestId: options.requestId,\n from: options.from,\n to: options.to,\n limit: parseInt(options.limit, 10),\n order: 'desc',\n };\n \n const entries = await queryLogs(query);\n \n if (options.json) {\n console.log(JSON.stringify({ entries }, null, 2));\n return;\n }\n \n if (entries.length === 0) {\n console.log('No matching log entries found.');\n return;\n }\n \n console.log(`\\nFound ${entries.length} log entry(ies):\\n`);\n \n for (const entry of entries) {\n const timestamp = new Date(entry.timestamp).toLocaleTimeString();\n const levelColor = getLevelColor(entry.level);\n const module = entry.module ? `[${entry.module}]` : '';\n const session = (entry as any).sessionId ? `{session:${(entry as any).sessionId.slice(0,8)}}` : '';\n \n console.log(`${timestamp} ${levelColor(entry.level)} ${module} ${session} ${entry.message}`);\n \n // Show context if present\n if (entry.requestId) {\n console.log(` ↳ requestId: ${entry.requestId}`);\n }\n if (entry.userId) {\n console.log(` ↳ userId: ${entry.userId}`);\n }\n }\n } catch (err) {\n console.error('Failed to query logs:', err);\n process.exit(1);\n }\n });\n\n // Show statistics\n command\n .command('stats')\n .description('Show log statistics')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const stats = await fetchLogStats();\n const config = getLoggerConfig();\n \n if (options.json) {\n console.log(JSON.stringify({ config, stats }, null, 2));\n return;\n }\n \n console.log('\\n📊 Log Statistics\\n');\n console.log(`📁 Log directory: ${config.logDir}`);\n console.log(`📝 Retention: ${config.retentionDays} days`);\n console.log(`📏 Max file size: ${config.maxFileSizeMB} MB\\n`);\n \n console.log('By Level:');\n const byLevel = stats.byLevel as Record<string, number>;\n const total = Object.values(byLevel).reduce((a, b) => a + b, 0);\n for (const [level, count] of Object.entries(byLevel)) {\n const bar = '█'.repeat(Math.min(50, total > 0 ? Math.round((count / total) * 50) : 0));\n const percent = total > 0 ? ((count / total) * 100).toFixed(1) : '0';\n console.log(` ${level.padEnd(5)}: ${count.toString().padStart(6)} (${percent}%) ${bar}`);\n }\n \n console.log(`\\n📈 Total entries: ${total}`);\n } catch (err) {\n console.error('Failed to get stats:', err);\n process.exit(1);\n }\n });\n\n // Tail logs\n command\n .command('tail')\n .description('Tail log entries in real-time')\n .option('-n, --lines <number>', 'Number of lines to show', '20')\n .option('-f, --follow', 'Follow new entries (Ctrl+C to exit)', false)\n .option('-t, --type <type>', 'Filter by type (app|error|audit|access)', 'app')\n .action(async (options) => {\n try {\n const lines = parseInt(options.lines, 10);\n \n // Initial query\n const query: LogQuery = {\n limit: lines,\n order: 'desc',\n };\n \n const entries = await queryLogs(query);\n \n // Print in chronological order\n const reversed = [...entries].reverse();\n \n for (const entry of reversed) {\n printLogEntry(entry);\n }\n \n if (options.follow) {\n console.log('\\n⏳ Watching for new entries (Ctrl+C to exit)...');\n // Note: Full follow mode would require file watching\n // For now, just show initial results\n }\n } catch (err) {\n console.error('Failed to tail logs:', err);\n process.exit(1);\n }\n });\n\n // Clean old logs\n command\n .command('clean')\n .description('Clean old log files')\n .option('-d, --days <number>', 'Keep logs for N days', '7')\n .option('--dry-run', 'Show what would be deleted without actually deleting')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const keepDays = parseInt(options.days, 10);\n \n if (options.dryRun) {\n console.log(`\\n🔍 Dry run: would delete logs older than ${keepDays} days\\n`);\n }\n \n const result = cleanOldLogs(keepDays);\n \n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n \n if (result.deleted === 0) {\n console.log('✅ No old logs to clean.');\n return;\n }\n \n console.log(`\\n🧹 Cleaned ${result.deleted} log file(s)`);\n \n if (result.errors.length > 0) {\n console.log('\\n⚠️ Errors:');\n for (const err of result.errors) {\n console.log(` - ${err}`);\n }\n }\n } catch (err) {\n console.error('Failed to clean logs:', err);\n process.exit(1);\n }\n });\n\n // Rotate logs\n command\n .command('rotate')\n .description('Rotate large log files')\n .option('--dry-run', 'Show what would be rotated without rotating')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n if (options.dryRun) {\n console.log('\\n🔍 Dry run: would rotate large log files\\n');\n }\n \n const result = await rotateLogs();\n \n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n \n if (result.rotated === 0) {\n console.log('✅ No logs need rotation.');\n return;\n }\n \n console.log(`\\n🔄 Rotated ${result.rotated} log file(s)`);\n console.log(` Compressed: ${result.compressed}`);\n \n if (result.errors.length > 0) {\n console.log('\\n⚠️ Errors:');\n for (const err of result.errors) {\n console.log(` - ${err}`);\n }\n }\n } catch (err) {\n console.error('Failed to rotate logs:', err);\n process.exit(1);\n }\n });\n\n return command;\n}\n\n// Helper functions\nfunction getLevelColor(level: string): (s: string) => string {\n const colors: Record<string, (s: string) => string> = {\n trace: (s) => `🔍 ${s}`,\n debug: (s) => `🔧 ${s}`,\n info: (s) => `ℹ️ ${s}`,\n warn: (s) => `⚠️ ${s}`,\n error: (s) => `❌ ${s}`,\n fatal: (s) => `🔥 ${s}`,\n };\n return colors[level] || ((s) => s);\n}\n\nfunction printLogEntry(entry: LogEntry): void {\n const timestamp = new Date(entry.timestamp).toLocaleTimeString();\n const levelColor = getLevelColor(entry.level);\n const module = entry.module ? `[${entry.module}]` : '';\n \n console.log(`${timestamp} ${levelColor(entry.level)} ${module} ${entry.message}`);\n}\n\n// Register command\nregister({\n id: 'logs',\n name: 'logs',\n description: 'Manage and query logs',\n factory: createLogsCommand,\n metadata: { category: 'maintenance' },\n});\n"],"mappings":";;;;;;;;;;;aAgB+D;eACH;AAE5D,SAAS,kBAAkB,MAA2B;CACpD,MAAM,UAAU,IAAI,QAAQ,OAAO;AACnC,SAAQ,YAAY,wBAAwB;AAG5C,SACG,QAAQ,OAAO,CACf,YAAY,iBAAiB,CAC7B,OAAO,qBAAqB,0CAA0C,CACtE,OAAO,sBAAsB,4BAA4B,OAAO,CAChE,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,YAAY;AACzB,MAAI;GACF,IAAI,QAAQ,aAAa;AAGzB,OAAI,QAAQ,KACV,SAAQ,MAAM,QAAO,MAAK,EAAE,SAAS,QAAQ,KAAK;GAIpD,MAAM,YAAY,QAAQ,QAAQ;AAClC,SAAM,MAAM,GAAG,MAAM;AACnB,QAAI,cAAc,OAAQ,QAAO,EAAE,KAAK,cAAc,EAAE,KAAK;AAC7D,QAAI,cAAc,OAAQ,QAAO,EAAE,OAAO,EAAE;AAC5C,WAAO,IAAI,KAAK,EAAE,SAAS,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,SAAS,CAAC,SAAS;KACtE;AAEF,OAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;AAC/C;;GAGF,MAAM,SAAS,iBAAiB;AAChC,WAAQ,IAAI,uBAAuB,OAAO,OAAO,IAAI;AAErD,OAAI,MAAM,WAAW,GAAG;AACtB,YAAQ,IAAI,sBAAsB;AAClC;;AAGF,WAAQ,IAAI,SAAS,MAAM,OAAO,iBAAiB;GAEnD,MAAM,YAAoC;IACxC,KAAK;IACL,OAAO;IACP,OAAO;IACP,QAAQ;IACT;AAED,QAAK,MAAM,QAAQ,OAAO;IACxB,MAAM,QAAQ,UAAU,KAAK,SAAS;IACtC,MAAM,UAAU,KAAK,OAAO,MAAM,QAAQ,EAAE;IAC5C,MAAM,OAAO,IAAI,KAAK,KAAK,SAAS,CAAC,gBAAgB;AACrD,YAAQ,IAAI,GAAG,MAAM,GAAG,KAAK,OAAO;AACpC,YAAQ,IAAI,YAAY,OAAO,kBAAkB,OAAO;;WAEnD,KAAK;AACZ,WAAQ,MAAM,wBAAwB,IAAI;AAC1C,WAAQ,KAAK,EAAE;;GAEjB;AAGJ,SACG,QAAQ,QAAQ,CAChB,YAAY,oBAAoB,CAChC,OAAO,uBAAuB,sDAAsD,CACpF,OAAO,yBAAyB,mBAAmB,CACnD,OAAO,yBAAyB,sBAAsB,CACtD,OAAO,uBAAuB,cAAc,CAC5C,OAAO,qBAAqB,uBAAuB,CACnD,OAAO,qBAAqB,uBAAuB,CACnD,OAAO,iBAAiB,wBAAwB,CAChD,OAAO,eAAe,sBAAsB,CAC5C,OAAO,wBAAwB,qBAAqB,KAAK,CACzD,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,YAAY;AACzB,MAAI;GAcF,MAAM,UAAU,MAAM,UAAU;IAZ9B,QAAQ,QAAQ,QAAQ,CAAC,QAAQ,MAAiE,GAAG,KAAA;IACrG,QAAQ,QAAQ;IAChB,WAAW,QAAQ;IACnB,GAAG,QAAQ;IACX,WAAW,QAAQ;IACnB,WAAW,QAAQ;IACnB,MAAM,QAAQ;IACd,IAAI,QAAQ;IACZ,OAAO,SAAS,QAAQ,OAAO,GAAG;IAClC,OAAO;IAG4B,CAAC;AAEtC,OAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;AACjD;;AAGF,OAAI,QAAQ,WAAW,GAAG;AACxB,YAAQ,IAAI,iCAAiC;AAC7C;;AAGF,WAAQ,IAAI,WAAW,QAAQ,OAAO,oBAAoB;AAE1D,QAAK,MAAM,SAAS,SAAS;IAC3B,MAAM,YAAY,IAAI,KAAK,MAAM,UAAU,CAAC,oBAAoB;IAChE,MAAM,aAAa,cAAc,MAAM,MAAM;IAC7C,MAAM,SAAS,MAAM,SAAS,IAAI,MAAM,OAAO,KAAK;IACpD,MAAM,UAAW,MAAc,YAAY,YAAa,MAAc,UAAU,MAAM,GAAE,EAAE,CAAC,KAAK;AAEhG,YAAQ,IAAI,GAAG,UAAU,GAAG,WAAW,MAAM,MAAM,CAAC,GAAG,OAAO,GAAG,QAAQ,GAAG,MAAM,UAAU;AAG5F,QAAI,MAAM,UACR,SAAQ,IAAI,mBAAmB,MAAM,YAAY;AAEnD,QAAI,MAAM,OACR,SAAQ,IAAI,gBAAgB,MAAM,SAAS;;WAGxC,KAAK;AACZ,WAAQ,MAAM,yBAAyB,IAAI;AAC3C,WAAQ,KAAK,EAAE;;GAEjB;AAGJ,SACG,QAAQ,QAAQ,CAChB,YAAY,sBAAsB,CAClC,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,YAAY;AACzB,MAAI;GACF,MAAM,QAAQ,MAAMA,aAAe;GACnC,MAAM,SAAS,iBAAiB;AAEhC,OAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU;KAAE;KAAQ;KAAO,EAAE,MAAM,EAAE,CAAC;AACvD;;AAGF,WAAQ,IAAI,wBAAwB;AACpC,WAAQ,IAAI,qBAAqB,OAAO,SAAS;AACjD,WAAQ,IAAI,iBAAiB,OAAO,cAAc,OAAO;AACzD,WAAQ,IAAI,qBAAqB,OAAO,cAAc,OAAO;AAE7D,WAAQ,IAAI,YAAY;GACxB,MAAM,UAAU,MAAM;GACtB,MAAM,QAAQ,OAAO,OAAO,QAAQ,CAAC,QAAQ,GAAG,MAAM,IAAI,GAAG,EAAE;AAC/D,QAAK,MAAM,CAAC,OAAO,UAAU,OAAO,QAAQ,QAAQ,EAAE;IACpD,MAAM,MAAM,IAAI,OAAO,KAAK,IAAI,IAAI,QAAQ,IAAI,KAAK,MAAO,QAAQ,QAAS,GAAG,GAAG,EAAE,CAAC;IACtF,MAAM,UAAU,QAAQ,KAAM,QAAQ,QAAS,KAAK,QAAQ,EAAE,GAAG;AACjE,YAAQ,IAAI,MAAM,MAAM,OAAO,EAAE,CAAC,IAAI,MAAM,UAAU,CAAC,SAAS,EAAE,CAAC,IAAI,QAAQ,KAAK,MAAM;;AAG5F,WAAQ,IAAI,uBAAuB,QAAQ;WACpC,KAAK;AACZ,WAAQ,MAAM,wBAAwB,IAAI;AAC1C,WAAQ,KAAK,EAAE;;GAEjB;AAGJ,SACG,QAAQ,OAAO,CACf,YAAY,gCAAgC,CAC5C,OAAO,wBAAwB,2BAA2B,KAAK,CAC/D,OAAO,gBAAgB,uCAAuC,MAAM,CACpE,OAAO,qBAAqB,2CAA2C,MAAM,CAC7E,OAAO,OAAO,YAAY;AACzB,MAAI;GAYF,MAAM,WAAW,CAAC,GAAG,MAHC,UAAU;IAJ9B,OAJY,SAAS,QAAQ,OAAO,GAIxB;IACZ,OAAO;IAG4B,CAAC,CAGT,CAAC,SAAS;AAEvC,QAAK,MAAM,SAAS,SAClB,eAAc,MAAM;AAGtB,OAAI,QAAQ,OACV,SAAQ,IAAI,mDAAmD;WAI1D,KAAK;AACZ,WAAQ,MAAM,wBAAwB,IAAI;AAC1C,WAAQ,KAAK,EAAE;;GAEjB;AAGJ,SACG,QAAQ,QAAQ,CAChB,YAAY,sBAAsB,CAClC,OAAO,uBAAuB,wBAAwB,IAAI,CAC1D,OAAO,aAAa,uDAAuD,CAC3E,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,YAAY;AACzB,MAAI;GACF,MAAM,WAAW,SAAS,QAAQ,MAAM,GAAG;AAE3C,OAAI,QAAQ,OACV,SAAQ,IAAI,8CAA8C,SAAS,SAAS;GAG9E,MAAM,SAAS,aAAa,SAAS;AAErC,OAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,OAAI,OAAO,YAAY,GAAG;AACxB,YAAQ,IAAI,0BAA0B;AACtC;;AAGF,WAAQ,IAAI,gBAAgB,OAAO,QAAQ,cAAc;AAEzD,OAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,IAAI,gBAAgB;AAC5B,SAAK,MAAM,OAAO,OAAO,OACvB,SAAQ,IAAI,QAAQ,MAAM;;WAGvB,KAAK;AACZ,WAAQ,MAAM,yBAAyB,IAAI;AAC3C,WAAQ,KAAK,EAAE;;GAEjB;AAGJ,SACG,QAAQ,SAAS,CACjB,YAAY,yBAAyB,CACrC,OAAO,aAAa,8CAA8C,CAClE,OAAO,UAAU,iBAAiB,CAClC,OAAO,OAAO,YAAY;AACzB,MAAI;AACF,OAAI,QAAQ,OACV,SAAQ,IAAI,+CAA+C;GAG7D,MAAM,SAAS,MAAM,YAAY;AAEjC,OAAI,QAAQ,MAAM;AAChB,YAAQ,IAAI,KAAK,UAAU,QAAQ,MAAM,EAAE,CAAC;AAC5C;;AAGF,OAAI,OAAO,YAAY,GAAG;AACxB,YAAQ,IAAI,2BAA2B;AACvC;;AAGF,WAAQ,IAAI,gBAAgB,OAAO,QAAQ,cAAc;AACzD,WAAQ,IAAI,kBAAkB,OAAO,aAAa;AAElD,OAAI,OAAO,OAAO,SAAS,GAAG;AAC5B,YAAQ,IAAI,gBAAgB;AAC5B,SAAK,MAAM,OAAO,OAAO,OACvB,SAAQ,IAAI,QAAQ,MAAM;;WAGvB,KAAK;AACZ,WAAQ,MAAM,0BAA0B,IAAI;AAC5C,WAAQ,KAAK,EAAE;;GAEjB;AAEJ,QAAO;;AAIT,SAAS,cAAc,OAAsC;AAS3D,QAAO;EAPL,QAAQ,MAAM,MAAM;EACpB,QAAQ,MAAM,MAAM;EACpB,OAAQ,MAAM,OAAO;EACrB,OAAQ,MAAM,OAAO;EACrB,QAAQ,MAAM,KAAK;EACnB,QAAQ,MAAM,MAAM;EAET,CAAC,YAAY,MAAM;;AAGlC,SAAS,cAAc,OAAuB;CAC5C,MAAM,YAAY,IAAI,KAAK,MAAM,UAAU,CAAC,oBAAoB;CAChE,MAAM,aAAa,cAAc,MAAM,MAAM;CAC7C,MAAM,SAAS,MAAM,SAAS,IAAI,MAAM,OAAO,KAAK;AAEpD,SAAQ,IAAI,GAAG,UAAU,GAAG,WAAW,MAAM,MAAM,CAAC,GAAG,OAAO,GAAG,MAAM,UAAU;;AAInF,SAAS;CACP,IAAI;CACJ,MAAM;CACN,aAAa;CACb,SAAS;CACT,UAAU,EAAE,UAAU,eAAe;CACtC,CAAC"}
1
+ {"version":3,"file":"logs.js","names":[],"sources":["../../../../src/cli/commands/logs.ts"],"sourcesContent":["/**\n * Logs CLI Command\n * \n * Query and analyze logs: list, query, stats, tail, clean\n */\n\nimport { Command } from 'commander';\nimport { register, type CLIContext } from '../registry.js';\nimport {\n getLogFiles,\n queryLogs,\n getFileLogStats,\n type LogQuery,\n type LogEntry,\n} from '../../utils/logger/log-store.js';\nimport { getLoggerConfig } from '../../utils/logger/config.js';\nimport { rotateLogs, cleanOldLogs } from '../../utils/logger/rotation.js';\n\nfunction createLogsCommand(_ctx: CLIContext): Command {\n const command = new Command('logs');\n command.description('Manage and query logs');\n\n // List log files\n command\n .command('list')\n .description('List log files')\n .option('-t, --type <type>', 'Filter by type (app|error|audit|access)')\n .option('-s, --sort <field>', 'Sort by (name|size|date)', 'date')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n let files = getLogFiles();\n \n // Filter by type\n if (options.type) {\n files = files.filter(f => f.type === options.type);\n }\n \n // Sort\n const sortField = options.sort || 'date';\n files.sort((a, b) => {\n if (sortField === 'name') return a.name.localeCompare(b.name);\n if (sortField === 'size') return b.size - a.size;\n return new Date(b.modified).getTime() - new Date(a.modified).getTime();\n });\n \n if (options.json) {\n console.log(JSON.stringify({ files }, null, 2));\n return;\n }\n \n const config = getLoggerConfig();\n console.log(`\\n📁 Log directory: ${config.logDir}\\n`);\n \n if (files.length === 0) {\n console.log('No log files found.');\n return;\n }\n \n console.log(`Found ${files.length} log file(s):\\n`);\n \n const typeEmoji: Record<string, string> = {\n app: '📝',\n error: '❌',\n audit: '🔒',\n access: '🌐',\n };\n \n for (const file of files) {\n const emoji = typeEmoji[file.type] || '📄';\n const sizeKB = (file.size / 1024).toFixed(1);\n const date = new Date(file.modified).toLocaleString();\n console.log(`${emoji} ${file.name}`);\n console.log(` Size: ${sizeKB} KB | Modified: ${date}`);\n }\n } catch (err) {\n console.error('Failed to list logs:', err);\n process.exit(1);\n }\n });\n\n // Query logs\n command\n .command('query')\n .description('Query log entries')\n .option('-l, --level <level>', 'Filter by level (trace|debug|info|warn|error|fatal)')\n .option('-m, --module <module>', 'Filter by module')\n .option('-e, --extension <ext>', 'Filter by extension')\n .option('-q, --search <text>', 'Text search')\n .option('--session-id <id>', 'Filter by session ID')\n .option('--request-id <id>', 'Filter by request ID')\n .option('--from <date>', 'Start date (ISO 8601)')\n .option('--to <date>', 'End date (ISO 8601)')\n .option('-n, --limit <number>', 'Number of results', '50')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const query: LogQuery = {\n levels: options.level ? [options.level as 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'fatal'] : undefined,\n module: options.module,\n extension: options.extension,\n q: options.search,\n sessionId: options.sessionId,\n requestId: options.requestId,\n from: options.from,\n to: options.to,\n limit: parseInt(options.limit, 10),\n order: 'desc',\n };\n \n const entries = await queryLogs(query);\n \n if (options.json) {\n console.log(JSON.stringify({ entries }, null, 2));\n return;\n }\n \n if (entries.length === 0) {\n console.log('No matching log entries found.');\n return;\n }\n \n console.log(`\\nFound ${entries.length} log entry(ies):\\n`);\n \n for (const entry of entries) {\n const timestamp = new Date(entry.timestamp).toLocaleTimeString();\n const levelColor = getLevelColor(entry.level);\n const module = entry.module ? `[${entry.module}]` : '';\n const session = (entry as any).sessionId ? `{session:${(entry as any).sessionId.slice(0,8)}}` : '';\n \n console.log(`${timestamp} ${levelColor(entry.level)} ${module} ${session} ${entry.message}`);\n \n // Show context if present\n if (entry.requestId) {\n console.log(` ↳ requestId: ${entry.requestId}`);\n }\n if (entry.userId) {\n console.log(` ↳ userId: ${entry.userId}`);\n }\n }\n } catch (err) {\n console.error('Failed to query logs:', err);\n process.exit(1);\n }\n });\n\n // Show statistics\n command\n .command('stats')\n .description('Show log statistics')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const stats = await getFileLogStats();\n const config = getLoggerConfig();\n \n if (options.json) {\n console.log(JSON.stringify({ config, stats }, null, 2));\n return;\n }\n \n console.log('\\n📊 Log Statistics\\n');\n console.log(`📁 Log directory: ${config.logDir}`);\n console.log(`📝 Retention: ${config.retentionDays} days`);\n console.log(`📏 Max file size: ${config.maxFileSizeMB} MB\\n`);\n \n console.log('By Level:');\n const byLevel = stats.byLevel as Record<string, number>;\n const total = Object.values(byLevel).reduce((a, b) => a + b, 0);\n for (const [level, count] of Object.entries(byLevel)) {\n const bar = '█'.repeat(Math.min(50, total > 0 ? Math.round((count / total) * 50) : 0));\n const percent = total > 0 ? ((count / total) * 100).toFixed(1) : '0';\n console.log(` ${level.padEnd(5)}: ${count.toString().padStart(6)} (${percent}%) ${bar}`);\n }\n \n console.log(`\\n📈 Total entries: ${total}`);\n } catch (err) {\n console.error('Failed to get stats:', err);\n process.exit(1);\n }\n });\n\n // Tail logs\n command\n .command('tail')\n .description('Tail log entries in real-time')\n .option('-n, --lines <number>', 'Number of lines to show', '20')\n .option('-f, --follow', 'Follow new entries (Ctrl+C to exit)', false)\n .option('-t, --type <type>', 'Filter by type (app|error|audit|access)', 'app')\n .action(async (options) => {\n try {\n const lines = parseInt(options.lines, 10);\n \n // Initial query\n const query: LogQuery = {\n limit: lines,\n order: 'desc',\n };\n \n const entries = await queryLogs(query);\n \n // Print in chronological order\n const reversed = [...entries].reverse();\n \n for (const entry of reversed) {\n printLogEntry(entry);\n }\n \n if (options.follow) {\n console.log('\\n⏳ Watching for new entries (Ctrl+C to exit)...');\n // Note: Full follow mode would require file watching\n // For now, just show initial results\n }\n } catch (err) {\n console.error('Failed to tail logs:', err);\n process.exit(1);\n }\n });\n\n // Clean old logs\n command\n .command('clean')\n .description('Clean old log files')\n .option('-d, --days <number>', 'Keep logs for N days', '7')\n .option('--dry-run', 'Show what would be deleted without actually deleting')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n const keepDays = parseInt(options.days, 10);\n \n if (options.dryRun) {\n console.log(`\\n🔍 Dry run: would delete logs older than ${keepDays} days\\n`);\n }\n \n const result = cleanOldLogs(keepDays);\n \n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n \n if (result.deleted === 0) {\n console.log('✅ No old logs to clean.');\n return;\n }\n \n console.log(`\\n🧹 Cleaned ${result.deleted} log file(s)`);\n \n if (result.errors.length > 0) {\n console.log('\\n⚠️ Errors:');\n for (const err of result.errors) {\n console.log(` - ${err}`);\n }\n }\n } catch (err) {\n console.error('Failed to clean logs:', err);\n process.exit(1);\n }\n });\n\n // Rotate logs\n command\n .command('rotate')\n .description('Rotate large log files')\n .option('--dry-run', 'Show what would be rotated without rotating')\n .option('--json', 'Output as JSON')\n .action(async (options) => {\n try {\n if (options.dryRun) {\n console.log('\\n🔍 Dry run: would rotate large log files\\n');\n }\n \n const result = await rotateLogs();\n \n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n \n if (result.rotated === 0) {\n console.log('✅ No logs need rotation.');\n return;\n }\n \n console.log(`\\n🔄 Rotated ${result.rotated} log file(s)`);\n console.log(` Compressed: ${result.compressed}`);\n \n if (result.errors.length > 0) {\n console.log('\\n⚠️ Errors:');\n for (const err of result.errors) {\n console.log(` - ${err}`);\n }\n }\n } catch (err) {\n console.error('Failed to rotate logs:', err);\n process.exit(1);\n }\n });\n\n return command;\n}\n\n// Helper functions\nfunction getLevelColor(level: string): (s: string) => string {\n const colors: Record<string, (s: string) => string> = {\n trace: (s) => `🔍 ${s}`,\n debug: (s) => `🔧 ${s}`,\n info: (s) => `ℹ️ ${s}`,\n warn: (s) => `⚠️ ${s}`,\n error: (s) => `❌ ${s}`,\n fatal: (s) => `🔥 ${s}`,\n };\n return colors[level] || ((s) => s);\n}\n\nfunction printLogEntry(entry: LogEntry): void {\n const timestamp = new Date(entry.timestamp).toLocaleTimeString();\n const levelColor = getLevelColor(entry.level);\n const module = entry.module ? `[${entry.module}]` : '';\n \n console.log(`${timestamp} ${levelColor(entry.level)} ${module} ${entry.message}`);\n}\n\n// Register command\nregister({\n id: 'logs',\n name: 'logs',\n description: 'Manage and query logs',\n factory: createLogsCommand,\n metadata: { category: 'maintenance' },\n});\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
+ import { ConfigSchema, init_schema } from "../../config/schema.js";
1
2
  import { init_agent_scope, resolveAgentProfileDir, resolveDefaultAgentId } from "../../agent/agent-scope.js";
2
3
  import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
3
- import { ConfigSchema, init_schema } from "../../config/schema.js";
4
4
  import { saveConfig } from "../../config/loader.js";
5
5
  import { resolveGatewayLocalClientHost } from "../../config/gateway-bind.js";
6
6
  import { isWeixinOnboardConfigured } from "../../../extensions/weixin/src/adapters/onboard-cli.js";
@@ -1,8 +1,8 @@
1
1
  import { ConfigSchema, init_schema } from "../../config/schema.js";
2
2
  import { init_loader, loadConfig, saveConfig } from "../../config/loader.js";
3
- import { randomBytes } from "node:crypto";
4
- import { existsSync, mkdirSync, readFileSync } from "node:fs";
5
3
  import { dirname, join } from "node:path";
4
+ import { existsSync, mkdirSync, readFileSync } from "node:fs";
5
+ import { randomBytes } from "node:crypto";
6
6
  //#region src/cli/utils/init-workspace-core.ts
7
7
  init_schema();
8
8
  init_loader();
@@ -1,5 +1,5 @@
1
- import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentHomeDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
2
1
  import { init_localized_text, normalizeLocalizedText } from "../config/localized-text.js";
2
+ import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentHomeDir, resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agent/agent-scope.js";
3
3
  import { existsSync } from "node:fs";
4
4
  import { rm } from "node:fs/promises";
5
5
  //#region src/commands/agents.config.ts
@@ -1,5 +1,5 @@
1
- import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
2
1
  import { getAgentDefaultModelRef, init_schema } from "./schema.js";
2
+ import { init_agent_scope, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
3
3
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
4
4
  import { agentExists, getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
5
  //#region src/config/agent-profile.ts
@@ -1,7 +1,7 @@
1
1
  import { getTailnetIPv4Sync } from "../infra/tailscale.js";
2
2
  import { isLoopbackHost } from "../gateway/host.js";
3
- import { existsSync } from "node:fs";
4
3
  import net from "node:net";
4
+ import { existsSync } from "node:fs";
5
5
  //#region src/config/gateway-bind.ts
6
6
  function resolveGatewayBindMode(cfg, bindOverride) {
7
7
  if (bindOverride) return bindOverride;
@@ -1,15 +1,15 @@
1
+ import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
2
+ import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
3
+ import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentTypedModelSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
4
+ import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
1
5
  import { ENV_VARS, resolveHomeDir, resolveStateDir } from "./paths-state.js";
2
6
  import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
3
7
  import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
4
8
  import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir, resolveSessionsDir as resolveSessionsDir$1 } from "../agent/agent-scope.js";
9
+ import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
5
10
  import { resolveSessionFilePath, resolveSessionTranscriptPathInDir } from "../session/parity/transcript-paths.js";
6
11
  import { FILENAMES, WORKSPACE_FILES, existsSync, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentMetadataPath, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveCronDir, resolveCronJobsPath, resolveCronLogPath, resolveCronLogsDir, resolveCronRunsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMemoryDir, resolveMemoryPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSessionTranscriptPath, resolveSessionsArchiveDir, resolveSessionsDir, resolveSessionsMapPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
7
- import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
8
- import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
9
- import { AgentConfigSchema, AgentDefaultsSchema, AgentImageGenerationModelSchema, AgentModelRefSchema, AgentTypedModelSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, CronConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GoalsConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
10
12
  import { init_loader, loadConfig, registerChannelConfigValidator, saveConfig } from "./loader.js";
11
- import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
12
- import { extractProfileAgentId, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
13
13
  import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
14
14
  import { CustomModelSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
15
15
  import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";