sensorium-mcp 2.16.28 → 2.16.30

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 (177) hide show
  1. package/dist/config.d.ts +1 -11
  2. package/dist/config.d.ts.map +1 -1
  3. package/dist/config.js +3 -49
  4. package/dist/config.js.map +1 -1
  5. package/dist/dashboard/presets.d.ts +18 -0
  6. package/dist/dashboard/presets.d.ts.map +1 -0
  7. package/dist/dashboard/presets.js +78 -0
  8. package/dist/dashboard/presets.js.map +1 -0
  9. package/dist/dashboard/routes.d.ts +33 -0
  10. package/dist/dashboard/routes.d.ts.map +1 -0
  11. package/dist/dashboard/routes.js +283 -0
  12. package/dist/dashboard/routes.js.map +1 -0
  13. package/dist/dashboard.d.ts +6 -29
  14. package/dist/dashboard.d.ts.map +1 -1
  15. package/dist/dashboard.js +6 -1158
  16. package/dist/dashboard.js.map +1 -1
  17. package/dist/data/file-storage.d.ts +19 -0
  18. package/dist/data/file-storage.d.ts.map +1 -0
  19. package/dist/data/file-storage.js +58 -0
  20. package/dist/data/file-storage.js.map +1 -0
  21. package/dist/data/memory/bootstrap.d.ts +40 -0
  22. package/dist/data/memory/bootstrap.d.ts.map +1 -0
  23. package/dist/data/memory/bootstrap.js +240 -0
  24. package/dist/data/memory/bootstrap.js.map +1 -0
  25. package/dist/data/memory/consolidation.d.ts +12 -0
  26. package/dist/data/memory/consolidation.d.ts.map +1 -0
  27. package/dist/data/memory/consolidation.js +248 -0
  28. package/dist/data/memory/consolidation.js.map +1 -0
  29. package/dist/data/memory/episodes.d.ts +34 -0
  30. package/dist/data/memory/episodes.d.ts.map +1 -0
  31. package/dist/data/memory/episodes.js +89 -0
  32. package/dist/data/memory/episodes.js.map +1 -0
  33. package/dist/data/memory/index.d.ts +14 -0
  34. package/dist/data/memory/index.d.ts.map +1 -0
  35. package/dist/data/memory/index.js +14 -0
  36. package/dist/data/memory/index.js.map +1 -0
  37. package/dist/data/memory/procedures.d.ts +42 -0
  38. package/dist/data/memory/procedures.d.ts.map +1 -0
  39. package/dist/data/memory/procedures.js +122 -0
  40. package/dist/data/memory/procedures.js.map +1 -0
  41. package/dist/data/memory/schema.d.ts +11 -0
  42. package/dist/data/memory/schema.d.ts.map +1 -0
  43. package/dist/data/memory/schema.js +327 -0
  44. package/dist/data/memory/schema.js.map +1 -0
  45. package/dist/data/memory/semantic.d.ts +94 -0
  46. package/dist/data/memory/semantic.d.ts.map +1 -0
  47. package/dist/data/memory/semantic.js +385 -0
  48. package/dist/data/memory/semantic.js.map +1 -0
  49. package/dist/data/memory/voice-sig.d.ts +33 -0
  50. package/dist/data/memory/voice-sig.d.ts.map +1 -0
  51. package/dist/data/memory/voice-sig.js +48 -0
  52. package/dist/data/memory/voice-sig.js.map +1 -0
  53. package/dist/data/templates.d.ts +19 -0
  54. package/dist/data/templates.d.ts.map +1 -0
  55. package/dist/data/templates.js +46 -0
  56. package/dist/data/templates.js.map +1 -0
  57. package/dist/dispatcher.d.ts +5 -97
  58. package/dist/dispatcher.d.ts.map +1 -1
  59. package/dist/dispatcher.js +5 -525
  60. package/dist/dispatcher.js.map +1 -1
  61. package/dist/drive.d.ts.map +1 -1
  62. package/dist/drive.js +3 -1
  63. package/dist/drive.js.map +1 -1
  64. package/dist/index.d.ts +4 -23
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +11 -289
  67. package/dist/index.js.map +1 -1
  68. package/dist/integrations/openai/chat.d.ts +29 -0
  69. package/dist/integrations/openai/chat.d.ts.map +1 -0
  70. package/dist/integrations/openai/chat.js +84 -0
  71. package/dist/integrations/openai/chat.js.map +1 -0
  72. package/dist/integrations/openai/index.d.ts +6 -0
  73. package/dist/integrations/openai/index.d.ts.map +1 -0
  74. package/dist/integrations/openai/index.js +6 -0
  75. package/dist/integrations/openai/index.js.map +1 -0
  76. package/dist/integrations/openai/speech.d.ts +21 -0
  77. package/dist/integrations/openai/speech.d.ts.map +1 -0
  78. package/dist/integrations/openai/speech.js +75 -0
  79. package/dist/integrations/openai/speech.js.map +1 -0
  80. package/dist/integrations/openai/video.d.ts +15 -0
  81. package/dist/integrations/openai/video.d.ts.map +1 -0
  82. package/dist/integrations/openai/video.js +131 -0
  83. package/dist/integrations/openai/video.js.map +1 -0
  84. package/dist/integrations/openai/vision.d.ts +23 -0
  85. package/dist/integrations/openai/vision.d.ts.map +1 -0
  86. package/dist/integrations/openai/vision.js +116 -0
  87. package/dist/integrations/openai/vision.js.map +1 -0
  88. package/dist/integrations/openai/voice-emotion.d.ts +41 -0
  89. package/dist/integrations/openai/voice-emotion.d.ts.map +1 -0
  90. package/dist/integrations/openai/voice-emotion.js +50 -0
  91. package/dist/integrations/openai/voice-emotion.js.map +1 -0
  92. package/dist/integrations/telegram/types.d.ts +112 -0
  93. package/dist/integrations/telegram/types.d.ts.map +1 -0
  94. package/dist/integrations/telegram/types.js +6 -0
  95. package/dist/integrations/telegram/types.js.map +1 -0
  96. package/dist/memory.d.ts +6 -205
  97. package/dist/memory.d.ts.map +1 -1
  98. package/dist/memory.js +6 -1357
  99. package/dist/memory.js.map +1 -1
  100. package/dist/openai.d.ts +11 -102
  101. package/dist/openai.d.ts.map +1 -1
  102. package/dist/openai.js +14 -421
  103. package/dist/openai.js.map +1 -1
  104. package/dist/response-builders.d.ts +1 -11
  105. package/dist/response-builders.d.ts.map +1 -1
  106. package/dist/response-builders.js +2 -38
  107. package/dist/response-builders.js.map +1 -1
  108. package/dist/server/factory.d.ts +17 -0
  109. package/dist/server/factory.d.ts.map +1 -0
  110. package/dist/server/factory.js +279 -0
  111. package/dist/server/factory.js.map +1 -0
  112. package/dist/services/dispatcher/broker.d.ts +83 -0
  113. package/dist/services/dispatcher/broker.d.ts.map +1 -0
  114. package/dist/services/dispatcher/broker.js +175 -0
  115. package/dist/services/dispatcher/broker.js.map +1 -0
  116. package/dist/services/dispatcher/index.d.ts +7 -0
  117. package/dist/services/dispatcher/index.d.ts.map +1 -0
  118. package/dist/services/dispatcher/index.js +7 -0
  119. package/dist/services/dispatcher/index.js.map +1 -0
  120. package/dist/services/dispatcher/lock.d.ts +25 -0
  121. package/dist/services/dispatcher/lock.d.ts.map +1 -0
  122. package/dist/services/dispatcher/lock.js +111 -0
  123. package/dist/services/dispatcher/lock.js.map +1 -0
  124. package/dist/services/dispatcher/poller.d.ts +19 -0
  125. package/dist/services/dispatcher/poller.d.ts.map +1 -0
  126. package/dist/services/dispatcher/poller.js +269 -0
  127. package/dist/services/dispatcher/poller.js.map +1 -0
  128. package/dist/telegram.d.ts +2 -88
  129. package/dist/telegram.d.ts.map +1 -1
  130. package/dist/telegram.js +2 -0
  131. package/dist/telegram.js.map +1 -1
  132. package/dist/tool-definitions.d.ts +1 -14
  133. package/dist/tool-definitions.d.ts.map +1 -1
  134. package/dist/tool-definitions.js +1 -403
  135. package/dist/tool-definitions.js.map +1 -1
  136. package/dist/tools/definitions.d.ts +15 -0
  137. package/dist/tools/definitions.d.ts.map +1 -0
  138. package/dist/tools/definitions.js +404 -0
  139. package/dist/tools/definitions.js.map +1 -0
  140. package/dist/tools/start-session-tool.d.ts.map +1 -1
  141. package/dist/tools/start-session-tool.js +2 -0
  142. package/dist/tools/start-session-tool.js.map +1 -1
  143. package/dist/tools/wait/drive-handler.d.ts +61 -0
  144. package/dist/tools/wait/drive-handler.d.ts.map +1 -0
  145. package/dist/tools/wait/drive-handler.js +138 -0
  146. package/dist/tools/wait/drive-handler.js.map +1 -0
  147. package/dist/tools/wait/index.d.ts +8 -0
  148. package/dist/tools/wait/index.d.ts.map +1 -0
  149. package/dist/tools/wait/index.js +8 -0
  150. package/dist/tools/wait/index.js.map +1 -0
  151. package/dist/tools/wait/media-processor.d.ts +52 -0
  152. package/dist/tools/wait/media-processor.d.ts.map +1 -0
  153. package/dist/tools/wait/media-processor.js +261 -0
  154. package/dist/tools/wait/media-processor.js.map +1 -0
  155. package/dist/tools/wait/message-delivery.d.ts +63 -0
  156. package/dist/tools/wait/message-delivery.d.ts.map +1 -0
  157. package/dist/tools/wait/message-delivery.js +281 -0
  158. package/dist/tools/wait/message-delivery.js.map +1 -0
  159. package/dist/tools/wait/poll-loop.d.ts +72 -0
  160. package/dist/tools/wait/poll-loop.d.ts.map +1 -0
  161. package/dist/tools/wait/poll-loop.js +280 -0
  162. package/dist/tools/wait/poll-loop.js.map +1 -0
  163. package/dist/tools/wait/reaction-handler.d.ts +49 -0
  164. package/dist/tools/wait/reaction-handler.d.ts.map +1 -0
  165. package/dist/tools/wait/reaction-handler.js +126 -0
  166. package/dist/tools/wait/reaction-handler.js.map +1 -0
  167. package/dist/tools/wait/task-handler.d.ts +40 -0
  168. package/dist/tools/wait/task-handler.d.ts.map +1 -0
  169. package/dist/tools/wait/task-handler.js +41 -0
  170. package/dist/tools/wait/task-handler.js.map +1 -0
  171. package/dist/tools/wait-tool.d.ts +3 -69
  172. package/dist/tools/wait-tool.d.ts.map +1 -1
  173. package/dist/tools/wait-tool.js +3 -876
  174. package/dist/tools/wait-tool.js.map +1 -1
  175. package/package.json +1 -1
  176. package/templates/daily-review.default.md +26 -0
  177. package/templates/drive-dispatcher.default.md +2 -0
@@ -0,0 +1,279 @@
1
+ /**
2
+ * MCP Server factory — creates a fresh Server per transport connection.
3
+ *
4
+ * This is required because a single Server instance can only connect to one
5
+ * transport. In HTTP mode, each VS Code client gets its own Server instance.
6
+ * All instances share the same tool handler logic and in-process state.
7
+ */
8
+ import { Server } from "@modelcontextprotocol/sdk/server/index.js";
9
+ import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
10
+ import { checkMaintenanceFlag, config } from "../config.js";
11
+ import { peekThreadMessages } from "../dispatcher.js";
12
+ import { formatDrivePrompt } from "../drive.js";
13
+ import { checkDueTasks } from "../scheduler.js";
14
+ import { DEAD_SESSION_TIMEOUT_MS } from "../sessions.js";
15
+ import { getToolDefinitions } from "../tool-definitions.js";
16
+ import { errorResult } from "../utils.js";
17
+ import { getReminders, getShortReminder } from "../response-builders.js";
18
+ import { log } from "../logger.js";
19
+ import { handleMemoryTool } from "../tools/memory-tools.js";
20
+ import { handleUtilityTool } from "../tools/utility-tools.js";
21
+ import { handleSessionTool } from "../tools/session-tools.js";
22
+ import { handleStartSession } from "../tools/start-session-tool.js";
23
+ import { handleWaitForInstructions } from "../tools/wait/index.js";
24
+ // ---------------------------------------------------------------------------
25
+ // Public factory builder
26
+ // ---------------------------------------------------------------------------
27
+ /**
28
+ * Builds a `CreateMcpServerFn` that closes over the shared runtime singletons
29
+ * (Telegram client, memory database accessor). The returned function is the
30
+ * factory that `startHttpServer` / `startStdioServer` call per-connection.
31
+ */
32
+ export function buildMcpServerFactory(telegram, telegramChatId, getMemoryDb) {
33
+ return (getMcpSessionId, closeTransport) => createMcpServer(telegram, telegramChatId, getMemoryDb, getMcpSessionId, closeTransport);
34
+ }
35
+ // ---------------------------------------------------------------------------
36
+ // Internal — per-connection server creation
37
+ // ---------------------------------------------------------------------------
38
+ function createMcpServer(telegram, telegramChatId, getMemoryDb, getMcpSessionId, closeTransport) {
39
+ const { PKG_VERSION } = config;
40
+ // ── Per-session state (isolated per HTTP session / stdio connection) ─────
41
+ let waitCallCount = 0;
42
+ let sessionStartedAt = Date.now();
43
+ let currentThreadId;
44
+ let lastToolCallAt = Date.now();
45
+ let deadSessionAlerted = false;
46
+ let waitInProgress = false;
47
+ let lastOperatorMessageAt = Date.now();
48
+ let lastOperatorMessageText = "";
49
+ let lastConsolidationAt = 0;
50
+ let toolCallsSinceLastDelivery = 0;
51
+ let lastDriveAttemptAt = 0;
52
+ let drivePhase2Fired = false;
53
+ const previewedUpdateIds = new Set();
54
+ const PREVIEWED_IDS_CAP = 1000;
55
+ function addPreviewedId(id) {
56
+ if (previewedUpdateIds.size >= PREVIEWED_IDS_CAP) {
57
+ const toDelete = previewedUpdateIds.size - PREVIEWED_IDS_CAP + 100;
58
+ let deleted = 0;
59
+ for (const old of previewedUpdateIds) {
60
+ if (deleted >= toDelete)
61
+ break;
62
+ previewedUpdateIds.delete(old);
63
+ deleted++;
64
+ }
65
+ }
66
+ previewedUpdateIds.add(id);
67
+ }
68
+ /**
69
+ * Generate a first-person DMN (Default Mode Network) reflection prompt.
70
+ * Called when the __DMN__ sentinel fires as a scheduled task.
71
+ */
72
+ function generateDmnReflection(_threadId) {
73
+ try {
74
+ const idleMs = Date.now() - lastOperatorMessageAt;
75
+ const driveResult = formatDrivePrompt(idleMs, config.DMN_ACTIVATION_HOURS);
76
+ if (driveResult.activated && driveResult.prompt) {
77
+ return (`I've been thinking while the operator is away.\n\n` +
78
+ `${driveResult.prompt}\n\n` +
79
+ `If something here resonates, I should explore it — use subagents, search the codebase, review memory. ` +
80
+ `Report what I find, then go back to hibernation or continue waiting.`);
81
+ }
82
+ return "I should review memory and the codebase for anything interesting while the operator is away.";
83
+ }
84
+ catch {
85
+ return "I should review memory and the codebase for anything interesting while the operator is away.";
86
+ }
87
+ }
88
+ function resolveThreadId(args) {
89
+ const raw = args?.threadId;
90
+ const explicit = typeof raw === "number" ? raw
91
+ : typeof raw === "string" ? Number(raw)
92
+ : undefined;
93
+ if (explicit !== undefined && Number.isFinite(explicit)) {
94
+ currentThreadId = explicit;
95
+ return explicit;
96
+ }
97
+ return currentThreadId;
98
+ }
99
+ const memoryToolCtx = {
100
+ resolveThreadId,
101
+ getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
102
+ getMemoryDb,
103
+ errorResult,
104
+ onConsolidation: () => { lastConsolidationAt = Date.now(); },
105
+ };
106
+ const srv = new Server({ name: "sensorium-mcp", version: PKG_VERSION }, { capabilities: { tools: {} } });
107
+ // Dead session detector — per-session, runs every 2 minutes
108
+ const deadSessionInterval = setInterval(async () => {
109
+ if (!currentThreadId)
110
+ return;
111
+ // Skip check when wait_for_instructions is actively running — the session
112
+ // is definitively alive even if lastToolCallAt hasn't been refreshed.
113
+ if (waitInProgress)
114
+ return;
115
+ const elapsed = Date.now() - lastToolCallAt;
116
+ if (elapsed > DEAD_SESSION_TIMEOUT_MS && !deadSessionAlerted) {
117
+ deadSessionAlerted = true;
118
+ try {
119
+ const minutes = Math.round(elapsed / 60000);
120
+ await telegram.sendMessage(telegramChatId, `⚠️ *Session appears down* — no tool calls in ${minutes} minutes\\. The agent may have crashed or the VS Code window compacted the context\\. Please check and restart if needed\\.`, "MarkdownV2", currentThreadId);
121
+ }
122
+ catch (_) { /* non-fatal */ }
123
+ }
124
+ }, 2 * 60 * 1000);
125
+ // Clean up the interval when the server closes
126
+ srv.onclose = () => {
127
+ clearInterval(deadSessionInterval);
128
+ };
129
+ // ── Tool definitions ──────────────────────────────────────────────────────
130
+ srv.setRequestHandler(ListToolsRequestSchema, async () => ({
131
+ tools: getToolDefinitions(),
132
+ }));
133
+ // ── Tool implementations ──────────────────────────────────────────────────
134
+ srv.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
135
+ const { name, arguments: args } = request.params;
136
+ // Verbose logging: tool call dispatch
137
+ const argsSummary = args ? JSON.stringify(args).slice(0, 200) : "{}";
138
+ log.verbose("dispatch", `Tool call: ${name} args=${argsSummary}`);
139
+ // Dead session detection — update timestamp on any tool call.
140
+ // Only reset the alert flag when wait_for_instructions is called,
141
+ // as that's the primary health signal (agent is actively polling).
142
+ lastToolCallAt = Date.now();
143
+ // Track tool calls for activity monitoring
144
+ toolCallsSinceLastDelivery++;
145
+ // ── start_session ───────────────────────────────────────────────────────
146
+ if (name === "start_session") {
147
+ const startSessionCtx = {
148
+ session: {
149
+ get currentThreadId() { return currentThreadId; },
150
+ set currentThreadId(v) { currentThreadId = v; },
151
+ get sessionStartedAt() { return sessionStartedAt; },
152
+ set sessionStartedAt(v) { sessionStartedAt = v; },
153
+ get waitCallCount() { return waitCallCount; },
154
+ set waitCallCount(v) { waitCallCount = v; },
155
+ get lastToolCallAt() { return lastToolCallAt; },
156
+ set lastToolCallAt(v) { lastToolCallAt = v; },
157
+ get deadSessionAlerted() { return deadSessionAlerted; },
158
+ set deadSessionAlerted(v) { deadSessionAlerted = v; },
159
+ get toolCallsSinceLastDelivery() { return toolCallsSinceLastDelivery; },
160
+ set toolCallsSinceLastDelivery(v) { toolCallsSinceLastDelivery = v; },
161
+ previewedUpdateIds,
162
+ get lastOperatorMessageAt() { return lastOperatorMessageAt; },
163
+ set lastOperatorMessageAt(v) { lastOperatorMessageAt = v; },
164
+ get lastOperatorMessageText() { return lastOperatorMessageText; },
165
+ set lastOperatorMessageText(v) { lastOperatorMessageText = v; },
166
+ get lastConsolidationAt() { return lastConsolidationAt; },
167
+ set lastConsolidationAt(v) { lastConsolidationAt = v; },
168
+ },
169
+ telegram,
170
+ telegramChatId,
171
+ config,
172
+ getMemoryDb,
173
+ getReminders,
174
+ getMcpSessionId,
175
+ closeTransport,
176
+ };
177
+ return handleStartSession((args ?? {}), startSessionCtx);
178
+ }
179
+ // ── remote_copilot_wait_for_instructions ────────────────────────────────
180
+ if (name === "remote_copilot_wait_for_instructions") {
181
+ const waitCtx = {
182
+ state: {
183
+ get currentThreadId() { return currentThreadId; },
184
+ set currentThreadId(v) { currentThreadId = v; },
185
+ get sessionStartedAt() { return sessionStartedAt; },
186
+ set sessionStartedAt(v) { sessionStartedAt = v; },
187
+ get waitCallCount() { return waitCallCount; },
188
+ set waitCallCount(v) { waitCallCount = v; },
189
+ get lastToolCallAt() { return lastToolCallAt; },
190
+ set lastToolCallAt(v) { lastToolCallAt = v; },
191
+ get deadSessionAlerted() { return deadSessionAlerted; },
192
+ set deadSessionAlerted(v) { deadSessionAlerted = v; },
193
+ get toolCallsSinceLastDelivery() { return toolCallsSinceLastDelivery; },
194
+ set toolCallsSinceLastDelivery(v) { toolCallsSinceLastDelivery = v; },
195
+ get lastOperatorMessageAt() { return lastOperatorMessageAt; },
196
+ set lastOperatorMessageAt(v) { lastOperatorMessageAt = v; },
197
+ get lastOperatorMessageText() { return lastOperatorMessageText; },
198
+ set lastOperatorMessageText(v) { lastOperatorMessageText = v; },
199
+ get lastConsolidationAt() { return lastConsolidationAt; },
200
+ set lastConsolidationAt(v) { lastConsolidationAt = v; },
201
+ get lastDriveAttemptAt() { return lastDriveAttemptAt; },
202
+ set lastDriveAttemptAt(v) { lastDriveAttemptAt = v; },
203
+ get drivePhase2Fired() { return drivePhase2Fired; },
204
+ set drivePhase2Fired(v) { drivePhase2Fired = v; },
205
+ previewedUpdateIds,
206
+ },
207
+ addPreviewedId,
208
+ generateDmnReflection,
209
+ resolveThreadId,
210
+ telegram,
211
+ telegramChatId,
212
+ getMemoryDb,
213
+ config,
214
+ errorResult,
215
+ };
216
+ waitInProgress = true;
217
+ try {
218
+ return await handleWaitForInstructions((args ?? {}), waitCtx, extra);
219
+ }
220
+ finally {
221
+ waitInProgress = false;
222
+ }
223
+ }
224
+ // ── report_progress / hibernate ─────────────────────────────────────────
225
+ if (name === "report_progress" || name === "hibernate") {
226
+ const typedArgs = (args ?? {});
227
+ const sessionToolCtx = {
228
+ resolveThreadId,
229
+ getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
230
+ errorResult,
231
+ telegram,
232
+ telegramChatId,
233
+ peekThreadMessages,
234
+ checkMaintenanceFlag,
235
+ checkDueTasks,
236
+ generateDmnReflection,
237
+ lastOperatorMessageAt,
238
+ lastOperatorMessageText,
239
+ previewedUpdateIds,
240
+ addPreviewedId,
241
+ };
242
+ return handleSessionTool(name, typedArgs, sessionToolCtx, extra);
243
+ }
244
+ // ── send_file / send_voice / schedule_wake_up ───────────────────────────
245
+ if (["send_file", "send_voice", "schedule_wake_up", "send_sticker"].includes(name)) {
246
+ const typedArgs = (args ?? {});
247
+ const utilityCtx = {
248
+ resolveThreadId,
249
+ getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
250
+ errorResult,
251
+ telegram,
252
+ config,
253
+ sessionStartedAt,
254
+ };
255
+ return handleUtilityTool(name, typedArgs, utilityCtx);
256
+ }
257
+ // ── memory_* tools ────────────────────────────────────────────────────
258
+ if (name.startsWith("memory_")) {
259
+ return handleMemoryTool(name, (args ?? {}), memoryToolCtx);
260
+ }
261
+ // ── get_version ────────────────────────────────────────────────────────
262
+ if (name === "get_version") {
263
+ const typedArgs = (args ?? {});
264
+ const utilityCtx = {
265
+ resolveThreadId,
266
+ getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
267
+ errorResult,
268
+ telegram,
269
+ config,
270
+ sessionStartedAt,
271
+ };
272
+ return handleUtilityTool(name, typedArgs, utilityCtx);
273
+ }
274
+ // Unknown tool
275
+ return errorResult(`Unknown tool: ${name}`);
276
+ });
277
+ return srv;
278
+ }
279
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/server/factory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /**
2
+ * File-based per-thread message broker.
3
+ *
4
+ * Incoming Telegram messages are written by the poller to per-thread JSONL
5
+ * files under ~/.remote-copilot-mcp/threads/<threadId>.jsonl.
6
+ * Each MCP instance reads from its own thread file — contention-free.
7
+ */
8
+ export declare const OFFSET_FILE: string;
9
+ export interface StoredReaction {
10
+ emoji: string;
11
+ messageId: number;
12
+ chatId: number;
13
+ date: number;
14
+ }
15
+ export declare function writeReactionFile(reaction: StoredReaction): void;
16
+ /**
17
+ * Read and clear the pending reaction (if any).
18
+ * Returns null if no reaction is pending.
19
+ */
20
+ export declare function readPendingReaction(): StoredReaction | null;
21
+ export declare function ensureDirs(): void;
22
+ export declare function readOffset(): number;
23
+ export declare function writeOffset(offset: number): void;
24
+ export interface StoredMessage {
25
+ update_id: number;
26
+ message: {
27
+ message_id: number;
28
+ chat_id: number;
29
+ text?: string;
30
+ caption?: string;
31
+ message_thread_id?: number;
32
+ photo?: Array<{
33
+ file_id: string;
34
+ width: number;
35
+ height: number;
36
+ }>;
37
+ document?: {
38
+ file_id: string;
39
+ file_name?: string;
40
+ mime_type?: string;
41
+ };
42
+ voice?: {
43
+ file_id: string;
44
+ duration: number;
45
+ mime_type?: string;
46
+ };
47
+ video_note?: {
48
+ file_id: string;
49
+ length: number;
50
+ duration: number;
51
+ };
52
+ sticker?: {
53
+ file_id: string;
54
+ emoji?: string;
55
+ set_name?: string;
56
+ };
57
+ animation?: {
58
+ file_id: string;
59
+ duration?: number;
60
+ thumbnail?: {
61
+ file_id: string;
62
+ };
63
+ };
64
+ date: number;
65
+ };
66
+ }
67
+ /**
68
+ * Append a message to a thread's JSONL file.
69
+ * Throws on write failure so the caller can track which messages were persisted.
70
+ */
71
+ export declare function appendToThread(threadId: number | "general", msg: StoredMessage): void;
72
+ /**
73
+ * Read and clear all pending messages for a thread.
74
+ * Uses rename for atomic read-and-clear to prevent message loss.
75
+ */
76
+ export declare function readThreadMessages(threadId: number | undefined): StoredMessage[];
77
+ /**
78
+ * Non-destructive peek at pending messages for a thread.
79
+ * Unlike readThreadMessages, this does NOT consume the messages — they remain
80
+ * in the thread file for the next readThreadMessages call.
81
+ */
82
+ export declare function peekThreadMessages(threadId: number | undefined): StoredMessage[];
83
+ //# sourceMappingURL=broker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.d.ts","sourceRoot":"","sources":["../../../src/services/dispatcher/broker.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAqBH,eAAO,MAAM,WAAW,QAA2B,CAAC;AAMpD,MAAM,WAAW,cAAc;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CAChB;AAID,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,cAAc,GAAG,IAAI,CAIhE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,cAAc,GAAG,IAAI,CAQ3D;AAMD,wBAAgB,UAAU,IAAI,IAAI,CAGjC;AAiCD,wBAAgB,UAAU,IAAI,MAAM,CAQnC;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAQhD;AAMD,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE;QACL,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,KAAK,CAAC,EAAE,KAAK,CAAC;YACV,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,EAAE,MAAM,CAAC;YACd,MAAM,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE;YACP,OAAO,EAAE,MAAM,CAAC;YAChB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,SAAS,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;QACF,KAAK,CAAC,EAAE;YACJ,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,EAAE,MAAM,CAAC;YACjB,SAAS,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;QACF,UAAU,CAAC,EAAE;YACT,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,EAAE,MAAM,CAAC;YACf,QAAQ,EAAE,MAAM,CAAC;SACpB,CAAC;QACF,OAAO,CAAC,EAAE;YACN,OAAO,EAAE,MAAM,CAAC;YAChB,KAAK,CAAC,EAAE,MAAM,CAAC;YACf,QAAQ,CAAC,EAAE,MAAM,CAAC;SACrB,CAAC;QACF,SAAS,CAAC,EAAE;YACR,OAAO,EAAE,MAAM,CAAC;YAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;YAClB,SAAS,CAAC,EAAE;gBACR,OAAO,EAAE,MAAM,CAAC;aACnB,CAAC;SACL,CAAC;QACF,IAAI,EAAE,MAAM,CAAC;KAChB,CAAC;CACL;AAqBD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,IAAI,CAIrF;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE,CAmBhF;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,aAAa,EAAE,CAShF"}
@@ -0,0 +1,175 @@
1
+ /**
2
+ * File-based per-thread message broker.
3
+ *
4
+ * Incoming Telegram messages are written by the poller to per-thread JSONL
5
+ * files under ~/.remote-copilot-mcp/threads/<threadId>.jsonl.
6
+ * Each MCP instance reads from its own thread file — contention-free.
7
+ */
8
+ import { mkdirSync, readFileSync, readdirSync, renameSync, unlinkSync, writeFileSync, } from "fs";
9
+ import { homedir } from "os";
10
+ import { join } from "path";
11
+ import { log } from "../../logger.js";
12
+ import { isPidAlive } from "./lock.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Paths
15
+ // ---------------------------------------------------------------------------
16
+ const BASE_DIR = join(homedir(), ".remote-copilot-mcp");
17
+ const THREADS_DIR = join(BASE_DIR, "threads");
18
+ export const OFFSET_FILE = join(BASE_DIR, "offset");
19
+ const REACTION_FILE = join(BASE_DIR, "pending_reaction.json");
20
+ export function writeReactionFile(reaction) {
21
+ try {
22
+ writeFileSync(REACTION_FILE, JSON.stringify(reaction), "utf8");
23
+ }
24
+ catch { /* non-fatal */ }
25
+ }
26
+ /**
27
+ * Read and clear the pending reaction (if any).
28
+ * Returns null if no reaction is pending.
29
+ */
30
+ export function readPendingReaction() {
31
+ try {
32
+ const raw = readFileSync(REACTION_FILE, "utf8");
33
+ unlinkSync(REACTION_FILE);
34
+ return JSON.parse(raw);
35
+ }
36
+ catch {
37
+ return null;
38
+ }
39
+ }
40
+ // ---------------------------------------------------------------------------
41
+ // Directory setup & orphan recovery
42
+ // ---------------------------------------------------------------------------
43
+ export function ensureDirs() {
44
+ mkdirSync(THREADS_DIR, { recursive: true });
45
+ recoverOrphanedReads();
46
+ }
47
+ /**
48
+ * On startup, scan for orphaned `.reading.PID` files left by hard-crashed
49
+ * processes and append their content back to the original thread file
50
+ * so those messages aren't permanently lost.
51
+ */
52
+ function recoverOrphanedReads() {
53
+ try {
54
+ const files = readdirSync(THREADS_DIR);
55
+ for (const f of files) {
56
+ const match = f.match(/^(.+)\.reading\.(\d+)$/);
57
+ if (match) {
58
+ const pid = Number.parseInt(match[2], 10);
59
+ if (!isPidAlive(pid)) {
60
+ const orphan = join(THREADS_DIR, f);
61
+ const original = join(THREADS_DIR, match[1]);
62
+ try {
63
+ const content = readFileSync(orphan, "utf8");
64
+ writeFileSync(original, content, { flag: "a", encoding: "utf8" });
65
+ unlinkSync(orphan);
66
+ log.info(`[dispatcher] Recovered orphaned file: ${f}`);
67
+ }
68
+ catch { /* best effort */ }
69
+ }
70
+ }
71
+ }
72
+ }
73
+ catch { /* non-fatal */ }
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Offset persistence (shared across all instances)
77
+ // ---------------------------------------------------------------------------
78
+ export function readOffset() {
79
+ try {
80
+ const raw = readFileSync(OFFSET_FILE, "utf8").trim();
81
+ const n = Number(raw);
82
+ return Number.isFinite(n) ? n : 0;
83
+ }
84
+ catch {
85
+ return 0;
86
+ }
87
+ }
88
+ export function writeOffset(offset) {
89
+ try {
90
+ const tmp = OFFSET_FILE + `.tmp.${process.pid}`;
91
+ writeFileSync(tmp, String(offset), "utf8");
92
+ renameSync(tmp, OFFSET_FILE); // atomic replace
93
+ }
94
+ catch {
95
+ // Non-fatal.
96
+ }
97
+ }
98
+ function threadFilePath(threadId) {
99
+ return join(THREADS_DIR, `${threadId}.jsonl`);
100
+ }
101
+ /** Parse JSONL content into StoredMessage[], skipping corrupt lines. */
102
+ function parseJsonlLines(raw, label) {
103
+ if (!raw)
104
+ return [];
105
+ const results = [];
106
+ for (const line of raw.split("\n")) {
107
+ if (!line.trim())
108
+ continue;
109
+ try {
110
+ results.push(JSON.parse(line));
111
+ }
112
+ catch {
113
+ log.warn(`[dispatcher] Skipping corrupt JSONL line in ${label}`);
114
+ }
115
+ }
116
+ return results;
117
+ }
118
+ /**
119
+ * Append a message to a thread's JSONL file.
120
+ * Throws on write failure so the caller can track which messages were persisted.
121
+ */
122
+ export function appendToThread(threadId, msg) {
123
+ const file = threadFilePath(threadId);
124
+ const line = JSON.stringify(msg) + "\n";
125
+ writeFileSync(file, line, { flag: "a", encoding: "utf8" });
126
+ }
127
+ /**
128
+ * Read and clear all pending messages for a thread.
129
+ * Uses rename for atomic read-and-clear to prevent message loss.
130
+ */
131
+ export function readThreadMessages(threadId) {
132
+ const key = threadId ?? "general";
133
+ const file = threadFilePath(key);
134
+ const tmp = file + ".reading." + process.pid;
135
+ try {
136
+ renameSync(file, tmp);
137
+ }
138
+ catch {
139
+ return [];
140
+ }
141
+ try {
142
+ const raw = readFileSync(tmp, "utf8").trim();
143
+ const messages = parseJsonlLines(raw, `${key}.jsonl`);
144
+ try {
145
+ unlinkSync(tmp);
146
+ }
147
+ catch { /* already gone */ }
148
+ return messages;
149
+ }
150
+ catch {
151
+ // Read failed — restore the original file to prevent message loss
152
+ try {
153
+ renameSync(tmp, file);
154
+ }
155
+ catch { /* best effort */ }
156
+ return [];
157
+ }
158
+ }
159
+ /**
160
+ * Non-destructive peek at pending messages for a thread.
161
+ * Unlike readThreadMessages, this does NOT consume the messages — they remain
162
+ * in the thread file for the next readThreadMessages call.
163
+ */
164
+ export function peekThreadMessages(threadId) {
165
+ const key = threadId ?? "general";
166
+ const file = threadFilePath(key);
167
+ try {
168
+ const raw = readFileSync(file, "utf8").trim();
169
+ return parseJsonlLines(raw, `${key}.jsonl`);
170
+ }
171
+ catch {
172
+ return [];
173
+ }
174
+ }
175
+ //# sourceMappingURL=broker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/services/dispatcher/broker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Barrel re-export for the dispatcher subsystem.
3
+ */
4
+ export type { StoredReaction, StoredMessage } from "./broker.js";
5
+ export { readPendingReaction, readThreadMessages, peekThreadMessages } from "./broker.js";
6
+ export { startDispatcher } from "./poller.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/services/dispatcher/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAG1F,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Barrel re-export for the dispatcher subsystem.
3
+ */
4
+ export { readPendingReaction, readThreadMessages, peekThreadMessages } from "./broker.js";
5
+ // Poller — startup entry point
6
+ export { startDispatcher } from "./poller.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/services/dispatcher/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAE1F,+BAA+B;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * File-lock acquisition and management for the Telegram poller.
3
+ *
4
+ * Only one MCP instance may poll Telegram at a time. This module provides
5
+ * a file-system–based lock (with stale-lock detection via PID check) so
6
+ * multiple instances can coordinate without conflicts.
7
+ */
8
+ /** Check whether a PID is still alive. */
9
+ export declare function isPidAlive(pid: number): boolean;
10
+ export declare function readLock(): {
11
+ pid: number;
12
+ ts: number;
13
+ } | null;
14
+ /**
15
+ * Write (refresh) the lock file, but only if we still own it.
16
+ * Prevents a TOCTOU race where two pollers run simultaneously:
17
+ * if another process stole the lock between our check and write,
18
+ * we must not overwrite their lock.
19
+ *
20
+ * Returns true if the lock was refreshed, false if we lost ownership.
21
+ */
22
+ export declare function refreshLock(): boolean;
23
+ export declare function removeLock(): void;
24
+ export declare function tryAcquireLock(): boolean;
25
+ //# sourceMappingURL=lock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lock.d.ts","sourceRoot":"","sources":["../../../src/services/dispatcher/lock.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AA+BH,0CAA0C;AAC1C,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/C;AAMD,wBAAgB,QAAQ,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAW7D;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,IAAI,OAAO,CAWrC;AAED,wBAAgB,UAAU,IAAI,IAAI,CAMjC;AAMD,wBAAgB,cAAc,IAAI,OAAO,CA0BxC"}