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.
- package/dist/config.d.ts +1 -11
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +3 -49
- package/dist/config.js.map +1 -1
- package/dist/dashboard/presets.d.ts +18 -0
- package/dist/dashboard/presets.d.ts.map +1 -0
- package/dist/dashboard/presets.js +78 -0
- package/dist/dashboard/presets.js.map +1 -0
- package/dist/dashboard/routes.d.ts +33 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +283 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard.d.ts +6 -29
- package/dist/dashboard.d.ts.map +1 -1
- package/dist/dashboard.js +6 -1158
- package/dist/dashboard.js.map +1 -1
- package/dist/data/file-storage.d.ts +19 -0
- package/dist/data/file-storage.d.ts.map +1 -0
- package/dist/data/file-storage.js +58 -0
- package/dist/data/file-storage.js.map +1 -0
- package/dist/data/memory/bootstrap.d.ts +40 -0
- package/dist/data/memory/bootstrap.d.ts.map +1 -0
- package/dist/data/memory/bootstrap.js +240 -0
- package/dist/data/memory/bootstrap.js.map +1 -0
- package/dist/data/memory/consolidation.d.ts +12 -0
- package/dist/data/memory/consolidation.d.ts.map +1 -0
- package/dist/data/memory/consolidation.js +248 -0
- package/dist/data/memory/consolidation.js.map +1 -0
- package/dist/data/memory/episodes.d.ts +34 -0
- package/dist/data/memory/episodes.d.ts.map +1 -0
- package/dist/data/memory/episodes.js +89 -0
- package/dist/data/memory/episodes.js.map +1 -0
- package/dist/data/memory/index.d.ts +14 -0
- package/dist/data/memory/index.d.ts.map +1 -0
- package/dist/data/memory/index.js +14 -0
- package/dist/data/memory/index.js.map +1 -0
- package/dist/data/memory/procedures.d.ts +42 -0
- package/dist/data/memory/procedures.d.ts.map +1 -0
- package/dist/data/memory/procedures.js +122 -0
- package/dist/data/memory/procedures.js.map +1 -0
- package/dist/data/memory/schema.d.ts +11 -0
- package/dist/data/memory/schema.d.ts.map +1 -0
- package/dist/data/memory/schema.js +327 -0
- package/dist/data/memory/schema.js.map +1 -0
- package/dist/data/memory/semantic.d.ts +94 -0
- package/dist/data/memory/semantic.d.ts.map +1 -0
- package/dist/data/memory/semantic.js +385 -0
- package/dist/data/memory/semantic.js.map +1 -0
- package/dist/data/memory/voice-sig.d.ts +33 -0
- package/dist/data/memory/voice-sig.d.ts.map +1 -0
- package/dist/data/memory/voice-sig.js +48 -0
- package/dist/data/memory/voice-sig.js.map +1 -0
- package/dist/data/templates.d.ts +19 -0
- package/dist/data/templates.d.ts.map +1 -0
- package/dist/data/templates.js +46 -0
- package/dist/data/templates.js.map +1 -0
- package/dist/dispatcher.d.ts +5 -97
- package/dist/dispatcher.d.ts.map +1 -1
- package/dist/dispatcher.js +5 -525
- package/dist/dispatcher.js.map +1 -1
- package/dist/drive.d.ts.map +1 -1
- package/dist/drive.js +3 -1
- package/dist/drive.js.map +1 -1
- package/dist/index.d.ts +4 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -289
- package/dist/index.js.map +1 -1
- package/dist/integrations/openai/chat.d.ts +29 -0
- package/dist/integrations/openai/chat.d.ts.map +1 -0
- package/dist/integrations/openai/chat.js +84 -0
- package/dist/integrations/openai/chat.js.map +1 -0
- package/dist/integrations/openai/index.d.ts +6 -0
- package/dist/integrations/openai/index.d.ts.map +1 -0
- package/dist/integrations/openai/index.js +6 -0
- package/dist/integrations/openai/index.js.map +1 -0
- package/dist/integrations/openai/speech.d.ts +21 -0
- package/dist/integrations/openai/speech.d.ts.map +1 -0
- package/dist/integrations/openai/speech.js +75 -0
- package/dist/integrations/openai/speech.js.map +1 -0
- package/dist/integrations/openai/video.d.ts +15 -0
- package/dist/integrations/openai/video.d.ts.map +1 -0
- package/dist/integrations/openai/video.js +131 -0
- package/dist/integrations/openai/video.js.map +1 -0
- package/dist/integrations/openai/vision.d.ts +23 -0
- package/dist/integrations/openai/vision.d.ts.map +1 -0
- package/dist/integrations/openai/vision.js +116 -0
- package/dist/integrations/openai/vision.js.map +1 -0
- package/dist/integrations/openai/voice-emotion.d.ts +41 -0
- package/dist/integrations/openai/voice-emotion.d.ts.map +1 -0
- package/dist/integrations/openai/voice-emotion.js +50 -0
- package/dist/integrations/openai/voice-emotion.js.map +1 -0
- package/dist/integrations/telegram/types.d.ts +112 -0
- package/dist/integrations/telegram/types.d.ts.map +1 -0
- package/dist/integrations/telegram/types.js +6 -0
- package/dist/integrations/telegram/types.js.map +1 -0
- package/dist/memory.d.ts +6 -205
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +6 -1357
- package/dist/memory.js.map +1 -1
- package/dist/openai.d.ts +11 -102
- package/dist/openai.d.ts.map +1 -1
- package/dist/openai.js +14 -421
- package/dist/openai.js.map +1 -1
- package/dist/response-builders.d.ts +1 -11
- package/dist/response-builders.d.ts.map +1 -1
- package/dist/response-builders.js +2 -38
- package/dist/response-builders.js.map +1 -1
- package/dist/server/factory.d.ts +17 -0
- package/dist/server/factory.d.ts.map +1 -0
- package/dist/server/factory.js +279 -0
- package/dist/server/factory.js.map +1 -0
- package/dist/services/dispatcher/broker.d.ts +83 -0
- package/dist/services/dispatcher/broker.d.ts.map +1 -0
- package/dist/services/dispatcher/broker.js +175 -0
- package/dist/services/dispatcher/broker.js.map +1 -0
- package/dist/services/dispatcher/index.d.ts +7 -0
- package/dist/services/dispatcher/index.d.ts.map +1 -0
- package/dist/services/dispatcher/index.js +7 -0
- package/dist/services/dispatcher/index.js.map +1 -0
- package/dist/services/dispatcher/lock.d.ts +25 -0
- package/dist/services/dispatcher/lock.d.ts.map +1 -0
- package/dist/services/dispatcher/lock.js +111 -0
- package/dist/services/dispatcher/lock.js.map +1 -0
- package/dist/services/dispatcher/poller.d.ts +19 -0
- package/dist/services/dispatcher/poller.d.ts.map +1 -0
- package/dist/services/dispatcher/poller.js +269 -0
- package/dist/services/dispatcher/poller.js.map +1 -0
- package/dist/telegram.d.ts +2 -88
- package/dist/telegram.d.ts.map +1 -1
- package/dist/telegram.js +2 -0
- package/dist/telegram.js.map +1 -1
- package/dist/tool-definitions.d.ts +1 -14
- package/dist/tool-definitions.d.ts.map +1 -1
- package/dist/tool-definitions.js +1 -403
- package/dist/tool-definitions.js.map +1 -1
- package/dist/tools/definitions.d.ts +15 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +404 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/start-session-tool.d.ts.map +1 -1
- package/dist/tools/start-session-tool.js +2 -0
- package/dist/tools/start-session-tool.js.map +1 -1
- package/dist/tools/wait/drive-handler.d.ts +61 -0
- package/dist/tools/wait/drive-handler.d.ts.map +1 -0
- package/dist/tools/wait/drive-handler.js +138 -0
- package/dist/tools/wait/drive-handler.js.map +1 -0
- package/dist/tools/wait/index.d.ts +8 -0
- package/dist/tools/wait/index.d.ts.map +1 -0
- package/dist/tools/wait/index.js +8 -0
- package/dist/tools/wait/index.js.map +1 -0
- package/dist/tools/wait/media-processor.d.ts +52 -0
- package/dist/tools/wait/media-processor.d.ts.map +1 -0
- package/dist/tools/wait/media-processor.js +261 -0
- package/dist/tools/wait/media-processor.js.map +1 -0
- package/dist/tools/wait/message-delivery.d.ts +63 -0
- package/dist/tools/wait/message-delivery.d.ts.map +1 -0
- package/dist/tools/wait/message-delivery.js +281 -0
- package/dist/tools/wait/message-delivery.js.map +1 -0
- package/dist/tools/wait/poll-loop.d.ts +72 -0
- package/dist/tools/wait/poll-loop.d.ts.map +1 -0
- package/dist/tools/wait/poll-loop.js +280 -0
- package/dist/tools/wait/poll-loop.js.map +1 -0
- package/dist/tools/wait/reaction-handler.d.ts +49 -0
- package/dist/tools/wait/reaction-handler.d.ts.map +1 -0
- package/dist/tools/wait/reaction-handler.js +126 -0
- package/dist/tools/wait/reaction-handler.js.map +1 -0
- package/dist/tools/wait/task-handler.d.ts +40 -0
- package/dist/tools/wait/task-handler.d.ts.map +1 -0
- package/dist/tools/wait/task-handler.js +41 -0
- package/dist/tools/wait/task-handler.js.map +1 -0
- package/dist/tools/wait-tool.d.ts +3 -69
- package/dist/tools/wait-tool.d.ts.map +1 -1
- package/dist/tools/wait-tool.js +3 -876
- package/dist/tools/wait-tool.js.map +1 -1
- package/package.json +1 -1
- package/templates/daily-review.default.md +26 -0
- package/templates/drive-dispatcher.default.md +2 -0
package/dist/openai.js
CHANGED
|
@@ -1,424 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* OpenAI API
|
|
3
|
-
*
|
|
2
|
+
* OpenAI API facade — re-exports all OpenAI-related functions from
|
|
3
|
+
* their dedicated modules under integrations/openai/.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
function cleanupTempDir() {
|
|
18
|
-
mkdirSync(TEMP_DIR, { recursive: true });
|
|
19
|
-
const STALE_AGE = 5 * 60 * 1000; // 5 minutes — any temp file this old is a crash leftover
|
|
20
|
-
const now = Date.now();
|
|
21
|
-
for (const name of readdirSync(TEMP_DIR)) {
|
|
22
|
-
try {
|
|
23
|
-
const fullPath = join(TEMP_DIR, name);
|
|
24
|
-
const mtime = statSync(fullPath).mtimeMs;
|
|
25
|
-
if (now - mtime > STALE_AGE) {
|
|
26
|
-
unlinkSync(fullPath);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
catch { /* ignore per-file errors */ }
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
// Track in-flight temp files for cleanup on unexpected exit.
|
|
33
|
-
const activeTempFiles = new Set();
|
|
34
|
-
function registerTempFile(path) {
|
|
35
|
-
activeTempFiles.add(path);
|
|
36
|
-
}
|
|
37
|
-
function unregisterTempFile(path) {
|
|
38
|
-
activeTempFiles.delete(path);
|
|
39
|
-
try {
|
|
40
|
-
unlinkSync(path);
|
|
41
|
-
}
|
|
42
|
-
catch { /* ignore */ }
|
|
43
|
-
}
|
|
44
|
-
// Clean up in-flight temp files on graceful/forced shutdown.
|
|
45
|
-
for (const sig of ["exit", "SIGINT", "SIGTERM"]) {
|
|
46
|
-
process.on(sig, () => {
|
|
47
|
-
for (const f of activeTempFiles) {
|
|
48
|
-
try {
|
|
49
|
-
unlinkSync(f);
|
|
50
|
-
}
|
|
51
|
-
catch { /* ignore */ }
|
|
52
|
-
}
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
// Run once when the module loads.
|
|
56
|
-
cleanupTempDir();
|
|
57
|
-
/**
|
|
58
|
-
* Lightweight chat completion using GPT-4o-mini.
|
|
59
|
-
* Used for context preprocessing, not for agent dialogue.
|
|
60
|
-
* Returns the assistant's text response.
|
|
61
|
-
*/
|
|
62
|
-
export async function chatCompletion(messages, apiKey, options) {
|
|
63
|
-
const controller = new AbortController();
|
|
64
|
-
const timer = setTimeout(() => controller.abort(), options?.timeoutMs ?? 15_000);
|
|
65
|
-
try {
|
|
66
|
-
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
67
|
-
method: "POST",
|
|
68
|
-
headers: {
|
|
69
|
-
"Content-Type": "application/json",
|
|
70
|
-
Authorization: `Bearer ${apiKey}`,
|
|
71
|
-
},
|
|
72
|
-
body: JSON.stringify({
|
|
73
|
-
model: "gpt-4o-mini",
|
|
74
|
-
messages,
|
|
75
|
-
max_completion_tokens: options?.maxTokens ?? 300,
|
|
76
|
-
temperature: options?.temperature ?? 0,
|
|
77
|
-
}),
|
|
78
|
-
signal: controller.signal,
|
|
79
|
-
});
|
|
80
|
-
if (!response.ok) {
|
|
81
|
-
throw new Error(`OpenAI chat API error: ${response.status} ${response.statusText}`);
|
|
82
|
-
}
|
|
83
|
-
const json = await response.json();
|
|
84
|
-
return json.choices[0]?.message?.content ?? "";
|
|
85
|
-
}
|
|
86
|
-
finally {
|
|
87
|
-
clearTimeout(timer);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// ─── Image / Vision Analysis ──────────────────────────────────────────────
|
|
91
|
-
/**
|
|
92
|
-
* Analyze an image using GPT-4o vision capability.
|
|
93
|
-
* Sends the image as base64 with a text prompt and returns the analysis.
|
|
94
|
-
* @param imageBuffer Raw image content (JPEG, PNG, etc.).
|
|
95
|
-
* @param prompt The analysis prompt to send alongside the image.
|
|
96
|
-
* @param apiKey OpenAI API key.
|
|
97
|
-
* @returns The vision model's text response.
|
|
98
|
-
*/
|
|
99
|
-
export async function analyzeImage(imageBuffer, prompt, apiKey) {
|
|
100
|
-
const base64 = imageBuffer.toString("base64");
|
|
101
|
-
const controller = new AbortController();
|
|
102
|
-
const timer = setTimeout(() => controller.abort(), 30_000);
|
|
103
|
-
try {
|
|
104
|
-
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
105
|
-
method: "POST",
|
|
106
|
-
headers: {
|
|
107
|
-
"Content-Type": "application/json",
|
|
108
|
-
Authorization: `Bearer ${apiKey}`,
|
|
109
|
-
},
|
|
110
|
-
body: JSON.stringify({
|
|
111
|
-
model: "gpt-4o",
|
|
112
|
-
messages: [
|
|
113
|
-
{
|
|
114
|
-
role: "user",
|
|
115
|
-
content: [
|
|
116
|
-
{ type: "text", text: prompt },
|
|
117
|
-
{
|
|
118
|
-
type: "image_url",
|
|
119
|
-
image_url: {
|
|
120
|
-
url: `data:image/jpeg;base64,${base64}`,
|
|
121
|
-
detail: "low",
|
|
122
|
-
},
|
|
123
|
-
},
|
|
124
|
-
],
|
|
125
|
-
},
|
|
126
|
-
],
|
|
127
|
-
max_completion_tokens: 150,
|
|
128
|
-
temperature: 0,
|
|
129
|
-
}),
|
|
130
|
-
signal: controller.signal,
|
|
131
|
-
});
|
|
132
|
-
if (!response.ok) {
|
|
133
|
-
const errText = await response.text().catch(() => response.statusText);
|
|
134
|
-
throw new Error(`OpenAI vision analysis failed: ${response.status} ${errText}`);
|
|
135
|
-
}
|
|
136
|
-
const json = await response.json();
|
|
137
|
-
return json.choices?.[0]?.message?.content?.trim() ?? "";
|
|
138
|
-
}
|
|
139
|
-
finally {
|
|
140
|
-
clearTimeout(timer);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
// ─── TTS ──────────────────────────────────────────────────────────────────
|
|
144
|
-
/** Valid TTS voice names. */
|
|
145
|
-
export const TTS_VOICES = [
|
|
146
|
-
"alloy", "echo", "fable", "onyx", "nova", "shimmer",
|
|
147
|
-
];
|
|
148
|
-
/**
|
|
149
|
-
* Convert text to speech using OpenAI TTS API.
|
|
150
|
-
* Returns OGG Opus audio suitable for Telegram's sendVoice.
|
|
151
|
-
*/
|
|
152
|
-
export async function textToSpeech(text, apiKey, voice = "nova") {
|
|
153
|
-
const controller = new AbortController();
|
|
154
|
-
const timer = setTimeout(() => controller.abort(), 60_000);
|
|
155
|
-
try {
|
|
156
|
-
const response = await fetch("https://api.openai.com/v1/audio/speech", {
|
|
157
|
-
method: "POST",
|
|
158
|
-
headers: {
|
|
159
|
-
"Content-Type": "application/json",
|
|
160
|
-
Authorization: `Bearer ${apiKey}`,
|
|
161
|
-
},
|
|
162
|
-
body: JSON.stringify({
|
|
163
|
-
model: "tts-1",
|
|
164
|
-
input: text,
|
|
165
|
-
voice,
|
|
166
|
-
response_format: "opus",
|
|
167
|
-
}),
|
|
168
|
-
signal: controller.signal,
|
|
169
|
-
});
|
|
170
|
-
if (!response.ok) {
|
|
171
|
-
const errText = await response.text().catch(() => response.statusText);
|
|
172
|
-
throw new Error(`OpenAI TTS failed: ${response.status} ${errText}`);
|
|
173
|
-
}
|
|
174
|
-
return Buffer.from(await response.arrayBuffer());
|
|
175
|
-
}
|
|
176
|
-
finally {
|
|
177
|
-
clearTimeout(timer);
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
/**
|
|
181
|
-
* Transcribe an audio buffer using OpenAI Whisper API.
|
|
182
|
-
* @param audioBuffer Raw audio content (OGG Opus from Telegram voice messages).
|
|
183
|
-
* @param apiKey OpenAI API key.
|
|
184
|
-
* @returns The transcribed text (empty string if no speech detected).
|
|
185
|
-
*/
|
|
186
|
-
export async function transcribeAudio(audioBuffer, apiKey, filename = "voice.ogg") {
|
|
187
|
-
// Telegram stores voice as .oga (OGG Opus). Whisper accepts .ogg but
|
|
188
|
-
// not .oga, so we hardcode the extension.
|
|
189
|
-
const controller = new AbortController();
|
|
190
|
-
const timer = setTimeout(() => controller.abort(), 60_000);
|
|
191
|
-
try {
|
|
192
|
-
const formData = new FormData();
|
|
193
|
-
formData.append("file", new Blob([new Uint8Array(audioBuffer)]), filename);
|
|
194
|
-
formData.append("model", "whisper-1");
|
|
195
|
-
const response = await fetch("https://api.openai.com/v1/audio/transcriptions", {
|
|
196
|
-
method: "POST",
|
|
197
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
198
|
-
body: formData,
|
|
199
|
-
signal: controller.signal,
|
|
200
|
-
});
|
|
201
|
-
if (!response.ok) {
|
|
202
|
-
const errText = await response.text().catch(() => response.statusText);
|
|
203
|
-
throw new Error(`OpenAI Whisper transcription failed: ${response.status} ${errText}`);
|
|
204
|
-
}
|
|
205
|
-
const result = (await response.json());
|
|
206
|
-
return result.text ?? "";
|
|
207
|
-
}
|
|
208
|
-
finally {
|
|
209
|
-
clearTimeout(timer);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
/**
|
|
213
|
-
* Analyze a voice message for emotion using an external microservice.
|
|
214
|
-
* @param audioBuffer Raw audio content (OGG).
|
|
215
|
-
* @param serviceUrl Base URL of the voice analysis service (e.g. https://voice-analysis.example.com).
|
|
216
|
-
* @param timeoutMs Request timeout in milliseconds (default: 15000).
|
|
217
|
-
* @returns Analysis result, or null if the service is unavailable or errors.
|
|
218
|
-
*/
|
|
219
|
-
export async function analyzeVoiceEmotion(audioBuffer, serviceUrl, options) {
|
|
220
|
-
const { mimeType = "audio/ogg", filename = "voice.ogg", timeoutMs = 120_000 } = options ?? {};
|
|
221
|
-
const start = Date.now();
|
|
222
|
-
const baseUrl = serviceUrl.replace(/\/+$/, "");
|
|
223
|
-
log.verbose("voice-analysis", `Starting analysis (timeout: ${timeoutMs}ms, format: ${mimeType})...`);
|
|
224
|
-
const controller = new AbortController();
|
|
225
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
226
|
-
try {
|
|
227
|
-
const formData = new FormData();
|
|
228
|
-
formData.append("file", new Blob([new Uint8Array(audioBuffer)], { type: mimeType }), filename);
|
|
229
|
-
const response = await fetch(`${baseUrl}/analyze`, {
|
|
230
|
-
method: "POST",
|
|
231
|
-
body: formData,
|
|
232
|
-
signal: controller.signal,
|
|
233
|
-
});
|
|
234
|
-
const elapsed = Date.now() - start;
|
|
235
|
-
if (!response.ok) {
|
|
236
|
-
log.warn(`[voice-analysis] HTTP ${response.status} after ${elapsed}ms`);
|
|
237
|
-
return null;
|
|
238
|
-
}
|
|
239
|
-
const result = (await response.json());
|
|
240
|
-
log.verbose("voice-analysis", `Success in ${elapsed}ms`);
|
|
241
|
-
return result;
|
|
242
|
-
}
|
|
243
|
-
catch (err) {
|
|
244
|
-
const elapsed = Date.now() - start;
|
|
245
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
246
|
-
log.error(`[voice-analysis] Failed after ${elapsed}ms: ${msg}`);
|
|
247
|
-
return null;
|
|
248
|
-
}
|
|
249
|
-
finally {
|
|
250
|
-
clearTimeout(timer);
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
// ---------------------------------------------------------------------------
|
|
254
|
-
// Video Frame Analysis (GPT-4o-mini vision)
|
|
255
|
-
// ---------------------------------------------------------------------------
|
|
256
|
-
/** Maximum number of frames to extract from a video. */
|
|
257
|
-
const MAX_FRAMES = 6;
|
|
258
|
-
/**
|
|
259
|
-
* Split a buffer of concatenated JPEG images by SOI marker (0xFFD8).
|
|
260
|
-
*/
|
|
261
|
-
function splitJpegs(buf) {
|
|
262
|
-
const frames = [];
|
|
263
|
-
let start = 0;
|
|
264
|
-
for (let i = 2; i < buf.length - 1; i++) {
|
|
265
|
-
if (buf[i] === 0xFF && buf[i + 1] === 0xD8) {
|
|
266
|
-
frames.push(buf.subarray(start, i));
|
|
267
|
-
start = i;
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
if (start < buf.length)
|
|
271
|
-
frames.push(buf.subarray(start));
|
|
272
|
-
return frames.filter(f => f.length > 100); // drop tiny garbage
|
|
273
|
-
}
|
|
274
|
-
/**
|
|
275
|
-
* Extract key frames from a video buffer using ffmpeg.
|
|
276
|
-
* Writes video to a temp file and reads JPEG frames from stdout.
|
|
277
|
-
* @param videoBuffer Raw video file content (MP4).
|
|
278
|
-
* @param durationSec Video duration in seconds (used to calculate interval).
|
|
279
|
-
* @returns Array of JPEG-encoded frame buffers.
|
|
280
|
-
*/
|
|
281
|
-
export function extractVideoFrames(videoBuffer, durationSec) {
|
|
282
|
-
const tempPath = join(TEMP_DIR, `video-${randomUUID()}.mp4`);
|
|
283
|
-
writeFileSync(tempPath, videoBuffer);
|
|
284
|
-
registerTempFile(tempPath);
|
|
285
|
-
return new Promise((resolve, reject) => {
|
|
286
|
-
// Calculate frame interval: aim for ~1 frame every 5s, capped at MAX_FRAMES.
|
|
287
|
-
const interval = Math.max(1, Math.ceil(durationSec / MAX_FRAMES));
|
|
288
|
-
const args = [
|
|
289
|
-
"-i", tempPath,
|
|
290
|
-
"-vf", `fps=1/${interval}`,
|
|
291
|
-
"-c:v", "mjpeg",
|
|
292
|
-
"-f", "image2pipe",
|
|
293
|
-
"-q:v", "3",
|
|
294
|
-
"pipe:1",
|
|
295
|
-
];
|
|
296
|
-
const proc = spawn("ffmpeg", args, {
|
|
297
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
298
|
-
});
|
|
299
|
-
const chunks = [];
|
|
300
|
-
const errChunks = [];
|
|
301
|
-
proc.stdout.on("data", (chunk) => chunks.push(chunk));
|
|
302
|
-
proc.stderr.on("data", (chunk) => errChunks.push(chunk));
|
|
303
|
-
// Kill ffmpeg if it hangs for more than 30 seconds.
|
|
304
|
-
const killTimer = setTimeout(() => proc.kill("SIGKILL"), 30_000);
|
|
305
|
-
proc.on("error", (err) => {
|
|
306
|
-
clearTimeout(killTimer);
|
|
307
|
-
reject(new Error(`ffmpeg not found or failed to start: ${err.message}`));
|
|
308
|
-
});
|
|
309
|
-
proc.on("close", (code) => {
|
|
310
|
-
clearTimeout(killTimer);
|
|
311
|
-
if (code !== 0) {
|
|
312
|
-
const stderr = Buffer.concat(errChunks).toString("utf8").slice(-500);
|
|
313
|
-
reject(new Error(`ffmpeg exited with code ${code}: ${stderr}`));
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
const combined = Buffer.concat(chunks);
|
|
317
|
-
if (combined.length === 0) {
|
|
318
|
-
resolve([]);
|
|
319
|
-
return;
|
|
320
|
-
}
|
|
321
|
-
const frames = splitJpegs(combined).slice(0, MAX_FRAMES);
|
|
322
|
-
resolve(frames);
|
|
323
|
-
});
|
|
324
|
-
}).finally(() => {
|
|
325
|
-
unregisterTempFile(tempPath);
|
|
326
|
-
});
|
|
327
|
-
}
|
|
328
|
-
/**
|
|
329
|
-
* Analyze video frames using OpenAI GPT-4o-mini vision.
|
|
330
|
-
* @param frames Array of JPEG frame buffers.
|
|
331
|
-
* @param durationSec Video duration for timestamp context.
|
|
332
|
-
* @param apiKey OpenAI API key.
|
|
333
|
-
* @returns Human-readable description of the video content.
|
|
334
|
-
*/
|
|
335
|
-
export async function analyzeVideoFrames(frames, durationSec, apiKey) {
|
|
336
|
-
if (frames.length === 0) {
|
|
337
|
-
return "(no frames could be extracted from the video)";
|
|
338
|
-
}
|
|
339
|
-
const interval = Math.max(1, Math.ceil(durationSec / MAX_FRAMES));
|
|
340
|
-
const timestamps = frames.map((_, i) => `${i * interval}s`).join(", ");
|
|
341
|
-
const content = [
|
|
342
|
-
{
|
|
343
|
-
type: "text",
|
|
344
|
-
text: `These are ${frames.length} sequential frames extracted from a ${durationSec}s video message at timestamps: [${timestamps}]. ` +
|
|
345
|
-
`Describe what is happening in the video concisely (2-3 sentences). ` +
|
|
346
|
-
`Note any people, actions, objects, movement, text, or scene changes.`,
|
|
347
|
-
},
|
|
348
|
-
...frames.map((frame) => ({
|
|
349
|
-
type: "image_url",
|
|
350
|
-
image_url: {
|
|
351
|
-
url: `data:image/jpeg;base64,${frame.toString("base64")}`,
|
|
352
|
-
detail: "low", // circle videos are small (240-384px)
|
|
353
|
-
},
|
|
354
|
-
})),
|
|
355
|
-
];
|
|
356
|
-
const controller = new AbortController();
|
|
357
|
-
const timer = setTimeout(() => controller.abort(), 60_000);
|
|
358
|
-
try {
|
|
359
|
-
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
360
|
-
method: "POST",
|
|
361
|
-
headers: {
|
|
362
|
-
"Content-Type": "application/json",
|
|
363
|
-
Authorization: `Bearer ${apiKey}`,
|
|
364
|
-
},
|
|
365
|
-
body: JSON.stringify({
|
|
366
|
-
model: "gpt-4o-mini",
|
|
367
|
-
messages: [{ role: "user", content }],
|
|
368
|
-
max_completion_tokens: 300,
|
|
369
|
-
}),
|
|
370
|
-
signal: controller.signal,
|
|
371
|
-
});
|
|
372
|
-
if (!response.ok) {
|
|
373
|
-
const errText = await response.text().catch(() => response.statusText);
|
|
374
|
-
throw new Error(`OpenAI vision analysis failed: ${response.status} ${errText}`);
|
|
375
|
-
}
|
|
376
|
-
const result = (await response.json());
|
|
377
|
-
return result.choices?.[0]?.message?.content?.trim() ?? "(no description generated)";
|
|
378
|
-
}
|
|
379
|
-
finally {
|
|
380
|
-
clearTimeout(timer);
|
|
381
|
-
}
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Generate an embedding vector for text using OpenAI's text-embedding-3-small model.
|
|
385
|
-
* Returns a Float32Array of 1536 dimensions.
|
|
386
|
-
*/
|
|
387
|
-
export async function generateEmbedding(text, apiKey) {
|
|
388
|
-
const controller = new AbortController();
|
|
389
|
-
const timer = setTimeout(() => controller.abort(), 30_000);
|
|
390
|
-
try {
|
|
391
|
-
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
392
|
-
method: "POST",
|
|
393
|
-
headers: {
|
|
394
|
-
"Content-Type": "application/json",
|
|
395
|
-
Authorization: `Bearer ${apiKey}`,
|
|
396
|
-
},
|
|
397
|
-
body: JSON.stringify({
|
|
398
|
-
model: "text-embedding-3-small",
|
|
399
|
-
input: text.slice(0, 8000), // model supports 8191 tokens
|
|
400
|
-
}),
|
|
401
|
-
signal: controller.signal,
|
|
402
|
-
});
|
|
403
|
-
if (!response.ok) {
|
|
404
|
-
throw new Error(`OpenAI embedding API error: ${response.status} ${response.statusText}`);
|
|
405
|
-
}
|
|
406
|
-
const json = await response.json();
|
|
407
|
-
return new Float32Array(json.data[0].embedding);
|
|
408
|
-
}
|
|
409
|
-
finally {
|
|
410
|
-
clearTimeout(timer);
|
|
411
|
-
}
|
|
412
|
-
}
|
|
413
|
-
/** Compute cosine similarity between two embedding vectors. Returns value in [-1, 1]. */
|
|
414
|
-
export function cosineSimilarity(a, b) {
|
|
415
|
-
let dot = 0, normA = 0, normB = 0;
|
|
416
|
-
for (let i = 0; i < a.length; i++) {
|
|
417
|
-
dot += a[i] * b[i];
|
|
418
|
-
normA += a[i] * a[i];
|
|
419
|
-
normB += b[i] * b[i];
|
|
420
|
-
}
|
|
421
|
-
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
422
|
-
return denom === 0 ? 0 : dot / denom;
|
|
423
|
-
}
|
|
5
|
+
* Kept as the single import path so existing consumers don't break.
|
|
6
|
+
*/
|
|
7
|
+
// Re-export chat completion + embedding functions
|
|
8
|
+
export { chatCompletion, cosineSimilarity, generateEmbedding } from "./integrations/openai/chat.js";
|
|
9
|
+
// Re-export TTS & transcription
|
|
10
|
+
export { TTS_VOICES, textToSpeech, transcribeAudio } from "./integrations/openai/speech.js";
|
|
11
|
+
// Re-export voice emotion analysis
|
|
12
|
+
export { analyzeVoiceEmotion } from "./integrations/openai/voice-emotion.js";
|
|
13
|
+
// Re-export video frame extraction
|
|
14
|
+
export { extractVideoFrames } from "./integrations/openai/video.js";
|
|
15
|
+
// Re-export vision analysis (image + video frame analysis)
|
|
16
|
+
export { analyzeImage, analyzeVideoFrames } from "./integrations/openai/vision.js";
|
|
424
17
|
//# sourceMappingURL=openai.js.map
|
package/dist/openai.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"openai.js","sourceRoot":"","sources":["../src/openai.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,kDAAkD;AAClD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAGpG,gCAAgC;AAChC,OAAO,EAAE,UAAU,EAAiB,YAAY,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAE3G,mCAAmC;AACnC,OAAO,EAAE,mBAAmB,EAAE,MAAM,wCAAwC,CAAC;AAG7E,mCAAmC;AACnC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,2DAA2D;AAC3D,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC"}
|
|
@@ -6,17 +6,7 @@
|
|
|
6
6
|
* time, uptime, operating-mode reminders, etc.).
|
|
7
7
|
*/
|
|
8
8
|
import type { VoiceAnalysisResult } from "./openai.js";
|
|
9
|
-
|
|
10
|
-
* Load a template file from ~/.remote-copilot-mcp/templates/{name}.md.
|
|
11
|
-
* Returns the raw template string, or null if the file doesn't exist.
|
|
12
|
-
* Results are cached in memory with a 60-second TTL.
|
|
13
|
-
*/
|
|
14
|
-
export declare function loadTemplate(name: string): string | null;
|
|
15
|
-
/**
|
|
16
|
-
* Replace all `{{VAR}}` placeholders in a template string with the
|
|
17
|
-
* corresponding values from the provided vars map.
|
|
18
|
-
*/
|
|
19
|
-
export declare function renderTemplate(template: string, vars: Record<string, string>): string;
|
|
9
|
+
export { loadTemplate, renderTemplate } from "./data/templates.js";
|
|
20
10
|
/** Tokenize text and strip stop words, returning up to 10 meaningful keywords. */
|
|
21
11
|
export declare function extractSearchKeywords(text: string): string;
|
|
22
12
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-builders.d.ts","sourceRoot":"","sources":["../src/response-builders.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;
|
|
1
|
+
{"version":3,"file":"response-builders.d.ts","sourceRoot":"","sources":["../src/response-builders.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAKH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAqBnE,kFAAkF;AAClF,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG1D;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,mBAAmB,GAAG,IAAI,GAAG,MAAM,EAAE,CAyBhF;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,OAAO,GACtB,MAAM,CAgCR;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,GAAG,SAAS,EAC5B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,OAAO,GACtB,MAAM,CAiBR;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,MAAM,GAAG,MAAM,CAY/F"}
|
|
@@ -5,46 +5,10 @@
|
|
|
5
5
|
* MCP tool responses so the agent always has essential context (thread ID,
|
|
6
6
|
* time, uptime, operating-mode reminders, etc.).
|
|
7
7
|
*/
|
|
8
|
-
import { readFileSync } from "node:fs";
|
|
9
|
-
import { join } from "node:path";
|
|
10
8
|
import { config } from "./config.js";
|
|
11
|
-
import { TEMPLATES_DIR } from "./config.js";
|
|
12
9
|
import { describeADV } from "./utils.js";
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
const templateCache = new Map();
|
|
16
|
-
/**
|
|
17
|
-
* Load a template file from ~/.remote-copilot-mcp/templates/{name}.md.
|
|
18
|
-
* Returns the raw template string, or null if the file doesn't exist.
|
|
19
|
-
* Results are cached in memory with a 60-second TTL.
|
|
20
|
-
*/
|
|
21
|
-
export function loadTemplate(name) {
|
|
22
|
-
const now = Date.now();
|
|
23
|
-
const cached = templateCache.get(name);
|
|
24
|
-
if (cached && now - cached.loadedAt < TEMPLATE_TTL_MS) {
|
|
25
|
-
return cached.content;
|
|
26
|
-
}
|
|
27
|
-
const filePath = join(TEMPLATES_DIR, `${name}.md`);
|
|
28
|
-
let content = null;
|
|
29
|
-
try {
|
|
30
|
-
content = readFileSync(filePath, "utf-8");
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
// File doesn't exist or is unreadable — fall back to null
|
|
34
|
-
content = null;
|
|
35
|
-
}
|
|
36
|
-
templateCache.set(name, { content, loadedAt: now });
|
|
37
|
-
return content;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Replace all `{{VAR}}` placeholders in a template string with the
|
|
41
|
-
* corresponding values from the provided vars map.
|
|
42
|
-
*/
|
|
43
|
-
export function renderTemplate(template, vars) {
|
|
44
|
-
return template.replace(/\{\{(\w+)\}\}/g, (match, key) => {
|
|
45
|
-
return Object.prototype.hasOwnProperty.call(vars, key) ? vars[key] : match;
|
|
46
|
-
});
|
|
47
|
-
}
|
|
10
|
+
import { loadTemplate, renderTemplate } from "./data/templates.js";
|
|
11
|
+
export { loadTemplate, renderTemplate } from "./data/templates.js";
|
|
48
12
|
// ── Stop-word list for auto-memory keyword extraction ─────────────────
|
|
49
13
|
const STOP_WORDS = new Set([
|
|
50
14
|
"a", "an", "the", "is", "are", "was", "were", "be", "been", "being",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response-builders.js","sourceRoot":"","sources":["../src/response-builders.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"response-builders.js","sourceRoot":"","sources":["../src/response-builders.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
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 type { Database } from "better-sqlite3";
|
|
9
|
+
import type { TelegramClient } from "../telegram.js";
|
|
10
|
+
import type { CreateMcpServerFn } from "../types.js";
|
|
11
|
+
/**
|
|
12
|
+
* Builds a `CreateMcpServerFn` that closes over the shared runtime singletons
|
|
13
|
+
* (Telegram client, memory database accessor). The returned function is the
|
|
14
|
+
* factory that `startHttpServer` / `startStdioServer` call per-connection.
|
|
15
|
+
*/
|
|
16
|
+
export declare function buildMcpServerFactory(telegram: TelegramClient, telegramChatId: string, getMemoryDb: () => Database): CreateMcpServerFn;
|
|
17
|
+
//# sourceMappingURL=factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"factory.d.ts","sourceRoot":"","sources":["../../src/server/factory.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAW/C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAUrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAMrD;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,cAAc,EACxB,cAAc,EAAE,MAAM,EACtB,WAAW,EAAE,MAAM,QAAQ,GAC1B,iBAAiB,CAGnB"}
|