@deadragdoll/tellymcp 0.0.14 → 0.0.15

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 (44) hide show
  1. package/.env.example.client +19 -39
  2. package/.env.example.gateway +40 -64
  3. package/CHANGELOG.md +27 -0
  4. package/README-ru.md +66 -6
  5. package/README.md +66 -6
  6. package/TOOLS.md +38 -1
  7. package/config/templates/env.both.template +4 -5
  8. package/config/templates/env.client.template +4 -17
  9. package/config/templates/env.gateway.template +4 -29
  10. package/dist/cli.js +225 -47
  11. package/dist/configureServer.js +966 -0
  12. package/dist/envMigration.js +316 -0
  13. package/dist/moleculer.config.js +1 -3
  14. package/dist/services/features/telegram-mcp/approval.service.js +1 -1
  15. package/dist/services/features/telegram-mcp/collaboration.service.js +2 -2
  16. package/dist/services/features/telegram-mcp/ensuredb.service.js +1 -1
  17. package/dist/services/features/telegram-mcp/gateway.service.js +1 -1
  18. package/dist/services/features/telegram-mcp/mcp-server.service.js +2 -0
  19. package/dist/services/features/telegram-mcp/session-context.service.js +25 -1
  20. package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +70 -66
  21. package/dist/services/features/telegram-mcp/src/app/config/env.js +10 -36
  22. package/dist/services/features/telegram-mcp/src/app/config/environmentContract.js +66 -0
  23. package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +28 -2
  24. package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +2 -2
  25. package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +5 -5
  26. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +1 -1
  27. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +4 -4
  28. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +0 -1
  29. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +4 -3
  30. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +4 -4
  31. package/dist/services/features/telegram-mcp/src/features/session-context/model/getRuntimeDiagnosticsTool.js +30 -0
  32. package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +169 -7
  33. package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalStateStore.js +260 -0
  34. package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +1 -1
  35. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +1 -1
  36. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +2 -2
  37. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +1 -1
  38. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +2 -2
  39. package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +5 -5
  40. package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +10 -0
  41. package/docs/STANDALONE-ru.md +29 -4
  42. package/docs/STANDALONE.md +29 -4
  43. package/package.json +1 -1
  44. package/scripts/postinstall.js +33 -1
@@ -1,21 +1,14 @@
1
- # TellyMCP client example
1
+ # TellyMCP agent-console example. See docs/ENVIRONMENT.md for the complete contract.
2
2
 
3
- # Optional project label shown in prompts.
3
+ # Workspace identity. NEW generates a stable value on first run.
4
4
  # PROJECT_NAME=
5
+ TELLYMCP_SESSION_ID=NEW
6
+ TELLYMCP_SESSION_LABEL=NEW
5
7
 
6
- # Optional explicit session identity for the first run.
7
- # TELLYMCP_SESSION_ID=NEW
8
- # TELLYMCP_SESSION_LABEL=NEW
9
-
10
- REDIS_HOST=127.0.0.1
11
- REDIS_PORT=6379
12
- REDIS_DB=1
13
- # REDIS_USERNAME=
14
- # REDIS_PASSWORD=
15
-
16
- MODE=reject
17
- PAIR_CODE_TTL_SECONDS=300
8
+ # Local runtime state is process-local; Redis is not used by clients.
9
+ TELEGRAM_REQUEST_MODE=reject
18
10
 
11
+ # Local MCP endpoint exposed to the agent.
19
12
  MCP_HTTP_HOST=127.0.0.1
20
13
  MCP_HTTP_PORT=8787
21
14
  MCP_HTTP_PATH=/mcp
@@ -23,25 +16,26 @@ MCP_HTTP_PATH=/mcp
23
16
  MCP_HTTP_ENABLE_DEBUG_ROUTES=false
24
17
  MCP_HTTP_ENABLE_PRUNE_ROUTE=false
25
18
 
19
+ # Gateway connection.
26
20
  DISTRIBUTED_MODE=client
27
21
  GATEWAY_PUBLIC_URL=https://your-domain.example/api/gateway
28
22
  GATEWAY_WS_URL=wss://your-domain.example/api/gateway/ws
29
- GATEWAY_WS_PATH=/api/gateway/ws
30
- GATEWAY_TOKEN=change_me_gateway_token
23
+ # GATEWAY_WS_PATH=/api/gateway/ws
24
+ # Optional data-scope key. Must match the gateway when used.
25
+ GATEWAY_SCOPE_TOKEN=change_me_scope_token
26
+ # Optional owner binding for Telegram visibility.
31
27
  GATEWAY_USER_UUID=
32
- GATEWAY_AUTH_TOKEN=
28
+ # Required shared HTTP/WebSocket transport credential.
29
+ GATEWAY_AUTH_TOKEN=change_me_transport_token
33
30
 
31
+ # Built-in PTY runtime.
34
32
  TERMINAL_SHELL=bash
35
33
  TERMINAL_COLS=120
36
34
  TERMINAL_ROWS=40
37
35
  TERMINAL_SCROLLBACK_LINES=4000
38
-
39
36
  TERMINAL_NUDGE_ENABLED=true
40
37
  TERMINAL_NUDGE_DEBOUNCE_SECONDS=10
41
38
  TERMINAL_NUDGE_COOLDOWN_SECONDS=30
42
- TERMINAL_NUDGE_MESSAGE=получи newest telegram_message через list_xchange_records/get_xchange_record, выполни запрос и ответь человеку через notify_telegram; не останавливайся на анализе
43
- TERMINAL_PARTNER_NUDGE_MESSAGE=получи newest partner_note через list_xchange_records/get_xchange_record, выполни задачу в текущей консоли и обязательно отправь результат через send_partner_note или send_partner_file; только потом mark_xchange_record_read
44
- TERMINAL_PARTNER_REPLY_NUDGE_MESSAGE=получи newest partner_note через list_xchange_records/get_xchange_record; если newest note имеет kind=reply или не требует ответа, не отправляй новый send_partner_note/send_partner_file без явного нового запроса. Если этот reply завершает задачу от человека, сразу отправь финальный результат в Telegram через notify_telegram или send_file_to_telegram; только потом mark_xchange_record_read
45
39
  TERMINAL_CAPTURE_MODE=visible
46
40
  TERMINAL_CAPTURE_LINES=300
47
41
  TERMINAL_PROMPT_SCAN_ENABLED=true
@@ -49,18 +43,8 @@ TERMINAL_PROMPT_SCAN_INTERVAL_SECONDS=15
49
43
  TERMINAL_PROMPT_SCAN_COOLDOWN_SECONDS=120
50
44
  TERMINAL_PROMPT_SCAN_STRATEGY=strict
51
45
  TERMINAL_PROMPT_SCAN_MIN_SCORE=5
52
- WEBAPP_ENABLED=true
53
- WEBAPP_BASE_PATH=/webapp
54
- WEBAPP_PUBLIC_URL=https://your-domain.example/api/webapp
55
- WEBAPP_INITDATA_TTL_SECONDS=300
56
- WEBAPP_SESSION_TTL_SECONDS=900
57
- WEBAPP_LAUNCH_MODE=fullscreen
58
- WEBAPP_VISIBLE_SCREENS=10
59
- WEBAPP_POLL_INTERVAL_MS=2000
60
- WEBAPP_ACTION_COOLDOWN_MS=150
61
-
62
- MCP_XCHANGE_DIR=.mcp-xchange
63
46
 
47
+ # Browser automation and optional attach bridge.
64
48
  BROWSER_ENABLED=true
65
49
  BROWSER_HEADLESS=false
66
50
  BROWSER_DEVTOOLS=false
@@ -76,16 +60,12 @@ BROWSER_SLOW_MO_MS=0
76
60
  # BROWSER_ATTACH_WS_PORT=9999
77
61
  # BROWSER_ATTACH_WS_PATH=/browser-attach/ws
78
62
 
63
+ MCP_XCHANGE_DIR=.mcp-xchange
79
64
  NAMESPACE=mcp
80
65
  NODE_ID=agent
81
-
82
- # Optional outbound proxy.
83
- # PROXY_USE=http
84
- # HTTP_PROXY=http://user:pass@proxy.example:3128
85
- # SOCKS5_PROXY=socks5h://user:pass@proxy.example:1080
86
-
87
66
  LOG_LEVEL=info
88
67
  LOG_FILE_ENABLED=false
89
68
  LOG_FILE_PATH=.tellymcp/log.jsonl
90
69
  # LOG_STDERR_LEVEL=error
91
- ENABLE_LOGFEED=0
70
+ # LOG_FILE_LEVEL=info
71
+ LOGFEED_ENABLED=false
@@ -1,7 +1,35 @@
1
- # TellyMCP gateway example
1
+ # TellyMCP gateway example. See docs/ENVIRONMENT.md for the complete contract.
2
2
 
3
+ # Required gateway identity and infrastructure.
3
4
  TELEGRAM_BOT_TOKEN=
4
5
  TELEGRAM_BOT_USERNAME=
6
+ REDIS_HOST=127.0.0.1
7
+ REDIS_PORT=6379
8
+ REDIS_DB=1
9
+ # REDIS_USERNAME=
10
+ # REDIS_PASSWORD=
11
+ DB_HOST=127.0.0.1
12
+ DB_PORT=5432
13
+ DB_USER=user
14
+ DB_PASSWORD=password
15
+ DB_NAME=mydb
16
+ DB_SCHEMA=mcp
17
+
18
+ # Public gateway transport.
19
+ DISTRIBUTED_MODE=gateway
20
+ GATEWAY_PUBLIC_URL=https://your-domain.example/api/gateway
21
+ GATEWAY_WS_URL=wss://your-domain.example/api/gateway/ws
22
+ # Optional data-scope key. This is not an authentication credential.
23
+ GATEWAY_SCOPE_TOKEN=change_me_scope_token
24
+ # Required shared HTTP/WebSocket transport credential.
25
+ GATEWAY_AUTH_TOKEN=change_me_transport_token
26
+ ROOT_PREFIX=/api
27
+ PORT=8080
28
+ MCP_HTTP_HOST=0.0.0.0
29
+ MCP_HTTP_PATH=/mcp
30
+
31
+ # Request handling and operator access.
32
+ TELEGRAM_REQUEST_MODE=reject
5
33
  # ADMIN_TOKEN=
6
34
  # DEBUG_LANGUAGE=ru
7
35
 
@@ -13,23 +41,12 @@ TELEGRAM_BOT_USERNAME=
13
41
  # TELEGRAM_WEBHOOK_TRACE=false
14
42
  # TELEGRAM_WEBHOOK_DROP_PENDING_UPDATES=false
15
43
 
16
- REDIS_HOST=127.0.0.1
17
- REDIS_PORT=6379
18
- REDIS_DB=1
19
- # REDIS_USERNAME=
20
- # REDIS_PASSWORD=
21
-
22
- MODE=reject
23
- PAIR_CODE_TTL_SECONDS=300
24
-
25
- MCP_HTTP_HOST=127.0.0.1
26
- MCP_HTTP_PORT=8787
27
- MCP_HTTP_PATH=/mcp
44
+ # Optional static bearer auth for internal MCP clients.
28
45
  # MCP_HTTP_BEARER_TOKEN=
29
46
  MCP_HTTP_ENABLE_DEBUG_ROUTES=false
30
47
  MCP_HTTP_ENABLE_PRUNE_ROUTE=false
31
48
 
32
- # ChatGPT / Claude OAuth connector. Setting any OAuth value enables the facade.
49
+ # ChatGPT / Claude OAuth facade. Setting any OAuth value enables it.
33
50
  # TELLYMCP_PUBLIC_URL=https://your-domain.example/api
34
51
  # TELLYMCP_OAUTH_ISSUER=https://your-domain.example/api
35
52
  # TELLYMCP_OAUTH_AUDIENCE=https://your-domain.example/api
@@ -43,26 +60,6 @@ MCP_HTTP_ENABLE_PRUNE_ROUTE=false
43
60
  # TELLYMCP_OAUTH_SCOPES=tellymcp:read tellymcp:write
44
61
  # TELLYMCP_OAUTH_KEY_ID=tellymcp-oauth
45
62
 
46
- DISTRIBUTED_MODE=gateway
47
- # Also used to derive short-lived file URLs under /api/files/.
48
- GATEWAY_PUBLIC_URL=https://your-domain.example/api/gateway
49
- GATEWAY_WS_URL=wss://your-domain.example/api/gateway/ws
50
- GATEWAY_WS_PATH=/api/gateway/ws
51
- GATEWAY_TOKEN=change_me_gateway_token
52
- GATEWAY_AUTH_TOKEN=
53
-
54
- ROOT_PREFIX=/api
55
- PORT=8080
56
- NAMESPACE=mcp
57
- NODE_ID=GWAY
58
-
59
- DB_HOST=127.0.0.1
60
- DB_PORT=5432
61
- DB_USER=
62
- DB_PASSWORD=
63
- DB_NAME=
64
- DB_SCHEME=mcp
65
-
66
63
  # Optional RabbitMQ fanout.
67
64
  # RMQ_HOST=127.0.0.1
68
65
  # RMQ_PORT=5672
@@ -71,54 +68,33 @@ DB_SCHEME=mcp
71
68
  # RMQ_VHOST=/
72
69
  # RMQ_EXCHANGE=telegram_mcp.gateway
73
70
 
71
+ # Telegram Mini App.
74
72
  WEBAPP_ENABLED=true
75
73
  WEBAPP_BASE_PATH=/webapp
76
74
  WEBAPP_PUBLIC_URL=https://your-domain.example/api/webapp
77
75
  WEBAPP_INITDATA_TTL_SECONDS=300
78
76
  WEBAPP_SESSION_TTL_SECONDS=900
79
77
  WEBAPP_LAUNCH_MODE=fullscreen
80
- WEBAPP_VISIBLE_SCREENS=10
81
- WEBAPP_POLL_INTERVAL_MS=2000
78
+ WEBAPP_VISIBLE_SCREENS=2
82
79
  WEBAPP_ACTION_COOLDOWN_MS=150
83
80
 
84
- MCP_XCHANGE_DIR=.mcp-xchange
85
-
86
- TERMINAL_SHELL=bash
87
- TERMINAL_COLS=120
88
- TERMINAL_ROWS=40
89
- TERMINAL_SCROLLBACK_LINES=4000
90
-
91
- TERMINAL_NUDGE_ENABLED=true
92
- TERMINAL_NUDGE_DEBOUNCE_SECONDS=10
93
- TERMINAL_NUDGE_COOLDOWN_SECONDS=30
94
- TERMINAL_NUDGE_MESSAGE=получи newest telegram_message через list_xchange_records/get_xchange_record, выполни запрос и ответь человеку через notify_telegram; не останавливайся на анализе
95
- TERMINAL_PARTNER_NUDGE_MESSAGE=получи newest partner_note через list_xchange_records/get_xchange_record, выполни задачу в текущей консоли и обязательно отправь результат через send_partner_note или send_partner_file; только потом mark_xchange_record_read
96
- TERMINAL_PARTNER_REPLY_NUDGE_MESSAGE=получи newest partner_note через list_xchange_records/get_xchange_record; если newest note имеет kind=reply или не требует ответа, не отправляй новый send_partner_note/send_partner_file без явного нового запроса. Если этот reply завершает задачу от человека, сразу отправь финальный результат в Telegram через notify_telegram или send_file_to_telegram; только потом mark_xchange_record_read
97
- TERMINAL_CAPTURE_MODE=visible
98
- TERMINAL_CAPTURE_LINES=300
81
+ # Gateway-side terminal prompt detection.
99
82
  TERMINAL_PROMPT_SCAN_ENABLED=false
100
83
  TERMINAL_PROMPT_SCAN_INTERVAL_SECONDS=15
101
84
  TERMINAL_PROMPT_SCAN_COOLDOWN_SECONDS=120
102
85
  TERMINAL_PROMPT_SCAN_STRATEGY=strict
103
86
  TERMINAL_PROMPT_SCAN_MIN_SCORE=5
104
- BROWSER_ENABLED=false
105
- BROWSER_HEADLESS=false
106
- BROWSER_DEVTOOLS=false
107
- # BROWSER_ADDRESS=http://localhost:5173
108
- BROWSER_TIMEOUT_MS=20000
109
- BROWSER_MAX_EVENTS=200
110
- BROWSER_WAIT_UNTIL=load
111
- # BROWSER_EXECUTABLE_PATH=
112
- # BROWSER_CHANNEL=chrome
113
- BROWSER_SLOW_MO_MS=0
114
87
 
115
- # Optional outbound proxy.
88
+ # Optional outbound proxy for Telegram.
116
89
  # PROXY_USE=http
117
90
  # HTTP_PROXY=http://user:pass@proxy.example:3128
118
91
  # SOCKS5_PROXY=socks5h://user:pass@proxy.example:1080
119
92
 
93
+ NAMESPACE=mcp
94
+ NODE_ID=gateway
120
95
  LOG_LEVEL=info
121
- LOG_FILE_ENABLED=true
96
+ LOG_FILE_ENABLED=false
122
97
  LOG_FILE_PATH=.tellymcp/log.jsonl
123
98
  # LOG_STDERR_LEVEL=error
124
- ENABLE_LOGFEED=0
99
+ # LOG_FILE_LEVEL=info
100
+ LOGFEED_ENABLED=false
package/CHANGELOG.md CHANGED
@@ -2,8 +2,29 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ### Changed
6
+
7
+ - CLI больше не загружает `node-pty` до разбора команды: `tellymcp --help`,
8
+ setup и diagnostics остаются доступны при отсутствующем native addon.
9
+ `doctor`, `run` и postinstall теперь реально проверяют `pty.node` и выводят
10
+ platform-aware инструкции для Linux ARM64, npm lifecycle scripts и rebuild.
11
+ - Redis теперь используется только в режимах gateway и `both`. Client runtime
12
+ больше не подключается к Redis и не требует `REDIS_*`; временное состояние
13
+ хранится локально в процессе, а стабильный `gateway_client_uuid` — в
14
+ `.mcpsession.json`. Клиентские шаблоны, migration, configure, doctor, prune и
15
+ runtime diagnostics приведены к этой модели.
16
+
5
17
  ### Added
6
18
 
19
+ - Добавлен локальный web-конфигуратор `tellymcp configure`: browser wizard
20
+ предлагает выбрать Client или Gateway, показывает role-specific поля,
21
+ формирует HTTP/WS/WebApp/webhook/OAuth URL из одного Public base URL,
22
+ показывает русские hints и примеры, выполняет role-specific live-check
23
+ Telegram, Redis, PostgreSQL, gateway HTTP/WS и RabbitMQ, затем скачивает
24
+ `.env-client` либо `.env-gateway`.
25
+ - Добавлен безопасный MCP tool `get_runtime_diagnostics` для end-to-end проверки
26
+ версии/protocol, принятой env-схемы, runtime state store, PTY, gateway config и
27
+ gateway-to-client relay без вывода секретов; Redis проверяется только на gateway.
7
28
  - Добавлены связанные MCP tools `get_file_list` и `get_file` для получения
8
29
  файлов из workspace выбранной live-консоли через gateway. Первый возвращает
9
30
  список managed files и точные пути, второй принимает `file_path` либо
@@ -24,6 +45,9 @@
24
45
  - Доступ к live `.env`, credential stores, private-key расширениям и чувствительным
25
46
  директориям теперь блокируется на клиенте до чтения или отправки файла; выход
26
47
  за workspace и через symlink по-прежнему запрещён.
48
+ - Имена временных gateway-файлов очищаются до безопасного basename: управляющие
49
+ и файлово-зарезервированные символы заменяются перед сохранением и формированием
50
+ `Content-Disposition`.
27
51
  - Перенос `telegram_mcp` на сервисную архитектуру `Moleculer`:
28
52
  - `telegramMcp.runtime`
29
53
  - `telegramMcp.http`
@@ -143,6 +167,9 @@
143
167
 
144
168
  ### Fixed
145
169
 
170
+ - Remote session-context actions больше не пытаются повторно уйти с client node
171
+ обратно в gateway без `clientUuid`; backend error payload дополнительно
172
+ ограничен по размеру, чтобы relay-сбой не создавал рекурсивный exception.
146
173
  - Исправлен `Headers have already sent` при работе MCP/WebApp через общий HTTP runtime.
147
174
  - Исправлены route/alias проблемы после перехода под `${ROOT_PREFIX}`.
148
175
  - Исправлены зависания Mini App bootstrap и проблемы с relative WebApp routes.
package/README-ru.md CHANGED
@@ -76,6 +76,10 @@ Gateway
76
76
  - `send_partner_file`
77
77
  - `list_gateway_sessions`
78
78
 
79
+ Для диагностики:
80
+
81
+ - `get_runtime_diagnostics` для безопасной end-to-end проверки gateway/client
82
+
79
83
  Для браузера:
80
84
 
81
85
  - `browser_open`
@@ -106,17 +110,38 @@ Gateway
106
110
  ## Требования
107
111
 
108
112
  - Node.js `>= 24`
109
- - Redis
113
+ - Python 3, `make` и C/C++ toolchain на Linux для локальной сборки native addon `node-pty`; npm lifecycle scripts должны быть включены
114
+ - Redis только для режимов gateway и `both`; клиент Redis не использует
110
115
  - PostgreSQL для gateway mode
111
116
  - опционально RabbitMQ для durable gateway fanout
112
117
  - Playwright browser binaries, если нужны browser tools
113
118
 
114
119
  ## Установка
115
120
 
121
+ На Debian/Ubuntu сначала установи зависимости для сборки native PTY:
122
+
123
+ ```bash
124
+ sudo apt install -y python3 make g++
125
+ npm config set ignore-scripts false
126
+ ```
127
+
116
128
  ```bash
117
- npm install -g @deadragdoll/tellymcp
129
+ npm install -g @deadragdoll/tellymcp --foreground-scripts
118
130
  ```
119
131
 
132
+ Опубликованная зависимость `node-pty` не содержит готового Linux ARM64 binary,
133
+ поэтому install lifecycle собирает `pty.node` локально. Если пакет ранее
134
+ установился без него, восстанови глобальную установку:
135
+
136
+ ```bash
137
+ npm rebuild -g @deadragdoll/tellymcp --foreground-scripts
138
+ tellymcp doctor --env <file>
139
+ ```
140
+
141
+ `tellymcp --help` и setup-команды не загружают native PTY. Runtime проверяет
142
+ модуль перед запуском и вместо сырого stack trace выводит те же инструкции по
143
+ восстановлению.
144
+
120
145
  Если нужны browser tools:
121
146
 
122
147
  ```bash
@@ -150,9 +175,20 @@ tellymcp codex-plugin install
150
175
  ```bash
151
176
  mkdir -p ~/telly-gateway
152
177
  cd ~/telly-gateway
153
- tellymcp init gateway
178
+ tellymcp configure
154
179
  ```
155
180
 
181
+ Команда открывает защищённую одноразовым токеном локальную страницу на
182
+ `127.0.0.1`. Выбери в wizard роль `Gateway`, заполни и проверь настройки, затем
183
+ сохрани `.env-gateway` обычным browser download. Перед использованием выставь
184
+ файлу права `0600`. `tellymcp init gateway` остаётся вариантом для ручного
185
+ редактирования шаблона.
186
+
187
+ Публичный origin или API base вводится один раз. Wizard сам формирует gateway
188
+ HTTP, WebSocket, Mini App, webhook, root-prefix и опциональные OAuth URL.
189
+ На ключевых этапах доступны реальные проверки Telegram, Redis, PostgreSQL,
190
+ gateway HTTP/WebSocket и опционального RabbitMQ.
191
+
156
192
  Или возьми sample:
157
193
 
158
194
  - [.env.example.gateway](./.env.example.gateway)
@@ -167,7 +203,7 @@ tellymcp init gateway
167
203
  - `DB_NAME`
168
204
  - `GATEWAY_PUBLIC_URL`
169
205
  - `GATEWAY_WS_URL`
170
- - `GATEWAY_TOKEN`
206
+ - `GATEWAY_SCOPE_TOKEN`
171
207
  - `GATEWAY_AUTH_TOKEN`
172
208
 
173
209
  Запуск:
@@ -183,9 +219,17 @@ tellymcp run --env .env
183
219
  ```bash
184
220
  mkdir -p ~/agent-a
185
221
  cd ~/agent-a
186
- tellymcp init client
222
+ tellymcp configure
187
223
  ```
188
224
 
225
+ Выбери в wizard роль `Client`. В форме есть подключение к gateway, identity
226
+ консоли, terminal, browser, MCP и расширенные runtime-настройки. После
227
+ валидации браузер скачает `.env-client`. Флаг `--no-open` выводит локальный URL
228
+ без автоматического открытия браузера.
229
+
230
+ Для клиента тот же Public base URL автоматически формирует
231
+ `GATEWAY_PUBLIC_URL`, `GATEWAY_WS_URL` и `GATEWAY_WS_PATH`.
232
+
189
233
  Или используй sample:
190
234
 
191
235
  - [.env.example.client](./.env.example.client)
@@ -194,7 +238,7 @@ tellymcp init client
194
238
 
195
239
  - `GATEWAY_PUBLIC_URL`
196
240
  - `GATEWAY_WS_URL`
197
- - `GATEWAY_TOKEN`
241
+ - `GATEWAY_SCOPE_TOKEN`
198
242
  - `GATEWAY_AUTH_TOKEN` (тот же transport-токен, который задан на gateway)
199
243
  - `GATEWAY_USER_UUID`, если консоль должна быть видна конкретному владельцу в gateway-боте
200
244
 
@@ -214,6 +258,10 @@ tellymcp run --env .env -s NEW
214
258
  - `local_session_id`
215
259
  - `session_label`
216
260
  - `env_file`
261
+ - `gateway_client_uuid`
262
+
263
+ Runtime-состояние клиента локальное и не требует Redis. Сохранённый
264
+ `gateway_client_uuid` обеспечивает стабильную идентичность после перезапуска.
217
265
 
218
266
  Поэтому дальше в том же каталоге обычно достаточно:
219
267
 
@@ -353,6 +401,7 @@ Gateway prompt scanner теперь живёт от live-client lifecycle:
353
401
 
354
402
  Канонические стартовые точки:
355
403
 
404
+ - [Контракт env и руководство по миграции](./docs/ENVIRONMENT.md)
356
405
  - [.env.example.gateway](./.env.example.gateway)
357
406
  - [.env.example.client](./.env.example.client)
358
407
 
@@ -368,6 +417,8 @@ Samples уже вычищены под текущий runtime:
368
417
  - убраны obsolete pairing-oriented тексты
369
418
  - убраны неиспользуемые секреты вроде `SESSION_SECRET`
370
419
  - убран неиспользуемый `APP_NAME`
420
+ - неоднозначные старые имена заменены на `TERMINAL_*`, `GATEWAY_SCOPE_TOKEN`,
421
+ `TELEGRAM_REQUEST_MODE`, `DB_SCHEMA` и `LOGFEED_ENABLED`
371
422
 
372
423
  ## Операционные команды
373
424
 
@@ -383,6 +434,15 @@ tellymcp doctor --env .env
383
434
  tellymcp system-prune --env .env --yes
384
435
  ```
385
436
 
437
+ Миграция старого env в текущий ролевой контракт:
438
+
439
+ ```bash
440
+ tellymcp migrate-env ./old.env > ./.migrated-env
441
+ ```
442
+
443
+ Fallback на старую схему отсутствует. Если найдены legacy-ключи, запуск
444
+ останавливается и выводит команду миграции.
445
+
386
446
  ## Карта документации
387
447
 
388
448
  - [README.md](./README.md)
package/README.md CHANGED
@@ -76,6 +76,10 @@ Agent-to-agent:
76
76
  - `send_partner_file`
77
77
  - `list_gateway_sessions`
78
78
 
79
+ Diagnostics:
80
+
81
+ - `get_runtime_diagnostics` for safe end-to-end gateway/client health checks
82
+
79
83
  Browser:
80
84
 
81
85
  - `browser_open`
@@ -106,17 +110,38 @@ Tools sync:
106
110
  ## Requirements
107
111
 
108
112
  - Node.js `>= 24`
109
- - Redis
113
+ - Python 3, `make`, and a C/C++ toolchain on Linux so `node-pty` can build its native addon; npm lifecycle scripts must be enabled
114
+ - Redis for gateway and `both` modes only; clients do not use Redis
110
115
  - PostgreSQL for gateway mode
111
116
  - optional RabbitMQ for durable gateway fanout
112
117
  - Playwright browser binaries if you use browser tools
113
118
 
114
119
  ## Installation
115
120
 
121
+ On Debian/Ubuntu, install the native PTY build prerequisites first:
122
+
123
+ ```bash
124
+ sudo apt install -y python3 make g++
125
+ npm config set ignore-scripts false
126
+ ```
127
+
116
128
  ```bash
117
- npm install -g @deadragdoll/tellymcp
129
+ npm install -g @deadragdoll/tellymcp --foreground-scripts
118
130
  ```
119
131
 
132
+ The published `node-pty` dependency does not provide a Linux ARM64 binary, so
133
+ the install lifecycle builds `pty.node` locally. If a previous installation
134
+ completed without it, repair the global package with:
135
+
136
+ ```bash
137
+ npm rebuild -g @deadragdoll/tellymcp --foreground-scripts
138
+ tellymcp doctor --env <file>
139
+ ```
140
+
141
+ `tellymcp --help` and setup commands do not load the native PTY module. Runtime
142
+ startup validates it and prints the same recovery instructions instead of a
143
+ raw native-module stack trace.
144
+
120
145
  Optional browser runtime:
121
146
 
122
147
  ```bash
@@ -150,9 +175,20 @@ Create a gateway workspace and env:
150
175
  ```bash
151
176
  mkdir -p ~/telly-gateway
152
177
  cd ~/telly-gateway
153
- tellymcp init gateway
178
+ tellymcp configure
154
179
  ```
155
180
 
181
+ This opens a token-protected local page on `127.0.0.1`. Choose `Gateway` in the
182
+ wizard, fill and validate the settings, then save `.env-gateway` through the
183
+ normal browser download flow. Set its permissions to `0600` before use. Use
184
+ `tellymcp init gateway` when you specifically want a commented template for
185
+ manual editing.
186
+
187
+ Enter the public origin or API base only once. The wizard derives gateway HTTP,
188
+ WebSocket, Mini App, webhook, root-prefix, and optional OAuth connector URLs.
189
+ The key stages include live connection checks for Telegram, Redis, PostgreSQL,
190
+ the gateway HTTP/WebSocket endpoints, and optional RabbitMQ.
191
+
156
192
  Or copy the sample from this package:
157
193
 
158
194
  - [.env.example.gateway](./.env.example.gateway)
@@ -167,7 +203,7 @@ Required gateway values:
167
203
  - `DB_NAME`
168
204
  - `GATEWAY_PUBLIC_URL`
169
205
  - `GATEWAY_WS_URL`
170
- - `GATEWAY_TOKEN`
206
+ - `GATEWAY_SCOPE_TOKEN`
171
207
  - `GATEWAY_AUTH_TOKEN`
172
208
 
173
209
  Then run:
@@ -183,9 +219,17 @@ Create one workspace per agent console:
183
219
  ```bash
184
220
  mkdir -p ~/agent-a
185
221
  cd ~/agent-a
186
- tellymcp init client
222
+ tellymcp configure
187
223
  ```
188
224
 
225
+ Choose `Client` in the wizard. The form includes the gateway connection, local
226
+ console identity, terminal, browser, MCP, and advanced runtime settings.
227
+ After validation the browser downloads `.env-client`. Use `--no-open` to print
228
+ the local URL without opening a browser automatically.
229
+
230
+ For clients, the same Public base URL automatically produces
231
+ `GATEWAY_PUBLIC_URL`, `GATEWAY_WS_URL`, and `GATEWAY_WS_PATH`.
232
+
189
233
  Or copy:
190
234
 
191
235
  - [.env.example.client](./.env.example.client)
@@ -194,7 +238,7 @@ Required client values:
194
238
 
195
239
  - `GATEWAY_PUBLIC_URL`
196
240
  - `GATEWAY_WS_URL`
197
- - `GATEWAY_TOKEN`
241
+ - `GATEWAY_SCOPE_TOKEN`
198
242
  - `GATEWAY_AUTH_TOKEN` (the same transport token configured on the gateway)
199
243
  - `GATEWAY_USER_UUID` if this console should be scoped to a specific Telegram owner
200
244
 
@@ -214,6 +258,10 @@ After that, `.mcpsession.json` stores:
214
258
  - `local_session_id`
215
259
  - `session_label`
216
260
  - `env_file`
261
+ - `gateway_client_uuid`
262
+
263
+ Client runtime state is local and does not require Redis. The persisted
264
+ `gateway_client_uuid` keeps the client identity stable across restarts.
217
265
 
218
266
  So later the same workspace can usually start with:
219
267
 
@@ -352,6 +400,7 @@ Expected agent behavior:
352
400
 
353
401
  Use the shipped samples as the canonical starting point:
354
402
 
403
+ - [Environment contract and migration guide](./docs/ENVIRONMENT.md)
355
404
  - [.env.example.gateway](./.env.example.gateway)
356
405
  - [.env.example.client](./.env.example.client)
357
406
 
@@ -367,6 +416,8 @@ The samples were cleaned to match the current runtime:
367
416
  - removed obsolete pairing-oriented wording
368
417
  - removed unused secrets like `SESSION_SECRET`
369
418
  - removed unused `APP_NAME`
419
+ - renamed ambiguous legacy keys to `TERMINAL_*`, `GATEWAY_SCOPE_TOKEN`,
420
+ `TELEGRAM_REQUEST_MODE`, `DB_SCHEMA`, and `LOGFEED_ENABLED`
370
421
 
371
422
  ## Operational Commands
372
423
 
@@ -382,6 +433,15 @@ Destructive local+gateway cleanup:
382
433
  tellymcp system-prune --env .env --yes
383
434
  ```
384
435
 
436
+ Normalize an older env file to the current role-aware contract:
437
+
438
+ ```bash
439
+ tellymcp migrate-env ./old.env > ./.migrated-env
440
+ ```
441
+
442
+ The runtime does not fall back to the old schema. If legacy keys are detected,
443
+ startup stops and prints the migration command.
444
+
385
445
  ## Documentation Map
386
446
 
387
447
  - [README-ru.md](./README-ru.md)
package/TOOLS.md CHANGED
@@ -92,7 +92,7 @@ Utility tools:
92
92
  Gateway-first runtime model:
93
93
 
94
94
  - agents authenticate the gateway HTTP/WS transport through `GATEWAY_AUTH_TOKEN`
95
- and register into their gateway scope through `GATEWAY_TOKEN`
95
+ and register into their gateway scope through `GATEWAY_SCOPE_TOKEN`
96
96
  - Telegram no longer links sessions with pair codes
97
97
  - `/menu` in the gateway bot shows available remote consoles directly
98
98
  - one running agent console is one logical session/console target
@@ -207,6 +207,42 @@ Output:
207
207
  - `terminal?`
208
208
  Terminal runtime metadata for the console.
209
209
 
210
+ ## `get_runtime_diagnostics`
211
+
212
+ Purpose:
213
+
214
+ - Run safe, read-only health checks for one console through the same gateway route used by normal tools.
215
+ - Diagnose configuration, runtime state storage, PTY state, version/protocol metadata, and gateway-to-client relay without returning secrets or raw connection strings.
216
+ - Redis is probed only for gateway/`both` runtimes. On a client, the `redis` compatibility check reports that Redis is not required and process-local state is active.
217
+ - Return a structured degraded result when relay fails instead of a deeply nested backend exception.
218
+
219
+ Input:
220
+
221
+ - `session_id?`
222
+ In gateway mode, use the canonical `session_id` returned by `list_gateway_sessions`.
223
+
224
+ Output:
225
+
226
+ - `status`
227
+ - `ok`
228
+ - `degraded`
229
+ - `checked_at`
230
+ - `session_id`
231
+ - `runtime`
232
+ - `mode`
233
+ - `package_version`
234
+ - `protocol_version`
235
+ - `node_id?`
236
+ - `checks`
237
+ - `configuration`
238
+ - `redis`
239
+ - `session_store`
240
+ - `terminal`
241
+ - `gateway_configuration`
242
+ - `relay`
243
+
244
+ Each check contains only `status` and a redacted human-readable `message`.
245
+
210
246
  ## `get_file_list`
211
247
 
212
248
  Purpose:
@@ -287,6 +323,7 @@ Behavior:
287
323
  - source extensions such as `.ts` and `.tsx` use text MIME overrides instead of the generic MPEG/octet-stream mappings
288
324
  - sensitive paths including live `.env` files, credential stores, private-key extensions, and secret directories are rejected server-side; documented `.env.example`/`.env.sample`/`.env.template` files remain readable
289
325
  - URL mode uploads the file as a binary stream to `.tellymcp/tmp/file-links` on the gateway and returns a link valid for 10 minutes
326
+ - temporary-link filenames are sanitized before storage and download headers: control and filesystem-reserved characters are replaced, while a safe basename is preserved
290
327
  - image mode is explicit: `structuredContent.type` is `image`, `structuredContent.data` contains the URL, and the native top-level MCP `image` is the first content block without duplicating base64 into structured output
291
328
  - image mode accepts only `image/*` files up to the safe native-inline limit; use `url` for larger images
292
329
  - URL links allow up to three GET downloads; HEAD requests do not consume the limit