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,209 @@
1
+ // Path 1: Claude Agent SDK (full agent with tools, thinking, subagents)
2
+ import { query, createSdkMcpServer } from "@anthropic-ai/claude-agent-sdk";
3
+ import { memorySearchTool, memoryGetTool, createScopedMemoryTools } from "../tools/memory.js";
4
+ import { agentMemoryDir } from "../workspace.js";
5
+ import { patchTool } from "../tools/patch.js";
6
+ import { cronTool } from "../tools/cron.js";
7
+ import { runHooks } from "../extensions/hooks.js";
8
+ import { recordUsage } from "../usage.js";
9
+ import { DEFAULT_MAX_TURNS } from "../core/constants.js";
10
+ import { checkApproval, waitForDecision, addToAllowlist } from "../extensions/approvals.js";
11
+ import { forwardApproval } from "../extensions/approval-forward.js";
12
+ import { adaptToolDef } from "./tool-adapter.js";
13
+ /** Get all custom tool definitions for an agent */
14
+ function getToolDefs(agentId) {
15
+ const memRoot = agentMemoryDir(agentId);
16
+ const scopedMemory = agentId
17
+ ? createScopedMemoryTools(memRoot)
18
+ : { search: memorySearchTool, get: memoryGetTool };
19
+ return [scopedMemory.search, scopedMemory.get, patchTool, cronTool];
20
+ }
21
+ /** Create MCP server with CamelAGI-specific tools */
22
+ function createCamelAgiMcpServer(agentId) {
23
+ const defs = getToolDefs(agentId);
24
+ return createSdkMcpServer({
25
+ name: "camelagi",
26
+ tools: defs.map(adaptToolDef),
27
+ });
28
+ }
29
+ const BUILTIN_TOOLS = [
30
+ "Read", "Write", "Edit", "Bash",
31
+ "Glob", "Grep",
32
+ "WebSearch", "WebFetch",
33
+ "Agent",
34
+ ];
35
+ export async function runAgentSdk(apiKey, model, systemPrompt, history, userMessage, opts) {
36
+ // Build effective prompt: if resuming, just use user message.
37
+ // Otherwise, prepend history as structured context in the prompt itself
38
+ // (the SDK manages its own conversation state via session resumption).
39
+ let effectivePrompt = userMessage;
40
+ if (!opts?.resumeSessionId && history.length > 0) {
41
+ const historyText = history
42
+ .map((m) => `[${m.role}]: ${m.content}`)
43
+ .join("\n\n");
44
+ effectivePrompt = `<previous_conversation>\n${historyText}\n</previous_conversation>\n\n${userMessage}`;
45
+ }
46
+ const emit = opts?.onEvent;
47
+ let toolIdCounter = 0;
48
+ const preToolHook = async (input) => {
49
+ const name = (input.tool_name ?? input.name ?? "tool");
50
+ const args = (input.tool_input ?? input.input ?? {});
51
+ const toolId = (input.tool_use_id ?? `tool-${++toolIdCounter}`);
52
+ if (opts?.hooksEnabled) {
53
+ await runHooks("before_tool", {
54
+ sessionId: opts.sessionId,
55
+ toolName: name,
56
+ toolArgs: args,
57
+ });
58
+ }
59
+ // Approval check
60
+ if (opts?.approvals && opts.approvals.mode !== "off") {
61
+ const request = checkApproval(name, args, opts.approvals.mode, opts.approvals.allowlist);
62
+ if (request) {
63
+ emit?.({ type: "approval_request", id: request.id, toolName: name, preview: request.preview });
64
+ if (!emit) {
65
+ if (opts.approvals.forwardTo) {
66
+ const forwarded = await forwardApproval(request.id, name, request.preview, opts.approvals.forwardTo);
67
+ if (forwarded) {
68
+ const decision = await waitForDecision(request.id, opts.approvals.timeoutSeconds * 1000, opts.approvals.fallback);
69
+ if (decision === "allow-always")
70
+ addToAllowlist(name, args);
71
+ if (decision === "deny")
72
+ return { decision: "block", reason: "User denied this tool call" };
73
+ }
74
+ else {
75
+ if (opts.approvals.fallback === "deny")
76
+ return { decision: "block", reason: "Tool call requires approval but forwarding failed" };
77
+ }
78
+ }
79
+ else {
80
+ if (opts.approvals.fallback === "deny")
81
+ return { decision: "block", reason: "Tool call requires approval but no approval channel is available" };
82
+ }
83
+ }
84
+ else {
85
+ const decision = await waitForDecision(request.id, opts.approvals.timeoutSeconds * 1000, opts.approvals.fallback);
86
+ emit({ type: "approval_resolved", id: request.id, decision });
87
+ if (decision === "allow-always")
88
+ addToAllowlist(name, args);
89
+ else if (decision === "deny")
90
+ return { decision: "block", reason: "User denied this tool call" };
91
+ }
92
+ }
93
+ }
94
+ if (emit) {
95
+ emit({ type: "tool_call", id: toolId, name, args });
96
+ }
97
+ else {
98
+ const argsStr = JSON.stringify(args).slice(0, 120);
99
+ process.stderr.write(`\x1b[36m → ${name}\x1b[0m\x1b[90m(${argsStr})\x1b[0m\n`);
100
+ }
101
+ return {};
102
+ };
103
+ const postToolHook = async (input) => {
104
+ const name = (input.tool_name ?? input.name ?? "tool");
105
+ const toolId = (input.tool_use_id ?? `tool-${toolIdCounter}`);
106
+ const resultText = String(input.tool_result ?? input.result ?? "");
107
+ const preview = resultText.slice(0, 150).replace(/\n/g, "↵");
108
+ if (opts?.hooksEnabled) {
109
+ await runHooks("after_tool", { sessionId: opts.sessionId, toolName: name, toolResult: resultText });
110
+ }
111
+ if (emit) {
112
+ emit({ type: "tool_result", id: toolId, name, preview });
113
+ }
114
+ else {
115
+ process.stderr.write(`\x1b[90m ← ${preview}${resultText.length > 150 ? "…" : ""}\x1b[0m\n`);
116
+ }
117
+ return {};
118
+ };
119
+ const mcpServer = createCamelAgiMcpServer(opts?.agentId);
120
+ const thinking = opts?.thinking && opts.thinking !== "off"
121
+ ? { type: "adaptive" }
122
+ : { type: "disabled" };
123
+ const disallowedTools = opts?.toolPolicy?.deny?.length ? opts.toolPolicy.deny : undefined;
124
+ const abortController = opts?.signal ? new AbortController() : undefined;
125
+ if (opts?.signal && abortController) {
126
+ if (opts.signal.aborted)
127
+ abortController.abort();
128
+ else
129
+ opts.signal.addEventListener("abort", () => abortController.abort(), { once: true });
130
+ }
131
+ let result = "";
132
+ let sdkSessionId;
133
+ const q = query({
134
+ prompt: effectivePrompt,
135
+ options: {
136
+ model,
137
+ systemPrompt,
138
+ allowedTools: [...BUILTIN_TOOLS],
139
+ ...(disallowedTools && { disallowedTools }),
140
+ mcpServers: { camelagi: mcpServer, ...(opts?.mcpServers ?? {}) },
141
+ maxTurns: opts?.maxTurns ?? DEFAULT_MAX_TURNS,
142
+ permissionMode: "bypassPermissions",
143
+ allowDangerouslySkipPermissions: true,
144
+ cwd: process.cwd(),
145
+ env: { ANTHROPIC_API_KEY: apiKey },
146
+ thinking,
147
+ ...(opts?.effort && { effort: opts.effort }),
148
+ ...(opts?.maxBudgetUsd && { maxBudgetUsd: opts.maxBudgetUsd }),
149
+ ...(opts?.resumeSessionId && { resume: opts.resumeSessionId }),
150
+ ...(abortController && { abortController }),
151
+ includePartialMessages: !!emit,
152
+ settingSources: ["project"],
153
+ hooks: {
154
+ PreToolUse: [{ matcher: ".*", hooks: [preToolHook] }],
155
+ PostToolUse: [{ matcher: ".*", hooks: [postToolHook] }],
156
+ },
157
+ },
158
+ });
159
+ for await (const message of q) {
160
+ if (message.type === "result") {
161
+ const resultMsg = message;
162
+ result = resultMsg.result;
163
+ sdkSessionId = resultMsg.session_id;
164
+ if (resultMsg.usage && emit) {
165
+ emit({ type: "usage", inputTokens: resultMsg.usage.input_tokens ?? 0, outputTokens: resultMsg.usage.output_tokens ?? 0, cacheReadTokens: resultMsg.usage.cache_read_input_tokens, cacheWriteTokens: resultMsg.usage.cache_creation_input_tokens });
166
+ }
167
+ if (resultMsg.usage && opts?.sessionId) {
168
+ recordUsage(opts.sessionId, { inputTokens: resultMsg.usage.input_tokens ?? 0, outputTokens: resultMsg.usage.output_tokens ?? 0, cacheReadTokens: resultMsg.usage.cache_read_input_tokens ?? 0, cacheWriteTokens: resultMsg.usage.cache_creation_input_tokens ?? 0 });
169
+ }
170
+ emit?.({ type: "chunk", text: result });
171
+ }
172
+ else if (message.type === "system" && emit) {
173
+ const sysMsg = message;
174
+ if (sysMsg.subtype === "init" && sysMsg.session_id) {
175
+ sdkSessionId = sysMsg.session_id;
176
+ emit({ type: "init", sessionId: sysMsg.session_id });
177
+ }
178
+ else if (sysMsg.subtype === "task_started") {
179
+ emit({ type: "subagent_start", agentId: sysMsg.agent_id ?? "subagent", taskId: sysMsg.task_id });
180
+ }
181
+ else if (sysMsg.subtype === "task_progress") {
182
+ emit({ type: "subagent_progress", agentId: sysMsg.agent_id ?? "subagent", toolCount: sysMsg.tool_count, duration: sysMsg.duration_ms ? Math.round(sysMsg.duration_ms / 1000) : undefined });
183
+ }
184
+ else if (sysMsg.subtype === "task_notification") {
185
+ emit({ type: "subagent_done", agentId: sysMsg.agent_id ?? "subagent", toolUseId: sysMsg.tool_use_id });
186
+ }
187
+ }
188
+ else if (message.type === "stream_event" && emit) {
189
+ const streamMsg = message;
190
+ const event = streamMsg.event;
191
+ if (event.type === "content_block_start" && event.content_block?.type === "thinking") {
192
+ emit({ type: "thinking", state: "start" });
193
+ }
194
+ else if (event.type === "content_block_delta") {
195
+ if (event.delta?.type === "text_delta" && event.delta.text)
196
+ emit({ type: "stream_text", text: event.delta.text });
197
+ else if (event.delta?.type === "thinking_delta" && event.delta.thinking)
198
+ emit({ type: "thinking_delta", text: event.delta.thinking });
199
+ }
200
+ else if (event.type === "content_block_stop") {
201
+ emit({ type: "thinking", state: "end" });
202
+ }
203
+ }
204
+ }
205
+ const userMsg = { role: "user", content: userMessage };
206
+ const aiMsg = { role: "assistant", content: result };
207
+ return { response: result, newMessages: [userMsg, aiMsg], usage: null, sessionId: sdkSessionId };
208
+ }
209
+ //# sourceMappingURL=agent-sdk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-sdk.js","sourceRoot":"","sources":["../../src/agent/agent-sdk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ // Generic adapter: converts a ToolDef into Claude Agent SDK or OpenAI tool format
2
+ import { tool } from "@anthropic-ai/claude-agent-sdk";
3
+ /**
4
+ * Adapt an CamelAGI ToolDef to a Claude Agent SDK tool.
5
+ * The schema's `.shape` is passed directly — Zod shapes are compatible
6
+ * with the SDK's parameter definition format.
7
+ */
8
+ export function adaptToolDef(def) {
9
+ return tool(def.name, def.description, def.schema.shape, async (args) => {
10
+ const result = await def.execute(args);
11
+ return { content: [{ type: "text", text: result }] };
12
+ });
13
+ }
14
+ /**
15
+ * Adapt an CamelAGI ToolDef to OpenAI's function-calling format.
16
+ * Uses Zod 4's native .toJSONSchema() for reliable conversion.
17
+ */
18
+ export function adaptToolDefToOpenAI(def) {
19
+ const jsonSchema = def.schema.toJSONSchema();
20
+ // Remove $schema key — OpenAI doesn't want it in parameters
21
+ delete jsonSchema.$schema;
22
+ return {
23
+ type: "function",
24
+ function: {
25
+ name: def.name,
26
+ description: def.description,
27
+ parameters: jsonSchema,
28
+ },
29
+ };
30
+ }
31
+ //# sourceMappingURL=tool-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-adapter.js","sourceRoot":"","sources":["../../src/agent/tool-adapter.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAElF,OAAO,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAatD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,IAAI,CACT,GAAG,CAAC,IAAI,EACR,GAAG,CAAC,WAAW,EACf,GAAG,CAAC,MAAM,CAAC,KAAK,EAChB,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAA+B,CAAC,CAAC;QAClE,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC,CACF,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,MAAM,UAAU,GAAG,GAAG,CAAC,MAAM,CAAC,YAAY,EAA6B,CAAC;IACxE,4DAA4D;IAC5D,OAAO,UAAU,CAAC,OAAO,CAAC;IAE1B,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE;YACR,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,WAAW,EAAE,GAAG,CAAC,WAAW;YAC5B,UAAU,EAAE,UAAU;SACvB;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Agent types — shared between SDK and OpenAI paths
2
+ export {};
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent/types.ts"],"names":[],"mappings":"AAAA,oDAAoD"}
package/dist/agent.js ADDED
@@ -0,0 +1,17 @@
1
+ // Agent: routes all models through Claude Agent SDK
2
+ // This is a barrel that re-exports types and the main entry point.
3
+ import { runHooks } from "./extensions/hooks.js";
4
+ import { runAgentSdk } from "./agent/agent-sdk.js";
5
+ // Clear CLAUDECODE env var to prevent "nested session" error
6
+ delete process.env.CLAUDECODE;
7
+ export async function runAgent(apiKey, model, systemPrompt, history, userMessage, opts) {
8
+ if (opts?.hooksEnabled) {
9
+ await runHooks("before_prompt", { sessionId: opts.sessionId, message: userMessage });
10
+ }
11
+ const result = await runAgentSdk(apiKey, model, systemPrompt, history, userMessage, opts);
12
+ if (opts?.hooksEnabled) {
13
+ await runHooks("after_response", { sessionId: opts.sessionId, response: result.response });
14
+ }
15
+ return result;
16
+ }
17
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"AAAA,oDAAoD;AACpD,mEAAmE;AAEnE,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AAMnD,6DAA6D;AAC7D,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC;AAE9B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAc,EACd,KAAa,EACb,YAAoB,EACpB,OAAkB,EAClB,WAAmB,EACnB,IAAgB;IAEhB,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,eAAe,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAE1F,IAAI,IAAI,EAAE,YAAY,EAAE,CAAC;QACvB,MAAM,QAAQ,CAAC,gBAAgB,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,42 @@
1
+ // Approval forwarding: send approval requests to Telegram when running headless
2
+ //
3
+ // When a tool call needs approval but there's no interactive channel (HTTP API,
4
+ // cron, boot), forward the request to a configured Telegram chat with inline buttons.
5
+ //
6
+ // Config:
7
+ // approvals:
8
+ // forwardTo: 123456789 # your Telegram user/chat ID
9
+ import { InlineKeyboard } from "grammy";
10
+ // The first active bot is used for forwarding
11
+ let forwardBotRef = null;
12
+ /** Register a bot for forwarding approval requests (called by telegram.ts) */
13
+ export function registerForwardBot(bot) {
14
+ forwardBotRef = bot;
15
+ }
16
+ /** Unregister on shutdown */
17
+ export function unregisterForwardBot() {
18
+ forwardBotRef = null;
19
+ }
20
+ /**
21
+ * Send an approval request to a Telegram chat with inline buttons.
22
+ * Returns true if sent successfully, false if no bot available.
23
+ */
24
+ export async function forwardApproval(approvalId, toolName, preview, forwardTo) {
25
+ if (!forwardBotRef || !forwardTo)
26
+ return false;
27
+ try {
28
+ const keyboard = new InlineKeyboard()
29
+ .text("✅ Allow", `approve:${approvalId}:allow-once`)
30
+ .text("♾️ Always", `approve:${approvalId}:allow-always`)
31
+ .text("❌ Deny", `approve:${approvalId}:deny`);
32
+ await forwardBotRef.api.sendMessage(forwardTo, `🔒 ${toolName}\n${preview}`, {
33
+ reply_markup: keyboard,
34
+ });
35
+ return true;
36
+ }
37
+ catch (err) {
38
+ console.error(` [approval-forward] failed: ${err instanceof Error ? err.message : err}`);
39
+ return false;
40
+ }
41
+ }
42
+ //# sourceMappingURL=approval-forward.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-forward.js","sourceRoot":"","sources":["../src/approval-forward.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,EAAE;AACF,gFAAgF;AAChF,sFAAsF;AACtF,EAAE;AACF,UAAU;AACV,eAAe;AACf,0DAA0D;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC,8CAA8C;AAC9C,IAAI,aAAa,GAAe,IAAI,CAAC;AAErC,8EAA8E;AAC9E,MAAM,UAAU,kBAAkB,CAAC,GAAQ;IACzC,aAAa,GAAG,GAAG,CAAC;AACtB,CAAC;AAED,6BAA6B;AAC7B,MAAM,UAAU,oBAAoB;IAClC,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,QAAgB,EAChB,OAAe,EACf,SAAiB;IAEjB,IAAI,CAAC,aAAa,IAAI,CAAC,SAAS;QAAE,OAAO,KAAK,CAAC;IAE/C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE;aAClC,IAAI,CAAC,SAAS,EAAE,WAAW,UAAU,aAAa,CAAC;aACnD,IAAI,CAAC,WAAW,EAAE,WAAW,UAAU,eAAe,CAAC;aACvD,IAAI,CAAC,QAAQ,EAAE,WAAW,UAAU,OAAO,CAAC,CAAC;QAEhD,MAAM,aAAa,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,QAAQ,KAAK,OAAO,EAAE,EAAE;YAC3E,YAAY,EAAE,QAAQ;SACvB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,gCAAgC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAC1F,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,151 @@
1
+ // Approval system: gate dangerous tool calls behind user confirmation
2
+ //
3
+ // Modes:
4
+ // off — bypass all (current default, zero friction)
5
+ // smart — auto-approve reads, ask for writes/exec
6
+ // always — ask for every tool call
7
+ //
8
+ // Flow:
9
+ // PreToolUse hook → checkApproval() → auto or ask
10
+ // If ask: emit approval_request event → waitForDecision() → user responds → submitDecision()
11
+ import { randomUUID } from "node:crypto";
12
+ import { loadConfig, saveConfig } from "./core/config.js";
13
+ // Tools that "smart" mode auto-approves (read-only, no side effects)
14
+ const READ_ONLY_TOOLS = new Set([
15
+ "Read", "Glob", "Grep",
16
+ "WebSearch", "WebFetch",
17
+ "memory_search", "memory_get",
18
+ ]);
19
+ const pending = new Map();
20
+ // --- Allowlist matching ---
21
+ function matchesAllowlist(toolName, args, allowlist) {
22
+ for (const entry of allowlist) {
23
+ const colonIdx = entry.indexOf(":");
24
+ if (colonIdx === -1) {
25
+ // Bare tool name: "Read", "Glob" — matches all calls to that tool
26
+ if (toolName === entry)
27
+ return true;
28
+ continue;
29
+ }
30
+ const entryTool = entry.slice(0, colonIdx);
31
+ const entryPattern = entry.slice(colonIdx + 1);
32
+ if (entryTool !== toolName)
33
+ continue;
34
+ // For Bash, match against the command string
35
+ if (toolName === "Bash") {
36
+ const cmd = String(args.command ?? "");
37
+ if (globMatch(entryPattern, cmd))
38
+ return true;
39
+ }
40
+ // For Write/Edit, match file path
41
+ else if (toolName === "Write" || toolName === "Edit") {
42
+ const filePath = String(args.file_path ?? "");
43
+ if (globMatch(entryPattern, filePath))
44
+ return true;
45
+ }
46
+ // For apply_patch, match if the pattern is "*" (blanket allow)
47
+ else if (toolName === "apply_patch") {
48
+ if (entryPattern === "*")
49
+ return true;
50
+ }
51
+ }
52
+ return false;
53
+ }
54
+ /** Simple glob matching — supports * as wildcard */
55
+ function globMatch(pattern, text) {
56
+ const escaped = pattern.replace(/[.+^${}()|[\]\\]/g, "\\$&").replace(/\*/g, ".*");
57
+ return new RegExp("^" + escaped + "$").test(text);
58
+ }
59
+ // --- Preview builder ---
60
+ function buildPreview(toolName, args) {
61
+ if (toolName === "Bash")
62
+ return String(args.command ?? "").slice(0, 200);
63
+ if (toolName === "Write")
64
+ return `write → ${args.file_path ?? "?"}`;
65
+ if (toolName === "Edit")
66
+ return `edit → ${args.file_path ?? "?"}`;
67
+ if (toolName === "Agent")
68
+ return `spawn agent: ${String(args.prompt ?? "").slice(0, 100)}`;
69
+ if (toolName === "apply_patch")
70
+ return `patch (${String(args.patch ?? "").split("\n").length} lines)`;
71
+ return `${toolName}(${JSON.stringify(args).slice(0, 120)})`;
72
+ }
73
+ // --- Public API ---
74
+ /**
75
+ * Check if a tool call needs approval.
76
+ * Returns null if auto-approved, or an ApprovalRequest if the user must decide.
77
+ */
78
+ export function checkApproval(toolName, args, mode, allowlist) {
79
+ if (mode === "off")
80
+ return null;
81
+ if (matchesAllowlist(toolName, args, allowlist))
82
+ return null;
83
+ if (mode === "smart" && READ_ONLY_TOOLS.has(toolName))
84
+ return null;
85
+ return {
86
+ id: randomUUID(),
87
+ toolName,
88
+ args,
89
+ preview: buildPreview(toolName, args),
90
+ };
91
+ }
92
+ /**
93
+ * Wait for a user's decision on a pending approval.
94
+ * Resolves when submitDecision() is called, or on timeout.
95
+ */
96
+ export function waitForDecision(id, timeoutMs, fallback) {
97
+ return new Promise((resolve) => {
98
+ const timer = setTimeout(() => {
99
+ pending.delete(id);
100
+ resolve(fallback === "allow" ? "allow-once" : "deny");
101
+ }, timeoutMs);
102
+ pending.set(id, { resolve, timer });
103
+ });
104
+ }
105
+ /**
106
+ * Submit a user's decision for a pending approval.
107
+ * Returns true if the approval was found and resolved.
108
+ */
109
+ export function submitDecision(id, decision) {
110
+ const p = pending.get(id);
111
+ if (!p)
112
+ return false;
113
+ clearTimeout(p.timer);
114
+ pending.delete(id);
115
+ p.resolve(decision);
116
+ return true;
117
+ }
118
+ /**
119
+ * Add a pattern to the persistent allowlist based on tool + args.
120
+ * For Bash: adds "Bash:baseCommand *" (e.g. "Bash:git *")
121
+ * For Write/Edit: adds the exact file path
122
+ * For others: adds the bare tool name
123
+ */
124
+ export function addToAllowlist(toolName, args) {
125
+ const config = loadConfig();
126
+ const current = [...(config.approvals.allowlist ?? [])];
127
+ let entry;
128
+ if (toolName === "Bash") {
129
+ const cmd = String(args.command ?? "").trim();
130
+ const baseCmd = cmd.split(/[\s|;&]/)[0]; // first word before space/pipe/chain
131
+ entry = baseCmd ? `Bash:${baseCmd} *` : "Bash";
132
+ }
133
+ else if (toolName === "Write" || toolName === "Edit") {
134
+ const filePath = String(args.file_path ?? "");
135
+ entry = filePath ? `${toolName}:${filePath}` : toolName;
136
+ }
137
+ else {
138
+ entry = toolName;
139
+ }
140
+ if (!current.includes(entry)) {
141
+ current.push(entry);
142
+ saveConfig({
143
+ approvals: { ...config.approvals, allowlist: current },
144
+ });
145
+ }
146
+ }
147
+ /** Get count of pending approvals (for status display). */
148
+ export function pendingCount() {
149
+ return pending.size;
150
+ }
151
+ //# sourceMappingURL=approvals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approvals.js","sourceRoot":"","sources":["../src/approvals.ts"],"names":[],"mappings":"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"}
package/dist/boot.js ADDED
@@ -0,0 +1,34 @@
1
+ // BOOT.md: run startup script on gateway launch
2
+ import fs from "node:fs";
3
+ import path from "node:path";
4
+ import { workspacePaths } from "./workspace.js";
5
+ import { runAgent } from "./agent.js";
6
+ import { loadMessages, saveMessage } from "./session.js";
7
+ const BOOT_SESSION = "boot";
8
+ export async function runBoot(config, systemPrompt) {
9
+ const bootFile = path.join(workspacePaths.workspaceDir, "BOOT.md");
10
+ if (!fs.existsSync(bootFile))
11
+ return { status: "skipped" };
12
+ const content = fs.readFileSync(bootFile, "utf-8").trim();
13
+ if (!content)
14
+ return { status: "skipped" };
15
+ try {
16
+ const history = loadMessages(BOOT_SESSION);
17
+ const result = await runAgent(config.apiKey, config.model, systemPrompt, history, content, {
18
+ maxTurns: 10,
19
+ timeoutMs: 60_000,
20
+ sessionId: BOOT_SESSION,
21
+ provider: config.provider,
22
+ baseUrl: config.baseUrl,
23
+ });
24
+ saveMessage(BOOT_SESSION, { role: "user", content }, "boot");
25
+ if (result.response) {
26
+ saveMessage(BOOT_SESSION, { role: "assistant", content: result.response }, "boot");
27
+ }
28
+ return { status: "ran", response: result.response };
29
+ }
30
+ catch (err) {
31
+ return { status: "failed", error: err instanceof Error ? err.message : String(err) };
32
+ }
33
+ }
34
+ //# sourceMappingURL=boot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAEhD,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEzD,MAAM,YAAY,GAAG,MAAM,CAAC;AAQ5B,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAc,EACd,YAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;IAEnE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE3D,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1D,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC,MAAO,EAAE,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;YAC1F,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,MAAM;YACjB,SAAS,EAAE,YAAY;YACvB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QAEH,WAAW,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACpB,WAAW,CAAC,YAAY,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;QACrF,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACtD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACvF,CAAC;AACH,CAAC"}