myaiforone 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 +113 -0
- package/agents/_template/CLAUDE.md +18 -0
- package/agents/_template/agent.json +7 -0
- package/agents/platform/agentcreator/CLAUDE.md +300 -0
- package/agents/platform/appcreator/CLAUDE.md +158 -0
- package/agents/platform/gym/CLAUDE.md +486 -0
- package/agents/platform/gym/agent.json +40 -0
- package/agents/platform/gym/programs/agent-building/program.json +160 -0
- package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
- package/agents/platform/gym/programs/getting-started/program.json +124 -0
- package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
- package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
- package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
- package/agents/platform/gym/souls/alex.md +12 -0
- package/agents/platform/gym/souls/jordan.md +12 -0
- package/agents/platform/gym/souls/morgan.md +12 -0
- package/agents/platform/gym/souls/riley.md +12 -0
- package/agents/platform/gym/souls/sam.md +12 -0
- package/agents/platform/hub/CLAUDE.md +372 -0
- package/agents/platform/promptcreator/CLAUDE.md +130 -0
- package/agents/platform/skillcreator/CLAUDE.md +163 -0
- package/bin/cli.js +566 -0
- package/config.example.json +310 -0
- package/dist/agent-registry.d.ts +32 -0
- package/dist/agent-registry.d.ts.map +1 -0
- package/dist/agent-registry.js +144 -0
- package/dist/agent-registry.js.map +1 -0
- package/dist/channels/discord.d.ts +17 -0
- package/dist/channels/discord.d.ts.map +1 -0
- package/dist/channels/discord.js +114 -0
- package/dist/channels/discord.js.map +1 -0
- package/dist/channels/imessage.d.ts +23 -0
- package/dist/channels/imessage.d.ts.map +1 -0
- package/dist/channels/imessage.js +214 -0
- package/dist/channels/imessage.js.map +1 -0
- package/dist/channels/slack.d.ts +19 -0
- package/dist/channels/slack.d.ts.map +1 -0
- package/dist/channels/slack.js +167 -0
- package/dist/channels/slack.js.map +1 -0
- package/dist/channels/telegram.d.ts +19 -0
- package/dist/channels/telegram.d.ts.map +1 -0
- package/dist/channels/telegram.js +274 -0
- package/dist/channels/telegram.js.map +1 -0
- package/dist/channels/types.d.ts +44 -0
- package/dist/channels/types.d.ts.map +1 -0
- package/dist/channels/types.js +18 -0
- package/dist/channels/types.js.map +1 -0
- package/dist/channels/whatsapp.d.ts +23 -0
- package/dist/channels/whatsapp.d.ts.map +1 -0
- package/dist/channels/whatsapp.js +189 -0
- package/dist/channels/whatsapp.js.map +1 -0
- package/dist/config.d.ts +134 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +127 -0
- package/dist/config.js.map +1 -0
- package/dist/cron.d.ts +8 -0
- package/dist/cron.d.ts.map +1 -0
- package/dist/cron.js +35 -0
- package/dist/cron.js.map +1 -0
- package/dist/decrypt-keys.d.ts +7 -0
- package/dist/decrypt-keys.d.ts.map +1 -0
- package/dist/decrypt-keys.js +53 -0
- package/dist/decrypt-keys.js.map +1 -0
- package/dist/encrypt-keys.d.ts +8 -0
- package/dist/encrypt-keys.d.ts.map +1 -0
- package/dist/encrypt-keys.js +62 -0
- package/dist/encrypt-keys.js.map +1 -0
- package/dist/executor.d.ts +31 -0
- package/dist/executor.d.ts.map +1 -0
- package/dist/executor.js +2009 -0
- package/dist/executor.js.map +1 -0
- package/dist/gemini-executor.d.ts +27 -0
- package/dist/gemini-executor.d.ts.map +1 -0
- package/dist/gemini-executor.js +160 -0
- package/dist/gemini-executor.js.map +1 -0
- package/dist/goals.d.ts +24 -0
- package/dist/goals.d.ts.map +1 -0
- package/dist/goals.js +189 -0
- package/dist/goals.js.map +1 -0
- package/dist/gym/activity-digest.d.ts +30 -0
- package/dist/gym/activity-digest.d.ts.map +1 -0
- package/dist/gym/activity-digest.js +506 -0
- package/dist/gym/activity-digest.js.map +1 -0
- package/dist/gym/dimension-scorer.d.ts +76 -0
- package/dist/gym/dimension-scorer.d.ts.map +1 -0
- package/dist/gym/dimension-scorer.js +236 -0
- package/dist/gym/dimension-scorer.js.map +1 -0
- package/dist/gym/gym-router.d.ts +7 -0
- package/dist/gym/gym-router.d.ts.map +1 -0
- package/dist/gym/gym-router.js +718 -0
- package/dist/gym/gym-router.js.map +1 -0
- package/dist/gym/index.d.ts +11 -0
- package/dist/gym/index.d.ts.map +1 -0
- package/dist/gym/index.js +11 -0
- package/dist/gym/index.js.map +1 -0
- package/dist/heartbeat.d.ts +21 -0
- package/dist/heartbeat.d.ts.map +1 -0
- package/dist/heartbeat.js +163 -0
- package/dist/heartbeat.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +254 -0
- package/dist/index.js.map +1 -0
- package/dist/keystore.d.ts +22 -0
- package/dist/keystore.d.ts.map +1 -0
- package/dist/keystore.js +178 -0
- package/dist/keystore.js.map +1 -0
- package/dist/logger.d.ts +9 -0
- package/dist/logger.d.ts.map +1 -0
- package/dist/logger.js +45 -0
- package/dist/logger.js.map +1 -0
- package/dist/memory/daily.d.ts +22 -0
- package/dist/memory/daily.d.ts.map +1 -0
- package/dist/memory/daily.js +82 -0
- package/dist/memory/daily.js.map +1 -0
- package/dist/memory/embeddings.d.ts +15 -0
- package/dist/memory/embeddings.d.ts.map +1 -0
- package/dist/memory/embeddings.js +154 -0
- package/dist/memory/embeddings.js.map +1 -0
- package/dist/memory/index.d.ts +32 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +159 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/search.d.ts +21 -0
- package/dist/memory/search.d.ts.map +1 -0
- package/dist/memory/search.js +77 -0
- package/dist/memory/search.js.map +1 -0
- package/dist/memory/store.d.ts +23 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +144 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/ollama-executor.d.ts +17 -0
- package/dist/ollama-executor.d.ts.map +1 -0
- package/dist/ollama-executor.js +112 -0
- package/dist/ollama-executor.js.map +1 -0
- package/dist/openai-executor.d.ts +38 -0
- package/dist/openai-executor.d.ts.map +1 -0
- package/dist/openai-executor.js +197 -0
- package/dist/openai-executor.js.map +1 -0
- package/dist/router.d.ts +11 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +185 -0
- package/dist/router.js.map +1 -0
- package/dist/test-message.d.ts +2 -0
- package/dist/test-message.d.ts.map +1 -0
- package/dist/test-message.js +60 -0
- package/dist/test-message.js.map +1 -0
- package/dist/utils/imsg-db-reader.d.ts +24 -0
- package/dist/utils/imsg-db-reader.d.ts.map +1 -0
- package/dist/utils/imsg-db-reader.js +92 -0
- package/dist/utils/imsg-db-reader.js.map +1 -0
- package/dist/utils/imsg-rpc.d.ts +25 -0
- package/dist/utils/imsg-rpc.d.ts.map +1 -0
- package/dist/utils/imsg-rpc.js +149 -0
- package/dist/utils/imsg-rpc.js.map +1 -0
- package/dist/utils/message-formatter.d.ts +3 -0
- package/dist/utils/message-formatter.d.ts.map +1 -0
- package/dist/utils/message-formatter.js +69 -0
- package/dist/utils/message-formatter.js.map +1 -0
- package/dist/web-ui.d.ts +12 -0
- package/dist/web-ui.d.ts.map +1 -0
- package/dist/web-ui.js +5784 -0
- package/dist/web-ui.js.map +1 -0
- package/dist/whatsapp-chats.d.ts +2 -0
- package/dist/whatsapp-chats.d.ts.map +1 -0
- package/dist/whatsapp-chats.js +76 -0
- package/dist/whatsapp-chats.js.map +1 -0
- package/dist/whatsapp-login.d.ts +2 -0
- package/dist/whatsapp-login.d.ts.map +1 -0
- package/dist/whatsapp-login.js +90 -0
- package/dist/whatsapp-login.js.map +1 -0
- package/dist/wiki-sync.d.ts +21 -0
- package/dist/wiki-sync.d.ts.map +1 -0
- package/dist/wiki-sync.js +147 -0
- package/dist/wiki-sync.js.map +1 -0
- package/docs/AddNewAgentGuide.md +100 -0
- package/docs/AddNewMcpGuide.md +72 -0
- package/docs/Architecture.md +795 -0
- package/docs/CLAUDE-AI-SETUP.md +166 -0
- package/docs/Setup.md +297 -0
- package/docs/ai-gym-architecture.md +1040 -0
- package/docs/ai-gym-build-plan.md +343 -0
- package/docs/ai-gym-onboarding.md +122 -0
- package/docs/appcreator_plan.md +348 -0
- package/docs/platform-mcp-audit.md +320 -0
- package/docs/server-deployment-plan.md +503 -0
- package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
- package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
- package/docs/user-guide.md +2016 -0
- package/mcp-catalog.json +628 -0
- package/package.json +63 -0
- package/public/MyAIforOne-logomark-512.svg +16 -0
- package/public/MyAIforOne-logomark-transparent.svg +15 -0
- package/public/activity.html +314 -0
- package/public/admin.html +1674 -0
- package/public/agent-dashboard.html +670 -0
- package/public/api-docs.html +1106 -0
- package/public/automations.html +722 -0
- package/public/canvas.css +223 -0
- package/public/canvas.js +588 -0
- package/public/changelog.html +231 -0
- package/public/gym.html +2766 -0
- package/public/home.html +1930 -0
- package/public/index.html +2809 -0
- package/public/lab.html +1643 -0
- package/public/library.html +1442 -0
- package/public/marketplace.html +1101 -0
- package/public/mcp-docs.html +441 -0
- package/public/mini.html +390 -0
- package/public/monitor.html +584 -0
- package/public/org.html +4304 -0
- package/public/projects.html +734 -0
- package/public/settings.html +645 -0
- package/public/tasks.html +932 -0
- package/public/trainers/alex.svg +12 -0
- package/public/trainers/jordan.svg +12 -0
- package/public/trainers/morgan.svg +12 -0
- package/public/trainers/riley.svg +12 -0
- package/public/trainers/sam.svg +12 -0
- package/public/user-guide.html +218 -0
- package/registry/agents.json +3 -0
- package/registry/apps.json +20 -0
- package/registry/installed-drafts.json +3 -0
- package/registry/mcps.json +1084 -0
- package/registry/prompts/personal/mcp-test-prompt.md +6 -0
- package/registry/prompts/personal/memory-recall.md +6 -0
- package/registry/prompts/platform/brainstorm.md +15 -0
- package/registry/prompts/platform/code-review.md +16 -0
- package/registry/prompts/platform/explain.md +16 -0
- package/registry/prompts.json +58 -0
- package/registry/skills/external/brainstorming.md +5 -0
- package/registry/skills/external/code-review.md +40 -0
- package/registry/skills/external/frontend-patterns.md +642 -0
- package/registry/skills/external/frontend-slides.md +184 -0
- package/registry/skills/external/systematic-debugging.md +5 -0
- package/registry/skills/external/tdd.md +328 -0
- package/registry/skills/external/verification-before-completion.md +5 -0
- package/registry/skills/external/writing-plans.md +5 -0
- package/registry/skills/platform/ai41_app_build.md +930 -0
- package/registry/skills/platform/ai41_app_deploy.md +168 -0
- package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
- package/registry/skills/platform/ai41_app_patterns.md +359 -0
- package/registry/skills/platform/ai41_app_register.md +85 -0
- package/registry/skills/platform/ai41_app_scaffold.md +421 -0
- package/registry/skills/platform/ai41_app_verify.md +107 -0
- package/registry/skills/platform/opProjectCreate.md +239 -0
- package/registry/skills/platform/op_devbrowser.md +136 -0
- package/registry/skills/platform/sop_brandguidelines.md +103 -0
- package/registry/skills/platform/sop_docx.md +117 -0
- package/registry/skills/platform/sop_frontenddesign.md +44 -0
- package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
- package/registry/skills/platform/sop_mcpbuilder.md +133 -0
- package/registry/skills/platform/sop_pdf.md +172 -0
- package/registry/skills/platform/sop_pptx.md +133 -0
- package/registry/skills/platform/sop_skillcreator.md +104 -0
- package/registry/skills/platform/sop_themefactory.md +128 -0
- package/registry/skills/platform/sop_webapptesting.md +75 -0
- package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
- package/registry/skills/platform/sop_xlsx.md +134 -0
- package/registry/skills.json +1055 -0
- package/scripts/discover-chats.sh +11 -0
- package/scripts/install-service-windows.ps1 +87 -0
- package/scripts/install-service.sh +52 -0
- package/scripts/seed-registry.ts +195 -0
- package/scripts/test-send.sh +5 -0
- package/scripts/tray-indicator.ps1 +35 -0
- package/scripts/uninstall-service-windows.ps1 +23 -0
- package/scripts/uninstall-service.sh +15 -0
- package/scripts/xbar-myagent.5s.sh +32 -0
- package/server/mcp-server/dist/index.d.ts +11 -0
- package/server/mcp-server/dist/index.js +1332 -0
- package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
- package/server/mcp-server/dist/lib/api-client.js +241 -0
- package/server/mcp-server/index.ts +1545 -0
- package/server/mcp-server/lib/api-client.ts +366 -0
- package/server/mcp-server/tsconfig.json +14 -0
- package/src/agent-registry.ts +180 -0
- package/src/channels/discord.ts +129 -0
- package/src/channels/imessage.ts +261 -0
- package/src/channels/slack.ts +208 -0
- package/src/channels/telegram.ts +307 -0
- package/src/channels/types.ts +62 -0
- package/src/channels/whatsapp.ts +227 -0
- package/src/config.ts +281 -0
- package/src/cron.ts +43 -0
- package/src/decrypt-keys.ts +60 -0
- package/src/encrypt-keys.ts +70 -0
- package/src/executor.ts +2190 -0
- package/src/gemini-executor.ts +212 -0
- package/src/goals.ts +240 -0
- package/src/gym/activity-digest.ts +546 -0
- package/src/gym/dimension-scorer.ts +297 -0
- package/src/gym/gym-router.ts +801 -0
- package/src/gym/index.ts +19 -0
- package/src/heartbeat.ts +220 -0
- package/src/index.ts +275 -0
- package/src/keystore.ts +190 -0
- package/src/logger.ts +51 -0
- package/src/memory/daily.ts +101 -0
- package/src/memory/embeddings.ts +185 -0
- package/src/memory/index.ts +218 -0
- package/src/memory/search.ts +124 -0
- package/src/memory/store.ts +189 -0
- package/src/ollama-executor.ts +126 -0
- package/src/openai-executor.ts +259 -0
- package/src/router.ts +230 -0
- package/src/test-message.ts +72 -0
- package/src/utils/imsg-db-reader.ts +109 -0
- package/src/utils/imsg-rpc.ts +178 -0
- package/src/utils/message-formatter.ts +90 -0
- package/src/web-ui.ts +5778 -0
- package/src/whatsapp-chats.ts +91 -0
- package/src/whatsapp-login.ts +110 -0
- package/src/wiki-sync.ts +199 -0
- package/tsconfig.json +19 -0
package/dist/keystore.js
ADDED
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Keystore — encrypt/decrypt MCP API key files.
|
|
3
|
+
* Uses AES-256-GCM with a master password.
|
|
4
|
+
* Encrypted files have .env.enc extension, plain files have .env extension.
|
|
5
|
+
*/
|
|
6
|
+
import { createCipheriv, createDecipheriv, randomBytes, scryptSync } from "node:crypto";
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync, readdirSync } from "node:fs";
|
|
8
|
+
import { join } from "node:path";
|
|
9
|
+
import { getPersonalAgentsDir } from "./config.js";
|
|
10
|
+
import { log } from "./logger.js";
|
|
11
|
+
const ALGORITHM = "aes-256-gcm";
|
|
12
|
+
const SALT_LEN = 16;
|
|
13
|
+
const IV_LEN = 12;
|
|
14
|
+
const TAG_LEN = 16;
|
|
15
|
+
const KEY_LEN = 32;
|
|
16
|
+
const HEADER = "MYAGENT_ENC_V1"; // magic header to identify encrypted files
|
|
17
|
+
function deriveKey(password, salt) {
|
|
18
|
+
return scryptSync(password, salt, KEY_LEN);
|
|
19
|
+
}
|
|
20
|
+
export function encryptString(plaintext, password) {
|
|
21
|
+
const salt = randomBytes(SALT_LEN);
|
|
22
|
+
const iv = randomBytes(IV_LEN);
|
|
23
|
+
const key = deriveKey(password, salt);
|
|
24
|
+
const cipher = createCipheriv(ALGORITHM, key, iv);
|
|
25
|
+
const encrypted = Buffer.concat([cipher.update(plaintext, "utf-8"), cipher.final()]);
|
|
26
|
+
const tag = cipher.getAuthTag();
|
|
27
|
+
// Format: HEADER + salt(16) + iv(12) + tag(16) + ciphertext
|
|
28
|
+
const headerBuf = Buffer.from(HEADER, "utf-8");
|
|
29
|
+
return Buffer.concat([headerBuf, salt, iv, tag, encrypted]);
|
|
30
|
+
}
|
|
31
|
+
export function decryptString(data, password) {
|
|
32
|
+
const headerBuf = Buffer.from(HEADER, "utf-8");
|
|
33
|
+
const headerLen = headerBuf.length;
|
|
34
|
+
// Verify header
|
|
35
|
+
if (data.subarray(0, headerLen).toString("utf-8") !== HEADER) {
|
|
36
|
+
throw new Error("Not an encrypted keystore file");
|
|
37
|
+
}
|
|
38
|
+
let offset = headerLen;
|
|
39
|
+
const salt = data.subarray(offset, offset + SALT_LEN);
|
|
40
|
+
offset += SALT_LEN;
|
|
41
|
+
const iv = data.subarray(offset, offset + IV_LEN);
|
|
42
|
+
offset += IV_LEN;
|
|
43
|
+
const tag = data.subarray(offset, offset + TAG_LEN);
|
|
44
|
+
offset += TAG_LEN;
|
|
45
|
+
const ciphertext = data.subarray(offset);
|
|
46
|
+
const key = deriveKey(password, salt);
|
|
47
|
+
const decipher = createDecipheriv(ALGORITHM, key, iv);
|
|
48
|
+
decipher.setAuthTag(tag);
|
|
49
|
+
const decrypted = Buffer.concat([decipher.update(ciphertext), decipher.final()]);
|
|
50
|
+
return decrypted.toString("utf-8");
|
|
51
|
+
}
|
|
52
|
+
export function isEncrypted(filePath) {
|
|
53
|
+
if (!existsSync(filePath))
|
|
54
|
+
return false;
|
|
55
|
+
try {
|
|
56
|
+
const data = readFileSync(filePath);
|
|
57
|
+
return data.subarray(0, Buffer.from(HEADER).length).toString("utf-8") === HEADER;
|
|
58
|
+
}
|
|
59
|
+
catch {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Encrypt all .env files in a directory → .env.enc
|
|
65
|
+
*/
|
|
66
|
+
export function encryptDir(dir, password) {
|
|
67
|
+
if (!existsSync(dir))
|
|
68
|
+
return 0;
|
|
69
|
+
let count = 0;
|
|
70
|
+
for (const file of readdirSync(dir)) {
|
|
71
|
+
if (!file.endsWith(".env"))
|
|
72
|
+
continue;
|
|
73
|
+
const plainPath = join(dir, file);
|
|
74
|
+
const encPath = plainPath + ".enc";
|
|
75
|
+
try {
|
|
76
|
+
const content = readFileSync(plainPath, "utf-8");
|
|
77
|
+
if (!content.trim())
|
|
78
|
+
continue; // skip empty files
|
|
79
|
+
const encrypted = encryptString(content, password);
|
|
80
|
+
writeFileSync(encPath, encrypted);
|
|
81
|
+
// Remove the plain file after encryption
|
|
82
|
+
writeFileSync(plainPath, `# Encrypted — see ${file}.enc\n`);
|
|
83
|
+
count++;
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
log.warn(`Failed to encrypt ${file}: ${err}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return count;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Decrypt all .env.enc files in a directory → .env
|
|
93
|
+
*/
|
|
94
|
+
export function decryptDir(dir, password) {
|
|
95
|
+
if (!existsSync(dir))
|
|
96
|
+
return 0;
|
|
97
|
+
let count = 0;
|
|
98
|
+
for (const file of readdirSync(dir)) {
|
|
99
|
+
if (!file.endsWith(".env.enc"))
|
|
100
|
+
continue;
|
|
101
|
+
const encPath = join(dir, file);
|
|
102
|
+
const plainPath = encPath.replace(".enc", "");
|
|
103
|
+
try {
|
|
104
|
+
const data = readFileSync(encPath);
|
|
105
|
+
const content = decryptString(data, password);
|
|
106
|
+
writeFileSync(plainPath, content);
|
|
107
|
+
count++;
|
|
108
|
+
}
|
|
109
|
+
catch (err) {
|
|
110
|
+
log.warn(`Failed to decrypt ${file}: ${err}`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return count;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Load env vars from a .env file, auto-decrypting if .env.enc exists.
|
|
117
|
+
* Priority: agent-level > shared
|
|
118
|
+
*/
|
|
119
|
+
export function loadMcpKeysWithDecryption(gatewayDir, agentMemoryDir, mcpName, masterPassword) {
|
|
120
|
+
const vars = {};
|
|
121
|
+
const personalAgentsBase = getPersonalAgentsDir();
|
|
122
|
+
// Level 3: Gateway data/mcp-keys/ (last resort)
|
|
123
|
+
const gatewayVars = loadEnvFile(join(gatewayDir, `${mcpName}.env`), join(gatewayDir, `${mcpName}.env.enc`), masterPassword);
|
|
124
|
+
Object.assign(vars, gatewayVars);
|
|
125
|
+
// Level 2: Shared personalAgents/mcp-keys/ (overrides gateway)
|
|
126
|
+
const sharedKeysDir = join(personalAgentsBase, "mcp-keys");
|
|
127
|
+
const sharedVars = loadEnvFile(join(sharedKeysDir, `${mcpName}.env`), join(sharedKeysDir, `${mcpName}.env.enc`), masterPassword);
|
|
128
|
+
Object.assign(vars, sharedVars);
|
|
129
|
+
// Level 1: Agent-specific agent/mcp-keys/ (highest priority)
|
|
130
|
+
if (agentMemoryDir) {
|
|
131
|
+
const agentKeysDir = join(agentMemoryDir, "..", "mcp-keys");
|
|
132
|
+
const agentVars = loadEnvFile(join(agentKeysDir, `${mcpName}.env`), join(agentKeysDir, `${mcpName}.env.enc`), masterPassword);
|
|
133
|
+
Object.assign(vars, agentVars);
|
|
134
|
+
}
|
|
135
|
+
return vars;
|
|
136
|
+
}
|
|
137
|
+
function loadEnvFile(plainPath, encPath, password) {
|
|
138
|
+
const vars = {};
|
|
139
|
+
// Try encrypted file first
|
|
140
|
+
if (password && existsSync(encPath)) {
|
|
141
|
+
try {
|
|
142
|
+
const data = readFileSync(encPath);
|
|
143
|
+
if (isEncrypted(encPath)) {
|
|
144
|
+
const content = decryptString(data, password);
|
|
145
|
+
parseEnvContent(content, vars);
|
|
146
|
+
return vars;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
catch { /* fall through to plain */ }
|
|
150
|
+
}
|
|
151
|
+
// Try plain file
|
|
152
|
+
if (existsSync(plainPath)) {
|
|
153
|
+
try {
|
|
154
|
+
const content = readFileSync(plainPath, "utf-8");
|
|
155
|
+
// Skip stub files left after encryption
|
|
156
|
+
if (!content.includes("# Encrypted")) {
|
|
157
|
+
parseEnvContent(content, vars);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch { /* ignore */ }
|
|
161
|
+
}
|
|
162
|
+
return vars;
|
|
163
|
+
}
|
|
164
|
+
function parseEnvContent(content, vars) {
|
|
165
|
+
for (const line of content.split("\n")) {
|
|
166
|
+
const trimmed = line.trim();
|
|
167
|
+
if (!trimmed || trimmed.startsWith("#"))
|
|
168
|
+
continue;
|
|
169
|
+
const eqIdx = trimmed.indexOf("=");
|
|
170
|
+
if (eqIdx < 1)
|
|
171
|
+
continue;
|
|
172
|
+
const key = trimmed.slice(0, eqIdx).trim();
|
|
173
|
+
const val = trimmed.slice(eqIdx + 1).trim();
|
|
174
|
+
if (val)
|
|
175
|
+
vars[key] = val;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=keystore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keystore.js","sourceRoot":"","sources":["../src/keystore.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.d.ts
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type LogLevel = "debug" | "info" | "warn" | "error";
|
|
2
|
+
export declare function configureLogger(level: LogLevel, filePath?: string): void;
|
|
3
|
+
export declare const log: {
|
|
4
|
+
debug: (msg: string, ...args: unknown[]) => void;
|
|
5
|
+
info: (msg: string, ...args: unknown[]) => void;
|
|
6
|
+
warn: (msg: string, ...args: unknown[]) => void;
|
|
7
|
+
error: (msg: string, ...args: unknown[]) => void;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAY3D,wBAAgB,eAAe,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAMxE;AAwBD,eAAO,MAAM,GAAG;iBACD,MAAM,WAAW,OAAO,EAAE;gBAC3B,MAAM,WAAW,OAAO,EAAE;gBAC1B,MAAM,WAAW,OAAO,EAAE;iBACzB,MAAM,WAAW,OAAO,EAAE;CACxC,CAAC"}
|
package/dist/logger.js
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { appendFileSync, mkdirSync } from "node:fs";
|
|
2
|
+
import { dirname } from "node:path";
|
|
3
|
+
const LEVELS = {
|
|
4
|
+
debug: 0,
|
|
5
|
+
info: 1,
|
|
6
|
+
warn: 2,
|
|
7
|
+
error: 3,
|
|
8
|
+
};
|
|
9
|
+
let currentLevel = "info";
|
|
10
|
+
let logFilePath = null;
|
|
11
|
+
export function configureLogger(level, filePath) {
|
|
12
|
+
currentLevel = level;
|
|
13
|
+
if (filePath) {
|
|
14
|
+
logFilePath = filePath;
|
|
15
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function write(level, msg, ...args) {
|
|
19
|
+
if (LEVELS[level] < LEVELS[currentLevel])
|
|
20
|
+
return;
|
|
21
|
+
const ts = new Date().toISOString();
|
|
22
|
+
const prefix = `[${ts}] [${level.toUpperCase()}]`;
|
|
23
|
+
const line = args.length > 0 ? `${prefix} ${msg} ${args.map(a => JSON.stringify(a)).join(" ")}` : `${prefix} ${msg}`;
|
|
24
|
+
if (level === "error") {
|
|
25
|
+
console.error(line);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
console.log(line);
|
|
29
|
+
}
|
|
30
|
+
if (logFilePath) {
|
|
31
|
+
try {
|
|
32
|
+
appendFileSync(logFilePath, line + "\n");
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
// silently ignore file write errors
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export const log = {
|
|
40
|
+
debug: (msg, ...args) => write("debug", msg, ...args),
|
|
41
|
+
info: (msg, ...args) => write("info", msg, ...args),
|
|
42
|
+
warn: (msg, ...args) => write("warn", msg, ...args),
|
|
43
|
+
error: (msg, ...args) => write("error", msg, ...args),
|
|
44
|
+
};
|
|
45
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,MAAM,MAAM,GAA6B;IACvC,KAAK,EAAE,CAAC;IACR,IAAI,EAAE,CAAC;IACP,IAAI,EAAE,CAAC;IACP,KAAK,EAAE,CAAC;CACT,CAAC;AAEF,IAAI,YAAY,GAAa,MAAM,CAAC;AACpC,IAAI,WAAW,GAAkB,IAAI,CAAC;AAEtC,MAAM,UAAU,eAAe,CAAC,KAAe,EAAE,QAAiB;IAChE,YAAY,GAAG,KAAK,CAAC;IACrB,IAAI,QAAQ,EAAE,CAAC;QACb,WAAW,GAAG,QAAQ,CAAC;QACvB,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,KAAe,EAAE,GAAW,EAAE,GAAG,IAAe;IAC7D,IAAI,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,YAAY,CAAC;QAAE,OAAO;IAEjD,MAAM,EAAE,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,KAAK,CAAC,WAAW,EAAE,GAAG,CAAC;IAClD,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;IAErH,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;QACtB,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,cAAc,CAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,oCAAoC;QACtC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,KAAK,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACxE,IAAI,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtE,IAAI,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;IACtE,KAAK,EAAE,CAAC,GAAW,EAAE,GAAG,IAAe,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;CACzE,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daily memory — append-only daily log files.
|
|
3
|
+
* After each exchange, a summary is appended to memory/daily/YYYY-MM-DD.md.
|
|
4
|
+
* At session start, today + yesterday are loaded for continuity.
|
|
5
|
+
*/
|
|
6
|
+
export declare function getDailyDir(memoryDir: string): string;
|
|
7
|
+
/**
|
|
8
|
+
* Append an exchange summary to today's daily log.
|
|
9
|
+
*/
|
|
10
|
+
export declare function appendDailyEntry(memoryDir: string, sender: string, userMessage: string, agentResponse: string): void;
|
|
11
|
+
/**
|
|
12
|
+
* Load today's and yesterday's daily logs for context injection.
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadRecentDaily(memoryDir: string): string;
|
|
15
|
+
/**
|
|
16
|
+
* Get all daily file paths for indexing.
|
|
17
|
+
*/
|
|
18
|
+
export declare function listDailyFiles(memoryDir: string): Array<{
|
|
19
|
+
path: string;
|
|
20
|
+
date: string;
|
|
21
|
+
}>;
|
|
22
|
+
//# sourceMappingURL=daily.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily.d.ts","sourceRoot":"","sources":["../../src/memory/daily.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,wBAAgB,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAIrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,MAAM,EACd,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,MAAM,GACpB,IAAI,CAkBN;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CA2BzD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAcvF"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Daily memory — append-only daily log files.
|
|
3
|
+
* After each exchange, a summary is appended to memory/daily/YYYY-MM-DD.md.
|
|
4
|
+
* At session start, today + yesterday are loaded for continuity.
|
|
5
|
+
*/
|
|
6
|
+
import { readFileSync, appendFileSync, existsSync, mkdirSync, readdirSync } from "node:fs";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
function dateStr(date) {
|
|
9
|
+
return date.toISOString().split("T")[0];
|
|
10
|
+
}
|
|
11
|
+
function timeStr(date) {
|
|
12
|
+
return date.toTimeString().split(" ")[0].slice(0, 5);
|
|
13
|
+
}
|
|
14
|
+
export function getDailyDir(memoryDir) {
|
|
15
|
+
const dir = join(memoryDir, "daily");
|
|
16
|
+
mkdirSync(dir, { recursive: true });
|
|
17
|
+
return dir;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Append an exchange summary to today's daily log.
|
|
21
|
+
*/
|
|
22
|
+
export function appendDailyEntry(memoryDir, sender, userMessage, agentResponse) {
|
|
23
|
+
const dir = getDailyDir(memoryDir);
|
|
24
|
+
const today = dateStr(new Date());
|
|
25
|
+
const time = timeStr(new Date());
|
|
26
|
+
const filePath = join(dir, `${today}.md`);
|
|
27
|
+
// Truncate long messages for the daily log
|
|
28
|
+
const userSnippet = userMessage.slice(0, 200).replace(/\n/g, " ");
|
|
29
|
+
const agentSnippet = agentResponse.slice(0, 300).replace(/\n/g, " ");
|
|
30
|
+
const entry = `\n### ${time}\n- **User:** ${userSnippet}\n- **Agent:** ${agentSnippet}\n`;
|
|
31
|
+
// Add header if new file
|
|
32
|
+
if (!existsSync(filePath)) {
|
|
33
|
+
appendFileSync(filePath, `# Daily Log — ${today}\n`);
|
|
34
|
+
}
|
|
35
|
+
appendFileSync(filePath, entry);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Load today's and yesterday's daily logs for context injection.
|
|
39
|
+
*/
|
|
40
|
+
export function loadRecentDaily(memoryDir) {
|
|
41
|
+
const dir = getDailyDir(memoryDir);
|
|
42
|
+
const today = new Date();
|
|
43
|
+
const yesterday = new Date(today);
|
|
44
|
+
yesterday.setDate(yesterday.getDate() - 1);
|
|
45
|
+
const files = [
|
|
46
|
+
{ date: dateStr(yesterday), label: "Yesterday" },
|
|
47
|
+
{ date: dateStr(today), label: "Today" },
|
|
48
|
+
];
|
|
49
|
+
const parts = [];
|
|
50
|
+
for (const { date, label } of files) {
|
|
51
|
+
const filePath = join(dir, `${date}.md`);
|
|
52
|
+
if (existsSync(filePath)) {
|
|
53
|
+
try {
|
|
54
|
+
const content = readFileSync(filePath, "utf-8").trim();
|
|
55
|
+
if (content) {
|
|
56
|
+
parts.push(`[${label}'s Activity — ${date}]\n${content}\n[/${label}]`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
catch { /* ignore */ }
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return parts.join("\n\n");
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get all daily file paths for indexing.
|
|
66
|
+
*/
|
|
67
|
+
export function listDailyFiles(memoryDir) {
|
|
68
|
+
const dir = getDailyDir(memoryDir);
|
|
69
|
+
try {
|
|
70
|
+
return readdirSync(dir)
|
|
71
|
+
.filter((f) => f.endsWith(".md"))
|
|
72
|
+
.map((f) => ({
|
|
73
|
+
path: join(dir, f),
|
|
74
|
+
date: f.replace(".md", ""),
|
|
75
|
+
}))
|
|
76
|
+
.sort((a, b) => a.date.localeCompare(b.date));
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=daily.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daily.js","sourceRoot":"","sources":["../../src/memory/daily.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding providers — auto-selects best available:
|
|
3
|
+
* 1. OpenAI text-embedding-3-small (if OPENAI_API_KEY set)
|
|
4
|
+
* 2. TF-IDF local (zero dependencies, always works)
|
|
5
|
+
*/
|
|
6
|
+
export interface EmbeddingProvider {
|
|
7
|
+
name: string;
|
|
8
|
+
dimensions: number;
|
|
9
|
+
embed(text: string): Promise<number[]>;
|
|
10
|
+
embedBatch(texts: string[]): Promise<number[][]>;
|
|
11
|
+
}
|
|
12
|
+
export declare function buildVocab(texts: string[]): void;
|
|
13
|
+
export declare function getEmbeddingProvider(): EmbeddingProvider;
|
|
14
|
+
export declare function cosineSimilarity(a: number[], b: number[]): number;
|
|
15
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;CAClD;AA+BD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAQhD;AAoGD,wBAAgB,oBAAoB,IAAI,iBAAiB,CAaxD;AAID,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAejE"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Embedding providers — auto-selects best available:
|
|
3
|
+
* 1. OpenAI text-embedding-3-small (if OPENAI_API_KEY set)
|
|
4
|
+
* 2. TF-IDF local (zero dependencies, always works)
|
|
5
|
+
*/
|
|
6
|
+
import { log } from "../logger.js";
|
|
7
|
+
// ─── TF-IDF Local Provider (zero deps) ──────────────────────────────
|
|
8
|
+
const STOP_WORDS = new Set([
|
|
9
|
+
"the", "a", "an", "is", "are", "was", "were", "be", "been", "being",
|
|
10
|
+
"have", "has", "had", "do", "does", "did", "will", "would", "could",
|
|
11
|
+
"should", "may", "might", "shall", "can", "need", "dare", "ought",
|
|
12
|
+
"used", "to", "of", "in", "for", "on", "with", "at", "by", "from",
|
|
13
|
+
"as", "into", "through", "during", "before", "after", "above", "below",
|
|
14
|
+
"between", "out", "off", "over", "under", "again", "further", "then",
|
|
15
|
+
"once", "here", "there", "when", "where", "why", "how", "all", "each",
|
|
16
|
+
"every", "both", "few", "more", "most", "other", "some", "such", "no",
|
|
17
|
+
"nor", "not", "only", "own", "same", "so", "than", "too", "very",
|
|
18
|
+
"just", "because", "but", "and", "or", "if", "while", "that", "this",
|
|
19
|
+
"it", "its", "i", "me", "my", "we", "our", "you", "your", "he", "him",
|
|
20
|
+
"his", "she", "her", "they", "them", "their", "what", "which", "who",
|
|
21
|
+
]);
|
|
22
|
+
function tokenize(text) {
|
|
23
|
+
return text
|
|
24
|
+
.toLowerCase()
|
|
25
|
+
.replace(/[^a-z0-9\s]/g, " ")
|
|
26
|
+
.split(/\s+/)
|
|
27
|
+
.filter(t => t.length > 1 && !STOP_WORDS.has(t));
|
|
28
|
+
}
|
|
29
|
+
// Global vocabulary built from all indexed texts
|
|
30
|
+
const globalVocab = new Map(); // word -> index
|
|
31
|
+
let vocabSize = 0;
|
|
32
|
+
export function buildVocab(texts) {
|
|
33
|
+
for (const text of texts) {
|
|
34
|
+
for (const token of tokenize(text)) {
|
|
35
|
+
if (!globalVocab.has(token)) {
|
|
36
|
+
globalVocab.set(token, vocabSize++);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
function tfidfVector(text) {
|
|
42
|
+
const tokens = tokenize(text);
|
|
43
|
+
if (tokens.length === 0)
|
|
44
|
+
return new Array(Math.max(vocabSize, 1)).fill(0);
|
|
45
|
+
// Term frequency
|
|
46
|
+
const tf = new Map();
|
|
47
|
+
for (const t of tokens) {
|
|
48
|
+
tf.set(t, (tf.get(t) || 0) + 1);
|
|
49
|
+
}
|
|
50
|
+
// Build sparse vector
|
|
51
|
+
const vec = new Array(Math.max(vocabSize, 1)).fill(0);
|
|
52
|
+
for (const [word, count] of tf) {
|
|
53
|
+
const idx = globalVocab.get(word);
|
|
54
|
+
if (idx !== undefined) {
|
|
55
|
+
vec[idx] = count / tokens.length; // normalized TF
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// L2 normalize
|
|
59
|
+
const norm = Math.sqrt(vec.reduce((sum, v) => sum + v * v, 0));
|
|
60
|
+
if (norm > 0) {
|
|
61
|
+
for (let i = 0; i < vec.length; i++)
|
|
62
|
+
vec[i] /= norm;
|
|
63
|
+
}
|
|
64
|
+
return vec;
|
|
65
|
+
}
|
|
66
|
+
class TFIDFProvider {
|
|
67
|
+
name = "tfidf-local";
|
|
68
|
+
dimensions = 0; // dynamic, grows with vocab
|
|
69
|
+
async embed(text) {
|
|
70
|
+
buildVocab([text]);
|
|
71
|
+
this.dimensions = vocabSize;
|
|
72
|
+
return tfidfVector(text);
|
|
73
|
+
}
|
|
74
|
+
async embedBatch(texts) {
|
|
75
|
+
buildVocab(texts);
|
|
76
|
+
this.dimensions = vocabSize;
|
|
77
|
+
return texts.map(t => tfidfVector(t));
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// ─── OpenAI Provider ─────────────────────────────────────────────────
|
|
81
|
+
class OpenAIProvider {
|
|
82
|
+
name = "openai-text-embedding-3-small";
|
|
83
|
+
dimensions = 1536;
|
|
84
|
+
apiKey;
|
|
85
|
+
constructor(apiKey) {
|
|
86
|
+
this.apiKey = apiKey;
|
|
87
|
+
}
|
|
88
|
+
async embed(text) {
|
|
89
|
+
const results = await this.embedBatch([text]);
|
|
90
|
+
return results[0];
|
|
91
|
+
}
|
|
92
|
+
async embedBatch(texts) {
|
|
93
|
+
try {
|
|
94
|
+
const resp = await fetch("https://api.openai.com/v1/embeddings", {
|
|
95
|
+
method: "POST",
|
|
96
|
+
headers: {
|
|
97
|
+
"Authorization": `Bearer ${this.apiKey}`,
|
|
98
|
+
"Content-Type": "application/json",
|
|
99
|
+
},
|
|
100
|
+
body: JSON.stringify({
|
|
101
|
+
model: "text-embedding-3-small",
|
|
102
|
+
input: texts,
|
|
103
|
+
}),
|
|
104
|
+
});
|
|
105
|
+
if (!resp.ok) {
|
|
106
|
+
log.warn(`OpenAI embeddings failed (${resp.status}), falling back to TF-IDF`);
|
|
107
|
+
const fallback = new TFIDFProvider();
|
|
108
|
+
return fallback.embedBatch(texts);
|
|
109
|
+
}
|
|
110
|
+
const data = await resp.json();
|
|
111
|
+
return data.data.map(d => d.embedding);
|
|
112
|
+
}
|
|
113
|
+
catch (err) {
|
|
114
|
+
log.warn(`OpenAI embeddings error: ${err}, falling back to TF-IDF`);
|
|
115
|
+
const fallback = new TFIDFProvider();
|
|
116
|
+
return fallback.embedBatch(texts);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// ─── Provider selection ──────────────────────────────────────────────
|
|
121
|
+
let cachedProvider = null;
|
|
122
|
+
export function getEmbeddingProvider() {
|
|
123
|
+
if (cachedProvider)
|
|
124
|
+
return cachedProvider;
|
|
125
|
+
const openaiKey = process.env.OPENAI_API_KEY;
|
|
126
|
+
if (openaiKey) {
|
|
127
|
+
cachedProvider = new OpenAIProvider(openaiKey);
|
|
128
|
+
log.info(`Memory embeddings: OpenAI (text-embedding-3-small)`);
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
cachedProvider = new TFIDFProvider();
|
|
132
|
+
log.info(`Memory embeddings: TF-IDF local (set OPENAI_API_KEY for better quality)`);
|
|
133
|
+
}
|
|
134
|
+
return cachedProvider;
|
|
135
|
+
}
|
|
136
|
+
// ─── Cosine similarity ───────────────────────────────────────────────
|
|
137
|
+
export function cosineSimilarity(a, b) {
|
|
138
|
+
// Handle mismatched dimensions (TF-IDF vocab can grow)
|
|
139
|
+
const len = Math.min(a.length, b.length);
|
|
140
|
+
let dot = 0, normA = 0, normB = 0;
|
|
141
|
+
for (let i = 0; i < len; i++) {
|
|
142
|
+
dot += a[i] * b[i];
|
|
143
|
+
normA += a[i] * a[i];
|
|
144
|
+
normB += b[i] * b[i];
|
|
145
|
+
}
|
|
146
|
+
// Include remaining dimensions in norms
|
|
147
|
+
for (let i = len; i < a.length; i++)
|
|
148
|
+
normA += a[i] * a[i];
|
|
149
|
+
for (let i = len; i < b.length; i++)
|
|
150
|
+
normB += b[i] * b[i];
|
|
151
|
+
const denom = Math.sqrt(normA) * Math.sqrt(normB);
|
|
152
|
+
return denom === 0 ? 0 : dot / denom;
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/memory/embeddings.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AASnC,uEAAuE;AAEvE,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO;IACnE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IACnE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO;IACjE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM;IACjE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO;IACtE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM;IACpE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM;IACrE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI;IACrE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAChE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM;IACpE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK;IACrE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK;CACrE,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI;SACR,WAAW,EAAE;SACb,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;SAC5B,KAAK,CAAC,KAAK,CAAC;SACZ,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACrD,CAAC;AAED,iDAAiD;AACjD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAkB,CAAC,CAAC,gBAAgB;AAC/D,IAAI,SAAS,GAAG,CAAC,CAAC;AAElB,MAAM,UAAU,UAAU,CAAC,KAAe;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC5B,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1E,iBAAiB;IACjB,MAAM,EAAE,GAAG,IAAI,GAAG,EAAkB,CAAC;IACrC,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC;IAED,sBAAsB;IACtB,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/B,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,gBAAgB;QACpD,CAAC;IACH,CAAC;IAED,eAAe;IACf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,IAAI,IAAI,GAAG,CAAC,EAAE,CAAC;QACb,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE;YAAE,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,aAAa;IACjB,IAAI,GAAG,aAAa,CAAC;IACrB,UAAU,GAAG,CAAC,CAAC,CAAC,4BAA4B;IAE5C,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,UAAU,CAAC,KAAK,CAAC,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;QAC5B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;CACF;AAED,wEAAwE;AAExE,MAAM,cAAc;IAClB,IAAI,GAAG,+BAA+B,CAAC;IACvC,UAAU,GAAG,IAAI,CAAC;IACV,MAAM,CAAS;IAEvB,YAAY,MAAc;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY;QACtB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,KAAe;QAC9B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,sCAAsC,EAAE;gBAC/D,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE;oBACxC,cAAc,EAAE,kBAAkB;iBACnC;gBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,KAAK,EAAE,wBAAwB;oBAC/B,KAAK,EAAE,KAAK;iBACb,CAAC;aACH,CAAC,CAAC;YAEH,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;gBACb,GAAG,CAAC,IAAI,CAAC,6BAA6B,IAAI,CAAC,MAAM,2BAA2B,CAAC,CAAC;gBAC9E,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;gBACrC,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAE3B,CAAC;YAEF,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACzC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,GAAG,CAAC,IAAI,CAAC,4BAA4B,GAAG,0BAA0B,CAAC,CAAC;YACpE,MAAM,QAAQ,GAAG,IAAI,aAAa,EAAE,CAAC;YACrC,OAAO,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AAED,wEAAwE;AAExE,IAAI,cAAc,GAA6B,IAAI,CAAC;AAEpD,MAAM,UAAU,oBAAoB;IAClC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC;IAC7C,IAAI,SAAS,EAAE,CAAC;QACd,cAAc,GAAG,IAAI,cAAc,CAAC,SAAS,CAAC,CAAC;QAC/C,GAAG,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACjE,CAAC;SAAM,CAAC;QACN,cAAc,GAAG,IAAI,aAAa,EAAE,CAAC;QACrC,GAAG,CAAC,IAAI,CAAC,yEAAyE,CAAC,CAAC;IACtF,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,wEAAwE;AAExE,MAAM,UAAU,gBAAgB,CAAC,CAAW,EAAE,CAAW;IACvD,uDAAuD;IACvD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,GAAG,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC;IAClC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IACD,wCAAwC;IACxC,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1D,KAAK,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClD,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MemoryManager — orchestrates advanced memory for agents.
|
|
3
|
+
* - Semantic search over stored memories
|
|
4
|
+
* - Daily memory logging
|
|
5
|
+
* - Auto-compaction (prompts agent to save before context grows too large)
|
|
6
|
+
* - Indexes context.md, daily logs, and conversation exchanges
|
|
7
|
+
*/
|
|
8
|
+
import { type SearchResult } from "./search.js";
|
|
9
|
+
export interface MemoryManager {
|
|
10
|
+
/** Search memories relevant to a query */
|
|
11
|
+
search(query: string, topK?: number): Promise<SearchResult[]>;
|
|
12
|
+
/** Format search results for prompt injection */
|
|
13
|
+
searchFormatted(query: string, topK?: number): Promise<string>;
|
|
14
|
+
/** Index a new text chunk into memory */
|
|
15
|
+
index(text: string, source: string, metadata?: Record<string, string>): Promise<void>;
|
|
16
|
+
/** Index a conversation exchange */
|
|
17
|
+
indexExchange(userMessage: string, agentResponse: string, sender: string): Promise<void>;
|
|
18
|
+
/** Load recent daily context */
|
|
19
|
+
loadDailyContext(): string;
|
|
20
|
+
/** Re-index all memory sources (context.md + daily files) */
|
|
21
|
+
reindex(): Promise<void>;
|
|
22
|
+
/** Get auto-compaction prompt if needed */
|
|
23
|
+
getCompactionPrompt(messageCount: number): string | null;
|
|
24
|
+
/** Get memory stats */
|
|
25
|
+
stats(): Promise<{
|
|
26
|
+
chunks: number;
|
|
27
|
+
store: string;
|
|
28
|
+
embeddings: string;
|
|
29
|
+
}>;
|
|
30
|
+
}
|
|
31
|
+
export declare function createMemoryManager(memoryDir: string): Promise<MemoryManager>;
|
|
32
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memory/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAOH,OAAO,EAAqC,KAAK,YAAY,EAAE,MAAM,aAAa,CAAC;AAInF,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAE9D,iDAAiD;IACjD,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAE/D,yCAAyC;IACzC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEtF,oCAAoC;IACpC,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzF,gCAAgC;IAChC,gBAAgB,IAAI,MAAM,CAAC;IAE3B,6DAA6D;IAC7D,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAEzB,2CAA2C;IAC3C,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAEzD,uBAAuB;IACvB,KAAK,IAAI,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACzE;AA+BD,wBAAsB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAwFnF"}
|