camelagi 0.5.39 → 0.5.41
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.
- package/README.md +58 -17
- package/dashboard/_next/static/chunks/172-a2787ae03f0db2b4.js +12 -0
- package/dashboard/_next/static/chunks/239-49a9ac3789f8c41c.js +1 -0
- package/dashboard/_next/static/chunks/255-102f2e5b2e3dc2ef.js +1 -0
- package/dashboard/_next/static/chunks/413-89d8e4554f461999.js +1 -0
- package/dashboard/_next/static/chunks/4bd1b696-c023c6e3521b1417.js +1 -0
- package/dashboard/_next/static/chunks/619-ba102abea3e3d0e4.js +1 -0
- package/dashboard/_next/static/chunks/909-aed3aa549e59d0fb.js +1 -0
- package/dashboard/_next/static/chunks/app/_not-found/page-121b856ce9a0ddcd.js +1 -0
- package/dashboard/_next/static/chunks/app/dashboard/agents/page-aa6e6fb2a1df7d63.js +1 -0
- package/dashboard/_next/static/chunks/app/dashboard/chat/page-feeb17fdc08b91e5.js +1 -0
- package/dashboard/_next/static/chunks/app/dashboard/config/page-afad9f4da82a343e.js +1 -0
- package/dashboard/_next/static/chunks/app/dashboard/layout-853ce5dfe3461735.js +1 -0
- package/dashboard/_next/static/chunks/app/dashboard/monitor/page-1b3d112c49b3a383.js +1 -0
- package/dashboard/_next/static/chunks/app/dashboard/page-b15605f3b21f7467.js +1 -0
- package/dashboard/_next/static/chunks/app/dashboard/sessions/page-e11d3f3e6ad99067.js +1 -0
- package/dashboard/_next/static/chunks/app/docs/[slug]/page-baf0632d98082d10.js +1 -0
- package/dashboard/_next/static/chunks/app/docs/page-5933496f46ff00ec.js +1 -0
- package/dashboard/_next/static/chunks/app/download/page-da533b5f543dfd66.js +1 -0
- package/dashboard/_next/static/chunks/app/layout-1112267c08c875b5.js +1 -0
- package/dashboard/_next/static/chunks/app/page-d69c17b39431e2c5.js +1 -0
- package/dashboard/_next/static/chunks/framework-de98b93a850cfc71.js +1 -0
- package/dashboard/_next/static/chunks/main-8d9a106db393efcf.js +1 -0
- package/dashboard/_next/static/chunks/main-app-e38cb42677e65e59.js +1 -0
- package/dashboard/_next/static/chunks/pages/_app-7d307437aca18ad4.js +1 -0
- package/dashboard/_next/static/chunks/pages/_error-cb2a52f75f2162e2.js +1 -0
- package/dashboard/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/dashboard/_next/static/chunks/webpack-b2507a6fba7be451.js +1 -0
- package/dashboard/_next/static/css/c60b60dc84892a8b.css +5 -0
- package/dashboard/_next/static/css/d4ea3c83e49eb5e1.css +4 -0
- package/dashboard/_next/static/jjqY4ybx1hNTX-bnJfS2f/_buildManifest.js +1 -0
- package/dashboard/_next/static/jjqY4ybx1hNTX-bnJfS2f/_ssgManifest.js +1 -0
- package/dashboard/_next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/dashboard/_next/static/media/4da3161b738b07dd-s.woff2 +0 -0
- package/dashboard/_next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/dashboard/_next/static/media/af4bf8399d1aacdf-s.p.woff2 +0 -0
- package/dashboard/_next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- package/dashboard/_next/static/media/fb526027db1fc1ae-s.woff2 +0 -0
- package/dashboard/agents/index.html +1 -0
- package/dashboard/agents/index.txt +28 -0
- package/dashboard/chat/index.html +1 -0
- package/dashboard/chat/index.txt +28 -0
- package/dashboard/config/index.html +1 -0
- package/dashboard/config/index.txt +28 -0
- package/dashboard/index.html +1 -0
- package/dashboard/index.txt +28 -0
- package/dashboard/monitor/index.html +1 -0
- package/dashboard/monitor/index.txt +28 -0
- package/dashboard/sessions/index.html +1 -0
- package/dashboard/sessions/index.txt +28 -0
- package/dist/agent/agent-sdk.js +66 -56
- package/dist/agent/agent-sdk.js.map +1 -1
- package/dist/bootstrap.js +1 -1
- package/dist/bootstrap.js.map +1 -1
- package/dist/cli/cmd-config.js +1 -1
- package/dist/cli/cmd-config.js.map +1 -1
- package/dist/cli/cmd-pairing.js +1 -1
- package/dist/cli/cmd-pairing.js.map +1 -1
- package/dist/core/config.js +29 -48
- package/dist/core/config.js.map +1 -1
- package/dist/core/constants.js +2 -0
- package/dist/core/constants.js.map +1 -1
- package/dist/core/version.js +1 -1
- package/dist/extensions/bot-approval.js +63 -0
- package/dist/extensions/bot-approval.js.map +1 -0
- package/dist/extensions/pairing.js +138 -0
- package/dist/extensions/pairing.js.map +1 -0
- package/dist/gateway/csrf.js +1 -1
- package/dist/gateway/csrf.js.map +1 -1
- package/dist/gateway/routes.js +31 -92
- package/dist/gateway/routes.js.map +1 -1
- package/dist/gateway/ws-handler.js +191 -167
- package/dist/gateway/ws-handler.js.map +1 -1
- package/dist/gateway-entry.js +8 -2
- package/dist/gateway-entry.js.map +1 -1
- package/dist/model.js +5 -4
- package/dist/model.js.map +1 -1
- package/dist/serve.js +20 -3
- package/dist/serve.js.map +1 -1
- package/dist/setup.js +17 -2
- package/dist/setup.js.map +1 -1
- package/dist/telegram/admin-agents.js +498 -0
- package/dist/telegram/admin-agents.js.map +1 -0
- package/dist/telegram/admin-bot.js +13 -934
- package/dist/telegram/admin-bot.js.map +1 -1
- package/dist/telegram/admin-commands.js +403 -0
- package/dist/telegram/admin-commands.js.map +1 -0
- package/dist/telegram/agent-bot.js +45 -1338
- package/dist/telegram/agent-bot.js.map +1 -1
- package/dist/telegram/agent-claude-code.js +555 -0
- package/dist/telegram/agent-claude-code.js.map +1 -0
- package/dist/telegram/agent-commands.js +396 -0
- package/dist/telegram/agent-commands.js.map +1 -0
- package/dist/telegram/agent-context.js +136 -0
- package/dist/telegram/agent-context.js.map +1 -0
- package/dist/telegram/agent-messages.js +249 -0
- package/dist/telegram/agent-messages.js.map +1 -0
- package/dist/telegram/resolve.js +15 -28
- package/dist/telegram/resolve.js.map +1 -1
- package/dist/telegram/terminal.js +75 -2
- package/dist/telegram/terminal.js.map +1 -1
- package/dist/telegram/wizards.js +1 -1
- package/dist/telegram/wizards.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,555 @@
|
|
|
1
|
+
// Claude Code integration: commands, shortcuts, settings, callbacks, terminal handler
|
|
2
|
+
import { InlineKeyboard } from "grammy";
|
|
3
|
+
import { saveConfig } from "../core/config.js";
|
|
4
|
+
import { log as slog } from "../core/log.js";
|
|
5
|
+
import { setCommandMenu, ccResolveWorkDir, ccPinStatus } from "./agent-context.js";
|
|
6
|
+
import { createDraftStream } from "./draft-stream.js";
|
|
7
|
+
import { stripMention, sendChunked } from "./helpers.js";
|
|
8
|
+
import { startBrowse } from "./dir-browser.js";
|
|
9
|
+
import { detectClaudeCode, startTerminal, endTerminal, hasTerminal, isTerminalBusy, handleTerminalMessage, expandHome, updateWorkDir, getTerminalSessionId, getTerminalWorkDir, getTerminalModel, setTerminalModel, getTerminalSetting, setTerminalSetting, listClaudeSessions, } from "./terminal.js";
|
|
10
|
+
import os from "node:os";
|
|
11
|
+
// ─── Command mode guard ───────────────────────────────────────────────
|
|
12
|
+
const CC_ONLY_COMMANDS = new Set([
|
|
13
|
+
"exit", "review", "fix", "test", "refactor", "security",
|
|
14
|
+
"pr", "commit", "init", "explain", "doc", "cost",
|
|
15
|
+
"prompt", "budget", "adddir", "tools", "worktree", "approvals",
|
|
16
|
+
]);
|
|
17
|
+
const SHARED_COMMANDS = new Set([
|
|
18
|
+
"claudecode", "start", "model", "effort", "workdir", "help",
|
|
19
|
+
]);
|
|
20
|
+
// ─── Shortcut commands (map Telegram commands to prompts) ─────────────
|
|
21
|
+
const CC_SHORTCUTS = {
|
|
22
|
+
"/review": (args) => args
|
|
23
|
+
? `Review this code and provide feedback: ${args}`
|
|
24
|
+
: "Review all the code changes in the current working directory. Look at git diff if available, otherwise review the main files. Provide actionable feedback on bugs, improvements, and best practices.",
|
|
25
|
+
"/init": "Create a CLAUDE.md file for this project. Analyze the codebase structure, tech stack, build commands, and key patterns. Write a concise CLAUDE.md that helps future Claude Code sessions understand this project.",
|
|
26
|
+
"/fix": (args) => args
|
|
27
|
+
? `Find and fix this issue: ${args}`
|
|
28
|
+
: "Look at the code in the current directory. Find any bugs, errors, or issues and fix them.",
|
|
29
|
+
"/test": (args) => args
|
|
30
|
+
? `Write tests for: ${args}`
|
|
31
|
+
: "Look at the code in the current directory and write or run the appropriate tests.",
|
|
32
|
+
"/explain": (args) => args
|
|
33
|
+
? `Explain this: ${args}`
|
|
34
|
+
: "Explain the architecture and key patterns of this codebase. What does it do, how is it structured, and what are the main entry points?",
|
|
35
|
+
"/refactor": (args) => args
|
|
36
|
+
? `Refactor this: ${args}`
|
|
37
|
+
: "Review the code in the current directory and suggest refactoring improvements. Focus on readability, maintainability, and removing duplication.",
|
|
38
|
+
"/security": "Perform a security review of this codebase. Look for common vulnerabilities: injection, XSS, auth issues, hardcoded secrets, insecure dependencies. Report findings with severity and fix suggestions.",
|
|
39
|
+
"/pr": "Look at the current git changes (staged and unstaged). Write a pull request description with a summary of changes, what was changed and why, and any testing notes.",
|
|
40
|
+
"/commit": "Look at the current git changes. Create a well-formatted commit message that describes what changed and why. Then commit the changes.",
|
|
41
|
+
"/doc": (args) => args
|
|
42
|
+
? `Write documentation for: ${args}`
|
|
43
|
+
: "Generate documentation for the key modules in this codebase. Focus on public APIs, configuration options, and usage examples.",
|
|
44
|
+
"/cost": "Show the current Claude Code session cost and token usage.",
|
|
45
|
+
};
|
|
46
|
+
// ─── Settings commands (handled before sending to subprocess) ─────────
|
|
47
|
+
const CC_SETTINGS = {
|
|
48
|
+
"/model": async (gc, args) => {
|
|
49
|
+
const chatId = gc.chat.id;
|
|
50
|
+
if (!hasTerminal(chatId)) {
|
|
51
|
+
await gc.reply("No active Claude Code session.");
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
const models = ["sonnet", "opus", "haiku"];
|
|
55
|
+
if (args && models.includes(args.toLowerCase())) {
|
|
56
|
+
setTerminalModel(chatId, args.toLowerCase());
|
|
57
|
+
await gc.reply(`Model set to: ${args.toLowerCase()}`);
|
|
58
|
+
}
|
|
59
|
+
else if (args) {
|
|
60
|
+
setTerminalModel(chatId, args);
|
|
61
|
+
await gc.reply(`Model set to: ${args}`);
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const current = getTerminalModel(chatId) ?? "default";
|
|
65
|
+
const kb = new InlineKeyboard()
|
|
66
|
+
.text("Sonnet 4.6", "cc:setmodel:claude-sonnet-4-6").text("Opus 4.6", "cc:setmodel:claude-opus-4-6").row()
|
|
67
|
+
.text("Haiku 4.5", "cc:setmodel:claude-haiku-4-5-20251001").row()
|
|
68
|
+
.text("Default", "cc:setmodel:__default__");
|
|
69
|
+
await gc.reply(`Model: ${current}`, { reply_markup: kb });
|
|
70
|
+
}
|
|
71
|
+
return true;
|
|
72
|
+
},
|
|
73
|
+
"/effort": async (gc, args) => {
|
|
74
|
+
const chatId = gc.chat.id;
|
|
75
|
+
if (!hasTerminal(chatId)) {
|
|
76
|
+
await gc.reply("No active Claude Code session.");
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
const levels = ["low", "medium", "high", "max"];
|
|
80
|
+
if (args && levels.includes(args)) {
|
|
81
|
+
setTerminalSetting(chatId, "effort", args);
|
|
82
|
+
await gc.reply(`Effort set to: ${args}`);
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
const current = getTerminalSetting(chatId, "effort") ?? "default";
|
|
86
|
+
const kb = new InlineKeyboard()
|
|
87
|
+
.text("Low", "cc:effort:low").text("Medium", "cc:effort:medium").row()
|
|
88
|
+
.text("High", "cc:effort:high").text("Max", "cc:effort:max");
|
|
89
|
+
await gc.reply(`Effort: ${current}`, { reply_markup: kb });
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
},
|
|
93
|
+
"/prompt": async (gc, args) => {
|
|
94
|
+
const chatId = gc.chat.id;
|
|
95
|
+
if (!hasTerminal(chatId)) {
|
|
96
|
+
await gc.reply("No active Claude Code session.");
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
if (args) {
|
|
100
|
+
setTerminalSetting(chatId, "systemPrompt", args);
|
|
101
|
+
await gc.reply(`System prompt set.`);
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
const current = getTerminalSetting(chatId, "systemPrompt");
|
|
105
|
+
await gc.reply(current ? `Current prompt: ${current}\n\nSend /prompt <text> to change.` : "No custom prompt. Send /prompt <text> to set one.");
|
|
106
|
+
}
|
|
107
|
+
return true;
|
|
108
|
+
},
|
|
109
|
+
"/budget": async (gc, args) => {
|
|
110
|
+
const chatId = gc.chat.id;
|
|
111
|
+
if (!hasTerminal(chatId)) {
|
|
112
|
+
await gc.reply("No active Claude Code session.");
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
const amount = parseFloat(args);
|
|
116
|
+
if (args && !isNaN(amount) && amount > 0) {
|
|
117
|
+
setTerminalSetting(chatId, "maxBudgetUsd", amount);
|
|
118
|
+
await gc.reply(`Budget limit set to: $${amount}`);
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
const current = getTerminalSetting(chatId, "maxBudgetUsd");
|
|
122
|
+
await gc.reply(current ? `Budget: $${current}\n\nSend /budget <amount> to change.` : "No budget limit. Send /budget 5.00 to set one.");
|
|
123
|
+
}
|
|
124
|
+
return true;
|
|
125
|
+
},
|
|
126
|
+
"/adddir": async (gc, args) => {
|
|
127
|
+
const chatId = gc.chat.id;
|
|
128
|
+
if (!hasTerminal(chatId)) {
|
|
129
|
+
await gc.reply("No active Claude Code session.");
|
|
130
|
+
return true;
|
|
131
|
+
}
|
|
132
|
+
if (args) {
|
|
133
|
+
const current = getTerminalSetting(chatId, "addDirs") ?? [];
|
|
134
|
+
setTerminalSetting(chatId, "addDirs", [...current, args]);
|
|
135
|
+
await gc.reply(`Added directory: ${args}`);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
const current = getTerminalSetting(chatId, "addDirs") ?? [];
|
|
139
|
+
await gc.reply(current.length ? `Extra dirs: ${current.join(", ")}\n\nSend /adddir <path> to add more.` : "No extra directories. Send /adddir ~/other-project to add one.");
|
|
140
|
+
}
|
|
141
|
+
return true;
|
|
142
|
+
},
|
|
143
|
+
"/tools": async (gc, _args) => {
|
|
144
|
+
const chatId = gc.chat.id;
|
|
145
|
+
if (!hasTerminal(chatId)) {
|
|
146
|
+
await gc.reply("No active Claude Code session.");
|
|
147
|
+
return true;
|
|
148
|
+
}
|
|
149
|
+
const denied = new Set(getTerminalSetting(chatId, "disallowedTools") ?? []);
|
|
150
|
+
const CC_TOOLS = ["Bash", "Read", "Write", "Edit", "Glob", "Grep", "WebSearch", "WebFetch", "Agent"];
|
|
151
|
+
const kb = new InlineKeyboard();
|
|
152
|
+
for (let i = 0; i < CC_TOOLS.length; i++) {
|
|
153
|
+
const t = CC_TOOLS[i];
|
|
154
|
+
const icon = denied.has(t) ? "🚫" : "✅";
|
|
155
|
+
kb.text(`${icon} ${t}`, `cc:tool:${t}`);
|
|
156
|
+
if ((i + 1) % 3 === 0)
|
|
157
|
+
kb.row();
|
|
158
|
+
}
|
|
159
|
+
kb.row().text("Reset All", "cc:tool:__reset__");
|
|
160
|
+
const status = denied.size ? `Blocked: ${[...denied].join(", ")}` : "All tools enabled";
|
|
161
|
+
await gc.reply(`${status}\n\nTap to toggle:`, { reply_markup: kb });
|
|
162
|
+
return true;
|
|
163
|
+
},
|
|
164
|
+
"/worktree": async (gc, _args) => {
|
|
165
|
+
const chatId = gc.chat.id;
|
|
166
|
+
if (!hasTerminal(chatId)) {
|
|
167
|
+
await gc.reply("No active Claude Code session.");
|
|
168
|
+
return true;
|
|
169
|
+
}
|
|
170
|
+
const current = getTerminalSetting(chatId, "worktree") ?? false;
|
|
171
|
+
setTerminalSetting(chatId, "worktree", !current);
|
|
172
|
+
await gc.reply(`Git worktree: ${!current ? "ON" : "OFF"}`);
|
|
173
|
+
return true;
|
|
174
|
+
},
|
|
175
|
+
"/approvals": async (gc, args) => {
|
|
176
|
+
const chatId = gc.chat.id;
|
|
177
|
+
if (!hasTerminal(chatId)) {
|
|
178
|
+
await gc.reply("No active Claude Code session.");
|
|
179
|
+
return true;
|
|
180
|
+
}
|
|
181
|
+
const modes = ["skip", "acceptEdits"];
|
|
182
|
+
if (args && modes.includes(args)) {
|
|
183
|
+
setTerminalSetting(chatId, "permissionMode", args);
|
|
184
|
+
const label = args === "acceptEdits" ? "Accept Edits" : "Skip All";
|
|
185
|
+
await gc.reply(`Approvals set to: ${label}`);
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
const current = getTerminalSetting(chatId, "permissionMode") ?? "skip";
|
|
189
|
+
const label = current === "acceptEdits" ? "Accept Edits" : "Skip All";
|
|
190
|
+
const kb = new InlineKeyboard()
|
|
191
|
+
.text("Skip All", "cc:setapprovals:skip").text("Accept Edits", "cc:setapprovals:acceptEdits");
|
|
192
|
+
await gc.reply(`Approvals: ${label}`, { reply_markup: kb });
|
|
193
|
+
}
|
|
194
|
+
return true;
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
// ─── Terminal log helper ──────────────────────────────────────────────
|
|
198
|
+
const cclog = (icon, msg) => {
|
|
199
|
+
const time = new Date().toLocaleTimeString("en-GB", { hour12: false });
|
|
200
|
+
console.log(` ${time} ${icon} ${msg}`);
|
|
201
|
+
};
|
|
202
|
+
// ─── Terminal message handler (exported for use by message handlers) ──
|
|
203
|
+
export async function handleTerminalIncoming(ctx, gc) {
|
|
204
|
+
const chatId = gc.chat.id;
|
|
205
|
+
let text = stripMention(gc.message.text, ctx.botInfo.username);
|
|
206
|
+
if (!text)
|
|
207
|
+
return;
|
|
208
|
+
const firstWord = text.split(/\s+/)[0].toLowerCase();
|
|
209
|
+
const settingHandler = CC_SETTINGS[firstWord];
|
|
210
|
+
if (settingHandler) {
|
|
211
|
+
const args = text.slice(firstWord.length).trim();
|
|
212
|
+
await settingHandler(gc, args);
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
const shortcut = CC_SHORTCUTS[firstWord];
|
|
216
|
+
if (shortcut) {
|
|
217
|
+
const args = text.slice(firstWord.length).trim();
|
|
218
|
+
text = typeof shortcut === "function" ? shortcut(args) : shortcut;
|
|
219
|
+
}
|
|
220
|
+
if (isTerminalBusy(chatId)) {
|
|
221
|
+
await gc.reply("Claude Code is busy. Wait for the current response.");
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
const who = gc.from?.username ? `@${gc.from.username}` : gc.from?.first_name ?? "user";
|
|
225
|
+
cclog("→", `[${who}] ${text.slice(0, 120)}`);
|
|
226
|
+
const draft = createDraftStream(chatId, gc.api);
|
|
227
|
+
let pendingText = "";
|
|
228
|
+
const setReaction = async (emoji) => {
|
|
229
|
+
try {
|
|
230
|
+
const reactions = emoji ? [{ type: "emoji", emoji: emoji }] : [];
|
|
231
|
+
await gc.api.setMessageReaction(chatId, gc.message.message_id, reactions);
|
|
232
|
+
}
|
|
233
|
+
catch { }
|
|
234
|
+
};
|
|
235
|
+
try {
|
|
236
|
+
await setReaction("eyes");
|
|
237
|
+
await gc.replyWithChatAction("typing");
|
|
238
|
+
const typingInterval = setInterval(() => {
|
|
239
|
+
gc.replyWithChatAction("typing").catch(() => { });
|
|
240
|
+
}, 4000);
|
|
241
|
+
let result;
|
|
242
|
+
try {
|
|
243
|
+
result = await handleTerminalMessage(chatId, text, (event) => {
|
|
244
|
+
if (event.type === "text_delta" && event.text) {
|
|
245
|
+
pendingText += event.text;
|
|
246
|
+
draft.update(pendingText);
|
|
247
|
+
}
|
|
248
|
+
else if (event.type === "thinking_start") {
|
|
249
|
+
cclog("..", "Thinking...");
|
|
250
|
+
setReaction("thought_balloon").catch(() => { });
|
|
251
|
+
}
|
|
252
|
+
else if (event.type === "tool_use") {
|
|
253
|
+
cclog("⚡", `Tool: ${event.toolName ?? "unknown"}`);
|
|
254
|
+
setReaction("wrench").catch(() => { });
|
|
255
|
+
}
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
finally {
|
|
259
|
+
clearInterval(typingInterval);
|
|
260
|
+
}
|
|
261
|
+
const response = pendingText || result.response || "(no response)";
|
|
262
|
+
draft.update(response);
|
|
263
|
+
await draft.flush();
|
|
264
|
+
const streamMsgId = draft.getMessageId();
|
|
265
|
+
if (streamMsgId && response.length > 4096) {
|
|
266
|
+
try {
|
|
267
|
+
await gc.api.deleteMessage(chatId, streamMsgId);
|
|
268
|
+
}
|
|
269
|
+
catch { }
|
|
270
|
+
await sendChunked(gc, response);
|
|
271
|
+
}
|
|
272
|
+
else if (!streamMsgId) {
|
|
273
|
+
await sendChunked(gc, response);
|
|
274
|
+
}
|
|
275
|
+
cclog("←", `[claude] ${response.replace(/\n/g, " ").slice(0, 120)}`);
|
|
276
|
+
await setReaction("");
|
|
277
|
+
}
|
|
278
|
+
catch (err) {
|
|
279
|
+
const errMsg = err instanceof Error ? err.message : String(err);
|
|
280
|
+
cclog("✗", `Error: ${errMsg}`);
|
|
281
|
+
slog.error("terminal", "Claude Code failed", { chatId, error: errMsg });
|
|
282
|
+
const streamMsgId = draft.getMessageId();
|
|
283
|
+
if (streamMsgId) {
|
|
284
|
+
try {
|
|
285
|
+
await gc.api.editMessageText(chatId, streamMsgId, `Error: ${errMsg}`);
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
await gc.reply(`Error: ${errMsg}`);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
await gc.reply(`Error: ${errMsg}`);
|
|
293
|
+
}
|
|
294
|
+
await setReaction("");
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
// ─── Registration ─────────────────────────────────────────────────────
|
|
298
|
+
export function registerClaudeCode(ctx) {
|
|
299
|
+
const { bot: b, ccPaused } = ctx;
|
|
300
|
+
// Command mode guard middleware — must run before all command handlers
|
|
301
|
+
b.on("message", async (gc, next) => {
|
|
302
|
+
const text = gc.message?.text;
|
|
303
|
+
if (!text?.startsWith("/")) {
|
|
304
|
+
await next();
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
const cmd = text.split(/[\s@]/)[0].slice(1).toLowerCase();
|
|
308
|
+
if (SHARED_COMMANDS.has(cmd)) {
|
|
309
|
+
await next();
|
|
310
|
+
return;
|
|
311
|
+
}
|
|
312
|
+
const inCC = hasTerminal(gc.chat.id);
|
|
313
|
+
if (inCC && !CC_ONLY_COMMANDS.has(cmd)) {
|
|
314
|
+
await gc.reply("Exit Claude Code first (/exit), then use this command.");
|
|
315
|
+
return;
|
|
316
|
+
}
|
|
317
|
+
if (!inCC && CC_ONLY_COMMANDS.has(cmd)) {
|
|
318
|
+
await gc.reply("Start Claude Code first (/claudecode).");
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
await next();
|
|
322
|
+
});
|
|
323
|
+
// ─── /claudecode command ──────────────────────────────────────────
|
|
324
|
+
b.command("claudecode", async (gc) => {
|
|
325
|
+
const detection = detectClaudeCode();
|
|
326
|
+
if (!detection.found) {
|
|
327
|
+
await gc.reply("Claude Code not found. Install: npm i -g @anthropic-ai/claude-code");
|
|
328
|
+
return;
|
|
329
|
+
}
|
|
330
|
+
if (hasTerminal(gc.chat.id)) {
|
|
331
|
+
const sessionId = getTerminalSessionId(gc.chat.id) ?? "none";
|
|
332
|
+
const workDir = getTerminalWorkDir(gc.chat.id) ?? "?";
|
|
333
|
+
const model = getTerminalModel(gc.chat.id) ?? "default";
|
|
334
|
+
const home = os.homedir();
|
|
335
|
+
const displayDir = workDir.startsWith(home) ? "~" + workDir.slice(home.length) : workDir;
|
|
336
|
+
const effort = getTerminalSetting(gc.chat.id, "effort") ?? "default";
|
|
337
|
+
const budget = getTerminalSetting(gc.chat.id, "maxBudgetUsd");
|
|
338
|
+
const worktree = getTerminalSetting(gc.chat.id, "worktree");
|
|
339
|
+
const approvals = getTerminalSetting(gc.chat.id, "permissionMode") ?? "skip";
|
|
340
|
+
const kb = new InlineKeyboard()
|
|
341
|
+
.text("New Session", "cc:new").text("Stop", "cc:stop").row()
|
|
342
|
+
.text("Model", "cc:model").text("Effort", "cc:effortmenu").row()
|
|
343
|
+
.text("Approvals", "cc:approvalsmenu").text("Sessions", "cc:sessions").row()
|
|
344
|
+
.text("Work Dir", "cc:workdir");
|
|
345
|
+
const approvalsLabel = approvals === "acceptEdits" ? "Accept Edits" : "Skip All";
|
|
346
|
+
const lines = [
|
|
347
|
+
`Claude Code active`,
|
|
348
|
+
`Session: ${sessionId.slice(0, 8)}...`,
|
|
349
|
+
`Model: ${model} | Effort: ${effort}`,
|
|
350
|
+
`Approvals: ${approvalsLabel}`,
|
|
351
|
+
`Dir: ${displayDir}`,
|
|
352
|
+
];
|
|
353
|
+
if (budget)
|
|
354
|
+
lines.push(`Budget: $${budget}`);
|
|
355
|
+
if (worktree)
|
|
356
|
+
lines.push(`Worktree: ON`);
|
|
357
|
+
await gc.reply(lines.join("\n"), { reply_markup: kb });
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
const kb = new InlineKeyboard()
|
|
361
|
+
.text("Start", "cc:start").text("Resume Session", "cc:sessions").row()
|
|
362
|
+
.text("Work Dir", "cc:workdir");
|
|
363
|
+
await gc.reply(`Claude Code (${detection.version ?? ""})\nDir: ${ccResolveWorkDir(ctx).replace(os.homedir(), "~")}`, { reply_markup: kb });
|
|
364
|
+
}
|
|
365
|
+
});
|
|
366
|
+
b.command("exit", async (gc) => {
|
|
367
|
+
if (!hasTerminal(gc.chat.id)) {
|
|
368
|
+
await gc.reply("No active Claude Code session.");
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
await ccPinStatus(ctx, gc.chat.id, false);
|
|
372
|
+
endTerminal(gc.chat.id);
|
|
373
|
+
ccPaused.add(gc.chat.id);
|
|
374
|
+
await setCommandMenu(ctx, false, gc.chat.id);
|
|
375
|
+
await gc.reply("Claude Code stopped. Use /claudecode to start again.");
|
|
376
|
+
});
|
|
377
|
+
b.command("workdir", async (gc) => {
|
|
378
|
+
const config = ctx.getConfig();
|
|
379
|
+
const agentConfig = config.agents[ctx.agentId];
|
|
380
|
+
const currentDir = agentConfig?.workDir
|
|
381
|
+
? expandHome(agentConfig.workDir)
|
|
382
|
+
: os.homedir();
|
|
383
|
+
await startBrowse(gc.chat.id, gc.api, currentDir, (selectedDir) => {
|
|
384
|
+
const agents = { ...config.agents };
|
|
385
|
+
agents[ctx.agentId] = { ...agents[ctx.agentId], workDir: selectedDir };
|
|
386
|
+
saveConfig({ agents });
|
|
387
|
+
if (hasTerminal(gc.chat.id)) {
|
|
388
|
+
updateWorkDir(gc.chat.id, selectedDir);
|
|
389
|
+
}
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
// ─── CC callback queries ──────────────────────────────────────────
|
|
393
|
+
b.callbackQuery(/^cc:/, async (gc) => {
|
|
394
|
+
await gc.answerCallbackQuery();
|
|
395
|
+
const action = gc.callbackQuery.data.slice("cc:".length);
|
|
396
|
+
const chatId = gc.chat.id;
|
|
397
|
+
if (action === "start") {
|
|
398
|
+
ccPaused.delete(chatId);
|
|
399
|
+
startTerminal(chatId, ccResolveWorkDir(ctx));
|
|
400
|
+
await setCommandMenu(ctx, true, chatId);
|
|
401
|
+
await ccPinStatus(ctx, chatId, true);
|
|
402
|
+
await gc.editMessageText("Claude Code started. Send messages.");
|
|
403
|
+
}
|
|
404
|
+
else if (action === "stop") {
|
|
405
|
+
await ccPinStatus(ctx, chatId, false);
|
|
406
|
+
endTerminal(chatId);
|
|
407
|
+
ccPaused.add(chatId);
|
|
408
|
+
await setCommandMenu(ctx, false, chatId);
|
|
409
|
+
await gc.editMessageText("Claude Code stopped. Use /claudecode to start again.");
|
|
410
|
+
}
|
|
411
|
+
else if (action === "new") {
|
|
412
|
+
ccPaused.delete(chatId);
|
|
413
|
+
startTerminal(chatId, ccResolveWorkDir(ctx));
|
|
414
|
+
await setCommandMenu(ctx, true, chatId);
|
|
415
|
+
await ccPinStatus(ctx, chatId, true);
|
|
416
|
+
await gc.editMessageText("New Claude Code session started.");
|
|
417
|
+
}
|
|
418
|
+
else if (action === "sessions") {
|
|
419
|
+
const ccSessions = listClaudeSessions(ccResolveWorkDir(ctx));
|
|
420
|
+
if (ccSessions.length === 0) {
|
|
421
|
+
await gc.editMessageText("No previous Claude Code sessions found.");
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
const home = os.homedir();
|
|
425
|
+
const kb = new InlineKeyboard();
|
|
426
|
+
for (const s of ccSessions) {
|
|
427
|
+
const dir = s.cwd ? s.cwd.replace(home, "~") : "";
|
|
428
|
+
const label = s.name ?? `${s.id.slice(0, 8)} ${dir}`;
|
|
429
|
+
kb.text(label, `cc:resume:${s.id}`).row();
|
|
430
|
+
}
|
|
431
|
+
kb.text("⬅ Back", "cc:back");
|
|
432
|
+
await gc.editMessageText("Resume a session:", { reply_markup: kb });
|
|
433
|
+
}
|
|
434
|
+
else if (action === "workdir") {
|
|
435
|
+
const config = ctx.getConfig();
|
|
436
|
+
const agentConfig = config.agents[ctx.agentId];
|
|
437
|
+
const currentDir = agentConfig?.workDir ? expandHome(agentConfig.workDir) : os.homedir();
|
|
438
|
+
await startBrowse(chatId, gc.api, currentDir, (selectedDir) => {
|
|
439
|
+
const agents = { ...config.agents };
|
|
440
|
+
agents[ctx.agentId] = { ...agents[ctx.agentId], workDir: selectedDir };
|
|
441
|
+
saveConfig({ agents });
|
|
442
|
+
if (hasTerminal(chatId)) {
|
|
443
|
+
updateWorkDir(chatId, selectedDir);
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
}
|
|
447
|
+
else if (action === "effortmenu") {
|
|
448
|
+
const current = getTerminalSetting(chatId, "effort") ?? "default";
|
|
449
|
+
const kb = new InlineKeyboard()
|
|
450
|
+
.text("Low", "cc:effort:low").text("Medium", "cc:effort:medium").row()
|
|
451
|
+
.text("High", "cc:effort:high").text("Max", "cc:effort:max").row()
|
|
452
|
+
.text("⬅ Back", "cc:back");
|
|
453
|
+
await gc.editMessageText(`Effort: ${current}\n\nSelect level:`, { reply_markup: kb });
|
|
454
|
+
}
|
|
455
|
+
else if (action === "approvalsmenu") {
|
|
456
|
+
const current = getTerminalSetting(chatId, "permissionMode") ?? "skip";
|
|
457
|
+
const label = current === "acceptEdits" ? "Accept Edits" : "Skip All";
|
|
458
|
+
const kb = new InlineKeyboard()
|
|
459
|
+
.text("Skip All", "cc:setapprovals:skip").text("Accept Edits", "cc:setapprovals:acceptEdits").row()
|
|
460
|
+
.text("⬅ Back", "cc:back");
|
|
461
|
+
await gc.editMessageText(`Approvals: ${label}\n\nSkip All — no checks, everything auto-approved\nAccept Edits — auto-accepts reads/edits, blocks dangerous commands`, { reply_markup: kb });
|
|
462
|
+
}
|
|
463
|
+
else if (action.startsWith("setapprovals:")) {
|
|
464
|
+
const mode = action.slice("setapprovals:".length);
|
|
465
|
+
setTerminalSetting(chatId, "permissionMode", mode);
|
|
466
|
+
const label = mode === "acceptEdits" ? "Accept Edits" : "Skip All";
|
|
467
|
+
await gc.editMessageText(`Approvals set to: ${label}`);
|
|
468
|
+
}
|
|
469
|
+
else if (action.startsWith("tool:")) {
|
|
470
|
+
const tool = action.slice("tool:".length);
|
|
471
|
+
const CC_TOOLS = ["Bash", "Read", "Write", "Edit", "Glob", "Grep", "WebSearch", "WebFetch", "Agent"];
|
|
472
|
+
if (tool === "__reset__") {
|
|
473
|
+
setTerminalSetting(chatId, "disallowedTools", undefined);
|
|
474
|
+
setTerminalSetting(chatId, "allowedTools", undefined);
|
|
475
|
+
const kb = new InlineKeyboard();
|
|
476
|
+
for (let i = 0; i < CC_TOOLS.length; i++) {
|
|
477
|
+
kb.text(`✅ ${CC_TOOLS[i]}`, `cc:tool:${CC_TOOLS[i]}`);
|
|
478
|
+
if ((i + 1) % 3 === 0)
|
|
479
|
+
kb.row();
|
|
480
|
+
}
|
|
481
|
+
kb.row().text("Reset All", "cc:tool:__reset__");
|
|
482
|
+
await gc.editMessageText("All tools enabled\n\nTap to toggle:", { reply_markup: kb });
|
|
483
|
+
}
|
|
484
|
+
else {
|
|
485
|
+
const denied = new Set(getTerminalSetting(chatId, "disallowedTools") ?? []);
|
|
486
|
+
if (denied.has(tool))
|
|
487
|
+
denied.delete(tool);
|
|
488
|
+
else
|
|
489
|
+
denied.add(tool);
|
|
490
|
+
setTerminalSetting(chatId, "disallowedTools", denied.size ? [...denied] : undefined);
|
|
491
|
+
const kb = new InlineKeyboard();
|
|
492
|
+
for (let i = 0; i < CC_TOOLS.length; i++) {
|
|
493
|
+
const t = CC_TOOLS[i];
|
|
494
|
+
const icon = denied.has(t) ? "🚫" : "✅";
|
|
495
|
+
kb.text(`${icon} ${t}`, `cc:tool:${t}`);
|
|
496
|
+
if ((i + 1) % 3 === 0)
|
|
497
|
+
kb.row();
|
|
498
|
+
}
|
|
499
|
+
kb.row().text("Reset All", "cc:tool:__reset__");
|
|
500
|
+
const status = denied.size ? `Blocked: ${[...denied].join(", ")}` : "All tools enabled";
|
|
501
|
+
await gc.editMessageText(`${status}\n\nTap to toggle:`, { reply_markup: kb });
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
else if (action === "model") {
|
|
505
|
+
const current = getTerminalModel(chatId) ?? "default";
|
|
506
|
+
const kb = new InlineKeyboard()
|
|
507
|
+
.text("Sonnet 4.6", "cc:setmodel:claude-sonnet-4-6").text("Opus 4.6", "cc:setmodel:claude-opus-4-6").row()
|
|
508
|
+
.text("Haiku 4.5", "cc:setmodel:claude-haiku-4-5-20251001").row()
|
|
509
|
+
.text("Default", "cc:setmodel:__default__").row()
|
|
510
|
+
.text("⬅ Back", "cc:back");
|
|
511
|
+
await gc.editMessageText(`Current model: ${current}\n\nSelect model:`, { reply_markup: kb });
|
|
512
|
+
}
|
|
513
|
+
else if (action.startsWith("setmodel:")) {
|
|
514
|
+
const model = action.slice("setmodel:".length);
|
|
515
|
+
if (model === "__default__") {
|
|
516
|
+
setTerminalModel(chatId, undefined);
|
|
517
|
+
await gc.editMessageText("Model reset to default.");
|
|
518
|
+
}
|
|
519
|
+
else {
|
|
520
|
+
setTerminalModel(chatId, model);
|
|
521
|
+
await gc.editMessageText(`Model set to: ${model}`);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
else if (action.startsWith("effort:")) {
|
|
525
|
+
const level = action.slice("effort:".length);
|
|
526
|
+
setTerminalSetting(chatId, "effort", level);
|
|
527
|
+
await gc.editMessageText(`Effort set to: ${level}`);
|
|
528
|
+
}
|
|
529
|
+
else if (action === "back") {
|
|
530
|
+
if (hasTerminal(chatId)) {
|
|
531
|
+
const model = getTerminalModel(chatId) ?? "default";
|
|
532
|
+
const kb = new InlineKeyboard()
|
|
533
|
+
.text("New Session", "cc:new").text("Stop", "cc:stop").row()
|
|
534
|
+
.text("Model", "cc:model").text("Sessions", "cc:sessions").row()
|
|
535
|
+
.text("Work Dir", "cc:workdir");
|
|
536
|
+
await gc.editMessageText(`Claude Code active (${model})`, { reply_markup: kb });
|
|
537
|
+
}
|
|
538
|
+
else {
|
|
539
|
+
const kb = new InlineKeyboard()
|
|
540
|
+
.text("Start", "cc:start").text("Resume Session", "cc:sessions").row()
|
|
541
|
+
.text("Work Dir", "cc:workdir");
|
|
542
|
+
await gc.editMessageText("Claude Code", { reply_markup: kb });
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
else if (action.startsWith("resume:")) {
|
|
546
|
+
const sessionId = action.slice("resume:".length);
|
|
547
|
+
ccPaused.delete(chatId);
|
|
548
|
+
startTerminal(chatId, ccResolveWorkDir(ctx), sessionId);
|
|
549
|
+
await setCommandMenu(ctx, true, chatId);
|
|
550
|
+
await ccPinStatus(ctx, chatId, true);
|
|
551
|
+
await gc.editMessageText(`Resumed session ${sessionId.slice(0, 8)}... Send messages.`);
|
|
552
|
+
}
|
|
553
|
+
});
|
|
554
|
+
}
|
|
555
|
+
//# sourceMappingURL=agent-claude-code.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-claude-code.js","sourceRoot":"","sources":["../../src/telegram/agent-claude-code.ts"],"names":[],"mappings":"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"}
|