larkcc 0.1.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.
package/dist/agent.js ADDED
@@ -0,0 +1,177 @@
1
+ import { query } from "@anthropic-ai/claude-agent-sdk";
2
+ import os from "os";
3
+ import { execSync } from "child_process";
4
+ import { replyFinalCard, sendToolCard, updateToolCard, } from "./feishu.js";
5
+ import { getSession, setSession } from "./session.js";
6
+ import { logger } from "./logger.js";
7
+ const TOOL_LABELS = {
8
+ Read: "📂 读取文件",
9
+ Write: "✏️ 写入文件",
10
+ Edit: "✏️ 编辑文件",
11
+ Bash: "⚡ 执行命令",
12
+ Glob: "🔍 查找文件",
13
+ Grep: "🔎 搜索内容",
14
+ LS: "📁 列出目录",
15
+ ExitPlanMode: "📋 退出计划模式",
16
+ AskUserQuestion: "💬 提问",
17
+ };
18
+ const SILENT_TOOLS = new Set(["ExitPlanMode", "TodoWrite", "TodoRead"]);
19
+ function formatInput(name, input) {
20
+ if (["Read", "Write", "Edit"].includes(name))
21
+ return String(input.file_path ?? input.path ?? "");
22
+ if (name === "Bash")
23
+ return String(input.command ?? "").slice(0, 100);
24
+ if (name === "Grep")
25
+ return `${input.pattern} in ${input.path ?? "."}`;
26
+ if (name === "LS")
27
+ return String(input.path ?? ".");
28
+ if (name === "Glob")
29
+ return String(input.pattern ?? "");
30
+ return JSON.stringify(input).slice(0, 100);
31
+ }
32
+ function truncate(str, len) {
33
+ return str.length > len ? str.slice(0, len) + "..." : str;
34
+ }
35
+ export async function runAgent(prompt, cwd, config, client, chatId, rootMsgId, images, abortSignal, // 可选中断信号
36
+ profile // 机器人配置名
37
+ ) {
38
+ const sessionId = getSession();
39
+ let textBuffer = "";
40
+ const toolMsgMap = new Map();
41
+ // 构建 prompt content(支持图片)
42
+ const promptContent = [];
43
+ if (images && images.length > 0) {
44
+ for (const img of images) {
45
+ promptContent.push({
46
+ type: "image",
47
+ source: { type: "base64", media_type: img.mediaType, data: img.base64 },
48
+ });
49
+ }
50
+ }
51
+ promptContent.push({ type: "text", text: prompt });
52
+ // 如果有图片,使用 AsyncIterable<SDKUserMessage> 格式
53
+ // 否则使用普通字符串
54
+ const hasImages = images && images.length > 0;
55
+ async function* messageGenerator() {
56
+ yield {
57
+ type: 'user',
58
+ message: {
59
+ role: 'user',
60
+ content: promptContent,
61
+ },
62
+ parent_tool_use_id: null,
63
+ session_id: sessionId || crypto.randomUUID(),
64
+ };
65
+ }
66
+ const queryPrompt = hasImages ? messageGenerator() : prompt;
67
+ try {
68
+ for await (const event of query({
69
+ prompt: queryPrompt,
70
+ options: {
71
+ cwd,
72
+ resume: sessionId,
73
+ permissionMode: config.claude.permission_mode,
74
+ allowedTools: config.claude.allowed_tools,
75
+ abortSignal,
76
+ },
77
+ })) {
78
+ // 检查是否已中断
79
+ if (abortSignal?.aborted) {
80
+ logger.info("Agent aborted by user");
81
+ await replyFinalCard(client, chatId, rootMsgId, "⏹ 任务已中断", {
82
+ profile: profile ?? "default",
83
+ cwd,
84
+ sessionId: getSession() ?? "",
85
+ overflow: config.overflow,
86
+ chatId,
87
+ rootMsgId,
88
+ appId: config.feishu.app_id,
89
+ appSecret: config.feishu.app_secret,
90
+ });
91
+ break;
92
+ }
93
+ if (event.type === "assistant") {
94
+ const blocks = event.message.content;
95
+ for (const block of blocks) {
96
+ if (block.type === "text" && block.text) {
97
+ textBuffer += block.text;
98
+ }
99
+ if (block.type === "tool_use" && block.id && block.name) {
100
+ if (SILENT_TOOLS.has(block.name))
101
+ break;
102
+ const label = TOOL_LABELS[block.name] ?? `🔧 ${block.name}`;
103
+ if (block.name === "AskUserQuestion") {
104
+ const input = block.input;
105
+ const questions = input.questions?.map(q => q.question).join("\n") ?? "";
106
+ if (questions)
107
+ await replyFinalCard(client, chatId, rootMsgId, questions, {
108
+ profile: profile ?? "default",
109
+ cwd,
110
+ sessionId: getSession() ?? "",
111
+ overflow: config.overflow,
112
+ chatId,
113
+ rootMsgId,
114
+ appId: config.feishu.app_id,
115
+ appSecret: config.feishu.app_secret,
116
+ });
117
+ break;
118
+ }
119
+ const detail = formatInput(block.name, block.input ?? {});
120
+ logger.tool(block.name, detail);
121
+ const msgId = await sendToolCard(client, chatId, rootMsgId, label, detail, "running");
122
+ toolMsgMap.set(block.id, { msgId, label, detail });
123
+ }
124
+ }
125
+ }
126
+ if (event.type === "user") {
127
+ const blocks = event.message.content;
128
+ for (const block of blocks) {
129
+ if (block.type === "tool_result" && block.tool_use_id) {
130
+ const toolInfo = toolMsgMap.get(block.tool_use_id);
131
+ if (toolInfo) {
132
+ const raw = typeof block.content === "string"
133
+ ? block.content
134
+ : JSON.stringify(block.content ?? "");
135
+ await updateToolCard(client, toolInfo.msgId, toolInfo.label, toolInfo.detail, truncate(raw, 500));
136
+ }
137
+ }
138
+ }
139
+ }
140
+ if (event.type === "result") {
141
+ const resultEvent = event;
142
+ if (resultEvent.session_id) {
143
+ setSession(resultEvent.session_id);
144
+ logger.dim(`session saved: ${resultEvent.session_id}`);
145
+ }
146
+ if (textBuffer) {
147
+ await replyFinalCard(client, chatId, rootMsgId, textBuffer, {
148
+ profile: profile ?? "default",
149
+ cwd,
150
+ sessionId: getSession() ?? "",
151
+ overflow: config.overflow,
152
+ chatId,
153
+ rootMsgId,
154
+ appId: config.feishu.app_id,
155
+ appSecret: config.feishu.app_secret,
156
+ });
157
+ }
158
+ logger.reply(chatId);
159
+ }
160
+ }
161
+ }
162
+ catch (err) {
163
+ console.error(`[query error]:`, err);
164
+ throw err;
165
+ }
166
+ }
167
+ export function ensureEnv() {
168
+ if (!process.env.HOME)
169
+ process.env.HOME = os.homedir();
170
+ try {
171
+ const shellPath = execSync("bash -lc 'echo $PATH' 2>/dev/null", { timeout: 3000 }).toString().trim();
172
+ if (shellPath)
173
+ process.env.PATH = shellPath;
174
+ }
175
+ catch { }
176
+ }
177
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/app.d.ts ADDED
@@ -0,0 +1,14 @@
1
+ import { LarkccConfig } from "./config.js";
2
+ export interface RunningProcess {
3
+ profile: string;
4
+ pid: number;
5
+ cwd: string;
6
+ startedAt: string;
7
+ isContinue: boolean;
8
+ alive: boolean;
9
+ }
10
+ export declare function listRunningProcesses(): {
11
+ processes: RunningProcess[];
12
+ cleaned: string[];
13
+ };
14
+ export declare function startApp(cwd: string, config: LarkccConfig, profile: string | undefined, continueSession?: boolean): Promise<void>;