@deadragdoll/tellymcp 0.0.10 → 0.0.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (154) hide show
  1. package/.env.example.client +42 -52
  2. package/.env.example.gateway +48 -62
  3. package/CHANGELOG.md +3 -3
  4. package/README-ru.md +226 -376
  5. package/README.md +213 -1184
  6. package/TOOLS.md +320 -377
  7. package/VERSION.md +13 -13
  8. package/config/codex/plugins/telly-workflows/.codex-plugin/plugin.json +18 -0
  9. package/config/codex/plugins/telly-workflows/references/invariants.md +10 -0
  10. package/config/codex/plugins/telly-workflows/skills/telly-browser-screenshot/SKILL.md +27 -0
  11. package/config/codex/plugins/telly-workflows/skills/telly-collab-artifact/SKILL.md +22 -0
  12. package/config/codex/plugins/telly-workflows/skills/telly-human-telegram/SKILL.md +31 -0
  13. package/config/codex/plugins/telly-workflows/skills/telly-partner-note/SKILL.md +36 -0
  14. package/config/templates/env.both.template +39 -20
  15. package/config/templates/env.client.template +34 -19
  16. package/config/templates/env.gateway.template +37 -22
  17. package/dist/cli.js +322 -75
  18. package/dist/codexPluginInstaller.js +215 -0
  19. package/dist/lib/mixins/session.errors.js +34 -1
  20. package/dist/lib/pinoTargets.js +2 -2
  21. package/dist/moleculer.config.js +7 -5
  22. package/dist/services/features/telegram-mcp/browser.service.js +94 -1
  23. package/dist/services/features/telegram-mcp/collaboration.service.js +40 -3
  24. package/dist/services/features/telegram-mcp/ensuredb.service.js +145 -26
  25. package/dist/services/features/telegram-mcp/gateway-delivery.service.js +285 -103
  26. package/dist/services/features/telegram-mcp/gateway-socket.service.js +907 -85
  27. package/dist/services/features/telegram-mcp/gateway.service.js +876 -81
  28. package/dist/services/features/telegram-mcp/mcp-http.service.js +8 -0
  29. package/dist/services/features/telegram-mcp/mcp-server.service.js +17 -26
  30. package/dist/services/features/telegram-mcp/notify.service.js +127 -1
  31. package/dist/services/features/telegram-mcp/session-context.service.js +28 -1
  32. package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +132 -10
  33. package/dist/services/features/telegram-mcp/src/app/config/env.js +158 -52
  34. package/dist/services/features/telegram-mcp/src/app/http.js +375 -42
  35. package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +386 -58
  36. package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +3 -0
  37. package/dist/services/features/telegram-mcp/src/app/webapp/terminal.js +12 -0
  38. package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +120 -104
  39. package/dist/services/features/telegram-mcp/src/entities/xchange/model/types.js +2 -0
  40. package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +1 -1
  41. package/dist/services/features/telegram-mcp/src/features/browser/model/browserOpenTool.js +1 -1
  42. package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +1 -1
  43. package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +306 -26
  44. package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +71 -0
  45. package/dist/services/features/telegram-mcp/src/features/collaboration/model/listGatewaySessionsTool.js +33 -0
  46. package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +93 -82
  47. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +47 -5
  48. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +1 -1
  49. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +1 -1
  50. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +82 -0
  51. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +22 -14
  52. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +697 -75
  53. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +76 -0
  54. package/dist/services/features/telegram-mcp/src/features/embedded-runtime/model/embeddedRuntimeBroker.js +92 -0
  55. package/dist/services/features/telegram-mcp/src/features/foreground-terminal/model/foregroundTerminalRuntime.js +192 -0
  56. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +382 -3
  57. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +1 -1
  58. package/dist/services/features/telegram-mcp/src/features/notify/model/sendFileToTelegramTool.js +33 -0
  59. package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +1 -1
  60. package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +1 -1
  61. package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +1 -1
  62. package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +42 -200
  63. package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +1 -1
  64. package/dist/services/features/telegram-mcp/src/features/terminal-buffer/model/terminalBufferService.js +96 -0
  65. package/dist/services/features/telegram-mcp/src/features/terminal-input/model/terminalInputService.js +97 -0
  66. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +107 -58
  67. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +1 -1
  68. package/dist/services/features/telegram-mcp/src/features/xchange/model/getXchangeRecordTool.js +28 -0
  69. package/dist/services/features/telegram-mcp/src/features/xchange/model/listXchangeRecordsTool.js +28 -0
  70. package/dist/services/features/telegram-mcp/src/features/xchange/model/markXchangeRecordReadTool.js +28 -0
  71. package/dist/services/features/telegram-mcp/src/features/xchange/model/xchangeService.js +169 -0
  72. package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +5 -4
  73. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/en.js +143 -42
  74. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/ru.js +139 -38
  75. package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalSessionStore.js +27 -0
  76. package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +11 -8
  77. package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +69 -70
  78. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +21 -22
  79. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +444 -7093
  80. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportAttachmentStore.js +93 -0
  81. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportBroadcastActions.js +385 -0
  82. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +149 -0
  83. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConstructorWiring.js +642 -0
  84. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContent.js +84 -0
  85. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContext.js +78 -0
  86. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportDocumentActions.js +36 -0
  87. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportEventActions.js +292 -0
  88. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFileHandoffActions.js +352 -0
  89. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFormatting.js +75 -0
  90. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportGatewayActions.js +44 -0
  91. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLifecycleActions.js +161 -0
  92. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLive.js +56 -0
  93. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLiveActions.js +77 -0
  94. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuCallbacks.js +254 -0
  95. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFactories.js +538 -0
  96. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFingerprints.js +93 -0
  97. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFlow.js +344 -0
  98. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuShell.js +65 -0
  99. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuState.js +408 -0
  100. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuText.js +216 -0
  101. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +452 -0
  102. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportOutputActions.js +189 -0
  103. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPartnerActions.js +286 -0
  104. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPayloadState.js +108 -0
  105. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectActions.js +463 -0
  106. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEntryActions.js +202 -0
  107. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEvents.js +99 -0
  108. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectMenus.js +138 -0
  109. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +308 -0
  110. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectView.js +426 -0
  111. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportRequestFlow.js +278 -0
  112. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportSessionActions.js +143 -0
  113. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalActions.js +665 -0
  114. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalRuntime.js +226 -0
  115. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTypes.js +2 -0
  116. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportUtils.js +330 -0
  117. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportXchangeState.js +107 -0
  118. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/client.js +255 -0
  119. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/ptyRegistry.js +543 -0
  120. package/dist/services/features/telegram-mcp/src/shared/integrations/xchange/sqliteRecordStore.js +223 -0
  121. package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +24 -0
  122. package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +6 -0
  123. package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +147 -76
  124. package/dist/services/features/telegram-mcp/src/shared/lib/telegramXchangeRecords.js +72 -0
  125. package/dist/services/features/telegram-mcp/src/shared/lib/terminalPromptDetection.js +409 -0
  126. package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +129 -1
  127. package/dist/services/features/telegram-mcp/src/shared/lib/xchangeRecordHints.js +98 -0
  128. package/dist/services/features/telegram-mcp/standalone-http.service.js +12 -0
  129. package/dist/services/features/telegram-mcp/terminal-buffer.service.js +42 -0
  130. package/dist/services/features/telegram-mcp/terminal-input.service.js +41 -0
  131. package/dist/services/features/telegram-mcp/tools-sync.service.js +15 -1
  132. package/dist/services/features/telegram-mcp/xchange.service.js +123 -0
  133. package/docs/STANDALONE-ru.md +172 -0
  134. package/docs/STANDALONE.md +172 -0
  135. package/package.json +10 -5
  136. package/scripts/build-package-artifact.sh +27 -0
  137. package/scripts/deploy-gateway.sh +64 -0
  138. package/scripts/deploy-onebot-branch.sh +27 -0
  139. package/scripts/postinstall.js +11 -36
  140. package/STANDALONE-ru.md +0 -274
  141. package/STANDALONE.md +0 -274
  142. package/dist/services/features/telegram-mcp/inbox.service.js +0 -33
  143. package/dist/services/features/telegram-mcp/pair.service.js +0 -33
  144. package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +0 -10
  145. package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +0 -33
  146. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +0 -33
  147. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +0 -33
  148. package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +0 -77
  149. package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +0 -33
  150. package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +0 -33
  151. package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +0 -202
  152. package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +0 -33
  153. package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +0 -33
  154. package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +0 -363
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RemoteConsoleActionClient = void 0;
4
+ const relay_1 = require("../../../app/webapp/relay");
5
+ function isBackendErrorLike(value) {
6
+ return Boolean(value &&
7
+ typeof value === "object" &&
8
+ typeof value.statusCode === "number" &&
9
+ typeof value.code === "string");
10
+ }
11
+ function formatBackendErrorLike(value) {
12
+ const details = [];
13
+ if (typeof value.code === "string" && value.code.trim()) {
14
+ details.push(`code=${value.code.trim()}`);
15
+ }
16
+ if (typeof value.statusCode === "number") {
17
+ details.push(`statusCode=${value.statusCode}`);
18
+ }
19
+ if (value.data !== undefined) {
20
+ try {
21
+ details.push(`data=${JSON.stringify(value.data)}`);
22
+ }
23
+ catch {
24
+ details.push(`data=${String(value.data)}`);
25
+ }
26
+ }
27
+ const base = typeof value.message === "string" && value.message.trim()
28
+ ? value.message.trim()
29
+ : `${value.name ?? "BackendError"} (${value.code})`;
30
+ return details.length > 0 ? `${base}\n${details.join("\n")}` : base;
31
+ }
32
+ class RemoteConsoleActionClient {
33
+ callBroker;
34
+ constructor(callBroker) {
35
+ this.callBroker = callBroker;
36
+ }
37
+ async resolveTarget(sessionId, _params) {
38
+ const relayTarget = (0, relay_1.parseLiveRelaySessionId)(sessionId);
39
+ if (relayTarget) {
40
+ return {
41
+ clientUuid: relayTarget.clientUuid,
42
+ localSessionId: relayTarget.localSessionId,
43
+ };
44
+ }
45
+ const trimmedSessionId = sessionId.trim();
46
+ if (!trimmedSessionId) {
47
+ throw new Error("Gateway-routed action requires a non-empty canonical session_id in the format client_uuid:local_session_id.");
48
+ }
49
+ const resolved = await this.callBroker("telegramMcp.gatewaySocket.resolveConnectedSessionTarget", {
50
+ sessionId: trimmedSessionId,
51
+ });
52
+ if (!resolved) {
53
+ throw new Error(`Could not resolve live console target for session_id '${trimmedSessionId}'.`);
54
+ }
55
+ return {
56
+ clientUuid: resolved.client_uuid,
57
+ localSessionId: resolved.local_session_id,
58
+ };
59
+ }
60
+ async invokeForRelaySession(sessionId, actionName, params) {
61
+ const target = await this.resolveTarget(sessionId, params);
62
+ const result = await this.callBroker("telegramMcp.gatewaySocket.requestClientAction", {
63
+ clientUuid: target.clientUuid,
64
+ actionName,
65
+ params: {
66
+ ...params,
67
+ session_id: target.localSessionId,
68
+ },
69
+ });
70
+ if (isBackendErrorLike(result)) {
71
+ throw new Error(formatBackendErrorLike(result));
72
+ }
73
+ return result;
74
+ }
75
+ }
76
+ exports.RemoteConsoleActionClient = RemoteConsoleActionClient;
@@ -0,0 +1,92 @@
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.createEmbeddedRuntimeBroker = createEmbeddedRuntimeBroker;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_url_1 = require("node:url");
10
+ function isSourceRuntimeMode() {
11
+ return process.env.TELLYMCP_SOURCE_RUNTIME === "true";
12
+ }
13
+ function collectServiceSchemaFiles(rootDir, extension) {
14
+ const files = [];
15
+ const stack = [rootDir];
16
+ while (stack.length > 0) {
17
+ const currentDir = stack.pop();
18
+ if (!currentDir) {
19
+ continue;
20
+ }
21
+ for (const entry of (0, node_fs_1.readdirSync)(currentDir)) {
22
+ const fullPath = node_path_1.default.join(currentDir, entry);
23
+ const stat = (0, node_fs_1.statSync)(fullPath);
24
+ if (stat.isDirectory()) {
25
+ stack.push(fullPath);
26
+ continue;
27
+ }
28
+ if (stat.isFile() && entry.endsWith(extension)) {
29
+ files.push(fullPath);
30
+ }
31
+ }
32
+ }
33
+ return files.sort((left, right) => left.localeCompare(right));
34
+ }
35
+ function unwrapCjsDefault(value) {
36
+ let current = value;
37
+ while (current &&
38
+ typeof current === "object" &&
39
+ "default" in current &&
40
+ Object.keys(current).length <= 3) {
41
+ const next = current.default;
42
+ if (next === current || next == null) {
43
+ break;
44
+ }
45
+ current = next;
46
+ }
47
+ return current;
48
+ }
49
+ function resolveServiceSchemaExport(moduleNamespace) {
50
+ const unwrappedModule = unwrapCjsDefault(moduleNamespace);
51
+ if (unwrappedModule &&
52
+ typeof unwrappedModule === "object" &&
53
+ "name" in unwrappedModule) {
54
+ return unwrappedModule;
55
+ }
56
+ if (unwrappedModule &&
57
+ typeof unwrappedModule === "object" &&
58
+ "default" in unwrappedModule) {
59
+ return unwrapCjsDefault(unwrappedModule.default);
60
+ }
61
+ return unwrappedModule;
62
+ }
63
+ async function createEmbeddedRuntimeBroker(input) {
64
+ process.env.ENV_FILE = input.envPath;
65
+ process.env.TELLYMCP_STANDALONE_HTTP = input.standaloneHttp ? "true" : "false";
66
+ const sourceRuntime = isSourceRuntimeMode();
67
+ const brokerConfigPath = sourceRuntime
68
+ ? node_path_1.default.join(input.packageRoot, "src", "moleculer.config.ts")
69
+ : node_path_1.default.join(input.packageRoot, "dist", "moleculer.config.js");
70
+ const servicesRoot = sourceRuntime
71
+ ? node_path_1.default.join(input.packageRoot, "src", "services", "features", "telegram-mcp")
72
+ : node_path_1.default.join(input.packageRoot, "dist", "services", "features", "telegram-mcp");
73
+ const serviceExtension = sourceRuntime ? ".service.ts" : ".service.js";
74
+ const { ServiceBroker } = (await import("moleculer"));
75
+ const brokerConfigModule = (await import((0, node_url_1.pathToFileURL)(brokerConfigPath).href));
76
+ const brokerConfig = unwrapCjsDefault(brokerConfigModule);
77
+ const broker = new ServiceBroker(brokerConfig);
78
+ const serviceFiles = collectServiceSchemaFiles(servicesRoot, serviceExtension);
79
+ for (const serviceFile of serviceFiles) {
80
+ const serviceModule = (await import((0, node_url_1.pathToFileURL)(serviceFile).href));
81
+ const schema = resolveServiceSchemaExport(serviceModule);
82
+ broker.createService(schema);
83
+ }
84
+ await broker.start();
85
+ const runtimeService = broker.getLocalService("telegramMcp.runtime");
86
+ if (!runtimeService?.waitUntilReady) {
87
+ await broker.stop();
88
+ throw new Error("Embedded runtime service is unavailable");
89
+ }
90
+ const runtime = await runtimeService.waitUntilReady();
91
+ return { broker, runtime };
92
+ }
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isForegroundPtyClientMode = isForegroundPtyClientMode;
4
+ exports.runForegroundPtyRuntime = runForegroundPtyRuntime;
5
+ const client_1 = require("../../../shared/integrations/terminal/client");
6
+ const embeddedRuntimeBroker_1 = require("../../embedded-runtime/model/embeddedRuntimeBroker");
7
+ function isForegroundPtyClientMode(parsed) {
8
+ return (parsed.DISTRIBUTED_MODE || "client").trim() === "client";
9
+ }
10
+ async function createForegroundBroker(envPath, packageRoot) {
11
+ if (!process.env.LOG_STDERR_LEVEL?.trim()) {
12
+ process.env.LOG_STDERR_LEVEL = "error";
13
+ }
14
+ if (!process.env.LOG_FILE_ENABLED?.trim()) {
15
+ process.env.LOG_FILE_ENABLED = "true";
16
+ }
17
+ if (!process.env.LOG_FILE_LEVEL?.trim()) {
18
+ process.env.LOG_FILE_LEVEL = process.env.LOG_LEVEL?.trim() || "info";
19
+ }
20
+ return (0, embeddedRuntimeBroker_1.createEmbeddedRuntimeBroker)({
21
+ envPath,
22
+ packageRoot,
23
+ standaloneHttp: false,
24
+ });
25
+ }
26
+ async function ensureForegroundPtySession(runtime) {
27
+ const resolved = runtime.projectIdentityResolver.resolveSessionDefaults({
28
+ cwd: process.cwd(),
29
+ });
30
+ const existing = await runtime.sessionStore.getSession(resolved.sessionId);
31
+ const target = (0, client_1.ensureTerminalTargetForSession)(runtime.config.terminal, {
32
+ sessionId: resolved.sessionId,
33
+ cwd: resolved.cwd,
34
+ ...(typeof existing?.terminalTarget === "string"
35
+ ? { target: existing.terminalTarget }
36
+ : {}),
37
+ });
38
+ if (!target) {
39
+ throw new Error("PTY terminal target could not be created");
40
+ }
41
+ const updatedAt = new Date().toISOString();
42
+ await runtime.sessionStore.setSession({
43
+ sessionId: resolved.sessionId,
44
+ ...(typeof existing?.label === "string"
45
+ ? { label: existing.label }
46
+ : { label: resolved.sessionLabel }),
47
+ ...(typeof existing?.cwd === "string" ? { cwd: existing.cwd } : { cwd: resolved.cwd }),
48
+ ...(typeof existing?.activeProjectUuid === "string"
49
+ ? { activeProjectUuid: existing.activeProjectUuid }
50
+ : {}),
51
+ ...(typeof existing?.activeProjectName === "string"
52
+ ? { activeProjectName: existing.activeProjectName }
53
+ : {}),
54
+ ...(typeof existing?.task === "string" ? { task: existing.task } : {}),
55
+ ...(typeof existing?.summary === "string" ? { summary: existing.summary } : {}),
56
+ ...(Array.isArray(existing?.files) ? { files: existing.files } : {}),
57
+ ...(Array.isArray(existing?.decisions)
58
+ ? { decisions: existing.decisions }
59
+ : {}),
60
+ ...(Array.isArray(existing?.risks) ? { risks: existing.risks } : {}),
61
+ terminalTarget: target,
62
+ ...(typeof existing?.lastTerminalNudgeAt === "string"
63
+ ? { lastTerminalNudgeAt: existing.lastTerminalNudgeAt }
64
+ : {}),
65
+ ...(typeof existing?.lastSeenToolsHash === "string"
66
+ ? { lastSeenToolsHash: existing.lastSeenToolsHash }
67
+ : {}),
68
+ ...(typeof existing?.lastNotifiedToolsHash === "string"
69
+ ? { lastNotifiedToolsHash: existing.lastNotifiedToolsHash }
70
+ : {}),
71
+ updatedAt,
72
+ });
73
+ return {
74
+ sessionId: resolved.sessionId,
75
+ sessionLabel: typeof existing?.label === "string" && existing.label.trim()
76
+ ? existing.label
77
+ : resolved.sessionLabel,
78
+ target,
79
+ };
80
+ }
81
+ async function attachCurrentTerminalToPty(runtime, target) {
82
+ const stdin = process.stdin;
83
+ const stdout = process.stdout;
84
+ const resize = () => {
85
+ if (stdout.isTTY) {
86
+ (0, client_1.resizeForegroundTerminal)(target, stdout.columns || 120, stdout.rows || 40);
87
+ }
88
+ };
89
+ resize();
90
+ const snapshot = await (0, client_1.captureVisibleTerminal)(runtime.config.terminal, target, 80, 1);
91
+ if (snapshot.trim().length > 0) {
92
+ stdout.write(`${snapshot}${snapshot.endsWith("\n") ? "" : "\n"}`);
93
+ }
94
+ return new Promise((resolve, reject) => {
95
+ let finished = false;
96
+ const finish = async (code) => {
97
+ if (finished) {
98
+ return;
99
+ }
100
+ finished = true;
101
+ detach();
102
+ try {
103
+ await Promise.resolve();
104
+ }
105
+ finally {
106
+ resolve(code);
107
+ }
108
+ };
109
+ if (stdin.isTTY && typeof stdin.setRawMode === "function") {
110
+ stdin.setRawMode(true);
111
+ }
112
+ stdin.resume();
113
+ const onStdinData = (chunk) => {
114
+ (0, client_1.sendForegroundTerminalInput)(target, typeof chunk === "string" ? chunk : chunk.toString("utf8"));
115
+ };
116
+ const detachPty = (0, client_1.subscribeForegroundTerminal)(target, {
117
+ onData: (data) => {
118
+ stdout.write(data);
119
+ },
120
+ onExit: ({ exitCode }) => {
121
+ void finish(exitCode);
122
+ },
123
+ });
124
+ const onSigwinch = () => {
125
+ resize();
126
+ };
127
+ const onSignal = (signal) => {
128
+ void runtime.logger.warn("Foreground PTY runtime interrupted", { signal });
129
+ void finish(signal === "SIGTERM" ? 143 : 130);
130
+ };
131
+ const detach = () => {
132
+ detachPty();
133
+ stdin.off("data", onStdinData);
134
+ process.off("SIGINT", sigintHandler);
135
+ process.off("SIGTERM", sigtermHandler);
136
+ stdout.off("resize", onSigwinch);
137
+ if (stdin.isTTY && typeof stdin.setRawMode === "function") {
138
+ stdin.setRawMode(false);
139
+ }
140
+ stdin.pause();
141
+ };
142
+ const sigintHandler = () => {
143
+ onSignal("SIGINT");
144
+ };
145
+ const sigtermHandler = () => {
146
+ onSignal("SIGTERM");
147
+ };
148
+ stdin.on("data", onStdinData);
149
+ stdout.on("resize", onSigwinch);
150
+ process.on("SIGINT", sigintHandler);
151
+ process.on("SIGTERM", sigtermHandler);
152
+ process.nextTick(() => {
153
+ try {
154
+ (0, client_1.sendForegroundTerminalInput)(target, "");
155
+ }
156
+ catch (error) {
157
+ reject(error);
158
+ }
159
+ });
160
+ });
161
+ }
162
+ async function runForegroundPtyRuntime(input) {
163
+ if (!process.stdin.isTTY || !process.stdout.isTTY) {
164
+ throw new Error("Foreground PTY mode requires an interactive TTY. Run this command in a real terminal.");
165
+ }
166
+ input.printBanner("run", "Starting foreground PTY runtime");
167
+ process.stdout.write(`Using env: ${input.envPath}\n`);
168
+ process.stdout.write("Mode: client + built-in PTY\n\n");
169
+ const handle = await createForegroundBroker(input.envPath, input.packageRoot);
170
+ try {
171
+ const session = await ensureForegroundPtySession(handle.runtime);
172
+ await handle.broker
173
+ .call("telegramMcp.gatewaySocket.refreshClientHello")
174
+ .catch((error) => {
175
+ handle.runtime.logger.warn("Foreground PTY hello refresh failed", {
176
+ error: error instanceof Error ? (error.stack ?? error.message) : String(error),
177
+ sessionId: session.sessionId,
178
+ });
179
+ });
180
+ process.stdout.write(`Attached session: ${session.sessionLabel} (${session.sessionId})\n`);
181
+ process.stdout.write(`Terminal target: ${session.target}\n\n`);
182
+ const exitCode = await attachCurrentTerminalToPty(handle.runtime, session.target);
183
+ await handle.broker.stop();
184
+ (0, client_1.stopAllForegroundTerminals)();
185
+ process.exit(exitCode);
186
+ }
187
+ catch (error) {
188
+ (0, client_1.stopAllForegroundTerminals)();
189
+ await handle.broker.stop().catch(() => undefined);
190
+ throw error;
191
+ }
192
+ }