@xopcai/xopc 0.0.197 → 0.0.200

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 (244) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-BwmdJ5pv.js → activity-store-DYVN1hRp.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C5st7lt5.js → agent-avatar-dicebear-eMarz29u.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-DeLW-454.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-BM1hNzjw.js → api-B8mzbAle.js} +1 -1
  7. package/dist/gateway/static/root/assets/app-management-settings-panel-yfb68wq9.js +1 -0
  8. package/dist/gateway/static/root/assets/appearance-settings-B8SPknFM.js +1 -0
  9. package/dist/gateway/static/root/assets/apps-page-Bmor22Ny.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-qL07mwnY.js → archive-plugin-DmYRiOP3.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CqSobpdi.js → attachment-load-D66JvcPi.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-Q4e8m11h.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-DBRPyLYE.js → binary-plugins-ChIsZArT.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-6wG1LU7t.js → block-editor-Ck-k_d0Z.js} +4 -4
  15. package/dist/gateway/static/root/assets/browser-settings-page--uVL73Sb.js +8 -0
  16. package/dist/gateway/static/root/assets/browser-workflow-inputs-_ndaecsf.js +1 -0
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-BEu3E0et.js → browser-workflows-page-BC5jm1zL.js} +2 -2
  18. package/dist/gateway/static/root/assets/button-CSEbl4zT.js +1 -0
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-DXpf3QYN.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-BoOzFotX.js → capability-presets-api-Dy1jZJKs.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-NAjCsrTi.js +3 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-_8IiTxRB.js → channel-recipient-api-D-9qiuio.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-CiWUo7jW.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-B4Rbh3bM.js +1 -0
  25. package/dist/gateway/static/root/assets/connectors-api-5xiCRVUS.js +1 -0
  26. package/dist/gateway/static/root/assets/connectors-page-DOwlMseU.js +2 -0
  27. package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +1 -0
  28. package/dist/gateway/static/root/assets/cron-expression-B3PebXKZ.js +2 -0
  29. package/dist/gateway/static/root/assets/date-picker-C1Vke7Xn.js +1 -0
  30. package/dist/gateway/static/root/assets/dependency-picker-FrQ0tsBC.js +1 -0
  31. package/dist/gateway/static/root/assets/{desktop-pet-CsLR4pWB.js → desktop-pet-CPBAzNJi.js} +1 -1
  32. package/dist/gateway/static/root/assets/desktop-pet-settings-D6s3glDP.js +1 -0
  33. package/dist/gateway/static/root/assets/directory-picker-path-field-CbNQ7QQS.js +1 -0
  34. package/dist/gateway/static/root/assets/dist-BPoKqzeH.js +1 -0
  35. package/dist/gateway/static/root/assets/dist-DY4Af0fY.js +1 -0
  36. package/dist/gateway/static/root/assets/{extension-debug-page-CD73euAM.js → extension-debug-page-dTK14hUv.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-DAKjpNwd.js → extension-page-Cpdj1Kip.js} +1 -1
  38. package/dist/gateway/static/root/assets/extension-settings-page-iNHUZGd5.js +1 -0
  39. package/dist/gateway/static/root/assets/external-link-DjqjBmc3.js +1 -0
  40. package/dist/gateway/static/root/assets/form-field-width-DJw_jULe.js +1 -0
  41. package/dist/gateway/static/root/assets/gateway-config-api-SvMvWqMM.js +1 -0
  42. package/dist/gateway/static/root/assets/gateway-config-swr-jB0hAhWO.js +1 -0
  43. package/dist/gateway/static/root/assets/gateway-settings-BilR3dGZ.js +1 -0
  44. package/dist/gateway/static/root/assets/{gateway-startup-retry--2njcDpC.js → gateway-startup-retry-C-fRlHCL.js} +1 -1
  45. package/dist/gateway/static/root/assets/globe-DSSGFWFn.js +1 -0
  46. package/dist/gateway/static/root/assets/heartbeat-settings-zK40dcQ5.js +1 -0
  47. package/dist/gateway/static/root/assets/home-page-NyXy5MLr.js +3 -0
  48. package/dist/gateway/static/root/assets/index-Bp8I_eX4.css +1 -0
  49. package/dist/gateway/static/root/assets/index-CCK8zdlS.js +152 -0
  50. package/dist/gateway/static/root/assets/interaction-BmQogeqz.js +1 -0
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-HMhxgOuD.js → keyboard-shortcuts-settings-nKzsroud.js} +1 -1
  52. package/dist/gateway/static/root/assets/loader-circle-CifKLtgG.js +1 -0
  53. package/dist/gateway/static/root/assets/local-app-workbench-page-Ds3sPXTh.js +2 -0
  54. package/dist/gateway/static/root/assets/local-apps-page-DV1s_FYh.js +1 -0
  55. package/dist/gateway/static/root/assets/{locale-store-Bjvw7jtg.js → locale-store-xULEcFVs.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-Biz4eA02.js +2 -0
  57. package/dist/gateway/static/root/assets/management-settings-D7KjYgHu.js +1 -0
  58. package/dist/gateway/static/root/assets/{markdown-split-DvVBewS4.js → markdown-split-CTYbpkrd.js} +1 -1
  59. package/dist/gateway/static/root/assets/{media-plugins-YVj7NVzD.js → media-plugins-BXYnaiZ6.js} +1 -1
  60. package/dist/gateway/static/root/assets/messages-3qRsLZuX.js +3 -0
  61. package/dist/gateway/static/root/assets/{notes-page-BDzuL2I9.js → notes-page-CWWVXpw5.js} +1 -1
  62. package/dist/gateway/static/root/assets/notes-workbench-DnBkQihH.js +4 -0
  63. package/dist/gateway/static/root/assets/page-tabs-BaEQMYm_.js +1 -0
  64. package/dist/gateway/static/root/assets/popover-select-BzdnTy3h.js +1 -0
  65. package/dist/gateway/static/root/assets/preview-open-alternatives-pimQAkeI.js +1 -0
  66. package/dist/gateway/static/root/assets/{product-open-page-Bwx_CQht.js → product-open-page-BoYSS_YR.js} +1 -1
  67. package/dist/gateway/static/root/assets/project-detail-page-ZO7t1UkB.js +1 -0
  68. package/dist/gateway/static/root/assets/projects-page-By-vq41g.js +1 -0
  69. package/dist/gateway/static/root/assets/remote-access-hub-C0C_Y9d0.js +1 -0
  70. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Fe05Nus6.js → runtime-tools-settings-panel-DT8flaX1.js} +4 -4
  71. package/dist/gateway/static/root/assets/schema-form-DabEP-UI.js +1 -0
  72. package/dist/gateway/static/root/assets/sessions-page-BNlVwUzV.js +1 -0
  73. package/dist/gateway/static/root/assets/settings-advanced-gate-CxYBQDaM.js +1 -0
  74. package/dist/gateway/static/root/assets/settings-form-draft-Dy10ldo8.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-form-section-DCsfZAtC.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BRE_-7Da.js → settings-loading-skeleton-Dac6Yd0T.js} +1 -1
  77. package/dist/gateway/static/root/assets/{settings-page-C1zxCpqB.js → settings-page-BDoYoEar.js} +1 -1
  78. package/dist/gateway/static/root/assets/settings-page-layout-BRQNel6r.js +1 -0
  79. package/dist/gateway/static/root/assets/settings-shell-dialog-layer-BU3UuiJr.js +1 -0
  80. package/dist/gateway/static/root/assets/setup-status-panel-DWijJ1rw.js +1 -0
  81. package/dist/gateway/static/root/assets/share-preview-page-ie9I2_7h.js +2 -0
  82. package/dist/gateway/static/root/assets/shares-settings-DU9VrJLf.js +1 -0
  83. package/dist/gateway/static/root/assets/skill-reload-api-C5RaIvoE.js +1 -0
  84. package/dist/gateway/static/root/assets/skills-page-N0YhaR5S.js +2 -0
  85. package/dist/gateway/static/root/assets/{skills-page.utils-CYwFWTso.js → skills-page.utils-C639DLXr.js} +1 -1
  86. package/dist/gateway/static/root/assets/system-settings-panel-CpshpQtC.js +1 -0
  87. package/dist/gateway/static/root/assets/task-detail-page-DsTocYkK.js +1 -0
  88. package/dist/gateway/static/root/assets/{theme-store-DtxpMC5S.js → theme-store-CHQRiuCF.js} +1 -1
  89. package/dist/gateway/static/root/assets/tool-activity-R8V9l6nk.js +1 -0
  90. package/dist/gateway/static/root/assets/typed-models-lib-q5-Vfqd8.js +1 -0
  91. package/dist/gateway/static/root/assets/use-autosave-ms6rDy59.js +1 -0
  92. package/dist/gateway/static/root/assets/user-context-page-BUxIemwy.js +1 -0
  93. package/dist/gateway/static/root/assets/voice-api-key-field-CObrQWh2.js +1 -0
  94. package/dist/gateway/static/root/assets/work-discovery-overlay-BBxrnEFt.js +1 -0
  95. package/dist/gateway/static/root/assets/work-discovery-page-DN3l-HW3.js +1 -0
  96. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DqIb1oBB.js → workflow-run-setup-panel-BxXhe3IV.js} +2 -2
  97. package/dist/gateway/static/root/assets/workflows-page-BCHkjd1i.js +5 -0
  98. package/dist/gateway/static/root/assets/working-directory-picker-modal-D-IgcHPp.js +1 -0
  99. package/dist/gateway/static/root/index.html +23 -8
  100. package/dist/package.js +1 -1
  101. package/dist/packages/gateway-contract/src/tasks.js +103 -9
  102. package/dist/src/agent/agent-manager.d.ts +1 -0
  103. package/dist/src/agent/agent-manager.js +1 -0
  104. package/dist/src/agent/context/execution-scope.js +3 -1
  105. package/dist/src/agent/service.js +1 -0
  106. package/dist/src/agent/service.types.d.ts +1 -0
  107. package/dist/src/agent/tasks/task-judge-service.d.ts +1 -1
  108. package/dist/src/agent/tasks/task-judge-service.js +3 -2
  109. package/dist/src/agent/tools/factory.d.ts +2 -0
  110. package/dist/src/agent/tools/factory.js +2 -1
  111. package/dist/src/agent/tools/xopc-use-tool.d.ts +1 -0
  112. package/dist/src/agent/tools/xopc-use-tool.js +69 -9
  113. package/dist/src/automations/domain/validation.d.ts +40 -12
  114. package/dist/src/automations/draft/automation-draft-validator.d.ts +4 -4
  115. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  116. package/dist/src/config/rules.js +2 -2
  117. package/dist/src/gateway/hono/app.d.ts +2 -0
  118. package/dist/src/gateway/hono/app.js +10 -3
  119. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  120. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
  121. package/dist/src/gateway/hono/routes/agent-stream.js +2 -74
  122. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -1
  123. package/dist/src/gateway/hono/routes/config.js +9 -0
  124. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  125. package/dist/src/gateway/hono/routes/projects.js +55 -0
  126. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +62 -0
  127. package/dist/src/gateway/hono/routes/session-input-handler.js +82 -0
  128. package/dist/src/gateway/hono/routes/tasks.js +272 -20
  129. package/dist/src/gateway/host.d.ts +9 -1
  130. package/dist/src/gateway/host.js +22 -5
  131. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  132. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  133. package/dist/src/gateway/runtime-config.js +6 -5
  134. package/dist/src/gateway/security/audit.js +0 -7
  135. package/dist/src/gateway/server.js +4 -1
  136. package/dist/src/gateway/service/task-conversation-query-service.d.ts +58 -0
  137. package/dist/src/gateway/service/task-conversation-query-service.js +84 -0
  138. package/dist/src/gateway/service.d.ts +11 -0
  139. package/dist/src/gateway/service.js +75 -38
  140. package/dist/src/proactive/actions/service.d.ts +2 -0
  141. package/dist/src/proactive/actions/service.js +80 -0
  142. package/dist/src/proactive/execution/insight.js +20 -0
  143. package/dist/src/proactive/execution/repository.js +8 -2
  144. package/dist/src/proactive/execution/types.d.ts +14 -0
  145. package/dist/src/proactive/inbox/repository.js +59 -9
  146. package/dist/src/proactive/inbox/service.d.ts +2 -2
  147. package/dist/src/proactive/inbox/service.js +7 -2
  148. package/dist/src/proactive/inbox/types.d.ts +14 -0
  149. package/dist/src/proactive/inbox/worker.js +2 -0
  150. package/dist/src/proactive/scenarios/prompt-composer.js +2 -2
  151. package/dist/src/projects/project-agent.js +1 -1
  152. package/dist/src/storage/sqlite/migrations/118_task_board_rank.sql +6 -0
  153. package/dist/src/storage/sqlite/migrations/119_proactive_disposition.sql +13 -0
  154. package/dist/src/storage/sqlite/migrations/120_task_conversation.sql +112 -0
  155. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  156. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  157. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  158. package/dist/src/storage/sqlite/schema.js +1 -1
  159. package/dist/src/tasks/execution-context.js +8 -4
  160. package/dist/src/tasks/home-query-service.d.ts +5 -0
  161. package/dist/src/tasks/home-query-service.js +7 -2
  162. package/dist/src/tasks/index.d.ts +3 -0
  163. package/dist/src/tasks/index.js +6 -3
  164. package/dist/src/tasks/project-monitoring-service.d.ts +9 -0
  165. package/dist/src/tasks/project-monitoring-service.js +41 -3
  166. package/dist/src/tasks/project-operating-view-service.d.ts +1 -2
  167. package/dist/src/tasks/project-operating-view-service.js +26 -23
  168. package/dist/src/tasks/task-application-service.js +107 -21
  169. package/dist/src/tasks/task-change-events.d.ts +13 -0
  170. package/dist/src/tasks/task-change-events.js +29 -0
  171. package/dist/src/tasks/task-context-assembler.js +9 -4
  172. package/dist/src/tasks/task-context-repository.d.ts +0 -6
  173. package/dist/src/tasks/task-context-repository.js +0 -4
  174. package/dist/src/tasks/task-conversation-repository.d.ts +71 -0
  175. package/dist/src/tasks/task-conversation-repository.js +194 -0
  176. package/dist/src/tasks/task-handoff-service.d.ts +31 -0
  177. package/dist/src/tasks/task-handoff-service.js +143 -0
  178. package/dist/src/tasks/task-read-model-projector.js +3 -6
  179. package/dist/src/tasks/task-repository.d.ts +7 -2
  180. package/dist/src/tasks/task-repository.js +31 -15
  181. package/dist/src/tasks/task-run-coordinator.js +3 -1
  182. package/dist/src/tunnel/enable-lan-pairing.js +15 -26
  183. package/dist/src/tunnel/pair-context.js +1 -1
  184. package/dist/src/tunnel/pair-url.js +1 -1
  185. package/dist/src/tunnel/tunnel-qr.d.ts +0 -7
  186. package/dist/src/tunnel/tunnel-qr.js +2 -19
  187. package/dist/src/workflows/service/workflow-run-service.js +4 -2
  188. package/package.json +5 -3
  189. package/dist/gateway/static/root/assets/agents-Baxfj44y.js +0 -68
  190. package/dist/gateway/static/root/assets/app-management-settings-panel-S8LhoD6G.js +0 -1
  191. package/dist/gateway/static/root/assets/appearance-settings-D8Cd5vDP.js +0 -1
  192. package/dist/gateway/static/root/assets/apps-page-0uCxKyE5.js +0 -1
  193. package/dist/gateway/static/root/assets/automations-page-XyDat125.js +0 -6
  194. package/dist/gateway/static/root/assets/browser-settings-page-CrYNMR4w.js +0 -8
  195. package/dist/gateway/static/root/assets/browser-workflow-inputs-Abil4puY.js +0 -1
  196. package/dist/gateway/static/root/assets/capabilities-settings-panel-CvMcDhGf.js +0 -7
  197. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CHJDY-Ih.js +0 -3
  198. package/dist/gateway/static/root/assets/channels-settings-Ds9BJbcY.js +0 -1
  199. package/dist/gateway/static/root/assets/channels-status-swr-DPaJSYX_.js +0 -1
  200. package/dist/gateway/static/root/assets/connectors-api-CgWjgPSI.js +0 -1
  201. package/dist/gateway/static/root/assets/connectors-page-NUs-Zf7F.js +0 -2
  202. package/dist/gateway/static/root/assets/cron-expression-ZdDBAoqA.js +0 -2
  203. package/dist/gateway/static/root/assets/dependency-picker-BGeB1jpn.js +0 -1
  204. package/dist/gateway/static/root/assets/desktop-pet-settings-CCjT1bdo.js +0 -1
  205. package/dist/gateway/static/root/assets/directory-picker-path-field-C-Te1QN3.js +0 -1
  206. package/dist/gateway/static/root/assets/extension-settings-page-BLSNdlgd.js +0 -1
  207. package/dist/gateway/static/root/assets/gateway-config-api-CQrf0k3D.js +0 -1
  208. package/dist/gateway/static/root/assets/gateway-settings-CvgH8IJI.js +0 -1
  209. package/dist/gateway/static/root/assets/heartbeat-settings-SPpnqbjl.js +0 -1
  210. package/dist/gateway/static/root/assets/home-page-BFoD6047.js +0 -3
  211. package/dist/gateway/static/root/assets/index-84ys9u-K.js +0 -152
  212. package/dist/gateway/static/root/assets/index-D-srnucP.css +0 -1
  213. package/dist/gateway/static/root/assets/local-app-workbench-page-D5uL2_Fd.js +0 -2
  214. package/dist/gateway/static/root/assets/local-apps-page-DIWkFa3g.js +0 -1
  215. package/dist/gateway/static/root/assets/logs-page--6v8qq6y.js +0 -2
  216. package/dist/gateway/static/root/assets/management-settings-DtEuS-kR.js +0 -1
  217. package/dist/gateway/static/root/assets/messages-DQ5X6cXp.js +0 -3
  218. package/dist/gateway/static/root/assets/notes-workbench-IdjuNXvH.js +0 -4
  219. package/dist/gateway/static/root/assets/page-tabs-7bSEWfSX.js +0 -1
  220. package/dist/gateway/static/root/assets/preview-open-alternatives-tgLbHgcV.js +0 -1
  221. package/dist/gateway/static/root/assets/project-detail-page-DnJXSuM4.js +0 -1
  222. package/dist/gateway/static/root/assets/projects-page-DckZKlBI.js +0 -1
  223. package/dist/gateway/static/root/assets/remote-access-hub-CfbUHBUH.js +0 -1
  224. package/dist/gateway/static/root/assets/schema-form-CFfyC4CB.js +0 -1
  225. package/dist/gateway/static/root/assets/sessions-page-BCfCh4My.js +0 -1
  226. package/dist/gateway/static/root/assets/settings-advanced-gate-Cbi4FvzO.js +0 -1
  227. package/dist/gateway/static/root/assets/settings-form-section-gEnEYT_3.js +0 -1
  228. package/dist/gateway/static/root/assets/settings-page-layout-CRpXF_05.js +0 -1
  229. package/dist/gateway/static/root/assets/setup-status-panel-BcHdpmFf.js +0 -1
  230. package/dist/gateway/static/root/assets/share-preview-page-DU8L68A5.js +0 -2
  231. package/dist/gateway/static/root/assets/shares-settings-kjTqH9yY.js +0 -1
  232. package/dist/gateway/static/root/assets/skill-reload-api-QAGpwzIM.js +0 -1
  233. package/dist/gateway/static/root/assets/skills-page-lE1-YRdK.js +0 -2
  234. package/dist/gateway/static/root/assets/system-settings-panel-CVDsiPKn.js +0 -1
  235. package/dist/gateway/static/root/assets/task-detail-page-DsM13-cy.js +0 -1
  236. package/dist/gateway/static/root/assets/typed-models-lib-DelyYgoc.js +0 -1
  237. package/dist/gateway/static/root/assets/use-autosave-C50Mq5yQ.js +0 -1
  238. package/dist/gateway/static/root/assets/user-context-page-D-VEOt2A.js +0 -1
  239. package/dist/gateway/static/root/assets/voice-api-key-field-DYfgTe3Y.js +0 -1
  240. package/dist/gateway/static/root/assets/work-discovery-overlay-DPbujsp3.js +0 -1
  241. package/dist/gateway/static/root/assets/work-discovery-page-D77opady.js +0 -1
  242. package/dist/gateway/static/root/assets/workflows-page-B9-PLmlX.js +0 -5
  243. package/dist/src/gateway/ensure-network-cors.d.ts +0 -3
  244. package/dist/src/gateway/ensure-network-cors.js +0 -23
@@ -10,7 +10,7 @@ import { buildGatewayConsoleCspHeader } from "../security/csp.js";
10
10
  import { checkBrowserOrigin } from "../security/origin-check.js";
11
11
  import { auth } from "./middleware/auth.js";
12
12
  import { operatorScopes } from "./middleware/scopes.js";
13
- import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
13
+ import { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware } from "./middleware/strict-rate-limit.js";
14
14
  import { logContextMiddleware } from "./middleware/log-context.js";
15
15
  import { logger } from "./middleware/logger.js";
16
16
  import { routeErrorMiddleware } from "./middleware/route-errors.js";
@@ -42,10 +42,11 @@ function createHonoApp(config) {
42
42
  const { service } = config;
43
43
  const app = new Hono();
44
44
  const gatewayPort = resolveGatewayServiceListenPort(service);
45
+ const gatewayBindHost = config.listenHost ?? resolveGatewayEffectiveHost(service.currentConfig);
45
46
  const resolveBrowserOrigins = () => resolveAllowedBrowserOrigins({
46
47
  configuredOrigins: service.currentConfig.gateway.corsOrigins,
47
48
  port: gatewayPort,
48
- bindHost: resolveGatewayEffectiveHost(service.currentConfig),
49
+ bindHost: gatewayBindHost,
49
50
  tunnelPublicUrl: loadTunnelState()?.publicUrl,
50
51
  reverseProxyPublicUrl: resolveReverseProxyPublicUrl(service.currentConfig)
51
52
  });
@@ -153,6 +154,7 @@ function createHonoApp(config) {
153
154
  if (/^\/api\/notes\/[^/]+\/media$/.test(path)) return true;
154
155
  return path === "/api/notes" && contentType?.includes("multipart/form-data") === true;
155
156
  };
157
+ const isProjectFileUploadRequest = (path, method, contentType) => method === "POST" && /^\/api\/projects\/[^/]+\/files\/upload$/.test(path) && contentType?.includes("multipart/form-data") === true;
156
158
  const discussionUploadBodyMax = (path, method, contentType) => {
157
159
  if (method !== "PUT" || contentType?.includes("multipart/form-data") !== true) return void 0;
158
160
  if (/^\/api\/discussions\/[^/]+\/recording$/.test(path)) return NOTE_MEDIA_BODY_MAX;
@@ -173,7 +175,7 @@ function createHonoApp(config) {
173
175
  }));
174
176
  app.use("/api/*", async (c, next) => {
175
177
  const contentType = c.req.header("content-type");
176
- const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" || c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
178
+ const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcribe" || c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
177
179
  const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
178
180
  return bodyLimit({
179
181
  maxSize,
@@ -211,6 +213,10 @@ function createHonoApp(config) {
211
213
  trustedProxies: service.currentConfig.gateway?.trustedProxies,
212
214
  allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
213
215
  }) });
216
+ const taskRateLimitMiddleware = createTaskRateLimitMiddleware({ getTrustedProxyContext: () => ({
217
+ trustedProxies: service.currentConfig.gateway?.trustedProxies,
218
+ allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
219
+ }) });
214
220
  const channelRateLimitMiddleware = createChannelRateLimitMiddleware({ getTrustedProxyContext: () => ({
215
221
  trustedProxies: service.currentConfig.gateway?.trustedProxies,
216
222
  allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
@@ -219,6 +225,7 @@ function createHonoApp(config) {
219
225
  service,
220
226
  strictRateLimitMiddleware,
221
227
  chatRateLimitMiddleware,
228
+ taskRateLimitMiddleware,
222
229
  xopcCloudPollRateLimitMiddleware: createXopcCloudPollRateLimitMiddleware({ getTrustedProxyContext: () => ({
223
230
  trustedProxies: service.currentConfig.gateway?.trustedProxies,
224
231
  allowRealIpFallback: service.currentConfig.gateway?.allowRealIpFallback === true
@@ -16,6 +16,10 @@ export declare function createChatRateLimitMiddleware(deps: StrictRateLimitDeps)
16
16
  error: string;
17
17
  code: string;
18
18
  }, 429, "json">>;
19
+ export declare function createTaskRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
20
+ error: string;
21
+ code: string;
22
+ }, 429, "json">>;
19
23
  export declare function createXopcCloudPollRateLimitMiddleware(deps: StrictRateLimitDeps): import("hono").MiddlewareHandler<any, string, {}, Response & import("hono").TypedResponse<{
20
24
  error: string;
21
25
  code: string;
@@ -70,6 +70,13 @@ function createChatRateLimitMiddleware(deps) {
70
70
  reason: "chat_rate_limit_exceeded"
71
71
  });
72
72
  }
73
+ function createTaskRateLimitMiddleware(deps) {
74
+ return createClientRateLimitMiddleware(deps, {
75
+ limiter: () => buckets.taskApi(),
76
+ exceededMessage: "Task API rate limit exceeded",
77
+ reason: "task_rate_limit_exceeded"
78
+ });
79
+ }
73
80
  function createXopcCloudPollRateLimitMiddleware(deps) {
74
81
  return createClientRateLimitMiddleware(deps, {
75
82
  limiter: () => buckets.xopcCloudPoll(),
@@ -85,4 +92,4 @@ function createChannelRateLimitMiddleware(deps) {
85
92
  });
86
93
  }
87
94
  //#endregion
88
- export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
95
+ export { createChannelRateLimitMiddleware, createChatRateLimitMiddleware, createStrictRateLimitMiddleware, createTaskRateLimitMiddleware, createXopcCloudPollRateLimitMiddleware };
@@ -1,5 +1,5 @@
1
- import { endpointTurnClaimSchema } from "../../../../packages/endpoint-tools-protocol/src/index.js";
2
1
  import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
2
+ import { submitSessionInput } from "./session-input-handler.js";
3
3
  //#region src/gateway/hono/routes/agent-stream.ts
4
4
  function registerAgentStreamRoutes(authenticated, deps) {
5
5
  const { service, chatRateLimitMiddleware } = deps;
@@ -34,79 +34,7 @@ function registerAgentStreamRoutes(authenticated, deps) {
34
34
  });
35
35
  });
36
36
  authenticated.post("/api/sessions/:sessionKey/inputs", chatRateLimitMiddleware, async (c) => {
37
- const sessionKey = (c.req.param("sessionKey") ?? "").trim();
38
- const body = await c.req.json().catch(() => null);
39
- if (!body || !sessionKey) return c.json({
40
- ok: false,
41
- error: {
42
- code: "BAD_REQUEST",
43
- message: "Invalid request"
44
- }
45
- }, 400);
46
- const attachments = Array.isArray(body.attachments) ? body.attachments : void 0;
47
- const content = typeof body.content === "string" ? body.content : "";
48
- const contentError = validateWebchatContent(content);
49
- if (contentError) return c.json({
50
- ok: false,
51
- error: {
52
- code: "BAD_REQUEST",
53
- message: contentError
54
- }
55
- }, 400);
56
- const attachmentError = validateWebchatAttachments(attachments);
57
- if (attachmentError) return c.json({
58
- ok: false,
59
- error: {
60
- code: "BAD_REQUEST",
61
- message: attachmentError
62
- }
63
- }, 400);
64
- const delivery = body.delivery === "next" || body.delivery === "steer" ? body.delivery : null;
65
- if (!delivery) return c.json({
66
- ok: false,
67
- error: {
68
- code: "BAD_REQUEST",
69
- message: "Missing delivery"
70
- }
71
- }, 400);
72
- const origin = endpointTurnClaimSchema.safeParse(body.origin);
73
- if (!origin.success) return c.json({
74
- ok: false,
75
- error: {
76
- code: "BAD_REQUEST",
77
- message: "Invalid endpoint origin"
78
- }
79
- }, 400);
80
- if (!service.endpointTools.registry.verifyTurnClaim(origin.data.endpointId, origin.data.token)) return c.json({
81
- ok: false,
82
- error: {
83
- code: "INVALID_ENDPOINT",
84
- message: "Endpoint connection is not active"
85
- }
86
- }, 401);
87
- const result = await service.submitSessionInput({
88
- sessionKey,
89
- clientMessageId: typeof body.clientMessageId === "string" ? body.clientMessageId : "",
90
- delivery,
91
- content,
92
- attachments,
93
- thinking: typeof body.thinking === "string" ? body.thinking : void 0,
94
- origin: {
95
- type: "endpoint",
96
- endpointId: origin.data.endpointId
97
- }
98
- });
99
- if (result.ok === false) return c.json({
100
- ok: false,
101
- error: {
102
- code: result.code,
103
- message: "Input was not accepted"
104
- }
105
- }, result.code === "QUEUE_FULL" ? 409 : 400);
106
- return c.json({
107
- ok: true,
108
- payload: result
109
- }, 202);
37
+ return submitSessionInput(c, deps, (c.req.param("sessionKey") ?? "").trim());
110
38
  });
111
39
  authenticated.patch("/api/sessions/:sessionKey/inputs/:inputId", chatRateLimitMiddleware, async (c) => {
112
40
  const sessionKey = (c.req.param("sessionKey") ?? "").trim();
@@ -176,12 +176,13 @@ async function applyMiscPatch(config, body) {
176
176
  function validateGatewayAfterPatch(config, body) {
177
177
  if (body.gateway === void 0) return PATCH_OK;
178
178
  try {
179
+ const port = config.gateway?.port ?? 18790;
179
180
  const auth = resolveGatewayAuth({ authConfig: config.gateway?.auth });
180
181
  assertGatewayAuthConfigured(auth);
181
182
  assertGatewayRuntimeConfig({
182
183
  cfg: config,
183
184
  auth,
184
- port: config.gateway?.port ?? 18790
185
+ port
185
186
  });
186
187
  } catch (err) {
187
188
  return patchError(err instanceof Error ? err.message : String(err));
@@ -1,3 +1,4 @@
1
+ import { enumerateLanGatewayCandidates } from "../../host.js";
1
2
  import { buildSafeWebConfigPayload } from "../lib/config-payload.js";
2
3
  import { applyAgentsPatch } from "./config-patch/agents.js";
3
4
  import { applyChannelsPatch } from "./config-patch/channels.js";
@@ -39,6 +40,14 @@ function registerConfigRoutes(authenticated, deps) {
39
40
  payload: { config: safeConfig }
40
41
  });
41
42
  });
43
+ authenticated.get("/api/gateway/cors-origin-candidates", (c) => {
44
+ const requestedPort = Number(c.req.query("port"));
45
+ const port = Number.isInteger(requestedPort) && requestedPort >= 1 && requestedPort <= 65535 ? requestedPort : service.currentConfig.gateway?.port ?? 18790;
46
+ return c.json({
47
+ ok: true,
48
+ payload: { candidates: enumerateLanGatewayCandidates(port) }
49
+ });
50
+ });
42
51
  authenticated.patch("/api/config", strictRateLimitMiddleware, async (c) => {
43
52
  const body = await c.req.json();
44
53
  const config = service.currentConfig;
@@ -4,6 +4,7 @@ export interface AuthenticatedRouteDeps {
4
4
  service: GatewayService;
5
5
  strictRateLimitMiddleware: MiddlewareHandler;
6
6
  chatRateLimitMiddleware: MiddlewareHandler;
7
+ taskRateLimitMiddleware?: MiddlewareHandler;
7
8
  xopcCloudPollRateLimitMiddleware: MiddlewareHandler;
8
9
  channelRateLimitMiddleware?: MiddlewareHandler;
9
10
  }
@@ -1128,6 +1128,61 @@ function registerProjectsRoutes(authenticated, deps) {
1128
1128
  }, 500);
1129
1129
  }
1130
1130
  });
1131
+ authenticated.post("/api/projects/:id/files/upload", async (c) => {
1132
+ let body;
1133
+ try {
1134
+ body = await c.req.parseBody();
1135
+ } catch {
1136
+ return c.json({
1137
+ ok: false,
1138
+ error: { message: "Invalid multipart body" }
1139
+ }, 400);
1140
+ }
1141
+ const file = body.file;
1142
+ if (!(file instanceof File)) return c.json({
1143
+ ok: false,
1144
+ error: { message: "Missing file" }
1145
+ }, 400);
1146
+ const requestedPath = typeof body.path === "string" ? body.path.trim() : "";
1147
+ if (!requestedPath) return c.json({
1148
+ ok: false,
1149
+ error: { message: "Missing path" }
1150
+ }, 400);
1151
+ const resolved = await resolveProjectWorkspaceWritePath(service, c.req.param("id"), requestedPath);
1152
+ if (resolved.ok === false) return c.json({
1153
+ ok: false,
1154
+ error: { message: resolved.error }
1155
+ }, resolved.status);
1156
+ if (resolved.existingStat) return c.json({
1157
+ ok: false,
1158
+ error: { message: "File already exists" }
1159
+ }, 409);
1160
+ try {
1161
+ await writeFile(resolved.absolutePath, Buffer.from(await file.arrayBuffer()), { flag: "wx" });
1162
+ const entryStat = await stat(resolved.absolutePath);
1163
+ return c.json({
1164
+ ok: true,
1165
+ entry: {
1166
+ name: path$1.basename(resolved.relativePath),
1167
+ path: resolved.relativePath,
1168
+ absolutePath: resolved.absolutePath,
1169
+ type: "file",
1170
+ size: entryStat.size,
1171
+ updatedAt: entryStat.mtime.toISOString()
1172
+ }
1173
+ }, 201);
1174
+ } catch (err) {
1175
+ log.error({
1176
+ err,
1177
+ projectId: resolved.projectId,
1178
+ path: resolved.absolutePath
1179
+ }, "project file upload failed");
1180
+ return c.json({
1181
+ ok: false,
1182
+ error: { message: "Upload failed" }
1183
+ }, 500);
1184
+ }
1185
+ });
1131
1186
  authenticated.post("/api/projects/:id/sessions/:sessionKey", async (c) => {
1132
1187
  try {
1133
1188
  service.projects.attachSession(c.req.param("sessionKey"), c.req.param("id"));
@@ -0,0 +1,62 @@
1
+ import type { Context } from 'hono';
2
+ import type { AuthenticatedRouteDeps } from './deps.js';
3
+ export declare function submitSessionInput(c: Context, deps: AuthenticatedRouteDeps, sessionKey: string): Promise<(Response & import("hono").TypedResponse<{
4
+ ok: false;
5
+ error: {
6
+ code: string;
7
+ message: string;
8
+ };
9
+ }, 400, "json">) | (Response & import("hono").TypedResponse<{
10
+ ok: false;
11
+ error: {
12
+ code: string;
13
+ message: string;
14
+ };
15
+ }, 401, "json">) | (Response & import("hono").TypedResponse<{
16
+ ok: false;
17
+ error: {
18
+ code: "BAD_REQUEST" | "QUEUE_FULL";
19
+ message: string;
20
+ };
21
+ }, 400 | 409, "json">) | (Response & import("hono").TypedResponse<{
22
+ ok: true;
23
+ payload: {
24
+ sessionKey: string;
25
+ ok: true;
26
+ effectiveDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
27
+ state: {
28
+ sessionKey: string;
29
+ revision: number;
30
+ activeRunId?: string;
31
+ activeInputId?: string;
32
+ inputs: {
33
+ id: string;
34
+ sessionKey: string;
35
+ clientMessageId: string;
36
+ requestedDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
37
+ effectiveDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
38
+ status: import("../../../storage/sqlite/session-input-repository.js").SessionInputStatus;
39
+ content: string;
40
+ attachments?: import("hono/dist/types/utils/types.js").JSONValue[];
41
+ thinking?: string;
42
+ origin: {
43
+ type: "endpoint";
44
+ endpointId: string;
45
+ } | {
46
+ type: "channel";
47
+ channel: string;
48
+ } | {
49
+ type: "system";
50
+ source: "cli" | "workflow" | "automation" | "heartbeat" | "internal";
51
+ };
52
+ position: number;
53
+ targetRunId?: string;
54
+ runId?: string;
55
+ version: number;
56
+ error?: string;
57
+ createdAtMs: number;
58
+ updatedAtMs: number;
59
+ }[];
60
+ };
61
+ };
62
+ }, 202, "json">)>;
@@ -0,0 +1,82 @@
1
+ import { endpointTurnClaimSchema } from "../../../../packages/endpoint-tools-protocol/src/index.js";
2
+ import { validateWebchatAttachments, validateWebchatContent } from "../../chat-limits.js";
3
+ //#region src/gateway/hono/routes/session-input-handler.ts
4
+ async function submitSessionInput(c, deps, sessionKey) {
5
+ const body = await c.req.json().catch(() => null);
6
+ if (!body || !sessionKey) return c.json({
7
+ ok: false,
8
+ error: {
9
+ code: "BAD_REQUEST",
10
+ message: "Invalid request"
11
+ }
12
+ }, 400);
13
+ const attachments = Array.isArray(body.attachments) ? body.attachments : void 0;
14
+ const content = typeof body.content === "string" ? body.content : "";
15
+ const contentError = validateWebchatContent(content);
16
+ if (contentError) return c.json({
17
+ ok: false,
18
+ error: {
19
+ code: "BAD_REQUEST",
20
+ message: contentError
21
+ }
22
+ }, 400);
23
+ const attachmentError = validateWebchatAttachments(attachments);
24
+ if (attachmentError) return c.json({
25
+ ok: false,
26
+ error: {
27
+ code: "BAD_REQUEST",
28
+ message: attachmentError
29
+ }
30
+ }, 400);
31
+ const delivery = body.delivery === "next" || body.delivery === "steer" ? body.delivery : null;
32
+ if (!delivery) return c.json({
33
+ ok: false,
34
+ error: {
35
+ code: "BAD_REQUEST",
36
+ message: "Missing delivery"
37
+ }
38
+ }, 400);
39
+ const origin = endpointTurnClaimSchema.safeParse(body.origin);
40
+ if (!origin.success) return c.json({
41
+ ok: false,
42
+ error: {
43
+ code: "BAD_REQUEST",
44
+ message: "Invalid endpoint origin"
45
+ }
46
+ }, 400);
47
+ if (!deps.service.endpointTools.registry.verifyTurnClaim(origin.data.endpointId, origin.data.token)) return c.json({
48
+ ok: false,
49
+ error: {
50
+ code: "INVALID_ENDPOINT",
51
+ message: "Endpoint connection is not active"
52
+ }
53
+ }, 401);
54
+ const result = await deps.service.submitSessionInput({
55
+ sessionKey,
56
+ clientMessageId: typeof body.clientMessageId === "string" ? body.clientMessageId : "",
57
+ delivery,
58
+ content,
59
+ attachments,
60
+ thinking: typeof body.thinking === "string" ? body.thinking : void 0,
61
+ origin: {
62
+ type: "endpoint",
63
+ endpointId: origin.data.endpointId
64
+ }
65
+ });
66
+ if (result.ok === false) return c.json({
67
+ ok: false,
68
+ error: {
69
+ code: result.code,
70
+ message: "Input was not accepted"
71
+ }
72
+ }, result.code === "QUEUE_FULL" ? 409 : 400);
73
+ return c.json({
74
+ ok: true,
75
+ payload: {
76
+ ...result,
77
+ sessionKey
78
+ }
79
+ }, 202);
80
+ }
81
+ //#endregion
82
+ export { submitSessionInput };