@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
package/README-ru.md CHANGED
@@ -1,521 +1,371 @@
1
- # TellyMCP
1
+ <div align="center">
2
2
 
3
- [English](README.md) | [Русский](README-ru.md) | [Standalone Guide](STANDALONE.md) | [Standalone RU](STANDALONE-ru.md) | [Screenshots](screenshots/README.md) | [Gallery](screenshots/GALLERY.md) | [Release Notes](VERSION.md)
3
+ # TellyMCP
4
4
 
5
- [![npm version](https://img.shields.io/npm/v/%40deadragdoll%2Ftellymcp)](https://www.npmjs.com/package/@deadragdoll/tellymcp)
6
- [![npm downloads](https://img.shields.io/npm/dm/%40deadragdoll%2Ftellymcp)](https://www.npmjs.com/package/@deadragdoll/tellymcp)
7
- [![node >= 24](https://img.shields.io/badge/node-%3E%3D24-339933)](https://nodejs.org/)
8
- [![license: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
5
+ **Telegram control plane для MCP-подключённых coding agents**
9
6
 
10
- TellyMCP это self-hosted Telegram control plane для coding agents.
7
+ [English](./README.md) · [Русский](./README-ru.md) · [Standalone](./docs/STANDALONE.md) · [Standalone RU](./docs/STANDALONE-ru.md)
11
8
 
12
- Он привязывает реальные agent-сессии к Telegram, делает их доступными с телефона и даёт им работать вместе между локальными и удалёнными машинами.
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
+ [![license](https://img.shields.io/npm/l/@deadragdoll/tellymcp.svg)](./LICENSE)
12
+ [![gateway--first](https://img.shields.io/badge/runtime-gateway--first-1f6feb.svg)](./README-ru.md#текущая-модель)
13
+ [![telegram webhook](https://img.shields.io/badge/telegram-webhook%20%7C%20polling-26A5E4.svg)](./README-ru.md#webhook)
13
14
 
14
- Он не завязан на одного вендора или один coding assistant. Если агент умеет работать с MCP server, он может использовать TellyMCP.
15
+ </div>
15
16
 
16
- ## Зачем он нужен
17
+ `@deadragdoll/tellymcp` Telegram control plane для MCP-подключённых coding agents.
17
18
 
18
- Coding agents полезны ровно до того момента, пока они не остаются одни в терминале:
19
+ Текущая модель gateway-first:
19
20
 
20
- - им нужно уточнение, пока тебя нет за компьютером
21
- - им нужен approval перед рискованным действием
22
- - им нужно передать скриншот, файл или note между сессиями
23
- - им нужно быстро подключить человека или другого агента, не ломая общий workflow
21
+ - один gateway держит Telegram-бота, web app, проекты и live registry консолей
22
+ - один или несколько agent-процессов подключаются к этому gateway
23
+ - каждая запущенная консоль агента отдельный routable target
24
+ - пользователь работает через gateway-бота, а не через pairing отдельных сессий
24
25
 
25
- TellyMCP даёт каждой сессии мобильную панель управления и collaboration layer:
26
+ ## Что умеет
26
27
 
27
- - `Live` tmux view и лёгкое управление из Telegram
28
- - session-scoped inbox и уведомления
29
- - workspace-aware handoff для файлов и note
30
- - локальную и удалённую коллаборацию между сессиями
31
- - поддержку mixed agent setups, если они умеют говорить по MCP
28
+ - даёт MCP tools для human-in-the-loop через Telegram
29
+ - позволяет одной консоли агента ставить задачу другой консоли
30
+ - хранит structured xchange records в `.mcp-xchange`
31
+ - поддерживает browser automation через Playwright
32
+ - отдаёт Telegram Mini App / Live View с gateway
33
+ - поддерживает polling и webhook на gateway
34
+ - поставляет встроенный Codex plugin со skills под типовые workflow
32
35
 
33
- ## Ключевые идеи продукта
36
+ ## Текущая модель
34
37
 
35
- - `Live` tmux view и управление внутри Telegram Mini App
36
- - `Collab`-сценарии для локальных и удалённых agent-сессий
37
- - `.mcp-xchange` как workspace-level handoff шина для note, файлов и скриншотов
38
- - MCP-native pairing сессий и session-scoped tools
39
- - optional gateway mode для multi-machine и multi-bot проектов
38
+ Схема:
40
39
 
41
- ## Human-in-the-loop — это только один слой системы
40
+ ```text
41
+ Telegram user
42
+ |
43
+ Telegram bot + WebApp
44
+ |
45
+ Gateway
46
+ |
47
+ +-- Agent console A
48
+ +-- Agent console B
49
+ +-- Agent console C
50
+ ```
42
51
 
43
- Telegram HITL здесь тоже есть, но он не исчерпывает продукт:
52
+ Следствия:
44
53
 
45
- - задавать человеку уточняющие вопросы через Telegram
46
- - получать несвязанные входящие сообщения позже через inbox
47
- - уведомлять человека о прогрессе, blockers и approvals
54
+ - обычный flow больше не использует pairing
55
+ - `/menu` в gateway-боте показывает live-консоли напрямую
56
+ - межсессионная маршрутизация идёт по canonical `session_id = client_uuid:local_session_id`
57
+ - несвязанные задачи читаются через structured xchange records, а не через старые inbox APIs
48
58
 
49
- ## Что отличает TellyMCP от простого Telegram bot bridge
59
+ ## Основные поверхности
50
60
 
51
- - он завязан на сессии, а не только на чат
52
- - он понимает локальные и удалённые collaboration targets
53
- - у него есть live terminal surface, а не только обмен сообщениями
54
- - он передаёт файлы через workspace-aware exchange paths, а не просто через ad hoc upload
55
- - он может работать как standalone node или как gateway-backed control plane
61
+ Для человека:
56
62
 
57
- ## Типовые сценарии
63
+ - `telegram_message`
64
+ - `notify_telegram`
65
+ - `browser_screenshot(send_to_telegram=true)`
58
66
 
59
- - держать долгоживущего агента доступным с телефона
60
- - запускать рядом разных агентов, если каждый умеет подключаться по MCP
61
- - подруливать tmux-сессией без ноутбука
62
- - маршрутизировать работу между `frontend`, `backend`, `review` и другими локальными сессиями
63
- - работать с удалёнными сессиями через gateway-backed project
64
- - передавать note, скриншоты и реальные файлы через `.mcp-xchange`
65
- - проверять локальный веб-интерфейс через `browser_*` tools и отправлять результат обратно в Telegram
67
+ Для agent-to-agent:
66
68
 
67
- ## Группы инструментов
69
+ - `partner_note`
70
+ - `send_partner_note`
71
+ - `send_partner_file`
72
+ - `list_gateway_sessions`
68
73
 
69
- - pairing и session context
70
- - Telegram ask/notify/inbox
71
- - `Live` tmux control
72
- - browser inspection и screenshots
73
- - partner notes и partner files
74
- - tools sync и version checks
74
+ Для браузера:
75
75
 
76
- Важно для `Share`:
76
+ - `browser_open`
77
+ - `browser_click`
78
+ - `browser_fill`
79
+ - `browser_press`
80
+ - `browser_wait_for`
81
+ - `browser_screenshot`
77
82
 
78
- - текущая сессия должна выполнить работу сама
79
- - target-сессии отправляется только результат
80
- - исходное поручение не должно пересылаться дальше как новая задача
83
+ Синхронизация инструкций:
81
84
 
82
- Полный список MCP tools лучше держать ниже по README и в самом MCP server, а не на первом экране.
85
+ - `refresh_tools_markdown`
86
+ - `.mcpsession.json` хранит startup identity и последний известный tools hash
83
87
 
84
- ## Prerequisites
88
+ ## Требования
85
89
 
86
- - Node.js 24+
87
- - `tmux`
90
+ - Node.js `>= 24`
88
91
  - Redis
89
- - Telegram bot token от BotFather
90
- - для `gateway` / `both`: Postgres
91
- - опционально для durable fanout на шлюзе: RabbitMQ
92
-
93
- ## `tmux` настоятельно рекомендуется
94
-
95
- TellyMCP лучше всего работает, когда сам агент запущен внутри `tmux`.
92
+ - PostgreSQL для gateway mode
93
+ - опционально RabbitMQ для durable gateway fanout
94
+ - Playwright browser binaries, если нужны browser tools
96
95
 
97
- Без `tmux` сервис всё равно может работать, но полноценный интерактивный режим будет неполным:
98
-
99
- - не будет `Live View`
100
- - не будет tmux `nudge`
101
- - не будет прямого управления tmux из Telegram Mini App
102
-
103
- Типичный старт:
96
+ ## Установка
104
97
 
105
98
  ```bash
106
- tmux new -s backend
99
+ npm install -g @deadragdoll/tellymcp
107
100
  ```
108
101
 
109
- Позже можно просто подключиться:
102
+ Если нужны browser tools:
110
103
 
111
104
  ```bash
112
- tmux attach -t backend
105
+ tellymcp browser install
113
106
  ```
114
107
 
115
- Почему имя tmux-сессии важно:
116
-
117
- - по нему проще различать агентов
118
- - оно участвует в tmux-related UI и диагностике
119
- - с ним проще понимать, какую сессию ты открываешь в Telegram и `Live`
120
-
121
- Лучше использовать короткие осмысленные имена:
122
-
123
- - `backend`
124
- - `frontend`
125
- - `review`
126
- - `ops`
127
-
128
- Если агентов несколько, лучше запускать каждого в своей tmux-сессии или pane и привязывать отдельно.
108
+ Если используешь Codex:
129
109
 
130
- Если tmux pane пересоздан и его `pane_id` изменился, TellyMCP теперь пытается автоматически восстановить актуальный target по сохранённым tmux session/window/pane hints.
131
-
132
- Если авто-восстановление не удалось, в Telegram придёт operational warning, а не только запись в backend log.
110
+ ```bash
111
+ tellymcp codex-plugin install
112
+ ```
133
113
 
134
114
  ## Быстрый старт
135
115
 
136
- ### 1. Standalone client без шлюза
137
-
138
- Это самый простой режим:
116
+ ### 1. Gateway
139
117
 
140
- - без shared gateway
141
- - без Postgres
142
- - без RabbitMQ
143
-
144
- Установка:
118
+ Создай workspace и env:
145
119
 
146
120
  ```bash
147
- npm install -g @deadragdoll/tellymcp
121
+ mkdir -p ~/telly-gateway
122
+ cd ~/telly-gateway
123
+ tellymcp init gateway
148
124
  ```
149
125
 
150
- Создай клиентский конфиг:
126
+ Или возьми sample:
151
127
 
152
- ```bash
153
- tellymcp init client
154
- ```
128
+ - [.env.example.gateway](./.env.example.gateway)
155
129
 
156
- В `.env` заполни минимум:
130
+ Минимально важные значения:
157
131
 
158
132
  - `TELEGRAM_BOT_TOKEN`
159
- - `TELEGRAM_BOT_USERNAME`
160
133
  - `REDIS_HOST`
161
- - `MCP_HTTP_BEARER_TOKEN`
162
-
163
- Проверь конфиг:
164
-
165
- ```bash
166
- tellymcp doctor --env .env
167
- ```
134
+ - `DB_HOST`
135
+ - `DB_USER`
136
+ - `DB_PASSWORD`
137
+ - `DB_NAME`
138
+ - `GATEWAY_PUBLIC_URL`
139
+ - `GATEWAY_WS_URL`
140
+ - `GATEWAY_TOKEN`
168
141
 
169
- Запусти сервис:
142
+ Запуск:
170
143
 
171
144
  ```bash
172
145
  tellymcp run --env .env
173
146
  ```
174
147
 
175
- Локальный MCP endpoint в `client`-режиме:
176
-
177
- - `http://127.0.0.1:8787/mcp`
178
-
179
- Чтобы получить готовый JSON snippet для агента:
180
-
181
- ```bash
182
- tellymcp mcp --help
183
- ```
184
-
185
- ### 2. Gateway или combined `both`
186
-
187
- Используй этот режим, если нужен:
188
-
189
- - `Collab` между машинами
190
- - проекты между разными ботами
191
- - gateway-relayed Live View
192
- - persistent gateway-side состояние по проектам и доставке
148
+ ### 2. Agent
193
149
 
194
- Создай конфиг:
150
+ Для каждой консоли лучше отдельный workspace:
195
151
 
196
152
  ```bash
197
- tellymcp init gateway
153
+ mkdir -p ~/agent-a
154
+ cd ~/agent-a
155
+ tellymcp init client
198
156
  ```
199
157
 
200
- или
158
+ Или используй sample:
201
159
 
202
- ```bash
203
- tellymcp init both
204
- ```
160
+ - [.env.example.client](./.env.example.client)
205
161
 
206
- В `.env` настроить:
162
+ Минимально важные значения:
207
163
 
208
- - `DISTRIBUTED_MODE=gateway|both`
209
- - `PORT`
210
- - `ROOT_PREFIX=/api`
211
- - `TELEGRAM_BOT_TOKEN`
212
- - `REDIS_*`
213
- - `DB_*`
214
- - `WEBAPP_PUBLIC_URL`
215
164
  - `GATEWAY_PUBLIC_URL`
216
165
  - `GATEWAY_WS_URL`
217
- - при необходимости `RMQ_*`
166
+ - `GATEWAY_TOKEN`
167
+ - `GATEWAY_USER_UUID`, если консоль должна быть видна конкретному владельцу в gateway-боте
218
168
 
219
- Ожидаемый публичный ingress:
169
+ Рекомендуется:
220
170
 
221
- - `/api/mcp`
222
- - `/api/webapp`
223
- - `/api/gateway`
224
- - `/api/healthz`
171
+ - по умолчанию используется встроенный PTY terminal runtime
172
+ - на первом запуске явно задать `TELLYMCP_SESSION_ID` и `TELLYMCP_SESSION_LABEL`
225
173
 
226
- Проверка:
174
+ Первый запуск:
227
175
 
228
176
  ```bash
229
- tellymcp doctor --env .env
177
+ tellymcp run --env .env -s NEW
230
178
  ```
231
179
 
232
- Запуск:
180
+ После первого запуска `.mcpsession.json` хранит:
233
181
 
234
- ```bash
235
- tellymcp run --env .env
236
- ```
237
-
238
- Типовой публичный MCP endpoint:
182
+ - `local_session_id`
183
+ - `session_label`
184
+ - `env_file`
239
185
 
240
- - `https://your-host.example/api/mcp`
186
+ Поэтому дальше в том же каталоге обычно достаточно:
241
187
 
242
- ## Mini App / Live
188
+ ```bash
189
+ tellymcp run
190
+ ```
243
191
 
244
- Если `WEBAPP_ENABLED=true`, в меню сессии появляется `🖥 Live`.
192
+ ## Webhook
245
193
 
246
- Mini App:
194
+ Gateway умеет работать через Telegram webhook.
247
195
 
248
- - обслуживается этим же Node service по `WEBAPP_BASE_PATH`
249
- - в `client`-режиме тоже может открываться через общий gateway domain
250
- - показывает видимую область tmux pane и отправляет ограниченный набор control actions
251
- - валидирует Telegram `initData` на сервере
252
- - умеет открываться в режимах:
253
- - `default`
254
- - `expand`
255
- - `fullscreen` с fallback на `expand`
256
- - после успешного bootstrap удаляет временное launcher-сообщение
257
- - автоматически восстанавливается после короткого рестарта шлюза:
258
- - краткий `502/503` переживается обычным polling
259
- - если in-process WebApp session на шлюзе была потеряна и приходит `401/403`, Mini App сама делает повторный bootstrap
260
- - в типовом restart-case переоткрывать `Live` не нужно
196
+ Если nginx уже проксирует весь `/api/` на standalone HTTP listener gateway, отдельный `location` для webhook не обязателен. Route такой:
261
197
 
262
- ## Docker: только для инфраструктуры или для `gateway`-only
198
+ - `/api/telegram/webhook`
263
199
 
264
- Docker больше не является основным способом запуска TellyMCP, но один container path поддерживается:
200
+ Нужные env:
265
201
 
266
- - запуск только `gateway`-ноды в контейнере
202
+ ```env
203
+ TELEGRAM_WEBHOOK_ENABLED=true
204
+ TELEGRAM_WEBHOOK_PATH=/telegram/webhook
205
+ TELEGRAM_WEBHOOK_PUBLIC_URL=https://your-domain.example/api/telegram/webhook
206
+ TELEGRAM_WEBHOOK_SECRET=change_me_webhook_secret
207
+ ```
267
208
 
268
- Это вариант именно для чистого control-plane узла:
209
+ Когда webhook mode включён:
269
210
 
270
- - без локальных agent sessions
271
- - без локального `tmux`
272
- - не для `client`
273
- - не для `both`
211
+ - gateway вызывает `setWebhook(...)` на старте
212
+ - polling не запускается
213
+ - секрет проверяется через `x-telegram-bot-api-secret-token`
274
214
 
275
- Плюс `docker-compose.yml` по-прежнему может поднимать локальную инфраструктуру:
215
+ ## MCP
276
216
 
277
- - `redis` для всех режимов
278
- - `postgres` для `gateway` / `both`
279
- - `rabbitmq` только если нужен durable fanout на шлюзе
217
+ ### Local HTTP
280
218
 
281
- Только Redis, для `standalone` или `client`:
219
+ В client mode локальный MCP endpoint обычно:
282
220
 
283
- ```bash
284
- docker compose up -d redis
285
- ```
286
-
287
- Redis + Postgres, для `gateway` или `both`:
288
-
289
- ```bash
290
- docker compose --profile gateway up -d
221
+ ```text
222
+ http://127.0.0.1:8787/mcp
291
223
  ```
292
224
 
293
- Добавить RabbitMQ при необходимости:
225
+ Helper:
294
226
 
295
227
  ```bash
296
- docker compose --profile gateway --profile rmq up -d
228
+ tellymcp mcp --url http://127.0.0.1:8787/mcp
297
229
  ```
298
230
 
299
- Полный gateway stack в Docker:
300
-
301
- 1. Скопировать пример:
231
+ Для Codex и похожих агентов используй MCP HTTP endpoint, который поднимает `tellymcp run`.
302
232
 
303
- ```bash
304
- cp .env.example.gateway .env-gateway
305
- ```
233
+ ## Codex Plugin
306
234
 
307
- 2. Отредактировать `.env-gateway` и задать минимум:
235
+ Пакет включает локальный Codex plugin со skills для:
308
236
 
309
- - `TELEGRAM_BOT_TOKEN`
310
- - `TELEGRAM_BOT_USERNAME`
311
- - `WEBAPP_PUBLIC_URL`
312
- - `GATEWAY_PUBLIC_URL`
313
- - `GATEWAY_WS_URL`
314
- - `MCP_HTTP_BEARER_TOKEN`
237
+ - ответов человеку в Telegram
238
+ - `partner_note`
239
+ - browser screenshot задач
240
+ - artifact-return flow
315
241
 
316
- 3. Запустить:
242
+ Команды:
317
243
 
318
244
  ```bash
319
- docker compose up -d
245
+ tellymcp codex-plugin status
246
+ tellymcp codex-plugin install
320
247
  ```
321
248
 
322
- Это поднимет:
249
+ Installer:
323
250
 
324
- - `redis`
325
- - `postgres`
326
- - `tellymcp-gateway`
251
+ - копирует bundled plugin в managed local Codex path
252
+ - обновляет personal marketplace manifest
253
+ - ставит или обновляет plugin, если найден Codex CLI
327
254
 
328
- Внутри Docker compose сам переопределяет:
255
+ ## Browser Workflow
329
256
 
330
- - `MCP_HTTP_HOST=0.0.0.0`
331
- - `REDIS_HOST=redis`
332
- - `DB_HOST=postgres`
257
+ Browser tools используют Playwright Chromium.
333
258
 
334
- Ожидаемые endpoint'ы:
259
+ Предпочтительный путь:
335
260
 
336
- - `http://127.0.0.1:8080/api/healthz`
337
- - `http://127.0.0.1:8080/api/mcp`
338
- - `http://127.0.0.1:8080/api/webapp`
339
- - `http://127.0.0.1:8080/api/gateway`
261
+ 1. `browser_open`
262
+ 2. `browser_screenshot`
263
+ 3. дальше либо:
264
+ - `send_to_telegram=true` для ответа человеку
265
+ - `send_partner_file` для возврата артефакта другой консоли
340
266
 
341
- Остановить всё:
267
+ Если browser runtime не установлен:
342
268
 
343
269
  ```bash
344
- docker compose down
270
+ tellymcp browser install
345
271
  ```
346
272
 
347
- Сам TellyMCP при этом запускается напрямую на хосте:
348
-
349
- ```bash
350
- tellymcp run --env .env
351
- ```
352
-
353
- Для `client` и `both` по-прежнему рекомендуется именно хостовый запуск.
354
-
355
- ## Как начать работу с ботом изнутри агента
356
-
357
- После подключения MCP можно просто написать агенту обычной фразой, что нужно привязаться к Telegram.
358
-
359
- Типовые фразы, которые агент должен понимать:
360
-
361
- - `привяжись к Telegram`
362
- - `подключись к Telegram`
363
- - `зарегистрируй эту сессию в Telegram`
364
- - `свяжи эту сессию с ботом`
365
- - `создай код привязки к Telegram`
366
- - `дай код для pairing с Telegram`
273
+ Не подменяй browser workflow ad hoc shell-командами с Playwright, кроме случаев, когда ты отлаживаешь сам browser runtime.
367
274
 
368
- Ожидаемый flow:
275
+ ## Terminal Blockers
369
276
 
370
- 1. Агент вызывает `create_session_pair_code`.
371
- 2. Возвращается короткий код и, если возможно, deep link.
372
- 3. Ты открываешь Telegram и отправляешь боту `/start <code>` или `/link <code>`.
373
- 4. После успешной привязки можно открыть `/menu`.
277
+ Gateway prompt scanner теперь живёт от live-client lifecycle:
374
278
 
375
- Если хочешь написать совсем явно, используй так:
279
+ - на старте gateway scanner только armed, но не крутится вхолостую
280
+ - реальная работа начинается после подключения live client
281
+ - relay console materialization идёт из `hello` и owner-route hydration, а не из `/menu`
282
+ - детект работает по хвосту захваченного terminal buffer
376
283
 
377
- ```text
378
- Привяжись к Telegram и дай мне код для pairing.
379
- ```
284
+ Основная эвристика blocker-а:
380
285
 
381
- Если агент работает внутри `tmux`, ему желательно передать `cwd` и tmux-атрибуты уже на этапе pairing, чтобы `Live` и `nudge` заработали сразу.
286
+ - подряд идущие numbered choices: `1.`, `2.`, `3.`
287
+ - рядом есть action hints вроде `press`, `input`, `choose`, `enter`, `esc`, `yes`, `no`
288
+ - в Telegram notice попадают и 1-2 строки контекста выше menu block
382
289
 
383
- ## Telegram setup
290
+ Когда blocker найден, gateway может отправить inline-кнопки:
384
291
 
385
- 1. Открой BotFather.
386
- 2. Создай бота через `/newbot`.
387
- 3. Сохрани токен.
388
- 4. Укажи `TELEGRAM_BOT_USERNAME`, если хочешь deep-link подсказки для pairing.
292
+ - `1..N`
293
+ - `Enter`
294
+ - `Esc`
389
295
 
390
- ## MCP helper
296
+ Эти кнопки отправляют в консоль ровно цифру или terminal action. Навигация маркером не используется.
391
297
 
392
- TellyMCP сам не прописывает себя в конфиг агента.
298
+ Операционные заметки:
393
299
 
394
- Команда:
300
+ - одинаковый blocker fingerprint не перевысылается повторно
301
+ - relay capture miss для offline agent считается debug-only шумом
302
+ - `Storage` и `Screenshots` на gateway теперь relay-aware и читают metadata через gateway routes, а не через filesystem самого gateway
395
303
 
396
- ```bash
397
- tellymcp mcp --help
398
- ```
304
+ ## Collaboration
399
305
 
400
- печатает готовые snippets для:
306
+ Проекты:
401
307
 
402
- - локального standalone клиента
403
- - общего gateway endpoint
404
- - варианта с bearer token
308
+ - live presence консолей идёт из gateway live registry
309
+ - membership проекта хранится отдельно от live presence
310
+ - один client может иметь несколько live консолей одновременно
311
+ - console participation в проекте хранится отдельно
405
312
 
406
- ## Doctor
313
+ Ожидаемое поведение агента:
407
314
 
408
- `doctor` mode-aware.
315
+ - target резолвится через `list_gateway_sessions`
316
+ - входящая работа читается через `list_xchange_records` и `get_xchange_record`
317
+ - реальные файлы возвращаются через `send_partner_file`
318
+ - `mark_xchange_record_read` вызывается только после успешного outbound reply
409
319
 
410
- В `client` режиме проверяет:
320
+ ## Файлы конфигурации
411
321
 
412
- - `tmux`
413
- - `.env`
414
- - Redis
415
- - локальный MCP bind
416
- - внешний `gateway healthz`, если задан `GATEWAY_PUBLIC_URL`
417
- - `GATEWAY_WS_URL`
418
- - `WEBAPP_PUBLIC_URL`
322
+ Канонические стартовые точки:
419
323
 
420
- В `gateway` / `both` режиме проверяет:
324
+ - [.env.example.gateway](./.env.example.gateway)
325
+ - [.env.example.client](./.env.example.client)
421
326
 
422
- - `tmux`
423
- - `.env`
424
- - Redis
425
- - локальный `healthz`
426
- - публичный `healthz`
427
- - публичный `ws`
428
- - публичный `webapp`
429
- - Postgres
430
- - RabbitMQ, если настроен
327
+ Bundled templates:
431
328
 
432
- ## Ключевые переменные
329
+ - [config/templates/env.gateway.template](./config/templates/env.gateway.template)
330
+ - [config/templates/env.client.template](./config/templates/env.client.template)
331
+ - [config/templates/env.both.template](./config/templates/env.both.template)
433
332
 
434
- Общие:
333
+ Samples уже вычищены под текущий runtime:
435
334
 
436
- - `TELEGRAM_BOT_TOKEN`
437
- - `TELEGRAM_BOT_USERNAME`
438
- - `REDIS_HOST`
439
- - `REDIS_PORT`
440
- - `REDIS_DB`
441
- - `MODE=queue|reject`
442
- - `PAIR_CODE_TTL_SECONDS`
443
- - `MCP_HTTP_HOST`
444
- - `MCP_HTTP_PORT`
445
- - `MCP_HTTP_PATH`
446
- - `MCP_HTTP_BEARER_TOKEN`
447
- - `TMUX_SOCKET_PATH`
448
- - `TMUX_NUDGE_ENABLED`
449
- - `TMUX_NUDGE_DEBOUNCE_SECONDS`
450
- - `TMUX_NUDGE_COOLDOWN_SECONDS`
451
- - `WEBAPP_ENABLED`
452
- - `WEBAPP_BASE_PATH`
453
- - `WEBAPP_LAUNCH_MODE=default|expand|fullscreen`
454
- - `MCP_XCHANGE_DIR`
455
- - `PROXY_USE=http|socks5`
456
- - `HTTP_PROXY`
457
- - `SOCKS5_PROXY`
458
- - `LOG_LEVEL`
459
- - `LOG_FILE_ENABLED`
460
- - `LOG_FILE_PATH`
461
-
462
- Только client:
463
-
464
- - `DISTRIBUTED_MODE=client`
465
- - `GATEWAY_PUBLIC_URL`
466
- - `GATEWAY_WS_URL`
467
- - `GATEWAY_WS_PATH`
468
- - `GATEWAY_AUTH_TOKEN`
469
-
470
- Gateway / both:
335
+ - убраны старые inbox-only настройки
336
+ - убраны obsolete pairing-oriented тексты
337
+ - убраны неиспользуемые секреты вроде `SESSION_SECRET`
338
+ - убран неиспользуемый `APP_NAME`
471
339
 
472
- - `DISTRIBUTED_MODE=gateway|both`
473
- - `PORT`
474
- - `ROOT_PREFIX=/api`
475
- - `DB_HOST`
476
- - `DB_PORT`
477
- - `DB_USER`
478
- - `DB_PASSWORD`
479
- - `DB_NAME`
480
- - `RMQ_HOST`
481
- - `RMQ_PORT`
482
- - `RMQ_USER`
483
- - `RMQ_PASSWORD`
484
- - `RMQ_VHOST`
485
- - `RMQ_EXCHANGE`
340
+ ## Операционные команды
486
341
 
487
- Готовые шаблоны:
342
+ Проверка окружения:
488
343
 
489
- - `.env.example.client`
490
- - `.env.example.gateway`
491
- - `tellymcp init client|gateway|both`
344
+ ```bash
345
+ tellymcp doctor --env .env
346
+ ```
492
347
 
493
- ## Что умеет
348
+ Разрушительная очистка local+gateway state:
494
349
 
495
- Базовый поток такой:
350
+ ```bash
351
+ tellymcp system-prune --env .env --yes
352
+ ```
496
353
 
497
- 1. Агент создаёт или обновляет session context.
498
- 2. Агент вызывает `create_session_pair_code`.
499
- 3. Человек делает `/start <code>` или `/link <code>` в Telegram.
500
- 4. После pairing бот открывает меню сессий, inbox, storage, local/collab и live view.
501
- 5. Агент вызывает `ask_user_telegram` для связанной `session_id`.
502
- 6. Ответ пользователя возвращается как MCP tool output.
503
- 7. Несвязанные входящие Telegram-сообщения остаются в inbox этой сессии.
504
- 8. Файлы и note попадают в `.mcp-xchange`.
354
+ ## Карта документации
505
355
 
506
- ## Полезные команды
356
+ - [README.md](./README.md)
357
+ - [STANDALONE.md](./docs/STANDALONE.md)
358
+ - [STANDALONE-ru.md](./docs/STANDALONE-ru.md)
359
+ - [TOOLS.md](./TOOLS.md)
360
+ - [screenshots/README.md](./screenshots/README.md)
507
361
 
508
- ```bash
509
- tellymcp help
510
- tellymcp doctor --env .env
511
- tellymcp mcp --help
512
- tellymcp run --env .env
513
- ```
362
+ ## Статус
514
363
 
515
- ## Для разработки
364
+ Этот README описывает текущую gateway-first модель.
516
365
 
517
- См.:
366
+ Legacy concepts, которые не стоит использовать в новых setup:
518
367
 
519
- - [README.md](README.md)
520
- - [docs/DEVELOPMENT.md](docs/DEVELOPMENT.md)
521
- - [TOOLS.md](TOOLS.md)
368
+ - pairing codes
369
+ - session inbox APIs
370
+ - `Local` partner menu
371
+ - linked-session flows вне `partner_note` / project collaboration