@cogitator-ai/channels 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +349 -0
  2. package/dist/assistant-config.d.ts +92 -0
  3. package/dist/assistant-config.d.ts.map +1 -0
  4. package/dist/assistant-config.js +89 -0
  5. package/dist/assistant-config.js.map +1 -0
  6. package/dist/capabilities.d.ts +14 -0
  7. package/dist/capabilities.d.ts.map +1 -0
  8. package/dist/capabilities.js +28 -0
  9. package/dist/capabilities.js.map +1 -0
  10. package/dist/channels/discord.d.ts +26 -0
  11. package/dist/channels/discord.d.ts.map +1 -0
  12. package/dist/channels/discord.js +153 -0
  13. package/dist/channels/discord.js.map +1 -0
  14. package/dist/channels/slack.d.ts +23 -0
  15. package/dist/channels/slack.d.ts.map +1 -0
  16. package/dist/channels/slack.js +89 -0
  17. package/dist/channels/slack.js.map +1 -0
  18. package/dist/channels/telegram.d.ts +30 -0
  19. package/dist/channels/telegram.d.ts.map +1 -0
  20. package/dist/channels/telegram.js +236 -0
  21. package/dist/channels/telegram.js.map +1 -0
  22. package/dist/channels/terminal.d.ts +30 -0
  23. package/dist/channels/terminal.d.ts.map +1 -0
  24. package/dist/channels/terminal.js +110 -0
  25. package/dist/channels/terminal.js.map +1 -0
  26. package/dist/channels/webchat.d.ts +24 -0
  27. package/dist/channels/webchat.d.ts.map +1 -0
  28. package/dist/channels/webchat.js +106 -0
  29. package/dist/channels/webchat.js.map +1 -0
  30. package/dist/channels/whatsapp.d.ts +28 -0
  31. package/dist/channels/whatsapp.d.ts.map +1 -0
  32. package/dist/channels/whatsapp.js +117 -0
  33. package/dist/channels/whatsapp.js.map +1 -0
  34. package/dist/envelope.d.ts +4 -0
  35. package/dist/envelope.d.ts.map +1 -0
  36. package/dist/envelope.js +64 -0
  37. package/dist/envelope.js.map +1 -0
  38. package/dist/formatters/discord-chunker.d.ts +6 -0
  39. package/dist/formatters/discord-chunker.d.ts.map +1 -0
  40. package/dist/formatters/discord-chunker.js +169 -0
  41. package/dist/formatters/discord-chunker.js.map +1 -0
  42. package/dist/formatters/markdown.d.ts +5 -0
  43. package/dist/formatters/markdown.d.ts.map +1 -0
  44. package/dist/formatters/markdown.js +59 -0
  45. package/dist/formatters/markdown.js.map +1 -0
  46. package/dist/formatters/whatsapp-markdown.d.ts +2 -0
  47. package/dist/formatters/whatsapp-markdown.d.ts.map +1 -0
  48. package/dist/formatters/whatsapp-markdown.js +26 -0
  49. package/dist/formatters/whatsapp-markdown.js.map +1 -0
  50. package/dist/gateway.d.ts +38 -0
  51. package/dist/gateway.d.ts.map +1 -0
  52. package/dist/gateway.js +347 -0
  53. package/dist/gateway.js.map +1 -0
  54. package/dist/heartbeat.d.ts +28 -0
  55. package/dist/heartbeat.d.ts.map +1 -0
  56. package/dist/heartbeat.js +143 -0
  57. package/dist/heartbeat.js.map +1 -0
  58. package/dist/hooks.d.ts +4 -0
  59. package/dist/hooks.d.ts.map +1 -0
  60. package/dist/hooks.js +30 -0
  61. package/dist/hooks.js.map +1 -0
  62. package/dist/inbound-debounce.d.ts +13 -0
  63. package/dist/inbound-debounce.d.ts.map +1 -0
  64. package/dist/inbound-debounce.js +61 -0
  65. package/dist/inbound-debounce.js.map +1 -0
  66. package/dist/index.d.ts +54 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +33 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/media/deepgram-stt.d.ts +14 -0
  71. package/dist/media/deepgram-stt.d.ts.map +1 -0
  72. package/dist/media/deepgram-stt.js +30 -0
  73. package/dist/media/deepgram-stt.js.map +1 -0
  74. package/dist/media/index.d.ts +7 -0
  75. package/dist/media/index.d.ts.map +1 -0
  76. package/dist/media/index.js +5 -0
  77. package/dist/media/index.js.map +1 -0
  78. package/dist/media/media-processor.d.ts +20 -0
  79. package/dist/media/media-processor.d.ts.map +1 -0
  80. package/dist/media/media-processor.js +80 -0
  81. package/dist/media/media-processor.js.map +1 -0
  82. package/dist/media/whisper-api.d.ts +22 -0
  83. package/dist/media/whisper-api.d.ts.map +1 -0
  84. package/dist/media/whisper-api.js +53 -0
  85. package/dist/media/whisper-api.js.map +1 -0
  86. package/dist/media/whisper-local.d.ts +16 -0
  87. package/dist/media/whisper-local.d.ts.map +1 -0
  88. package/dist/media/whisper-local.js +155 -0
  89. package/dist/media/whisper-local.js.map +1 -0
  90. package/dist/media/whisper-tool.d.ts +4 -0
  91. package/dist/media/whisper-tool.d.ts.map +1 -0
  92. package/dist/media/whisper-tool.js +19 -0
  93. package/dist/media/whisper-tool.js.map +1 -0
  94. package/dist/message-queue.d.ts +17 -0
  95. package/dist/message-queue.d.ts.map +1 -0
  96. package/dist/message-queue.js +115 -0
  97. package/dist/message-queue.js.map +1 -0
  98. package/dist/middleware/auto-extract.d.ts +36 -0
  99. package/dist/middleware/auto-extract.d.ts.map +1 -0
  100. package/dist/middleware/auto-extract.js +73 -0
  101. package/dist/middleware/auto-extract.js.map +1 -0
  102. package/dist/middleware/dm-policy.d.ts +39 -0
  103. package/dist/middleware/dm-policy.d.ts.map +1 -0
  104. package/dist/middleware/dm-policy.js +177 -0
  105. package/dist/middleware/dm-policy.js.map +1 -0
  106. package/dist/middleware/owner-commands.d.ts +25 -0
  107. package/dist/middleware/owner-commands.d.ts.map +1 -0
  108. package/dist/middleware/owner-commands.js +131 -0
  109. package/dist/middleware/owner-commands.js.map +1 -0
  110. package/dist/middleware/pairing.d.ts +20 -0
  111. package/dist/middleware/pairing.d.ts.map +1 -0
  112. package/dist/middleware/pairing.js +70 -0
  113. package/dist/middleware/pairing.js.map +1 -0
  114. package/dist/middleware/rate-limit.d.ts +14 -0
  115. package/dist/middleware/rate-limit.d.ts.map +1 -0
  116. package/dist/middleware/rate-limit.js +31 -0
  117. package/dist/middleware/rate-limit.js.map +1 -0
  118. package/dist/runtime-builder.d.ts +42 -0
  119. package/dist/runtime-builder.d.ts.map +1 -0
  120. package/dist/runtime-builder.js +607 -0
  121. package/dist/runtime-builder.js.map +1 -0
  122. package/dist/simple-timer-store.d.ts +28 -0
  123. package/dist/simple-timer-store.d.ts.map +1 -0
  124. package/dist/simple-timer-store.js +129 -0
  125. package/dist/simple-timer-store.js.map +1 -0
  126. package/dist/status-reactions.d.ts +22 -0
  127. package/dist/status-reactions.d.ts.map +1 -0
  128. package/dist/status-reactions.js +86 -0
  129. package/dist/status-reactions.js.map +1 -0
  130. package/dist/stream-buffer.d.ts +31 -0
  131. package/dist/stream-buffer.d.ts.map +1 -0
  132. package/dist/stream-buffer.js +170 -0
  133. package/dist/stream-buffer.js.map +1 -0
  134. package/dist/tools/self-config.d.ts +9 -0
  135. package/dist/tools/self-config.d.ts.map +1 -0
  136. package/dist/tools/self-config.js +122 -0
  137. package/dist/tools/self-config.js.map +1 -0
  138. package/package.json +102 -0
@@ -0,0 +1,607 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ import { Agent, Cogitator, builtinTools, createMemoryTools, createSchedulerTools, createCapabilitiesTool, createDeviceTools, createSelfTools, loadCustomTools, parseModel, tool as createTool, } from '@cogitator-ai/core';
4
+ import { SQLiteAdapter, SQLiteGraphAdapter, CoreFactsStore, LLMEntityExtractor, createEmbeddingService, InMemoryEmbeddingAdapter, } from '@cogitator-ai/memory';
5
+ import { createSelfConfigTools } from './tools/self-config';
6
+ import { Gateway } from './gateway';
7
+ import { HeartbeatScheduler } from './heartbeat';
8
+ import { SimpleTimerStore } from './simple-timer-store';
9
+ import { telegramChannel } from './channels/telegram';
10
+ import { discordChannel } from './channels/discord';
11
+ import { slackChannel } from './channels/slack';
12
+ import { terminalChannel } from './channels/terminal';
13
+ import { ownerCommands } from './middleware/owner-commands';
14
+ import { rateLimit } from './middleware/rate-limit';
15
+ import { autoExtract } from './middleware/auto-extract';
16
+ import { dmPolicy } from './middleware/dm-policy';
17
+ import { generateCapabilitiesDoc } from './capabilities';
18
+ import { MediaProcessor } from './media/media-processor';
19
+ import { LocalWhisper } from './media/whisper-local';
20
+ import { createWhisperDownloadTool } from './media/whisper-tool';
21
+ import { GroqSttProvider, OpenAISttProvider } from './media/whisper-api';
22
+ import { DeepgramSttProvider } from './media/deepgram-stt';
23
+ export class RuntimeBuilder {
24
+ config;
25
+ env;
26
+ opts;
27
+ constructor(config, env, opts) {
28
+ this.config = config;
29
+ this.env = env;
30
+ this.opts = opts;
31
+ }
32
+ async build() {
33
+ const cogitator = this.buildCogitator();
34
+ const cleanupResources = { mcpClients: [] };
35
+ const memoryPath = this.config.memory.path ?? '~/.cogitator/memory.db';
36
+ const resolvedPath = memoryPath.replace(/^~/, homedir());
37
+ const memoryAdapter = new SQLiteAdapter({ provider: 'sqlite', path: resolvedPath });
38
+ await memoryAdapter.connect();
39
+ cogitator.memory = memoryAdapter;
40
+ let graphAdapter = null;
41
+ if (this.config.memory.knowledgeGraph !== false) {
42
+ graphAdapter = new SQLiteGraphAdapter({ path: resolvedPath });
43
+ await graphAdapter.initialize();
44
+ }
45
+ const coreFacts = new CoreFactsStore({ path: resolvedPath });
46
+ await coreFacts.initialize();
47
+ const tools = [];
48
+ if (this.config.capabilities.webSearch) {
49
+ const hasSearchKey = this.env.TAVILY_API_KEY || this.env.BRAVE_API_KEY || this.env.SERPER_API_KEY;
50
+ if (hasSearchKey) {
51
+ const found = builtinTools.find((t) => t.name === 'web_search');
52
+ if (found)
53
+ tools.push(found);
54
+ }
55
+ }
56
+ if (this.config.capabilities.fileSystem) {
57
+ tools.push(...builtinTools.filter((t) => t.name.startsWith('file_')));
58
+ }
59
+ if (this.config.capabilities.github) {
60
+ const found = builtinTools.find((t) => t.name === 'github_api');
61
+ if (found)
62
+ tools.push(found);
63
+ }
64
+ tools.push(...builtinTools.filter((t) => t.name === 'calculator' || t.name === 'datetime'));
65
+ if (graphAdapter) {
66
+ tools.push(...createMemoryTools({
67
+ graphAdapter,
68
+ coreFacts,
69
+ agentId: this.config.name,
70
+ }));
71
+ }
72
+ let timerStore = null;
73
+ if (this.config.capabilities.scheduler) {
74
+ timerStore = new SimpleTimerStore({
75
+ persistPath: join(homedir(), '.cogitator', 'timers.json'),
76
+ });
77
+ const channelEntries = Object.entries(this.config.channels ?? {});
78
+ const firstChannel = channelEntries[0];
79
+ const firstOwnerId = firstChannel
80
+ ? firstChannel[1]?.ownerIds?.[0]
81
+ : undefined;
82
+ tools.push(...createSchedulerTools({
83
+ store: timerStore,
84
+ defaultChannel: firstChannel?.[0] ?? 'system',
85
+ defaultUserId: firstOwnerId,
86
+ }));
87
+ }
88
+ if (this.config.capabilities.deviceTools) {
89
+ tools.push(...createDeviceTools());
90
+ }
91
+ if (this.config.capabilities.selfConfig && this.opts?.configPath && this.opts.configHelpers) {
92
+ tools.push(...createSelfConfigTools({
93
+ configPath: this.opts.configPath,
94
+ ...this.opts.configHelpers,
95
+ onConfigUpdated: () => {
96
+ console.log(`[${this.config.name}] Config updated, restarting...`);
97
+ process.exit(78);
98
+ },
99
+ }));
100
+ }
101
+ const toolsDir = this.resolveToolsDir();
102
+ if (this.config.capabilities.selfTools) {
103
+ const customTools = await loadCustomTools(toolsDir);
104
+ if (customTools.length > 0) {
105
+ tools.push(...customTools);
106
+ console.log(`[${this.config.name}] Loaded ${customTools.length} custom tool(s)`);
107
+ }
108
+ tools.push(...createSelfTools({ toolsDir }));
109
+ }
110
+ const whisper = new LocalWhisper();
111
+ const sttProvider = this.buildSttProvider();
112
+ if (!sttProvider) {
113
+ tools.push(createWhisperDownloadTool(whisper));
114
+ }
115
+ const visionChecker = await this.buildVisionChecker();
116
+ const mediaProcessor = new MediaProcessor(whisper, visionChecker, sttProvider);
117
+ await this.wireBrowser(tools, cleanupResources);
118
+ await this.wireRAG(tools);
119
+ await this.wireMCPServers(tools, cleanupResources);
120
+ const coreFactsText = await coreFacts.formatForPrompt();
121
+ const channels = this.buildChannels();
122
+ const capDoc = generateCapabilitiesDoc({
123
+ tools: tools.map((t) => ({ name: t.name, description: t.description })),
124
+ channels: channels.map((c) => c.type),
125
+ });
126
+ tools.push(createCapabilitiesTool(capDoc));
127
+ const instructions = this.buildInstructions(coreFactsText);
128
+ const agent = new Agent({
129
+ name: this.config.name,
130
+ model: this.fullModelId,
131
+ instructions,
132
+ tools,
133
+ maxIterations: 15,
134
+ });
135
+ const middleware = [];
136
+ const ownerIds = {};
137
+ if (this.config.channels.telegram?.ownerIds?.[0]) {
138
+ ownerIds.telegram = this.config.channels.telegram.ownerIds[0];
139
+ }
140
+ if (this.config.channels.discord?.ownerIds?.[0]) {
141
+ ownerIds.discord = this.config.channels.discord.ownerIds[0];
142
+ }
143
+ if (this.config.channels.slack?.ownerIds?.[0]) {
144
+ ownerIds.slack = this.config.channels.slack.ownerIds[0];
145
+ }
146
+ if (this.config.security) {
147
+ middleware.push(dmPolicy({
148
+ mode: this.config.security.dmPolicy,
149
+ allowlist: this.config.security.allowlist,
150
+ groupPolicy: this.config.security.groupPolicy,
151
+ groupAllowlist: this.config.security.groupAllowlist,
152
+ storePath: this.config.security.storePath,
153
+ ownerIds,
154
+ }));
155
+ }
156
+ if (Object.keys(ownerIds).length > 0) {
157
+ middleware.push(ownerCommands({
158
+ ownerIds,
159
+ authorizedUserIds: this.config.security?.commandAccess?.authorized,
160
+ publicCommands: this.config.security?.commandAccess?.publicCommands,
161
+ }));
162
+ }
163
+ if (this.config.rateLimit) {
164
+ middleware.push(rateLimit({ maxPerMinute: this.config.rateLimit.maxPerMinute }));
165
+ }
166
+ if (this.config.memory.autoExtract !== false && graphAdapter) {
167
+ const extractorBackend = this.createExtractorBackend(cogitator);
168
+ const llmExtractor = new LLMEntityExtractor(extractorBackend);
169
+ const extractor = {
170
+ async extract(text) {
171
+ const result = await llmExtractor.extract(text);
172
+ return {
173
+ entities: result.entities.map((e) => ({
174
+ name: e.name,
175
+ type: e.type,
176
+ confidence: e.confidence,
177
+ description: e.description,
178
+ })),
179
+ relations: result.relations.map((r) => ({
180
+ from: r.sourceEntity,
181
+ to: r.targetEntity,
182
+ type: r.type,
183
+ confidence: r.confidence,
184
+ })),
185
+ };
186
+ },
187
+ };
188
+ middleware.push(autoExtract({
189
+ extractor,
190
+ graphAdapter,
191
+ agentId: this.config.name,
192
+ coreFacts,
193
+ }));
194
+ }
195
+ const streamConfig = this.config.stream
196
+ ? {
197
+ flushInterval: this.config.stream.flushInterval ?? 600,
198
+ minChunkSize: this.config.stream.minChunkSize ?? 30,
199
+ }
200
+ : { flushInterval: 600, minChunkSize: 30 };
201
+ const gateway = new Gateway({
202
+ agent,
203
+ cogitator,
204
+ channels,
205
+ middleware,
206
+ memory: memoryAdapter,
207
+ mediaProcessor,
208
+ stream: streamConfig,
209
+ session: this.config.memory.compaction
210
+ ? {
211
+ compaction: {
212
+ strategy: 'summary',
213
+ threshold: this.config.memory.compaction.threshold,
214
+ keepRecent: 10,
215
+ },
216
+ }
217
+ : undefined,
218
+ onError: (err, msg) => {
219
+ console.error(`[${this.config.name}] Error for ${msg.userId}:`, err.message);
220
+ },
221
+ });
222
+ const scheduler = this.buildScheduler(timerStore, gateway);
223
+ if (scheduler)
224
+ scheduler.start();
225
+ const cleanup = async () => {
226
+ if (scheduler)
227
+ scheduler.stop();
228
+ await gateway.stop();
229
+ await coreFacts.close();
230
+ if (graphAdapter)
231
+ await graphAdapter.close();
232
+ await memoryAdapter.disconnect();
233
+ if (cleanupResources.browserSession) {
234
+ await cleanupResources.browserSession.close().catch(() => { });
235
+ }
236
+ for (const client of cleanupResources.mcpClients) {
237
+ await client.close().catch(() => { });
238
+ }
239
+ await cogitator.close();
240
+ };
241
+ return { agent, cogitator, gateway, scheduler, cleanup };
242
+ }
243
+ createExtractorBackend(cogitator) {
244
+ const llmBackend = cogitator.getLLMBackend(this.fullModelId);
245
+ const modelName = parseModel(this.fullModelId).model;
246
+ return {
247
+ async chat(options) {
248
+ const response = await llmBackend.chat({
249
+ model: modelName,
250
+ messages: options.messages.map((m) => ({
251
+ role: m.role,
252
+ content: m.content,
253
+ })),
254
+ responseFormat: options.responseFormat,
255
+ });
256
+ return { content: response.content ?? '' };
257
+ },
258
+ };
259
+ }
260
+ async wireBrowser(tools, resources) {
261
+ if (!this.config.capabilities.browser)
262
+ return;
263
+ const browserCfg = this.config.capabilities.browser;
264
+ const headless = typeof browserCfg === 'object' ? (browserCfg.headless ?? true) : true;
265
+ const stealth = typeof browserCfg === 'object' ? (browserCfg.stealth ?? false) : false;
266
+ try {
267
+ const { BrowserSession, browserTools } = await import('@cogitator-ai/browser');
268
+ await this.ensurePlaywright();
269
+ const session = new BrowserSession({
270
+ headless,
271
+ ...(stealth ? { stealth: true } : {}),
272
+ });
273
+ tools.push(...browserTools(session));
274
+ const { z } = await import('zod');
275
+ tools.push(createTool({
276
+ name: 'browser_search',
277
+ description: 'Search the web and return results text. This is the preferred way to search.',
278
+ parameters: z.object({
279
+ query: z.string().describe('Search query'),
280
+ }),
281
+ execute: async ({ query }) => {
282
+ await session.ensureStarted();
283
+ const page = session.page;
284
+ const encoded = encodeURIComponent(query);
285
+ await page.goto(`https://html.duckduckgo.com/html/?q=${encoded}`, {
286
+ waitUntil: 'domcontentloaded',
287
+ });
288
+ const text = await page.innerText('body');
289
+ return { query, results: text.slice(0, 4000) };
290
+ },
291
+ }), createTool({
292
+ name: 'browser_visit',
293
+ description: 'Visit a URL and return the page text content. Use for reading articles, docs, etc.',
294
+ parameters: z.object({
295
+ url: z.string().describe('Full URL to visit'),
296
+ }),
297
+ execute: async ({ url }) => {
298
+ await session.ensureStarted();
299
+ const page = session.page;
300
+ await page.goto(url, { waitUntil: 'domcontentloaded', timeout: 15000 });
301
+ const title = await page.title();
302
+ const text = await page.innerText('body');
303
+ return { url, title, content: text.slice(0, 6000) };
304
+ },
305
+ }));
306
+ resources.browserSession = session;
307
+ }
308
+ catch (err) {
309
+ console.warn('[RuntimeBuilder] Browser capability failed:', err instanceof Error ? err.message : String(err));
310
+ }
311
+ }
312
+ async ensurePlaywright() {
313
+ const { existsSync } = await import('node:fs');
314
+ const { join } = await import('node:path');
315
+ const cacheDir = process.env.PLAYWRIGHT_BROWSERS_PATH ?? join(homedir(), 'Library', 'Caches', 'ms-playwright');
316
+ if (existsSync(cacheDir))
317
+ return;
318
+ console.log('[RuntimeBuilder] Installing Playwright chromium...');
319
+ const { execSync } = await import('node:child_process');
320
+ execSync('npx playwright install chromium', { stdio: 'inherit' });
321
+ }
322
+ async wireRAG(tools) {
323
+ if (!this.config.capabilities.rag)
324
+ return;
325
+ try {
326
+ const { RAGPipelineBuilder, TextLoader, ragTools } = await import('@cogitator-ai/rag');
327
+ const embeddingConfig = this.resolveEmbeddingConfig();
328
+ if (!embeddingConfig) {
329
+ console.warn('[RuntimeBuilder] RAG requires embedding configuration for the active provider');
330
+ return;
331
+ }
332
+ const embeddingService = createEmbeddingService(embeddingConfig);
333
+ const embeddingAdapter = new InMemoryEmbeddingAdapter();
334
+ const pipeline = new RAGPipelineBuilder()
335
+ .withLoader(new TextLoader())
336
+ .withEmbeddingService(embeddingService)
337
+ .withEmbeddingAdapter(embeddingAdapter)
338
+ .withConfig({ chunking: { strategy: 'recursive', chunkSize: 512, chunkOverlap: 50 } })
339
+ .build();
340
+ for (const rawPath of this.config.capabilities.rag.paths) {
341
+ const resolved = rawPath.startsWith('~/') ? join(homedir(), rawPath.slice(2)) : rawPath;
342
+ await pipeline.ingest(resolved).catch((err) => {
343
+ console.warn(`[RuntimeBuilder] Failed to ingest RAG path "${rawPath}":`, err.message);
344
+ });
345
+ }
346
+ const [searchTool, ingestTool] = ragTools(pipeline);
347
+ tools.push(createTool({
348
+ name: searchTool.name,
349
+ description: searchTool.description,
350
+ parameters: searchTool.parameters,
351
+ execute: searchTool.execute,
352
+ }), createTool({
353
+ name: ingestTool.name,
354
+ description: ingestTool.description,
355
+ parameters: ingestTool.parameters,
356
+ execute: ingestTool.execute,
357
+ }));
358
+ }
359
+ catch {
360
+ console.warn('[RuntimeBuilder] RAG capability requires @cogitator-ai/rag package');
361
+ }
362
+ }
363
+ async wireMCPServers(tools, resources) {
364
+ if (!this.config.mcpServers)
365
+ return;
366
+ try {
367
+ const { MCPClient } = await import('@cogitator-ai/mcp');
368
+ for (const [name, serverConfig] of Object.entries(this.config.mcpServers)) {
369
+ try {
370
+ const client = await MCPClient.connect({
371
+ transport: 'stdio',
372
+ command: serverConfig.command,
373
+ args: serverConfig.args,
374
+ env: serverConfig.env,
375
+ });
376
+ const serverTools = await client.getTools();
377
+ tools.push(...serverTools);
378
+ resources.mcpClients.push(client);
379
+ }
380
+ catch (err) {
381
+ console.warn(`[RuntimeBuilder] Failed to connect MCP server "${name}":`, err instanceof Error ? err.message : String(err));
382
+ }
383
+ }
384
+ }
385
+ catch {
386
+ console.warn('[RuntimeBuilder] MCP servers require @cogitator-ai/mcp package');
387
+ }
388
+ }
389
+ resolveEmbeddingConfig() {
390
+ const { provider } = this.config.llm;
391
+ if (provider === 'google') {
392
+ const apiKey = this.env.GOOGLE_API_KEY ?? this.env.GEMINI_API_KEY;
393
+ if (!apiKey)
394
+ return null;
395
+ return { provider: 'google', apiKey };
396
+ }
397
+ if (provider === 'openai') {
398
+ const apiKey = this.env.OPENAI_API_KEY;
399
+ if (!apiKey)
400
+ return null;
401
+ return { provider: 'openai', apiKey };
402
+ }
403
+ if (provider === 'ollama') {
404
+ return {
405
+ provider: 'ollama',
406
+ baseUrl: this.env.OLLAMA_URL ?? 'http://localhost:11434',
407
+ };
408
+ }
409
+ if (provider === 'anthropic') {
410
+ const apiKey = this.env.OPENAI_API_KEY;
411
+ if (apiKey)
412
+ return { provider: 'openai', apiKey };
413
+ console.warn('[RuntimeBuilder] Anthropic has no embedding API; set OPENAI_API_KEY for RAG embeddings');
414
+ return null;
415
+ }
416
+ return null;
417
+ }
418
+ get fullModelId() {
419
+ const { provider, model } = this.config.llm;
420
+ if (model.includes('/'))
421
+ return model;
422
+ return `${provider}/${model}`;
423
+ }
424
+ buildCogitator() {
425
+ const { provider } = this.config.llm;
426
+ const providers = {};
427
+ if (provider === 'google') {
428
+ providers.google = { apiKey: this.env.GOOGLE_API_KEY ?? this.env.GEMINI_API_KEY ?? '' };
429
+ }
430
+ else if (provider === 'openai') {
431
+ providers.openai = { apiKey: this.env.OPENAI_API_KEY ?? '' };
432
+ }
433
+ else if (provider === 'anthropic') {
434
+ providers.anthropic = { apiKey: this.env.ANTHROPIC_API_KEY ?? '' };
435
+ }
436
+ else if (provider === 'ollama') {
437
+ providers.ollama = {
438
+ baseUrl: this.env.OLLAMA_URL ?? 'http://localhost:11434',
439
+ apiKey: this.env.OLLAMA_API_KEY,
440
+ };
441
+ }
442
+ return new Cogitator({
443
+ llm: {
444
+ defaultModel: this.fullModelId,
445
+ providers,
446
+ },
447
+ });
448
+ }
449
+ buildChannels() {
450
+ const channels = [];
451
+ const ownerName = /assistant for (\w+)/i.exec(this.config.personality)?.[1] ?? undefined;
452
+ channels.push(terminalChannel({ userName: ownerName }));
453
+ if (this.config.channels.telegram) {
454
+ const token = this.env.TG_TOKEN ?? this.env.TELEGRAM_TOKEN;
455
+ if (token) {
456
+ channels.push(telegramChannel({ token }));
457
+ }
458
+ else {
459
+ console.warn('[RuntimeBuilder] Telegram configured but TG_TOKEN not found in env');
460
+ }
461
+ }
462
+ if (this.config.channels.discord) {
463
+ const token = this.env.DISCORD_TOKEN;
464
+ if (token) {
465
+ channels.push(discordChannel({ token }));
466
+ }
467
+ else {
468
+ console.warn('[RuntimeBuilder] Discord configured but DISCORD_TOKEN not found in env');
469
+ }
470
+ }
471
+ if (this.config.channels.slack) {
472
+ const token = this.env.SLACK_BOT_TOKEN;
473
+ const signingSecret = this.env.SLACK_SIGNING_SECRET;
474
+ if (token && signingSecret) {
475
+ channels.push(slackChannel({ token, signingSecret }));
476
+ }
477
+ else {
478
+ console.warn('[RuntimeBuilder] Slack configured but SLACK_BOT_TOKEN/SLACK_SIGNING_SECRET not found in env');
479
+ }
480
+ }
481
+ return channels;
482
+ }
483
+ buildScheduler(timerStore, gateway) {
484
+ if (!timerStore)
485
+ return null;
486
+ return new HeartbeatScheduler(timerStore, {
487
+ onFire: async (msg) => {
488
+ await gateway.injectMessage(msg);
489
+ },
490
+ pollInterval: 30_000,
491
+ });
492
+ }
493
+ buildInstructions(coreFactsText) {
494
+ let instructions = this.config.personality;
495
+ const now = new Date();
496
+ const dateStr = now.toLocaleDateString('en-US', {
497
+ weekday: 'long',
498
+ year: 'numeric',
499
+ month: 'long',
500
+ day: 'numeric',
501
+ });
502
+ const timeStr = now.toLocaleTimeString('en-US', { hour: '2-digit', minute: '2-digit' });
503
+ instructions += `\n\nCurrent date and time: ${dateStr}, ${timeStr}.`;
504
+ if (coreFactsText) {
505
+ instructions += `\n\n## What I know about the user\n${coreFactsText}`;
506
+ }
507
+ instructions += `\n\nIMPORTANT: Use your tools when relevant. Don't guess answers when tools can provide accurate data.`;
508
+ const fsCfg = this.config.capabilities.fileSystem;
509
+ if (fsCfg) {
510
+ const paths = typeof fsCfg === 'object' && 'paths' in fsCfg
511
+ ? fsCfg.paths.map((p) => p.replace(/^~/, homedir()))
512
+ : [homedir()];
513
+ instructions += `\nYou have filesystem access. Allowed paths: ${paths.join(', ')}. Use file_read, file_write, file_list tools. Always use absolute paths.`;
514
+ }
515
+ if (this.config.capabilities.browser) {
516
+ instructions += `\n\n## Browser
517
+ You control a real browser. Key tools:
518
+ - browser_search(query) — web search, returns page text. Best for finding information.
519
+ - browser_visit(url) — visit any URL and get page content. Best for reading articles, checking sites, monitoring.
520
+ - browser_navigate, browser_click, browser_type, browser_get_text etc. — for complex interactions (filling forms, clicking buttons, multi-step workflows).
521
+ Respond based ONLY on extracted text. NEVER hallucinate content.`;
522
+ }
523
+ if (this.config.capabilities.scheduler) {
524
+ instructions += `\n\n## Scheduling
525
+ You have a schedule_task tool for reminders, recurring actions, and deferred tasks.
526
+
527
+ When to use — IMMEDIATELY call schedule_task when the user:
528
+ - Says "remind me", "напомни", "in 10 minutes", "later", "through X time"
529
+ - Asks to schedule, set a timer, or defer something
530
+ - Says "every day at 9am", "each morning", "weekly"
531
+
532
+ Examples:
533
+ - "Remind me to check Slack in 5 min" → schedule_task({description: "Check Slack", delay: "5m"})
534
+ - "Every morning at 9" → schedule_task({description: "Morning briefing", cron: "0 9 * * *"})
535
+ - "At 3pm today" → schedule_task({description: "...", at: "${new Date().toISOString().split('T')[0]}T15:00:00"})
536
+
537
+ The channel and userId are filled automatically from the current conversation — do NOT pass them manually.
538
+ When the task fires, you will execute it — describe what to DO, not just what to say.
539
+ IMPORTANT: Do not just say "I'll remind you" — you MUST call schedule_task for it to work.`;
540
+ }
541
+ instructions += `\nIf the user asks what you can do, use lookup_capabilities to check your available tools.`;
542
+ if (this.config.capabilities.selfConfig) {
543
+ instructions += `\n\n## Self-Configuration
544
+ You can read and modify your own configuration using config_read and config_update. After updating config, you will automatically restart with the new settings.
545
+ You also have env_check and env_set tools to manage environment variables (.env file).
546
+
547
+ When the user asks to switch LLM provider or model:
548
+ 1. Use env_check to verify required keys are set
549
+ 2. If missing, tell the user what's needed and offer to set it via env_set if they provide the key
550
+ 3. Then use config_update to change llm.provider and llm.model
551
+
552
+ Required env vars per provider:
553
+ - google: GOOGLE_API_KEY
554
+ - openai: OPENAI_API_KEY
555
+ - anthropic: ANTHROPIC_API_KEY
556
+ - ollama (local): none
557
+ - ollama (cloud): OLLAMA_URL=https://ollama.com, OLLAMA_API_KEY
558
+
559
+ Other env vars: GITHUB_TOKEN (for GitHub capability), TG_TOKEN, DISCORD_TOKEN, SLACK_BOT_TOKEN.`;
560
+ }
561
+ if (this.config.capabilities.selfTools) {
562
+ instructions += `\nYou can create custom tools using create_tool. Write JavaScript ESM code with a default export containing name, description, parameters (JSON Schema), and an async execute function. You have full Node.js access (fetch, fs, child_process, etc.). After creating a tool, ALWAYS use test_tool to verify it works. If test fails, use create_tool again with fixed code. Use list_custom_tools to see existing tools and delete_tool to remove them. Custom tools are available after restart.`;
563
+ }
564
+ if (this.config.mcpServers && Object.keys(this.config.mcpServers).length > 0) {
565
+ const serverNames = Object.keys(this.config.mcpServers);
566
+ instructions += `\nYou have MCP (Model Context Protocol) servers connected: ${serverNames.join(', ')}. Their tools are available to you — look for tools with mcp_ prefix.`;
567
+ }
568
+ instructions += `\n\n## Media
569
+ You can receive images and voice messages from users.
570
+ - Images are automatically analyzed if your model supports vision.
571
+ - Voice messages require a speech recognition model. If it's not downloaded yet, suggest using download_stt_model tool (~75MB, works offline).`;
572
+ return instructions;
573
+ }
574
+ buildSttProvider() {
575
+ if (this.env.DEEPGRAM_API_KEY) {
576
+ return new DeepgramSttProvider({ apiKey: this.env.DEEPGRAM_API_KEY });
577
+ }
578
+ if (this.env.GROQ_API_KEY) {
579
+ return new GroqSttProvider({ apiKey: this.env.GROQ_API_KEY });
580
+ }
581
+ if (this.env.OPENAI_API_KEY) {
582
+ return new OpenAISttProvider({ apiKey: this.env.OPENAI_API_KEY });
583
+ }
584
+ return null;
585
+ }
586
+ async buildVisionChecker() {
587
+ try {
588
+ const models = (await import('@cogitator-ai/models'));
589
+ await models.initializeModels().catch(() => { });
590
+ return (modelId) => {
591
+ const model = models.getModel(modelId);
592
+ return model?.capabilities?.supportsVision ?? true;
593
+ };
594
+ }
595
+ catch {
596
+ return () => true;
597
+ }
598
+ }
599
+ resolveToolsDir() {
600
+ const cfg = this.config.capabilities.selfTools;
601
+ if (typeof cfg === 'object' && cfg.path) {
602
+ return cfg.path.replace(/^~/, homedir());
603
+ }
604
+ return join(homedir(), '.cogitator', 'tools');
605
+ }
606
+ }
607
+ //# sourceMappingURL=runtime-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-builder.js","sourceRoot":"","sources":["../src/runtime-builder.ts"],"names":[],"mappings":"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"}