@deadragdoll/tellymcp 0.0.10 → 0.0.12
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/.env.example.client +42 -52
- package/.env.example.gateway +48 -62
- package/CHANGELOG.md +3 -3
- package/README-ru.md +226 -376
- package/README.md +213 -1184
- package/TOOLS.md +320 -377
- package/VERSION.md +13 -13
- package/config/codex/plugins/telly-workflows/.codex-plugin/plugin.json +18 -0
- package/config/codex/plugins/telly-workflows/references/invariants.md +10 -0
- package/config/codex/plugins/telly-workflows/skills/telly-browser-screenshot/SKILL.md +27 -0
- package/config/codex/plugins/telly-workflows/skills/telly-collab-artifact/SKILL.md +22 -0
- package/config/codex/plugins/telly-workflows/skills/telly-human-telegram/SKILL.md +31 -0
- package/config/codex/plugins/telly-workflows/skills/telly-partner-note/SKILL.md +36 -0
- package/config/templates/env.both.template +39 -20
- package/config/templates/env.client.template +34 -19
- package/config/templates/env.gateway.template +37 -22
- package/dist/cli.js +322 -75
- package/dist/codexPluginInstaller.js +215 -0
- package/dist/lib/mixins/session.errors.js +34 -1
- package/dist/lib/pinoTargets.js +2 -2
- package/dist/moleculer.config.js +7 -5
- package/dist/services/features/telegram-mcp/browser.service.js +94 -1
- package/dist/services/features/telegram-mcp/collaboration.service.js +40 -3
- package/dist/services/features/telegram-mcp/ensuredb.service.js +145 -26
- package/dist/services/features/telegram-mcp/gateway-delivery.service.js +285 -103
- package/dist/services/features/telegram-mcp/gateway-socket.service.js +907 -85
- package/dist/services/features/telegram-mcp/gateway.service.js +876 -81
- package/dist/services/features/telegram-mcp/mcp-http.service.js +8 -0
- package/dist/services/features/telegram-mcp/mcp-server.service.js +17 -26
- package/dist/services/features/telegram-mcp/notify.service.js +127 -1
- package/dist/services/features/telegram-mcp/session-context.service.js +28 -1
- package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +132 -10
- package/dist/services/features/telegram-mcp/src/app/config/env.js +158 -52
- package/dist/services/features/telegram-mcp/src/app/http.js +375 -42
- package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +386 -58
- package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +3 -0
- package/dist/services/features/telegram-mcp/src/app/webapp/terminal.js +12 -0
- package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +120 -104
- package/dist/services/features/telegram-mcp/src/entities/xchange/model/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserOpenTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +306 -26
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +71 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/listGatewaySessionsTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +93 -82
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +47 -5
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +82 -0
- package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +22 -14
- package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +697 -75
- package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +76 -0
- package/dist/services/features/telegram-mcp/src/features/embedded-runtime/model/embeddedRuntimeBroker.js +92 -0
- package/dist/services/features/telegram-mcp/src/features/foreground-terminal/model/foregroundTerminalRuntime.js +192 -0
- package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +382 -3
- package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/notify/model/sendFileToTelegramTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +42 -200
- package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/terminal-buffer/model/terminalBufferService.js +96 -0
- package/dist/services/features/telegram-mcp/src/features/terminal-input/model/terminalInputService.js +97 -0
- package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +107 -58
- package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/xchange/model/getXchangeRecordTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/xchange/model/listXchangeRecordsTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/xchange/model/markXchangeRecordReadTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/xchange/model/xchangeService.js +169 -0
- package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +5 -4
- package/dist/services/features/telegram-mcp/src/shared/i18n/resources/en.js +143 -42
- package/dist/services/features/telegram-mcp/src/shared/i18n/resources/ru.js +139 -38
- package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalSessionStore.js +27 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +11 -8
- package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +69 -70
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +21 -22
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +444 -7093
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportAttachmentStore.js +93 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportBroadcastActions.js +385 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +149 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConstructorWiring.js +642 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContent.js +84 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContext.js +78 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportDocumentActions.js +36 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportEventActions.js +292 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFileHandoffActions.js +352 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFormatting.js +75 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportGatewayActions.js +44 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLifecycleActions.js +161 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLive.js +56 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLiveActions.js +77 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuCallbacks.js +254 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFactories.js +538 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFingerprints.js +93 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFlow.js +344 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuShell.js +65 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuState.js +408 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuText.js +216 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +452 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportOutputActions.js +189 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPartnerActions.js +286 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPayloadState.js +108 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectActions.js +463 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEntryActions.js +202 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEvents.js +99 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectMenus.js +138 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +308 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectView.js +426 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportRequestFlow.js +278 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportSessionActions.js +143 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalActions.js +665 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalRuntime.js +226 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTypes.js +2 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportUtils.js +330 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportXchangeState.js +107 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/client.js +255 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/ptyRegistry.js +543 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/xchange/sqliteRecordStore.js +223 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +24 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +6 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +147 -76
- package/dist/services/features/telegram-mcp/src/shared/lib/telegramXchangeRecords.js +72 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/terminalPromptDetection.js +409 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +129 -1
- package/dist/services/features/telegram-mcp/src/shared/lib/xchangeRecordHints.js +98 -0
- package/dist/services/features/telegram-mcp/standalone-http.service.js +12 -0
- package/dist/services/features/telegram-mcp/terminal-buffer.service.js +42 -0
- package/dist/services/features/telegram-mcp/terminal-input.service.js +41 -0
- package/dist/services/features/telegram-mcp/tools-sync.service.js +15 -1
- package/dist/services/features/telegram-mcp/xchange.service.js +123 -0
- package/docs/STANDALONE-ru.md +172 -0
- package/docs/STANDALONE.md +172 -0
- package/package.json +10 -5
- package/scripts/build-package-artifact.sh +27 -0
- package/scripts/deploy-gateway.sh +64 -0
- package/scripts/deploy-onebot-branch.sh +27 -0
- package/scripts/postinstall.js +11 -36
- package/STANDALONE-ru.md +0 -274
- package/STANDALONE.md +0 -274
- package/dist/services/features/telegram-mcp/inbox.service.js +0 -33
- package/dist/services/features/telegram-mcp/pair.service.js +0 -33
- package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +0 -10
- package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +0 -33
- package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +0 -33
- package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +0 -33
- package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +0 -77
- package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +0 -33
- package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +0 -33
- package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +0 -202
- package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +0 -33
- package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +0 -33
- package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +0 -363
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ProcessLocalSessionStore = void 0;
|
|
4
|
+
class ProcessLocalSessionStore {
|
|
5
|
+
sessions = new Map();
|
|
6
|
+
onClearSession;
|
|
7
|
+
constructor(input = {}) {
|
|
8
|
+
this.onClearSession = input.onClearSession;
|
|
9
|
+
for (const session of input.initialSessions ?? []) {
|
|
10
|
+
this.sessions.set(session.sessionId, session);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
async getSession(sessionId) {
|
|
14
|
+
return this.sessions.get(sessionId) ?? null;
|
|
15
|
+
}
|
|
16
|
+
async listSessions() {
|
|
17
|
+
return Array.from(this.sessions.values()).sort((left, right) => left.sessionId.localeCompare(right.sessionId));
|
|
18
|
+
}
|
|
19
|
+
async setSession(session) {
|
|
20
|
+
this.sessions.set(session.sessionId, session);
|
|
21
|
+
}
|
|
22
|
+
async clearSession(sessionId) {
|
|
23
|
+
this.sessions.delete(sessionId);
|
|
24
|
+
await this.onClearSession?.(sessionId);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
exports.ProcessLocalSessionStore = ProcessLocalSessionStore;
|
|
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
6
6
|
exports.MinioExchangeStore = void 0;
|
|
7
7
|
const node_path_1 = __importDefault(require("node:path"));
|
|
8
8
|
const promises_1 = require("node:fs/promises");
|
|
9
|
-
const client_1 = require("../
|
|
9
|
+
const client_1 = require("../terminal/client");
|
|
10
10
|
function normalizeRelativePath(relativePath) {
|
|
11
11
|
const normalized = relativePath
|
|
12
12
|
.split(/[/\\]+/u)
|
|
@@ -18,21 +18,24 @@ function normalizeRelativePath(relativePath) {
|
|
|
18
18
|
}
|
|
19
19
|
return normalized;
|
|
20
20
|
}
|
|
21
|
-
function resolveWorkspaceDir(session,
|
|
21
|
+
function resolveWorkspaceDir(session, _terminalConfig) {
|
|
22
22
|
const workspaceDir = session?.cwd?.trim() || "";
|
|
23
|
-
|
|
23
|
+
if (!workspaceDir) {
|
|
24
|
+
throw new Error("Workspace cwd is not registered for this console.");
|
|
25
|
+
}
|
|
26
|
+
return workspaceDir;
|
|
24
27
|
}
|
|
25
28
|
class MinioExchangeStore {
|
|
26
|
-
|
|
29
|
+
terminalConfig;
|
|
27
30
|
exchangeDirName;
|
|
28
31
|
logger;
|
|
29
|
-
constructor(_callBroker, _bindingStore,
|
|
30
|
-
this.
|
|
32
|
+
constructor(_callBroker, _bindingStore, terminalConfig, exchangeDirName, _vfsScope, logger, _distributedMode = "client", _gatewayPublicUrl, _gatewayAuthToken) {
|
|
33
|
+
this.terminalConfig = terminalConfig;
|
|
31
34
|
this.exchangeDirName = exchangeDirName;
|
|
32
35
|
this.logger = logger;
|
|
33
36
|
}
|
|
34
37
|
resolveWorkspaceDir(session) {
|
|
35
|
-
return resolveWorkspaceDir(session, this.
|
|
38
|
+
return resolveWorkspaceDir(session, this.terminalConfig);
|
|
36
39
|
}
|
|
37
40
|
getTempSessionDir(sessionId) {
|
|
38
41
|
return node_path_1.default.resolve(process.cwd(), this.exchangeDirName, "__legacy__", sessionId);
|
|
@@ -40,7 +43,7 @@ class MinioExchangeStore {
|
|
|
40
43
|
async storeFile(params) {
|
|
41
44
|
const relativePath = normalizeRelativePath(params.relativePath);
|
|
42
45
|
const workspaceDir = this.resolveWorkspaceDir(params.session);
|
|
43
|
-
const filePath = await (0, client_1.writeXchangeRelativeFile)(this.
|
|
46
|
+
const filePath = await (0, client_1.writeXchangeRelativeFile)(this.terminalConfig, workspaceDir, this.exchangeDirName, relativePath, Buffer.from(params.content));
|
|
44
47
|
this.logger.info("Exchange file stored locally", {
|
|
45
48
|
sessionId: params.sessionId,
|
|
46
49
|
source: params.source,
|
|
@@ -26,11 +26,8 @@ function principalActiveSessionKey(principal) {
|
|
|
26
26
|
function principalActiveSessionMatchPattern(telegramUserId) {
|
|
27
27
|
return `${KEY_PREFIX}:principal:*:${telegramUserId}:active-session`;
|
|
28
28
|
}
|
|
29
|
-
function
|
|
30
|
-
return `${KEY_PREFIX}:
|
|
31
|
-
}
|
|
32
|
-
function inboxMessageKey(sessionId, messageId) {
|
|
33
|
-
return `${KEY_PREFIX}:inbox-message:${sessionId}:${messageId}`;
|
|
29
|
+
function bindingMatchPattern() {
|
|
30
|
+
return `${KEY_PREFIX}:binding:*`;
|
|
34
31
|
}
|
|
35
32
|
function menuPayloadKey(key) {
|
|
36
33
|
return `${KEY_PREFIX}:menu-payload:${key}`;
|
|
@@ -38,6 +35,12 @@ function menuPayloadKey(key) {
|
|
|
38
35
|
function userLocaleKey(telegramUserId) {
|
|
39
36
|
return `${KEY_PREFIX}:user-locale:${telegramUserId}`;
|
|
40
37
|
}
|
|
38
|
+
function adminAuthorizedKey(principal) {
|
|
39
|
+
return `${KEY_PREFIX}:admin-auth:${principal.telegramChatId}:${principal.telegramUserId}`;
|
|
40
|
+
}
|
|
41
|
+
function adminAuthorizedMatchPattern() {
|
|
42
|
+
return `${KEY_PREFIX}:admin-auth:*:*`;
|
|
43
|
+
}
|
|
41
44
|
function gatewayClientUuidKey() {
|
|
42
45
|
return `${KEY_PREFIX}:gateway:client-uuid`;
|
|
43
46
|
}
|
|
@@ -97,8 +100,6 @@ class RedisStateStore {
|
|
|
97
100
|
await this.sessionAdapter.write(sessionKey(session.sessionId), session);
|
|
98
101
|
}
|
|
99
102
|
async clearSession(sessionId) {
|
|
100
|
-
await this.unlinkPartnerSession(sessionId);
|
|
101
|
-
await this.clearInboxMessages(sessionId);
|
|
102
103
|
await this.clearXchangeFileMetas(sessionId);
|
|
103
104
|
await this.clearProjectMenuViewStates(sessionId);
|
|
104
105
|
await this.clearOutgoingDeliveryNoticesForSession(sessionId);
|
|
@@ -122,6 +123,39 @@ class RedisStateStore {
|
|
|
122
123
|
async setUserLocale(telegramUserId, locale) {
|
|
123
124
|
await this.redis.set(userLocaleKey(telegramUserId), locale);
|
|
124
125
|
}
|
|
126
|
+
async isAdminAuthorized(principal) {
|
|
127
|
+
return (await this.redis.get(adminAuthorizedKey(principal))) === "1";
|
|
128
|
+
}
|
|
129
|
+
async setAdminAuthorized(principal) {
|
|
130
|
+
await this.redis.set(adminAuthorizedKey(principal), "1");
|
|
131
|
+
}
|
|
132
|
+
async clearAdminAuthorized(principal) {
|
|
133
|
+
await this.redis.del(adminAuthorizedKey(principal));
|
|
134
|
+
}
|
|
135
|
+
async listAdminAuthorizedPrincipals() {
|
|
136
|
+
const principals = [];
|
|
137
|
+
let cursor = "0";
|
|
138
|
+
do {
|
|
139
|
+
const [nextCursor, keys] = await this.redis.scan(cursor, "MATCH", adminAuthorizedMatchPattern(), "COUNT", 100);
|
|
140
|
+
cursor = nextCursor;
|
|
141
|
+
for (const key of keys) {
|
|
142
|
+
const match = key.match(/^telegram-mcp:admin-auth:(-?\d+):(-?\d+)$/u);
|
|
143
|
+
if (!match) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const telegramChatId = Number(match[1]);
|
|
147
|
+
const telegramUserId = Number(match[2]);
|
|
148
|
+
if (!Number.isFinite(telegramChatId) || !Number.isFinite(telegramUserId)) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
principals.push({
|
|
152
|
+
telegramChatId,
|
|
153
|
+
telegramUserId,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
} while (cursor !== "0");
|
|
157
|
+
return principals;
|
|
158
|
+
}
|
|
125
159
|
async setBinding(binding) {
|
|
126
160
|
const previous = await this.getBinding(binding.sessionId);
|
|
127
161
|
if (previous &&
|
|
@@ -134,7 +168,6 @@ class RedisStateStore {
|
|
|
134
168
|
await this.redis.set(principalActiveSessionKey(binding), binding.sessionId);
|
|
135
169
|
}
|
|
136
170
|
async clearBinding(sessionId) {
|
|
137
|
-
await this.unlinkPartnerSession(sessionId);
|
|
138
171
|
const existing = await this.getBinding(sessionId);
|
|
139
172
|
await this.redis.del(bindingKey(sessionId));
|
|
140
173
|
if (existing) {
|
|
@@ -161,6 +194,9 @@ class RedisStateStore {
|
|
|
161
194
|
} while (cursor !== "0");
|
|
162
195
|
return null;
|
|
163
196
|
}
|
|
197
|
+
async clearActiveSessionIdForPrincipal(principal) {
|
|
198
|
+
await this.redis.del(principalActiveSessionKey(principal));
|
|
199
|
+
}
|
|
164
200
|
async setActiveSessionIdForPrincipal(principal, sessionId) {
|
|
165
201
|
const isBound = await this.redis.sismember(principalSessionsKey(principal), sessionId);
|
|
166
202
|
if (!isBound) {
|
|
@@ -171,6 +207,31 @@ class RedisStateStore {
|
|
|
171
207
|
async listBoundSessionIdsForPrincipal(principal) {
|
|
172
208
|
return this.redis.smembers(principalSessionsKey(principal));
|
|
173
209
|
}
|
|
210
|
+
async listBoundPrincipals() {
|
|
211
|
+
const principals = new Map();
|
|
212
|
+
let cursor = "0";
|
|
213
|
+
do {
|
|
214
|
+
const [nextCursor, keys] = await this.redis.scan(cursor, "MATCH", bindingMatchPattern(), "COUNT", 100);
|
|
215
|
+
cursor = nextCursor;
|
|
216
|
+
for (const key of keys) {
|
|
217
|
+
const raw = await this.redis.get(key);
|
|
218
|
+
const binding = parseJson(raw);
|
|
219
|
+
if (!binding) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
const telegramChatId = Number(binding.telegramChatId);
|
|
223
|
+
const telegramUserId = Number(binding.telegramUserId);
|
|
224
|
+
if (!Number.isFinite(telegramChatId) || !Number.isFinite(telegramUserId)) {
|
|
225
|
+
continue;
|
|
226
|
+
}
|
|
227
|
+
principals.set(`${telegramChatId}:${telegramUserId}`, {
|
|
228
|
+
telegramChatId,
|
|
229
|
+
telegramUserId,
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
} while (cursor !== "0");
|
|
233
|
+
return Array.from(principals.values());
|
|
234
|
+
}
|
|
174
235
|
async resetRuntimeState() {
|
|
175
236
|
await this.redis.del(activeRequestKey());
|
|
176
237
|
await this.redis.del(queueKey());
|
|
@@ -223,32 +284,6 @@ class RedisStateStore {
|
|
|
223
284
|
const raw = await this.redis.get(requestKey(requestId));
|
|
224
285
|
return parseJson(raw);
|
|
225
286
|
}
|
|
226
|
-
async createInboxMessage(message) {
|
|
227
|
-
await this.redis.set(inboxMessageKey(message.sessionId, message.id), JSON.stringify(message));
|
|
228
|
-
await this.redis.lpush(inboxListKey(message.sessionId), message.id);
|
|
229
|
-
}
|
|
230
|
-
async listInboxMessages(sessionId, limit) {
|
|
231
|
-
const ids = await this.redis.lrange(inboxListKey(sessionId), 0, limit - 1);
|
|
232
|
-
if (ids.length === 0) {
|
|
233
|
-
return [];
|
|
234
|
-
}
|
|
235
|
-
const rows = await this.redis.mget(...ids.map((messageId) => inboxMessageKey(sessionId, messageId)));
|
|
236
|
-
return rows
|
|
237
|
-
.map((row) => parseJson(row))
|
|
238
|
-
.filter((row) => row !== null);
|
|
239
|
-
}
|
|
240
|
-
async countInboxMessages(sessionId) {
|
|
241
|
-
return this.redis.llen(inboxListKey(sessionId));
|
|
242
|
-
}
|
|
243
|
-
async getInboxMessage(sessionId, messageId) {
|
|
244
|
-
const raw = await this.redis.get(inboxMessageKey(sessionId, messageId));
|
|
245
|
-
return parseJson(raw);
|
|
246
|
-
}
|
|
247
|
-
async deleteInboxMessage(sessionId, messageId) {
|
|
248
|
-
const deletedCount = await this.redis.del(inboxMessageKey(sessionId, messageId));
|
|
249
|
-
await this.redis.lrem(inboxListKey(sessionId), 0, messageId);
|
|
250
|
-
return deletedCount > 0;
|
|
251
|
-
}
|
|
252
287
|
async createMenuPayload(record, ttlSeconds) {
|
|
253
288
|
await this.redis.set(menuPayloadKey(record.key), JSON.stringify(record), "EX", ttlSeconds);
|
|
254
289
|
}
|
|
@@ -373,42 +408,6 @@ class RedisStateStore {
|
|
|
373
408
|
}
|
|
374
409
|
await this.redis.del(activeKey);
|
|
375
410
|
}
|
|
376
|
-
async unlinkPartnerSession(sessionId) {
|
|
377
|
-
const sourceSession = await this.getSession(sessionId);
|
|
378
|
-
if (!sourceSession?.linkedSessionId) {
|
|
379
|
-
return;
|
|
380
|
-
}
|
|
381
|
-
const { linkedSessionId: partnerId } = sourceSession;
|
|
382
|
-
const { linkedSessionId: _linkedSessionId, ...restSource } = sourceSession;
|
|
383
|
-
await this.setSession({
|
|
384
|
-
...restSource,
|
|
385
|
-
updatedAt: new Date().toISOString(),
|
|
386
|
-
});
|
|
387
|
-
const partnerSession = await this.getSession(partnerId);
|
|
388
|
-
if (!partnerSession || partnerSession.linkedSessionId !== sessionId) {
|
|
389
|
-
return;
|
|
390
|
-
}
|
|
391
|
-
const { linkedSessionId: _partnerLinkedSessionId, ...restPartner } = partnerSession;
|
|
392
|
-
await this.setSession({
|
|
393
|
-
...restPartner,
|
|
394
|
-
updatedAt: new Date().toISOString(),
|
|
395
|
-
});
|
|
396
|
-
}
|
|
397
|
-
async clearInboxMessages(sessionId) {
|
|
398
|
-
const listKey = inboxListKey(sessionId);
|
|
399
|
-
const messageKeys = [];
|
|
400
|
-
let cursor = "0";
|
|
401
|
-
const pattern = `${KEY_PREFIX}:inbox-message:${sessionId}:*`;
|
|
402
|
-
do {
|
|
403
|
-
const [nextCursor, keys] = await this.redis.scan(cursor, "MATCH", pattern, "COUNT", 200);
|
|
404
|
-
cursor = nextCursor;
|
|
405
|
-
messageKeys.push(...keys);
|
|
406
|
-
} while (cursor !== "0");
|
|
407
|
-
if (messageKeys.length > 0) {
|
|
408
|
-
await this.redis.del(...messageKeys);
|
|
409
|
-
}
|
|
410
|
-
await this.redis.del(listKey);
|
|
411
|
-
}
|
|
412
411
|
async clearXchangeFileMetas(sessionId) {
|
|
413
412
|
let cursor = "0";
|
|
414
413
|
const pattern = `${KEY_PREFIX}:xchange-file:${sessionId}:*`;
|
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createTelegramBaseFetchConfig = createTelegramBaseFetchConfig;
|
|
6
4
|
exports.createTelegramFetch = createTelegramFetch;
|
|
7
|
-
const node_fetch_1 = __importDefault(require("node-fetch"));
|
|
8
5
|
const https_proxy_agent_1 = require("https-proxy-agent");
|
|
9
6
|
const socks_proxy_agent_1 = require("socks-proxy-agent");
|
|
10
7
|
function maskProxyUrl(rawUrl) {
|
|
@@ -22,25 +19,27 @@ function maskProxyUrl(rawUrl) {
|
|
|
22
19
|
return "[INVALID_PROXY_URL]";
|
|
23
20
|
}
|
|
24
21
|
}
|
|
25
|
-
function
|
|
26
|
-
|
|
22
|
+
function createTelegramBaseFetchConfig(config, logger) {
|
|
23
|
+
const agent = config.telegram.proxy
|
|
24
|
+
? config.telegram.proxy.type === "http"
|
|
25
|
+
? new https_proxy_agent_1.HttpsProxyAgent(config.telegram.proxy.url)
|
|
26
|
+
: new socks_proxy_agent_1.SocksProxyAgent(config.telegram.proxy.url)
|
|
27
|
+
: undefined;
|
|
28
|
+
if (config.telegram.proxy) {
|
|
29
|
+
logger.info("Telegram proxy configured", {
|
|
30
|
+
proxyType: config.telegram.proxy.type,
|
|
31
|
+
proxyUrl: maskProxyUrl(config.telegram.proxy.url),
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
27
35
|
logger.debug("Telegram proxy disabled");
|
|
28
|
-
return globalThis.fetch.bind(globalThis);
|
|
29
36
|
}
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
37
|
+
return agent ? { agent } : {};
|
|
38
|
+
}
|
|
39
|
+
function createTelegramFetch(config, logger) {
|
|
40
|
+
const baseFetchConfig = createTelegramBaseFetchConfig(config, logger);
|
|
41
|
+
return async (input, init) => globalThis.fetch(input, {
|
|
42
|
+
...baseFetchConfig,
|
|
43
|
+
...(init ?? {}),
|
|
36
44
|
});
|
|
37
|
-
const proxiedFetch = async (...args) => {
|
|
38
|
-
const [input, init] = args;
|
|
39
|
-
const requestInit = {
|
|
40
|
-
...(init ? init : {}),
|
|
41
|
-
agent,
|
|
42
|
-
};
|
|
43
|
-
return (0, node_fetch_1.default)(input, requestInit);
|
|
44
|
-
};
|
|
45
|
-
return proxiedFetch;
|
|
46
45
|
}
|