@xopcai/xopc 0.0.188 → 0.0.189

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 (293) hide show
  1. package/README.md +1 -1
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store--QoUGhiS.js → activity-store-DTFKTPs8.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B0yweLNQ.js → agent-avatar-dicebear-DqO25Qe5.js} +1 -1
  6. package/dist/gateway/static/root/assets/agents-BvdqdER9.js +2 -0
  7. package/dist/gateway/static/root/assets/{api-5laWqfiE.js → api-DWeXfwVU.js} +1 -1
  8. package/dist/gateway/static/root/assets/{app-management-settings-panel-BXJ8Jiv_.js → app-management-settings-panel-BRpV8PXG.js} +1 -1
  9. package/dist/gateway/static/root/assets/{appearance-settings-DG9n9D1M.js → appearance-settings-3ntKM9nQ.js} +1 -1
  10. package/dist/gateway/static/root/assets/apps-page-nKLsfy6C.js +1 -0
  11. package/dist/gateway/static/root/assets/{archive-plugin-Ceh5qrZf.js → archive-plugin-Df7Ycj_7.js} +1 -1
  12. package/dist/gateway/static/root/assets/{attachment-load-jFW7uYf7.js → attachment-load-UHgfZYtj.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-page-Dh5bdZiN.js +6 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-XDlkI1r4.js → binary-plugins-BJah99wE.js} +1 -1
  15. package/dist/gateway/static/root/assets/{block-editor-kyKc2IhE.js → block-editor-DNlY5KqF.js} +46 -46
  16. package/dist/gateway/static/root/assets/browser-settings-page-CRJ_nAuh.js +8 -0
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BJa5Iz_v.js → browser-workflow-inputs-vyUfdzAd.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-CTQQOsn5.js → browser-workflows-page-C1cKZjx-.js} +2 -2
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-DeQR5BZt.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-Dn-7MMEo.js → capability-presets-api-D7tkhDMv.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-D7uK3q1p.js +1 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-BgIkWq01.js → channel-recipient-api-BGG2kpJB.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-Bw6Dniyq.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-BrUTz4uU.js +1 -0
  25. package/dist/gateway/static/root/assets/{connector-logo-TRr9ybf6.js → connector-logo-8YU53RUT.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-k9tMiOL5.js +2 -0
  27. package/dist/gateway/static/root/assets/{desktop-pet-CSwd00CV.js → desktop-pet-BUuBEJuP.js} +1 -1
  28. package/dist/gateway/static/root/assets/{desktop-pet-settings-CuNQvHGu.js → desktop-pet-settings-BGfVIJM3.js} +1 -1
  29. package/dist/gateway/static/root/assets/{directory-picker-path-field-ct0n5Rje.js → directory-picker-path-field-DrQFfHH_.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-debug-page-BeRBuMUU.js → extension-debug-page-CEnIFOX-.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-page-DbK-Cwao.js → extension-page-CCqHbexs.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-settings-page-C9ag5tb5.js → extension-settings-page-DEZw_7zN.js} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-api-CC7EvEFp.js → gateway-config-api-CgUE2Ii1.js} +1 -1
  34. package/dist/gateway/static/root/assets/gateway-settings-Dg8qCiIp.js +1 -0
  35. package/dist/gateway/static/root/assets/{gateway-startup-retry-B2DmdlwO.js → gateway-startup-retry-DxhKNiCF.js} +1 -1
  36. package/dist/gateway/static/root/assets/{heartbeat-settings-fl1oC_-5.js → heartbeat-settings-27tRzDEo.js} +1 -1
  37. package/dist/gateway/static/root/assets/home-page-VA511kMr.js +3 -0
  38. package/dist/gateway/static/root/assets/{image-generation-api-GMTaS6eI.js → image-generation-api-DCFdc-HD.js} +1 -1
  39. package/dist/gateway/static/root/assets/index-BvR-i-m6.js +216 -0
  40. package/dist/gateway/static/root/assets/index-zybP34zk.css +1 -0
  41. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DhGYddbI.js → keyboard-shortcuts-settings-Bf2VLtXW.js} +1 -1
  42. package/dist/gateway/static/root/assets/local-app-workbench-page-CaJq4-wV.js +2 -0
  43. package/dist/gateway/static/root/assets/{local-apps-page-CmnrBmWi.js → local-apps-page-Ca1RuI13.js} +1 -1
  44. package/dist/gateway/static/root/assets/{locale-store-D6hs74o5.js → locale-store-DUW5YE3R.js} +1 -1
  45. package/dist/gateway/static/root/assets/logs-page-BLTCg69e.js +2 -0
  46. package/dist/gateway/static/root/assets/management-settings-B3Eop1zn.js +1 -0
  47. package/dist/gateway/static/root/assets/{markdown-split-CZaBPOVn.js → markdown-split-BGOYjgnM.js} +1 -1
  48. package/dist/gateway/static/root/assets/{media-plugins-CiKvSgCv.js → media-plugins-CT0txyM4.js} +1 -1
  49. package/dist/gateway/static/root/assets/messages-CMjnbdbn.js +3 -0
  50. package/dist/gateway/static/root/assets/{notes-page-Bisbzqlz.js → notes-page-DfKgAe78.js} +1 -1
  51. package/dist/gateway/static/root/assets/notes-workbench-Bp1w9UM1.js +4 -0
  52. package/dist/gateway/static/root/assets/{page-tabs-BxlwhAbH.js → page-tabs-DNrbCgmC.js} +1 -1
  53. package/dist/gateway/static/root/assets/{preview-open-alternatives-RM8wXxfT.js → preview-open-alternatives-BTqViDOR.js} +1 -1
  54. package/dist/gateway/static/root/assets/product-delivery-tRr-7IxY.js +1 -0
  55. package/dist/gateway/static/root/assets/{product-open-page-DdBlibek.js → product-open-page-C_2L4_Iu.js} +1 -1
  56. package/dist/gateway/static/root/assets/project-detail-page-CZmbPDQN.js +1 -0
  57. package/dist/gateway/static/root/assets/projects-page-D5pzqfm5.js +1 -0
  58. package/dist/gateway/static/root/assets/remote-access-hub-CC-XhVGI.js +1 -0
  59. package/dist/gateway/static/root/assets/{schema-form-BDKbpmXv.js → schema-form-BFLfkDGG.js} +1 -1
  60. package/dist/gateway/static/root/assets/{schemas-C6onAggk.js → schemas-zIBW3wiV.js} +1 -1
  61. package/dist/gateway/static/root/assets/sessions-page-B2eTLVDV.js +1 -0
  62. package/dist/gateway/static/root/assets/settings-advanced-gate-CRuZ_bl0.js +1 -0
  63. package/dist/gateway/static/root/assets/{settings-form-section-zxo5ZGOu.js → settings-form-section-C4GXGeA4.js} +1 -1
  64. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DgIp8_S6.js → settings-loading-skeleton-C9a-EbTZ.js} +1 -1
  65. package/dist/gateway/static/root/assets/settings-page-DI9qDH5x.js +1 -0
  66. package/dist/gateway/static/root/assets/{settings-page-layout-97LmwrzC.js → settings-page-layout-D-LWQdI5.js} +1 -1
  67. package/dist/gateway/static/root/assets/setup-status-panel-CJwmPvgs.js +1 -0
  68. package/dist/gateway/static/root/assets/{share-preview-page-BH7i3g1S.js → share-preview-page-BKSMG9r5.js} +1 -1
  69. package/dist/gateway/static/root/assets/shares-settings-YzSDS4G_.js +1 -0
  70. package/dist/gateway/static/root/assets/skill-reload-api-CwOo8zZk.js +1 -0
  71. package/dist/gateway/static/root/assets/skills-page-xd1cgSGN.js +2 -0
  72. package/dist/gateway/static/root/assets/{skills-page.utils-s-a5WV9j.js → skills-page.utils-zsz2HIlZ.js} +1 -1
  73. package/dist/gateway/static/root/assets/{system-settings-panel-BxjeMT5k.js → system-settings-panel-IWNDBI1O.js} +1 -1
  74. package/dist/gateway/static/root/assets/{task-detail-page-BahycnfW.js → task-detail-page-CgtK02kP.js} +1 -1
  75. package/dist/gateway/static/root/assets/{theme-store-BRxdsmic.js → theme-store-BkJe7UDo.js} +1 -1
  76. package/dist/gateway/static/root/assets/time-picker-CstQ___Y.js +1 -0
  77. package/dist/gateway/static/root/assets/{typed-models-lib-39MjwPSq.js → typed-models-lib-C07LGthO.js} +1 -1
  78. package/dist/gateway/static/root/assets/{use-save-bar-registration-5aVSjTjO.js → use-save-bar-registration-CQYE0l6z.js} +1 -1
  79. package/dist/gateway/static/root/assets/user-context-page-BnQAWS_B.js +1 -0
  80. package/dist/gateway/static/root/assets/{voice-api-key-field-XU-7sBSg.js → voice-api-key-field-Boue1D46.js} +1 -1
  81. package/dist/gateway/static/root/assets/{work-discovery-overlay-CJqu8UHq.js → work-discovery-overlay-bbmvCmc8.js} +1 -1
  82. package/dist/gateway/static/root/assets/work-discovery-page-CAszL1y8.js +1 -0
  83. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DXtg8Qxl.js → workflow-run-setup-panel-DlHv-GZC.js} +2 -2
  84. package/dist/gateway/static/root/assets/workflows-page-DxGzo3-x.js +11 -0
  85. package/dist/gateway/static/root/index.html +9 -9
  86. package/dist/package.js +1 -1
  87. package/dist/packages/endpoint-tools-protocol/src/index.js +184 -0
  88. package/dist/packages/realtime-client/src/index.js +199 -0
  89. package/dist/packages/realtime-protocol/src/index.js +83 -0
  90. package/dist/src/agent/agent-manager.d.ts +1 -0
  91. package/dist/src/agent/agent-manager.js +1 -0
  92. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  93. package/dist/src/agent/background-review/prompts.js +3 -1
  94. package/dist/src/agent/background-review/run-background-review.d.ts +2 -0
  95. package/dist/src/agent/background-review/run-background-review.js +5 -2
  96. package/dist/src/agent/client-error-format.d.ts +1 -1
  97. package/dist/src/agent/client-error-format.js +1 -1
  98. package/dist/src/agent/external-tools/endpoint-provider.d.ts +17 -0
  99. package/dist/src/agent/external-tools/endpoint-provider.js +93 -0
  100. package/dist/src/agent/external-tools/gateway-tools.js +1 -1
  101. package/dist/src/agent/external-tools/index.d.ts +4 -5
  102. package/dist/src/agent/external-tools/index.js +8 -2
  103. package/dist/src/agent/external-tools/types.d.ts +8 -1
  104. package/dist/src/agent/external-tools/types.js +2 -1
  105. package/dist/src/agent/inbound/inbound-loop.js +4 -0
  106. package/dist/src/agent/inbound/turn-dispatcher.d.ts +9 -8
  107. package/dist/src/agent/inbound/turn-dispatcher.js +13 -11
  108. package/dist/src/agent/messaging/command-handler.d.ts +2 -2
  109. package/dist/src/agent/messaging/command-handler.js +3 -3
  110. package/dist/src/agent/service/async-queue.d.ts +1 -1
  111. package/dist/src/agent/service/async-queue.js +1 -1
  112. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -1
  113. package/dist/src/agent/service/direct-turn-helpers.js +1 -1
  114. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -1
  115. package/dist/src/agent/service/process-direct-one-shot.js +1 -1
  116. package/dist/src/agent/service/process-direct-streaming.d.ts +7 -5
  117. package/dist/src/agent/service/process-direct-streaming.js +5 -5
  118. package/dist/src/agent/service.d.ts +1 -1
  119. package/dist/src/agent/service.js +6 -4
  120. package/dist/src/agent/service.types.d.ts +2 -0
  121. package/dist/src/agent/session/index.d.ts +1 -1
  122. package/dist/src/agent/session/session-context.d.ts +2 -0
  123. package/dist/src/agent/session/session-context.js +4 -0
  124. package/dist/src/agent/session/session-state-bag.d.ts +4 -4
  125. package/dist/src/agent/session/session-state-bag.js +1 -1
  126. package/dist/src/agent/streaming/reasoning-visibility.d.ts +6 -0
  127. package/dist/src/agent/streaming/{reasoning-visibility-sse.js → reasoning-visibility.js} +3 -6
  128. package/dist/src/agent/tools/factory.d.ts +4 -0
  129. package/dist/src/agent/tools/factory.js +1 -0
  130. package/dist/src/automations/domain/types.d.ts +2 -1
  131. package/dist/src/automations/domain/validation.d.ts +1 -1
  132. package/dist/src/automations/service/action-executor.js +4 -1
  133. package/dist/src/channels/pairing/pairing-challenge.d.ts +1 -1
  134. package/dist/src/channels/pairing/pairing-challenge.js +1 -1
  135. package/dist/src/cli/commands/agent/stream-renderer.js +4 -1
  136. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  137. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  138. package/dist/src/config/rules.js +0 -5
  139. package/dist/src/config/schema.d.ts +3 -5
  140. package/dist/src/config/schema.js +0 -3
  141. package/dist/src/config/web-patch.js +0 -1
  142. package/dist/src/endpoint-tools/auth.d.ts +20 -0
  143. package/dist/src/endpoint-tools/auth.js +51 -0
  144. package/dist/src/endpoint-tools/index.d.ts +5 -0
  145. package/dist/src/endpoint-tools/index.js +6 -0
  146. package/dist/src/endpoint-tools/invocation-service.d.ts +68 -0
  147. package/dist/src/endpoint-tools/invocation-service.js +190 -0
  148. package/dist/src/endpoint-tools/policy.d.ts +10 -0
  149. package/dist/src/endpoint-tools/policy.js +18 -0
  150. package/dist/src/endpoint-tools/registry.d.ts +45 -0
  151. package/dist/src/endpoint-tools/registry.js +121 -0
  152. package/dist/src/endpoint-tools/runtime.d.ts +23 -0
  153. package/dist/src/endpoint-tools/runtime.js +86 -0
  154. package/dist/src/endpoint-tools/upload-service.d.ts +41 -0
  155. package/dist/src/endpoint-tools/upload-service.js +103 -0
  156. package/dist/src/extensions/types/hooks.d.ts +1 -1
  157. package/dist/src/extensions/update.js +1 -1
  158. package/dist/src/gateway/chat-stream/protocol.d.ts +0 -1
  159. package/dist/src/gateway/clarify-bridge.d.ts +5 -4
  160. package/dist/src/gateway/clarify-bridge.js +3 -4
  161. package/dist/src/gateway/heartbeat/service.js +4 -1
  162. package/dist/src/gateway/hono/app.js +1 -5
  163. package/dist/src/gateway/hono/index.d.ts +0 -1
  164. package/dist/src/gateway/hono/index.js +1 -2
  165. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -2
  166. package/dist/src/gateway/hono/lib/config-payload.js +0 -1
  167. package/dist/src/gateway/hono/middleware/auth.js +3 -5
  168. package/dist/src/gateway/hono/routes/agent-stream.js +49 -6
  169. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  170. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +2 -2
  171. package/dist/src/gateway/hono/routes/config-patch/gateway.js +0 -19
  172. package/dist/src/gateway/hono/routes/deps.d.ts +0 -2
  173. package/dist/src/gateway/hono/routes/endpoint-tools.d.ts +3 -0
  174. package/dist/src/gateway/hono/routes/endpoint-tools.js +196 -0
  175. package/dist/src/gateway/hono/routes/index.js +4 -0
  176. package/dist/src/gateway/hono/routes/logs.js +0 -4
  177. package/dist/src/gateway/hono/routes/public-gateway.js +2 -2
  178. package/dist/src/gateway/hono/routes/realtime.d.ts +3 -0
  179. package/dist/src/gateway/hono/routes/realtime.js +35 -0
  180. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  181. package/dist/src/gateway/hono/routes/you.d.ts +0 -9
  182. package/dist/src/gateway/hono/routes/you.js +78 -125
  183. package/dist/src/gateway/index.d.ts +1 -1
  184. package/dist/src/gateway/index.js +1 -2
  185. package/dist/src/gateway/protocol.d.ts +1 -7
  186. package/dist/src/gateway/security/index.js +1 -1
  187. package/dist/src/gateway/security/operator-scopes.js +1 -1
  188. package/dist/src/gateway/server.js +4 -4
  189. package/dist/src/gateway/service/agent-runner.d.ts +11 -9
  190. package/dist/src/gateway/service/agent-runner.js +18 -18
  191. package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
  192. package/dist/src/gateway/service/run-gateway-agent.d.ts +4 -3
  193. package/dist/src/gateway/service/run-gateway-agent.js +13 -13
  194. package/dist/src/gateway/service/session-input-coordinator.d.ts +3 -0
  195. package/dist/src/gateway/service/session-input-coordinator.js +4 -2
  196. package/dist/src/gateway/service/types.d.ts +0 -5
  197. package/dist/src/gateway/service.d.ts +7 -6
  198. package/dist/src/gateway/service.js +43 -26
  199. package/dist/src/infra/update-runner.js +1 -1
  200. package/dist/src/mcp/channel-bridge.d.ts +6 -9
  201. package/dist/src/mcp/channel-bridge.js +48 -76
  202. package/dist/src/mcp/channel-server.js +2 -6
  203. package/dist/src/realtime/broker.d.ts +30 -0
  204. package/dist/src/realtime/broker.js +97 -0
  205. package/dist/src/realtime/runtime.d.ts +20 -0
  206. package/dist/src/realtime/runtime.js +258 -0
  207. package/dist/src/realtime/tickets.d.ts +15 -0
  208. package/dist/src/realtime/tickets.js +38 -0
  209. package/dist/src/realtime/writer.d.ts +15 -0
  210. package/dist/src/realtime/writer.js +78 -0
  211. package/dist/src/share/share-config.js +0 -1
  212. package/dist/src/share/site-share-config.js +0 -1
  213. package/dist/src/storage/sqlite/endpoint-principal-repository.d.ts +17 -0
  214. package/dist/src/storage/sqlite/endpoint-principal-repository.js +54 -0
  215. package/dist/src/storage/sqlite/endpoint-tool-invocation-repository.d.ts +25 -0
  216. package/dist/src/storage/sqlite/endpoint-tool-invocation-repository.js +42 -0
  217. package/dist/src/storage/sqlite/index.d.ts +2 -0
  218. package/dist/src/storage/sqlite/index.js +3 -1
  219. package/dist/src/storage/sqlite/migrations/109_endpoint_principals.sql +14 -0
  220. package/dist/src/storage/sqlite/migrations/110_session_input_origin.sql +43 -0
  221. package/dist/src/storage/sqlite/migrations/111_endpoint_tool_invocations.sql +18 -0
  222. package/dist/src/storage/sqlite/migrations/112_endpoint_instance_bindings.sql +8 -0
  223. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  224. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  225. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  226. package/dist/src/storage/sqlite/schema.js +1 -1
  227. package/dist/src/storage/sqlite/session-input-repository.d.ts +3 -0
  228. package/dist/src/storage/sqlite/session-input-repository.js +5 -3
  229. package/dist/src/tasks/home-query-service.d.ts +1 -1
  230. package/dist/src/tui/backends/embedded-backend.js +5 -2
  231. package/dist/src/tui/backends/{gateway-sse-backend.d.ts → gateway-realtime-backend.d.ts} +13 -10
  232. package/dist/src/tui/backends/{gateway-sse-backend.js → gateway-realtime-backend.js} +114 -151
  233. package/dist/src/tui/tui-agent-events.d.ts +0 -1
  234. package/dist/src/tui/tui-agent-events.js +2 -15
  235. package/dist/src/tui/tui-backend.d.ts +4 -4
  236. package/dist/src/tui/tui-run-state.js +0 -4
  237. package/dist/src/tui/tui-types.d.ts +2 -9
  238. package/dist/src/tui/tui-types.js +0 -1
  239. package/dist/src/tui/tui.js +5 -5
  240. package/dist/src/tunnel/gateway-lifecycle.d.ts +1 -1
  241. package/dist/src/tunnel/gateway-lifecycle.js +1 -1
  242. package/dist/src/user-context/actionableInsights.d.ts +14 -0
  243. package/dist/src/user-context/actionableInsights.js +34 -0
  244. package/dist/src/user-context/manual-understanding.js +6 -1
  245. package/dist/src/user-context/projection.d.ts +1 -1
  246. package/dist/src/user-context/understandingQuality.d.ts +5 -0
  247. package/dist/src/user-context/understandingQuality.js +44 -0
  248. package/dist/src/utils/logger/log-stream.d.ts +3 -10
  249. package/dist/src/utils/logger/log-stream.js +2 -73
  250. package/dist/src/utils/logger/pino-record.d.ts +1 -1
  251. package/dist/src/utils/logger/streams.js +1 -1
  252. package/package.json +6 -3
  253. package/dist/gateway/static/root/assets/agents-C6OV-gMm.js +0 -2
  254. package/dist/gateway/static/root/assets/apps-page-Ci14lDeO.js +0 -1
  255. package/dist/gateway/static/root/assets/automations-page-Q1xmb4Rh.js +0 -6
  256. package/dist/gateway/static/root/assets/browser-settings-page-DbowrHXD.js +0 -8
  257. package/dist/gateway/static/root/assets/capabilities-settings-panel-DoZPFdKF.js +0 -7
  258. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Bt8Hnx0h.js +0 -1
  259. package/dist/gateway/static/root/assets/channels-settings-Bpsebsru.js +0 -1
  260. package/dist/gateway/static/root/assets/channels-status-swr-DFmdYRE5.js +0 -1
  261. package/dist/gateway/static/root/assets/connectors-page-Tg5kl22i.js +0 -2
  262. package/dist/gateway/static/root/assets/gateway-settings-9g8uIry9.js +0 -1
  263. package/dist/gateway/static/root/assets/home-page-Bao9jq_z.js +0 -3
  264. package/dist/gateway/static/root/assets/index-Cl5n1f_U.css +0 -1
  265. package/dist/gateway/static/root/assets/index-OJgiMh07.js +0 -223
  266. package/dist/gateway/static/root/assets/local-app-workbench-page-B69NvtvH.js +0 -2
  267. package/dist/gateway/static/root/assets/logs-page-Cq3cABqg.js +0 -7
  268. package/dist/gateway/static/root/assets/messages-D02NNLCZ.js +0 -3
  269. package/dist/gateway/static/root/assets/notes-workbench-BOZfJFhE.js +0 -4
  270. package/dist/gateway/static/root/assets/product-delivery-C8JbSj5Y.js +0 -1
  271. package/dist/gateway/static/root/assets/project-detail-page-TSKFb2tN.js +0 -1
  272. package/dist/gateway/static/root/assets/projects-page-BokeBrTT.js +0 -1
  273. package/dist/gateway/static/root/assets/remote-access-hub-C56anxCX.js +0 -1
  274. package/dist/gateway/static/root/assets/sessions-page-C7TQADrD.js +0 -1
  275. package/dist/gateway/static/root/assets/settings-advanced-gate-BDOPKeAX.js +0 -1
  276. package/dist/gateway/static/root/assets/settings-page-BUPSIa9P.js +0 -1
  277. package/dist/gateway/static/root/assets/setup-status-panel-BRg766eW.js +0 -1
  278. package/dist/gateway/static/root/assets/shares-settings-DhEAviQ_.js +0 -1
  279. package/dist/gateway/static/root/assets/skill-reload-api-Ct7AV8ls.js +0 -1
  280. package/dist/gateway/static/root/assets/skills-page-DoVuprZm.js +0 -2
  281. package/dist/gateway/static/root/assets/time-picker-BGk_Tbsj.js +0 -1
  282. package/dist/gateway/static/root/assets/user-context-page-B9K41qmy.js +0 -1
  283. package/dist/gateway/static/root/assets/work-discovery-page-BBVnRHju.js +0 -1
  284. package/dist/gateway/static/root/assets/workflows-page-Bs_tYfst.js +0 -11
  285. package/dist/src/agent/streaming/reasoning-visibility-sse.d.ts +0 -15
  286. package/dist/src/gateway/agent-run-relay.d.ts +0 -19
  287. package/dist/src/gateway/agent-run-relay.js +0 -169
  288. package/dist/src/gateway/hono/sse.d.ts +0 -53
  289. package/dist/src/gateway/hono/sse.js +0 -207
  290. package/dist/src/gateway/service/sse-hub.d.ts +0 -10
  291. package/dist/src/gateway/service/sse-hub.js +0 -53
  292. package/dist/src/tui/sse-consumer.d.ts +0 -15
  293. package/dist/src/tui/sse-consumer.js +0 -73
@@ -1,15 +0,0 @@
1
- /**
2
- * Outbound SSE visibility for session `reasoningLevel`.
3
- * Single choke point: call from the queue push path so agent subscribe stays free of policy branches.
4
- *
5
- * Note: Does not alter persisted messages or agent state; history/UI may still strip thinking separately.
6
- */
7
- import type { ReasoningLevel } from '../transcript/thinking-types.js';
8
- export type SseStreamEvent = {
9
- type: string;
10
- [key: string]: unknown;
11
- };
12
- /**
13
- * @returns `null` to drop the event; unchanged `event` otherwise.
14
- */
15
- export declare function applyReasoningVisibilityToSseEvent(event: SseStreamEvent, reasoningLevel: ReasoningLevel): SseStreamEvent | null;
@@ -1,19 +0,0 @@
1
- /**
2
- * Multicast buffer for a single web agent run so multiple HTTP SSE consumers can
3
- * attach through POST /api/agent/resume while one
4
- * background pump drains processDirectStreaming.
5
- */
6
- export type RelayEvent = {
7
- type: string;
8
- } & Record<string, unknown>;
9
- export declare class AgentRunRelay {
10
- private readonly maxEvents;
11
- private runs;
12
- constructor(maxEvents?: number);
13
- ensureRun(runId: string, sessionKey: string): void;
14
- getSessionKey(runId: string): string | undefined;
15
- hasRun(runId: string): boolean;
16
- publish(runId: string, event: RelayEvent): RelayEvent | undefined;
17
- complete(runId: string): void;
18
- subscribe(runId: string): AsyncGenerator<RelayEvent>;
19
- }
@@ -1,169 +0,0 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
- //#region src/gateway/agent-run-relay.ts
4
- init_logger();
5
- const log = createLogger("Gateway:AgentRunRelay");
6
- const COMPLETE_TTL_MS = 5 * 6e4;
7
- const MAX_EVENTS = 8e3;
8
- const COMPACT_TO_RATIO = .75;
9
- const MAX_MERGED_DELTA_CHARS = 16 * 1024;
10
- const REPLAY_DELTA_TYPES = new Set([
11
- "assistant_delta",
12
- "thinking_delta",
13
- "command_output_delta",
14
- "review_delta"
15
- ]);
16
- function eventSeq(event) {
17
- return typeof event.seq === "number" ? event.seq : void 0;
18
- }
19
- function findEventAtOrAfter(events, seq) {
20
- let low = 0;
21
- let high = events.length;
22
- while (low < high) {
23
- const middle = low + Math.floor((high - low) / 2);
24
- if ((eventSeq(events[middle]) ?? Number.MAX_SAFE_INTEGER) < seq) low = middle + 1;
25
- else high = middle;
26
- }
27
- return events[low];
28
- }
29
- function recordValue(value) {
30
- return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
31
- }
32
- function sameDeltaStream(left, right) {
33
- if (left.type !== right.type || !REPLAY_DELTA_TYPES.has(left.type)) return false;
34
- const leftPayload = recordValue(left.payload);
35
- const rightPayload = recordValue(right.payload);
36
- if (!leftPayload || !rightPayload) return false;
37
- return [
38
- "messageId",
39
- "toolCallId",
40
- "reviewId",
41
- "stream"
42
- ].every((key) => leftPayload[key] === rightPayload[key]);
43
- }
44
- function mergeReplayDelta(events, event) {
45
- const previous = events.at(-1);
46
- if (!previous || !sameDeltaStream(previous, event)) return false;
47
- const previousPayload = recordValue(previous.payload);
48
- const payload = recordValue(event.payload);
49
- const previousDelta = previousPayload?.delta;
50
- const delta = payload?.delta;
51
- if (typeof previousDelta !== "string" || typeof delta !== "string") return false;
52
- if (previousDelta.length + delta.length > MAX_MERGED_DELTA_CHARS) return false;
53
- events[events.length - 1] = {
54
- ...previous,
55
- payload: {
56
- ...previousPayload,
57
- delta: previousDelta + delta
58
- }
59
- };
60
- return true;
61
- }
62
- function compactEvents(events, targetSize) {
63
- let remaining = Math.max(0, events.length - targetSize);
64
- const retained = [];
65
- const removedByType = {};
66
- for (const event of events) {
67
- if (remaining > 0 && REPLAY_DELTA_TYPES.has(event.type)) {
68
- remaining -= 1;
69
- removedByType[event.type] = (removedByType[event.type] ?? 0) + 1;
70
- continue;
71
- }
72
- retained.push(event);
73
- }
74
- if (remaining > 0) for (const event of retained.splice(0, remaining)) removedByType[event.type] = (removedByType[event.type] ?? 0) + 1;
75
- return {
76
- events: retained,
77
- removedByType
78
- };
79
- }
80
- var AgentRunRelay = class {
81
- runs = /* @__PURE__ */ new Map();
82
- constructor(maxEvents = MAX_EVENTS) {
83
- this.maxEvents = maxEvents;
84
- if (!Number.isInteger(maxEvents) || maxEvents < 2) throw new Error("AgentRunRelay maxEvents must be an integer greater than 1");
85
- }
86
- ensureRun(runId, sessionKey) {
87
- if (this.runs.has(runId)) return;
88
- this.runs.set(runId, {
89
- sessionKey,
90
- events: [],
91
- nextSeq: 1,
92
- done: false,
93
- waiters: [],
94
- subscriberCount: 0,
95
- compactionWarned: false
96
- });
97
- }
98
- getSessionKey(runId) {
99
- return this.runs.get(runId)?.sessionKey;
100
- }
101
- hasRun(runId) {
102
- return this.runs.has(runId);
103
- }
104
- publish(runId, event) {
105
- const state = this.runs.get(runId);
106
- if (!state) return void 0;
107
- const relayed = {
108
- ...event,
109
- runId,
110
- seq: state.nextSeq++
111
- };
112
- const merged = state.subscriberCount === 0 && mergeReplayDelta(state.events, relayed);
113
- if (!merged && state.events.length >= this.maxEvents) {
114
- const targetSize = Math.max(1, Math.floor(this.maxEvents * COMPACT_TO_RATIO));
115
- const compacted = compactEvents(state.events, targetSize);
116
- state.events = compacted.events;
117
- if (!state.compactionWarned) {
118
- state.compactionWarned = true;
119
- log.warn({
120
- runId,
121
- max: this.maxEvents,
122
- retained: state.events.length,
123
- removedByType: compacted.removedByType
124
- }, "Relay replay buffer compacted; old delta events are no longer resumable");
125
- }
126
- }
127
- if (!merged) state.events.push(relayed);
128
- const waiters = state.waiters.splice(0);
129
- for (const w of waiters) w();
130
- return relayed;
131
- }
132
- complete(runId) {
133
- const state = this.runs.get(runId);
134
- if (!state) return;
135
- state.done = true;
136
- const waiters = state.waiters.splice(0);
137
- for (const w of waiters) w();
138
- if (state.cleanupTimer) clearTimeout(state.cleanupTimer);
139
- state.cleanupTimer = setTimeout(() => {
140
- this.runs.delete(runId);
141
- }, COMPLETE_TTL_MS);
142
- }
143
- async *subscribe(runId) {
144
- const state = this.runs.get(runId);
145
- if (!state) throw new Error("UNKNOWN_RUN");
146
- state.subscriberCount += 1;
147
- try {
148
- let nextSeq = eventSeq(state.events[0]) ?? state.nextSeq;
149
- while (true) {
150
- const earliestSeq = eventSeq(state.events[0]);
151
- if (earliestSeq !== void 0 && nextSeq < earliestSeq) nextSeq = earliestSeq;
152
- const available = findEventAtOrAfter(state.events, nextSeq);
153
- if (available) {
154
- nextSeq = (eventSeq(available) ?? nextSeq) + 1;
155
- yield available;
156
- continue;
157
- }
158
- if (state.done) break;
159
- await new Promise((resolve) => {
160
- state.waiters.push(resolve);
161
- });
162
- }
163
- } finally {
164
- state.subscriberCount -= 1;
165
- }
166
- }
167
- };
168
- //#endregion
169
- export { AgentRunRelay };
@@ -1,53 +0,0 @@
1
- import type { Context } from 'hono';
2
- import type { GatewayService } from '../service.js';
3
- /** Close long-lived gateway event streams before the HTTP server starts draining. */
4
- export declare function closeAllEventStreams(): void;
5
- export interface SSEHandlerConfig {
6
- service: GatewayService;
7
- maxSseConnections?: number;
8
- }
9
- /**
10
- * POST /api/agent/resume — Re-attach to an in-progress agent run via SSE.
11
- *
12
- * Request body: { runId, sessionKey }
13
- * The relay replays retained buffered events from the beginning and then live-tails
14
- * until the run completes.
15
- *
16
- * SSE events are the active run's retained and live stream events.
17
- */
18
- export declare function createAgentResumeHandler(config: SSEHandlerConfig): (c: Context) => Promise<Response>;
19
- /**
20
- * POST /api/send — Send a message through a channel (non-streaming).
21
- */
22
- export declare function createSendHandler(config: SSEHandlerConfig): (c: Context) => Promise<(Response & import("hono").TypedResponse<{
23
- ok: false;
24
- error: {
25
- code: string;
26
- message: string;
27
- };
28
- }, 400, "json">) | (Response & import("hono").TypedResponse<{
29
- ok: true;
30
- payload: {
31
- sent: boolean;
32
- messageId?: string;
33
- };
34
- }, import("hono/dist/types/utils/http-status.js").ContentfulStatusCode, "json">) | (Response & import("hono").TypedResponse<{
35
- ok: false;
36
- error: {
37
- code: string;
38
- message: string;
39
- };
40
- }, 500, "json">)>;
41
- /**
42
- * GET /api/events — Server-pushed event stream (SSE).
43
- *
44
- * The client opens this long-lived connection to receive:
45
- * - channel status changes
46
- * - config reload notifications
47
- * - cron execution results
48
- * - any other server-initiated events
49
- *
50
- * Supports Last-Event-ID for reconnection.
51
- * Enforces maximum connection limit to prevent DoS.
52
- */
53
- export declare function createEventsSSEHandler(config: SSEHandlerConfig): (c: Context) => Promise<Response>;
@@ -1,207 +0,0 @@
1
- import { updateAsyncLogContext } from "../../utils/logger/context.js";
2
- import { createLogger } from "../../utils/logger/index.js";
3
- import { init_logger } from "../../utils/logger.js";
4
- import { stringifySSEData } from "./sse-json.js";
5
- import { streamSSE } from "hono/streaming";
6
- //#region src/gateway/hono/sse.ts
7
- init_logger();
8
- const log = createLogger("Gateway:SSE");
9
- const activeConnections = /* @__PURE__ */ new Map();
10
- /** Close long-lived gateway event streams before the HTTP server starts draining. */
11
- function closeAllEventStreams() {
12
- for (const controller of activeConnections.values()) controller.abort();
13
- }
14
- /**
15
- * POST /api/agent/resume — Re-attach to an in-progress agent run via SSE.
16
- *
17
- * Request body: { runId, sessionKey }
18
- * The relay replays retained buffered events from the beginning and then live-tails
19
- * until the run completes.
20
- *
21
- * SSE events are the active run's retained and live stream events.
22
- */
23
- function createAgentResumeHandler(config) {
24
- const { service } = config;
25
- return async (c) => {
26
- const body = await c.req.json().catch(() => null);
27
- if (!body || typeof body !== "object") return c.json({
28
- ok: false,
29
- error: {
30
- code: "BAD_REQUEST",
31
- message: "Invalid JSON body"
32
- }
33
- }, 400);
34
- const { runId, sessionKey } = body;
35
- if (typeof sessionKey === "string" && sessionKey.trim()) updateAsyncLogContext({ sessionKey: sessionKey.trim() });
36
- if (!runId || typeof runId !== "string") return c.json({
37
- ok: false,
38
- error: {
39
- code: "BAD_REQUEST",
40
- message: "Missing required field: runId"
41
- }
42
- }, 400);
43
- if (!service.agentRunner.runRelay.hasRun(runId)) return c.json({
44
- ok: false,
45
- error: {
46
- code: "NOT_FOUND",
47
- message: "Run not found or already expired"
48
- }
49
- }, 404);
50
- c.header("X-Accel-Buffering", "no");
51
- return streamSSE(c, async (stream) => {
52
- let eventId = 0;
53
- try {
54
- for await (const event of service.agentRunner.runRelay.subscribe(runId)) await stream.writeSSE({
55
- id: typeof event.seq === "number" ? String(event.seq) : String(++eventId),
56
- event: event.type || "message",
57
- data: stringifySSEData(event)
58
- });
59
- } catch (error) {
60
- log.error({
61
- err: error,
62
- runId
63
- }, "Resume stream failed");
64
- await stream.writeSSE({
65
- id: String(++eventId),
66
- event: "error",
67
- data: stringifySSEData({
68
- type: "error",
69
- runId,
70
- sessionKey: typeof sessionKey === "string" ? sessionKey : "",
71
- timestamp: Date.now(),
72
- payload: {
73
- code: "INTERNAL_ERROR",
74
- message: error instanceof Error ? error.message : "Unknown error"
75
- }
76
- })
77
- });
78
- }
79
- });
80
- };
81
- }
82
- /**
83
- * POST /api/send — Send a message through a channel (non-streaming).
84
- */
85
- function createSendHandler(config) {
86
- const { service } = config;
87
- return async (c) => {
88
- const body = await c.req.json().catch(() => ({}));
89
- const channel = body.channel;
90
- const chatId = body.chatId;
91
- const content = body.content;
92
- if (!channel || !chatId || !content) return c.json({
93
- ok: false,
94
- error: {
95
- code: "BAD_REQUEST",
96
- message: "Missing required fields: channel, chatId, content"
97
- }
98
- }, 400);
99
- try {
100
- const result = await service.sendMessage(channel, chatId, content);
101
- return c.json({
102
- ok: true,
103
- payload: result
104
- });
105
- } catch (error) {
106
- log.error({ err: error }, "Send failed");
107
- return c.json({
108
- ok: false,
109
- error: {
110
- code: "INTERNAL_ERROR",
111
- message: error instanceof Error ? error.message : "Unknown error"
112
- }
113
- }, 500);
114
- }
115
- };
116
- }
117
- /**
118
- * GET /api/events — Server-pushed event stream (SSE).
119
- *
120
- * The client opens this long-lived connection to receive:
121
- * - channel status changes
122
- * - config reload notifications
123
- * - cron execution results
124
- * - any other server-initiated events
125
- *
126
- * Supports Last-Event-ID for reconnection.
127
- * Enforces maximum connection limit to prevent DoS.
128
- */
129
- function createEventsSSEHandler(config) {
130
- const { service } = config;
131
- const maxConnections = config.maxSseConnections ?? 100;
132
- return async (c) => {
133
- if (activeConnections.size >= maxConnections) {
134
- log.warn({
135
- current: activeConnections.size,
136
- max: maxConnections
137
- }, "SSE connection limit reached");
138
- return c.json({
139
- ok: false,
140
- error: {
141
- code: "TOO_MANY_CONNECTIONS",
142
- message: "Maximum SSE connections exceeded"
143
- }
144
- }, 503);
145
- }
146
- const lastEventId = c.req.header("Last-Event-ID") || void 0;
147
- const sessionId = c.req.header("X-Session-Id") || c.req.query("sessionId") || crypto.randomUUID();
148
- updateAsyncLogContext({ sessionId: String(sessionId) });
149
- const abortController = new AbortController();
150
- activeConnections.set(sessionId, abortController);
151
- return streamSSE(c, async (stream) => {
152
- let aborted = false;
153
- await stream.writeSSE({
154
- id: "0",
155
- event: "connected",
156
- data: JSON.stringify({ sessionId })
157
- });
158
- const cleanup = service.subscribe(sessionId, async (event) => {
159
- if (aborted) return;
160
- try {
161
- await stream.writeSSE({
162
- id: event.id,
163
- event: event.type,
164
- data: JSON.stringify(event.payload)
165
- });
166
- } catch {}
167
- });
168
- if (lastEventId) {
169
- const missed = service.getEventsSince(sessionId, lastEventId);
170
- for (const event of missed) await stream.writeSSE({
171
- id: event.id,
172
- event: event.type,
173
- data: JSON.stringify(event.payload)
174
- });
175
- }
176
- const keepAlive = setInterval(async () => {
177
- if (aborted) {
178
- clearInterval(keepAlive);
179
- return;
180
- }
181
- try {
182
- await stream.writeSSE({
183
- event: "ping",
184
- data: ""
185
- });
186
- } catch {
187
- clearInterval(keepAlive);
188
- }
189
- }, 3e4);
190
- await new Promise((resolve) => {
191
- const finish = () => {
192
- aborted = true;
193
- clearInterval(keepAlive);
194
- cleanup();
195
- activeConnections.delete(sessionId);
196
- log.debug({ sessionId }, "Event stream disconnected");
197
- resolve();
198
- };
199
- stream.onAbort(finish);
200
- abortController.signal.addEventListener("abort", () => stream.abort(), { once: true });
201
- if (abortController.signal.aborted) stream.abort();
202
- });
203
- });
204
- };
205
- }
206
- //#endregion
207
- export { closeAllEventStreams, createAgentResumeHandler, createEventsSSEHandler, createSendHandler };
@@ -1,10 +0,0 @@
1
- import type { ServiceEvent } from './types.js';
2
- export type GatewaySseListener = (event: ServiceEvent) => Promise<void> | void;
3
- export declare class GatewaySseHub {
4
- private eventCounter;
5
- private subscribers;
6
- private eventBuffers;
7
- subscribe(sessionId: string, listener: GatewaySseListener): () => void;
8
- emit(type: string, payload: unknown): void;
9
- getEventsSince(sessionId: string, lastEventId: string): ServiceEvent[];
10
- }
@@ -1,53 +0,0 @@
1
- import { createLogger } from "../../utils/logger/index.js";
2
- import { init_logger } from "../../utils/logger.js";
3
- //#region src/gateway/service/sse-hub.ts
4
- init_logger();
5
- const log = createLogger("Gateway:Service");
6
- const EVENT_BUFFER_SIZE = 200;
7
- var GatewaySseHub = class {
8
- eventCounter = 0;
9
- subscribers = /* @__PURE__ */ new Map();
10
- eventBuffers = /* @__PURE__ */ new Map();
11
- subscribe(sessionId, listener) {
12
- this.subscribers.set(sessionId, listener);
13
- if (!this.eventBuffers.has(sessionId)) this.eventBuffers.set(sessionId, []);
14
- log.debug({ sessionId }, "Event subscriber added");
15
- return () => {
16
- this.subscribers.delete(sessionId);
17
- setTimeout(() => {
18
- if (!this.subscribers.has(sessionId)) this.eventBuffers.delete(sessionId);
19
- }, 5 * 6e4);
20
- log.debug({ sessionId }, "Event subscriber removed");
21
- };
22
- }
23
- emit(type, payload) {
24
- const event = {
25
- id: String(++this.eventCounter),
26
- type,
27
- payload
28
- };
29
- for (const [sessionId, listener] of this.subscribers) {
30
- const buf = this.eventBuffers.get(sessionId) || [];
31
- buf.push(event);
32
- if (buf.length > EVENT_BUFFER_SIZE) buf.shift();
33
- this.eventBuffers.set(sessionId, buf);
34
- try {
35
- listener(event);
36
- } catch (err) {
37
- log.warn({
38
- sessionId,
39
- err
40
- }, "Failed to deliver event to subscriber");
41
- }
42
- }
43
- }
44
- getEventsSince(sessionId, lastEventId) {
45
- const buf = this.eventBuffers.get(sessionId);
46
- if (!buf) return [];
47
- const idx = buf.findIndex((e) => e.id === lastEventId);
48
- if (idx === -1) return buf;
49
- return buf.slice(idx + 1);
50
- }
51
- };
52
- //#endregion
53
- export { GatewaySseHub };
@@ -1,15 +0,0 @@
1
- import type { ParsedSSEEvent } from './tui-types.js';
2
- /**
3
- * Consume an SSE stream from a `ReadableStream<Uint8Array>` (Node.js 22+ fetch body).
4
- *
5
- * Parses the standard SSE wire format:
6
- * event: <name>\n
7
- * data: <json>\n
8
- * id: <id>\n
9
- * \n
10
- *
11
- * Calls `onEvent` for each complete event block.
12
- */
13
- export declare function consumeSSEStream(body: ReadableStream<Uint8Array>, onEvent: (event: ParsedSSEEvent) => void, signal?: AbortSignal): Promise<void>;
14
- /** Parse SSE data field as JSON, returning null on failure. */
15
- export declare function parseSSEData<T = unknown>(data: string): T | null;
@@ -1,73 +0,0 @@
1
- //#region src/tui/sse-consumer.ts
2
- /**
3
- * Consume an SSE stream from a `ReadableStream<Uint8Array>` (Node.js 22+ fetch body).
4
- *
5
- * Parses the standard SSE wire format:
6
- * event: <name>\n
7
- * data: <json>\n
8
- * id: <id>\n
9
- * \n
10
- *
11
- * Calls `onEvent` for each complete event block.
12
- */
13
- async function consumeSSEStream(body, onEvent, signal) {
14
- const reader = body.getReader();
15
- const decoder = new TextDecoder();
16
- let buffer = "";
17
- let currentEvent = "";
18
- let currentData = "";
19
- let currentId = "";
20
- try {
21
- while (true) {
22
- if (signal?.aborted) break;
23
- const { done, value } = await reader.read();
24
- if (done) break;
25
- buffer += decoder.decode(value, { stream: true });
26
- const lines = buffer.split("\n");
27
- buffer = lines.pop() ?? "";
28
- for (const line of lines) {
29
- if (line === "") {
30
- if (currentData) onEvent({
31
- event: currentEvent || "message",
32
- data: currentData,
33
- id: currentId || void 0
34
- });
35
- currentEvent = "";
36
- currentData = "";
37
- currentId = "";
38
- continue;
39
- }
40
- if (line.startsWith(":")) continue;
41
- const colonIndex = line.indexOf(":");
42
- if (colonIndex === -1) continue;
43
- const field = line.slice(0, colonIndex);
44
- const valueStart = line[colonIndex + 1] === " " ? colonIndex + 2 : colonIndex + 1;
45
- const fieldValue = line.slice(valueStart);
46
- switch (field) {
47
- case "event":
48
- currentEvent = fieldValue;
49
- break;
50
- case "data":
51
- currentData = currentData ? `${currentData}\n${fieldValue}` : fieldValue;
52
- break;
53
- case "id":
54
- currentId = fieldValue;
55
- break;
56
- }
57
- }
58
- }
59
- } finally {
60
- buffer += decoder.decode();
61
- reader.releaseLock();
62
- }
63
- }
64
- /** Parse SSE data field as JSON, returning null on failure. */
65
- function parseSSEData(data) {
66
- try {
67
- return JSON.parse(data);
68
- } catch {
69
- return null;
70
- }
71
- }
72
- //#endregion
73
- export { consumeSSEStream, parseSSEData };