@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
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TELEGRAM_MCP_HTTP_SERVICE_NAME = void 0;
4
4
  const mcp_server_service_1 = require("./mcp-server.service");
5
5
  const runtime_service_1 = require("./runtime.service");
6
+ const gateway_socket_service_1 = require("./gateway-socket.service");
6
7
  const http_1 = require("./src/app/http");
7
8
  exports.TELEGRAM_MCP_HTTP_SERVICE_NAME = "telegramMcp.http";
8
9
  const TelegramMcpHttpService = {
@@ -25,6 +26,12 @@ const TelegramMcpHttpService = {
25
26
  });
26
27
  await this.httpHandler.handleRequest(req, res, pathname);
27
28
  },
29
+ async routeUpgrade(req, socket, head, pathname) {
30
+ if (!this.httpHandler) {
31
+ throw new Error("telegram_mcp HTTP handler is not initialized yet");
32
+ }
33
+ return await this.httpHandler.handleUpgrade(req, socket, head, pathname);
34
+ },
28
35
  },
29
36
  actions: {
30
37
  async route(ctx) {
@@ -56,6 +63,7 @@ const TelegramMcpHttpService = {
56
63
  this.logger.info("Starting telegram_mcp HTTP service");
57
64
  this.httpHandler = (0, http_1.createMcpHttpHandler)(runtime, {
58
65
  createMcpServer: () => mcpServerService.createServer(),
66
+ getGatewaySocketService: () => this.broker.getLocalService(gateway_socket_service_1.TELEGRAM_MCP_GATEWAY_SOCKET_SERVICE_NAME),
59
67
  });
60
68
  this.logger.info("telegram_mcp HTTP service is ready", {
61
69
  path: runtime.config.mcp.httpPath,
@@ -5,11 +5,10 @@ const server_1 = require("./src/app/providers/mcp/server");
5
5
  const approval_service_1 = require("./approval.service");
6
6
  const browser_service_1 = require("./browser.service");
7
7
  const collaboration_service_1 = require("./collaboration.service");
8
- const inbox_service_1 = require("./inbox.service");
9
8
  const notify_service_1 = require("./notify.service");
10
- const pair_service_1 = require("./pair.service");
11
9
  const session_context_service_1 = require("./session-context.service");
12
10
  const tools_sync_service_1 = require("./tools-sync.service");
11
+ const xchange_service_1 = require("./xchange.service");
13
12
  const askUserTelegram_1 = require("./src/features/ask-user/model/askUserTelegram");
14
13
  const browserClickTool_1 = require("./src/features/browser/model/browserClickTool");
15
14
  const browserClearLogsTool_1 = require("./src/features/browser/model/browserClearLogsTool");
@@ -27,66 +26,55 @@ const browserScreenshotTool_1 = require("./src/features/browser/model/browserScr
27
26
  const browserWaitForTool_1 = require("./src/features/browser/model/browserWaitForTool");
28
27
  const browserWaitForUrlTool_1 = require("./src/features/browser/model/browserWaitForUrlTool");
29
28
  const sendPartnerFileTool_1 = require("./src/features/collaboration/model/sendPartnerFileTool");
29
+ const listGatewaySessionsTool_1 = require("./src/features/collaboration/model/listGatewaySessionsTool");
30
30
  const sendPartnerNoteTool_1 = require("./src/features/collaboration/model/sendPartnerNoteTool");
31
- const deleteTelegramInboxMessageTool_1 = require("./src/features/inbox/model/deleteTelegramInboxMessageTool");
32
- const getTelegramInboxCountTool_1 = require("./src/features/inbox/model/getTelegramInboxCountTool");
33
- const getTelegramInboxTool_1 = require("./src/features/inbox/model/getTelegramInboxTool");
31
+ const sendFileToTelegramTool_1 = require("./src/features/notify/model/sendFileToTelegramTool");
34
32
  const notifyTelegramTool_1 = require("./src/features/notify/model/notifyTelegramTool");
35
- const clearSessionPairingTool_1 = require("./src/features/pair-session/model/clearSessionPairingTool");
36
- const createSessionPairCodeTool_1 = require("./src/features/pair-session/model/createSessionPairCodeTool");
37
33
  const clearSessionContextTool_1 = require("./src/features/session-context/model/clearSessionContextTool");
38
34
  const getSessionContextTool_1 = require("./src/features/session-context/model/getSessionContextTool");
39
- const getTmuxTargetTool_1 = require("./src/features/session-context/model/getTmuxTargetTool");
40
35
  const renameSessionTool_1 = require("./src/features/session-context/model/renameSessionTool");
41
36
  const setSessionContextTool_1 = require("./src/features/session-context/model/setSessionContextTool");
42
- const setTmuxTargetTool_1 = require("./src/features/session-context/model/setTmuxTargetTool");
43
37
  const refreshToolsMarkdownTool_1 = require("./src/features/tools-sync/model/refreshToolsMarkdownTool");
38
+ const getXchangeRecordTool_1 = require("./src/features/xchange/model/getXchangeRecordTool");
39
+ const listXchangeRecordsTool_1 = require("./src/features/xchange/model/listXchangeRecordsTool");
40
+ const markXchangeRecordReadTool_1 = require("./src/features/xchange/model/markXchangeRecordReadTool");
44
41
  exports.TELEGRAM_MCP_MCP_SERVER_SERVICE_NAME = "telegramMcp.mcpServer";
45
42
  const TelegramMcpMcpServerService = {
46
43
  name: exports.TELEGRAM_MCP_MCP_SERVER_SERVICE_NAME,
47
44
  dependencies: [
48
- pair_service_1.TELEGRAM_MCP_PAIR_SERVICE_NAME,
49
45
  session_context_service_1.TELEGRAM_MCP_SESSION_CONTEXT_SERVICE_NAME,
50
46
  notify_service_1.TELEGRAM_MCP_NOTIFY_SERVICE_NAME,
51
- inbox_service_1.TELEGRAM_MCP_INBOX_SERVICE_NAME,
52
47
  approval_service_1.TELEGRAM_MCP_APPROVAL_SERVICE_NAME,
53
48
  browser_service_1.TELEGRAM_MCP_BROWSER_SERVICE_NAME,
54
49
  collaboration_service_1.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME,
55
50
  tools_sync_service_1.TELEGRAM_MCP_TOOLS_SYNC_SERVICE_NAME,
51
+ xchange_service_1.TELEGRAM_MCP_XCHANGE_SERVICE_NAME,
56
52
  ],
57
53
  methods: {
58
54
  createServer() {
59
- const pairService = this.broker.getLocalService(pair_service_1.TELEGRAM_MCP_PAIR_SERVICE_NAME);
60
55
  const sessionContextService = this.broker.getLocalService(session_context_service_1.TELEGRAM_MCP_SESSION_CONTEXT_SERVICE_NAME);
61
56
  const notifyService = this.broker.getLocalService(notify_service_1.TELEGRAM_MCP_NOTIFY_SERVICE_NAME);
62
- const inboxService = this.broker.getLocalService(inbox_service_1.TELEGRAM_MCP_INBOX_SERVICE_NAME);
63
57
  const approvalService = this.broker.getLocalService(approval_service_1.TELEGRAM_MCP_APPROVAL_SERVICE_NAME);
64
58
  const browserService = this.broker.getLocalService(browser_service_1.TELEGRAM_MCP_BROWSER_SERVICE_NAME);
65
59
  const collaborationService = this.broker.getLocalService(collaboration_service_1.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME);
66
60
  const toolsSyncService = this.broker.getLocalService(tools_sync_service_1.TELEGRAM_MCP_TOOLS_SYNC_SERVICE_NAME);
67
- if (!pairService ||
68
- !sessionContextService ||
61
+ const xchangeService = this.broker.getLocalService(xchange_service_1.TELEGRAM_MCP_XCHANGE_SERVICE_NAME);
62
+ if (!sessionContextService ||
69
63
  !notifyService ||
70
- !inboxService ||
71
64
  !approvalService ||
72
65
  !browserService ||
73
66
  !collaborationService ||
74
- !toolsSyncService) {
67
+ !toolsSyncService ||
68
+ !xchangeService) {
75
69
  throw new Error("telegram_mcp MCP server dependencies are not ready");
76
70
  }
77
71
  const tools = [
78
- new createSessionPairCodeTool_1.CreateSessionPairCodeTool(pairService.getPairSessionService()),
79
- new clearSessionPairingTool_1.ClearSessionPairingTool(pairService.getPairSessionService()),
80
72
  new setSessionContextTool_1.SetSessionContextTool(sessionContextService.getSessionContextService()),
81
73
  new renameSessionTool_1.RenameSessionTool(sessionContextService.getSessionContextService()),
82
- new setTmuxTargetTool_1.SetTmuxTargetTool(sessionContextService.getSessionContextService()),
83
- new getTmuxTargetTool_1.GetTmuxTargetTool(sessionContextService.getSessionContextService()),
84
74
  new getSessionContextTool_1.GetSessionContextTool(sessionContextService.getSessionContextService()),
85
75
  new clearSessionContextTool_1.ClearSessionContextTool(sessionContextService.getSessionContextService()),
86
76
  new notifyTelegramTool_1.NotifyTelegramTool(notifyService.getNotifyService()),
87
- new getTelegramInboxCountTool_1.GetTelegramInboxCountTool(inboxService.getInboxService()),
88
- new getTelegramInboxTool_1.GetTelegramInboxTool(inboxService.getInboxService()),
89
- new deleteTelegramInboxMessageTool_1.DeleteTelegramInboxMessageTool(inboxService.getInboxService()),
77
+ new sendFileToTelegramTool_1.SendFileToTelegramTool(notifyService.getNotifyService()),
90
78
  new askUserTelegram_1.AskUserTelegramTool(approvalService.getApprovalOrchestrator()),
91
79
  new browserOpenTool_1.BrowserOpenTool(browserService.getBrowserService()),
92
80
  new browserReloadTool_1.BrowserReloadTool(browserService.getBrowserService()),
@@ -104,7 +92,11 @@ const TelegramMcpMcpServerService = {
104
92
  new browserScreenshotTool_1.BrowserScreenshotTool(browserService.getBrowserService()),
105
93
  new browserCloseTool_1.BrowserCloseTool(browserService.getBrowserService()),
106
94
  new sendPartnerNoteTool_1.SendPartnerNoteTool(collaborationService.getCollaborationService()),
95
+ new listGatewaySessionsTool_1.ListGatewaySessionsTool(collaborationService.getGatewaySessionsService()),
107
96
  new sendPartnerFileTool_1.SendPartnerFileTool(collaborationService.getSendPartnerFileService()),
97
+ new listXchangeRecordsTool_1.ListXchangeRecordsTool(xchangeService.getXchangeService()),
98
+ new getXchangeRecordTool_1.GetXchangeRecordTool(xchangeService.getXchangeService()),
99
+ new markXchangeRecordReadTool_1.MarkXchangeRecordReadTool(xchangeService.getXchangeService()),
108
100
  new refreshToolsMarkdownTool_1.RefreshToolsMarkdownTool(toolsSyncService.getRefreshToolsMarkdownService()),
109
101
  ];
110
102
  return (0, server_1.createMcpServer)(tools);
@@ -112,14 +104,13 @@ const TelegramMcpMcpServerService = {
112
104
  },
113
105
  async started() {
114
106
  await this.broker.waitForServices([
115
- pair_service_1.TELEGRAM_MCP_PAIR_SERVICE_NAME,
116
107
  session_context_service_1.TELEGRAM_MCP_SESSION_CONTEXT_SERVICE_NAME,
117
108
  notify_service_1.TELEGRAM_MCP_NOTIFY_SERVICE_NAME,
118
- inbox_service_1.TELEGRAM_MCP_INBOX_SERVICE_NAME,
119
109
  approval_service_1.TELEGRAM_MCP_APPROVAL_SERVICE_NAME,
120
110
  browser_service_1.TELEGRAM_MCP_BROWSER_SERVICE_NAME,
121
111
  collaboration_service_1.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME,
122
112
  tools_sync_service_1.TELEGRAM_MCP_TOOLS_SYNC_SERVICE_NAME,
113
+ xchange_service_1.TELEGRAM_MCP_XCHANGE_SERVICE_NAME,
123
114
  ]);
124
115
  this.logger.info("telegram_mcp MCP server service is ready");
125
116
  },
@@ -2,11 +2,137 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TELEGRAM_MCP_NOTIFY_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 notifyService_1 = require("./src/features/notify/model/notifyService");
6
7
  exports.TELEGRAM_MCP_NOTIFY_SERVICE_NAME = "telegramMcp.notify";
7
8
  const TelegramMcpNotifyService = {
8
9
  name: exports.TELEGRAM_MCP_NOTIFY_SERVICE_NAME,
9
10
  dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
11
+ actions: {
12
+ sendForGatewaySession: {
13
+ params: {
14
+ client_uuid: "string",
15
+ local_session_id: "string",
16
+ message: "string",
17
+ session_label: { type: "string", optional: true },
18
+ task: { type: "string", optional: true },
19
+ context: { type: "string", optional: true },
20
+ risk_level: { type: "string", optional: true },
21
+ },
22
+ async handler(ctx) {
23
+ const service = this.getNotifyService();
24
+ return service.sendForGatewayBoundSession({
25
+ clientUuid: String(ctx.params.client_uuid),
26
+ localSessionId: String(ctx.params.local_session_id),
27
+ message: String(ctx.params.message),
28
+ ...(typeof ctx.params.session_label === "string"
29
+ ? { sessionLabel: ctx.params.session_label }
30
+ : {}),
31
+ ...(typeof ctx.params.task === "string" ? { task: ctx.params.task } : {}),
32
+ ...(typeof ctx.params.context === "string"
33
+ ? { context: ctx.params.context }
34
+ : {}),
35
+ ...(typeof ctx.params.risk_level === "string"
36
+ ? { riskLevel: ctx.params.risk_level }
37
+ : {}),
38
+ });
39
+ },
40
+ },
41
+ sendRequestForGatewaySession: {
42
+ params: {
43
+ client_uuid: "string",
44
+ local_session_id: "string",
45
+ request_id: "string",
46
+ telegram_chat_id: "number",
47
+ telegram_user_id: "number",
48
+ question: "string",
49
+ session_label: { type: "string", optional: true },
50
+ task: { type: "string", optional: true },
51
+ context: { type: "string", optional: true },
52
+ affected_files: { type: "array", optional: true, items: "string" },
53
+ options: { type: "array", optional: true, items: "string" },
54
+ recommended_option: { type: "string", optional: true },
55
+ risk_level: { type: "string", optional: true },
56
+ fallback_if_timeout: { type: "string", optional: true },
57
+ },
58
+ async handler(ctx) {
59
+ const service = this.getNotifyService();
60
+ return service.sendRequestForGatewayBoundSession({
61
+ clientUuid: String(ctx.params.client_uuid),
62
+ localSessionId: String(ctx.params.local_session_id),
63
+ requestId: String(ctx.params.request_id),
64
+ telegramChatId: Number(ctx.params.telegram_chat_id),
65
+ telegramUserId: Number(ctx.params.telegram_user_id),
66
+ question: String(ctx.params.question),
67
+ ...(typeof ctx.params.session_label === "string"
68
+ ? { sessionLabel: ctx.params.session_label }
69
+ : {}),
70
+ ...(typeof ctx.params.task === "string" ? { task: ctx.params.task } : {}),
71
+ ...(typeof ctx.params.context === "string"
72
+ ? { context: ctx.params.context }
73
+ : {}),
74
+ ...(Array.isArray(ctx.params.affected_files)
75
+ ? { affectedFiles: ctx.params.affected_files }
76
+ : {}),
77
+ ...(Array.isArray(ctx.params.options)
78
+ ? { options: ctx.params.options }
79
+ : {}),
80
+ ...(typeof ctx.params.recommended_option === "string"
81
+ ? { recommendedOption: ctx.params.recommended_option }
82
+ : {}),
83
+ ...(typeof ctx.params.risk_level === "string"
84
+ ? { riskLevel: ctx.params.risk_level }
85
+ : {}),
86
+ ...(typeof ctx.params.fallback_if_timeout === "string"
87
+ ? { fallbackIfTimeout: ctx.params.fallback_if_timeout }
88
+ : {}),
89
+ });
90
+ },
91
+ },
92
+ sendDocumentForGatewaySession: {
93
+ params: {
94
+ client_uuid: "string",
95
+ local_session_id: "string",
96
+ file_name: "string",
97
+ content_base64: "string",
98
+ caption: { type: "string", optional: true },
99
+ },
100
+ async handler(ctx) {
101
+ const service = this.getNotifyService();
102
+ return service.sendDocumentForGatewayBoundSession({
103
+ clientUuid: String(ctx.params.client_uuid),
104
+ localSessionId: String(ctx.params.local_session_id),
105
+ fileName: String(ctx.params.file_name),
106
+ contentBase64: String(ctx.params.content_base64),
107
+ ...(typeof ctx.params.caption === "string"
108
+ ? { caption: ctx.params.caption }
109
+ : {}),
110
+ });
111
+ },
112
+ },
113
+ sendDocumentRemote: {
114
+ params: {
115
+ $$strict: false,
116
+ session_id: { type: "string", optional: true },
117
+ cwd: { type: "string", optional: true },
118
+ file_path: "string",
119
+ caption: { type: "string", optional: true },
120
+ },
121
+ async handler(ctx) {
122
+ const service = this.getNotifyService();
123
+ return service.sendDocument({
124
+ ...(typeof ctx.params.session_id === "string"
125
+ ? { session_id: ctx.params.session_id }
126
+ : {}),
127
+ ...(typeof ctx.params.cwd === "string" ? { cwd: ctx.params.cwd } : {}),
128
+ file_path: String(ctx.params.file_path),
129
+ ...(typeof ctx.params.caption === "string"
130
+ ? { caption: ctx.params.caption }
131
+ : {}),
132
+ });
133
+ },
134
+ },
135
+ },
10
136
  created() {
11
137
  this.notifyService = null;
12
138
  },
@@ -26,7 +152,7 @@ const TelegramMcpNotifyService = {
26
152
  }
27
153
  const runtime = await runtimeService.waitUntilReady();
28
154
  this.logger.info("Starting telegram_mcp notify service");
29
- this.notifyService = new notifyService_1.NotifyService(runtime.config, runtime.stateStore, runtime.stateStore, runtime.telegramTransport, runtime.logger, runtime.projectIdentityResolver);
155
+ this.notifyService = new notifyService_1.NotifyService(runtime.config, runtime.sessionStore, runtime.stateStore, runtime.stateStore, runtime.telegramTransport, runtime.logger, runtime.projectIdentityResolver, new remoteConsoleActionClient_1.RemoteConsoleActionClient((actionName, params) => this.broker.call(actionName, params, { meta: { internal_call: true } })), async (sessionId) => (await this.broker.call("telegramMcp.gatewaySocket.resolveConnectedSessionTarget", { sessionId }, { meta: { internal_call: true } })));
30
156
  this.logger.info("telegram_mcp notify service is ready");
31
157
  },
32
158
  };
@@ -2,11 +2,38 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TELEGRAM_MCP_SESSION_CONTEXT_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 sessionContextService_1 = require("./src/features/session-context/model/sessionContextService");
6
7
  exports.TELEGRAM_MCP_SESSION_CONTEXT_SERVICE_NAME = "telegramMcp.sessionContext";
7
8
  const TelegramMcpSessionContextService = {
8
9
  name: exports.TELEGRAM_MCP_SESSION_CONTEXT_SERVICE_NAME,
9
10
  dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
11
+ actions: {
12
+ getContextRemote: {
13
+ params: { $$strict: false },
14
+ async handler(ctx) {
15
+ return this.getSessionContextService().getContext(ctx.params);
16
+ },
17
+ },
18
+ setContextRemote: {
19
+ params: { $$strict: false },
20
+ async handler(ctx) {
21
+ return this.getSessionContextService().setContext(ctx.params);
22
+ },
23
+ },
24
+ renameSessionRemote: {
25
+ params: { $$strict: false },
26
+ async handler(ctx) {
27
+ return this.getSessionContextService().renameSession(ctx.params);
28
+ },
29
+ },
30
+ clearContextRemote: {
31
+ params: { $$strict: false },
32
+ async handler(ctx) {
33
+ return this.getSessionContextService().clearContext(ctx.params);
34
+ },
35
+ },
36
+ },
10
37
  created() {
11
38
  this.sessionContextService = null;
12
39
  },
@@ -26,7 +53,7 @@ const TelegramMcpSessionContextService = {
26
53
  }
27
54
  const runtime = await runtimeService.waitUntilReady();
28
55
  this.logger.info("Starting telegram_mcp session-context service");
29
- this.sessionContextService = new sessionContextService_1.SessionContextService(runtime.stateStore, runtime.stateStore, runtime.logger, runtime.projectIdentityResolver);
56
+ this.sessionContextService = new sessionContextService_1.SessionContextService(runtime.sessionStore, runtime.stateStore, runtime.logger, runtime.projectIdentityResolver, new remoteConsoleActionClient_1.RemoteConsoleActionClient((actionName, params) => this.broker.call(actionName, params, { meta: { internal_call: true } })));
30
57
  this.logger.info("telegram_mcp session-context service is ready");
31
58
  },
32
59
  };
@@ -7,9 +7,13 @@ const client_1 = require("../providers/redis/client");
7
7
  const logger_1 = require("../../shared/lib/logger/logger");
8
8
  const projectIdentity_1 = require("../../shared/lib/project-identity/projectIdentity");
9
9
  const stateStore_1 = require("../../shared/integrations/redis/stateStore");
10
+ const processLocalSessionStore_1 = require("../../shared/integrations/memory/processLocalSessionStore");
10
11
  const transport_1 = require("../../shared/integrations/telegram/transport");
11
12
  const minioExchangeStore_1 = require("../../shared/integrations/object-storage/minioExchangeStore");
12
13
  const gatewayHttpService_1 = require("../../features/distributed-gateway/model/gatewayHttpService");
14
+ const gatewayClientAccess_1 = require("../../features/distributed-client/model/gatewayClientAccess");
15
+ const client_2 = require("../../shared/integrations/terminal/client");
16
+ const ptyRegistry_1 = require("../../shared/integrations/terminal/ptyRegistry");
13
17
  async function createAppRuntime(input) {
14
18
  const config = (0, env_1.loadConfig)();
15
19
  const logger = (0, logger_1.createLogger)(config);
@@ -54,10 +58,16 @@ async function createAppRuntime(input) {
54
58
  pollIntervalMs: config.webapp.pollIntervalMs,
55
59
  actionCooldownMs: config.webapp.actionCooldownMs,
56
60
  },
57
- tmux: {
58
- nudgeEnabled: config.tmux.nudgeEnabled,
59
- nudgeDebounceSeconds: config.tmux.nudgeDebounceSeconds,
60
- nudgeCooldownSeconds: config.tmux.nudgeCooldownSeconds,
61
+ terminal: {
62
+ nudgeEnabled: config.terminal.nudgeEnabled,
63
+ nudgeDebounceSeconds: config.terminal.nudgeDebounceSeconds,
64
+ nudgeCooldownSeconds: config.terminal.nudgeCooldownSeconds,
65
+ },
66
+ telegram: {
67
+ webhookEnabled: config.telegram.webhook.enabled,
68
+ webhookPath: config.telegram.webhook.path,
69
+ webhookPublicUrlConfigured: Boolean(config.telegram.webhook.publicUrl),
70
+ webhookTrace: config.telegram.webhook.trace,
61
71
  },
62
72
  project: projectIdentityResolver.getIdentity(),
63
73
  });
@@ -68,27 +78,138 @@ async function createAppRuntime(input) {
68
78
  db: config.redis.db,
69
79
  });
70
80
  const stateStore = new stateStore_1.RedisStateStore(redis);
81
+ let sessionStore = stateStore;
71
82
  const webAppLaunchRegistry = new auth_1.WebAppLaunchRegistry();
72
- const objectStore = new minioExchangeStore_1.MinioExchangeStore(input.callBroker, stateStore, config.tmux, config.exchange.dir, config.mcp.vfsScope, logger, config.distributed.mode, config.distributed.gatewayPublicUrl, config.distributed.gatewayAuthToken);
83
+ const objectStore = new minioExchangeStore_1.MinioExchangeStore(input.callBroker, stateStore, config.terminal, config.exchange.dir, config.mcp.vfsScope, logger, config.distributed.mode, config.distributed.gatewayPublicUrl, config.distributed.gatewayAuthToken);
84
+ if (config.distributed.mode === "client") {
85
+ const resolvedSession = projectIdentityResolver.resolveSessionDefaults({
86
+ cwd: process.cwd(),
87
+ });
88
+ const existingSession = await stateStore.getSession(resolvedSession.sessionId);
89
+ const persistedToolsState = (0, projectIdentity_1.readSessionMarkerState)(resolvedSession.cwd, logger);
90
+ const terminalTarget = (0, client_2.ensureTerminalTargetForSession)(config.terminal, {
91
+ sessionId: resolvedSession.sessionId,
92
+ cwd: resolvedSession.cwd,
93
+ ...(typeof existingSession?.terminalTarget === "string"
94
+ ? { target: existingSession.terminalTarget }
95
+ : {}),
96
+ });
97
+ if (!terminalTarget) {
98
+ throw new Error("PTY terminal target could not be created during runtime bootstrap");
99
+ }
100
+ const initialSession = {
101
+ sessionId: resolvedSession.sessionId,
102
+ ...(typeof existingSession?.label === "string"
103
+ ? { label: existingSession.label }
104
+ : { label: resolvedSession.sessionLabel }),
105
+ ...(typeof existingSession?.cwd === "string"
106
+ ? { cwd: existingSession.cwd }
107
+ : { cwd: resolvedSession.cwd }),
108
+ ...(typeof existingSession?.activeProjectUuid === "string"
109
+ ? { activeProjectUuid: existingSession.activeProjectUuid }
110
+ : {}),
111
+ ...(typeof existingSession?.activeProjectName === "string"
112
+ ? { activeProjectName: existingSession.activeProjectName }
113
+ : {}),
114
+ ...(typeof existingSession?.task === "string"
115
+ ? { task: existingSession.task }
116
+ : {}),
117
+ ...(typeof existingSession?.summary === "string"
118
+ ? { summary: existingSession.summary }
119
+ : {}),
120
+ ...(Array.isArray(existingSession?.files)
121
+ ? { files: existingSession.files }
122
+ : {}),
123
+ ...(Array.isArray(existingSession?.decisions)
124
+ ? { decisions: existingSession.decisions }
125
+ : {}),
126
+ ...(Array.isArray(existingSession?.risks)
127
+ ? { risks: existingSession.risks }
128
+ : {}),
129
+ terminalTarget: terminalTarget,
130
+ ...(typeof existingSession?.lastTerminalNudgeAt === "string"
131
+ ? { lastTerminalNudgeAt: existingSession.lastTerminalNudgeAt }
132
+ : {}),
133
+ ...(typeof existingSession?.lastSeenToolsHash === "string"
134
+ ? { lastSeenToolsHash: existingSession.lastSeenToolsHash }
135
+ : typeof persistedToolsState?.lastSeenToolsHash === "string"
136
+ ? { lastSeenToolsHash: persistedToolsState.lastSeenToolsHash }
137
+ : {}),
138
+ ...(typeof existingSession?.lastNotifiedToolsHash === "string"
139
+ ? { lastNotifiedToolsHash: existingSession.lastNotifiedToolsHash }
140
+ : typeof persistedToolsState?.lastNotifiedToolsHash === "string"
141
+ ? { lastNotifiedToolsHash: persistedToolsState.lastNotifiedToolsHash }
142
+ : {}),
143
+ updatedAt: new Date().toISOString(),
144
+ };
145
+ sessionStore = new processLocalSessionStore_1.ProcessLocalSessionStore({
146
+ initialSessions: [initialSession],
147
+ onClearSession: async (sessionId) => {
148
+ await stateStore.clearSession(sessionId);
149
+ },
150
+ });
151
+ logger.info("Client PTY process-local session store initialized", {
152
+ sessionId: resolvedSession.sessionId,
153
+ terminalTarget,
154
+ });
155
+ }
73
156
  await stateStore.resetRuntimeState();
74
157
  logger.info("Runtime pending state reset");
75
- const telegramTransport = new transport_1.TelegramTransport(config, stateStore, stateStore, stateStore, stateStore, stateStore, stateStore, stateStore, objectStore, webAppLaunchRegistry, logger);
158
+ if (config.distributed.mode === "client" && config.distributed.gatewayPublicUrl) {
159
+ const clientUuid = await (0, gatewayClientAccess_1.ensureGatewayClientUuid)({
160
+ maintenanceStore: stateStore,
161
+ gatewayPublicUrl: config.distributed.gatewayPublicUrl,
162
+ ...(config.distributed.gatewayAuthToken
163
+ ? { gatewayAuthToken: config.distributed.gatewayAuthToken }
164
+ : {}),
165
+ ...(config.project.name ? { projectName: config.project.name } : {}),
166
+ ...(config.telegram.botUsername ? { botUsername: config.telegram.botUsername } : {}),
167
+ ...(config.distributed.gatewayToken
168
+ ? { gatewayToken: config.distributed.gatewayToken }
169
+ : {}),
170
+ ...(config.distributed.gatewayUserUuid
171
+ ? { gatewayUserUuid: config.distributed.gatewayUserUuid }
172
+ : {}),
173
+ ...(process.env.NAMESPACE?.trim()
174
+ ? { namespace: process.env.NAMESPACE.trim() }
175
+ : {}),
176
+ ...(process.env.NODE_ID?.trim() ? { nodeId: process.env.NODE_ID.trim() } : {}),
177
+ });
178
+ logger.info("Gateway client identity ensured", {
179
+ clientUuid,
180
+ gatewayPublicUrl: config.distributed.gatewayPublicUrl,
181
+ });
182
+ }
183
+ const sessions = await sessionStore.listSessions();
184
+ let recoveredCount = 0;
185
+ for (const session of sessions) {
186
+ if (!session.terminalTarget?.startsWith("pty:")) {
187
+ continue;
188
+ }
189
+ (0, client_2.ensureTerminalTargetForSession)(config.terminal, {
190
+ sessionId: session.sessionId,
191
+ ...(session.cwd ? { cwd: session.cwd } : {}),
192
+ target: session.terminalTarget,
193
+ });
194
+ recoveredCount += 1;
195
+ }
196
+ logger.info("PTY terminal sessions recovered", { recoveredCount });
197
+ const telegramTransport = new transport_1.TelegramTransport(config, sessionStore, stateStore, stateStore, stateStore, stateStore, stateStore, stateStore, objectStore, webAppLaunchRegistry, logger);
76
198
  await telegramTransport.start();
77
199
  logger.info("Telegram transport ready");
78
- await telegramTransport.recoverPendingInboxNudges();
79
- logger.info("Startup inbox nudge recovery completed");
80
200
  await telegramTransport.sendStartupNotifications();
81
201
  logger.info("Startup Telegram notifications completed");
82
202
  const gatewayHttpService = new gatewayHttpService_1.GatewayHttpService(config, input.callBroker);
83
203
  return {
204
+ callBroker: input.callBroker,
84
205
  config,
85
206
  logger,
86
207
  redis,
87
208
  stateStore,
88
209
  telegramTransport,
89
- sessionStore: stateStore,
210
+ sessionStore,
90
211
  bindingStore: stateStore,
91
- inboxStore: stateStore,
212
+ adminAuthStore: stateStore,
92
213
  localeStore: stateStore,
93
214
  xchangeFileMetaStore: stateStore,
94
215
  maintenanceStore: stateStore,
@@ -99,6 +220,7 @@ async function createAppRuntime(input) {
99
220
  shutdown: async () => {
100
221
  logger.info("Shutdown started");
101
222
  await telegramTransport.stop();
223
+ (0, ptyRegistry_1.stopAllPtyTargets)();
102
224
  redis.disconnect();
103
225
  logger.info("Shutdown completed");
104
226
  },