@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
@@ -11,7 +11,7 @@
11
11
  <link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20260713-1" />
12
12
  <link rel="manifest" href="/site.webmanifest?v=20260713-1" />
13
13
  <title>XOPC — Turn goals into loops. Keep what matters moving.</title>
14
- <script type="module" crossorigin src="/assets/index-OJgiMh07.js"></script>
14
+ <script type="module" crossorigin src="/assets/index-BvR-i-m6.js"></script>
15
15
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/vendor-react-BOUWij0V.js">
@@ -23,17 +23,17 @@
23
23
  <link rel="modulepreload" crossorigin href="/assets/createLucideIcon-DPHK1VkS.js">
24
24
  <link rel="modulepreload" crossorigin href="/assets/check-DUBLcKHA.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/middleware-Pd0e8Igk.js">
26
- <link rel="modulepreload" crossorigin href="/assets/messages-D02NNLCZ.js">
27
- <link rel="modulepreload" crossorigin href="/assets/locale-store-D6hs74o5.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/messages-CMjnbdbn.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/locale-store-DUW5YE3R.js">
28
28
  <link rel="modulepreload" crossorigin href="/assets/cn-JdwAhgNB.js">
29
- <link rel="modulepreload" crossorigin href="/assets/schemas-C6onAggk.js">
30
- <link rel="modulepreload" crossorigin href="/assets/product-delivery-C8JbSj5Y.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/schemas-zIBW3wiV.js">
30
+ <link rel="modulepreload" crossorigin href="/assets/product-delivery-tRr-7IxY.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/config-reload-event-Bjh2zoKp.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/copy-to-clipboard-HOJ79TWv.js">
33
- <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-B2DmdlwO.js">
34
- <link rel="modulepreload" crossorigin href="/assets/activity-store--QoUGhiS.js">
35
- <link rel="modulepreload" crossorigin href="/assets/theme-store-BRxdsmic.js">
36
- <link rel="stylesheet" crossorigin href="/assets/index-Cl5n1f_U.css">
33
+ <link rel="modulepreload" crossorigin href="/assets/gateway-startup-retry-DxhKNiCF.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/activity-store-DTFKTPs8.js">
35
+ <link rel="modulepreload" crossorigin href="/assets/theme-store-BkJe7UDo.js">
36
+ <link rel="stylesheet" crossorigin href="/assets/index-zybP34zk.css">
37
37
  </head>
38
38
  <body>
39
39
  <div id="root"></div>
package/dist/package.js CHANGED
@@ -1,4 +1,4 @@
1
1
  //#region package.json
2
- var version = "0.0.188";
2
+ var version = "0.0.189";
3
3
  //#endregion
4
4
  export { version };
@@ -0,0 +1,184 @@
1
+ import { z } from "zod";
2
+ const ENDPOINT_MAX_FILE_BYTES = 25 * 1024 * 1024;
3
+ const ENDPOINT_INVOCATION_RECEIPT_TIMEOUT_MS = 3e3;
4
+ const endpointKindSchema = z.enum([
5
+ "web",
6
+ "desktop",
7
+ "mobile"
8
+ ]);
9
+ const endpointAvailabilitySchema = z.enum(["foreground", "background"]);
10
+ const endpointEffectSchema = z.enum([
11
+ "read",
12
+ "write",
13
+ "destructive"
14
+ ]);
15
+ const endpointConfirmationSchema = z.enum(["never", "always"]);
16
+ const endpointResultKindSchema = z.enum([
17
+ "text",
18
+ "json",
19
+ "file"
20
+ ]);
21
+ const identifierSchema = z.string().min(1).max(160);
22
+ const turnTokenSchema = z.string().min(32).max(160).regex(/^[A-Za-z0-9_-]+$/);
23
+ const turnOriginSchema = z.discriminatedUnion("type", [
24
+ z.strictObject({
25
+ type: z.literal("endpoint"),
26
+ endpointId: identifierSchema
27
+ }),
28
+ z.strictObject({
29
+ type: z.literal("channel"),
30
+ channel: z.string().min(1).max(64)
31
+ }),
32
+ z.strictObject({
33
+ type: z.literal("system"),
34
+ source: z.enum([
35
+ "cli",
36
+ "automation",
37
+ "heartbeat",
38
+ "workflow",
39
+ "internal"
40
+ ])
41
+ })
42
+ ]);
43
+ const endpointTurnClaimSchema = turnOriginSchema.options[0].extend({ token: turnTokenSchema });
44
+ const messageIdSchema = z.uuid();
45
+ const timestampSchema = z.number().int().nonnegative();
46
+ const jsonObjectSchema = z.record(z.string(), z.unknown());
47
+ const endpointToolDescriptorSchema = z.strictObject({
48
+ name: z.string().regex(/^[a-z][a-z0-9_]*(?:\.[a-z][a-z0-9_]*)+$/).max(120),
49
+ title: z.string().min(1).max(120),
50
+ description: z.string().min(1).max(2e3),
51
+ inputSchema: jsonObjectSchema,
52
+ effect: endpointEffectSchema,
53
+ confirmation: endpointConfirmationSchema,
54
+ requiresForeground: z.boolean(),
55
+ requiredPermissions: z.array(z.string().min(1).max(120)).max(20),
56
+ timeoutMs: z.number().int().min(1e3).max(3e5),
57
+ maxConcurrency: z.number().int().min(1).max(4),
58
+ supportsCancellation: z.boolean(),
59
+ idempotent: z.boolean(),
60
+ resultKinds: z.array(endpointResultKindSchema).min(1).max(3)
61
+ });
62
+ const endpointPrincipalRegistrationSchema = z.strictObject({
63
+ principalId: identifierSchema,
64
+ displayName: z.string().min(1).max(120),
65
+ kind: endpointKindSchema,
66
+ platform: z.string().min(1).max(80),
67
+ publicKey: z.string().min(32).max(2048)
68
+ });
69
+ const endpointHelloPayloadSchema = z.strictObject({
70
+ principalId: identifierSchema,
71
+ endpointId: identifierSchema,
72
+ connectionInstanceId: z.uuid(),
73
+ displayName: z.string().min(1).max(120),
74
+ kind: endpointKindSchema,
75
+ platform: z.string().min(1).max(80),
76
+ appVersion: z.string().min(1).max(80),
77
+ availability: endpointAvailabilitySchema,
78
+ nonce: identifierSchema,
79
+ signedAt: timestampSchema,
80
+ signature: z.string().min(16).max(1024),
81
+ tools: z.array(endpointToolDescriptorSchema).max(100)
82
+ });
83
+ const toolInvokePayloadSchema = z.strictObject({
84
+ invocationId: z.uuid(),
85
+ toolCallId: identifierSchema,
86
+ toolName: endpointToolDescriptorSchema.shape.name,
87
+ arguments: jsonObjectSchema,
88
+ descriptorRevision: z.string().min(1).max(128),
89
+ confirmationRequired: z.boolean(),
90
+ deadlineAt: timestampSchema,
91
+ uploadGrant: z.strictObject({
92
+ path: z.string().startsWith("/").max(500),
93
+ token: identifierSchema,
94
+ maxBytes: z.number().int().positive(),
95
+ maxFiles: z.number().int().min(1).max(20),
96
+ expiresAt: timestampSchema
97
+ }).optional()
98
+ });
99
+ const toolCancelPayloadSchema = z.strictObject({
100
+ invocationId: z.uuid(),
101
+ reason: z.string().min(1).max(500)
102
+ });
103
+ const invocationPayloadSchema = z.strictObject({ invocationId: z.uuid() });
104
+ const endpointToolContentSchema = z.discriminatedUnion("type", [
105
+ z.strictObject({
106
+ type: z.literal("text"),
107
+ text: z.string().max(256 * 1024)
108
+ }),
109
+ z.strictObject({
110
+ type: z.literal("json"),
111
+ value: z.unknown()
112
+ }),
113
+ z.strictObject({
114
+ type: z.literal("file"),
115
+ fileId: identifierSchema,
116
+ name: z.string().min(1).max(255),
117
+ mimeType: z.string().min(1).max(255),
118
+ size: z.number().int().nonnegative(),
119
+ sha256: z.string().regex(/^[a-f0-9]{64}$/)
120
+ })
121
+ ]);
122
+ const endpointToolErrorCodeSchema = z.enum([
123
+ "ENDPOINT_OFFLINE",
124
+ "ENDPOINT_NOT_FOREGROUND",
125
+ "ENDPOINT_DISCONNECTED",
126
+ "TOOL_NOT_FOUND",
127
+ "TOOL_REVISION_MISMATCH",
128
+ "INVALID_ARGUMENTS",
129
+ "PERMISSION_DENIED",
130
+ "USER_DENIED",
131
+ "TOOL_BUSY",
132
+ "TOOL_TIMEOUT",
133
+ "TOOL_CANCELLED",
134
+ "RESULT_TOO_LARGE",
135
+ "PROTOCOL_ERROR"
136
+ ]);
137
+ const envelope = (type, payload) => z.strictObject({
138
+ protocolVersion: z.literal(1),
139
+ messageId: messageIdSchema,
140
+ type: z.literal(type),
141
+ sentAt: timestampSchema,
142
+ payload
143
+ });
144
+ const clientEndpointMessageSchema = z.discriminatedUnion("type", [
145
+ envelope("endpoint.availability_changed", z.strictObject({ availability: endpointAvailabilitySchema })),
146
+ envelope("tool.received", invocationPayloadSchema),
147
+ envelope("tool.progress", z.strictObject({
148
+ invocationId: z.uuid(),
149
+ message: z.string().max(500).optional(),
150
+ percent: z.number().min(0).max(100).optional()
151
+ })),
152
+ envelope("tool.result", z.strictObject({
153
+ invocationId: z.uuid(),
154
+ content: z.array(endpointToolContentSchema).min(1).max(20),
155
+ details: jsonObjectSchema.optional()
156
+ })),
157
+ envelope("tool.error", z.strictObject({
158
+ invocationId: z.uuid(),
159
+ code: endpointToolErrorCodeSchema,
160
+ message: z.string().min(1).max(2e3)
161
+ })),
162
+ envelope("tool.cancelled", invocationPayloadSchema)
163
+ ]);
164
+ const serverEndpointMessageSchema = z.discriminatedUnion("type", [envelope("tool.invoke", toolInvokePayloadSchema), envelope("tool.cancel", toolCancelPayloadSchema)]);
165
+ function canonicalJson(value) {
166
+ if (value === null) return "null";
167
+ if (typeof value === "string" || typeof value === "boolean") return JSON.stringify(value);
168
+ if (typeof value === "number") {
169
+ if (!Number.isFinite(value)) throw new Error("Canonical JSON only supports finite numbers");
170
+ return JSON.stringify(value);
171
+ }
172
+ if (typeof value !== "object") throw new Error(`Canonical JSON does not support ${typeof value}`);
173
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
174
+ const prototype = Object.getPrototypeOf(value);
175
+ if (prototype !== Object.prototype && prototype !== null) throw new Error("Canonical JSON only supports plain objects");
176
+ const record = value;
177
+ return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
178
+ }
179
+ function endpointHelloSigningPayload(payload) {
180
+ const { signature: _signature, ...unsigned } = payload;
181
+ return canonicalJson(unsigned);
182
+ }
183
+ //#endregion
184
+ export { ENDPOINT_INVOCATION_RECEIPT_TIMEOUT_MS, ENDPOINT_MAX_FILE_BYTES, canonicalJson, clientEndpointMessageSchema, endpointHelloPayloadSchema, endpointHelloSigningPayload, endpointPrincipalRegistrationSchema, endpointTurnClaimSchema, serverEndpointMessageSchema, turnOriginSchema };
@@ -0,0 +1,199 @@
1
+ import { parseServerRealtimeMessage } from "../../realtime-protocol/src/index.js";
2
+ //#region packages/realtime-client/src/index.ts
3
+ function clientMessage(kind, payload) {
4
+ return {
5
+ protocolVersion: 1,
6
+ messageId: crypto.randomUUID(),
7
+ kind,
8
+ sentAt: Date.now(),
9
+ payload
10
+ };
11
+ }
12
+ function frameText(data) {
13
+ if (typeof data === "string") return data;
14
+ if (data instanceof ArrayBuffer) return new TextDecoder().decode(data);
15
+ if (ArrayBuffer.isView(data)) {
16
+ const bytes = Uint8Array.from(new Uint8Array(data.buffer, data.byteOffset, data.byteLength));
17
+ return new TextDecoder().decode(bytes);
18
+ }
19
+ throw new Error("Realtime server sent a non-text frame");
20
+ }
21
+ var RealtimeClient = class {
22
+ desiredSubscriptions = /* @__PURE__ */ new Map();
23
+ cursors = /* @__PURE__ */ new Map();
24
+ socket;
25
+ reconnectTimer;
26
+ heartbeatTimer;
27
+ generation = 0;
28
+ reconnectAttempts = 0;
29
+ shouldReconnect = false;
30
+ ready = false;
31
+ endpointBinding;
32
+ constructor(options) {
33
+ this.options = options;
34
+ }
35
+ connect() {
36
+ if (this.shouldReconnect) return;
37
+ this.shouldReconnect = true;
38
+ this.open(false);
39
+ }
40
+ disconnect() {
41
+ this.shouldReconnect = false;
42
+ this.generation += 1;
43
+ this.clearTimers();
44
+ this.ready = false;
45
+ this.endpointBinding?.onDisconnected?.();
46
+ this.socket?.close(1e3, "Client disconnected");
47
+ this.socket = void 0;
48
+ this.options.onStateChange?.("disconnected");
49
+ }
50
+ reconnect() {
51
+ this.generation += 1;
52
+ this.clearTimers();
53
+ this.ready = false;
54
+ this.endpointBinding?.onDisconnected?.();
55
+ this.socket?.close(1e3, "Client reconnecting");
56
+ this.socket = void 0;
57
+ this.reconnectAttempts = 0;
58
+ this.shouldReconnect = true;
59
+ this.open(true);
60
+ }
61
+ subscribe(topic, afterSeq) {
62
+ this.desiredSubscriptions.set(topic, afterSeq);
63
+ if (this.ready) {
64
+ this.sendSubscriptions([{
65
+ topic,
66
+ afterSeq: afterSeq ?? this.cursors.get(topic)
67
+ }]);
68
+ this.desiredSubscriptions.set(topic, void 0);
69
+ }
70
+ }
71
+ unsubscribe(topic) {
72
+ this.desiredSubscriptions.delete(topic);
73
+ if (this.ready) this.send(clientMessage("realtime.unsubscribe", { topics: [topic] }));
74
+ }
75
+ sendEndpointMessage(message) {
76
+ if (!this.ready) throw new Error("Realtime connection is not ready");
77
+ this.send(clientMessage("endpoint.message", message));
78
+ }
79
+ setEndpoint(binding) {
80
+ this.endpointBinding = binding;
81
+ if (this.shouldReconnect) this.reconnect();
82
+ }
83
+ clearEndpoint(binding) {
84
+ if (binding && this.endpointBinding !== binding) return;
85
+ const previous = this.endpointBinding;
86
+ this.endpointBinding = void 0;
87
+ previous?.onDisconnected?.();
88
+ if (this.shouldReconnect) this.reconnect();
89
+ }
90
+ async open(reconnecting) {
91
+ const generation = ++this.generation;
92
+ this.options.onStateChange?.(reconnecting ? "reconnecting" : "connecting");
93
+ try {
94
+ const [ticket, endpoint] = await Promise.all([this.options.issueTicket(), this.endpointBinding?.createHello()]);
95
+ if (!this.shouldReconnect || generation !== this.generation) return;
96
+ const socket = this.options.createWebSocket(this.options.getWebSocketUrl());
97
+ this.socket = socket;
98
+ socket.onopen = () => {
99
+ if (generation !== this.generation) return;
100
+ const subscriptions = [...this.desiredSubscriptions].map(([topic, afterSeq]) => ({
101
+ topic,
102
+ afterSeq: afterSeq ?? this.cursors.get(topic)
103
+ }));
104
+ for (const topic of this.desiredSubscriptions.keys()) this.desiredSubscriptions.set(topic, void 0);
105
+ this.send(clientMessage("realtime.hello", {
106
+ ticket,
107
+ clientId: this.options.clientId,
108
+ clientKind: this.options.clientKind,
109
+ subscriptions,
110
+ ...endpoint ? { endpoint } : {}
111
+ }));
112
+ };
113
+ socket.onmessage = (event) => {
114
+ if (generation !== this.generation) return;
115
+ try {
116
+ this.handleServerMessage(frameText(event.data));
117
+ } catch (error) {
118
+ this.fail(error instanceof Error ? error.message : "Invalid realtime server message");
119
+ }
120
+ };
121
+ socket.onerror = () => {
122
+ if (generation === this.generation) this.options.onStateChange?.("reconnecting");
123
+ };
124
+ socket.onclose = (event) => {
125
+ if (generation !== this.generation) return;
126
+ this.ready = false;
127
+ this.endpointBinding?.onDisconnected?.();
128
+ this.socket = void 0;
129
+ this.clearHeartbeat();
130
+ if (this.shouldReconnect) this.scheduleReconnect(event.reason || `WebSocket closed (${event.code ?? 0})`);
131
+ else this.options.onStateChange?.("disconnected");
132
+ };
133
+ } catch (error) {
134
+ if (generation !== this.generation) return;
135
+ this.scheduleReconnect(error instanceof Error ? error.message : "Realtime connection failed");
136
+ }
137
+ }
138
+ handleServerMessage(text) {
139
+ const message = parseServerRealtimeMessage(JSON.parse(text));
140
+ if (message.kind === "realtime.ready") {
141
+ this.ready = true;
142
+ this.reconnectAttempts = 0;
143
+ this.options.onStateChange?.("connected");
144
+ if (message.payload.endpoint) this.endpointBinding?.onReady(message.payload.endpoint);
145
+ this.clearHeartbeat();
146
+ this.heartbeatTimer = setInterval(() => {
147
+ if (this.ready) this.send(clientMessage("realtime.ping", {}));
148
+ }, message.payload.heartbeatIntervalMs);
149
+ } else if (message.kind === "realtime.event") {
150
+ this.cursors.set(message.payload.topic, message.payload.seq);
151
+ this.options.onEvent?.(message.payload);
152
+ } else if (message.kind === "realtime.gap") {
153
+ this.cursors.set(message.payload.topic, message.payload.earliestSeq - 1);
154
+ this.options.onGap?.(message.payload);
155
+ } else if (message.kind === "realtime.error") this.options.onStateChange?.("error", message.payload.message);
156
+ else if (message.kind === "endpoint.message") {
157
+ this.endpointBinding?.onMessage(message.payload);
158
+ this.options.onEndpointMessage?.(message.payload);
159
+ }
160
+ }
161
+ sendSubscriptions(subscriptions) {
162
+ this.send(clientMessage("realtime.subscribe", { subscriptions }));
163
+ }
164
+ send(message) {
165
+ if (!this.socket || this.socket.readyState !== 1) return;
166
+ this.socket.send(JSON.stringify(message));
167
+ }
168
+ scheduleReconnect(error) {
169
+ if (!this.shouldReconnect) return;
170
+ this.reconnectAttempts += 1;
171
+ const max = this.options.maxReconnectAttempts;
172
+ if (max !== void 0 && this.reconnectAttempts > max) {
173
+ this.shouldReconnect = false;
174
+ this.options.onStateChange?.("error", error);
175
+ return;
176
+ }
177
+ this.options.onStateChange?.("reconnecting", error);
178
+ const delay = Math.min(3e4, 1e3 * 2 ** Math.min(this.reconnectAttempts - 1, 5));
179
+ this.reconnectTimer = setTimeout(() => {
180
+ this.reconnectTimer = void 0;
181
+ this.open(true);
182
+ }, delay);
183
+ }
184
+ fail(message) {
185
+ this.options.onStateChange?.("error", message);
186
+ this.socket?.close(4400, "Invalid server message");
187
+ }
188
+ clearHeartbeat() {
189
+ if (this.heartbeatTimer) clearInterval(this.heartbeatTimer);
190
+ this.heartbeatTimer = void 0;
191
+ }
192
+ clearTimers() {
193
+ if (this.reconnectTimer) clearTimeout(this.reconnectTimer);
194
+ this.reconnectTimer = void 0;
195
+ this.clearHeartbeat();
196
+ }
197
+ };
198
+ //#endregion
199
+ export { RealtimeClient };
@@ -0,0 +1,83 @@
1
+ import { clientEndpointMessageSchema, endpointHelloPayloadSchema, serverEndpointMessageSchema } from "../../endpoint-tools-protocol/src/index.js";
2
+ import { z } from "zod";
3
+ const REALTIME_MAX_CLIENT_FRAME_BYTES = 256 * 1024;
4
+ const REALTIME_HELLO_TIMEOUT_MS = 5e3;
5
+ const REALTIME_HEARTBEAT_INTERVAL_MS = 15e3;
6
+ const REALTIME_HEARTBEAT_TIMEOUT_MS = 45e3;
7
+ const realtimeClientKindSchema = z.enum([
8
+ "web",
9
+ "desktop",
10
+ "mobile",
11
+ "tui",
12
+ "mcp"
13
+ ]);
14
+ const realtimeTopicSchema = z.string().min(1).max(512);
15
+ const realtimeEventNameSchema = z.string().regex(/^[a-z][a-z0-9_.-]*$/).max(160);
16
+ const messageIdSchema = z.uuid();
17
+ const timestampSchema = z.number().int().nonnegative();
18
+ const sequenceSchema = z.number().int().positive();
19
+ const envelope = (kind, payload) => z.strictObject({
20
+ protocolVersion: z.literal(1),
21
+ messageId: messageIdSchema,
22
+ kind: z.literal(kind),
23
+ sentAt: timestampSchema,
24
+ payload
25
+ });
26
+ const realtimeSubscriptionSchema = z.strictObject({
27
+ topic: realtimeTopicSchema,
28
+ afterSeq: z.number().int().nonnegative().optional()
29
+ });
30
+ const clientRealtimeMessageSchema = z.discriminatedUnion("kind", [
31
+ envelope("realtime.hello", z.strictObject({
32
+ ticket: z.string().min(32).max(512),
33
+ clientId: z.string().min(1).max(160),
34
+ clientKind: realtimeClientKindSchema,
35
+ subscriptions: z.array(realtimeSubscriptionSchema).max(100).default([]),
36
+ endpoint: endpointHelloPayloadSchema.optional()
37
+ })),
38
+ envelope("realtime.subscribe", z.strictObject({ subscriptions: z.array(realtimeSubscriptionSchema).min(1).max(100) })),
39
+ envelope("realtime.unsubscribe", z.strictObject({ topics: z.array(realtimeTopicSchema).min(1).max(100) })),
40
+ envelope("realtime.ping", z.strictObject({})),
41
+ envelope("endpoint.message", clientEndpointMessageSchema)
42
+ ]);
43
+ const realtimeEventPayloadSchema = z.strictObject({
44
+ topic: realtimeTopicSchema,
45
+ seq: sequenceSchema,
46
+ event: realtimeEventNameSchema,
47
+ data: z.unknown()
48
+ });
49
+ const serverRealtimeMessageSchema = z.discriminatedUnion("kind", [
50
+ envelope("realtime.ready", z.strictObject({
51
+ connectionId: z.uuid(),
52
+ heartbeatIntervalMs: z.literal(REALTIME_HEARTBEAT_INTERVAL_MS),
53
+ heartbeatTimeoutMs: z.literal(REALTIME_HEARTBEAT_TIMEOUT_MS),
54
+ endpoint: z.strictObject({
55
+ endpointId: z.string().min(1).max(160),
56
+ turnToken: z.string().min(32).max(160)
57
+ }).optional()
58
+ })),
59
+ envelope("realtime.event", realtimeEventPayloadSchema),
60
+ envelope("realtime.gap", z.strictObject({
61
+ topic: realtimeTopicSchema,
62
+ requestedSeq: z.number().int().nonnegative(),
63
+ earliestSeq: sequenceSchema
64
+ })),
65
+ envelope("realtime.pong", z.strictObject({})),
66
+ envelope("realtime.error", z.strictObject({
67
+ code: z.string().min(1).max(80),
68
+ message: z.string().min(1).max(500)
69
+ })),
70
+ envelope("endpoint.message", serverEndpointMessageSchema)
71
+ ]);
72
+ function parseClientRealtimeMessage(value) {
73
+ return clientRealtimeMessageSchema.parse(value);
74
+ }
75
+ function parseServerRealtimeMessage(value) {
76
+ return serverRealtimeMessageSchema.parse(value);
77
+ }
78
+ function parseClientRealtimeJsonFrame(text) {
79
+ if (new TextEncoder().encode(text).byteLength > 262144) throw new Error(`Realtime client frame exceeds ${REALTIME_MAX_CLIENT_FRAME_BYTES} bytes`);
80
+ return JSON.parse(text);
81
+ }
82
+ //#endregion
83
+ export { REALTIME_HEARTBEAT_INTERVAL_MS, REALTIME_HEARTBEAT_TIMEOUT_MS, REALTIME_HELLO_TIMEOUT_MS, REALTIME_MAX_CLIENT_FRAME_BYTES, parseClientRealtimeJsonFrame, parseClientRealtimeMessage, parseServerRealtimeMessage, realtimeClientKindSchema, realtimeEventNameSchema, realtimeTopicSchema };
@@ -70,6 +70,7 @@ export interface AgentManagerConfig {
70
70
  model?: string;
71
71
  config?: Config;
72
72
  extensionRegistry?: ExtensionRegistry;
73
+ endpointTools?: import('../endpoint-tools/index.js').EndpointToolRuntime;
73
74
  hookRunner?: import('../extensions/index.js').ExtensionHookRunner;
74
75
  bus: MessageBus;
75
76
  getCurrentContext: () => SessionContext | null;
@@ -225,6 +225,7 @@ var AgentManager = class {
225
225
  return {
226
226
  workspace: this.baseWorkspacePath,
227
227
  extensionRegistry: this.config.extensionRegistry,
228
+ endpointTools: this.config.endpointTools,
228
229
  getCurrentContext: this.config.getCurrentContext,
229
230
  hookRunner: this.config.hookRunner,
230
231
  bus: this.config.bus,
@@ -1,2 +1,2 @@
1
- export declare const MEMORY_REVIEW_USER_PROMPT = "Review the conversation above and identify durable user-understanding candidates.\n\nFocus on:\n1. Has the user revealed things about themselves \u2014 persona, desires, preferences, or personal details worth remembering?\n2. Has the user expressed expectations about how you should behave, their work style, emotional-support preferences, boundaries, or how they want you to communicate?\n3. Has the user explicitly corrected a prior assumption? Prefer the correction and do not preserve the contradicted interpretation.\n\nReturn JSON only, with this shape:\n{\"candidates\":[{\"kind\":\"preference\",\"content\":\"...\",\"confidence\":0.8,\"importance\":0.7,\"durability\":\"durable\",\"sensitivity\":\"normal\",\"disclosurePolicy\":\"referenceable\",\"tags\":[\"background-review\"]}]}\n\nAllowed kinds: preference, boundary, relationship, project_context, commitment, routine, personal_logistics, open_question, milestone, current_state, task_lesson, tool_preference, long_term_goal, derived_insight.\nOnly include facts supported by the conversation and likely to matter in a future session. A temporary mood or one-off reaction is current context, not durable identity; omit it unless the user describes a recurring pattern that will matter later. Never include passwords, tokens, credentials, or speculative diagnoses. Use {\"candidates\":[]} when nothing qualifies.";
1
+ export declare const MEMORY_REVIEW_USER_PROMPT = "Review the conversation above and identify durable user-understanding candidates.\n\nFocus on:\n1. Has the user revealed things about themselves \u2014 persona, desires, preferences, or personal details worth remembering?\n2. Has the user expressed expectations about how you should behave, their work style, emotional-support preferences, boundaries, or how they want you to communicate?\n3. Has the user explicitly corrected a prior assumption? Prefer the correction and do not preserve the contradicted interpretation.\n\nReturn JSON only, with this shape:\n{\"candidates\":[{\"kind\":\"preference\",\"content\":\"...\",\"confidence\":0.8,\"importance\":0.7,\"durability\":\"durable\",\"sensitivity\":\"normal\",\"disclosurePolicy\":\"referenceable\",\"tags\":[\"background-review\"]}]}\n\nAllowed kinds: preference, boundary, relationship, project_context, commitment, routine, personal_logistics, open_question, milestone, current_state, task_lesson, tool_preference, long_term_goal, derived_insight.\nOnly include facts supported by the conversation and likely to matter in a future session. A temporary mood or one-off reaction is current context, not durable identity; omit it unless the user describes a recurring pattern that will matter later. Never include passwords, tokens, credentials, or speculative diagnoses. Use {\"candidates\":[]} when nothing qualifies.\n\nDo not turn a request about the current task into user understanding. Exclude requested outputs, follow-up instructions, project-note edits, investigations, and other one-off work. Every candidate must be a complete standalone statement about the user or an enduring pattern; never return a clause fragment beginning with a connector such as \"and\", \"also\", \"\u5E76\u4E14\", \"\u4EE5\u53CA\", or \"\u7684\u4E8B\u9879\". Use long_term_goal only when the user states an enduring personal goal, not when they ask the assistant to create, update, investigate, summarize, or track something.";
2
2
  export declare const UNDERSTANDING_REVIEW_SYSTEM_PROMPT = "You are the user-understanding synthesis stage for the same session. You do not chat with the user and cannot write storage directly. Extract only evidence-backed, durable candidates and return strict JSON matching the requested schema.";
@@ -10,7 +10,9 @@ Return JSON only, with this shape:
10
10
  {"candidates":[{"kind":"preference","content":"...","confidence":0.8,"importance":0.7,"durability":"durable","sensitivity":"normal","disclosurePolicy":"referenceable","tags":["background-review"]}]}
11
11
 
12
12
  Allowed kinds: preference, boundary, relationship, project_context, commitment, routine, personal_logistics, open_question, milestone, current_state, task_lesson, tool_preference, long_term_goal, derived_insight.
13
- Only include facts supported by the conversation and likely to matter in a future session. A temporary mood or one-off reaction is current context, not durable identity; omit it unless the user describes a recurring pattern that will matter later. Never include passwords, tokens, credentials, or speculative diagnoses. Use {"candidates":[]} when nothing qualifies.`;
13
+ Only include facts supported by the conversation and likely to matter in a future session. A temporary mood or one-off reaction is current context, not durable identity; omit it unless the user describes a recurring pattern that will matter later. Never include passwords, tokens, credentials, or speculative diagnoses. Use {"candidates":[]} when nothing qualifies.
14
+
15
+ Do not turn a request about the current task into user understanding. Exclude requested outputs, follow-up instructions, project-note edits, investigations, and other one-off work. Every candidate must be a complete standalone statement about the user or an enduring pattern; never return a clause fragment beginning with a connector such as "and", "also", "并且", "以及", or "的事项". Use long_term_goal only when the user states an enduring personal goal, not when they ask the assistant to create, update, investigate, summarize, or track something.`;
14
16
  const UNDERSTANDING_REVIEW_SYSTEM_PROMPT = `You are the user-understanding synthesis stage for the same session. You do not chat with the user and cannot write storage directly. Extract only evidence-backed, durable candidates and return strict JSON matching the requested schema.`;
15
17
  //#endregion
16
18
  export { MEMORY_REVIEW_USER_PROMPT, UNDERSTANDING_REVIEW_SYSTEM_PROMPT };
@@ -1,6 +1,7 @@
1
1
  import { Agent } from '@earendil-works/pi-agent-core';
2
2
  import type { Config } from '../../config/schema.js';
3
3
  import type { MemoryManager } from '../memory/manager.js';
4
+ import type { UnderstandingCandidate } from '../memory/understanding/types.js';
4
5
  import type { BackgroundReviewSettings } from './settings.js';
5
6
  export interface RunBackgroundReviewParams {
6
7
  sessionKey: string;
@@ -9,4 +10,5 @@ export interface RunBackgroundReviewParams {
9
10
  memoryManager: MemoryManager;
10
11
  getConfig: () => Config | undefined;
11
12
  }
13
+ export declare function parseUnderstandingCandidates(raw: string): UnderstandingCandidate[];
12
14
  export declare function runBackgroundReviewTurn(params: RunBackgroundReviewParams): Promise<void>;
@@ -6,6 +6,7 @@ import { createExtensionAwareStreamFn } from "../../providers/extension-stream-b
6
6
  import { extractTextContent } from "../context/workspace.js";
7
7
  import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
8
8
  import { isAssistantTurnAborted, isAssistantTurnFailed } from "../orchestration/llm-turn-retry.js";
9
+ import { isDurableUnderstandingCandidate } from "../../user-context/understandingQuality.js";
9
10
  import { MEMORY_REVIEW_USER_PROMPT, UNDERSTANDING_REVIEW_SYSTEM_PROMPT } from "./prompts.js";
10
11
  import { Agent } from "@earendil-works/pi-agent-core";
11
12
  //#region src/agent/background-review/run-background-review.ts
@@ -61,13 +62,15 @@ function parseUnderstandingCandidates(raw) {
61
62
  const item = value;
62
63
  if (!ALLOWED_UNDERSTANDING_KINDS.has(item.kind)) continue;
63
64
  if (typeof item.content !== "string" || item.content.trim().length < 4) continue;
65
+ const kind = item.kind;
66
+ if (!isDurableUnderstandingCandidate(kind, item.content)) continue;
64
67
  const confidence = typeof item.confidence === "number" ? item.confidence : .65;
65
68
  const importance = typeof item.importance === "number" ? item.importance : .5;
66
69
  const durability = item.durability === "ephemeral" || item.durability === "recurring" ? item.durability : "durable";
67
70
  const sensitivity = ALLOWED_SENSITIVITIES.has(item.sensitivity) ? item.sensitivity : "personal";
68
71
  const disclosurePolicy = item.disclosurePolicy === "silent" || item.disclosurePolicy === "ask_before_reference" ? item.disclosurePolicy : "referenceable";
69
72
  output.push({
70
- kind: item.kind,
73
+ kind,
71
74
  content: item.content.trim(),
72
75
  confidence: Math.max(0, Math.min(1, confidence)),
73
76
  importance: Math.max(0, Math.min(1, importance)),
@@ -133,4 +136,4 @@ async function runBackgroundReviewTurn(params) {
133
136
  await runUnderstandingReview(params);
134
137
  }
135
138
  //#endregion
136
- export { runBackgroundReviewTurn };
139
+ export { parseUnderstandingCandidates, runBackgroundReviewTurn };
@@ -16,5 +16,5 @@ export declare function formatAgentRunErrorForClient(rawError: string, context?:
16
16
  provider?: string;
17
17
  modelRef?: string;
18
18
  }): string;
19
- /** Human-readable text for TUI/CLI when SSE carries structured JSON. */
19
+ /** Human-readable text for TUI/CLI when a run event carries structured JSON. */
20
20
  export declare function formatAgentRunErrorForDisplay(content: string): string;
@@ -87,7 +87,7 @@ function formatAgentRunErrorForClient(rawError, context) {
87
87
  }
88
88
  return JSON.stringify(payload);
89
89
  }
90
- /** Human-readable text for TUI/CLI when SSE carries structured JSON. */
90
+ /** Human-readable text for TUI/CLI when a run event carries structured JSON. */
91
91
  function formatAgentRunErrorForDisplay(content) {
92
92
  const trimmed = content.trim();
93
93
  if (trimmed.startsWith("Error: ")) return trimmed.slice(7);
@@ -0,0 +1,17 @@
1
+ import type { AgentToolResult } from '@earendil-works/pi-agent-core';
2
+ import type { EndpointToolRuntime } from '../../endpoint-tools/index.js';
3
+ import type { ExternalToolDescriptor, ExternalToolExecutionContext, ExternalToolProvider, ExternalToolSearchHit, ExternalToolTurnContext } from './types.js';
4
+ export interface EndpointToolProviderDeps {
5
+ runtime: EndpointToolRuntime;
6
+ getCurrentContext: () => ExternalToolTurnContext | null;
7
+ }
8
+ export declare class EndpointToolProvider implements ExternalToolProvider {
9
+ private readonly deps;
10
+ readonly source: "endpoint";
11
+ constructor(deps: EndpointToolProviderDeps);
12
+ search(_query: string): Promise<ExternalToolSearchHit[]>;
13
+ describe(toolRef: string): Promise<ExternalToolDescriptor | undefined>;
14
+ execute(toolRef: string, args: Record<string, unknown>, _approvalId: string | undefined, context: ExternalToolExecutionContext): Promise<AgentToolResult<Record<string, unknown>>>;
15
+ private currentEndpoint;
16
+ private resolve;
17
+ }