@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.
Files changed (154) hide show
  1. package/.env.example.client +42 -52
  2. package/.env.example.gateway +48 -62
  3. package/CHANGELOG.md +3 -3
  4. package/README-ru.md +226 -376
  5. package/README.md +213 -1184
  6. package/TOOLS.md +320 -377
  7. package/VERSION.md +13 -13
  8. package/config/codex/plugins/telly-workflows/.codex-plugin/plugin.json +18 -0
  9. package/config/codex/plugins/telly-workflows/references/invariants.md +10 -0
  10. package/config/codex/plugins/telly-workflows/skills/telly-browser-screenshot/SKILL.md +27 -0
  11. package/config/codex/plugins/telly-workflows/skills/telly-collab-artifact/SKILL.md +22 -0
  12. package/config/codex/plugins/telly-workflows/skills/telly-human-telegram/SKILL.md +31 -0
  13. package/config/codex/plugins/telly-workflows/skills/telly-partner-note/SKILL.md +36 -0
  14. package/config/templates/env.both.template +39 -20
  15. package/config/templates/env.client.template +34 -19
  16. package/config/templates/env.gateway.template +37 -22
  17. package/dist/cli.js +322 -75
  18. package/dist/codexPluginInstaller.js +215 -0
  19. package/dist/lib/mixins/session.errors.js +34 -1
  20. package/dist/lib/pinoTargets.js +2 -2
  21. package/dist/moleculer.config.js +7 -5
  22. package/dist/services/features/telegram-mcp/browser.service.js +94 -1
  23. package/dist/services/features/telegram-mcp/collaboration.service.js +40 -3
  24. package/dist/services/features/telegram-mcp/ensuredb.service.js +145 -26
  25. package/dist/services/features/telegram-mcp/gateway-delivery.service.js +285 -103
  26. package/dist/services/features/telegram-mcp/gateway-socket.service.js +907 -85
  27. package/dist/services/features/telegram-mcp/gateway.service.js +876 -81
  28. package/dist/services/features/telegram-mcp/mcp-http.service.js +8 -0
  29. package/dist/services/features/telegram-mcp/mcp-server.service.js +17 -26
  30. package/dist/services/features/telegram-mcp/notify.service.js +127 -1
  31. package/dist/services/features/telegram-mcp/session-context.service.js +28 -1
  32. package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +132 -10
  33. package/dist/services/features/telegram-mcp/src/app/config/env.js +158 -52
  34. package/dist/services/features/telegram-mcp/src/app/http.js +375 -42
  35. package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +386 -58
  36. package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +3 -0
  37. package/dist/services/features/telegram-mcp/src/app/webapp/terminal.js +12 -0
  38. package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +120 -104
  39. package/dist/services/features/telegram-mcp/src/entities/xchange/model/types.js +2 -0
  40. package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +1 -1
  41. package/dist/services/features/telegram-mcp/src/features/browser/model/browserOpenTool.js +1 -1
  42. package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +1 -1
  43. package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +306 -26
  44. package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +71 -0
  45. package/dist/services/features/telegram-mcp/src/features/collaboration/model/listGatewaySessionsTool.js +33 -0
  46. package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +93 -82
  47. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +47 -5
  48. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +1 -1
  49. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +1 -1
  50. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +82 -0
  51. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +22 -14
  52. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +697 -75
  53. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +76 -0
  54. package/dist/services/features/telegram-mcp/src/features/embedded-runtime/model/embeddedRuntimeBroker.js +92 -0
  55. package/dist/services/features/telegram-mcp/src/features/foreground-terminal/model/foregroundTerminalRuntime.js +192 -0
  56. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +382 -3
  57. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +1 -1
  58. package/dist/services/features/telegram-mcp/src/features/notify/model/sendFileToTelegramTool.js +33 -0
  59. package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +1 -1
  60. package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +1 -1
  61. package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +1 -1
  62. package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +42 -200
  63. package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +1 -1
  64. package/dist/services/features/telegram-mcp/src/features/terminal-buffer/model/terminalBufferService.js +96 -0
  65. package/dist/services/features/telegram-mcp/src/features/terminal-input/model/terminalInputService.js +97 -0
  66. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +107 -58
  67. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +1 -1
  68. package/dist/services/features/telegram-mcp/src/features/xchange/model/getXchangeRecordTool.js +28 -0
  69. package/dist/services/features/telegram-mcp/src/features/xchange/model/listXchangeRecordsTool.js +28 -0
  70. package/dist/services/features/telegram-mcp/src/features/xchange/model/markXchangeRecordReadTool.js +28 -0
  71. package/dist/services/features/telegram-mcp/src/features/xchange/model/xchangeService.js +169 -0
  72. package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +5 -4
  73. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/en.js +143 -42
  74. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/ru.js +139 -38
  75. package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalSessionStore.js +27 -0
  76. package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +11 -8
  77. package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +69 -70
  78. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +21 -22
  79. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +444 -7093
  80. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportAttachmentStore.js +93 -0
  81. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportBroadcastActions.js +385 -0
  82. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +149 -0
  83. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConstructorWiring.js +642 -0
  84. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContent.js +84 -0
  85. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContext.js +78 -0
  86. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportDocumentActions.js +36 -0
  87. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportEventActions.js +292 -0
  88. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFileHandoffActions.js +352 -0
  89. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFormatting.js +75 -0
  90. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportGatewayActions.js +44 -0
  91. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLifecycleActions.js +161 -0
  92. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLive.js +56 -0
  93. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLiveActions.js +77 -0
  94. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuCallbacks.js +254 -0
  95. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFactories.js +538 -0
  96. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFingerprints.js +93 -0
  97. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFlow.js +344 -0
  98. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuShell.js +65 -0
  99. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuState.js +408 -0
  100. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuText.js +216 -0
  101. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +452 -0
  102. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportOutputActions.js +189 -0
  103. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPartnerActions.js +286 -0
  104. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPayloadState.js +108 -0
  105. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectActions.js +463 -0
  106. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEntryActions.js +202 -0
  107. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEvents.js +99 -0
  108. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectMenus.js +138 -0
  109. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +308 -0
  110. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectView.js +426 -0
  111. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportRequestFlow.js +278 -0
  112. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportSessionActions.js +143 -0
  113. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalActions.js +665 -0
  114. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalRuntime.js +226 -0
  115. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTypes.js +2 -0
  116. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportUtils.js +330 -0
  117. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportXchangeState.js +107 -0
  118. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/client.js +255 -0
  119. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/ptyRegistry.js +543 -0
  120. package/dist/services/features/telegram-mcp/src/shared/integrations/xchange/sqliteRecordStore.js +223 -0
  121. package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +24 -0
  122. package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +6 -0
  123. package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +147 -76
  124. package/dist/services/features/telegram-mcp/src/shared/lib/telegramXchangeRecords.js +72 -0
  125. package/dist/services/features/telegram-mcp/src/shared/lib/terminalPromptDetection.js +409 -0
  126. package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +129 -1
  127. package/dist/services/features/telegram-mcp/src/shared/lib/xchangeRecordHints.js +98 -0
  128. package/dist/services/features/telegram-mcp/standalone-http.service.js +12 -0
  129. package/dist/services/features/telegram-mcp/terminal-buffer.service.js +42 -0
  130. package/dist/services/features/telegram-mcp/terminal-input.service.js +41 -0
  131. package/dist/services/features/telegram-mcp/tools-sync.service.js +15 -1
  132. package/dist/services/features/telegram-mcp/xchange.service.js +123 -0
  133. package/docs/STANDALONE-ru.md +172 -0
  134. package/docs/STANDALONE.md +172 -0
  135. package/package.json +10 -5
  136. package/scripts/build-package-artifact.sh +27 -0
  137. package/scripts/deploy-gateway.sh +64 -0
  138. package/scripts/deploy-onebot-branch.sh +27 -0
  139. package/scripts/postinstall.js +11 -36
  140. package/STANDALONE-ru.md +0 -274
  141. package/STANDALONE.md +0 -274
  142. package/dist/services/features/telegram-mcp/inbox.service.js +0 -33
  143. package/dist/services/features/telegram-mcp/pair.service.js +0 -33
  144. package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +0 -10
  145. package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +0 -33
  146. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +0 -33
  147. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +0 -33
  148. package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +0 -77
  149. package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +0 -33
  150. package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +0 -33
  151. package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +0 -202
  152. package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +0 -33
  153. package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +0 -33
  154. package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +0 -363
@@ -0,0 +1,215 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getCodexPluginStatus = getCodexPluginStatus;
7
+ exports.installCodexPlugin = installCodexPlugin;
8
+ const node_fs_1 = require("node:fs");
9
+ const node_os_1 = __importDefault(require("node:os"));
10
+ const node_path_1 = __importDefault(require("node:path"));
11
+ const node_child_process_1 = require("node:child_process");
12
+ const PLUGIN_NAME = "telly-workflows";
13
+ const MARKETPLACE_NAME = "personal";
14
+ const MARKETPLACE_RELATIVE_PLUGIN_PATH = "./.codex/local-plugins/telly-workflows";
15
+ function readJsonFile(filePath) {
16
+ return JSON.parse((0, node_fs_1.readFileSync)(filePath, "utf8"));
17
+ }
18
+ function getBundledPluginDir(packageRoot) {
19
+ return node_path_1.default.join(packageRoot, "config", "codex", "plugins", PLUGIN_NAME);
20
+ }
21
+ function getBundledPluginManifest(packageRoot) {
22
+ return readJsonFile(node_path_1.default.join(getBundledPluginDir(packageRoot), ".codex-plugin", "plugin.json"));
23
+ }
24
+ function getMarketplaceRoot(homeDir) {
25
+ return homeDir;
26
+ }
27
+ function getMarketplaceFile(homeDir) {
28
+ return node_path_1.default.join(homeDir, ".agents", "plugins", "marketplace.json");
29
+ }
30
+ function getManagedPluginDir(homeDir) {
31
+ return node_path_1.default.join(homeDir, ".codex", "local-plugins", PLUGIN_NAME);
32
+ }
33
+ function commandExists(command) {
34
+ const result = (0, node_child_process_1.spawnSync)(command, ["--version"], {
35
+ encoding: "utf8",
36
+ stdio: ["ignore", "pipe", "pipe"],
37
+ });
38
+ return result.status === 0;
39
+ }
40
+ function parseMarketplaceRegistered(stdout, rootPath) {
41
+ return stdout
42
+ .split(/\r?\n/u)
43
+ .map((line) => line.trim())
44
+ .filter(Boolean)
45
+ .some((line) => {
46
+ if (line === "MARKETPLACE ROOT" ||
47
+ line.startsWith("Added marketplace ") ||
48
+ line.startsWith("Installed marketplace root:")) {
49
+ return false;
50
+ }
51
+ const columns = line.split(/\s{2,}/u);
52
+ return columns[0] === MARKETPLACE_NAME && columns[1] === rootPath;
53
+ });
54
+ }
55
+ function parseInstalledPluginVersion(stdout) {
56
+ for (const rawLine of stdout.split(/\r?\n/u)) {
57
+ const line = rawLine.trim();
58
+ if (!line.startsWith(`${PLUGIN_NAME}@${MARKETPLACE_NAME}`)) {
59
+ continue;
60
+ }
61
+ const columns = line.split(/\s{2,}/u);
62
+ if (columns.length < 3) {
63
+ continue;
64
+ }
65
+ const version = columns[2]?.trim();
66
+ return version || null;
67
+ }
68
+ return null;
69
+ }
70
+ function ensureMarketplaceManifest(homeDir) {
71
+ const marketplaceFile = getMarketplaceFile(homeDir);
72
+ (0, node_fs_1.mkdirSync)(node_path_1.default.dirname(marketplaceFile), { recursive: true });
73
+ const payload = (0, node_fs_1.existsSync)(marketplaceFile)
74
+ ? readJsonFile(marketplaceFile)
75
+ : {
76
+ name: MARKETPLACE_NAME,
77
+ interface: { displayName: "Personal" },
78
+ plugins: [],
79
+ };
80
+ const plugins = Array.isArray(payload.plugins) ? payload.plugins : [];
81
+ const existingIndex = plugins.findIndex((plugin) => String(plugin.name ?? "") === PLUGIN_NAME);
82
+ const nextEntry = {
83
+ name: PLUGIN_NAME,
84
+ source: {
85
+ source: "local",
86
+ path: MARKETPLACE_RELATIVE_PLUGIN_PATH,
87
+ },
88
+ policy: {
89
+ installation: "AVAILABLE",
90
+ authentication: "ON_INSTALL",
91
+ },
92
+ category: "Productivity",
93
+ };
94
+ if (existingIndex >= 0) {
95
+ plugins[existingIndex] = nextEntry;
96
+ }
97
+ else {
98
+ plugins.push(nextEntry);
99
+ }
100
+ const nextPayload = {
101
+ name: typeof payload.name === "string" && payload.name.trim()
102
+ ? payload.name.trim()
103
+ : MARKETPLACE_NAME,
104
+ interface: payload.interface &&
105
+ typeof payload.interface === "object" &&
106
+ typeof payload.interface.displayName === "string" &&
107
+ payload.interface.displayName.trim()
108
+ ? { displayName: payload.interface.displayName.trim() }
109
+ : { displayName: "Personal" },
110
+ plugins,
111
+ };
112
+ (0, node_fs_1.writeFileSync)(marketplaceFile, `${JSON.stringify(nextPayload, null, 2)}\n`, "utf8");
113
+ return marketplaceFile;
114
+ }
115
+ function syncBundledPlugin(packageRoot, homeDir) {
116
+ const bundledPluginDir = getBundledPluginDir(packageRoot);
117
+ if (!(0, node_fs_1.existsSync)(bundledPluginDir)) {
118
+ throw new Error(`Bundled Codex plugin is missing: ${bundledPluginDir}`);
119
+ }
120
+ const managedPluginDir = getManagedPluginDir(homeDir);
121
+ (0, node_fs_1.mkdirSync)(node_path_1.default.dirname(managedPluginDir), { recursive: true });
122
+ (0, node_fs_1.rmSync)(managedPluginDir, { recursive: true, force: true });
123
+ (0, node_fs_1.cpSync)(bundledPluginDir, managedPluginDir, { recursive: true });
124
+ return managedPluginDir;
125
+ }
126
+ function ensureMarketplaceRegistered(homeDir) {
127
+ if (!commandExists("codex")) {
128
+ return false;
129
+ }
130
+ const marketplaceRoot = getMarketplaceRoot(homeDir);
131
+ const listed = (0, node_child_process_1.spawnSync)("codex", ["plugin", "marketplace", "list"], {
132
+ encoding: "utf8",
133
+ stdio: ["ignore", "pipe", "pipe"],
134
+ });
135
+ if (listed.status === 0 && parseMarketplaceRegistered(listed.stdout || "", marketplaceRoot)) {
136
+ return true;
137
+ }
138
+ const added = (0, node_child_process_1.spawnSync)("codex", ["plugin", "marketplace", "add", marketplaceRoot], {
139
+ encoding: "utf8",
140
+ stdio: ["ignore", "pipe", "pipe"],
141
+ });
142
+ if (added.status !== 0) {
143
+ throw new Error((added.stderr || added.stdout || "Failed to add Codex marketplace.").trim());
144
+ }
145
+ return true;
146
+ }
147
+ function getCodexPluginStatus(packageRoot) {
148
+ const homeDir = node_os_1.default.homedir();
149
+ const bundledManifest = getBundledPluginManifest(packageRoot);
150
+ const managedPluginDir = getManagedPluginDir(homeDir);
151
+ const sourceVersion = (0, node_fs_1.existsSync)(node_path_1.default.join(managedPluginDir, ".codex-plugin", "plugin.json"))
152
+ ? readJsonFile(node_path_1.default.join(managedPluginDir, ".codex-plugin", "plugin.json")).version
153
+ : null;
154
+ const codexAvailable = commandExists("codex");
155
+ const marketplaceRoot = getMarketplaceRoot(homeDir);
156
+ let marketplaceRegistered = false;
157
+ let installedVersion = null;
158
+ if (codexAvailable) {
159
+ const listedMarketplaces = (0, node_child_process_1.spawnSync)("codex", ["plugin", "marketplace", "list"], {
160
+ encoding: "utf8",
161
+ stdio: ["ignore", "pipe", "pipe"],
162
+ });
163
+ marketplaceRegistered =
164
+ listedMarketplaces.status === 0 &&
165
+ parseMarketplaceRegistered(listedMarketplaces.stdout || "", marketplaceRoot);
166
+ const listedPlugins = (0, node_child_process_1.spawnSync)("codex", ["plugin", "list"], {
167
+ encoding: "utf8",
168
+ stdio: ["ignore", "pipe", "pipe"],
169
+ });
170
+ if (listedPlugins.status === 0) {
171
+ installedVersion = parseInstalledPluginVersion(listedPlugins.stdout || "");
172
+ }
173
+ }
174
+ return {
175
+ pluginName: bundledManifest.name,
176
+ marketplaceName: MARKETPLACE_NAME,
177
+ bundledVersion: bundledManifest.version,
178
+ sourceVersion,
179
+ installedVersion,
180
+ codexAvailable,
181
+ marketplaceRegistered,
182
+ upToDate: installedVersion === bundledManifest.version,
183
+ bundledPluginDir: getBundledPluginDir(packageRoot),
184
+ managedPluginDir,
185
+ marketplaceFile: getMarketplaceFile(homeDir),
186
+ marketplaceRoot,
187
+ };
188
+ }
189
+ function installCodexPlugin(packageRoot) {
190
+ const homeDir = node_os_1.default.homedir();
191
+ ensureMarketplaceManifest(homeDir);
192
+ syncBundledPlugin(packageRoot, homeDir);
193
+ const afterSync = getCodexPluginStatus(packageRoot);
194
+ if (!afterSync.codexAvailable) {
195
+ return {
196
+ ...afterSync,
197
+ marketplaceRegistered: false,
198
+ installedVersion: null,
199
+ upToDate: false,
200
+ };
201
+ }
202
+ ensureMarketplaceRegistered(homeDir);
203
+ const beforeInstall = getCodexPluginStatus(packageRoot);
204
+ if (beforeInstall.installedVersion === beforeInstall.bundledVersion) {
205
+ return beforeInstall;
206
+ }
207
+ const installed = (0, node_child_process_1.spawnSync)("codex", ["plugin", "add", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`], {
208
+ encoding: "utf8",
209
+ stdio: ["ignore", "pipe", "pipe"],
210
+ });
211
+ if (installed.status !== 0) {
212
+ throw new Error((installed.stderr || installed.stdout || "Failed to install Codex plugin.").trim());
213
+ }
214
+ return getCodexPluginStatus(packageRoot);
215
+ }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PlaygroundDisabledError = exports.SessionIdleTimeoutExceededError = exports.TokenInvalidError = exports.TokenNotFoundError = exports.SessionTokenSignatureInvalidError = exports.SessionTokenInvalidFormatError = exports.SessionTokenMismatchError = exports.SessionTokenNotFoundError = exports.SessionTokenRevokedError = exports.SessionTokenNotActiveError = exports.SessionTokenExpiredError = exports.SessionTokenInvalidError = exports.SessionValidationError = exports.SessionRefreshError = exports.SessionMaxLifetimeExceededError = exports.SessionStealedError = exports.SessionInvalidError = exports.SessionExpiredError = exports.SessionNotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.wrapUnhandledBackendError = exports.buildUnhandledBackendErrorCode = exports.BackendError = void 0;
4
+ exports.extractErrorDetails = extractErrorDetails;
4
5
  class BackendError extends Error {
5
6
  statusCode;
6
7
  code;
@@ -14,9 +15,41 @@ class BackendError extends Error {
14
15
  }
15
16
  }
16
17
  exports.BackendError = BackendError;
18
+ function collectOwnProps(err) {
19
+ try {
20
+ return Object.fromEntries(Object.getOwnPropertyNames(err).map((key) => [
21
+ key,
22
+ err[key],
23
+ ]));
24
+ }
25
+ catch {
26
+ return {};
27
+ }
28
+ }
29
+ function extractErrorDetails(err) {
30
+ if (!(err instanceof Error)) {
31
+ return undefined;
32
+ }
33
+ const named = err;
34
+ const ownProps = collectOwnProps(err);
35
+ return {
36
+ name: err.name,
37
+ message: err.message,
38
+ ...(typeof named.code === "string" || typeof named.code === "number"
39
+ ? { code: named.code }
40
+ : {}),
41
+ ...(typeof named.type === "string" ? { type: named.type } : {}),
42
+ ...(typeof named.statusCode === "number" ? { statusCode: named.statusCode } : {}),
43
+ ...(named.data !== undefined ? { data: named.data } : {}),
44
+ ...(named.fields !== undefined ? { fields: named.fields } : {}),
45
+ ...(typeof named.retryable === "boolean" ? { retryable: named.retryable } : {}),
46
+ ...(err.stack ? { stack: err.stack } : {}),
47
+ ...(Object.keys(ownProps).length > 0 ? { props: ownProps } : {}),
48
+ };
49
+ }
17
50
  const buildUnhandledBackendErrorCode = (rawName) => `XC_${rawName.toUpperCase()}`;
18
51
  exports.buildUnhandledBackendErrorCode = buildUnhandledBackendErrorCode;
19
- const wrapUnhandledBackendError = (err, rawName) => new BackendError(err.message, 502, (0, exports.buildUnhandledBackendErrorCode)(rawName));
52
+ const wrapUnhandledBackendError = (err, rawName) => new BackendError(err.message, 502, (0, exports.buildUnhandledBackendErrorCode)(rawName), extractErrorDetails(err));
20
53
  exports.wrapUnhandledBackendError = wrapUnhandledBackendError;
21
54
  class UnauthorizedError extends BackendError {
22
55
  constructor(message = "Unauthorized", data) {
@@ -5,7 +5,7 @@ function createPinoTargets(config) {
5
5
  const targets = [
6
6
  {
7
7
  target: "pino-pretty",
8
- level: config.level,
8
+ level: config.stderrLevel || config.level,
9
9
  options: {
10
10
  destination: 2,
11
11
  colorize: true,
@@ -18,7 +18,7 @@ function createPinoTargets(config) {
18
18
  if (config.fileEnabled) {
19
19
  targets.unshift({
20
20
  target: "pino/file",
21
- level: config.level,
21
+ level: config.fileLevel || config.level,
22
22
  options: {
23
23
  destination: config.filePath,
24
24
  mkdir: true,
@@ -39,11 +39,14 @@ dotenv_1.default.config({ path: process.env.ENV_FILE ?? ".env" });
39
39
  * }
40
40
  */
41
41
  process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
42
+ const configuredTransport = process.env.TRANSPORT?.trim();
42
43
  const pinoTransport = pino_1.default.transport({
43
44
  targets: (0, pinoTargets_1.createPinoTargets)({
44
45
  level: process.env.LOG_LEVEL || "info",
46
+ stderrLevel: process.env.LOG_STDERR_LEVEL || process.env.LOG_LEVEL || "info",
45
47
  fileEnabled: process.env.LOG_FILE_ENABLED === "true",
46
48
  filePath: process.env.LOG_FILE_PATH || ".tellymcp/log.jsonl",
49
+ fileLevel: process.env.LOG_FILE_LEVEL || process.env.LOG_LEVEL || "info",
47
50
  }),
48
51
  });
49
52
  const logger = [
@@ -85,11 +88,10 @@ const brokerConfig = {
85
88
  // Default log level for built-in console logger. It can be overwritten in logger options above.
86
89
  // Available values: trace, debug, info, warn, error, fatal
87
90
  logLevel: process.env.LOG_LEVEL || "info",
88
- // Define transporter.
89
- // More info: https://moleculer.services/docs/0.14/networking.html
90
- // Note: During the development, you don't need to define it because all services will be loaded locally.
91
- // In production you can set it via `TRANSPORTER=nats://localhost:4222` environment variable.
92
- transporter: process.env.TRANSPORT ?? "TCP", // "NATS"
91
+ // Define transporter only when explicitly requested.
92
+ // For TellyMCP gateway/client nodes we use our own WS/HTTP control plane,
93
+ // so Moleculer UDP/TCP discovery is unnecessary and only adds noisy multicast warnings.
94
+ ...(configuredTransport ? { transporter: configuredTransport } : {}),
93
95
  // Define a cacher.
94
96
  // More info: https://moleculer.services/docs/0.14/caching.html
95
97
  // cacher:false,
@@ -2,11 +2,104 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME = void 0;
4
4
  const runtime_service_1 = require("./runtime.service");
5
+ const remoteConsoleActionClient_1 = require("./src/features/distributed-gateway/model/remoteConsoleActionClient");
5
6
  const browserService_1 = require("./src/features/browser/model/browserService");
6
7
  exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME = "telegramMcp.browser";
7
8
  const TelegramMcpBrowserService = {
8
9
  name: exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME,
9
10
  dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
11
+ actions: {
12
+ openRemote: {
13
+ params: { $$strict: false },
14
+ async handler(ctx) {
15
+ return this.getBrowserService().open(ctx.params);
16
+ },
17
+ },
18
+ getConsoleRemote: {
19
+ params: { $$strict: false },
20
+ async handler(ctx) {
21
+ return this.getBrowserService().getConsole(ctx.params);
22
+ },
23
+ },
24
+ clickRemote: {
25
+ params: { $$strict: false },
26
+ async handler(ctx) {
27
+ return this.getBrowserService().click(ctx.params);
28
+ },
29
+ },
30
+ fillRemote: {
31
+ params: { $$strict: false },
32
+ async handler(ctx) {
33
+ return this.getBrowserService().fill(ctx.params);
34
+ },
35
+ },
36
+ pressRemote: {
37
+ params: { $$strict: false },
38
+ async handler(ctx) {
39
+ return this.getBrowserService().press(ctx.params);
40
+ },
41
+ },
42
+ reloadRemote: {
43
+ params: { $$strict: false },
44
+ async handler(ctx) {
45
+ return this.getBrowserService().reload(ctx.params);
46
+ },
47
+ },
48
+ waitForRemote: {
49
+ params: { $$strict: false },
50
+ async handler(ctx) {
51
+ return this.getBrowserService().waitFor(ctx.params);
52
+ },
53
+ },
54
+ waitForUrlRemote: {
55
+ params: { $$strict: false },
56
+ async handler(ctx) {
57
+ return this.getBrowserService().waitForUrl(ctx.params);
58
+ },
59
+ },
60
+ getErrorsRemote: {
61
+ params: { $$strict: false },
62
+ async handler(ctx) {
63
+ return this.getBrowserService().getErrors(ctx.params);
64
+ },
65
+ },
66
+ getNetworkFailuresRemote: {
67
+ params: { $$strict: false },
68
+ async handler(ctx) {
69
+ return this.getBrowserService().getNetworkFailures(ctx.params);
70
+ },
71
+ },
72
+ clearLogsRemote: {
73
+ params: { $$strict: false },
74
+ async handler(ctx) {
75
+ return this.getBrowserService().clearLogs(ctx.params);
76
+ },
77
+ },
78
+ getDomRemote: {
79
+ params: { $$strict: false },
80
+ async handler(ctx) {
81
+ return this.getBrowserService().getDom(ctx.params);
82
+ },
83
+ },
84
+ getComputedStyleRemote: {
85
+ params: { $$strict: false },
86
+ async handler(ctx) {
87
+ return this.getBrowserService().getComputedStyle(ctx.params);
88
+ },
89
+ },
90
+ screenshotRemote: {
91
+ params: { $$strict: false },
92
+ async handler(ctx) {
93
+ return this.getBrowserService().screenshot(ctx.params);
94
+ },
95
+ },
96
+ closeRemote: {
97
+ params: { $$strict: false },
98
+ async handler(ctx) {
99
+ return this.getBrowserService().close(ctx.params);
100
+ },
101
+ },
102
+ },
10
103
  created() {
11
104
  this.browserService = null;
12
105
  },
@@ -26,7 +119,7 @@ const TelegramMcpBrowserService = {
26
119
  }
27
120
  const runtime = await runtimeService.waitUntilReady();
28
121
  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);
122
+ this.browserService = new browserService_1.BrowserService(runtime.config, runtime.sessionStore, runtime.maintenanceStore, runtime.stateStore, runtime.stateStore, runtime.objectStore, runtime.telegramTransport, runtime.logger, runtime.projectIdentityResolver, new remoteConsoleActionClient_1.RemoteConsoleActionClient((actionName, params) => this.broker.call(actionName, params, { meta: { internal_call: true } })));
30
123
  this.logger.info("telegram_mcp browser service is ready");
31
124
  },
32
125
  async stopped() {
@@ -4,15 +4,45 @@ exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME = void 0;
4
4
  const runtime_service_1 = require("./runtime.service");
5
5
  const collaborationService_1 = require("./src/features/collaboration/model/collaborationService");
6
6
  const sendPartnerFileService_1 = require("./src/features/collaboration/model/sendPartnerFileService");
7
+ const gatewaySessionsService_1 = require("./src/features/collaboration/model/gatewaySessionsService");
7
8
  const gatewayCollaborationBackend_1 = require("./src/features/distributed-client/model/gatewayCollaborationBackend");
9
+ const remoteConsoleActionClient_1 = require("./src/features/distributed-gateway/model/remoteConsoleActionClient");
8
10
  const localCollaborationBackend_1 = require("./src/features/collaboration/model/localCollaborationBackend");
9
11
  exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME = "telegramMcp.collaboration";
10
12
  const TelegramMcpCollaborationService = {
11
13
  name: exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME,
12
14
  dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
15
+ actions: {
16
+ sendPartnerFileRemote: {
17
+ params: {
18
+ $$strict: false,
19
+ session_id: { type: "string", optional: true, trim: true, min: 1 },
20
+ target_session_id: { type: "string", optional: true, trim: true, min: 1 },
21
+ target_client_uuid: { type: "string", optional: true, trim: true, min: 1 },
22
+ target_local_session_id: { type: "string", optional: true, trim: true, min: 1 },
23
+ project_uuid: { type: "string", optional: true, trim: true, min: 1 },
24
+ cwd: { type: "string", optional: true, trim: true, min: 1 },
25
+ file_path: { type: "string", trim: true, min: 1 },
26
+ kind: {
27
+ type: "enum",
28
+ optional: true,
29
+ values: ["share", "question", "reply", "request", "handoff"],
30
+ },
31
+ summary: { type: "string", optional: true, trim: true, min: 1 },
32
+ message: { type: "string", optional: true, trim: true, min: 1 },
33
+ expected_reply: { type: "string", optional: true, trim: true, min: 1 },
34
+ requires_reply: { type: "boolean", optional: true },
35
+ in_reply_to: { type: "string", optional: true, trim: true, min: 1 },
36
+ },
37
+ async handler(ctx) {
38
+ return this.getSendPartnerFileService().send(ctx.params);
39
+ },
40
+ },
41
+ },
13
42
  created() {
14
43
  this.collaborationService = null;
15
44
  this.sendPartnerFileService = null;
45
+ this.gatewaySessionsService = null;
16
46
  },
17
47
  methods: {
18
48
  getCollaborationService() {
@@ -27,6 +57,12 @@ const TelegramMcpCollaborationService = {
27
57
  }
28
58
  return this.sendPartnerFileService;
29
59
  },
60
+ getGatewaySessionsService() {
61
+ if (!this.gatewaySessionsService) {
62
+ throw new Error("telegram_mcp gateway sessions service is not initialized yet");
63
+ }
64
+ return this.gatewaySessionsService;
65
+ },
30
66
  },
31
67
  async started() {
32
68
  await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
@@ -36,16 +72,17 @@ const TelegramMcpCollaborationService = {
36
72
  }
37
73
  const runtime = await runtimeService.waitUntilReady();
38
74
  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);
75
+ const localBackend = new localCollaborationBackend_1.LocalCollaborationBackend(runtime.config, runtime.sessionStore, runtime.stateStore, runtime.stateStore, runtime.objectStore, runtime.telegramTransport, runtime.logger);
40
76
  runtime.gatewayHttpService.setPartnerNoteRelayHandler(async (input) => {
41
77
  const resolved = runtime.projectIdentityResolver.resolveSessionDefaults(input);
42
78
  return localBackend.sendPartnerNote(input, resolved);
43
79
  });
44
80
  const backend = runtime.config.distributed.gatewayPublicUrl
45
- ? new gatewayCollaborationBackend_1.GatewayCollaborationBackend(runtime.logger, runtime.stateStore, runtime.config.distributed.gatewayPublicUrl, runtime.config.distributed.gatewayAuthToken)
81
+ ? new gatewayCollaborationBackend_1.GatewayCollaborationBackend(runtime.logger, runtime.stateStore, runtime.config.distributed.gatewayPublicUrl, runtime.config.distributed.gatewayAuthToken, runtime.config.distributed.gatewayToken, runtime.config.distributed.gatewayUserUuid, runtime.config.project.name, runtime.config.telegram.botUsername)
46
82
  : localBackend;
47
83
  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);
84
+ this.sendPartnerFileService = new sendPartnerFileService_1.SendPartnerFileService(runtime.config, runtime.sessionStore, runtime.stateStore, runtime.logger, runtime.projectIdentityResolver, this.collaborationService, new remoteConsoleActionClient_1.RemoteConsoleActionClient((actionName, params) => this.broker.call(actionName, params, { meta: { internal_call: true } })));
85
+ this.gatewaySessionsService = new gatewaySessionsService_1.GatewaySessionsService(runtime.logger, runtime.stateStore, runtime.config.distributed.gatewayPublicUrl, runtime.config.distributed.gatewayAuthToken, runtime.config.distributed.gatewayToken, runtime.config.distributed.gatewayUserUuid, runtime.config.project.name, runtime.config.telegram.botUsername);
49
86
  runtime.telegramTransport.setCollaborationService(this.collaborationService);
50
87
  this.logger.info("telegram_mcp collaboration service is ready");
51
88
  },