@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,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;