@lobu/gateway 3.0.5 → 3.0.6

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 (175) hide show
  1. package/package.json +2 -2
  2. package/src/__tests__/agent-config-routes.test.ts +254 -0
  3. package/src/__tests__/agent-history-routes.test.ts +72 -0
  4. package/src/__tests__/agent-routes.test.ts +68 -0
  5. package/src/__tests__/agent-schedules-routes.test.ts +59 -0
  6. package/src/__tests__/agent-settings-store.test.ts +323 -0
  7. package/src/__tests__/chat-instance-manager-slack.test.ts +204 -0
  8. package/src/__tests__/chat-response-bridge.test.ts +131 -0
  9. package/src/__tests__/config-memory-plugins.test.ts +92 -0
  10. package/src/__tests__/config-request-store.test.ts +127 -0
  11. package/src/__tests__/connection-routes.test.ts +144 -0
  12. package/src/__tests__/core-services-store-selection.test.ts +92 -0
  13. package/src/__tests__/docker-deployment.test.ts +1211 -0
  14. package/src/__tests__/embedded-deployment.test.ts +342 -0
  15. package/src/__tests__/grant-store.test.ts +148 -0
  16. package/src/__tests__/http-proxy.test.ts +281 -0
  17. package/src/__tests__/instruction-service.test.ts +37 -0
  18. package/src/__tests__/link-buttons.test.ts +112 -0
  19. package/src/__tests__/lobu.test.ts +32 -0
  20. package/src/__tests__/mcp-config-service.test.ts +347 -0
  21. package/src/__tests__/mcp-proxy.test.ts +696 -0
  22. package/src/__tests__/message-handler-bridge.test.ts +17 -0
  23. package/src/__tests__/model-selection.test.ts +172 -0
  24. package/src/__tests__/oauth-templates.test.ts +39 -0
  25. package/src/__tests__/platform-adapter-slack-send.test.ts +114 -0
  26. package/src/__tests__/platform-helpers-model-resolution.test.ts +253 -0
  27. package/src/__tests__/provider-inheritance.test.ts +212 -0
  28. package/src/__tests__/routes/cli-auth.test.ts +337 -0
  29. package/src/__tests__/routes/interactions.test.ts +121 -0
  30. package/src/__tests__/secret-proxy.test.ts +85 -0
  31. package/src/__tests__/session-manager.test.ts +572 -0
  32. package/src/__tests__/setup.ts +133 -0
  33. package/src/__tests__/skill-and-mcp-registry.test.ts +203 -0
  34. package/src/__tests__/slack-routes.test.ts +161 -0
  35. package/src/__tests__/system-config-resolver.test.ts +75 -0
  36. package/src/__tests__/system-message-limiter.test.ts +89 -0
  37. package/src/__tests__/system-skills-service.test.ts +362 -0
  38. package/src/__tests__/transcription-service.test.ts +222 -0
  39. package/src/__tests__/utils/rate-limiter.test.ts +102 -0
  40. package/src/__tests__/worker-connection-manager.test.ts +497 -0
  41. package/src/__tests__/worker-job-router.test.ts +722 -0
  42. package/src/api/index.ts +1 -0
  43. package/src/api/platform.ts +292 -0
  44. package/src/api/response-renderer.ts +157 -0
  45. package/src/auth/agent-metadata-store.ts +168 -0
  46. package/src/auth/api-auth-middleware.ts +69 -0
  47. package/src/auth/api-key-provider-module.ts +213 -0
  48. package/src/auth/base-provider-module.ts +201 -0
  49. package/src/auth/chatgpt/chatgpt-oauth-module.ts +185 -0
  50. package/src/auth/chatgpt/device-code-client.ts +218 -0
  51. package/src/auth/chatgpt/index.ts +1 -0
  52. package/src/auth/claude/oauth-module.ts +280 -0
  53. package/src/auth/cli/token-service.ts +249 -0
  54. package/src/auth/external/client.ts +560 -0
  55. package/src/auth/external/device-code-client.ts +225 -0
  56. package/src/auth/mcp/config-service.ts +392 -0
  57. package/src/auth/mcp/proxy.ts +1088 -0
  58. package/src/auth/mcp/string-substitution.ts +17 -0
  59. package/src/auth/mcp/tool-cache.ts +90 -0
  60. package/src/auth/oauth/base-client.ts +267 -0
  61. package/src/auth/oauth/client.ts +153 -0
  62. package/src/auth/oauth/credentials.ts +7 -0
  63. package/src/auth/oauth/providers.ts +69 -0
  64. package/src/auth/oauth/state-store.ts +150 -0
  65. package/src/auth/oauth-templates.ts +179 -0
  66. package/src/auth/provider-catalog.ts +220 -0
  67. package/src/auth/provider-model-options.ts +41 -0
  68. package/src/auth/settings/agent-settings-store.ts +565 -0
  69. package/src/auth/settings/auth-profiles-manager.ts +216 -0
  70. package/src/auth/settings/index.ts +12 -0
  71. package/src/auth/settings/model-preference-store.ts +52 -0
  72. package/src/auth/settings/model-selection.ts +135 -0
  73. package/src/auth/settings/resolved-settings-view.ts +298 -0
  74. package/src/auth/settings/template-utils.ts +44 -0
  75. package/src/auth/settings/token-service.ts +88 -0
  76. package/src/auth/system-env-store.ts +98 -0
  77. package/src/auth/user-agents-store.ts +68 -0
  78. package/src/channels/binding-service.ts +214 -0
  79. package/src/channels/index.ts +4 -0
  80. package/src/cli/gateway.ts +1304 -0
  81. package/src/cli/index.ts +74 -0
  82. package/src/commands/built-in-commands.ts +80 -0
  83. package/src/commands/command-dispatcher.ts +94 -0
  84. package/src/commands/command-reply-adapters.ts +27 -0
  85. package/src/config/file-loader.ts +618 -0
  86. package/src/config/index.ts +588 -0
  87. package/src/config/network-allowlist.ts +71 -0
  88. package/src/connections/chat-instance-manager.ts +1284 -0
  89. package/src/connections/chat-response-bridge.ts +618 -0
  90. package/src/connections/index.ts +7 -0
  91. package/src/connections/interaction-bridge.ts +831 -0
  92. package/src/connections/message-handler-bridge.ts +415 -0
  93. package/src/connections/platform-auth-methods.ts +15 -0
  94. package/src/connections/types.ts +84 -0
  95. package/src/gateway/connection-manager.ts +291 -0
  96. package/src/gateway/index.ts +700 -0
  97. package/src/gateway/job-router.ts +201 -0
  98. package/src/gateway-main.ts +200 -0
  99. package/src/index.ts +41 -0
  100. package/src/infrastructure/queue/index.ts +12 -0
  101. package/src/infrastructure/queue/queue-producer.ts +148 -0
  102. package/src/infrastructure/queue/redis-queue.ts +361 -0
  103. package/src/infrastructure/queue/types.ts +133 -0
  104. package/src/infrastructure/redis/system-message-limiter.ts +94 -0
  105. package/src/interactions/config-request-store.ts +198 -0
  106. package/src/interactions.ts +363 -0
  107. package/src/lobu.ts +311 -0
  108. package/src/metrics/prometheus.ts +159 -0
  109. package/src/modules/module-system.ts +179 -0
  110. package/src/orchestration/base-deployment-manager.ts +900 -0
  111. package/src/orchestration/deployment-utils.ts +98 -0
  112. package/src/orchestration/impl/docker-deployment.ts +620 -0
  113. package/src/orchestration/impl/embedded-deployment.ts +268 -0
  114. package/src/orchestration/impl/index.ts +8 -0
  115. package/src/orchestration/impl/k8s/deployment.ts +1061 -0
  116. package/src/orchestration/impl/k8s/helpers.ts +610 -0
  117. package/src/orchestration/impl/k8s/index.ts +1 -0
  118. package/src/orchestration/index.ts +333 -0
  119. package/src/orchestration/message-consumer.ts +584 -0
  120. package/src/orchestration/scheduled-wakeup.ts +704 -0
  121. package/src/permissions/approval-policy.ts +36 -0
  122. package/src/permissions/grant-store.ts +219 -0
  123. package/src/platform/file-handler.ts +66 -0
  124. package/src/platform/link-buttons.ts +57 -0
  125. package/src/platform/renderer-utils.ts +44 -0
  126. package/src/platform/response-renderer.ts +84 -0
  127. package/src/platform/unified-thread-consumer.ts +187 -0
  128. package/src/platform.ts +318 -0
  129. package/src/proxy/http-proxy.ts +752 -0
  130. package/src/proxy/proxy-manager.ts +81 -0
  131. package/src/proxy/secret-proxy.ts +402 -0
  132. package/src/proxy/token-refresh-job.ts +143 -0
  133. package/src/routes/internal/audio.ts +141 -0
  134. package/src/routes/internal/device-auth.ts +566 -0
  135. package/src/routes/internal/files.ts +226 -0
  136. package/src/routes/internal/history.ts +69 -0
  137. package/src/routes/internal/images.ts +127 -0
  138. package/src/routes/internal/interactions.ts +84 -0
  139. package/src/routes/internal/middleware.ts +23 -0
  140. package/src/routes/internal/schedule.ts +226 -0
  141. package/src/routes/internal/types.ts +22 -0
  142. package/src/routes/openapi-auto.ts +239 -0
  143. package/src/routes/public/agent-access.ts +23 -0
  144. package/src/routes/public/agent-config.ts +675 -0
  145. package/src/routes/public/agent-history.ts +422 -0
  146. package/src/routes/public/agent-schedules.ts +296 -0
  147. package/src/routes/public/agent.ts +1086 -0
  148. package/src/routes/public/agents.ts +373 -0
  149. package/src/routes/public/channels.ts +191 -0
  150. package/src/routes/public/cli-auth.ts +883 -0
  151. package/src/routes/public/connections.ts +574 -0
  152. package/src/routes/public/landing.ts +16 -0
  153. package/src/routes/public/oauth.ts +147 -0
  154. package/src/routes/public/settings-auth.ts +104 -0
  155. package/src/routes/public/slack.ts +173 -0
  156. package/src/routes/shared/agent-ownership.ts +101 -0
  157. package/src/routes/shared/token-verifier.ts +34 -0
  158. package/src/services/core-services.ts +1053 -0
  159. package/src/services/image-generation-service.ts +257 -0
  160. package/src/services/instruction-service.ts +318 -0
  161. package/src/services/mcp-registry.ts +94 -0
  162. package/src/services/platform-helpers.ts +287 -0
  163. package/src/services/session-manager.ts +262 -0
  164. package/src/services/settings-resolver.ts +74 -0
  165. package/src/services/system-config-resolver.ts +90 -0
  166. package/src/services/system-skills-service.ts +229 -0
  167. package/src/services/transcription-service.ts +684 -0
  168. package/src/session.ts +110 -0
  169. package/src/spaces/index.ts +1 -0
  170. package/src/spaces/space-resolver.ts +17 -0
  171. package/src/stores/in-memory-agent-store.ts +403 -0
  172. package/src/stores/redis-agent-store.ts +279 -0
  173. package/src/utils/public-url.ts +44 -0
  174. package/src/utils/rate-limiter.ts +94 -0
  175. package/tsconfig.json +33 -0
@@ -0,0 +1,318 @@
1
+ #!/usr/bin/env bun
2
+
3
+ import type {
4
+ CommandRegistry,
5
+ InstructionProvider,
6
+ UserSuggestion,
7
+ } from "@lobu/core";
8
+ import type { AgentMetadataStore } from "./auth/agent-metadata-store";
9
+ import type { McpProxy } from "./auth/mcp/proxy";
10
+ import type { ProviderOAuthStateStore } from "./auth/oauth/state-store";
11
+ import type { AgentSettingsStore } from "./auth/settings";
12
+ import type { ModelPreferenceStore } from "./auth/settings/model-preference-store";
13
+ import type { UserAgentsStore } from "./auth/user-agents-store";
14
+ import type { ChannelBindingService } from "./channels";
15
+ import type { WorkerGateway } from "./gateway";
16
+ import type { IMessageQueue, QueueProducer } from "./infrastructure/queue";
17
+ import type { InteractionService } from "./interactions";
18
+ import type { GrantStore } from "./permissions/grant-store";
19
+ import type { IFileHandler } from "./platform/file-handler";
20
+ import type { ResponseRenderer } from "./platform/response-renderer";
21
+ import type { SecretProxy } from "./proxy/secret-proxy";
22
+ import type { InstructionService } from "./services/instruction-service";
23
+ import type { TranscriptionService } from "./services/transcription-service";
24
+ import type { ISessionManager } from "./session";
25
+
26
+ // ============================================================================
27
+ // Core Services Interface
28
+ // ============================================================================
29
+
30
+ /**
31
+ * Core services interface that platforms receive during initialization
32
+ * This allows platforms to access shared infrastructure without tight coupling
33
+ */
34
+ export interface CoreServices {
35
+ getQueue(): IMessageQueue;
36
+ getQueueProducer(): QueueProducer;
37
+ getSecretProxy(): SecretProxy | undefined;
38
+ getWorkerGateway(): WorkerGateway | undefined;
39
+ getMcpProxy(): McpProxy | undefined;
40
+ getModelPreferenceStore(): ModelPreferenceStore | undefined;
41
+ getOAuthStateStore(): ProviderOAuthStateStore | undefined;
42
+ getPublicGatewayUrl(): string;
43
+ getSessionManager(): ISessionManager;
44
+ getInstructionService(): InstructionService | undefined;
45
+ getInteractionService(): InteractionService;
46
+ getAgentSettingsStore(): AgentSettingsStore;
47
+ getChannelBindingService(): ChannelBindingService;
48
+ getTranscriptionService(): TranscriptionService | undefined;
49
+ getUserAgentsStore(): UserAgentsStore;
50
+ getAgentMetadataStore(): AgentMetadataStore;
51
+ getCommandRegistry(): CommandRegistry;
52
+ getGrantStore(): GrantStore | undefined;
53
+ }
54
+
55
+ // ============================================================================
56
+ // Platform Adapter Interface
57
+ // ============================================================================
58
+
59
+ /**
60
+ * Interface that all platform adapters must implement
61
+ * Platforms include: Slack, Discord, Teams, etc.
62
+ *
63
+ * Each platform adapter:
64
+ * 1. Receives CoreServices during initialization
65
+ * 2. Sets up platform-specific event handlers
66
+ * 3. Manages its own platform client/connection
67
+ * 4. Uses core services (MCP, Anthropic, Redis) provided by Gateway
68
+ */
69
+ export interface PlatformAdapter {
70
+ /**
71
+ * Platform name
72
+ */
73
+ readonly name: string;
74
+
75
+ /**
76
+ * Initialize the platform with core services
77
+ * This is called by Gateway after core services are initialized
78
+ *
79
+ * @param services - Core services provided by Gateway
80
+ */
81
+ initialize(services: CoreServices): Promise<void>;
82
+
83
+ /**
84
+ * Start the platform (connect to platform API, start event listeners)
85
+ * This is called after initialization
86
+ */
87
+ start(): Promise<void>;
88
+
89
+ /**
90
+ * Stop the platform gracefully
91
+ */
92
+ stop(): Promise<void>;
93
+
94
+ /**
95
+ * Check if platform is healthy and running
96
+ */
97
+ isHealthy(): boolean;
98
+
99
+ /**
100
+ * Optionally provide platform-specific instruction provider
101
+ * Returns null if platform doesn't have custom instructions
102
+ */
103
+ getInstructionProvider?(): InstructionProvider | null;
104
+
105
+ /**
106
+ * Build platform-specific deployment metadata
107
+ * This metadata is used for deployment annotations (e.g., thread URLs, team IDs)
108
+ *
109
+ * @param conversationId - The conversation identifier
110
+ * @param channelId - The channel identifier
111
+ * @param platformMetadata - Platform-specific metadata from the queue payload
112
+ * @returns Record of metadata key-value pairs for deployment annotations
113
+ */
114
+ buildDeploymentMetadata(
115
+ conversationId: string,
116
+ channelId: string,
117
+ platformMetadata: Record<string, any>
118
+ ): Record<string, string>;
119
+
120
+ /**
121
+ * Render non-blocking suggestions
122
+ * Platform should display this as suggested prompts/quick replies
123
+ *
124
+ * @param suggestion - The suggestions to render
125
+ */
126
+ renderSuggestion?(suggestion: UserSuggestion): Promise<void>;
127
+
128
+ /**
129
+ * Set conversation status indicator
130
+ * Used to show "is running...", "Waiting for approval...", etc.
131
+ * Pass null/undefined to clear the status
132
+ *
133
+ * @param channelId - Channel identifier
134
+ * @param conversationId - Conversation identifier
135
+ * @param status - Status message to display, or null to clear
136
+ */
137
+ setThreadStatus?(
138
+ channelId: string,
139
+ conversationId: string,
140
+ status: string | null
141
+ ): Promise<void>;
142
+
143
+ /**
144
+ * Check if the provided token matches the platform's configured bot token
145
+ * Used to detect self-messaging for direct queueing
146
+ *
147
+ * @param token - Token to check
148
+ * @returns True if this is the platform's own bot token
149
+ */
150
+ isOwnBotToken?(token: string): boolean;
151
+
152
+ /**
153
+ * Send a message via the messaging API
154
+ * Uses polymorphic routing info extracted from the request
155
+ *
156
+ * @param token - Auth token from request
157
+ * @param message - Message text to send (use @me to mention the bot)
158
+ * @param options - Routing and file options
159
+ * @param options.agentId - Universal session identifier
160
+ * @param options.channelId - Platform-specific channel (or agentId for API)
161
+ * @param options.conversationId - Platform-specific conversation (or agentId for API)
162
+ * @param options.teamId - Platform-specific team/workspace
163
+ * @param options.files - Files to upload with the message (up to 10)
164
+ * @returns Message metadata
165
+ */
166
+ sendMessage?(
167
+ token: string,
168
+ message: string,
169
+ options: {
170
+ agentId: string;
171
+ channelId: string;
172
+ conversationId?: string;
173
+ teamId: string;
174
+ files?: Array<{ buffer: Buffer; filename: string }>;
175
+ }
176
+ ): Promise<{
177
+ messageId: string;
178
+ eventsUrl?: string;
179
+ queued?: boolean;
180
+ }>;
181
+
182
+ /**
183
+ * Render authentication status for OAuth providers (MCP servers, Claude, etc.)
184
+ * Displays connection status in platform-specific UI (e.g., Slack home tab)
185
+ *
186
+ * @param userId - User ID to render status for
187
+ * @param providers - Array of OAuth providers with their connection status
188
+ * @returns Promise that resolves when rendering is complete
189
+ */
190
+ renderAuthStatus?(
191
+ userId: string,
192
+ providers: Array<{
193
+ id: string;
194
+ name: string;
195
+ isAuthenticated: boolean;
196
+ loginUrl?: string;
197
+ logoutUrl?: string;
198
+ metadata?: Record<string, any>;
199
+ }>
200
+ ): Promise<void>;
201
+
202
+ /**
203
+ * Get the file handler for this platform.
204
+ * Used by the file upload/download routes to route files
205
+ * to the correct platform-specific handler.
206
+ */
207
+ getFileHandler?(): IFileHandler | undefined;
208
+
209
+ /**
210
+ * Get the response renderer for this platform.
211
+ * Used by the unified thread response consumer to route responses
212
+ * to platform-specific rendering logic.
213
+ *
214
+ * @returns ResponseRenderer instance or undefined if platform handles responses differently
215
+ */
216
+ getResponseRenderer?(): ResponseRenderer | undefined;
217
+
218
+ /**
219
+ * Check if a channel ID represents a group/channel vs a DM.
220
+ * Used by space-resolver to determine space type.
221
+ *
222
+ * @param channelId - Channel identifier to check
223
+ * @returns True if this is a group/channel, false if DM
224
+ */
225
+ isGroupChannel?(channelId: string): boolean;
226
+
227
+ /**
228
+ * Get display information for the platform.
229
+ * Used in UI to show platform-specific icons and names.
230
+ *
231
+ * @returns Display info with name and icon (SVG or emoji)
232
+ */
233
+ getDisplayInfo?(): {
234
+ /** Human-readable platform name */
235
+ name: string;
236
+ /** SVG icon markup or emoji */
237
+ icon: string;
238
+ /** Optional logo URL */
239
+ logoUrl?: string;
240
+ };
241
+
242
+ /**
243
+ * Extract routing info from platform-specific request body.
244
+ * Used by messaging API to parse platform-specific fields.
245
+ *
246
+ * @param body - Request body with platform-specific fields
247
+ * @returns Routing info or null if platform fields are missing/invalid
248
+ */
249
+ extractRoutingInfo?(body: Record<string, unknown>): {
250
+ channelId: string;
251
+ conversationId?: string;
252
+ teamId?: string;
253
+ } | null;
254
+
255
+ /**
256
+ * Get conversation history for a channel/thread.
257
+ * Used by the GetChannelHistory tool to fetch past messages.
258
+ *
259
+ * @param channelId - Channel/chat identifier
260
+ * @param conversationId - Conversation identifier (optional)
261
+ * @param limit - Maximum number of messages to return
262
+ * @param before - ISO timestamp cursor for pagination
263
+ * @returns History response with messages and pagination info
264
+ */
265
+ getConversationHistory?(
266
+ channelId: string,
267
+ conversationId: string | undefined,
268
+ limit: number,
269
+ before: string | undefined
270
+ ): Promise<{
271
+ messages: Array<{
272
+ timestamp: string;
273
+ user: string;
274
+ text: string;
275
+ isBot?: boolean;
276
+ }>;
277
+ nextCursor: string | null;
278
+ hasMore: boolean;
279
+ }>;
280
+ }
281
+
282
+ // ============================================================================
283
+ // Platform Registry
284
+ // ============================================================================
285
+
286
+ /**
287
+ * Global registry for platform adapters
288
+ * Allows deployment managers and other services to access platform-specific functionality
289
+ */
290
+ export class PlatformRegistry {
291
+ private platforms: Map<string, PlatformAdapter> = new Map();
292
+
293
+ /**
294
+ * Register a platform adapter
295
+ */
296
+ register(platform: PlatformAdapter): void {
297
+ this.platforms.set(platform.name, platform);
298
+ }
299
+
300
+ /**
301
+ * Get a platform by name
302
+ */
303
+ get(name: string): PlatformAdapter | undefined {
304
+ return this.platforms.get(name);
305
+ }
306
+
307
+ /**
308
+ * Get list of available platform names
309
+ */
310
+ getAvailablePlatforms(): string[] {
311
+ return Array.from(this.platforms.keys());
312
+ }
313
+ }
314
+
315
+ /**
316
+ * Global platform registry instance
317
+ */
318
+ export const platformRegistry = new PlatformRegistry();