sensorium-mcp 2.15.3 → 2.16.1

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 (37) hide show
  1. package/dist/http-server.d.ts +16 -0
  2. package/dist/http-server.d.ts.map +1 -0
  3. package/dist/http-server.js +248 -0
  4. package/dist/http-server.js.map +1 -0
  5. package/dist/index.js +133 -1988
  6. package/dist/index.js.map +1 -1
  7. package/dist/response-builders.d.ts +34 -0
  8. package/dist/response-builders.d.ts.map +1 -0
  9. package/dist/response-builders.js +114 -0
  10. package/dist/response-builders.js.map +1 -0
  11. package/dist/stdio-server.d.ts +8 -0
  12. package/dist/stdio-server.d.ts.map +1 -0
  13. package/dist/stdio-server.js +23 -0
  14. package/dist/stdio-server.js.map +1 -0
  15. package/dist/tools/memory-tools.d.ts +36 -0
  16. package/dist/tools/memory-tools.d.ts.map +1 -0
  17. package/dist/tools/memory-tools.js +352 -0
  18. package/dist/tools/memory-tools.js.map +1 -0
  19. package/dist/tools/session-tools.d.ts +46 -0
  20. package/dist/tools/session-tools.d.ts.map +1 -0
  21. package/dist/tools/session-tools.js +261 -0
  22. package/dist/tools/session-tools.js.map +1 -0
  23. package/dist/tools/start-session-tool.d.ts +43 -0
  24. package/dist/tools/start-session-tool.d.ts.map +1 -0
  25. package/dist/tools/start-session-tool.js +188 -0
  26. package/dist/tools/start-session-tool.js.map +1 -0
  27. package/dist/tools/utility-tools.d.ts +34 -0
  28. package/dist/tools/utility-tools.d.ts.map +1 -0
  29. package/dist/tools/utility-tools.js +256 -0
  30. package/dist/tools/utility-tools.js.map +1 -0
  31. package/dist/tools/wait-tool.d.ts +69 -0
  32. package/dist/tools/wait-tool.d.ts.map +1 -0
  33. package/dist/tools/wait-tool.js +702 -0
  34. package/dist/tools/wait-tool.js.map +1 -0
  35. package/dist/types.d.ts +2 -0
  36. package/dist/types.d.ts.map +1 -1
  37. package/package.json +1 -1
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Utility tool handlers extracted from index.ts.
3
+ *
4
+ * Handles: send_file, send_voice, schedule_wake_up, get_version, get_usage_stats
5
+ */
6
+ import { readFile } from "fs/promises";
7
+ import { basename } from "node:path";
8
+ import { checkMaintenanceFlag } from "../config.js";
9
+ import { textToSpeech, TTS_VOICES } from "../openai.js";
10
+ import { rateLimiter } from "../rate-limiter.js";
11
+ import { addSchedule, generateTaskId, listSchedules, removeSchedule } from "../scheduler.js";
12
+ import { errorMessage, IMAGE_EXTENSIONS, OPENAI_TTS_MAX_CHARS } from "../utils.js";
13
+ // ---------------------------------------------------------------------------
14
+ // Dispatcher
15
+ // ---------------------------------------------------------------------------
16
+ export async function handleUtilityTool(name, args, ctx) {
17
+ switch (name) {
18
+ case "send_file":
19
+ return handleSendFile(args, ctx);
20
+ case "send_voice":
21
+ return handleSendVoice(args, ctx);
22
+ case "schedule_wake_up":
23
+ return handleScheduleWakeUp(args, ctx);
24
+ case "get_version":
25
+ return handleGetVersion(ctx);
26
+ case "get_usage_stats":
27
+ return handleGetUsageStats(args, ctx);
28
+ default:
29
+ return ctx.errorResult(`Unknown utility tool: ${name}`);
30
+ }
31
+ }
32
+ // ---------------------------------------------------------------------------
33
+ // send_file
34
+ // ---------------------------------------------------------------------------
35
+ async function handleSendFile(args, ctx) {
36
+ const { resolveThreadId, getShortReminder, errorResult, telegram, config } = ctx;
37
+ const effectiveThreadId = resolveThreadId(args);
38
+ if (effectiveThreadId === undefined) {
39
+ return errorResult("Error: No active session. Call start_session first, then pass the returned threadId.");
40
+ }
41
+ const filePath = typeof args.filePath === "string" ? args.filePath.trim() : "";
42
+ const base64Data = typeof args.base64 === "string" ? args.base64 : "";
43
+ const caption = typeof args.caption === "string" ? args.caption : undefined;
44
+ if (!filePath && !base64Data) {
45
+ return errorResult("Error: either 'filePath' or 'base64' argument is required for send_file.");
46
+ }
47
+ try {
48
+ let buffer;
49
+ let filename;
50
+ if (filePath) {
51
+ // Read directly from disk — fast, no LLM context overhead.
52
+ buffer = await readFile(filePath);
53
+ filename = typeof args.filename === "string" && args.filename.trim()
54
+ ? args.filename.trim()
55
+ : basename(filePath);
56
+ }
57
+ else {
58
+ buffer = Buffer.from(base64Data, "base64");
59
+ filename = typeof args.filename === "string" && args.filename.trim()
60
+ ? args.filename.trim()
61
+ : "file";
62
+ }
63
+ const ext = filename.split(".").pop()?.toLowerCase() ?? "";
64
+ if (IMAGE_EXTENSIONS.has(ext)) {
65
+ await telegram.sendPhoto(config.TELEGRAM_CHAT_ID, buffer, filename, caption, effectiveThreadId);
66
+ }
67
+ else {
68
+ await telegram.sendDocument(config.TELEGRAM_CHAT_ID, buffer, filename, caption, effectiveThreadId);
69
+ }
70
+ return {
71
+ content: [
72
+ {
73
+ type: "text",
74
+ text: `File "${filename}" sent to Telegram successfully.` + getShortReminder(effectiveThreadId),
75
+ },
76
+ ],
77
+ };
78
+ }
79
+ catch (err) {
80
+ process.stderr.write(`Failed to send file via Telegram: ${errorMessage(err)}\n`);
81
+ return errorResult(`Error: Failed to send file to Telegram: ${errorMessage(err)}`);
82
+ }
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // send_voice
86
+ // ---------------------------------------------------------------------------
87
+ async function handleSendVoice(args, ctx) {
88
+ const { resolveThreadId, getShortReminder, errorResult, telegram, config } = ctx;
89
+ const effectiveThreadId = resolveThreadId(args);
90
+ if (effectiveThreadId === undefined) {
91
+ return errorResult("Error: No active session. Call start_session first, then pass the returned threadId.");
92
+ }
93
+ const text = typeof args.text === "string" ? args.text.trim() : "";
94
+ const validVoices = TTS_VOICES;
95
+ const voice = typeof args.voice === "string" && validVoices.includes(args.voice)
96
+ ? args.voice
97
+ : "nova";
98
+ if (!text) {
99
+ return errorResult("Error: 'text' argument is required for send_voice.");
100
+ }
101
+ if (!config.OPENAI_API_KEY) {
102
+ return errorResult("Error: OPENAI_API_KEY is not set. Cannot generate voice.");
103
+ }
104
+ if (text.length > OPENAI_TTS_MAX_CHARS) {
105
+ return errorResult(`Error: text is ${text.length} characters — exceeds OpenAI TTS limit of ${OPENAI_TTS_MAX_CHARS}.`);
106
+ }
107
+ try {
108
+ const audioBuffer = await textToSpeech(text, config.OPENAI_API_KEY, voice);
109
+ await telegram.sendVoice(config.TELEGRAM_CHAT_ID, audioBuffer, effectiveThreadId);
110
+ return {
111
+ content: [
112
+ {
113
+ type: "text",
114
+ text: `Voice message sent to Telegram successfully.` + getShortReminder(effectiveThreadId),
115
+ },
116
+ ],
117
+ };
118
+ }
119
+ catch (err) {
120
+ process.stderr.write(`Failed to send voice via Telegram: ${errorMessage(err)}\n`);
121
+ return errorResult(`Error: Failed to send voice message: ${errorMessage(err)}`);
122
+ }
123
+ }
124
+ // ---------------------------------------------------------------------------
125
+ // schedule_wake_up
126
+ // ---------------------------------------------------------------------------
127
+ async function handleScheduleWakeUp(args, ctx) {
128
+ const { resolveThreadId, getShortReminder, errorResult } = ctx;
129
+ const effectiveThreadId = resolveThreadId(args);
130
+ if (effectiveThreadId === undefined) {
131
+ return errorResult("Error: No active session. Call start_session first.");
132
+ }
133
+ const action = typeof args.action === "string" ? args.action : "add";
134
+ // --- List ---
135
+ if (action === "list") {
136
+ const tasks = listSchedules(effectiveThreadId);
137
+ if (tasks.length === 0) {
138
+ return {
139
+ content: [{
140
+ type: "text",
141
+ text: "No scheduled tasks for this thread." + getShortReminder(effectiveThreadId),
142
+ }],
143
+ };
144
+ }
145
+ const lines = tasks.map(t => {
146
+ const trigger = t.cron ? `cron: ${t.cron}` : t.runAt ? `at: ${t.runAt}` : `idle: ${t.afterIdleMinutes}min`;
147
+ const lastFired = t.lastFiredAt ? ` (last: ${t.lastFiredAt})` : "";
148
+ return `- **${t.label}** [${t.id}] — ${trigger}${lastFired}\n Prompt: ${t.prompt.slice(0, 100)}${t.prompt.length > 100 ? "…" : ""}`;
149
+ });
150
+ return {
151
+ content: [{
152
+ type: "text",
153
+ text: `**Scheduled tasks (${tasks.length}):**\n\n${lines.join("\n\n")}` + getShortReminder(effectiveThreadId),
154
+ }],
155
+ };
156
+ }
157
+ // --- Remove ---
158
+ if (action === "remove") {
159
+ const taskId = typeof args.taskId === "string" ? args.taskId : "";
160
+ if (!taskId) {
161
+ return errorResult("Error: 'taskId' is required for remove action. Use action: 'list' to see task IDs.");
162
+ }
163
+ const removed = removeSchedule(effectiveThreadId, taskId);
164
+ return {
165
+ content: [{
166
+ type: "text",
167
+ text: removed
168
+ ? `Task ${taskId} removed.` + getShortReminder(effectiveThreadId)
169
+ : `Task ${taskId} not found.` + getShortReminder(effectiveThreadId),
170
+ }],
171
+ };
172
+ }
173
+ // --- Add ---
174
+ const label = typeof args.label === "string" ? args.label : "unnamed task";
175
+ const prompt = typeof args.prompt === "string" ? args.prompt : "";
176
+ if (!prompt) {
177
+ return errorResult("Error: 'prompt' is required — this is the text that will be injected when the task fires.");
178
+ }
179
+ const runAt = typeof args.runAt === "string" ? args.runAt : undefined;
180
+ const cron = typeof args.cron === "string" ? args.cron : undefined;
181
+ const afterIdleMinutes = typeof args.afterIdleMinutes === "number" ? args.afterIdleMinutes : undefined;
182
+ if (cron && cron.trim().split(/\s+/).length !== 5) {
183
+ return errorResult("Error: Invalid cron expression. Must be exactly 5 space-separated fields: minute hour day-of-month month day-of-week. " +
184
+ "Example: '0 9 * * *' (daily at 9am). Only *, numbers, and comma-separated lists are supported.");
185
+ }
186
+ if (!runAt && !cron && afterIdleMinutes == null) {
187
+ return errorResult("Error: Specify at least one trigger: 'runAt' (ISO timestamp), 'cron' (5-field), or 'afterIdleMinutes' (number).");
188
+ }
189
+ const task = {
190
+ id: generateTaskId(),
191
+ threadId: effectiveThreadId,
192
+ prompt,
193
+ label,
194
+ runAt,
195
+ cron,
196
+ afterIdleMinutes,
197
+ oneShot: runAt != null && !cron && afterIdleMinutes == null,
198
+ createdAt: new Date().toISOString(),
199
+ };
200
+ addSchedule(task);
201
+ const triggerDesc = cron
202
+ ? `recurring (cron: ${cron})`
203
+ : runAt
204
+ ? `one-shot at ${runAt}`
205
+ : `after ${afterIdleMinutes}min of operator silence`;
206
+ return {
207
+ content: [{
208
+ type: "text",
209
+ text: `✅ Scheduled: **${label}** [${task.id}]\nTrigger: ${triggerDesc}\nPrompt: ${prompt}` +
210
+ getShortReminder(effectiveThreadId),
211
+ }],
212
+ };
213
+ }
214
+ // ---------------------------------------------------------------------------
215
+ // get_version
216
+ // ---------------------------------------------------------------------------
217
+ function handleGetVersion(ctx) {
218
+ const maintenance = checkMaintenanceFlag();
219
+ return {
220
+ content: [{
221
+ type: "text",
222
+ text: `Server version: ${ctx.config.PKG_VERSION}` +
223
+ (maintenance ? `\n⚠️ Update pending: ${maintenance}` : ""),
224
+ }],
225
+ };
226
+ }
227
+ // ---------------------------------------------------------------------------
228
+ // get_usage_stats
229
+ // ---------------------------------------------------------------------------
230
+ function handleGetUsageStats(args, ctx) {
231
+ const threadId = ctx.resolveThreadId(args);
232
+ const stats = rateLimiter.getStats();
233
+ const lines = [
234
+ `## API Usage Stats`,
235
+ `Active sessions sharing resources: ${stats.activeSessions}`,
236
+ `Total API calls (last hour): ${stats.totalCallsLastHour}`,
237
+ ``,
238
+ ];
239
+ for (const svc of stats.services) {
240
+ const bar = svc.usagePercent > 80 ? "🔴" : svc.usagePercent > 50 ? "🟡" : "🟢";
241
+ lines.push(`### ${bar} ${svc.description} (${svc.service})`);
242
+ lines.push(`- Window usage: ${svc.callsInWindow}/${svc.maxPerWindow} (${svc.usagePercent}%)`);
243
+ lines.push(`- Burst tokens: ${svc.availableTokens}/${svc.burstCapacity}`);
244
+ if (svc.sessionBreakdown.length > 0) {
245
+ lines.push(`- Per-session:`);
246
+ for (const s of svc.sessionBreakdown) {
247
+ lines.push(` - Thread ${s.threadId ?? "?"}: ${s.calls} calls`);
248
+ }
249
+ }
250
+ lines.push(``);
251
+ }
252
+ return {
253
+ content: [{ type: "text", text: lines.join("\n") + ctx.getShortReminder(threadId) }],
254
+ };
255
+ }
256
+ //# sourceMappingURL=utility-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utility-tools.js","sourceRoot":"","sources":["../../src/tools/utility-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ /**
2
+ * remote_copilot_wait_for_instructions tool handler extracted from index.ts.
3
+ *
4
+ * This is the core long-polling loop that:
5
+ * - Polls the dispatcher for new operator messages every 2s
6
+ * - Processes all media types: text, photo, document, voice, video_note
7
+ * - Runs voice analysis (transcription + emotion via VANPY)
8
+ * - Auto-saves episodes to memory
9
+ * - Injects relevant memory context via GPT-4o-mini smart filter
10
+ * - Checks scheduled tasks during idle polling
11
+ * - Triggers auto-consolidation (idle, episode-count, time-based)
12
+ * - Sends SSE keepalive pings every 30s
13
+ * - Detects maintenance flags and instructs agent to wait externally
14
+ * - Activates the Dispatcher drive after extended operator silence
15
+ */
16
+ import { type initMemoryDb } from "../memory.js";
17
+ import type { TelegramClient } from "../telegram.js";
18
+ import type { AppConfig } from "../types.js";
19
+ type ContentBlock = {
20
+ type: string;
21
+ text: string;
22
+ } | {
23
+ type: "image";
24
+ data: string;
25
+ mimeType: string;
26
+ };
27
+ type ToolResult = {
28
+ content: Array<ContentBlock>;
29
+ isError?: boolean;
30
+ };
31
+ export interface WaitToolContext {
32
+ /** Mutable per-session state — the handler reads and writes directly. */
33
+ state: {
34
+ currentThreadId: number | undefined;
35
+ sessionStartedAt: number;
36
+ waitCallCount: number;
37
+ lastToolCallAt: number;
38
+ deadSessionAlerted: boolean;
39
+ toolCallsSinceLastDelivery: number;
40
+ lastOperatorMessageAt: number;
41
+ lastConsolidationAt: number;
42
+ previewedUpdateIds: Set<number>;
43
+ };
44
+ addPreviewedId: (id: number) => void;
45
+ generateDmnReflection: (threadId: number) => string;
46
+ resolveThreadId: (args: Record<string, unknown> | undefined) => number | undefined;
47
+ telegram: TelegramClient;
48
+ telegramChatId: string;
49
+ getMemoryDb: () => ReturnType<typeof initMemoryDb>;
50
+ config: AppConfig;
51
+ errorResult: (msg: string) => {
52
+ content: Array<{
53
+ type: string;
54
+ text: string;
55
+ }>;
56
+ isError: true;
57
+ };
58
+ }
59
+ export interface WaitToolExtra {
60
+ sendNotification: (notification: {
61
+ method: string;
62
+ params: Record<string, unknown>;
63
+ }) => Promise<void>;
64
+ signal: AbortSignal;
65
+ requestId?: string | number;
66
+ }
67
+ export declare function handleWaitForInstructions(args: Record<string, unknown>, ctx: WaitToolContext, extra: WaitToolExtra): Promise<ToolResult>;
68
+ export {};
69
+ //# sourceMappingURL=wait-tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-tool.d.ts","sourceRoot":"","sources":["../../src/tools/wait-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,OAAO,EAOL,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AAUtB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC;AACvG,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,yEAAyE;IACzE,KAAK,EAAE;QACL,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;QACpC,gBAAgB,EAAE,MAAM,CAAC;QACzB,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,CAAC;QACvB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,0BAA0B,EAAE,MAAM,CAAC;QACnC,qBAAqB,EAAE,MAAM,CAAC;QAC9B,mBAAmB,EAAE,MAAM,CAAC;QAC5B,kBAAkB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;KACjC,CAAC;IACF,cAAc,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,qBAAqB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IACpD,eAAe,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,KAAK,MAAM,GAAG,SAAS,CAAC;IAGnF,QAAQ,EAAE,cAAc,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACnD,MAAM,EAAE,SAAS,CAAC;IAGlB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK;QAAE,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAAC,OAAO,EAAE,IAAI,CAAA;KAAE,CAAC;CACjG;AAED,MAAM,WAAW,aAAa;IAC5B,gBAAgB,EAAE,CAAC,YAAY,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACvG,MAAM,EAAE,WAAW,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAC7B;AAMD,wBAAsB,yBAAyB,CAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,GAAG,EAAE,eAAe,EACpB,KAAK,EAAE,aAAa,GACnB,OAAO,CAAC,UAAU,CAAC,CAqsBrB"}