@fortressllm/sybil 0.0.3

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 (288) hide show
  1. package/.env copy +91 -0
  2. package/.env.example +139 -0
  3. package/BROWSER_CONTROL.md +354 -0
  4. package/CLI_CHAT_FEATURE.md +224 -0
  5. package/CLI_GUIDE.md +359 -0
  6. package/DYNAMIC_SKILLS.md +345 -0
  7. package/DockerFile.sandbox +14 -0
  8. package/PROGRESS.md +249 -0
  9. package/README.md +281 -0
  10. package/RENAME_LOG.md +62 -0
  11. package/SIMPLIFIED_TELEGRAM_UX.md +273 -0
  12. package/SYBIL_SUMMARY.md +360 -0
  13. package/TASK11_NETWORK.md +202 -0
  14. package/TASK14_CLI.md +432 -0
  15. package/TASK8_SAFETY.md +317 -0
  16. package/TASK9_COMPLETION.md +186 -0
  17. package/TASK9_SUMMARY.md +201 -0
  18. package/TELEGRAM_OTP_AUTH.md +359 -0
  19. package/VECTOR_MEMORY.md +163 -0
  20. package/assets/logo.png +0 -0
  21. package/cypfq_code_search.md +287 -0
  22. package/cypfq_driver_search.md +297 -0
  23. package/cypfq_github_search.md +297 -0
  24. package/cypfq_repo_search.md +370 -0
  25. package/dist/agents/autonomous-agent.d.ts +61 -0
  26. package/dist/agents/autonomous-agent.d.ts.map +1 -0
  27. package/dist/agents/autonomous-agent.js +536 -0
  28. package/dist/agents/autonomous-agent.js.map +1 -0
  29. package/dist/agents/network.d.ts +1006 -0
  30. package/dist/agents/network.d.ts.map +1 -0
  31. package/dist/agents/network.js +1266 -0
  32. package/dist/agents/network.js.map +1 -0
  33. package/dist/cli/commands/backup.d.ts +3 -0
  34. package/dist/cli/commands/backup.d.ts.map +1 -0
  35. package/dist/cli/commands/backup.js +63 -0
  36. package/dist/cli/commands/backup.js.map +1 -0
  37. package/dist/cli/commands/config.d.ts +3 -0
  38. package/dist/cli/commands/config.d.ts.map +1 -0
  39. package/dist/cli/commands/config.js +163 -0
  40. package/dist/cli/commands/config.js.map +1 -0
  41. package/dist/cli/commands/doctor.d.ts +3 -0
  42. package/dist/cli/commands/doctor.d.ts.map +1 -0
  43. package/dist/cli/commands/doctor.js +107 -0
  44. package/dist/cli/commands/doctor.js.map +1 -0
  45. package/dist/cli/commands/init.d.ts +3 -0
  46. package/dist/cli/commands/init.d.ts.map +1 -0
  47. package/dist/cli/commands/init.js +138 -0
  48. package/dist/cli/commands/init.js.map +1 -0
  49. package/dist/cli/commands/logs.d.ts +3 -0
  50. package/dist/cli/commands/logs.d.ts.map +1 -0
  51. package/dist/cli/commands/logs.js +81 -0
  52. package/dist/cli/commands/logs.js.map +1 -0
  53. package/dist/cli/commands/otp.d.ts +3 -0
  54. package/dist/cli/commands/otp.d.ts.map +1 -0
  55. package/dist/cli/commands/otp.js +142 -0
  56. package/dist/cli/commands/otp.js.map +1 -0
  57. package/dist/cli/commands/restore.d.ts +3 -0
  58. package/dist/cli/commands/restore.d.ts.map +1 -0
  59. package/dist/cli/commands/restore.js +99 -0
  60. package/dist/cli/commands/restore.js.map +1 -0
  61. package/dist/cli/commands/start.d.ts +3 -0
  62. package/dist/cli/commands/start.d.ts.map +1 -0
  63. package/dist/cli/commands/start.js +65 -0
  64. package/dist/cli/commands/start.js.map +1 -0
  65. package/dist/cli/commands/status.d.ts +3 -0
  66. package/dist/cli/commands/status.d.ts.map +1 -0
  67. package/dist/cli/commands/status.js +68 -0
  68. package/dist/cli/commands/status.js.map +1 -0
  69. package/dist/cli/commands/stop.d.ts +3 -0
  70. package/dist/cli/commands/stop.d.ts.map +1 -0
  71. package/dist/cli/commands/stop.js +62 -0
  72. package/dist/cli/commands/stop.js.map +1 -0
  73. package/dist/cli/commands/update.d.ts +3 -0
  74. package/dist/cli/commands/update.d.ts.map +1 -0
  75. package/dist/cli/commands/update.js +49 -0
  76. package/dist/cli/commands/update.js.map +1 -0
  77. package/dist/cli/commands/whatsapp.d.ts +3 -0
  78. package/dist/cli/commands/whatsapp.d.ts.map +1 -0
  79. package/dist/cli/commands/whatsapp.js +281 -0
  80. package/dist/cli/commands/whatsapp.js.map +1 -0
  81. package/dist/cli/index.d.ts +7 -0
  82. package/dist/cli/index.d.ts.map +1 -0
  83. package/dist/cli/index.js +58 -0
  84. package/dist/cli/index.js.map +1 -0
  85. package/dist/cli.d.ts +9 -0
  86. package/dist/cli.d.ts.map +1 -0
  87. package/dist/cli.js +750 -0
  88. package/dist/cli.js.map +1 -0
  89. package/dist/index.d.ts +2 -0
  90. package/dist/index.d.ts.map +1 -0
  91. package/dist/index.js +109 -0
  92. package/dist/index.js.map +1 -0
  93. package/dist/mastra/index.d.ts +4 -0
  94. package/dist/mastra/index.d.ts.map +1 -0
  95. package/dist/mastra/index.js +37 -0
  96. package/dist/mastra/index.js.map +1 -0
  97. package/dist/mastra/memory.d.ts +9 -0
  98. package/dist/mastra/memory.d.ts.map +1 -0
  99. package/dist/mastra/memory.js +92 -0
  100. package/dist/mastra/memory.js.map +1 -0
  101. package/dist/processors/index.d.ts +74 -0
  102. package/dist/processors/index.d.ts.map +1 -0
  103. package/dist/processors/index.js +153 -0
  104. package/dist/processors/index.js.map +1 -0
  105. package/dist/processors/semantic-recall.d.ts +63 -0
  106. package/dist/processors/semantic-recall.d.ts.map +1 -0
  107. package/dist/processors/semantic-recall.js +216 -0
  108. package/dist/processors/semantic-recall.js.map +1 -0
  109. package/dist/processors/tool-search.d.ts +26 -0
  110. package/dist/processors/tool-search.d.ts.map +1 -0
  111. package/dist/processors/tool-search.js +41 -0
  112. package/dist/processors/tool-search.js.map +1 -0
  113. package/dist/skills/dynamic/skill-generator.d.ts +169 -0
  114. package/dist/skills/dynamic/skill-generator.d.ts.map +1 -0
  115. package/dist/skills/dynamic/skill-generator.js +488 -0
  116. package/dist/skills/dynamic/skill-generator.js.map +1 -0
  117. package/dist/tools/agent-delegation-tools.d.ts +142 -0
  118. package/dist/tools/agent-delegation-tools.d.ts.map +1 -0
  119. package/dist/tools/agent-delegation-tools.js +263 -0
  120. package/dist/tools/agent-delegation-tools.js.map +1 -0
  121. package/dist/tools/browser-tools.d.ts +374 -0
  122. package/dist/tools/browser-tools.d.ts.map +1 -0
  123. package/dist/tools/browser-tools.js +752 -0
  124. package/dist/tools/browser-tools.js.map +1 -0
  125. package/dist/tools/dynamic/registry.d.ts +61 -0
  126. package/dist/tools/dynamic/registry.d.ts.map +1 -0
  127. package/dist/tools/dynamic/registry.js +121 -0
  128. package/dist/tools/dynamic/registry.js.map +1 -0
  129. package/dist/tools/dynamic/tool-generator.d.ts +99 -0
  130. package/dist/tools/dynamic/tool-generator.d.ts.map +1 -0
  131. package/dist/tools/dynamic/tool-generator.js +367 -0
  132. package/dist/tools/dynamic/tool-generator.js.map +1 -0
  133. package/dist/tools/extended-tools.d.ts +176 -0
  134. package/dist/tools/extended-tools.d.ts.map +1 -0
  135. package/dist/tools/extended-tools.js +464 -0
  136. package/dist/tools/extended-tools.js.map +1 -0
  137. package/dist/tools/library/calendar/index.d.ts +134 -0
  138. package/dist/tools/library/calendar/index.d.ts.map +1 -0
  139. package/dist/tools/library/calendar/index.js +160 -0
  140. package/dist/tools/library/calendar/index.js.map +1 -0
  141. package/dist/tools/podman-workspace-mcp-cli.d.ts +3 -0
  142. package/dist/tools/podman-workspace-mcp-cli.d.ts.map +1 -0
  143. package/dist/tools/podman-workspace-mcp-cli.js +12 -0
  144. package/dist/tools/podman-workspace-mcp-cli.js.map +1 -0
  145. package/dist/tools/podman-workspace-mcp.d.ts +247 -0
  146. package/dist/tools/podman-workspace-mcp.d.ts.map +1 -0
  147. package/dist/tools/podman-workspace-mcp.js +1093 -0
  148. package/dist/tools/podman-workspace-mcp.js.map +1 -0
  149. package/dist/tools/podman-workspace.d.ts +148 -0
  150. package/dist/tools/podman-workspace.d.ts.map +1 -0
  151. package/dist/tools/podman-workspace.js +682 -0
  152. package/dist/tools/podman-workspace.js.map +1 -0
  153. package/dist/tools/telegram-file-tools.d.ts +78 -0
  154. package/dist/tools/telegram-file-tools.d.ts.map +1 -0
  155. package/dist/tools/telegram-file-tools.js +294 -0
  156. package/dist/tools/telegram-file-tools.js.map +1 -0
  157. package/dist/tools/tool-registry.d.ts +467 -0
  158. package/dist/tools/tool-registry.d.ts.map +1 -0
  159. package/dist/tools/tool-registry.js +156 -0
  160. package/dist/tools/tool-registry.js.map +1 -0
  161. package/dist/tools/web-tools.d.ts +77 -0
  162. package/dist/tools/web-tools.d.ts.map +1 -0
  163. package/dist/tools/web-tools.js +416 -0
  164. package/dist/tools/web-tools.js.map +1 -0
  165. package/dist/tools/whatsapp-autoreply-tools.d.ts +118 -0
  166. package/dist/tools/whatsapp-autoreply-tools.d.ts.map +1 -0
  167. package/dist/tools/whatsapp-autoreply-tools.js +503 -0
  168. package/dist/tools/whatsapp-autoreply-tools.js.map +1 -0
  169. package/dist/tools/whatsapp-tools.d.ts +175 -0
  170. package/dist/tools/whatsapp-tools.d.ts.map +1 -0
  171. package/dist/tools/whatsapp-tools.js +566 -0
  172. package/dist/tools/whatsapp-tools.js.map +1 -0
  173. package/dist/utils/logger.d.ts +65 -0
  174. package/dist/utils/logger.d.ts.map +1 -0
  175. package/dist/utils/logger.js +307 -0
  176. package/dist/utils/logger.js.map +1 -0
  177. package/dist/utils/model-config.d.ts +73 -0
  178. package/dist/utils/model-config.d.ts.map +1 -0
  179. package/dist/utils/model-config.js +366 -0
  180. package/dist/utils/model-config.js.map +1 -0
  181. package/dist/utils/semantic-memory.d.ts +82 -0
  182. package/dist/utils/semantic-memory.d.ts.map +1 -0
  183. package/dist/utils/semantic-memory.js +189 -0
  184. package/dist/utils/semantic-memory.js.map +1 -0
  185. package/dist/utils/system.d.ts +2 -0
  186. package/dist/utils/system.d.ts.map +1 -0
  187. package/dist/utils/system.js +24 -0
  188. package/dist/utils/system.js.map +1 -0
  189. package/dist/utils/telegram-auth.d.ts +54 -0
  190. package/dist/utils/telegram-auth.d.ts.map +1 -0
  191. package/dist/utils/telegram-auth.js +146 -0
  192. package/dist/utils/telegram-auth.js.map +1 -0
  193. package/dist/utils/telegram.d.ts +7 -0
  194. package/dist/utils/telegram.d.ts.map +1 -0
  195. package/dist/utils/telegram.js +1494 -0
  196. package/dist/utils/telegram.js.map +1 -0
  197. package/dist/utils/whatsapp-client.d.ts +166 -0
  198. package/dist/utils/whatsapp-client.d.ts.map +1 -0
  199. package/dist/utils/whatsapp-client.js +722 -0
  200. package/dist/utils/whatsapp-client.js.map +1 -0
  201. package/dist/workflows/planner-workflow.d.ts +39 -0
  202. package/dist/workflows/planner-workflow.d.ts.map +1 -0
  203. package/dist/workflows/planner-workflow.js +165 -0
  204. package/dist/workflows/planner-workflow.js.map +1 -0
  205. package/dist/workflows/skill-builder-workflow.d.ts +16 -0
  206. package/dist/workflows/skill-builder-workflow.d.ts.map +1 -0
  207. package/dist/workflows/skill-builder-workflow.js +157 -0
  208. package/dist/workflows/skill-builder-workflow.js.map +1 -0
  209. package/dist/workspace/index.d.ts +23 -0
  210. package/dist/workspace/index.d.ts.map +1 -0
  211. package/dist/workspace/index.js +64 -0
  212. package/dist/workspace/index.js.map +1 -0
  213. package/docs/README.md +140 -0
  214. package/docs/api/agents.md +481 -0
  215. package/docs/api/browser-tools.md +469 -0
  216. package/docs/api/memory.md +629 -0
  217. package/docs/architecture/agent-networks.md +586 -0
  218. package/docs/architecture/memory.md +579 -0
  219. package/docs/architecture/overview.md +436 -0
  220. package/docs/architecture/tools.md +637 -0
  221. package/docs/cli-tui.md +367 -0
  222. package/docs/guides/environment-variables.md +502 -0
  223. package/docs/guides/troubleshooting.md +882 -0
  224. package/docs/tutorials/agent-networks.md +432 -0
  225. package/docs/tutorials/dynamic-tools.md +469 -0
  226. package/docs/tutorials/getting-started.md +263 -0
  227. package/docs/tutorials/skills.md +561 -0
  228. package/docs/tutorials/web-browsing.md +329 -0
  229. package/mastra.db-shm +0 -0
  230. package/mastra.db-wal +0 -0
  231. package/package.json +71 -0
  232. package/plan.md +601 -0
  233. package/skills/code-review/SKILL.md +48 -0
  234. package/skills/task-planning/SKILL.md +55 -0
  235. package/skills/web-research/SKILL.md +79 -0
  236. package/skills/whatsapp-management/SKILL.md +78 -0
  237. package/src/agents/autonomous-agent.ts +626 -0
  238. package/src/agents/network.ts +1307 -0
  239. package/src/cli/commands/backup.ts +78 -0
  240. package/src/cli/commands/config.ts +176 -0
  241. package/src/cli/commands/doctor.ts +111 -0
  242. package/src/cli/commands/init.ts +150 -0
  243. package/src/cli/commands/logs.ts +94 -0
  244. package/src/cli/commands/otp.ts +162 -0
  245. package/src/cli/commands/restore.ts +118 -0
  246. package/src/cli/commands/start.ts +76 -0
  247. package/src/cli/commands/status.ts +81 -0
  248. package/src/cli/commands/stop.ts +68 -0
  249. package/src/cli/commands/update.ts +61 -0
  250. package/src/cli/commands/whatsapp.ts +322 -0
  251. package/src/cli/index.ts +69 -0
  252. package/src/cli.ts +830 -0
  253. package/src/index.ts +124 -0
  254. package/src/mastra/index.ts +49 -0
  255. package/src/mastra/memory.ts +99 -0
  256. package/src/mastra/public/workspace/plan.md +115 -0
  257. package/src/mastra/public/workspace/research/react-tailwind/skill.md +47 -0
  258. package/src/processors/index.ts +170 -0
  259. package/src/processors/semantic-recall.ts +277 -0
  260. package/src/processors/tool-search.ts +46 -0
  261. package/src/skills/dynamic/skill-generator.ts +568 -0
  262. package/src/tools/agent-delegation-tools.ts +301 -0
  263. package/src/tools/browser-tools.ts +792 -0
  264. package/src/tools/dynamic/registry.ts +144 -0
  265. package/src/tools/dynamic/tool-generator.ts +406 -0
  266. package/src/tools/extended-tools.ts +498 -0
  267. package/src/tools/library/calendar/index.ts +172 -0
  268. package/src/tools/podman-workspace-mcp-cli.ts +14 -0
  269. package/src/tools/podman-workspace-mcp.ts +1290 -0
  270. package/src/tools/podman-workspace.ts +858 -0
  271. package/src/tools/telegram-file-tools.ts +320 -0
  272. package/src/tools/tool-registry.ts +233 -0
  273. package/src/tools/web-tools.ts +461 -0
  274. package/src/tools/whatsapp-autoreply-tools.ts +616 -0
  275. package/src/tools/whatsapp-tools.ts +602 -0
  276. package/src/utils/logger.ts +368 -0
  277. package/src/utils/model-config.ts +437 -0
  278. package/src/utils/semantic-memory.ts +230 -0
  279. package/src/utils/system.ts +25 -0
  280. package/src/utils/telegram-auth.ts +201 -0
  281. package/src/utils/telegram.ts +1847 -0
  282. package/src/utils/whatsapp-client.ts +808 -0
  283. package/src/workflows/planner-workflow.ts +178 -0
  284. package/src/workflows/skill-builder-workflow.ts +175 -0
  285. package/src/workspace/index.ts +69 -0
  286. package/tsconfig.json +22 -0
  287. package/view-logs.sh +116 -0
  288. package/whatsapp-session.sh +197 -0
@@ -0,0 +1,162 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import inquirer from "inquirer";
5
+ import {
6
+ generateOTP,
7
+ storeOTP,
8
+ getPendingOTPs,
9
+ getAuthenticatedUsers,
10
+ cleanupExpiredOTPs,
11
+ revokeAuthentication
12
+ } from "../../utils/telegram-auth.js";
13
+
14
+ export const otpCommand = new Command("otp")
15
+ .description("Manage Telegram user authentication with OTP")
16
+ .option("-g, --generate", "Generate a new OTP for user authentication")
17
+ .option("-l, --list", "List pending OTPs and authenticated users")
18
+ .option("-r, --revoke <chatId>", "Revoke authentication for a user")
19
+ .option("-c, --cleanup", "Clean up expired OTPs")
20
+ .action(async (options) => {
21
+ console.log(chalk.cyan("\nšŸ” Telegram OTP Authentication\n"));
22
+
23
+ if (options.cleanup) {
24
+ const spinner = ora("Cleaning up expired OTPs...").start();
25
+ cleanupExpiredOTPs();
26
+ spinner.succeed("āœ… Expired OTPs cleaned up");
27
+ return;
28
+ }
29
+
30
+ if (options.revoke) {
31
+ const chatId = parseInt(options.revoke);
32
+ if (isNaN(chatId)) {
33
+ console.log(chalk.red("āŒ Invalid chat ID"));
34
+ process.exit(1);
35
+ }
36
+
37
+ const { confirm } = await inquirer.prompt([
38
+ {
39
+ type: "confirm",
40
+ name: "confirm",
41
+ message: `Are you sure you want to revoke access for chat ${chatId}?`,
42
+ default: false,
43
+ },
44
+ ]);
45
+
46
+ if (confirm) {
47
+ revokeAuthentication(chatId);
48
+ console.log(chalk.green(`āœ… Authentication revoked for chat ${chatId}`));
49
+ } else {
50
+ console.log(chalk.gray("Cancelled"));
51
+ }
52
+ return;
53
+ }
54
+
55
+ if (options.list) {
56
+ const pending = getPendingOTPs();
57
+ const users = getAuthenticatedUsers();
58
+
59
+ console.log(chalk.bold("\nšŸ“‹ Pending OTPs:"));
60
+ if (pending.length === 0) {
61
+ console.log(chalk.gray(" No pending OTPs"));
62
+ } else {
63
+ pending.forEach((otp) => {
64
+ const expiresIn = Math.floor((new Date(otp.expiresAt).getTime() - Date.now()) / 60000);
65
+ console.log(` šŸ”‘ Code: ${chalk.yellow(otp.code)} | Expires in: ${chalk.cyan(expiresIn + " min")}`);
66
+ });
67
+ }
68
+
69
+ console.log(chalk.bold("\nšŸ‘„ Authenticated Users:"));
70
+ if (users.length === 0) {
71
+ console.log(chalk.gray(" No authenticated users"));
72
+ } else {
73
+ users.forEach((user) => {
74
+ const date = new Date(user.authenticatedAt).toLocaleString();
75
+ console.log(` āœ… Chat ID: ${chalk.green(user.chatId)} | Since: ${chalk.gray(date)}`);
76
+ });
77
+ }
78
+
79
+ console.log(chalk.gray("\nšŸ’” Use 'sybil otp --generate' to create a new OTP"));
80
+ return;
81
+ }
82
+
83
+ // Default: generate new OTP
84
+ if (options.generate || (!options.list && !options.revoke && !options.cleanup)) {
85
+ console.log(chalk.cyan("šŸ“± Generate Authentication OTP\n"));
86
+
87
+ const { action } = await inquirer.prompt([
88
+ {
89
+ type: "list",
90
+ name: "action",
91
+ message: "What would you like to do?",
92
+ choices: [
93
+ { name: "šŸ†• Generate new OTP", value: "generate" },
94
+ { name: "šŸ“‹ Show pending OTPs", value: "show" },
95
+ { name: "šŸ‘„ List authenticated users", value: "users" },
96
+ ],
97
+ default: "generate",
98
+ },
99
+ ]);
100
+
101
+ if (action === "show") {
102
+ const pending = getPendingOTPs();
103
+ console.log(chalk.bold("\nPending OTPs:"));
104
+ if (pending.length === 0) {
105
+ console.log(chalk.gray(" No pending OTPs"));
106
+ } else {
107
+ pending.forEach((otp) => {
108
+ const expiresIn = Math.floor((new Date(otp.expiresAt).getTime() - Date.now()) / 60000);
109
+ console.log(` šŸ”‘ ${chalk.yellow(otp.code)} (expires in ${expiresIn} min)`);
110
+ });
111
+ }
112
+ return;
113
+ }
114
+
115
+ if (action === "users") {
116
+ const users = getAuthenticatedUsers();
117
+ console.log(chalk.bold("\nAuthenticated Users:"));
118
+ if (users.length === 0) {
119
+ console.log(chalk.gray(" No authenticated users"));
120
+ } else {
121
+ users.forEach((user) => {
122
+ const date = new Date(user.authenticatedAt).toLocaleString();
123
+ console.log(` āœ… ${chalk.green(user.chatId)} - ${date}`);
124
+ });
125
+ }
126
+ return;
127
+ }
128
+
129
+ // Generate OTP
130
+ const { chatId } = await inquirer.prompt([
131
+ {
132
+ type: "input",
133
+ name: "chatId",
134
+ message: "Enter the user's Telegram Chat ID:",
135
+ default: "pending",
136
+ },
137
+ ]);
138
+
139
+ const otp = generateOTP();
140
+ const chatIdNum = chatId === "pending" ? 0 : parseInt(chatId);
141
+
142
+ if (chatId == "pending" && isNaN(chatIdNum)) {
143
+ console.log(chalk.red("āŒ Invalid chat ID"));
144
+ process.exit(1);
145
+ }
146
+
147
+ storeOTP(chatIdNum, otp);
148
+
149
+ console.log(chalk.green("\nāœ… OTP Generated!\n"));
150
+ console.log(chalk.bold("šŸ“± Share this code with the user:"));
151
+ console.log(chalk.yellow(`\n šŸ”‘ ${otp}\n`));
152
+ console.log(chalk.gray("ā° Valid for: 10 minutes"));
153
+ console.log(chalk.gray("šŸ“‹ Instructions for user:"));
154
+ console.log(chalk.white(" 1. Send the code to the bot"));
155
+ console.log(chalk.white(" 2. They will be authenticated automatically"));
156
+ console.log(chalk.white(" 3. This is a one-time setup\n"));
157
+
158
+ if (chatId === "pending") {
159
+ console.log(chalk.cyan("šŸ’” Note: You set this as 'pending' - the first user who sends this code will be authenticated."));
160
+ }
161
+ }
162
+ });
@@ -0,0 +1,118 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { existsSync, copyFileSync, readFileSync } from "fs";
5
+ import { join } from "path";
6
+ import { homedir } from "os";
7
+ import inquirer from "inquirer";
8
+
9
+ export const restoreCommand = new Command("restore")
10
+ .description("Restore Sybil from a backup")
11
+ .argument("[backup-name]", "Name of the backup to restore")
12
+ .option("-l, --list", "List available backups")
13
+ .action(async (backupName, options) => {
14
+ const backupDir = join(homedir(), ".sybil", "backups");
15
+
16
+ if (options.list) {
17
+ // List available backups
18
+ console.log(chalk.cyan("\nšŸ“¦ Available Backups:\n"));
19
+
20
+ if (!existsSync(backupDir)) {
21
+ console.log(chalk.yellow("No backups found."));
22
+ return;
23
+ }
24
+
25
+ const { readdirSync } = await import("fs");
26
+ const backups = readdirSync(backupDir, { withFileTypes: true })
27
+ .filter((dirent) => dirent.isDirectory())
28
+ .map((dirent) => dirent.name);
29
+
30
+ if (backups.length === 0) {
31
+ console.log(chalk.yellow("No backups found."));
32
+ return;
33
+ }
34
+
35
+ for (const backup of backups) {
36
+ const metadataPath = join(backupDir, backup, "metadata.json");
37
+ if (existsSync(metadataPath)) {
38
+ const metadata = JSON.parse(readFileSync(metadataPath, "utf-8"));
39
+ console.log(` šŸ“ ${chalk.bold(backup)}`);
40
+ console.log(` Created: ${new Date(metadata.createdAt).toLocaleString()}`);
41
+ console.log(` Files: ${metadata.filesBackedUp}`);
42
+ console.log("");
43
+ } else {
44
+ console.log(` šŸ“ ${chalk.bold(backup)}`);
45
+ console.log(" (No metadata available)");
46
+ console.log("");
47
+ }
48
+ }
49
+
50
+ return;
51
+ }
52
+
53
+ if (!backupName) {
54
+ console.log(chalk.red("āŒ Please specify a backup name or use --list"));
55
+ console.log(chalk.gray("Usage: sybil restore <backup-name>"));
56
+ process.exit(1);
57
+ }
58
+
59
+ const backupPath = join(backupDir, backupName);
60
+
61
+ if (!existsSync(backupPath)) {
62
+ console.log(chalk.red(`āŒ Backup '${backupName}' not found`));
63
+ console.log(chalk.gray(`Run 'sybil restore --list' to see available backups`));
64
+ process.exit(1);
65
+ }
66
+
67
+ const spinner = ora("Restoring from backup...").start();
68
+
69
+ try {
70
+ // Confirm restore
71
+ spinner.stop();
72
+
73
+ const { confirm } = await inquirer.prompt([
74
+ {
75
+ type: "confirm",
76
+ name: "confirm",
77
+ message: chalk.yellow("āš ļø This will overwrite your current configuration. Continue?"),
78
+ default: false,
79
+ },
80
+ ]);
81
+
82
+ if (!confirm) {
83
+ console.log(chalk.blue("Restore cancelled."));
84
+ return;
85
+ }
86
+
87
+ spinner.start("Restoring files...");
88
+
89
+ // Restore files
90
+ const filesToRestore = [
91
+ { src: join(backupPath, ".env"), dest: join(process.cwd(), ".env") },
92
+ { src: join(backupPath, "settings.json"), dest: join(homedir(), ".sybil", "settings.json") },
93
+ { src: join(backupPath, "mastra.db"), dest: join(process.cwd(), "mastra.db") },
94
+ ];
95
+
96
+ let restored = 0;
97
+
98
+ for (const { src, dest } of filesToRestore) {
99
+ if (existsSync(src)) {
100
+ copyFileSync(src, dest);
101
+ restored++;
102
+ }
103
+ }
104
+
105
+ spinner.succeed(chalk.green("āœ… Restore completed successfully"));
106
+
107
+ console.log(chalk.cyan("\nšŸ“¦ Restore Details:"));
108
+ console.log(` šŸ“ Backup: ${chalk.bold(backupName)}`);
109
+ console.log(` šŸ“„ Files restored: ${restored}`);
110
+
111
+ console.log(chalk.yellow("\nāš ļø Please restart Sybil for changes to take effect"));
112
+
113
+ } catch (error) {
114
+ spinner.fail(chalk.red("āŒ Failed to restore backup"));
115
+ console.error(error);
116
+ process.exit(1);
117
+ }
118
+ });
@@ -0,0 +1,76 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { spawn } from "child_process";
5
+ import { existsSync } from "fs";
6
+ import { join } from "path";
7
+
8
+ export const startCommand = new Command("start")
9
+ .description("Start the Sybil agent service")
10
+ .option("-d, --daemon", "Run as background daemon")
11
+ .option("-p, --port <port>", "Port for web interface", "3000")
12
+ .action(async (options) => {
13
+ const spinner = ora("Starting Sybil...").start();
14
+
15
+ try {
16
+ // Check if .env exists
17
+ if (!existsSync(join(process.cwd(), ".env"))) {
18
+ spinner.fail(chalk.red("āŒ Sybil not initialized. Run 'sybil init' first."));
19
+ process.exit(1);
20
+ }
21
+
22
+ // Check if already running
23
+ const checkProcess = spawn("pgrep", ["-f", "sybil"]);
24
+ let isRunning = false;
25
+
26
+ checkProcess.stdout.on("data", () => {
27
+ isRunning = true;
28
+ });
29
+
30
+ await new Promise((resolve) => checkProcess.on("close", resolve));
31
+
32
+ if (isRunning) {
33
+ spinner.warn(chalk.yellow("āš ļø Sybil is already running"));
34
+ console.log(chalk.blue("Use 'sybil status' to check details"));
35
+ return;
36
+ }
37
+
38
+ spinner.stop();
39
+
40
+ if (options.daemon) {
41
+ // Start as daemon using PM2 or nohup
42
+ console.log(chalk.cyan("šŸš€ Starting Sybil as daemon...\n"));
43
+
44
+ const child = spawn("nohup", ["npm", "run", "start"], {
45
+ detached: true,
46
+ stdio: "ignore",
47
+ env: { ...process.env, PORT: options.port },
48
+ });
49
+
50
+ child.unref();
51
+
52
+ console.log(chalk.green("āœ… Sybil started in background"));
53
+ console.log(chalk.white(`šŸ“Š Web interface: http://localhost:${options.port}`));
54
+ console.log(chalk.gray("\nTo stop: sybil stop"));
55
+ } else {
56
+ // Start in foreground
57
+ console.log(chalk.cyan("šŸš€ Starting Sybil...\n"));
58
+ console.log(chalk.gray("Press Ctrl+C to stop\n"));
59
+
60
+ const child = spawn("npm", ["run", "start"], {
61
+ stdio: "inherit",
62
+ env: { ...process.env, PORT: options.port },
63
+ });
64
+
65
+ child.on("error", (error) => {
66
+ console.error(chalk.red("Failed to start:"), error.message);
67
+ process.exit(1);
68
+ });
69
+ }
70
+
71
+ } catch (error) {
72
+ spinner.fail(chalk.red("Failed to start Sybil"));
73
+ console.error(error);
74
+ process.exit(1);
75
+ }
76
+ });
@@ -0,0 +1,81 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { spawn } from "child_process";
5
+ import { existsSync, readFileSync } from "fs";
6
+ import { join } from "path";
7
+ import { homedir } from "os";
8
+
9
+ export const statusCommand = new Command("status")
10
+ .description("Check Sybil agent status and health")
11
+ .action(async () => {
12
+ const spinner = ora("Checking status...").start();
13
+
14
+ try {
15
+ console.log(chalk.cyan("\nšŸ“Š Sybil Status Report\n"));
16
+
17
+ // Check if initialized
18
+ const envPath = join(process.cwd(), ".env");
19
+ const isInitialized = existsSync(envPath);
20
+
21
+ console.log(chalk.bold("Configuration:"));
22
+ console.log(` ${isInitialized ? chalk.green("āœ…") : chalk.red("āŒ")} Initialized: ${isInitialized ? "Yes" : "No"}`);
23
+
24
+ if (isInitialized) {
25
+ const envContent = readFileSync(envPath, "utf-8");
26
+ const provider = envContent.match(/AI_PROVIDER=(.+)/)?.[1] || "unknown";
27
+ console.log(` šŸ¤– AI Provider: ${chalk.cyan(provider)}`);
28
+ }
29
+
30
+ // Check if running
31
+ const checkProcess = spawn("pgrep", ["-f", "sybil"]);
32
+ let isRunning = false;
33
+ let pid = "";
34
+
35
+ checkProcess.stdout.on("data", (data) => {
36
+ isRunning = true;
37
+ pid = data.toString().trim().split("\n")[0];
38
+ });
39
+
40
+ await new Promise((resolve) => checkProcess.on("close", resolve));
41
+
42
+ console.log(chalk.bold("\nProcess Status:"));
43
+ console.log(` ${isRunning ? chalk.green("🟢") : chalk.red("šŸ”“")} Running: ${isRunning ? "Yes" : "No"}`);
44
+
45
+ if (isRunning && pid) {
46
+ console.log(` šŸ†” PID: ${chalk.gray(pid)}`);
47
+ }
48
+
49
+ // Check data directory
50
+ const dataDir = join(homedir(), ".sybil");
51
+ const hasDataDir = existsSync(dataDir);
52
+
53
+ console.log(chalk.bold("\nData Directory:"));
54
+ console.log(` šŸ“ Location: ${chalk.gray(dataDir)}`);
55
+ console.log(` ${hasDataDir ? chalk.green("āœ…") : chalk.red("āŒ")} Exists: ${hasDataDir ? "Yes" : "No"}`);
56
+
57
+ // Memory usage (if running)
58
+ if (isRunning && pid) {
59
+ try {
60
+ const { execSync } = await import("child_process");
61
+ const memInfo = execSync(`ps -p ${pid} -o %mem=`, { encoding: "utf-8" }).trim();
62
+ console.log(chalk.bold("\nResource Usage:"));
63
+ console.log(` šŸ’¾ Memory: ${chalk.yellow(memInfo + "%")}`);
64
+ } catch {
65
+ // Ignore
66
+ }
67
+ }
68
+
69
+ spinner.stop();
70
+
71
+ console.log(chalk.cyan("\nšŸ’” Quick Commands:"));
72
+ console.log(chalk.gray(" sybil start - Start the agent"));
73
+ console.log(chalk.gray(" sybil stop - Stop the agent"));
74
+ console.log(chalk.gray(" sybil logs - View logs"));
75
+
76
+ } catch (error) {
77
+ spinner.fail(chalk.red("Failed to check status"));
78
+ console.error(error);
79
+ process.exit(1);
80
+ }
81
+ });
@@ -0,0 +1,68 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { execSync, spawn } from "child_process";
5
+
6
+ export const stopCommand = new Command("stop")
7
+ .description("Stop the Sybil agent service")
8
+ .option("-f, --force", "Force stop (kill immediately)")
9
+ .action(async (options) => {
10
+ const spinner = ora("Stopping Sybil...").start();
11
+
12
+ try {
13
+ // Find Sybil processes
14
+ const checkProcess = spawn("pgrep", ["-f", "sybil"]);
15
+ let pids: string[] = [];
16
+
17
+ checkProcess.stdout.on("data", (data) => {
18
+ pids = data.toString().trim().split("\n").filter(Boolean);
19
+ });
20
+
21
+ await new Promise((resolve) => checkProcess.on("close", resolve));
22
+
23
+ if (pids.length === 0) {
24
+ spinner.info(chalk.blue("ā„¹ļø Sybil is not running"));
25
+ return;
26
+ }
27
+
28
+ // Stop processes
29
+ for (const pid of pids) {
30
+ try {
31
+ if (options.force) {
32
+ process.kill(parseInt(pid), "SIGKILL");
33
+ } else {
34
+ process.kill(parseInt(pid), "SIGTERM");
35
+ }
36
+ } catch (error) {
37
+ // Process might already be dead
38
+ }
39
+ }
40
+
41
+ // Wait a moment and verify
42
+ await new Promise((resolve) => setTimeout(resolve, 1000));
43
+
44
+ const verifyProcess = spawn("pgrep", ["-f", "sybil"]);
45
+ let stillRunning = false;
46
+
47
+ verifyProcess.stdout.on("data", () => {
48
+ stillRunning = true;
49
+ });
50
+
51
+ await new Promise((resolve) => verifyProcess.on("close", resolve));
52
+
53
+ if (stillRunning && options.force) {
54
+ spinner.fail(chalk.red("āŒ Some processes could not be stopped"));
55
+ console.log(chalk.yellow("Try: kill -9 <pid>"));
56
+ } else if (stillRunning) {
57
+ spinner.warn(chalk.yellow("āš ļø Some processes still running"));
58
+ console.log(chalk.gray("Use --force to kill immediately"));
59
+ } else {
60
+ spinner.succeed(chalk.green("āœ… Sybil stopped successfully"));
61
+ }
62
+
63
+ } catch (error) {
64
+ spinner.fail(chalk.red("Failed to stop Sybil"));
65
+ console.error(error);
66
+ process.exit(1);
67
+ }
68
+ });
@@ -0,0 +1,61 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import ora from "ora";
4
+ import { execSync } from "child_process";
5
+
6
+ export const updateCommand = new Command("update")
7
+ .description("Update Sybil to the latest version")
8
+ .option("-c, --check", "Check for updates only")
9
+ .action(async (options) => {
10
+ const spinner = ora("Checking for updates...").start();
11
+
12
+ try {
13
+ // Get current version
14
+ const currentVersion = "1.0.0";
15
+
16
+ // Check latest version from npm (in production)
17
+ // For now, simulate check
18
+ const latestVersion = currentVersion;
19
+
20
+ spinner.stop();
21
+
22
+ if (options.check) {
23
+ if (currentVersion === latestVersion) {
24
+ console.log(chalk.green("āœ… Sybil is up to date (v" + currentVersion + ")"));
25
+ } else {
26
+ console.log(chalk.yellow(`ā¬†ļø Update available: v${currentVersion} → v${latestVersion}`));
27
+ console.log(chalk.gray("Run 'sybil update' to update"));
28
+ }
29
+ return;
30
+ }
31
+
32
+ if (currentVersion === latestVersion) {
33
+ console.log(chalk.green("āœ… Already on the latest version"));
34
+ return;
35
+ }
36
+
37
+ console.log(chalk.cyan(`\nšŸ”„ Updating Sybil from v${currentVersion} to v${latestVersion}...\n`));
38
+
39
+ spinner.start("Downloading update...");
40
+
41
+ // Simulate update process
42
+ await new Promise((resolve) => setTimeout(resolve, 2000));
43
+
44
+ spinner.text = "Installing dependencies...";
45
+ await new Promise((resolve) => setTimeout(resolve, 1500));
46
+
47
+ spinner.succeed(chalk.green("āœ… Update completed successfully"));
48
+
49
+ console.log(chalk.cyan("\nšŸ“‹ What's New in v" + latestVersion + ":"));
50
+ console.log(chalk.white(" • Improved agent coordination"));
51
+ console.log(chalk.white(" • New CLI commands"));
52
+ console.log(chalk.white(" • Bug fixes and performance improvements"));
53
+
54
+ console.log(chalk.yellow("\nāš ļø Please restart Sybil to apply the update"));
55
+
56
+ } catch (error) {
57
+ spinner.fail(chalk.red("āŒ Failed to update"));
58
+ console.error(error);
59
+ process.exit(1);
60
+ }
61
+ });