@lobu/gateway 2.8.0

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 (533) hide show
  1. package/dist/api/index.d.ts +2 -0
  2. package/dist/api/index.d.ts.map +1 -0
  3. package/dist/api/index.js +6 -0
  4. package/dist/api/index.js.map +1 -0
  5. package/dist/api/platform.d.ts +92 -0
  6. package/dist/api/platform.d.ts.map +1 -0
  7. package/dist/api/platform.js +236 -0
  8. package/dist/api/platform.js.map +1 -0
  9. package/dist/api/response-renderer.d.ts +44 -0
  10. package/dist/api/response-renderer.d.ts.map +1 -0
  11. package/dist/api/response-renderer.js +123 -0
  12. package/dist/api/response-renderer.js.map +1 -0
  13. package/dist/auth/agent-metadata-store.d.ts +64 -0
  14. package/dist/auth/agent-metadata-store.d.ts.map +1 -0
  15. package/dist/auth/agent-metadata-store.js +115 -0
  16. package/dist/auth/agent-metadata-store.js.map +1 -0
  17. package/dist/auth/api-auth-middleware.d.ts +19 -0
  18. package/dist/auth/api-auth-middleware.d.ts.map +1 -0
  19. package/dist/auth/api-auth-middleware.js +61 -0
  20. package/dist/auth/api-auth-middleware.js.map +1 -0
  21. package/dist/auth/api-key-provider-module.d.ts +60 -0
  22. package/dist/auth/api-key-provider-module.d.ts.map +1 -0
  23. package/dist/auth/api-key-provider-module.js +148 -0
  24. package/dist/auth/api-key-provider-module.js.map +1 -0
  25. package/dist/auth/base-provider-module.d.ts +70 -0
  26. package/dist/auth/base-provider-module.d.ts.map +1 -0
  27. package/dist/auth/base-provider-module.js +118 -0
  28. package/dist/auth/base-provider-module.js.map +1 -0
  29. package/dist/auth/chatgpt/chatgpt-oauth-module.d.ts +34 -0
  30. package/dist/auth/chatgpt/chatgpt-oauth-module.d.ts.map +1 -0
  31. package/dist/auth/chatgpt/chatgpt-oauth-module.js +136 -0
  32. package/dist/auth/chatgpt/chatgpt-oauth-module.js.map +1 -0
  33. package/dist/auth/chatgpt/device-code-client.d.ts +40 -0
  34. package/dist/auth/chatgpt/device-code-client.d.ts.map +1 -0
  35. package/dist/auth/chatgpt/device-code-client.js +165 -0
  36. package/dist/auth/chatgpt/device-code-client.js.map +1 -0
  37. package/dist/auth/chatgpt/index.d.ts +2 -0
  38. package/dist/auth/chatgpt/index.d.ts.map +1 -0
  39. package/dist/auth/chatgpt/index.js +6 -0
  40. package/dist/auth/chatgpt/index.js.map +1 -0
  41. package/dist/auth/claude/oauth-module.d.ts +29 -0
  42. package/dist/auth/claude/oauth-module.d.ts.map +1 -0
  43. package/dist/auth/claude/oauth-module.js +201 -0
  44. package/dist/auth/claude/oauth-module.js.map +1 -0
  45. package/dist/auth/cli/token-service.d.ts +35 -0
  46. package/dist/auth/cli/token-service.d.ts.map +1 -0
  47. package/dist/auth/cli/token-service.js +171 -0
  48. package/dist/auth/cli/token-service.js.map +1 -0
  49. package/dist/auth/external/client.d.ts +65 -0
  50. package/dist/auth/external/client.d.ts.map +1 -0
  51. package/dist/auth/external/client.js +348 -0
  52. package/dist/auth/external/client.js.map +1 -0
  53. package/dist/auth/external/device-code-client.d.ts +41 -0
  54. package/dist/auth/external/device-code-client.d.ts.map +1 -0
  55. package/dist/auth/external/device-code-client.js +128 -0
  56. package/dist/auth/external/device-code-client.js.map +1 -0
  57. package/dist/auth/mcp/config-service.d.ts +70 -0
  58. package/dist/auth/mcp/config-service.d.ts.map +1 -0
  59. package/dist/auth/mcp/config-service.js +269 -0
  60. package/dist/auth/mcp/config-service.js.map +1 -0
  61. package/dist/auth/mcp/proxy.d.ts +68 -0
  62. package/dist/auth/mcp/proxy.d.ts.map +1 -0
  63. package/dist/auth/mcp/proxy.js +783 -0
  64. package/dist/auth/mcp/proxy.js.map +1 -0
  65. package/dist/auth/mcp/string-substitution.d.ts +11 -0
  66. package/dist/auth/mcp/string-substitution.d.ts.map +1 -0
  67. package/dist/auth/mcp/string-substitution.js +21 -0
  68. package/dist/auth/mcp/string-substitution.js.map +1 -0
  69. package/dist/auth/mcp/tool-cache.d.ts +26 -0
  70. package/dist/auth/mcp/tool-cache.d.ts.map +1 -0
  71. package/dist/auth/mcp/tool-cache.js +58 -0
  72. package/dist/auth/mcp/tool-cache.js.map +1 -0
  73. package/dist/auth/oauth/base-client.d.ts +54 -0
  74. package/dist/auth/oauth/base-client.d.ts.map +1 -0
  75. package/dist/auth/oauth/base-client.js +191 -0
  76. package/dist/auth/oauth/base-client.js.map +1 -0
  77. package/dist/auth/oauth/client.d.ts +35 -0
  78. package/dist/auth/oauth/client.d.ts.map +1 -0
  79. package/dist/auth/oauth/client.js +96 -0
  80. package/dist/auth/oauth/client.js.map +1 -0
  81. package/dist/auth/oauth/credentials.d.ts +8 -0
  82. package/dist/auth/oauth/credentials.d.ts.map +1 -0
  83. package/dist/auth/oauth/credentials.js +3 -0
  84. package/dist/auth/oauth/credentials.js.map +1 -0
  85. package/dist/auth/oauth/providers.d.ts +44 -0
  86. package/dist/auth/oauth/providers.d.ts.map +1 -0
  87. package/dist/auth/oauth/providers.js +37 -0
  88. package/dist/auth/oauth/providers.js.map +1 -0
  89. package/dist/auth/oauth/state-store.d.ts +62 -0
  90. package/dist/auth/oauth/state-store.d.ts.map +1 -0
  91. package/dist/auth/oauth/state-store.js +84 -0
  92. package/dist/auth/oauth/state-store.js.map +1 -0
  93. package/dist/auth/oauth-templates.d.ts +15 -0
  94. package/dist/auth/oauth-templates.d.ts.map +1 -0
  95. package/dist/auth/oauth-templates.js +161 -0
  96. package/dist/auth/oauth-templates.js.map +1 -0
  97. package/dist/auth/provider-catalog.d.ts +52 -0
  98. package/dist/auth/provider-catalog.d.ts.map +1 -0
  99. package/dist/auth/provider-catalog.js +155 -0
  100. package/dist/auth/provider-catalog.js.map +1 -0
  101. package/dist/auth/provider-model-options.d.ts +3 -0
  102. package/dist/auth/provider-model-options.d.ts.map +1 -0
  103. package/dist/auth/provider-model-options.js +29 -0
  104. package/dist/auth/provider-model-options.js.map +1 -0
  105. package/dist/auth/settings/agent-settings-store.d.ts +112 -0
  106. package/dist/auth/settings/agent-settings-store.d.ts.map +1 -0
  107. package/dist/auth/settings/agent-settings-store.js +376 -0
  108. package/dist/auth/settings/agent-settings-store.js.map +1 -0
  109. package/dist/auth/settings/auth-profiles-manager.d.ts +26 -0
  110. package/dist/auth/settings/auth-profiles-manager.d.ts.map +1 -0
  111. package/dist/auth/settings/auth-profiles-manager.js +146 -0
  112. package/dist/auth/settings/auth-profiles-manager.js.map +1 -0
  113. package/dist/auth/settings/index.d.ts +4 -0
  114. package/dist/auth/settings/index.d.ts.map +1 -0
  115. package/dist/auth/settings/index.js +9 -0
  116. package/dist/auth/settings/index.js.map +1 -0
  117. package/dist/auth/settings/model-preference-store.d.ts +25 -0
  118. package/dist/auth/settings/model-preference-store.d.ts.map +1 -0
  119. package/dist/auth/settings/model-preference-store.js +50 -0
  120. package/dist/auth/settings/model-preference-store.js.map +1 -0
  121. package/dist/auth/settings/model-selection.d.ts +11 -0
  122. package/dist/auth/settings/model-selection.d.ts.map +1 -0
  123. package/dist/auth/settings/model-selection.js +83 -0
  124. package/dist/auth/settings/model-selection.js.map +1 -0
  125. package/dist/auth/settings/resolved-settings-view.d.ts +45 -0
  126. package/dist/auth/settings/resolved-settings-view.d.ts.map +1 -0
  127. package/dist/auth/settings/resolved-settings-view.js +152 -0
  128. package/dist/auth/settings/resolved-settings-view.js.map +1 -0
  129. package/dist/auth/settings/template-utils.d.ts +3 -0
  130. package/dist/auth/settings/template-utils.d.ts.map +1 -0
  131. package/dist/auth/settings/template-utils.js +43 -0
  132. package/dist/auth/settings/template-utils.js.map +1 -0
  133. package/dist/auth/settings/token-service.d.ts +86 -0
  134. package/dist/auth/settings/token-service.d.ts.map +1 -0
  135. package/dist/auth/settings/token-service.js +3 -0
  136. package/dist/auth/settings/token-service.js.map +1 -0
  137. package/dist/auth/system-env-store.d.ts +26 -0
  138. package/dist/auth/system-env-store.d.ts.map +1 -0
  139. package/dist/auth/system-env-store.js +92 -0
  140. package/dist/auth/system-env-store.js.map +1 -0
  141. package/dist/auth/user-agents-store.d.ts +31 -0
  142. package/dist/auth/user-agents-store.d.ts.map +1 -0
  143. package/dist/auth/user-agents-store.js +54 -0
  144. package/dist/auth/user-agents-store.js.map +1 -0
  145. package/dist/channels/binding-service.d.ts +69 -0
  146. package/dist/channels/binding-service.d.ts.map +1 -0
  147. package/dist/channels/binding-service.js +144 -0
  148. package/dist/channels/binding-service.js.map +1 -0
  149. package/dist/channels/index.d.ts +2 -0
  150. package/dist/channels/index.d.ts.map +1 -0
  151. package/dist/channels/index.js +6 -0
  152. package/dist/channels/index.js.map +1 -0
  153. package/dist/cli/gateway.d.ts +31 -0
  154. package/dist/cli/gateway.d.ts.map +1 -0
  155. package/dist/cli/gateway.js +1062 -0
  156. package/dist/cli/gateway.js.map +1 -0
  157. package/dist/cli/index.d.ts +3 -0
  158. package/dist/cli/index.d.ts.map +1 -0
  159. package/dist/cli/index.js +56 -0
  160. package/dist/cli/index.js.map +1 -0
  161. package/dist/commands/built-in-commands.d.ts +10 -0
  162. package/dist/commands/built-in-commands.d.ts.map +1 -0
  163. package/dist/commands/built-in-commands.js +63 -0
  164. package/dist/commands/built-in-commands.js.map +1 -0
  165. package/dist/commands/command-dispatcher.d.ts +25 -0
  166. package/dist/commands/command-dispatcher.d.ts.map +1 -0
  167. package/dist/commands/command-dispatcher.js +50 -0
  168. package/dist/commands/command-dispatcher.js.map +1 -0
  169. package/dist/commands/command-reply-adapters.d.ts +3 -0
  170. package/dist/commands/command-reply-adapters.d.ts.map +1 -0
  171. package/dist/commands/command-reply-adapters.js +60 -0
  172. package/dist/commands/command-reply-adapters.js.map +1 -0
  173. package/dist/config/file-loader.d.ts +23 -0
  174. package/dist/config/file-loader.d.ts.map +1 -0
  175. package/dist/config/file-loader.js +495 -0
  176. package/dist/config/file-loader.js.map +1 -0
  177. package/dist/config/index.d.ts +96 -0
  178. package/dist/config/index.d.ts.map +1 -0
  179. package/dist/config/index.js +357 -0
  180. package/dist/config/index.js.map +1 -0
  181. package/dist/config/network-allowlist.d.ts +18 -0
  182. package/dist/config/network-allowlist.d.ts.map +1 -0
  183. package/dist/config/network-allowlist.js +60 -0
  184. package/dist/config/network-allowlist.js.map +1 -0
  185. package/dist/connections/chat-instance-manager.d.ts +107 -0
  186. package/dist/connections/chat-instance-manager.d.ts.map +1 -0
  187. package/dist/connections/chat-instance-manager.js +886 -0
  188. package/dist/connections/chat-instance-manager.js.map +1 -0
  189. package/dist/connections/chat-response-bridge.d.ts +31 -0
  190. package/dist/connections/chat-response-bridge.d.ts.map +1 -0
  191. package/dist/connections/chat-response-bridge.js +465 -0
  192. package/dist/connections/chat-response-bridge.js.map +1 -0
  193. package/dist/connections/index.d.ts +4 -0
  194. package/dist/connections/index.d.ts.map +1 -0
  195. package/dist/connections/index.js +8 -0
  196. package/dist/connections/index.js.map +1 -0
  197. package/dist/connections/interaction-bridge.d.ts +7 -0
  198. package/dist/connections/interaction-bridge.d.ts.map +1 -0
  199. package/dist/connections/interaction-bridge.js +593 -0
  200. package/dist/connections/interaction-bridge.js.map +1 -0
  201. package/dist/connections/message-handler-bridge.d.ts +21 -0
  202. package/dist/connections/message-handler-bridge.d.ts.map +1 -0
  203. package/dist/connections/message-handler-bridge.js +314 -0
  204. package/dist/connections/message-handler-bridge.js.map +1 -0
  205. package/dist/connections/platform-auth-methods.d.ts +5 -0
  206. package/dist/connections/platform-auth-methods.d.ts.map +1 -0
  207. package/dist/connections/platform-auth-methods.js +13 -0
  208. package/dist/connections/platform-auth-methods.js.map +1 -0
  209. package/dist/connections/types.d.ts +52 -0
  210. package/dist/connections/types.d.ts.map +1 -0
  211. package/dist/connections/types.js +20 -0
  212. package/dist/connections/types.js.map +1 -0
  213. package/dist/gateway/connection-manager.d.ts +87 -0
  214. package/dist/gateway/connection-manager.d.ts.map +1 -0
  215. package/dist/gateway/connection-manager.js +216 -0
  216. package/dist/gateway/connection-manager.js.map +1 -0
  217. package/dist/gateway/index.d.ts +71 -0
  218. package/dist/gateway/index.d.ts.map +1 -0
  219. package/dist/gateway/index.js +509 -0
  220. package/dist/gateway/index.js.map +1 -0
  221. package/dist/gateway/job-router.d.ts +60 -0
  222. package/dist/gateway/job-router.d.ts.map +1 -0
  223. package/dist/gateway/job-router.js +148 -0
  224. package/dist/gateway/job-router.js.map +1 -0
  225. package/dist/gateway-main.d.ts +81 -0
  226. package/dist/gateway-main.d.ts.map +1 -0
  227. package/dist/gateway-main.js +143 -0
  228. package/dist/gateway-main.js.map +1 -0
  229. package/dist/index.d.ts +16 -0
  230. package/dist/index.d.ts.map +1 -0
  231. package/dist/index.js +64 -0
  232. package/dist/index.js.map +1 -0
  233. package/dist/infrastructure/queue/index.d.ts +8 -0
  234. package/dist/infrastructure/queue/index.d.ts.map +1 -0
  235. package/dist/infrastructure/queue/index.js +12 -0
  236. package/dist/infrastructure/queue/index.js.map +1 -0
  237. package/dist/infrastructure/queue/queue-producer.d.ts +68 -0
  238. package/dist/infrastructure/queue/queue-producer.d.ts.map +1 -0
  239. package/dist/infrastructure/queue/queue-producer.js +72 -0
  240. package/dist/infrastructure/queue/queue-producer.js.map +1 -0
  241. package/dist/infrastructure/queue/redis-queue.d.ts +45 -0
  242. package/dist/infrastructure/queue/redis-queue.d.ts.map +1 -0
  243. package/dist/infrastructure/queue/redis-queue.js +273 -0
  244. package/dist/infrastructure/queue/redis-queue.js.map +1 -0
  245. package/dist/infrastructure/queue/types.d.ts +107 -0
  246. package/dist/infrastructure/queue/types.d.ts.map +1 -0
  247. package/dist/infrastructure/queue/types.js +7 -0
  248. package/dist/infrastructure/queue/types.js.map +1 -0
  249. package/dist/infrastructure/redis/system-message-limiter.d.ts +35 -0
  250. package/dist/infrastructure/redis/system-message-limiter.d.ts.map +1 -0
  251. package/dist/infrastructure/redis/system-message-limiter.js +61 -0
  252. package/dist/infrastructure/redis/system-message-limiter.js.map +1 -0
  253. package/dist/interactions/config-request-store.d.ts +41 -0
  254. package/dist/interactions/config-request-store.d.ts.map +1 -0
  255. package/dist/interactions/config-request-store.js +103 -0
  256. package/dist/interactions/config-request-store.js.map +1 -0
  257. package/dist/interactions.d.ts +134 -0
  258. package/dist/interactions.d.ts.map +1 -0
  259. package/dist/interactions.js +175 -0
  260. package/dist/interactions.js.map +1 -0
  261. package/dist/lobu.d.ts +78 -0
  262. package/dist/lobu.d.ts.map +1 -0
  263. package/dist/lobu.js +248 -0
  264. package/dist/lobu.js.map +1 -0
  265. package/dist/metrics/prometheus.d.ts +6 -0
  266. package/dist/metrics/prometheus.d.ts.map +1 -0
  267. package/dist/metrics/prometheus.js +78 -0
  268. package/dist/metrics/prometheus.js.map +1 -0
  269. package/dist/modules/module-system.d.ts +82 -0
  270. package/dist/modules/module-system.d.ts.map +1 -0
  271. package/dist/modules/module-system.js +53 -0
  272. package/dist/modules/module-system.js.map +1 -0
  273. package/dist/orchestration/base-deployment-manager.d.ts +173 -0
  274. package/dist/orchestration/base-deployment-manager.d.ts.map +1 -0
  275. package/dist/orchestration/base-deployment-manager.js +553 -0
  276. package/dist/orchestration/base-deployment-manager.js.map +1 -0
  277. package/dist/orchestration/deployment-utils.d.ts +25 -0
  278. package/dist/orchestration/deployment-utils.d.ts.map +1 -0
  279. package/dist/orchestration/deployment-utils.js +65 -0
  280. package/dist/orchestration/deployment-utils.js.map +1 -0
  281. package/dist/orchestration/impl/docker-deployment.d.ts +43 -0
  282. package/dist/orchestration/impl/docker-deployment.d.ts.map +1 -0
  283. package/dist/orchestration/impl/docker-deployment.js +480 -0
  284. package/dist/orchestration/impl/docker-deployment.js.map +1 -0
  285. package/dist/orchestration/impl/embedded-deployment.d.ts +16 -0
  286. package/dist/orchestration/impl/embedded-deployment.d.ts.map +1 -0
  287. package/dist/orchestration/impl/embedded-deployment.js +195 -0
  288. package/dist/orchestration/impl/embedded-deployment.js.map +1 -0
  289. package/dist/orchestration/impl/index.d.ts +8 -0
  290. package/dist/orchestration/impl/index.d.ts.map +1 -0
  291. package/dist/orchestration/impl/index.js +14 -0
  292. package/dist/orchestration/impl/index.js.map +1 -0
  293. package/dist/orchestration/impl/k8s/deployment.d.ts +204 -0
  294. package/dist/orchestration/impl/k8s/deployment.d.ts.map +1 -0
  295. package/dist/orchestration/impl/k8s/deployment.js +620 -0
  296. package/dist/orchestration/impl/k8s/deployment.js.map +1 -0
  297. package/dist/orchestration/impl/k8s/helpers.d.ts +34 -0
  298. package/dist/orchestration/impl/k8s/helpers.d.ts.map +1 -0
  299. package/dist/orchestration/impl/k8s/helpers.js +377 -0
  300. package/dist/orchestration/impl/k8s/helpers.js.map +1 -0
  301. package/dist/orchestration/impl/k8s/index.d.ts +2 -0
  302. package/dist/orchestration/impl/k8s/index.d.ts.map +1 -0
  303. package/dist/orchestration/impl/k8s/index.js +6 -0
  304. package/dist/orchestration/impl/k8s/index.js.map +1 -0
  305. package/dist/orchestration/index.d.ts +53 -0
  306. package/dist/orchestration/index.d.ts.map +1 -0
  307. package/dist/orchestration/index.js +257 -0
  308. package/dist/orchestration/index.js.map +1 -0
  309. package/dist/orchestration/message-consumer.d.ts +49 -0
  310. package/dist/orchestration/message-consumer.d.ts.map +1 -0
  311. package/dist/orchestration/message-consumer.js +406 -0
  312. package/dist/orchestration/message-consumer.js.map +1 -0
  313. package/dist/orchestration/scheduled-wakeup.d.ts +110 -0
  314. package/dist/orchestration/scheduled-wakeup.d.ts.map +1 -0
  315. package/dist/orchestration/scheduled-wakeup.js +500 -0
  316. package/dist/orchestration/scheduled-wakeup.js.map +1 -0
  317. package/dist/permissions/approval-policy.d.ts +28 -0
  318. package/dist/permissions/approval-policy.d.ts.map +1 -0
  319. package/dist/permissions/approval-policy.js +33 -0
  320. package/dist/permissions/approval-policy.js.map +1 -0
  321. package/dist/permissions/grant-store.d.ts +52 -0
  322. package/dist/permissions/grant-store.d.ts.map +1 -0
  323. package/dist/permissions/grant-store.js +192 -0
  324. package/dist/permissions/grant-store.js.map +1 -0
  325. package/dist/platform/file-handler.d.ts +51 -0
  326. package/dist/platform/file-handler.d.ts.map +1 -0
  327. package/dist/platform/file-handler.js +6 -0
  328. package/dist/platform/file-handler.js.map +1 -0
  329. package/dist/platform/link-buttons.d.ts +21 -0
  330. package/dist/platform/link-buttons.d.ts.map +1 -0
  331. package/dist/platform/link-buttons.js +43 -0
  332. package/dist/platform/link-buttons.js.map +1 -0
  333. package/dist/platform/renderer-utils.d.ts +10 -0
  334. package/dist/platform/renderer-utils.d.ts.map +1 -0
  335. package/dist/platform/renderer-utils.js +42 -0
  336. package/dist/platform/renderer-utils.js.map +1 -0
  337. package/dist/platform/response-renderer.d.ts +66 -0
  338. package/dist/platform/response-renderer.d.ts.map +1 -0
  339. package/dist/platform/response-renderer.js +8 -0
  340. package/dist/platform/response-renderer.js.map +1 -0
  341. package/dist/platform/unified-thread-consumer.d.ts +41 -0
  342. package/dist/platform/unified-thread-consumer.d.ts.map +1 -0
  343. package/dist/platform/unified-thread-consumer.js +143 -0
  344. package/dist/platform/unified-thread-consumer.js.map +1 -0
  345. package/dist/platform.d.ts +255 -0
  346. package/dist/platform.d.ts.map +1 -0
  347. package/dist/platform.js +40 -0
  348. package/dist/platform.js.map +1 -0
  349. package/dist/proxy/http-proxy.d.ts +32 -0
  350. package/dist/proxy/http-proxy.d.ts.map +1 -0
  351. package/dist/proxy/http-proxy.js +636 -0
  352. package/dist/proxy/http-proxy.js.map +1 -0
  353. package/dist/proxy/proxy-manager.d.ts +13 -0
  354. package/dist/proxy/proxy-manager.d.ts.map +1 -0
  355. package/dist/proxy/proxy-manager.js +68 -0
  356. package/dist/proxy/proxy-manager.js.map +1 -0
  357. package/dist/proxy/secret-proxy.d.ts +78 -0
  358. package/dist/proxy/secret-proxy.d.ts.map +1 -0
  359. package/dist/proxy/secret-proxy.js +309 -0
  360. package/dist/proxy/secret-proxy.js.map +1 -0
  361. package/dist/proxy/token-refresh-job.d.ts +29 -0
  362. package/dist/proxy/token-refresh-job.d.ts.map +1 -0
  363. package/dist/proxy/token-refresh-job.js +104 -0
  364. package/dist/proxy/token-refresh-job.js.map +1 -0
  365. package/dist/routes/internal/audio.d.ts +14 -0
  366. package/dist/routes/internal/audio.d.ts.map +1 -0
  367. package/dist/routes/internal/audio.js +118 -0
  368. package/dist/routes/internal/audio.js.map +1 -0
  369. package/dist/routes/internal/device-auth.d.ts +42 -0
  370. package/dist/routes/internal/device-auth.d.ts.map +1 -0
  371. package/dist/routes/internal/device-auth.js +397 -0
  372. package/dist/routes/internal/device-auth.js.map +1 -0
  373. package/dist/routes/internal/files.d.ts +9 -0
  374. package/dist/routes/internal/files.d.ts.map +1 -0
  375. package/dist/routes/internal/files.js +175 -0
  376. package/dist/routes/internal/files.js.map +1 -0
  377. package/dist/routes/internal/history.d.ts +9 -0
  378. package/dist/routes/internal/history.d.ts.map +1 -0
  379. package/dist/routes/internal/history.js +55 -0
  380. package/dist/routes/internal/history.js.map +1 -0
  381. package/dist/routes/internal/images.d.ts +10 -0
  382. package/dist/routes/internal/images.d.ts.map +1 -0
  383. package/dist/routes/internal/images.js +101 -0
  384. package/dist/routes/internal/images.js.map +1 -0
  385. package/dist/routes/internal/interactions.d.ts +9 -0
  386. package/dist/routes/internal/interactions.d.ts.map +1 -0
  387. package/dist/routes/internal/interactions.js +53 -0
  388. package/dist/routes/internal/interactions.js.map +1 -0
  389. package/dist/routes/internal/middleware.d.ts +7 -0
  390. package/dist/routes/internal/middleware.d.ts.map +1 -0
  391. package/dist/routes/internal/middleware.js +24 -0
  392. package/dist/routes/internal/middleware.js.map +1 -0
  393. package/dist/routes/internal/schedule.d.ts +14 -0
  394. package/dist/routes/internal/schedule.d.ts.map +1 -0
  395. package/dist/routes/internal/schedule.js +169 -0
  396. package/dist/routes/internal/schedule.js.map +1 -0
  397. package/dist/routes/internal/types.d.ts +22 -0
  398. package/dist/routes/internal/types.d.ts.map +1 -0
  399. package/dist/routes/internal/types.js +6 -0
  400. package/dist/routes/internal/types.js.map +1 -0
  401. package/dist/routes/openapi-auto.d.ts +8 -0
  402. package/dist/routes/openapi-auto.d.ts.map +1 -0
  403. package/dist/routes/openapi-auto.js +196 -0
  404. package/dist/routes/openapi-auto.js.map +1 -0
  405. package/dist/routes/public/agent-access.d.ts +11 -0
  406. package/dist/routes/public/agent-access.d.ts.map +1 -0
  407. package/dist/routes/public/agent-access.js +11 -0
  408. package/dist/routes/public/agent-access.js.map +1 -0
  409. package/dist/routes/public/agent-config.d.ts +42 -0
  410. package/dist/routes/public/agent-config.d.ts.map +1 -0
  411. package/dist/routes/public/agent-config.js +415 -0
  412. package/dist/routes/public/agent-config.js.map +1 -0
  413. package/dist/routes/public/agent-history.d.ts +17 -0
  414. package/dist/routes/public/agent-history.d.ts.map +1 -0
  415. package/dist/routes/public/agent-history.js +335 -0
  416. package/dist/routes/public/agent-history.js.map +1 -0
  417. package/dist/routes/public/agent-schedules.d.ts +18 -0
  418. package/dist/routes/public/agent-schedules.d.ts.map +1 -0
  419. package/dist/routes/public/agent-schedules.js +242 -0
  420. package/dist/routes/public/agent-schedules.js.map +1 -0
  421. package/dist/routes/public/agent.d.ts +23 -0
  422. package/dist/routes/public/agent.d.ts.map +1 -0
  423. package/dist/routes/public/agent.js +864 -0
  424. package/dist/routes/public/agent.js.map +1 -0
  425. package/dist/routes/public/agents.d.ts +22 -0
  426. package/dist/routes/public/agents.d.ts.map +1 -0
  427. package/dist/routes/public/agents.js +257 -0
  428. package/dist/routes/public/agents.js.map +1 -0
  429. package/dist/routes/public/channels.d.ts +23 -0
  430. package/dist/routes/public/channels.d.ts.map +1 -0
  431. package/dist/routes/public/channels.js +131 -0
  432. package/dist/routes/public/channels.js.map +1 -0
  433. package/dist/routes/public/cli-auth.d.ts +12 -0
  434. package/dist/routes/public/cli-auth.d.ts.map +1 -0
  435. package/dist/routes/public/cli-auth.js +552 -0
  436. package/dist/routes/public/cli-auth.js.map +1 -0
  437. package/dist/routes/public/connections.d.ts +20 -0
  438. package/dist/routes/public/connections.d.ts.map +1 -0
  439. package/dist/routes/public/connections.js +464 -0
  440. package/dist/routes/public/connections.js.map +1 -0
  441. package/dist/routes/public/landing.d.ts +3 -0
  442. package/dist/routes/public/landing.d.ts.map +1 -0
  443. package/dist/routes/public/landing.js +17 -0
  444. package/dist/routes/public/landing.js.map +1 -0
  445. package/dist/routes/public/oauth.d.ts +24 -0
  446. package/dist/routes/public/oauth.d.ts.map +1 -0
  447. package/dist/routes/public/oauth.js +108 -0
  448. package/dist/routes/public/oauth.js.map +1 -0
  449. package/dist/routes/public/settings-auth.d.ts +28 -0
  450. package/dist/routes/public/settings-auth.d.ts.map +1 -0
  451. package/dist/routes/public/settings-auth.js +90 -0
  452. package/dist/routes/public/settings-auth.js.map +1 -0
  453. package/dist/routes/public/slack.d.ts +4 -0
  454. package/dist/routes/public/slack.d.ts.map +1 -0
  455. package/dist/routes/public/slack.js +119 -0
  456. package/dist/routes/public/slack.js.map +1 -0
  457. package/dist/routes/shared/agent-ownership.d.ts +15 -0
  458. package/dist/routes/shared/agent-ownership.d.ts.map +1 -0
  459. package/dist/routes/shared/agent-ownership.js +61 -0
  460. package/dist/routes/shared/agent-ownership.js.map +1 -0
  461. package/dist/routes/shared/token-verifier.d.ts +21 -0
  462. package/dist/routes/shared/token-verifier.d.ts.map +1 -0
  463. package/dist/routes/shared/token-verifier.js +25 -0
  464. package/dist/routes/shared/token-verifier.js.map +1 -0
  465. package/dist/services/core-services.d.ts +133 -0
  466. package/dist/services/core-services.d.ts.map +1 -0
  467. package/dist/services/core-services.js +728 -0
  468. package/dist/services/core-services.js.map +1 -0
  469. package/dist/services/image-generation-service.d.ts +38 -0
  470. package/dist/services/image-generation-service.d.ts.map +1 -0
  471. package/dist/services/image-generation-service.js +167 -0
  472. package/dist/services/image-generation-service.js.map +1 -0
  473. package/dist/services/instruction-service.d.ts +41 -0
  474. package/dist/services/instruction-service.d.ts.map +1 -0
  475. package/dist/services/instruction-service.js +252 -0
  476. package/dist/services/instruction-service.js.map +1 -0
  477. package/dist/services/mcp-registry.d.ts +31 -0
  478. package/dist/services/mcp-registry.d.ts.map +1 -0
  479. package/dist/services/mcp-registry.js +69 -0
  480. package/dist/services/mcp-registry.js.map +1 -0
  481. package/dist/services/platform-helpers.d.ts +47 -0
  482. package/dist/services/platform-helpers.d.ts.map +1 -0
  483. package/dist/services/platform-helpers.js +200 -0
  484. package/dist/services/platform-helpers.js.map +1 -0
  485. package/dist/services/session-manager.d.ts +72 -0
  486. package/dist/services/session-manager.d.ts.map +1 -0
  487. package/dist/services/session-manager.js +199 -0
  488. package/dist/services/session-manager.js.map +1 -0
  489. package/dist/services/settings-resolver.d.ts +25 -0
  490. package/dist/services/settings-resolver.d.ts.map +1 -0
  491. package/dist/services/settings-resolver.js +55 -0
  492. package/dist/services/settings-resolver.js.map +1 -0
  493. package/dist/services/system-config-resolver.d.ts +25 -0
  494. package/dist/services/system-config-resolver.d.ts.map +1 -0
  495. package/dist/services/system-config-resolver.js +73 -0
  496. package/dist/services/system-config-resolver.js.map +1 -0
  497. package/dist/services/system-skills-service.d.ts +38 -0
  498. package/dist/services/system-skills-service.d.ts.map +1 -0
  499. package/dist/services/system-skills-service.js +186 -0
  500. package/dist/services/system-skills-service.js.map +1 -0
  501. package/dist/services/transcription-service.d.ts +91 -0
  502. package/dist/services/transcription-service.d.ts.map +1 -0
  503. package/dist/services/transcription-service.js +465 -0
  504. package/dist/services/transcription-service.js.map +1 -0
  505. package/dist/session.d.ts +75 -0
  506. package/dist/session.d.ts.map +1 -0
  507. package/dist/session.js +19 -0
  508. package/dist/session.js.map +1 -0
  509. package/dist/spaces/index.d.ts +2 -0
  510. package/dist/spaces/index.d.ts.map +1 -0
  511. package/dist/spaces/index.js +18 -0
  512. package/dist/spaces/index.js.map +1 -0
  513. package/dist/spaces/space-resolver.d.ts +10 -0
  514. package/dist/spaces/space-resolver.d.ts.map +1 -0
  515. package/dist/spaces/space-resolver.js +17 -0
  516. package/dist/spaces/space-resolver.js.map +1 -0
  517. package/dist/stores/in-memory-agent-store.d.ts +57 -0
  518. package/dist/stores/in-memory-agent-store.d.ts.map +1 -0
  519. package/dist/stores/in-memory-agent-store.js +304 -0
  520. package/dist/stores/in-memory-agent-store.js.map +1 -0
  521. package/dist/stores/redis-agent-store.d.ts +57 -0
  522. package/dist/stores/redis-agent-store.d.ts.map +1 -0
  523. package/dist/stores/redis-agent-store.js +163 -0
  524. package/dist/stores/redis-agent-store.js.map +1 -0
  525. package/dist/utils/public-url.d.ts +6 -0
  526. package/dist/utils/public-url.d.ts.map +1 -0
  527. package/dist/utils/public-url.js +33 -0
  528. package/dist/utils/public-url.js.map +1 -0
  529. package/dist/utils/rate-limiter.d.ts +32 -0
  530. package/dist/utils/rate-limiter.d.ts.map +1 -0
  531. package/dist/utils/rate-limiter.js +56 -0
  532. package/dist/utils/rate-limiter.js.map +1 -0
  533. package/package.json +63 -0
@@ -0,0 +1,1062 @@
1
+ #!/usr/bin/env bun
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.createGatewayApp = createGatewayApp;
38
+ exports.startGatewayServer = startGatewayServer;
39
+ exports.startGateway = startGateway;
40
+ const node_http_1 = require("node:http");
41
+ const node_server_1 = require("@hono/node-server");
42
+ const zod_openapi_1 = require("@hono/zod-openapi");
43
+ const core_1 = require("@lobu/core");
44
+ const hono_api_reference_1 = require("@scalar/hono-api-reference");
45
+ const cors_1 = require("hono/cors");
46
+ const secure_headers_1 = require("hono/secure-headers");
47
+ const module_system_1 = require("../modules/module-system");
48
+ const openapi_auto_1 = require("../routes/openapi-auto");
49
+ const logger = (0, core_1.createLogger)("gateway-startup");
50
+ let httpServer = null;
51
+ /**
52
+ * Create the Hono app with all gateway routes.
53
+ * Returns the app without starting an HTTP server — the caller can mount it
54
+ * on their own server (embedded mode) or pass it to `startGatewayServer()`.
55
+ */
56
+ function createGatewayApp(options) {
57
+ var _a, _b;
58
+ const { secretProxy, workerGateway, mcpProxy, interactionService, platformRegistry, coreServices, chatInstanceManager, authProvider, } = options;
59
+ // Wire injectable auth provider (for embedded mode)
60
+ if (authProvider) {
61
+ const { setAuthProvider } = require("../routes/public/settings-auth");
62
+ setAuthProvider(authProvider);
63
+ }
64
+ const app = new zod_openapi_1.OpenAPIHono();
65
+ // Global middleware
66
+ app.use("*", (0, secure_headers_1.secureHeaders)({
67
+ xFrameOptions: false,
68
+ xContentTypeOptions: "nosniff",
69
+ referrerPolicy: "strict-origin-when-cross-origin",
70
+ strictTransportSecurity: "max-age=63072000; includeSubDomains",
71
+ contentSecurityPolicy: {
72
+ defaultSrc: ["'self'"],
73
+ frameAncestors: ["'self'", "*"],
74
+ scriptSrc: ["'self'", "'unsafe-inline'", "https://cdn.jsdelivr.net"],
75
+ styleSrc: ["'self'", "'unsafe-inline'"],
76
+ imgSrc: ["'self'", "data:", "https:"],
77
+ connectSrc: ["'self'", "ws:", "wss:"],
78
+ fontSrc: ["'self'", "https://fonts.gstatic.com"],
79
+ },
80
+ }));
81
+ app.use("*", (0, cors_1.cors)({
82
+ origin: process.env.ALLOWED_ORIGINS
83
+ ? process.env.ALLOWED_ORIGINS.split(",")
84
+ : [],
85
+ credentials: true,
86
+ }));
87
+ // Health endpoints
88
+ app.get("/health", (c) => {
89
+ var _a;
90
+ const mode = process.env.LOBU_MODE ||
91
+ (process.env.DEPLOYMENT_MODE === "docker" ? "local" : "cloud");
92
+ return c.json({
93
+ status: "ok",
94
+ mode,
95
+ version: process.env.npm_package_version || "2.3.0",
96
+ timestamp: new Date().toISOString(),
97
+ publicGatewayUrl: ((_a = coreServices === null || coreServices === void 0 ? void 0 : coreServices.getPublicGatewayUrl) === null || _a === void 0 ? void 0 : _a.call(coreServices)) || process.env.PUBLIC_GATEWAY_URL,
98
+ capabilities: {
99
+ agents: ["claude"],
100
+ streaming: true,
101
+ toolApproval: true,
102
+ },
103
+ wsUrl: `ws://localhost:8080/ws`,
104
+ secretProxy: !!secretProxy,
105
+ });
106
+ });
107
+ app.get("/ready", (c) => c.json({ ready: true }));
108
+ // Compute adminPassword once — used by Agent API, CLI auth, metrics, and messaging
109
+ const crypto = require("node:crypto");
110
+ const adminPassword = process.env.ADMIN_PASSWORD || crypto.randomBytes(16).toString("base64url");
111
+ // Prometheus metrics endpoint.
112
+ // Keep auth optional so existing ServiceMonitor configs continue to scrape.
113
+ app.get("/metrics", async (c) => {
114
+ const metricsAuthToken = process.env.METRICS_AUTH_TOKEN;
115
+ if (metricsAuthToken) {
116
+ const authHeader = c.req.header("Authorization");
117
+ if (authHeader !== `Bearer ${metricsAuthToken}`) {
118
+ return c.text("Unauthorized", 401);
119
+ }
120
+ }
121
+ const { getMetricsText } = await Promise.resolve().then(() => __importStar(require("../metrics/prometheus")));
122
+ c.header("Content-Type", "text/plain; version=0.0.4; charset=utf-8");
123
+ return c.text(getMetricsText());
124
+ });
125
+ // Secret injection proxy (Hono)
126
+ if (secretProxy) {
127
+ app.route("/api/proxy", secretProxy.getApp());
128
+ logger.debug("Secret proxy enabled at :8080/api/proxy");
129
+ }
130
+ // Worker Gateway routes (Hono)
131
+ if (workerGateway) {
132
+ app.route("/worker", workerGateway.getApp());
133
+ logger.debug("Worker gateway routes enabled at :8080/worker/*");
134
+ }
135
+ // Register module endpoints
136
+ const { moduleRegistry: coreModuleRegistry } = require("@lobu/core");
137
+ if (coreModuleRegistry.registerHonoEndpoints) {
138
+ coreModuleRegistry.registerHonoEndpoints(app);
139
+ }
140
+ else {
141
+ // Create express-like adapter for module registry
142
+ const expressApp = createExpressAdapter(app);
143
+ coreModuleRegistry.registerEndpoints(expressApp);
144
+ }
145
+ logger.debug("Module endpoints registered");
146
+ // MCP proxy routes (Hono)
147
+ if (mcpProxy) {
148
+ // Handle root path requests with X-Mcp-Id header
149
+ app.all("/", async (c, next) => {
150
+ if (mcpProxy.isMcpRequest(c)) {
151
+ // Forward to MCP proxy - need to handle directly since it's at root
152
+ return mcpProxy.getApp().fetch(c.req.raw);
153
+ }
154
+ return next();
155
+ });
156
+ // Mount MCP proxy at /mcp/*
157
+ app.route("/mcp", mcpProxy.getApp());
158
+ logger.debug("MCP proxy routes enabled at :8080/mcp/*");
159
+ }
160
+ // File routes (already Hono) - uses platform registry for per-platform file handling
161
+ if (platformRegistry) {
162
+ const { createFileRoutes } = require("../routes/internal/files");
163
+ const fileRouter = createFileRoutes(platformRegistry);
164
+ app.route("/internal/files", fileRouter);
165
+ logger.debug("File routes enabled at :8080/internal/files/*");
166
+ }
167
+ // History routes (already Hono)
168
+ {
169
+ const { createHistoryRoutes } = require("../routes/internal/history");
170
+ const historyRouter = createHistoryRoutes();
171
+ app.route("/internal", historyRouter);
172
+ logger.debug("History routes enabled at :8080/internal/history");
173
+ }
174
+ // Schedule routes (worker scheduling endpoints)
175
+ if (coreServices) {
176
+ const scheduledWakeupService = coreServices.getScheduledWakeupService();
177
+ if (scheduledWakeupService) {
178
+ const { createScheduleRoutes } = require("../routes/internal/schedule");
179
+ const scheduleRouter = createScheduleRoutes(scheduledWakeupService);
180
+ app.route("", scheduleRouter);
181
+ logger.debug("Schedule routes enabled at :8080/internal/schedule");
182
+ }
183
+ }
184
+ // Device auth routes (gateway-mediated OAuth for workers)
185
+ if (coreServices) {
186
+ const { createDeviceAuthRoutes, } = require("../routes/internal/device-auth");
187
+ const redisClient = coreServices.getQueue().getRedisClient();
188
+ const mcpConfigService = coreServices.getMcpConfigService();
189
+ if (mcpConfigService) {
190
+ const deviceAuthRouter = createDeviceAuthRoutes({
191
+ redis: redisClient,
192
+ mcpConfigService,
193
+ });
194
+ app.route("", deviceAuthRouter);
195
+ logger.debug("Device auth routes enabled at :8080/internal/device-auth/*");
196
+ }
197
+ }
198
+ // Audio routes (TTS synthesis for workers)
199
+ if (coreServices) {
200
+ const transcriptionService = coreServices.getTranscriptionService();
201
+ if (transcriptionService) {
202
+ const { createAudioRoutes } = require("../routes/internal/audio");
203
+ const audioRouter = createAudioRoutes(transcriptionService);
204
+ app.route("", audioRouter);
205
+ logger.debug("Audio routes enabled at :8080/internal/audio/*");
206
+ }
207
+ }
208
+ // Image routes (image generation for workers)
209
+ if (coreServices) {
210
+ const imageGenerationService = coreServices.getImageGenerationService();
211
+ if (imageGenerationService) {
212
+ const { createImageRoutes } = require("../routes/internal/images");
213
+ const imageRouter = createImageRoutes(imageGenerationService);
214
+ app.route("", imageRouter);
215
+ logger.debug("Image routes enabled at :8080/internal/images/*");
216
+ }
217
+ }
218
+ // Interaction routes (already Hono)
219
+ if (interactionService) {
220
+ const { createInteractionRoutes, } = require("../routes/internal/interactions");
221
+ const internalRouter = createInteractionRoutes(interactionService);
222
+ app.route("", internalRouter);
223
+ logger.debug("Internal interaction routes enabled");
224
+ }
225
+ // Create CLI token service early so it can be shared by messaging + agent API
226
+ let cliTokenService;
227
+ if (coreServices) {
228
+ const { CliTokenService } = require("../auth/cli/token-service");
229
+ const redisClient = coreServices.getQueue().getRedisClient();
230
+ cliTokenService = new CliTokenService(redisClient);
231
+ }
232
+ // Agent API routes (direct API access + platform-routed messaging)
233
+ if (coreServices) {
234
+ const queueProducer = coreServices.getQueueProducer();
235
+ const sessionMgr = coreServices.getSessionManager();
236
+ const interactionSvc = coreServices.getInteractionService();
237
+ const publicUrl = coreServices.getPublicGatewayUrl();
238
+ if (queueProducer && sessionMgr && interactionSvc) {
239
+ const { createAgentApi } = require("../routes/public/agent");
240
+ const agentApi = createAgentApi({
241
+ queueProducer,
242
+ sessionManager: sessionMgr,
243
+ publicGatewayUrl: publicUrl,
244
+ adminPassword,
245
+ cliTokenService,
246
+ externalAuthClient: coreServices.getExternalAuthClient(),
247
+ agentSettingsStore: coreServices.getAgentSettingsStore(),
248
+ agentConfigStore: coreServices.getConfigStore(),
249
+ platformRegistry,
250
+ });
251
+ app.route("", agentApi);
252
+ logger.debug("Agent API enabled at :8080/api/v1/agents/* with docs at :8080/api/docs");
253
+ }
254
+ }
255
+ if (coreServices) {
256
+ // Mount OAuth modules under unified auth router
257
+ const authRouter = new zod_openapi_1.OpenAPIHono();
258
+ const registeredProviders = [];
259
+ {
260
+ const { createCliAuthRoutes, createConnectAuthRoutes, } = require("../routes/public/cli-auth");
261
+ const cliAuthRouter = createCliAuthRoutes({
262
+ queue: coreServices.getQueue(),
263
+ externalAuthClient: coreServices.getExternalAuthClient(),
264
+ allowAdminPasswordLogin: process.env.NODE_ENV !== "production",
265
+ adminPassword,
266
+ });
267
+ const connectAuthRouter = createConnectAuthRoutes({
268
+ queue: coreServices.getQueue(),
269
+ externalAuthClient: coreServices.getExternalAuthClient(),
270
+ allowAdminPasswordLogin: process.env.NODE_ENV !== "production",
271
+ adminPassword,
272
+ });
273
+ authRouter.route("", cliAuthRouter);
274
+ app.route("", connectAuthRouter);
275
+ registeredProviders.push("cli-auth");
276
+ }
277
+ const providerModules = (0, module_system_1.getModelProviderModules)();
278
+ const authProfilesManager = coreServices.getAuthProfilesManager();
279
+ if (authProfilesManager) {
280
+ const { verifySettingsSessionOrToken, } = require("../routes/public/settings-auth");
281
+ const { createAuthProfileLabel, } = require("../auth/settings/auth-profiles-manager");
282
+ const agentMetadataStore = coreServices.getAgentMetadataStore();
283
+ const userAgentsStore = coreServices.getUserAgentsStore();
284
+ const verifyProviderAuth = async (c, agentId) => {
285
+ var _a, _b;
286
+ const payload = verifySettingsSessionOrToken(c);
287
+ if (!payload)
288
+ return false;
289
+ if (payload.isAdmin)
290
+ return true;
291
+ if (payload.agentId)
292
+ return payload.agentId === agentId;
293
+ if (userAgentsStore) {
294
+ const owns = await userAgentsStore.ownsAgent(payload.platform, payload.userId, agentId);
295
+ if (owns)
296
+ return true;
297
+ }
298
+ if (agentMetadataStore) {
299
+ const metadata = await agentMetadataStore.getMetadata(agentId);
300
+ const isOwner = ((_a = metadata === null || metadata === void 0 ? void 0 : metadata.owner) === null || _a === void 0 ? void 0 : _a.platform) === payload.platform &&
301
+ ((_b = metadata === null || metadata === void 0 ? void 0 : metadata.owner) === null || _b === void 0 ? void 0 : _b.userId) === payload.userId;
302
+ if (isOwner) {
303
+ userAgentsStore === null || userAgentsStore === void 0 ? void 0 : userAgentsStore.addAgent(payload.platform, payload.userId, agentId).catch(() => {
304
+ /* best-effort reconciliation */
305
+ });
306
+ return true;
307
+ }
308
+ }
309
+ return false;
310
+ };
311
+ authRouter.post("/:provider/save-key", async (c) => {
312
+ try {
313
+ const providerId = c.req.param("provider");
314
+ const mod = (0, module_system_1.getModelProviderModules)().find((m) => m.providerId === providerId);
315
+ if (!mod)
316
+ return c.json({ error: "Unknown provider" }, 404);
317
+ const body = await c.req.json();
318
+ const { agentId, apiKey } = body;
319
+ if (!agentId || !apiKey) {
320
+ return c.json({ error: "Missing agentId or apiKey" }, 400);
321
+ }
322
+ if (!(await verifyProviderAuth(c, agentId))) {
323
+ return c.json({ error: "Unauthorized" }, 401);
324
+ }
325
+ await authProfilesManager.upsertProfile({
326
+ agentId,
327
+ provider: providerId,
328
+ credential: apiKey,
329
+ authType: "api-key",
330
+ label: createAuthProfileLabel(mod.providerDisplayName, apiKey),
331
+ makePrimary: true,
332
+ });
333
+ return c.json({ success: true });
334
+ }
335
+ catch (error) {
336
+ logger.error("Failed to save API key", { error });
337
+ return c.json({ error: "Failed to save API key" }, 500);
338
+ }
339
+ });
340
+ authRouter.post("/:provider/start", async (c) => {
341
+ var _a, _b;
342
+ try {
343
+ const providerId = c.req.param("provider");
344
+ const mod = (0, module_system_1.getModelProviderModules)().find((m) => m.providerId === providerId);
345
+ if (!mod)
346
+ return c.json({ error: "Unknown provider" }, 404);
347
+ const supportsDeviceCode = mod.authType === "device-code" ||
348
+ ((_a = mod.supportedAuthTypes) === null || _a === void 0 ? void 0 : _a.includes("device-code"));
349
+ if (!supportsDeviceCode) {
350
+ return c.json({ error: "Provider does not support device code" }, 400);
351
+ }
352
+ if (typeof mod.startDeviceCode !== "function") {
353
+ return c.json({ error: "Device code start not implemented" }, 501);
354
+ }
355
+ const body = (await c.req.json().catch(() => ({})));
356
+ const agentId = (_b = body.agentId) === null || _b === void 0 ? void 0 : _b.trim();
357
+ if (!agentId)
358
+ return c.json({ error: "Missing agentId" }, 400);
359
+ if (!(await verifyProviderAuth(c, agentId))) {
360
+ return c.json({ error: "Unauthorized" }, 401);
361
+ }
362
+ const result = await mod.startDeviceCode(agentId);
363
+ return c.json(result);
364
+ }
365
+ catch (error) {
366
+ logger.error("Failed to start device code flow", { error });
367
+ return c.json({ error: "Failed to start device code flow" }, 500);
368
+ }
369
+ });
370
+ authRouter.post("/:provider/poll", async (c) => {
371
+ var _a, _b, _c, _d;
372
+ try {
373
+ const providerId = c.req.param("provider");
374
+ const mod = (0, module_system_1.getModelProviderModules)().find((m) => m.providerId === providerId);
375
+ if (!mod)
376
+ return c.json({ error: "Unknown provider" }, 404);
377
+ const supportsDeviceCode = mod.authType === "device-code" ||
378
+ ((_a = mod.supportedAuthTypes) === null || _a === void 0 ? void 0 : _a.includes("device-code"));
379
+ if (!supportsDeviceCode) {
380
+ return c.json({ error: "Provider does not support device code" }, 400);
381
+ }
382
+ if (typeof mod.pollDeviceCode !== "function") {
383
+ return c.json({ error: "Device code poll not implemented" }, 501);
384
+ }
385
+ const body = (await c.req.json().catch(() => ({})));
386
+ const agentId = (_b = body.agentId) === null || _b === void 0 ? void 0 : _b.trim();
387
+ const deviceAuthId = (_c = body.deviceAuthId) === null || _c === void 0 ? void 0 : _c.trim();
388
+ const userCode = (_d = body.userCode) === null || _d === void 0 ? void 0 : _d.trim();
389
+ if (!agentId || !deviceAuthId || !userCode) {
390
+ return c.json({ error: "Missing agentId, deviceAuthId, or userCode" }, 400);
391
+ }
392
+ if (!(await verifyProviderAuth(c, agentId))) {
393
+ return c.json({ error: "Unauthorized" }, 401);
394
+ }
395
+ const result = await mod.pollDeviceCode(agentId, {
396
+ deviceAuthId,
397
+ userCode,
398
+ });
399
+ return c.json(result);
400
+ }
401
+ catch (error) {
402
+ logger.error("Failed to poll device code flow", { error });
403
+ return c.json({ error: "Failed to poll device code flow" }, 500);
404
+ }
405
+ });
406
+ authRouter.post("/:provider/logout", async (c) => {
407
+ try {
408
+ const providerId = c.req.param("provider");
409
+ const mod = (0, module_system_1.getModelProviderModules)().find((m) => m.providerId === providerId);
410
+ if (!mod)
411
+ return c.json({ error: "Unknown provider" }, 404);
412
+ const body = await c.req.json().catch(() => ({}));
413
+ const agentId = body.agentId || c.req.query("agentId");
414
+ if (!agentId) {
415
+ return c.json({ error: "Missing agentId" }, 400);
416
+ }
417
+ if (!(await verifyProviderAuth(c, agentId))) {
418
+ return c.json({ error: "Unauthorized" }, 401);
419
+ }
420
+ await authProfilesManager.deleteProviderProfiles(agentId, providerId, body.profileId);
421
+ return c.json({ success: true });
422
+ }
423
+ catch (error) {
424
+ logger.error("Failed to logout", { error });
425
+ return c.json({ error: "Failed to logout" }, 500);
426
+ }
427
+ });
428
+ }
429
+ // Get shared dependencies (needed before mounting auth router)
430
+ const agentSettingsStore = coreServices.getAgentSettingsStore();
431
+ const claudeOAuthStateStore = coreServices.getOAuthStateStore();
432
+ const scheduledWakeupService = coreServices.getScheduledWakeupService();
433
+ // Build provider stores and overrides dynamically from registered modules
434
+ const providerStores = {};
435
+ const providerConnectedOverrides = {};
436
+ for (const mod of providerModules) {
437
+ providerStores[mod.providerId] = mod;
438
+ providerConnectedOverrides[mod.providerId] = mod.hasSystemKey();
439
+ if (mod.getApp) {
440
+ authRouter.route(`/${mod.providerId}`, mod.getApp());
441
+ registeredProviders.push(mod.providerId);
442
+ }
443
+ }
444
+ const systemSkillsService = coreServices.getSystemSkillsService();
445
+ if (systemSkillsService) {
446
+ const { SystemEnvStore } = require("../auth/system-env-store");
447
+ const { setEnvResolver } = require("../auth/mcp/string-substitution");
448
+ const systemEnvStore = new SystemEnvStore(coreServices.getQueue().getRedisClient());
449
+ systemEnvStore.refreshCache().catch((e) => {
450
+ logger.error("Failed to refresh system env cache", { error: e });
451
+ });
452
+ setEnvResolver((key) => systemEnvStore.resolve(key));
453
+ }
454
+ if (!process.env.ADMIN_PASSWORD) {
455
+ logger.info("An admin password has been auto-generated. For security reasons, it is not logged. Set the ADMIN_PASSWORD env var to use a fixed password.");
456
+ }
457
+ // Landing page (docs + integrations)
458
+ {
459
+ const { createLandingRoutes } = require("../routes/public/landing");
460
+ const landingRouter = createLandingRoutes();
461
+ app.route("", landingRouter);
462
+ logger.debug("Landing page enabled at :8080/");
463
+ }
464
+ // Agent history routes (proxy to worker HTTP server)
465
+ {
466
+ const connectionManager = (_a = coreServices
467
+ .getWorkerGateway()) === null || _a === void 0 ? void 0 : _a.getConnectionManager();
468
+ if (connectionManager) {
469
+ const { createAgentHistoryRoutes, } = require("../routes/public/agent-history");
470
+ const agentHistoryRouter = createAgentHistoryRoutes({
471
+ connectionManager,
472
+ chatInstanceManager: chatInstanceManager !== null && chatInstanceManager !== void 0 ? chatInstanceManager : undefined,
473
+ agentConfigStore: coreServices.getConfigStore(),
474
+ userAgentsStore: coreServices.getUserAgentsStore(),
475
+ });
476
+ app.route("/api/v1/agents/:agentId/history", agentHistoryRouter);
477
+ logger.debug("Agent history routes enabled at :8080/api/v1/agents/{agentId}/history/*");
478
+ }
479
+ }
480
+ // Agent config routes (/api/v1/agents/{id}/config)
481
+ if (agentSettingsStore) {
482
+ const { createAgentConfigRoutes, } = require("../routes/public/agent-config");
483
+ const agentConfigRouter = createAgentConfigRoutes({
484
+ agentSettingsStore,
485
+ agentConfigStore: coreServices.getConfigStore(),
486
+ userAgentsStore: coreServices.getUserAgentsStore(),
487
+ queue: coreServices.getQueue(),
488
+ providerStores: Object.keys(providerStores).length > 0 ? providerStores : undefined,
489
+ providerConnectedOverrides,
490
+ providerCatalogService: coreServices.getProviderCatalogService(),
491
+ authProfilesManager: coreServices.getAuthProfilesManager(),
492
+ connectionManager: (_b = coreServices
493
+ .getWorkerGateway()) === null || _b === void 0 ? void 0 : _b.getConnectionManager(),
494
+ grantStore: coreServices.getGrantStore(),
495
+ scheduledWakeupService: coreServices.getScheduledWakeupService(),
496
+ });
497
+ app.route("/api/v1/agents/:agentId/config", agentConfigRouter);
498
+ logger.debug("Agent config routes enabled at :8080/api/v1/agents/{id}/config");
499
+ }
500
+ // Agent schedules routes (/api/v1/agents/{id}/schedules)
501
+ {
502
+ const { createAgentSchedulesRoutes, } = require("../routes/public/agent-schedules");
503
+ const agentSchedulesRouter = createAgentSchedulesRoutes({
504
+ scheduledWakeupService,
505
+ externalAuthClient: coreServices.getExternalAuthClient(),
506
+ userAgentsStore: coreServices.getUserAgentsStore(),
507
+ agentMetadataStore: coreServices.getConfigStore(),
508
+ });
509
+ app.route("/api/v1/agents/:agentId/schedules", agentSchedulesRouter);
510
+ logger.debug("Agent schedules routes enabled at :8080/api/v1/agents/{id}/schedules");
511
+ }
512
+ // OAuth routes (mounted under unified auth router)
513
+ if (agentSettingsStore) {
514
+ const { createOAuthRoutes } = require("../routes/public/oauth");
515
+ const { OAuthClient } = require("../auth/oauth/client");
516
+ const { CLAUDE_PROVIDER } = require("../auth/oauth/providers");
517
+ const claudeOAuthClient = new OAuthClient(CLAUDE_PROVIDER);
518
+ const oauthRouter = createOAuthRoutes({
519
+ providerStores: Object.keys(providerStores).length > 0 ? providerStores : undefined,
520
+ oauthClients: { claude: claudeOAuthClient },
521
+ oauthStateStore: claudeOAuthStateStore,
522
+ });
523
+ authRouter.route("", oauthRouter);
524
+ registeredProviders.push("oauth");
525
+ }
526
+ // Mount unified auth router (includes provider modules + OAuth)
527
+ if (registeredProviders.length > 0) {
528
+ app.route("/api/v1/auth", authRouter);
529
+ logger.debug(`Auth routes enabled at :8080/api/v1/auth/* for: ${registeredProviders.join(", ")}`);
530
+ }
531
+ // Channel binding routes (mount under agent API)
532
+ const channelBindingService = coreServices.getChannelBindingService();
533
+ if (channelBindingService) {
534
+ const { createChannelBindingRoutes, } = require("../routes/public/channels");
535
+ const channelBindingRouter = createChannelBindingRoutes({
536
+ channelBindingService,
537
+ userAgentsStore: coreServices.getUserAgentsStore(),
538
+ agentMetadataStore: coreServices.getAgentMetadataStore(),
539
+ });
540
+ // Mount as a sub-router under /api/v1/agents/:agentId/channels
541
+ app.route("/api/v1/agents/:agentId/channels", channelBindingRouter);
542
+ logger.debug("Channel binding routes enabled at :8080/api/v1/agents/{agentId}/channels/*");
543
+ }
544
+ // Agent management routes (separate from Agent API's /api/v1/agents)
545
+ {
546
+ const userAgentsStore = coreServices.getUserAgentsStore();
547
+ const agentMetadataStore = coreServices.getAgentMetadataStore();
548
+ const { createAgentRoutes } = require("../routes/public/agents");
549
+ const agentManagementRouter = createAgentRoutes({
550
+ userAgentsStore,
551
+ agentMetadataStore,
552
+ agentSettingsStore,
553
+ channelBindingService,
554
+ });
555
+ app.route("/api/v1/agents", agentManagementRouter);
556
+ logger.debug("Agent management routes enabled at :8080/api/v1/agents/*");
557
+ }
558
+ }
559
+ // Chat SDK connection routes (webhook + CRUD)
560
+ if (chatInstanceManager) {
561
+ const { createSlackRoutes, createConnectionWebhookRoutes, createConnectionCrudRoutes, } = Object.assign(Object.assign({}, require("../routes/public/slack")), require("../routes/public/connections"));
562
+ app.route("", createSlackRoutes(chatInstanceManager));
563
+ app.route("", createConnectionWebhookRoutes(chatInstanceManager));
564
+ app.route("", createConnectionCrudRoutes(chatInstanceManager, {
565
+ userAgentsStore: coreServices.getUserAgentsStore(),
566
+ agentMetadataStore: coreServices.getConfigStore(),
567
+ }));
568
+ logger.debug("Slack and connection routes enabled at :8080/slack/*, :8080/api/v1/connections/*, and :8080/api/v1/webhooks/*");
569
+ }
570
+ // ─── Reload endpoint (file-first dev mode) ──────────────────────────────────
571
+ // Re-reads lobu.toml + markdown and re-populates InMemoryAgentStore.
572
+ // Only works in dev mode (files exist), authenticated with ADMIN_PASSWORD.
573
+ app.post("/api/v1/reload", async (c) => {
574
+ if (process.env.NODE_ENV === "production") {
575
+ return c.json({ error: "Not found" }, 404);
576
+ }
577
+ const authHeader = c.req.header("Authorization");
578
+ if (authHeader !== `Bearer ${adminPassword}`) {
579
+ return c.json({ error: "Unauthorized" }, 401);
580
+ }
581
+ if (!(coreServices === null || coreServices === void 0 ? void 0 : coreServices.isFileFirstMode())) {
582
+ return c.json({ error: "Reload only available in file-first dev mode" }, 400);
583
+ }
584
+ try {
585
+ const result = await coreServices.reloadFromFiles();
586
+ return c.json(result);
587
+ }
588
+ catch (err) {
589
+ logger.error("Reload failed", {
590
+ error: err instanceof Error ? err.message : String(err),
591
+ });
592
+ return c.json({ error: "Reload failed" }, 500);
593
+ }
594
+ });
595
+ // ─── Internal CLI status endpoint ──────────────────────────────────────────
596
+ // Returns agents, connections, and sandboxes for `lobu status`.
597
+ // Only available in non-production, authenticated with ADMIN_PASSWORD.
598
+ app.get("/internal/status", async (c) => {
599
+ var _a, _b;
600
+ if (process.env.NODE_ENV === "production") {
601
+ return c.json({ error: "Not found" }, 404);
602
+ }
603
+ const authHeader = c.req.header("Authorization");
604
+ if (authHeader !== `Bearer ${adminPassword}`) {
605
+ return c.json({ error: "Unauthorized" }, 401);
606
+ }
607
+ const agentConfigStore = coreServices === null || coreServices === void 0 ? void 0 : coreServices.getConfigStore();
608
+ const allAgents = agentConfigStore
609
+ ? await agentConfigStore.listAgents()
610
+ : [];
611
+ const templateAgents = allAgents.filter((a) => !a.parentConnectionId);
612
+ const sandboxAgents = allAgents.filter((a) => !!a.parentConnectionId);
613
+ const connections = chatInstanceManager
614
+ ? await chatInstanceManager.listConnections()
615
+ : [];
616
+ const agentDetails = [];
617
+ for (const a of templateAgents) {
618
+ const settings = agentConfigStore
619
+ ? await agentConfigStore.getSettings(a.agentId)
620
+ : null;
621
+ const providers = ((settings === null || settings === void 0 ? void 0 : settings.installedProviders) || []).map((p) => p.providerId);
622
+ agentDetails.push({
623
+ agentId: a.agentId,
624
+ name: a.name,
625
+ providers,
626
+ model: ((_a = settings === null || settings === void 0 ? void 0 : settings.modelSelection) === null || _a === void 0 ? void 0 : _a.mode) === "pinned"
627
+ ? settings.modelSelection
628
+ .pinnedModel || "pinned"
629
+ : ((_b = settings === null || settings === void 0 ? void 0 : settings.modelSelection) === null || _b === void 0 ? void 0 : _b.mode) || "auto",
630
+ });
631
+ }
632
+ return c.json({
633
+ agents: agentDetails,
634
+ connections: connections.map((conn) => {
635
+ var _a;
636
+ return ({
637
+ id: conn.id,
638
+ platform: conn.platform,
639
+ status: (chatInstanceManager === null || chatInstanceManager === void 0 ? void 0 : chatInstanceManager.getInstance(conn.id))
640
+ ? "connected"
641
+ : "disconnected",
642
+ templateAgentId: conn.templateAgentId || null,
643
+ botUsername: ((_a = conn.metadata) === null || _a === void 0 ? void 0 : _a.botUsername) || null,
644
+ });
645
+ }),
646
+ sandboxes: sandboxAgents.map((s) => {
647
+ var _a;
648
+ return ({
649
+ agentId: s.agentId,
650
+ name: s.name,
651
+ parentConnectionId: s.parentConnectionId || null,
652
+ lastUsedAt: (_a = s.lastUsedAt) !== null && _a !== void 0 ? _a : null,
653
+ });
654
+ }),
655
+ });
656
+ });
657
+ // Auto-register any non-openapi routes so everything shows up in the schema
658
+ (0, openapi_auto_1.registerAutoOpenApiRoutes)(app);
659
+ // OpenAPI Documentation
660
+ app.doc("/api/docs/openapi.json", {
661
+ openapi: "3.0.0",
662
+ info: {
663
+ title: "Lobu API",
664
+ version: "1.0.0",
665
+ description: `
666
+ ## Overview
667
+
668
+ The Lobu API allows you to create and interact with AI agents programmatically.
669
+
670
+ ## Authentication
671
+
672
+ 1. Authenticate the agent-creation request with an admin password or CLI access token
673
+ 2. Create an agent with \`POST /api/v1/agents\` to get a worker token
674
+ 3. Use the returned worker token as a Bearer token for subsequent agent requests
675
+
676
+ ## Quick Start
677
+
678
+ \`\`\`bash
679
+ # 1. Create an agent (authenticate with admin password or CLI token)
680
+ curl -X POST http://localhost:8080/api/v1/agents \\
681
+ -H "Authorization: Bearer $ADMIN_PASSWORD" \\
682
+ -H "Content-Type: application/json" \\
683
+ -d '{"provider": "claude"}'
684
+
685
+ # 2. Send a message (use worker token from step 1)
686
+ curl -X POST http://localhost:8080/api/v1/agents/{agentId}/messages \\
687
+ -H "Authorization: Bearer {token}" \\
688
+ -H "Content-Type: application/json" \\
689
+ -d '{"content": "Hello!"}'
690
+ \`\`\`
691
+
692
+ ## MCP Servers
693
+
694
+ Agents can be configured with custom MCP (Model Context Protocol) servers:
695
+
696
+ \`\`\`json
697
+ {
698
+ "mcpServers": {
699
+ "my-http-mcp": { "url": "https://my-mcp.com/sse" },
700
+ "my-stdio-mcp": { "command": "npx", "args": ["-y", "@org/mcp"] }
701
+ }
702
+ }
703
+ \`\`\`
704
+ `,
705
+ },
706
+ tags: [
707
+ {
708
+ name: "Agents",
709
+ description: "Create, list, update, and delete agents.",
710
+ },
711
+ {
712
+ name: "Messages",
713
+ description: "Send messages to agents and subscribe to real-time events (SSE).",
714
+ },
715
+ {
716
+ name: "Configuration",
717
+ description: "Agent configuration — LLM providers, Nix packages, domain grants.",
718
+ },
719
+ {
720
+ name: "Channels",
721
+ description: "Bind agents to messaging platform channels (Slack, Telegram, WhatsApp).",
722
+ },
723
+ {
724
+ name: "Connections",
725
+ description: "Manage Chat SDK-backed platform connections and their lifecycle.",
726
+ },
727
+ {
728
+ name: "Schedules",
729
+ description: "Scheduled wakeups and recurring reminders.",
730
+ },
731
+ {
732
+ name: "History",
733
+ description: "Session messages, stats, and connection status.",
734
+ },
735
+ {
736
+ name: "Auth",
737
+ description: "Provider authentication — API keys, OAuth, device code flows.",
738
+ },
739
+ {
740
+ name: "Integrations",
741
+ description: "Browse and install skills and MCP servers.",
742
+ },
743
+ ],
744
+ servers: [
745
+ { url: "http://localhost:8080", description: "Local development" },
746
+ ],
747
+ });
748
+ app.get("/api/docs", (0, hono_api_reference_1.apiReference)({
749
+ url: "/api/docs/openapi.json",
750
+ theme: "kepler",
751
+ layout: "modern",
752
+ defaultHttpClient: { targetKey: "js", clientKey: "fetch" },
753
+ }));
754
+ logger.debug("API docs enabled at /api/docs");
755
+ return app;
756
+ }
757
+ /**
758
+ * Start an HTTP server for the gateway Hono app.
759
+ * Used in standalone mode. In embedded mode, the host creates its own server.
760
+ */
761
+ function startGatewayServer(app, port = 8080) {
762
+ const honoListener = (0, node_server_1.getRequestListener)(app.fetch);
763
+ const server = (0, node_http_1.createServer)(honoListener);
764
+ server.listen(port);
765
+ logger.debug(`Server listening on port ${port}`);
766
+ return server;
767
+ }
768
+ /**
769
+ * Handle Express-style handler with Hono context
770
+ */
771
+ async function handleExpressHandler(c, handler) {
772
+ const { req, res, responsePromise } = createExpressCompatObjects(c);
773
+ await handler(req, res);
774
+ return responsePromise;
775
+ }
776
+ /**
777
+ * Create Express-compatible request/response objects from Hono context
778
+ */
779
+ function createExpressCompatObjects(c, overridePath) {
780
+ let resolveResponse;
781
+ const responsePromise = new Promise((resolve) => {
782
+ resolveResponse = resolve;
783
+ });
784
+ const url = new URL(c.req.url);
785
+ const headers = {};
786
+ c.req.raw.headers.forEach((value, key) => {
787
+ headers[key] = value;
788
+ });
789
+ // Express-compatible request object
790
+ const req = {
791
+ method: c.req.method,
792
+ url: c.req.url,
793
+ path: overridePath || url.pathname,
794
+ headers,
795
+ query: Object.fromEntries(url.searchParams),
796
+ params: c.req.param() || {},
797
+ body: null,
798
+ get: (name) => headers[name.toLowerCase()],
799
+ on: () => {
800
+ // Express event listener stub - not used in Hono compat layer
801
+ },
802
+ };
803
+ // Response state
804
+ let statusCode = 200;
805
+ const responseHeaders = new Headers();
806
+ let isStreaming = false;
807
+ let streamController = null;
808
+ // Express-compatible response object
809
+ const res = {
810
+ statusCode: 200,
811
+ destroyed: false,
812
+ writableEnded: false,
813
+ status(code) {
814
+ statusCode = code;
815
+ this.statusCode = code;
816
+ return this;
817
+ },
818
+ setHeader(name, value) {
819
+ responseHeaders.set(name, value);
820
+ return this;
821
+ },
822
+ set(name, value) {
823
+ responseHeaders.set(name, value);
824
+ return this;
825
+ },
826
+ json(data) {
827
+ responseHeaders.set("Content-Type", "application/json");
828
+ resolveResponse === null || resolveResponse === void 0 ? void 0 : resolveResponse(new Response(JSON.stringify(data), {
829
+ status: statusCode,
830
+ headers: responseHeaders,
831
+ }));
832
+ },
833
+ send(data) {
834
+ resolveResponse === null || resolveResponse === void 0 ? void 0 : resolveResponse(new Response(data, {
835
+ status: statusCode,
836
+ headers: responseHeaders,
837
+ }));
838
+ },
839
+ text(data) {
840
+ resolveResponse === null || resolveResponse === void 0 ? void 0 : resolveResponse(new Response(data, {
841
+ status: statusCode,
842
+ headers: responseHeaders,
843
+ }));
844
+ },
845
+ end(data) {
846
+ this.writableEnded = true;
847
+ if (isStreaming && streamController) {
848
+ if (data) {
849
+ streamController.enqueue(typeof data === "string" ? new TextEncoder().encode(data) : data);
850
+ }
851
+ streamController.close();
852
+ }
853
+ else {
854
+ resolveResponse === null || resolveResponse === void 0 ? void 0 : resolveResponse(new Response(data || null, {
855
+ status: statusCode,
856
+ headers: responseHeaders,
857
+ }));
858
+ }
859
+ },
860
+ write(chunk) {
861
+ if (!isStreaming) {
862
+ isStreaming = true;
863
+ const stream = new ReadableStream({
864
+ start(controller) {
865
+ streamController = controller;
866
+ if (chunk) {
867
+ controller.enqueue(typeof chunk === "string"
868
+ ? new TextEncoder().encode(chunk)
869
+ : chunk);
870
+ }
871
+ },
872
+ });
873
+ resolveResponse === null || resolveResponse === void 0 ? void 0 : resolveResponse(new Response(stream, {
874
+ status: statusCode,
875
+ headers: responseHeaders,
876
+ }));
877
+ }
878
+ else if (streamController) {
879
+ streamController.enqueue(typeof chunk === "string" ? new TextEncoder().encode(chunk) : chunk);
880
+ }
881
+ return true;
882
+ },
883
+ flushHeaders() {
884
+ // No-op for compatibility
885
+ },
886
+ };
887
+ // Parse body for POST/PUT/PATCH
888
+ if (["POST", "PUT", "PATCH"].includes(c.req.method)) {
889
+ const contentType = c.req.header("content-type") || "";
890
+ c.req.raw
891
+ .clone()
892
+ .arrayBuffer()
893
+ .then((buffer) => {
894
+ if (contentType.includes("application/json")) {
895
+ try {
896
+ req.body = JSON.parse(new TextDecoder().decode(buffer));
897
+ }
898
+ catch (_a) {
899
+ req.body = buffer;
900
+ }
901
+ }
902
+ else {
903
+ req.body = buffer;
904
+ }
905
+ });
906
+ }
907
+ return { req, res, responsePromise };
908
+ }
909
+ /**
910
+ * Create Express-like adapter for compatibility with module registry
911
+ */
912
+ function createExpressAdapter(honoApp) {
913
+ return {
914
+ get: (path, ...handlers) => {
915
+ const handler = handlers[handlers.length - 1];
916
+ honoApp.get(path, (c) => handleExpressHandler(c, handler));
917
+ },
918
+ post: (path, ...handlers) => {
919
+ const handler = handlers[handlers.length - 1];
920
+ honoApp.post(path, (c) => handleExpressHandler(c, handler));
921
+ },
922
+ put: (path, ...handlers) => {
923
+ const handler = handlers[handlers.length - 1];
924
+ honoApp.put(path, (c) => handleExpressHandler(c, handler));
925
+ },
926
+ delete: (path, ...handlers) => {
927
+ const handler = handlers[handlers.length - 1];
928
+ honoApp.delete(path, (c) => handleExpressHandler(c, handler));
929
+ },
930
+ use: (pathOrHandler, handler) => {
931
+ if (typeof pathOrHandler === "function") {
932
+ // Global middleware - skip for now
933
+ }
934
+ else if (handler) {
935
+ honoApp.all(`${pathOrHandler}/*`, (c) => handleExpressHandler(c, handler));
936
+ }
937
+ },
938
+ };
939
+ }
940
+ /**
941
+ * Start the gateway with the provided configuration
942
+ */
943
+ async function startGateway(config) {
944
+ var _a, _b;
945
+ logger.info("Starting Lobu Gateway");
946
+ // Start filtering proxy for worker network isolation (if enabled)
947
+ const { startFilteringProxy } = await Promise.resolve().then(() => __importStar(require("../proxy/proxy-manager")));
948
+ await startFilteringProxy();
949
+ // Import dependencies
950
+ const { Orchestrator } = await Promise.resolve().then(() => __importStar(require("../orchestration")));
951
+ const { Gateway } = await Promise.resolve().then(() => __importStar(require("../gateway-main")));
952
+ // Create and start orchestrator
953
+ logger.debug("Creating orchestrator", { mode: process.env.DEPLOYMENT_MODE });
954
+ const orchestrator = new Orchestrator(config.orchestration);
955
+ await orchestrator.start();
956
+ logger.debug("Orchestrator started");
957
+ // Create Gateway
958
+ const gateway = new Gateway(config);
959
+ // Register API platform (always enabled)
960
+ const { ApiPlatform } = await Promise.resolve().then(() => __importStar(require("../api")));
961
+ const apiPlatform = new ApiPlatform();
962
+ gateway.registerPlatform(apiPlatform);
963
+ logger.debug("API platform registered");
964
+ // Start gateway
965
+ await gateway.start();
966
+ logger.debug("Gateway started");
967
+ // Get core services
968
+ const coreServices = gateway.getCoreServices();
969
+ // Wire grant store to HTTP proxy for domain grant checks
970
+ const grantStore = coreServices.getGrantStore();
971
+ if (grantStore) {
972
+ const { setProxyGrantStore } = await Promise.resolve().then(() => __importStar(require("../proxy/http-proxy")));
973
+ setProxyGrantStore(grantStore);
974
+ logger.debug("Grant store connected to HTTP proxy");
975
+ }
976
+ // Inject core services into orchestrator (provider modules carry their own credential stores)
977
+ await orchestrator.injectCoreServices(coreServices.getQueue().getRedisClient(), coreServices.getProviderCatalogService(), (_a = coreServices.getGrantStore()) !== null && _a !== void 0 ? _a : undefined);
978
+ logger.debug("Orchestrator configured with core services");
979
+ // Initialize Chat SDK connection manager (API-driven platform connections)
980
+ const { ChatInstanceManager, ChatResponseBridge } = await Promise.resolve().then(() => __importStar(require("../connections")));
981
+ const chatInstanceManager = new ChatInstanceManager();
982
+ try {
983
+ await chatInstanceManager.initialize(coreServices);
984
+ // Register chat platform adapters (delegates to ChatInstanceManager)
985
+ for (const adapter of chatInstanceManager.createPlatformAdapters()) {
986
+ gateway.registerPlatform(adapter);
987
+ }
988
+ logger.debug("ChatInstanceManager initialized");
989
+ // Seed connections from file-loaded agents (file-first architecture)
990
+ const fileLoadedAgents = coreServices.getFileLoadedAgents();
991
+ if (fileLoadedAgents.length > 0) {
992
+ for (const agent of fileLoadedAgents) {
993
+ if (!((_b = agent.connections) === null || _b === void 0 ? void 0 : _b.length))
994
+ continue;
995
+ for (const conn of agent.connections) {
996
+ const existing = await chatInstanceManager.listConnections({
997
+ platform: conn.type,
998
+ templateAgentId: agent.agentId,
999
+ });
1000
+ if (existing.length > 0)
1001
+ continue;
1002
+ try {
1003
+ await chatInstanceManager.addConnection(conn.type, agent.agentId, Object.assign({ platform: conn.type }, conn.config), { allowGroups: true });
1004
+ logger.debug(`Created ${conn.type} connection for agent "${agent.agentId}"`);
1005
+ }
1006
+ catch (err) {
1007
+ logger.error(`Failed to create ${conn.type} connection for agent "${agent.agentId}"`, { error: err instanceof Error ? err.message : String(err) });
1008
+ }
1009
+ }
1010
+ }
1011
+ }
1012
+ // Wire ChatResponseBridge into unified thread consumer
1013
+ const unifiedConsumer = gateway.getUnifiedConsumer();
1014
+ if (unifiedConsumer) {
1015
+ const chatResponseBridge = new ChatResponseBridge(chatInstanceManager);
1016
+ unifiedConsumer.setChatResponseBridge(chatResponseBridge);
1017
+ logger.debug("ChatResponseBridge wired to unified thread consumer");
1018
+ }
1019
+ }
1020
+ catch (error) {
1021
+ logger.warn({ error: String(error) }, "ChatInstanceManager initialization failed — connections feature disabled");
1022
+ }
1023
+ // Setup server on port 8080 (single port for all HTTP traffic)
1024
+ if (!httpServer) {
1025
+ const app = createGatewayApp({
1026
+ secretProxy: coreServices.getSecretProxy(),
1027
+ workerGateway: coreServices.getWorkerGateway(),
1028
+ mcpProxy: coreServices.getMcpProxy(),
1029
+ interactionService: coreServices.getInteractionService(),
1030
+ platformRegistry: gateway.getPlatformRegistry(),
1031
+ coreServices,
1032
+ chatInstanceManager,
1033
+ });
1034
+ httpServer = startGatewayServer(app);
1035
+ }
1036
+ logger.info("Lobu Gateway is running!");
1037
+ // Setup graceful shutdown
1038
+ const cleanup = async () => {
1039
+ logger.info("Shutting down gateway...");
1040
+ // Hard deadline: force exit after 30s if graceful shutdown stalls
1041
+ const hardDeadline = setTimeout(() => {
1042
+ logger.error("Graceful shutdown timed out after 30s, forcing exit");
1043
+ process.exit(1);
1044
+ }, 30000);
1045
+ hardDeadline.unref();
1046
+ await chatInstanceManager.shutdown();
1047
+ await orchestrator.stop();
1048
+ await gateway.stop();
1049
+ if (httpServer) {
1050
+ httpServer.close();
1051
+ }
1052
+ logger.info("Gateway shutdown complete");
1053
+ process.exit(0);
1054
+ };
1055
+ process.on("SIGINT", cleanup);
1056
+ process.on("SIGTERM", cleanup);
1057
+ process.on("SIGUSR1", () => {
1058
+ const status = gateway.getStatus();
1059
+ logger.info("Health check:", JSON.stringify(status, null, 2));
1060
+ });
1061
+ }
1062
+ //# sourceMappingURL=gateway.js.map