@deadragdoll/tellymcp 0.0.10 → 0.0.11

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 (153) hide show
  1. package/.env.example.client +42 -52
  2. package/.env.example.gateway +48 -62
  3. package/CHANGELOG.md +3 -3
  4. package/README-ru.md +205 -384
  5. package/README.md +195 -1194
  6. package/TOOLS.md +294 -377
  7. package/VERSION.md +11 -11
  8. package/config/codex/plugins/telly-workflows/.codex-plugin/plugin.json +18 -0
  9. package/config/codex/plugins/telly-workflows/references/invariants.md +10 -0
  10. package/config/codex/plugins/telly-workflows/skills/telly-browser-screenshot/SKILL.md +27 -0
  11. package/config/codex/plugins/telly-workflows/skills/telly-collab-artifact/SKILL.md +22 -0
  12. package/config/codex/plugins/telly-workflows/skills/telly-human-telegram/SKILL.md +31 -0
  13. package/config/codex/plugins/telly-workflows/skills/telly-partner-note/SKILL.md +36 -0
  14. package/config/templates/env.both.template +39 -20
  15. package/config/templates/env.client.template +34 -19
  16. package/config/templates/env.gateway.template +37 -22
  17. package/dist/cli.js +322 -75
  18. package/dist/codexPluginInstaller.js +215 -0
  19. package/dist/lib/mixins/session.errors.js +34 -1
  20. package/dist/lib/pinoTargets.js +2 -2
  21. package/dist/moleculer.config.js +7 -5
  22. package/dist/services/features/telegram-mcp/browser.service.js +94 -1
  23. package/dist/services/features/telegram-mcp/collaboration.service.js +40 -3
  24. package/dist/services/features/telegram-mcp/ensuredb.service.js +145 -26
  25. package/dist/services/features/telegram-mcp/gateway-delivery.service.js +285 -103
  26. package/dist/services/features/telegram-mcp/gateway-socket.service.js +897 -85
  27. package/dist/services/features/telegram-mcp/gateway.service.js +876 -81
  28. package/dist/services/features/telegram-mcp/mcp-http.service.js +8 -0
  29. package/dist/services/features/telegram-mcp/mcp-server.service.js +17 -26
  30. package/dist/services/features/telegram-mcp/notify.service.js +127 -1
  31. package/dist/services/features/telegram-mcp/session-context.service.js +28 -1
  32. package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +132 -10
  33. package/dist/services/features/telegram-mcp/src/app/config/env.js +158 -52
  34. package/dist/services/features/telegram-mcp/src/app/http.js +375 -42
  35. package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +386 -58
  36. package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +3 -0
  37. package/dist/services/features/telegram-mcp/src/app/webapp/terminal.js +12 -0
  38. package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +116 -104
  39. package/dist/services/features/telegram-mcp/src/entities/xchange/model/types.js +2 -0
  40. package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +1 -1
  41. package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +1 -1
  42. package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +249 -19
  43. package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +71 -0
  44. package/dist/services/features/telegram-mcp/src/features/collaboration/model/listGatewaySessionsTool.js +33 -0
  45. package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +93 -82
  46. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +47 -5
  47. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +1 -1
  48. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +1 -1
  49. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +82 -0
  50. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +22 -14
  51. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +649 -75
  52. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +76 -0
  53. package/dist/services/features/telegram-mcp/src/features/embedded-runtime/model/embeddedRuntimeBroker.js +92 -0
  54. package/dist/services/features/telegram-mcp/src/features/foreground-terminal/model/foregroundTerminalRuntime.js +192 -0
  55. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +382 -3
  56. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +1 -1
  57. package/dist/services/features/telegram-mcp/src/features/notify/model/sendFileToTelegramTool.js +33 -0
  58. package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +1 -1
  59. package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +1 -1
  60. package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +1 -1
  61. package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +42 -200
  62. package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +1 -1
  63. package/dist/services/features/telegram-mcp/src/features/terminal-buffer/model/terminalBufferService.js +96 -0
  64. package/dist/services/features/telegram-mcp/src/features/terminal-input/model/terminalInputService.js +97 -0
  65. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +107 -58
  66. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +1 -1
  67. package/dist/services/features/telegram-mcp/src/features/xchange/model/getXchangeRecordTool.js +28 -0
  68. package/dist/services/features/telegram-mcp/src/features/xchange/model/listXchangeRecordsTool.js +28 -0
  69. package/dist/services/features/telegram-mcp/src/features/xchange/model/markXchangeRecordReadTool.js +28 -0
  70. package/dist/services/features/telegram-mcp/src/features/xchange/model/xchangeService.js +169 -0
  71. package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +5 -4
  72. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/en.js +139 -42
  73. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/ru.js +135 -38
  74. package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalSessionStore.js +27 -0
  75. package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +11 -8
  76. package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +42 -71
  77. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +21 -22
  78. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +415 -7101
  79. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportAttachmentStore.js +93 -0
  80. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportBroadcastActions.js +385 -0
  81. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +143 -0
  82. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConstructorWiring.js +633 -0
  83. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContent.js +84 -0
  84. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContext.js +78 -0
  85. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportDocumentActions.js +36 -0
  86. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportEventActions.js +292 -0
  87. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFileHandoffActions.js +352 -0
  88. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFormatting.js +75 -0
  89. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportGatewayActions.js +44 -0
  90. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLifecycleActions.js +161 -0
  91. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLive.js +56 -0
  92. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLiveActions.js +77 -0
  93. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuCallbacks.js +254 -0
  94. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFactories.js +538 -0
  95. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFingerprints.js +93 -0
  96. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFlow.js +344 -0
  97. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuShell.js +62 -0
  98. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuState.js +408 -0
  99. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuText.js +216 -0
  100. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +452 -0
  101. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportOutputActions.js +189 -0
  102. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPartnerActions.js +286 -0
  103. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPayloadState.js +101 -0
  104. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectActions.js +463 -0
  105. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEntryActions.js +202 -0
  106. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEvents.js +99 -0
  107. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectMenus.js +138 -0
  108. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +308 -0
  109. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectView.js +426 -0
  110. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportRequestFlow.js +278 -0
  111. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportSessionActions.js +143 -0
  112. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalActions.js +468 -0
  113. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalRuntime.js +171 -0
  114. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTypes.js +2 -0
  115. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportUtils.js +330 -0
  116. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportXchangeState.js +107 -0
  117. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/client.js +255 -0
  118. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/ptyRegistry.js +543 -0
  119. package/dist/services/features/telegram-mcp/src/shared/integrations/xchange/sqliteRecordStore.js +223 -0
  120. package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +24 -0
  121. package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +6 -0
  122. package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +147 -76
  123. package/dist/services/features/telegram-mcp/src/shared/lib/telegramXchangeRecords.js +72 -0
  124. package/dist/services/features/telegram-mcp/src/shared/lib/terminalPromptDetection.js +237 -0
  125. package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +129 -1
  126. package/dist/services/features/telegram-mcp/src/shared/lib/xchangeRecordHints.js +98 -0
  127. package/dist/services/features/telegram-mcp/standalone-http.service.js +12 -0
  128. package/dist/services/features/telegram-mcp/terminal-buffer.service.js +42 -0
  129. package/dist/services/features/telegram-mcp/terminal-input.service.js +41 -0
  130. package/dist/services/features/telegram-mcp/tools-sync.service.js +15 -1
  131. package/dist/services/features/telegram-mcp/xchange.service.js +123 -0
  132. package/docs/STANDALONE-ru.md +172 -0
  133. package/docs/STANDALONE.md +172 -0
  134. package/package.json +10 -5
  135. package/scripts/build-package-artifact.sh +27 -0
  136. package/scripts/deploy-gateway.sh +64 -0
  137. package/scripts/deploy-onebot-branch.sh +27 -0
  138. package/scripts/postinstall.js +11 -36
  139. package/STANDALONE-ru.md +0 -274
  140. package/STANDALONE.md +0 -274
  141. package/dist/services/features/telegram-mcp/inbox.service.js +0 -33
  142. package/dist/services/features/telegram-mcp/pair.service.js +0 -33
  143. package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +0 -10
  144. package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +0 -33
  145. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +0 -33
  146. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +0 -33
  147. package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +0 -77
  148. package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +0 -33
  149. package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +0 -33
  150. package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +0 -202
  151. package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +0 -33
  152. package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +0 -33
  153. package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +0 -363
@@ -12,9 +12,29 @@ const TelegramMcpEnsureDbService = {
12
12
  methods: {
13
13
  async ensureGatewaySchema() {
14
14
  await this.db.raw(`create schema if not exists "${MCP_SCHEMA}"`);
15
+ if (!(await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_users"))) {
16
+ await this.db.schema.withSchema(MCP_SCHEMA).createTable("gateway_users", (table) => {
17
+ table.uuid("gateway_user_uuid").primary();
18
+ table.bigInteger("telegram_user_id").notNullable().unique();
19
+ table.bigInteger("telegram_chat_id");
20
+ table.text("telegram_username");
21
+ table.text("telegram_display_name");
22
+ table
23
+ .timestamp("created_at", { useTz: true })
24
+ .notNullable()
25
+ .defaultTo(this.db.fn.now());
26
+ table
27
+ .timestamp("updated_at", { useTz: true })
28
+ .notNullable()
29
+ .defaultTo(this.db.fn.now());
30
+ table.timestamp("last_auth_at", { useTz: true });
31
+ });
32
+ }
15
33
  if (!(await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_clients"))) {
16
34
  await this.db.schema.withSchema(MCP_SCHEMA).createTable("gateway_clients", (table) => {
17
35
  table.uuid("client_uuid").primary();
36
+ table.uuid("owner_user_uuid");
37
+ table.text("scope_key");
18
38
  table.text("client_label");
19
39
  table.text("bot_token_fingerprint");
20
40
  table.text("bot_username");
@@ -28,6 +48,22 @@ const TelegramMcpEnsureDbService = {
28
48
  .notNullable()
29
49
  .defaultTo(this.db.fn.now());
30
50
  table.timestamp("last_seen_at", { useTz: true });
51
+ table
52
+ .foreign("owner_user_uuid")
53
+ .references("gateway_user_uuid")
54
+ .inTable(`${MCP_SCHEMA}.gateway_users`)
55
+ .onDelete("SET NULL");
56
+ });
57
+ }
58
+ if ((await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_clients")) &&
59
+ !(await this.db.schema.withSchema(MCP_SCHEMA).hasColumn("gateway_clients", "owner_user_uuid"))) {
60
+ await this.db.schema.withSchema(MCP_SCHEMA).alterTable("gateway_clients", (table) => {
61
+ table.uuid("owner_user_uuid");
62
+ table
63
+ .foreign("owner_user_uuid")
64
+ .references("gateway_user_uuid")
65
+ .inTable(`${MCP_SCHEMA}.gateway_users`)
66
+ .onDelete("SET NULL");
31
67
  });
32
68
  }
33
69
  if (!(await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_projects"))) {
@@ -85,17 +121,11 @@ const TelegramMcpEnsureDbService = {
85
121
  if (!(await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_sessions"))) {
86
122
  await this.db.schema.withSchema(MCP_SCHEMA).createTable("gateway_sessions", (table) => {
87
123
  table.uuid("session_uuid").primary();
88
- table.uuid("project_uuid").notNullable();
89
124
  table.uuid("client_uuid").notNullable();
90
125
  table.text("local_session_id").notNullable();
91
126
  table.text("label");
92
127
  table.text("cwd");
93
- table.text("tmux_session_name");
94
- table.text("tmux_window_name");
95
- table.integer("tmux_window_index");
96
- table.text("tmux_pane_id");
97
- table.integer("tmux_pane_index");
98
- table.text("tmux_target");
128
+ table.text("terminal_target");
99
129
  table.text("status").notNullable().defaultTo("active");
100
130
  table.jsonb("meta").notNullable().defaultTo(this.db.raw(`'{}'::jsonb`));
101
131
  table
@@ -106,6 +136,33 @@ const TelegramMcpEnsureDbService = {
106
136
  .timestamp("updated_at", { useTz: true })
107
137
  .notNullable()
108
138
  .defaultTo(this.db.fn.now());
139
+ table
140
+ .foreign("client_uuid")
141
+ .references("client_uuid")
142
+ .inTable(`${MCP_SCHEMA}.gateway_clients`)
143
+ .onDelete("CASCADE");
144
+ table.unique(["client_uuid", "local_session_id"], "gateway_sessions_client_local_unique");
145
+ table.index(["client_uuid"], "gateway_sessions_client_idx");
146
+ });
147
+ }
148
+ if (!(await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_project_consoles"))) {
149
+ await this.db.schema
150
+ .withSchema(MCP_SCHEMA)
151
+ .createTable("gateway_project_consoles", (table) => {
152
+ table.uuid("project_console_uuid").primary();
153
+ table.uuid("project_uuid").notNullable();
154
+ table.uuid("client_uuid").notNullable();
155
+ table.text("local_session_id").notNullable();
156
+ table.uuid("gateway_session_uuid");
157
+ table.text("status").notNullable().defaultTo("active");
158
+ table
159
+ .timestamp("joined_at", { useTz: true })
160
+ .notNullable()
161
+ .defaultTo(this.db.fn.now());
162
+ table
163
+ .timestamp("updated_at", { useTz: true })
164
+ .notNullable()
165
+ .defaultTo(this.db.fn.now());
109
166
  table
110
167
  .foreign("project_uuid")
111
168
  .references("project_uuid")
@@ -116,25 +173,64 @@ const TelegramMcpEnsureDbService = {
116
173
  .references("client_uuid")
117
174
  .inTable(`${MCP_SCHEMA}.gateway_clients`)
118
175
  .onDelete("CASCADE");
119
- table.unique(["project_uuid", "client_uuid", "local_session_id"], "gateway_sessions_project_client_local_unique");
120
- table.index(["project_uuid"], "gateway_sessions_project_idx");
121
- table.index(["client_uuid"], "gateway_sessions_client_idx");
176
+ table
177
+ .foreign("gateway_session_uuid")
178
+ .references("session_uuid")
179
+ .inTable(`${MCP_SCHEMA}.gateway_sessions`)
180
+ .onDelete("SET NULL");
181
+ table.unique(["project_uuid", "client_uuid", "local_session_id"], "gateway_project_consoles_project_client_local_unique");
182
+ table.index(["project_uuid"], "gateway_project_consoles_project_idx");
183
+ table.index(["client_uuid"], "gateway_project_consoles_client_idx");
184
+ });
185
+ }
186
+ if (!(await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_live_consoles"))) {
187
+ await this.db.schema
188
+ .withSchema(MCP_SCHEMA)
189
+ .createTable("gateway_live_consoles", (table) => {
190
+ table.uuid("live_console_uuid").primary();
191
+ table.uuid("client_uuid").notNullable();
192
+ table.text("connection_id").notNullable();
193
+ table.text("local_session_id").notNullable();
194
+ table.text("session_label");
195
+ table.text("cwd");
196
+ table.text("tools_hash");
197
+ table.uuid("gateway_user_uuid");
198
+ table.text("client_label");
199
+ table.text("system_username");
200
+ table.text("namespace");
201
+ table.text("node_id");
202
+ table.text("package_version");
203
+ table.text("protocol_version");
204
+ table.jsonb("meta").notNullable().defaultTo(this.db.raw(`'{}'::jsonb`));
205
+ table
206
+ .timestamp("connected_at", { useTz: true })
207
+ .notNullable()
208
+ .defaultTo(this.db.fn.now());
209
+ table
210
+ .timestamp("last_seen_at", { useTz: true })
211
+ .notNullable()
212
+ .defaultTo(this.db.fn.now());
213
+ table
214
+ .foreign("client_uuid")
215
+ .references("client_uuid")
216
+ .inTable(`${MCP_SCHEMA}.gateway_clients`)
217
+ .onDelete("CASCADE");
218
+ table
219
+ .foreign("gateway_user_uuid")
220
+ .references("gateway_user_uuid")
221
+ .inTable(`${MCP_SCHEMA}.gateway_users`)
222
+ .onDelete("SET NULL");
223
+ table.unique(["client_uuid", "local_session_id"], "gateway_live_consoles_client_local_unique");
224
+ table.index(["connection_id"], "gateway_live_consoles_connection_idx");
225
+ table.index(["client_uuid"], "gateway_live_consoles_client_idx");
226
+ table.index(["gateway_user_uuid"], "gateway_live_consoles_owner_idx");
122
227
  });
123
228
  }
124
- const legacyConstraint = await this.db
125
- .select("con.conname")
126
- .from({ con: "pg_constraint" })
127
- .join({ rel: "pg_class" }, "rel.oid", "con.conrelid")
128
- .join({ nsp: "pg_namespace" }, "nsp.oid", "rel.relnamespace")
129
- .where("nsp.nspname", MCP_SCHEMA)
130
- .where("rel.relname", "gateway_sessions")
131
- .where("con.contype", "u")
132
- .whereRaw("pg_get_constraintdef(con.oid) = ?", [
133
- "UNIQUE (client_uuid, local_session_id)",
134
- ])
135
- .first();
136
- if (legacyConstraint?.conname) {
137
- await this.db.raw(`ALTER TABLE "${MCP_SCHEMA}"."gateway_sessions" DROP CONSTRAINT "${legacyConstraint.conname}"`);
229
+ if ((await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_clients")) &&
230
+ !(await this.db.schema.withSchema(MCP_SCHEMA).hasColumn("gateway_clients", "scope_key"))) {
231
+ await this.db.schema.withSchema(MCP_SCHEMA).alterTable("gateway_clients", (table) => {
232
+ table.text("scope_key");
233
+ });
138
234
  }
139
235
  if ((await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_projects")) &&
140
236
  !(await this.db.schema.withSchema(MCP_SCHEMA).hasColumn("gateway_projects", "owner_telegram_user_id"))) {
@@ -179,8 +275,31 @@ const TelegramMcpEnsureDbService = {
179
275
  });
180
276
  }
181
277
  await this.db.raw(`
182
- CREATE UNIQUE INDEX IF NOT EXISTS gateway_sessions_project_client_local_unique
183
- ON "${MCP_SCHEMA}"."gateway_sessions" ("project_uuid", "client_uuid", "local_session_id")
278
+ CREATE INDEX IF NOT EXISTS gateway_clients_scope_idx
279
+ ON "${MCP_SCHEMA}"."gateway_clients" ("scope_key")
280
+ `);
281
+ await this.db.raw(`
282
+ CREATE INDEX IF NOT EXISTS gateway_clients_owner_user_idx
283
+ ON "${MCP_SCHEMA}"."gateway_clients" ("owner_user_uuid")
284
+ `);
285
+ await this.db.raw(`
286
+ CREATE UNIQUE INDEX IF NOT EXISTS gateway_live_consoles_client_local_unique
287
+ ON "${MCP_SCHEMA}"."gateway_live_consoles" ("client_uuid", "local_session_id")
288
+ `);
289
+ await this.db.raw(`
290
+ CREATE UNIQUE INDEX IF NOT EXISTS gateway_sessions_client_local_unique
291
+ ON "${MCP_SCHEMA}"."gateway_sessions" ("client_uuid", "local_session_id")
292
+ `);
293
+ if ((await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_sessions")) &&
294
+ (await this.db.schema.withSchema(MCP_SCHEMA).hasColumn("gateway_sessions", "project_uuid"))) {
295
+ await this.db.raw(`
296
+ ALTER TABLE "${MCP_SCHEMA}"."gateway_sessions"
297
+ ALTER COLUMN "project_uuid" DROP NOT NULL
298
+ `);
299
+ }
300
+ await this.db.raw(`
301
+ CREATE UNIQUE INDEX IF NOT EXISTS gateway_project_consoles_project_client_local_unique
302
+ ON "${MCP_SCHEMA}"."gateway_project_consoles" ("project_uuid", "client_uuid", "local_session_id")
184
303
  `);
185
304
  if (!(await this.db.schema.withSchema(MCP_SCHEMA).hasTable("gateway_session_links"))) {
186
305
  await this.db.schema