daemora 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +666 -0
- package/SOUL.md +104 -0
- package/config/hooks.json +14 -0
- package/config/mcp.json +145 -0
- package/package.json +86 -0
- package/skills/.gitkeep +0 -0
- package/skills/apple-notes.md +193 -0
- package/skills/apple-reminders.md +189 -0
- package/skills/camsnap.md +162 -0
- package/skills/coding.md +14 -0
- package/skills/documents.md +13 -0
- package/skills/email.md +13 -0
- package/skills/gif-search.md +196 -0
- package/skills/healthcheck.md +225 -0
- package/skills/image-gen.md +147 -0
- package/skills/model-usage.md +182 -0
- package/skills/obsidian.md +207 -0
- package/skills/pdf.md +211 -0
- package/skills/research.md +13 -0
- package/skills/skill-creator.md +142 -0
- package/skills/spotify.md +149 -0
- package/skills/summarize.md +230 -0
- package/skills/things.md +199 -0
- package/skills/tmux.md +204 -0
- package/skills/trello.md +183 -0
- package/skills/video-frames.md +202 -0
- package/skills/weather.md +127 -0
- package/src/a2a/A2AClient.js +136 -0
- package/src/a2a/A2AServer.js +316 -0
- package/src/a2a/AgentCard.js +79 -0
- package/src/agents/SubAgentManager.js +369 -0
- package/src/agents/Supervisor.js +192 -0
- package/src/channels/BaseChannel.js +104 -0
- package/src/channels/DiscordChannel.js +288 -0
- package/src/channels/EmailChannel.js +172 -0
- package/src/channels/GoogleChatChannel.js +316 -0
- package/src/channels/HttpChannel.js +26 -0
- package/src/channels/LineChannel.js +168 -0
- package/src/channels/SignalChannel.js +186 -0
- package/src/channels/SlackChannel.js +329 -0
- package/src/channels/TeamsChannel.js +272 -0
- package/src/channels/TelegramChannel.js +347 -0
- package/src/channels/WhatsAppChannel.js +219 -0
- package/src/channels/index.js +198 -0
- package/src/cli.js +1267 -0
- package/src/config/agentProfiles.js +120 -0
- package/src/config/channels.js +32 -0
- package/src/config/default.js +206 -0
- package/src/config/models.js +123 -0
- package/src/config/permissions.js +167 -0
- package/src/core/AgentLoop.js +446 -0
- package/src/core/Compaction.js +143 -0
- package/src/core/CostTracker.js +116 -0
- package/src/core/EventBus.js +46 -0
- package/src/core/Task.js +67 -0
- package/src/core/TaskQueue.js +206 -0
- package/src/core/TaskRunner.js +226 -0
- package/src/daemon/DaemonManager.js +301 -0
- package/src/hooks/HookRunner.js +230 -0
- package/src/index.js +482 -0
- package/src/mcp/MCPAgentRunner.js +112 -0
- package/src/mcp/MCPClient.js +186 -0
- package/src/mcp/MCPManager.js +412 -0
- package/src/models/ModelRouter.js +180 -0
- package/src/safety/AuditLog.js +135 -0
- package/src/safety/CircuitBreaker.js +126 -0
- package/src/safety/FilesystemGuard.js +169 -0
- package/src/safety/GitRollback.js +139 -0
- package/src/safety/HumanApproval.js +156 -0
- package/src/safety/InputSanitizer.js +72 -0
- package/src/safety/PermissionGuard.js +83 -0
- package/src/safety/Sandbox.js +70 -0
- package/src/safety/SecretScanner.js +100 -0
- package/src/safety/SecretVault.js +250 -0
- package/src/scheduler/Heartbeat.js +115 -0
- package/src/scheduler/Scheduler.js +228 -0
- package/src/services/models/outputSchema.js +15 -0
- package/src/services/openai.js +25 -0
- package/src/services/sessions.js +65 -0
- package/src/setup/theme.js +110 -0
- package/src/setup/wizard.js +788 -0
- package/src/skills/SkillLoader.js +168 -0
- package/src/storage/TaskStore.js +69 -0
- package/src/systemPrompt.js +526 -0
- package/src/tenants/TenantContext.js +19 -0
- package/src/tenants/TenantManager.js +379 -0
- package/src/tools/ToolRegistry.js +141 -0
- package/src/tools/applyPatch.js +144 -0
- package/src/tools/browserAutomation.js +223 -0
- package/src/tools/createDocument.js +265 -0
- package/src/tools/cronTool.js +105 -0
- package/src/tools/editFile.js +139 -0
- package/src/tools/executeCommand.js +123 -0
- package/src/tools/glob.js +67 -0
- package/src/tools/grep.js +121 -0
- package/src/tools/imageAnalysis.js +120 -0
- package/src/tools/index.js +173 -0
- package/src/tools/listDirectory.js +47 -0
- package/src/tools/manageAgents.js +47 -0
- package/src/tools/manageMCP.js +159 -0
- package/src/tools/memory.js +478 -0
- package/src/tools/messageChannel.js +45 -0
- package/src/tools/projectTracker.js +259 -0
- package/src/tools/readFile.js +52 -0
- package/src/tools/screenCapture.js +112 -0
- package/src/tools/searchContent.js +76 -0
- package/src/tools/searchFiles.js +75 -0
- package/src/tools/sendEmail.js +118 -0
- package/src/tools/sendFile.js +63 -0
- package/src/tools/textToSpeech.js +161 -0
- package/src/tools/transcribeAudio.js +82 -0
- package/src/tools/useMCP.js +29 -0
- package/src/tools/webFetch.js +150 -0
- package/src/tools/webSearch.js +134 -0
- package/src/tools/writeFile.js +26 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
// HTTP channel is intentionally commented out — it has no authentication.
|
|
2
|
+
// Anyone on the network could send arbitrary tasks to the agent.
|
|
3
|
+
// Uncomment only if you've added your own auth middleware.
|
|
4
|
+
// import { HttpChannel } from "./HttpChannel.js";
|
|
5
|
+
|
|
6
|
+
import { TelegramChannel } from "./TelegramChannel.js";
|
|
7
|
+
import { WhatsAppChannel } from "./WhatsAppChannel.js";
|
|
8
|
+
import { EmailChannel } from "./EmailChannel.js";
|
|
9
|
+
import { DiscordChannel } from "./DiscordChannel.js";
|
|
10
|
+
import { SlackChannel } from "./SlackChannel.js";
|
|
11
|
+
import { LineChannel } from "./LineChannel.js";
|
|
12
|
+
import { SignalChannel } from "./SignalChannel.js";
|
|
13
|
+
import { TeamsChannel } from "./TeamsChannel.js";
|
|
14
|
+
import { GoogleChatChannel } from "./GoogleChatChannel.js";
|
|
15
|
+
import { config } from "../config/default.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Channel Registry — manages all input channels.
|
|
19
|
+
* Each channel auto-starts if its credentials are configured.
|
|
20
|
+
*/
|
|
21
|
+
class ChannelRegistry {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.channels = new Map();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Initialize and start all enabled channels.
|
|
28
|
+
*/
|
|
29
|
+
async startAll() {
|
|
30
|
+
// ─── HTTP channel disabled (no authentication) ────────────────────────────
|
|
31
|
+
// const http = new HttpChannel(config.channels.http);
|
|
32
|
+
// this.channels.set("http", http);
|
|
33
|
+
// await http.start();
|
|
34
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
35
|
+
|
|
36
|
+
// Telegram — check process.env directly (vault may have loaded token after config init)
|
|
37
|
+
const telegramToken = process.env.TELEGRAM_BOT_TOKEN;
|
|
38
|
+
if (telegramToken) {
|
|
39
|
+
try {
|
|
40
|
+
const telegram = new TelegramChannel({ ...config.channels.telegram, enabled: true, token: telegramToken });
|
|
41
|
+
this.channels.set("telegram", telegram);
|
|
42
|
+
await telegram.start();
|
|
43
|
+
} catch (e) {
|
|
44
|
+
console.log(`[Channel:Telegram] Failed to start: ${e.message}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// WhatsApp — check process.env directly
|
|
49
|
+
const twilioSid = process.env.TWILIO_ACCOUNT_SID;
|
|
50
|
+
if (twilioSid) {
|
|
51
|
+
const whatsapp = new WhatsAppChannel({
|
|
52
|
+
...config.channels.whatsapp,
|
|
53
|
+
enabled: true,
|
|
54
|
+
accountSid: twilioSid,
|
|
55
|
+
authToken: process.env.TWILIO_AUTH_TOKEN,
|
|
56
|
+
from: process.env.TWILIO_WHATSAPP_FROM,
|
|
57
|
+
});
|
|
58
|
+
this.channels.set("whatsapp", whatsapp);
|
|
59
|
+
await whatsapp.start();
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Email — check process.env directly
|
|
63
|
+
const emailUser = process.env.EMAIL_USER;
|
|
64
|
+
if (emailUser) {
|
|
65
|
+
const email = new EmailChannel({
|
|
66
|
+
...config.channels.email,
|
|
67
|
+
enabled: true,
|
|
68
|
+
user: emailUser,
|
|
69
|
+
password: process.env.EMAIL_PASSWORD,
|
|
70
|
+
});
|
|
71
|
+
this.channels.set("email", email);
|
|
72
|
+
await email.start();
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Discord — check process.env directly
|
|
76
|
+
const discordToken = process.env.DISCORD_BOT_TOKEN;
|
|
77
|
+
if (discordToken) {
|
|
78
|
+
try {
|
|
79
|
+
const discord = new DiscordChannel({ token: discordToken });
|
|
80
|
+
this.channels.set("discord", discord);
|
|
81
|
+
await discord.start();
|
|
82
|
+
} catch (e) {
|
|
83
|
+
console.log(`[Channel:Discord] Failed to start: ${e.message}`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Slack — requires both bot token and app token (Socket Mode)
|
|
88
|
+
const slackBotToken = process.env.SLACK_BOT_TOKEN;
|
|
89
|
+
const slackAppToken = process.env.SLACK_APP_TOKEN;
|
|
90
|
+
if (slackBotToken && slackAppToken) {
|
|
91
|
+
try {
|
|
92
|
+
const slack = new SlackChannel({ botToken: slackBotToken, appToken: slackAppToken });
|
|
93
|
+
this.channels.set("slack", slack);
|
|
94
|
+
await slack.start();
|
|
95
|
+
} catch (e) {
|
|
96
|
+
console.log(`[Channel:Slack] Failed to start: ${e.message}`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// LINE — webhook-based, needs access token + channel secret
|
|
101
|
+
const lineAccessToken = process.env.LINE_CHANNEL_ACCESS_TOKEN;
|
|
102
|
+
const lineSecret = process.env.LINE_CHANNEL_SECRET;
|
|
103
|
+
if (lineAccessToken && lineSecret) {
|
|
104
|
+
try {
|
|
105
|
+
const line = new LineChannel({ accessToken: lineAccessToken, channelSecret: lineSecret });
|
|
106
|
+
this.channels.set("line", line);
|
|
107
|
+
await line.start();
|
|
108
|
+
} catch (e) {
|
|
109
|
+
console.log(`[Channel:LINE] Failed to start: ${e.message}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Signal — requires signal-cli running as REST daemon
|
|
114
|
+
const signalCliUrl = process.env.SIGNAL_CLI_URL;
|
|
115
|
+
const signalPhone = process.env.SIGNAL_PHONE_NUMBER;
|
|
116
|
+
if (signalCliUrl && signalPhone) {
|
|
117
|
+
try {
|
|
118
|
+
const signal = new SignalChannel({ cliUrl: signalCliUrl, phoneNumber: signalPhone });
|
|
119
|
+
this.channels.set("signal", signal);
|
|
120
|
+
await signal.start();
|
|
121
|
+
} catch (e) {
|
|
122
|
+
console.log(`[Channel:Signal] Failed to start: ${e.message}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Microsoft Teams — Bot Framework v4
|
|
127
|
+
const teamsAppId = process.env.TEAMS_APP_ID;
|
|
128
|
+
const teamsAppPwd = process.env.TEAMS_APP_PASSWORD;
|
|
129
|
+
if (teamsAppId && teamsAppPwd) {
|
|
130
|
+
try {
|
|
131
|
+
const teams = new TeamsChannel({
|
|
132
|
+
...config.channels.teams,
|
|
133
|
+
appId: teamsAppId,
|
|
134
|
+
appPassword: teamsAppPwd,
|
|
135
|
+
});
|
|
136
|
+
this.channels.set("teams", teams);
|
|
137
|
+
await teams.start();
|
|
138
|
+
} catch (e) {
|
|
139
|
+
console.log(`[Channel:Teams] Failed to start: ${e.message}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Google Chat — service account + Chat API webhook
|
|
144
|
+
const googleServiceAccount = process.env.GOOGLE_CHAT_SERVICE_ACCOUNT;
|
|
145
|
+
if (googleServiceAccount) {
|
|
146
|
+
try {
|
|
147
|
+
const googleChat = new GoogleChatChannel({
|
|
148
|
+
...config.channels.googlechat,
|
|
149
|
+
serviceAccount: googleServiceAccount,
|
|
150
|
+
projectNumber: process.env.GOOGLE_CHAT_PROJECT_NUMBER,
|
|
151
|
+
});
|
|
152
|
+
this.channels.set("googlechat", googleChat);
|
|
153
|
+
await googleChat.start();
|
|
154
|
+
} catch (e) {
|
|
155
|
+
console.log(`[Channel:GoogleChat] Failed to start: ${e.message}`);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
const active = [...this.channels.entries()]
|
|
160
|
+
.filter(([_, ch]) => ch.running)
|
|
161
|
+
.map(([name]) => name);
|
|
162
|
+
console.log(`[ChannelRegistry] Active channels: ${active.join(", ") || "none"}`);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Stop all channels.
|
|
167
|
+
*/
|
|
168
|
+
async stopAll() {
|
|
169
|
+
for (const [name, channel] of this.channels) {
|
|
170
|
+
try {
|
|
171
|
+
await channel.stop();
|
|
172
|
+
} catch (error) {
|
|
173
|
+
console.log(`[ChannelRegistry] Error stopping ${name}: ${error.message}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
console.log(`[ChannelRegistry] All channels stopped`);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* Get a channel by name.
|
|
181
|
+
*/
|
|
182
|
+
get(name) {
|
|
183
|
+
return this.channels.get(name);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* List all channels with status.
|
|
188
|
+
*/
|
|
189
|
+
list() {
|
|
190
|
+
return [...this.channels.entries()].map(([name, ch]) => ({
|
|
191
|
+
name,
|
|
192
|
+
running: ch.running,
|
|
193
|
+
}));
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
const channelRegistry = new ChannelRegistry();
|
|
198
|
+
export default channelRegistry;
|