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