@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.
Files changed (157) hide show
  1. package/.env.example.client +42 -50
  2. package/.env.example.gateway +49 -61
  3. package/CHANGELOG.md +3 -3
  4. package/README-ru.md +205 -384
  5. package/README.md +195 -1194
  6. package/TOOLS.md +294 -377
  7. package/VERSION.md +36 -10
  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 +40 -20
  15. package/config/templates/env.client.template +34 -18
  16. package/config/templates/env.gateway.template +38 -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/approval.service.js +1 -1
  23. package/dist/services/features/telegram-mcp/browser.service.js +95 -2
  24. package/dist/services/features/telegram-mcp/collaboration.service.js +41 -4
  25. package/dist/services/features/telegram-mcp/ensuredb.service.js +145 -26
  26. package/dist/services/features/telegram-mcp/gateway-delivery.service.js +285 -103
  27. package/dist/services/features/telegram-mcp/gateway-rmq.service.js +3 -2
  28. package/dist/services/features/telegram-mcp/gateway-socket.service.js +905 -87
  29. package/dist/services/features/telegram-mcp/gateway.service.js +876 -81
  30. package/dist/services/features/telegram-mcp/mcp-http.service.js +9 -1
  31. package/dist/services/features/telegram-mcp/mcp-server.service.js +17 -26
  32. package/dist/services/features/telegram-mcp/notify.service.js +128 -2
  33. package/dist/services/features/telegram-mcp/runtime.service.js +27 -7
  34. package/dist/services/features/telegram-mcp/session-context.service.js +29 -2
  35. package/dist/services/features/telegram-mcp/src/app/bootstrap/runtime.js +133 -10
  36. package/dist/services/features/telegram-mcp/src/app/config/env.js +161 -51
  37. package/dist/services/features/telegram-mcp/src/app/http.js +375 -42
  38. package/dist/services/features/telegram-mcp/src/app/webapp/assets.js +386 -58
  39. package/dist/services/features/telegram-mcp/src/app/webapp/auth.js +3 -0
  40. package/dist/services/features/telegram-mcp/src/app/webapp/terminal.js +12 -0
  41. package/dist/services/features/telegram-mcp/src/entities/request/model/schema.js +116 -104
  42. package/dist/services/features/telegram-mcp/src/entities/xchange/model/types.js +2 -0
  43. package/dist/services/features/telegram-mcp/src/features/ask-user/model/askUserTelegram.js +1 -1
  44. package/dist/services/features/telegram-mcp/src/features/browser/model/browserScreenshotTool.js +1 -1
  45. package/dist/services/features/telegram-mcp/src/features/browser/model/browserService.js +249 -19
  46. package/dist/services/features/telegram-mcp/src/features/collaboration/model/gatewaySessionsService.js +71 -0
  47. package/dist/services/features/telegram-mcp/src/features/collaboration/model/listGatewaySessionsTool.js +33 -0
  48. package/dist/services/features/telegram-mcp/src/features/collaboration/model/localCollaborationBackend.js +93 -82
  49. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileService.js +47 -5
  50. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerFileTool.js +1 -1
  51. package/dist/services/features/telegram-mcp/src/features/collaboration/model/sendPartnerNoteTool.js +1 -1
  52. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayClientAccess.js +82 -0
  53. package/dist/services/features/telegram-mcp/src/features/distributed-client/model/gatewayCollaborationBackend.js +22 -14
  54. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/gatewayHttpService.js +649 -75
  55. package/dist/services/features/telegram-mcp/src/features/distributed-gateway/model/remoteConsoleActionClient.js +76 -0
  56. package/dist/services/features/telegram-mcp/src/features/embedded-runtime/model/embeddedRuntimeBroker.js +92 -0
  57. package/dist/services/features/telegram-mcp/src/features/foreground-terminal/model/foregroundTerminalRuntime.js +192 -0
  58. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyService.js +382 -3
  59. package/dist/services/features/telegram-mcp/src/features/notify/model/notifyTelegramTool.js +1 -1
  60. package/dist/services/features/telegram-mcp/src/features/notify/model/sendFileToTelegramTool.js +33 -0
  61. package/dist/services/features/telegram-mcp/src/features/session-context/model/clearSessionContextTool.js +1 -1
  62. package/dist/services/features/telegram-mcp/src/features/session-context/model/getSessionContextTool.js +1 -1
  63. package/dist/services/features/telegram-mcp/src/features/session-context/model/renameSessionTool.js +1 -1
  64. package/dist/services/features/telegram-mcp/src/features/session-context/model/sessionContextService.js +42 -200
  65. package/dist/services/features/telegram-mcp/src/features/session-context/model/setSessionContextTool.js +1 -1
  66. package/dist/services/features/telegram-mcp/src/features/terminal-buffer/model/terminalBufferService.js +96 -0
  67. package/dist/services/features/telegram-mcp/src/features/terminal-input/model/terminalInputService.js +97 -0
  68. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownService.js +107 -58
  69. package/dist/services/features/telegram-mcp/src/features/tools-sync/model/refreshToolsMarkdownTool.js +1 -1
  70. package/dist/services/features/telegram-mcp/src/features/xchange/model/getXchangeRecordTool.js +28 -0
  71. package/dist/services/features/telegram-mcp/src/features/xchange/model/listXchangeRecordsTool.js +28 -0
  72. package/dist/services/features/telegram-mcp/src/features/xchange/model/markXchangeRecordReadTool.js +28 -0
  73. package/dist/services/features/telegram-mcp/src/features/xchange/model/xchangeService.js +169 -0
  74. package/dist/services/features/telegram-mcp/src/processes/human-approval/model/orchestrator.js +5 -4
  75. package/dist/services/features/telegram-mcp/src/shared/i18n/index.js +46 -0
  76. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/en.js +652 -0
  77. package/dist/services/features/telegram-mcp/src/shared/i18n/resources/ru.js +652 -0
  78. package/dist/services/features/telegram-mcp/src/shared/integrations/memory/processLocalSessionStore.js +27 -0
  79. package/dist/services/features/telegram-mcp/src/shared/integrations/object-storage/minioExchangeStore.js +11 -8
  80. package/dist/services/features/telegram-mcp/src/shared/integrations/redis/stateStore.js +51 -71
  81. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/proxyFetch.js +21 -22
  82. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transport.js +411 -6524
  83. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportAttachmentStore.js +93 -0
  84. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportBroadcastActions.js +385 -0
  85. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConsoleRegistry.js +143 -0
  86. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportConstructorWiring.js +633 -0
  87. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContent.js +84 -0
  88. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportContext.js +78 -0
  89. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportDocumentActions.js +36 -0
  90. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportEventActions.js +292 -0
  91. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFileHandoffActions.js +352 -0
  92. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportFormatting.js +75 -0
  93. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportGatewayActions.js +44 -0
  94. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLifecycleActions.js +161 -0
  95. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLive.js +56 -0
  96. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportLiveActions.js +77 -0
  97. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuCallbacks.js +254 -0
  98. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFactories.js +538 -0
  99. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFingerprints.js +93 -0
  100. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuFlow.js +344 -0
  101. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuShell.js +62 -0
  102. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuState.js +408 -0
  103. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMenuText.js +216 -0
  104. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportMessageFlow.js +452 -0
  105. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportOutputActions.js +189 -0
  106. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPartnerActions.js +286 -0
  107. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportPayloadState.js +101 -0
  108. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectActions.js +463 -0
  109. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEntryActions.js +202 -0
  110. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectEvents.js +99 -0
  111. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectMenus.js +138 -0
  112. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectState.js +308 -0
  113. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportProjectView.js +426 -0
  114. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportRequestFlow.js +278 -0
  115. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportSessionActions.js +143 -0
  116. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalActions.js +468 -0
  117. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTerminalRuntime.js +171 -0
  118. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportTypes.js +2 -0
  119. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportUtils.js +330 -0
  120. package/dist/services/features/telegram-mcp/src/shared/integrations/telegram/transportXchangeState.js +107 -0
  121. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/client.js +255 -0
  122. package/dist/services/features/telegram-mcp/src/shared/integrations/terminal/ptyRegistry.js +543 -0
  123. package/dist/services/features/telegram-mcp/src/shared/integrations/xchange/sqliteRecordStore.js +223 -0
  124. package/dist/services/features/telegram-mcp/src/shared/lib/gatewayScope.js +24 -0
  125. package/dist/services/features/telegram-mcp/src/shared/lib/logger/logger.js +6 -0
  126. package/dist/services/features/telegram-mcp/src/shared/lib/project-identity/projectIdentity.js +147 -76
  127. package/dist/services/features/telegram-mcp/src/shared/lib/telegramXchangeRecords.js +72 -0
  128. package/dist/services/features/telegram-mcp/src/shared/lib/terminalPromptDetection.js +237 -0
  129. package/dist/services/features/telegram-mcp/src/shared/lib/version/versionHandshake.js +129 -1
  130. package/dist/services/features/telegram-mcp/src/shared/lib/xchangeRecordHints.js +98 -0
  131. package/dist/services/features/telegram-mcp/standalone-http.service.js +13 -1
  132. package/dist/services/features/telegram-mcp/terminal-buffer.service.js +42 -0
  133. package/dist/services/features/telegram-mcp/terminal-input.service.js +41 -0
  134. package/dist/services/features/telegram-mcp/tools-sync.service.js +16 -2
  135. package/dist/services/features/telegram-mcp/xchange.service.js +123 -0
  136. package/docs/STANDALONE-ru.md +172 -0
  137. package/docs/STANDALONE.md +172 -0
  138. package/package.json +11 -5
  139. package/scripts/build-package-artifact.sh +27 -0
  140. package/scripts/deploy-gateway.sh +64 -0
  141. package/scripts/deploy-onebot-branch.sh +27 -0
  142. package/scripts/postinstall.js +11 -36
  143. package/STANDALONE-ru.md +0 -274
  144. package/STANDALONE.md +0 -274
  145. package/dist/services/features/telegram-mcp/inbox.service.js +0 -33
  146. package/dist/services/features/telegram-mcp/pair.service.js +0 -33
  147. package/dist/services/features/telegram-mcp/src/app/webapp/tmux.js +0 -10
  148. package/dist/services/features/telegram-mcp/src/features/inbox/model/deleteTelegramInboxMessageTool.js +0 -33
  149. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxCountTool.js +0 -33
  150. package/dist/services/features/telegram-mcp/src/features/inbox/model/getTelegramInboxTool.js +0 -33
  151. package/dist/services/features/telegram-mcp/src/features/inbox/model/inboxService.js +0 -77
  152. package/dist/services/features/telegram-mcp/src/features/pair-session/model/clearSessionPairingTool.js +0 -33
  153. package/dist/services/features/telegram-mcp/src/features/pair-session/model/createSessionPairCodeTool.js +0 -33
  154. package/dist/services/features/telegram-mcp/src/features/pair-session/model/generatePairCode.js +0 -202
  155. package/dist/services/features/telegram-mcp/src/features/session-context/model/getTmuxTargetTool.js +0 -33
  156. package/dist/services/features/telegram-mcp/src/features/session-context/model/setTmuxTargetTool.js +0 -33
  157. package/dist/services/features/telegram-mcp/src/shared/integrations/tmux/client.js +0 -363
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DeleteTelegramInboxMessageTool = void 0;
4
- const schema_1 = require("../../../entities/request/model/schema");
5
- function createContent(output) {
6
- return [
7
- {
8
- type: "text",
9
- text: JSON.stringify(output, null, 2),
10
- },
11
- ];
12
- }
13
- class DeleteTelegramInboxMessageTool {
14
- inboxService;
15
- constructor(inboxService) {
16
- this.inboxService = inboxService;
17
- }
18
- register(server) {
19
- server.registerTool("delete_telegram_inbox_message", {
20
- title: "Delete Telegram Inbox Message",
21
- description: "Use this only after you have fully processed an ordinary human Telegram inbox message. Pass session_id explicitly after pairing; do not rely on implicit defaults unless cwd is also correct for this agent workspace. Delete the message so future inbox reads do not return it again.",
22
- inputSchema: schema_1.deleteTelegramInboxMessageInputSchema,
23
- outputSchema: schema_1.deleteTelegramInboxMessageOutputSchema,
24
- }, async (args) => {
25
- const output = await this.inboxService.deleteInboxMessage(args);
26
- return {
27
- content: createContent(output),
28
- structuredContent: output,
29
- };
30
- });
31
- }
32
- }
33
- exports.DeleteTelegramInboxMessageTool = DeleteTelegramInboxMessageTool;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GetTelegramInboxCountTool = void 0;
4
- const schema_1 = require("../../../entities/request/model/schema");
5
- function createContent(output) {
6
- return [
7
- {
8
- type: "text",
9
- text: JSON.stringify(output, null, 2),
10
- },
11
- ];
12
- }
13
- class GetTelegramInboxCountTool {
14
- inboxService;
15
- constructor(inboxService) {
16
- this.inboxService = inboxService;
17
- }
18
- register(server) {
19
- server.registerTool("get_telegram_inbox_count", {
20
- title: "Get Telegram Inbox Count",
21
- description: "Use this to cheaply check whether ordinary human Telegram messages are waiting for the session. Pass session_id explicitly after pairing; do not rely on implicit defaults unless cwd is also correct for this agent workspace. Do not use it for partner-note wakeups; partner notes must be read from .mcp-xchange/SHARED_INDEX.md instead.",
22
- inputSchema: schema_1.getTelegramInboxCountInputSchema,
23
- outputSchema: schema_1.getTelegramInboxCountOutputSchema,
24
- }, async (args) => {
25
- const output = await this.inboxService.getInboxCount(args);
26
- return {
27
- content: createContent(output),
28
- structuredContent: output,
29
- };
30
- });
31
- }
32
- }
33
- exports.GetTelegramInboxCountTool = GetTelegramInboxCountTool;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GetTelegramInboxTool = void 0;
4
- const schema_1 = require("../../../entities/request/model/schema");
5
- function createContent(output) {
6
- return [
7
- {
8
- type: "text",
9
- text: JSON.stringify(output, null, 2),
10
- },
11
- ];
12
- }
13
- class GetTelegramInboxTool {
14
- inboxService;
15
- constructor(inboxService) {
16
- this.inboxService = inboxService;
17
- }
18
- register(server) {
19
- server.registerTool("get_telegram_inbox", {
20
- title: "Get Telegram Inbox",
21
- description: "Use this to read unsolicited Telegram inbox messages stored for the session. Pass session_id explicitly after pairing; do not rely on implicit defaults unless cwd is also correct for this agent workspace. Each item now includes message_kind: human or system. Treat system messages as operational instructions from the service, not as normal user prompts. Returned items may also include local attachment paths from .mcp-xchange when the human message contained a photo or document. Do not use this first for partner-note wakeups; partner collaboration notes must be read from .mcp-xchange/SHARED_INDEX.md and the referenced note files.",
22
- inputSchema: schema_1.getTelegramInboxInputSchema,
23
- outputSchema: schema_1.getTelegramInboxOutputSchema,
24
- }, async (args) => {
25
- const output = await this.inboxService.getInbox(args);
26
- return {
27
- content: createContent(output),
28
- structuredContent: output,
29
- };
30
- });
31
- }
32
- }
33
- exports.GetTelegramInboxTool = GetTelegramInboxTool;
@@ -1,77 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.InboxService = void 0;
4
- class InboxService {
5
- config;
6
- inboxStore;
7
- _sessionStore;
8
- logger;
9
- projectIdentityResolver;
10
- constructor(config, inboxStore, _sessionStore, logger, projectIdentityResolver) {
11
- this.config = config;
12
- this.inboxStore = inboxStore;
13
- this._sessionStore = _sessionStore;
14
- this.logger = logger;
15
- this.projectIdentityResolver = projectIdentityResolver;
16
- }
17
- async getInboxCount(input) {
18
- const resolved = this.projectIdentityResolver.resolveSessionDefaults(input);
19
- const total = await this.inboxStore.countInboxMessages(resolved.sessionId);
20
- this.logger.info("Telegram inbox count fetched", {
21
- sessionId: resolved.sessionId,
22
- sessionIdDerived: resolved.sessionIdDerived,
23
- total,
24
- });
25
- return {
26
- session_id: resolved.sessionId,
27
- total,
28
- };
29
- }
30
- async getInbox(input) {
31
- const resolved = this.projectIdentityResolver.resolveSessionDefaults(input);
32
- const limit = this.config.telegram.inboxBatchSize;
33
- const messages = await this.inboxStore.listInboxMessages(resolved.sessionId, limit);
34
- const total = await this.inboxStore.countInboxMessages(resolved.sessionId);
35
- this.logger.info("Telegram inbox fetched", {
36
- sessionId: resolved.sessionId,
37
- sessionIdDerived: resolved.sessionIdDerived,
38
- limit,
39
- returned: messages.length,
40
- total,
41
- });
42
- return {
43
- session_id: resolved.sessionId,
44
- total,
45
- has_more: total > messages.length,
46
- messages: messages.map((message) => ({
47
- message_id: message.id,
48
- source: "telegram",
49
- message_kind: message.sourceTelegramMessageId > 0 ? "human" : "system",
50
- telegram_chat_id: message.telegramChatId,
51
- telegram_user_id: message.telegramUserId,
52
- telegram_message_id: message.sourceTelegramMessageId,
53
- text: message.text,
54
- ...(message.attachments?.length
55
- ? { attachments: message.attachments }
56
- : {}),
57
- received_at: message.receivedAt,
58
- })),
59
- };
60
- }
61
- async deleteInboxMessage(input) {
62
- const resolved = this.projectIdentityResolver.resolveSessionDefaults(input);
63
- const deleted = await this.inboxStore.deleteInboxMessage(resolved.sessionId, input.message_id);
64
- this.logger.info("Telegram inbox message deleted", {
65
- sessionId: resolved.sessionId,
66
- sessionIdDerived: resolved.sessionIdDerived,
67
- messageId: input.message_id,
68
- deleted,
69
- });
70
- return {
71
- deleted,
72
- session_id: resolved.sessionId,
73
- message_id: input.message_id,
74
- };
75
- }
76
- }
77
- exports.InboxService = InboxService;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ClearSessionPairingTool = void 0;
4
- const schema_1 = require("../../../entities/request/model/schema");
5
- function createContent(output) {
6
- return [
7
- {
8
- type: "text",
9
- text: JSON.stringify(output, null, 2),
10
- },
11
- ];
12
- }
13
- class ClearSessionPairingTool {
14
- pairSessionService;
15
- constructor(pairSessionService) {
16
- this.pairSessionService = pairSessionService;
17
- }
18
- register(server) {
19
- server.registerTool("clear_session_pairing", {
20
- title: "Clear Session Pairing",
21
- description: "Use this when the user asks to unpair, unlink, detach, or reset Telegram binding for the current session. Remove Telegram binding for a session so it can be paired again.",
22
- inputSchema: schema_1.clearSessionPairingInputSchema,
23
- outputSchema: schema_1.clearSessionPairingOutputSchema,
24
- }, async (args) => {
25
- const output = await this.pairSessionService.clearPairing(args);
26
- return {
27
- content: createContent(output),
28
- structuredContent: output,
29
- };
30
- });
31
- }
32
- }
33
- exports.ClearSessionPairingTool = ClearSessionPairingTool;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CreateSessionPairCodeTool = void 0;
4
- const schema_1 = require("../../../entities/request/model/schema");
5
- function createContent(output) {
6
- return [
7
- {
8
- type: "text",
9
- text: JSON.stringify(output, null, 2),
10
- },
11
- ];
12
- }
13
- class CreateSessionPairCodeTool {
14
- pairSessionService;
15
- constructor(pairSessionService) {
16
- this.pairSessionService = pairSessionService;
17
- }
18
- register(server) {
19
- server.registerTool("create_session_pair_code", {
20
- title: "Create Session Pair Code",
21
- description: "Use this when the user asks to link, pair, register, or connect the current agent/session to Telegram. Before calling it, determine the correct workspace cwd and, if tmux is available, collect current tmux attributes. Then create a short-lived Telegram pairing code for that session. After success, remember the returned session_id and pass it explicitly to later session-scoped tools.",
22
- inputSchema: schema_1.createSessionPairCodeInputSchema,
23
- outputSchema: schema_1.createSessionPairCodeOutputSchema,
24
- }, async (args) => {
25
- const output = await this.pairSessionService.createPairCode(args);
26
- return {
27
- content: createContent(output),
28
- structuredContent: output,
29
- };
30
- });
31
- }
32
- }
33
- exports.CreateSessionPairCodeTool = CreateSessionPairCodeTool;
@@ -1,202 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PairSessionService = void 0;
4
- const ids_1 = require("../../../shared/lib/ids/ids");
5
- class PairSessionService {
6
- config;
7
- sessionStore;
8
- bindingStore;
9
- maintenanceStore;
10
- logger;
11
- projectIdentityResolver;
12
- static MAX_PAIR_CODE_ATTEMPTS = 20;
13
- constructor(config, sessionStore, bindingStore, maintenanceStore, logger, projectIdentityResolver) {
14
- this.config = config;
15
- this.sessionStore = sessionStore;
16
- this.bindingStore = bindingStore;
17
- this.maintenanceStore = maintenanceStore;
18
- this.logger = logger;
19
- this.projectIdentityResolver = projectIdentityResolver;
20
- }
21
- async unregisterGatewaySession(localSessionId) {
22
- if (!this.config.distributed.gatewayPublicUrl) {
23
- return;
24
- }
25
- const clientUuid = await this.maintenanceStore.getGatewayClientUuid();
26
- if (!clientUuid) {
27
- return;
28
- }
29
- const url = new URL(this.config.distributed.gatewayPublicUrl);
30
- url.pathname = url.pathname.replace(/\/+$/u, "");
31
- if (!url.pathname.endsWith("/gateway")) {
32
- url.pathname = `${url.pathname}/gateway`.replace(/\/{2,}/gu, "/");
33
- }
34
- url.pathname = `${url.pathname}/sessions/unregister`.replace(/\/{2,}/gu, "/");
35
- const response = await fetch(url, {
36
- method: "POST",
37
- headers: {
38
- "content-type": "application/json",
39
- ...(this.config.distributed.gatewayAuthToken
40
- ? { authorization: `Bearer ${this.config.distributed.gatewayAuthToken}` }
41
- : {}),
42
- },
43
- body: JSON.stringify({
44
- client_uuid: clientUuid,
45
- local_session_id: localSessionId,
46
- }),
47
- });
48
- if (!response.ok) {
49
- const text = await response.text();
50
- throw new Error(`Gateway session unregister failed with status ${response.status}: ${text || response.statusText}`);
51
- }
52
- }
53
- async createPairCode(input) {
54
- const resolved = this.projectIdentityResolver.resolveSessionDefaults(input);
55
- const now = new Date();
56
- const ttlSeconds = input.expires_in_seconds ?? this.config.pairCodeTtlSeconds;
57
- const expiresAt = new Date(now.getTime() + ttlSeconds * 1000).toISOString();
58
- let code = null;
59
- const existingSession = await this.sessionStore.getSession(resolved.sessionId);
60
- await this.sessionStore.setSession({
61
- sessionId: resolved.sessionId,
62
- ...(input.session_label
63
- ? { label: input.session_label }
64
- : resolved.sessionLabel
65
- ? { label: resolved.sessionLabel }
66
- : existingSession?.label
67
- ? { label: existingSession.label }
68
- : {}),
69
- ...(input.cwd
70
- ? { cwd: resolved.cwd }
71
- : existingSession?.cwd
72
- ? { cwd: existingSession.cwd }
73
- : { cwd: resolved.cwd }),
74
- ...(existingSession?.linkedSessionId
75
- ? { linkedSessionId: existingSession.linkedSessionId }
76
- : {}),
77
- ...(existingSession?.activeProjectUuid
78
- ? { activeProjectUuid: existingSession.activeProjectUuid }
79
- : {}),
80
- ...(existingSession?.activeProjectName
81
- ? { activeProjectName: existingSession.activeProjectName }
82
- : {}),
83
- ...(existingSession?.task ? { task: existingSession.task } : {}),
84
- ...(existingSession?.summary ? { summary: existingSession.summary } : {}),
85
- ...(existingSession?.files ? { files: existingSession.files } : {}),
86
- ...(existingSession?.decisions
87
- ? { decisions: existingSession.decisions }
88
- : {}),
89
- ...(existingSession?.risks ? { risks: existingSession.risks } : {}),
90
- ...(input.tmux_session_name
91
- ? { tmuxSessionName: input.tmux_session_name }
92
- : existingSession?.tmuxSessionName
93
- ? { tmuxSessionName: existingSession.tmuxSessionName }
94
- : {}),
95
- ...(input.tmux_window_name
96
- ? { tmuxWindowName: input.tmux_window_name }
97
- : existingSession?.tmuxWindowName
98
- ? { tmuxWindowName: existingSession.tmuxWindowName }
99
- : {}),
100
- ...(typeof input.tmux_window_index === "number"
101
- ? { tmuxWindowIndex: input.tmux_window_index }
102
- : typeof existingSession?.tmuxWindowIndex === "number"
103
- ? { tmuxWindowIndex: existingSession.tmuxWindowIndex }
104
- : {}),
105
- ...(input.tmux_pane_id
106
- ? { tmuxPaneId: input.tmux_pane_id, tmuxTarget: input.tmux_pane_id }
107
- : existingSession?.tmuxPaneId
108
- ? {
109
- tmuxPaneId: existingSession.tmuxPaneId,
110
- ...(existingSession.tmuxTarget
111
- ? { tmuxTarget: existingSession.tmuxTarget }
112
- : {}),
113
- }
114
- : existingSession?.tmuxTarget
115
- ? { tmuxTarget: existingSession.tmuxTarget }
116
- : {}),
117
- ...(typeof input.tmux_pane_index === "number"
118
- ? { tmuxPaneIndex: input.tmux_pane_index }
119
- : typeof existingSession?.tmuxPaneIndex === "number"
120
- ? { tmuxPaneIndex: existingSession.tmuxPaneIndex }
121
- : {}),
122
- ...(existingSession?.lastTmuxNudgeAt
123
- ? { lastTmuxNudgeAt: existingSession.lastTmuxNudgeAt }
124
- : {}),
125
- updatedAt: now.toISOString(),
126
- });
127
- this.projectIdentityResolver.persistSessionMarker({
128
- cwd: resolved.cwd,
129
- sessionId: resolved.sessionId,
130
- sessionLabel: input.session_label?.trim() || resolved.sessionLabel,
131
- });
132
- for (let attempt = 0; attempt < PairSessionService.MAX_PAIR_CODE_ATTEMPTS; attempt += 1) {
133
- const candidate = (0, ids_1.createPairCode)();
134
- const record = {
135
- code: candidate,
136
- sessionId: resolved.sessionId,
137
- ...(resolved.sessionLabel
138
- ? { sessionLabel: resolved.sessionLabel }
139
- : {}),
140
- createdAt: now.toISOString(),
141
- expiresAt,
142
- };
143
- const reserved = await this.bindingStore.createPairCode(record, ttlSeconds);
144
- if (reserved) {
145
- code = candidate;
146
- break;
147
- }
148
- }
149
- if (!code) {
150
- throw new Error("Failed to reserve a unique 3-digit pairing code. Try again in a moment.");
151
- }
152
- this.logger.info("Session pair code created", {
153
- sessionId: resolved.sessionId,
154
- sessionLabel: resolved.sessionLabel,
155
- sessionIdDerived: resolved.sessionIdDerived,
156
- sessionLabelDerived: resolved.sessionLabelDerived,
157
- cwd: input.cwd?.trim(),
158
- tmuxSessionName: input.tmux_session_name,
159
- tmuxWindowName: input.tmux_window_name,
160
- tmuxWindowIndex: input.tmux_window_index,
161
- tmuxPaneId: input.tmux_pane_id,
162
- tmuxPaneIndex: input.tmux_pane_index,
163
- expiresAt,
164
- ttlSeconds,
165
- });
166
- return {
167
- session_id: resolved.sessionId,
168
- code,
169
- expires_at: expiresAt,
170
- status: "pending",
171
- status_message: "Pairing code created. Send it to the Telegram bot and then use get_session_context to confirm that pairing is active.",
172
- ...(this.config.telegram.botUsername
173
- ? {
174
- telegram_link_hint: `https://t.me/${this.config.telegram.botUsername}?start=${encodeURIComponent(code)}`,
175
- }
176
- : {}),
177
- };
178
- }
179
- async clearPairing(input) {
180
- const resolved = this.projectIdentityResolver.resolveSessionDefaults(input);
181
- const existingSession = await this.sessionStore.getSession(resolved.sessionId);
182
- if (existingSession) {
183
- await this.unregisterGatewaySession(resolved.sessionId);
184
- await this.sessionStore.setSession({
185
- ...existingSession,
186
- activeProjectUuid: undefined,
187
- activeProjectName: undefined,
188
- updatedAt: new Date().toISOString(),
189
- });
190
- }
191
- await this.bindingStore.clearBinding(resolved.sessionId);
192
- this.logger.info("Session pairing cleared", {
193
- sessionId: resolved.sessionId,
194
- sessionIdDerived: resolved.sessionIdDerived,
195
- });
196
- return {
197
- cleared: true,
198
- session_id: resolved.sessionId,
199
- };
200
- }
201
- }
202
- exports.PairSessionService = PairSessionService;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.GetTmuxTargetTool = void 0;
4
- const schema_1 = require("../../../entities/request/model/schema");
5
- function createContent(output) {
6
- return [
7
- {
8
- type: "text",
9
- text: JSON.stringify(output, null, 2),
10
- },
11
- ];
12
- }
13
- class GetTmuxTargetTool {
14
- sessionContextService;
15
- constructor(sessionContextService) {
16
- this.sessionContextService = sessionContextService;
17
- }
18
- register(server) {
19
- server.registerTool("get_tmux_target", {
20
- title: "Get tmux Target",
21
- description: "Debug/setup tool. Return the stored tmux pane target for a session, including the last time the service nudged that tmux pane. Do not call this in the normal inbox-processing path after a tmux nudge.",
22
- inputSchema: schema_1.getTmuxTargetInputSchema,
23
- outputSchema: schema_1.getTmuxTargetOutputSchema,
24
- }, async (args) => {
25
- const output = await this.sessionContextService.getTmuxTarget(args);
26
- return {
27
- content: createContent(output),
28
- structuredContent: output,
29
- };
30
- });
31
- }
32
- }
33
- exports.GetTmuxTargetTool = GetTmuxTargetTool;
@@ -1,33 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SetTmuxTargetTool = void 0;
4
- const schema_1 = require("../../../entities/request/model/schema");
5
- function createContent(output) {
6
- return [
7
- {
8
- type: "text",
9
- text: JSON.stringify(output, null, 2),
10
- },
11
- ];
12
- }
13
- class SetTmuxTargetTool {
14
- sessionContextService;
15
- constructor(sessionContextService) {
16
- this.sessionContextService = sessionContextService;
17
- }
18
- register(server) {
19
- server.registerTool("set_tmux_target", {
20
- title: "Set tmux Target",
21
- description: "Use this to repair or complete Telegram session setup after pairing, or when tmux pane/session changed. Store the tmux pane target for a session so the long-running MCP service can nudge the agent to check Telegram inbox when new ordinary Telegram messages arrive.",
22
- inputSchema: schema_1.setTmuxTargetInputSchema,
23
- outputSchema: schema_1.setTmuxTargetOutputSchema,
24
- }, async (args) => {
25
- const output = await this.sessionContextService.setTmuxTarget(args);
26
- return {
27
- content: createContent(output),
28
- structuredContent: output,
29
- };
30
- });
31
- }
32
- }
33
- exports.SetTmuxTargetTool = SetTmuxTargetTool;