@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,286 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransportPartnerActions = void 0;
4
+ const grammy_1 = require("grammy");
5
+ const telegramXchangeRecords_1 = require("../../lib/telegramXchangeRecords");
6
+ const collabUi_1 = require("./collabUi");
7
+ const collabSemantics_1 = require("./collabSemantics");
8
+ const transportFormatting_1 = require("./transportFormatting");
9
+ const transportUtils_1 = require("./transportUtils");
10
+ function looksLikeBrowserScreenshotTask(input) {
11
+ const haystack = [input.summary, input.message].join("\n").toLowerCase();
12
+ return (/\b(browser_open|browser_screenshot|playwright)\b/u.test(haystack) ||
13
+ /\b(скриншот|screenshot|скрин)\b/u.test(haystack) ||
14
+ /\bhttps?:\/\/[^\s]+/u.test(haystack));
15
+ }
16
+ class TransportPartnerActions {
17
+ host;
18
+ constructor(host) {
19
+ this.host = host;
20
+ }
21
+ async beginPartnerNoteMode(ctx, kind, target) {
22
+ const locale = await this.host.resolveLocaleForContext(ctx);
23
+ const principal = this.host.getPrincipalFromContext(ctx);
24
+ if (!principal) {
25
+ await ctx.answerCallbackQuery({
26
+ text: this.host.t(locale, "common:errors.no_telegram_identity"),
27
+ show_alert: true,
28
+ });
29
+ return;
30
+ }
31
+ const sessionId = await this.host.bindingStore.getActiveSessionIdForPrincipal(principal);
32
+ if (!sessionId) {
33
+ await ctx.answerCallbackQuery({
34
+ text: this.host.t(locale, "common:errors.no_active_session"),
35
+ show_alert: true,
36
+ });
37
+ return;
38
+ }
39
+ const session = await this.host.sessionStore.getSession(sessionId);
40
+ if (!target) {
41
+ await ctx.answerCallbackQuery({
42
+ text: "Choose a target from Collab project members first.",
43
+ show_alert: true,
44
+ });
45
+ return;
46
+ }
47
+ const targetLabel = target?.targetSessionLabel ??
48
+ this.host.t(locale, "menu:partner.screen.default_partner");
49
+ const sourceLabel = session?.label ?? sessionId;
50
+ const prompt = (0, collabUi_1.buildPartnerNotePromptText)({
51
+ kind,
52
+ sourceLabel,
53
+ targetLabel,
54
+ isProjectTarget: Boolean(target?.projectUuid),
55
+ });
56
+ await ctx.answerCallbackQuery({ text: `${prompt.kindLabel}.` });
57
+ const sent = await this.host.replyText(ctx, prompt.text, { kind: "menu", sessionId }, {
58
+ reply_markup: new grammy_1.InlineKeyboard().text(this.host.t(locale, "menu:handoff.cancel"), "partner-note-cancel"),
59
+ });
60
+ this.host.pendingPartnerNotes.set((0, transportUtils_1.buildPrincipalKey)(principal), {
61
+ sessionId,
62
+ kind,
63
+ initiatedAt: new Date().toISOString(),
64
+ ...(target ? { targetSessionId: target.targetSessionId } : {}),
65
+ ...(target ? { targetSessionLabel: target.targetSessionLabel } : {}),
66
+ ...(target?.projectUuid ? { projectUuid: target.projectUuid } : {}),
67
+ ...(sent && "message_id" in sent ? { promptMessageId: sent.message_id } : {}),
68
+ });
69
+ }
70
+ async cancelPendingPartnerNote(ctx) {
71
+ const locale = await this.host.resolveLocaleForContext(ctx);
72
+ const principal = this.host.getPrincipalFromContext(ctx);
73
+ if (!principal) {
74
+ await ctx.answerCallbackQuery({
75
+ text: this.host.t(locale, "common:errors.no_telegram_identity"),
76
+ show_alert: true,
77
+ });
78
+ return;
79
+ }
80
+ const principalKey = (0, transportUtils_1.buildPrincipalKey)(principal);
81
+ const pending = this.host.pendingPartnerNotes.get(principalKey);
82
+ if (!pending) {
83
+ await ctx.answerCallbackQuery({
84
+ text: this.host.t(locale, "menu:partner.actions.no_pending_note_input"),
85
+ show_alert: true,
86
+ });
87
+ return;
88
+ }
89
+ this.host.pendingPartnerNotes.delete(principalKey);
90
+ await this.deletePendingPartnerNotePrompt(ctx, pending);
91
+ await ctx.answerCallbackQuery({
92
+ text: this.host.t(locale, "menu:partner.actions.cancel_note_input"),
93
+ });
94
+ if (pending.projectUuid) {
95
+ await this.host.showProjectsMenu(ctx);
96
+ return;
97
+ }
98
+ await this.host.showMainMenu(ctx);
99
+ }
100
+ async handlePendingPartnerNote(ctx, text) {
101
+ const locale = await this.host.resolveLocaleForContext(ctx);
102
+ const principal = this.host.getPrincipalFromContext(ctx);
103
+ if (!principal) {
104
+ return false;
105
+ }
106
+ const principalKey = (0, transportUtils_1.buildPrincipalKey)(principal);
107
+ const pending = this.host.pendingPartnerNotes.get(principalKey);
108
+ if (!pending) {
109
+ return false;
110
+ }
111
+ if (text.startsWith("/")) {
112
+ this.host.pendingPartnerNotes.delete(principalKey);
113
+ await this.deletePendingPartnerNotePrompt(ctx, pending);
114
+ return false;
115
+ }
116
+ const parsed = (0, transportFormatting_1.parsePartnerNoteText)(text);
117
+ const sourceSession = await this.host.sessionStore.getSession(pending.sessionId);
118
+ const sourceLabel = sourceSession?.label ?? pending.sessionId;
119
+ const targetLabel = pending.targetSessionLabel ??
120
+ pending.targetSessionId ??
121
+ this.host.t(locale, "menu:partner.screen.default_partner");
122
+ this.host.pendingPartnerNotes.delete(principalKey);
123
+ await this.deletePendingPartnerNotePrompt(ctx, pending);
124
+ if ((0, collabSemantics_1.isExecutorTargetKind)(pending.kind)) {
125
+ if (pending.projectUuid) {
126
+ await this.host.ensureProjectSessionRegistered({
127
+ principal,
128
+ sessionId: pending.sessionId,
129
+ projectUuid: pending.projectUuid,
130
+ });
131
+ }
132
+ const prefersBrowserScreenshot = looksLikeBrowserScreenshotTask({
133
+ summary: parsed.summary,
134
+ message: parsed.message,
135
+ });
136
+ const delegatedMessage = [
137
+ `Пользователь из Telegram просит тебя выполнить задачу для сессии ${sourceLabel}.`,
138
+ `Маршрут результата: ${targetLabel} -> ${sourceLabel}`,
139
+ "",
140
+ "Задача:",
141
+ parsed.message,
142
+ "",
143
+ "Не отправляй результат напрямую в Telegram из этой сессии.",
144
+ `Верни результат только обратно в сессию ${sourceLabel}.`,
145
+ `Исходная сессия ${sourceLabel} сама доставит его человеку в Telegram.`,
146
+ ].join("\n");
147
+ const expectedReply = prefersBrowserScreenshot
148
+ ? [
149
+ `Подготовь скриншот для сессии ${sourceLabel}.`,
150
+ "Для веб-страницы сначала используй browser_open и browser_screenshot в этой консоли.",
151
+ "Если нужен реальный файл-артефакт, верни его обратно в исходную сессию через send_partner_file.",
152
+ "Не отправляй результат напрямую в Telegram из этой сессии.",
153
+ "Задача не завершена, пока send_partner_file не отработал успешно.",
154
+ ].join(" ")
155
+ : [
156
+ `Подготовь результат для сессии ${sourceLabel}.`,
157
+ "Если результатом является реальный файл или артефакт, отправь его обратно через send_partner_file.",
158
+ "Во всех остальных случаях отправь результат обратно через send_partner_note.",
159
+ "Не отправляй результат напрямую в Telegram из этой сессии.",
160
+ "Задача не завершена, пока send_partner_note или send_partner_file не отработал успешно.",
161
+ ].join(" ");
162
+ const output = await this.host.sendPartnerNote({
163
+ session_id: pending.sessionId,
164
+ ...(pending.targetSessionId ? { target_session_id: pending.targetSessionId } : {}),
165
+ ...(pending.projectUuid ? { project_uuid: pending.projectUuid } : {}),
166
+ kind: pending.kind,
167
+ summary: parsed.summary,
168
+ message: delegatedMessage,
169
+ expected_reply: expectedReply,
170
+ requires_reply: true,
171
+ });
172
+ const sent = await this.host.replyText(ctx, [
173
+ this.host.t(locale, "menu:partner.actions.task_sent"),
174
+ ...(output.project_name ? [`Проект: ${output.project_name}`] : []),
175
+ ...(output.target_actor_label
176
+ ? [this.host.t(locale, "menu:partner.screen.executor", { label: output.target_actor_label })]
177
+ : []),
178
+ this.host.t(locale, "menu:partner.screen.route_result", {
179
+ source: targetLabel,
180
+ target: sourceLabel,
181
+ }),
182
+ this.host.t(locale, "menu:partner.screen.type", { kind: pending.kind }),
183
+ this.host.t(locale, "menu:partner.screen.summary", { summary: parsed.summary }),
184
+ this.host.t(locale, "menu:partner.screen.status", {
185
+ status: output.delivery_status === "delivered"
186
+ ? this.host.t(locale, "menu:partner.screen.delivered")
187
+ : this.host.t(locale, "menu:partner.screen.queued"),
188
+ }),
189
+ `Share: ${output.share_id}`,
190
+ ].join("\n"), { kind: "menu", sessionId: pending.sessionId });
191
+ if (output.delivery_status === "queued" && sent && "message_id" in sent && ctx.chat) {
192
+ await this.host.maintenanceStore.setOutgoingDeliveryNotice({
193
+ deliveryUuid: output.inbox_message_id,
194
+ sessionId: pending.sessionId,
195
+ telegramChatId: ctx.chat.id,
196
+ telegramMessageId: sent.message_id,
197
+ shareId: output.share_id,
198
+ kind: output.kind,
199
+ summary: parsed.summary,
200
+ ...(output.project_name ? { projectName: output.project_name } : {}),
201
+ ...(output.target_actor_label ? { targetLabel: output.target_actor_label } : { targetLabel }),
202
+ ...(output.target_session_label
203
+ ? { targetSessionLabel: output.target_session_label }
204
+ : { targetSessionLabel: targetLabel }),
205
+ });
206
+ }
207
+ return true;
208
+ }
209
+ await this.enqueuePartnerNoteInstruction({
210
+ principal,
211
+ sessionId: pending.sessionId,
212
+ sourceTelegramMessageId: ctx.message?.message_id ?? 0,
213
+ kind: pending.kind,
214
+ summary: parsed.summary,
215
+ message: parsed.message,
216
+ ...(pending.targetSessionId ? { targetSessionId: pending.targetSessionId } : {}),
217
+ ...(pending.targetSessionLabel ? { targetSessionLabel: pending.targetSessionLabel } : {}),
218
+ ...(pending.projectUuid ? { projectUuid: pending.projectUuid } : {}),
219
+ });
220
+ await this.host.replyText(ctx, [
221
+ this.host.t(locale, "menu:partner.actions.inbox_queued"),
222
+ this.host.t(locale, "menu:partner.screen.route_send", {
223
+ source: sourceLabel,
224
+ target: targetLabel,
225
+ }),
226
+ this.host.t(locale, "menu:partner.screen.type", { kind: pending.kind }),
227
+ this.host.t(locale, "menu:partner.screen.summary", { summary: parsed.summary }),
228
+ this.host.t(locale, "menu:partner.screen.current_session_handles"),
229
+ ].join("\n"), { kind: "menu", sessionId: pending.sessionId });
230
+ return true;
231
+ }
232
+ async deletePendingPartnerNotePrompt(ctx, pending) {
233
+ if (!pending.promptMessageId) {
234
+ return;
235
+ }
236
+ try {
237
+ await this.host.deleteMessage(ctx.chat.id, pending.promptMessageId);
238
+ }
239
+ catch (error) {
240
+ this.host.logger.warn("Failed to delete pending partner note prompt", {
241
+ sessionId: pending.sessionId,
242
+ promptMessageId: pending.promptMessageId,
243
+ error: error instanceof Error ? (error.stack ?? error.message) : String(error),
244
+ });
245
+ }
246
+ }
247
+ async enqueuePartnerNoteInstruction(input) {
248
+ const session = await this.host.sessionStore.getSession(input.sessionId);
249
+ const sourceLabel = session?.label ?? input.sessionId;
250
+ const targetLabel = input.targetSessionLabel ?? input.targetSessionId ?? "напарник";
251
+ await (0, telegramXchangeRecords_1.writeLocalTaskXchangeRecord)({
252
+ config: this.host.config,
253
+ session,
254
+ sessionId: input.sessionId,
255
+ summary: input.summary,
256
+ kind: input.kind,
257
+ text: [
258
+ "Пользователь просит текущую консоль выполнить работу и отправить результат другой консоли.",
259
+ `Маршрут отправки: ${sourceLabel} -> ${targetLabel}`,
260
+ `Тип: ${input.kind}`,
261
+ `Кратко: ${input.summary}`,
262
+ ...(input.projectUuid ? [`Проект UUID: ${input.projectUuid}`] : []),
263
+ ...(input.targetSessionId ? [`Target session ID: ${input.targetSessionId}`] : []),
264
+ "",
265
+ "Содержимое для отправки:",
266
+ input.message,
267
+ "",
268
+ "Не пересылай это как новую задачу в target-консоль.",
269
+ "Сначала выполни работу в текущей консоли сам.",
270
+ "Через send_partner_note или send_partner_file отправляй только результат, а не исходное поручение.",
271
+ "Не останавливайся на проверке xchange records, чтении note, listing файлов или текстовом отчёте.",
272
+ "Передай target_session_id явно в send_partner_note.",
273
+ "После подготовки обязательно используй send_partner_note.",
274
+ "Задача не завершена, пока send_partner_note не отработал успешно.",
275
+ "Только после успешной отправки результата можно делать mark_xchange_record_read.",
276
+ "Если запрос касается существующего локального файла, вызови send_partner_file.",
277
+ ].join("\n"),
278
+ createdAt: new Date().toISOString(),
279
+ actionDesc: "Start with get_xchange_record, complete the work in this console, then send the final result to the target console with send_partner_note or send_partner_file. Do not stop at analysis or a summary. The task is not complete until the outbound tool succeeds, and only then may you call mark_xchange_record_read.",
280
+ tools: ["get_xchange_record", "send_partner_note", "send_partner_file", "mark_xchange_record_read"],
281
+ tags: ["telegram", "human", "local", "partner-routing"],
282
+ });
283
+ await this.host.nudgeSessionInbox(input.sessionId);
284
+ }
285
+ }
286
+ exports.TransportPartnerActions = TransportPartnerActions;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TransportPayloadState = void 0;
4
+ const ids_1 = require("../../lib/ids/ids");
5
+ class TransportPayloadState {
6
+ host;
7
+ constructor(host) {
8
+ this.host = host;
9
+ }
10
+ async createFileMenuPayload(sessionId, filePath) {
11
+ return this.createPayload({
12
+ kind: "file-entry",
13
+ sessionId,
14
+ filePath,
15
+ });
16
+ }
17
+ async createSessionMenuPayload(sessionId, ownerLabel, ownerKey) {
18
+ return this.createPayload({
19
+ kind: "active-session",
20
+ sessionId,
21
+ ...(ownerKey ? { ownerKey } : {}),
22
+ ...(ownerLabel ? { ownerLabel } : {}),
23
+ });
24
+ }
25
+ async createSessionGroupMenuPayload(ownerLabel, ownerKey) {
26
+ return this.createPayload({
27
+ kind: "session-group",
28
+ ...(ownerKey ? { ownerKey } : {}),
29
+ ownerLabel,
30
+ });
31
+ }
32
+ async createProjectMenuPayload(sessionId, projectUuid, title) {
33
+ return this.createPayload({
34
+ kind: "project-entry",
35
+ sessionId,
36
+ projectUuid,
37
+ title,
38
+ });
39
+ }
40
+ async createProjectDeleteMenuPayload(sessionId, projectUuid, title) {
41
+ return this.createPayload({
42
+ kind: "project-delete-entry",
43
+ sessionId,
44
+ projectUuid,
45
+ title,
46
+ });
47
+ }
48
+ async createProjectMemberMenuPayload(sessionId, projectUuid, targetSessionId, title, options) {
49
+ return this.createPayload({
50
+ kind: options?.filePath ? "project-file-target" : "project-member",
51
+ sessionId,
52
+ projectUuid,
53
+ targetSessionId,
54
+ title,
55
+ ...(options?.filePath ? { filePath: options.filePath } : {}),
56
+ ...(options?.targetClientUuid
57
+ ? { targetClientUuid: options.targetClientUuid }
58
+ : {}),
59
+ ...(options?.targetLocalSessionId
60
+ ? { targetLocalSessionId: options.targetLocalSessionId }
61
+ : {}),
62
+ });
63
+ }
64
+ async createLiveApprovalMenuPayload(input) {
65
+ return this.createPayload({
66
+ kind: "live-approval",
67
+ sessionId: input.sessionId,
68
+ sourceSessionId: input.sourceSessionId,
69
+ sourceSessionLabel: input.sourceSessionLabel,
70
+ sourceClientUuid: input.sourceClientUuid,
71
+ sourceLocalSessionId: input.sourceLocalSessionId,
72
+ targetSessionId: input.targetSessionId,
73
+ title: input.targetSessionLabel,
74
+ targetClientUuid: input.targetClientUuid,
75
+ targetLocalSessionId: input.targetLocalSessionId,
76
+ ...(input.projectUuid ? { projectUuid: input.projectUuid } : {}),
77
+ ...(input.projectName ? { projectName: input.projectName } : {}),
78
+ });
79
+ }
80
+ async createTerminalPromptActionPayload(sessionId, actions) {
81
+ return this.createPayload({
82
+ kind: "terminal-prompt-action",
83
+ sessionId,
84
+ promptActions: actions,
85
+ });
86
+ }
87
+ async createPartnerFileTargetPayload(sessionId, targetSessionId, title, filePath) {
88
+ return this.createPayload({
89
+ kind: "partner-file-target",
90
+ sessionId,
91
+ targetSessionId,
92
+ title,
93
+ filePath,
94
+ });
95
+ }
96
+ async createPayload(payload) {
97
+ const key = (0, ids_1.createMenuPayloadKey)();
98
+ const now = new Date();
99
+ await this.host.menuPayloadStore.createMenuPayload({
100
+ key,
101
+ ...payload,
102
+ createdAt: now.toISOString(),
103
+ expiresAt: new Date(now.getTime() + this.host.menuPayloadTtlSeconds * 1000).toISOString(),
104
+ }, this.host.menuPayloadTtlSeconds);
105
+ return key;
106
+ }
107
+ }
108
+ exports.TransportPayloadState = TransportPayloadState;