cc-channel 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/README.md +213 -0
- package/dist/claude/executor.d.ts +24 -0
- package/dist/claude/executor.d.ts.map +1 -0
- package/dist/claude/executor.js +109 -0
- package/dist/claude/executor.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +63 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/config-cmd.d.ts +2 -0
- package/dist/commands/config-cmd.d.ts.map +1 -0
- package/dist/commands/config-cmd.js +105 -0
- package/dist/commands/config-cmd.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +167 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/logs.d.ts +4 -0
- package/dist/commands/logs.d.ts.map +1 -0
- package/dist/commands/logs.js +29 -0
- package/dist/commands/logs.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +70 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/status.d.ts +2 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +69 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/stop.d.ts +2 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +12 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +32 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon/service.d.ts +42 -0
- package/dist/daemon/service.d.ts.map +1 -0
- package/dist/daemon/service.js +300 -0
- package/dist/daemon/service.js.map +1 -0
- package/dist/daemon.d.ts +7 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +56 -0
- package/dist/daemon.js.map +1 -0
- package/dist/feishu/client.d.ts +38 -0
- package/dist/feishu/client.d.ts.map +1 -0
- package/dist/feishu/client.js +188 -0
- package/dist/feishu/client.js.map +1 -0
- package/dist/feishu/handler.d.ts +23 -0
- package/dist/feishu/handler.d.ts.map +1 -0
- package/dist/feishu/handler.js +225 -0
- package/dist/feishu/handler.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/session/store.d.ts +24 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +135 -0
- package/dist/session/store.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { getFeishuConfig, getClaudeConfig } from "../config.js";
|
|
2
|
+
import { createFeishuClient, createFeishuWSClient, createEventDispatcher, parseMessageContent, replyToMessage, replyWithCard, } from "./client.js";
|
|
3
|
+
import { getOrCreateSession, addMessage, setWorkDir, } from "../session/store.js";
|
|
4
|
+
import { executeClaude, buildPromptWithHistory, checkClaudeAvailable, } from "../claude/executor.js";
|
|
5
|
+
const COMMAND_PREFIX = "/cc";
|
|
6
|
+
// Track recently processed messages to prevent duplicates
|
|
7
|
+
const processedMessages = new Map();
|
|
8
|
+
const MESSAGE_DEDUP_TTL = 60000; // 1 minute
|
|
9
|
+
function isDuplicate(messageId) {
|
|
10
|
+
const now = Date.now();
|
|
11
|
+
const lastProcessed = processedMessages.get(messageId);
|
|
12
|
+
if (lastProcessed && now - lastProcessed < MESSAGE_DEDUP_TTL) {
|
|
13
|
+
return true;
|
|
14
|
+
}
|
|
15
|
+
processedMessages.set(messageId, now);
|
|
16
|
+
// Clean up old entries
|
|
17
|
+
for (const [id, time] of processedMessages) {
|
|
18
|
+
if (now - time > MESSAGE_DEDUP_TTL) {
|
|
19
|
+
processedMessages.delete(id);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Handle incoming Feishu message
|
|
26
|
+
*/
|
|
27
|
+
export async function handleFeishuMessage(event, context) {
|
|
28
|
+
// Debug: log raw event
|
|
29
|
+
console.log("[Debug] Raw event:", JSON.stringify(event, null, 2));
|
|
30
|
+
const messageEvent = parseMessageContent(event);
|
|
31
|
+
if (!messageEvent) {
|
|
32
|
+
console.error("Failed to parse message event");
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
const { messageId, chatId, senderId, content, msgType } = messageEvent;
|
|
36
|
+
// Skip duplicate messages
|
|
37
|
+
if (isDuplicate(messageId)) {
|
|
38
|
+
console.log(`[Skip] Duplicate message: ${messageId}`);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Only handle text messages
|
|
42
|
+
if (msgType !== "text") {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Skip messages from the bot itself
|
|
46
|
+
if (senderId === context.botOpenId) {
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
console.log(`[Message] ${senderId}: ${content}`);
|
|
50
|
+
const trimmedContent = content.trim();
|
|
51
|
+
// Handle commands
|
|
52
|
+
if (trimmedContent.startsWith(COMMAND_PREFIX)) {
|
|
53
|
+
await handleCommand(trimmedContent, messageEvent, context);
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
// Regular message - execute Claude Code
|
|
57
|
+
await handleClaudeRequest(trimmedContent, messageEvent, context);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Handle slash commands
|
|
61
|
+
*/
|
|
62
|
+
async function handleCommand(content, event, context) {
|
|
63
|
+
const args = content.slice(COMMAND_PREFIX.length).trim().split(/\s+/);
|
|
64
|
+
const command = args[0]?.toLowerCase();
|
|
65
|
+
switch (command) {
|
|
66
|
+
case "help":
|
|
67
|
+
await replyWithCard(context.client, event.messageId, `**cc-channel Commands**
|
|
68
|
+
|
|
69
|
+
\`/cc help\` - Show this help
|
|
70
|
+
\`/cc cd <path>\` - Change working directory
|
|
71
|
+
\`/cc pwd\` - Show current directory
|
|
72
|
+
\`/cc clear\` - Clear conversation history
|
|
73
|
+
\`/cc status\` - Show session status
|
|
74
|
+
|
|
75
|
+
Just send any message without prefix to execute with Claude Code!`, "Help");
|
|
76
|
+
break;
|
|
77
|
+
case "cd": {
|
|
78
|
+
const newPath = args.slice(1).join(" ");
|
|
79
|
+
if (!newPath) {
|
|
80
|
+
await replyToMessage(context.client, event.messageId, "Please specify a path: /cc cd <path>");
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const session = getOrCreateSession(event.chatId);
|
|
84
|
+
setWorkDir(session, newPath);
|
|
85
|
+
await replyToMessage(context.client, event.messageId, `Working directory changed to: ${newPath}`);
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
case "pwd": {
|
|
89
|
+
const session = getOrCreateSession(event.chatId);
|
|
90
|
+
await replyToMessage(context.client, event.messageId, `Current directory: ${session.workDir}`);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
case "clear": {
|
|
94
|
+
const session = getOrCreateSession(event.chatId);
|
|
95
|
+
session.messages = [];
|
|
96
|
+
const { saveSession } = await import("../session/store.js");
|
|
97
|
+
saveSession(session);
|
|
98
|
+
await replyToMessage(context.client, event.messageId, "Conversation history cleared. Starting fresh!");
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
case "status": {
|
|
102
|
+
const session = getOrCreateSession(event.chatId);
|
|
103
|
+
const claudeAvailable = await checkClaudeAvailable();
|
|
104
|
+
await replyWithCard(context.client, event.messageId, `**Working Directory:** \`${session.workDir}\`
|
|
105
|
+
**Messages:** ${session.messages.length}
|
|
106
|
+
**Claude CLI:** ${claudeAvailable ? "✅ Available" : "❌ Not found"}
|
|
107
|
+
**Session ID:** \`${session.id}\``, "Session Status");
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
default:
|
|
111
|
+
await replyToMessage(context.client, event.messageId, `Unknown command: ${command}\nType /cc help for available commands.`);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Handle Claude Code execution request
|
|
116
|
+
*/
|
|
117
|
+
async function handleClaudeRequest(prompt, event, context) {
|
|
118
|
+
const config = getClaudeConfig();
|
|
119
|
+
const session = getOrCreateSession(event.chatId, config.defaultWorkDir);
|
|
120
|
+
// Add user message to history
|
|
121
|
+
addMessage(session, "user", prompt);
|
|
122
|
+
// Build prompt with conversation history
|
|
123
|
+
const fullPrompt = buildPromptWithHistory(session, prompt);
|
|
124
|
+
console.log(`[Execute] Running Claude Code in ${session.workDir}...`);
|
|
125
|
+
// Execute Claude Code
|
|
126
|
+
const result = await executeClaude(fullPrompt, {
|
|
127
|
+
workDir: session.workDir,
|
|
128
|
+
timeout: 300000, // 5 minutes default timeout
|
|
129
|
+
});
|
|
130
|
+
if (result.success) {
|
|
131
|
+
// Add assistant response to history
|
|
132
|
+
addMessage(session, "assistant", result.output);
|
|
133
|
+
// Send response (truncate if too long for Feishu)
|
|
134
|
+
const responseText = truncateForFeishu(result.output);
|
|
135
|
+
console.log(`[Execute] Completed in ${result.duration}ms, sending reply...`);
|
|
136
|
+
console.log(`[Debug] Response length: ${responseText.length} chars`);
|
|
137
|
+
try {
|
|
138
|
+
await replyWithCard(context.client, event.messageId, responseText, `✅ Completed (${formatDuration(result.duration)})`);
|
|
139
|
+
console.log(`[Reply] Sent successfully`);
|
|
140
|
+
}
|
|
141
|
+
catch (replyError) {
|
|
142
|
+
console.error(`[Reply] Failed to send:`, replyError);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
const errorText = result.error || result.output || "Unknown error";
|
|
147
|
+
console.error(`[Execute] Failed: ${errorText}`);
|
|
148
|
+
try {
|
|
149
|
+
await replyWithCard(context.client, event.messageId, `❌ **Error**\n\n\`\`\`\n${truncateForFeishu(errorText, 3000)}\n\`\`\``, "Execution Failed");
|
|
150
|
+
console.log(`[Reply] Error message sent successfully`);
|
|
151
|
+
}
|
|
152
|
+
catch (replyError) {
|
|
153
|
+
console.error(`[Reply] Failed to send error message:`, replyError);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Truncate text for Feishu (max ~30KB per message)
|
|
159
|
+
*/
|
|
160
|
+
function truncateForFeishu(text, maxLength = 28000) {
|
|
161
|
+
if (text.length <= maxLength) {
|
|
162
|
+
return text;
|
|
163
|
+
}
|
|
164
|
+
return text.slice(0, maxLength) + "\n\n... (truncated)";
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Format duration in human readable format
|
|
168
|
+
*/
|
|
169
|
+
function formatDuration(ms) {
|
|
170
|
+
if (ms < 1000)
|
|
171
|
+
return `${ms}ms`;
|
|
172
|
+
if (ms < 60000)
|
|
173
|
+
return `${(ms / 1000).toFixed(1)}s`;
|
|
174
|
+
return `${(ms / 60000).toFixed(1)}min`;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Fetch bot open_id for self-message filtering
|
|
178
|
+
*/
|
|
179
|
+
export async function fetchBotOpenId(config) {
|
|
180
|
+
if (!config)
|
|
181
|
+
return undefined;
|
|
182
|
+
try {
|
|
183
|
+
const client = createFeishuClient(config);
|
|
184
|
+
// Use generic request method for bot info API
|
|
185
|
+
const response = await client.request({
|
|
186
|
+
method: "GET",
|
|
187
|
+
url: "/open-apis/bot/v3/info",
|
|
188
|
+
data: {},
|
|
189
|
+
});
|
|
190
|
+
if (response.code === 0) {
|
|
191
|
+
const bot = response.bot ?? response.data?.bot;
|
|
192
|
+
return bot?.open_id;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
catch (err) {
|
|
196
|
+
console.error("Failed to fetch bot info:", err);
|
|
197
|
+
}
|
|
198
|
+
return undefined;
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Create and start the Feishu WebSocket client
|
|
202
|
+
*/
|
|
203
|
+
export async function startFeishuListener(onMessage) {
|
|
204
|
+
const config = getFeishuConfig();
|
|
205
|
+
if (!config) {
|
|
206
|
+
throw new Error("Feishu not configured. Run 'cc-channel init' first.");
|
|
207
|
+
}
|
|
208
|
+
// Fetch bot info
|
|
209
|
+
const botOpenId = await fetchBotOpenId(config);
|
|
210
|
+
console.log(`Bot open_id: ${botOpenId ?? "unknown"}`);
|
|
211
|
+
// Create client and dispatcher
|
|
212
|
+
const client = createFeishuClient(config);
|
|
213
|
+
const wsClient = createFeishuWSClient(config);
|
|
214
|
+
const eventDispatcher = createEventDispatcher(config);
|
|
215
|
+
// Register event handlers
|
|
216
|
+
eventDispatcher.register({
|
|
217
|
+
"im.message.receive_v1": async (data) => {
|
|
218
|
+
await onMessage(data, { client, botOpenId: botOpenId ?? "" });
|
|
219
|
+
},
|
|
220
|
+
});
|
|
221
|
+
// Start WebSocket
|
|
222
|
+
wsClient.start({ eventDispatcher });
|
|
223
|
+
return { wsClient, botOpenId: botOpenId ?? "" };
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/feishu/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { config, getFeishuConfig, setFeishuConfig, isConfigured } from "./config.js";
|
|
2
|
+
export { startFeishuListener, handleFeishuMessage } from "./feishu/handler.js";
|
|
3
|
+
export { executeClaude, checkClaudeAvailable } from "./claude/executor.js";
|
|
4
|
+
export { getDaemonStatus, startDaemon, stopDaemon, installDaemon } from "./daemon/service.js";
|
|
5
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
// cc-channel - Feishu/Lark channel for Claude Code
|
|
2
|
+
export { config, getFeishuConfig, setFeishuConfig, isConfigured } from "./config.js";
|
|
3
|
+
export { startFeishuListener, handleFeishuMessage } from "./feishu/handler.js";
|
|
4
|
+
export { executeClaude, checkClaudeAvailable } from "./claude/executor.js";
|
|
5
|
+
export { getDaemonStatus, startDaemon, stopDaemon, installDaemon } from "./daemon/service.js";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,mDAAmD;AAEnD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AACrF,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC/E,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface Message {
|
|
2
|
+
role: "user" | "assistant";
|
|
3
|
+
content: string;
|
|
4
|
+
timestamp: number;
|
|
5
|
+
}
|
|
6
|
+
export interface Session {
|
|
7
|
+
id: string;
|
|
8
|
+
chatId: string;
|
|
9
|
+
workDir: string;
|
|
10
|
+
messages: Message[];
|
|
11
|
+
createdAt: number;
|
|
12
|
+
updatedAt: number;
|
|
13
|
+
}
|
|
14
|
+
export declare function createSession(chatId: string, workDir: string): Session;
|
|
15
|
+
export declare function getOrCreateSession(chatId: string, workDir?: string): Session;
|
|
16
|
+
export declare function getSession(sessionId: string): Session | null;
|
|
17
|
+
export declare function getSessionByChatId(chatId: string): Session | null;
|
|
18
|
+
export declare function saveSession(session: Session): void;
|
|
19
|
+
export declare function addMessage(session: Session, role: "user" | "assistant", content: string): void;
|
|
20
|
+
export declare function clearSession(sessionId: string): void;
|
|
21
|
+
export declare function clearAllSessions(): void;
|
|
22
|
+
export declare function listSessions(): Session[];
|
|
23
|
+
export declare function setWorkDir(session: Session, workDir: string): void;
|
|
24
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,GAAG,WAAW,CAAC;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,OAAO;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB;AAoBD,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CActE;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAM5E;AAED,wBAAgB,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAc5D;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,GAAG,IAAI,CAcjE;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAYlD;AAED,wBAAgB,UAAU,CACxB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,GAAG,WAAW,EAC1B,OAAO,EAAE,MAAM,GACd,IAAI,CAON;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAepD;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CASvC;AAED,wBAAgB,YAAY,IAAI,OAAO,EAAE,CAyBxC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGlE"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { join } from "path";
|
|
2
|
+
import { mkdirSync, readFileSync, writeFileSync, existsSync, readdirSync, unlinkSync } from "fs";
|
|
3
|
+
import { homedir } from "os";
|
|
4
|
+
import { v4 as uuidv4 } from "uuid";
|
|
5
|
+
const SESSIONS_DIR = join(homedir(), ".cc-channel", "sessions");
|
|
6
|
+
function ensureSessionsDir() {
|
|
7
|
+
if (!existsSync(SESSIONS_DIR)) {
|
|
8
|
+
mkdirSync(SESSIONS_DIR, { recursive: true });
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
function getSessionPath(sessionId) {
|
|
12
|
+
return join(SESSIONS_DIR, `${sessionId}.json`);
|
|
13
|
+
}
|
|
14
|
+
function getChatIndexSessionPath(chatId) {
|
|
15
|
+
// Normalize chatId to be filesystem-safe
|
|
16
|
+
const safeId = chatId.replace(/[^a-zA-Z0-9_-]/g, "_");
|
|
17
|
+
return join(SESSIONS_DIR, `${safeId}.json`);
|
|
18
|
+
}
|
|
19
|
+
export function createSession(chatId, workDir) {
|
|
20
|
+
ensureSessionsDir();
|
|
21
|
+
const session = {
|
|
22
|
+
id: uuidv4(),
|
|
23
|
+
chatId,
|
|
24
|
+
workDir,
|
|
25
|
+
messages: [],
|
|
26
|
+
createdAt: Date.now(),
|
|
27
|
+
updatedAt: Date.now(),
|
|
28
|
+
};
|
|
29
|
+
saveSession(session);
|
|
30
|
+
return session;
|
|
31
|
+
}
|
|
32
|
+
export function getOrCreateSession(chatId, workDir) {
|
|
33
|
+
const existing = getSessionByChatId(chatId);
|
|
34
|
+
if (existing) {
|
|
35
|
+
return existing;
|
|
36
|
+
}
|
|
37
|
+
return createSession(chatId, workDir || homedir());
|
|
38
|
+
}
|
|
39
|
+
export function getSession(sessionId) {
|
|
40
|
+
ensureSessionsDir();
|
|
41
|
+
const path = getSessionPath(sessionId);
|
|
42
|
+
if (!existsSync(path)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
const data = readFileSync(path, "utf-8");
|
|
47
|
+
return JSON.parse(data);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
export function getSessionByChatId(chatId) {
|
|
54
|
+
ensureSessionsDir();
|
|
55
|
+
const path = getChatIndexSessionPath(chatId);
|
|
56
|
+
if (!existsSync(path)) {
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
try {
|
|
60
|
+
const data = readFileSync(path, "utf-8");
|
|
61
|
+
return JSON.parse(data);
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
export function saveSession(session) {
|
|
68
|
+
ensureSessionsDir();
|
|
69
|
+
session.updatedAt = Date.now();
|
|
70
|
+
// Save by session ID
|
|
71
|
+
const sessionPath = getSessionPath(session.id);
|
|
72
|
+
writeFileSync(sessionPath, JSON.stringify(session, null, 2));
|
|
73
|
+
// Also save by chat ID for quick lookup
|
|
74
|
+
const chatPath = getChatIndexSessionPath(session.chatId);
|
|
75
|
+
writeFileSync(chatPath, JSON.stringify(session, null, 2));
|
|
76
|
+
}
|
|
77
|
+
export function addMessage(session, role, content) {
|
|
78
|
+
session.messages.push({
|
|
79
|
+
role,
|
|
80
|
+
content,
|
|
81
|
+
timestamp: Date.now(),
|
|
82
|
+
});
|
|
83
|
+
saveSession(session);
|
|
84
|
+
}
|
|
85
|
+
export function clearSession(sessionId) {
|
|
86
|
+
ensureSessionsDir();
|
|
87
|
+
const session = getSession(sessionId);
|
|
88
|
+
if (session) {
|
|
89
|
+
const sessionPath = getSessionPath(sessionId);
|
|
90
|
+
const chatPath = getChatIndexSessionPath(session.chatId);
|
|
91
|
+
if (existsSync(sessionPath)) {
|
|
92
|
+
unlinkSync(sessionPath);
|
|
93
|
+
}
|
|
94
|
+
if (existsSync(chatPath)) {
|
|
95
|
+
unlinkSync(chatPath);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function clearAllSessions() {
|
|
100
|
+
ensureSessionsDir();
|
|
101
|
+
const files = readdirSync(SESSIONS_DIR);
|
|
102
|
+
for (const file of files) {
|
|
103
|
+
if (file.endsWith(".json")) {
|
|
104
|
+
unlinkSync(join(SESSIONS_DIR, file));
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export function listSessions() {
|
|
109
|
+
ensureSessionsDir();
|
|
110
|
+
const files = readdirSync(SESSIONS_DIR);
|
|
111
|
+
const sessions = [];
|
|
112
|
+
const seen = new Set();
|
|
113
|
+
for (const file of files) {
|
|
114
|
+
if (!file.endsWith(".json"))
|
|
115
|
+
continue;
|
|
116
|
+
try {
|
|
117
|
+
const data = readFileSync(join(SESSIONS_DIR, file), "utf-8");
|
|
118
|
+
const session = JSON.parse(data);
|
|
119
|
+
// Deduplicate (we save both by session ID and chat ID)
|
|
120
|
+
if (!seen.has(session.id)) {
|
|
121
|
+
seen.add(session.id);
|
|
122
|
+
sessions.push(session);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
catch {
|
|
126
|
+
// Skip invalid files
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return sessions.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
130
|
+
}
|
|
131
|
+
export function setWorkDir(session, workDir) {
|
|
132
|
+
session.workDir = workDir;
|
|
133
|
+
saveSession(session);
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/session/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "cc-channel",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Feishu/Lark channel for Claude Code - trigger Claude Code from Feishu messages",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"bin": {
|
|
8
|
+
"cc-channel": "dist/cli.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"start": "node dist/cli.js",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"claude",
|
|
22
|
+
"claude-code",
|
|
23
|
+
"feishu",
|
|
24
|
+
"lark",
|
|
25
|
+
"chatbot"
|
|
26
|
+
],
|
|
27
|
+
"author": "",
|
|
28
|
+
"license": "MIT",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "git+https://github.com/L-x-C/cc-channel.git"
|
|
32
|
+
},
|
|
33
|
+
"bugs": {
|
|
34
|
+
"url": "https://github.com/L-x-C/cc-channel/issues"
|
|
35
|
+
},
|
|
36
|
+
"homepage": "https://github.com/L-x-C/cc-channel#readme",
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@larksuiteoapi/node-sdk": "^1.29.0",
|
|
42
|
+
"chalk": "^5.3.0",
|
|
43
|
+
"commander": "^12.0.0",
|
|
44
|
+
"conf": "^13.0.1",
|
|
45
|
+
"enquirer": "^2.4.1",
|
|
46
|
+
"ora": "^7.0.1",
|
|
47
|
+
"uuid": "^9.0.1"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"@types/node": "^20.11.0",
|
|
51
|
+
"@types/uuid": "^9.0.8",
|
|
52
|
+
"typescript": "^5.3.3"
|
|
53
|
+
}
|
|
54
|
+
}
|