@deadragdoll/tellymcp 0.0.10 → 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 -52
- package/.env.example.gateway +48 -62
- package/CHANGELOG.md +3 -3
- package/README-ru.md +205 -384
- package/README.md +195 -1194
- package/TOOLS.md +294 -377
- package/VERSION.md +11 -11
- 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 +39 -20
- package/config/templates/env.client.template +34 -19
- package/config/templates/env.gateway.template +37 -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/browser.service.js +94 -1
- package/dist/services/features/telegram-mcp/collaboration.service.js +40 -3
- 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-socket.service.js +897 -85
- package/dist/services/features/telegram-mcp/gateway.service.js +876 -81
- package/dist/services/features/telegram-mcp/mcp-http.service.js +8 -0
- package/dist/services/features/telegram-mcp/mcp-server.service.js +17 -26
- package/dist/services/features/telegram-mcp/notify.service.js +127 -1
- package/dist/services/features/telegram-mcp/session-context.service.js +28 -1
- package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +132 -10
- package/dist/services/features/telegram-mcp/src/app/config/env.js +158 -52
- 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/resources/en.js +139 -42
- package/dist/services/features/telegram-mcp/src/shared/i18n/resources/ru.js +135 -38
- 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 +42 -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 +415 -7101
- 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 +12 -0
- 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 +15 -1
- 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 +10 -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,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getCodexPluginStatus = getCodexPluginStatus;
|
|
7
|
+
exports.installCodexPlugin = installCodexPlugin;
|
|
8
|
+
const node_fs_1 = require("node:fs");
|
|
9
|
+
const node_os_1 = __importDefault(require("node:os"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const node_child_process_1 = require("node:child_process");
|
|
12
|
+
const PLUGIN_NAME = "telly-workflows";
|
|
13
|
+
const MARKETPLACE_NAME = "personal";
|
|
14
|
+
const MARKETPLACE_RELATIVE_PLUGIN_PATH = "./.codex/local-plugins/telly-workflows";
|
|
15
|
+
function readJsonFile(filePath) {
|
|
16
|
+
return JSON.parse((0, node_fs_1.readFileSync)(filePath, "utf8"));
|
|
17
|
+
}
|
|
18
|
+
function getBundledPluginDir(packageRoot) {
|
|
19
|
+
return node_path_1.default.join(packageRoot, "config", "codex", "plugins", PLUGIN_NAME);
|
|
20
|
+
}
|
|
21
|
+
function getBundledPluginManifest(packageRoot) {
|
|
22
|
+
return readJsonFile(node_path_1.default.join(getBundledPluginDir(packageRoot), ".codex-plugin", "plugin.json"));
|
|
23
|
+
}
|
|
24
|
+
function getMarketplaceRoot(homeDir) {
|
|
25
|
+
return homeDir;
|
|
26
|
+
}
|
|
27
|
+
function getMarketplaceFile(homeDir) {
|
|
28
|
+
return node_path_1.default.join(homeDir, ".agents", "plugins", "marketplace.json");
|
|
29
|
+
}
|
|
30
|
+
function getManagedPluginDir(homeDir) {
|
|
31
|
+
return node_path_1.default.join(homeDir, ".codex", "local-plugins", PLUGIN_NAME);
|
|
32
|
+
}
|
|
33
|
+
function commandExists(command) {
|
|
34
|
+
const result = (0, node_child_process_1.spawnSync)(command, ["--version"], {
|
|
35
|
+
encoding: "utf8",
|
|
36
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
37
|
+
});
|
|
38
|
+
return result.status === 0;
|
|
39
|
+
}
|
|
40
|
+
function parseMarketplaceRegistered(stdout, rootPath) {
|
|
41
|
+
return stdout
|
|
42
|
+
.split(/\r?\n/u)
|
|
43
|
+
.map((line) => line.trim())
|
|
44
|
+
.filter(Boolean)
|
|
45
|
+
.some((line) => {
|
|
46
|
+
if (line === "MARKETPLACE ROOT" ||
|
|
47
|
+
line.startsWith("Added marketplace ") ||
|
|
48
|
+
line.startsWith("Installed marketplace root:")) {
|
|
49
|
+
return false;
|
|
50
|
+
}
|
|
51
|
+
const columns = line.split(/\s{2,}/u);
|
|
52
|
+
return columns[0] === MARKETPLACE_NAME && columns[1] === rootPath;
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
function parseInstalledPluginVersion(stdout) {
|
|
56
|
+
for (const rawLine of stdout.split(/\r?\n/u)) {
|
|
57
|
+
const line = rawLine.trim();
|
|
58
|
+
if (!line.startsWith(`${PLUGIN_NAME}@${MARKETPLACE_NAME}`)) {
|
|
59
|
+
continue;
|
|
60
|
+
}
|
|
61
|
+
const columns = line.split(/\s{2,}/u);
|
|
62
|
+
if (columns.length < 3) {
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
const version = columns[2]?.trim();
|
|
66
|
+
return version || null;
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
function ensureMarketplaceManifest(homeDir) {
|
|
71
|
+
const marketplaceFile = getMarketplaceFile(homeDir);
|
|
72
|
+
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(marketplaceFile), { recursive: true });
|
|
73
|
+
const payload = (0, node_fs_1.existsSync)(marketplaceFile)
|
|
74
|
+
? readJsonFile(marketplaceFile)
|
|
75
|
+
: {
|
|
76
|
+
name: MARKETPLACE_NAME,
|
|
77
|
+
interface: { displayName: "Personal" },
|
|
78
|
+
plugins: [],
|
|
79
|
+
};
|
|
80
|
+
const plugins = Array.isArray(payload.plugins) ? payload.plugins : [];
|
|
81
|
+
const existingIndex = plugins.findIndex((plugin) => String(plugin.name ?? "") === PLUGIN_NAME);
|
|
82
|
+
const nextEntry = {
|
|
83
|
+
name: PLUGIN_NAME,
|
|
84
|
+
source: {
|
|
85
|
+
source: "local",
|
|
86
|
+
path: MARKETPLACE_RELATIVE_PLUGIN_PATH,
|
|
87
|
+
},
|
|
88
|
+
policy: {
|
|
89
|
+
installation: "AVAILABLE",
|
|
90
|
+
authentication: "ON_INSTALL",
|
|
91
|
+
},
|
|
92
|
+
category: "Productivity",
|
|
93
|
+
};
|
|
94
|
+
if (existingIndex >= 0) {
|
|
95
|
+
plugins[existingIndex] = nextEntry;
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
plugins.push(nextEntry);
|
|
99
|
+
}
|
|
100
|
+
const nextPayload = {
|
|
101
|
+
name: typeof payload.name === "string" && payload.name.trim()
|
|
102
|
+
? payload.name.trim()
|
|
103
|
+
: MARKETPLACE_NAME,
|
|
104
|
+
interface: payload.interface &&
|
|
105
|
+
typeof payload.interface === "object" &&
|
|
106
|
+
typeof payload.interface.displayName === "string" &&
|
|
107
|
+
payload.interface.displayName.trim()
|
|
108
|
+
? { displayName: payload.interface.displayName.trim() }
|
|
109
|
+
: { displayName: "Personal" },
|
|
110
|
+
plugins,
|
|
111
|
+
};
|
|
112
|
+
(0, node_fs_1.writeFileSync)(marketplaceFile, `${JSON.stringify(nextPayload, null, 2)}\n`, "utf8");
|
|
113
|
+
return marketplaceFile;
|
|
114
|
+
}
|
|
115
|
+
function syncBundledPlugin(packageRoot, homeDir) {
|
|
116
|
+
const bundledPluginDir = getBundledPluginDir(packageRoot);
|
|
117
|
+
if (!(0, node_fs_1.existsSync)(bundledPluginDir)) {
|
|
118
|
+
throw new Error(`Bundled Codex plugin is missing: ${bundledPluginDir}`);
|
|
119
|
+
}
|
|
120
|
+
const managedPluginDir = getManagedPluginDir(homeDir);
|
|
121
|
+
(0, node_fs_1.mkdirSync)(node_path_1.default.dirname(managedPluginDir), { recursive: true });
|
|
122
|
+
(0, node_fs_1.rmSync)(managedPluginDir, { recursive: true, force: true });
|
|
123
|
+
(0, node_fs_1.cpSync)(bundledPluginDir, managedPluginDir, { recursive: true });
|
|
124
|
+
return managedPluginDir;
|
|
125
|
+
}
|
|
126
|
+
function ensureMarketplaceRegistered(homeDir) {
|
|
127
|
+
if (!commandExists("codex")) {
|
|
128
|
+
return false;
|
|
129
|
+
}
|
|
130
|
+
const marketplaceRoot = getMarketplaceRoot(homeDir);
|
|
131
|
+
const listed = (0, node_child_process_1.spawnSync)("codex", ["plugin", "marketplace", "list"], {
|
|
132
|
+
encoding: "utf8",
|
|
133
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
134
|
+
});
|
|
135
|
+
if (listed.status === 0 && parseMarketplaceRegistered(listed.stdout || "", marketplaceRoot)) {
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
const added = (0, node_child_process_1.spawnSync)("codex", ["plugin", "marketplace", "add", marketplaceRoot], {
|
|
139
|
+
encoding: "utf8",
|
|
140
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
141
|
+
});
|
|
142
|
+
if (added.status !== 0) {
|
|
143
|
+
throw new Error((added.stderr || added.stdout || "Failed to add Codex marketplace.").trim());
|
|
144
|
+
}
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
function getCodexPluginStatus(packageRoot) {
|
|
148
|
+
const homeDir = node_os_1.default.homedir();
|
|
149
|
+
const bundledManifest = getBundledPluginManifest(packageRoot);
|
|
150
|
+
const managedPluginDir = getManagedPluginDir(homeDir);
|
|
151
|
+
const sourceVersion = (0, node_fs_1.existsSync)(node_path_1.default.join(managedPluginDir, ".codex-plugin", "plugin.json"))
|
|
152
|
+
? readJsonFile(node_path_1.default.join(managedPluginDir, ".codex-plugin", "plugin.json")).version
|
|
153
|
+
: null;
|
|
154
|
+
const codexAvailable = commandExists("codex");
|
|
155
|
+
const marketplaceRoot = getMarketplaceRoot(homeDir);
|
|
156
|
+
let marketplaceRegistered = false;
|
|
157
|
+
let installedVersion = null;
|
|
158
|
+
if (codexAvailable) {
|
|
159
|
+
const listedMarketplaces = (0, node_child_process_1.spawnSync)("codex", ["plugin", "marketplace", "list"], {
|
|
160
|
+
encoding: "utf8",
|
|
161
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
162
|
+
});
|
|
163
|
+
marketplaceRegistered =
|
|
164
|
+
listedMarketplaces.status === 0 &&
|
|
165
|
+
parseMarketplaceRegistered(listedMarketplaces.stdout || "", marketplaceRoot);
|
|
166
|
+
const listedPlugins = (0, node_child_process_1.spawnSync)("codex", ["plugin", "list"], {
|
|
167
|
+
encoding: "utf8",
|
|
168
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
169
|
+
});
|
|
170
|
+
if (listedPlugins.status === 0) {
|
|
171
|
+
installedVersion = parseInstalledPluginVersion(listedPlugins.stdout || "");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return {
|
|
175
|
+
pluginName: bundledManifest.name,
|
|
176
|
+
marketplaceName: MARKETPLACE_NAME,
|
|
177
|
+
bundledVersion: bundledManifest.version,
|
|
178
|
+
sourceVersion,
|
|
179
|
+
installedVersion,
|
|
180
|
+
codexAvailable,
|
|
181
|
+
marketplaceRegistered,
|
|
182
|
+
upToDate: installedVersion === bundledManifest.version,
|
|
183
|
+
bundledPluginDir: getBundledPluginDir(packageRoot),
|
|
184
|
+
managedPluginDir,
|
|
185
|
+
marketplaceFile: getMarketplaceFile(homeDir),
|
|
186
|
+
marketplaceRoot,
|
|
187
|
+
};
|
|
188
|
+
}
|
|
189
|
+
function installCodexPlugin(packageRoot) {
|
|
190
|
+
const homeDir = node_os_1.default.homedir();
|
|
191
|
+
ensureMarketplaceManifest(homeDir);
|
|
192
|
+
syncBundledPlugin(packageRoot, homeDir);
|
|
193
|
+
const afterSync = getCodexPluginStatus(packageRoot);
|
|
194
|
+
if (!afterSync.codexAvailable) {
|
|
195
|
+
return {
|
|
196
|
+
...afterSync,
|
|
197
|
+
marketplaceRegistered: false,
|
|
198
|
+
installedVersion: null,
|
|
199
|
+
upToDate: false,
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
ensureMarketplaceRegistered(homeDir);
|
|
203
|
+
const beforeInstall = getCodexPluginStatus(packageRoot);
|
|
204
|
+
if (beforeInstall.installedVersion === beforeInstall.bundledVersion) {
|
|
205
|
+
return beforeInstall;
|
|
206
|
+
}
|
|
207
|
+
const installed = (0, node_child_process_1.spawnSync)("codex", ["plugin", "add", `${PLUGIN_NAME}@${MARKETPLACE_NAME}`], {
|
|
208
|
+
encoding: "utf8",
|
|
209
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
210
|
+
});
|
|
211
|
+
if (installed.status !== 0) {
|
|
212
|
+
throw new Error((installed.stderr || installed.stdout || "Failed to install Codex plugin.").trim());
|
|
213
|
+
}
|
|
214
|
+
return getCodexPluginStatus(packageRoot);
|
|
215
|
+
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PlaygroundDisabledError = exports.SessionIdleTimeoutExceededError = exports.TokenInvalidError = exports.TokenNotFoundError = exports.SessionTokenSignatureInvalidError = exports.SessionTokenInvalidFormatError = exports.SessionTokenMismatchError = exports.SessionTokenNotFoundError = exports.SessionTokenRevokedError = exports.SessionTokenNotActiveError = exports.SessionTokenExpiredError = exports.SessionTokenInvalidError = exports.SessionValidationError = exports.SessionRefreshError = exports.SessionMaxLifetimeExceededError = exports.SessionStealedError = exports.SessionInvalidError = exports.SessionExpiredError = exports.SessionNotFoundError = exports.ForbiddenError = exports.UnauthorizedError = exports.wrapUnhandledBackendError = exports.buildUnhandledBackendErrorCode = exports.BackendError = void 0;
|
|
4
|
+
exports.extractErrorDetails = extractErrorDetails;
|
|
4
5
|
class BackendError extends Error {
|
|
5
6
|
statusCode;
|
|
6
7
|
code;
|
|
@@ -14,9 +15,41 @@ class BackendError extends Error {
|
|
|
14
15
|
}
|
|
15
16
|
}
|
|
16
17
|
exports.BackendError = BackendError;
|
|
18
|
+
function collectOwnProps(err) {
|
|
19
|
+
try {
|
|
20
|
+
return Object.fromEntries(Object.getOwnPropertyNames(err).map((key) => [
|
|
21
|
+
key,
|
|
22
|
+
err[key],
|
|
23
|
+
]));
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return {};
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function extractErrorDetails(err) {
|
|
30
|
+
if (!(err instanceof Error)) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
const named = err;
|
|
34
|
+
const ownProps = collectOwnProps(err);
|
|
35
|
+
return {
|
|
36
|
+
name: err.name,
|
|
37
|
+
message: err.message,
|
|
38
|
+
...(typeof named.code === "string" || typeof named.code === "number"
|
|
39
|
+
? { code: named.code }
|
|
40
|
+
: {}),
|
|
41
|
+
...(typeof named.type === "string" ? { type: named.type } : {}),
|
|
42
|
+
...(typeof named.statusCode === "number" ? { statusCode: named.statusCode } : {}),
|
|
43
|
+
...(named.data !== undefined ? { data: named.data } : {}),
|
|
44
|
+
...(named.fields !== undefined ? { fields: named.fields } : {}),
|
|
45
|
+
...(typeof named.retryable === "boolean" ? { retryable: named.retryable } : {}),
|
|
46
|
+
...(err.stack ? { stack: err.stack } : {}),
|
|
47
|
+
...(Object.keys(ownProps).length > 0 ? { props: ownProps } : {}),
|
|
48
|
+
};
|
|
49
|
+
}
|
|
17
50
|
const buildUnhandledBackendErrorCode = (rawName) => `XC_${rawName.toUpperCase()}`;
|
|
18
51
|
exports.buildUnhandledBackendErrorCode = buildUnhandledBackendErrorCode;
|
|
19
|
-
const wrapUnhandledBackendError = (err, rawName) => new BackendError(err.message, 502, (0, exports.buildUnhandledBackendErrorCode)(rawName));
|
|
52
|
+
const wrapUnhandledBackendError = (err, rawName) => new BackendError(err.message, 502, (0, exports.buildUnhandledBackendErrorCode)(rawName), extractErrorDetails(err));
|
|
20
53
|
exports.wrapUnhandledBackendError = wrapUnhandledBackendError;
|
|
21
54
|
class UnauthorizedError extends BackendError {
|
|
22
55
|
constructor(message = "Unauthorized", data) {
|
package/dist/lib/pinoTargets.js
CHANGED
|
@@ -5,7 +5,7 @@ function createPinoTargets(config) {
|
|
|
5
5
|
const targets = [
|
|
6
6
|
{
|
|
7
7
|
target: "pino-pretty",
|
|
8
|
-
level: config.level,
|
|
8
|
+
level: config.stderrLevel || config.level,
|
|
9
9
|
options: {
|
|
10
10
|
destination: 2,
|
|
11
11
|
colorize: true,
|
|
@@ -18,7 +18,7 @@ function createPinoTargets(config) {
|
|
|
18
18
|
if (config.fileEnabled) {
|
|
19
19
|
targets.unshift({
|
|
20
20
|
target: "pino/file",
|
|
21
|
-
level: config.level,
|
|
21
|
+
level: config.fileLevel || config.level,
|
|
22
22
|
options: {
|
|
23
23
|
destination: config.filePath,
|
|
24
24
|
mkdir: true,
|
package/dist/moleculer.config.js
CHANGED
|
@@ -39,11 +39,14 @@ dotenv_1.default.config({ path: process.env.ENV_FILE ?? ".env" });
|
|
|
39
39
|
* }
|
|
40
40
|
*/
|
|
41
41
|
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
|
|
42
|
+
const configuredTransport = process.env.TRANSPORT?.trim();
|
|
42
43
|
const pinoTransport = pino_1.default.transport({
|
|
43
44
|
targets: (0, pinoTargets_1.createPinoTargets)({
|
|
44
45
|
level: process.env.LOG_LEVEL || "info",
|
|
46
|
+
stderrLevel: process.env.LOG_STDERR_LEVEL || process.env.LOG_LEVEL || "info",
|
|
45
47
|
fileEnabled: process.env.LOG_FILE_ENABLED === "true",
|
|
46
48
|
filePath: process.env.LOG_FILE_PATH || ".tellymcp/log.jsonl",
|
|
49
|
+
fileLevel: process.env.LOG_FILE_LEVEL || process.env.LOG_LEVEL || "info",
|
|
47
50
|
}),
|
|
48
51
|
});
|
|
49
52
|
const logger = [
|
|
@@ -85,11 +88,10 @@ const brokerConfig = {
|
|
|
85
88
|
// Default log level for built-in console logger. It can be overwritten in logger options above.
|
|
86
89
|
// Available values: trace, debug, info, warn, error, fatal
|
|
87
90
|
logLevel: process.env.LOG_LEVEL || "info",
|
|
88
|
-
// Define transporter.
|
|
89
|
-
//
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
transporter: process.env.TRANSPORT ?? "TCP", // "NATS"
|
|
91
|
+
// Define transporter only when explicitly requested.
|
|
92
|
+
// For TellyMCP gateway/client nodes we use our own WS/HTTP control plane,
|
|
93
|
+
// so Moleculer UDP/TCP discovery is unnecessary and only adds noisy multicast warnings.
|
|
94
|
+
...(configuredTransport ? { transporter: configuredTransport } : {}),
|
|
93
95
|
// Define a cacher.
|
|
94
96
|
// More info: https://moleculer.services/docs/0.14/caching.html
|
|
95
97
|
// cacher:false,
|
|
@@ -2,11 +2,104 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME = void 0;
|
|
4
4
|
const runtime_service_1 = require("./runtime.service");
|
|
5
|
+
const remoteConsoleActionClient_1 = require("./src/features/distributed-gateway/model/remoteConsoleActionClient");
|
|
5
6
|
const browserService_1 = require("./src/features/browser/model/browserService");
|
|
6
7
|
exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME = "telegramMcp.browser";
|
|
7
8
|
const TelegramMcpBrowserService = {
|
|
8
9
|
name: exports.TELEGRAM_MCP_BROWSER_SERVICE_NAME,
|
|
9
10
|
dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
|
|
11
|
+
actions: {
|
|
12
|
+
openRemote: {
|
|
13
|
+
params: { $$strict: false },
|
|
14
|
+
async handler(ctx) {
|
|
15
|
+
return this.getBrowserService().open(ctx.params);
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
getConsoleRemote: {
|
|
19
|
+
params: { $$strict: false },
|
|
20
|
+
async handler(ctx) {
|
|
21
|
+
return this.getBrowserService().getConsole(ctx.params);
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
clickRemote: {
|
|
25
|
+
params: { $$strict: false },
|
|
26
|
+
async handler(ctx) {
|
|
27
|
+
return this.getBrowserService().click(ctx.params);
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
fillRemote: {
|
|
31
|
+
params: { $$strict: false },
|
|
32
|
+
async handler(ctx) {
|
|
33
|
+
return this.getBrowserService().fill(ctx.params);
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
pressRemote: {
|
|
37
|
+
params: { $$strict: false },
|
|
38
|
+
async handler(ctx) {
|
|
39
|
+
return this.getBrowserService().press(ctx.params);
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
reloadRemote: {
|
|
43
|
+
params: { $$strict: false },
|
|
44
|
+
async handler(ctx) {
|
|
45
|
+
return this.getBrowserService().reload(ctx.params);
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
waitForRemote: {
|
|
49
|
+
params: { $$strict: false },
|
|
50
|
+
async handler(ctx) {
|
|
51
|
+
return this.getBrowserService().waitFor(ctx.params);
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
waitForUrlRemote: {
|
|
55
|
+
params: { $$strict: false },
|
|
56
|
+
async handler(ctx) {
|
|
57
|
+
return this.getBrowserService().waitForUrl(ctx.params);
|
|
58
|
+
},
|
|
59
|
+
},
|
|
60
|
+
getErrorsRemote: {
|
|
61
|
+
params: { $$strict: false },
|
|
62
|
+
async handler(ctx) {
|
|
63
|
+
return this.getBrowserService().getErrors(ctx.params);
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
getNetworkFailuresRemote: {
|
|
67
|
+
params: { $$strict: false },
|
|
68
|
+
async handler(ctx) {
|
|
69
|
+
return this.getBrowserService().getNetworkFailures(ctx.params);
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
clearLogsRemote: {
|
|
73
|
+
params: { $$strict: false },
|
|
74
|
+
async handler(ctx) {
|
|
75
|
+
return this.getBrowserService().clearLogs(ctx.params);
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
getDomRemote: {
|
|
79
|
+
params: { $$strict: false },
|
|
80
|
+
async handler(ctx) {
|
|
81
|
+
return this.getBrowserService().getDom(ctx.params);
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
|
+
getComputedStyleRemote: {
|
|
85
|
+
params: { $$strict: false },
|
|
86
|
+
async handler(ctx) {
|
|
87
|
+
return this.getBrowserService().getComputedStyle(ctx.params);
|
|
88
|
+
},
|
|
89
|
+
},
|
|
90
|
+
screenshotRemote: {
|
|
91
|
+
params: { $$strict: false },
|
|
92
|
+
async handler(ctx) {
|
|
93
|
+
return this.getBrowserService().screenshot(ctx.params);
|
|
94
|
+
},
|
|
95
|
+
},
|
|
96
|
+
closeRemote: {
|
|
97
|
+
params: { $$strict: false },
|
|
98
|
+
async handler(ctx) {
|
|
99
|
+
return this.getBrowserService().close(ctx.params);
|
|
100
|
+
},
|
|
101
|
+
},
|
|
102
|
+
},
|
|
10
103
|
created() {
|
|
11
104
|
this.browserService = null;
|
|
12
105
|
},
|
|
@@ -26,7 +119,7 @@ const TelegramMcpBrowserService = {
|
|
|
26
119
|
}
|
|
27
120
|
const runtime = await runtimeService.waitUntilReady();
|
|
28
121
|
this.logger.info("Starting telegram_mcp browser service");
|
|
29
|
-
this.browserService = new browserService_1.BrowserService(runtime.config, runtime.
|
|
122
|
+
this.browserService = new browserService_1.BrowserService(runtime.config, runtime.sessionStore, runtime.maintenanceStore, runtime.stateStore, runtime.stateStore, runtime.objectStore, runtime.telegramTransport, runtime.logger, runtime.projectIdentityResolver, new remoteConsoleActionClient_1.RemoteConsoleActionClient((actionName, params) => this.broker.call(actionName, params, { meta: { internal_call: true } })));
|
|
30
123
|
this.logger.info("telegram_mcp browser service is ready");
|
|
31
124
|
},
|
|
32
125
|
async stopped() {
|
|
@@ -4,15 +4,45 @@ exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME = void 0;
|
|
|
4
4
|
const runtime_service_1 = require("./runtime.service");
|
|
5
5
|
const collaborationService_1 = require("./src/features/collaboration/model/collaborationService");
|
|
6
6
|
const sendPartnerFileService_1 = require("./src/features/collaboration/model/sendPartnerFileService");
|
|
7
|
+
const gatewaySessionsService_1 = require("./src/features/collaboration/model/gatewaySessionsService");
|
|
7
8
|
const gatewayCollaborationBackend_1 = require("./src/features/distributed-client/model/gatewayCollaborationBackend");
|
|
9
|
+
const remoteConsoleActionClient_1 = require("./src/features/distributed-gateway/model/remoteConsoleActionClient");
|
|
8
10
|
const localCollaborationBackend_1 = require("./src/features/collaboration/model/localCollaborationBackend");
|
|
9
11
|
exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME = "telegramMcp.collaboration";
|
|
10
12
|
const TelegramMcpCollaborationService = {
|
|
11
13
|
name: exports.TELEGRAM_MCP_COLLABORATION_SERVICE_NAME,
|
|
12
14
|
dependencies: [runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME],
|
|
15
|
+
actions: {
|
|
16
|
+
sendPartnerFileRemote: {
|
|
17
|
+
params: {
|
|
18
|
+
$$strict: false,
|
|
19
|
+
session_id: { type: "string", optional: true, trim: true, min: 1 },
|
|
20
|
+
target_session_id: { type: "string", optional: true, trim: true, min: 1 },
|
|
21
|
+
target_client_uuid: { type: "string", optional: true, trim: true, min: 1 },
|
|
22
|
+
target_local_session_id: { type: "string", optional: true, trim: true, min: 1 },
|
|
23
|
+
project_uuid: { type: "string", optional: true, trim: true, min: 1 },
|
|
24
|
+
cwd: { type: "string", optional: true, trim: true, min: 1 },
|
|
25
|
+
file_path: { type: "string", trim: true, min: 1 },
|
|
26
|
+
kind: {
|
|
27
|
+
type: "enum",
|
|
28
|
+
optional: true,
|
|
29
|
+
values: ["share", "question", "reply", "request", "handoff"],
|
|
30
|
+
},
|
|
31
|
+
summary: { type: "string", optional: true, trim: true, min: 1 },
|
|
32
|
+
message: { type: "string", optional: true, trim: true, min: 1 },
|
|
33
|
+
expected_reply: { type: "string", optional: true, trim: true, min: 1 },
|
|
34
|
+
requires_reply: { type: "boolean", optional: true },
|
|
35
|
+
in_reply_to: { type: "string", optional: true, trim: true, min: 1 },
|
|
36
|
+
},
|
|
37
|
+
async handler(ctx) {
|
|
38
|
+
return this.getSendPartnerFileService().send(ctx.params);
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
},
|
|
13
42
|
created() {
|
|
14
43
|
this.collaborationService = null;
|
|
15
44
|
this.sendPartnerFileService = null;
|
|
45
|
+
this.gatewaySessionsService = null;
|
|
16
46
|
},
|
|
17
47
|
methods: {
|
|
18
48
|
getCollaborationService() {
|
|
@@ -27,6 +57,12 @@ const TelegramMcpCollaborationService = {
|
|
|
27
57
|
}
|
|
28
58
|
return this.sendPartnerFileService;
|
|
29
59
|
},
|
|
60
|
+
getGatewaySessionsService() {
|
|
61
|
+
if (!this.gatewaySessionsService) {
|
|
62
|
+
throw new Error("telegram_mcp gateway sessions service is not initialized yet");
|
|
63
|
+
}
|
|
64
|
+
return this.gatewaySessionsService;
|
|
65
|
+
},
|
|
30
66
|
},
|
|
31
67
|
async started() {
|
|
32
68
|
await this.broker.waitForServices([runtime_service_1.TELEGRAM_MCP_RUNTIME_SERVICE_NAME]);
|
|
@@ -36,16 +72,17 @@ const TelegramMcpCollaborationService = {
|
|
|
36
72
|
}
|
|
37
73
|
const runtime = await runtimeService.waitUntilReady();
|
|
38
74
|
this.logger.info("Starting telegram_mcp collaboration service");
|
|
39
|
-
const localBackend = new localCollaborationBackend_1.LocalCollaborationBackend(runtime.config, runtime.
|
|
75
|
+
const localBackend = new localCollaborationBackend_1.LocalCollaborationBackend(runtime.config, runtime.sessionStore, runtime.stateStore, runtime.stateStore, runtime.objectStore, runtime.telegramTransport, runtime.logger);
|
|
40
76
|
runtime.gatewayHttpService.setPartnerNoteRelayHandler(async (input) => {
|
|
41
77
|
const resolved = runtime.projectIdentityResolver.resolveSessionDefaults(input);
|
|
42
78
|
return localBackend.sendPartnerNote(input, resolved);
|
|
43
79
|
});
|
|
44
80
|
const backend = runtime.config.distributed.gatewayPublicUrl
|
|
45
|
-
? new gatewayCollaborationBackend_1.GatewayCollaborationBackend(runtime.logger, runtime.stateStore, runtime.config.distributed.gatewayPublicUrl, runtime.config.distributed.gatewayAuthToken)
|
|
81
|
+
? new gatewayCollaborationBackend_1.GatewayCollaborationBackend(runtime.logger, runtime.stateStore, runtime.config.distributed.gatewayPublicUrl, runtime.config.distributed.gatewayAuthToken, runtime.config.distributed.gatewayToken, runtime.config.distributed.gatewayUserUuid, runtime.config.project.name, runtime.config.telegram.botUsername)
|
|
46
82
|
: localBackend;
|
|
47
83
|
this.collaborationService = new collaborationService_1.CollaborationService(backend, runtime.logger, runtime.projectIdentityResolver);
|
|
48
|
-
this.sendPartnerFileService = new sendPartnerFileService_1.SendPartnerFileService(runtime.config, runtime.sessionStore, runtime.logger, runtime.projectIdentityResolver, this.collaborationService);
|
|
84
|
+
this.sendPartnerFileService = new sendPartnerFileService_1.SendPartnerFileService(runtime.config, runtime.sessionStore, runtime.stateStore, runtime.logger, runtime.projectIdentityResolver, this.collaborationService, new remoteConsoleActionClient_1.RemoteConsoleActionClient((actionName, params) => this.broker.call(actionName, params, { meta: { internal_call: true } })));
|
|
85
|
+
this.gatewaySessionsService = new gatewaySessionsService_1.GatewaySessionsService(runtime.logger, runtime.stateStore, runtime.config.distributed.gatewayPublicUrl, runtime.config.distributed.gatewayAuthToken, runtime.config.distributed.gatewayToken, runtime.config.distributed.gatewayUserUuid, runtime.config.project.name, runtime.config.telegram.botUsername);
|
|
49
86
|
runtime.telegramTransport.setCollaborationService(this.collaborationService);
|
|
50
87
|
this.logger.info("telegram_mcp collaboration service is ready");
|
|
51
88
|
},
|