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.
Files changed (240) hide show
  1. package/README.ja.md +13 -9
  2. package/README.ko.md +5 -5
  3. package/README.md +7 -6
  4. package/README.zh-CN.md +5 -5
  5. package/dist/bin/commands/goal.js +14 -1
  6. package/dist/bin/commands/goal.js.map +1 -1
  7. package/dist/src/agent/agy-bootstrap.js +104 -0
  8. package/dist/src/agent/agy-bootstrap.js.map +1 -0
  9. package/dist/src/agent/agy-capabilities.js +103 -0
  10. package/dist/src/agent/agy-capabilities.js.map +1 -0
  11. package/dist/src/agent/agy-transcript-watcher.js +11 -0
  12. package/dist/src/agent/agy-transcript-watcher.js.map +1 -1
  13. package/dist/src/agent/args.js +32 -13
  14. package/dist/src/agent/args.js.map +1 -1
  15. package/dist/src/agent/events/claude.js +8 -4
  16. package/dist/src/agent/events/claude.js.map +1 -1
  17. package/dist/src/agent/events/helpers.js +13 -0
  18. package/dist/src/agent/events/helpers.js.map +1 -1
  19. package/dist/src/agent/events/index.js +24 -4
  20. package/dist/src/agent/events/index.js.map +1 -1
  21. package/dist/src/agent/lifecycle-handler.js +25 -4
  22. package/dist/src/agent/lifecycle-handler.js.map +1 -1
  23. package/dist/src/agent/spawn/queue.js +11 -5
  24. package/dist/src/agent/spawn/queue.js.map +1 -1
  25. package/dist/src/agent/spawn.js +49 -13
  26. package/dist/src/agent/spawn.js.map +1 -1
  27. package/dist/src/browser/web-ai/ax-snapshot.js +131 -8
  28. package/dist/src/browser/web-ai/ax-snapshot.js.map +1 -1
  29. package/dist/src/browser/web-ai/candidate-reconcile.js +61 -0
  30. package/dist/src/browser/web-ai/candidate-reconcile.js.map +1 -0
  31. package/dist/src/browser/web-ai/capability-probe.js +92 -0
  32. package/dist/src/browser/web-ai/capability-probe.js.map +1 -0
  33. package/dist/src/browser/web-ai/chatgpt-archive.js +90 -0
  34. package/dist/src/browser/web-ai/chatgpt-archive.js.map +1 -0
  35. package/dist/src/browser/web-ai/chatgpt-attachments.js +70 -3
  36. package/dist/src/browser/web-ai/chatgpt-attachments.js.map +1 -1
  37. package/dist/src/browser/web-ai/chatgpt-composer.js +97 -11
  38. package/dist/src/browser/web-ai/chatgpt-composer.js.map +1 -1
  39. package/dist/src/browser/web-ai/chatgpt-deep-research-report.js +63 -0
  40. package/dist/src/browser/web-ai/chatgpt-deep-research-report.js.map +1 -0
  41. package/dist/src/browser/web-ai/chatgpt-deep-research.js +76 -13
  42. package/dist/src/browser/web-ai/chatgpt-deep-research.js.map +1 -1
  43. package/dist/src/browser/web-ai/chatgpt-files.js +328 -0
  44. package/dist/src/browser/web-ai/chatgpt-files.js.map +1 -0
  45. package/dist/src/browser/web-ai/chatgpt-images.js +281 -0
  46. package/dist/src/browser/web-ai/chatgpt-images.js.map +1 -0
  47. package/dist/src/browser/web-ai/chatgpt-model.js +35 -14
  48. package/dist/src/browser/web-ai/chatgpt-model.js.map +1 -1
  49. package/dist/src/browser/web-ai/chatgpt-multi-turn.js +28 -4
  50. package/dist/src/browser/web-ai/chatgpt-multi-turn.js.map +1 -1
  51. package/dist/src/browser/web-ai/chatgpt-project-sources.js +191 -0
  52. package/dist/src/browser/web-ai/chatgpt-project-sources.js.map +1 -0
  53. package/dist/src/browser/web-ai/chatgpt-response-dom.js +64 -0
  54. package/dist/src/browser/web-ai/chatgpt-response-dom.js.map +1 -0
  55. package/dist/src/browser/web-ai/chatgpt-response-observer.js +170 -0
  56. package/dist/src/browser/web-ai/chatgpt-response-observer.js.map +1 -0
  57. package/dist/src/browser/web-ai/chatgpt-response.js +99 -60
  58. package/dist/src/browser/web-ai/chatgpt-response.js.map +1 -1
  59. package/dist/src/browser/web-ai/chatgpt-tools.js +48 -1
  60. package/dist/src/browser/web-ai/chatgpt-tools.js.map +1 -1
  61. package/dist/src/browser/web-ai/chatgpt-upload-surface.js +202 -0
  62. package/dist/src/browser/web-ai/chatgpt-upload-surface.js.map +1 -0
  63. package/dist/src/browser/web-ai/chatgpt.js +93 -12
  64. package/dist/src/browser/web-ai/chatgpt.js.map +1 -1
  65. package/dist/src/browser/web-ai/code-artifact.js +32 -10
  66. package/dist/src/browser/web-ai/code-artifact.js.map +1 -1
  67. package/dist/src/browser/web-ai/code-mode.js +40 -4
  68. package/dist/src/browser/web-ai/code-mode.js.map +1 -1
  69. package/dist/src/browser/web-ai/contract-audit.js +7 -22
  70. package/dist/src/browser/web-ai/contract-audit.js.map +1 -1
  71. package/dist/src/browser/web-ai/control-summary.js +43 -0
  72. package/dist/src/browser/web-ai/control-summary.js.map +1 -0
  73. package/dist/src/browser/web-ai/copy-markdown.js +10 -0
  74. package/dist/src/browser/web-ai/copy-markdown.js.map +1 -1
  75. package/dist/src/browser/web-ai/diagnostics.js +7 -0
  76. package/dist/src/browser/web-ai/diagnostics.js.map +1 -1
  77. package/dist/src/browser/web-ai/errors.js +17 -0
  78. package/dist/src/browser/web-ai/errors.js.map +1 -1
  79. package/dist/src/browser/web-ai/gemini-capabilities.js +46 -0
  80. package/dist/src/browser/web-ai/gemini-capabilities.js.map +1 -0
  81. package/dist/src/browser/web-ai/gemini-live.js +6 -0
  82. package/dist/src/browser/web-ai/gemini-live.js.map +1 -1
  83. package/dist/src/browser/web-ai/gemini-model.js +41 -0
  84. package/dist/src/browser/web-ai/gemini-model.js.map +1 -1
  85. package/dist/src/browser/web-ai/grok-capabilities.js +41 -0
  86. package/dist/src/browser/web-ai/grok-capabilities.js.map +1 -0
  87. package/dist/src/browser/web-ai/grok-live.js +5 -0
  88. package/dist/src/browser/web-ai/grok-live.js.map +1 -1
  89. package/dist/src/browser/web-ai/grok-model.js +38 -0
  90. package/dist/src/browser/web-ai/grok-model.js.map +1 -1
  91. package/dist/src/browser/web-ai/index.js +10 -0
  92. package/dist/src/browser/web-ai/index.js.map +1 -1
  93. package/dist/src/browser/web-ai/navigation-ready.js +123 -0
  94. package/dist/src/browser/web-ai/navigation-ready.js.map +1 -0
  95. package/dist/src/browser/web-ai/observation-bundle.js +26 -1
  96. package/dist/src/browser/web-ai/observation-bundle.js.map +1 -1
  97. package/dist/src/browser/web-ai/provider-adapter.js.map +1 -1
  98. package/dist/src/browser/web-ai/session-artifacts.js +156 -0
  99. package/dist/src/browser/web-ai/session-artifacts.js.map +1 -0
  100. package/dist/src/browser/web-ai/session-doctor.js +101 -0
  101. package/dist/src/browser/web-ai/session-doctor.js.map +1 -0
  102. package/dist/src/browser/web-ai/session-store.js +94 -17
  103. package/dist/src/browser/web-ai/session-store.js.map +1 -1
  104. package/dist/src/browser/web-ai/session.js +73 -0
  105. package/dist/src/browser/web-ai/session.js.map +1 -1
  106. package/dist/src/browser/web-ai/tab-inspect.js +143 -0
  107. package/dist/src/browser/web-ai/tab-inspect.js.map +1 -0
  108. package/dist/src/browser/web-ai/tab-lease-store.js +114 -4
  109. package/dist/src/browser/web-ai/tab-lease-store.js.map +1 -1
  110. package/dist/src/browser/web-ai/tier-timeout.js +58 -0
  111. package/dist/src/browser/web-ai/tier-timeout.js.map +1 -0
  112. package/dist/src/browser/web-ai/vendor-editor-contract.js +6 -3
  113. package/dist/src/browser/web-ai/vendor-editor-contract.js.map +1 -1
  114. package/dist/src/browser/web-ai/watcher-lock.js +125 -0
  115. package/dist/src/browser/web-ai/watcher-lock.js.map +1 -0
  116. package/dist/src/browser/web-ai/watcher.js +23 -4
  117. package/dist/src/browser/web-ai/watcher.js.map +1 -1
  118. package/dist/src/cli/handlers-workflows.js +14 -3
  119. package/dist/src/cli/handlers-workflows.js.map +1 -1
  120. package/dist/src/core/cli-detection.js +2 -3
  121. package/dist/src/core/cli-detection.js.map +1 -1
  122. package/dist/src/core/settings-merge.js +2 -2
  123. package/dist/src/core/settings-merge.js.map +1 -1
  124. package/dist/src/goal/heartbeat.js +13 -7
  125. package/dist/src/goal/heartbeat.js.map +1 -1
  126. package/dist/src/goal/pause-gate.js +22 -0
  127. package/dist/src/goal/pause-gate.js.map +1 -0
  128. package/dist/src/goal/store.js +5 -0
  129. package/dist/src/goal/store.js.map +1 -1
  130. package/dist/src/manager/lifecycle.js +2 -1
  131. package/dist/src/manager/lifecycle.js.map +1 -1
  132. package/dist/src/manager/preview-origin-proxy.js +36 -6
  133. package/dist/src/manager/preview-origin-proxy.js.map +1 -1
  134. package/dist/src/manager/proxy.js +25 -4
  135. package/dist/src/manager/proxy.js.map +1 -1
  136. package/dist/src/manager/registry.js +36 -3
  137. package/dist/src/manager/registry.js.map +1 -1
  138. package/dist/src/manager/routes/runtime-monitor.js +2 -0
  139. package/dist/src/manager/routes/runtime-monitor.js.map +1 -1
  140. package/dist/src/manager/routes/telegram-hub.js +120 -0
  141. package/dist/src/manager/routes/telegram-hub.js.map +1 -0
  142. package/dist/src/manager/server.js +4 -0
  143. package/dist/src/manager/server.js.map +1 -1
  144. package/dist/src/manager/telegram-hub/hub-bot.js +409 -0
  145. package/dist/src/manager/telegram-hub/hub-bot.js.map +1 -0
  146. package/dist/src/manager/telegram-hub/routing-store.js +24 -0
  147. package/dist/src/manager/telegram-hub/routing-store.js.map +1 -0
  148. package/dist/src/manager/telegram-hub/types.js +5 -0
  149. package/dist/src/manager/telegram-hub/types.js.map +1 -0
  150. package/dist/src/messaging/thread-target.js +21 -0
  151. package/dist/src/messaging/thread-target.js.map +1 -0
  152. package/dist/src/orchestrator/gateway.js +10 -7
  153. package/dist/src/orchestrator/gateway.js.map +1 -1
  154. package/dist/src/orchestrator/pipeline.js +19 -0
  155. package/dist/src/orchestrator/pipeline.js.map +1 -1
  156. package/dist/src/orchestrator/worker-registry.js.map +1 -1
  157. package/dist/src/routes/command.js +58 -2
  158. package/dist/src/routes/command.js.map +1 -1
  159. package/dist/src/routes/goal.js +6 -3
  160. package/dist/src/routes/goal.js.map +1 -1
  161. package/dist/src/routes/messaging.js +7 -2
  162. package/dist/src/routes/messaging.js.map +1 -1
  163. package/dist/src/routes/orchestrate.js +2 -0
  164. package/dist/src/routes/orchestrate.js.map +1 -1
  165. package/dist/src/telegram/bot.js +59 -4
  166. package/dist/src/telegram/bot.js.map +1 -1
  167. package/dist/src/telegram/forwarder.js +4 -1
  168. package/dist/src/telegram/forwarder.js.map +1 -1
  169. package/dist/src/telegram/hub-callback.js +21 -0
  170. package/dist/src/telegram/hub-callback.js.map +1 -0
  171. package/dist/src/telegram/rich-message.js +20 -0
  172. package/dist/src/telegram/rich-message.js.map +1 -0
  173. package/dist/src/telegram/telegram-file.js +4 -3
  174. package/dist/src/telegram/telegram-file.js.map +1 -1
  175. package/dist/src/workflows/status.js +14 -4
  176. package/dist/src/workflows/status.js.map +1 -1
  177. package/package.json +5 -5
  178. package/public/dist/assets/{Agent-wJtedbz4.js → Agent-Ci12HWhE.js} +1 -1
  179. package/public/dist/assets/{Heartbeat-CjgQ-0p8.js → Heartbeat-D-Rfp094.js} +1 -1
  180. package/public/dist/assets/{Memory-6o-wyhAT.js → Memory-VH4ZJCMW.js} +1 -1
  181. package/public/dist/assets/ModelProvider-_tUCghOF.js +1 -0
  182. package/public/dist/assets/TelegramHub-CuJoPPib.js +1 -0
  183. package/public/dist/assets/{agent-meta-g8UDRdWA.js → agent-meta-DqBTGRRQ.js} +1 -1
  184. package/public/dist/assets/{app-CLrfEHAk.js → app-DaORcAyD.js} +4 -4
  185. package/public/dist/assets/bgtask-badge-B3HLOZae.js +1 -0
  186. package/public/dist/assets/{bgtask-badge-xWbw-l-0.js → bgtask-badge-BtUXEe1T.js} +1 -1
  187. package/public/dist/assets/constants-DkJ3E63Y.js +1 -0
  188. package/public/dist/assets/{employees-C5GPj3d3.js → employees-CZSyvJbx.js} +1 -1
  189. package/public/dist/assets/manager-D3waO_XX.css +1 -0
  190. package/public/dist/assets/manager-DB5qTw1A.js +13 -0
  191. package/public/dist/assets/memory-BEruUlfu.js +1 -0
  192. package/public/dist/assets/{memory-CcnjBuo-.js → memory-cWI_Htbn.js} +1 -1
  193. package/public/dist/assets/message-history-DU1V9ZAW.js +142 -0
  194. package/public/dist/assets/message-history-tjkyOp_K.js +1 -0
  195. package/public/dist/assets/{render-C2g_qvCg.js → render-Bp8eyqCf.js} +1 -1
  196. package/public/dist/assets/settings-B-GgyJZI.js +1 -0
  197. package/public/dist/assets/{settings-DxClXVD0.js → settings-DLkP7qRV.js} +1 -1
  198. package/public/dist/assets/{settings-core-CSUV4-QG.js → settings-core-B5XRRNcX.js} +1 -1
  199. package/public/dist/assets/settings-core-Cw1av-Ox.js +1 -0
  200. package/public/dist/assets/{sidebar-CJz_SnMW.js → sidebar-CsogFOse.js} +3 -3
  201. package/public/dist/assets/skills-CLcoop6W.js +1 -0
  202. package/public/dist/assets/{skills-PKg2h1N4.js → skills-Dmf4v9rj.js} +1 -1
  203. package/public/dist/assets/slash-commands-DY6-hzq6.js +1 -0
  204. package/public/dist/assets/{slash-commands-FMOOfedZ.js → slash-commands-vcf7FuPD.js} +1 -1
  205. package/public/dist/assets/{trace-drawer-BoU1ucw7.js → trace-drawer-DuQQ0SNq.js} +1 -1
  206. package/public/dist/assets/{ui-BX-IfLze.js → ui-BKYuBdZE.js} +1 -1
  207. package/public/dist/assets/ui-CqlGwgUo.js +1 -0
  208. package/public/dist/index.html +1 -1
  209. package/public/dist/manager/index.html +2 -2
  210. package/public/js/constants.ts +2 -3
  211. package/public/js/features/process-block.ts +61 -9
  212. package/public/manager/src/code/code-composer.css +1 -0
  213. package/public/manager/src/code/code.css +7 -2
  214. package/public/manager/src/dashboard-settings/DashboardSettingsSidebar.tsx +6 -2
  215. package/public/manager/src/dashboard-settings/DashboardSettingsWorkspace.tsx +91 -2
  216. package/public/manager/src/goal-status/GoalPabcdStatusPanel.tsx +9 -1
  217. package/public/manager/src/goal-status/goal-pabcd-status-client.ts +9 -0
  218. package/public/manager/src/settings/SettingsShell.tsx +1 -0
  219. package/public/manager/src/settings/SettingsSidebar.tsx +1 -0
  220. package/public/manager/src/settings/pages/TelegramHub.tsx +179 -0
  221. package/public/manager/src/settings/pages/components/PerCliRow.tsx +23 -13
  222. package/public/manager/src/settings/pages/components/agent/agent-meta.ts +3 -1
  223. package/public/manager/src/settings/types.ts +1 -0
  224. package/public/manager/src/settings-shell.css +11 -0
  225. package/public/sw.js +1 -1
  226. package/scripts/bundle-sidecar.sh +6 -1
  227. package/public/dist/assets/ModelProvider-CNu6WOjM.js +0 -1
  228. package/public/dist/assets/bgtask-badge-4OjtCvDq.js +0 -1
  229. package/public/dist/assets/constants-CCiCctGV.js +0 -1
  230. package/public/dist/assets/manager-Ceg2x8D0.js +0 -13
  231. package/public/dist/assets/manager-CwAlpgV7.css +0 -1
  232. package/public/dist/assets/memory-B1beDKbo.js +0 -1
  233. package/public/dist/assets/message-history-BSWJwi__.js +0 -142
  234. package/public/dist/assets/message-history-CzaziSe8.js +0 -1
  235. package/public/dist/assets/settings-Dst1mUjn.js +0 -1
  236. package/public/dist/assets/settings-core-BW5mtFPE.js +0 -1
  237. package/public/dist/assets/skills-B2io6S_4.js +0 -1
  238. package/public/dist/assets/slash-commands-D1IS00Eg.js +0 -1
  239. package/public/dist/assets/ui-C-al0etg.js +0 -1
  240. /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,5 @@
1
+ // ─── Telegram Hub Types ──────────────────────────────
2
+ // Topic→instance routing model for the Dashboard-owned Telegram hub (P1).
3
+ // No imports → no circular dependency with src/manager/types.ts.
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -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
- function dedupKey(origin, text, chatId) {
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
- return `${origin}:${chatId ?? ''}:${normalized}`;
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,SAAS,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,MAAwB;IACpE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACpD,OAAO,GAAG,MAAM,IAAI,MAAM,IAAI,EAAE,IAAI,UAAU,EAAE,CAAC;AACrD,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,IAAoG;IAEpG,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,KAAK,EAAE,IAAI;SACd,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACP,CAAC;AAED,MAAM,UAAU,aAAa,CACzB,IAAY,EACZ,IAAiI;IAEjI,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,CAAC,CAAC;IACxD,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,WAAW,EAAE,IAAI,EAAE,CAAC,EACpH,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,WAAW,EAAE,IAAI,EAAE,CAAC,EACjH,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,CAAC,CAAC,CAAC;QACtI,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,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,CAAC,EACrH,aAAa,EACb,EAAE,GAAG,IAAI,EAAE,SAAS,EAAE,CACzB,CAAC;IACN,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC;AAC5C,CAAC"}
1
+ {"version":3,"file":"gateway.js","sourceRoot":"","sources":["../../../src/orchestrator/gateway.ts"],"names":[],"mappings":"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"}