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,91 @@
1
+ import {
2
+ makeWASocket,
3
+ useMultiFileAuthState,
4
+ fetchLatestBaileysVersion,
5
+ makeCacheableSignalKeyStore,
6
+ } from "@whiskeysockets/baileys";
7
+ import qrcode from "qrcode-terminal";
8
+ import { mkdirSync } from "node:fs";
9
+ import { resolve, dirname } from "node:path";
10
+ import { fileURLToPath } from "node:url";
11
+
12
+ const __dirname = dirname(fileURLToPath(import.meta.url));
13
+ const authDir = resolve(__dirname, "..", "data", "whatsapp-auth");
14
+ mkdirSync(authDir, { recursive: true });
15
+
16
+ const silentLogger = {
17
+ level: "silent" as const,
18
+ child: () => silentLogger,
19
+ trace: () => {},
20
+ debug: () => {},
21
+ info: () => {},
22
+ warn: () => {},
23
+ error: () => {},
24
+ fatal: () => {},
25
+ };
26
+
27
+ async function discover(): Promise<void> {
28
+ const { state, saveCreds } = await useMultiFileAuthState(authDir);
29
+ const { version } = await fetchLatestBaileysVersion();
30
+
31
+ const sock = makeWASocket({
32
+ auth: {
33
+ creds: state.creds,
34
+ keys: makeCacheableSignalKeyStore(state.keys, silentLogger as any),
35
+ },
36
+ version,
37
+ logger: silentLogger as any,
38
+ printQRInTerminal: false,
39
+ browser: ["channelToAgentToClaude", "Desktop", "1.0.0"],
40
+ syncFullHistory: false,
41
+ markOnlineOnConnect: false,
42
+ });
43
+
44
+ sock.ev.on("creds.update", saveCreds);
45
+
46
+ sock.ev.on("connection.update", (update) => {
47
+ if (update.qr) {
48
+ console.log("\nScan this QR code with WhatsApp:\n");
49
+ qrcode.generate(update.qr, { small: true });
50
+ }
51
+ if (update.connection === "open") {
52
+ console.log("\nConnected! Now send a message in the WhatsApp chat you want to use.");
53
+ console.log("(Send from your phone — any message will do)\n");
54
+ }
55
+ if (update.connection === "close") {
56
+ // Don't exit on close during reconnect
57
+ }
58
+ });
59
+
60
+ sock.ev.on("messages.upsert", (upsert) => {
61
+ for (const msg of upsert.messages) {
62
+ if (msg.key.remoteJid === "status@broadcast") continue;
63
+ if (!msg.key.remoteJid) continue;
64
+
65
+ const text =
66
+ msg.message?.conversation ||
67
+ msg.message?.extendedTextMessage?.text ||
68
+ msg.message?.imageMessage?.caption ||
69
+ "(media/no text)";
70
+
71
+ const isGroup = msg.key.remoteJid.endsWith("@g.us");
72
+
73
+ console.log("=== MESSAGE FOUND ===");
74
+ console.log(` JID: ${msg.key.remoteJid}`);
75
+ console.log(` Type: ${isGroup ? "GROUP" : "DM"}`);
76
+ console.log(` From: ${msg.key.fromMe ? "you" : (msg.key.participant || msg.key.remoteJid)}`);
77
+ console.log(` Name: ${msg.pushName || "(unknown)"}`);
78
+ console.log(` Text: ${String(text).slice(0, 100)}`);
79
+ console.log("=====================\n");
80
+ }
81
+ });
82
+ }
83
+
84
+ console.log("WhatsApp Chat Discovery");
85
+ console.log("If already linked, will connect automatically.");
86
+ console.log("If not linked, scan the QR code.\n");
87
+
88
+ discover().catch((err) => {
89
+ console.error("Error:", err);
90
+ process.exit(1);
91
+ });
@@ -0,0 +1,110 @@
1
+ import {
2
+ makeWASocket,
3
+ useMultiFileAuthState,
4
+ fetchLatestBaileysVersion,
5
+ makeCacheableSignalKeyStore,
6
+ DisconnectReason,
7
+ } from "@whiskeysockets/baileys";
8
+ import { Boom } from "@hapi/boom";
9
+ import qrcode from "qrcode-terminal";
10
+ import { mkdirSync, rmSync } from "node:fs";
11
+ import { resolve, dirname } from "node:path";
12
+ import { fileURLToPath } from "node:url";
13
+
14
+ const __dirname = dirname(fileURLToPath(import.meta.url));
15
+ const authDir = resolve(__dirname, "..", "data", "whatsapp-auth");
16
+
17
+ let qrCount = 0;
18
+
19
+ function connectSocket(): Promise<"restart" | "done"> {
20
+ return new Promise(async (res) => {
21
+ mkdirSync(authDir, { recursive: true });
22
+ const { state, saveCreds } = await useMultiFileAuthState(authDir);
23
+ const { version } = await fetchLatestBaileysVersion();
24
+
25
+ console.log(`Connecting... (Baileys ${version.join(".")})`);
26
+
27
+ const sock = makeWASocket({
28
+ auth: {
29
+ creds: state.creds,
30
+ keys: makeCacheableSignalKeyStore(state.keys, silentLogger as any),
31
+ },
32
+ version,
33
+ logger: silentLogger as any,
34
+ printQRInTerminal: false,
35
+ browser: ["channelToAgentToClaude", "Desktop", "1.0.0"],
36
+ syncFullHistory: false,
37
+ markOnlineOnConnect: false,
38
+ });
39
+
40
+ sock.ev.on("creds.update", saveCreds);
41
+
42
+ sock.ev.on("connection.update", (update) => {
43
+ const { connection, lastDisconnect, qr } = update;
44
+
45
+ if (qr) {
46
+ qrCount++;
47
+ console.log(`\n--- QR Code #${qrCount} (scan quickly!) ---\n`);
48
+ qrcode.generate(qr, { small: true });
49
+ console.log("\nWaiting for scan...");
50
+ }
51
+
52
+ if (connection === "open") {
53
+ console.log(`\n✓ Connected as ${sock.user?.name ?? sock.user?.id}`);
54
+ console.log(`Credentials saved to: ${authDir}`);
55
+ console.log("\nWhatsApp is linked! You can now restart the service.");
56
+ setTimeout(() => res("done"), 3000);
57
+ }
58
+
59
+ if (connection === "close") {
60
+ const reason = (lastDisconnect?.error as Boom)?.output?.statusCode;
61
+ console.log(`Connection closed (reason: ${reason})`);
62
+
63
+ if (reason === DisconnectReason.loggedOut) {
64
+ console.log("Logged out — clearing creds and retrying...");
65
+ rmSync(authDir, { recursive: true, force: true });
66
+ res("restart");
67
+ } else if (reason === DisconnectReason.restartRequired || reason === 515) {
68
+ console.log("WhatsApp requested restart — reconnecting...\n");
69
+ res("restart");
70
+ } else {
71
+ console.error(`Unexpected disconnect (${reason}). Retrying...\n`);
72
+ res("restart");
73
+ }
74
+ }
75
+ });
76
+ });
77
+ }
78
+
79
+ const silentLogger = {
80
+ level: "silent" as const,
81
+ child: () => silentLogger,
82
+ trace: () => {},
83
+ debug: () => {},
84
+ info: () => {},
85
+ warn: () => {},
86
+ error: () => {},
87
+ fatal: () => {},
88
+ };
89
+
90
+ async function login(): Promise<void> {
91
+ console.log("WhatsApp Login — Scan the QR code with your phone");
92
+ console.log("WhatsApp > Settings > Linked Devices > Link a Device\n");
93
+
94
+ const maxAttempts = 5;
95
+ for (let i = 0; i < maxAttempts; i++) {
96
+ const result = await connectSocket();
97
+ if (result === "done") {
98
+ process.exit(0);
99
+ }
100
+ console.log(`Attempt ${i + 2} of ${maxAttempts}...`);
101
+ }
102
+
103
+ console.error("Max reconnection attempts reached. Please try again.");
104
+ process.exit(1);
105
+ }
106
+
107
+ login().catch((err) => {
108
+ console.error("Login failed:", err);
109
+ process.exit(1);
110
+ });
@@ -0,0 +1,199 @@
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 type { AppConfig, McpServerConfig } from "./config.js";
5
+ import type { InboundMessage } from "./channels/types.js";
6
+ import type { ResolvedRoute } from "./router.js";
7
+ import { executeAgent } from "./executor.js";
8
+ import { log } from "./logger.js";
9
+
10
+ // ─── Wiki Sync Result ───────────────────────────────────────────────
11
+
12
+ export interface WikiSyncResult {
13
+ id: string;
14
+ agentId: string;
15
+ triggeredBy: string; // "manual" | "cron"
16
+ triggeredAt: string;
17
+ completedAt: string;
18
+ durationMs: number;
19
+ summary: string;
20
+ status: "success" | "error";
21
+ }
22
+
23
+ // ─── Scheduled Tasks ────────────────────────────────────────────────
24
+
25
+ const scheduledTasks: cron.ScheduledTask[] = [];
26
+
27
+ // ─── Build the sync prompt ──────────────────────────────────────────
28
+
29
+ function buildWikiSyncPrompt(memoryDir: string): string {
30
+ const contextPath = join(memoryDir, "context.md");
31
+ const learnedPath = join(memoryDir, "learned.md");
32
+
33
+ const hasLearned = existsSync(learnedPath);
34
+ const hasContext = existsSync(contextPath);
35
+
36
+ if (!hasLearned) {
37
+ return `[WIKI SYNC]\nNo learned.md file found — nothing to sync. Wiki sync complete.\n[END WIKI SYNC]`;
38
+ }
39
+
40
+ return `[WIKI SYNC]
41
+ You are performing a scheduled wiki sync. Your job:
42
+
43
+ 1. Read \`${learnedPath}\` — this contains facts the agent learned from conversations
44
+ 2. Read \`${contextPath}\` — this is the curated knowledge base
45
+ 3. For each entry in learned.md:
46
+ - If it's a NEW fact not in context.md → add it to the appropriate section in context.md
47
+ - If it CONTRADICTS something in context.md → update context.md with the correction, adding a note like "(Updated [date] — corrected per [source])"
48
+ - If it's ALREADY in context.md → skip it
49
+ 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)
50
+ 5. Summarize what you merged, what you skipped, and what needs human review
51
+
52
+ Be conservative — only merge facts you're confident about. Flag anything uncertain for human review.
53
+ [END WIKI SYNC]`;
54
+ }
55
+
56
+ // ─── Execute Wiki Sync ──────────────────────────────────────────────
57
+
58
+ export async function executeWikiSync(
59
+ agentId: string,
60
+ agent: AppConfig["agents"][string],
61
+ baseDir: string,
62
+ mcpRegistry?: Record<string, McpServerConfig>,
63
+ claudeAccounts?: Record<string, string>,
64
+ globalDefaults?: { skills?: string[]; mcps?: string[]; prompts?: string[]; promptTrigger?: string },
65
+ triggeredBy: string = "manual",
66
+ ): Promise<WikiSyncResult> {
67
+ const memoryDir = resolve(baseDir, agent.memoryDir.replace(/^~/, process.env.HOME || ""));
68
+
69
+ const prompt = buildWikiSyncPrompt(memoryDir);
70
+
71
+ const syntheticMsg: InboundMessage = {
72
+ id: `wiki-sync-${agentId}-${Date.now()}`,
73
+ channel: "wiki-sync",
74
+ chatId: `wiki-sync-${agentId}`,
75
+ chatType: "group",
76
+ sender: "wiki-sync-runner",
77
+ senderName: "WikiSync",
78
+ text: prompt,
79
+ timestamp: Date.now(),
80
+ isFromMe: false,
81
+ isGroup: true,
82
+ raw: { type: "wiki-sync", agentId },
83
+ };
84
+
85
+ const route: ResolvedRoute = {
86
+ agentId,
87
+ agentConfig: agent,
88
+ route: agent.routes[0],
89
+ };
90
+
91
+ const startTime = Date.now();
92
+ const triggeredAt = new Date(startTime).toISOString();
93
+ let status: WikiSyncResult["status"] = "success";
94
+ let summary = "";
95
+
96
+ try {
97
+ const response = await executeAgent(route, syntheticMsg, baseDir, mcpRegistry, claudeAccounts, globalDefaults);
98
+ summary = response;
99
+ } catch (err) {
100
+ status = "error";
101
+ summary = String(err);
102
+ log.error(`Wiki sync failed for ${agentId}: ${err}`);
103
+ }
104
+
105
+ const endTime = Date.now();
106
+ const result: WikiSyncResult = {
107
+ id: `ws-${agentId}-${startTime}`,
108
+ agentId,
109
+ triggeredBy,
110
+ triggeredAt,
111
+ completedAt: new Date(endTime).toISOString(),
112
+ durationMs: endTime - startTime,
113
+ summary,
114
+ status,
115
+ };
116
+
117
+ // Persist result
118
+ saveWikiSyncResult(agent, baseDir, result);
119
+
120
+ log.info(`Wiki sync completed: ${agentId} (${result.durationMs}ms, ${status})`);
121
+ return result;
122
+ }
123
+
124
+ // ─── Persistence ────────────────────────────────────────────────────
125
+
126
+ function saveWikiSyncResult(agent: AppConfig["agents"][string], baseDir: string, result: WikiSyncResult): void {
127
+ const agentHome = agent.agentHome || resolve(baseDir, agent.memoryDir, "..");
128
+ const dir = join(agentHome.replace(/^~/, process.env.HOME || ""), "wiki-sync");
129
+ if (!existsSync(dir)) mkdirSync(dir, { recursive: true });
130
+
131
+ const today = new Date().toISOString().split("T")[0];
132
+ const logFile = join(dir, `log-${today}.jsonl`);
133
+ appendFileSync(logFile, JSON.stringify(result) + "\n");
134
+ }
135
+
136
+ export function getWikiSyncHistory(agentHome: string, limit: number = 20): WikiSyncResult[] {
137
+ const dir = join(agentHome.replace(/^~/, process.env.HOME || ""), "wiki-sync");
138
+ if (!existsSync(dir)) return [];
139
+
140
+ const results: WikiSyncResult[] = [];
141
+ try {
142
+ const files = require("fs").readdirSync(dir)
143
+ .filter((f: string) => f.startsWith("log-") && f.endsWith(".jsonl"))
144
+ .sort()
145
+ .reverse();
146
+
147
+ for (const file of files) {
148
+ const lines = readFileSync(join(dir, file), "utf-8").split("\n").filter(Boolean);
149
+ for (const line of lines.reverse()) {
150
+ try { results.push(JSON.parse(line)); } catch { /* skip */ }
151
+ if (results.length >= limit) return results;
152
+ }
153
+ }
154
+ } catch { /* ignore */ }
155
+ return results;
156
+ }
157
+
158
+ // ─── Startup / Shutdown ─────────────────────────────────────────────
159
+
160
+ export function startWikiSync(
161
+ config: AppConfig,
162
+ baseDir: string,
163
+ mcpRegistry?: Record<string, McpServerConfig>,
164
+ ): void {
165
+ for (const [agentId, agent] of Object.entries(config.agents)) {
166
+ if (!agent.wiki || !agent.wikiSync?.enabled) continue;
167
+
168
+ const schedule = agent.wikiSync.schedule;
169
+ if (!cron.validate(schedule)) {
170
+ log.warn(`Invalid wikiSync cron for ${agentId}: "${schedule}"`);
171
+ continue;
172
+ }
173
+
174
+ const task = cron.schedule(schedule, async () => {
175
+ log.info(`Wiki sync triggered: ${agentId}`);
176
+ try {
177
+ await executeWikiSync(
178
+ agentId, agent, baseDir,
179
+ mcpRegistry,
180
+ config.service?.claudeAccounts,
181
+ { skills: config.defaultSkills, mcps: config.defaultMcps, prompts: config.defaultPrompts, promptTrigger: config.promptTrigger },
182
+ "cron",
183
+ );
184
+ } catch (err) {
185
+ log.error(`Wiki sync cron error for ${agentId}: ${err}`);
186
+ }
187
+ });
188
+
189
+ scheduledTasks.push(task);
190
+ log.info(`Wiki sync scheduled: ${agentId} → "${schedule}"`);
191
+ }
192
+ }
193
+
194
+ export function stopWikiSync(): void {
195
+ for (const task of scheduledTasks) {
196
+ task.stop();
197
+ }
198
+ scheduledTasks.length = 0;
199
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "Node16",
5
+ "moduleResolution": "Node16",
6
+ "outDir": "dist",
7
+ "rootDir": "src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "resolveJsonModule": true,
13
+ "declaration": true,
14
+ "declarationMap": true,
15
+ "sourceMap": true
16
+ },
17
+ "include": ["src/**/*"],
18
+ "exclude": ["node_modules", "dist"]
19
+ }