@deadragdoll/tellymcp 0.0.9 → 0.0.11

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 (157) hide show
  1. package/.env.example.client +42 -50
  2. package/.env.example.gateway +49 -61
  3. package/CHANGELOG.md +3 -3
  4. package/README-ru.md +205 -384
  5. package/README.md +195 -1194
  6. package/TOOLS.md +294 -377
  7. package/VERSION.md +36 -10
  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 +40 -20
  15. package/config/templates/env.client.template +34 -18
  16. package/config/templates/env.gateway.template +38 -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/approval.service.js +1 -1
  23. package/dist/services/features/telegram-mcp/browser.service.js +95 -2
  24. package/dist/services/features/telegram-mcp/collaboration.service.js +41 -4
  25. package/dist/services/features/telegram-mcp/ensuredb.service.js +145 -26
  26. package/dist/services/features/telegram-mcp/gateway-delivery.service.js +285 -103
  27. package/dist/services/features/telegram-mcp/gateway-rmq.service.js +3 -2
  28. package/dist/services/features/telegram-mcp/gateway-socket.service.js +905 -87
  29. package/dist/services/features/telegram-mcp/gateway.service.js +876 -81
  30. package/dist/services/features/telegram-mcp/mcp-http.service.js +9 -1
  31. package/dist/services/features/telegram-mcp/mcp-server.service.js +17 -26
  32. package/dist/services/features/telegram-mcp/notify.service.js +128 -2
  33. package/dist/services/features/telegram-mcp/runtime.service.js +27 -7
  34. package/dist/services/features/telegram-mcp/session-context.service.js +29 -2
  35. package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +133 -10
  36. package/dist/services/features/telegram-mcp/src/app/config/env.js +161 -51
  37. package/dist/services/features/telegram-mcp/src/app/http.js +375 -42
  38. package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +386 -58
  39. package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +3 -0
  40. package/dist/services/features/telegram-mcp/src/app/webapp/terminal.js +12 -0
  41. package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +116 -104
  42. package/dist/services/features/telegram-mcp/src/entities/xchange/model/types.js +2 -0
  43. package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +1 -1
  44. package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +1 -1
  45. package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +249 -19
  46. package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +71 -0
  47. package/dist/services/features/telegram-mcp/src/features/collaboration/model/listGatewaySessionsTool.js +33 -0
  48. package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +93 -82
  49. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +47 -5
  50. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +1 -1
  51. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +1 -1
  52. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +82 -0
  53. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +22 -14
  54. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +649 -75
  55. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +76 -0
  56. package/dist/services/features/telegram-mcp/src/features/embedded-runtime/model/embeddedRuntimeBroker.js +92 -0
  57. package/dist/services/features/telegram-mcp/src/features/foreground-terminal/model/foregroundTerminalRuntime.js +192 -0
  58. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +382 -3
  59. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +1 -1
  60. package/dist/services/features/telegram-mcp/src/features/notify/model/sendFileToTelegramTool.js +33 -0
  61. package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +1 -1
  62. package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +1 -1
  63. package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +1 -1
  64. package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +42 -200
  65. package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +1 -1
  66. package/dist/services/features/telegram-mcp/src/features/terminal-buffer/model/terminalBufferService.js +96 -0
  67. package/dist/services/features/telegram-mcp/src/features/terminal-input/model/terminalInputService.js +97 -0
  68. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +107 -58
  69. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +1 -1
  70. package/dist/services/features/telegram-mcp/src/features/xchange/model/getXchangeRecordTool.js +28 -0
  71. package/dist/services/features/telegram-mcp/src/features/xchange/model/listXchangeRecordsTool.js +28 -0
  72. package/dist/services/features/telegram-mcp/src/features/xchange/model/markXchangeRecordReadTool.js +28 -0
  73. package/dist/services/features/telegram-mcp/src/features/xchange/model/xchangeService.js +169 -0
  74. package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +5 -4
  75. package/dist/services/features/telegram-mcp/src/shared/i18n/index.js +46 -0
  76. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/en.js +652 -0
  77. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/ru.js +652 -0
  78. package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalSessionStore.js +27 -0
  79. package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +11 -8
  80. package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +51 -71
  81. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +21 -22
  82. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +411 -6524
  83. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportAttachmentStore.js +93 -0
  84. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportBroadcastActions.js +385 -0
  85. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +143 -0
  86. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConstructorWiring.js +633 -0
  87. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContent.js +84 -0
  88. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContext.js +78 -0
  89. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportDocumentActions.js +36 -0
  90. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportEventActions.js +292 -0
  91. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFileHandoffActions.js +352 -0
  92. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFormatting.js +75 -0
  93. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportGatewayActions.js +44 -0
  94. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLifecycleActions.js +161 -0
  95. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLive.js +56 -0
  96. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLiveActions.js +77 -0
  97. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuCallbacks.js +254 -0
  98. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFactories.js +538 -0
  99. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFingerprints.js +93 -0
  100. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFlow.js +344 -0
  101. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuShell.js +62 -0
  102. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuState.js +408 -0
  103. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuText.js +216 -0
  104. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +452 -0
  105. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportOutputActions.js +189 -0
  106. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPartnerActions.js +286 -0
  107. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPayloadState.js +101 -0
  108. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectActions.js +463 -0
  109. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEntryActions.js +202 -0
  110. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEvents.js +99 -0
  111. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectMenus.js +138 -0
  112. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +308 -0
  113. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectView.js +426 -0
  114. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportRequestFlow.js +278 -0
  115. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportSessionActions.js +143 -0
  116. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalActions.js +468 -0
  117. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalRuntime.js +171 -0
  118. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTypes.js +2 -0
  119. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportUtils.js +330 -0
  120. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportXchangeState.js +107 -0
  121. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/client.js +255 -0
  122. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/ptyRegistry.js +543 -0
  123. package/dist/services/features/telegram-mcp/src/shared/integrations/xchange/sqliteRecordStore.js +223 -0
  124. package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +24 -0
  125. package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +6 -0
  126. package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +147 -76
  127. package/dist/services/features/telegram-mcp/src/shared/lib/telegramXchangeRecords.js +72 -0
  128. package/dist/services/features/telegram-mcp/src/shared/lib/terminalPromptDetection.js +237 -0
  129. package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +129 -1
  130. package/dist/services/features/telegram-mcp/src/shared/lib/xchangeRecordHints.js +98 -0
  131. package/dist/services/features/telegram-mcp/standalone-http.service.js +13 -1
  132. package/dist/services/features/telegram-mcp/terminal-buffer.service.js +42 -0
  133. package/dist/services/features/telegram-mcp/terminal-input.service.js +41 -0
  134. package/dist/services/features/telegram-mcp/tools-sync.service.js +16 -2
  135. package/dist/services/features/telegram-mcp/xchange.service.js +123 -0
  136. package/docs/STANDALONE-ru.md +172 -0
  137. package/docs/STANDALONE.md +172 -0
  138. package/package.json +11 -5
  139. package/scripts/build-package-artifact.sh +27 -0
  140. package/scripts/deploy-gateway.sh +64 -0
  141. package/scripts/deploy-onebot-branch.sh +27 -0
  142. package/scripts/postinstall.js +11 -36
  143. package/STANDALONE-ru.md +0 -274
  144. package/STANDALONE.md +0 -274
  145. package/dist/services/features/telegram-mcp/inbox.service.js +0 -33
  146. package/dist/services/features/telegram-mcp/pair.service.js +0 -33
  147. package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +0 -10
  148. package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +0 -33
  149. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +0 -33
  150. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +0 -33
  151. package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +0 -77
  152. package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +0 -33
  153. package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +0 -33
  154. package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +0 -202
  155. package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +0 -33
  156. package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +0 -33
  157. package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +0 -363
@@ -0,0 +1,123 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TELEGRAM_MCP_XCHANGE_SERVICE_NAME = void 0;
4
+ const runtime_service_1 = require("./runtime.service");
5
+ const remoteConsoleActionClient_1 = require("./src/features/distributed-gateway/model/remoteConsoleActionClient");
6
+ const xchangeService_1 = require("./src/features/xchange/model/xchangeService");
7
+ exports.TELEGRAM_MCP_XCHANGE_SERVICE_NAME = "telegramMcp.xchange";
8
+ const TelegramMcpXchangeService = {
9
+ name: exports.TELEGRAM_MCP_XCHANGE_SERVICE_NAME,
10
+ dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
11
+ actions: {
12
+ listRecordsRemote: {
13
+ params: {
14
+ $$strict: false,
15
+ session_id: { type: "string", optional: true, trim: true, min: 1 },
16
+ status: {
17
+ type: "enum",
18
+ optional: true,
19
+ values: ["new", "read", "archived"],
20
+ },
21
+ category: {
22
+ type: "enum",
23
+ optional: true,
24
+ values: [
25
+ "partner_note",
26
+ "local_handoff",
27
+ "telegram_message",
28
+ ],
29
+ },
30
+ direction: {
31
+ type: "enum",
32
+ optional: true,
33
+ values: ["incoming", "outgoing", "local"],
34
+ },
35
+ limit: { type: "number", integer: true, positive: true, optional: true },
36
+ },
37
+ async handler(ctx) {
38
+ return this.getXchangeService().listRecords(ctx.params);
39
+ },
40
+ },
41
+ getRecordRemote: {
42
+ params: {
43
+ $$strict: false,
44
+ session_id: { type: "string", optional: true, trim: true, min: 1 },
45
+ record_id: { type: "string", trim: true, min: 1 },
46
+ },
47
+ async handler(ctx) {
48
+ return this.getXchangeService().getRecord(ctx.params);
49
+ },
50
+ },
51
+ markReadRemote: {
52
+ params: {
53
+ $$strict: false,
54
+ session_id: { type: "string", optional: true, trim: true, min: 1 },
55
+ record_id: { type: "string", trim: true, min: 1 },
56
+ },
57
+ async handler(ctx) {
58
+ return this.getXchangeService().markRead(ctx.params);
59
+ },
60
+ },
61
+ listFileMetasRemote: {
62
+ params: {
63
+ $$strict: false,
64
+ session_id: { type: "string", optional: true, trim: true, min: 1 },
65
+ source: {
66
+ type: "enum",
67
+ optional: true,
68
+ values: [
69
+ "telegram-upload",
70
+ "browser-screenshot",
71
+ "partner-artifact",
72
+ ],
73
+ },
74
+ },
75
+ async handler(ctx) {
76
+ return this.getXchangeService().listFileMetas(ctx.params);
77
+ },
78
+ },
79
+ getFileMetaRemote: {
80
+ params: {
81
+ $$strict: false,
82
+ session_id: { type: "string", optional: true, trim: true, min: 1 },
83
+ file_path: { type: "string", trim: true, min: 1 },
84
+ },
85
+ async handler(ctx) {
86
+ return this.getXchangeService().getFileMeta(ctx.params);
87
+ },
88
+ },
89
+ deleteFileMetaRemote: {
90
+ params: {
91
+ $$strict: false,
92
+ session_id: { type: "string", optional: true, trim: true, min: 1 },
93
+ file_path: { type: "string", trim: true, min: 1 },
94
+ },
95
+ async handler(ctx) {
96
+ return this.getXchangeService().deleteFileMeta(ctx.params);
97
+ },
98
+ },
99
+ },
100
+ created() {
101
+ this.xchangeService = null;
102
+ },
103
+ methods: {
104
+ getXchangeService() {
105
+ if (!this.xchangeService) {
106
+ throw new Error("telegram_mcp xchange service is not initialized yet");
107
+ }
108
+ return this.xchangeService;
109
+ },
110
+ },
111
+ async started() {
112
+ await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
113
+ const runtimeService = this.broker.getLocalService(runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME);
114
+ if (!runtimeService) {
115
+ throw new Error(`Local Moleculer service '${runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME}' is unavailable`);
116
+ }
117
+ const runtime = await runtimeService.waitUntilReady();
118
+ this.logger.info("Starting telegram_mcp xchange service");
119
+ this.xchangeService = new xchangeService_1.XchangeService(runtime.config, runtime.sessionStore, runtime.stateStore, runtime.stateStore, runtime.logger, runtime.projectIdentityResolver, new remoteConsoleActionClient_1.RemoteConsoleActionClient((actionName, params) => this.broker.call(actionName, params, { meta: { internal_call: true } })));
120
+ this.logger.info("telegram_mcp xchange service is ready");
121
+ },
122
+ };
123
+ exports.default = TelegramMcpXchangeService;
@@ -0,0 +1,172 @@
1
+ <div align="center">
2
+
3
+ # Standalone Deployment
4
+
5
+ **Развёртывание TellyMCP как одного gateway и одной или нескольких agent-консолей**
6
+
7
+ [English](./STANDALONE.md) · [Русский](./STANDALONE-ru.md) · [Main README](../README.md) · [README RU](../README-ru.md)
8
+
9
+ [![npm version](https://img.shields.io/npm/v/@deadragdoll/tellymcp.svg)](https://www.npmjs.com/package/@deadragdoll/tellymcp)
10
+ [![node](https://img.shields.io/badge/node-%3E%3D24-339933.svg)](https://nodejs.org/)
11
+ [![gateway mode](https://img.shields.io/badge/deploy-gateway%20%2B%20agents-1f6feb.svg)](../README-ru.md#текущая-модель)
12
+ [![telegram webhook](https://img.shields.io/badge/telegram-webhook%20ready-26A5E4.svg)](../README-ru.md#webhook)
13
+
14
+ </div>
15
+
16
+ Этот файл описывает текущую standalone-модель для `@deadragdoll/tellymcp`.
17
+
18
+ Рекомендуемая топология:
19
+
20
+ - один gateway node
21
+ - одна или несколько agent nodes
22
+ - один общий Telegram-бот на gateway
23
+
24
+ ## 1. Установка
25
+
26
+ ```bash
27
+ npm install -g @deadragdoll/tellymcp
28
+ ```
29
+
30
+ Опционально:
31
+
32
+ ```bash
33
+ tellymcp browser install
34
+ tellymcp codex-plugin install
35
+ ```
36
+
37
+ ## 2. Инфраструктура
38
+
39
+ Для gateway обязательно:
40
+
41
+ - Redis
42
+ - PostgreSQL
43
+
44
+ Опционально:
45
+
46
+ - RabbitMQ
47
+
48
+ ## 3. Gateway Env
49
+
50
+ Стартовая точка:
51
+
52
+ - [.env.example.gateway](../.env.example.gateway)
53
+
54
+ Минимально нужные параметры gateway:
55
+
56
+ ```env
57
+ TELEGRAM_BOT_TOKEN=
58
+ REDIS_HOST=127.0.0.1
59
+ DB_HOST=127.0.0.1
60
+ DB_USER=
61
+ DB_PASSWORD=
62
+ DB_NAME=
63
+ GATEWAY_PUBLIC_URL=https://your-domain.example/api/gateway
64
+ GATEWAY_WS_URL=wss://your-domain.example/api/gateway/ws
65
+ GATEWAY_TOKEN=change_me_gateway_token
66
+ ROOT_PREFIX=/api
67
+ PORT=8080
68
+ DISTRIBUTED_MODE=gateway
69
+ ```
70
+
71
+ ## 4. Agent Env
72
+
73
+ Стартовая точка:
74
+
75
+ - [.env.example.client](../.env.example.client)
76
+
77
+ Минимально нужные параметры agent:
78
+
79
+ ```env
80
+ DISTRIBUTED_MODE=client
81
+ GATEWAY_PUBLIC_URL=https://your-domain.example/api/gateway
82
+ GATEWAY_WS_URL=wss://your-domain.example/api/gateway/ws
83
+ GATEWAY_TOKEN=change_me_gateway_token
84
+ GATEWAY_USER_UUID=put_owner_uuid_here
85
+ ```
86
+
87
+ Для первого запуска также желательно задать:
88
+
89
+ ```env
90
+ TELLYMCP_SESSION_ID=NEW
91
+ TELLYMCP_SESSION_LABEL=NEW
92
+ ```
93
+
94
+ ## 5. Запуск
95
+
96
+ Gateway:
97
+
98
+ ```bash
99
+ tellymcp run --env .env
100
+ ```
101
+
102
+ Agent:
103
+
104
+ ```bash
105
+ tellymcp run --env .env -s NEW
106
+ ```
107
+
108
+ После того как в workspace появится `.mcpsession.json`, дальше обычно достаточно:
109
+
110
+ ```bash
111
+ tellymcp run
112
+ ```
113
+
114
+ ## 6. Webhook
115
+
116
+ Gateway поддерживает polling и webhook.
117
+
118
+ Нужные env:
119
+
120
+ ```env
121
+ TELEGRAM_WEBHOOK_ENABLED=true
122
+ TELEGRAM_WEBHOOK_PATH=/telegram/webhook
123
+ TELEGRAM_WEBHOOK_PUBLIC_URL=https://your-domain.example/api/telegram/webhook
124
+ TELEGRAM_WEBHOOK_SECRET=change_me_webhook_secret
125
+ ```
126
+
127
+ Если nginx уже проксирует `location /api/ { ... }` на standalone listener, этот же блок покроет:
128
+
129
+ - `/api/telegram/webhook`
130
+ - `/api/gateway`
131
+ - `/api/webapp`
132
+ - `/api/healthz`
133
+
134
+ ## 7. MCP
135
+
136
+ Локальный client-mode MCP endpoint:
137
+
138
+ ```text
139
+ http://127.0.0.1:8787/mcp
140
+ ```
141
+
142
+ Используй MCP HTTP endpoint, который поднимает `tellymcp run`.
143
+
144
+ ## 8. Проверки
145
+
146
+ ```bash
147
+ tellymcp doctor --env .env
148
+ ```
149
+
150
+ Разрушительная очистка:
151
+
152
+ ```bash
153
+ tellymcp system-prune --env .env --yes
154
+ ```
155
+
156
+ ## 9. Операционные заметки
157
+
158
+ - gateway-бот — это основной user-facing control plane
159
+ - консоли видны из gateway live registry
160
+ - межсессионные задачи идут через xchange records и `partner_note`
161
+ - ответы человеку в Telegram идут через `notify_telegram`
162
+ - browser screenshot для человека лучше отправлять через `browser_screenshot(send_to_telegram=true)`
163
+ - файлы между консолями лучше отправлять через `send_partner_file`
164
+
165
+ ## 10. Чего не делать в новых setup
166
+
167
+ Не строй новые setup вокруг:
168
+
169
+ - pairing codes
170
+ - inbox polling APIs
171
+ - `Local` linked-session меню
172
+ - старых session-link workflow
@@ -0,0 +1,172 @@
1
+ <div align="center">
2
+
3
+ # Standalone Deployment
4
+
5
+ **Deploy TellyMCP as one gateway and one or more agent nodes**
6
+
7
+ [English](./STANDALONE.md) · [Русский](./STANDALONE-ru.md) · [Main README](../README.md) · [README RU](../README-ru.md)
8
+
9
+ [![npm version](https://img.shields.io/npm/v/@deadragdoll/tellymcp.svg)](https://www.npmjs.com/package/@deadragdoll/tellymcp)
10
+ [![node](https://img.shields.io/badge/node-%3E%3D24-339933.svg)](https://nodejs.org/)
11
+ [![gateway mode](https://img.shields.io/badge/deploy-gateway%20%2B%20agents-1f6feb.svg)](../README.md#current-runtime-model)
12
+ [![telegram webhook](https://img.shields.io/badge/telegram-webhook%20ready-26A5E4.svg)](../README.md#webhook-mode)
13
+
14
+ </div>
15
+
16
+ This guide describes the current standalone deployment model for `@deadragdoll/tellymcp`.
17
+
18
+ The recommended topology is:
19
+
20
+ - one gateway node
21
+ - one or more agent nodes
22
+ - one shared Telegram bot on the gateway
23
+
24
+ ## 1. Install
25
+
26
+ ```bash
27
+ npm install -g @deadragdoll/tellymcp
28
+ ```
29
+
30
+ Optional:
31
+
32
+ ```bash
33
+ tellymcp browser install
34
+ tellymcp codex-plugin install
35
+ ```
36
+
37
+ ## 2. Infrastructure
38
+
39
+ Required for gateway:
40
+
41
+ - Redis
42
+ - PostgreSQL
43
+
44
+ Optional:
45
+
46
+ - RabbitMQ
47
+
48
+ ## 3. Gateway Env
49
+
50
+ Start from:
51
+
52
+ - [.env.example.gateway](../.env.example.gateway)
53
+
54
+ Minimum gateway settings:
55
+
56
+ ```env
57
+ TELEGRAM_BOT_TOKEN=
58
+ REDIS_HOST=127.0.0.1
59
+ DB_HOST=127.0.0.1
60
+ DB_USER=
61
+ DB_PASSWORD=
62
+ DB_NAME=
63
+ GATEWAY_PUBLIC_URL=https://your-domain.example/api/gateway
64
+ GATEWAY_WS_URL=wss://your-domain.example/api/gateway/ws
65
+ GATEWAY_TOKEN=change_me_gateway_token
66
+ ROOT_PREFIX=/api
67
+ PORT=8080
68
+ DISTRIBUTED_MODE=gateway
69
+ ```
70
+
71
+ ## 4. Agent Env
72
+
73
+ Start from:
74
+
75
+ - [.env.example.client](../.env.example.client)
76
+
77
+ Minimum client settings:
78
+
79
+ ```env
80
+ DISTRIBUTED_MODE=client
81
+ GATEWAY_PUBLIC_URL=https://your-domain.example/api/gateway
82
+ GATEWAY_WS_URL=wss://your-domain.example/api/gateway/ws
83
+ GATEWAY_TOKEN=change_me_gateway_token
84
+ GATEWAY_USER_UUID=put_owner_uuid_here
85
+ ```
86
+
87
+ For the first run, also set:
88
+
89
+ ```env
90
+ TELLYMCP_SESSION_ID=NEW
91
+ TELLYMCP_SESSION_LABEL=NEW
92
+ ```
93
+
94
+ ## 5. Run
95
+
96
+ Gateway:
97
+
98
+ ```bash
99
+ tellymcp run --env .env
100
+ ```
101
+
102
+ Agent:
103
+
104
+ ```bash
105
+ tellymcp run --env .env -s NEW
106
+ ```
107
+
108
+ After `.mcpsession.json` is created in the workspace, later runs can usually use:
109
+
110
+ ```bash
111
+ tellymcp run
112
+ ```
113
+
114
+ ## 6. Webhook
115
+
116
+ Gateway supports polling and webhook.
117
+
118
+ Webhook env:
119
+
120
+ ```env
121
+ TELEGRAM_WEBHOOK_ENABLED=true
122
+ TELEGRAM_WEBHOOK_PATH=/telegram/webhook
123
+ TELEGRAM_WEBHOOK_PUBLIC_URL=https://your-domain.example/api/telegram/webhook
124
+ TELEGRAM_WEBHOOK_SECRET=change_me_webhook_secret
125
+ ```
126
+
127
+ If nginx already proxies `location /api/ { ... }` to the standalone listener, that block also covers:
128
+
129
+ - `/api/telegram/webhook`
130
+ - `/api/gateway`
131
+ - `/api/webapp`
132
+ - `/api/healthz`
133
+
134
+ ## 7. MCP
135
+
136
+ Local client-mode MCP:
137
+
138
+ ```text
139
+ http://127.0.0.1:8787/mcp
140
+ ```
141
+
142
+ Use the MCP HTTP endpoint exposed by `tellymcp run`.
143
+
144
+ ## 8. Health Checks
145
+
146
+ ```bash
147
+ tellymcp doctor --env .env
148
+ ```
149
+
150
+ Destructive cleanup:
151
+
152
+ ```bash
153
+ tellymcp system-prune --env .env --yes
154
+ ```
155
+
156
+ ## 9. Operational Notes
157
+
158
+ - the gateway bot is the user-facing control plane
159
+ - consoles are discovered from the gateway live registry
160
+ - cross-console tasks use xchange records and `partner_note`
161
+ - human Telegram replies use `notify_telegram`
162
+ - browser screenshot replies to humans should use `browser_screenshot(send_to_telegram=true)`
163
+ - file results between consoles should use `send_partner_file`
164
+
165
+ ## 10. Legacy Concepts To Avoid
166
+
167
+ Do not build new setups around:
168
+
169
+ - pairing codes
170
+ - inbox polling APIs
171
+ - `Local` linked-session menus
172
+ - old session-link workflows
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@deadragdoll/tellymcp",
3
- "version": "0.0.9",
3
+ "version": "0.0.11",
4
4
  "description": "TellyMCP - Telegram control plane for MCP-connected coding agents",
5
5
  "main": "dist/services/features/telegram-mcp/runtime.service.js",
6
6
  "bin": {
@@ -10,10 +10,11 @@
10
10
  "dist",
11
11
  "scripts",
12
12
  "config/templates",
13
+ "config/codex",
13
14
  "README.md",
14
15
  "README-ru.md",
15
- "STANDALONE.md",
16
- "STANDALONE-ru.md",
16
+ "docs/STANDALONE.md",
17
+ "docs/STANDALONE-ru.md",
17
18
  "VERSION.md",
18
19
  "CHANGELOG.md",
19
20
  "TOOLS.md",
@@ -38,10 +39,11 @@
38
39
  "prepack": "yarn build",
39
40
  "prepublishOnly": "yarn build && yarn lint && yarn test",
40
41
  "mcp:local": "codex mcp add telegramHuman --url http://127.0.0.1:8787/mcp",
41
- "dev:gw": "TS_NODE_TRANSPILE_ONLY=1 TS_NODE_EXPERIMENTAL_RESOLVER=1 NODE_OPTIONS=--openssl-legacy-provider ts-node ./node_modules/moleculer/bin/moleculer-runner.js src/services --config src/moleculer.config.ts --envfile ./.env-dev --hot --mask \"**/*.service.ts\"",
42
+ "dev:gw": "TS_NODE_TRANSPILE_ONLY=1 TS_NODE_EXPERIMENTAL_RESOLVER=1 NODE_OPTIONS=--openssl-legacy-provider ts-node ./node_modules/moleculer/bin/moleculer-runner.js src/services --config src/moleculer.config.ts --envfile /opt/tellymcp-gateway/.env-gateway --hot --mask \"**/*.service.ts\"",
42
43
  "dev:builder": "TS_NODE_TRANSPILE_ONLY=1 TS_NODE_EXPERIMENTAL_RESOLVER=1 NODE_OPTIONS=--openssl-legacy-provider ts-node ./node_modules/moleculer/bin/moleculer-runner.js src/services --config src/moleculer.config.ts --envfile ./.env-builder --hot --mask \"**/*.service.ts\"",
43
44
  "dev:gw:telegram": "TS_NODE_TRANSPILE_ONLY=1 TS_NODE_EXPERIMENTAL_RESOLVER=1 NODE_OPTIONS=--openssl-legacy-provider ts-node ./node_modules/moleculer/bin/moleculer-runner.js src/services/features/telegram-mcp --config src/moleculer.config.ts --envfile ./.env-dev --hot --mask \"**/*.service.ts\"",
44
45
  "dev:client": "TS_NODE_TRANSPILE_ONLY=1 TS_NODE_EXPERIMENTAL_RESOLVER=1 NODE_OPTIONS=--openssl-legacy-provider ts-node ./node_modules/moleculer/bin/moleculer-runner.js src/services --config src/moleculer.config.ts --envfile ./.env-client --hot --mask \"**/*.service.ts\"",
46
+ "dev:sh": "TELLYMCP_SOURCE_RUNTIME=true tsx src/cli.ts run --env ./.env-client",
45
47
  "dev": "yarn dev:gw",
46
48
  "dev:watch": "yarn dev:gw",
47
49
  "dev:service": "yarn dev:gw",
@@ -72,16 +74,19 @@
72
74
  "@grammyjs/menu": "^1.3.1",
73
75
  "@grammyjs/storage-redis": "^2.5.1",
74
76
  "@modelcontextprotocol/sdk": "^1.18.1",
77
+ "@xterm/headless": "5.5.0",
78
+ "@xterm/xterm": "5.5.0",
75
79
  "amqplib": "0.10.9",
76
80
  "dotenv": "^17.4.2",
77
81
  "grammy": "1.43.0",
78
82
  "https-proxy-agent": "^7.0.6",
83
+ "i18next": "^26.2.0",
79
84
  "ioredis": "5.10.1",
80
85
  "knex": "^3.2.10",
81
86
  "mime-types": "^3.0.2",
82
87
  "module-alias": "^2.3.4",
83
88
  "moleculer": "0.15.0",
84
- "node-fetch": "^3.3.2",
89
+ "node-pty": "^1.1.0",
85
90
  "pg": "^8.20.0",
86
91
  "picocolors": "^1.1.1",
87
92
  "pino": "^10.3.1",
@@ -96,6 +101,7 @@
96
101
  "@types/amqplib": "^0.10.8",
97
102
  "@types/mime-types": "^3.0.1",
98
103
  "@types/node": "24.12.4",
104
+ "@types/pg": "^8.20.0",
99
105
  "eslint": "^9.34.0",
100
106
  "eslint-import-resolver-typescript": "^4.4.4",
101
107
  "eslint-plugin-import": "^2.32.0",
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ DOCKER_IMAGE="${DOCKER_IMAGE:-node:24-bookworm-slim}"
5
+
6
+ echo "Building TellyMCP package artifact inside ${DOCKER_IMAGE}"
7
+
8
+ rm -f deadragdoll-tellymcp-*.tgz
9
+
10
+ docker run --rm \
11
+ -u "$(id -u):$(id -g)" \
12
+ -e HOME=/tmp/tellymcp-build-home \
13
+ -e npm_config_cache=/tmp/tellymcp-npm-cache \
14
+ -v "${PWD}:/work" \
15
+ -w /work \
16
+ "${DOCKER_IMAGE}" \
17
+ bash -lc '
18
+ set -euo pipefail
19
+ mkdir -p "$HOME" "$npm_config_cache"
20
+ npx -y yarn@1.22.22 install --frozen-lockfile
21
+ npx -y yarn@1.22.22 lint
22
+ npx -y yarn@1.22.22 test
23
+ npm pack
24
+ '
25
+
26
+ echo "Built package artifacts:"
27
+ ls -1 deadragdoll-tellymcp-*.tgz
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ GATEWAY_ENV_FILE="${GATEWAY_ENV_FILE:-}"
5
+ DEPLOY_TAG="${CI_COMMIT_TAG:-}"
6
+ LOG_HOST_DIR="${LOG_HOST_DIR:-}"
7
+
8
+ if [[ -z "${GATEWAY_ENV_FILE}" ]]; then
9
+ echo "GATEWAY_ENV_FILE is required." >&2
10
+ exit 1
11
+ fi
12
+
13
+ if [[ ! -f "${GATEWAY_ENV_FILE}" ]]; then
14
+ echo "Missing gateway env file: ${GATEWAY_ENV_FILE}" >&2
15
+ exit 1
16
+ fi
17
+
18
+ ARCHIVE="$(find . -maxdepth 1 -type f -name 'deadragdoll-tellymcp-*.tgz' | sort | tail -n 1)"
19
+ if [[ -z "${ARCHIVE}" ]]; then
20
+ echo "No deadragdoll-tellymcp-*.tgz artifact found in current workspace." >&2
21
+ exit 1
22
+ fi
23
+
24
+ extract_package_version() {
25
+ local package_json
26
+ package_json="$(<package.json)"
27
+ sed -n 's/^[[:space:]]*"version":[[:space:]]*"\([^"]*\)".*$/\1/p' \
28
+ <<<"${package_json}" \
29
+ | head -n 1
30
+ }
31
+
32
+ PACKAGE_VERSION="$(extract_package_version)"
33
+ if [[ -z "${PACKAGE_VERSION}" ]]; then
34
+ echo "Failed to extract version from package.json" >&2
35
+ exit 1
36
+ fi
37
+ if [[ -n "${DEPLOY_TAG}" ]]; then
38
+ if [[ "${DEPLOY_TAG}" != "${PACKAGE_VERSION}" && "${DEPLOY_TAG}" != "v${PACKAGE_VERSION}" ]]; then
39
+ echo "Tag ${DEPLOY_TAG} does not match package.json version ${PACKAGE_VERSION}" >&2
40
+ exit 1
41
+ fi
42
+ fi
43
+
44
+ if [[ -z "${LOG_HOST_DIR}" ]]; then
45
+ LOG_HOST_DIR="$(dirname "${GATEWAY_ENV_FILE}")/.tellymcp"
46
+ fi
47
+
48
+ mkdir -p "${LOG_HOST_DIR}"
49
+
50
+ export TELLYMCP_VERSION="${PACKAGE_VERSION}"
51
+ export GATEWAY_ENV_FILE
52
+ export LOG_HOST_DIR
53
+
54
+ echo "Deploying TellyMCP gateway ${TELLYMCP_VERSION}"
55
+ echo "Artifact: ${ARCHIVE}"
56
+ echo "Gateway env: ${GATEWAY_ENV_FILE}"
57
+ echo "Log host dir: ${LOG_HOST_DIR}"
58
+
59
+ echo "Rebuilding gateway container stack"
60
+ docker compose build --pull tellymcp-gateway
61
+ docker compose up -d --force-recreate
62
+
63
+ echo "Gateway deployment completed"
64
+ docker compose ps
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+
4
+ PROJECT_DIR="${CI_PROJECT_DIR:-$(pwd)}"
5
+
6
+ if [[ ! -d "${PROJECT_DIR}" ]]; then
7
+ echo "Missing project directory: ${PROJECT_DIR}" >&2
8
+ exit 1
9
+ fi
10
+
11
+ cd "${PROJECT_DIR}"
12
+
13
+ PACKAGE_ARCHIVE="$(find . -maxdepth 1 -type f -name 'deadragdoll-tellymcp-*.tgz' | sort | tail -n 1)"
14
+
15
+ if [[ -z "${PACKAGE_ARCHIVE}" ]]; then
16
+ echo "Missing package archive in ${PROJECT_DIR}. Expected deadragdoll-tellymcp-*.tgz artifact." >&2
17
+ exit 1
18
+ fi
19
+
20
+ echo "Installing TellyMCP from archive: ${PACKAGE_ARCHIVE}"
21
+ npm install -g "${PACKAGE_ARCHIVE}"
22
+
23
+ echo "Installed version:"
24
+ tellymcp help | sed -n '1,2p'
25
+
26
+ echo "Restarting existing PM2 instance 0"
27
+ pm2 restart 0