sensorium-mcp 2.7.0

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scheduler.js","sourceRoot":"","sources":["../src/scheduler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * Telegram Bot API client using native fetch.
3
+ * No third-party HTTP client required.
4
+ */
5
+ export interface TelegramMessage {
6
+ message_id: number;
7
+ chat: {
8
+ id: number;
9
+ };
10
+ text?: string;
11
+ caption?: string;
12
+ date: number;
13
+ message_thread_id?: number;
14
+ photo?: PhotoSize[];
15
+ document?: TelegramDocument;
16
+ voice?: TelegramVoice;
17
+ video_note?: TelegramVideoNote;
18
+ }
19
+ export interface PhotoSize {
20
+ file_id: string;
21
+ file_unique_id: string;
22
+ width: number;
23
+ height: number;
24
+ file_size?: number;
25
+ }
26
+ export interface TelegramDocument {
27
+ file_id: string;
28
+ file_unique_id: string;
29
+ file_name?: string;
30
+ mime_type?: string;
31
+ file_size?: number;
32
+ }
33
+ export interface TelegramVoice {
34
+ file_id: string;
35
+ file_unique_id: string;
36
+ duration: number;
37
+ mime_type?: string;
38
+ file_size?: number;
39
+ }
40
+ export interface TelegramVideoNote {
41
+ file_id: string;
42
+ file_unique_id: string;
43
+ length: number;
44
+ duration: number;
45
+ thumbnail?: PhotoSize;
46
+ file_size?: number;
47
+ }
48
+ export interface TelegramUpdate {
49
+ update_id: number;
50
+ message?: TelegramMessage;
51
+ }
52
+ export interface ForumTopic {
53
+ message_thread_id: number;
54
+ name: string;
55
+ }
56
+ interface TelegramFile {
57
+ file_id: string;
58
+ file_path: string;
59
+ }
60
+ export declare class TelegramClient {
61
+ private readonly token;
62
+ private readonly baseUrl;
63
+ constructor(token: string);
64
+ /** Safely parse a JSON response, returning undefined on failure. */
65
+ private tryParseJson;
66
+ /**
67
+ * Send a media file via multipart/form-data.
68
+ * Shared implementation for sendDocument, sendPhoto, and sendVoice.
69
+ */
70
+ private sendMedia;
71
+ /**
72
+ * Long-poll for updates.
73
+ * @param offset Only return updates with update_id >= offset.
74
+ * @param timeout Long-poll server-side timeout in seconds (max 50 recommended).
75
+ */
76
+ getUpdates(offset: number, timeout: number, signal?: AbortSignal): Promise<TelegramUpdate[]>;
77
+ /**
78
+ * Create a topic in a forum supergroup.
79
+ * The bot must be an admin with can_manage_topics right.
80
+ */
81
+ createForumTopic(chatId: string, name: string): Promise<ForumTopic>;
82
+ /**
83
+ * Send a text message to a chat, optionally scoped to a forum topic thread.
84
+ */
85
+ sendMessage(chatId: string, text: string, parseMode?: "MarkdownV2" | "Markdown" | "HTML", threadId?: number): Promise<void>;
86
+ /**
87
+ * Get metadata for a file stored on Telegram servers.
88
+ */
89
+ getFile(fileId: string): Promise<TelegramFile>;
90
+ /**
91
+ * Download a file from Telegram by file_id and return it as a Buffer.
92
+ */
93
+ downloadFileAsBuffer(fileId: string): Promise<{
94
+ buffer: Buffer;
95
+ filePath: string;
96
+ }>;
97
+ /**
98
+ * Download a file from Telegram by file_id and return it as base64 with MIME type.
99
+ */
100
+ downloadFileAsBase64(fileId: string): Promise<{
101
+ base64: string;
102
+ mimeType: string;
103
+ }>;
104
+ /** Send a document (file) to a chat. */
105
+ sendDocument(chatId: string, fileBuffer: Buffer, filename: string, caption?: string, threadId?: number): Promise<void>;
106
+ /** Send a photo to a chat. */
107
+ sendPhoto(chatId: string, imageBuffer: Buffer, filename: string, caption?: string, threadId?: number): Promise<void>;
108
+ /** Send a voice message (OGG Opus) to a chat. */
109
+ sendVoice(chatId: string, audioBuffer: Buffer, threadId?: number): Promise<void>;
110
+ /**
111
+ * Set an emoji reaction on a message ("seen" indicator).
112
+ * Non-throwing: silently ignores errors since reactions are non-critical UX.
113
+ * Logs only the first failure to avoid flooding stderr in busy sessions.
114
+ */
115
+ private reactionWarned;
116
+ setMessageReaction(chatId: string, messageId: number, emoji?: string): Promise<void>;
117
+ }
118
+ export {};
119
+ //# sourceMappingURL=telegram.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.d.ts","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAcD,MAAM,WAAW,UAAU;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,IAAI,EAAE,MAAM,CAAC;CACd;AAQD,UAAU,YAAY;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAgCD,qBAAa,cAAc;IAGb,OAAO,CAAC,QAAQ,CAAC,KAAK;IAFlC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAEJ,KAAK,EAAE,MAAM;IAM1C,oEAAoE;YACtD,YAAY;IAQ1B;;;OAGG;YACW,SAAS;IA2BvB;;;;OAIG;IACG,UAAU,CACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,EAAE,CAAC;IAyD5B;;;OAGG;IACG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAezE;;OAEG;IACG,WAAW,CACf,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,SAAS,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,MAAM,EAC9C,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IA4BhB;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAepD;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAahD;;OAEG;IACG,oBAAoB,CACxB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAShD,wCAAwC;IAClC,YAAY,CAChB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAKhB,8BAA8B;IACxB,SAAS,CACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAKhB,iDAAiD;IAC3C,SAAS,CACb,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC;IAKhB;;;;OAIG;IACH,OAAO,CAAC,cAAc,CAAS;IAEzB,kBAAkB,CACtB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,KAAK,GAAE,MAAuB,GAC7B,OAAO,CAAC,IAAI,CAAC;CA4BjB"}
@@ -0,0 +1,249 @@
1
+ /**
2
+ * Telegram Bot API client using native fetch.
3
+ * No third-party HTTP client required.
4
+ */
5
+ // ---------------------------------------------------------------------------
6
+ // Extension → MIME type mapping (used by downloadFileAsBase64)
7
+ // ---------------------------------------------------------------------------
8
+ const MIME_MAP = {
9
+ jpg: "image/jpeg",
10
+ jpeg: "image/jpeg",
11
+ png: "image/png",
12
+ gif: "image/gif",
13
+ webp: "image/webp",
14
+ bmp: "image/bmp",
15
+ pdf: "application/pdf",
16
+ txt: "text/plain",
17
+ json: "application/json",
18
+ xml: "application/xml",
19
+ csv: "text/csv",
20
+ zip: "application/zip",
21
+ svg: "image/svg+xml",
22
+ };
23
+ // ---------------------------------------------------------------------------
24
+ // Client
25
+ // ---------------------------------------------------------------------------
26
+ export class TelegramClient {
27
+ token;
28
+ baseUrl;
29
+ constructor(token) {
30
+ this.token = token;
31
+ this.baseUrl = `https://api.telegram.org/bot${token}`;
32
+ }
33
+ // ── Private helpers ─────────────────────────────────────────────────────
34
+ /** Safely parse a JSON response, returning undefined on failure. */
35
+ async tryParseJson(response) {
36
+ try {
37
+ return (await response.json());
38
+ }
39
+ catch {
40
+ return undefined;
41
+ }
42
+ }
43
+ /**
44
+ * Send a media file via multipart/form-data.
45
+ * Shared implementation for sendDocument, sendPhoto, and sendVoice.
46
+ */
47
+ async sendMedia(method, chatId, fieldName, blob, filename, options) {
48
+ const url = `${this.baseUrl}/${method}`;
49
+ const formData = new FormData();
50
+ formData.append("chat_id", chatId);
51
+ formData.append(fieldName, blob, filename);
52
+ if (options?.caption)
53
+ formData.append("caption", options.caption);
54
+ if (options?.threadId !== undefined) {
55
+ formData.append("message_thread_id", String(options.threadId));
56
+ }
57
+ const response = await fetch(url, { method: "POST", body: formData });
58
+ const data = await this.tryParseJson(response);
59
+ if (!response.ok || data?.ok !== true) {
60
+ const description = data?.description ?? response.statusText;
61
+ throw new Error(`Telegram ${method} failed: ${response.status} ${description}`);
62
+ }
63
+ }
64
+ // ── Public API ──────────────────────────────────────────────────────────
65
+ /**
66
+ * Long-poll for updates.
67
+ * @param offset Only return updates with update_id >= offset.
68
+ * @param timeout Long-poll server-side timeout in seconds (max 50 recommended).
69
+ */
70
+ async getUpdates(offset, timeout, signal) {
71
+ const url = new URL(`${this.baseUrl}/getUpdates`);
72
+ url.searchParams.set("offset", String(offset));
73
+ url.searchParams.set("timeout", String(timeout));
74
+ url.searchParams.set("allowed_updates", JSON.stringify(["message"]));
75
+ const MAX_409_RETRIES = 12;
76
+ const RETRY_DELAY_MS = 5000;
77
+ for (let attempt = 0;; attempt++) {
78
+ const response = await fetch(url.toString(), signal ? { signal } : {});
79
+ const data = await this.tryParseJson(response);
80
+ if (data === undefined) {
81
+ process.stderr.write("Failed to parse Telegram getUpdates response.\n");
82
+ }
83
+ // 409 Conflict: another poller is running. Wait and retry.
84
+ if (response.status === 409 && attempt < MAX_409_RETRIES) {
85
+ process.stderr.write(`Telegram getUpdates 409 Conflict (attempt ${attempt + 1}/${MAX_409_RETRIES}) — ` +
86
+ `another bot instance is polling. Retrying in ${RETRY_DELAY_MS / 1000}s...\n`);
87
+ // Abort-aware delay: if an abort signal fires during the retry
88
+ // delay, throw immediately instead of sleeping the full 5s.
89
+ await new Promise((resolve, reject) => {
90
+ let onAbort;
91
+ const timer = setTimeout(() => {
92
+ if (signal && onAbort)
93
+ signal.removeEventListener("abort", onAbort);
94
+ resolve();
95
+ }, RETRY_DELAY_MS);
96
+ if (signal) {
97
+ if (signal.aborted) {
98
+ clearTimeout(timer);
99
+ reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
100
+ return;
101
+ }
102
+ onAbort = () => { clearTimeout(timer); reject(signal.reason ?? new DOMException("Aborted", "AbortError")); };
103
+ signal.addEventListener("abort", onAbort, { once: true });
104
+ }
105
+ });
106
+ continue;
107
+ }
108
+ if (!response.ok) {
109
+ const description = data?.description ?? response.statusText;
110
+ throw new Error(`Telegram getUpdates failed: ${response.status} ${description}`);
111
+ }
112
+ if (!data || !data.ok) {
113
+ throw new Error(`Telegram API error in getUpdates${data?.description ? `: ${data.description}` : ""}`);
114
+ }
115
+ return data.result;
116
+ }
117
+ }
118
+ /**
119
+ * Create a topic in a forum supergroup.
120
+ * The bot must be an admin with can_manage_topics right.
121
+ */
122
+ async createForumTopic(chatId, name) {
123
+ const url = `${this.baseUrl}/createForumTopic`;
124
+ const response = await fetch(url, {
125
+ method: "POST",
126
+ headers: { "Content-Type": "application/json" },
127
+ body: JSON.stringify({ chat_id: chatId, name }),
128
+ });
129
+ const data = await this.tryParseJson(response);
130
+ if (!response.ok || !data?.ok || !data.result) {
131
+ const description = data?.description ?? response.statusText;
132
+ throw new Error(`Telegram createForumTopic failed: ${description}`);
133
+ }
134
+ return data.result;
135
+ }
136
+ /**
137
+ * Send a text message to a chat, optionally scoped to a forum topic thread.
138
+ */
139
+ async sendMessage(chatId, text, parseMode, threadId) {
140
+ const url = `${this.baseUrl}/sendMessage`;
141
+ const body = { chat_id: chatId, text };
142
+ if (parseMode)
143
+ body.parse_mode = parseMode;
144
+ if (threadId !== undefined)
145
+ body.message_thread_id = threadId;
146
+ const response = await fetch(url, {
147
+ method: "POST",
148
+ headers: { "Content-Type": "application/json" },
149
+ body: JSON.stringify(body),
150
+ });
151
+ const data = await this.tryParseJson(response);
152
+ if (!response.ok) {
153
+ const description = data?.description ?? response.statusText;
154
+ throw new Error(`Telegram sendMessage failed: ${response.status} ${description}`);
155
+ }
156
+ if (data === undefined) {
157
+ throw new Error("Telegram sendMessage failed: response body could not be parsed as JSON");
158
+ }
159
+ if (data.ok !== true) {
160
+ const description = data.description ?? "Unknown Telegram API error";
161
+ throw new Error(`Telegram API error in sendMessage: ${description}`);
162
+ }
163
+ }
164
+ /**
165
+ * Get metadata for a file stored on Telegram servers.
166
+ */
167
+ async getFile(fileId) {
168
+ const url = `${this.baseUrl}/getFile`;
169
+ const response = await fetch(url, {
170
+ method: "POST",
171
+ headers: { "Content-Type": "application/json" },
172
+ body: JSON.stringify({ file_id: fileId }),
173
+ });
174
+ const data = await this.tryParseJson(response);
175
+ if (!response.ok || !data?.ok || !data.result) {
176
+ const description = data?.description ?? response.statusText;
177
+ throw new Error(`Telegram getFile failed: ${description}`);
178
+ }
179
+ return data.result;
180
+ }
181
+ /**
182
+ * Download a file from Telegram by file_id and return it as a Buffer.
183
+ */
184
+ async downloadFileAsBuffer(fileId) {
185
+ const file = await this.getFile(fileId);
186
+ const downloadUrl = `https://api.telegram.org/file/bot${this.token}/${file.file_path}`;
187
+ const response = await fetch(downloadUrl);
188
+ if (!response.ok) {
189
+ throw new Error(`Failed to download Telegram file: ${response.status} ${response.statusText}`);
190
+ }
191
+ const buffer = Buffer.from(await response.arrayBuffer());
192
+ return { buffer, filePath: file.file_path };
193
+ }
194
+ /**
195
+ * Download a file from Telegram by file_id and return it as base64 with MIME type.
196
+ */
197
+ async downloadFileAsBase64(fileId) {
198
+ const { buffer, filePath } = await this.downloadFileAsBuffer(fileId);
199
+ const ext = filePath.split(".").pop()?.toLowerCase() ?? "";
200
+ return {
201
+ base64: buffer.toString("base64"),
202
+ mimeType: MIME_MAP[ext] ?? "application/octet-stream",
203
+ };
204
+ }
205
+ /** Send a document (file) to a chat. */
206
+ async sendDocument(chatId, fileBuffer, filename, caption, threadId) {
207
+ await this.sendMedia("sendDocument", chatId, "document", new Blob([new Uint8Array(fileBuffer)]), filename, { caption, threadId });
208
+ }
209
+ /** Send a photo to a chat. */
210
+ async sendPhoto(chatId, imageBuffer, filename, caption, threadId) {
211
+ await this.sendMedia("sendPhoto", chatId, "photo", new Blob([new Uint8Array(imageBuffer)]), filename, { caption, threadId });
212
+ }
213
+ /** Send a voice message (OGG Opus) to a chat. */
214
+ async sendVoice(chatId, audioBuffer, threadId) {
215
+ await this.sendMedia("sendVoice", chatId, "voice", new Blob([new Uint8Array(audioBuffer)]), "voice.ogg", { threadId });
216
+ }
217
+ /**
218
+ * Set an emoji reaction on a message ("seen" indicator).
219
+ * Non-throwing: silently ignores errors since reactions are non-critical UX.
220
+ * Logs only the first failure to avoid flooding stderr in busy sessions.
221
+ */
222
+ reactionWarned = false;
223
+ async setMessageReaction(chatId, messageId, emoji = "\uD83D\uDC40") {
224
+ try {
225
+ const url = `${this.baseUrl}/setMessageReaction`;
226
+ const response = await fetch(url, {
227
+ method: "POST",
228
+ headers: { "Content-Type": "application/json" },
229
+ body: JSON.stringify({
230
+ chat_id: chatId,
231
+ message_id: messageId,
232
+ reaction: [{ type: "emoji", emoji }],
233
+ }),
234
+ });
235
+ if (!response.ok && !this.reactionWarned) {
236
+ this.reactionWarned = true;
237
+ const data = await this.tryParseJson(response);
238
+ process.stderr.write(`[telegram] setMessageReaction failed: ${response.status} ${data?.description ?? response.statusText} (further failures suppressed)\n`);
239
+ }
240
+ }
241
+ catch (err) {
242
+ if (!this.reactionWarned) {
243
+ this.reactionWarned = true;
244
+ process.stderr.write(`[telegram] setMessageReaction error: ${err instanceof Error ? err.message : String(err)} (further errors suppressed)\n`);
245
+ }
246
+ }
247
+ }
248
+ }
249
+ //# sourceMappingURL=telegram.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"telegram.js","sourceRoot":"","sources":["../src/telegram.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Shared utility functions.
3
+ */
4
+ /**
5
+ * Extract a human-readable message from an unknown error value.
6
+ */
7
+ export declare function errorMessage(err: unknown): string;
8
+ /**
9
+ * Build a standard MCP error response object.
10
+ */
11
+ export declare function errorResult(text: string): {
12
+ content: [{
13
+ type: "text";
14
+ text: string;
15
+ }];
16
+ isError: true;
17
+ };
18
+ /**
19
+ * Map arousal/dominance/valence scores (1–5) to human-readable descriptors
20
+ * based on Russell's circumplex model of affect.
21
+ *
22
+ * Returns a compact string like "calm, neutral, balanced".
23
+ */
24
+ /**
25
+ * Describe arousal/dominance/valence as human-readable text.
26
+ * Accepts values on 0-1 scale (v2 audeering models) or 1-5 scale (v1 lookup).
27
+ * Auto-detects scale: values > 1 are treated as 1-5 and normalized to 0-1.
28
+ *
29
+ * Thresholds are calibrated to the audeering model's output distribution,
30
+ * which is trained on MSP-Podcast (original 1-7 Likert scale normalized to 0-1).
31
+ * Neutral calm speech typically outputs ~0.2 across all three dimensions.
32
+ */
33
+ export declare function describeADV(arousal: number, dominance: number, valence: number): string;
34
+ /** Image file extensions recognized for photo sending. */
35
+ export declare const IMAGE_EXTENSIONS: Set<string>;
36
+ /** Maximum characters for OpenAI TTS input. */
37
+ export declare const OPENAI_TTS_MAX_CHARS = 4096;
38
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAQjD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG;IACvC,OAAO,EAAE,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC1C,OAAO,EAAE,IAAI,CAAC;CACjB,CAEA;AAGD;;;;;GAKG;AACH;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAoBvF;AAED,0DAA0D;AAC1D,eAAO,MAAM,gBAAgB,aAE3B,CAAC;AAEH,+CAA+C;AAC/C,eAAO,MAAM,oBAAoB,OAAO,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Shared utility functions.
3
+ */
4
+ /**
5
+ * Extract a human-readable message from an unknown error value.
6
+ */
7
+ export function errorMessage(err) {
8
+ if (err instanceof Error)
9
+ return err.message;
10
+ if (typeof err === "string")
11
+ return err;
12
+ try {
13
+ return JSON.stringify(err);
14
+ }
15
+ catch {
16
+ return String(err);
17
+ }
18
+ }
19
+ /**
20
+ * Build a standard MCP error response object.
21
+ */
22
+ export function errorResult(text) {
23
+ return { content: [{ type: "text", text }], isError: true };
24
+ }
25
+ /**
26
+ * Map arousal/dominance/valence scores (1–5) to human-readable descriptors
27
+ * based on Russell's circumplex model of affect.
28
+ *
29
+ * Returns a compact string like "calm, neutral, balanced".
30
+ */
31
+ /**
32
+ * Describe arousal/dominance/valence as human-readable text.
33
+ * Accepts values on 0-1 scale (v2 audeering models) or 1-5 scale (v1 lookup).
34
+ * Auto-detects scale: values > 1 are treated as 1-5 and normalized to 0-1.
35
+ *
36
+ * Thresholds are calibrated to the audeering model's output distribution,
37
+ * which is trained on MSP-Podcast (original 1-7 Likert scale normalized to 0-1).
38
+ * Neutral calm speech typically outputs ~0.2 across all three dimensions.
39
+ */
40
+ export function describeADV(arousal, dominance, valence) {
41
+ // Normalize 1-5 scale to 0-1 if needed (backward compat with v1 fallback)
42
+ const norm = (v) => v > 1 ? (v - 1) / 4 : v;
43
+ const a = norm(arousal);
44
+ const d = norm(dominance);
45
+ const v = norm(valence);
46
+ const label = (value, scale) => {
47
+ if (value <= 0.17)
48
+ return scale[0];
49
+ if (value <= 0.35)
50
+ return scale[1];
51
+ if (value <= 0.55)
52
+ return scale[2];
53
+ if (value <= 0.73)
54
+ return scale[3];
55
+ return scale[4];
56
+ };
57
+ const arousalWord = label(a, ["very calm", "calm", "moderate energy", "energized", "very intense"]);
58
+ const valenceWord = label(v, ["very subdued", "restrained", "neutral", "warm", "very expressive"]);
59
+ const dominanceWord = label(d, ["very soft-spoken", "reserved", "balanced", "assertive", "commanding"]);
60
+ return `${arousalWord}, ${valenceWord}, ${dominanceWord}`;
61
+ }
62
+ /** Image file extensions recognized for photo sending. */
63
+ export const IMAGE_EXTENSIONS = new Set([
64
+ "jpg", "jpeg", "png", "gif", "webp",
65
+ ]);
66
+ /** Maximum characters for OpenAI TTS input. */
67
+ export const OPENAI_TTS_MAX_CHARS = 4096;
68
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACrC,IAAI,GAAG,YAAY,KAAK;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC;IAC7C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACxC,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,IAAY;IAIpC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAChE,CAAC;AAGD;;;;;GAKG;AACH;;;;;;;;GAQG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,SAAiB,EAAE,OAAe;IAC3E,0EAA0E;IAC1E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IAC1B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAExB,MAAM,KAAK,GAAG,CAAC,KAAa,EAAE,KAAwB,EAAU,EAAE;QAC9D,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,IAAI,KAAK,IAAI,IAAI;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QACnC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC,CAAC;IAEF,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,iBAAiB,EAAE,WAAW,EAAE,cAAc,CAAU,CAAC,CAAC;IAC7G,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,cAAc,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,iBAAiB,CAAU,CAAC,CAAC;IAC5G,MAAM,aAAa,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,kBAAkB,EAAE,UAAU,EAAE,UAAU,EAAE,WAAW,EAAE,YAAY,CAAU,CAAC,CAAC;IAEjH,OAAO,GAAG,WAAW,KAAK,WAAW,KAAK,aAAa,EAAE,CAAC;AAC9D,CAAC;AAED,0DAA0D;AAC1D,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAC;IACpC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;CACtC,CAAC,CAAC;AAEH,+CAA+C;AAC/C,MAAM,CAAC,MAAM,oBAAoB,GAAG,IAAI,CAAC"}
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "sensorium-mcp",
3
+ "version": "2.7.0",
4
+ "description": "MCP server for remote control of AI assistants via Telegram",
5
+ "main": "dist/index.js",
6
+ "bin": {
7
+ "sensorium-mcp": "dist/index.js"
8
+ },
9
+ "files": [
10
+ "dist"
11
+ ],
12
+ "scripts": {
13
+ "build": "tsc",
14
+ "start": "node dist/index.js",
15
+ "dev": "tsx src/index.ts",
16
+ "prepublishOnly": "npm run build",
17
+ "test": "echo \"No tests defined\" && exit 0"
18
+ },
19
+ "repository": {
20
+ "type": "git",
21
+ "url": "git+https://github.com/andriyshevchenko/remote-copilot-mcp.git"
22
+ },
23
+ "keywords": [
24
+ "mcp",
25
+ "telegram",
26
+ "copilot",
27
+ "ai-assistant"
28
+ ],
29
+ "author": "",
30
+ "license": "MIT",
31
+ "type": "module",
32
+ "bugs": {
33
+ "url": "https://github.com/andriyshevchenko/remote-copilot-mcp/issues"
34
+ },
35
+ "homepage": "https://github.com/andriyshevchenko/remote-copilot-mcp#readme",
36
+ "dependencies": {
37
+ "@modelcontextprotocol/sdk": "^1.27.1",
38
+ "telegramify-markdown": "^1.3.2"
39
+ },
40
+ "devDependencies": {
41
+ "@types/node": "^25.3.3",
42
+ "tsx": "^4.21.0",
43
+ "typescript": "^5.9.3"
44
+ }
45
+ }