@lobu/gateway 3.0.5 → 3.0.7
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.
- package/package.json +2 -2
- package/src/__tests__/agent-config-routes.test.ts +254 -0
- package/src/__tests__/agent-history-routes.test.ts +72 -0
- package/src/__tests__/agent-routes.test.ts +68 -0
- package/src/__tests__/agent-schedules-routes.test.ts +59 -0
- package/src/__tests__/agent-settings-store.test.ts +323 -0
- package/src/__tests__/chat-instance-manager-slack.test.ts +204 -0
- package/src/__tests__/chat-response-bridge.test.ts +131 -0
- package/src/__tests__/config-memory-plugins.test.ts +92 -0
- package/src/__tests__/config-request-store.test.ts +127 -0
- package/src/__tests__/connection-routes.test.ts +144 -0
- package/src/__tests__/core-services-store-selection.test.ts +92 -0
- package/src/__tests__/docker-deployment.test.ts +1211 -0
- package/src/__tests__/embedded-deployment.test.ts +342 -0
- package/src/__tests__/grant-store.test.ts +148 -0
- package/src/__tests__/http-proxy.test.ts +281 -0
- package/src/__tests__/instruction-service.test.ts +37 -0
- package/src/__tests__/link-buttons.test.ts +112 -0
- package/src/__tests__/lobu.test.ts +32 -0
- package/src/__tests__/mcp-config-service.test.ts +347 -0
- package/src/__tests__/mcp-proxy.test.ts +696 -0
- package/src/__tests__/message-handler-bridge.test.ts +17 -0
- package/src/__tests__/model-selection.test.ts +172 -0
- package/src/__tests__/oauth-templates.test.ts +39 -0
- package/src/__tests__/platform-adapter-slack-send.test.ts +114 -0
- package/src/__tests__/platform-helpers-model-resolution.test.ts +253 -0
- package/src/__tests__/provider-inheritance.test.ts +212 -0
- package/src/__tests__/routes/cli-auth.test.ts +337 -0
- package/src/__tests__/routes/interactions.test.ts +121 -0
- package/src/__tests__/secret-proxy.test.ts +85 -0
- package/src/__tests__/session-manager.test.ts +572 -0
- package/src/__tests__/setup.ts +133 -0
- package/src/__tests__/skill-and-mcp-registry.test.ts +203 -0
- package/src/__tests__/slack-routes.test.ts +161 -0
- package/src/__tests__/system-config-resolver.test.ts +75 -0
- package/src/__tests__/system-message-limiter.test.ts +89 -0
- package/src/__tests__/system-skills-service.test.ts +362 -0
- package/src/__tests__/transcription-service.test.ts +222 -0
- package/src/__tests__/utils/rate-limiter.test.ts +102 -0
- package/src/__tests__/worker-connection-manager.test.ts +497 -0
- package/src/__tests__/worker-job-router.test.ts +722 -0
- package/src/api/index.ts +1 -0
- package/src/api/platform.ts +292 -0
- package/src/api/response-renderer.ts +157 -0
- package/src/auth/agent-metadata-store.ts +168 -0
- package/src/auth/api-auth-middleware.ts +69 -0
- package/src/auth/api-key-provider-module.ts +213 -0
- package/src/auth/base-provider-module.ts +201 -0
- package/src/auth/chatgpt/chatgpt-oauth-module.ts +185 -0
- package/src/auth/chatgpt/device-code-client.ts +218 -0
- package/src/auth/chatgpt/index.ts +1 -0
- package/src/auth/claude/oauth-module.ts +280 -0
- package/src/auth/cli/token-service.ts +249 -0
- package/src/auth/external/client.ts +560 -0
- package/src/auth/external/device-code-client.ts +225 -0
- package/src/auth/mcp/config-service.ts +392 -0
- package/src/auth/mcp/proxy.ts +1088 -0
- package/src/auth/mcp/string-substitution.ts +17 -0
- package/src/auth/mcp/tool-cache.ts +90 -0
- package/src/auth/oauth/base-client.ts +267 -0
- package/src/auth/oauth/client.ts +153 -0
- package/src/auth/oauth/credentials.ts +7 -0
- package/src/auth/oauth/providers.ts +69 -0
- package/src/auth/oauth/state-store.ts +150 -0
- package/src/auth/oauth-templates.ts +179 -0
- package/src/auth/provider-catalog.ts +220 -0
- package/src/auth/provider-model-options.ts +41 -0
- package/src/auth/settings/agent-settings-store.ts +565 -0
- package/src/auth/settings/auth-profiles-manager.ts +216 -0
- package/src/auth/settings/index.ts +12 -0
- package/src/auth/settings/model-preference-store.ts +52 -0
- package/src/auth/settings/model-selection.ts +135 -0
- package/src/auth/settings/resolved-settings-view.ts +298 -0
- package/src/auth/settings/template-utils.ts +44 -0
- package/src/auth/settings/token-service.ts +88 -0
- package/src/auth/system-env-store.ts +98 -0
- package/src/auth/user-agents-store.ts +68 -0
- package/src/channels/binding-service.ts +214 -0
- package/src/channels/index.ts +4 -0
- package/src/cli/gateway.ts +1304 -0
- package/src/cli/index.ts +74 -0
- package/src/commands/built-in-commands.ts +80 -0
- package/src/commands/command-dispatcher.ts +94 -0
- package/src/commands/command-reply-adapters.ts +27 -0
- package/src/config/file-loader.ts +618 -0
- package/src/config/index.ts +588 -0
- package/src/config/network-allowlist.ts +71 -0
- package/src/connections/chat-instance-manager.ts +1284 -0
- package/src/connections/chat-response-bridge.ts +618 -0
- package/src/connections/index.ts +7 -0
- package/src/connections/interaction-bridge.ts +831 -0
- package/src/connections/message-handler-bridge.ts +415 -0
- package/src/connections/platform-auth-methods.ts +15 -0
- package/src/connections/types.ts +84 -0
- package/src/gateway/connection-manager.ts +291 -0
- package/src/gateway/index.ts +700 -0
- package/src/gateway/job-router.ts +201 -0
- package/src/gateway-main.ts +200 -0
- package/src/index.ts +41 -0
- package/src/infrastructure/queue/index.ts +12 -0
- package/src/infrastructure/queue/queue-producer.ts +148 -0
- package/src/infrastructure/queue/redis-queue.ts +361 -0
- package/src/infrastructure/queue/types.ts +133 -0
- package/src/infrastructure/redis/system-message-limiter.ts +94 -0
- package/src/interactions/config-request-store.ts +198 -0
- package/src/interactions.ts +363 -0
- package/src/lobu.ts +311 -0
- package/src/metrics/prometheus.ts +159 -0
- package/src/modules/module-system.ts +179 -0
- package/src/orchestration/base-deployment-manager.ts +900 -0
- package/src/orchestration/deployment-utils.ts +98 -0
- package/src/orchestration/impl/docker-deployment.ts +620 -0
- package/src/orchestration/impl/embedded-deployment.ts +268 -0
- package/src/orchestration/impl/index.ts +8 -0
- package/src/orchestration/impl/k8s/deployment.ts +1061 -0
- package/src/orchestration/impl/k8s/helpers.ts +610 -0
- package/src/orchestration/impl/k8s/index.ts +1 -0
- package/src/orchestration/index.ts +333 -0
- package/src/orchestration/message-consumer.ts +584 -0
- package/src/orchestration/scheduled-wakeup.ts +704 -0
- package/src/permissions/approval-policy.ts +36 -0
- package/src/permissions/grant-store.ts +219 -0
- package/src/platform/file-handler.ts +66 -0
- package/src/platform/link-buttons.ts +57 -0
- package/src/platform/renderer-utils.ts +44 -0
- package/src/platform/response-renderer.ts +84 -0
- package/src/platform/unified-thread-consumer.ts +187 -0
- package/src/platform.ts +318 -0
- package/src/proxy/http-proxy.ts +752 -0
- package/src/proxy/proxy-manager.ts +81 -0
- package/src/proxy/secret-proxy.ts +402 -0
- package/src/proxy/token-refresh-job.ts +143 -0
- package/src/routes/internal/audio.ts +141 -0
- package/src/routes/internal/device-auth.ts +566 -0
- package/src/routes/internal/files.ts +226 -0
- package/src/routes/internal/history.ts +69 -0
- package/src/routes/internal/images.ts +127 -0
- package/src/routes/internal/interactions.ts +84 -0
- package/src/routes/internal/middleware.ts +23 -0
- package/src/routes/internal/schedule.ts +226 -0
- package/src/routes/internal/types.ts +22 -0
- package/src/routes/openapi-auto.ts +239 -0
- package/src/routes/public/agent-access.ts +23 -0
- package/src/routes/public/agent-config.ts +675 -0
- package/src/routes/public/agent-history.ts +422 -0
- package/src/routes/public/agent-schedules.ts +296 -0
- package/src/routes/public/agent.ts +1086 -0
- package/src/routes/public/agents.ts +373 -0
- package/src/routes/public/channels.ts +191 -0
- package/src/routes/public/cli-auth.ts +883 -0
- package/src/routes/public/connections.ts +574 -0
- package/src/routes/public/landing.ts +16 -0
- package/src/routes/public/oauth.ts +147 -0
- package/src/routes/public/settings-auth.ts +104 -0
- package/src/routes/public/slack.ts +173 -0
- package/src/routes/shared/agent-ownership.ts +101 -0
- package/src/routes/shared/token-verifier.ts +34 -0
- package/src/services/core-services.ts +1053 -0
- package/src/services/image-generation-service.ts +257 -0
- package/src/services/instruction-service.ts +318 -0
- package/src/services/mcp-registry.ts +94 -0
- package/src/services/platform-helpers.ts +287 -0
- package/src/services/session-manager.ts +262 -0
- package/src/services/settings-resolver.ts +74 -0
- package/src/services/system-config-resolver.ts +90 -0
- package/src/services/system-skills-service.ts +229 -0
- package/src/services/transcription-service.ts +684 -0
- package/src/session.ts +110 -0
- package/src/spaces/index.ts +1 -0
- package/src/spaces/space-resolver.ts +17 -0
- package/src/stores/in-memory-agent-store.ts +403 -0
- package/src/stores/redis-agent-store.ts +279 -0
- package/src/utils/public-url.ts +44 -0
- package/src/utils/rate-limiter.ts +94 -0
- package/tsconfig.json +33 -0
package/src/platform.ts
ADDED
|
@@ -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();
|