@deadragdoll/tellymcp 0.0.14 → 0.0.16
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.
- package/.env.example.client +19 -39
- package/.env.example.gateway +40 -64
- package/CHANGELOG.md +31 -0
- package/README-ru.md +67 -6
- package/README.md +67 -6
- package/TOOLS.md +38 -1
- package/config/templates/env.both.template +4 -5
- package/config/templates/env.client.template +4 -17
- package/config/templates/env.gateway.template +4 -29
- package/dist/cli.js +232 -53
- package/dist/configureServer.js +966 -0
- package/dist/envMigration.js +316 -0
- package/dist/moleculer.config.js +1 -3
- package/dist/services/features/telegram-mcp/approval.service.js +1 -1
- package/dist/services/features/telegram-mcp/collaboration.service.js +2 -2
- package/dist/services/features/telegram-mcp/ensuredb.service.js +1 -1
- package/dist/services/features/telegram-mcp/gateway.service.js +1 -1
- package/dist/services/features/telegram-mcp/mcp-server.service.js +2 -0
- package/dist/services/features/telegram-mcp/session-context.service.js +25 -1
- package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +70 -66
- package/dist/services/features/telegram-mcp/src/app/config/env.js +10 -36
- package/dist/services/features/telegram-mcp/src/app/config/environmentContract.js +66 -0
- package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +28 -2
- package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +2 -2
- package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +5 -5
- package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +1 -1
- package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +4 -4
- package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +0 -1
- package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +4 -3
- package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +4 -4
- package/dist/services/features/telegram-mcp/src/features/session-context/model/getRuntimeDiagnosticsTool.js +30 -0
- package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +169 -7
- package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalStateStore.js +260 -0
- package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +1 -1
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +1 -1
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +2 -2
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +1 -1
- package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +2 -2
- package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +5 -5
- package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +10 -0
- package/docs/STANDALONE-ru.md +30 -4
- package/docs/STANDALONE.md +30 -4
- package/package.json +1 -1
- package/scripts/postinstall.js +36 -1
package/.env.example.client
CHANGED
|
@@ -1,21 +1,14 @@
|
|
|
1
|
-
# TellyMCP
|
|
1
|
+
# TellyMCP agent-console example. See docs/ENVIRONMENT.md for the complete contract.
|
|
2
2
|
|
|
3
|
-
#
|
|
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
|
-
#
|
|
7
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
70
|
+
# LOG_FILE_LEVEL=info
|
|
71
|
+
LOGFEED_ENABLED=false
|
package/.env.example.gateway
CHANGED
|
@@ -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
|
-
|
|
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
|
|
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=
|
|
81
|
-
WEBAPP_POLL_INTERVAL_MS=2000
|
|
78
|
+
WEBAPP_VISIBLE_SCREENS=2
|
|
82
79
|
WEBAPP_ACTION_COOLDOWN_MS=150
|
|
83
80
|
|
|
84
|
-
|
|
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=
|
|
96
|
+
LOG_FILE_ENABLED=false
|
|
122
97
|
LOG_FILE_PATH=.tellymcp/log.jsonl
|
|
123
98
|
# LOG_STDERR_LEVEL=error
|
|
124
|
-
|
|
99
|
+
# LOG_FILE_LEVEL=info
|
|
100
|
+
LOGFEED_ENABLED=false
|
package/CHANGELOG.md
CHANGED
|
@@ -2,8 +2,33 @@
|
|
|
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 и чистой
|
|
11
|
+
переустановки пакета.
|
|
12
|
+
- Исправлен `tellymcp doctor`: WebSocket probe больше не удаляет error-listeners
|
|
13
|
+
перед закрытием соединения и не падает с unhandled `WebSocket was closed before
|
|
14
|
+
the connection was established` на HTTP reject, timeout или раннем close.
|
|
15
|
+
- Redis теперь используется только в режимах gateway и `both`. Client runtime
|
|
16
|
+
больше не подключается к Redis и не требует `REDIS_*`; временное состояние
|
|
17
|
+
хранится локально в процессе, а стабильный `gateway_client_uuid` — в
|
|
18
|
+
`.mcpsession.json`. Клиентские шаблоны, migration, configure, doctor, prune и
|
|
19
|
+
runtime diagnostics приведены к этой модели.
|
|
20
|
+
|
|
5
21
|
### Added
|
|
6
22
|
|
|
23
|
+
- Добавлен локальный web-конфигуратор `tellymcp configure`: browser wizard
|
|
24
|
+
предлагает выбрать Client или Gateway, показывает role-specific поля,
|
|
25
|
+
формирует HTTP/WS/WebApp/webhook/OAuth URL из одного Public base URL,
|
|
26
|
+
показывает русские hints и примеры, выполняет role-specific live-check
|
|
27
|
+
Telegram, Redis, PostgreSQL, gateway HTTP/WS и RabbitMQ, затем скачивает
|
|
28
|
+
`.env-client` либо `.env-gateway`.
|
|
29
|
+
- Добавлен безопасный MCP tool `get_runtime_diagnostics` для end-to-end проверки
|
|
30
|
+
версии/protocol, принятой env-схемы, runtime state store, PTY, gateway config и
|
|
31
|
+
gateway-to-client relay без вывода секретов; Redis проверяется только на gateway.
|
|
7
32
|
- Добавлены связанные MCP tools `get_file_list` и `get_file` для получения
|
|
8
33
|
файлов из workspace выбранной live-консоли через gateway. Первый возвращает
|
|
9
34
|
список managed files и точные пути, второй принимает `file_path` либо
|
|
@@ -24,6 +49,9 @@
|
|
|
24
49
|
- Доступ к live `.env`, credential stores, private-key расширениям и чувствительным
|
|
25
50
|
директориям теперь блокируется на клиенте до чтения или отправки файла; выход
|
|
26
51
|
за workspace и через symlink по-прежнему запрещён.
|
|
52
|
+
- Имена временных gateway-файлов очищаются до безопасного basename: управляющие
|
|
53
|
+
и файлово-зарезервированные символы заменяются перед сохранением и формированием
|
|
54
|
+
`Content-Disposition`.
|
|
27
55
|
- Перенос `telegram_mcp` на сервисную архитектуру `Moleculer`:
|
|
28
56
|
- `telegramMcp.runtime`
|
|
29
57
|
- `telegramMcp.http`
|
|
@@ -143,6 +171,9 @@
|
|
|
143
171
|
|
|
144
172
|
### Fixed
|
|
145
173
|
|
|
174
|
+
- Remote session-context actions больше не пытаются повторно уйти с client node
|
|
175
|
+
обратно в gateway без `clientUuid`; backend error payload дополнительно
|
|
176
|
+
ограничен по размеру, чтобы relay-сбой не создавал рекурсивный exception.
|
|
146
177
|
- Исправлен `Headers have already sent` при работе MCP/WebApp через общий HTTP runtime.
|
|
147
178
|
- Исправлены route/alias проблемы после перехода под `${ROOT_PREFIX}`.
|
|
148
179
|
- Исправлены зависания 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,39 @@ Gateway
|
|
|
106
110
|
## Требования
|
|
107
111
|
|
|
108
112
|
- Node.js `>= 24`
|
|
109
|
-
-
|
|
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 uninstall -g @deadragdoll/tellymcp
|
|
138
|
+
npm install -g @deadragdoll/tellymcp@latest --foreground-scripts
|
|
139
|
+
tellymcp doctor --env <file>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`tellymcp --help` и setup-команды не загружают native PTY. Runtime проверяет
|
|
143
|
+
модуль перед запуском и вместо сырого stack trace выводит те же инструкции по
|
|
144
|
+
восстановлению.
|
|
145
|
+
|
|
120
146
|
Если нужны browser tools:
|
|
121
147
|
|
|
122
148
|
```bash
|
|
@@ -150,9 +176,20 @@ tellymcp codex-plugin install
|
|
|
150
176
|
```bash
|
|
151
177
|
mkdir -p ~/telly-gateway
|
|
152
178
|
cd ~/telly-gateway
|
|
153
|
-
tellymcp
|
|
179
|
+
tellymcp configure
|
|
154
180
|
```
|
|
155
181
|
|
|
182
|
+
Команда открывает защищённую одноразовым токеном локальную страницу на
|
|
183
|
+
`127.0.0.1`. Выбери в wizard роль `Gateway`, заполни и проверь настройки, затем
|
|
184
|
+
сохрани `.env-gateway` обычным browser download. Перед использованием выставь
|
|
185
|
+
файлу права `0600`. `tellymcp init gateway` остаётся вариантом для ручного
|
|
186
|
+
редактирования шаблона.
|
|
187
|
+
|
|
188
|
+
Публичный origin или API base вводится один раз. Wizard сам формирует gateway
|
|
189
|
+
HTTP, WebSocket, Mini App, webhook, root-prefix и опциональные OAuth URL.
|
|
190
|
+
На ключевых этапах доступны реальные проверки Telegram, Redis, PostgreSQL,
|
|
191
|
+
gateway HTTP/WebSocket и опционального RabbitMQ.
|
|
192
|
+
|
|
156
193
|
Или возьми sample:
|
|
157
194
|
|
|
158
195
|
- [.env.example.gateway](./.env.example.gateway)
|
|
@@ -167,7 +204,7 @@ tellymcp init gateway
|
|
|
167
204
|
- `DB_NAME`
|
|
168
205
|
- `GATEWAY_PUBLIC_URL`
|
|
169
206
|
- `GATEWAY_WS_URL`
|
|
170
|
-
- `
|
|
207
|
+
- `GATEWAY_SCOPE_TOKEN`
|
|
171
208
|
- `GATEWAY_AUTH_TOKEN`
|
|
172
209
|
|
|
173
210
|
Запуск:
|
|
@@ -183,9 +220,17 @@ tellymcp run --env .env
|
|
|
183
220
|
```bash
|
|
184
221
|
mkdir -p ~/agent-a
|
|
185
222
|
cd ~/agent-a
|
|
186
|
-
tellymcp
|
|
223
|
+
tellymcp configure
|
|
187
224
|
```
|
|
188
225
|
|
|
226
|
+
Выбери в wizard роль `Client`. В форме есть подключение к gateway, identity
|
|
227
|
+
консоли, terminal, browser, MCP и расширенные runtime-настройки. После
|
|
228
|
+
валидации браузер скачает `.env-client`. Флаг `--no-open` выводит локальный URL
|
|
229
|
+
без автоматического открытия браузера.
|
|
230
|
+
|
|
231
|
+
Для клиента тот же Public base URL автоматически формирует
|
|
232
|
+
`GATEWAY_PUBLIC_URL`, `GATEWAY_WS_URL` и `GATEWAY_WS_PATH`.
|
|
233
|
+
|
|
189
234
|
Или используй sample:
|
|
190
235
|
|
|
191
236
|
- [.env.example.client](./.env.example.client)
|
|
@@ -194,7 +239,7 @@ tellymcp init client
|
|
|
194
239
|
|
|
195
240
|
- `GATEWAY_PUBLIC_URL`
|
|
196
241
|
- `GATEWAY_WS_URL`
|
|
197
|
-
- `
|
|
242
|
+
- `GATEWAY_SCOPE_TOKEN`
|
|
198
243
|
- `GATEWAY_AUTH_TOKEN` (тот же transport-токен, который задан на gateway)
|
|
199
244
|
- `GATEWAY_USER_UUID`, если консоль должна быть видна конкретному владельцу в gateway-боте
|
|
200
245
|
|
|
@@ -214,6 +259,10 @@ tellymcp run --env .env -s NEW
|
|
|
214
259
|
- `local_session_id`
|
|
215
260
|
- `session_label`
|
|
216
261
|
- `env_file`
|
|
262
|
+
- `gateway_client_uuid`
|
|
263
|
+
|
|
264
|
+
Runtime-состояние клиента локальное и не требует Redis. Сохранённый
|
|
265
|
+
`gateway_client_uuid` обеспечивает стабильную идентичность после перезапуска.
|
|
217
266
|
|
|
218
267
|
Поэтому дальше в том же каталоге обычно достаточно:
|
|
219
268
|
|
|
@@ -353,6 +402,7 @@ Gateway prompt scanner теперь живёт от live-client lifecycle:
|
|
|
353
402
|
|
|
354
403
|
Канонические стартовые точки:
|
|
355
404
|
|
|
405
|
+
- [Контракт env и руководство по миграции](./docs/ENVIRONMENT.md)
|
|
356
406
|
- [.env.example.gateway](./.env.example.gateway)
|
|
357
407
|
- [.env.example.client](./.env.example.client)
|
|
358
408
|
|
|
@@ -368,6 +418,8 @@ Samples уже вычищены под текущий runtime:
|
|
|
368
418
|
- убраны obsolete pairing-oriented тексты
|
|
369
419
|
- убраны неиспользуемые секреты вроде `SESSION_SECRET`
|
|
370
420
|
- убран неиспользуемый `APP_NAME`
|
|
421
|
+
- неоднозначные старые имена заменены на `TERMINAL_*`, `GATEWAY_SCOPE_TOKEN`,
|
|
422
|
+
`TELEGRAM_REQUEST_MODE`, `DB_SCHEMA` и `LOGFEED_ENABLED`
|
|
371
423
|
|
|
372
424
|
## Операционные команды
|
|
373
425
|
|
|
@@ -383,6 +435,15 @@ tellymcp doctor --env .env
|
|
|
383
435
|
tellymcp system-prune --env .env --yes
|
|
384
436
|
```
|
|
385
437
|
|
|
438
|
+
Миграция старого env в текущий ролевой контракт:
|
|
439
|
+
|
|
440
|
+
```bash
|
|
441
|
+
tellymcp migrate-env ./old.env > ./.migrated-env
|
|
442
|
+
```
|
|
443
|
+
|
|
444
|
+
Fallback на старую схему отсутствует. Если найдены legacy-ключи, запуск
|
|
445
|
+
останавливается и выводит команду миграции.
|
|
446
|
+
|
|
386
447
|
## Карта документации
|
|
387
448
|
|
|
388
449
|
- [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,39 @@ Tools sync:
|
|
|
106
110
|
## Requirements
|
|
107
111
|
|
|
108
112
|
- Node.js `>= 24`
|
|
109
|
-
-
|
|
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 uninstall -g @deadragdoll/tellymcp
|
|
138
|
+
npm install -g @deadragdoll/tellymcp@latest --foreground-scripts
|
|
139
|
+
tellymcp doctor --env <file>
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
`tellymcp --help` and setup commands do not load the native PTY module. Runtime
|
|
143
|
+
startup validates it and prints the same recovery instructions instead of a
|
|
144
|
+
raw native-module stack trace.
|
|
145
|
+
|
|
120
146
|
Optional browser runtime:
|
|
121
147
|
|
|
122
148
|
```bash
|
|
@@ -150,9 +176,20 @@ Create a gateway workspace and env:
|
|
|
150
176
|
```bash
|
|
151
177
|
mkdir -p ~/telly-gateway
|
|
152
178
|
cd ~/telly-gateway
|
|
153
|
-
tellymcp
|
|
179
|
+
tellymcp configure
|
|
154
180
|
```
|
|
155
181
|
|
|
182
|
+
This opens a token-protected local page on `127.0.0.1`. Choose `Gateway` in the
|
|
183
|
+
wizard, fill and validate the settings, then save `.env-gateway` through the
|
|
184
|
+
normal browser download flow. Set its permissions to `0600` before use. Use
|
|
185
|
+
`tellymcp init gateway` when you specifically want a commented template for
|
|
186
|
+
manual editing.
|
|
187
|
+
|
|
188
|
+
Enter the public origin or API base only once. The wizard derives gateway HTTP,
|
|
189
|
+
WebSocket, Mini App, webhook, root-prefix, and optional OAuth connector URLs.
|
|
190
|
+
The key stages include live connection checks for Telegram, Redis, PostgreSQL,
|
|
191
|
+
the gateway HTTP/WebSocket endpoints, and optional RabbitMQ.
|
|
192
|
+
|
|
156
193
|
Or copy the sample from this package:
|
|
157
194
|
|
|
158
195
|
- [.env.example.gateway](./.env.example.gateway)
|
|
@@ -167,7 +204,7 @@ Required gateway values:
|
|
|
167
204
|
- `DB_NAME`
|
|
168
205
|
- `GATEWAY_PUBLIC_URL`
|
|
169
206
|
- `GATEWAY_WS_URL`
|
|
170
|
-
- `
|
|
207
|
+
- `GATEWAY_SCOPE_TOKEN`
|
|
171
208
|
- `GATEWAY_AUTH_TOKEN`
|
|
172
209
|
|
|
173
210
|
Then run:
|
|
@@ -183,9 +220,17 @@ Create one workspace per agent console:
|
|
|
183
220
|
```bash
|
|
184
221
|
mkdir -p ~/agent-a
|
|
185
222
|
cd ~/agent-a
|
|
186
|
-
tellymcp
|
|
223
|
+
tellymcp configure
|
|
187
224
|
```
|
|
188
225
|
|
|
226
|
+
Choose `Client` in the wizard. The form includes the gateway connection, local
|
|
227
|
+
console identity, terminal, browser, MCP, and advanced runtime settings.
|
|
228
|
+
After validation the browser downloads `.env-client`. Use `--no-open` to print
|
|
229
|
+
the local URL without opening a browser automatically.
|
|
230
|
+
|
|
231
|
+
For clients, the same Public base URL automatically produces
|
|
232
|
+
`GATEWAY_PUBLIC_URL`, `GATEWAY_WS_URL`, and `GATEWAY_WS_PATH`.
|
|
233
|
+
|
|
189
234
|
Or copy:
|
|
190
235
|
|
|
191
236
|
- [.env.example.client](./.env.example.client)
|
|
@@ -194,7 +239,7 @@ Required client values:
|
|
|
194
239
|
|
|
195
240
|
- `GATEWAY_PUBLIC_URL`
|
|
196
241
|
- `GATEWAY_WS_URL`
|
|
197
|
-
- `
|
|
242
|
+
- `GATEWAY_SCOPE_TOKEN`
|
|
198
243
|
- `GATEWAY_AUTH_TOKEN` (the same transport token configured on the gateway)
|
|
199
244
|
- `GATEWAY_USER_UUID` if this console should be scoped to a specific Telegram owner
|
|
200
245
|
|
|
@@ -214,6 +259,10 @@ After that, `.mcpsession.json` stores:
|
|
|
214
259
|
- `local_session_id`
|
|
215
260
|
- `session_label`
|
|
216
261
|
- `env_file`
|
|
262
|
+
- `gateway_client_uuid`
|
|
263
|
+
|
|
264
|
+
Client runtime state is local and does not require Redis. The persisted
|
|
265
|
+
`gateway_client_uuid` keeps the client identity stable across restarts.
|
|
217
266
|
|
|
218
267
|
So later the same workspace can usually start with:
|
|
219
268
|
|
|
@@ -352,6 +401,7 @@ Expected agent behavior:
|
|
|
352
401
|
|
|
353
402
|
Use the shipped samples as the canonical starting point:
|
|
354
403
|
|
|
404
|
+
- [Environment contract and migration guide](./docs/ENVIRONMENT.md)
|
|
355
405
|
- [.env.example.gateway](./.env.example.gateway)
|
|
356
406
|
- [.env.example.client](./.env.example.client)
|
|
357
407
|
|
|
@@ -367,6 +417,8 @@ The samples were cleaned to match the current runtime:
|
|
|
367
417
|
- removed obsolete pairing-oriented wording
|
|
368
418
|
- removed unused secrets like `SESSION_SECRET`
|
|
369
419
|
- removed unused `APP_NAME`
|
|
420
|
+
- renamed ambiguous legacy keys to `TERMINAL_*`, `GATEWAY_SCOPE_TOKEN`,
|
|
421
|
+
`TELEGRAM_REQUEST_MODE`, `DB_SCHEMA`, and `LOGFEED_ENABLED`
|
|
370
422
|
|
|
371
423
|
## Operational Commands
|
|
372
424
|
|
|
@@ -382,6 +434,15 @@ Destructive local+gateway cleanup:
|
|
|
382
434
|
tellymcp system-prune --env .env --yes
|
|
383
435
|
```
|
|
384
436
|
|
|
437
|
+
Normalize an older env file to the current role-aware contract:
|
|
438
|
+
|
|
439
|
+
```bash
|
|
440
|
+
tellymcp migrate-env ./old.env > ./.migrated-env
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
The runtime does not fall back to the old schema. If legacy keys are detected,
|
|
444
|
+
startup stops and prints the migration command.
|
|
445
|
+
|
|
385
446
|
## Documentation Map
|
|
386
447
|
|
|
387
448
|
- [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 `
|
|
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
|