opencode-feishu-bot 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 +314 -0
- package/bin/cli.js +3 -0
- package/dist/auth/whitelist.d.ts +25 -0
- package/dist/auth/whitelist.d.ts.map +1 -0
- package/dist/cli.d.ts +27 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/commands/handler.d.ts +51 -0
- package/dist/commands/handler.d.ts.map +1 -0
- package/dist/commands/parser.d.ts +24 -0
- package/dist/commands/parser.d.ts.map +1 -0
- package/dist/config.d.ts +44 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/database/index.d.ts +96 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/schema.sql +49 -0
- package/dist/events/handler.d.ts +13 -0
- package/dist/events/handler.d.ts.map +1 -0
- package/dist/feishu/client.d.ts +218 -0
- package/dist/feishu/client.d.ts.map +1 -0
- package/dist/feishu/formatter.d.ts +110 -0
- package/dist/feishu/formatter.d.ts.map +1 -0
- package/dist/feishu/menu.d.ts +44 -0
- package/dist/feishu/menu.d.ts.map +1 -0
- package/dist/feishu/question-card.d.ts +24 -0
- package/dist/feishu/question-card.d.ts.map +1 -0
- package/dist/feishu/streamer.d.ts +53 -0
- package/dist/feishu/streamer.d.ts.map +1 -0
- package/dist/feishu/welcome.d.ts +9 -0
- package/dist/feishu/welcome.d.ts.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4034 -0
- package/dist/opencode/client.d.ts +86 -0
- package/dist/opencode/client.d.ts.map +1 -0
- package/dist/session/manager.d.ts +75 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/utils/logger.d.ts +12 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/reconnect.d.ts +39 -0
- package/dist/utils/reconnect.d.ts.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenCode 客户端模块
|
|
3
|
+
* 封装 OpenCode SDK,自动启动服务器并管理会话
|
|
4
|
+
*/
|
|
5
|
+
import { type OpencodeClient } from '@opencode-ai/sdk';
|
|
6
|
+
import type { Event, TextPart, ReasoningPart, ToolPart, Message } from '@opencode-ai/sdk/client';
|
|
7
|
+
/** OpenCode 配置 */
|
|
8
|
+
export interface OpencodeConfig {
|
|
9
|
+
directory?: string;
|
|
10
|
+
}
|
|
11
|
+
/** OpenCode 事件数据 */
|
|
12
|
+
export interface OpencodeEventData {
|
|
13
|
+
type: string;
|
|
14
|
+
properties: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
export type EventCallback = (event: OpencodeEventData) => void;
|
|
17
|
+
export interface ImageAttachment {
|
|
18
|
+
data: Buffer;
|
|
19
|
+
mimeType: string;
|
|
20
|
+
filename?: string;
|
|
21
|
+
}
|
|
22
|
+
/** OpenCode 服务器和客户端封装 */
|
|
23
|
+
export declare class OpencodeWrapper {
|
|
24
|
+
private client;
|
|
25
|
+
private serverCloseFn;
|
|
26
|
+
private serverUrl;
|
|
27
|
+
private directory?;
|
|
28
|
+
constructor(config: OpencodeConfig);
|
|
29
|
+
/** 启动 OpenCode 服务器(随机端口) */
|
|
30
|
+
start(): Promise<string>;
|
|
31
|
+
/** 停止 OpenCode 服务器 */
|
|
32
|
+
stop(): void;
|
|
33
|
+
/** 获取服务器 URL */
|
|
34
|
+
getServerUrl(): string | null;
|
|
35
|
+
/** 检查是否已启动 */
|
|
36
|
+
isStarted(): boolean;
|
|
37
|
+
private ensureClient;
|
|
38
|
+
/** 创建新会话 */
|
|
39
|
+
createSession(): Promise<string>;
|
|
40
|
+
/** 发送提示消息 */
|
|
41
|
+
sendPrompt(sessionId: string, prompt: string, images?: ImageAttachment[]): Promise<void>;
|
|
42
|
+
/** 中止会话 */
|
|
43
|
+
abortSession(sessionId: string): Promise<boolean>;
|
|
44
|
+
/** 订阅事件流 */
|
|
45
|
+
subscribeToEvents(sessionId: string, callback: EventCallback): Promise<() => void>;
|
|
46
|
+
/** 获取会话状态 */
|
|
47
|
+
getSessionStatus(sessionId: string): Promise<'idle' | 'busy' | 'unknown'>;
|
|
48
|
+
/** 获取原始客户端实例 */
|
|
49
|
+
getClient(): OpencodeClient | null;
|
|
50
|
+
/** 执行命令 */
|
|
51
|
+
executeCommand(sessionId: string, command: string, args?: string): Promise<boolean>;
|
|
52
|
+
/** 获取可用命令列表 */
|
|
53
|
+
listCommands(): Promise<Array<{
|
|
54
|
+
name: string;
|
|
55
|
+
description?: string;
|
|
56
|
+
}>>;
|
|
57
|
+
/** 获取可用模型列表 */
|
|
58
|
+
listModels(): Promise<Array<{
|
|
59
|
+
id: string;
|
|
60
|
+
name: string;
|
|
61
|
+
providerId: string;
|
|
62
|
+
}>>;
|
|
63
|
+
/** 获取会话信息 */
|
|
64
|
+
getSession(sessionId: string): Promise<Record<string, unknown> | null>;
|
|
65
|
+
/** 获取会话消息列表 */
|
|
66
|
+
getSessionMessages(sessionId: string): Promise<Array<Record<string, unknown>>>;
|
|
67
|
+
replyQuestion(requestId: string, answers: string[][]): Promise<boolean>;
|
|
68
|
+
rejectQuestion(requestId: string): Promise<boolean>;
|
|
69
|
+
}
|
|
70
|
+
/** 创建 OpenCode 封装实例 */
|
|
71
|
+
export declare function createOpencodeWrapper(config: OpencodeConfig): OpencodeWrapper;
|
|
72
|
+
/** 从消息部分提取文本 */
|
|
73
|
+
export declare function extractTextFromPart(part: unknown): string | null;
|
|
74
|
+
/** 工具调用提取结果 */
|
|
75
|
+
export interface ToolCallInfo {
|
|
76
|
+
name: string;
|
|
77
|
+
state: string;
|
|
78
|
+
title?: string;
|
|
79
|
+
input?: Record<string, unknown>;
|
|
80
|
+
output?: string;
|
|
81
|
+
error?: string;
|
|
82
|
+
}
|
|
83
|
+
/** 从消息部分提取工具调用 */
|
|
84
|
+
export declare function extractToolCallFromPart(part: unknown): ToolCallInfo | null;
|
|
85
|
+
export { type Event, type TextPart, type ReasoningPart, type ToolPart, type Message };
|
|
86
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 会话管理模块
|
|
3
|
+
* 管理用户与 OpenCode 之间的会话生命周期
|
|
4
|
+
*/
|
|
5
|
+
import type { BotDatabase, SessionChat } from '../database';
|
|
6
|
+
import type { FeishuClient, MessageEvent } from '../feishu/client';
|
|
7
|
+
import type { OpencodeWrapper } from '../opencode/client';
|
|
8
|
+
import { type QuestionInfo } from '../feishu/question-card';
|
|
9
|
+
export interface SessionManagerConfig {
|
|
10
|
+
defaultProjectPath: string;
|
|
11
|
+
adminUserIds: string[];
|
|
12
|
+
allowAllUsers: boolean;
|
|
13
|
+
}
|
|
14
|
+
interface PendingQuestion {
|
|
15
|
+
requestId: string;
|
|
16
|
+
messageId: string;
|
|
17
|
+
questions: QuestionInfo[];
|
|
18
|
+
chatId: string;
|
|
19
|
+
}
|
|
20
|
+
export declare class SessionManager {
|
|
21
|
+
private db;
|
|
22
|
+
private feishuClient;
|
|
23
|
+
private opencodeClient;
|
|
24
|
+
private config;
|
|
25
|
+
private activeSessions;
|
|
26
|
+
private messageQueue;
|
|
27
|
+
private pendingQuestions;
|
|
28
|
+
constructor(db: BotDatabase, feishuClient: FeishuClient, opencodeClient: OpencodeWrapper, config: SessionManagerConfig);
|
|
29
|
+
handleMessage(event: MessageEvent): Promise<void>;
|
|
30
|
+
private queueMessage;
|
|
31
|
+
private processMessage;
|
|
32
|
+
private setSessionChatTitle;
|
|
33
|
+
private handleOpencodeEvent;
|
|
34
|
+
private formatPart;
|
|
35
|
+
private handleQuestionAsked;
|
|
36
|
+
private handleQuestionTextAnswer;
|
|
37
|
+
handleQuestionAnswer(chatId: string, requestId: string, questionIndex: number, answerLabel: string, messageId?: string): Promise<boolean>;
|
|
38
|
+
getPendingQuestion(chatId: string): PendingQuestion | undefined;
|
|
39
|
+
private parsePostContent;
|
|
40
|
+
private getOrCreateSession;
|
|
41
|
+
private cleanupSession;
|
|
42
|
+
private isUserAuthorized;
|
|
43
|
+
private sendUnauthorizedMessage;
|
|
44
|
+
createNewSession(chatId: string): Promise<string>;
|
|
45
|
+
switchProject(chatId: string, projectPath: string): Promise<void>;
|
|
46
|
+
abortCurrentSession(chatId: string): Promise<boolean>;
|
|
47
|
+
isAdmin(userId: string): boolean;
|
|
48
|
+
getActiveSessionCount(): number;
|
|
49
|
+
getDefaultProjectPath(): string;
|
|
50
|
+
handleMessageRecall(userMessageId: string): Promise<{
|
|
51
|
+
aborted: boolean;
|
|
52
|
+
botMessagesDeleted: number;
|
|
53
|
+
}>;
|
|
54
|
+
cleanupChatData(chatId: string): void;
|
|
55
|
+
getOrCreateUserSession(userId: string): Promise<string | null>;
|
|
56
|
+
createNewUserSession(userId: string): Promise<string>;
|
|
57
|
+
getUserSessionInfo(userId: string): Promise<{
|
|
58
|
+
sessionId: string;
|
|
59
|
+
projectPath: string;
|
|
60
|
+
isActive: boolean;
|
|
61
|
+
} | null>;
|
|
62
|
+
switchUserProject(userId: string, projectPath: string): Promise<void>;
|
|
63
|
+
createSessionChat(userId: string, projectPath: string): Promise<{
|
|
64
|
+
chatId: string;
|
|
65
|
+
sessionId: string;
|
|
66
|
+
} | null>;
|
|
67
|
+
cleanupSessionChat(chatId: string): Promise<void>;
|
|
68
|
+
handleUserLeftSessionChat(chatId: string): Promise<void>;
|
|
69
|
+
getSessionChat(chatId: string): SessionChat | null;
|
|
70
|
+
getUserSessionChats(userId: string): SessionChat[];
|
|
71
|
+
cleanup(): void;
|
|
72
|
+
}
|
|
73
|
+
export declare function createSessionManager(db: BotDatabase, feishuClient: FeishuClient, opencodeClient: OpencodeWrapper, config: SessionManagerConfig): SessionManager;
|
|
74
|
+
export {};
|
|
75
|
+
//# sourceMappingURL=manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/session/manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 日志模块
|
|
3
|
+
*/
|
|
4
|
+
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
5
|
+
export declare function setLogLevel(level: LogLevel): void;
|
|
6
|
+
export declare const logger: {
|
|
7
|
+
debug(message: string, data?: unknown): void;
|
|
8
|
+
info(message: string, data?: unknown): void;
|
|
9
|
+
warn(message: string, data?: unknown): void;
|
|
10
|
+
error(message: string, data?: unknown): void;
|
|
11
|
+
};
|
|
12
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAW3D,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAEjD;AAgBD,eAAO,MAAM,MAAM;mBACF,MAAM,SAAS,OAAO,GAAG,IAAI;kBAM9B,MAAM,SAAS,OAAO,GAAG,IAAI;kBAM7B,MAAM,SAAS,OAAO,GAAG,IAAI;mBAM5B,MAAM,SAAS,OAAO,GAAG,IAAI;CAK7C,CAAC"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface ReconnectionConfig {
|
|
2
|
+
maxRetries: number;
|
|
3
|
+
initialDelayMs: number;
|
|
4
|
+
maxDelayMs: number;
|
|
5
|
+
backoffMultiplier: number;
|
|
6
|
+
}
|
|
7
|
+
export type ConnectionFn = () => Promise<void>;
|
|
8
|
+
export type DisconnectFn = () => Promise<void>;
|
|
9
|
+
export declare class ReconnectionManager {
|
|
10
|
+
private config;
|
|
11
|
+
private retryCount;
|
|
12
|
+
private isConnected;
|
|
13
|
+
private shouldReconnect;
|
|
14
|
+
private connectFn;
|
|
15
|
+
private disconnectFn?;
|
|
16
|
+
private reconnectTimeout;
|
|
17
|
+
constructor(connectFn: ConnectionFn, disconnectFn?: DisconnectFn, config?: Partial<ReconnectionConfig>);
|
|
18
|
+
connect(): Promise<void>;
|
|
19
|
+
private attemptConnection;
|
|
20
|
+
private scheduleReconnect;
|
|
21
|
+
private calculateDelay;
|
|
22
|
+
disconnect(): Promise<void>;
|
|
23
|
+
onDisconnect(): void;
|
|
24
|
+
getStatus(): {
|
|
25
|
+
isConnected: boolean;
|
|
26
|
+
retryCount: number;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export declare function createReconnectionManager(connectFn: ConnectionFn, disconnectFn?: DisconnectFn, config?: Partial<ReconnectionConfig>): ReconnectionManager;
|
|
30
|
+
export declare class GlobalErrorHandler {
|
|
31
|
+
private static instance;
|
|
32
|
+
private handlers;
|
|
33
|
+
static getInstance(): GlobalErrorHandler;
|
|
34
|
+
register(handler: (error: Error) => void): () => void;
|
|
35
|
+
handle(error: Error): void;
|
|
36
|
+
setupProcessHandlers(): void;
|
|
37
|
+
}
|
|
38
|
+
export declare function setupGlobalErrorHandling(): GlobalErrorHandler;
|
|
39
|
+
//# sourceMappingURL=reconnect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconnect.d.ts","sourceRoot":"","sources":["../../src/utils/reconnect.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AASD,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAC/C,MAAM,MAAM,YAAY,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/C,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,eAAe,CAAiB;IACxC,OAAO,CAAC,SAAS,CAAe;IAChC,OAAO,CAAC,YAAY,CAAC,CAAe;IACpC,OAAO,CAAC,gBAAgB,CAA8C;gBAGpE,SAAS,EAAE,YAAY,EACvB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC;IAOhC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAKhB,iBAAiB;YAajB,iBAAiB;IA0B/B,OAAO,CAAC,cAAc;IAMhB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAqBjC,YAAY,IAAI,IAAI;IAQpB,SAAS,IAAI;QAAE,WAAW,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE;CAM1D;AAED,wBAAgB,yBAAyB,CACvC,SAAS,EAAE,YAAY,EACvB,YAAY,CAAC,EAAE,YAAY,EAC3B,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GACnC,mBAAmB,CAErB;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAqC;IAErD,MAAM,CAAC,WAAW,IAAI,kBAAkB;IAOxC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,MAAM,IAAI;IAUrD,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAW1B,oBAAoB,IAAI,IAAI;CAY7B;AAED,wBAAgB,wBAAwB,IAAI,kBAAkB,CAI7D"}
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "opencode-feishu-bot",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "飞书机器人,用于与 OpenCode AI 编程助手交互",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"default": "./dist/index.js"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"bin": {
|
|
16
|
+
"opencode-feishu-bot": "./bin/cli.js"
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist",
|
|
20
|
+
"bin"
|
|
21
|
+
],
|
|
22
|
+
"scripts": {
|
|
23
|
+
"start": "bun run src/index.ts",
|
|
24
|
+
"dev": "bun --watch src/index.ts",
|
|
25
|
+
"build": "bun run build:clean && bun run build:js && bun run build:types && bun run build:assets",
|
|
26
|
+
"build:clean": "rm -rf dist",
|
|
27
|
+
"build:js": "bun build ./src/index.ts --outdir ./dist --target node --format esm --packages external",
|
|
28
|
+
"build:types": "bunx tsc -p tsconfig.build.json",
|
|
29
|
+
"build:assets": "mkdir -p dist/database && cp src/database/schema.sql dist/database/",
|
|
30
|
+
"test": "bun test",
|
|
31
|
+
"test:watch": "bun test --watch",
|
|
32
|
+
"prepublishOnly": "bun run build",
|
|
33
|
+
"prepack": "bun run build"
|
|
34
|
+
},
|
|
35
|
+
"keywords": [
|
|
36
|
+
"feishu",
|
|
37
|
+
"lark",
|
|
38
|
+
"飞书",
|
|
39
|
+
"opencode",
|
|
40
|
+
"ai",
|
|
41
|
+
"chatbot",
|
|
42
|
+
"bot"
|
|
43
|
+
],
|
|
44
|
+
"author": "",
|
|
45
|
+
"license": "MIT",
|
|
46
|
+
"repository": {
|
|
47
|
+
"type": "git",
|
|
48
|
+
"url": "git+https://github.com/kylin1020/opencode-feishu-bot.git"
|
|
49
|
+
},
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/kylin1020/opencode-feishu-bot/issues"
|
|
52
|
+
},
|
|
53
|
+
"homepage": "https://github.com/kylin1020/opencode-feishu-bot#readme",
|
|
54
|
+
"engines": {
|
|
55
|
+
"bun": ">=1.2.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/bun": "latest",
|
|
59
|
+
"typescript": "^5"
|
|
60
|
+
},
|
|
61
|
+
"peerDependencies": {
|
|
62
|
+
"typescript": "^5"
|
|
63
|
+
},
|
|
64
|
+
"peerDependenciesMeta": {
|
|
65
|
+
"typescript": {
|
|
66
|
+
"optional": true
|
|
67
|
+
}
|
|
68
|
+
},
|
|
69
|
+
"dependencies": {
|
|
70
|
+
"@larksuiteoapi/node-sdk": "^1.58.0",
|
|
71
|
+
"@opencode-ai/sdk": "^1.1.47",
|
|
72
|
+
"zod": "^4.3.6"
|
|
73
|
+
}
|
|
74
|
+
}
|