@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.
- package/.env.example.client +93 -0
- package/.env.example.gateway +120 -0
- package/CHANGELOG.md +155 -0
- package/LICENSE +21 -0
- package/README-ru.md +338 -0
- package/README.md +1262 -0
- package/STANDALONE-ru.md +266 -0
- package/STANDALONE.md +266 -0
- package/TOOLS.md +1296 -0
- package/config/templates/env.both.template +83 -0
- package/config/templates/env.client.template +60 -0
- package/config/templates/env.gateway.template +82 -0
- package/dist/cli.js +636 -0
- package/dist/index.js +17 -0
- package/dist/lib/logfeed/store.js +52 -0
- package/dist/lib/middlewares/tracer.js +172 -0
- package/dist/lib/mixins/db.js +267 -0
- package/dist/lib/mixins/logfeed.js +34 -0
- package/dist/lib/mixins/session.errors.js +142 -0
- package/dist/lib/moleculer.js +2 -0
- package/dist/lib/trace.js +147 -0
- package/dist/lib/traceContext.js +116 -0
- package/dist/moleculer.config.js +274 -0
- package/dist/services/features/telegram-mcp/approval.service.js +33 -0
- package/dist/services/features/telegram-mcp/browser.service.js +42 -0
- package/dist/services/features/telegram-mcp/collaboration.service.js +53 -0
- package/dist/services/features/telegram-mcp/ensuredb.service.js +337 -0
- package/dist/services/features/telegram-mcp/gateway-delivery.service.js +378 -0
- package/dist/services/features/telegram-mcp/gateway-loopback.js +10 -0
- package/dist/services/features/telegram-mcp/gateway-rmq.service.js +294 -0
- package/dist/services/features/telegram-mcp/gateway-socket.service.js +1463 -0
- package/dist/services/features/telegram-mcp/gateway.service.js +1141 -0
- package/dist/services/features/telegram-mcp/inbox.service.js +33 -0
- package/dist/services/features/telegram-mcp/mcp-http.service.js +76 -0
- package/dist/services/features/telegram-mcp/mcp-server.service.js +127 -0
- package/dist/services/features/telegram-mcp/notify.service.js +33 -0
- package/dist/services/features/telegram-mcp/pair.service.js +33 -0
- package/dist/services/features/telegram-mcp/runtime.service.js +36 -0
- package/dist/services/features/telegram-mcp/session-context.service.js +33 -0
- package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +103 -0
- package/dist/services/features/telegram-mcp/src/app/config/env.js +317 -0
- package/dist/services/features/telegram-mcp/src/app/http.js +774 -0
- package/dist/services/features/telegram-mcp/src/app/index.js +2 -0
- package/dist/services/features/telegram-mcp/src/app/providers/mcp/server.js +13 -0
- package/dist/services/features/telegram-mcp/src/app/providers/redis/client.js +18 -0
- package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +740 -0
- package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +267 -0
- package/dist/services/features/telegram-mcp/src/app/webapp/relay.js +69 -0
- package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +9 -0
- package/dist/services/features/telegram-mcp/src/entities/auth/model/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/entities/browser/model/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/entities/collaboration/model/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/entities/inbox/model/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +545 -0
- package/dist/services/features/telegram-mcp/src/entities/request/model/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/entities/session/model/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserClearLogsTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserClickTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserCloseTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserComputedStyleTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserConsoleTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserDomTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserErrorsTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserFillTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserNetworkFailuresTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserOpenTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserPressTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserReloadTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +689 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserWaitForTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserWaitForUrlTool.js +28 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/backend.js +2 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/collaborationService.js +26 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +390 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +102 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +69 -0
- package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +657 -0
- package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayReplyResolution.js +17 -0
- package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +77 -0
- package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +93 -0
- package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +202 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +409 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +123 -0
- package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +33 -0
- package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +243 -0
- package/dist/services/features/telegram-mcp/src/shared/api/storage/contract.js +2 -0
- package/dist/services/features/telegram-mcp/src/shared/api/tool-registry/registry.js +8 -0
- package/dist/services/features/telegram-mcp/src/shared/api/tool-registry/types.js +2 -0
- package/dist/services/features/telegram-mcp/src/shared/api/transport/contract.js +2 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +86 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +436 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/collabSemantics.js +21 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/collabUi.js +87 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/messageFormat.js +60 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +46 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +6534 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +280 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/ids/ids.js +34 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +68 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +223 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/redact-secrets/redactSecrets.js +22 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/truncate/truncate.js +12 -0
- package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +124 -0
- package/dist/services/features/telegram-mcp/src/shared/types/common.js +2 -0
- package/dist/services/features/telegram-mcp/standalone-http.service.js +113 -0
- package/dist/services/features/telegram-mcp/tools-sync.service.js +33 -0
- package/package.json +110 -0
- package/scripts/postinstall.js +60 -0
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildTraceErrorData = exports.buildTraceSuccessData = exports.buildTraceStartData = exports.buildTraceMetaSummary = exports.sanitizeTraceValue = exports.normalizeTraceLevel = void 0;
|
|
4
|
+
const TRACE_MAX_DEPTH = 4;
|
|
5
|
+
const TRACE_MAX_ARRAY = 25;
|
|
6
|
+
const TRACE_MAX_KEYS = 40;
|
|
7
|
+
const TRACE_MAX_STRING = 1000;
|
|
8
|
+
const truncateString = (value) => value.length > TRACE_MAX_STRING ? `${value.slice(0, TRACE_MAX_STRING)}...` : value;
|
|
9
|
+
const normalizeTraceLevel = (value) => {
|
|
10
|
+
const level = String(value || "info").toLowerCase();
|
|
11
|
+
if (["fatal", "error", "warn", "info", "debug", "trace"].includes(level)) {
|
|
12
|
+
return level;
|
|
13
|
+
}
|
|
14
|
+
return "info";
|
|
15
|
+
};
|
|
16
|
+
exports.normalizeTraceLevel = normalizeTraceLevel;
|
|
17
|
+
const sanitizeError = (error, depth, seen) => {
|
|
18
|
+
if (!(error instanceof Error)) {
|
|
19
|
+
return (0, exports.sanitizeTraceValue)(error, depth, seen);
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
name: error.name,
|
|
23
|
+
message: truncateString(error.message || ""),
|
|
24
|
+
stack: truncateString(error.stack || ""),
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
const sanitizeTraceValue = (value, depth = 0, seen = new WeakSet()) => {
|
|
28
|
+
if (value == null || typeof value === "boolean" || typeof value === "number") {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
if (typeof value === "string") {
|
|
32
|
+
return truncateString(value);
|
|
33
|
+
}
|
|
34
|
+
if (typeof value === "bigint") {
|
|
35
|
+
return value.toString();
|
|
36
|
+
}
|
|
37
|
+
if (typeof value === "symbol") {
|
|
38
|
+
return value.toString();
|
|
39
|
+
}
|
|
40
|
+
if (typeof value === "function") {
|
|
41
|
+
return `[Function ${value.name || "anonymous"}]`;
|
|
42
|
+
}
|
|
43
|
+
if (value instanceof Date) {
|
|
44
|
+
return value.toISOString();
|
|
45
|
+
}
|
|
46
|
+
if (value instanceof Error) {
|
|
47
|
+
return sanitizeError(value, depth, seen);
|
|
48
|
+
}
|
|
49
|
+
if (Buffer.isBuffer(value)) {
|
|
50
|
+
return `[Buffer ${value.length}]`;
|
|
51
|
+
}
|
|
52
|
+
if (value instanceof Set) {
|
|
53
|
+
return {
|
|
54
|
+
type: "Set",
|
|
55
|
+
size: value.size,
|
|
56
|
+
values: Array.from(value.values())
|
|
57
|
+
.slice(0, TRACE_MAX_ARRAY)
|
|
58
|
+
.map(item => (0, exports.sanitizeTraceValue)(item, depth + 1, seen)),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
if (value instanceof Map) {
|
|
62
|
+
return {
|
|
63
|
+
type: "Map",
|
|
64
|
+
size: value.size,
|
|
65
|
+
entries: Array.from(value.entries())
|
|
66
|
+
.slice(0, TRACE_MAX_ARRAY)
|
|
67
|
+
.map(([key, item]) => [
|
|
68
|
+
(0, exports.sanitizeTraceValue)(key, depth + 1, seen),
|
|
69
|
+
(0, exports.sanitizeTraceValue)(item, depth + 1, seen),
|
|
70
|
+
]),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
if (Array.isArray(value)) {
|
|
74
|
+
if (depth >= TRACE_MAX_DEPTH) {
|
|
75
|
+
return `[Array(${value.length})]`;
|
|
76
|
+
}
|
|
77
|
+
return value
|
|
78
|
+
.slice(0, TRACE_MAX_ARRAY)
|
|
79
|
+
.map(item => (0, exports.sanitizeTraceValue)(item, depth + 1, seen));
|
|
80
|
+
}
|
|
81
|
+
if (typeof value === "object") {
|
|
82
|
+
const objectValue = value;
|
|
83
|
+
if (seen.has(objectValue)) {
|
|
84
|
+
return "[Circular]";
|
|
85
|
+
}
|
|
86
|
+
seen.add(objectValue);
|
|
87
|
+
if (depth >= TRACE_MAX_DEPTH) {
|
|
88
|
+
return `[${objectValue?.constructor?.name || "Object"}]`;
|
|
89
|
+
}
|
|
90
|
+
const keys = Object.keys(objectValue).slice(0, TRACE_MAX_KEYS);
|
|
91
|
+
const result = {};
|
|
92
|
+
for (const key of keys) {
|
|
93
|
+
result[key] = (0, exports.sanitizeTraceValue)(objectValue[key], depth + 1, seen);
|
|
94
|
+
}
|
|
95
|
+
if (Object.keys(objectValue).length > TRACE_MAX_KEYS) {
|
|
96
|
+
result.__truncatedKeys = Object.keys(objectValue).length - TRACE_MAX_KEYS;
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
return String(value);
|
|
101
|
+
};
|
|
102
|
+
exports.sanitizeTraceValue = sanitizeTraceValue;
|
|
103
|
+
const pickFields = (source, fields) => {
|
|
104
|
+
if (fields === false) {
|
|
105
|
+
return undefined;
|
|
106
|
+
}
|
|
107
|
+
if (fields === true || fields == null) {
|
|
108
|
+
return (0, exports.sanitizeTraceValue)(source);
|
|
109
|
+
}
|
|
110
|
+
if (!source || typeof source !== "object") {
|
|
111
|
+
return (0, exports.sanitizeTraceValue)(source);
|
|
112
|
+
}
|
|
113
|
+
const result = {};
|
|
114
|
+
for (const key of fields) {
|
|
115
|
+
result[key] = (0, exports.sanitizeTraceValue)(source[key]);
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
};
|
|
119
|
+
const buildTraceMetaSummary = (ctx) => (0, exports.sanitizeTraceValue)({
|
|
120
|
+
requestID: ctx.requestID || null,
|
|
121
|
+
userSub: ctx.meta?.user?.sub || null,
|
|
122
|
+
});
|
|
123
|
+
exports.buildTraceMetaSummary = buildTraceMetaSummary;
|
|
124
|
+
const buildTraceStartData = (ctx, actionName, tracer, startedSession = false) => (0, exports.sanitizeTraceValue)({
|
|
125
|
+
action: actionName,
|
|
126
|
+
startedSession,
|
|
127
|
+
params: pickFields(ctx.params, tracer?.captureParams),
|
|
128
|
+
meta: (0, exports.buildTraceMetaSummary)(ctx),
|
|
129
|
+
});
|
|
130
|
+
exports.buildTraceStartData = buildTraceStartData;
|
|
131
|
+
const buildTraceSuccessData = (ctx, actionName, result, durationMs, tracer) => (0, exports.sanitizeTraceValue)({
|
|
132
|
+
action: actionName,
|
|
133
|
+
durationMs,
|
|
134
|
+
result: tracer?.captureResult === undefined
|
|
135
|
+
? undefined
|
|
136
|
+
: pickFields(result, tracer.captureResult),
|
|
137
|
+
});
|
|
138
|
+
exports.buildTraceSuccessData = buildTraceSuccessData;
|
|
139
|
+
const buildTraceErrorData = (ctx, actionName, error, durationMs, tracer) => (0, exports.sanitizeTraceValue)({
|
|
140
|
+
action: actionName,
|
|
141
|
+
durationMs,
|
|
142
|
+
error: tracer?.captureError === undefined
|
|
143
|
+
? sanitizeError(error, 0, new WeakSet())
|
|
144
|
+
: pickFields(error, tracer.captureError),
|
|
145
|
+
meta: (0, exports.buildTraceMetaSummary)(ctx),
|
|
146
|
+
});
|
|
147
|
+
exports.buildTraceErrorData = buildTraceErrorData;
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.deleteTraceContext = exports.touchTraceContext = exports.loadTraceContext = exports.saveTraceContext = void 0;
|
|
37
|
+
const redis = __importStar(require("redis"));
|
|
38
|
+
const trace_1 = require("./trace");
|
|
39
|
+
const TRACE_CONTEXT_TTL_SEC = Math.max(1, Number(process.env.TRACE_CONTEXT_TTL_SEC || 2));
|
|
40
|
+
const TRACE_CONTEXT_KEY = "trace:active";
|
|
41
|
+
let traceRedisClient = null;
|
|
42
|
+
let traceRedisConnectPromise = null;
|
|
43
|
+
const createTraceRedisClient = () => redis.createClient({
|
|
44
|
+
socket: {
|
|
45
|
+
host: process.env.REDIS_HOST || "localhost",
|
|
46
|
+
port: +(process.env.REDIS_PORT || 6379),
|
|
47
|
+
},
|
|
48
|
+
database: +(process.env.REDIS_DB || 0),
|
|
49
|
+
name: `${process.env.APP_NAME || process.env.APPNAME || "app"}:trace`,
|
|
50
|
+
});
|
|
51
|
+
const getTraceRedisClient = async () => {
|
|
52
|
+
if (traceRedisClient?.isOpen) {
|
|
53
|
+
return traceRedisClient;
|
|
54
|
+
}
|
|
55
|
+
if (!traceRedisClient) {
|
|
56
|
+
traceRedisClient = createTraceRedisClient();
|
|
57
|
+
}
|
|
58
|
+
if (!traceRedisConnectPromise) {
|
|
59
|
+
traceRedisConnectPromise = traceRedisClient.connect().then(() => traceRedisClient);
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
return await traceRedisConnectPromise;
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
traceRedisConnectPromise = null;
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
const saveTraceContext = async (trace) => {
|
|
69
|
+
if (!trace?.sessionId) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const client = await getTraceRedisClient();
|
|
73
|
+
await client.setEx(TRACE_CONTEXT_KEY, TRACE_CONTEXT_TTL_SEC, JSON.stringify((0, trace_1.sanitizeTraceValue)(trace)));
|
|
74
|
+
return true;
|
|
75
|
+
};
|
|
76
|
+
exports.saveTraceContext = saveTraceContext;
|
|
77
|
+
const loadTraceContext = async () => {
|
|
78
|
+
const client = await getTraceRedisClient();
|
|
79
|
+
const raw = await client.get(TRACE_CONTEXT_KEY);
|
|
80
|
+
if (!raw) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const parsed = JSON.parse(Buffer.isBuffer(raw) ? raw.toString("utf-8") : String(raw));
|
|
85
|
+
if (!parsed || typeof parsed !== "object") {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
return {
|
|
89
|
+
sessionId: String(parsed.sessionId || ""),
|
|
90
|
+
name: parsed.name || null,
|
|
91
|
+
tag: parsed.tag || null,
|
|
92
|
+
rootAction: parsed.rootAction || null,
|
|
93
|
+
startedBy: parsed.startedBy || null,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
exports.loadTraceContext = loadTraceContext;
|
|
101
|
+
const touchTraceContext = async () => {
|
|
102
|
+
const client = await getTraceRedisClient();
|
|
103
|
+
const exists = await client.exists(TRACE_CONTEXT_KEY);
|
|
104
|
+
if (!exists) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
await client.expire(TRACE_CONTEXT_KEY, TRACE_CONTEXT_TTL_SEC);
|
|
108
|
+
return true;
|
|
109
|
+
};
|
|
110
|
+
exports.touchTraceContext = touchTraceContext;
|
|
111
|
+
const deleteTraceContext = async () => {
|
|
112
|
+
const client = await getTraceRedisClient();
|
|
113
|
+
await client.del(TRACE_CONTEXT_KEY);
|
|
114
|
+
return true;
|
|
115
|
+
};
|
|
116
|
+
exports.deleteTraceContext = deleteTraceContext;
|
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* eslint-disable no-console */
|
|
3
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
|
+
};
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
// eslint-disable-next-line no-duplicate-imports
|
|
8
|
+
const moleculer_1 = require("moleculer");
|
|
9
|
+
const dotenv_1 = __importDefault(require("dotenv"));
|
|
10
|
+
require("module-alias/register");
|
|
11
|
+
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
12
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
13
|
+
const logfeed_1 = require("./lib/mixins/logfeed");
|
|
14
|
+
const session_errors_1 = require("./lib/mixins/session.errors");
|
|
15
|
+
const tracer_1 = require("./lib/middlewares/tracer");
|
|
16
|
+
dotenv_1.default.config({ path: process.env.ENV_FILE ?? ".env" });
|
|
17
|
+
/**
|
|
18
|
+
* Moleculer ServiceBroker configuration file 1
|
|
19
|
+
*
|
|
20
|
+
* More info about options:
|
|
21
|
+
* https://moleculer.services/docs/0.14/configuration.html
|
|
22
|
+
*
|
|
23
|
+
*
|
|
24
|
+
* Overwriting options in production:
|
|
25
|
+
* ================================
|
|
26
|
+
* You can overwrite any option with environment variables.
|
|
27
|
+
* For example to overwrite the "logLevel" value, use `LOGLEVEL=warn` env var.
|
|
28
|
+
* To overwrite a nested parameter, e.g. retryPolicy.retries, use `RETRYPOLICY_RETRIES=10` env var.
|
|
29
|
+
*
|
|
30
|
+
* To overwrite broker’s deeply nested default options, which are not presented in "moleculer.config.js",
|
|
31
|
+
* use the `MOL_` prefix and double underscore `__` for nested properties in .env file.
|
|
32
|
+
* For example, to set the cacher prefix to `MYCACHE`, you should declare an env var as `MOL_CACHER__OPTIONS__PREFIX=mycache`.
|
|
33
|
+
* It will set this:
|
|
34
|
+
* {
|
|
35
|
+
* cacher: {
|
|
36
|
+
* options: {
|
|
37
|
+
* prefix: "mycache"
|
|
38
|
+
* }
|
|
39
|
+
* }
|
|
40
|
+
* }
|
|
41
|
+
*/
|
|
42
|
+
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
|
|
43
|
+
const logger = [
|
|
44
|
+
{
|
|
45
|
+
type: "Console",
|
|
46
|
+
options: {
|
|
47
|
+
colors: true,
|
|
48
|
+
moduleColors: true,
|
|
49
|
+
formatter: process.env.LOGFORMATTER ?? "short",
|
|
50
|
+
objectPrinter: null,
|
|
51
|
+
autoPadding: false,
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
];
|
|
55
|
+
const metricsEnabled = process.env.MOLECULER_METRICS === "true";
|
|
56
|
+
const metricsPort = +(process.env.METRICS_PORT || 3030);
|
|
57
|
+
const metricsPath = process.env.METRICS_PATH || "/metrics";
|
|
58
|
+
const logFileEnabled = process.env.LOG_FILE_ENABLED === "true";
|
|
59
|
+
const logFeedEnabled = process.env.ENABLE_LOGFEED != null
|
|
60
|
+
? !["0", "false", "no", "off"].includes(process.env.ENABLE_LOGFEED.toLowerCase())
|
|
61
|
+
: process.env.LOGFEED_ENABLED !== "false";
|
|
62
|
+
const logFileFolder = process.env.LOG_FILE_FOLDER || "./logs";
|
|
63
|
+
const logFileName = process.env.LOG_FILE_NAME || "moleculer-{date}.log";
|
|
64
|
+
const logFileRetentionDays = +(process.env.LOG_FILE_RETENTION_DAYS || 14);
|
|
65
|
+
const cleanupLogFiles = async () => {
|
|
66
|
+
if (!logFileEnabled || !Number.isFinite(logFileRetentionDays) || logFileRetentionDays <= 0) {
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const logFolder = node_path_1.default.resolve(logFileFolder);
|
|
70
|
+
const now = Date.now();
|
|
71
|
+
const maxAgeMs = logFileRetentionDays * 24 * 60 * 60 * 1000;
|
|
72
|
+
const filenamePattern = new RegExp(`^${logFileName
|
|
73
|
+
.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
|
|
74
|
+
.replace(/\\\{date\\\}/g, "\\d{4}-\\d{2}-\\d{2}")
|
|
75
|
+
.replace(/\\\{nodeID\\\}/g, "[^/]+")
|
|
76
|
+
.replace(/\\\{namespace\\\}/g, "[^/]+")}$`);
|
|
77
|
+
try {
|
|
78
|
+
const entries = await promises_1.default.readdir(logFolder, { withFileTypes: true });
|
|
79
|
+
await Promise.all(entries
|
|
80
|
+
.filter(entry => entry.isFile() && filenamePattern.test(entry.name))
|
|
81
|
+
.map(async (entry) => {
|
|
82
|
+
const filePath = node_path_1.default.join(logFolder, entry.name);
|
|
83
|
+
const stats = await promises_1.default.stat(filePath);
|
|
84
|
+
if (now - stats.mtimeMs > maxAgeMs) {
|
|
85
|
+
await promises_1.default.unlink(filePath);
|
|
86
|
+
}
|
|
87
|
+
}));
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
if (error.code !== "ENOENT") {
|
|
91
|
+
console.warn("LOG_FILE cleanup failed:", error);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
if (logFileEnabled) {
|
|
96
|
+
void cleanupLogFiles();
|
|
97
|
+
logger.push({
|
|
98
|
+
type: "File",
|
|
99
|
+
options: {
|
|
100
|
+
level: process.env.LOG_FILE_LEVEL || process.env.LOG_LEVEL || "info",
|
|
101
|
+
folder: logFileFolder,
|
|
102
|
+
filename: logFileName,
|
|
103
|
+
formatter: process.env.LOG_FILE_FORMATTER || "json",
|
|
104
|
+
eol: "\n",
|
|
105
|
+
interval: +(process.env.LOG_FILE_INTERVAL_MS || 1000),
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
if (logFeedEnabled) {
|
|
110
|
+
logger.push(new logfeed_1.LogFeedLogger({
|
|
111
|
+
level: process.env.LOGFEED_LEVEL || process.env.LOG_LEVEL || "info",
|
|
112
|
+
}));
|
|
113
|
+
}
|
|
114
|
+
const brokerConfig = {
|
|
115
|
+
// Namespace of nodes to segment your nodes on the same network.
|
|
116
|
+
namespace: process.env.NAMESPACE,
|
|
117
|
+
// Unique node identifier. Must be unique in a namespace.
|
|
118
|
+
nodeID: process.env.NODE_ID,
|
|
119
|
+
// Custom metadata store. Store here what you want. Accessing: `this.broker.metadata`
|
|
120
|
+
metadata: {},
|
|
121
|
+
// Enable/disable logging or use custom logger. More info: https://moleculer.services/docs/0.14/logging.html
|
|
122
|
+
// Available logger types: "Console", "File", "Pino", "Winston", "Bunyan", "debug", "Log4js", "Datadog"
|
|
123
|
+
logger,
|
|
124
|
+
// Default log level for built-in console logger. It can be overwritten in logger options above.
|
|
125
|
+
// Available values: trace, debug, info, warn, error, fatal
|
|
126
|
+
logLevel: process.env.LOG_LEVEL || "info",
|
|
127
|
+
// Define transporter.
|
|
128
|
+
// More info: https://moleculer.services/docs/0.14/networking.html
|
|
129
|
+
// Note: During the development, you don't need to define it because all services will be loaded locally.
|
|
130
|
+
// In production you can set it via `TRANSPORTER=nats://localhost:4222` environment variable.
|
|
131
|
+
transporter: process.env.TRANSPORT ?? "TCP", // "NATS"
|
|
132
|
+
// Define a cacher.
|
|
133
|
+
// More info: https://moleculer.services/docs/0.14/caching.html
|
|
134
|
+
// cacher:false,
|
|
135
|
+
cacher: false,
|
|
136
|
+
// Define a serializer.
|
|
137
|
+
// Available values: "JSON", "Avro", "ProtoBuf", "MsgPack", "Notepack", "Thrift".
|
|
138
|
+
// More info: https://moleculer.services/docs/0.14/networking.html#Serialization
|
|
139
|
+
serializer: "JSON",
|
|
140
|
+
// Number of milliseconds to wait before reject a request with a RequestTimeout error. Disabled: 0
|
|
141
|
+
requestTimeout: 0, // 0 , 10 * 60 * 1000,
|
|
142
|
+
// Retry policy settings. More info: https://moleculer.services/docs/0.14/fault-tolerance.html#Retry
|
|
143
|
+
retryPolicy: {
|
|
144
|
+
// Enable feature
|
|
145
|
+
enabled: false,
|
|
146
|
+
// Count of retries
|
|
147
|
+
retries: 5,
|
|
148
|
+
// First delay in milliseconds.
|
|
149
|
+
delay: 100,
|
|
150
|
+
// Maximum delay in milliseconds.
|
|
151
|
+
maxDelay: 1000,
|
|
152
|
+
// Backoff factor for delay. 2 means exponential backoff.
|
|
153
|
+
factor: 2,
|
|
154
|
+
// A function to check failed requests.
|
|
155
|
+
check: (err) => err && err instanceof moleculer_1.Errors.MoleculerRetryableError && !!err.retryable,
|
|
156
|
+
},
|
|
157
|
+
// Limit of calling level. If it reaches the limit, broker will throw an MaxCallLevelError error. (Infinite loop protection)
|
|
158
|
+
maxCallLevel: 100,
|
|
159
|
+
// Number of seconds to send heartbeat packet to other nodes.
|
|
160
|
+
heartbeatInterval: 10,
|
|
161
|
+
// Number of seconds to wait before setting node to unavailable status.
|
|
162
|
+
heartbeatTimeout: 30,
|
|
163
|
+
// Cloning the params of context if enabled. High performance impact, use it with caution!
|
|
164
|
+
contextParamsCloning: false,
|
|
165
|
+
// Tracking requests and waiting for running requests before shuting down. More info: https://moleculer.services/docs/0.14/context.html#Context-tracking
|
|
166
|
+
tracking: {
|
|
167
|
+
// Enable feature
|
|
168
|
+
enabled: false,
|
|
169
|
+
// Number of milliseconds to wait before shuting down the process.
|
|
170
|
+
shutdownTimeout: 5000,
|
|
171
|
+
},
|
|
172
|
+
// Disable built-in request & emit balancer. (Transporter must support it, as well.). More info: https://moleculer.services/docs/0.14/networking.html#Disabled-balancer
|
|
173
|
+
disableBalancer: false,
|
|
174
|
+
// Settings of Service Registry. More info: https://moleculer.services/docs/0.14/registry.html
|
|
175
|
+
registry: {
|
|
176
|
+
// Define balancing strategy. More info: https://moleculer.services/docs/0.14/balancing.html
|
|
177
|
+
// Available values: "RoundRobin", "Random", "CpuUsage", "Latency", "Shard"
|
|
178
|
+
strategy: "RoundRobin",
|
|
179
|
+
// Enable local action call preferring. Always call the local action instance if available.
|
|
180
|
+
preferLocal: true,
|
|
181
|
+
},
|
|
182
|
+
// Settings of Circuit Breaker. More info: https://moleculer.services/docs/0.14/fault-tolerance.html#Circuit-Breaker
|
|
183
|
+
circuitBreaker: {
|
|
184
|
+
// Enable feature
|
|
185
|
+
enabled: false,
|
|
186
|
+
// Threshold value. 0.5 means that 50% should be failed for tripping.
|
|
187
|
+
threshold: 0.5,
|
|
188
|
+
// Minimum request count. Below it, CB does not trip.
|
|
189
|
+
minRequestCount: 20,
|
|
190
|
+
// Number of seconds for time window.
|
|
191
|
+
windowTime: 60,
|
|
192
|
+
// Number of milliseconds to switch from open to half-open state
|
|
193
|
+
halfOpenTime: 10 * 1000,
|
|
194
|
+
// A function to check failed requests.
|
|
195
|
+
check: (err) => err && err instanceof moleculer_1.Errors.MoleculerError && err.code >= 500,
|
|
196
|
+
},
|
|
197
|
+
// Settings of bulkhead feature. More info: https://moleculer.services/docs/0.14/fault-tolerance.html#Bulkhead
|
|
198
|
+
bulkhead: {
|
|
199
|
+
// Enable feature.
|
|
200
|
+
enabled: false,
|
|
201
|
+
// Maximum concurrent executions.
|
|
202
|
+
concurrency: 10,
|
|
203
|
+
// Maximum size of queue
|
|
204
|
+
maxQueueSize: 100,
|
|
205
|
+
},
|
|
206
|
+
// Enable action & event parameter validation. More info: https://moleculer.services/docs/0.14/validating.html
|
|
207
|
+
validator: true,
|
|
208
|
+
errorHandler: (err, { ctx, service }) => {
|
|
209
|
+
// ctx.service.logger.error("errorHandler", err);
|
|
210
|
+
if (err instanceof session_errors_1.BackendError) {
|
|
211
|
+
// ctx.meta.$statusCode = err.extensions.code;
|
|
212
|
+
return err;
|
|
213
|
+
}
|
|
214
|
+
else if (err instanceof Error) {
|
|
215
|
+
// ctx.meta.$statusCode = 502;
|
|
216
|
+
const rawName = ctx?.action?.rawName ||
|
|
217
|
+
ctx?.action?.name ||
|
|
218
|
+
service?.name ||
|
|
219
|
+
"UNKNOWN";
|
|
220
|
+
return new session_errors_1.BackendError(err.message, 502, `XC_${String(rawName).toUpperCase()}`);
|
|
221
|
+
}
|
|
222
|
+
return err;
|
|
223
|
+
},
|
|
224
|
+
// Enable/disable built-in metrics function. More info: https://moleculer.services/docs/0.14/metrics.html
|
|
225
|
+
metrics: {
|
|
226
|
+
enabled: metricsEnabled,
|
|
227
|
+
// Available built-in reporters: "Console", "CSV", "Event", "Prometheus", "Datadog", "StatsD"
|
|
228
|
+
reporter: {
|
|
229
|
+
type: "Prometheus",
|
|
230
|
+
options: {
|
|
231
|
+
// HTTP port
|
|
232
|
+
port: metricsPort,
|
|
233
|
+
// HTTP URL path
|
|
234
|
+
path: metricsPath,
|
|
235
|
+
// Default labels which are appended to all metrics labels
|
|
236
|
+
defaultLabels: (registry) => ({
|
|
237
|
+
namespace: registry.broker.namespace,
|
|
238
|
+
nodeID: registry.broker.nodeID,
|
|
239
|
+
}),
|
|
240
|
+
},
|
|
241
|
+
},
|
|
242
|
+
},
|
|
243
|
+
// Enable built-in tracing function. More info: https://moleculer.services/docs/0.14/tracing.html
|
|
244
|
+
tracing: {
|
|
245
|
+
enabled: process.env.MOLECULER_TRACE,
|
|
246
|
+
// Available built-in exporters: "Console", "Datadog", "Event", "EventLegacy", "Jaeger", "Zipkin"
|
|
247
|
+
exporter: {
|
|
248
|
+
type: "Console", // Console exporter is only for development!
|
|
249
|
+
options: {
|
|
250
|
+
// Custom logger
|
|
251
|
+
logger: null,
|
|
252
|
+
// Using colors
|
|
253
|
+
colors: true,
|
|
254
|
+
// Width of row
|
|
255
|
+
width: 100,
|
|
256
|
+
// Gauge width in the row
|
|
257
|
+
gaugeWidth: 40,
|
|
258
|
+
},
|
|
259
|
+
},
|
|
260
|
+
},
|
|
261
|
+
// Register custom middlewares
|
|
262
|
+
middlewares: [(0, tracer_1.createTracerMiddleware)()],
|
|
263
|
+
// Register custom REPL commands.
|
|
264
|
+
replCommands: null,
|
|
265
|
+
// Called after broker created.
|
|
266
|
+
// created(broker: ServiceBroker): void {},
|
|
267
|
+
// Called after broker started.
|
|
268
|
+
started() {
|
|
269
|
+
console.log("ALLOWED ORIGINS", (process.env.ORIGINS ?? "").split(","));
|
|
270
|
+
},
|
|
271
|
+
// Called after broker stopped.
|
|
272
|
+
// async stopped(broker: ServiceBroker): Promise<void> {},
|
|
273
|
+
};
|
|
274
|
+
exports.default = brokerConfig;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TELEGRAM_MCP_APPROVAL_SERVICE_NAME = void 0;
|
|
4
|
+
const runtime_service_1 = require("./runtime.service");
|
|
5
|
+
const orchestrator_1 = require("./src/processes/human-approval/model/orchestrator");
|
|
6
|
+
exports.TELEGRAM_MCP_APPROVAL_SERVICE_NAME = "telegramMcp.approval";
|
|
7
|
+
const TelegramMcpApprovalService = {
|
|
8
|
+
name: exports.TELEGRAM_MCP_APPROVAL_SERVICE_NAME,
|
|
9
|
+
dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
|
|
10
|
+
created() {
|
|
11
|
+
this.approvalOrchestrator = null;
|
|
12
|
+
},
|
|
13
|
+
methods: {
|
|
14
|
+
getApprovalOrchestrator() {
|
|
15
|
+
if (!this.approvalOrchestrator) {
|
|
16
|
+
throw new Error("telegram_mcp approval service is not initialized yet");
|
|
17
|
+
}
|
|
18
|
+
return this.approvalOrchestrator;
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
async started() {
|
|
22
|
+
await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
|
|
23
|
+
const runtimeService = this.broker.getLocalService(runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME);
|
|
24
|
+
if (!runtimeService) {
|
|
25
|
+
throw new Error(`Local Moleculer service '${runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME}' is unavailable`);
|
|
26
|
+
}
|
|
27
|
+
const runtime = runtimeService.getRuntime();
|
|
28
|
+
this.logger.info("Starting telegram_mcp approval service");
|
|
29
|
+
this.approvalOrchestrator = new orchestrator_1.HumanApprovalOrchestrator(runtime.config, runtime.stateStore, runtime.stateStore, runtime.stateStore, runtime.telegramTransport, runtime.logger, runtime.projectIdentityResolver);
|
|
30
|
+
this.logger.info("telegram_mcp approval service is ready");
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
exports.default = TelegramMcpApprovalService;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME = void 0;
|
|
4
|
+
const runtime_service_1 = require("./runtime.service");
|
|
5
|
+
const browserService_1 = require("./src/features/browser/model/browserService");
|
|
6
|
+
exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME = "telegramMcp.browser";
|
|
7
|
+
const TelegramMcpBrowserService = {
|
|
8
|
+
name: exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME,
|
|
9
|
+
dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
|
|
10
|
+
created() {
|
|
11
|
+
this.browserService = null;
|
|
12
|
+
},
|
|
13
|
+
methods: {
|
|
14
|
+
getBrowserService() {
|
|
15
|
+
if (!this.browserService) {
|
|
16
|
+
throw new Error("telegram_mcp browser service is not initialized yet");
|
|
17
|
+
}
|
|
18
|
+
return this.browserService;
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
async started() {
|
|
22
|
+
await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
|
|
23
|
+
const runtimeService = this.broker.getLocalService(runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME);
|
|
24
|
+
if (!runtimeService) {
|
|
25
|
+
throw new Error(`Local Moleculer service '${runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME}' is unavailable`);
|
|
26
|
+
}
|
|
27
|
+
const runtime = runtimeService.getRuntime();
|
|
28
|
+
this.logger.info("Starting telegram_mcp browser service");
|
|
29
|
+
this.browserService = new browserService_1.BrowserService(runtime.config, runtime.stateStore, runtime.stateStore, runtime.stateStore, runtime.objectStore, runtime.telegramTransport, runtime.logger, runtime.projectIdentityResolver);
|
|
30
|
+
this.logger.info("telegram_mcp browser service is ready");
|
|
31
|
+
},
|
|
32
|
+
async stopped() {
|
|
33
|
+
if (!this.browserService) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const browserService = this.browserService;
|
|
37
|
+
this.browserService = null;
|
|
38
|
+
this.logger.info("Stopping telegram_mcp browser service");
|
|
39
|
+
await browserService.shutdown();
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
exports.default = TelegramMcpBrowserService;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME = void 0;
|
|
4
|
+
const runtime_service_1 = require("./runtime.service");
|
|
5
|
+
const collaborationService_1 = require("./src/features/collaboration/model/collaborationService");
|
|
6
|
+
const sendPartnerFileService_1 = require("./src/features/collaboration/model/sendPartnerFileService");
|
|
7
|
+
const gatewayCollaborationBackend_1 = require("./src/features/distributed-client/model/gatewayCollaborationBackend");
|
|
8
|
+
const localCollaborationBackend_1 = require("./src/features/collaboration/model/localCollaborationBackend");
|
|
9
|
+
exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME = "telegramMcp.collaboration";
|
|
10
|
+
const TelegramMcpCollaborationService = {
|
|
11
|
+
name: exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME,
|
|
12
|
+
dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
|
|
13
|
+
created() {
|
|
14
|
+
this.collaborationService = null;
|
|
15
|
+
this.sendPartnerFileService = null;
|
|
16
|
+
},
|
|
17
|
+
methods: {
|
|
18
|
+
getCollaborationService() {
|
|
19
|
+
if (!this.collaborationService) {
|
|
20
|
+
throw new Error("telegram_mcp collaboration service is not initialized yet");
|
|
21
|
+
}
|
|
22
|
+
return this.collaborationService;
|
|
23
|
+
},
|
|
24
|
+
getSendPartnerFileService() {
|
|
25
|
+
if (!this.sendPartnerFileService) {
|
|
26
|
+
throw new Error("telegram_mcp send partner file service is not initialized yet");
|
|
27
|
+
}
|
|
28
|
+
return this.sendPartnerFileService;
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
async started() {
|
|
32
|
+
await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
|
|
33
|
+
const runtimeService = this.broker.getLocalService(runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME);
|
|
34
|
+
if (!runtimeService) {
|
|
35
|
+
throw new Error(`Local Moleculer service '${runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME}' is unavailable`);
|
|
36
|
+
}
|
|
37
|
+
const runtime = runtimeService.getRuntime();
|
|
38
|
+
this.logger.info("Starting telegram_mcp collaboration service");
|
|
39
|
+
const localBackend = new localCollaborationBackend_1.LocalCollaborationBackend(runtime.config, runtime.stateStore, runtime.stateStore, runtime.stateStore, runtime.stateStore, runtime.objectStore, runtime.telegramTransport, runtime.logger);
|
|
40
|
+
runtime.gatewayHttpService.setPartnerNoteRelayHandler(async (input) => {
|
|
41
|
+
const resolved = runtime.projectIdentityResolver.resolveSessionDefaults(input);
|
|
42
|
+
return localBackend.sendPartnerNote(input, resolved);
|
|
43
|
+
});
|
|
44
|
+
const backend = runtime.config.distributed.gatewayPublicUrl
|
|
45
|
+
? new gatewayCollaborationBackend_1.GatewayCollaborationBackend(runtime.logger, runtime.stateStore, runtime.config.distributed.gatewayPublicUrl, runtime.config.distributed.gatewayAuthToken)
|
|
46
|
+
: localBackend;
|
|
47
|
+
this.collaborationService = new collaborationService_1.CollaborationService(backend, runtime.logger, runtime.projectIdentityResolver);
|
|
48
|
+
this.sendPartnerFileService = new sendPartnerFileService_1.SendPartnerFileService(runtime.config, runtime.sessionStore, runtime.logger, runtime.projectIdentityResolver, this.collaborationService);
|
|
49
|
+
runtime.telegramTransport.setCollaborationService(this.collaborationService);
|
|
50
|
+
this.logger.info("telegram_mcp collaboration service is ready");
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
exports.default = TelegramMcpCollaborationService;
|