qqbot-opencode 1.0.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 (66) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +197 -0
  3. package/bin/qqbot.js +16 -0
  4. package/dist/app.d.ts +2 -0
  5. package/dist/app.d.ts.map +1 -0
  6. package/dist/app.js +154 -0
  7. package/dist/app.js.map +1 -0
  8. package/dist/bundle.cjs +850 -0
  9. package/dist/bundle.js +826 -0
  10. package/dist/config.d.ts +8 -0
  11. package/dist/config.d.ts.map +1 -0
  12. package/dist/config.js +179 -0
  13. package/dist/config.js.map +1 -0
  14. package/dist/handlers/index.d.ts +3 -0
  15. package/dist/handlers/index.d.ts.map +1 -0
  16. package/dist/handlers/index.js +3 -0
  17. package/dist/handlers/index.js.map +1 -0
  18. package/dist/handlers/message.d.ts +8 -0
  19. package/dist/handlers/message.d.ts.map +1 -0
  20. package/dist/handlers/message.js +57 -0
  21. package/dist/handlers/message.js.map +1 -0
  22. package/dist/handlers/session.d.ts +13 -0
  23. package/dist/handlers/session.d.ts.map +1 -0
  24. package/dist/handlers/session.js +104 -0
  25. package/dist/handlers/session.js.map +1 -0
  26. package/dist/opencode/client.d.ts +23 -0
  27. package/dist/opencode/client.d.ts.map +1 -0
  28. package/dist/opencode/client.js +141 -0
  29. package/dist/opencode/client.js.map +1 -0
  30. package/dist/opencode/index.d.ts +2 -0
  31. package/dist/opencode/index.d.ts.map +1 -0
  32. package/dist/opencode/index.js +2 -0
  33. package/dist/opencode/index.js.map +1 -0
  34. package/dist/qq/connection.d.ts +23 -0
  35. package/dist/qq/connection.d.ts.map +1 -0
  36. package/dist/qq/connection.js +188 -0
  37. package/dist/qq/connection.js.map +1 -0
  38. package/dist/qq/index.d.ts +5 -0
  39. package/dist/qq/index.d.ts.map +1 -0
  40. package/dist/qq/index.js +4 -0
  41. package/dist/qq/index.js.map +1 -0
  42. package/dist/qq/parser.d.ts +4 -0
  43. package/dist/qq/parser.d.ts.map +1 -0
  44. package/dist/qq/parser.js +99 -0
  45. package/dist/qq/parser.js.map +1 -0
  46. package/dist/qq/sender.d.ts +28 -0
  47. package/dist/qq/sender.d.ts.map +1 -0
  48. package/dist/qq/sender.js +123 -0
  49. package/dist/qq/sender.js.map +1 -0
  50. package/dist/types.d.ts +47 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +2 -0
  53. package/dist/types.js.map +1 -0
  54. package/package.json +58 -0
  55. package/src/app.ts +204 -0
  56. package/src/config.ts +200 -0
  57. package/src/handlers/index.ts +2 -0
  58. package/src/handlers/message.ts +86 -0
  59. package/src/handlers/session.ts +130 -0
  60. package/src/opencode/client.ts +204 -0
  61. package/src/opencode/index.ts +1 -0
  62. package/src/qq/connection.ts +252 -0
  63. package/src/qq/index.ts +9 -0
  64. package/src/qq/parser.ts +126 -0
  65. package/src/qq/sender.ts +215 -0
  66. package/src/types.ts +52 -0
@@ -0,0 +1,8 @@
1
+ import type { Config } from "./types.js";
2
+ export declare function getConfigDir(): string;
3
+ export declare function findDefaultConfig(): string | null;
4
+ export declare function loadConfig(configPath: string): Config;
5
+ export declare function expandEnvVariables(obj: unknown): unknown;
6
+ export declare function saveConfig(config: Config, destPath?: string): void;
7
+ export declare function runInitWizard(): Promise<void>;
8
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAMzC,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,GAAG,IAAI,CASjD;AAED,wBAAgB,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAarD;AAoBD,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAkBxD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAclE;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAwGnD"}
package/dist/config.js ADDED
@@ -0,0 +1,179 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import os from "os";
4
+ import yaml from "js-yaml";
5
+ import prompts from "prompts";
6
+ const CONFIG_DIR = path.join(os.homedir(), ".qqbot");
7
+ const CONFIG_FILE = "config.yaml";
8
+ const CONFIG_PATH = path.join(CONFIG_DIR, CONFIG_FILE);
9
+ export function getConfigDir() {
10
+ return CONFIG_DIR;
11
+ }
12
+ export function findDefaultConfig() {
13
+ const searchPaths = [path.join(process.cwd(), CONFIG_FILE), CONFIG_PATH];
14
+ for (const configPath of searchPaths) {
15
+ if (fs.existsSync(configPath)) {
16
+ return configPath;
17
+ }
18
+ }
19
+ return null;
20
+ }
21
+ export function loadConfig(configPath) {
22
+ const absolutePath = path.resolve(configPath);
23
+ if (!fs.existsSync(absolutePath)) {
24
+ throw new Error(`Config file not found: ${absolutePath}`);
25
+ }
26
+ const rawContent = fs.readFileSync(absolutePath, "utf-8");
27
+ const config = yaml.load(rawContent);
28
+ validateConfig(config);
29
+ return config;
30
+ }
31
+ function validateConfig(config) {
32
+ if (!config.qq?.appId) {
33
+ throw new Error("Missing required field: qq.appId");
34
+ }
35
+ if (!config.qq?.clientSecret) {
36
+ throw new Error("Missing required field: qq.clientSecret");
37
+ }
38
+ if (!config.opencode?.port) {
39
+ config.opencode.port = 4097;
40
+ }
41
+ if (!config.opencode?.hostname) {
42
+ config.opencode.hostname = "127.0.0.1";
43
+ }
44
+ if (!config.app?.workingDir) {
45
+ config.app.workingDir = process.cwd();
46
+ }
47
+ }
48
+ export function expandEnvVariables(obj) {
49
+ if (typeof obj === "string") {
50
+ const envVarPattern = /\$\{([^}]+)\}/g;
51
+ return obj.replace(envVarPattern, (_, envName) => {
52
+ return process.env[envName] || "";
53
+ });
54
+ }
55
+ if (Array.isArray(obj)) {
56
+ return obj.map(expandEnvVariables);
57
+ }
58
+ if (obj && typeof obj === "object") {
59
+ const result = {};
60
+ for (const [key, value] of Object.entries(obj)) {
61
+ result[key] = expandEnvVariables(value);
62
+ }
63
+ return result;
64
+ }
65
+ return obj;
66
+ }
67
+ export function saveConfig(config, destPath) {
68
+ const savePath = destPath || CONFIG_PATH;
69
+ if (!fs.existsSync(CONFIG_DIR)) {
70
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
71
+ }
72
+ const yamlContent = yaml.dump(config, {
73
+ indent: 2,
74
+ lineWidth: -1,
75
+ noRefs: true,
76
+ });
77
+ fs.writeFileSync(savePath, yamlContent, "utf-8");
78
+ }
79
+ export async function runInitWizard() {
80
+ console.log("\n欢迎使用 qqbot-opencode 配置向导!\n");
81
+ const answers = await prompts([
82
+ {
83
+ type: "text",
84
+ name: "appId",
85
+ message: "请输入 QQ Bot AppID:",
86
+ validate: (value) => value.length > 0 || "AppID 不能为空",
87
+ },
88
+ {
89
+ type: "text",
90
+ name: "clientSecret",
91
+ message: "请输入 QQ Bot ClientSecret:",
92
+ validate: (value) => value.length > 0 || "ClientSecret 不能为空",
93
+ },
94
+ {
95
+ type: "confirm",
96
+ name: "markdownSupport",
97
+ message: "是否启用 Markdown 渲染? (y/N):",
98
+ initial: false,
99
+ },
100
+ {
101
+ type: "number",
102
+ name: "opencodePort",
103
+ message: "opencode 服务端口 (默认: 4097):",
104
+ initial: 4097,
105
+ },
106
+ {
107
+ type: "select",
108
+ name: "providerType",
109
+ message: "AI Provider 类型:",
110
+ choices: [
111
+ { title: "1. Anthropic 兼容 (MiniMax)", value: "anthropic" },
112
+ { title: "2. OpenAI 兼容", value: "openai" },
113
+ ],
114
+ initial: 0,
115
+ },
116
+ {
117
+ type: "text",
118
+ name: "providerName",
119
+ message: "请输入 Provider 名称 (默认: minimax):",
120
+ initial: "minimax",
121
+ },
122
+ {
123
+ type: "text",
124
+ name: "modelName",
125
+ message: "AI 模型名称 (默认: MiniMax-M2.7):",
126
+ initial: "MiniMax-M2.7",
127
+ },
128
+ {
129
+ type: "text",
130
+ name: "apiKey",
131
+ message: "API Key:",
132
+ validate: (value) => value.length > 0 || "API Key 不能为空",
133
+ },
134
+ ]);
135
+ const providerType = answers.providerType;
136
+ const providerName = answers.providerName || "minimax";
137
+ const modelName = answers.modelName || "MiniMax-M2.7";
138
+ let baseURL;
139
+ if (providerType === "anthropic") {
140
+ baseURL = "https://api.minimaxi.com/anthropic/v1";
141
+ }
142
+ else {
143
+ baseURL = "https://api.openai.com/v1";
144
+ }
145
+ const config = {
146
+ qq: {
147
+ appId: answers.appId,
148
+ clientSecret: answers.clientSecret,
149
+ markdownSupport: answers.markdownSupport,
150
+ },
151
+ opencode: {
152
+ port: answers.opencodePort || 4097,
153
+ hostname: "127.0.0.1",
154
+ config: {
155
+ model: `${providerName}/${modelName}`,
156
+ provider: {
157
+ [providerName]: {
158
+ options: {
159
+ baseURL,
160
+ apiKey: answers.apiKey,
161
+ },
162
+ models: {
163
+ [modelName]: {
164
+ name: `${providerName}/${modelName}`,
165
+ },
166
+ },
167
+ },
168
+ },
169
+ },
170
+ },
171
+ app: {
172
+ workingDir: "./",
173
+ },
174
+ };
175
+ saveConfig(config);
176
+ console.log("\n配置已保存到 ~/.qqbot/config.yaml");
177
+ console.log("运行 'qqbot' 启动 Bot\n");
178
+ }
179
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export * from "./session.js";
2
+ export * from "./message.js";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from "./session.js";
2
+ export * from "./message.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/handlers/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { ParsedMessage } from "../qq/index.js";
2
+ export interface MessageHandlerResult {
3
+ text: string;
4
+ success: boolean;
5
+ isSessionCommand?: boolean;
6
+ }
7
+ export declare function handleMessage(content: string, parsedMessage: ParsedMessage): Promise<MessageHandlerResult>;
8
+ //# sourceMappingURL=message.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.d.ts","sourceRoot":"","sources":["../../src/handlers/message.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,aAAa,CACjC,OAAO,EAAE,MAAM,EACf,aAAa,EAAE,aAAa,GAC3B,OAAO,CAAC,oBAAoB,CAAC,CAQ/B"}
@@ -0,0 +1,57 @@
1
+ import { sendPrompt } from "../opencode/client.js";
2
+ import { parseSessionCommand, handleSessionNew, handleSessionSwitch, handleSessionList, handleSessionCurrent, } from "./session.js";
3
+ export async function handleMessage(content, parsedMessage) {
4
+ const sessionCmd = parseSessionCommand(content);
5
+ if (sessionCmd) {
6
+ return handleSessionCommand(sessionCmd.command, sessionCmd.args);
7
+ }
8
+ return handleAIMessage(content, parsedMessage);
9
+ }
10
+ async function handleSessionCommand(command, args) {
11
+ let result;
12
+ switch (command) {
13
+ case "new":
14
+ result = await handleSessionNew();
15
+ break;
16
+ case "switch":
17
+ result = await handleSessionSwitch(args);
18
+ break;
19
+ case "list":
20
+ result = await handleSessionList();
21
+ break;
22
+ case "current":
23
+ result = await handleSessionCurrent();
24
+ break;
25
+ default:
26
+ result = {
27
+ text: "未知的 session 命令",
28
+ success: false,
29
+ };
30
+ }
31
+ return {
32
+ ...result,
33
+ isSessionCommand: true,
34
+ };
35
+ }
36
+ async function handleAIMessage(content, parsedMessage) {
37
+ try {
38
+ const result = await sendPrompt(content, parsedMessage.imageUrls);
39
+ if (!result.text || result.text.trim() === "") {
40
+ return {
41
+ text: "AI 返回了空响应",
42
+ success: true,
43
+ };
44
+ }
45
+ return {
46
+ text: result.text,
47
+ success: true,
48
+ };
49
+ }
50
+ catch (err) {
51
+ return {
52
+ text: `处理消息失败: ${err instanceof Error ? err.message : String(err)}`,
53
+ success: false,
54
+ };
55
+ }
56
+ }
57
+ //# sourceMappingURL=message.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../src/handlers/message.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,mBAAmB,EACnB,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,cAAc,CAAC;AAStB,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAe,EACf,aAA4B;IAE5B,MAAM,UAAU,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAEhD,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,oBAAoB,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACnE,CAAC;IAED,OAAO,eAAe,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;AACjD,CAAC;AAED,KAAK,UAAU,oBAAoB,CACjC,OAAe,EACf,IAAY;IAEZ,IAAI,MAAM,CAAC;IAEX,QAAQ,OAAO,EAAE,CAAC;QAChB,KAAK,KAAK;YACR,MAAM,GAAG,MAAM,gBAAgB,EAAE,CAAC;YAClC,MAAM;QACR,KAAK,QAAQ;YACX,MAAM,GAAG,MAAM,mBAAmB,CAAC,IAAI,CAAC,CAAC;YACzC,MAAM;QACR,KAAK,MAAM;YACT,MAAM,GAAG,MAAM,iBAAiB,EAAE,CAAC;YACnC,MAAM;QACR,KAAK,SAAS;YACZ,MAAM,GAAG,MAAM,oBAAoB,EAAE,CAAC;YACtC,MAAM;QACR;YACE,MAAM,GAAG;gBACP,IAAI,EAAE,gBAAgB;gBACtB,OAAO,EAAE,KAAK;aACf,CAAC;IACN,CAAC;IAED,OAAO;QACL,GAAG,MAAM;QACT,gBAAgB,EAAE,IAAI;KACvB,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,eAAe,CAC5B,OAAe,EACf,aAA4B;IAE5B,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;QAElE,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,OAAO;gBACL,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,IAAI;aACd,CAAC;QACJ,CAAC;QAED,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,OAAO,EAAE,IAAI;SACd,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,WAAW,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE;YACnE,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ export interface SessionCommandResult {
2
+ text: string;
3
+ success: boolean;
4
+ }
5
+ export declare function handleSessionNew(): Promise<SessionCommandResult>;
6
+ export declare function handleSessionSwitch(sessionId: string): Promise<SessionCommandResult>;
7
+ export declare function handleSessionList(): Promise<SessionCommandResult>;
8
+ export declare function handleSessionCurrent(): Promise<SessionCommandResult>;
9
+ export declare function parseSessionCommand(content: string): {
10
+ command: string;
11
+ args: string;
12
+ } | null;
13
+ //# sourceMappingURL=session.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../../src/handlers/session.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAatE;AAED,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,oBAAoB,CAAC,CAoB/B;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CA8BvE;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAqB1E;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,GACd;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAqB1C"}
@@ -0,0 +1,104 @@
1
+ import { createSession, switchSession, listSessions, getCurrentSession, } from "../opencode/client.js";
2
+ export async function handleSessionNew() {
3
+ try {
4
+ const session = await createSession();
5
+ return {
6
+ text: `已创建新会话: ${session.id}\n标题: ${session.title || "无"}`,
7
+ success: true,
8
+ };
9
+ }
10
+ catch (err) {
11
+ return {
12
+ text: `创建会话失败: ${err instanceof Error ? err.message : String(err)}`,
13
+ success: false,
14
+ };
15
+ }
16
+ }
17
+ export async function handleSessionSwitch(sessionId) {
18
+ if (!sessionId || sessionId.trim() === "") {
19
+ return {
20
+ text: "请提供会话 ID,例如: /session-switch <id>",
21
+ success: false,
22
+ };
23
+ }
24
+ try {
25
+ const session = await switchSession(sessionId.trim());
26
+ return {
27
+ text: `已切换到会话: ${session.id}\n标题: ${session.title || "无"}`,
28
+ success: true,
29
+ };
30
+ }
31
+ catch (err) {
32
+ return {
33
+ text: `切换会话失败: ${err instanceof Error ? err.message : String(err)}`,
34
+ success: false,
35
+ };
36
+ }
37
+ }
38
+ export async function handleSessionList() {
39
+ try {
40
+ const sessions = await listSessions();
41
+ if (sessions.length === 0) {
42
+ return {
43
+ text: "暂无会话",
44
+ success: true,
45
+ };
46
+ }
47
+ const currentSession = await getCurrentSession();
48
+ const currentId = currentSession?.id;
49
+ const lines = sessions.map((s, i) => {
50
+ const marker = s.id === currentId ? " [当前]" : "";
51
+ const title = s.title ? ` - ${s.title}` : "";
52
+ return `${i + 1}. ${s.id}${title}${marker}`;
53
+ });
54
+ return {
55
+ text: `会话列表:\n${lines.join("\n")}`,
56
+ success: true,
57
+ };
58
+ }
59
+ catch (err) {
60
+ return {
61
+ text: `获取会话列表失败: ${err instanceof Error ? err.message : String(err)}`,
62
+ success: false,
63
+ };
64
+ }
65
+ }
66
+ export async function handleSessionCurrent() {
67
+ try {
68
+ const session = await getCurrentSession();
69
+ if (!session) {
70
+ return {
71
+ text: "当前没有活跃的会话",
72
+ success: true,
73
+ };
74
+ }
75
+ return {
76
+ text: `当前会话:\nID: ${session.id}\n标题: ${session.title || "无"}`,
77
+ success: true,
78
+ };
79
+ }
80
+ catch (err) {
81
+ return {
82
+ text: `获取当前会话失败: ${err instanceof Error ? err.message : String(err)}`,
83
+ success: false,
84
+ };
85
+ }
86
+ }
87
+ export function parseSessionCommand(content) {
88
+ const trimmed = content.trim();
89
+ if (trimmed === "/session-new") {
90
+ return { command: "new", args: "" };
91
+ }
92
+ if (trimmed.startsWith("/session-switch ")) {
93
+ const args = trimmed.slice("/session-switch ".length).trim();
94
+ return { command: "switch", args };
95
+ }
96
+ if (trimmed === "/session-list") {
97
+ return { command: "list", args: "" };
98
+ }
99
+ if (trimmed === "/session-current") {
100
+ return { command: "current", args: "" };
101
+ }
102
+ return null;
103
+ }
104
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/handlers/session.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { createOpencode } from "@opencode-ai/sdk";
2
+ import type { OpencodeConfig } from "../types.js";
3
+ interface OpencodeClientInstance {
4
+ client: Awaited<ReturnType<typeof createOpencode>>["client"];
5
+ server: Awaited<ReturnType<typeof createOpencode>>["server"];
6
+ currentSessionId: string | null;
7
+ }
8
+ interface SessionInfo {
9
+ id: string;
10
+ title?: string;
11
+ }
12
+ export declare function initOpencodeClient(config: OpencodeConfig): Promise<OpencodeClientInstance>;
13
+ export declare function createSession(): Promise<SessionInfo>;
14
+ export declare function switchSession(sessionId: string): Promise<SessionInfo>;
15
+ export declare function listSessions(): Promise<SessionInfo[]>;
16
+ export declare function getCurrentSession(): Promise<SessionInfo | null>;
17
+ export interface PromptResult {
18
+ text: string;
19
+ }
20
+ export declare function sendPrompt(message: string, imageUrls?: string[]): Promise<PromptResult>;
21
+ export declare function closeOpencodeClient(): Promise<void>;
22
+ export {};
23
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,UAAU,sBAAsB;IAC9B,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7D,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC7D,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,UAAU,WAAW;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAsB,kBAAkB,CACtC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,sBAAsB,CAAC,CAuBjC;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,WAAW,CAAC,CAqB1D;AAED,wBAAsB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAqB3E;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC,CAgB3D;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAkBrE;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAsB,UAAU,CAC9B,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAM,EAAO,GACvB,OAAO,CAAC,YAAY,CAAC,CA6DvB;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAMzD"}
@@ -0,0 +1,141 @@
1
+ import { createOpencode } from "@opencode-ai/sdk";
2
+ let instance = null;
3
+ export async function initOpencodeClient(config) {
4
+ const opencodeConfig = config.config || {};
5
+ const { client, server } = await createOpencode({
6
+ hostname: config.hostname,
7
+ port: config.port,
8
+ config: opencodeConfig,
9
+ });
10
+ instance = {
11
+ client,
12
+ server,
13
+ currentSessionId: null,
14
+ };
15
+ const sessionsResponse = await client.session.list();
16
+ const sessions = sessionsResponse.data;
17
+ if (sessions && sessions.length > 0) {
18
+ instance.currentSessionId = sessions[0].id;
19
+ console.log(`[Opencode] Resumed session: ${sessions[0].id}`);
20
+ }
21
+ return instance;
22
+ }
23
+ export async function createSession() {
24
+ if (!instance) {
25
+ throw new Error("Opencode client not initialized");
26
+ }
27
+ const sessionResponse = await instance.client.session.create({
28
+ body: {},
29
+ });
30
+ const session = sessionResponse.data;
31
+ if (!session) {
32
+ throw new Error("Failed to create session");
33
+ }
34
+ instance.currentSessionId = session.id;
35
+ console.log(`[Opencode] Created new session: ${session.id}`);
36
+ return {
37
+ id: session.id,
38
+ title: session.title,
39
+ };
40
+ }
41
+ export async function switchSession(sessionId) {
42
+ if (!instance) {
43
+ throw new Error("Opencode client not initialized");
44
+ }
45
+ const sessionResponse = await instance.client.session.get({
46
+ path: { id: sessionId },
47
+ });
48
+ const session = sessionResponse.data;
49
+ if (!session) {
50
+ throw new Error(`Session not found: ${sessionId}`);
51
+ }
52
+ instance.currentSessionId = sessionId;
53
+ console.log(`[Opencode] Switched to session: ${sessionId}`);
54
+ return {
55
+ id: session.id,
56
+ title: session.title,
57
+ };
58
+ }
59
+ export async function listSessions() {
60
+ if (!instance) {
61
+ throw new Error("Opencode client not initialized");
62
+ }
63
+ const sessionsResponse = await instance.client.session.list();
64
+ const sessions = sessionsResponse.data;
65
+ if (!sessions) {
66
+ return [];
67
+ }
68
+ return sessions.map((s) => ({
69
+ id: s.id,
70
+ title: s.title,
71
+ }));
72
+ }
73
+ export async function getCurrentSession() {
74
+ if (!instance || !instance.currentSessionId) {
75
+ return null;
76
+ }
77
+ const sessionResponse = await instance.client.session.get({
78
+ path: { id: instance.currentSessionId },
79
+ });
80
+ const session = sessionResponse.data;
81
+ if (!session) {
82
+ return null;
83
+ }
84
+ return {
85
+ id: session.id,
86
+ title: session.title,
87
+ };
88
+ }
89
+ export async function sendPrompt(message, imageUrls = []) {
90
+ if (!instance || !instance.currentSessionId) {
91
+ throw new Error("Opencode client not initialized or no active session");
92
+ }
93
+ console.log(`[Opencode] Sending prompt to session ${instance.currentSessionId}: "${message.slice(0, 50)}..."`);
94
+ const parts = [{ type: "text", text: message }];
95
+ for (const imageUrl of imageUrls) {
96
+ if (imageUrl.startsWith("http://") || imageUrl.startsWith("https://")) {
97
+ parts.push({ type: "image_url", url: imageUrl });
98
+ }
99
+ }
100
+ try {
101
+ const resultResponse = await instance.client.session.prompt({
102
+ path: { id: instance.currentSessionId },
103
+ body: {
104
+ parts: parts,
105
+ },
106
+ });
107
+ console.log(`[Opencode] Prompt response:`, JSON.stringify(resultResponse, null, 2).slice(0, 500));
108
+ const result = resultResponse.data;
109
+ let text = "";
110
+ if (result?.parts && Array.isArray(result.parts)) {
111
+ for (const part of result.parts) {
112
+ console.log(`[Opencode] Part type: ${part.type}`, part);
113
+ if (part.type === "text" && part.text) {
114
+ text += part.text;
115
+ }
116
+ }
117
+ }
118
+ else {
119
+ console.log(`[Opencode] No parts in response or unexpected format`);
120
+ }
121
+ if (!text) {
122
+ console.log(`[Opencode] Empty response text, checking info...`);
123
+ if (result?.info) {
124
+ console.log(`[Opencode] Response info:`, JSON.stringify(result.info).slice(0, 500));
125
+ }
126
+ }
127
+ return { text };
128
+ }
129
+ catch (err) {
130
+ console.error(`[Opencode] Prompt error:`, err);
131
+ throw err;
132
+ }
133
+ }
134
+ export async function closeOpencodeClient() {
135
+ if (instance) {
136
+ instance.server.close();
137
+ instance = null;
138
+ console.log("[Opencode] Client closed");
139
+ }
140
+ }
141
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from "./client.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/opencode/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from "./client.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/opencode/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { QQConfig } from "../types.js";
2
+ interface C2CMessageEvent {
3
+ id: string;
4
+ content: string;
5
+ timestamp: number;
6
+ author: {
7
+ user_openid: string;
8
+ username?: string;
9
+ };
10
+ message_scene?: {
11
+ ext?: string;
12
+ };
13
+ }
14
+ interface ConnectionOptions {
15
+ qq: QQConfig;
16
+ onMessage: (event: C2CMessageEvent) => void;
17
+ onReady?: () => void;
18
+ onError?: (error: Error) => void;
19
+ onDisconnect?: () => void;
20
+ }
21
+ export declare function startQQConnection(options: ConnectionOptions): Promise<void>;
22
+ export {};
23
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/qq/connection.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAS5C,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,aAAa,CAAC,EAAE;QACd,GAAG,CAAC,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,UAAU,iBAAiB;IACzB,EAAE,EAAE,QAAQ,CAAC;IACb,SAAS,EAAE,CAAC,KAAK,EAAE,eAAe,KAAK,IAAI,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAuED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,IAAI,CAAC,CAqJf"}