cli-jaw 2.2.2 → 2.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +13 -9
- package/README.ko.md +5 -5
- package/README.md +7 -6
- package/README.zh-CN.md +5 -5
- package/dist/bin/commands/goal.js +14 -1
- package/dist/bin/commands/goal.js.map +1 -1
- package/dist/src/agent/agy-bootstrap.js +104 -0
- package/dist/src/agent/agy-bootstrap.js.map +1 -0
- package/dist/src/agent/agy-capabilities.js +103 -0
- package/dist/src/agent/agy-capabilities.js.map +1 -0
- package/dist/src/agent/agy-transcript-watcher.js +11 -0
- package/dist/src/agent/agy-transcript-watcher.js.map +1 -1
- package/dist/src/agent/args.js +32 -13
- package/dist/src/agent/args.js.map +1 -1
- package/dist/src/agent/events/claude.js +8 -4
- package/dist/src/agent/events/claude.js.map +1 -1
- package/dist/src/agent/events/helpers.js +13 -0
- package/dist/src/agent/events/helpers.js.map +1 -1
- package/dist/src/agent/events/index.js +24 -4
- package/dist/src/agent/events/index.js.map +1 -1
- package/dist/src/agent/lifecycle-handler.js +25 -4
- package/dist/src/agent/lifecycle-handler.js.map +1 -1
- package/dist/src/agent/spawn/queue.js +11 -5
- package/dist/src/agent/spawn/queue.js.map +1 -1
- package/dist/src/agent/spawn.js +49 -13
- package/dist/src/agent/spawn.js.map +1 -1
- package/dist/src/browser/web-ai/ax-snapshot.js +131 -8
- package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
- package/dist/src/browser/web-ai/candidate-reconcile.js +61 -0
- package/dist/src/browser/web-ai/candidate-reconcile.js.map +1 -0
- package/dist/src/browser/web-ai/capability-probe.js +92 -0
- package/dist/src/browser/web-ai/capability-probe.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-archive.js +90 -0
- package/dist/src/browser/web-ai/chatgpt-archive.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-attachments.js +70 -3
- package/dist/src/browser/web-ai/chatgpt-attachments.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-composer.js +97 -11
- package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-deep-research-report.js +63 -0
- package/dist/src/browser/web-ai/chatgpt-deep-research-report.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-deep-research.js +76 -13
- package/dist/src/browser/web-ai/chatgpt-deep-research.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-files.js +328 -0
- package/dist/src/browser/web-ai/chatgpt-files.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-images.js +281 -0
- package/dist/src/browser/web-ai/chatgpt-images.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-model.js +35 -14
- package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-multi-turn.js +28 -4
- package/dist/src/browser/web-ai/chatgpt-multi-turn.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-project-sources.js +191 -0
- package/dist/src/browser/web-ai/chatgpt-project-sources.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-response-dom.js +64 -0
- package/dist/src/browser/web-ai/chatgpt-response-dom.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-response-observer.js +170 -0
- package/dist/src/browser/web-ai/chatgpt-response-observer.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt-response.js +99 -60
- package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-tools.js +48 -1
- package/dist/src/browser/web-ai/chatgpt-tools.js.map +1 -1
- package/dist/src/browser/web-ai/chatgpt-upload-surface.js +202 -0
- package/dist/src/browser/web-ai/chatgpt-upload-surface.js.map +1 -0
- package/dist/src/browser/web-ai/chatgpt.js +93 -12
- package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
- package/dist/src/browser/web-ai/code-artifact.js +32 -10
- package/dist/src/browser/web-ai/code-artifact.js.map +1 -1
- package/dist/src/browser/web-ai/code-mode.js +40 -4
- package/dist/src/browser/web-ai/code-mode.js.map +1 -1
- package/dist/src/browser/web-ai/contract-audit.js +7 -22
- package/dist/src/browser/web-ai/contract-audit.js.map +1 -1
- package/dist/src/browser/web-ai/control-summary.js +43 -0
- package/dist/src/browser/web-ai/control-summary.js.map +1 -0
- package/dist/src/browser/web-ai/copy-markdown.js +10 -0
- package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
- package/dist/src/browser/web-ai/diagnostics.js +7 -0
- package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
- package/dist/src/browser/web-ai/errors.js +17 -0
- package/dist/src/browser/web-ai/errors.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-capabilities.js +46 -0
- package/dist/src/browser/web-ai/gemini-capabilities.js.map +1 -0
- package/dist/src/browser/web-ai/gemini-live.js +6 -0
- package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
- package/dist/src/browser/web-ai/gemini-model.js +41 -0
- package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
- package/dist/src/browser/web-ai/grok-capabilities.js +41 -0
- package/dist/src/browser/web-ai/grok-capabilities.js.map +1 -0
- package/dist/src/browser/web-ai/grok-live.js +5 -0
- package/dist/src/browser/web-ai/grok-live.js.map +1 -1
- package/dist/src/browser/web-ai/grok-model.js +38 -0
- package/dist/src/browser/web-ai/grok-model.js.map +1 -1
- package/dist/src/browser/web-ai/index.js +10 -0
- package/dist/src/browser/web-ai/index.js.map +1 -1
- package/dist/src/browser/web-ai/navigation-ready.js +123 -0
- package/dist/src/browser/web-ai/navigation-ready.js.map +1 -0
- package/dist/src/browser/web-ai/observation-bundle.js +26 -1
- package/dist/src/browser/web-ai/observation-bundle.js.map +1 -1
- package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
- package/dist/src/browser/web-ai/session-artifacts.js +156 -0
- package/dist/src/browser/web-ai/session-artifacts.js.map +1 -0
- package/dist/src/browser/web-ai/session-doctor.js +101 -0
- package/dist/src/browser/web-ai/session-doctor.js.map +1 -0
- package/dist/src/browser/web-ai/session-store.js +94 -17
- package/dist/src/browser/web-ai/session-store.js.map +1 -1
- package/dist/src/browser/web-ai/session.js +73 -0
- package/dist/src/browser/web-ai/session.js.map +1 -1
- package/dist/src/browser/web-ai/tab-inspect.js +143 -0
- package/dist/src/browser/web-ai/tab-inspect.js.map +1 -0
- package/dist/src/browser/web-ai/tab-lease-store.js +114 -4
- package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -1
- package/dist/src/browser/web-ai/tier-timeout.js +58 -0
- package/dist/src/browser/web-ai/tier-timeout.js.map +1 -0
- package/dist/src/browser/web-ai/vendor-editor-contract.js +6 -3
- package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
- package/dist/src/browser/web-ai/watcher-lock.js +125 -0
- package/dist/src/browser/web-ai/watcher-lock.js.map +1 -0
- package/dist/src/browser/web-ai/watcher.js +23 -4
- package/dist/src/browser/web-ai/watcher.js.map +1 -1
- package/dist/src/cli/handlers-workflows.js +14 -3
- package/dist/src/cli/handlers-workflows.js.map +1 -1
- package/dist/src/core/cli-detection.js +2 -3
- package/dist/src/core/cli-detection.js.map +1 -1
- package/dist/src/core/settings-merge.js +2 -2
- package/dist/src/core/settings-merge.js.map +1 -1
- package/dist/src/goal/heartbeat.js +13 -7
- package/dist/src/goal/heartbeat.js.map +1 -1
- package/dist/src/goal/pause-gate.js +22 -0
- package/dist/src/goal/pause-gate.js.map +1 -0
- package/dist/src/goal/store.js +5 -0
- package/dist/src/goal/store.js.map +1 -1
- package/dist/src/manager/lifecycle.js +2 -1
- package/dist/src/manager/lifecycle.js.map +1 -1
- package/dist/src/manager/preview-origin-proxy.js +36 -6
- package/dist/src/manager/preview-origin-proxy.js.map +1 -1
- package/dist/src/manager/proxy.js +25 -4
- package/dist/src/manager/proxy.js.map +1 -1
- package/dist/src/manager/registry.js +36 -3
- package/dist/src/manager/registry.js.map +1 -1
- package/dist/src/manager/routes/runtime-monitor.js +2 -0
- package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
- package/dist/src/manager/routes/telegram-hub.js +120 -0
- package/dist/src/manager/routes/telegram-hub.js.map +1 -0
- package/dist/src/manager/server.js +4 -0
- package/dist/src/manager/server.js.map +1 -1
- package/dist/src/manager/telegram-hub/hub-bot.js +409 -0
- package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -0
- package/dist/src/manager/telegram-hub/routing-store.js +24 -0
- package/dist/src/manager/telegram-hub/routing-store.js.map +1 -0
- package/dist/src/manager/telegram-hub/types.js +5 -0
- package/dist/src/manager/telegram-hub/types.js.map +1 -0
- package/dist/src/messaging/thread-target.js +21 -0
- package/dist/src/messaging/thread-target.js.map +1 -0
- package/dist/src/orchestrator/gateway.js +10 -7
- package/dist/src/orchestrator/gateway.js.map +1 -1
- package/dist/src/orchestrator/pipeline.js +19 -0
- package/dist/src/orchestrator/pipeline.js.map +1 -1
- package/dist/src/orchestrator/worker-registry.js.map +1 -1
- package/dist/src/routes/command.js +58 -2
- package/dist/src/routes/command.js.map +1 -1
- package/dist/src/routes/goal.js +6 -3
- package/dist/src/routes/goal.js.map +1 -1
- package/dist/src/routes/messaging.js +7 -2
- package/dist/src/routes/messaging.js.map +1 -1
- package/dist/src/routes/orchestrate.js +2 -0
- package/dist/src/routes/orchestrate.js.map +1 -1
- package/dist/src/telegram/bot.js +59 -4
- package/dist/src/telegram/bot.js.map +1 -1
- package/dist/src/telegram/forwarder.js +4 -1
- package/dist/src/telegram/forwarder.js.map +1 -1
- package/dist/src/telegram/hub-callback.js +21 -0
- package/dist/src/telegram/hub-callback.js.map +1 -0
- package/dist/src/telegram/rich-message.js +20 -0
- package/dist/src/telegram/rich-message.js.map +1 -0
- package/dist/src/telegram/telegram-file.js +4 -3
- package/dist/src/telegram/telegram-file.js.map +1 -1
- package/dist/src/workflows/status.js +14 -4
- package/dist/src/workflows/status.js.map +1 -1
- package/package.json +5 -5
- package/public/dist/assets/{Agent-wJtedbz4.js → Agent-Ci12HWhE.js} +1 -1
- package/public/dist/assets/{Heartbeat-CjgQ-0p8.js → Heartbeat-D-Rfp094.js} +1 -1
- package/public/dist/assets/{Memory-6o-wyhAT.js → Memory-VH4ZJCMW.js} +1 -1
- package/public/dist/assets/ModelProvider-_tUCghOF.js +1 -0
- package/public/dist/assets/TelegramHub-CuJoPPib.js +1 -0
- package/public/dist/assets/{agent-meta-g8UDRdWA.js → agent-meta-DqBTGRRQ.js} +1 -1
- package/public/dist/assets/{app-CLrfEHAk.js → app-DaORcAyD.js} +4 -4
- package/public/dist/assets/bgtask-badge-B3HLOZae.js +1 -0
- package/public/dist/assets/{bgtask-badge-xWbw-l-0.js → bgtask-badge-BtUXEe1T.js} +1 -1
- package/public/dist/assets/constants-DkJ3E63Y.js +1 -0
- package/public/dist/assets/{employees-C5GPj3d3.js → employees-CZSyvJbx.js} +1 -1
- package/public/dist/assets/manager-D3waO_XX.css +1 -0
- package/public/dist/assets/manager-DB5qTw1A.js +13 -0
- package/public/dist/assets/memory-BEruUlfu.js +1 -0
- package/public/dist/assets/{memory-CcnjBuo-.js → memory-cWI_Htbn.js} +1 -1
- package/public/dist/assets/message-history-DU1V9ZAW.js +142 -0
- package/public/dist/assets/message-history-tjkyOp_K.js +1 -0
- package/public/dist/assets/{render-C2g_qvCg.js → render-Bp8eyqCf.js} +1 -1
- package/public/dist/assets/settings-B-GgyJZI.js +1 -0
- package/public/dist/assets/{settings-DxClXVD0.js → settings-DLkP7qRV.js} +1 -1
- package/public/dist/assets/{settings-core-CSUV4-QG.js → settings-core-B5XRRNcX.js} +1 -1
- package/public/dist/assets/settings-core-Cw1av-Ox.js +1 -0
- package/public/dist/assets/{sidebar-CJz_SnMW.js → sidebar-CsogFOse.js} +3 -3
- package/public/dist/assets/skills-CLcoop6W.js +1 -0
- package/public/dist/assets/{skills-PKg2h1N4.js → skills-Dmf4v9rj.js} +1 -1
- package/public/dist/assets/slash-commands-DY6-hzq6.js +1 -0
- package/public/dist/assets/{slash-commands-FMOOfedZ.js → slash-commands-vcf7FuPD.js} +1 -1
- package/public/dist/assets/{trace-drawer-BoU1ucw7.js → trace-drawer-DuQQ0SNq.js} +1 -1
- package/public/dist/assets/{ui-BX-IfLze.js → ui-BKYuBdZE.js} +1 -1
- package/public/dist/assets/ui-CqlGwgUo.js +1 -0
- package/public/dist/index.html +1 -1
- package/public/dist/manager/index.html +2 -2
- package/public/js/constants.ts +2 -3
- package/public/js/features/process-block.ts +61 -9
- package/public/manager/src/code/code-composer.css +1 -0
- package/public/manager/src/code/code.css +7 -2
- package/public/manager/src/dashboard-settings/DashboardSettingsSidebar.tsx +6 -2
- package/public/manager/src/dashboard-settings/DashboardSettingsWorkspace.tsx +91 -2
- package/public/manager/src/goal-status/GoalPabcdStatusPanel.tsx +9 -1
- package/public/manager/src/goal-status/goal-pabcd-status-client.ts +9 -0
- package/public/manager/src/settings/SettingsShell.tsx +1 -0
- package/public/manager/src/settings/SettingsSidebar.tsx +1 -0
- package/public/manager/src/settings/pages/TelegramHub.tsx +179 -0
- package/public/manager/src/settings/pages/components/PerCliRow.tsx +23 -13
- package/public/manager/src/settings/pages/components/agent/agent-meta.ts +3 -1
- package/public/manager/src/settings/types.ts +1 -0
- package/public/manager/src/settings-shell.css +11 -0
- package/public/sw.js +1 -1
- package/scripts/bundle-sidecar.sh +6 -1
- package/public/dist/assets/ModelProvider-CNu6WOjM.js +0 -1
- package/public/dist/assets/bgtask-badge-4OjtCvDq.js +0 -1
- package/public/dist/assets/constants-CCiCctGV.js +0 -1
- package/public/dist/assets/manager-Ceg2x8D0.js +0 -13
- package/public/dist/assets/manager-CwAlpgV7.css +0 -1
- package/public/dist/assets/memory-B1beDKbo.js +0 -1
- package/public/dist/assets/message-history-BSWJwi__.js +0 -142
- package/public/dist/assets/message-history-CzaziSe8.js +0 -1
- package/public/dist/assets/settings-Dst1mUjn.js +0 -1
- package/public/dist/assets/settings-core-BW5mtFPE.js +0 -1
- package/public/dist/assets/skills-B2io6S_4.js +0 -1
- package/public/dist/assets/slash-commands-D1IS00Eg.js +0 -1
- package/public/dist/assets/ui-C-al0etg.js +0 -1
- /package/public/dist/assets/{TerminalPanel-B7WRXPsE.js → TerminalPanel-DSCJeGjp.js} +0 -0
|
@@ -0,0 +1,409 @@
|
|
|
1
|
+
// Dashboard-owned Telegram hub bot (P2). One bot token bound to one Telegram
|
|
2
|
+
// hub chat; each topic/thread (message_thread_id) routes to its mapped instance
|
|
3
|
+
// and replies relay back into the topic. The hub chat may be a forum supergroup
|
|
4
|
+
// or a bot private chat with topics enabled. Includes the GPT Pro review fixes (doc 05):
|
|
5
|
+
// chatId-required start guard, 409 retry-state fix, getWebhookInfo+await
|
|
6
|
+
// deleteWebhook, secure-by-default routing (unmapped topics refused), and a
|
|
7
|
+
// timeout on the hub->instance forward.
|
|
8
|
+
import { Bot } from 'grammy';
|
|
9
|
+
import { getHubConfig, resolveRoute, upsertRoute, removeRoute } from './routing-store.js';
|
|
10
|
+
import { DASHBOARD_DEFAULT_PORT, MANAGED_INSTANCE_PORT_FROM, MANAGED_INSTANCE_PORT_TO } from '../constants.js';
|
|
11
|
+
import { stripUndefined } from '../../core/strip-undefined.js';
|
|
12
|
+
let hubBot = null;
|
|
13
|
+
let hubToken = null;
|
|
14
|
+
let hubState = 'stopped';
|
|
15
|
+
let hubError = null;
|
|
16
|
+
let hubChatId = null;
|
|
17
|
+
let hubLastUpdate = null;
|
|
18
|
+
let hubLastIgnored = null;
|
|
19
|
+
let hubLastCommand = null;
|
|
20
|
+
let retries = 0;
|
|
21
|
+
const MAX_RETRIES = 5;
|
|
22
|
+
const FORWARD_TIMEOUT_MS = 15_000;
|
|
23
|
+
const HUB_COMMANDS = new Set(['setthread', 'threads', 'hubhelp']); // P3 fills the handler bodies
|
|
24
|
+
const TRACE_TEXT_LIMIT = 80;
|
|
25
|
+
const TOPIC_TYPING_REFRESH_MS = 4_000;
|
|
26
|
+
const TOPIC_TYPING_TIMEOUT_MS = 5 * 60_000;
|
|
27
|
+
const topicTypingTimers = new Map();
|
|
28
|
+
/** Map a raw message_thread_id to a route key. General topic (id<=1) → '1'. Exported for tests. */
|
|
29
|
+
export function threadKey(thread) {
|
|
30
|
+
return thread && thread > 1 ? String(thread) : '1';
|
|
31
|
+
}
|
|
32
|
+
/** Whether startHubBot would actually start: enabled + token + bound chatId all present (GPT Pro B1). Exported for tests. */
|
|
33
|
+
export function canStartHub(cfg) {
|
|
34
|
+
return cfg.enabled === true && Boolean(cfg.token) && Boolean(cfg.chatId);
|
|
35
|
+
}
|
|
36
|
+
export function canMutateHubRoute(chatType, isGroupAdmin) {
|
|
37
|
+
return chatType === 'private' || isGroupAdmin;
|
|
38
|
+
}
|
|
39
|
+
export function tracePrefix(text) {
|
|
40
|
+
return text.replace(/\s+/g, ' ').trim().slice(0, TRACE_TEXT_LIMIT);
|
|
41
|
+
}
|
|
42
|
+
function topicTypingKey(chatId, threadId) {
|
|
43
|
+
return `${chatId}:${threadId}`;
|
|
44
|
+
}
|
|
45
|
+
function threadOptions(threadId) {
|
|
46
|
+
const message_thread_id = Number(threadId) > 1 ? Number(threadId) : undefined;
|
|
47
|
+
return stripUndefined({ message_thread_id });
|
|
48
|
+
}
|
|
49
|
+
function stopTopicTyping(chatId, threadId) {
|
|
50
|
+
const key = topicTypingKey(chatId, threadId);
|
|
51
|
+
const timers = topicTypingTimers.get(key);
|
|
52
|
+
if (!timers)
|
|
53
|
+
return;
|
|
54
|
+
clearInterval(timers.interval);
|
|
55
|
+
clearTimeout(timers.timeout);
|
|
56
|
+
topicTypingTimers.delete(key);
|
|
57
|
+
}
|
|
58
|
+
function stopAllTopicTyping() {
|
|
59
|
+
for (const timers of topicTypingTimers.values()) {
|
|
60
|
+
clearInterval(timers.interval);
|
|
61
|
+
clearTimeout(timers.timeout);
|
|
62
|
+
}
|
|
63
|
+
topicTypingTimers.clear();
|
|
64
|
+
}
|
|
65
|
+
function startTopicTyping(chatId, threadId) {
|
|
66
|
+
stopTopicTyping(chatId, threadId);
|
|
67
|
+
const sendTyping = () => {
|
|
68
|
+
hubBot?.api.sendChatAction(chatId, 'typing', threadOptions(threadId)).catch(() => { });
|
|
69
|
+
};
|
|
70
|
+
sendTyping();
|
|
71
|
+
const key = topicTypingKey(chatId, threadId);
|
|
72
|
+
const interval = setInterval(sendTyping, TOPIC_TYPING_REFRESH_MS);
|
|
73
|
+
const timeout = setTimeout(() => stopTopicTyping(chatId, threadId), TOPIC_TYPING_TIMEOUT_MS);
|
|
74
|
+
topicTypingTimers.set(key, { interval, timeout });
|
|
75
|
+
}
|
|
76
|
+
export const __topicTypingTest = {
|
|
77
|
+
start: startTopicTyping,
|
|
78
|
+
stop: stopTopicTyping,
|
|
79
|
+
clearAll: stopAllTopicTyping,
|
|
80
|
+
count: () => topicTypingTimers.size,
|
|
81
|
+
};
|
|
82
|
+
function chatIdSettingValue(chatId) {
|
|
83
|
+
const numeric = Number(chatId);
|
|
84
|
+
return Number.isSafeInteger(numeric) ? numeric : chatId;
|
|
85
|
+
}
|
|
86
|
+
function readAllowedChatIds(settingsValue) {
|
|
87
|
+
const telegram = settingsValue && typeof settingsValue === 'object'
|
|
88
|
+
? settingsValue['telegram']
|
|
89
|
+
: undefined;
|
|
90
|
+
const allowed = telegram && typeof telegram === 'object'
|
|
91
|
+
? telegram['allowedChatIds']
|
|
92
|
+
: undefined;
|
|
93
|
+
return Array.isArray(allowed) ? allowed.filter(v => typeof v === 'string' || typeof v === 'number') : [];
|
|
94
|
+
}
|
|
95
|
+
function currentHubCallbackUrl() {
|
|
96
|
+
const port = process.env["DASHBOARD_PORT"] || DASHBOARD_DEFAULT_PORT;
|
|
97
|
+
return `http://127.0.0.1:${port}`;
|
|
98
|
+
}
|
|
99
|
+
export function buildLocalFirstSettingsPatch(chatId, currentSettings = {}, hubCallbackUrl = currentHubCallbackUrl()) {
|
|
100
|
+
const allowed = readAllowedChatIds(currentSettings);
|
|
101
|
+
const chatValue = chatIdSettingValue(chatId);
|
|
102
|
+
const hasChat = allowed.some(v => String(v) === String(chatValue));
|
|
103
|
+
return {
|
|
104
|
+
telegram: {
|
|
105
|
+
enabled: true,
|
|
106
|
+
allowedChatIds: hasChat ? allowed : [...allowed, chatValue],
|
|
107
|
+
forwardAll: true,
|
|
108
|
+
mentionOnly: true,
|
|
109
|
+
},
|
|
110
|
+
telegramHub: {
|
|
111
|
+
mode: 'standalone',
|
|
112
|
+
hubCallbackUrl,
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
export const buildHubMemberSettingsPatch = buildLocalFirstSettingsPatch;
|
|
117
|
+
export async function ensureTargetHubMember(port, chatId, fetchImpl = fetch) {
|
|
118
|
+
const base = `http://127.0.0.1:${port}`;
|
|
119
|
+
let currentSettings = {};
|
|
120
|
+
try {
|
|
121
|
+
const getRes = await fetchImpl(`${base}/api/settings`, { signal: AbortSignal.timeout(2_000) });
|
|
122
|
+
currentSettings = await getRes.json().catch(() => ({}));
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
currentSettings = {};
|
|
126
|
+
}
|
|
127
|
+
try {
|
|
128
|
+
const putRes = await fetchImpl(`${base}/api/settings`, {
|
|
129
|
+
method: 'PUT',
|
|
130
|
+
headers: { 'content-type': 'application/json' },
|
|
131
|
+
body: JSON.stringify(buildLocalFirstSettingsPatch(chatId, currentSettings)),
|
|
132
|
+
signal: AbortSignal.timeout(3_000),
|
|
133
|
+
});
|
|
134
|
+
if (!putRes.ok)
|
|
135
|
+
return { ok: false, error: `settings PUT ${putRes.status}` };
|
|
136
|
+
return { ok: true };
|
|
137
|
+
}
|
|
138
|
+
catch (e) {
|
|
139
|
+
return { ok: false, error: e.message };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
export function getHubBotStatus() {
|
|
143
|
+
return stripUndefined({
|
|
144
|
+
state: hubState,
|
|
145
|
+
chatId: hubChatId || undefined,
|
|
146
|
+
error: hubError || undefined,
|
|
147
|
+
lastUpdate: hubLastUpdate || undefined,
|
|
148
|
+
lastIgnored: hubLastIgnored || undefined,
|
|
149
|
+
lastCommand: hubLastCommand || undefined,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
export async function reconcileHubBotWithConfig() {
|
|
153
|
+
const cfg = getHubConfig();
|
|
154
|
+
if (!canStartHub(cfg)) {
|
|
155
|
+
if (hubState !== 'stopped')
|
|
156
|
+
await stopHubBot();
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (!hubBot || hubToken !== cfg.token || hubChatId !== cfg.chatId)
|
|
160
|
+
await startHubBot();
|
|
161
|
+
}
|
|
162
|
+
async function forwardToInstance(port, prompt, chatId, threadId, peerKind, overrides) {
|
|
163
|
+
const target = { channel: 'telegram', targetKind: 'channel', peerKind, targetId: chatId, threadId };
|
|
164
|
+
try {
|
|
165
|
+
const res = await fetch(`http://127.0.0.1:${port}/api/message`, {
|
|
166
|
+
method: 'POST',
|
|
167
|
+
headers: { 'content-type': 'application/json' },
|
|
168
|
+
body: JSON.stringify(stripUndefined({ prompt, target, overrides })),
|
|
169
|
+
signal: AbortSignal.timeout(FORWARD_TIMEOUT_MS),
|
|
170
|
+
});
|
|
171
|
+
const j = (await res.json().catch(() => ({})));
|
|
172
|
+
if (!res.ok || j['ok'] === false) {
|
|
173
|
+
const reason = String(j['error'] || j['reason'] || `HTTP ${res.status}`);
|
|
174
|
+
return { syncText: `⚠️ 인스턴스 ${port} 요청 실패: ${reason}` };
|
|
175
|
+
}
|
|
176
|
+
// Slash commands return text synchronously; prompts reply later via /outbound.
|
|
177
|
+
if (j['command'] && typeof j['text'] === 'string' && j['text'].trim()) {
|
|
178
|
+
return { syncText: j['text'] };
|
|
179
|
+
}
|
|
180
|
+
return {};
|
|
181
|
+
}
|
|
182
|
+
catch (e) {
|
|
183
|
+
console.error(`[tg:hub] forward to ${port} failed:`, e.message);
|
|
184
|
+
return { syncText: `⚠️ 인스턴스 ${port} 응답 실패: ${e.message}` };
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// P3: real hub-command handlers over the P1 routing-store. Mutating /setthread
|
|
188
|
+
// requires the sender to be a Telegram group admin/creator (GPT Pro auth fix, doc 05);
|
|
189
|
+
// read-only forms (bare /setthread, /threads, /hubhelp) need no authorization.
|
|
190
|
+
export async function handleHubCommand(name, args, chatId, threadId, isAdmin, ensureHubMember = async () => ({ ok: true })) {
|
|
191
|
+
if (name === 'setthread') {
|
|
192
|
+
const arg = (args[0] || '').toLowerCase();
|
|
193
|
+
if (!arg) { // bare: show current binding (read-only)
|
|
194
|
+
const r = resolveRoute(chatId, threadId);
|
|
195
|
+
return r ? `이 토픽 → 인스턴스 ${r.port}${r.label ? ` (${r.label})` : ''}`
|
|
196
|
+
: '이 토픽은 미연결입니다. /setthread <port> 로 연결하세요.';
|
|
197
|
+
}
|
|
198
|
+
if (!(await isAdmin()))
|
|
199
|
+
return '권한이 없습니다 — 그룹 관리자 또는 허용된 개인 채팅만 /setthread 로 변경할 수 있습니다.';
|
|
200
|
+
if (arg === 'off') {
|
|
201
|
+
removeRoute(chatId, threadId);
|
|
202
|
+
return '이 토픽 라우팅을 해제했습니다.';
|
|
203
|
+
}
|
|
204
|
+
const port = Number(arg);
|
|
205
|
+
if (!Number.isInteger(port) || port < MANAGED_INSTANCE_PORT_FROM || port > MANAGED_INSTANCE_PORT_TO)
|
|
206
|
+
return `포트는 ${MANAGED_INSTANCE_PORT_FROM}–${MANAGED_INSTANCE_PORT_TO} 범위여야 합니다.`;
|
|
207
|
+
const ensured = await ensureHubMember(port, chatId);
|
|
208
|
+
if (!ensured.ok)
|
|
209
|
+
return `⚠️ 인스턴스 ${port} hub-member 자동 설정 실패: ${ensured.error}\n라우팅은 활성화하지 않았습니다.`;
|
|
210
|
+
upsertRoute({ chatId, threadId, port, enabled: true });
|
|
211
|
+
return `✅ 이 토픽 → 인스턴스 ${port} 연결됨.`;
|
|
212
|
+
}
|
|
213
|
+
if (name === 'threads') {
|
|
214
|
+
const mine = getHubConfig().routes.filter(r => r.chatId === chatId);
|
|
215
|
+
return mine.length
|
|
216
|
+
? `이 그룹의 라우트:\n${mine.map(r => `• thread ${r.threadId} → ${r.port}${r.enabled ? '' : ' (off)'}`).join('\n')}`
|
|
217
|
+
: '연결된 토픽이 없습니다.';
|
|
218
|
+
}
|
|
219
|
+
if (name === 'hubhelp')
|
|
220
|
+
return '/setthread <port> · /setthread off · /threads';
|
|
221
|
+
return '알 수 없는 허브 명령입니다.';
|
|
222
|
+
}
|
|
223
|
+
export function createHubBot(token) {
|
|
224
|
+
const bot = new Bot(token);
|
|
225
|
+
bot.catch((err) => console.error('[tg:hub]', err.message || err));
|
|
226
|
+
bot.on('message:text', async (ctx) => {
|
|
227
|
+
if (!ctx.chat || !ctx.message)
|
|
228
|
+
return;
|
|
229
|
+
const cfg = getHubConfig();
|
|
230
|
+
const chatId = String(ctx.chat.id);
|
|
231
|
+
const threadId = threadKey(ctx.message.message_thread_id);
|
|
232
|
+
const text = ctx.message.text.trim();
|
|
233
|
+
hubLastUpdate = stripUndefined({
|
|
234
|
+
at: new Date().toISOString(),
|
|
235
|
+
chatId,
|
|
236
|
+
chatType: ctx.chat.type,
|
|
237
|
+
threadId,
|
|
238
|
+
textPrefix: tracePrefix(text),
|
|
239
|
+
});
|
|
240
|
+
if (!cfg.chatId || chatId !== cfg.chatId) {
|
|
241
|
+
hubLastIgnored = stripUndefined({
|
|
242
|
+
at: new Date().toISOString(),
|
|
243
|
+
chatId,
|
|
244
|
+
reason: cfg.chatId ? `chat mismatch; expected ${cfg.chatId}` : 'hub chatId is not configured',
|
|
245
|
+
});
|
|
246
|
+
return; // only the bound hub chat
|
|
247
|
+
}
|
|
248
|
+
// (a) hub-level slash interception — NO mention-gate on the hub bot (topic binding = auth).
|
|
249
|
+
if (text.startsWith('/')) {
|
|
250
|
+
const name = text.slice(1).split(/\s+/)[0].split('@')[0].toLowerCase();
|
|
251
|
+
if (HUB_COMMANDS.has(name)) {
|
|
252
|
+
const args = text.slice(1).split(/\s+/).slice(1);
|
|
253
|
+
const isAdmin = async () => {
|
|
254
|
+
try {
|
|
255
|
+
const uid = ctx.from?.id;
|
|
256
|
+
if (!uid)
|
|
257
|
+
return canMutateHubRoute(ctx.chat.type, false);
|
|
258
|
+
const m = await ctx.getChatMember(uid);
|
|
259
|
+
return canMutateHubRoute(ctx.chat.type, m.status === 'creator' || m.status === 'administrator');
|
|
260
|
+
}
|
|
261
|
+
catch {
|
|
262
|
+
return canMutateHubRoute(ctx.chat.type, false);
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
const result = await handleHubCommand(name, args, chatId, threadId, isAdmin, ensureTargetHubMember);
|
|
266
|
+
hubLastCommand = stripUndefined({
|
|
267
|
+
at: new Date().toISOString(),
|
|
268
|
+
name,
|
|
269
|
+
chatId,
|
|
270
|
+
threadId,
|
|
271
|
+
resultPrefix: tracePrefix(result),
|
|
272
|
+
});
|
|
273
|
+
await ctx.reply(result).catch((e) => {
|
|
274
|
+
hubLastIgnored = stripUndefined({
|
|
275
|
+
at: new Date().toISOString(),
|
|
276
|
+
chatId,
|
|
277
|
+
threadId,
|
|
278
|
+
reason: `command reply failed: ${e.message}`,
|
|
279
|
+
});
|
|
280
|
+
console.error('[tg:hub] command reply failed:', e.message);
|
|
281
|
+
}); // grammY auto-threads
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
// (b) route to the mapped instance — secure-by-default: refuse unmapped topics
|
|
286
|
+
// (GPT Pro B2: no silent defaultPort auto-routing).
|
|
287
|
+
const route = resolveRoute(chatId, threadId);
|
|
288
|
+
if (!route) {
|
|
289
|
+
await ctx.reply('이 토픽은 인스턴스에 연결되지 않았습니다. /setthread <port> 로 연결하세요.');
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
startTopicTyping(chatId, threadId);
|
|
293
|
+
const overrides = (route.model || route.systemPrompt)
|
|
294
|
+
? stripUndefined({ model: route.model, systemPrompt: route.systemPrompt })
|
|
295
|
+
: undefined;
|
|
296
|
+
const peerKind = ctx.chat.type === 'private' ? 'direct' : 'group';
|
|
297
|
+
const { syncText } = await forwardToInstance(route.port, text, chatId, threadId, peerKind, overrides);
|
|
298
|
+
if (syncText) {
|
|
299
|
+
stopTopicTyping(chatId, threadId);
|
|
300
|
+
await ctx.reply(syncText);
|
|
301
|
+
} // slash sync result; prompt result arrives via /outbound
|
|
302
|
+
});
|
|
303
|
+
return bot;
|
|
304
|
+
}
|
|
305
|
+
/** Send a relayed reply into a topic (used by POST /api/dashboard/telegram-hub/outbound). */
|
|
306
|
+
export async function sendToTopic(chatId, threadId, payload) {
|
|
307
|
+
stopTopicTyping(chatId, threadId);
|
|
308
|
+
if (!hubBot)
|
|
309
|
+
return { ok: false, error: 'hub bot not running' };
|
|
310
|
+
const message_thread_id = Number(threadId) > 1 ? Number(threadId) : undefined;
|
|
311
|
+
if (payload.type === 'text') {
|
|
312
|
+
const { markdownToTelegramHtml, chunkTelegramMessage } = await import('../../telegram/forwarder.js');
|
|
313
|
+
const { sendRichOrHtml } = await import('../../telegram/rich-message.js'); // P4: rich when available, else HTML
|
|
314
|
+
for (const chunk of chunkTelegramMessage(markdownToTelegramHtml(payload.text || ''))) {
|
|
315
|
+
await sendRichOrHtml(hubBot, chatId, chunk, stripUndefined({ message_thread_id }))
|
|
316
|
+
.catch(() => hubBot.api.sendMessage(chatId, chunk.replace(/<[^>]+>/g, ''), stripUndefined({ message_thread_id })));
|
|
317
|
+
}
|
|
318
|
+
return { ok: true };
|
|
319
|
+
}
|
|
320
|
+
const { sendTelegramFile } = await import('../../telegram/telegram-file.js');
|
|
321
|
+
const r = await sendTelegramFile(hubBot, chatId, payload.filePath, payload.type, stripUndefined({ caption: payload.caption, threadId: message_thread_id }));
|
|
322
|
+
return stripUndefined({ ok: r.ok, error: r.error });
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Start (or restart) the hub bot from the current registry config. Idempotent.
|
|
326
|
+
* GPT Pro fixes: requires bound chatId; checks getWebhookInfo before deleteWebhook;
|
|
327
|
+
* marks running state only AFTER onStart so a 409 actually retries.
|
|
328
|
+
*/
|
|
329
|
+
export async function startHubBot() {
|
|
330
|
+
const cfg = getHubConfig();
|
|
331
|
+
if (!canStartHub(cfg)) {
|
|
332
|
+
await stopHubBot();
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (hubBot && hubToken === cfg.token) {
|
|
336
|
+
hubState = 'polling';
|
|
337
|
+
hubChatId = cfg.chatId;
|
|
338
|
+
hubError = null;
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
await stopHubBot();
|
|
342
|
+
const bot = createHubBot(cfg.token);
|
|
343
|
+
hubState = 'starting';
|
|
344
|
+
hubChatId = cfg.chatId;
|
|
345
|
+
hubError = null;
|
|
346
|
+
// deleteWebhook safety: only delete if a webhook is actually set (avoid blind drop).
|
|
347
|
+
try {
|
|
348
|
+
const info = await bot.api.getWebhookInfo();
|
|
349
|
+
if (info.url)
|
|
350
|
+
await bot.api.deleteWebhook({ drop_pending_updates: true });
|
|
351
|
+
}
|
|
352
|
+
catch (e) {
|
|
353
|
+
console.error('[tg:hub] getWebhookInfo failed:', e.message);
|
|
354
|
+
}
|
|
355
|
+
void bot.start({
|
|
356
|
+
drop_pending_updates: true,
|
|
357
|
+
onStart: (info) => {
|
|
358
|
+
hubBot = bot;
|
|
359
|
+
hubToken = cfg.token;
|
|
360
|
+
retries = 0; // mark running ONLY after polling starts
|
|
361
|
+
hubState = 'polling';
|
|
362
|
+
hubError = null;
|
|
363
|
+
console.log(`[tg:hub] @${info.username} polling chat=${cfg.chatId}`);
|
|
364
|
+
// best-effort forum check (non-blocking); private bot-topic chats are valid
|
|
365
|
+
// hub targets but are not forum supergroups.
|
|
366
|
+
if (!cfg.chatId.startsWith('-100'))
|
|
367
|
+
return;
|
|
368
|
+
bot.api.getChat(cfg.chatId).then((c) => {
|
|
369
|
+
if (c.is_forum !== true)
|
|
370
|
+
console.warn(`[tg:hub] WARNING: bound chat ${cfg.chatId} is not a forum (is_forum != true)`);
|
|
371
|
+
}).catch(() => { });
|
|
372
|
+
},
|
|
373
|
+
}).catch((err) => {
|
|
374
|
+
if (hubBot === bot) {
|
|
375
|
+
hubBot = null;
|
|
376
|
+
hubToken = null;
|
|
377
|
+
} // clear so retry re-runs
|
|
378
|
+
const e = err;
|
|
379
|
+
const is409 = e?.error_code === 409 || String(e?.message).includes('409');
|
|
380
|
+
if (is409 && ++retries <= MAX_RETRIES) {
|
|
381
|
+
hubState = 'starting';
|
|
382
|
+
hubError = `polling conflict; retry ${retries}/${MAX_RETRIES}`;
|
|
383
|
+
setTimeout(() => { void startHubBot(); }, Math.min(5000 * 2 ** (retries - 1), 30_000));
|
|
384
|
+
}
|
|
385
|
+
else {
|
|
386
|
+
hubState = 'error';
|
|
387
|
+
hubError = e?.message || String(err);
|
|
388
|
+
console.error('[tg:hub:fatal]', err);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
export async function stopHubBot() {
|
|
393
|
+
stopAllTopicTyping();
|
|
394
|
+
if (hubBot) {
|
|
395
|
+
const b = hubBot;
|
|
396
|
+
hubBot = null;
|
|
397
|
+
hubToken = null;
|
|
398
|
+
hubState = 'stopped';
|
|
399
|
+
hubChatId = null;
|
|
400
|
+
hubError = null;
|
|
401
|
+
await b.stop().catch(() => { });
|
|
402
|
+
}
|
|
403
|
+
else {
|
|
404
|
+
hubState = 'stopped';
|
|
405
|
+
hubChatId = null;
|
|
406
|
+
hubError = null;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
//# sourceMappingURL=hub-bot.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub-bot.js","sourceRoot":"","sources":["../../../../src/manager/telegram-hub/hub-bot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
// Telegram hub routing store (P1) — thin CRUD over the Dashboard registry's
|
|
2
|
+
// telegramHub config. P2 (hub bot) consumes getHubConfig/resolveRoute.
|
|
3
|
+
import { loadDashboardRegistry, patchDashboardRegistry } from '../registry.js';
|
|
4
|
+
export function getHubConfig() {
|
|
5
|
+
return loadDashboardRegistry().registry.telegramHub;
|
|
6
|
+
}
|
|
7
|
+
export function setHubConfig(patch) {
|
|
8
|
+
return patchDashboardRegistry({ telegramHub: patch }).registry.telegramHub;
|
|
9
|
+
}
|
|
10
|
+
export function upsertRoute(route) {
|
|
11
|
+
const cfg = getHubConfig();
|
|
12
|
+
const routes = cfg.routes.filter(r => !(r.chatId === route.chatId && r.threadId === route.threadId));
|
|
13
|
+
routes.push(route);
|
|
14
|
+
return setHubConfig({ routes });
|
|
15
|
+
}
|
|
16
|
+
export function removeRoute(chatId, threadId) {
|
|
17
|
+
const routes = getHubConfig().routes.filter(r => !(r.chatId === chatId && r.threadId === threadId));
|
|
18
|
+
return setHubConfig({ routes });
|
|
19
|
+
}
|
|
20
|
+
/** Active route for an inbound topic, or undefined (P2 refuses unmapped topics — no defaultPort auto-route). */
|
|
21
|
+
export function resolveRoute(chatId, threadId) {
|
|
22
|
+
return getHubConfig().routes.find(r => r.chatId === chatId && r.threadId === threadId && r.enabled);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=routing-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"routing-store.js","sourceRoot":"","sources":["../../../../src/manager/telegram-hub/routing-store.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,uEAAuE;AACvE,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AAG/E,MAAM,UAAU,YAAY;IACxB,OAAO,qBAAqB,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAiC;IAC1D,OAAO,sBAAsB,CAAC,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;AAC/E,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,KAAkB;IAC1C,MAAM,GAAG,GAAG,YAAY,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC;IACrG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACnB,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,QAAgB;IACxD,MAAM,MAAM,GAAG,YAAY,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC;IACpG,OAAO,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;AACpC,CAAC;AAED,gHAAgH;AAChH,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,QAAgB;IACzD,OAAO,YAAY,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC;AACxG,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/manager/telegram-hub/types.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,0EAA0E;AAC1E,iEAAiE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extract a numeric Telegram `message_thread_id` from a RemoteTarget.
|
|
3
|
+
*
|
|
4
|
+
* Returns the positive thread id for a real forum topic, or `undefined` for
|
|
5
|
+
* non-topic chats AND for the General topic (id = 1). Telegram sends to General
|
|
6
|
+
* "as usual" with no `message_thread_id`, so callers wrap the result in
|
|
7
|
+
* `stripUndefined(...)` and the wire payload is unchanged for non-forum chats.
|
|
8
|
+
*
|
|
9
|
+
* Used by the programmatic Telegram send paths (P0). Interactive `ctx.reply`
|
|
10
|
+
* already auto-injects `message_thread_id` from the incoming message, so it does
|
|
11
|
+
* not go through here.
|
|
12
|
+
*/
|
|
13
|
+
export function threadIdNumber(target) {
|
|
14
|
+
const raw = target?.threadId;
|
|
15
|
+
if (raw == null || raw === '')
|
|
16
|
+
return undefined;
|
|
17
|
+
const n = Number(raw);
|
|
18
|
+
// n > 1 (not n > 0): General topic id=1 must send without message_thread_id.
|
|
19
|
+
return Number.isInteger(n) && n > 1 ? n : undefined;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=thread-target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"thread-target.js","sourceRoot":"","sources":["../../../src/messaging/thread-target.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,cAAc,CAAC,MAAqB;IAChD,MAAM,GAAG,GAAG,MAAM,EAAE,QAAQ,CAAC;IAC7B,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,KAAK,EAAE;QAAE,OAAO,SAAS,CAAC;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,6EAA6E;IAC7E,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxD,CAAC"}
|
|
@@ -19,9 +19,11 @@ import { resolveOrcScope } from './scope.js';
|
|
|
19
19
|
// See devlog/_plan/260417_message_duplication/.
|
|
20
20
|
const DEDUP_WINDOW_MS = 5000;
|
|
21
21
|
const recentSubmissions = new Map();
|
|
22
|
-
|
|
22
|
+
/** Exported for unit tests (pure, stateless). */
|
|
23
|
+
export function dedupKey(origin, text, chatId, threadId) {
|
|
23
24
|
const normalized = text.trim().replace(/\s+/g, ' ');
|
|
24
|
-
|
|
25
|
+
// threadId included so identical text in different forum topics is not false-deduped.
|
|
26
|
+
return `${origin}:${chatId ?? ''}:${threadId ?? ''}:${normalized}`;
|
|
25
27
|
}
|
|
26
28
|
function gcRecentSubmissions(now) {
|
|
27
29
|
if (recentSubmissions.size < 32)
|
|
@@ -45,6 +47,7 @@ function runDetached(task, label, meta) {
|
|
|
45
47
|
target: meta.target,
|
|
46
48
|
chatId: meta.chatId,
|
|
47
49
|
requestId: meta.requestId,
|
|
50
|
+
replyViaTarget: meta.replyViaTarget,
|
|
48
51
|
error: true,
|
|
49
52
|
});
|
|
50
53
|
});
|
|
@@ -56,7 +59,7 @@ export function submitMessage(text, meta) {
|
|
|
56
59
|
// Dedup: same (origin, chatId, normalized text) within 5s → reject as duplicate
|
|
57
60
|
// and return the earlier requestId so the client can absorb it silently.
|
|
58
61
|
const now = Date.now();
|
|
59
|
-
const key = dedupKey(meta.origin, trimmed, meta.chatId);
|
|
62
|
+
const key = dedupKey(meta.origin, trimmed, meta.chatId, meta.target?.threadId);
|
|
60
63
|
const prior = recentSubmissions.get(key);
|
|
61
64
|
if (prior && now - prior.ts < DEDUP_WINDOW_MS) {
|
|
62
65
|
console.log(`[gateway:dedup] suppressed duplicate (${now - prior.ts}ms window) origin=${meta.origin}`);
|
|
@@ -74,7 +77,7 @@ export function submitMessage(text, meta) {
|
|
|
74
77
|
insertMessage.run('user', display, meta.origin, '', settings["workingDir"] || null, getActiveChatSession());
|
|
75
78
|
broadcast('new_message', { role: 'user', content: display, source: meta.origin });
|
|
76
79
|
if (!meta.skipOrchestrate) {
|
|
77
|
-
runDetached(orchestrateContinue({ origin: meta.origin, target: meta.target, chatId: meta.chatId, requestId, _skipInsert: true }), 'continue', { ...meta, requestId });
|
|
80
|
+
runDetached(orchestrateContinue({ origin: meta.origin, target: meta.target, chatId: meta.chatId, requestId, replyViaTarget: meta.replyViaTarget, _skipInsert: true }), 'continue', { ...meta, requestId });
|
|
78
81
|
}
|
|
79
82
|
return { action: 'started', noPendingContinue: true, requestId };
|
|
80
83
|
}
|
|
@@ -83,7 +86,7 @@ export function submitMessage(text, meta) {
|
|
|
83
86
|
insertMessage.run('user', display, meta.origin, '', settings["workingDir"] || null, getActiveChatSession());
|
|
84
87
|
broadcast('new_message', { role: 'user', content: display, source: meta.origin });
|
|
85
88
|
if (!meta.skipOrchestrate) {
|
|
86
|
-
runDetached(orchestrateReset({ origin: meta.origin, target: meta.target, chatId: meta.chatId, requestId, _skipInsert: true }), 'reset', { ...meta, requestId });
|
|
89
|
+
runDetached(orchestrateReset({ origin: meta.origin, target: meta.target, chatId: meta.chatId, requestId, replyViaTarget: meta.replyViaTarget, _skipInsert: true }), 'reset', { ...meta, requestId });
|
|
87
90
|
}
|
|
88
91
|
return { action: 'started', requestId };
|
|
89
92
|
}
|
|
@@ -95,14 +98,14 @@ export function submitMessage(text, meta) {
|
|
|
95
98
|
// starting immediately is safe and avoids the processQueue deadlock
|
|
96
99
|
// documented in devlog/_plan/260417_message_duplication/02_*.
|
|
97
100
|
if (isAgentBusy() || hasBlockingWorkers()) {
|
|
98
|
-
const queuedId = enqueueMessage(trimmed, meta.origin, stripUndefined({ target: meta.target, chatId: meta.chatId, requestId, scope }));
|
|
101
|
+
const queuedId = enqueueMessage(trimmed, meta.origin, stripUndefined({ target: meta.target, chatId: meta.chatId, requestId, scope, overrides: meta.overrides, replyViaTarget: meta.replyViaTarget }));
|
|
99
102
|
return { action: 'queued', pending: messageQueue.length, queued: true, requestId, queuedId };
|
|
100
103
|
}
|
|
101
104
|
// ── idle → start immediately ──
|
|
102
105
|
insertMessage.run('user', display, meta.origin, '', settings["workingDir"] || null, getActiveChatSession());
|
|
103
106
|
broadcast('new_message', { role: 'user', content: display, source: meta.origin });
|
|
104
107
|
if (!meta.skipOrchestrate) {
|
|
105
|
-
runDetached(orchestrate(trimmed, { origin: meta.origin, target: meta.target, chatId: meta.chatId, requestId, _skipInsert: true }), 'orchestrate', { ...meta, requestId });
|
|
108
|
+
runDetached(orchestrate(trimmed, stripUndefined({ origin: meta.origin, target: meta.target, chatId: meta.chatId, requestId, _skipInsert: true, overrides: meta.overrides, replyViaTarget: meta.replyViaTarget })), 'orchestrate', { ...meta, requestId });
|
|
106
109
|
}
|
|
107
110
|
return { action: 'started', requestId };
|
|
108
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/orchestrator/gateway.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,yEAAyE;AACzE,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACH,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAClD,gBAAgB,EAAE,aAAa,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkB7C,wBAAwB;AACxB,kDAAkD;AAClD,gEAAgE;AAChE,oFAAoF;AACpF,gDAAgD;AAChD,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA6C,CAAC;AAE/E,
|
|
1
|
+
{"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/orchestrator/gateway.ts"],"names":[],"mappings":"AAAA,uDAAuD;AACvD,yEAAyE;AACzE,4EAA4E;AAE5E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EACH,WAAW,EAAE,mBAAmB,EAAE,gBAAgB,EAClD,gBAAgB,EAAE,aAAa,GAClC,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAkB7C,wBAAwB;AACxB,kDAAkD;AAClD,gEAAgE;AAChE,oFAAoF;AACpF,gDAAgD;AAChD,MAAM,eAAe,GAAG,IAAI,CAAC;AAC7B,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAA6C,CAAC;AAE/E,iDAAiD;AACjD,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,MAAwB,EAAE,QAAiB;IAC9F,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpD,sFAAsF;IACtF,OAAO,GAAG,MAAM,IAAI,MAAM,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;AACvE,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAW;IACpC,IAAI,iBAAiB,CAAC,IAAI,GAAG,EAAE;QAAE,OAAO,CAAC,cAAc;IACvD,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,iBAAiB,EAAE,CAAC;QACrC,IAAI,GAAG,GAAG,CAAC,CAAC,EAAE,GAAG,eAAe,GAAG,CAAC;YAAE,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC;AACL,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,yBAAyB;IACrC,iBAAiB,CAAC,KAAK,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAChB,IAAsB,EACtB,KAAa,EACb,IAA8H;IAE9H,IAAI,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACxB,MAAM,GAAG,GAAI,GAAa,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC;QACnD,OAAO,CAAC,KAAK,CAAC,YAAY,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,SAAS,CAAC,kBAAkB,EAAE;YAC1B,IAAI,EAAE,uBAAuB,GAAG,EAAE;YAClC,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,KAAK,EAAE,IAAI;SACd,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,aAAa,CACzB,IAAY,EACZ,IAAkN;IAElN,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAE7D,gFAAgF;IAChF,yEAAyE;IACzE,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAK,IAAI,GAAG,GAAG,KAAK,CAAC,EAAE,GAAG,eAAe,EAAE,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,yCAAyC,GAAG,GAAG,KAAK,CAAC,EAAE,qBAAqB,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACvG,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,CAAC;IACnF,CAAC;IACD,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC;IAC5C,MAAM,SAAS,GAAG,UAAU,EAAE,CAAC;IAC/B,iBAAiB,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IAEnD,yCAAyC;IACzC,MAAM,KAAK,GAAG,eAAe,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC;IACxI,IAAI,QAAQ,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1D,IAAI,WAAW,EAAE;YAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACjE,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5G,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,WAAW,CACP,mBAAmB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EACzJ,UAAU,EACV,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CACzB,CAAC;QACN,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IACrE,CAAC;IAED,qBAAqB;IACrB,IAAI,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;QAC5G,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YACxB,WAAW,CACP,gBAAgB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,EACtJ,OAAO,EACP,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CACzB,CAAC;QACN,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;IAC5C,CAAC;IAED,4BAA4B;IAC5B,sEAAsE;IACtE,4EAA4E;IAC5E,6EAA6E;IAC7E,wEAAwE;IACxE,oEAAoE;IACpE,8DAA8D;IAC9D,IAAI,WAAW,EAAE,IAAI,kBAAkB,EAAE,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QACtM,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACjG,CAAC;IAED,iCAAiC;IACjC,aAAa,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAC5G,SAAS,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACxB,WAAW,CACP,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,EACrM,aAAa,EACb,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CACzB,CAAC;IACN,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC"}
|