@saccolabs/tars 1.0.53 → 1.3.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.
- package/README.md +10 -7
- package/dist/channels/channel-manager.d.ts +35 -0
- package/dist/channels/channel-manager.js +100 -0
- package/dist/channels/channel-manager.js.map +1 -0
- package/dist/channels/discord/discord-channel.d.ts +41 -0
- package/dist/channels/discord/discord-channel.js +199 -0
- package/dist/channels/discord/discord-channel.js.map +1 -0
- package/dist/channels/discord/message-formatter.js.map +1 -0
- package/dist/channels/types.d.ts +35 -0
- package/dist/channels/types.js +2 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/whatsapp/whatsapp-channel.d.ts +39 -0
- package/dist/channels/whatsapp/whatsapp-channel.js +198 -0
- package/dist/channels/whatsapp/whatsapp-channel.js.map +1 -0
- package/dist/cli/commands/discord.js +20 -5
- package/dist/cli/commands/discord.js.map +1 -1
- package/dist/cli/commands/export.js +5 -4
- package/dist/cli/commands/export.js.map +1 -1
- package/dist/cli/commands/import.js +5 -4
- package/dist/cli/commands/import.js.map +1 -1
- package/dist/cli/commands/quota.d.ts +1 -0
- package/dist/cli/commands/quota.js +62 -0
- package/dist/cli/commands/quota.js.map +1 -0
- package/dist/cli/commands/setup.js +120 -137
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/commands/start.d.ts +4 -1
- package/dist/cli/commands/start.js +49 -38
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/uninstall.js +9 -10
- package/dist/cli/commands/uninstall.js.map +1 -1
- package/dist/cli/index.js +30 -8
- package/dist/cli/index.js.map +1 -1
- package/dist/config/config.d.ts +14 -2
- package/dist/config/config.js +38 -18
- package/dist/config/config.js.map +1 -1
- package/dist/scripts/debug-cli.js +1 -1
- package/dist/scripts/debug-cli.js.map +1 -1
- package/dist/supervisor/cron-service.d.ts +3 -3
- package/dist/supervisor/cron-service.js +4 -4
- package/dist/supervisor/cron-service.js.map +1 -1
- package/dist/supervisor/gemini-engine.d.ts +4 -4
- package/dist/supervisor/gemini-engine.js +15 -10
- package/dist/supervisor/gemini-engine.js.map +1 -1
- package/dist/supervisor/heartbeat-service.js +1 -1
- package/dist/supervisor/heartbeat-service.js.map +1 -1
- package/dist/supervisor/main.js +39 -61
- package/dist/supervisor/main.js.map +1 -1
- package/dist/tools/get-quota.d.ts +11 -0
- package/dist/tools/get-quota.js +84 -0
- package/dist/tools/get-quota.js.map +1 -0
- package/dist/tools/send-discord-message.d.ts +9 -6
- package/dist/tools/send-discord-message.js +14 -21
- package/dist/tools/send-discord-message.js.map +1 -1
- package/dist/tools/send-notification.d.ts +15 -0
- package/dist/tools/send-notification.js +51 -0
- package/dist/tools/send-notification.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/utils/brain-audit.js +2 -2
- package/dist/utils/brain-audit.js.map +1 -1
- package/dist/utils/paths.d.ts +9 -0
- package/dist/utils/paths.js +18 -0
- package/dist/utils/paths.js.map +1 -0
- package/package.json +11 -7
- package/src/prompts/system.md +6 -2
- package/dist/discord/discord-bot.d.ts +0 -37
- package/dist/discord/discord-bot.js +0 -205
- package/dist/discord/discord-bot.js.map +0 -1
- package/dist/discord/message-formatter.js.map +0 -1
- /package/dist/{discord → channels/discord}/message-formatter.d.ts +0 -0
- /package/dist/{discord → channels/discord}/message-formatter.js +0 -0
package/README.md
CHANGED
|
@@ -66,7 +66,7 @@ npm install -g @saccolabs/tars
|
|
|
66
66
|
|
|
67
67
|
### Initial Setup
|
|
68
68
|
|
|
69
|
-
Run the setup wizard to authorize Gemini and connect your Discord
|
|
69
|
+
Run the setup wizard to authorize Gemini and connect your communication channels (Discord, WhatsApp, or both):
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
72
|
tars setup
|
|
@@ -87,9 +87,11 @@ tars setup
|
|
|
87
87
|
|
|
88
88
|
### Interaction
|
|
89
89
|
|
|
90
|
-
Tars communicates
|
|
90
|
+
Tars communicates through a multi-channel architecture. You can interact via **Discord**, **WhatsApp**, or both simultaneously. It supports file uploads, long-running task management, and complex multi-step instructions.
|
|
91
91
|
|
|
92
|
-
>
|
|
92
|
+
> **Discord**: `!tars Analyze the logs in /var/log/syslog and summarize any critical errors.`
|
|
93
|
+
>
|
|
94
|
+
> **WhatsApp**: Just send a message directly — no prefix needed.
|
|
93
95
|
|
|
94
96
|
---
|
|
95
97
|
|
|
@@ -97,10 +99,11 @@ Tars communicates primarily through a private Discord channel. It supports file
|
|
|
97
99
|
|
|
98
100
|
Tars utilizes a Supervisor-Orchestrator model:
|
|
99
101
|
|
|
100
|
-
1. **Supervisor**: Manages persistent sessions and
|
|
101
|
-
2. **
|
|
102
|
-
3. **
|
|
103
|
-
4. **
|
|
102
|
+
1. **Supervisor**: Manages persistent sessions and multi-channel communication.
|
|
103
|
+
2. **Channel Manager**: Orchestrates communication across Discord and WhatsApp with automatic notification routing.
|
|
104
|
+
3. **Subagents**: Specialized expert agents invoked dynamically for specific technical domains.
|
|
105
|
+
4. **Heartbeat**: Cron-based engine for autonomous execution and cleanup.
|
|
106
|
+
5. **Extensions**: MCP servers that provide tool-level capabilities to the intelligence core.
|
|
104
107
|
|
|
105
108
|
---
|
|
106
109
|
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CommunicationChannel, ChannelMessage } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Orchestrates all communication channels (Discord, WhatsApp, etc.)
|
|
4
|
+
*/
|
|
5
|
+
export declare class ChannelManager {
|
|
6
|
+
private readonly channels;
|
|
7
|
+
private readonly config;
|
|
8
|
+
private messageHandler?;
|
|
9
|
+
private lastActiveChannelId?;
|
|
10
|
+
constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Initialize enabled channels based on configuration
|
|
13
|
+
*/
|
|
14
|
+
private initializeChannels;
|
|
15
|
+
/**
|
|
16
|
+
* Start all enabled channels
|
|
17
|
+
*/
|
|
18
|
+
start(): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Stop all channels
|
|
21
|
+
*/
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Register a global handler for messages from any channel
|
|
25
|
+
*/
|
|
26
|
+
onMessage(handler: (message: ChannelMessage) => Promise<void>): void;
|
|
27
|
+
/**
|
|
28
|
+
* Send a proactive notification
|
|
29
|
+
*/
|
|
30
|
+
notify(content: string, attachments?: string[]): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Get a specific channel by ID
|
|
33
|
+
*/
|
|
34
|
+
getChannel(id: string): CommunicationChannel | undefined;
|
|
35
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { DiscordChannel } from './discord/discord-channel.js';
|
|
2
|
+
import { WhatsAppChannel } from './whatsapp/whatsapp-channel.js';
|
|
3
|
+
import logger from '../utils/logger.js';
|
|
4
|
+
import { Config } from '../config/config.js';
|
|
5
|
+
/**
|
|
6
|
+
* Orchestrates all communication channels (Discord, WhatsApp, etc.)
|
|
7
|
+
*/
|
|
8
|
+
export class ChannelManager {
|
|
9
|
+
channels = new Map();
|
|
10
|
+
config;
|
|
11
|
+
messageHandler;
|
|
12
|
+
lastActiveChannelId;
|
|
13
|
+
constructor() {
|
|
14
|
+
this.config = Config.getInstance();
|
|
15
|
+
this.initializeChannels();
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Initialize enabled channels based on configuration
|
|
19
|
+
*/
|
|
20
|
+
initializeChannels() {
|
|
21
|
+
// 1. Initialize Discord
|
|
22
|
+
const discord = new DiscordChannel();
|
|
23
|
+
if (discord.isEnabled) {
|
|
24
|
+
this.channels.set(discord.id, discord);
|
|
25
|
+
}
|
|
26
|
+
// 2. Initialize WhatsApp
|
|
27
|
+
const whatsapp = new WhatsAppChannel();
|
|
28
|
+
if (whatsapp.isEnabled) {
|
|
29
|
+
this.channels.set(whatsapp.id, whatsapp);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Start all enabled channels
|
|
34
|
+
*/
|
|
35
|
+
async start() {
|
|
36
|
+
if (this.channels.size === 0) {
|
|
37
|
+
logger.warn('⚠️ No communication channels enabled. Tars will be unreachable.');
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
logger.info(`🚀 Starting ${this.channels.size} communication channel(s)...`);
|
|
41
|
+
for (const channel of this.channels.values()) {
|
|
42
|
+
try {
|
|
43
|
+
channel.onMessage(async (message) => {
|
|
44
|
+
this.lastActiveChannelId = channel.id;
|
|
45
|
+
if (this.messageHandler) {
|
|
46
|
+
await this.messageHandler(message);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
await channel.start();
|
|
50
|
+
}
|
|
51
|
+
catch (error) {
|
|
52
|
+
logger.error(`Failed to start channel ${channel.id}: ${error.message}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Stop all channels
|
|
58
|
+
*/
|
|
59
|
+
async stop() {
|
|
60
|
+
logger.info('Stopping all communication channels...');
|
|
61
|
+
for (const channel of this.channels.values()) {
|
|
62
|
+
await channel
|
|
63
|
+
.stop()
|
|
64
|
+
.catch((e) => logger.error(`Error stopping ${channel.id}: ${e.message}`));
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Register a global handler for messages from any channel
|
|
69
|
+
*/
|
|
70
|
+
onMessage(handler) {
|
|
71
|
+
this.messageHandler = handler;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Send a proactive notification
|
|
75
|
+
*/
|
|
76
|
+
async notify(content, attachments) {
|
|
77
|
+
const primaryChannelId = this.lastActiveChannelId || this.config.primaryChannel || 'discord';
|
|
78
|
+
const channel = this.channels.get(primaryChannelId);
|
|
79
|
+
if (channel) {
|
|
80
|
+
await channel.notify(content, attachments);
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Fallback to the first available channel if primary is not found
|
|
84
|
+
const fallback = Array.from(this.channels.values())[0];
|
|
85
|
+
if (fallback) {
|
|
86
|
+
await fallback.notify(content, attachments);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
logger.warn(`No active channels available for notification.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Get a specific channel by ID
|
|
95
|
+
*/
|
|
96
|
+
getChannel(id) {
|
|
97
|
+
return this.channels.get(id);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=channel-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel-manager.js","sourceRoot":"","sources":["../../src/channels/channel-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { CommunicationChannel, ChannelMessage } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Discord Channel Implementation for Tars
|
|
4
|
+
*/
|
|
5
|
+
export declare class DiscordChannel implements CommunicationChannel {
|
|
6
|
+
readonly id = "discord";
|
|
7
|
+
private readonly config;
|
|
8
|
+
private readonly client;
|
|
9
|
+
private readonly processor;
|
|
10
|
+
private messageHandler?;
|
|
11
|
+
constructor();
|
|
12
|
+
get isEnabled(): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Start the Discord bot
|
|
15
|
+
*/
|
|
16
|
+
start(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Stop the Discord bot
|
|
19
|
+
*/
|
|
20
|
+
stop(): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Send a proactive notification to the primary contact
|
|
23
|
+
*/
|
|
24
|
+
notify(content: string, attachments?: string[]): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Register message handler
|
|
27
|
+
*/
|
|
28
|
+
onMessage(handler: (message: ChannelMessage) => Promise<void>): void;
|
|
29
|
+
/**
|
|
30
|
+
* Setup event handlers
|
|
31
|
+
*/
|
|
32
|
+
private setupEventHandlers;
|
|
33
|
+
/**
|
|
34
|
+
* Internal handler for Discord-specific messages
|
|
35
|
+
*/
|
|
36
|
+
private handleIncomingMessage;
|
|
37
|
+
/**
|
|
38
|
+
* Extract prompt and handle prefix
|
|
39
|
+
*/
|
|
40
|
+
private extractPrompt;
|
|
41
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Client, GatewayIntentBits, ChannelType, Partials } from 'discord.js';
|
|
2
|
+
import { Config } from '../../config/config.js';
|
|
3
|
+
import logger from '../../utils/logger.js';
|
|
4
|
+
import { MessageFormatter } from './message-formatter.js';
|
|
5
|
+
import { AttachmentProcessor } from '../../utils/attachment-processor.js';
|
|
6
|
+
/**
|
|
7
|
+
* Discord Channel Implementation for Tars
|
|
8
|
+
*/
|
|
9
|
+
export class DiscordChannel {
|
|
10
|
+
id = 'discord';
|
|
11
|
+
config;
|
|
12
|
+
client;
|
|
13
|
+
processor;
|
|
14
|
+
messageHandler;
|
|
15
|
+
constructor() {
|
|
16
|
+
this.config = Config.getInstance();
|
|
17
|
+
this.processor = new AttachmentProcessor(this.config);
|
|
18
|
+
this.client = new Client({
|
|
19
|
+
intents: [
|
|
20
|
+
GatewayIntentBits.Guilds,
|
|
21
|
+
GatewayIntentBits.GuildMessages,
|
|
22
|
+
GatewayIntentBits.MessageContent,
|
|
23
|
+
GatewayIntentBits.DirectMessages
|
|
24
|
+
],
|
|
25
|
+
partials: [Partials.Channel, Partials.Message]
|
|
26
|
+
});
|
|
27
|
+
this.setupEventHandlers();
|
|
28
|
+
}
|
|
29
|
+
get isEnabled() {
|
|
30
|
+
// For backward compatibility, if no explicit channels are configured but discordToken exists, it's enabled.
|
|
31
|
+
// Once WhatsApp is added, we'll use structured config.
|
|
32
|
+
return !!this.config.discordToken;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Start the Discord bot
|
|
36
|
+
*/
|
|
37
|
+
async start() {
|
|
38
|
+
if (!this.isEnabled) {
|
|
39
|
+
logger.info('Discord channel is disabled.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
await this.client.login(this.config.discordToken);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Stop the Discord bot
|
|
46
|
+
*/
|
|
47
|
+
async stop() {
|
|
48
|
+
this.client.destroy();
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Send a proactive notification to the primary contact
|
|
52
|
+
*/
|
|
53
|
+
async notify(content, attachments) {
|
|
54
|
+
if (!this.config.discordOwnerId || !content.trim())
|
|
55
|
+
return;
|
|
56
|
+
try {
|
|
57
|
+
const user = await this.client.users.fetch(this.config.discordOwnerId);
|
|
58
|
+
if (user) {
|
|
59
|
+
const formatted = MessageFormatter.format(content);
|
|
60
|
+
const files = attachments || [];
|
|
61
|
+
if (formatted.length > 8000) {
|
|
62
|
+
const filePath = this.processor.saveResponse(content, 'md');
|
|
63
|
+
await user.send({
|
|
64
|
+
content: `🔔 **Task Notification** (Response too long, see attached):`,
|
|
65
|
+
files: [filePath, ...files]
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
const chunks = MessageFormatter.split(formatted);
|
|
70
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
71
|
+
const prefix = i === 0 ? `🔔 **Task Notification:**\n` : ``;
|
|
72
|
+
await user.send({
|
|
73
|
+
content: prefix + chunks[i],
|
|
74
|
+
files: i === chunks.length - 1 ? files : []
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
catch (e) {
|
|
81
|
+
logger.error(`Failed to send proactive notification via Discord: ${e.message}`);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Register message handler
|
|
86
|
+
*/
|
|
87
|
+
onMessage(handler) {
|
|
88
|
+
this.messageHandler = handler;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Setup event handlers
|
|
92
|
+
*/
|
|
93
|
+
setupEventHandlers() {
|
|
94
|
+
this.client.once('clientReady', (c) => {
|
|
95
|
+
logger.info(`🚀 Discord channel online as ${c.user.tag}`);
|
|
96
|
+
if (this.config.discordOwnerId) {
|
|
97
|
+
logger.info(`👤 Primary Discord Contact ID: ${this.config.discordOwnerId}`);
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
logger.warn(`⚠️ No Primary Discord Contact ID set. Will bind to the first user who sends a message.`);
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
this.client.on('messageCreate', this.handleIncomingMessage.bind(this));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Internal handler for Discord-specific messages
|
|
107
|
+
*/
|
|
108
|
+
async handleIncomingMessage(message) {
|
|
109
|
+
if (message.author.bot || !this.messageHandler)
|
|
110
|
+
return;
|
|
111
|
+
const userPrompt = this.extractPrompt(message);
|
|
112
|
+
if (userPrompt === null)
|
|
113
|
+
return;
|
|
114
|
+
// Auto-Bind on first interaction if not set
|
|
115
|
+
if (!this.config.discordOwnerId) {
|
|
116
|
+
this.config.discordOwnerId = message.author.id;
|
|
117
|
+
this.config.saveSettings();
|
|
118
|
+
logger.info(`🔒 Automatically bound Primary Contact to Discord user: ${message.author.id}`);
|
|
119
|
+
await message.reply(`🔒 **System Alert:** I have permanently bound my background notification channel to your Discord account.`);
|
|
120
|
+
}
|
|
121
|
+
if (!userPrompt && message.attachments.size === 0)
|
|
122
|
+
return;
|
|
123
|
+
// Handle Attachments
|
|
124
|
+
const attachments = [];
|
|
125
|
+
if (message.attachments.size > 0) {
|
|
126
|
+
for (const [id, attachment] of message.attachments) {
|
|
127
|
+
try {
|
|
128
|
+
const filePath = await this.processor.download(attachment);
|
|
129
|
+
if (attachment.contentType) {
|
|
130
|
+
attachments.push({
|
|
131
|
+
path: filePath,
|
|
132
|
+
mimeType: attachment.contentType
|
|
133
|
+
});
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
logger.error(`Failed to download Discord attachment: ${err.message}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Map to common ChannelMessage
|
|
142
|
+
const channelMessage = {
|
|
143
|
+
content: userPrompt,
|
|
144
|
+
senderId: message.author.id,
|
|
145
|
+
senderName: message.author.username,
|
|
146
|
+
channelId: message.channelId,
|
|
147
|
+
attachments,
|
|
148
|
+
reply: async (response, outAttachments) => {
|
|
149
|
+
const formatted = MessageFormatter.format(response);
|
|
150
|
+
if (formatted.length > 8000) {
|
|
151
|
+
const filePath = this.processor.saveResponse(response, 'md');
|
|
152
|
+
await message.reply({
|
|
153
|
+
content: `📄 **Response too long** (${formatted.length} chars). See attached file:`,
|
|
154
|
+
files: [filePath, ...(outAttachments || [])]
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const chunks = MessageFormatter.split(formatted);
|
|
159
|
+
for (let i = 0; i < chunks.length; i++) {
|
|
160
|
+
await message.reply({
|
|
161
|
+
content: chunks[i],
|
|
162
|
+
files: i === chunks.length - 1 ? outAttachments || [] : []
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
// Show typing indicator
|
|
169
|
+
if ('sendTyping' in message.channel) {
|
|
170
|
+
await message.channel.sendTyping().catch(() => { });
|
|
171
|
+
}
|
|
172
|
+
// Forward to the registered handler (Supervisor via ChannelManager)
|
|
173
|
+
await this.messageHandler(channelMessage);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Extract prompt and handle prefix
|
|
177
|
+
*/
|
|
178
|
+
extractPrompt(message) {
|
|
179
|
+
const isDM = message.channel.type === ChannelType.DM;
|
|
180
|
+
const isMentioned = this.client.user && message.mentions.has(this.client.user);
|
|
181
|
+
const customPrefix = `!${this.config.assistantName.toLowerCase()}`;
|
|
182
|
+
const hasCustomCommand = message.content.toLowerCase().startsWith(customPrefix);
|
|
183
|
+
const hasLegacyCommand = message.content.toLowerCase().startsWith('!tars');
|
|
184
|
+
if (!isDM && !isMentioned && !hasCustomCommand && !hasLegacyCommand)
|
|
185
|
+
return null;
|
|
186
|
+
let prompt = message.content;
|
|
187
|
+
if (hasCustomCommand) {
|
|
188
|
+
prompt = prompt.substring(customPrefix.length);
|
|
189
|
+
}
|
|
190
|
+
else if (hasLegacyCommand) {
|
|
191
|
+
prompt = prompt.substring(6); // length of '!tars'
|
|
192
|
+
}
|
|
193
|
+
if (isMentioned && this.client.user) {
|
|
194
|
+
prompt = prompt.replace(new RegExp(`<@!?${this.client.user.id}>`, 'g'), '');
|
|
195
|
+
}
|
|
196
|
+
return prompt.trim();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=discord-channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"discord-channel.js","sourceRoot":"","sources":["../../../src/channels/discord/discord-channel.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"message-formatter.js","sourceRoot":"","sources":["../../../src/channels/discord/message-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AttachmentContext } from '../types/index.js';
|
|
2
|
+
/**
|
|
3
|
+
* Common message structure across all channels
|
|
4
|
+
*/
|
|
5
|
+
export interface ChannelMessage {
|
|
6
|
+
content: string;
|
|
7
|
+
senderId: string;
|
|
8
|
+
senderName: string;
|
|
9
|
+
channelId: string;
|
|
10
|
+
attachments?: AttachmentContext[];
|
|
11
|
+
reply: (content: string, attachments?: string[]) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Interface for communication platforms (Discord, WhatsApp, etc.)
|
|
15
|
+
*/
|
|
16
|
+
export interface CommunicationChannel {
|
|
17
|
+
readonly id: string;
|
|
18
|
+
readonly isEnabled: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Initialize and connect to the platform
|
|
21
|
+
*/
|
|
22
|
+
start(): Promise<void>;
|
|
23
|
+
/**
|
|
24
|
+
* Disconnect from the platform
|
|
25
|
+
*/
|
|
26
|
+
stop(): Promise<void>;
|
|
27
|
+
/**
|
|
28
|
+
* Send a proactive notification to the user
|
|
29
|
+
*/
|
|
30
|
+
notify(content: string, attachments?: string[]): Promise<void>;
|
|
31
|
+
/**
|
|
32
|
+
* Register a callback for incoming messages
|
|
33
|
+
*/
|
|
34
|
+
onMessage(handler: (message: ChannelMessage) => Promise<void>): void;
|
|
35
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/channels/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { CommunicationChannel, ChannelMessage } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* WhatsApp Channel Implementation using Baileys
|
|
4
|
+
*/
|
|
5
|
+
export declare class WhatsAppChannel implements CommunicationChannel {
|
|
6
|
+
readonly id = "whatsapp";
|
|
7
|
+
private readonly config;
|
|
8
|
+
private readonly processor;
|
|
9
|
+
private sock;
|
|
10
|
+
private messageHandler?;
|
|
11
|
+
private isConnected;
|
|
12
|
+
constructor();
|
|
13
|
+
get isEnabled(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Start the WhatsApp connection
|
|
16
|
+
*/
|
|
17
|
+
start(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Stop the WhatsApp connection
|
|
20
|
+
*/
|
|
21
|
+
stop(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Send a proactive notification
|
|
24
|
+
*/
|
|
25
|
+
notify(content: string, attachments?: string[]): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Register message handler
|
|
28
|
+
*/
|
|
29
|
+
onMessage(handler: (message: ChannelMessage) => Promise<void>): void;
|
|
30
|
+
/**
|
|
31
|
+
* Internal handler for incoming WhatsApp messages
|
|
32
|
+
*/
|
|
33
|
+
private handleIncomingMessage;
|
|
34
|
+
/**
|
|
35
|
+
* Helper to send message with optional attachments
|
|
36
|
+
*/
|
|
37
|
+
private sendMessageWithAttachments;
|
|
38
|
+
private getMimeType;
|
|
39
|
+
}
|