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 @@
1
+ {"version":3,"file":"compact.js","sourceRoot":"","sources":["../src/compact.ts"],"names":[],"mappings":"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"}
package/dist/config.js ADDED
@@ -0,0 +1,153 @@
1
+ // Config: env vars + optional YAML file at ~/.opencamel/config.yaml
2
+ import { z } from "zod";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
7
+ import "dotenv/config";
8
+ const configDir = path.join(os.homedir(), ".opencamel");
9
+ const configFile = path.join(configDir, "config.yaml");
10
+ const sessionsDir = path.join(configDir, "sessions");
11
+ export const paths = { configDir, configFile, sessionsDir };
12
+ const schema = z.object({
13
+ provider: z.enum(["anthropic", "openai"]).default("anthropic"),
14
+ model: z.string().default("claude-sonnet-4-20250514"),
15
+ apiKey: z.string().optional(),
16
+ baseUrl: z.string().optional(),
17
+ systemPrompt: z.string().default("You are OpenCamel, a helpful AI assistant. You have access to tools for running shell commands, reading/writing files, and fetching URLs. Use them when needed to help the user."),
18
+ thinking: z.enum(["off", "low", "medium", "high"]).default("off"),
19
+ effort: z.enum(["low", "medium", "high", "max"]).default("high"),
20
+ maxBudgetUsd: z.number().optional(),
21
+ maxTurns: z.number().default(25),
22
+ timeoutSeconds: z.number().default(300),
23
+ serve: z.object({
24
+ port: z.number().default(18789),
25
+ host: z.string().default("127.0.0.1"),
26
+ token: z.string().optional(),
27
+ }).default(() => ({ port: 18789, host: "127.0.0.1" })),
28
+ telegram: z.object({
29
+ botToken: z.string().optional(),
30
+ allowedUsers: z.array(z.number()).default([]),
31
+ groups: z.object({
32
+ mentionOnly: z.boolean().default(true),
33
+ }).default(() => ({ mentionOnly: true })),
34
+ chats: z.record(z.string(), z.object({
35
+ name: z.string().optional(),
36
+ model: z.string().optional(),
37
+ systemPrompt: z.string().optional(),
38
+ maxTurns: z.number().optional(),
39
+ thinking: z.enum(["off", "low", "medium", "high"]).optional(),
40
+ effort: z.enum(["low", "medium", "high", "max"]).optional(),
41
+ })).default(() => ({})),
42
+ }).default(() => ({ allowedUsers: [], groups: { mentionOnly: true }, chats: {} })),
43
+ compaction: z.object({
44
+ enabled: z.boolean().default(true),
45
+ maxTokens: z.number().default(80_000),
46
+ keepTurns: z.number().default(6),
47
+ }).default(() => ({ enabled: true, maxTokens: 80_000, keepTurns: 6 })),
48
+ tools: z.object({
49
+ allow: z.array(z.string()).default([]),
50
+ deny: z.array(z.string()).default([]),
51
+ }).default(() => ({ allow: [], deny: [] })),
52
+ skills: z.object({
53
+ enabled: z.boolean().default(true),
54
+ deny: z.array(z.string()).default([]),
55
+ }).default(() => ({ enabled: true, deny: [] })),
56
+ hooks: z.object({
57
+ enabled: z.boolean().default(false),
58
+ }).default(() => ({ enabled: false })),
59
+ approvals: z.object({
60
+ mode: z.enum(["off", "smart", "always"]).default("off"),
61
+ allowlist: z.array(z.string()).default([]),
62
+ timeoutSeconds: z.number().default(120),
63
+ fallback: z.enum(["deny", "allow"]).default("deny"),
64
+ /** Telegram chat ID to forward approval requests to when running headless */
65
+ forwardTo: z.number().optional(),
66
+ }).default(() => ({ mode: "off", allowlist: [], timeoutSeconds: 120, fallback: "deny" })),
67
+ retry: z.object({
68
+ maxRetries: z.number().default(3),
69
+ backoffMs: z.number().default(1000),
70
+ }).default(() => ({ maxRetries: 3, backoffMs: 1000 })),
71
+ lanes: z.object({
72
+ main: z.number().default(3),
73
+ cron: z.number().default(1),
74
+ subagent: z.number().default(5),
75
+ }).default(() => ({ main: 3, cron: 1, subagent: 5 })),
76
+ agents: z.record(z.string(), z.object({
77
+ name: z.string(),
78
+ admin: z.boolean().default(false),
79
+ model: z.string().optional(),
80
+ systemPrompt: z.string().optional(),
81
+ thinking: z.enum(["off", "low", "medium", "high"]).optional(),
82
+ effort: z.enum(["low", "medium", "high", "max"]).optional(),
83
+ maxTurns: z.number().optional(),
84
+ telegram: z.object({
85
+ botToken: z.string(),
86
+ allowedUsers: z.array(z.number()).default([]),
87
+ groups: z.object({
88
+ mentionOnly: z.boolean().default(true),
89
+ }).default(() => ({ mentionOnly: true })),
90
+ }).optional(),
91
+ })).default(() => ({})),
92
+ boot: z.boolean().default(true),
93
+ cron: z.array(z.object({
94
+ id: z.string(),
95
+ name: z.string().default(""),
96
+ schedule: z.string(),
97
+ prompt: z.string(),
98
+ session: z.string().optional(),
99
+ enabled: z.boolean().default(true),
100
+ })).default([]),
101
+ });
102
+ export function loadConfig(overrides = {}) {
103
+ let fileConfig = {};
104
+ if (fs.existsSync(configFile)) {
105
+ const raw = fs.readFileSync(configFile, "utf-8");
106
+ fileConfig = parseYaml(raw) ?? {};
107
+ }
108
+ // env vars override file config
109
+ const merged = {
110
+ ...fileConfig,
111
+ ...(process.env.OPENCAMEL_PROVIDER && { provider: process.env.OPENCAMEL_PROVIDER }),
112
+ ...(process.env.OPENCAMEL_MODEL && { model: process.env.OPENCAMEL_MODEL }),
113
+ ...(process.env.ANTHROPIC_API_KEY && { apiKey: process.env.ANTHROPIC_API_KEY }),
114
+ ...(process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY && { apiKey: process.env.OPENAI_API_KEY }),
115
+ ...(process.env.OPENCAMEL_BASE_URL && { baseUrl: process.env.OPENCAMEL_BASE_URL }),
116
+ ...overrides,
117
+ };
118
+ // env vars for serve/telegram sections
119
+ const m = merged;
120
+ if (process.env.OPENCAMEL_TOKEN) {
121
+ const existing = (m.serve ?? {});
122
+ m.serve = { ...existing, token: process.env.OPENCAMEL_TOKEN };
123
+ }
124
+ if (process.env.TELEGRAM_BOT_TOKEN) {
125
+ const existing = (m.telegram ?? {});
126
+ m.telegram = { ...existing, botToken: process.env.TELEGRAM_BOT_TOKEN };
127
+ }
128
+ return schema.parse(merged);
129
+ }
130
+ export function saveConfig(values) {
131
+ fs.mkdirSync(configDir, { recursive: true });
132
+ let existing = {};
133
+ if (fs.existsSync(configFile)) {
134
+ existing = parseYaml(fs.readFileSync(configFile, "utf-8")) ?? {};
135
+ }
136
+ const merged = { ...existing, ...values };
137
+ try {
138
+ fs.writeFileSync(configFile, stringifyYaml(merged));
139
+ }
140
+ catch (err) {
141
+ const msg = err instanceof Error ? err.message : String(err);
142
+ throw new Error(`Failed to save config to ${configFile}: ${msg}`);
143
+ }
144
+ }
145
+ export function ensureDirs() {
146
+ fs.mkdirSync(configDir, { recursive: true });
147
+ fs.mkdirSync(sessionsDir, { recursive: true });
148
+ fs.mkdirSync(path.join(configDir, "workspace"), { recursive: true });
149
+ fs.mkdirSync(path.join(configDir, "hooks"), { recursive: true });
150
+ fs.mkdirSync(path.join(configDir, "skills"), { recursive: true });
151
+ fs.mkdirSync(path.join(configDir, "usage"), { recursive: true });
152
+ }
153
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ // Shared constants — single source of truth for magic numbers
2
+ // Token estimation
3
+ export const CHARS_PER_TOKEN = 4;
4
+ // Output limits
5
+ export const MAX_TOOL_OUTPUT_CHARS = 50_000;
6
+ export const MAX_STDERR_CHARS = 10_000;
7
+ // System prompt limits
8
+ export const MAX_BOOTSTRAP_FILE_CHARS = 20_000;
9
+ export const MAX_BOOTSTRAP_TOTAL_CHARS = 150_000;
10
+ export const MAX_SKILLS_TOTAL_CHARS = 30_000;
11
+ // Timeouts
12
+ export const HOOK_TIMEOUT_MS = 10_000;
13
+ export const HEARTBEAT_INTERVAL_MS = 30_000;
14
+ export const QUEUE_WAIT_TIMEOUT_MS = 15_000;
15
+ // Compaction
16
+ export const COMPACTION_TRIGGER_RATIO = 0.8;
17
+ export const MEMORY_FLUSH_MAX_CHARS = 30_000;
18
+ // API defaults
19
+ export const DEFAULT_MAX_TOKENS = 4096;
20
+ export const DEFAULT_MAX_TURNS = 25;
21
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,mBAAmB;AACnB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,uBAAuB;AACvB,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,WAAW;AACX,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,aAAa;AACb,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,eAAe;AACf,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC"}
@@ -0,0 +1,212 @@
1
+ // Config: env vars + optional YAML file at ~/.camelagi/config.yaml
2
+ import { z } from "zod";
3
+ import fs from "node:fs";
4
+ import path from "node:path";
5
+ import os from "node:os";
6
+ import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
7
+ import "dotenv/config";
8
+ const configDir = path.join(os.homedir(), ".camelagi");
9
+ const configFile = path.join(configDir, "config.yaml");
10
+ const sessionsDir = path.join(configDir, "sessions");
11
+ export const paths = { configDir, configFile, sessionsDir };
12
+ const schema = z.object({
13
+ provider: z.enum(["anthropic", "openai"]).default("anthropic"),
14
+ model: z.string().default("claude-sonnet-4-20250514"),
15
+ apiKey: z.string().optional(),
16
+ baseUrl: z.string().optional(),
17
+ systemPrompt: z.string().default("You are CamelAGI, a helpful AI assistant. You have access to tools for running shell commands, reading/writing files, and fetching URLs. Use them when needed to help the user."),
18
+ thinking: z.enum(["off", "low", "medium", "high"]).default("off"),
19
+ effort: z.enum(["low", "medium", "high", "max"]).default("high"),
20
+ maxBudgetUsd: z.number().optional(),
21
+ maxTurns: z.number().default(25),
22
+ timeoutSeconds: z.number().default(300),
23
+ serve: z.object({
24
+ port: z.number().default(18789),
25
+ host: z.string().default("127.0.0.1"),
26
+ token: z.string().optional(),
27
+ rateLimit: z.object({
28
+ windowMs: z.number().default(60_000),
29
+ max: z.number().default(60),
30
+ }).default(() => ({ windowMs: 60_000, max: 60 })),
31
+ }).default(() => ({ port: 18789, host: "127.0.0.1", rateLimit: { windowMs: 60_000, max: 60 } })),
32
+ telegram: z.object({
33
+ botToken: z.string().optional(),
34
+ allowedUsers: z.array(z.number()).default([]),
35
+ groups: z.object({
36
+ mentionOnly: z.boolean().default(true),
37
+ }).default(() => ({ mentionOnly: true })),
38
+ chats: z.record(z.string(), z.object({
39
+ name: z.string().optional(),
40
+ model: z.string().optional(),
41
+ systemPrompt: z.string().optional(),
42
+ maxTurns: z.number().optional(),
43
+ thinking: z.enum(["off", "low", "medium", "high"]).optional(),
44
+ effort: z.enum(["low", "medium", "high", "max"]).optional(),
45
+ })).default(() => ({})),
46
+ }).default(() => ({ allowedUsers: [], groups: { mentionOnly: true }, chats: {} })),
47
+ compaction: z.object({
48
+ enabled: z.boolean().default(true),
49
+ maxTokens: z.number().default(80_000),
50
+ keepTurns: z.number().default(6),
51
+ }).default(() => ({ enabled: true, maxTokens: 80_000, keepTurns: 6 })),
52
+ tools: z.object({
53
+ allow: z.array(z.string()).default([]),
54
+ deny: z.array(z.string()).default([]),
55
+ }).default(() => ({ allow: [], deny: [] })),
56
+ skills: z.object({
57
+ enabled: z.boolean().default(true),
58
+ deny: z.array(z.string()).default([]),
59
+ }).default(() => ({ enabled: true, deny: [] })),
60
+ mcp: z.object({
61
+ servers: z.record(z.string(), z.object({
62
+ command: z.string(),
63
+ args: z.array(z.string()).default([]),
64
+ env: z.record(z.string(), z.string()).default({}),
65
+ })).default({}),
66
+ }).default(() => ({ servers: {} })),
67
+ hooks: z.object({
68
+ enabled: z.boolean().default(false),
69
+ }).default(() => ({ enabled: false })),
70
+ approvals: z.object({
71
+ mode: z.enum(["off", "smart", "always"]).default("off"),
72
+ allowlist: z.array(z.string()).default([]),
73
+ timeoutSeconds: z.number().default(120),
74
+ fallback: z.enum(["deny", "allow"]).default("deny"),
75
+ /** Telegram chat ID to forward approval requests to when running headless */
76
+ forwardTo: z.number().optional(),
77
+ }).default(() => ({ mode: "off", allowlist: [], timeoutSeconds: 120, fallback: "deny" })),
78
+ retry: z.object({
79
+ maxRetries: z.number().default(3),
80
+ backoffMs: z.number().default(1000),
81
+ }).default(() => ({ maxRetries: 3, backoffMs: 1000 })),
82
+ voice: z.object({
83
+ enabled: z.boolean().default(false),
84
+ provider: z.enum(["groq", "openai", "deepgram"]).default("groq"),
85
+ apiKey: z.string().optional(),
86
+ model: z.string().optional(),
87
+ language: z.string().optional(),
88
+ }).default(() => ({ enabled: false, provider: "groq" })),
89
+ lanes: z.object({
90
+ main: z.number().default(3),
91
+ cron: z.number().default(1),
92
+ subagent: z.number().default(5),
93
+ }).default(() => ({ main: 3, cron: 1, subagent: 5 })),
94
+ agents: z.record(z.string(), z.object({
95
+ name: z.string(),
96
+ admin: z.boolean().default(false),
97
+ model: z.string().optional(),
98
+ systemPrompt: z.string().optional(),
99
+ thinking: z.enum(["off", "low", "medium", "high"]).optional(),
100
+ effort: z.enum(["low", "medium", "high", "max"]).optional(),
101
+ maxTurns: z.number().optional(),
102
+ telegram: z.object({
103
+ botToken: z.string(),
104
+ allowedUsers: z.array(z.number()).default([]),
105
+ groups: z.object({
106
+ mentionOnly: z.boolean().default(true),
107
+ }).default(() => ({ mentionOnly: true })),
108
+ }).optional(),
109
+ discord: z.object({
110
+ botToken: z.string(),
111
+ allowedChannels: z.array(z.string()).default([]),
112
+ allowedRoles: z.array(z.string()).default([]),
113
+ mentionOnly: z.boolean().default(true),
114
+ }).optional(),
115
+ })).default(() => ({})),
116
+ boot: z.boolean().default(true),
117
+ cron: z.array(z.object({
118
+ id: z.string(),
119
+ name: z.string().default(""),
120
+ schedule: z.string(),
121
+ prompt: z.string(),
122
+ session: z.string().optional(),
123
+ enabled: z.boolean().default(true),
124
+ })).default([]),
125
+ });
126
+ // ─── Save callback: lets serve.ts update state.config immediately ────
127
+ let _onConfigSaved = null;
128
+ /** Register a callback that fires synchronously after every saveConfig */
129
+ export function onConfigSaved(cb) {
130
+ _onConfigSaved = cb;
131
+ }
132
+ export function loadConfig(overrides = {}) {
133
+ let fileConfig = {};
134
+ if (fs.existsSync(configFile)) {
135
+ const raw = fs.readFileSync(configFile, "utf-8");
136
+ fileConfig = parseYaml(raw) ?? {};
137
+ }
138
+ // env vars override file config
139
+ const merged = {
140
+ ...fileConfig,
141
+ ...(process.env.CAMELAGI_PROVIDER && { provider: process.env.CAMELAGI_PROVIDER }),
142
+ ...(process.env.CAMELAGI_MODEL && { model: process.env.CAMELAGI_MODEL }),
143
+ ...(process.env.ANTHROPIC_API_KEY && { apiKey: process.env.ANTHROPIC_API_KEY }),
144
+ ...(process.env.OPENAI_API_KEY && !process.env.ANTHROPIC_API_KEY && { apiKey: process.env.OPENAI_API_KEY }),
145
+ ...(process.env.CAMELAGI_BASE_URL && { baseUrl: process.env.CAMELAGI_BASE_URL }),
146
+ ...overrides,
147
+ };
148
+ // env vars for serve/telegram sections
149
+ const m = merged;
150
+ if (process.env.CAMELAGI_TOKEN) {
151
+ const existing = (m.serve ?? {});
152
+ m.serve = { ...existing, token: process.env.CAMELAGI_TOKEN };
153
+ }
154
+ if (process.env.TELEGRAM_BOT_TOKEN) {
155
+ const existing = (m.telegram ?? {});
156
+ m.telegram = { ...existing, botToken: process.env.TELEGRAM_BOT_TOKEN };
157
+ }
158
+ return schema.parse(merged);
159
+ }
160
+ /** Deep merge two plain objects (arrays are replaced, not merged) */
161
+ function deepMerge(target, source) {
162
+ const result = { ...target };
163
+ for (const key of Object.keys(source)) {
164
+ const sv = source[key];
165
+ const tv = target[key];
166
+ if (sv && tv && typeof sv === "object" && typeof tv === "object" && !Array.isArray(sv) && !Array.isArray(tv)) {
167
+ result[key] = deepMerge(tv, sv);
168
+ }
169
+ else {
170
+ result[key] = sv;
171
+ }
172
+ }
173
+ return result;
174
+ }
175
+ export function saveConfig(values) {
176
+ fs.mkdirSync(configDir, { recursive: true });
177
+ let existing = {};
178
+ if (fs.existsSync(configFile)) {
179
+ existing = parseYaml(fs.readFileSync(configFile, "utf-8")) ?? {};
180
+ }
181
+ const merged = deepMerge(existing, values);
182
+ try {
183
+ fs.writeFileSync(configFile, stringifyYaml(merged));
184
+ }
185
+ catch (err) {
186
+ const msg = err instanceof Error ? err.message : String(err);
187
+ throw new Error(`Failed to save config to ${configFile}: ${msg}`);
188
+ }
189
+ // Immediately update in-memory state (don't wait for file watcher debounce)
190
+ // Use loadConfig() so env var overrides are included (schema.parse(merged) would miss them)
191
+ if (_onConfigSaved) {
192
+ try {
193
+ const fresh = loadConfig();
194
+ console.log(`[config] onConfigSaved firing — agents: [${Object.keys(fresh.agents)}]`);
195
+ _onConfigSaved(fresh);
196
+ }
197
+ catch (err) {
198
+ console.error(`[config] onConfigSaved FAILED:`, err);
199
+ }
200
+ }
201
+ }
202
+ export function ensureDirs() {
203
+ fs.mkdirSync(configDir, { recursive: true });
204
+ fs.mkdirSync(sessionsDir, { recursive: true });
205
+ fs.mkdirSync(path.join(configDir, "workspace"), { recursive: true });
206
+ fs.mkdirSync(path.join(configDir, "hooks"), { recursive: true });
207
+ fs.mkdirSync(path.join(configDir, "skills"), { recursive: true });
208
+ fs.mkdirSync(path.join(configDir, "usage"), { recursive: true });
209
+ fs.mkdirSync(path.join(configDir, "cron"), { recursive: true });
210
+ fs.mkdirSync(path.join(configDir, "logs"), { recursive: true });
211
+ }
212
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/core/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ // Shared constants — single source of truth for magic numbers
2
+ // Token estimation
3
+ export const CHARS_PER_TOKEN = 4;
4
+ // Output limits
5
+ export const MAX_TOOL_OUTPUT_CHARS = 50_000;
6
+ export const MAX_STDERR_CHARS = 10_000;
7
+ // System prompt limits
8
+ export const MAX_BOOTSTRAP_FILE_CHARS = 20_000;
9
+ export const MAX_BOOTSTRAP_TOTAL_CHARS = 150_000;
10
+ export const MAX_SKILLS_TOTAL_CHARS = 30_000;
11
+ // Timeouts
12
+ export const HOOK_TIMEOUT_MS = 10_000;
13
+ export const HEARTBEAT_INTERVAL_MS = 30_000;
14
+ export const QUEUE_WAIT_TIMEOUT_MS = 15_000;
15
+ // Compaction
16
+ export const COMPACTION_TRIGGER_RATIO = 0.8;
17
+ export const MEMORY_FLUSH_MAX_CHARS = 30_000;
18
+ // API defaults
19
+ export const DEFAULT_MAX_TOKENS = 4096;
20
+ export const DEFAULT_MAX_TURNS = 25;
21
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,mBAAmB;AACnB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC;AAEjC,gBAAgB;AAChB,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAEvC,uBAAuB;AACvB,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC;AAC/C,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAAC;AACjD,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,WAAW;AACX,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC;AACtC,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAC5C,MAAM,CAAC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AAE5C,aAAa;AACb,MAAM,CAAC,MAAM,wBAAwB,GAAG,GAAG,CAAC;AAC5C,MAAM,CAAC,MAAM,sBAAsB,GAAG,MAAM,CAAC;AAE7C,eAAe;AACf,MAAM,CAAC,MAAM,kBAAkB,GAAG,IAAI,CAAC;AACvC,MAAM,CAAC,MAAM,iBAAiB,GAAG,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ // Error utilities
2
+ export function errorMessage(err) {
3
+ return err instanceof Error ? err.message : String(err);
4
+ }
5
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/core/errors.ts"],"names":[],"mappings":"AAAA,kBAAkB;AAElB,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,41 @@
1
+ // Lightweight structured logging — no external deps
2
+ //
3
+ // Server/daemon/cron paths output structured JSON.
4
+ // TUI paths continue to use console directly (user-facing ANSI output).
5
+ const LEVELS = { debug: 0, info: 1, warn: 2, error: 3 };
6
+ let currentLevel = "info";
7
+ export function setLogLevel(level) {
8
+ currentLevel = level;
9
+ }
10
+ export function getLogLevel() {
11
+ return currentLevel;
12
+ }
13
+ function shouldLog(level) {
14
+ return LEVELS[level] >= LEVELS[currentLevel];
15
+ }
16
+ function emit(level, tag, msg, data) {
17
+ if (!shouldLog(level))
18
+ return;
19
+ const entry = {
20
+ ts: new Date().toISOString(),
21
+ level,
22
+ tag,
23
+ msg,
24
+ };
25
+ if (data)
26
+ Object.assign(entry, data);
27
+ const line = JSON.stringify(entry);
28
+ if (level === "error" || level === "warn") {
29
+ process.stderr.write(line + "\n");
30
+ }
31
+ else {
32
+ process.stdout.write(line + "\n");
33
+ }
34
+ }
35
+ export const log = {
36
+ debug: (tag, msg, data) => emit("debug", tag, msg, data),
37
+ info: (tag, msg, data) => emit("info", tag, msg, data),
38
+ warn: (tag, msg, data) => emit("warn", tag, msg, data),
39
+ error: (tag, msg, data) => emit("error", tag, msg, data),
40
+ };
41
+ //# sourceMappingURL=log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.js","sourceRoot":"","sources":["../../src/core/log.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,EAAE;AACF,mDAAmD;AACnD,wEAAwE;AAIxE,MAAM,MAAM,GAA0B,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AAE/E,IAAI,YAAY,GAAU,MAAM,CAAC;AAEjC,MAAM,UAAU,WAAW,CAAC,KAAY;IACtC,YAAY,GAAG,KAAK,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,SAAS,SAAS,CAAC,KAAY;IAC7B,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,IAAI,CAAC,KAAY,EAAE,GAAW,EAAE,GAAW,EAAE,IAA8B;IAClF,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;QAAE,OAAO;IAE9B,MAAM,KAAK,GAA4B;QACrC,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC5B,KAAK;QACL,GAAG;QACH,GAAG;KACJ,CAAC;IACF,IAAI,IAAI;QAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAErC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACnC,IAAI,KAAK,KAAK,OAAO,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,KAAK,EAAE,CAAC,GAAW,EAAE,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;IAClG,IAAI,EAAG,CAAC,GAAW,EAAE,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;IACjG,IAAI,EAAG,CAAC,GAAW,EAAE,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;IACjG,KAAK,EAAE,CAAC,GAAW,EAAE,GAAW,EAAE,IAA8B,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;CACnG,CAAC"}
@@ -0,0 +1,123 @@
1
+ // Model catalog: presets per provider + OpenRouter live fetch
2
+ //
3
+ // Used by setup wizard and TUI model selector.
4
+ export const PROVIDER_PRESETS = {
5
+ anthropic: {
6
+ provider: "anthropic",
7
+ models: [
8
+ "claude-sonnet-4-20250514",
9
+ "claude-opus-4-20250514",
10
+ "claude-haiku-4-20250506",
11
+ ],
12
+ },
13
+ openai: {
14
+ provider: "openai",
15
+ models: [
16
+ "gpt-4o",
17
+ "gpt-4o-mini",
18
+ "gpt-4.1",
19
+ "gpt-4.1-mini",
20
+ "gpt-4.1-nano",
21
+ "o3",
22
+ "o4-mini",
23
+ ],
24
+ },
25
+ openrouter: {
26
+ provider: "openai",
27
+ baseUrl: "https://openrouter.ai/api/v1",
28
+ models: [
29
+ // Anthropic
30
+ "anthropic/claude-sonnet-4-20250514",
31
+ "anthropic/claude-opus-4-20250514",
32
+ "anthropic/claude-haiku-4-20250506",
33
+ // OpenAI
34
+ "openai/gpt-4o",
35
+ "openai/gpt-4o-mini",
36
+ "openai/gpt-4.1",
37
+ "openai/gpt-4.1-mini",
38
+ "openai/gpt-4.1-nano",
39
+ "openai/o3",
40
+ "openai/o4-mini",
41
+ // Google
42
+ "google/gemini-2.5-pro",
43
+ "google/gemini-2.5-flash",
44
+ "google/gemini-2.0-flash",
45
+ // DeepSeek
46
+ "deepseek/deepseek-r1",
47
+ "deepseek/deepseek-chat-v3-0324",
48
+ "deepseek/deepseek-r1-0528",
49
+ // Meta
50
+ "meta-llama/llama-4-maverick",
51
+ "meta-llama/llama-4-scout",
52
+ "meta-llama/llama-3.3-70b-instruct",
53
+ // Qwen
54
+ "qwen/qwen3-235b-a22b",
55
+ "qwen/qwen3-32b",
56
+ "qwen/qwen3-30b-a3b",
57
+ // Mistral
58
+ "mistralai/mistral-large-2411",
59
+ "mistralai/mistral-medium-3",
60
+ "mistralai/mistral-small-3.2-24b-instruct",
61
+ "mistralai/codestral-2501",
62
+ // xAI
63
+ "x-ai/grok-3",
64
+ "x-ai/grok-3-mini",
65
+ // Cohere
66
+ "cohere/command-a",
67
+ "cohere/command-r-plus-08-2024",
68
+ // Amazon
69
+ "amazon/nova-pro-v1",
70
+ "amazon/nova-lite-v1",
71
+ ],
72
+ },
73
+ ollama: {
74
+ provider: "openai",
75
+ baseUrl: "http://localhost:11434/v1",
76
+ models: [
77
+ "llama3.3",
78
+ "qwen3",
79
+ "deepseek-r1",
80
+ "gemma3",
81
+ "mistral",
82
+ "codellama",
83
+ "phi4",
84
+ ],
85
+ },
86
+ custom: {
87
+ provider: "openai",
88
+ models: [],
89
+ },
90
+ };
91
+ /** Resolve which preset to use based on provider and baseUrl */
92
+ export function resolvePreset(provider, baseUrl) {
93
+ if (baseUrl?.includes("openrouter"))
94
+ return PROVIDER_PRESETS.openrouter;
95
+ if (baseUrl?.includes("localhost") || baseUrl?.includes("127.0.0.1"))
96
+ return PROVIDER_PRESETS.ollama;
97
+ return PROVIDER_PRESETS[provider] ?? PROVIDER_PRESETS.custom;
98
+ }
99
+ /**
100
+ * Fetch live model list from OpenRouter API.
101
+ * Returns empty array on failure (caller should fall back to static presets).
102
+ */
103
+ export async function fetchOpenRouterModels(apiKey) {
104
+ try {
105
+ const headers = { "Content-Type": "application/json" };
106
+ if (apiKey)
107
+ headers["Authorization"] = `Bearer ${apiKey}`;
108
+ const res = await fetch("https://openrouter.ai/api/v1/models", { headers, signal: AbortSignal.timeout(8000) });
109
+ if (!res.ok)
110
+ return [];
111
+ const data = await res.json();
112
+ if (!Array.isArray(data.data))
113
+ return [];
114
+ // Sort by popularity (free models last, then alphabetical by provider)
115
+ return data.data
116
+ .filter((m) => m.id && !m.id.includes(":free"))
117
+ .sort((a, b) => a.id.localeCompare(b.id));
118
+ }
119
+ catch {
120
+ return [];
121
+ }
122
+ }
123
+ //# sourceMappingURL=models.js.map