@xopcai/xopc 0.0.93 → 0.0.94

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-OqhbJkMf.js +222 -0
  19. package/dist/gateway/static/root/assets/apps-page-OHXW9XP8.js +1 -0
  20. package/dist/gateway/static/root/assets/channels-settings-4N2R-jof.js +1 -0
  21. package/dist/gateway/static/root/assets/{channels-status-swr-CsGkK9h9.js → channels-status-swr-Bv6f9kDq.js} +1 -1
  22. package/dist/gateway/static/root/assets/{cron-api-CyAm0xJT.js → cron-api-BtaQaHJq.js} +1 -1
  23. package/dist/gateway/static/root/assets/cron-page-Dah32HJK.js +1 -0
  24. package/dist/gateway/static/root/assets/{dist-DHwVV8XK.js → dist-BJfD9Qvs.js} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-debug-page-BK8kcc4F.js → extension-debug-page-DnYuMzmH.js} +1 -1
  26. package/dist/gateway/static/root/assets/{extension-page-Cf8X_QUc.js → extension-page-CJfc-6XV.js} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-settings-page-C5-YLMmy.js → extension-settings-page-BxdfYQMG.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-DOLHwowi.js} +1 -1
  30. package/dist/gateway/static/root/assets/{heartbeat-config-api-CpgW2sGp.js → heartbeat-config-api-Bj2INAf5.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-DuQ1XPoA.js} +99 -98
  33. package/dist/gateway/static/root/assets/logs-page-AsOgLNJE.js +2 -0
  34. package/dist/gateway/static/root/assets/{note-detail-page-WLM6FUIi.js → note-detail-page-24J4mVP-.js} +3 -3
  35. package/dist/gateway/static/root/assets/{note-time-EFyIVhec.js → note-time-JBszYV3s.js} +1 -1
  36. package/dist/gateway/static/root/assets/{notes-page-BYPVYcYn.js → notes-page-BApAirFB.js} +1 -1
  37. package/dist/gateway/static/root/assets/sessions-page-DX9huWsA.js +1 -0
  38. package/dist/gateway/static/root/assets/{settings-advanced-gate-CEs8pGh6.js → settings-advanced-gate-DWvhsTuz.js} +1 -1
  39. package/dist/gateway/static/root/assets/{settings-form-section-C6cGTVwK.js → settings-form-section-CxMjaMiy.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-4VmUTzQs.js +3 -0
  41. package/dist/gateway/static/root/assets/{share-preview-page-tnIfJ4K6.js → share-preview-page-IX0TJvRd.js} +1 -1
  42. package/dist/gateway/static/root/assets/skills-page-CGKGKfwe.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-BmlcxR2j.js} +1 -1
  46. package/dist/gateway/static/root/assets/voice-api-key-field-DaGm2N4J.js +1 -0
  47. package/dist/gateway/static/root/assets/{workflow-page.utils-DsEriMFW.js → workflow-page.utils-D0vsIGHD.js} +1 -1
  48. package/dist/gateway/static/root/assets/workflows-page-BFCrD3nw.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/heartbeat/service.js +1 -1
  192. package/dist/src/gateway/hono/app.js +4 -1
  193. package/dist/src/gateway/hono/app.js.map +1 -1
  194. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  195. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  196. package/dist/src/gateway/hono/lib/route-logger.d.ts +6 -0
  197. package/dist/src/gateway/hono/lib/route-logger.js +31 -0
  198. package/dist/src/gateway/hono/lib/route-logger.js.map +1 -0
  199. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  200. package/dist/src/gateway/hono/middleware/auth.js +16 -3
  201. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  202. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  203. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  204. package/dist/src/gateway/hono/middleware/route-errors.d.ts +5 -0
  205. package/dist/src/gateway/hono/middleware/route-errors.js +27 -0
  206. package/dist/src/gateway/hono/middleware/route-errors.js.map +1 -0
  207. package/dist/src/gateway/hono/oauth.js +1 -1
  208. package/dist/src/gateway/hono/routes/agent-stream.js +6 -0
  209. package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
  210. package/dist/src/gateway/hono/routes/agents.js +1 -1
  211. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  212. package/dist/src/gateway/hono/routes/browser-install.js +2 -4
  213. package/dist/src/gateway/hono/routes/browser-install.js.map +1 -1
  214. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  215. package/dist/src/gateway/hono/routes/config.js +25 -11
  216. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  217. package/dist/src/gateway/hono/routes/cron.js +5 -0
  218. package/dist/src/gateway/hono/routes/cron.js.map +1 -1
  219. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  220. package/dist/src/gateway/hono/routes/host-fs.js +4 -6
  221. package/dist/src/gateway/hono/routes/host-fs.js.map +1 -1
  222. package/dist/src/gateway/hono/routes/lazy-bundles.js +14 -1
  223. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  224. package/dist/src/gateway/hono/routes/lazy-fallback.js +3 -0
  225. package/dist/src/gateway/hono/routes/lazy-fallback.js.map +1 -1
  226. package/dist/src/gateway/hono/routes/logs.js +39 -7
  227. package/dist/src/gateway/hono/routes/logs.js.map +1 -1
  228. package/dist/src/gateway/hono/routes/mcp.d.ts +3 -0
  229. package/dist/src/gateway/hono/routes/mcp.js +107 -0
  230. package/dist/src/gateway/hono/routes/mcp.js.map +1 -0
  231. package/dist/src/gateway/hono/routes/models.js +1 -1
  232. package/dist/src/gateway/hono/routes/sessions.js +6 -0
  233. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  234. package/dist/src/gateway/hono/routes/shares.js +1 -1
  235. package/dist/src/gateway/hono/routes/update.js +2 -4
  236. package/dist/src/gateway/hono/routes/update.js.map +1 -1
  237. package/dist/src/gateway/hono/routes/voice.js +2 -4
  238. package/dist/src/gateway/hono/routes/voice.js.map +1 -1
  239. package/dist/src/gateway/hono/routes/workspace.js +4 -6
  240. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  241. package/dist/src/gateway/hono/sse.js +9 -2
  242. package/dist/src/gateway/hono/sse.js.map +1 -1
  243. package/dist/src/gateway/lock.js +3 -3
  244. package/dist/src/gateway/ports.js +1 -1
  245. package/dist/src/gateway/service/agent-runner.js +3 -3
  246. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  247. package/dist/src/gateway/service/config-coordinator.js +14 -6
  248. package/dist/src/gateway/service/config-coordinator.js.map +1 -1
  249. package/dist/src/gateway/service/marketplace-service.js +3 -3
  250. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  251. package/dist/src/gateway/service/run-gateway-agent.js +22 -5
  252. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  253. package/dist/src/gateway/service/sse-hub.js +1 -1
  254. package/dist/src/gateway/service/sse-hub.js.map +1 -1
  255. package/dist/src/gateway/service.js +13 -6
  256. package/dist/src/gateway/service.js.map +1 -1
  257. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  258. package/dist/src/heartbeat/index.js +1 -1
  259. package/dist/src/infra/brew.js +1 -1
  260. package/dist/src/infra/package-json.js +1 -1
  261. package/dist/src/infra/package-update-steps.js +1 -1
  262. package/dist/src/infra/path-env.js +2 -2
  263. package/dist/src/infra/restart.js +2 -2
  264. package/dist/src/infra/stable-node-path.js +1 -1
  265. package/dist/src/infra/update-check.js +1 -1
  266. package/dist/src/infra/update-global.js +1 -1
  267. package/dist/src/infra/update-lock.js +3 -3
  268. package/dist/src/infra/update-runner.js +1 -1
  269. package/dist/src/infra/update-startup.js +2 -2
  270. package/dist/src/infra/write-file-atomic.js +2 -2
  271. package/dist/src/mcp/channel-bridge.js +26 -2
  272. package/dist/src/mcp/channel-bridge.js.map +1 -1
  273. package/dist/src/mcp/gateway-http-client.js +24 -2
  274. package/dist/src/mcp/gateway-http-client.js.map +1 -1
  275. package/dist/src/notes/store.js +2 -2
  276. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  277. package/dist/src/providers/index.js +2 -2
  278. package/dist/src/providers/model-registry.js +1 -1
  279. package/dist/src/session/config-store.js +12 -6
  280. package/dist/src/session/config-store.js.map +1 -1
  281. package/dist/src/session/index.d.ts +1 -1
  282. package/dist/src/session/index.js +2 -2
  283. package/dist/src/session/init-session-turn.js +2 -2
  284. package/dist/src/session/manager.js +8 -1
  285. package/dist/src/session/manager.js.map +1 -1
  286. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  287. package/dist/src/session/parity/sessions-json-file.js +1 -1
  288. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  289. package/dist/src/session/parity/transcript-paths.js +1 -1
  290. package/dist/src/session/resolve-session.js +4 -4
  291. package/dist/src/session/search-index-cache.js +1 -1
  292. package/dist/src/session/search-index.js +1 -1
  293. package/dist/src/session/session-title.d.ts +19 -3
  294. package/dist/src/session/session-title.js +84 -9
  295. package/dist/src/session/session-title.js.map +1 -1
  296. package/dist/src/session/store.js +6 -6
  297. package/dist/src/share/share-auto.js +2 -2
  298. package/dist/src/share/share-store.js +3 -3
  299. package/dist/src/share/share-thumbnail.js +2 -2
  300. package/dist/src/share/share-zip.js +1 -1
  301. package/dist/src/share/site-share-store.js +3 -3
  302. package/dist/src/share/site-static-serve.js +1 -1
  303. package/dist/src/tui/clipboard-image.js +3 -3
  304. package/dist/src/tui/theme-manager.js +1 -1
  305. package/dist/src/tui/tui-keybindings-file.js +1 -1
  306. package/dist/src/tui/tui-scoped-models.js +2 -2
  307. package/dist/src/tui/tui-settings.js +1 -1
  308. package/dist/src/tui/tui.js +3 -3
  309. package/dist/src/tunnel/frpc-binary.js +3 -3
  310. package/dist/src/tunnel/frpc-config.js +1 -1
  311. package/dist/src/tunnel/frpc-extract.js +1 -1
  312. package/dist/src/tunnel/tunnel-state.js +1 -1
  313. package/dist/src/utils/index.js +4 -4
  314. package/dist/src/utils/logger/audit.js +1 -1
  315. package/dist/src/utils/logger/config.js +2 -6
  316. package/dist/src/utils/logger/config.js.map +1 -1
  317. package/dist/src/utils/logger/context.d.ts +3 -22
  318. package/dist/src/utils/logger/context.js +4 -32
  319. package/dist/src/utils/logger/context.js.map +1 -1
  320. package/dist/src/utils/logger/index.d.ts +4 -7
  321. package/dist/src/utils/logger/index.js +9 -28
  322. package/dist/src/utils/logger/index.js.map +1 -1
  323. package/dist/src/utils/logger/log-store.d.ts +14 -32
  324. package/dist/src/utils/logger/log-store.js +68 -119
  325. package/dist/src/utils/logger/log-store.js.map +1 -1
  326. package/dist/src/utils/logger/log-stream.d.ts +5 -70
  327. package/dist/src/utils/logger/log-stream.js +67 -178
  328. package/dist/src/utils/logger/log-stream.js.map +1 -1
  329. package/dist/src/utils/logger/pino-record.d.ts +8 -0
  330. package/dist/src/utils/logger/pino-record.js +83 -0
  331. package/dist/src/utils/logger/pino-record.js.map +1 -0
  332. package/dist/src/utils/logger/rotation.js +1 -1
  333. package/dist/src/utils/logger/stats.d.ts +1 -1
  334. package/dist/src/utils/logger/stats.js +2 -2
  335. package/dist/src/utils/logger/stats.js.map +1 -1
  336. package/dist/src/utils/logger/streams.js +18 -0
  337. package/dist/src/utils/logger/streams.js.map +1 -1
  338. package/dist/src/utils/logger/types.d.ts +0 -9
  339. package/dist/src/utils/logger/types.js.map +1 -1
  340. package/dist/src/utils/logger.js +4 -4
  341. package/dist/src/voice/tts/audio.js +1 -1
  342. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  343. package/dist/src/workflows/store/event-store.js +1 -1
  344. package/dist/src/workflows/store/run-store.js +1 -1
  345. package/package.json +2 -1
  346. package/dist/gateway/static/root/assets/agents-C7tTJLP9.js +0 -222
  347. package/dist/gateway/static/root/assets/apps-page-BbzdMyrg.js +0 -1
  348. package/dist/gateway/static/root/assets/channels-settings-B49vG2hE.js +0 -1
  349. package/dist/gateway/static/root/assets/cron-page-Bjx7IOdR.js +0 -1
  350. package/dist/gateway/static/root/assets/index-CwDdudZM.css +0 -1
  351. package/dist/gateway/static/root/assets/logs-page-BxukQ-J-.js +0 -1
  352. package/dist/gateway/static/root/assets/sessions-page-BFD2_-Cl.js +0 -1
  353. package/dist/gateway/static/root/assets/settings-page-BiP5iH46.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,80 +1,15 @@
1
1
  /**
2
- * Log Streaming Module - SSE Real-time Log Delivery
3
- *
4
- * Provides Server-Sent Events (SSE) for real-time log streaming:
5
- * - Subscribe to log events
6
- * - Filter by level and module
7
- * - Automatic cleanup on disconnect
2
+ * Log Streaming Module - SSE real-time log delivery
8
3
  */
9
4
  import type { LogLevel, LogEntry } from './types.js';
10
5
  export type { LogLevel, LogEntry };
11
- export interface LogStreamOptions {
12
- minLevel?: LogLevel;
13
- module?: string;
14
- levels?: LogLevel[];
15
- }
16
- type LogSubscriber = (entry: LogEntry) => void;
17
- /**
18
- * Subscribe to log events
19
- *
20
- * @param subscriber - Callback function to receive log entries
21
- * @returns Unsubscribe function
22
- */
23
- declare function subscribeToLogs(subscriber: LogSubscriber): () => void;
24
- /**
25
- * Get number of active subscribers
26
- */
27
- declare function getSubscriberCount(): number;
28
- /**
29
- * Check if any subscribers are active
30
- */
31
- declare function hasSubscribers(): boolean;
32
- /**
33
- * Emit a log entry to all subscribers
34
- *
35
- * @internal - Called by the logger integration
36
- */
37
- declare function emitLogEntry(entry: LogEntry): void;
38
- /**
39
- * Create a log entry from raw data
40
- *
41
- * @internal
42
- */
43
- declare function createLogEntry(level: LogLevel, message: string, context?: Record<string, unknown>): LogEntry;
44
- /**
45
- * Create an SSE handler for log streaming
46
- *
47
- * Usage:
48
- * ```typescript
49
- * import { createLogStreamHandler } from './log-stream.js';
50
- *
51
- * app.get('/api/logs/stream', createLogStreamHandler());
52
- * ```
53
- */
54
- declare function createLogStreamHandler(): (req: Request) => Response;
55
- /**
56
- * Create a Hono-compatible SSE handler for log streaming
57
- *
58
- * Usage:
59
- * ```typescript
60
- * import { createLogSSEHandler } from './log-stream.js';
61
- *
62
- * app.get('/api/logs/stream', createLogSSEHandler());
63
- * ```
64
- */
6
+ export declare function hasSubscribers(): boolean;
7
+ /** @internal Called from Pino live emit stream */
8
+ export declare function emitLogEntry(entry: LogEntry): void;
9
+ /** Hono handler for `GET /api/logs/stream`. */
65
10
  export declare function createLogSSEHandler(): (c: {
66
11
  req: {
67
12
  raw: Request;
68
13
  url: string;
69
14
  };
70
15
  }) => Promise<Response>;
71
- declare const _default: {
72
- subscribeToLogs: typeof subscribeToLogs;
73
- getSubscriberCount: typeof getSubscriberCount;
74
- hasSubscribers: typeof hasSubscribers;
75
- emitLogEntry: typeof emitLogEntry;
76
- createLogEntry: typeof createLogEntry;
77
- createLogStreamHandler: typeof createLogStreamHandler;
78
- createLogSSEHandler: typeof createLogSSEHandler;
79
- };
80
- export default _default;
@@ -1,207 +1,96 @@
1
+ import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
1
2
  //#region src/utils/logger/log-stream.ts
2
- const subscribers = /* @__PURE__ */ new Set();
3
- Number.MAX_VALUE;
4
- /**
5
- * Subscribe to log events
6
- *
7
- * @param subscriber - Callback function to receive log entries
8
- * @returns Unsubscribe function
9
- */
10
3
  function subscribeToLogs(subscriber) {
11
4
  subscribers.add(subscriber);
12
5
  return () => subscribers.delete(subscriber);
13
6
  }
14
- /**
15
- * Get number of active subscribers
16
- */
17
7
  function getSubscriberCount() {
18
8
  return subscribers.size;
19
9
  }
20
- /**
21
- * Check if any subscribers are active
22
- */
23
10
  function hasSubscribers() {
24
11
  return subscribers.size > 0;
25
12
  }
26
- /**
27
- * Emit a log entry to all subscribers
28
- *
29
- * @internal - Called by the logger integration
30
- */
13
+ /** @internal Called from Pino live emit stream */
31
14
  function emitLogEntry(entry) {
32
15
  if (subscribers.size === 0) return;
33
16
  for (const subscriber of subscribers) try {
34
17
  subscriber(entry);
35
18
  } catch {}
36
19
  }
37
- /**
38
- * Create a log entry from raw data
39
- *
40
- * @internal
41
- */
42
- function createLogEntry(level, message, context) {
43
- return {
44
- timestamp: (/* @__PURE__ */ new Date()).toISOString(),
45
- level,
46
- message,
47
- ...context
48
- };
20
+ function parseAllowedLevels(levelsParam) {
21
+ if (!levelsParam) return [
22
+ "info",
23
+ "warn",
24
+ "error",
25
+ "fatal"
26
+ ];
27
+ return levelsParam.split(",").filter((l) => VALID_LEVELS.includes(l));
49
28
  }
50
- /**
51
- * Create an SSE handler for log streaming
52
- *
53
- * Usage:
54
- * ```typescript
55
- * import { createLogStreamHandler } from './log-stream.js';
56
- *
57
- * app.get('/api/logs/stream', createLogStreamHandler());
58
- * ```
59
- */
60
- function createLogStreamHandler() {
61
- return (req) => {
62
- const url = new URL(req.url);
63
- const levelsParam = url.searchParams.get("levels");
64
- const moduleFilter = url.searchParams.get("module");
65
- const validLevels = [
66
- "trace",
67
- "debug",
68
- "info",
69
- "warn",
70
- "error",
71
- "fatal",
72
- "silent"
73
- ];
74
- const allowedLevels = levelsParam ? levelsParam.split(",").filter((l) => validLevels.includes(l)) : [
75
- "info",
76
- "warn",
77
- "error",
78
- "fatal"
79
- ];
80
- const stream = new ReadableStream({ start(controller) {
81
- const encoder = new TextEncoder();
82
- const sendEvent = (data) => {
83
- const message = `data: ${JSON.stringify(data)}\n\n`;
84
- controller.enqueue(encoder.encode(message));
85
- };
86
- sendEvent({
87
- type: "connected",
88
- message: "Log stream started"
89
- });
90
- const unsubscribe = subscribeToLogs((entry) => {
91
- if (!allowedLevels.includes(entry.level)) return;
92
- if (moduleFilter && entry.module !== moduleFilter && entry.prefix !== moduleFilter) return;
93
- sendEvent(entry);
94
- });
95
- req.signal.addEventListener("abort", () => {
96
- unsubscribe();
97
- try {
98
- controller.close();
99
- } catch {}
100
- });
101
- const heartbeat = setInterval(() => {
102
- try {
103
- sendEvent({
104
- type: "heartbeat",
105
- subscribers: getSubscriberCount()
106
- });
107
- } catch {
108
- clearInterval(heartbeat);
109
- }
110
- }, 3e4);
111
- req.signal.addEventListener("abort", () => {
29
+ function createLogSseResponse(req, allowedLevels, moduleFilter) {
30
+ const stream = new ReadableStream({ start(controller) {
31
+ const encoder = new TextEncoder();
32
+ const sendEvent = (data) => {
33
+ const message = `data: ${JSON.stringify(data)}\n\n`;
34
+ controller.enqueue(encoder.encode(message));
35
+ };
36
+ sendEvent({
37
+ type: "connected",
38
+ message: "Log stream started"
39
+ });
40
+ const unsubscribe = subscribeToLogs((entry) => {
41
+ if (!allowedLevels.includes(entry.level)) return;
42
+ if (moduleFilter && entry.module !== moduleFilter) return;
43
+ sendEvent(entry);
44
+ });
45
+ const heartbeat = setInterval(() => {
46
+ try {
47
+ sendEvent({
48
+ type: "heartbeat",
49
+ subscribers: getSubscriberCount()
50
+ });
51
+ } catch {
112
52
  clearInterval(heartbeat);
113
- });
114
- } });
115
- return new Response(stream, { headers: {
116
- "Content-Type": "text/event-stream",
117
- "Cache-Control": "no-cache",
118
- "Connection": "keep-alive",
119
- "X-Accel-Buffering": "no"
120
- } });
121
- };
53
+ }
54
+ }, 3e4);
55
+ req.signal.addEventListener("abort", () => {
56
+ unsubscribe();
57
+ clearInterval(heartbeat);
58
+ try {
59
+ controller.close();
60
+ } catch {}
61
+ });
62
+ } });
63
+ return new Response(stream, { headers: {
64
+ "Content-Type": "text/event-stream",
65
+ "Cache-Control": "no-cache",
66
+ Connection: "keep-alive",
67
+ "X-Accel-Buffering": "no"
68
+ } });
122
69
  }
123
- /**
124
- * Create a Hono-compatible SSE handler for log streaming
125
- *
126
- * Usage:
127
- * ```typescript
128
- * import { createLogSSEHandler } from './log-stream.js';
129
- *
130
- * app.get('/api/logs/stream', createLogSSEHandler());
131
- * ```
132
- */
70
+ /** Hono handler for `GET /api/logs/stream`. */
133
71
  function createLogSSEHandler() {
134
72
  return async (c) => {
135
73
  const url = new URL(c.req.url);
136
- const levelsParam = url.searchParams.get("levels");
74
+ const allowedLevels = parseAllowedLevels(url.searchParams.get("levels"));
137
75
  const moduleFilter = url.searchParams.get("module");
138
- const validLevels = [
139
- "trace",
140
- "debug",
141
- "info",
142
- "warn",
143
- "error",
144
- "fatal",
145
- "silent"
146
- ];
147
- const allowedLevels = levelsParam ? levelsParam.split(",").filter((l) => validLevels.includes(l)) : [
148
- "info",
149
- "warn",
150
- "error",
151
- "fatal"
152
- ];
153
- const stream = new ReadableStream({ start(controller) {
154
- const encoder = new TextEncoder();
155
- const sendEvent = (data) => {
156
- const message = `data: ${JSON.stringify(data)}\n\n`;
157
- controller.enqueue(encoder.encode(message));
158
- };
159
- sendEvent({
160
- type: "connected",
161
- message: "Log stream started"
162
- });
163
- const unsubscribe = subscribeToLogs((entry) => {
164
- if (!allowedLevels.includes(entry.level)) return;
165
- if (moduleFilter && entry.module !== moduleFilter && entry.prefix !== moduleFilter) return;
166
- sendEvent(entry);
167
- });
168
- c.req.raw.signal.addEventListener("abort", () => {
169
- unsubscribe();
170
- try {
171
- controller.close();
172
- } catch {}
173
- });
174
- const heartbeat = setInterval(() => {
175
- try {
176
- sendEvent({
177
- type: "heartbeat",
178
- subscribers: getSubscriberCount()
179
- });
180
- } catch {
181
- clearInterval(heartbeat);
182
- }
183
- }, 3e4);
184
- c.req.raw.signal.addEventListener("abort", () => {
185
- clearInterval(heartbeat);
186
- });
187
- } });
188
- return new Response(stream, { headers: {
189
- "Content-Type": "text/event-stream",
190
- "Cache-Control": "no-cache",
191
- "Connection": "keep-alive"
192
- } });
76
+ return createLogSseResponse(c.req.raw, allowedLevels, moduleFilter);
193
77
  };
194
78
  }
195
- var log_stream_default = {
196
- subscribeToLogs,
197
- getSubscriberCount,
198
- hasSubscribers,
199
- emitLogEntry,
200
- createLogEntry,
201
- createLogStreamHandler,
202
- createLogSSEHandler
203
- };
79
+ var subscribers, VALID_LEVELS;
80
+ var init_log_stream = __esmMin((() => {
81
+ subscribers = /* @__PURE__ */ new Set();
82
+ VALID_LEVELS = [
83
+ "trace",
84
+ "debug",
85
+ "info",
86
+ "warn",
87
+ "error",
88
+ "fatal",
89
+ "silent"
90
+ ];
91
+ }));
204
92
  //#endregion
205
- export { createLogSSEHandler, log_stream_default as default };
93
+ init_log_stream();
94
+ export { createLogSSEHandler, emitLogEntry, hasSubscribers, init_log_stream };
206
95
 
207
96
  //# sourceMappingURL=log-stream.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"log-stream.js","names":[],"sources":["../../../../src/utils/logger/log-stream.ts"],"sourcesContent":["/**\n * Log Streaming Module - SSE Real-time Log Delivery\n * \n * Provides Server-Sent Events (SSE) for real-time log streaming:\n * - Subscribe to log events\n * - Filter by level and module\n * - Automatic cleanup on disconnect\n */\n\nimport type { LogLevel, LogEntry } from './types.js';\nexport type { LogLevel, LogEntry };\n\nexport interface LogStreamOptions {\n minLevel?: LogLevel;\n module?: string;\n levels?: LogLevel[];\n}\n\n// =============================================================================\n// Internal State\n// =============================================================================\n\ntype LogSubscriber = (entry: LogEntry) => void;\nconst subscribers = new Set<LogSubscriber>();\n\n// Log level numeric values for comparison (reserved for future use)\nconst _LOG_LEVELS: Record<LogLevel, number> = {\n trace: 10,\n debug: 20,\n info: 30,\n warn: 40,\n error: 50,\n fatal: 60,\n silent: Number.MAX_VALUE,\n};\n\n// =============================================================================\n// Public API\n// =============================================================================\n\n/**\n * Subscribe to log events\n * \n * @param subscriber - Callback function to receive log entries\n * @returns Unsubscribe function\n */\nfunction subscribeToLogs(subscriber: LogSubscriber): () => void {\n subscribers.add(subscriber);\n return () => subscribers.delete(subscriber);\n}\n\n/**\n * Get number of active subscribers\n */\nfunction getSubscriberCount(): number {\n return subscribers.size;\n}\n\n/**\n * Check if any subscribers are active\n */\nfunction hasSubscribers(): boolean {\n return subscribers.size > 0;\n}\n\n/**\n * Emit a log entry to all subscribers\n * \n * @internal - Called by the logger integration\n */\nfunction emitLogEntry(entry: LogEntry): void {\n if (subscribers.size === 0) return;\n \n for (const subscriber of subscribers) {\n try {\n subscriber(entry);\n } catch {\n // Ignore subscriber errors\n }\n }\n}\n\n/**\n * Create a log entry from raw data\n * \n * @internal\n */\nfunction createLogEntry(\n level: LogLevel,\n message: string,\n context?: Record<string, unknown>\n): LogEntry {\n return {\n timestamp: new Date().toISOString(),\n level,\n message,\n ...context,\n };\n}\n\n// =============================================================================\n// HTTP SSE Handler\n// =============================================================================\n\n/**\n * Create an SSE handler for log streaming\n * \n * Usage:\n * ```typescript\n * import { createLogStreamHandler } from './log-stream.js';\n * \n * app.get('/api/logs/stream', createLogStreamHandler());\n * ```\n */\nfunction createLogStreamHandler() {\n return (req: Request): Response => {\n const url = new URL(req.url);\n const levelsParam = url.searchParams.get('levels');\n const moduleFilter = url.searchParams.get('module');\n \n // Parse levels\n const validLevels: LogLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'];\n const allowedLevels: LogLevel[] = levelsParam \n ? levelsParam.split(',').filter((l): l is LogLevel => validLevels.includes(l as LogLevel))\n : ['info', 'warn', 'error', 'fatal'];\n \n const stream = new ReadableStream({\n start(controller) {\n const encoder = new TextEncoder();\n \n const sendEvent = (data: unknown) => {\n const message = `data: ${JSON.stringify(data)}\\n\\n`;\n controller.enqueue(encoder.encode(message));\n };\n\n // Send connection message\n sendEvent({ type: 'connected', message: 'Log stream started' });\n\n // Subscribe to logs\n const unsubscribe = subscribeToLogs((entry) => {\n // Filter by level\n if (!allowedLevels.includes(entry.level)) return;\n \n // Filter by module\n if (moduleFilter && entry.module !== moduleFilter && entry.prefix !== moduleFilter) return;\n \n sendEvent(entry);\n });\n\n // Handle disconnect\n req.signal.addEventListener('abort', () => {\n unsubscribe();\n try {\n controller.close();\n } catch {\n // Already closed\n }\n });\n\n // Send heartbeat every 30 seconds\n const heartbeat = setInterval(() => {\n try {\n sendEvent({ type: 'heartbeat', subscribers: getSubscriberCount() });\n } catch {\n clearInterval(heartbeat);\n }\n }, 30000);\n\n req.signal.addEventListener('abort', () => {\n clearInterval(heartbeat);\n });\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n };\n}\n\n// =============================================================================\n// Utility: Create SSE handler compatible with Hono\n// =============================================================================\n\n/**\n * Create a Hono-compatible SSE handler for log streaming\n * \n * Usage:\n * ```typescript\n * import { createLogSSEHandler } from './log-stream.js';\n * \n * app.get('/api/logs/stream', createLogSSEHandler());\n * ```\n */\nexport function createLogSSEHandler(): (c: { req: { raw: Request; url: string } }) => Promise<Response> {\n return async (c: { req: { raw: Request; url: string } }) => {\n const url = new URL(c.req.url);\n const levelsParam = url.searchParams.get('levels');\n const moduleFilter = url.searchParams.get('module');\n \n const validLevels: LogLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'];\n const allowedLevels: LogLevel[] = levelsParam\n ? levelsParam.split(',').filter((l): l is LogLevel => validLevels.includes(l as LogLevel))\n : ['info', 'warn', 'error', 'fatal'];\n \n const stream = new ReadableStream({\n start(controller) {\n const encoder = new TextEncoder();\n \n const sendEvent = (data: unknown) => {\n const message = `data: ${JSON.stringify(data)}\\n\\n`;\n controller.enqueue(encoder.encode(message));\n };\n\n // Send connection message\n sendEvent({ type: 'connected', message: 'Log stream started' });\n\n // Subscribe to logs\n const unsubscribe = subscribeToLogs((entry) => {\n if (!allowedLevels.includes(entry.level)) return;\n if (moduleFilter && entry.module !== moduleFilter && entry.prefix !== moduleFilter) return;\n \n sendEvent(entry);\n });\n\n // Handle disconnect\n c.req.raw.signal.addEventListener('abort', () => {\n unsubscribe();\n try {\n controller.close();\n } catch {\n // Already closed\n }\n });\n\n // Heartbeat\n const heartbeat = setInterval(() => {\n try {\n sendEvent({ type: 'heartbeat', subscribers: getSubscriberCount() });\n } catch {\n clearInterval(heartbeat);\n }\n }, 30000);\n\n c.req.raw.signal.addEventListener('abort', () => {\n clearInterval(heartbeat);\n });\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n },\n });\n };\n}\n\nexport default {\n subscribeToLogs,\n getSubscriberCount,\n hasSubscribers,\n emitLogEntry,\n createLogEntry,\n createLogStreamHandler,\n createLogSSEHandler,\n};\n"],"mappings":";AAuBA,MAAM,8BAAc,IAAI,KAAoB;AAUlC,OAAO;;;;;;;AAajB,SAAS,gBAAgB,YAAuC;AAC9D,aAAY,IAAI,WAAW;AAC3B,cAAa,YAAY,OAAO,WAAW;;;;;AAM7C,SAAS,qBAA6B;AACpC,QAAO,YAAY;;;;;AAMrB,SAAS,iBAA0B;AACjC,QAAO,YAAY,OAAO;;;;;;;AAQ5B,SAAS,aAAa,OAAuB;AAC3C,KAAI,YAAY,SAAS,EAAG;AAE5B,MAAK,MAAM,cAAc,YACvB,KAAI;AACF,aAAW,MAAM;SACX;;;;;;;AAWZ,SAAS,eACP,OACA,SACA,SACU;AACV,QAAO;EACL,4BAAW,IAAI,MAAM,EAAC,aAAa;EACnC;EACA;EACA,GAAG;EACJ;;;;;;;;;;;;AAiBH,SAAS,yBAAyB;AAChC,SAAQ,QAA2B;EACjC,MAAM,MAAM,IAAI,IAAI,IAAI,IAAI;EAC5B,MAAM,cAAc,IAAI,aAAa,IAAI,SAAS;EAClD,MAAM,eAAe,IAAI,aAAa,IAAI,SAAS;EAGnD,MAAM,cAA0B;GAAC;GAAS;GAAS;GAAQ;GAAQ;GAAS;GAAS;GAAS;EAC9F,MAAM,gBAA4B,cAC9B,YAAY,MAAM,IAAI,CAAC,QAAQ,MAAqB,YAAY,SAAS,EAAc,CAAC,GACxF;GAAC;GAAQ;GAAQ;GAAS;GAAQ;EAEtC,MAAM,SAAS,IAAI,eAAe,EAChC,MAAM,YAAY;GAChB,MAAM,UAAU,IAAI,aAAa;GAEjC,MAAM,aAAa,SAAkB;IACnC,MAAM,UAAU,SAAS,KAAK,UAAU,KAAK,CAAC;AAC9C,eAAW,QAAQ,QAAQ,OAAO,QAAQ,CAAC;;AAI7C,aAAU;IAAE,MAAM;IAAa,SAAS;IAAsB,CAAC;GAG/D,MAAM,cAAc,iBAAiB,UAAU;AAE7C,QAAI,CAAC,cAAc,SAAS,MAAM,MAAM,CAAE;AAG1C,QAAI,gBAAgB,MAAM,WAAW,gBAAgB,MAAM,WAAW,aAAc;AAEpF,cAAU,MAAM;KAChB;AAGF,OAAI,OAAO,iBAAiB,eAAe;AACzC,iBAAa;AACb,QAAI;AACF,gBAAW,OAAO;YACZ;KAGR;GAGF,MAAM,YAAY,kBAAkB;AAClC,QAAI;AACF,eAAU;MAAE,MAAM;MAAa,aAAa,oBAAoB;MAAE,CAAC;YAC7D;AACN,mBAAc,UAAU;;MAEzB,IAAM;AAET,OAAI,OAAO,iBAAiB,eAAe;AACzC,kBAAc,UAAU;KACxB;KAEL,CAAC;AAEF,SAAO,IAAI,SAAS,QAAQ,EAC1B,SAAS;GACP,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACd,qBAAqB;GACtB,EACF,CAAC;;;;;;;;;;;;;AAkBN,SAAgB,sBAAwF;AACtG,QAAO,OAAO,MAA8C;EAC1D,MAAM,MAAM,IAAI,IAAI,EAAE,IAAI,IAAI;EAC9B,MAAM,cAAc,IAAI,aAAa,IAAI,SAAS;EAClD,MAAM,eAAe,IAAI,aAAa,IAAI,SAAS;EAEnD,MAAM,cAA0B;GAAC;GAAS;GAAS;GAAQ;GAAQ;GAAS;GAAS;GAAS;EAC9F,MAAM,gBAA4B,cAC9B,YAAY,MAAM,IAAI,CAAC,QAAQ,MAAqB,YAAY,SAAS,EAAc,CAAC,GACxF;GAAC;GAAQ;GAAQ;GAAS;GAAQ;EAEtC,MAAM,SAAS,IAAI,eAAe,EAChC,MAAM,YAAY;GAChB,MAAM,UAAU,IAAI,aAAa;GAEjC,MAAM,aAAa,SAAkB;IACnC,MAAM,UAAU,SAAS,KAAK,UAAU,KAAK,CAAC;AAC9C,eAAW,QAAQ,QAAQ,OAAO,QAAQ,CAAC;;AAI7C,aAAU;IAAE,MAAM;IAAa,SAAS;IAAsB,CAAC;GAG/D,MAAM,cAAc,iBAAiB,UAAU;AAC7C,QAAI,CAAC,cAAc,SAAS,MAAM,MAAM,CAAE;AAC1C,QAAI,gBAAgB,MAAM,WAAW,gBAAgB,MAAM,WAAW,aAAc;AAEpF,cAAU,MAAM;KAChB;AAGF,KAAE,IAAI,IAAI,OAAO,iBAAiB,eAAe;AAC/C,iBAAa;AACb,QAAI;AACF,gBAAW,OAAO;YACZ;KAGR;GAGF,MAAM,YAAY,kBAAkB;AAClC,QAAI;AACF,eAAU;MAAE,MAAM;MAAa,aAAa,oBAAoB;MAAE,CAAC;YAC7D;AACN,mBAAc,UAAU;;MAEzB,IAAM;AAET,KAAE,IAAI,IAAI,OAAO,iBAAiB,eAAe;AAC/C,kBAAc,UAAU;KACxB;KAEL,CAAC;AAEF,SAAO,IAAI,SAAS,QAAQ,EAC1B,SAAS;GACP,gBAAgB;GAChB,iBAAiB;GACjB,cAAc;GACf,EACF,CAAC;;;AAIN,IAAA,qBAAe;CACb;CACA;CACA;CACA;CACA;CACA;CACA;CACD"}
1
+ {"version":3,"file":"log-stream.js","names":[],"sources":["../../../../src/utils/logger/log-stream.ts"],"sourcesContent":["/**\n * Log Streaming Module - SSE real-time log delivery\n */\n\nimport type { LogLevel, LogEntry } from './types.js';\nexport type { LogLevel, LogEntry };\n\ntype LogSubscriber = (entry: LogEntry) => void;\nconst subscribers = new Set<LogSubscriber>();\n\nconst VALID_LEVELS: LogLevel[] = ['trace', 'debug', 'info', 'warn', 'error', 'fatal', 'silent'];\n\nfunction subscribeToLogs(subscriber: LogSubscriber): () => void {\n subscribers.add(subscriber);\n return () => subscribers.delete(subscriber);\n}\n\nfunction getSubscriberCount(): number {\n return subscribers.size;\n}\n\nexport function hasSubscribers(): boolean {\n return subscribers.size > 0;\n}\n\n/** @internal Called from Pino live emit stream */\nexport function emitLogEntry(entry: LogEntry): void {\n if (subscribers.size === 0) return;\n\n for (const subscriber of subscribers) {\n try {\n subscriber(entry);\n } catch {\n /* ignore subscriber errors */\n }\n }\n}\n\nfunction parseAllowedLevels(levelsParam: string | null): LogLevel[] {\n if (!levelsParam) {\n return ['info', 'warn', 'error', 'fatal'];\n }\n return levelsParam\n .split(',')\n .filter((l): l is LogLevel => VALID_LEVELS.includes(l as LogLevel));\n}\n\nfunction createLogSseResponse(req: Request, allowedLevels: LogLevel[], moduleFilter: string | null): Response {\n const stream = new ReadableStream({\n start(controller) {\n const encoder = new TextEncoder();\n\n const sendEvent = (data: unknown) => {\n const message = `data: ${JSON.stringify(data)}\\n\\n`;\n controller.enqueue(encoder.encode(message));\n };\n\n sendEvent({ type: 'connected', message: 'Log stream started' });\n\n const unsubscribe = subscribeToLogs((entry) => {\n if (!allowedLevels.includes(entry.level)) return;\n if (moduleFilter && entry.module !== moduleFilter) return;\n sendEvent(entry);\n });\n\n const heartbeat = setInterval(() => {\n try {\n sendEvent({ type: 'heartbeat', subscribers: getSubscriberCount() });\n } catch {\n clearInterval(heartbeat);\n }\n }, 30000);\n\n req.signal.addEventListener('abort', () => {\n unsubscribe();\n clearInterval(heartbeat);\n try {\n controller.close();\n } catch {\n /* already closed */\n }\n });\n },\n });\n\n return new Response(stream, {\n headers: {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n Connection: 'keep-alive',\n 'X-Accel-Buffering': 'no',\n },\n });\n}\n\n/** Hono handler for `GET /api/logs/stream`. */\nexport function createLogSSEHandler(): (c: { req: { raw: Request; url: string } }) => Promise<Response> {\n return async (c) => {\n const url = new URL(c.req.url);\n const allowedLevels = parseAllowedLevels(url.searchParams.get('levels'));\n const moduleFilter = url.searchParams.get('module');\n return createLogSseResponse(c.req.raw, allowedLevels, moduleFilter);\n };\n}\n"],"mappings":";;AAYA,SAAS,gBAAgB,YAAuC;AAC9D,aAAY,IAAI,WAAW;AAC3B,cAAa,YAAY,OAAO,WAAW;;AAG7C,SAAS,qBAA6B;AACpC,QAAO,YAAY;;AAGrB,SAAgB,iBAA0B;AACxC,QAAO,YAAY,OAAO;;;AAI5B,SAAgB,aAAa,OAAuB;AAClD,KAAI,YAAY,SAAS,EAAG;AAE5B,MAAK,MAAM,cAAc,YACvB,KAAI;AACF,aAAW,MAAM;SACX;;AAMZ,SAAS,mBAAmB,aAAwC;AAClE,KAAI,CAAC,YACH,QAAO;EAAC;EAAQ;EAAQ;EAAS;EAAQ;AAE3C,QAAO,YACJ,MAAM,IAAI,CACV,QAAQ,MAAqB,aAAa,SAAS,EAAc,CAAC;;AAGvE,SAAS,qBAAqB,KAAc,eAA2B,cAAuC;CAC5G,MAAM,SAAS,IAAI,eAAe,EAChC,MAAM,YAAY;EAChB,MAAM,UAAU,IAAI,aAAa;EAEjC,MAAM,aAAa,SAAkB;GACnC,MAAM,UAAU,SAAS,KAAK,UAAU,KAAK,CAAC;AAC9C,cAAW,QAAQ,QAAQ,OAAO,QAAQ,CAAC;;AAG7C,YAAU;GAAE,MAAM;GAAa,SAAS;GAAsB,CAAC;EAE/D,MAAM,cAAc,iBAAiB,UAAU;AAC7C,OAAI,CAAC,cAAc,SAAS,MAAM,MAAM,CAAE;AAC1C,OAAI,gBAAgB,MAAM,WAAW,aAAc;AACnD,aAAU,MAAM;IAChB;EAEF,MAAM,YAAY,kBAAkB;AAClC,OAAI;AACF,cAAU;KAAE,MAAM;KAAa,aAAa,oBAAoB;KAAE,CAAC;WAC7D;AACN,kBAAc,UAAU;;KAEzB,IAAM;AAET,MAAI,OAAO,iBAAiB,eAAe;AACzC,gBAAa;AACb,iBAAc,UAAU;AACxB,OAAI;AACF,eAAW,OAAO;WACZ;IAGR;IAEL,CAAC;AAEF,QAAO,IAAI,SAAS,QAAQ,EAC1B,SAAS;EACP,gBAAgB;EAChB,iBAAiB;EACjB,YAAY;EACZ,qBAAqB;EACtB,EACF,CAAC;;;AAIJ,SAAgB,sBAAwF;AACtG,QAAO,OAAO,MAAM;EAClB,MAAM,MAAM,IAAI,IAAI,EAAE,IAAI,IAAI;EAC9B,MAAM,gBAAgB,mBAAmB,IAAI,aAAa,IAAI,SAAS,CAAC;EACxE,MAAM,eAAe,IAAI,aAAa,IAAI,SAAS;AACnD,SAAO,qBAAqB,EAAE,IAAI,KAAK,eAAe,aAAa;;;;;AA7FjE,+BAAc,IAAI,KAAoB;AAEtC,gBAA2B;EAAC;EAAS;EAAS;EAAQ;EAAQ;EAAS;EAAS;EAAS"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Shared Pino JSON record → LogEntry conversion for file query and live SSE.
3
+ */
4
+ import type { LogEntry } from './types.js';
5
+ /** Convert a parsed Pino JSON object into a normalized LogEntry. */
6
+ export declare function pinoRecordToLogEntry(parsed: Record<string, unknown>): LogEntry;
7
+ /** Build searchable text from a log entry (query + client-side filter). */
8
+ export declare function logEntrySearchText(entry: LogEntry): string;
@@ -0,0 +1,83 @@
1
+ import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
+ //#region src/utils/logger/pino-record.ts
3
+ function resolveLevel(parsed) {
4
+ if (typeof parsed.level !== "string") return "info";
5
+ const lv = parsed.level.toLowerCase();
6
+ return VALID_LEVELS.has(lv) ? lv : "info";
7
+ }
8
+ /** Convert a parsed Pino JSON object into a normalized LogEntry. */
9
+ function pinoRecordToLogEntry(parsed) {
10
+ const reserved = new Set([
11
+ "time",
12
+ "level",
13
+ "msg",
14
+ "pid",
15
+ "host",
16
+ "service",
17
+ "version",
18
+ "module",
19
+ "extension",
20
+ "requestId",
21
+ "sessionId",
22
+ "userId",
23
+ "correlationId"
24
+ ]);
25
+ const meta = {};
26
+ for (const [key, value] of Object.entries(parsed)) if (!reserved.has(key)) meta[key] = value;
27
+ const entry = {
28
+ timestamp: String(parsed.time ?? (/* @__PURE__ */ new Date()).toISOString()),
29
+ level: resolveLevel(parsed),
30
+ message: String(parsed.msg ?? ""),
31
+ module: typeof parsed.module === "string" ? parsed.module : void 0,
32
+ service: typeof parsed.service === "string" ? parsed.service : void 0,
33
+ extension: typeof parsed.extension === "string" ? parsed.extension : void 0,
34
+ requestId: typeof parsed.requestId === "string" ? parsed.requestId : void 0,
35
+ sessionId: typeof parsed.sessionId === "string" ? parsed.sessionId : void 0,
36
+ userId: typeof parsed.userId === "string" ? parsed.userId : void 0,
37
+ correlationId: typeof parsed.correlationId === "string" ? parsed.correlationId : void 0
38
+ };
39
+ if (Object.keys(meta).length > 0) entry.meta = meta;
40
+ return entry;
41
+ }
42
+ /** Build searchable text from a log entry (query + client-side filter). */
43
+ function logEntrySearchText(entry) {
44
+ const parts = [
45
+ entry.message,
46
+ entry.module,
47
+ entry.service,
48
+ entry.extension,
49
+ entry.requestId,
50
+ entry.sessionId,
51
+ typeof entry.phase === "string" ? entry.phase : void 0,
52
+ typeof entry.errorMessage === "string" ? entry.errorMessage : void 0
53
+ ];
54
+ const meta = entry.meta && typeof entry.meta === "object" ? entry.meta : void 0;
55
+ const err = entry.err ?? meta?.err;
56
+ if (err && typeof err === "object" && err !== null) {
57
+ const e = err;
58
+ if (typeof e.message === "string") parts.push(e.message);
59
+ if (typeof e.name === "string") parts.push(e.name);
60
+ if (typeof e.stack === "string") parts.push(e.stack);
61
+ }
62
+ if (entry.meta && typeof entry.meta === "object") for (const [key, value] of Object.entries(entry.meta)) {
63
+ if (key === "err") continue;
64
+ if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") parts.push(String(value));
65
+ }
66
+ return parts.filter(Boolean).map(String).join(" ").toLowerCase();
67
+ }
68
+ var VALID_LEVELS;
69
+ var init_pino_record = __esmMin((() => {
70
+ VALID_LEVELS = new Set([
71
+ "trace",
72
+ "debug",
73
+ "info",
74
+ "warn",
75
+ "error",
76
+ "fatal"
77
+ ]);
78
+ }));
79
+ //#endregion
80
+ init_pino_record();
81
+ export { init_pino_record, logEntrySearchText, pinoRecordToLogEntry };
82
+
83
+ //# sourceMappingURL=pino-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pino-record.js","names":[],"sources":["../../../../src/utils/logger/pino-record.ts"],"sourcesContent":["/**\n * Shared Pino JSON record → LogEntry conversion for file query and live SSE.\n */\n\nimport type { LogEntry, LogLevel } from './types.js';\n\nconst VALID_LEVELS = new Set<LogLevel>(['trace', 'debug', 'info', 'warn', 'error', 'fatal']);\n\nfunction resolveLevel(parsed: Record<string, unknown>): LogLevel {\n if (typeof parsed.level !== 'string') {\n return 'info';\n }\n const lv = parsed.level.toLowerCase() as LogLevel;\n return VALID_LEVELS.has(lv) ? lv : 'info';\n}\n\n/** Convert a parsed Pino JSON object into a normalized LogEntry. */\nexport function pinoRecordToLogEntry(parsed: Record<string, unknown>): LogEntry {\n const reserved = new Set([\n 'time',\n 'level',\n 'msg',\n 'pid',\n 'host',\n 'service',\n 'version',\n 'module',\n 'extension',\n 'requestId',\n 'sessionId',\n 'userId',\n 'correlationId',\n ]);\n\n const meta: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(parsed)) {\n if (!reserved.has(key)) {\n meta[key] = value;\n }\n }\n\n const entry: LogEntry = {\n timestamp: String(parsed.time ?? new Date().toISOString()),\n level: resolveLevel(parsed),\n message: String(parsed.msg ?? ''),\n module: typeof parsed.module === 'string' ? parsed.module : undefined,\n service: typeof parsed.service === 'string' ? parsed.service : undefined,\n extension: typeof parsed.extension === 'string' ? parsed.extension : undefined,\n requestId: typeof parsed.requestId === 'string' ? parsed.requestId : undefined,\n sessionId: typeof parsed.sessionId === 'string' ? parsed.sessionId : undefined,\n userId: typeof parsed.userId === 'string' ? parsed.userId : undefined,\n correlationId: typeof parsed.correlationId === 'string' ? parsed.correlationId : undefined,\n };\n\n if (Object.keys(meta).length > 0) {\n entry.meta = meta;\n }\n\n return entry;\n}\n\n/** Build searchable text from a log entry (query + client-side filter). */\nexport function logEntrySearchText(entry: LogEntry): string {\n const parts: string[] = [\n entry.message,\n entry.module,\n entry.service,\n entry.extension,\n entry.requestId,\n entry.sessionId,\n typeof entry.phase === 'string' ? entry.phase : undefined,\n typeof entry.errorMessage === 'string' ? entry.errorMessage : undefined,\n ];\n\n const meta =\n entry.meta && typeof entry.meta === 'object'\n ? (entry.meta as Record<string, unknown>)\n : undefined;\n const err = entry.err ?? meta?.err;\n if (err && typeof err === 'object' && err !== null) {\n const e = err as Record<string, unknown>;\n if (typeof e.message === 'string') parts.push(e.message);\n if (typeof e.name === 'string') parts.push(e.name);\n if (typeof e.stack === 'string') parts.push(e.stack);\n }\n\n if (entry.meta && typeof entry.meta === 'object') {\n for (const [key, value] of Object.entries(entry.meta)) {\n if (key === 'err') continue;\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n parts.push(String(value));\n }\n }\n }\n\n return parts.filter(Boolean).map(String).join(' ').toLowerCase();\n}\n"],"mappings":";;AAQA,SAAS,aAAa,QAA2C;AAC/D,KAAI,OAAO,OAAO,UAAU,SAC1B,QAAO;CAET,MAAM,KAAK,OAAO,MAAM,aAAa;AACrC,QAAO,aAAa,IAAI,GAAG,GAAG,KAAK;;;AAIrC,SAAgB,qBAAqB,QAA2C;CAC9E,MAAM,WAAW,IAAI,IAAI;EACvB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACD,CAAC;CAEF,MAAM,OAAgC,EAAE;AACxC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,CAC/C,KAAI,CAAC,SAAS,IAAI,IAAI,CACpB,MAAK,OAAO;CAIhB,MAAM,QAAkB;EACtB,WAAW,OAAO,OAAO,yBAAQ,IAAI,MAAM,EAAC,aAAa,CAAC;EAC1D,OAAO,aAAa,OAAO;EAC3B,SAAS,OAAO,OAAO,OAAO,GAAG;EACjC,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,KAAA;EAC5D,SAAS,OAAO,OAAO,YAAY,WAAW,OAAO,UAAU,KAAA;EAC/D,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAA;EACrE,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAA;EACrE,WAAW,OAAO,OAAO,cAAc,WAAW,OAAO,YAAY,KAAA;EACrE,QAAQ,OAAO,OAAO,WAAW,WAAW,OAAO,SAAS,KAAA;EAC5D,eAAe,OAAO,OAAO,kBAAkB,WAAW,OAAO,gBAAgB,KAAA;EAClF;AAED,KAAI,OAAO,KAAK,KAAK,CAAC,SAAS,EAC7B,OAAM,OAAO;AAGf,QAAO;;;AAIT,SAAgB,mBAAmB,OAAyB;CAC1D,MAAM,QAAkB;EACtB,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,MAAM;EACN,OAAO,MAAM,UAAU,WAAW,MAAM,QAAQ,KAAA;EAChD,OAAO,MAAM,iBAAiB,WAAW,MAAM,eAAe,KAAA;EAC/D;CAED,MAAM,OACJ,MAAM,QAAQ,OAAO,MAAM,SAAS,WAC/B,MAAM,OACP,KAAA;CACN,MAAM,MAAM,MAAM,OAAO,MAAM;AAC/B,KAAI,OAAO,OAAO,QAAQ,YAAY,QAAQ,MAAM;EAClD,MAAM,IAAI;AACV,MAAI,OAAO,EAAE,YAAY,SAAU,OAAM,KAAK,EAAE,QAAQ;AACxD,MAAI,OAAO,EAAE,SAAS,SAAU,OAAM,KAAK,EAAE,KAAK;AAClD,MAAI,OAAO,EAAE,UAAU,SAAU,OAAM,KAAK,EAAE,MAAM;;AAGtD,KAAI,MAAM,QAAQ,OAAO,MAAM,SAAS,SACtC,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,KAAK,EAAE;AACrD,MAAI,QAAQ,MAAO;AACnB,MAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,UAC7E,OAAM,KAAK,OAAO,MAAM,CAAC;;AAK/B,QAAO,MAAM,OAAO,QAAQ,CAAC,IAAI,OAAO,CAAC,KAAK,IAAI,CAAC,aAAa;;;;AAzF5D,gBAAe,IAAI,IAAc;EAAC;EAAS;EAAS;EAAQ;EAAQ;EAAS;EAAQ,CAAC"}
@@ -1,8 +1,8 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
2
  import { config, getLogDir, init_config } from "./config.js";
3
- import { writeFile } from "fs/promises";
4
3
  import { join } from "path";
5
4
  import { readFileSync, readdirSync, statSync, unlinkSync } from "fs";
5
+ import { writeFile } from "fs/promises";
6
6
  import { gzip } from "zlib";
7
7
  import { promisify } from "util";
8
8
  //#region src/utils/logger/rotation.ts
@@ -10,7 +10,7 @@ export declare function incrementStats(level: LogLevel, module?: string): void;
10
10
  /**
11
11
  * Get current statistics
12
12
  */
13
- export declare function getLogStats(): {
13
+ export declare function getRuntimeLogStats(): {
14
14
  byLevel: {
15
15
  error: number;
16
16
  debug: number;
@@ -19,7 +19,7 @@ function incrementStats(level, module) {
19
19
  /**
20
20
  * Get current statistics
21
21
  */
22
- function getLogStats() {
22
+ function getRuntimeLogStats() {
23
23
  return {
24
24
  byLevel: { ...stats.byLevel },
25
25
  byModule: Object.fromEntries(stats.byModule),
@@ -65,6 +65,6 @@ var init_stats = __esmMin((() => {
65
65
  }));
66
66
  //#endregion
67
67
  init_stats();
68
- export { getLogStats, incrementStats, init_stats, resetStats };
68
+ export { getRuntimeLogStats, incrementStats, init_stats, resetStats };
69
69
 
70
70
  //# sourceMappingURL=stats.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"stats.js","names":[],"sources":["../../../../src/utils/logger/stats.ts"],"sourcesContent":["/**\n * Log Statistics\n * Track log counts by level and module\n */\n\nimport type { LogLevel } from './types.js';\n\ninterface StatsData {\n byLevel: Record<LogLevel, number>;\n byModule: Map<string, number>;\n errorsLast24h: number;\n lastErrorTime: number;\n startTime: number;\n}\n\nconst stats: StatsData = {\n byLevel: { trace: 0, debug: 0, info: 0, warn: 0, error: 0, fatal: 0, silent: 0 },\n byModule: new Map(),\n errorsLast24h: 0,\n lastErrorTime: 0,\n startTime: Date.now(),\n};\n\n/**\n * Increment statistics for a log entry\n */\nexport function incrementStats(level: LogLevel, module?: string): void {\n stats.byLevel[level]++;\n \n if (module) {\n const current = stats.byModule.get(module) || 0;\n stats.byModule.set(module, current + 1);\n }\n \n if (level === 'error' || level === 'fatal') {\n const now = Date.now();\n if (now - stats.lastErrorTime > 24 * 60 * 60 * 1000) {\n stats.errorsLast24h = 0;\n }\n stats.errorsLast24h++;\n stats.lastErrorTime = now;\n }\n}\n\n/**\n * Get current statistics\n */\nexport function getLogStats() {\n return {\n byLevel: { ...stats.byLevel },\n byModule: Object.fromEntries(stats.byModule),\n errorsLast24h: stats.errorsLast24h,\n uptimeMs: Date.now() - stats.startTime,\n };\n}\n\n/**\n * Reset statistics (for testing)\n */\nexport function resetStats(): void {\n stats.byLevel = { trace: 0, debug: 0, info: 0, warn: 0, error: 0, fatal: 0, silent: 0 };\n stats.byModule.clear();\n stats.errorsLast24h = 0;\n stats.lastErrorTime = 0;\n stats.startTime = Date.now();\n}\n"],"mappings":";;;;;AA0BA,SAAgB,eAAe,OAAiB,QAAuB;AACrE,OAAM,QAAQ;AAEd,KAAI,QAAQ;EACV,MAAM,UAAU,MAAM,SAAS,IAAI,OAAO,IAAI;AAC9C,QAAM,SAAS,IAAI,QAAQ,UAAU,EAAE;;AAGzC,KAAI,UAAU,WAAW,UAAU,SAAS;EAC1C,MAAM,MAAM,KAAK,KAAK;AACtB,MAAI,MAAM,MAAM,gBAAgB,OAAU,KAAK,IAC7C,OAAM,gBAAgB;AAExB,QAAM;AACN,QAAM,gBAAgB;;;;;;AAO1B,SAAgB,cAAc;AAC5B,QAAO;EACL,SAAS,EAAE,GAAG,MAAM,SAAS;EAC7B,UAAU,OAAO,YAAY,MAAM,SAAS;EAC5C,eAAe,MAAM;EACrB,UAAU,KAAK,KAAK,GAAG,MAAM;EAC9B;;;;;AAMH,SAAgB,aAAmB;AACjC,OAAM,UAAU;EAAE,OAAO;EAAG,OAAO;EAAG,MAAM;EAAG,MAAM;EAAG,OAAO;EAAG,OAAO;EAAG,QAAQ;EAAG;AACvF,OAAM,SAAS,OAAO;AACtB,OAAM,gBAAgB;AACtB,OAAM,gBAAgB;AACtB,OAAM,YAAY,KAAK,KAAK;;;;AAjDxB,SAAmB;EACvB,SAAS;GAAE,OAAO;GAAG,OAAO;GAAG,MAAM;GAAG,MAAM;GAAG,OAAO;GAAG,OAAO;GAAG,QAAQ;GAAG;EAChF,0BAAU,IAAI,KAAK;EACnB,eAAe;EACf,eAAe;EACf,WAAW,KAAK,KAAK;EACtB"}
1
+ {"version":3,"file":"stats.js","names":[],"sources":["../../../../src/utils/logger/stats.ts"],"sourcesContent":["/**\n * Log Statistics\n * Track log counts by level and module\n */\n\nimport type { LogLevel } from './types.js';\n\ninterface StatsData {\n byLevel: Record<LogLevel, number>;\n byModule: Map<string, number>;\n errorsLast24h: number;\n lastErrorTime: number;\n startTime: number;\n}\n\nconst stats: StatsData = {\n byLevel: { trace: 0, debug: 0, info: 0, warn: 0, error: 0, fatal: 0, silent: 0 },\n byModule: new Map(),\n errorsLast24h: 0,\n lastErrorTime: 0,\n startTime: Date.now(),\n};\n\n/**\n * Increment statistics for a log entry\n */\nexport function incrementStats(level: LogLevel, module?: string): void {\n stats.byLevel[level]++;\n \n if (module) {\n const current = stats.byModule.get(module) || 0;\n stats.byModule.set(module, current + 1);\n }\n \n if (level === 'error' || level === 'fatal') {\n const now = Date.now();\n if (now - stats.lastErrorTime > 24 * 60 * 60 * 1000) {\n stats.errorsLast24h = 0;\n }\n stats.errorsLast24h++;\n stats.lastErrorTime = now;\n }\n}\n\n/**\n * Get current statistics\n */\nexport function getRuntimeLogStats() {\n return {\n byLevel: { ...stats.byLevel },\n byModule: Object.fromEntries(stats.byModule),\n errorsLast24h: stats.errorsLast24h,\n uptimeMs: Date.now() - stats.startTime,\n };\n}\n\n/**\n * Reset statistics (for testing)\n */\nexport function resetStats(): void {\n stats.byLevel = { trace: 0, debug: 0, info: 0, warn: 0, error: 0, fatal: 0, silent: 0 };\n stats.byModule.clear();\n stats.errorsLast24h = 0;\n stats.lastErrorTime = 0;\n stats.startTime = Date.now();\n}\n"],"mappings":";;;;;AA0BA,SAAgB,eAAe,OAAiB,QAAuB;AACrE,OAAM,QAAQ;AAEd,KAAI,QAAQ;EACV,MAAM,UAAU,MAAM,SAAS,IAAI,OAAO,IAAI;AAC9C,QAAM,SAAS,IAAI,QAAQ,UAAU,EAAE;;AAGzC,KAAI,UAAU,WAAW,UAAU,SAAS;EAC1C,MAAM,MAAM,KAAK,KAAK;AACtB,MAAI,MAAM,MAAM,gBAAgB,OAAU,KAAK,IAC7C,OAAM,gBAAgB;AAExB,QAAM;AACN,QAAM,gBAAgB;;;;;;AAO1B,SAAgB,qBAAqB;AACnC,QAAO;EACL,SAAS,EAAE,GAAG,MAAM,SAAS;EAC7B,UAAU,OAAO,YAAY,MAAM,SAAS;EAC5C,eAAe,MAAM;EACrB,UAAU,KAAK,KAAK,GAAG,MAAM;EAC9B;;;;;AAMH,SAAgB,aAAmB;AACjC,OAAM,UAAU;EAAE,OAAO;EAAG,OAAO;EAAG,MAAM;EAAG,MAAM;EAAG,OAAO;EAAG,OAAO;EAAG,QAAQ;EAAG;AACvF,OAAM,SAAS,OAAO;AACtB,OAAM,gBAAgB;AACtB,OAAM,gBAAgB;AACtB,OAAM,YAAY,KAAK,KAAK;;;;AAjDxB,SAAmB;EACvB,SAAS;GAAE,OAAO;GAAG,OAAO;GAAG,MAAM;GAAG,MAAM;GAAG,OAAO;GAAG,OAAO;GAAG,QAAQ;GAAG;EAChF,0BAAU,IAAI,KAAK;EACnB,eAAe;EACf,eAAe;EACf,WAAW,KAAK,KAAK;EACtB"}
@@ -1,7 +1,10 @@
1
1
  import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
2
  import { config, getLogDir, init_config } from "./config.js";
3
+ import { emitLogEntry, hasSubscribers, init_log_stream } from "./log-stream.js";
4
+ import { init_pino_record, pinoRecordToLogEntry } from "./pino-record.js";
3
5
  import path from "path";
4
6
  import { createWriteStream, existsSync, mkdirSync } from "fs";
7
+ import { Writable } from "stream";
5
8
  //#region src/utils/logger/streams.ts
6
9
  /**
7
10
  * Log Streams
@@ -29,12 +32,25 @@ function createLogStream(filePath) {
29
32
  encoding: "utf-8"
30
33
  });
31
34
  }
35
+ /** Push parsed Pino lines to live SSE subscribers when any are connected. */
36
+ function createLiveEmitStream() {
37
+ return new Writable({ write(chunk, _encoding, callback) {
38
+ if (hasSubscribers()) try {
39
+ emitLogEntry(pinoRecordToLogEntry(JSON.parse(chunk.toString())));
40
+ } catch {}
41
+ callback();
42
+ } });
43
+ }
32
44
  /**
33
45
  * Initialize and get all output streams
34
46
  */
35
47
  function initializeStreams() {
36
48
  ensureLogDir();
37
49
  const streams = [];
50
+ streams.push({
51
+ stream: createLiveEmitStream(),
52
+ level: "trace"
53
+ });
38
54
  if (config.consoleOutput) streams.push({
39
55
  stream: process.stdout,
40
56
  level: config.level
@@ -76,6 +92,8 @@ async function closeStreams() {
76
92
  var fileStreams;
77
93
  var init_streams = __esmMin((() => {
78
94
  init_config();
95
+ init_log_stream();
96
+ init_pino_record();
79
97
  fileStreams = [];
80
98
  }));
81
99
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"streams.js","names":[],"sources":["../../../../src/utils/logger/streams.ts"],"sourcesContent":["/**\n * Log Streams\n * Output stream management (console, file, error file)\n */\n\nimport { createWriteStream } from 'fs';\nimport { existsSync, mkdirSync } from 'fs';\nimport path from 'path';\nimport type { DestinationStream } from 'pino';\nimport type { LogLevel } from './types.js';\nimport { config, getLogDir } from './config.js';\n\n// Store file stream references for later cleanup\nconst fileStreams: ReturnType<typeof createWriteStream>[] = [];\n\n/**\n * Get log file path for a specific date and type\n */\nexport function getLogPath(type: 'app' | 'error' | 'audit' | 'access' = 'app', date: Date = new Date()): string {\n const dateStr = date.toISOString().split('T')[0];\n return path.join(getLogDir(), `${type}-${dateStr}.log`);\n}\n\n/**\n * Ensure log directory exists\n */\nfunction ensureLogDir(): void {\n if (!existsSync(config.logDir)) {\n mkdirSync(config.logDir, { recursive: true });\n }\n}\n\n/**\n * Create log stream\n */\nfunction createLogStream(filePath: string): ReturnType<typeof createWriteStream> {\n return createWriteStream(filePath, { flags: 'a', encoding: 'utf-8' });\n}\n\n/**\n * Initialize and get all output streams\n */\nexport function initializeStreams(): Array<{ stream: DestinationStream | NodeJS.WriteStream; level: LogLevel }> {\n ensureLogDir();\n \n const streams: Array<{ stream: DestinationStream | NodeJS.WriteStream; level: LogLevel }> = [];\n\n if (config.consoleOutput) {\n streams.push({\n stream: process.stdout as unknown as DestinationStream,\n level: config.level,\n });\n }\n\n if (config.fileOutput) {\n const appStream = createLogStream(getLogPath('app'));\n fileStreams.push(appStream);\n streams.push({\n stream: appStream as unknown as DestinationStream,\n level: config.level,\n });\n }\n\n if (config.errorFileOutput) {\n const errorStream = createLogStream(getLogPath('error'));\n fileStreams.push(errorStream);\n streams.push({\n stream: errorStream as unknown as DestinationStream,\n level: 'error',\n });\n }\n\n return streams;\n}\n\n/**\n * Get all file streams for cleanup\n */\nexport function getFileStreams(): ReturnType<typeof createWriteStream>[] {\n return fileStreams;\n}\n\n/**\n * Close all file streams gracefully\n */\nexport async function closeStreams(): Promise<void> {\n await Promise.all(\n fileStreams.map(\n (stream) =>\n new Promise<void>((resolve) => {\n if (stream.writable) {\n stream.end(() => resolve());\n } else {\n resolve();\n }\n }),\n ),\n );\n fileStreams.length = 0;\n}\n"],"mappings":";;;;;;;;;;;;AAkBA,SAAgB,WAAW,OAA6C,OAAO,uBAAa,IAAI,MAAM,EAAU;CAC9G,MAAM,UAAU,KAAK,aAAa,CAAC,MAAM,IAAI,CAAC;AAC9C,QAAO,KAAK,KAAK,WAAW,EAAE,GAAG,KAAK,GAAG,QAAQ,MAAM;;;;;AAMzD,SAAS,eAAqB;AAC5B,KAAI,CAAC,WAAW,OAAO,OAAO,CAC5B,WAAU,OAAO,QAAQ,EAAE,WAAW,MAAM,CAAC;;;;;AAOjD,SAAS,gBAAgB,UAAwD;AAC/E,QAAO,kBAAkB,UAAU;EAAE,OAAO;EAAK,UAAU;EAAS,CAAC;;;;;AAMvE,SAAgB,oBAAgG;AAC9G,eAAc;CAEd,MAAM,UAAsF,EAAE;AAE9F,KAAI,OAAO,cACT,SAAQ,KAAK;EACX,QAAQ,QAAQ;EAChB,OAAO,OAAO;EACf,CAAC;AAGJ,KAAI,OAAO,YAAY;EACrB,MAAM,YAAY,gBAAgB,WAAW,MAAM,CAAC;AACpD,cAAY,KAAK,UAAU;AAC3B,UAAQ,KAAK;GACX,QAAQ;GACR,OAAO,OAAO;GACf,CAAC;;AAGJ,KAAI,OAAO,iBAAiB;EAC1B,MAAM,cAAc,gBAAgB,WAAW,QAAQ,CAAC;AACxD,cAAY,KAAK,YAAY;AAC7B,UAAQ,KAAK;GACX,QAAQ;GACR,OAAO;GACR,CAAC;;AAGJ,QAAO;;;;;AAMT,SAAgB,iBAAyD;AACvE,QAAO;;;;;AAMT,eAAsB,eAA8B;AAClD,OAAM,QAAQ,IACZ,YAAY,KACT,WACC,IAAI,SAAe,YAAY;AAC7B,MAAI,OAAO,SACT,QAAO,UAAU,SAAS,CAAC;MAE3B,UAAS;GAEX,CACL,CACF;AACD,aAAY,SAAS;;;;cAxFyB;AAG1C,eAAsD,EAAE"}
1
+ {"version":3,"file":"streams.js","names":[],"sources":["../../../../src/utils/logger/streams.ts"],"sourcesContent":["/**\n * Log Streams\n * Output stream management (console, file, error file)\n */\n\nimport { createWriteStream } from 'fs';\nimport { existsSync, mkdirSync } from 'fs';\nimport path from 'path';\nimport { Writable } from 'stream';\nimport type { DestinationStream } from 'pino';\nimport type { LogLevel } from './types.js';\nimport { config, getLogDir } from './config.js';\nimport { emitLogEntry, hasSubscribers } from './log-stream.js';\nimport { pinoRecordToLogEntry } from './pino-record.js';\n\n// Store file stream references for later cleanup\nconst fileStreams: ReturnType<typeof createWriteStream>[] = [];\n\n/**\n * Get log file path for a specific date and type\n */\nexport function getLogPath(type: 'app' | 'error' | 'audit' | 'access' = 'app', date: Date = new Date()): string {\n const dateStr = date.toISOString().split('T')[0];\n return path.join(getLogDir(), `${type}-${dateStr}.log`);\n}\n\n/**\n * Ensure log directory exists\n */\nfunction ensureLogDir(): void {\n if (!existsSync(config.logDir)) {\n mkdirSync(config.logDir, { recursive: true });\n }\n}\n\n/**\n * Create log stream\n */\nfunction createLogStream(filePath: string): ReturnType<typeof createWriteStream> {\n return createWriteStream(filePath, { flags: 'a', encoding: 'utf-8' });\n}\n\n/** Push parsed Pino lines to live SSE subscribers when any are connected. */\nfunction createLiveEmitStream(): DestinationStream {\n return new Writable({\n write(chunk, _encoding, callback) {\n if (hasSubscribers()) {\n try {\n const parsed = JSON.parse(chunk.toString()) as Record<string, unknown>;\n emitLogEntry(pinoRecordToLogEntry(parsed));\n } catch {\n /* ignore non-JSON lines (e.g. pretty console) */\n }\n }\n callback();\n },\n }) as unknown as DestinationStream;\n}\n\n/**\n * Initialize and get all output streams\n */\nexport function initializeStreams(): Array<{ stream: DestinationStream | NodeJS.WriteStream; level: LogLevel }> {\n ensureLogDir();\n \n const streams: Array<{ stream: DestinationStream | NodeJS.WriteStream; level: LogLevel }> = [];\n\n streams.push({\n stream: createLiveEmitStream(),\n level: 'trace',\n });\n\n if (config.consoleOutput) {\n streams.push({\n stream: process.stdout as unknown as DestinationStream,\n level: config.level,\n });\n }\n\n if (config.fileOutput) {\n const appStream = createLogStream(getLogPath('app'));\n fileStreams.push(appStream);\n streams.push({\n stream: appStream as unknown as DestinationStream,\n level: config.level,\n });\n }\n\n if (config.errorFileOutput) {\n const errorStream = createLogStream(getLogPath('error'));\n fileStreams.push(errorStream);\n streams.push({\n stream: errorStream as unknown as DestinationStream,\n level: 'error',\n });\n }\n\n return streams;\n}\n\n/**\n * Get all file streams for cleanup\n */\nexport function getFileStreams(): ReturnType<typeof createWriteStream>[] {\n return fileStreams;\n}\n\n/**\n * Close all file streams gracefully\n */\nexport async function closeStreams(): Promise<void> {\n await Promise.all(\n fileStreams.map(\n (stream) =>\n new Promise<void>((resolve) => {\n if (stream.writable) {\n stream.end(() => resolve());\n } else {\n resolve();\n }\n }),\n ),\n );\n fileStreams.length = 0;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAqBA,SAAgB,WAAW,OAA6C,OAAO,uBAAa,IAAI,MAAM,EAAU;CAC9G,MAAM,UAAU,KAAK,aAAa,CAAC,MAAM,IAAI,CAAC;AAC9C,QAAO,KAAK,KAAK,WAAW,EAAE,GAAG,KAAK,GAAG,QAAQ,MAAM;;;;;AAMzD,SAAS,eAAqB;AAC5B,KAAI,CAAC,WAAW,OAAO,OAAO,CAC5B,WAAU,OAAO,QAAQ,EAAE,WAAW,MAAM,CAAC;;;;;AAOjD,SAAS,gBAAgB,UAAwD;AAC/E,QAAO,kBAAkB,UAAU;EAAE,OAAO;EAAK,UAAU;EAAS,CAAC;;;AAIvE,SAAS,uBAA0C;AACjD,QAAO,IAAI,SAAS,EAClB,MAAM,OAAO,WAAW,UAAU;AAChC,MAAI,gBAAgB,CAClB,KAAI;AAEF,gBAAa,qBADE,KAAK,MAAM,MAAM,UAAU,CACF,CAAC,CAAC;UACpC;AAIV,YAAU;IAEb,CAAC;;;;;AAMJ,SAAgB,oBAAgG;AAC9G,eAAc;CAEd,MAAM,UAAsF,EAAE;AAE9F,SAAQ,KAAK;EACX,QAAQ,sBAAsB;EAC9B,OAAO;EACR,CAAC;AAEF,KAAI,OAAO,cACT,SAAQ,KAAK;EACX,QAAQ,QAAQ;EAChB,OAAO,OAAO;EACf,CAAC;AAGJ,KAAI,OAAO,YAAY;EACrB,MAAM,YAAY,gBAAgB,WAAW,MAAM,CAAC;AACpD,cAAY,KAAK,UAAU;AAC3B,UAAQ,KAAK;GACX,QAAQ;GACR,OAAO,OAAO;GACf,CAAC;;AAGJ,KAAI,OAAO,iBAAiB;EAC1B,MAAM,cAAc,gBAAgB,WAAW,QAAQ,CAAC;AACxD,cAAY,KAAK,YAAY;AAC7B,UAAQ,KAAK;GACX,QAAQ;GACR,OAAO;GACR,CAAC;;AAGJ,QAAO;;;;;AAMT,SAAgB,iBAAyD;AACvE,QAAO;;;;;AAMT,eAAsB,eAA8B;AAClD,OAAM,QAAQ,IACZ,YAAY,KACT,WACC,IAAI,SAAe,YAAY;AAC7B,MAAI,OAAO,SACT,QAAO,UAAU,SAAS,CAAC;MAE3B,UAAS;GAEX,CACL,CACF;AACD,aAAY,SAAS;;;;cAhHyB;kBACe;mBACP;AAGlD,eAAsD,EAAE"}
@@ -12,7 +12,6 @@ export interface LogEntry {
12
12
  level: LogLevel;
13
13
  message: string;
14
14
  module?: string;
15
- prefix?: string;
16
15
  service?: string;
17
16
  extension?: string;
18
17
  requestId?: string;
@@ -66,10 +65,6 @@ export interface ContextualLogger extends Logger {
66
65
  * Set default context for all subsequent logs
67
66
  */
68
67
  withContext(context: LogContext): ContextualLogger;
69
- /**
70
- * Create a child logger with additional context
71
- */
72
- childContext(context: LogContext): ContextualLogger;
73
68
  }
74
69
  /**
75
70
  * Logger configuration options
@@ -91,10 +86,6 @@ export interface LoggerConfig {
91
86
  maxFileSizeMB: number;
92
87
  /** Enable pretty print for console (dev only) */
93
88
  prettyPrint: boolean;
94
- /** Enable async logging */
95
- async: boolean;
96
- /** Sample rate for debug logs (0-1, 1 = all) */
97
- debugSampleRate?: number;
98
89
  }
99
90
  /**
100
91
  * Log file metadata