@deadragdoll/tellymcp 0.0.1

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 (124) hide show
  1. package/.env.example.client +93 -0
  2. package/.env.example.gateway +120 -0
  3. package/CHANGELOG.md +155 -0
  4. package/LICENSE +21 -0
  5. package/README-ru.md +338 -0
  6. package/README.md +1262 -0
  7. package/STANDALONE-ru.md +266 -0
  8. package/STANDALONE.md +266 -0
  9. package/TOOLS.md +1296 -0
  10. package/config/templates/env.both.template +83 -0
  11. package/config/templates/env.client.template +60 -0
  12. package/config/templates/env.gateway.template +82 -0
  13. package/dist/cli.js +636 -0
  14. package/dist/index.js +17 -0
  15. package/dist/lib/logfeed/store.js +52 -0
  16. package/dist/lib/middlewares/tracer.js +172 -0
  17. package/dist/lib/mixins/db.js +267 -0
  18. package/dist/lib/mixins/logfeed.js +34 -0
  19. package/dist/lib/mixins/session.errors.js +142 -0
  20. package/dist/lib/moleculer.js +2 -0
  21. package/dist/lib/trace.js +147 -0
  22. package/dist/lib/traceContext.js +116 -0
  23. package/dist/moleculer.config.js +274 -0
  24. package/dist/services/features/telegram-mcp/approval.service.js +33 -0
  25. package/dist/services/features/telegram-mcp/browser.service.js +42 -0
  26. package/dist/services/features/telegram-mcp/collaboration.service.js +53 -0
  27. package/dist/services/features/telegram-mcp/ensuredb.service.js +337 -0
  28. package/dist/services/features/telegram-mcp/gateway-delivery.service.js +378 -0
  29. package/dist/services/features/telegram-mcp/gateway-loopback.js +10 -0
  30. package/dist/services/features/telegram-mcp/gateway-rmq.service.js +294 -0
  31. package/dist/services/features/telegram-mcp/gateway-socket.service.js +1463 -0
  32. package/dist/services/features/telegram-mcp/gateway.service.js +1141 -0
  33. package/dist/services/features/telegram-mcp/inbox.service.js +33 -0
  34. package/dist/services/features/telegram-mcp/mcp-http.service.js +76 -0
  35. package/dist/services/features/telegram-mcp/mcp-server.service.js +127 -0
  36. package/dist/services/features/telegram-mcp/notify.service.js +33 -0
  37. package/dist/services/features/telegram-mcp/pair.service.js +33 -0
  38. package/dist/services/features/telegram-mcp/runtime.service.js +36 -0
  39. package/dist/services/features/telegram-mcp/session-context.service.js +33 -0
  40. package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +103 -0
  41. package/dist/services/features/telegram-mcp/src/app/config/env.js +317 -0
  42. package/dist/services/features/telegram-mcp/src/app/http.js +774 -0
  43. package/dist/services/features/telegram-mcp/src/app/index.js +2 -0
  44. package/dist/services/features/telegram-mcp/src/app/providers/mcp/server.js +13 -0
  45. package/dist/services/features/telegram-mcp/src/app/providers/redis/client.js +18 -0
  46. package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +740 -0
  47. package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +267 -0
  48. package/dist/services/features/telegram-mcp/src/app/webapp/relay.js +69 -0
  49. package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +9 -0
  50. package/dist/services/features/telegram-mcp/src/entities/auth/model/types.js +2 -0
  51. package/dist/services/features/telegram-mcp/src/entities/browser/model/types.js +2 -0
  52. package/dist/services/features/telegram-mcp/src/entities/collaboration/model/types.js +2 -0
  53. package/dist/services/features/telegram-mcp/src/entities/inbox/model/types.js +2 -0
  54. package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +545 -0
  55. package/dist/services/features/telegram-mcp/src/entities/request/model/types.js +2 -0
  56. package/dist/services/features/telegram-mcp/src/entities/session/model/types.js +2 -0
  57. package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +33 -0
  58. package/dist/services/features/telegram-mcp/src/features/browser/model/browserClearLogsTool.js +28 -0
  59. package/dist/services/features/telegram-mcp/src/features/browser/model/browserClickTool.js +28 -0
  60. package/dist/services/features/telegram-mcp/src/features/browser/model/browserCloseTool.js +28 -0
  61. package/dist/services/features/telegram-mcp/src/features/browser/model/browserComputedStyleTool.js +28 -0
  62. package/dist/services/features/telegram-mcp/src/features/browser/model/browserConsoleTool.js +28 -0
  63. package/dist/services/features/telegram-mcp/src/features/browser/model/browserDomTool.js +28 -0
  64. package/dist/services/features/telegram-mcp/src/features/browser/model/browserErrorsTool.js +28 -0
  65. package/dist/services/features/telegram-mcp/src/features/browser/model/browserFillTool.js +28 -0
  66. package/dist/services/features/telegram-mcp/src/features/browser/model/browserNetworkFailuresTool.js +28 -0
  67. package/dist/services/features/telegram-mcp/src/features/browser/model/browserOpenTool.js +33 -0
  68. package/dist/services/features/telegram-mcp/src/features/browser/model/browserPressTool.js +28 -0
  69. package/dist/services/features/telegram-mcp/src/features/browser/model/browserReloadTool.js +28 -0
  70. package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +28 -0
  71. package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +689 -0
  72. package/dist/services/features/telegram-mcp/src/features/browser/model/browserWaitForTool.js +28 -0
  73. package/dist/services/features/telegram-mcp/src/features/browser/model/browserWaitForUrlTool.js +28 -0
  74. package/dist/services/features/telegram-mcp/src/features/collaboration/model/backend.js +2 -0
  75. package/dist/services/features/telegram-mcp/src/features/collaboration/model/collaborationService.js +26 -0
  76. package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +390 -0
  77. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +102 -0
  78. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +33 -0
  79. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +33 -0
  80. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +69 -0
  81. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +657 -0
  82. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayReplyResolution.js +17 -0
  83. package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +33 -0
  84. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +33 -0
  85. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +33 -0
  86. package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +77 -0
  87. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +93 -0
  88. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +33 -0
  89. package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +33 -0
  90. package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +33 -0
  91. package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +202 -0
  92. package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +33 -0
  93. package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +33 -0
  94. package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +33 -0
  95. package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +33 -0
  96. package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +409 -0
  97. package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +33 -0
  98. package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +33 -0
  99. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +123 -0
  100. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +33 -0
  101. package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +243 -0
  102. package/dist/services/features/telegram-mcp/src/shared/api/storage/contract.js +2 -0
  103. package/dist/services/features/telegram-mcp/src/shared/api/tool-registry/registry.js +8 -0
  104. package/dist/services/features/telegram-mcp/src/shared/api/tool-registry/types.js +2 -0
  105. package/dist/services/features/telegram-mcp/src/shared/api/transport/contract.js +2 -0
  106. package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +86 -0
  107. package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +436 -0
  108. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/collabSemantics.js +21 -0
  109. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/collabUi.js +87 -0
  110. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/messageFormat.js +60 -0
  111. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +46 -0
  112. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +6534 -0
  113. package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +280 -0
  114. package/dist/services/features/telegram-mcp/src/shared/lib/ids/ids.js +34 -0
  115. package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +68 -0
  116. package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +223 -0
  117. package/dist/services/features/telegram-mcp/src/shared/lib/redact-secrets/redactSecrets.js +22 -0
  118. package/dist/services/features/telegram-mcp/src/shared/lib/truncate/truncate.js +12 -0
  119. package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +124 -0
  120. package/dist/services/features/telegram-mcp/src/shared/types/common.js +2 -0
  121. package/dist/services/features/telegram-mcp/standalone-http.service.js +113 -0
  122. package/dist/services/features/telegram-mcp/tools-sync.service.js +33 -0
  123. package/package.json +110 -0
  124. package/scripts/postinstall.js +60 -0
@@ -0,0 +1,267 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WebAppSessionRegistry = exports.WebAppLaunchRegistry = void 0;
4
+ exports.validateTelegramWebAppInitData = validateTelegramWebAppInitData;
5
+ const node_crypto_1 = require("node:crypto");
6
+ class WebAppLaunchRegistry {
7
+ launches = new Map();
8
+ set(telegramUserId, sessionId, ttlSeconds, details) {
9
+ this.cleanupExpired();
10
+ const nowMs = Date.now();
11
+ const record = {
12
+ telegramUserId,
13
+ sessionId,
14
+ ...(details?.telegramChatId !== undefined
15
+ ? { telegramChatId: details.telegramChatId }
16
+ : {}),
17
+ ...(details?.telegramMessageId !== undefined
18
+ ? { telegramMessageId: details.telegramMessageId }
19
+ : {}),
20
+ expiresAtMs: nowMs + ttlSeconds * 1000,
21
+ createdAtMs: nowMs,
22
+ };
23
+ this.launches.set(telegramUserId, record);
24
+ return record;
25
+ }
26
+ getByUserId(telegramUserId) {
27
+ this.cleanupExpired();
28
+ const record = this.launches.get(telegramUserId);
29
+ if (!record) {
30
+ return null;
31
+ }
32
+ if (record.expiresAtMs <= Date.now()) {
33
+ this.launches.delete(telegramUserId);
34
+ return null;
35
+ }
36
+ return record;
37
+ }
38
+ deleteByUserId(telegramUserId) {
39
+ this.launches.delete(telegramUserId);
40
+ }
41
+ cleanupExpired() {
42
+ const nowMs = Date.now();
43
+ for (const [telegramUserId, record] of this.launches.entries()) {
44
+ if (record.expiresAtMs <= nowMs) {
45
+ this.launches.delete(telegramUserId);
46
+ }
47
+ }
48
+ }
49
+ }
50
+ exports.WebAppLaunchRegistry = WebAppLaunchRegistry;
51
+ class WebAppSessionRegistry {
52
+ sessions = new Map();
53
+ create(sessionId, telegramUserId, ttlSeconds) {
54
+ this.cleanupExpired();
55
+ const nowMs = Date.now();
56
+ const record = {
57
+ token: (0, node_crypto_1.randomUUID)(),
58
+ sessionId,
59
+ telegramUserId,
60
+ expiresAtMs: nowMs + ttlSeconds * 1000,
61
+ createdAtMs: nowMs,
62
+ lastActionAtMs: 0,
63
+ };
64
+ this.sessions.set(record.token, record);
65
+ return record;
66
+ }
67
+ get(token) {
68
+ this.cleanupExpired();
69
+ const record = this.sessions.get(token);
70
+ if (!record) {
71
+ return null;
72
+ }
73
+ if (record.expiresAtMs <= Date.now()) {
74
+ this.sessions.delete(token);
75
+ return null;
76
+ }
77
+ return record;
78
+ }
79
+ touchAction(token, nowMs) {
80
+ const record = this.sessions.get(token);
81
+ if (!record) {
82
+ return;
83
+ }
84
+ this.sessions.set(token, {
85
+ ...record,
86
+ lastActionAtMs: nowMs,
87
+ });
88
+ }
89
+ cleanupExpired() {
90
+ const nowMs = Date.now();
91
+ for (const [token, record] of this.sessions.entries()) {
92
+ if (record.expiresAtMs <= nowMs) {
93
+ this.sessions.delete(token);
94
+ }
95
+ }
96
+ }
97
+ }
98
+ exports.WebAppSessionRegistry = WebAppSessionRegistry;
99
+ function normalizeTelegramWebAppInitData(rawInitData) {
100
+ let normalized = rawInitData.trim();
101
+ if (normalized.startsWith("#")) {
102
+ normalized = normalized.slice(1);
103
+ }
104
+ if (normalized.startsWith("tgWebAppData=")) {
105
+ normalized = normalized.slice("tgWebAppData=".length);
106
+ }
107
+ const extraMarkers = [
108
+ "&tgWebAppVersion=",
109
+ "&tgWebAppPlatform=",
110
+ "&tgWebAppThemeParams=",
111
+ ];
112
+ let cutIndex = -1;
113
+ for (const marker of extraMarkers) {
114
+ const markerIndex = normalized.indexOf(marker);
115
+ if (markerIndex >= 0 && (cutIndex < 0 || markerIndex < cutIndex)) {
116
+ cutIndex = markerIndex;
117
+ }
118
+ }
119
+ if (cutIndex >= 0) {
120
+ normalized = normalized.slice(0, cutIndex);
121
+ }
122
+ return normalized.trim();
123
+ }
124
+ function normalizeUnsafeUser(user) {
125
+ if (!user || typeof user !== "object" || typeof user.id !== "number") {
126
+ return null;
127
+ }
128
+ return {
129
+ id: user.id,
130
+ ...(typeof user.first_name === "string" ? { first_name: user.first_name } : {}),
131
+ ...(typeof user.last_name === "string" ? { last_name: user.last_name } : {}),
132
+ ...(typeof user.username === "string" ? { username: user.username } : {}),
133
+ ...(typeof user.language_code === "string"
134
+ ? { language_code: user.language_code }
135
+ : {}),
136
+ ...(typeof user.photo_url === "string" ? { photo_url: user.photo_url } : {}),
137
+ };
138
+ }
139
+ function buildOfficialRawValidation(rawInitData, botToken) {
140
+ const params = new URLSearchParams(rawInitData);
141
+ const receivedHash = params.get("hash");
142
+ if (!receivedHash) {
143
+ return null;
144
+ }
145
+ const checkString = [...params.entries()]
146
+ .filter(([key, value]) => key !== "hash" && value !== undefined)
147
+ .sort((left, right) => left[0].localeCompare(right[0]))
148
+ .map(([key, value]) => `${key}=${value}`)
149
+ .join("\n");
150
+ const secretKey = (0, node_crypto_1.createHmac)("sha256", "WebAppData")
151
+ .update(botToken.trim())
152
+ .digest();
153
+ const computed = (0, node_crypto_1.createHmac)("sha256", secretKey)
154
+ .update(checkString)
155
+ .digest("hex");
156
+ const matches = computed.length === receivedHash.length &&
157
+ (0, node_crypto_1.timingSafeEqual)(Buffer.from(computed, "utf8"), Buffer.from(receivedHash, "utf8"));
158
+ return {
159
+ checkString,
160
+ computedHash: computed,
161
+ providedHash: receivedHash,
162
+ matches,
163
+ };
164
+ }
165
+ function buildUserFieldsValidation(unsafe, botToken) {
166
+ if (!unsafe) {
167
+ return null;
168
+ }
169
+ const user = normalizeUnsafeUser(unsafe.user);
170
+ const authDateValue = typeof unsafe.auth_date === "number" || typeof unsafe.auth_date === "string"
171
+ ? unsafe.auth_date
172
+ : undefined;
173
+ const receivedHash = typeof unsafe.hash === "string" && unsafe.hash.length > 0
174
+ ? unsafe.hash
175
+ : undefined;
176
+ if (!user || authDateValue === undefined || !receivedHash) {
177
+ return null;
178
+ }
179
+ const params = {
180
+ id: user.id,
181
+ first_name: user.first_name,
182
+ last_name: user.last_name,
183
+ username: user.username,
184
+ photo_url: user.photo_url,
185
+ auth_date: authDateValue,
186
+ };
187
+ const checkString = Object.keys(params)
188
+ .sort()
189
+ .filter((key) => params[key] !== undefined)
190
+ .map((key) => `${key}=${params[key]}`)
191
+ .join("\n");
192
+ const secretKey = (0, node_crypto_1.createHash)("sha256")
193
+ .update(botToken.trim())
194
+ .digest();
195
+ const computed = (0, node_crypto_1.createHmac)("sha256", secretKey)
196
+ .update(checkString)
197
+ .digest("hex");
198
+ const matches = computed.length === receivedHash.length &&
199
+ (0, node_crypto_1.timingSafeEqual)(Buffer.from(computed, "utf8"), Buffer.from(receivedHash, "utf8"));
200
+ return {
201
+ checkString,
202
+ computedHash: computed,
203
+ providedHash: receivedHash,
204
+ matches,
205
+ };
206
+ }
207
+ function validateTelegramWebAppInitData(rawInitData, unsafeInitData, botToken, maxAgeSeconds) {
208
+ const normalizedRaw = rawInitData
209
+ ? normalizeTelegramWebAppInitData(rawInitData)
210
+ : "";
211
+ const normalizedUnsafe = unsafeInitData ?? null;
212
+ if (!normalizedRaw && !normalizedUnsafe) {
213
+ throw new Error("Telegram WebApp initData is empty.");
214
+ }
215
+ const officialRawValidation = buildOfficialRawValidation(normalizedRaw, botToken);
216
+ const userFieldsValidation = buildUserFieldsValidation(normalizedUnsafe, botToken);
217
+ if (!officialRawValidation?.matches && !userFieldsValidation?.matches) {
218
+ throw new Error("Telegram WebApp initData hash validation failed.");
219
+ }
220
+ if (!normalizedUnsafe) {
221
+ throw new Error("Telegram WebApp unsafe init data is missing.");
222
+ }
223
+ const user = normalizeUnsafeUser(normalizedUnsafe.user);
224
+ const authDateRaw = typeof normalizedUnsafe.auth_date === "number" ||
225
+ typeof normalizedUnsafe.auth_date === "string"
226
+ ? String(normalizedUnsafe.auth_date)
227
+ : null;
228
+ if (!authDateRaw || !user) {
229
+ throw new Error("Telegram WebApp initData is missing auth_date or user.");
230
+ }
231
+ const authDate = Number.parseInt(authDateRaw, 10);
232
+ if (!Number.isFinite(authDate) || authDate <= 0) {
233
+ throw new Error("Telegram WebApp auth_date is invalid.");
234
+ }
235
+ const nowSeconds = Math.floor(Date.now() / 1000);
236
+ if (nowSeconds - authDate > maxAgeSeconds) {
237
+ throw new Error("Telegram WebApp initData is expired.");
238
+ }
239
+ return {
240
+ user,
241
+ authDate,
242
+ rawInitData: normalizedRaw,
243
+ ...(typeof normalizedUnsafe.query_id === "string"
244
+ ? { queryId: normalizedUnsafe.query_id }
245
+ : {}),
246
+ ...(typeof normalizedUnsafe.start_param === "string"
247
+ ? { startParam: normalizedUnsafe.start_param }
248
+ : {}),
249
+ validationDebug: {
250
+ providedHash: officialRawValidation?.providedHash ??
251
+ userFieldsValidation?.providedHash ??
252
+ "",
253
+ officialRaw: {
254
+ checkString: officialRawValidation?.checkString ?? "",
255
+ computedHash: officialRawValidation?.computedHash ?? "",
256
+ matches: officialRawValidation?.matches ?? false,
257
+ },
258
+ userFields: userFieldsValidation
259
+ ? {
260
+ checkString: userFieldsValidation.checkString,
261
+ computedHash: userFieldsValidation.computedHash,
262
+ matches: userFieldsValidation.matches,
263
+ }
264
+ : null,
265
+ },
266
+ };
267
+ }
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LIVE_RELAY_SESSION_PREFIX = void 0;
4
+ exports.buildLiveRelaySessionId = buildLiveRelaySessionId;
5
+ exports.parseLiveRelaySessionId = parseLiveRelaySessionId;
6
+ exports.resolveGatewayWebAppBaseUrl = resolveGatewayWebAppBaseUrl;
7
+ function trimTrailingSlashes(value) {
8
+ return value.replace(/\/+$/u, "");
9
+ }
10
+ function normalizeBasePath(value) {
11
+ const trimmed = trimTrailingSlashes(value.trim());
12
+ if (!trimmed) {
13
+ return "/";
14
+ }
15
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
16
+ }
17
+ exports.LIVE_RELAY_SESSION_PREFIX = "relay~";
18
+ function buildLiveRelaySessionId(clientUuid, localSessionId, sourceClientUuid) {
19
+ return `${exports.LIVE_RELAY_SESSION_PREFIX}${clientUuid}~${encodeURIComponent(localSessionId)}${sourceClientUuid ? `~${sourceClientUuid}` : ""}`;
20
+ }
21
+ function parseLiveRelaySessionId(value) {
22
+ if (!value || !value.startsWith(exports.LIVE_RELAY_SESSION_PREFIX)) {
23
+ return null;
24
+ }
25
+ const payload = value.slice(exports.LIVE_RELAY_SESSION_PREFIX.length);
26
+ const parts = payload.split("~");
27
+ if (parts.length < 2) {
28
+ return null;
29
+ }
30
+ const clientUuid = (parts[0] ?? "").trim();
31
+ const encodedSessionId = (parts[1] ?? "").trim();
32
+ const sourceClientUuid = (parts[2] ?? "").trim();
33
+ if (!clientUuid || !encodedSessionId) {
34
+ return null;
35
+ }
36
+ try {
37
+ const localSessionId = decodeURIComponent(encodedSessionId);
38
+ return localSessionId
39
+ ? {
40
+ clientUuid,
41
+ localSessionId,
42
+ ...(sourceClientUuid ? { sourceClientUuid } : {}),
43
+ }
44
+ : null;
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ function resolveGatewayWebAppBaseUrl(gatewayPublicUrl, webAppBasePath) {
51
+ const rootPrefix = normalizeBasePath(process.env.ROOT_PREFIX || "/api");
52
+ const normalizedWebAppBasePath = normalizeBasePath(webAppBasePath || "/webapp");
53
+ const expectedPath = rootPrefix === "/"
54
+ ? normalizedWebAppBasePath
55
+ : `${rootPrefix}${normalizedWebAppBasePath}`;
56
+ const url = new URL(gatewayPublicUrl);
57
+ url.pathname = trimTrailingSlashes(url.pathname);
58
+ if (url.pathname.endsWith("/gateway")) {
59
+ url.pathname = url.pathname.slice(0, -"/gateway".length) || "/";
60
+ }
61
+ const currentPath = normalizeBasePath(url.pathname || "/");
62
+ if (currentPath === "/" || currentPath === rootPrefix) {
63
+ url.pathname = expectedPath;
64
+ }
65
+ else {
66
+ url.pathname = `${trimTrailingSlashes(currentPath)}${normalizedWebAppBasePath}`.replace(/\/{2,}/gu, "/");
67
+ }
68
+ return trimTrailingSlashes(url.toString());
69
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendAllowedTmuxAction = exports.isTmuxUnavailableError = exports.getTmuxWindowHeight = exports.captureVisibleTmuxPane = exports.captureTmuxPaneRange = void 0;
4
+ var client_1 = require("../../shared/integrations/tmux/client");
5
+ Object.defineProperty(exports, "captureTmuxPaneRange", { enumerable: true, get: function () { return client_1.captureTmuxPaneRange; } });
6
+ Object.defineProperty(exports, "captureVisibleTmuxPane", { enumerable: true, get: function () { return client_1.captureVisibleTmuxPane; } });
7
+ Object.defineProperty(exports, "getTmuxWindowHeight", { enumerable: true, get: function () { return client_1.getTmuxWindowHeight; } });
8
+ Object.defineProperty(exports, "isTmuxUnavailableError", { enumerable: true, get: function () { return client_1.isTmuxUnavailableError; } });
9
+ Object.defineProperty(exports, "sendAllowedTmuxAction", { enumerable: true, get: function () { return client_1.sendAllowedTmuxAction; } });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });