camelagi 0.5.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 (249) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +224 -0
  3. package/camelagi.mjs +2 -0
  4. package/config.example.yaml +107 -0
  5. package/dist/agent/agent-openai.js +206 -0
  6. package/dist/agent/agent-openai.js.map +1 -0
  7. package/dist/agent/agent-sdk.js +209 -0
  8. package/dist/agent/agent-sdk.js.map +1 -0
  9. package/dist/agent/tool-adapter.js +31 -0
  10. package/dist/agent/tool-adapter.js.map +1 -0
  11. package/dist/agent/types.js +3 -0
  12. package/dist/agent/types.js.map +1 -0
  13. package/dist/agent.js +17 -0
  14. package/dist/agent.js.map +1 -0
  15. package/dist/approval-forward.js +42 -0
  16. package/dist/approval-forward.js.map +1 -0
  17. package/dist/approvals.js +151 -0
  18. package/dist/approvals.js.map +1 -0
  19. package/dist/boot.js +34 -0
  20. package/dist/boot.js.map +1 -0
  21. package/dist/bootstrap.js +451 -0
  22. package/dist/bootstrap.js.map +1 -0
  23. package/dist/camelagi-gateway.mjs +93611 -0
  24. package/dist/camelagi-gateway.mjs.map +7 -0
  25. package/dist/channels/adapter.js +10 -0
  26. package/dist/channels/adapter.js.map +1 -0
  27. package/dist/channels/discord.js +232 -0
  28. package/dist/channels/discord.js.map +1 -0
  29. package/dist/channels/handler.js +349 -0
  30. package/dist/channels/handler.js.map +1 -0
  31. package/dist/channels/index.js +19 -0
  32. package/dist/channels/index.js.map +1 -0
  33. package/dist/channels/registry.js +71 -0
  34. package/dist/channels/registry.js.map +1 -0
  35. package/dist/channels/telegram.js +83 -0
  36. package/dist/channels/telegram.js.map +1 -0
  37. package/dist/channels/types.js +3 -0
  38. package/dist/channels/types.js.map +1 -0
  39. package/dist/chunker.js +102 -0
  40. package/dist/chunker.js.map +1 -0
  41. package/dist/cli/cmd-agents.js +65 -0
  42. package/dist/cli/cmd-agents.js.map +1 -0
  43. package/dist/cli/cmd-bootstrap.js +10 -0
  44. package/dist/cli/cmd-bootstrap.js.map +1 -0
  45. package/dist/cli/cmd-chat.js +32 -0
  46. package/dist/cli/cmd-chat.js.map +1 -0
  47. package/dist/cli/cmd-config.js +88 -0
  48. package/dist/cli/cmd-config.js.map +1 -0
  49. package/dist/cli/cmd-cron.js +120 -0
  50. package/dist/cli/cmd-cron.js.map +1 -0
  51. package/dist/cli/cmd-daemon.js +37 -0
  52. package/dist/cli/cmd-daemon.js.map +1 -0
  53. package/dist/cli/cmd-doctor.js +18 -0
  54. package/dist/cli/cmd-doctor.js.map +1 -0
  55. package/dist/cli/cmd-logs.js +30 -0
  56. package/dist/cli/cmd-logs.js.map +1 -0
  57. package/dist/cli/cmd-pairing.js +41 -0
  58. package/dist/cli/cmd-pairing.js.map +1 -0
  59. package/dist/cli/cmd-reset.js +39 -0
  60. package/dist/cli/cmd-reset.js.map +1 -0
  61. package/dist/cli/cmd-serve.js +30 -0
  62. package/dist/cli/cmd-serve.js.map +1 -0
  63. package/dist/cli/cmd-sessions.js +56 -0
  64. package/dist/cli/cmd-sessions.js.map +1 -0
  65. package/dist/cli/cmd-setup.js +11 -0
  66. package/dist/cli/cmd-setup.js.map +1 -0
  67. package/dist/cli/cmd-soul.js +43 -0
  68. package/dist/cli/cmd-soul.js.map +1 -0
  69. package/dist/cli/parse.js +50 -0
  70. package/dist/cli/parse.js.map +1 -0
  71. package/dist/cli/registry.js +15 -0
  72. package/dist/cli/registry.js.map +1 -0
  73. package/dist/cli.js +103 -0
  74. package/dist/cli.js.map +1 -0
  75. package/dist/compact.js +92 -0
  76. package/dist/compact.js.map +1 -0
  77. package/dist/config.js +153 -0
  78. package/dist/config.js.map +1 -0
  79. package/dist/constants.js +21 -0
  80. package/dist/constants.js.map +1 -0
  81. package/dist/core/config.js +212 -0
  82. package/dist/core/config.js.map +1 -0
  83. package/dist/core/constants.js +21 -0
  84. package/dist/core/constants.js.map +1 -0
  85. package/dist/core/errors.js +5 -0
  86. package/dist/core/errors.js.map +1 -0
  87. package/dist/core/log.js +41 -0
  88. package/dist/core/log.js.map +1 -0
  89. package/dist/core/models.js +123 -0
  90. package/dist/core/models.js.map +1 -0
  91. package/dist/core/types.js +3 -0
  92. package/dist/core/types.js.map +1 -0
  93. package/dist/core/update-check.js +51 -0
  94. package/dist/core/update-check.js.map +1 -0
  95. package/dist/cron.js +81 -0
  96. package/dist/cron.js.map +1 -0
  97. package/dist/daemon.js +109 -0
  98. package/dist/daemon.js.map +1 -0
  99. package/dist/doctor.js +194 -0
  100. package/dist/doctor.js.map +1 -0
  101. package/dist/errors.js +5 -0
  102. package/dist/errors.js.map +1 -0
  103. package/dist/extensions/approval-forward.js +42 -0
  104. package/dist/extensions/approval-forward.js.map +1 -0
  105. package/dist/extensions/approvals.js +144 -0
  106. package/dist/extensions/approvals.js.map +1 -0
  107. package/dist/extensions/cron.js +306 -0
  108. package/dist/extensions/cron.js.map +1 -0
  109. package/dist/extensions/hooks.js +72 -0
  110. package/dist/extensions/hooks.js.map +1 -0
  111. package/dist/extensions/skills.js +97 -0
  112. package/dist/extensions/skills.js.map +1 -0
  113. package/dist/gateway/csrf.js +44 -0
  114. package/dist/gateway/csrf.js.map +1 -0
  115. package/dist/gateway/logger.js +81 -0
  116. package/dist/gateway/logger.js.map +1 -0
  117. package/dist/gateway/rate-limit.js +33 -0
  118. package/dist/gateway/rate-limit.js.map +1 -0
  119. package/dist/gateway/routes.js +315 -0
  120. package/dist/gateway/routes.js.map +1 -0
  121. package/dist/gateway/state.js +54 -0
  122. package/dist/gateway/state.js.map +1 -0
  123. package/dist/gateway/ws-handler.js +200 -0
  124. package/dist/gateway/ws-handler.js.map +1 -0
  125. package/dist/gateway-entry.js +16 -0
  126. package/dist/gateway-entry.js.map +1 -0
  127. package/dist/hooks.js +72 -0
  128. package/dist/hooks.js.map +1 -0
  129. package/dist/lanes.js +62 -0
  130. package/dist/lanes.js.map +1 -0
  131. package/dist/model.js +30 -0
  132. package/dist/model.js.map +1 -0
  133. package/dist/policy.js +22 -0
  134. package/dist/policy.js.map +1 -0
  135. package/dist/queue.js +45 -0
  136. package/dist/queue.js.map +1 -0
  137. package/dist/retry.js +96 -0
  138. package/dist/retry.js.map +1 -0
  139. package/dist/runs.js +83 -0
  140. package/dist/runs.js.map +1 -0
  141. package/dist/runtime/compact.js +99 -0
  142. package/dist/runtime/compact.js.map +1 -0
  143. package/dist/runtime/lanes.js +66 -0
  144. package/dist/runtime/lanes.js.map +1 -0
  145. package/dist/runtime/orchestrate.js +121 -0
  146. package/dist/runtime/orchestrate.js.map +1 -0
  147. package/dist/runtime/queue.js +50 -0
  148. package/dist/runtime/queue.js.map +1 -0
  149. package/dist/runtime/retry.js +127 -0
  150. package/dist/runtime/retry.js.map +1 -0
  151. package/dist/runtime/runs.js +105 -0
  152. package/dist/runtime/runs.js.map +1 -0
  153. package/dist/serve.js +209 -0
  154. package/dist/serve.js.map +1 -0
  155. package/dist/session.js +75 -0
  156. package/dist/session.js.map +1 -0
  157. package/dist/setup.js +254 -0
  158. package/dist/setup.js.map +1 -0
  159. package/dist/skills.js +89 -0
  160. package/dist/skills.js.map +1 -0
  161. package/dist/subagent.js +71 -0
  162. package/dist/subagent.js.map +1 -0
  163. package/dist/system-prompt.js +157 -0
  164. package/dist/system-prompt.js.map +1 -0
  165. package/dist/telegram/admin-bot.js +705 -0
  166. package/dist/telegram/admin-bot.js.map +1 -0
  167. package/dist/telegram/agent-bot.js +551 -0
  168. package/dist/telegram/agent-bot.js.map +1 -0
  169. package/dist/telegram/bot-approval.js +63 -0
  170. package/dist/telegram/bot-approval.js.map +1 -0
  171. package/dist/telegram/draft-stream.js +86 -0
  172. package/dist/telegram/draft-stream.js.map +1 -0
  173. package/dist/telegram/format.js +106 -0
  174. package/dist/telegram/format.js.map +1 -0
  175. package/dist/telegram/helpers.js +87 -0
  176. package/dist/telegram/helpers.js.map +1 -0
  177. package/dist/telegram/pairing-notify.js +52 -0
  178. package/dist/telegram/pairing-notify.js.map +1 -0
  179. package/dist/telegram/pairing.js +138 -0
  180. package/dist/telegram/pairing.js.map +1 -0
  181. package/dist/telegram/resolve.js +33 -0
  182. package/dist/telegram/resolve.js.map +1 -0
  183. package/dist/telegram/transcribe.js +77 -0
  184. package/dist/telegram/transcribe.js.map +1 -0
  185. package/dist/telegram/types.js +3 -0
  186. package/dist/telegram/types.js.map +1 -0
  187. package/dist/telegram/voice-wizard.js +84 -0
  188. package/dist/telegram/voice-wizard.js.map +1 -0
  189. package/dist/telegram/wizard.js +89 -0
  190. package/dist/telegram/wizard.js.map +1 -0
  191. package/dist/telegram/wizards.js +297 -0
  192. package/dist/telegram/wizards.js.map +1 -0
  193. package/dist/telegram-admin.js +800 -0
  194. package/dist/telegram-admin.js.map +1 -0
  195. package/dist/telegram.js +118 -0
  196. package/dist/telegram.js.map +1 -0
  197. package/dist/tools/cron.js +94 -0
  198. package/dist/tools/cron.js.map +1 -0
  199. package/dist/tools/edit.js +29 -0
  200. package/dist/tools/edit.js.map +1 -0
  201. package/dist/tools/exec.js +38 -0
  202. package/dist/tools/exec.js.map +1 -0
  203. package/dist/tools/fetch.js +28 -0
  204. package/dist/tools/fetch.js.map +1 -0
  205. package/dist/tools/index.js +16 -0
  206. package/dist/tools/index.js.map +1 -0
  207. package/dist/tools/memory.js +164 -0
  208. package/dist/tools/memory.js.map +1 -0
  209. package/dist/tools/patch.js +284 -0
  210. package/dist/tools/patch.js.map +1 -0
  211. package/dist/tools/read.js +26 -0
  212. package/dist/tools/read.js.map +1 -0
  213. package/dist/tools/search.js +62 -0
  214. package/dist/tools/search.js.map +1 -0
  215. package/dist/tools/subagent.js +48 -0
  216. package/dist/tools/subagent.js.map +1 -0
  217. package/dist/tools/write.js +22 -0
  218. package/dist/tools/write.js.map +1 -0
  219. package/dist/tui/commands.js +450 -0
  220. package/dist/tui/commands.js.map +1 -0
  221. package/dist/tui/components/assistant-message.js +26 -0
  222. package/dist/tui/components/assistant-message.js.map +1 -0
  223. package/dist/tui/components/chat-log.js +94 -0
  224. package/dist/tui/components/chat-log.js.map +1 -0
  225. package/dist/tui/components/custom-editor.js +40 -0
  226. package/dist/tui/components/custom-editor.js.map +1 -0
  227. package/dist/tui/components/hint-bar.js +13 -0
  228. package/dist/tui/components/hint-bar.js.map +1 -0
  229. package/dist/tui/components/tool-execution.js +73 -0
  230. package/dist/tui/components/tool-execution.js.map +1 -0
  231. package/dist/tui/components/user-message.js +19 -0
  232. package/dist/tui/components/user-message.js.map +1 -0
  233. package/dist/tui/components/welcome.js +147 -0
  234. package/dist/tui/components/welcome.js.map +1 -0
  235. package/dist/tui/context.js +3 -0
  236. package/dist/tui/context.js.map +1 -0
  237. package/dist/tui/theme.js +91 -0
  238. package/dist/tui/theme.js.map +1 -0
  239. package/dist/tui/tui.js +389 -0
  240. package/dist/tui/tui.js.map +1 -0
  241. package/dist/tui/ws-handler.js +154 -0
  242. package/dist/tui/ws-handler.js.map +1 -0
  243. package/dist/types.js +3 -0
  244. package/dist/types.js.map +1 -0
  245. package/dist/usage.js +88 -0
  246. package/dist/usage.js.map +1 -0
  247. package/dist/workspace.js +245 -0
  248. package/dist/workspace.js.map +1 -0
  249. package/package.json +74 -0
@@ -0,0 +1,451 @@
1
+ // Full first-time bootstrap — admin bot + pairing + optional API setup
2
+ // After this, everything is controlled from Telegram.
3
+ //
4
+ // Usage:
5
+ // camelagi bootstrap (interactive)
6
+ // camelagi bootstrap <token> (skip bot token prompt)
7
+ import readline from "node:readline";
8
+ import ora from "ora";
9
+ import { saveConfig, loadConfig, ensureDirs } from "./core/config.js";
10
+ import { seedWorkspace, seedAgentWorkspace } from "./workspace.js";
11
+ import { PROVIDER_PRESETS, fetchOpenRouterModels } from "./core/models.js";
12
+ import { listPendingRequests, approveRequest } from "./telegram/pairing.js";
13
+ function ask(rl, question) {
14
+ return new Promise((resolve) => rl.question(question, resolve));
15
+ }
16
+ // Suppress background server logs during interactive prompts
17
+ let _logMuted = false;
18
+ const _origLog = console.log;
19
+ const _origError = console.error;
20
+ const _origWarn = console.warn;
21
+ function muteLogs() {
22
+ if (_logMuted)
23
+ return;
24
+ _logMuted = true;
25
+ console.log = (...args) => {
26
+ const first = typeof args[0] === "string" ? args[0] : "";
27
+ // Allow bootstrap's own output (indented or colored)
28
+ if (first.startsWith("\x1b[") || first.startsWith(" "))
29
+ _origLog(...args);
30
+ };
31
+ console.error = () => { };
32
+ console.warn = () => { };
33
+ }
34
+ function unmuteLogs() {
35
+ if (!_logMuted)
36
+ return;
37
+ _logMuted = false;
38
+ console.log = _origLog;
39
+ console.error = _origError;
40
+ console.warn = _origWarn;
41
+ }
42
+ function pick(rl, label, options, compact = false) {
43
+ function showList(items, indices) {
44
+ for (let i = 0; i < indices.length; i++) {
45
+ console.log(` \x1b[33m${indices[i] + 1}\x1b[0m) ${items[i]}`);
46
+ }
47
+ }
48
+ if (!compact) {
49
+ // Simple numbered list for small option sets
50
+ return new Promise((resolve) => {
51
+ console.log(`\n\x1b[36m ${label}\x1b[0m`);
52
+ showList(options, options.map((_, i) => i));
53
+ rl.question(`\n Pick [1-${options.length}]: `, (answer) => {
54
+ const idx = parseInt(answer.trim(), 10) - 1;
55
+ resolve(options[idx] ?? options[0]);
56
+ });
57
+ });
58
+ }
59
+ // Live-filter mode for large lists
60
+ return new Promise((resolve) => {
61
+ console.log(`\n\x1b[36m ${label}\x1b[0m`);
62
+ console.log(`\x1b[90m ${options.length} options — start typing to filter, arrows to navigate, enter to select\x1b[0m\n`);
63
+ // Pause readline so we can use raw stdin
64
+ rl.pause();
65
+ let query = "";
66
+ let cursor = 0;
67
+ let matches = options.map((o, i) => ({ option: o, index: i }));
68
+ const MAX_VISIBLE = 8;
69
+ function getVisible() {
70
+ if (matches.length <= MAX_VISIBLE)
71
+ return matches;
72
+ // Keep cursor in view
73
+ let start = Math.max(0, cursor - Math.floor(MAX_VISIBLE / 2));
74
+ if (start + MAX_VISIBLE > matches.length)
75
+ start = Math.max(0, matches.length - MAX_VISIBLE);
76
+ return matches.slice(start, start + MAX_VISIBLE);
77
+ }
78
+ function render() {
79
+ const visible = getVisible();
80
+ const startIdx = matches.indexOf(visible[0]);
81
+ // Clear: move up to header + erase everything below
82
+ process.stdout.write(`\x1b[2K\r`); // clear current line
83
+ // Build output
84
+ const lines = [];
85
+ lines.push(` \x1b[36m>\x1b[0m ${query}\x1b[90m_\x1b[0m`);
86
+ lines.push("");
87
+ if (matches.length === 0) {
88
+ lines.push(` \x1b[33mNo matches\x1b[0m`);
89
+ }
90
+ else {
91
+ if (startIdx > 0)
92
+ lines.push(` \x1b[90m ↑ ${startIdx} more\x1b[0m`);
93
+ for (let i = 0; i < visible.length; i++) {
94
+ const m = visible[i];
95
+ const globalIdx = startIdx + i;
96
+ const selected = globalIdx === cursor;
97
+ if (selected) {
98
+ lines.push(` \x1b[36m▸ ${m.index + 1}) ${m.option}\x1b[0m`);
99
+ }
100
+ else {
101
+ lines.push(` \x1b[33m${m.index + 1}\x1b[0m) ${m.option}`);
102
+ }
103
+ }
104
+ const remaining = matches.length - (startIdx + visible.length);
105
+ if (remaining > 0)
106
+ lines.push(` \x1b[90m ↓ ${remaining} more\x1b[0m`);
107
+ }
108
+ // Move cursor up to overwrite previous render, then write
109
+ if (render._prevLines) {
110
+ process.stdout.write(`\x1b[${render._prevLines}A`);
111
+ }
112
+ for (const line of lines) {
113
+ process.stdout.write(`\x1b[2K${line}\n`);
114
+ }
115
+ // Clear any leftover lines from previous longer render
116
+ const prevCount = render._prevLines ?? 0;
117
+ for (let i = lines.length; i < prevCount; i++) {
118
+ process.stdout.write(`\x1b[2K\n`);
119
+ }
120
+ if (prevCount > lines.length) {
121
+ process.stdout.write(`\x1b[${prevCount - lines.length}A`);
122
+ }
123
+ render._prevLines = lines.length;
124
+ }
125
+ function updateMatches() {
126
+ const q = query.toLowerCase();
127
+ matches = q
128
+ ? options.map((o, i) => ({ option: o, index: i })).filter((m) => m.option.toLowerCase().includes(q))
129
+ : options.map((o, i) => ({ option: o, index: i }));
130
+ cursor = 0;
131
+ }
132
+ const stdin = process.stdin;
133
+ stdin.setRawMode(true);
134
+ stdin.resume();
135
+ render();
136
+ const onData = (buf) => {
137
+ const key = buf.toString();
138
+ if (key === "\r" || key === "\n") {
139
+ // Enter: select current
140
+ stdin.removeListener("data", onData);
141
+ stdin.setRawMode(false);
142
+ stdin.pause();
143
+ rl.resume();
144
+ // Clear the picker output
145
+ const prevLines = render._prevLines ?? 0;
146
+ process.stdout.write(`\x1b[${prevLines}A`);
147
+ for (let i = 0; i < prevLines; i++)
148
+ process.stdout.write(`\x1b[2K\n`);
149
+ process.stdout.write(`\x1b[${prevLines}A`);
150
+ if (matches.length > 0) {
151
+ const selected = matches[cursor];
152
+ console.log(` \x1b[32m→ ${selected.option}\x1b[0m\n`);
153
+ resolve(selected.option);
154
+ }
155
+ else {
156
+ // No matches but query could be a custom model name
157
+ if (query.trim()) {
158
+ console.log(` \x1b[32m→ ${query.trim()}\x1b[0m\n`);
159
+ resolve(query.trim());
160
+ }
161
+ else {
162
+ console.log(` \x1b[32m→ ${options[0]}\x1b[0m\n`);
163
+ resolve(options[0]);
164
+ }
165
+ }
166
+ return;
167
+ }
168
+ if (key === "\x03") {
169
+ // Ctrl+C
170
+ stdin.removeListener("data", onData);
171
+ stdin.setRawMode(false);
172
+ process.exit(0);
173
+ }
174
+ if (key === "\x1b[A") {
175
+ // Up arrow
176
+ if (cursor > 0)
177
+ cursor--;
178
+ render();
179
+ return;
180
+ }
181
+ if (key === "\x1b[B") {
182
+ // Down arrow
183
+ if (cursor < matches.length - 1)
184
+ cursor++;
185
+ render();
186
+ return;
187
+ }
188
+ if (key === "\x7f" || key === "\b") {
189
+ // Backspace
190
+ if (query.length > 0) {
191
+ query = query.slice(0, -1);
192
+ updateMatches();
193
+ render();
194
+ }
195
+ return;
196
+ }
197
+ // Regular character
198
+ if (key.length === 1 && key >= " ") {
199
+ query += key;
200
+ updateMatches();
201
+ render();
202
+ }
203
+ };
204
+ stdin.on("data", onData);
205
+ });
206
+ }
207
+ async function validateBotToken(token) {
208
+ try {
209
+ const resp = await fetch(`https://api.telegram.org/bot${token}/getMe`);
210
+ const data = await resp.json();
211
+ if (data.ok && data.result) {
212
+ return { ok: true, username: data.result.username, name: data.result.first_name };
213
+ }
214
+ return { ok: false, error: data.description ?? "Invalid token" };
215
+ }
216
+ catch (err) {
217
+ return { ok: false, error: err instanceof Error ? err.message : String(err) };
218
+ }
219
+ }
220
+ export async function runBootstrap(tokenArg) {
221
+ ensureDirs();
222
+ seedWorkspace();
223
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
224
+ console.log(`\n\x1b[36m CamelAGI Bootstrap\x1b[0m`);
225
+ console.log(`\x1b[90m Sets up your admin bot, verifies your identity, then configures AI.\x1b[0m`);
226
+ console.log(`\x1b[90m After this, manage everything from Telegram.\x1b[0m`);
227
+ // ─── Resume detection ──────────────────────────────────────────────
228
+ let existingConfig;
229
+ try {
230
+ existingConfig = loadConfig();
231
+ }
232
+ catch {
233
+ existingConfig = null;
234
+ }
235
+ const hasAdminBot = !!existingConfig?.agents?.admin?.telegram?.botToken;
236
+ const hasVerifiedUser = (existingConfig?.agents?.admin?.telegram?.allowedUsers?.length ?? 0) > 0;
237
+ const hasApiKey = !!existingConfig?.apiKey;
238
+ if (hasAdminBot && hasVerifiedUser && hasApiKey) {
239
+ console.log(`\n\x1b[32m ✔ Already fully configured.\x1b[0m`);
240
+ console.log(`\x1b[90m Admin bot: configured\x1b[0m`);
241
+ console.log(`\x1b[90m Identity: verified\x1b[0m`);
242
+ console.log(`\x1b[90m API: ${existingConfig.provider} / ${existingConfig.model}\x1b[0m`);
243
+ const resetAnswer = (await ask(rl, `\n\x1b[36m Reset and start over? (y/N):\x1b[0m `)).trim().toLowerCase();
244
+ if (resetAnswer !== "y") {
245
+ console.log(`\x1b[90m Nothing to do. Use /setup in Telegram to reconfigure.\x1b[0m\n`);
246
+ rl.close();
247
+ return;
248
+ }
249
+ }
250
+ else if (hasAdminBot && hasVerifiedUser && !hasApiKey) {
251
+ console.log(`\n\x1b[32m ✔ Admin bot configured, identity verified.\x1b[0m`);
252
+ console.log(`\x1b[33m ⚠ API not configured — resuming from Step 3.\x1b[0m`);
253
+ // Start server for background operation
254
+ const serverSpinner = ora({ text: "Starting server...", indent: 2 }).start();
255
+ const { startServer } = await import("./serve.js");
256
+ startServer({ cron: true, boot: true }).catch(() => { });
257
+ await new Promise((r) => setTimeout(r, 2000));
258
+ serverSpinner.succeed("Server running");
259
+ // Jump straight to step 3
260
+ await runApiSetup(rl);
261
+ rl.close();
262
+ console.log(`\n\x1b[36m ✅ Bootstrap complete!\x1b[0m`);
263
+ console.log(`\x1b[90m Use /newagent in Telegram to create your first AI agent.\x1b[0m`);
264
+ console.log(`\x1b[90m Server is running. Press Ctrl+C to stop.\x1b[0m\n`);
265
+ await new Promise(() => { });
266
+ return;
267
+ }
268
+ // ─── Step 1: Telegram Admin Bot ───────────────────────────────────
269
+ let botToken = tokenArg ?? "";
270
+ if (!botToken) {
271
+ console.log(`\n\x1b[36m Step 1: Telegram Admin Bot\x1b[0m`);
272
+ console.log(`\x1b[90m This bot lets you manage CamelAGI from Telegram.\x1b[0m\n`);
273
+ console.log(` \x1b[36m┌──────────────────────────────────────────┐\x1b[0m`);
274
+ console.log(` \x1b[36m│\x1b[0m 1. Open Telegram → \x1b[1m@BotFather\x1b[0m → \x1b[1m/newbot\x1b[0m \x1b[36m│\x1b[0m`);
275
+ console.log(` \x1b[36m│\x1b[0m 2. Copy the bot token \x1b[36m│\x1b[0m`);
276
+ console.log(` \x1b[36m└──────────────────────────────────────────┘\x1b[0m\n`);
277
+ botToken = (await ask(rl, `\x1b[36m Bot token:\x1b[0m `)).trim();
278
+ }
279
+ if (!botToken) {
280
+ rl.close();
281
+ console.error("\n\x1b[31m Bot token is required.\x1b[0m\n");
282
+ process.exit(1);
283
+ }
284
+ // Validate the token
285
+ const validateSpinner = ora({ text: "Validating bot token...", indent: 2 }).start();
286
+ const result = await validateBotToken(botToken);
287
+ if (!result.ok) {
288
+ if (result.error?.includes("fetch failed") || result.error?.includes("ENOTFOUND")) {
289
+ validateSpinner.warn("Could not reach Telegram API — skipping validation");
290
+ }
291
+ else {
292
+ validateSpinner.fail(`Invalid token: ${result.error}`);
293
+ rl.close();
294
+ process.exit(1);
295
+ }
296
+ }
297
+ else {
298
+ validateSpinner.succeed(`Bot valid: @${result.username} (${result.name})`);
299
+ }
300
+ // Save admin bot config (no API yet)
301
+ saveConfig({
302
+ agents: {
303
+ admin: {
304
+ name: "Admin",
305
+ admin: true,
306
+ telegram: { botToken, allowedUsers: [] },
307
+ },
308
+ },
309
+ });
310
+ seedAgentWorkspace("admin", "Admin", "CamelAGI admin bot — manages your AI agents from Telegram");
311
+ ora({ indent: 2 }).succeed("Admin bot configured");
312
+ // ─── Step 2: Start server + pairing ───────────────────────────────
313
+ const serverSpinner = ora({ text: "Starting server...", indent: 2 }).start();
314
+ const { startServer } = await import("./serve.js");
315
+ startServer({ cron: true, boot: true }).catch(() => { });
316
+ await new Promise((r) => setTimeout(r, 2000));
317
+ serverSpinner.succeed("Server running");
318
+ muteLogs();
319
+ const botName = result.ok ? `@${result.username}` : "your admin bot";
320
+ console.log(`\n\x1b[36m Step 2: Verify Your Identity\x1b[0m\n`);
321
+ console.log(` \x1b[36m┌──────────────────────────────────────────┐\x1b[0m`);
322
+ console.log(` \x1b[36m│\x1b[0m Open Telegram and send any message to \x1b[36m│\x1b[0m`);
323
+ console.log(` \x1b[36m│\x1b[0m \x1b[1m\x1b[36m${botName.padEnd(38)}\x1b[0m\x1b[36m│\x1b[0m`);
324
+ console.log(` \x1b[36m└──────────────────────────────────────────┘\x1b[0m\n`);
325
+ const pairingSpinner = ora({ text: "Waiting for your Telegram message...", indent: 2 }).start();
326
+ // Poll for pairing request
327
+ let pairingRequest;
328
+ for (let i = 0; i < 120; i++) {
329
+ const pending = listPendingRequests().filter((r) => r.agentId === "admin" && r.status === "pending");
330
+ if (pending.length > 0) {
331
+ pairingRequest = pending[0];
332
+ break;
333
+ }
334
+ await new Promise((r) => setTimeout(r, 1000));
335
+ }
336
+ if (!pairingRequest) {
337
+ pairingSpinner.fail("Timeout — no message received. Pair later via /pairing.");
338
+ rl.close();
339
+ console.log(`\x1b[90m Server is running. Press Ctrl+C to stop.\x1b[0m\n`);
340
+ await new Promise(() => { });
341
+ return;
342
+ }
343
+ const userLabel = pairingRequest.username ? `@${pairingRequest.username}` : pairingRequest.firstName ?? String(pairingRequest.userId);
344
+ pairingSpinner.succeed(`Pairing request from ${userLabel}`);
345
+ console.log(`\n \x1b[36m┌──────────────────────┐\x1b[0m`);
346
+ console.log(` \x1b[36m│\x1b[0m Code: \x1b[1m\x1b[33m${pairingRequest.code}\x1b[0m \x1b[36m│\x1b[0m`);
347
+ console.log(` \x1b[36m│\x1b[0m User: \x1b[1m${userLabel.padEnd(14)}\x1b[0m\x1b[36m│\x1b[0m`);
348
+ console.log(` \x1b[36m│\x1b[0m ID: ${String(pairingRequest.userId).padEnd(14)}\x1b[36m│\x1b[0m`);
349
+ console.log(` \x1b[36m└──────────────────────┘\x1b[0m\n`);
350
+ // Ask admin to approve in CLI
351
+ const approveAnswer = (await ask(rl, `\x1b[36m Approve ${userLabel}? (Y/n):\x1b[0m `)).trim().toLowerCase();
352
+ if (approveAnswer === "n") {
353
+ console.log(`\x1b[90m Denied. Pair later via /pairing.\x1b[0m`);
354
+ rl.close();
355
+ await new Promise(() => { });
356
+ return;
357
+ }
358
+ const approved = approveRequest(pairingRequest.code);
359
+ if (!approved) {
360
+ ora({ indent: 2 }).fail("Failed to approve. Pair manually via /pairing.");
361
+ rl.close();
362
+ await new Promise(() => { });
363
+ return;
364
+ }
365
+ // Notify user in Telegram
366
+ try {
367
+ await fetch(`https://api.telegram.org/bot${botToken}/sendMessage`, {
368
+ method: "POST",
369
+ headers: { "Content-Type": "application/json" },
370
+ body: JSON.stringify({
371
+ chat_id: pairingRequest.chatId,
372
+ text: "Access approved! You are now the admin.",
373
+ }),
374
+ });
375
+ }
376
+ catch { /* best effort */ }
377
+ ora({ indent: 2 }).succeed(`${userLabel} approved! You are now the admin.`);
378
+ // ─── Step 3: API Setup (optional) ─────────────────────────────────
379
+ const setupNow = (await ask(rl, `\n\x1b[36m Step 3: Configure AI provider now? (Y/n):\x1b[0m `)).trim().toLowerCase();
380
+ if (setupNow !== "n") {
381
+ await runApiSetup(rl);
382
+ }
383
+ else {
384
+ console.log(`\x1b[90m Skipped — configure later via /setup in Telegram.\x1b[0m`);
385
+ }
386
+ rl.close();
387
+ // ─── Done ─────────────────────────────────────────────────────────
388
+ unmuteLogs();
389
+ console.log(`\n\x1b[36m ✅ Bootstrap complete!\x1b[0m`);
390
+ console.log(`\x1b[90m Use /newagent in Telegram to create your first AI agent.\x1b[0m`);
391
+ console.log(`\x1b[90m Server is running. Press Ctrl+C to stop.\x1b[0m\n`);
392
+ await new Promise(() => { });
393
+ }
394
+ // ─── Extracted API setup ──────────────────────────────────────────────
395
+ async function runApiSetup(rl) {
396
+ const service = await pick(rl, "Which provider?", [
397
+ "anthropic — Claude (direct)",
398
+ "openai — GPT (direct)",
399
+ "openrouter — Any model via OpenRouter",
400
+ "ollama — Local models",
401
+ "custom — Custom OpenAI-compatible endpoint",
402
+ ]);
403
+ const serviceKey = service.split(/\s/)[0];
404
+ const preset = PROVIDER_PRESETS[serviceKey] ?? PROVIDER_PRESETS.custom;
405
+ let apiKey;
406
+ if (serviceKey !== "ollama") {
407
+ const keyLabel = serviceKey === "anthropic" ? "Anthropic" : serviceKey === "openai" ? "OpenAI" : serviceKey === "openrouter" ? "OpenRouter" : "API";
408
+ apiKey = (await ask(rl, `\n\x1b[36m ${keyLabel} API key:\x1b[0m `)).trim() || undefined;
409
+ if (!apiKey)
410
+ console.log("\x1b[33m No key — set it later via /setup in Telegram.\x1b[0m");
411
+ }
412
+ let baseUrl = preset.baseUrl;
413
+ if (serviceKey === "custom") {
414
+ baseUrl = (await ask(rl, `\n\x1b[36m Base URL:\x1b[0m `)).trim() || undefined;
415
+ }
416
+ // Fetch live models for OpenRouter, fall back to static presets
417
+ let models = [...preset.models];
418
+ if (serviceKey === "openrouter" && apiKey) {
419
+ const spinner = ora({ text: "Fetching models from OpenRouter...", indent: 2 }).start();
420
+ const live = await fetchOpenRouterModels(apiKey);
421
+ if (live.length > 0) {
422
+ models = live.map((m) => m.id);
423
+ spinner.succeed(`${models.length} models available`);
424
+ }
425
+ else {
426
+ spinner.warn("Could not fetch live models — using defaults");
427
+ }
428
+ }
429
+ let model;
430
+ if (models.length > 0) {
431
+ const customOption = "(type a custom model name)";
432
+ const choice = await pick(rl, "Which model?", [...models, customOption], true);
433
+ model = choice === customOption ? (await ask(rl, `\n\x1b[36m Model name:\x1b[0m `)).trim() : choice;
434
+ }
435
+ else {
436
+ model = (await ask(rl, `\n\x1b[36m Model name:\x1b[0m `)).trim();
437
+ }
438
+ const update = { provider: preset.provider, model };
439
+ if (apiKey)
440
+ update.apiKey = apiKey;
441
+ if (baseUrl)
442
+ update.baseUrl = baseUrl;
443
+ saveConfig(update);
444
+ ora({ indent: 2 }).succeed("API configured");
445
+ console.log(`\x1b[90m provider: ${preset.provider}\x1b[0m`);
446
+ console.log(`\x1b[90m model: ${model}\x1b[0m`);
447
+ if (baseUrl)
448
+ console.log(`\x1b[90m baseUrl: ${baseUrl}\x1b[0m`);
449
+ console.log(`\x1b[90m apiKey: ${apiKey ? "***" + apiKey.slice(-4) : "not set"}\x1b[0m`);
450
+ }
451
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}