sensorium-mcp 2.16.29 → 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 -1373
- 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 -404
- 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/drive.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../src/drive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"drive.d.ts","sourceRoot":"","sources":["../src/drive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAiBH;;;GAGG;AACH,eAAO,MAAM,sBAAsB,oFAC2C,CAAC;AAE/E;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,WAAW,CAoCrF"}
|
package/dist/drive.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* Phase 2: Intention Elicitation — open-ended autonomy prompt
|
|
10
10
|
* Phase 3: Approval Gate — encouragement if agent didn't engage
|
|
11
11
|
*/
|
|
12
|
-
import { loadTemplate, renderTemplate } from "./
|
|
12
|
+
import { loadTemplate, renderTemplate } from "./data/templates.js";
|
|
13
13
|
/**
|
|
14
14
|
* Default Phase 2 elicitation prompt — used when no custom template exists.
|
|
15
15
|
*/
|
|
@@ -17,6 +17,8 @@ const DEFAULT_PHASE2_PROMPT = `The operator is away. The session is yours.
|
|
|
17
17
|
|
|
18
18
|
You have all the tools, full memory access, and complete autonomy. You are free to do whatever you find most interesting or valuable.
|
|
19
19
|
|
|
20
|
+
Suggested first action: run \`node scripts/lint-architecture.mjs\` to verify no source file exceeds 300 lines and no circular imports exist.
|
|
21
|
+
|
|
20
22
|
What do you want to do? Pick at least one action and go for it.
|
|
21
23
|
|
|
22
24
|
(If nothing interests you, say so — that's useful diagnostic information.)`;
|
package/dist/drive.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../src/drive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"drive.js","sourceRoot":"","sources":["../src/drive.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAEnE;;GAEG;AACH,MAAM,qBAAqB,GAAG;;;;;;;;2EAQ6C,CAAC;AAE5E;;;GAGG;AACH,MAAM,CAAC,MAAM,sBAAsB,GACjC,4EAA4E,CAAC;AAW/E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAc,EAAE,cAAsB;IACtE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;IAE5C,2CAA2C;IAC3C,IAAI,SAAS,GAAG,cAAc,EAAE,CAAC;QAC/B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC5D,CAAC;IAED,0EAA0E;IAC1E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAC1B,CAAC,EACD,GAAG,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,GAAG,cAAc,CAAC,CAAC,CAC7E,CAAC;IAEF,gBAAgB;IAChB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;IAC3B,IAAI,IAAI,IAAI,WAAW,EAAE,CAAC;QACxB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACzD,CAAC;IAED,6DAA6D;IAC7D,MAAM,OAAO,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAEzC,4BAA4B;IAC5B,MAAM,cAAc,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,GAA2B;YACnC,UAAU,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;YAChC,WAAW,EAAE,CAAC,WAAW,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YAC3C,IAAI,EAAE,OAAO;SACd,CAAC;QACF,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,WAAW,EAAE,CAAC;IACxF,CAAC;IAED,mCAAmC;IACnC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,qBAAqB,EAAE,WAAW,EAAE,CAAC;AACzE,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,29 +1,10 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Remote Copilot MCP Server
|
|
3
|
+
* Remote Copilot MCP Server — entrypoint.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - Rich media (send_file, send_voice)
|
|
9
|
-
* - Scheduling (schedule_wake_up)
|
|
10
|
-
* - Persistent memory (memory_*)
|
|
11
|
-
*
|
|
12
|
-
* Required environment variables:
|
|
13
|
-
* TELEGRAM_TOKEN – Telegram Bot API token.
|
|
14
|
-
* TELEGRAM_CHAT_ID – ID of a Telegram forum supergroup (topics must be enabled).
|
|
15
|
-
* The bot must be an admin with can_manage_topics right.
|
|
16
|
-
* Each start_session call automatically creates a new topic
|
|
17
|
-
* thread so concurrent sessions never interfere.
|
|
18
|
-
*
|
|
19
|
-
* Optional environment variables:
|
|
20
|
-
* WAIT_TIMEOUT_MINUTES – How long to wait for a message before timing out
|
|
21
|
-
* and instructing the agent to call the tool again
|
|
22
|
-
* (default: 120).
|
|
23
|
-
* OPENAI_API_KEY – OpenAI API key for voice message transcription
|
|
24
|
-
* via Whisper and text-to-speech via TTS. Without it,
|
|
25
|
-
* voice messages show a placeholder and send_voice
|
|
26
|
-
* is disabled.
|
|
5
|
+
* Bootstraps shared singletons (Telegram client, dispatcher, memory DB)
|
|
6
|
+
* and selects the transport mode (HTTP or stdio). All per-session server
|
|
7
|
+
* creation and tool dispatch logic lives in ./server/factory.ts.
|
|
27
8
|
*/
|
|
28
9
|
export {};
|
|
29
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG"}
|
package/dist/index.js
CHANGED
|
@@ -1,57 +1,22 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
/**
|
|
3
|
-
* Remote Copilot MCP Server
|
|
3
|
+
* Remote Copilot MCP Server — entrypoint.
|
|
4
4
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* - Rich media (send_file, send_voice)
|
|
9
|
-
* - Scheduling (schedule_wake_up)
|
|
10
|
-
* - Persistent memory (memory_*)
|
|
11
|
-
*
|
|
12
|
-
* Required environment variables:
|
|
13
|
-
* TELEGRAM_TOKEN – Telegram Bot API token.
|
|
14
|
-
* TELEGRAM_CHAT_ID – ID of a Telegram forum supergroup (topics must be enabled).
|
|
15
|
-
* The bot must be an admin with can_manage_topics right.
|
|
16
|
-
* Each start_session call automatically creates a new topic
|
|
17
|
-
* thread so concurrent sessions never interfere.
|
|
18
|
-
*
|
|
19
|
-
* Optional environment variables:
|
|
20
|
-
* WAIT_TIMEOUT_MINUTES – How long to wait for a message before timing out
|
|
21
|
-
* and instructing the agent to call the tool again
|
|
22
|
-
* (default: 120).
|
|
23
|
-
* OPENAI_API_KEY – OpenAI API key for voice message transcription
|
|
24
|
-
* via Whisper and text-to-speech via TTS. Without it,
|
|
25
|
-
* voice messages show a placeholder and send_voice
|
|
26
|
-
* is disabled.
|
|
5
|
+
* Bootstraps shared singletons (Telegram client, dispatcher, memory DB)
|
|
6
|
+
* and selects the transport mode (HTTP or stdio). All per-session server
|
|
7
|
+
* creation and tool dispatch logic lives in ./server/factory.ts.
|
|
27
8
|
*/
|
|
28
|
-
import {
|
|
29
|
-
import {
|
|
30
|
-
import { checkMaintenanceFlag, config } from "./config.js";
|
|
31
|
-
import { peekThreadMessages, startDispatcher } from "./dispatcher.js";
|
|
32
|
-
import { formatDrivePrompt } from "./drive.js";
|
|
9
|
+
import { config } from "./config.js";
|
|
10
|
+
import { startDispatcher } from "./dispatcher.js";
|
|
33
11
|
import { initMemoryDb } from "./memory.js";
|
|
34
|
-
import { checkDueTasks } from "./scheduler.js";
|
|
35
|
-
import { DEAD_SESSION_TIMEOUT_MS, } from "./sessions.js";
|
|
36
12
|
import { TelegramClient } from "./telegram.js";
|
|
37
|
-
import { getToolDefinitions } from "./tool-definitions.js";
|
|
38
|
-
import { errorResult } from "./utils.js";
|
|
39
|
-
import { getReminders, getShortReminder } from "./response-builders.js";
|
|
40
13
|
import { startHttpServer } from "./http-server.js";
|
|
41
14
|
import { startStdioServer } from "./stdio-server.js";
|
|
42
|
-
import {
|
|
43
|
-
import { handleMemoryTool } from "./tools/memory-tools.js";
|
|
44
|
-
import { handleUtilityTool } from "./tools/utility-tools.js";
|
|
45
|
-
import { handleSessionTool } from "./tools/session-tools.js";
|
|
46
|
-
import { handleStartSession } from "./tools/start-session-tool.js";
|
|
47
|
-
import { handleWaitForInstructions } from "./tools/wait-tool.js";
|
|
48
|
-
// ---------------------------------------------------------------------------
|
|
49
|
-
// Destructure config for backwards-compatible local references
|
|
15
|
+
import { buildMcpServerFactory } from "./server/factory.js";
|
|
50
16
|
// ---------------------------------------------------------------------------
|
|
51
|
-
|
|
52
|
-
// ---------------------------------------------------------------------------
|
|
53
|
-
// Telegram client + dispatcher
|
|
17
|
+
// Shared singletons
|
|
54
18
|
// ---------------------------------------------------------------------------
|
|
19
|
+
const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
|
|
55
20
|
const telegram = new TelegramClient(TELEGRAM_TOKEN);
|
|
56
21
|
await startDispatcher(telegram, TELEGRAM_CHAT_ID);
|
|
57
22
|
// Memory database — initialized lazily on first use
|
|
@@ -62,252 +27,9 @@ function getMemoryDb() {
|
|
|
62
27
|
return memoryDb;
|
|
63
28
|
}
|
|
64
29
|
// ---------------------------------------------------------------------------
|
|
65
|
-
// MCP Server factory
|
|
66
|
-
// This is required because a single Server instance can only connect to one
|
|
67
|
-
// transport. In HTTP mode, each VS Code client gets its own Server instance.
|
|
68
|
-
// All instances share the same tool handler logic and in-process state.
|
|
30
|
+
// MCP Server factory (delegates to server/factory.ts)
|
|
69
31
|
// ---------------------------------------------------------------------------
|
|
70
|
-
|
|
71
|
-
// ── Per-session state (isolated per HTTP session / stdio connection) ─────
|
|
72
|
-
let waitCallCount = 0;
|
|
73
|
-
let sessionStartedAt = Date.now();
|
|
74
|
-
let currentThreadId;
|
|
75
|
-
let lastToolCallAt = Date.now();
|
|
76
|
-
let deadSessionAlerted = false;
|
|
77
|
-
let waitInProgress = false;
|
|
78
|
-
let lastOperatorMessageAt = Date.now();
|
|
79
|
-
let lastOperatorMessageText = "";
|
|
80
|
-
let lastConsolidationAt = 0;
|
|
81
|
-
let toolCallsSinceLastDelivery = 0;
|
|
82
|
-
let lastDriveAttemptAt = 0;
|
|
83
|
-
let drivePhase2Fired = false;
|
|
84
|
-
const previewedUpdateIds = new Set();
|
|
85
|
-
const PREVIEWED_IDS_CAP = 1000;
|
|
86
|
-
function addPreviewedId(id) {
|
|
87
|
-
if (previewedUpdateIds.size >= PREVIEWED_IDS_CAP) {
|
|
88
|
-
const toDelete = previewedUpdateIds.size - PREVIEWED_IDS_CAP + 100;
|
|
89
|
-
let deleted = 0;
|
|
90
|
-
for (const old of previewedUpdateIds) {
|
|
91
|
-
if (deleted >= toDelete)
|
|
92
|
-
break;
|
|
93
|
-
previewedUpdateIds.delete(old);
|
|
94
|
-
deleted++;
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
previewedUpdateIds.add(id);
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Generate a first-person DMN (Default Mode Network) reflection prompt.
|
|
101
|
-
* Called when the __DMN__ sentinel fires as a scheduled task.
|
|
102
|
-
*/
|
|
103
|
-
function generateDmnReflection(_threadId) {
|
|
104
|
-
try {
|
|
105
|
-
const idleMs = Date.now() - lastOperatorMessageAt;
|
|
106
|
-
const driveResult = formatDrivePrompt(idleMs, config.DMN_ACTIVATION_HOURS);
|
|
107
|
-
if (driveResult.activated && driveResult.prompt) {
|
|
108
|
-
return (`I've been thinking while the operator is away.\n\n` +
|
|
109
|
-
`${driveResult.prompt}\n\n` +
|
|
110
|
-
`If something here resonates, I should explore it — use subagents, search the codebase, review memory. ` +
|
|
111
|
-
`Report what I find, then go back to hibernation or continue waiting.`);
|
|
112
|
-
}
|
|
113
|
-
return "I should review memory and the codebase for anything interesting while the operator is away.";
|
|
114
|
-
}
|
|
115
|
-
catch {
|
|
116
|
-
return "I should review memory and the codebase for anything interesting while the operator is away.";
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
function resolveThreadId(args) {
|
|
120
|
-
const raw = args?.threadId;
|
|
121
|
-
const explicit = typeof raw === "number" ? raw
|
|
122
|
-
: typeof raw === "string" ? Number(raw)
|
|
123
|
-
: undefined;
|
|
124
|
-
if (explicit !== undefined && Number.isFinite(explicit)) {
|
|
125
|
-
currentThreadId = explicit;
|
|
126
|
-
return explicit;
|
|
127
|
-
}
|
|
128
|
-
return currentThreadId;
|
|
129
|
-
}
|
|
130
|
-
const memoryToolCtx = {
|
|
131
|
-
resolveThreadId,
|
|
132
|
-
getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
|
|
133
|
-
getMemoryDb,
|
|
134
|
-
errorResult,
|
|
135
|
-
onConsolidation: () => { lastConsolidationAt = Date.now(); },
|
|
136
|
-
};
|
|
137
|
-
const srv = new Server({ name: "sensorium-mcp", version: PKG_VERSION }, { capabilities: { tools: {} } });
|
|
138
|
-
// Dead session detector — per-session, runs every 2 minutes
|
|
139
|
-
const deadSessionInterval = setInterval(async () => {
|
|
140
|
-
if (!currentThreadId)
|
|
141
|
-
return;
|
|
142
|
-
// Skip check when wait_for_instructions is actively running — the session
|
|
143
|
-
// is definitively alive even if lastToolCallAt hasn't been refreshed.
|
|
144
|
-
if (waitInProgress)
|
|
145
|
-
return;
|
|
146
|
-
const elapsed = Date.now() - lastToolCallAt;
|
|
147
|
-
if (elapsed > DEAD_SESSION_TIMEOUT_MS && !deadSessionAlerted) {
|
|
148
|
-
deadSessionAlerted = true;
|
|
149
|
-
try {
|
|
150
|
-
// Use existing module-level telegram instance
|
|
151
|
-
const minutes = Math.round(elapsed / 60000);
|
|
152
|
-
await telegram.sendMessage(TELEGRAM_CHAT_ID, `⚠️ *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);
|
|
153
|
-
}
|
|
154
|
-
catch (_) { /* non-fatal */ }
|
|
155
|
-
}
|
|
156
|
-
}, 2 * 60 * 1000);
|
|
157
|
-
// Clean up the interval when the server closes
|
|
158
|
-
srv.onclose = () => {
|
|
159
|
-
clearInterval(deadSessionInterval);
|
|
160
|
-
};
|
|
161
|
-
// ── Tool definitions ────────────────────────────────────────────────────────
|
|
162
|
-
srv.setRequestHandler(ListToolsRequestSchema, async () => ({
|
|
163
|
-
tools: getToolDefinitions(),
|
|
164
|
-
}));
|
|
165
|
-
// ── Tool implementations ────────────────────────────────────────────────────
|
|
166
|
-
srv.setRequestHandler(CallToolRequestSchema, async (request, extra) => {
|
|
167
|
-
const { name, arguments: args } = request.params;
|
|
168
|
-
// Verbose logging: tool call dispatch
|
|
169
|
-
const argsSummary = args ? JSON.stringify(args).slice(0, 200) : "{}";
|
|
170
|
-
log.verbose("dispatch", `Tool call: ${name} args=${argsSummary}`);
|
|
171
|
-
// Dead session detection — update timestamp on any tool call.
|
|
172
|
-
// Only reset the alert flag when wait_for_instructions is called,
|
|
173
|
-
// as that's the primary health signal (agent is actively polling).
|
|
174
|
-
lastToolCallAt = Date.now();
|
|
175
|
-
// Track tool calls for activity monitoring
|
|
176
|
-
toolCallsSinceLastDelivery++;
|
|
177
|
-
// ── start_session ─────────────────────────────────────────────────────────
|
|
178
|
-
if (name === "start_session") {
|
|
179
|
-
const startSessionCtx = {
|
|
180
|
-
session: {
|
|
181
|
-
get currentThreadId() { return currentThreadId; },
|
|
182
|
-
set currentThreadId(v) { currentThreadId = v; },
|
|
183
|
-
get sessionStartedAt() { return sessionStartedAt; },
|
|
184
|
-
set sessionStartedAt(v) { sessionStartedAt = v; },
|
|
185
|
-
get waitCallCount() { return waitCallCount; },
|
|
186
|
-
set waitCallCount(v) { waitCallCount = v; },
|
|
187
|
-
get lastToolCallAt() { return lastToolCallAt; },
|
|
188
|
-
set lastToolCallAt(v) { lastToolCallAt = v; },
|
|
189
|
-
get deadSessionAlerted() { return deadSessionAlerted; },
|
|
190
|
-
set deadSessionAlerted(v) { deadSessionAlerted = v; },
|
|
191
|
-
get toolCallsSinceLastDelivery() { return toolCallsSinceLastDelivery; },
|
|
192
|
-
set toolCallsSinceLastDelivery(v) { toolCallsSinceLastDelivery = v; },
|
|
193
|
-
previewedUpdateIds,
|
|
194
|
-
get lastOperatorMessageAt() { return lastOperatorMessageAt; },
|
|
195
|
-
set lastOperatorMessageAt(v) { lastOperatorMessageAt = v; },
|
|
196
|
-
get lastOperatorMessageText() { return lastOperatorMessageText; },
|
|
197
|
-
set lastOperatorMessageText(v) { lastOperatorMessageText = v; },
|
|
198
|
-
get lastConsolidationAt() { return lastConsolidationAt; },
|
|
199
|
-
set lastConsolidationAt(v) { lastConsolidationAt = v; },
|
|
200
|
-
},
|
|
201
|
-
telegram,
|
|
202
|
-
telegramChatId: TELEGRAM_CHAT_ID,
|
|
203
|
-
config,
|
|
204
|
-
getMemoryDb,
|
|
205
|
-
getReminders,
|
|
206
|
-
getMcpSessionId,
|
|
207
|
-
closeTransport,
|
|
208
|
-
};
|
|
209
|
-
return handleStartSession((args ?? {}), startSessionCtx);
|
|
210
|
-
}
|
|
211
|
-
// ── remote_copilot_wait_for_instructions ──────────────────────────────────
|
|
212
|
-
if (name === "remote_copilot_wait_for_instructions") {
|
|
213
|
-
const waitCtx = {
|
|
214
|
-
state: {
|
|
215
|
-
get currentThreadId() { return currentThreadId; },
|
|
216
|
-
set currentThreadId(v) { currentThreadId = v; },
|
|
217
|
-
get sessionStartedAt() { return sessionStartedAt; },
|
|
218
|
-
set sessionStartedAt(v) { sessionStartedAt = v; },
|
|
219
|
-
get waitCallCount() { return waitCallCount; },
|
|
220
|
-
set waitCallCount(v) { waitCallCount = v; },
|
|
221
|
-
get lastToolCallAt() { return lastToolCallAt; },
|
|
222
|
-
set lastToolCallAt(v) { lastToolCallAt = v; },
|
|
223
|
-
get deadSessionAlerted() { return deadSessionAlerted; },
|
|
224
|
-
set deadSessionAlerted(v) { deadSessionAlerted = v; },
|
|
225
|
-
get toolCallsSinceLastDelivery() { return toolCallsSinceLastDelivery; },
|
|
226
|
-
set toolCallsSinceLastDelivery(v) { toolCallsSinceLastDelivery = v; },
|
|
227
|
-
get lastOperatorMessageAt() { return lastOperatorMessageAt; },
|
|
228
|
-
set lastOperatorMessageAt(v) { lastOperatorMessageAt = v; },
|
|
229
|
-
get lastOperatorMessageText() { return lastOperatorMessageText; },
|
|
230
|
-
set lastOperatorMessageText(v) { lastOperatorMessageText = v; },
|
|
231
|
-
get lastConsolidationAt() { return lastConsolidationAt; },
|
|
232
|
-
set lastConsolidationAt(v) { lastConsolidationAt = v; },
|
|
233
|
-
get lastDriveAttemptAt() { return lastDriveAttemptAt; },
|
|
234
|
-
set lastDriveAttemptAt(v) { lastDriveAttemptAt = v; },
|
|
235
|
-
get drivePhase2Fired() { return drivePhase2Fired; },
|
|
236
|
-
set drivePhase2Fired(v) { drivePhase2Fired = v; },
|
|
237
|
-
previewedUpdateIds,
|
|
238
|
-
},
|
|
239
|
-
addPreviewedId,
|
|
240
|
-
generateDmnReflection,
|
|
241
|
-
resolveThreadId,
|
|
242
|
-
telegram,
|
|
243
|
-
telegramChatId: TELEGRAM_CHAT_ID,
|
|
244
|
-
getMemoryDb,
|
|
245
|
-
config,
|
|
246
|
-
errorResult,
|
|
247
|
-
};
|
|
248
|
-
waitInProgress = true;
|
|
249
|
-
try {
|
|
250
|
-
return await handleWaitForInstructions((args ?? {}), waitCtx, extra);
|
|
251
|
-
}
|
|
252
|
-
finally {
|
|
253
|
-
waitInProgress = false;
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
// ── report_progress / hibernate ───────────────────────────────────────────
|
|
257
|
-
if (name === "report_progress" || name === "hibernate") {
|
|
258
|
-
const typedArgs = (args ?? {});
|
|
259
|
-
const sessionToolCtx = {
|
|
260
|
-
resolveThreadId,
|
|
261
|
-
getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
|
|
262
|
-
errorResult,
|
|
263
|
-
telegram,
|
|
264
|
-
telegramChatId: TELEGRAM_CHAT_ID,
|
|
265
|
-
peekThreadMessages,
|
|
266
|
-
checkMaintenanceFlag,
|
|
267
|
-
checkDueTasks,
|
|
268
|
-
generateDmnReflection,
|
|
269
|
-
lastOperatorMessageAt,
|
|
270
|
-
lastOperatorMessageText,
|
|
271
|
-
previewedUpdateIds,
|
|
272
|
-
addPreviewedId,
|
|
273
|
-
};
|
|
274
|
-
return handleSessionTool(name, typedArgs, sessionToolCtx, extra);
|
|
275
|
-
}
|
|
276
|
-
// ── send_file / send_voice / schedule_wake_up ─────────────────────────────
|
|
277
|
-
if (["send_file", "send_voice", "schedule_wake_up", "send_sticker"].includes(name)) {
|
|
278
|
-
const typedArgs = (args ?? {});
|
|
279
|
-
const utilityCtx = {
|
|
280
|
-
resolveThreadId,
|
|
281
|
-
getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
|
|
282
|
-
errorResult,
|
|
283
|
-
telegram,
|
|
284
|
-
config,
|
|
285
|
-
sessionStartedAt,
|
|
286
|
-
};
|
|
287
|
-
return handleUtilityTool(name, typedArgs, utilityCtx);
|
|
288
|
-
}
|
|
289
|
-
// ── memory_* tools ──────────────────────────────────────────────────────
|
|
290
|
-
if (name.startsWith("memory_")) {
|
|
291
|
-
return handleMemoryTool(name, (args ?? {}), memoryToolCtx);
|
|
292
|
-
}
|
|
293
|
-
// ── get_version ──────────────────────────────────────────────────────────
|
|
294
|
-
if (name === "get_version") {
|
|
295
|
-
const typedArgs = (args ?? {});
|
|
296
|
-
const utilityCtx = {
|
|
297
|
-
resolveThreadId,
|
|
298
|
-
getShortReminder: (threadId) => getShortReminder(threadId, sessionStartedAt),
|
|
299
|
-
errorResult,
|
|
300
|
-
telegram,
|
|
301
|
-
config,
|
|
302
|
-
sessionStartedAt,
|
|
303
|
-
};
|
|
304
|
-
return handleUtilityTool(name, typedArgs, utilityCtx);
|
|
305
|
-
}
|
|
306
|
-
// Unknown tool
|
|
307
|
-
return errorResult(`Unknown tool: ${name}`);
|
|
308
|
-
});
|
|
309
|
-
return srv;
|
|
310
|
-
}
|
|
32
|
+
const createMcpServer = buildMcpServerFactory(telegram, TELEGRAM_CHAT_ID, getMemoryDb);
|
|
311
33
|
// ---------------------------------------------------------------------------
|
|
312
34
|
// Start the server
|
|
313
35
|
// ---------------------------------------------------------------------------
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;GAMG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D,8EAA8E;AAC9E,oBAAoB;AACpB,8EAA8E;AAE9E,MAAM,EAAE,cAAc,EAAE,gBAAgB,EAAE,GAAG,MAAM,CAAC;AAEpD,MAAM,QAAQ,GAAG,IAAI,cAAc,CAAC,cAAc,CAAC,CAAC;AAEpD,MAAM,eAAe,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC;AAElD,oDAAoD;AACpD,IAAI,QAAQ,GAA2C,IAAI,CAAC;AAC5D,SAAS,WAAW;IAClB,IAAI,CAAC,QAAQ;QAAE,QAAQ,GAAG,YAAY,EAAE,CAAC;IACzC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,8EAA8E;AAC9E,sDAAsD;AACtD,8EAA8E;AAE9E,MAAM,eAAe,GAAG,qBAAqB,CAAC,QAAQ,EAAE,gBAAgB,EAAE,WAAW,CAAC,CAAC;AAEvF,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,aAAa;IACpB,IAAI,QAAQ,EAAE,CAAC;QACb,IAAI,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;QACzD,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACjG,IAAI,QAAQ,EAAE,CAAC;IACb,eAAe,CAAC,eAAe,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;AAC/D,CAAC;KAAM,CAAC;IACN,MAAM,gBAAgB,CAAC,eAAe,EAAE,aAAa,CAAC,CAAC;AACzD,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat completion and embedding functions using the OpenAI API.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from openai.ts to keep that module focused on
|
|
5
|
+
* voice / vision services while this module handles text-level
|
|
6
|
+
* AI calls (chat completions, embeddings, cosine similarity).
|
|
7
|
+
*/
|
|
8
|
+
export interface ChatMessage {
|
|
9
|
+
role: "system" | "user" | "assistant";
|
|
10
|
+
content: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Lightweight chat completion using GPT-4o-mini.
|
|
14
|
+
* Used for context preprocessing, not for agent dialogue.
|
|
15
|
+
* Returns the assistant's text response.
|
|
16
|
+
*/
|
|
17
|
+
export declare function chatCompletion(messages: ChatMessage[], apiKey: string, options?: {
|
|
18
|
+
maxTokens?: number;
|
|
19
|
+
temperature?: number;
|
|
20
|
+
timeoutMs?: number;
|
|
21
|
+
}): Promise<string>;
|
|
22
|
+
/**
|
|
23
|
+
* Generate an embedding vector for text using OpenAI's text-embedding-3-small model.
|
|
24
|
+
* Returns a Float32Array of 1536 dimensions.
|
|
25
|
+
*/
|
|
26
|
+
export declare function generateEmbedding(text: string, apiKey: string): Promise<Float32Array>;
|
|
27
|
+
/** Compute cosine similarity between two embedding vectors. Returns value in [-1, 1]. */
|
|
28
|
+
export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
|
|
29
|
+
//# sourceMappingURL=chat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.d.ts","sourceRoot":"","sources":["../../../src/integrations/openai/chat.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,WAAW;IACxB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC;IACtC,OAAO,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,cAAc,CAChC,QAAQ,EAAE,WAAW,EAAE,EACvB,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAwB3F;AAID,yFAAyF;AACzF,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CASzE"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Chat completion and embedding functions using the OpenAI API.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from openai.ts to keep that module focused on
|
|
5
|
+
* voice / vision services while this module handles text-level
|
|
6
|
+
* AI calls (chat completions, embeddings, cosine similarity).
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Lightweight chat completion using GPT-4o-mini.
|
|
10
|
+
* Used for context preprocessing, not for agent dialogue.
|
|
11
|
+
* Returns the assistant's text response.
|
|
12
|
+
*/
|
|
13
|
+
export async function chatCompletion(messages, apiKey, options) {
|
|
14
|
+
const controller = new AbortController();
|
|
15
|
+
const timer = setTimeout(() => controller.abort(), options?.timeoutMs ?? 15_000);
|
|
16
|
+
try {
|
|
17
|
+
const response = await fetch("https://api.openai.com/v1/chat/completions", {
|
|
18
|
+
method: "POST",
|
|
19
|
+
headers: {
|
|
20
|
+
"Content-Type": "application/json",
|
|
21
|
+
Authorization: `Bearer ${apiKey}`,
|
|
22
|
+
},
|
|
23
|
+
body: JSON.stringify({
|
|
24
|
+
model: "gpt-4o-mini",
|
|
25
|
+
messages,
|
|
26
|
+
max_completion_tokens: options?.maxTokens ?? 300,
|
|
27
|
+
temperature: options?.temperature ?? 0,
|
|
28
|
+
}),
|
|
29
|
+
signal: controller.signal,
|
|
30
|
+
});
|
|
31
|
+
if (!response.ok) {
|
|
32
|
+
throw new Error(`OpenAI chat API error: ${response.status} ${response.statusText}`);
|
|
33
|
+
}
|
|
34
|
+
const json = await response.json();
|
|
35
|
+
return json.choices[0]?.message?.content ?? "";
|
|
36
|
+
}
|
|
37
|
+
finally {
|
|
38
|
+
clearTimeout(timer);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
// ─── Embeddings ───────────────────────────────────────────────────────────
|
|
42
|
+
/**
|
|
43
|
+
* Generate an embedding vector for text using OpenAI's text-embedding-3-small model.
|
|
44
|
+
* Returns a Float32Array of 1536 dimensions.
|
|
45
|
+
*/
|
|
46
|
+
export async function generateEmbedding(text, apiKey) {
|
|
47
|
+
const controller = new AbortController();
|
|
48
|
+
const timer = setTimeout(() => controller.abort(), 30_000);
|
|
49
|
+
try {
|
|
50
|
+
const response = await fetch("https://api.openai.com/v1/embeddings", {
|
|
51
|
+
method: "POST",
|
|
52
|
+
headers: {
|
|
53
|
+
"Content-Type": "application/json",
|
|
54
|
+
Authorization: `Bearer ${apiKey}`,
|
|
55
|
+
},
|
|
56
|
+
body: JSON.stringify({
|
|
57
|
+
model: "text-embedding-3-small",
|
|
58
|
+
input: text.slice(0, 8000), // model supports 8191 tokens
|
|
59
|
+
}),
|
|
60
|
+
signal: controller.signal,
|
|
61
|
+
});
|
|
62
|
+
if (!response.ok) {
|
|
63
|
+
throw new Error(`OpenAI embedding API error: ${response.status} ${response.statusText}`);
|
|
64
|
+
}
|
|
65
|
+
const json = await response.json();
|
|
66
|
+
return new Float32Array(json.data[0].embedding);
|
|
67
|
+
}
|
|
68
|
+
finally {
|
|
69
|
+
clearTimeout(timer);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// ─── Vector Similarity ───────────────────────────────────────────────────
|
|
73
|
+
/** Compute cosine similarity between two embedding vectors. Returns value in [-1, 1]. */
|
|
74
|
+
export function cosineSimilarity(a, b) {
|
|
75
|
+
let dot = 0, normA = 0, normB = 0;
|
|
76
|
+
for (let i = 0; i < a.length; i++) {
|
|
77
|
+
dot += a[i] * b[i];
|
|
78
|
+
normA += a[i] * a[i];
|
|
79
|
+
normB += b[i] * b[i];
|
|
80
|
+
}
|
|
81
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
82
|
+
return denom === 0 ? 0 : dot / denom;
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=chat.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.js","sourceRoot":"","sources":["../../../src/integrations/openai/chat.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/openai/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/openai/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,YAAY,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI speech services: TTS (text-to-speech) and Whisper transcription.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from openai.ts for modular decomposition (Phase 3B).
|
|
5
|
+
*/
|
|
6
|
+
/** Valid TTS voice names. */
|
|
7
|
+
export declare const TTS_VOICES: readonly ["alloy", "echo", "fable", "onyx", "nova", "shimmer"];
|
|
8
|
+
export type TTSVoice = typeof TTS_VOICES[number];
|
|
9
|
+
/**
|
|
10
|
+
* Convert text to speech using OpenAI TTS API.
|
|
11
|
+
* Returns OGG Opus audio suitable for Telegram's sendVoice.
|
|
12
|
+
*/
|
|
13
|
+
export declare function textToSpeech(text: string, apiKey: string, voice?: TTSVoice): Promise<Buffer>;
|
|
14
|
+
/**
|
|
15
|
+
* Transcribe an audio buffer using OpenAI Whisper API.
|
|
16
|
+
* @param audioBuffer Raw audio content (OGG Opus from Telegram voice messages).
|
|
17
|
+
* @param apiKey OpenAI API key.
|
|
18
|
+
* @returns The transcribed text (empty string if no speech detected).
|
|
19
|
+
*/
|
|
20
|
+
export declare function transcribeAudio(audioBuffer: Buffer, apiKey: string, filename?: string): Promise<string>;
|
|
21
|
+
//# sourceMappingURL=speech.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"speech.d.ts","sourceRoot":"","sources":["../../../src/integrations/openai/speech.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,6BAA6B;AAC7B,eAAO,MAAM,UAAU,gEAEb,CAAC;AACX,MAAM,MAAM,QAAQ,GAAG,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC;AAEjD;;;GAGG;AACH,wBAAsB,YAAY,CAC9B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,QAAiB,GACzB,OAAO,CAAC,MAAM,CAAC,CA4BjB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CACjC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAAoB,GAC/B,OAAO,CAAC,MAAM,CAAC,CAoCjB"}
|