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,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Web Search — DuckDuckGo (free) + Brave Search (if API key set).
|
|
3
|
+
* Upgraded: result caching, freshness/date filters, optionsJson support.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
// Search result cache: key → { results, expiresAt }
|
|
7
|
+
const searchCache = new Map();
|
|
8
|
+
const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
|
|
9
|
+
|
|
10
|
+
// Brave freshness parameter mapping
|
|
11
|
+
const FRESHNESS_MAP = {
|
|
12
|
+
day: "pd", week: "pw", month: "pm", year: "py",
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
function getCacheKey(query, opts) {
|
|
16
|
+
return `${query}::${JSON.stringify(opts)}`;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function getFromCache(key) {
|
|
20
|
+
const entry = searchCache.get(key);
|
|
21
|
+
if (entry && Date.now() < entry.expiresAt) return entry.results;
|
|
22
|
+
if (entry) searchCache.delete(key);
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function setCache(key, results) {
|
|
27
|
+
if (searchCache.size >= 50) {
|
|
28
|
+
searchCache.delete(searchCache.keys().next().value);
|
|
29
|
+
}
|
|
30
|
+
searchCache.set(key, { results, expiresAt: Date.now() + CACHE_TTL_MS });
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export async function webSearch(query, optionsJson) {
|
|
34
|
+
// Support both old API (maxResults as string) and new API (optionsJson)
|
|
35
|
+
let opts = {};
|
|
36
|
+
if (optionsJson && !isNaN(parseInt(optionsJson))) {
|
|
37
|
+
opts = { maxResults: parseInt(optionsJson) };
|
|
38
|
+
} else if (optionsJson) {
|
|
39
|
+
try { opts = JSON.parse(optionsJson); } catch {}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const limit = opts.maxResults ? parseInt(opts.maxResults) : 5;
|
|
43
|
+
const freshness = opts.freshness; // day | week | month | year
|
|
44
|
+
const provider = opts.provider; // "brave" | "ddg" | undefined = auto
|
|
45
|
+
|
|
46
|
+
console.log(` [webSearch] Query: "${query}" (limit: ${limit}${freshness ? `, freshness: ${freshness}` : ""})`);
|
|
47
|
+
|
|
48
|
+
const cacheKey = getCacheKey(query, opts);
|
|
49
|
+
const cached = getFromCache(cacheKey);
|
|
50
|
+
if (cached) {
|
|
51
|
+
console.log(` [webSearch] Cache hit`);
|
|
52
|
+
return cached;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
let result;
|
|
56
|
+
if (provider === "ddg" || (!process.env.BRAVE_API_KEY && provider !== "brave")) {
|
|
57
|
+
result = await duckDuckGoSearch(query, limit, freshness);
|
|
58
|
+
} else {
|
|
59
|
+
result = await braveSearch(query, limit, freshness);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
setCache(cacheKey, result);
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function duckDuckGoSearch(query, limit, freshness) {
|
|
67
|
+
try {
|
|
68
|
+
let q = query;
|
|
69
|
+
if (freshness === "day") q += " site:* after:yesterday";
|
|
70
|
+
else if (freshness === "week") q += " site:* after:7days";
|
|
71
|
+
|
|
72
|
+
const url = `https://html.duckduckgo.com/html/?q=${encodeURIComponent(q)}`;
|
|
73
|
+
const response = await fetch(url, {
|
|
74
|
+
headers: { "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" },
|
|
75
|
+
signal: AbortSignal.timeout(10000),
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const html = await response.text();
|
|
79
|
+
const results = [];
|
|
80
|
+
const resultRegex =
|
|
81
|
+
/<a rel="nofollow" class="result__a" href="([^"]+)"[^>]*>(.+?)<\/a>[\s\S]*?<a class="result__snippet"[^>]*>([\s\S]*?)<\/a>/gi;
|
|
82
|
+
let match;
|
|
83
|
+
while ((match = resultRegex.exec(html)) !== null && results.length < limit) {
|
|
84
|
+
let actualUrl = match[1];
|
|
85
|
+
const uddgMatch = match[1].match(/uddg=([^&]+)/);
|
|
86
|
+
if (uddgMatch) actualUrl = decodeURIComponent(uddgMatch[1]);
|
|
87
|
+
results.push({
|
|
88
|
+
title: match[2].replace(/<[^>]+>/g, "").trim(),
|
|
89
|
+
url: actualUrl,
|
|
90
|
+
snippet: match[3].replace(/<[^>]+>/g, "").trim(),
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (results.length === 0) return `No results found for: "${query}"`;
|
|
95
|
+
console.log(` [webSearch] Found ${results.length} results (DuckDuckGo)`);
|
|
96
|
+
return `Search results for "${query}":\n\n` +
|
|
97
|
+
results.map((r, i) => `${i + 1}. **${r.title}**\n ${r.url}\n ${r.snippet}`).join("\n\n");
|
|
98
|
+
} catch (error) {
|
|
99
|
+
return `Search failed: ${error.message}`;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
async function braveSearch(query, limit, freshness) {
|
|
104
|
+
try {
|
|
105
|
+
let url = `https://api.search.brave.com/res/v1/web/search?q=${encodeURIComponent(query)}&count=${limit}`;
|
|
106
|
+
if (freshness && FRESHNESS_MAP[freshness]) {
|
|
107
|
+
url += `&freshness=${FRESHNESS_MAP[freshness]}`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
const response = await fetch(url, {
|
|
111
|
+
headers: {
|
|
112
|
+
Accept: "application/json",
|
|
113
|
+
"Accept-Encoding": "gzip",
|
|
114
|
+
"X-Subscription-Token": process.env.BRAVE_API_KEY,
|
|
115
|
+
},
|
|
116
|
+
signal: AbortSignal.timeout(10000),
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
if (!response.ok) return duckDuckGoSearch(query, limit, freshness);
|
|
120
|
+
|
|
121
|
+
const data = await response.json();
|
|
122
|
+
const results = (data.web?.results || []).slice(0, limit);
|
|
123
|
+
if (results.length === 0) return `No results found for: "${query}"`;
|
|
124
|
+
|
|
125
|
+
console.log(` [webSearch] Found ${results.length} results (Brave)`);
|
|
126
|
+
return `Search results for "${query}":\n\n` +
|
|
127
|
+
results.map((r, i) => `${i + 1}. **${r.title}**\n ${r.url}\n ${r.description || ""}`).join("\n\n");
|
|
128
|
+
} catch (error) {
|
|
129
|
+
return duckDuckGoSearch(query, limit, freshness);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export const webSearchDescription =
|
|
134
|
+
'webSearch(query: string, optionsJson?: string) - Search the web. optionsJson: {"maxResults":5,"freshness":"day|week|month|year","provider":"brave|ddg"}. Uses DuckDuckGo (free) by default, Brave if BRAVE_API_KEY set. Results cached 5 minutes.';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { writeFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
import filesystemGuard from "../safety/FilesystemGuard.js";
|
|
4
|
+
|
|
5
|
+
export function writeFile(filePath, content) {
|
|
6
|
+
// Filesystem security check
|
|
7
|
+
const guard = filesystemGuard.checkWrite(filePath);
|
|
8
|
+
if (!guard.allowed) {
|
|
9
|
+
console.log(` [writeFile] BLOCKED: ${guard.reason}`);
|
|
10
|
+
return guard.reason;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
console.log(` [writeFile] Writing to: ${filePath} (${content.length} chars)`);
|
|
14
|
+
try {
|
|
15
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
16
|
+
writeFileSync(filePath, content, { encoding: "utf-8" });
|
|
17
|
+
console.log(` [writeFile] Done`);
|
|
18
|
+
return `File written successfully to ${filePath}`;
|
|
19
|
+
} catch (error) {
|
|
20
|
+
console.log(` [writeFile] Failed: ${error.message}`);
|
|
21
|
+
return `Error writing file: ${error.message}`;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const writeFileDescription =
|
|
26
|
+
"writeFile(filePath: string, content: string) - Creates or overwrites a file with the given content. It will auto-create parent directories if they don't exist.";
|