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.
Files changed (315) hide show
  1. package/README.md +113 -0
  2. package/agents/_template/CLAUDE.md +18 -0
  3. package/agents/_template/agent.json +7 -0
  4. package/agents/platform/agentcreator/CLAUDE.md +300 -0
  5. package/agents/platform/appcreator/CLAUDE.md +158 -0
  6. package/agents/platform/gym/CLAUDE.md +486 -0
  7. package/agents/platform/gym/agent.json +40 -0
  8. package/agents/platform/gym/programs/agent-building/program.json +160 -0
  9. package/agents/platform/gym/programs/automations-mastery/program.json +129 -0
  10. package/agents/platform/gym/programs/getting-started/program.json +124 -0
  11. package/agents/platform/gym/programs/mcp-integrations/program.json +116 -0
  12. package/agents/platform/gym/programs/multi-model-strategy/program.json +115 -0
  13. package/agents/platform/gym/programs/prompt-engineering/program.json +136 -0
  14. package/agents/platform/gym/souls/alex.md +12 -0
  15. package/agents/platform/gym/souls/jordan.md +12 -0
  16. package/agents/platform/gym/souls/morgan.md +12 -0
  17. package/agents/platform/gym/souls/riley.md +12 -0
  18. package/agents/platform/gym/souls/sam.md +12 -0
  19. package/agents/platform/hub/CLAUDE.md +372 -0
  20. package/agents/platform/promptcreator/CLAUDE.md +130 -0
  21. package/agents/platform/skillcreator/CLAUDE.md +163 -0
  22. package/bin/cli.js +566 -0
  23. package/config.example.json +310 -0
  24. package/dist/agent-registry.d.ts +32 -0
  25. package/dist/agent-registry.d.ts.map +1 -0
  26. package/dist/agent-registry.js +144 -0
  27. package/dist/agent-registry.js.map +1 -0
  28. package/dist/channels/discord.d.ts +17 -0
  29. package/dist/channels/discord.d.ts.map +1 -0
  30. package/dist/channels/discord.js +114 -0
  31. package/dist/channels/discord.js.map +1 -0
  32. package/dist/channels/imessage.d.ts +23 -0
  33. package/dist/channels/imessage.d.ts.map +1 -0
  34. package/dist/channels/imessage.js +214 -0
  35. package/dist/channels/imessage.js.map +1 -0
  36. package/dist/channels/slack.d.ts +19 -0
  37. package/dist/channels/slack.d.ts.map +1 -0
  38. package/dist/channels/slack.js +167 -0
  39. package/dist/channels/slack.js.map +1 -0
  40. package/dist/channels/telegram.d.ts +19 -0
  41. package/dist/channels/telegram.d.ts.map +1 -0
  42. package/dist/channels/telegram.js +274 -0
  43. package/dist/channels/telegram.js.map +1 -0
  44. package/dist/channels/types.d.ts +44 -0
  45. package/dist/channels/types.d.ts.map +1 -0
  46. package/dist/channels/types.js +18 -0
  47. package/dist/channels/types.js.map +1 -0
  48. package/dist/channels/whatsapp.d.ts +23 -0
  49. package/dist/channels/whatsapp.d.ts.map +1 -0
  50. package/dist/channels/whatsapp.js +189 -0
  51. package/dist/channels/whatsapp.js.map +1 -0
  52. package/dist/config.d.ts +134 -0
  53. package/dist/config.d.ts.map +1 -0
  54. package/dist/config.js +127 -0
  55. package/dist/config.js.map +1 -0
  56. package/dist/cron.d.ts +8 -0
  57. package/dist/cron.d.ts.map +1 -0
  58. package/dist/cron.js +35 -0
  59. package/dist/cron.js.map +1 -0
  60. package/dist/decrypt-keys.d.ts +7 -0
  61. package/dist/decrypt-keys.d.ts.map +1 -0
  62. package/dist/decrypt-keys.js +53 -0
  63. package/dist/decrypt-keys.js.map +1 -0
  64. package/dist/encrypt-keys.d.ts +8 -0
  65. package/dist/encrypt-keys.d.ts.map +1 -0
  66. package/dist/encrypt-keys.js +62 -0
  67. package/dist/encrypt-keys.js.map +1 -0
  68. package/dist/executor.d.ts +31 -0
  69. package/dist/executor.d.ts.map +1 -0
  70. package/dist/executor.js +2009 -0
  71. package/dist/executor.js.map +1 -0
  72. package/dist/gemini-executor.d.ts +27 -0
  73. package/dist/gemini-executor.d.ts.map +1 -0
  74. package/dist/gemini-executor.js +160 -0
  75. package/dist/gemini-executor.js.map +1 -0
  76. package/dist/goals.d.ts +24 -0
  77. package/dist/goals.d.ts.map +1 -0
  78. package/dist/goals.js +189 -0
  79. package/dist/goals.js.map +1 -0
  80. package/dist/gym/activity-digest.d.ts +30 -0
  81. package/dist/gym/activity-digest.d.ts.map +1 -0
  82. package/dist/gym/activity-digest.js +506 -0
  83. package/dist/gym/activity-digest.js.map +1 -0
  84. package/dist/gym/dimension-scorer.d.ts +76 -0
  85. package/dist/gym/dimension-scorer.d.ts.map +1 -0
  86. package/dist/gym/dimension-scorer.js +236 -0
  87. package/dist/gym/dimension-scorer.js.map +1 -0
  88. package/dist/gym/gym-router.d.ts +7 -0
  89. package/dist/gym/gym-router.d.ts.map +1 -0
  90. package/dist/gym/gym-router.js +718 -0
  91. package/dist/gym/gym-router.js.map +1 -0
  92. package/dist/gym/index.d.ts +11 -0
  93. package/dist/gym/index.d.ts.map +1 -0
  94. package/dist/gym/index.js +11 -0
  95. package/dist/gym/index.js.map +1 -0
  96. package/dist/heartbeat.d.ts +21 -0
  97. package/dist/heartbeat.d.ts.map +1 -0
  98. package/dist/heartbeat.js +163 -0
  99. package/dist/heartbeat.js.map +1 -0
  100. package/dist/index.d.ts +2 -0
  101. package/dist/index.d.ts.map +1 -0
  102. package/dist/index.js +254 -0
  103. package/dist/index.js.map +1 -0
  104. package/dist/keystore.d.ts +22 -0
  105. package/dist/keystore.d.ts.map +1 -0
  106. package/dist/keystore.js +178 -0
  107. package/dist/keystore.js.map +1 -0
  108. package/dist/logger.d.ts +9 -0
  109. package/dist/logger.d.ts.map +1 -0
  110. package/dist/logger.js +45 -0
  111. package/dist/logger.js.map +1 -0
  112. package/dist/memory/daily.d.ts +22 -0
  113. package/dist/memory/daily.d.ts.map +1 -0
  114. package/dist/memory/daily.js +82 -0
  115. package/dist/memory/daily.js.map +1 -0
  116. package/dist/memory/embeddings.d.ts +15 -0
  117. package/dist/memory/embeddings.d.ts.map +1 -0
  118. package/dist/memory/embeddings.js +154 -0
  119. package/dist/memory/embeddings.js.map +1 -0
  120. package/dist/memory/index.d.ts +32 -0
  121. package/dist/memory/index.d.ts.map +1 -0
  122. package/dist/memory/index.js +159 -0
  123. package/dist/memory/index.js.map +1 -0
  124. package/dist/memory/search.d.ts +21 -0
  125. package/dist/memory/search.d.ts.map +1 -0
  126. package/dist/memory/search.js +77 -0
  127. package/dist/memory/search.js.map +1 -0
  128. package/dist/memory/store.d.ts +23 -0
  129. package/dist/memory/store.d.ts.map +1 -0
  130. package/dist/memory/store.js +144 -0
  131. package/dist/memory/store.js.map +1 -0
  132. package/dist/ollama-executor.d.ts +17 -0
  133. package/dist/ollama-executor.d.ts.map +1 -0
  134. package/dist/ollama-executor.js +112 -0
  135. package/dist/ollama-executor.js.map +1 -0
  136. package/dist/openai-executor.d.ts +38 -0
  137. package/dist/openai-executor.d.ts.map +1 -0
  138. package/dist/openai-executor.js +197 -0
  139. package/dist/openai-executor.js.map +1 -0
  140. package/dist/router.d.ts +11 -0
  141. package/dist/router.d.ts.map +1 -0
  142. package/dist/router.js +185 -0
  143. package/dist/router.js.map +1 -0
  144. package/dist/test-message.d.ts +2 -0
  145. package/dist/test-message.d.ts.map +1 -0
  146. package/dist/test-message.js +60 -0
  147. package/dist/test-message.js.map +1 -0
  148. package/dist/utils/imsg-db-reader.d.ts +24 -0
  149. package/dist/utils/imsg-db-reader.d.ts.map +1 -0
  150. package/dist/utils/imsg-db-reader.js +92 -0
  151. package/dist/utils/imsg-db-reader.js.map +1 -0
  152. package/dist/utils/imsg-rpc.d.ts +25 -0
  153. package/dist/utils/imsg-rpc.d.ts.map +1 -0
  154. package/dist/utils/imsg-rpc.js +149 -0
  155. package/dist/utils/imsg-rpc.js.map +1 -0
  156. package/dist/utils/message-formatter.d.ts +3 -0
  157. package/dist/utils/message-formatter.d.ts.map +1 -0
  158. package/dist/utils/message-formatter.js +69 -0
  159. package/dist/utils/message-formatter.js.map +1 -0
  160. package/dist/web-ui.d.ts +12 -0
  161. package/dist/web-ui.d.ts.map +1 -0
  162. package/dist/web-ui.js +5784 -0
  163. package/dist/web-ui.js.map +1 -0
  164. package/dist/whatsapp-chats.d.ts +2 -0
  165. package/dist/whatsapp-chats.d.ts.map +1 -0
  166. package/dist/whatsapp-chats.js +76 -0
  167. package/dist/whatsapp-chats.js.map +1 -0
  168. package/dist/whatsapp-login.d.ts +2 -0
  169. package/dist/whatsapp-login.d.ts.map +1 -0
  170. package/dist/whatsapp-login.js +90 -0
  171. package/dist/whatsapp-login.js.map +1 -0
  172. package/dist/wiki-sync.d.ts +21 -0
  173. package/dist/wiki-sync.d.ts.map +1 -0
  174. package/dist/wiki-sync.js +147 -0
  175. package/dist/wiki-sync.js.map +1 -0
  176. package/docs/AddNewAgentGuide.md +100 -0
  177. package/docs/AddNewMcpGuide.md +72 -0
  178. package/docs/Architecture.md +795 -0
  179. package/docs/CLAUDE-AI-SETUP.md +166 -0
  180. package/docs/Setup.md +297 -0
  181. package/docs/ai-gym-architecture.md +1040 -0
  182. package/docs/ai-gym-build-plan.md +343 -0
  183. package/docs/ai-gym-onboarding.md +122 -0
  184. package/docs/appcreator_plan.md +348 -0
  185. package/docs/platform-mcp-audit.md +320 -0
  186. package/docs/server-deployment-plan.md +503 -0
  187. package/docs/superpowers/plans/2026-03-25-marketplace.md +1281 -0
  188. package/docs/superpowers/specs/2026-03-25-marketplace-design.md +287 -0
  189. package/docs/user-guide.md +2016 -0
  190. package/mcp-catalog.json +628 -0
  191. package/package.json +63 -0
  192. package/public/MyAIforOne-logomark-512.svg +16 -0
  193. package/public/MyAIforOne-logomark-transparent.svg +15 -0
  194. package/public/activity.html +314 -0
  195. package/public/admin.html +1674 -0
  196. package/public/agent-dashboard.html +670 -0
  197. package/public/api-docs.html +1106 -0
  198. package/public/automations.html +722 -0
  199. package/public/canvas.css +223 -0
  200. package/public/canvas.js +588 -0
  201. package/public/changelog.html +231 -0
  202. package/public/gym.html +2766 -0
  203. package/public/home.html +1930 -0
  204. package/public/index.html +2809 -0
  205. package/public/lab.html +1643 -0
  206. package/public/library.html +1442 -0
  207. package/public/marketplace.html +1101 -0
  208. package/public/mcp-docs.html +441 -0
  209. package/public/mini.html +390 -0
  210. package/public/monitor.html +584 -0
  211. package/public/org.html +4304 -0
  212. package/public/projects.html +734 -0
  213. package/public/settings.html +645 -0
  214. package/public/tasks.html +932 -0
  215. package/public/trainers/alex.svg +12 -0
  216. package/public/trainers/jordan.svg +12 -0
  217. package/public/trainers/morgan.svg +12 -0
  218. package/public/trainers/riley.svg +12 -0
  219. package/public/trainers/sam.svg +12 -0
  220. package/public/user-guide.html +218 -0
  221. package/registry/agents.json +3 -0
  222. package/registry/apps.json +20 -0
  223. package/registry/installed-drafts.json +3 -0
  224. package/registry/mcps.json +1084 -0
  225. package/registry/prompts/personal/mcp-test-prompt.md +6 -0
  226. package/registry/prompts/personal/memory-recall.md +6 -0
  227. package/registry/prompts/platform/brainstorm.md +15 -0
  228. package/registry/prompts/platform/code-review.md +16 -0
  229. package/registry/prompts/platform/explain.md +16 -0
  230. package/registry/prompts.json +58 -0
  231. package/registry/skills/external/brainstorming.md +5 -0
  232. package/registry/skills/external/code-review.md +40 -0
  233. package/registry/skills/external/frontend-patterns.md +642 -0
  234. package/registry/skills/external/frontend-slides.md +184 -0
  235. package/registry/skills/external/systematic-debugging.md +5 -0
  236. package/registry/skills/external/tdd.md +328 -0
  237. package/registry/skills/external/verification-before-completion.md +5 -0
  238. package/registry/skills/external/writing-plans.md +5 -0
  239. package/registry/skills/platform/ai41_app_build.md +930 -0
  240. package/registry/skills/platform/ai41_app_deploy.md +168 -0
  241. package/registry/skills/platform/ai41_app_orchestrator.md +239 -0
  242. package/registry/skills/platform/ai41_app_patterns.md +359 -0
  243. package/registry/skills/platform/ai41_app_register.md +85 -0
  244. package/registry/skills/platform/ai41_app_scaffold.md +421 -0
  245. package/registry/skills/platform/ai41_app_verify.md +107 -0
  246. package/registry/skills/platform/opProjectCreate.md +239 -0
  247. package/registry/skills/platform/op_devbrowser.md +136 -0
  248. package/registry/skills/platform/sop_brandguidelines.md +103 -0
  249. package/registry/skills/platform/sop_docx.md +117 -0
  250. package/registry/skills/platform/sop_frontenddesign.md +44 -0
  251. package/registry/skills/platform/sop_frontenddesign_v2.md +659 -0
  252. package/registry/skills/platform/sop_mcpbuilder.md +133 -0
  253. package/registry/skills/platform/sop_pdf.md +172 -0
  254. package/registry/skills/platform/sop_pptx.md +133 -0
  255. package/registry/skills/platform/sop_skillcreator.md +104 -0
  256. package/registry/skills/platform/sop_themefactory.md +128 -0
  257. package/registry/skills/platform/sop_webapptesting.md +75 -0
  258. package/registry/skills/platform/sop_webartifactsbuilder.md +97 -0
  259. package/registry/skills/platform/sop_xlsx.md +134 -0
  260. package/registry/skills.json +1055 -0
  261. package/scripts/discover-chats.sh +11 -0
  262. package/scripts/install-service-windows.ps1 +87 -0
  263. package/scripts/install-service.sh +52 -0
  264. package/scripts/seed-registry.ts +195 -0
  265. package/scripts/test-send.sh +5 -0
  266. package/scripts/tray-indicator.ps1 +35 -0
  267. package/scripts/uninstall-service-windows.ps1 +23 -0
  268. package/scripts/uninstall-service.sh +15 -0
  269. package/scripts/xbar-myagent.5s.sh +32 -0
  270. package/server/mcp-server/dist/index.d.ts +11 -0
  271. package/server/mcp-server/dist/index.js +1332 -0
  272. package/server/mcp-server/dist/lib/api-client.d.ts +165 -0
  273. package/server/mcp-server/dist/lib/api-client.js +241 -0
  274. package/server/mcp-server/index.ts +1545 -0
  275. package/server/mcp-server/lib/api-client.ts +366 -0
  276. package/server/mcp-server/tsconfig.json +14 -0
  277. package/src/agent-registry.ts +180 -0
  278. package/src/channels/discord.ts +129 -0
  279. package/src/channels/imessage.ts +261 -0
  280. package/src/channels/slack.ts +208 -0
  281. package/src/channels/telegram.ts +307 -0
  282. package/src/channels/types.ts +62 -0
  283. package/src/channels/whatsapp.ts +227 -0
  284. package/src/config.ts +281 -0
  285. package/src/cron.ts +43 -0
  286. package/src/decrypt-keys.ts +60 -0
  287. package/src/encrypt-keys.ts +70 -0
  288. package/src/executor.ts +2190 -0
  289. package/src/gemini-executor.ts +212 -0
  290. package/src/goals.ts +240 -0
  291. package/src/gym/activity-digest.ts +546 -0
  292. package/src/gym/dimension-scorer.ts +297 -0
  293. package/src/gym/gym-router.ts +801 -0
  294. package/src/gym/index.ts +19 -0
  295. package/src/heartbeat.ts +220 -0
  296. package/src/index.ts +275 -0
  297. package/src/keystore.ts +190 -0
  298. package/src/logger.ts +51 -0
  299. package/src/memory/daily.ts +101 -0
  300. package/src/memory/embeddings.ts +185 -0
  301. package/src/memory/index.ts +218 -0
  302. package/src/memory/search.ts +124 -0
  303. package/src/memory/store.ts +189 -0
  304. package/src/ollama-executor.ts +126 -0
  305. package/src/openai-executor.ts +259 -0
  306. package/src/router.ts +230 -0
  307. package/src/test-message.ts +72 -0
  308. package/src/utils/imsg-db-reader.ts +109 -0
  309. package/src/utils/imsg-rpc.ts +178 -0
  310. package/src/utils/message-formatter.ts +90 -0
  311. package/src/web-ui.ts +5778 -0
  312. package/src/whatsapp-chats.ts +91 -0
  313. package/src/whatsapp-login.ts +110 -0
  314. package/src/wiki-sync.ts +199 -0
  315. package/tsconfig.json +19 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whatsapp-chats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-chats.d.ts","sourceRoot":"","sources":["../src/whatsapp-chats.ts"],"names":[],"mappings":""}
@@ -0,0 +1,76 @@
1
+ import { makeWASocket, useMultiFileAuthState, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, } from "@whiskeysockets/baileys";
2
+ import qrcode from "qrcode-terminal";
3
+ import { mkdirSync } from "node:fs";
4
+ import { resolve, dirname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const authDir = resolve(__dirname, "..", "data", "whatsapp-auth");
8
+ mkdirSync(authDir, { recursive: true });
9
+ const silentLogger = {
10
+ level: "silent",
11
+ child: () => silentLogger,
12
+ trace: () => { },
13
+ debug: () => { },
14
+ info: () => { },
15
+ warn: () => { },
16
+ error: () => { },
17
+ fatal: () => { },
18
+ };
19
+ async function discover() {
20
+ const { state, saveCreds } = await useMultiFileAuthState(authDir);
21
+ const { version } = await fetchLatestBaileysVersion();
22
+ const sock = makeWASocket({
23
+ auth: {
24
+ creds: state.creds,
25
+ keys: makeCacheableSignalKeyStore(state.keys, silentLogger),
26
+ },
27
+ version,
28
+ logger: silentLogger,
29
+ printQRInTerminal: false,
30
+ browser: ["channelToAgentToClaude", "Desktop", "1.0.0"],
31
+ syncFullHistory: false,
32
+ markOnlineOnConnect: false,
33
+ });
34
+ sock.ev.on("creds.update", saveCreds);
35
+ sock.ev.on("connection.update", (update) => {
36
+ if (update.qr) {
37
+ console.log("\nScan this QR code with WhatsApp:\n");
38
+ qrcode.generate(update.qr, { small: true });
39
+ }
40
+ if (update.connection === "open") {
41
+ console.log("\nConnected! Now send a message in the WhatsApp chat you want to use.");
42
+ console.log("(Send from your phone — any message will do)\n");
43
+ }
44
+ if (update.connection === "close") {
45
+ // Don't exit on close during reconnect
46
+ }
47
+ });
48
+ sock.ev.on("messages.upsert", (upsert) => {
49
+ for (const msg of upsert.messages) {
50
+ if (msg.key.remoteJid === "status@broadcast")
51
+ continue;
52
+ if (!msg.key.remoteJid)
53
+ continue;
54
+ const text = msg.message?.conversation ||
55
+ msg.message?.extendedTextMessage?.text ||
56
+ msg.message?.imageMessage?.caption ||
57
+ "(media/no text)";
58
+ const isGroup = msg.key.remoteJid.endsWith("@g.us");
59
+ console.log("=== MESSAGE FOUND ===");
60
+ console.log(` JID: ${msg.key.remoteJid}`);
61
+ console.log(` Type: ${isGroup ? "GROUP" : "DM"}`);
62
+ console.log(` From: ${msg.key.fromMe ? "you" : (msg.key.participant || msg.key.remoteJid)}`);
63
+ console.log(` Name: ${msg.pushName || "(unknown)"}`);
64
+ console.log(` Text: ${String(text).slice(0, 100)}`);
65
+ console.log("=====================\n");
66
+ }
67
+ });
68
+ }
69
+ console.log("WhatsApp Chat Discovery");
70
+ console.log("If already linked, will connect automatically.");
71
+ console.log("If not linked, scan the QR code.\n");
72
+ discover().catch((err) => {
73
+ console.error("Error:", err);
74
+ process.exit(1);
75
+ });
76
+ //# sourceMappingURL=whatsapp-chats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-chats.js","sourceRoot":"","sources":["../src/whatsapp-chats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=whatsapp-login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-login.d.ts","sourceRoot":"","sources":["../src/whatsapp-login.ts"],"names":[],"mappings":""}
@@ -0,0 +1,90 @@
1
+ import { makeWASocket, useMultiFileAuthState, fetchLatestBaileysVersion, makeCacheableSignalKeyStore, DisconnectReason, } from "@whiskeysockets/baileys";
2
+ import qrcode from "qrcode-terminal";
3
+ import { mkdirSync, rmSync } from "node:fs";
4
+ import { resolve, dirname } from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ const __dirname = dirname(fileURLToPath(import.meta.url));
7
+ const authDir = resolve(__dirname, "..", "data", "whatsapp-auth");
8
+ let qrCount = 0;
9
+ function connectSocket() {
10
+ return new Promise(async (res) => {
11
+ mkdirSync(authDir, { recursive: true });
12
+ const { state, saveCreds } = await useMultiFileAuthState(authDir);
13
+ const { version } = await fetchLatestBaileysVersion();
14
+ console.log(`Connecting... (Baileys ${version.join(".")})`);
15
+ const sock = makeWASocket({
16
+ auth: {
17
+ creds: state.creds,
18
+ keys: makeCacheableSignalKeyStore(state.keys, silentLogger),
19
+ },
20
+ version,
21
+ logger: silentLogger,
22
+ printQRInTerminal: false,
23
+ browser: ["channelToAgentToClaude", "Desktop", "1.0.0"],
24
+ syncFullHistory: false,
25
+ markOnlineOnConnect: false,
26
+ });
27
+ sock.ev.on("creds.update", saveCreds);
28
+ sock.ev.on("connection.update", (update) => {
29
+ const { connection, lastDisconnect, qr } = update;
30
+ if (qr) {
31
+ qrCount++;
32
+ console.log(`\n--- QR Code #${qrCount} (scan quickly!) ---\n`);
33
+ qrcode.generate(qr, { small: true });
34
+ console.log("\nWaiting for scan...");
35
+ }
36
+ if (connection === "open") {
37
+ console.log(`\n✓ Connected as ${sock.user?.name ?? sock.user?.id}`);
38
+ console.log(`Credentials saved to: ${authDir}`);
39
+ console.log("\nWhatsApp is linked! You can now restart the service.");
40
+ setTimeout(() => res("done"), 3000);
41
+ }
42
+ if (connection === "close") {
43
+ const reason = lastDisconnect?.error?.output?.statusCode;
44
+ console.log(`Connection closed (reason: ${reason})`);
45
+ if (reason === DisconnectReason.loggedOut) {
46
+ console.log("Logged out — clearing creds and retrying...");
47
+ rmSync(authDir, { recursive: true, force: true });
48
+ res("restart");
49
+ }
50
+ else if (reason === DisconnectReason.restartRequired || reason === 515) {
51
+ console.log("WhatsApp requested restart — reconnecting...\n");
52
+ res("restart");
53
+ }
54
+ else {
55
+ console.error(`Unexpected disconnect (${reason}). Retrying...\n`);
56
+ res("restart");
57
+ }
58
+ }
59
+ });
60
+ });
61
+ }
62
+ const silentLogger = {
63
+ level: "silent",
64
+ child: () => silentLogger,
65
+ trace: () => { },
66
+ debug: () => { },
67
+ info: () => { },
68
+ warn: () => { },
69
+ error: () => { },
70
+ fatal: () => { },
71
+ };
72
+ async function login() {
73
+ console.log("WhatsApp Login — Scan the QR code with your phone");
74
+ console.log("WhatsApp > Settings > Linked Devices > Link a Device\n");
75
+ const maxAttempts = 5;
76
+ for (let i = 0; i < maxAttempts; i++) {
77
+ const result = await connectSocket();
78
+ if (result === "done") {
79
+ process.exit(0);
80
+ }
81
+ console.log(`Attempt ${i + 2} of ${maxAttempts}...`);
82
+ }
83
+ console.error("Max reconnection attempts reached. Please try again.");
84
+ process.exit(1);
85
+ }
86
+ login().catch((err) => {
87
+ console.error("Login failed:", err);
88
+ process.exit(1);
89
+ });
90
+ //# sourceMappingURL=whatsapp-login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whatsapp-login.js","sourceRoot":"","sources":["../src/whatsapp-login.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,2BAA2B,EAC3B,gBAAgB,GACjB,MAAM,yBAAyB,CAAC;AAEjC,OAAO,MAAM,MAAM,iBAAiB,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,eAAe,CAAC,CAAC;AAElE,IAAI,OAAO,GAAG,CAAC,CAAC;AAEhB,SAAS,aAAa;IACpB,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC/B,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,MAAM,qBAAqB,CAAC,OAAO,CAAC,CAAC;QAClE,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,yBAAyB,EAAE,CAAC;QAEtD,OAAO,CAAC,GAAG,CAAC,0BAA0B,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE5D,MAAM,IAAI,GAAG,YAAY,CAAC;YACxB,IAAI,EAAE;gBACJ,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,IAAI,EAAE,2BAA2B,CAAC,KAAK,CAAC,IAAI,EAAE,YAAmB,CAAC;aACnE;YACD,OAAO;YACP,MAAM,EAAE,YAAmB;YAC3B,iBAAiB,EAAE,KAAK;YACxB,OAAO,EAAE,CAAC,wBAAwB,EAAE,SAAS,EAAE,OAAO,CAAC;YACvD,eAAe,EAAE,KAAK;YACtB,mBAAmB,EAAE,KAAK;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAEtC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,MAAM,EAAE,EAAE;YACzC,MAAM,EAAE,UAAU,EAAE,cAAc,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;YAElD,IAAI,EAAE,EAAE,CAAC;gBACP,OAAO,EAAE,CAAC;gBACV,OAAO,CAAC,GAAG,CAAC,kBAAkB,OAAO,wBAAwB,CAAC,CAAC;gBAC/D,MAAM,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBACrC,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACvC,CAAC;YAED,IAAI,UAAU,KAAK,MAAM,EAAE,CAAC;gBAC1B,OAAO,CAAC,GAAG,CAAC,oBAAoB,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;gBACpE,OAAO,CAAC,GAAG,CAAC,yBAAyB,OAAO,EAAE,CAAC,CAAC;gBAChD,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBACtE,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;YACtC,CAAC;YAED,IAAI,UAAU,KAAK,OAAO,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAI,cAAc,EAAE,KAAc,EAAE,MAAM,EAAE,UAAU,CAAC;gBACnE,OAAO,CAAC,GAAG,CAAC,8BAA8B,MAAM,GAAG,CAAC,CAAC;gBAErD,IAAI,MAAM,KAAK,gBAAgB,CAAC,SAAS,EAAE,CAAC;oBAC1C,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;oBAC3D,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAClD,GAAG,CAAC,SAAS,CAAC,CAAC;gBACjB,CAAC;qBAAM,IAAI,MAAM,KAAK,gBAAgB,CAAC,eAAe,IAAI,MAAM,KAAK,GAAG,EAAE,CAAC;oBACzE,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;oBAC9D,GAAG,CAAC,SAAS,CAAC,CAAC;gBACjB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,KAAK,CAAC,0BAA0B,MAAM,kBAAkB,CAAC,CAAC;oBAClE,GAAG,CAAC,SAAS,CAAC,CAAC;gBACjB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,YAAY,GAAG;IACnB,KAAK,EAAE,QAAiB;IACxB,KAAK,EAAE,GAAG,EAAE,CAAC,YAAY;IACzB,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,IAAI,EAAE,GAAG,EAAE,GAAE,CAAC;IACd,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;IACf,KAAK,EAAE,GAAG,EAAE,GAAE,CAAC;CAChB,CAAC;AAEF,KAAK,UAAU,KAAK;IAClB,OAAO,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC;IACjE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;IAEtE,MAAM,WAAW,GAAG,CAAC,CAAC;IACtB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,aAAa,EAAE,CAAC;QACrC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,WAAW,KAAK,CAAC,CAAC;IACvD,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACpB,OAAO,CAAC,KAAK,CAAC,eAAe,EAAE,GAAG,CAAC,CAAC;IACpC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { AppConfig, McpServerConfig } from "./config.js";
2
+ export interface WikiSyncResult {
3
+ id: string;
4
+ agentId: string;
5
+ triggeredBy: string;
6
+ triggeredAt: string;
7
+ completedAt: string;
8
+ durationMs: number;
9
+ summary: string;
10
+ status: "success" | "error";
11
+ }
12
+ export declare function executeWikiSync(agentId: string, agent: AppConfig["agents"][string], baseDir: string, mcpRegistry?: Record<string, McpServerConfig>, claudeAccounts?: Record<string, string>, globalDefaults?: {
13
+ skills?: string[];
14
+ mcps?: string[];
15
+ prompts?: string[];
16
+ promptTrigger?: string;
17
+ }, triggeredBy?: string): Promise<WikiSyncResult>;
18
+ export declare function getWikiSyncHistory(agentHome: string, limit?: number): WikiSyncResult[];
19
+ export declare function startWikiSync(config: AppConfig, baseDir: string, mcpRegistry?: Record<string, McpServerConfig>): void;
20
+ export declare function stopWikiSync(): void;
21
+ //# sourceMappingURL=wiki-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-sync.d.ts","sourceRoot":"","sources":["../src/wiki-sync.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAQ9D,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC;CAC7B;AAqCD,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,SAAS,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAClC,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EAC7C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACvC,cAAc,CAAC,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAAC,aAAa,CAAC,EAAE,MAAM,CAAA;CAAE,EACnG,WAAW,GAAE,MAAiB,GAC7B,OAAO,CAAC,cAAc,CAAC,CAwDzB;AAcD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,GAAE,MAAW,GAAG,cAAc,EAAE,CAoB1F;AAID,wBAAgB,aAAa,CAC3B,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAC5C,IAAI,CA4BN;AAED,wBAAgB,YAAY,IAAI,IAAI,CAKnC"}
@@ -0,0 +1,147 @@
1
+ import { existsSync, readFileSync, appendFileSync, mkdirSync } from "node:fs";
2
+ import { join, resolve } from "node:path";
3
+ import * as cron from "node-cron";
4
+ import { executeAgent } from "./executor.js";
5
+ import { log } from "./logger.js";
6
+ // ─── Scheduled Tasks ────────────────────────────────────────────────
7
+ const scheduledTasks = [];
8
+ // ─── Build the sync prompt ──────────────────────────────────────────
9
+ function buildWikiSyncPrompt(memoryDir) {
10
+ const contextPath = join(memoryDir, "context.md");
11
+ const learnedPath = join(memoryDir, "learned.md");
12
+ const hasLearned = existsSync(learnedPath);
13
+ const hasContext = existsSync(contextPath);
14
+ if (!hasLearned) {
15
+ return `[WIKI SYNC]\nNo learned.md file found — nothing to sync. Wiki sync complete.\n[END WIKI SYNC]`;
16
+ }
17
+ return `[WIKI SYNC]
18
+ You are performing a scheduled wiki sync. Your job:
19
+
20
+ 1. Read \`${learnedPath}\` — this contains facts the agent learned from conversations
21
+ 2. Read \`${contextPath}\` — this is the curated knowledge base
22
+ 3. For each entry in learned.md:
23
+ - If it's a NEW fact not in context.md → add it to the appropriate section in context.md
24
+ - If it CONTRADICTS something in context.md → update context.md with the correction, adding a note like "(Updated [date] — corrected per [source])"
25
+ - If it's ALREADY in context.md → skip it
26
+ 4. After merging, clear the processed entries from learned.md (leave any that you couldn't verify or that need human review, with a note explaining why)
27
+ 5. Summarize what you merged, what you skipped, and what needs human review
28
+
29
+ Be conservative — only merge facts you're confident about. Flag anything uncertain for human review.
30
+ [END WIKI SYNC]`;
31
+ }
32
+ // ─── Execute Wiki Sync ──────────────────────────────────────────────
33
+ export async function executeWikiSync(agentId, agent, baseDir, mcpRegistry, claudeAccounts, globalDefaults, triggeredBy = "manual") {
34
+ const memoryDir = resolve(baseDir, agent.memoryDir.replace(/^~/, process.env.HOME || ""));
35
+ const prompt = buildWikiSyncPrompt(memoryDir);
36
+ const syntheticMsg = {
37
+ id: `wiki-sync-${agentId}-${Date.now()}`,
38
+ channel: "wiki-sync",
39
+ chatId: `wiki-sync-${agentId}`,
40
+ chatType: "group",
41
+ sender: "wiki-sync-runner",
42
+ senderName: "WikiSync",
43
+ text: prompt,
44
+ timestamp: Date.now(),
45
+ isFromMe: false,
46
+ isGroup: true,
47
+ raw: { type: "wiki-sync", agentId },
48
+ };
49
+ const route = {
50
+ agentId,
51
+ agentConfig: agent,
52
+ route: agent.routes[0],
53
+ };
54
+ const startTime = Date.now();
55
+ const triggeredAt = new Date(startTime).toISOString();
56
+ let status = "success";
57
+ let summary = "";
58
+ try {
59
+ const response = await executeAgent(route, syntheticMsg, baseDir, mcpRegistry, claudeAccounts, globalDefaults);
60
+ summary = response;
61
+ }
62
+ catch (err) {
63
+ status = "error";
64
+ summary = String(err);
65
+ log.error(`Wiki sync failed for ${agentId}: ${err}`);
66
+ }
67
+ const endTime = Date.now();
68
+ const result = {
69
+ id: `ws-${agentId}-${startTime}`,
70
+ agentId,
71
+ triggeredBy,
72
+ triggeredAt,
73
+ completedAt: new Date(endTime).toISOString(),
74
+ durationMs: endTime - startTime,
75
+ summary,
76
+ status,
77
+ };
78
+ // Persist result
79
+ saveWikiSyncResult(agent, baseDir, result);
80
+ log.info(`Wiki sync completed: ${agentId} (${result.durationMs}ms, ${status})`);
81
+ return result;
82
+ }
83
+ // ─── Persistence ────────────────────────────────────────────────────
84
+ function saveWikiSyncResult(agent, baseDir, result) {
85
+ const agentHome = agent.agentHome || resolve(baseDir, agent.memoryDir, "..");
86
+ const dir = join(agentHome.replace(/^~/, process.env.HOME || ""), "wiki-sync");
87
+ if (!existsSync(dir))
88
+ mkdirSync(dir, { recursive: true });
89
+ const today = new Date().toISOString().split("T")[0];
90
+ const logFile = join(dir, `log-${today}.jsonl`);
91
+ appendFileSync(logFile, JSON.stringify(result) + "\n");
92
+ }
93
+ export function getWikiSyncHistory(agentHome, limit = 20) {
94
+ const dir = join(agentHome.replace(/^~/, process.env.HOME || ""), "wiki-sync");
95
+ if (!existsSync(dir))
96
+ return [];
97
+ const results = [];
98
+ try {
99
+ const files = require("fs").readdirSync(dir)
100
+ .filter((f) => f.startsWith("log-") && f.endsWith(".jsonl"))
101
+ .sort()
102
+ .reverse();
103
+ for (const file of files) {
104
+ const lines = readFileSync(join(dir, file), "utf-8").split("\n").filter(Boolean);
105
+ for (const line of lines.reverse()) {
106
+ try {
107
+ results.push(JSON.parse(line));
108
+ }
109
+ catch { /* skip */ }
110
+ if (results.length >= limit)
111
+ return results;
112
+ }
113
+ }
114
+ }
115
+ catch { /* ignore */ }
116
+ return results;
117
+ }
118
+ // ─── Startup / Shutdown ─────────────────────────────────────────────
119
+ export function startWikiSync(config, baseDir, mcpRegistry) {
120
+ for (const [agentId, agent] of Object.entries(config.agents)) {
121
+ if (!agent.wiki || !agent.wikiSync?.enabled)
122
+ continue;
123
+ const schedule = agent.wikiSync.schedule;
124
+ if (!cron.validate(schedule)) {
125
+ log.warn(`Invalid wikiSync cron for ${agentId}: "${schedule}"`);
126
+ continue;
127
+ }
128
+ const task = cron.schedule(schedule, async () => {
129
+ log.info(`Wiki sync triggered: ${agentId}`);
130
+ try {
131
+ await executeWikiSync(agentId, agent, baseDir, mcpRegistry, config.service?.claudeAccounts, { skills: config.defaultSkills, mcps: config.defaultMcps, prompts: config.defaultPrompts, promptTrigger: config.promptTrigger }, "cron");
132
+ }
133
+ catch (err) {
134
+ log.error(`Wiki sync cron error for ${agentId}: ${err}`);
135
+ }
136
+ });
137
+ scheduledTasks.push(task);
138
+ log.info(`Wiki sync scheduled: ${agentId} → "${schedule}"`);
139
+ }
140
+ }
141
+ export function stopWikiSync() {
142
+ for (const task of scheduledTasks) {
143
+ task.stop();
144
+ }
145
+ scheduledTasks.length = 0;
146
+ }
147
+ //# sourceMappingURL=wiki-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wiki-sync.js","sourceRoot":"","sources":["../src/wiki-sync.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,100 @@
1
+ # Adding a New Agent
2
+
3
+ ## 1. Create the agent directory
4
+
5
+ ```bash
6
+ cp -r agents/_template agents/my-agent
7
+ ```
8
+
9
+ This gives you:
10
+ ```
11
+ agents/my-agent/
12
+ CLAUDE.md # System prompt — the agent's personality and instructions
13
+ agent.json # Metadata (id, name, description)
14
+ memory/ # Conversation logs and context (auto-managed)
15
+ ```
16
+
17
+ ## 2. Write the agent's system prompt
18
+
19
+ Edit `agents/my-agent/CLAUDE.md` with:
20
+ - What the agent does
21
+ - What tools/MCPs it has access to
22
+ - Response style (keep short for text message channels)
23
+ - Any rules or guardrails
24
+
25
+ ## 3. Add the agent to `config.json`
26
+
27
+ ```json
28
+ "agents": {
29
+ "my-agent": {
30
+ "name": "My Agent",
31
+ "description": "What this agent does",
32
+ "workspace": "~/path/to/project",
33
+ "claudeMd": "./agents/my-agent/CLAUDE.md",
34
+ "memoryDir": "./agents/my-agent/memory",
35
+ "mentionAliases": ["@myagent"],
36
+ "autoCommit": false,
37
+ "allowedTools": ["Read", "Glob", "Grep"],
38
+ "routes": [
39
+ {
40
+ "channel": "imessage",
41
+ "match": { "type": "chat_id", "value": 67 },
42
+ "permissions": {
43
+ "allowFrom": ["*"],
44
+ "requireMention": true
45
+ }
46
+ },
47
+ {
48
+ "channel": "slack",
49
+ "match": { "type": "channel_id", "value": "YOUR_CHANNEL_ID" },
50
+ "permissions": {
51
+ "allowFrom": ["*"],
52
+ "requireMention": true
53
+ }
54
+ }
55
+ ]
56
+ }
57
+ }
58
+ ```
59
+
60
+ ### Key fields
61
+
62
+ | Field | Description |
63
+ |-------|-------------|
64
+ | `workspace` | Directory where `claude -p` runs. The agent can read/edit files here. |
65
+ | `claudeMd` | Path to the agent's system prompt (relative to project root). |
66
+ | `memoryDir` | Where conversation logs are stored (relative to project root). |
67
+ | `mentionAliases` | How users invoke this agent in group chats (e.g. `@myagent`). |
68
+ | `autoCommit` | If `true`, auto-commits and pushes any workspace changes after each response. |
69
+ | `allowedTools` | Claude Code tools the agent can use. Add MCPs separately (see below). |
70
+ | `mcps` | Optional. Array of MCP server names from the top-level `mcps` registry. See [AddNewMcpGuide.md](./AddNewMcpGuide.md). |
71
+ | `executor` | Optional. Override the platform default executor for this agent: `"claude"` (default) or `"ollama:<model>"` (e.g. `"ollama:gemma2"`). Requires `multiModelEnabled: true` in service config. |
72
+ | `routes` | Which channels + chat IDs this agent listens on. Multiple agents can share a channel if they have different `mentionAliases`. |
73
+
74
+ ### Route matching
75
+
76
+ The router checks agents in config order. For each agent:
77
+ 1. Channel must match
78
+ 2. Chat ID must match
79
+ 3. If `requireMention: true`, message must contain one of the agent's `mentionAliases`
80
+
81
+ Multiple agents can share the same channel + chat ID — they're differentiated by mention alias.
82
+
83
+ ## 4. Rebuild and restart
84
+
85
+ ```bash
86
+ npm run build
87
+ launchctl unload ~/Library/LaunchAgents/com.agenticledger.channelToAgentToClaude.plist
88
+ launchctl load ~/Library/LaunchAgents/com.agenticledger.channelToAgentToClaude.plist
89
+ ```
90
+
91
+ ## 5. Discover chat IDs
92
+
93
+ ```bash
94
+ # iMessage
95
+ imsg chats --limit 20 --json
96
+
97
+ # Slack — check channel ID in Slack UI (right-click channel → View channel details → bottom)
98
+
99
+ # WhatsApp — enable whatsapp, send a message, check logs for JID
100
+ ```
@@ -0,0 +1,72 @@
1
+ # Adding a New MCP Server
2
+
3
+ ## 1. Add the MCP definition to `config.json`
4
+
5
+ Under the top-level `"mcps"` object, add a new entry:
6
+
7
+ ### Stdio MCP (local process)
8
+ ```json
9
+ "mcps": {
10
+ "my-new-mcp": {
11
+ "type": "stdio",
12
+ "command": "node",
13
+ "args": ["~/path/to/mcp-server/dist/index.js"],
14
+ "env": {
15
+ "API_URL": "https://your-api.example.com",
16
+ "API_KEY": "your-key"
17
+ }
18
+ }
19
+ }
20
+ ```
21
+
22
+ ### HTTP MCP (remote server)
23
+ ```json
24
+ "mcps": {
25
+ "my-http-mcp": {
26
+ "type": "http",
27
+ "url": "https://your-mcp-server.example.com/mcp",
28
+ "headers": {
29
+ "Authorization": "Bearer your-token"
30
+ }
31
+ }
32
+ }
33
+ ```
34
+
35
+ ## 2. Assign the MCP to an agent
36
+
37
+ In the agent's config within `config.json`, add the MCP name to its `mcps` array:
38
+
39
+ ```json
40
+ "my-agent": {
41
+ "mcps": ["my-new-mcp"],
42
+ ...
43
+ }
44
+ ```
45
+
46
+ The executor automatically:
47
+ - Generates a temp `.mcp.json` config file per invocation
48
+ - Passes `--mcp-config <path> --strict-mcp-config` to `claude -p`
49
+ - Adds `mcp__<server-name>__*` to `--allowedTools` so the agent can call all tools on that MCP
50
+ - Cleans up temp files after execution
51
+
52
+ ## 3. Rebuild and restart
53
+
54
+ ```bash
55
+ npm run build
56
+ launchctl unload ~/Library/LaunchAgents/com.agenticledger.channelToAgentToClaude.plist
57
+ launchctl load ~/Library/LaunchAgents/com.agenticledger.channelToAgentToClaude.plist
58
+ ```
59
+
60
+ ## Config validation
61
+
62
+ On startup, `loadConfig()` validates:
63
+ - Each MCP definition has required fields (`command` for stdio, `url` for http/sse)
64
+ - Each agent's `mcps` references exist in the top-level `mcps` registry
65
+ - MCP type is one of: `stdio`, `http`, `sse`
66
+
67
+ ## MCP reference repos
68
+
69
+ - **Stdio pattern**: https://github.com/agenticledger/financeMCPsLive
70
+ - **HTTP (Bearer auth)**: https://github.com/agenticledger/smartsheets-mcp-http
71
+ - **HTTP (OAuth + API key)**: https://github.com/agenticledger/qbo-mcp-http
72
+ - **Expose stdio as HTTP**: Use `/opMCPExpose` to wrap any stdio MCP as a Streamable HTTP server