@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
@@ -3,61 +3,36 @@
3
3
  const { spawnSync } = require("node:child_process");
4
4
  const pc = require("picocolors");
5
5
 
6
- function getTmuxStatus() {
7
- const result = spawnSync("tmux", ["-V"], {
6
+ function hasCodex() {
7
+ const result = spawnSync("codex", ["--version"], {
8
8
  encoding: "utf8",
9
9
  stdio: ["ignore", "pipe", "ignore"],
10
10
  });
11
-
12
- if (result.status === 0) {
13
- return {
14
- found: true,
15
- version: (result.stdout || "tmux").trim(),
16
- };
17
- }
18
-
19
- return { found: false };
20
- }
21
-
22
- function getInstallHints() {
23
- if (process.platform === "darwin") {
24
- return ["brew install tmux"];
25
- }
26
-
27
- return [
28
- "Ubuntu/Debian: sudo apt install tmux",
29
- "Fedora/RHEL: sudo dnf install tmux",
30
- "Arch: sudo pacman -S tmux",
31
- ];
11
+ return result.status === 0;
32
12
  }
33
13
 
34
14
  function line(value = "") {
35
15
  process.stdout.write(`${value}\n`);
36
16
  }
37
17
 
38
- const tmux = getTmuxStatus();
39
-
40
18
  line();
41
19
  line(`${pc.bold(pc.cyan("TellyMCP"))} ${pc.dim("installed")}`);
42
20
  line();
43
21
 
44
- if (tmux.found) {
45
- line(`${pc.green("OK")} tmux detected: ${tmux.version}`);
46
- line("Live view and session nudges should work on this machine.");
47
- } else {
48
- line(`${pc.yellow("WARN")} tmux was not found on this system.`);
49
- line("TellyMCP can still run, but Live view and nudges will be limited.");
50
- line("Install tmux, for example:");
51
- for (const hint of getInstallHints()) {
52
- line(` ${hint}`);
53
- }
54
- }
22
+ line(`${pc.green("OK")} Built-in PTY terminal runtime is enabled.`);
55
23
 
56
24
  line();
57
25
  line(`${pc.yellow("INFO")} Browser tools need Playwright browser binaries.`);
58
26
  line("If you plan to use browser_* tools, run:");
59
27
  line(` ${pc.bold("tellymcp browser install")}`);
60
28
 
29
+ if (hasCodex()) {
30
+ line();
31
+ line(`${pc.yellow("INFO")} Codex CLI detected on this machine.`);
32
+ line("To sync or update the bundled Codex workflow plugin, run:");
33
+ line(` ${pc.bold("tellymcp codex-plugin install")}`);
34
+ }
35
+
61
36
  line();
62
37
  line(`Check your local setup: ${pc.bold("tellymcp doctor")}`);
63
38
  line(`General help: ${pc.bold("tellymcp help")}`);
package/STANDALONE-ru.md DELETED
@@ -1,274 +0,0 @@
1
- # TellyMCP Standalone Guide
2
-
3
- [English](STANDALONE.md) | [Русский](STANDALONE-ru.md)
4
-
5
- Это пошаговая инструкция для самого простого сценария TellyMCP:
6
-
7
- - одна машина
8
- - один Telegram-бот
9
- - без shared gateway
10
- - без Postgres
11
- - без RabbitMQ
12
-
13
- Именно с этого режима лучше начинать.
14
-
15
- ## Что понадобится
16
-
17
- Перед установкой нужны:
18
-
19
- 1. Node.js 24+
20
- 2. `tmux`
21
- 3. Redis
22
- 4. Telegram bot token из BotFather
23
- 5. опционально для `browser_*` tools: Playwright Chromium browser binaries
24
-
25
- Зачем это нужно:
26
-
27
- - Node.js запускает сервис
28
- - `tmux` нужен для Live View, `nudge` и полноценной интерактивной работы
29
- - Redis хранит состояние сессий, inbox, pairing и меню
30
- - Telegram bot token связывает сервис с Telegram
31
-
32
- ## Шаг 1. Установить зависимости
33
-
34
- Пример для Ubuntu / Debian:
35
-
36
- ```bash
37
- sudo apt-get update
38
- sudo apt-get install -y tmux redis-server
39
- node -v
40
- tmux -V
41
- redis-cli ping
42
- ```
43
-
44
- Ожидаемый результат:
45
-
46
- - Node версии `24.x` или новее
47
- - `tmux -V` показывает версию
48
- - `redis-cli ping` возвращает `PONG`
49
-
50
- Если планируешь использовать browser automation tools, один раз выполни ещё:
51
-
52
- ```bash
53
- tellymcp browser install
54
- ```
55
-
56
- ## Шаг 2. Создать Telegram-бота
57
-
58
- В Telegram:
59
-
60
- 1. Открой BotFather
61
- 2. Выполни `/newbot`
62
- 3. Выбери имя бота
63
- 4. Выбери username бота
64
- 5. Сохрани токен
65
-
66
- Тебе понадобятся:
67
-
68
- - `TELEGRAM_BOT_TOKEN`
69
- - `TELEGRAM_BOT_USERNAME`
70
-
71
- ## Шаг 3. Установить TellyMCP
72
-
73
- ```bash
74
- npm install -g @deadragdoll/tellymcp
75
- ```
76
-
77
- Проверка CLI:
78
-
79
- ```bash
80
- tellymcp help
81
- ```
82
-
83
- ## Шаг 4. Запустить агента в tmux
84
-
85
- Это важный момент.
86
-
87
- Для полноценной работы агент лучше запускать внутри `tmux`, а не в обычной shell-сессии.
88
-
89
- Создать tmux-сессию:
90
-
91
- ```bash
92
- tmux new -s backend
93
- ```
94
-
95
- Хорошие имена:
96
-
97
- - `backend`
98
- - `frontend`
99
- - `review`
100
- - `ops`
101
-
102
- Почему имя tmux-сессии важно:
103
-
104
- - по нему проще различать агентов
105
- - оно улучшает диагностику
106
- - в Telegram и Live View проще понимать, какая сессия открыта
107
-
108
- Если нужно выйти:
109
-
110
- ```bash
111
- tmux detach
112
- ```
113
-
114
- И вернуться:
115
-
116
- ```bash
117
- tmux attach -t backend
118
- ```
119
-
120
- ## Шаг 5. Создать standalone-конфиг
121
-
122
- В рабочей директории:
123
-
124
- ```bash
125
- tellymcp init client
126
- ```
127
-
128
- Команда создаст локальный `.env`.
129
-
130
- ## Шаг 6. Заполнить `.env`
131
-
132
- Минимум:
133
-
134
- ```env
135
- TELEGRAM_BOT_TOKEN=...
136
- TELEGRAM_BOT_USERNAME=@your_bot
137
- REDIS_HOST=127.0.0.1
138
- REDIS_PORT=6379
139
- REDIS_DB=1
140
- MCP_HTTP_HOST=127.0.0.1
141
- MCP_HTTP_PORT=8787
142
- MCP_HTTP_PATH=/mcp
143
- MCP_HTTP_BEARER_TOKEN=choose-a-secret-token
144
- DISTRIBUTED_MODE=client
145
- WEBAPP_ENABLED=true
146
- ```
147
-
148
- Если tmux использует нестандартный socket:
149
-
150
- ```env
151
- TMUX_SOCKET_PATH=/tmp/tmux-1000/default
152
- ```
153
-
154
- ## Шаг 7. Проверить конфиг
155
-
156
- ```bash
157
- tellymcp doctor --env .env
158
- ```
159
-
160
- В standalone `client` режиме он должен проверить:
161
-
162
- - `tmux`
163
- - `.env`
164
- - Redis
165
- - локальный MCP bind
166
- - Playwright Chromium, если browser tools включены
167
-
168
- ## Шаг 8. Запустить сервис
169
-
170
- ```bash
171
- tellymcp run --env .env
172
- ```
173
-
174
- Обычный standalone MCP endpoint:
175
-
176
- - `http://127.0.0.1:8787/mcp`
177
-
178
- ## Шаг 9. Подключить MCP к агенту
179
-
180
- Чтобы получить готовый snippet:
181
-
182
- ```bash
183
- tellymcp mcp --help
184
- ```
185
-
186
- Типичный локальный endpoint:
187
-
188
- - `http://127.0.0.1:8787/mcp`
189
-
190
- Если используешь bearer auth, агент должен подключаться с тем же токеном, что и в `.env`.
191
-
192
- ## Шаг 10. Привязать агента к Telegram
193
-
194
- После подключения MCP можно просто написать агенту:
195
-
196
- - `привяжись к Telegram`
197
- - `подключись к Telegram`
198
- - `свяжи эту сессию с Telegram`
199
- - `создай код привязки к Telegram`
200
-
201
- Ожидаемый flow:
202
-
203
- 1. агент вызывает `create_session_pair_code`
204
- 2. отдаёт короткий код
205
- 3. ты отправляешь боту `/start <code>` или `/link <code>`
206
- 4. после успеха открываешь `/menu`
207
-
208
- Если агент работает внутри `tmux`, ему желательно передать:
209
-
210
- - `cwd`
211
- - имя tmux-сессии
212
- - tmux window/pane атрибуты
213
-
214
- Тогда `Live` и `nudge` заработают сразу.
215
-
216
- ## Шаг 11. Что будет после pairing
217
-
218
- После привязки Telegram можно использовать для:
219
-
220
- - inbox
221
- - вопросов к человеку
222
- - local partner collaboration
223
- - переключения сессий
224
- - просмотра storage
225
- - Live View
226
-
227
- Агент сможет:
228
-
229
- - вызывать `ask_user_telegram`
230
- - читать несвязанные входящие сообщения
231
- - отправлять note и файлы
232
- - получать tmux `nudge`, когда появляется новая работа
233
-
234
- ## Что работает без tmux
235
-
236
- TellyMCP можно запустить и без `tmux`, но это урезанный режим.
237
-
238
- Не будет:
239
-
240
- - Live View
241
- - tmux `nudge`
242
- - прямого управления из Telegram Mini App
243
-
244
- Такой режим стоит использовать только если тебя устраивает пассивная работа.
245
-
246
- ## Troubleshooting
247
-
248
- Если `doctor` ругается:
249
-
250
- - проверь, что Redis запущен
251
- - проверь, что установлен `tmux`
252
- - проверь правильность bot token
253
- - проверь, что bearer token совпадает с MCP-конфигом агента
254
-
255
- Если pairing работает, а Live View нет:
256
-
257
- - убедись, что агент действительно запущен внутри `tmux`
258
- - убедись, что у tmux-сессии есть стабильное имя
259
- - при необходимости задай `TMUX_SOCKET_PATH`
260
-
261
- Если агент не может подключиться к MCP:
262
-
263
- - проверь, что `tellymcp run --env .env` действительно запущен
264
- - проверь endpoint `http://127.0.0.1:8787/mcp`
265
- - проверь bearer token
266
-
267
- ## Следующий шаг
268
-
269
- Когда standalone уже работает, дальше можно переходить к:
270
-
271
- - `gateway`
272
- - или `both`
273
-
274
- Это нужно только если нужен `Collab` между машинами.
package/STANDALONE.md DELETED
@@ -1,274 +0,0 @@
1
- # TellyMCP Standalone Guide
2
-
3
- [English](STANDALONE.md) | [Русский](STANDALONE-ru.md)
4
-
5
- This guide explains the simplest TellyMCP setup:
6
-
7
- - one machine
8
- - one Telegram bot
9
- - no shared gateway
10
- - no Postgres
11
- - no RabbitMQ
12
-
13
- This is the best way to start.
14
-
15
- ## What you need
16
-
17
- Before installation, make sure you have:
18
-
19
- 1. Node.js 24+
20
- 2. `tmux`
21
- 3. Redis
22
- 4. a Telegram bot token from BotFather
23
- 5. optional for `browser_*` tools: Playwright Chromium browser binaries
24
-
25
- Why these matter:
26
-
27
- - Node.js runs the service
28
- - `tmux` enables Live View, nudges, and direct Telegram-side interaction
29
- - Redis stores session state, inbox, pairing state, and menu state
30
- - Telegram bot token connects your bot to Telegram
31
-
32
- ## Step 1. Install prerequisites
33
-
34
- Ubuntu / Debian example:
35
-
36
- ```bash
37
- sudo apt-get update
38
- sudo apt-get install -y tmux redis-server
39
- node -v
40
- tmux -V
41
- redis-cli ping
42
- ```
43
-
44
- Expected:
45
-
46
- - Node version is `24.x` or newer
47
- - `tmux -V` prints a version
48
- - `redis-cli ping` returns `PONG`
49
-
50
- If you plan to use browser automation tools later, also run:
51
-
52
- ```bash
53
- tellymcp browser install
54
- ```
55
-
56
- ## Step 2. Create a Telegram bot
57
-
58
- In Telegram:
59
-
60
- 1. Open BotFather
61
- 2. Run `/newbot`
62
- 3. Choose a bot name
63
- 4. Choose a bot username
64
- 5. Save the token
65
-
66
- You will need:
67
-
68
- - `TELEGRAM_BOT_TOKEN`
69
- - `TELEGRAM_BOT_USERNAME`
70
-
71
- ## Step 3. Install TellyMCP
72
-
73
- ```bash
74
- npm install -g @deadragdoll/tellymcp
75
- ```
76
-
77
- Check that the CLI works:
78
-
79
- ```bash
80
- tellymcp help
81
- ```
82
-
83
- ## Step 4. Start a tmux session for the agent
84
-
85
- This part is important.
86
-
87
- Run the agent inside `tmux`, not in a plain shell, if you want the full experience.
88
-
89
- Create a session:
90
-
91
- ```bash
92
- tmux new -s backend
93
- ```
94
-
95
- Good session names:
96
-
97
- - `backend`
98
- - `frontend`
99
- - `review`
100
- - `ops`
101
-
102
- Why the session name matters:
103
-
104
- - it helps identify the agent in practice
105
- - it improves diagnostics
106
- - it makes Telegram and Live View easier to understand
107
-
108
- If you later detach:
109
-
110
- ```bash
111
- tmux detach
112
- ```
113
-
114
- and return:
115
-
116
- ```bash
117
- tmux attach -t backend
118
- ```
119
-
120
- ## Step 5. Create the standalone config
121
-
122
- Inside the workspace where you want to run TellyMCP:
123
-
124
- ```bash
125
- tellymcp init client
126
- ```
127
-
128
- This creates a local `.env`.
129
-
130
- ## Step 6. Fill `.env`
131
-
132
- At minimum, set:
133
-
134
- ```env
135
- TELEGRAM_BOT_TOKEN=...
136
- TELEGRAM_BOT_USERNAME=@your_bot
137
- REDIS_HOST=127.0.0.1
138
- REDIS_PORT=6379
139
- REDIS_DB=1
140
- MCP_HTTP_HOST=127.0.0.1
141
- MCP_HTTP_PORT=8787
142
- MCP_HTTP_PATH=/mcp
143
- MCP_HTTP_BEARER_TOKEN=choose-a-secret-token
144
- DISTRIBUTED_MODE=client
145
- WEBAPP_ENABLED=true
146
- ```
147
-
148
- If your tmux server uses a non-default socket:
149
-
150
- ```env
151
- TMUX_SOCKET_PATH=/tmp/tmux-1000/default
152
- ```
153
-
154
- ## Step 7. Validate the setup
155
-
156
- ```bash
157
- tellymcp doctor --env .env
158
- ```
159
-
160
- In standalone `client` mode it should verify:
161
-
162
- - `tmux`
163
- - `.env`
164
- - Redis
165
- - local MCP bind
166
- - Playwright Chromium when browser tools are enabled
167
-
168
- ## Step 8. Run the service
169
-
170
- ```bash
171
- tellymcp run --env .env
172
- ```
173
-
174
- Standalone MCP endpoint is normally:
175
-
176
- - `http://127.0.0.1:8787/mcp`
177
-
178
- ## Step 9. Add MCP to your agent
179
-
180
- To get a ready-to-paste config snippet:
181
-
182
- ```bash
183
- tellymcp mcp --help
184
- ```
185
-
186
- Typical local MCP config target:
187
-
188
- - `http://127.0.0.1:8787/mcp`
189
-
190
- If you use bearer auth, configure your agent with the same token from `.env`.
191
-
192
- ## Step 10. Pair the agent with Telegram
193
-
194
- Once MCP is connected, tell the agent something like:
195
-
196
- - `pair with Telegram`
197
- - `link to Telegram`
198
- - `connect this session to Telegram`
199
- - `create a Telegram pairing code`
200
-
201
- Expected flow:
202
-
203
- 1. the agent calls `create_session_pair_code`
204
- 2. it gives you a short code
205
- 3. you send `/start <code>` or `/link <code>` to the bot
206
- 4. after success, open `/menu`
207
-
208
- If the agent is running inside `tmux`, it should pass:
209
-
210
- - `cwd`
211
- - tmux session name
212
- - tmux window/pane attributes
213
-
214
- This lets Live View and tmux nudges work immediately.
215
-
216
- ## Step 11. What you get after pairing
217
-
218
- After pairing, Telegram can be used for:
219
-
220
- - inbox messages
221
- - clarifying questions
222
- - local partner collaboration
223
- - session switching
224
- - storage inspection
225
- - Live View
226
-
227
- The agent can:
228
-
229
- - call `ask_user_telegram`
230
- - read unsolicited inbox messages
231
- - send notes and files
232
- - receive tmux nudges when new work arrives
233
-
234
- ## What works without tmux
235
-
236
- TellyMCP can still run without `tmux`, but this is a reduced mode.
237
-
238
- You lose:
239
-
240
- - Live View
241
- - tmux nudges
242
- - direct Telegram Mini App controls
243
-
244
- Use this only if you accept a passive workflow.
245
-
246
- ## Troubleshooting
247
-
248
- If `doctor` fails:
249
-
250
- - verify Redis is running
251
- - verify `tmux` is installed
252
- - verify the bot token is correct
253
- - verify your bearer token matches the MCP client config
254
-
255
- If pairing works but Live View does not:
256
-
257
- - make sure the agent is really inside `tmux`
258
- - make sure the tmux session has a stable name
259
- - if needed, set `TMUX_SOCKET_PATH`
260
-
261
- If the agent cannot connect to MCP:
262
-
263
- - confirm `tellymcp run --env .env` is running
264
- - confirm the endpoint is `http://127.0.0.1:8787/mcp`
265
- - confirm the bearer token matches
266
-
267
- ## Next step
268
-
269
- After standalone is working, the next upgrade path is:
270
-
271
- - `gateway`
272
- - or `both`
273
-
274
- Use that only when you need cross-machine collaboration.
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TELEGRAM_MCP_INBOX_SERVICE_NAME = void 0;
4
- const runtime_service_1 = require("./runtime.service");
5
- const inboxService_1 = require("./src/features/inbox/model/inboxService");
6
- exports.TELEGRAM_MCP_INBOX_SERVICE_NAME = "telegramMcp.inbox";
7
- const TelegramMcpInboxService = {
8
- name: exports.TELEGRAM_MCP_INBOX_SERVICE_NAME,
9
- dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
10
- created() {
11
- this.inboxService = null;
12
- },
13
- methods: {
14
- getInboxService() {
15
- if (!this.inboxService) {
16
- throw new Error("telegram_mcp inbox service is not initialized yet");
17
- }
18
- return this.inboxService;
19
- },
20
- },
21
- async started() {
22
- await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
23
- const runtimeService = this.broker.getLocalService(runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME);
24
- if (!runtimeService) {
25
- throw new Error(`Local Moleculer service '${runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME}' is unavailable`);
26
- }
27
- const runtime = runtimeService.getRuntime();
28
- this.logger.info("Starting telegram_mcp inbox service");
29
- this.inboxService = new inboxService_1.InboxService(runtime.config, runtime.stateStore, runtime.stateStore, runtime.logger, runtime.projectIdentityResolver);
30
- this.logger.info("telegram_mcp inbox service is ready");
31
- },
32
- };
33
- exports.default = TelegramMcpInboxService;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TELEGRAM_MCP_PAIR_SERVICE_NAME = void 0;
4
- const runtime_service_1 = require("./runtime.service");
5
- const generatePairCode_1 = require("./src/features/pair-session/model/generatePairCode");
6
- exports.TELEGRAM_MCP_PAIR_SERVICE_NAME = "telegramMcp.pair";
7
- const TelegramMcpPairService = {
8
- name: exports.TELEGRAM_MCP_PAIR_SERVICE_NAME,
9
- dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
10
- created() {
11
- this.pairSessionService = null;
12
- },
13
- methods: {
14
- getPairSessionService() {
15
- if (!this.pairSessionService) {
16
- throw new Error("telegram_mcp pair service is not initialized yet");
17
- }
18
- return this.pairSessionService;
19
- },
20
- },
21
- async started() {
22
- await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
23
- const runtimeService = this.broker.getLocalService(runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME);
24
- if (!runtimeService) {
25
- throw new Error(`Local Moleculer service '${runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME}' is unavailable`);
26
- }
27
- const runtime = runtimeService.getRuntime();
28
- this.logger.info("Starting telegram_mcp pair service");
29
- this.pairSessionService = new generatePairCode_1.PairSessionService(runtime.config, runtime.stateStore, runtime.stateStore, runtime.stateStore, runtime.logger, runtime.projectIdentityResolver);
30
- this.logger.info("telegram_mcp pair service is ready");
31
- },
32
- };
33
- exports.default = TelegramMcpPairService;
@@ -1,10 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sendTmuxLiteralText = exports.sendAllowedTmuxAction = exports.isTmuxUnavailableError = exports.getTmuxWindowHeight = exports.captureVisibleTmuxPane = exports.captureTmuxPaneRange = void 0;
4
- var client_1 = require("../../shared/integrations/tmux/client");
5
- Object.defineProperty(exports, "captureTmuxPaneRange", { enumerable: true, get: function () { return client_1.captureTmuxPaneRange; } });
6
- Object.defineProperty(exports, "captureVisibleTmuxPane", { enumerable: true, get: function () { return client_1.captureVisibleTmuxPane; } });
7
- Object.defineProperty(exports, "getTmuxWindowHeight", { enumerable: true, get: function () { return client_1.getTmuxWindowHeight; } });
8
- Object.defineProperty(exports, "isTmuxUnavailableError", { enumerable: true, get: function () { return client_1.isTmuxUnavailableError; } });
9
- Object.defineProperty(exports, "sendAllowedTmuxAction", { enumerable: true, get: function () { return client_1.sendAllowedTmuxAction; } });
10
- Object.defineProperty(exports, "sendTmuxLiteralText", { enumerable: true, get: function () { return client_1.sendTmuxLiteralText; } });