opencode-channels 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.
Files changed (121) hide show
  1. package/README.md +187 -0
  2. package/bin/cli.js +24 -0
  3. package/bin/cli.ts +62 -0
  4. package/dist/bot/auto-binding.d.ts +6 -0
  5. package/dist/bot/auto-binding.d.ts.map +1 -0
  6. package/dist/bot/auto-binding.js +81 -0
  7. package/dist/bot/auto-binding.js.map +1 -0
  8. package/dist/bot/commands/agents.d.ts +9 -0
  9. package/dist/bot/commands/agents.d.ts.map +1 -0
  10. package/dist/bot/commands/agents.js +53 -0
  11. package/dist/bot/commands/agents.js.map +1 -0
  12. package/dist/bot/commands/base.d.ts +4 -0
  13. package/dist/bot/commands/base.d.ts.map +1 -0
  14. package/dist/bot/commands/base.js +241 -0
  15. package/dist/bot/commands/base.js.map +1 -0
  16. package/dist/bot/commands/dynamic.d.ts +8 -0
  17. package/dist/bot/commands/dynamic.d.ts.map +1 -0
  18. package/dist/bot/commands/dynamic.js +82 -0
  19. package/dist/bot/commands/dynamic.js.map +1 -0
  20. package/dist/bot/commands/index.d.ts +15 -0
  21. package/dist/bot/commands/index.d.ts.map +1 -0
  22. package/dist/bot/commands/index.js +25 -0
  23. package/dist/bot/commands/index.js.map +1 -0
  24. package/dist/bot/commands/models.d.ts +7 -0
  25. package/dist/bot/commands/models.d.ts.map +1 -0
  26. package/dist/bot/commands/models.js +60 -0
  27. package/dist/bot/commands/models.js.map +1 -0
  28. package/dist/bot/commands/sdk-commands.d.ts +5 -0
  29. package/dist/bot/commands/sdk-commands.d.ts.map +1 -0
  30. package/dist/bot/commands/sdk-commands.js +135 -0
  31. package/dist/bot/commands/sdk-commands.js.map +1 -0
  32. package/dist/bot/handlers/callback.d.ts +3 -0
  33. package/dist/bot/handlers/callback.d.ts.map +1 -0
  34. package/dist/bot/handlers/callback.js +52 -0
  35. package/dist/bot/handlers/callback.js.map +1 -0
  36. package/dist/bot/handlers/file.d.ts +3 -0
  37. package/dist/bot/handlers/file.d.ts.map +1 -0
  38. package/dist/bot/handlers/file.js +121 -0
  39. package/dist/bot/handlers/file.js.map +1 -0
  40. package/dist/bot/handlers/group.d.ts +3 -0
  41. package/dist/bot/handlers/group.d.ts.map +1 -0
  42. package/dist/bot/handlers/group.js +41 -0
  43. package/dist/bot/handlers/group.js.map +1 -0
  44. package/dist/bot/handlers/index.d.ts +4 -0
  45. package/dist/bot/handlers/index.d.ts.map +1 -0
  46. package/dist/bot/handlers/index.js +13 -0
  47. package/dist/bot/handlers/index.js.map +1 -0
  48. package/dist/bot/handlers/message.d.ts +15 -0
  49. package/dist/bot/handlers/message.d.ts.map +1 -0
  50. package/dist/bot/handlers/message.js +183 -0
  51. package/dist/bot/handlers/message.js.map +1 -0
  52. package/dist/bot/handlers/topic.d.ts +3 -0
  53. package/dist/bot/handlers/topic.d.ts.map +1 -0
  54. package/dist/bot/handlers/topic.js +43 -0
  55. package/dist/bot/handlers/topic.js.map +1 -0
  56. package/dist/bot/index.d.ts +5 -0
  57. package/dist/bot/index.d.ts.map +1 -0
  58. package/dist/bot/index.js +66 -0
  59. package/dist/bot/index.js.map +1 -0
  60. package/dist/cli/daemon.d.ts +6 -0
  61. package/dist/cli/daemon.d.ts.map +1 -0
  62. package/dist/cli/daemon.js +255 -0
  63. package/dist/cli/daemon.js.map +1 -0
  64. package/dist/cli/init.d.ts +19 -0
  65. package/dist/cli/init.d.ts.map +1 -0
  66. package/dist/cli/init.js +235 -0
  67. package/dist/cli/init.js.map +1 -0
  68. package/dist/cli/logs.d.ts +6 -0
  69. package/dist/cli/logs.d.ts.map +1 -0
  70. package/dist/cli/logs.js +42 -0
  71. package/dist/cli/logs.js.map +1 -0
  72. package/dist/cli/start.d.ts +4 -0
  73. package/dist/cli/start.d.ts.map +1 -0
  74. package/dist/cli/start.js +254 -0
  75. package/dist/cli/start.js.map +1 -0
  76. package/dist/plugin/index.d.ts +4 -0
  77. package/dist/plugin/index.d.ts.map +1 -0
  78. package/dist/plugin/index.js +73 -0
  79. package/dist/plugin/index.js.map +1 -0
  80. package/dist/server/api.d.ts +3 -0
  81. package/dist/server/api.d.ts.map +1 -0
  82. package/dist/server/api.js +30 -0
  83. package/dist/server/api.js.map +1 -0
  84. package/dist/server/events.d.ts +18 -0
  85. package/dist/server/events.d.ts.map +1 -0
  86. package/dist/server/events.js +131 -0
  87. package/dist/server/events.js.map +1 -0
  88. package/dist/server/filters.d.ts +19 -0
  89. package/dist/server/filters.d.ts.map +1 -0
  90. package/dist/server/filters.js +149 -0
  91. package/dist/server/filters.js.map +1 -0
  92. package/dist/server/index.d.ts +4 -0
  93. package/dist/server/index.d.ts.map +1 -0
  94. package/dist/server/index.js +10 -0
  95. package/dist/server/index.js.map +1 -0
  96. package/dist/server/sdk.d.ts +36 -0
  97. package/dist/server/sdk.d.ts.map +1 -0
  98. package/dist/server/sdk.js +485 -0
  99. package/dist/server/sdk.js.map +1 -0
  100. package/dist/shared/config.d.ts +34 -0
  101. package/dist/shared/config.d.ts.map +1 -0
  102. package/dist/shared/config.js +163 -0
  103. package/dist/shared/config.js.map +1 -0
  104. package/dist/shared/logger.d.ts +5 -0
  105. package/dist/shared/logger.d.ts.map +1 -0
  106. package/dist/shared/logger.js +114 -0
  107. package/dist/shared/logger.js.map +1 -0
  108. package/dist/shared/mapping.d.ts +90 -0
  109. package/dist/shared/mapping.d.ts.map +1 -0
  110. package/dist/shared/mapping.js +234 -0
  111. package/dist/shared/mapping.js.map +1 -0
  112. package/dist/shared/message-queue.d.ts +64 -0
  113. package/dist/shared/message-queue.d.ts.map +1 -0
  114. package/dist/shared/message-queue.js +138 -0
  115. package/dist/shared/message-queue.js.map +1 -0
  116. package/dist/shared/types.d.ts +284 -0
  117. package/dist/shared/types.d.ts.map +1 -0
  118. package/dist/shared/types.js +7 -0
  119. package/dist/shared/types.js.map +1 -0
  120. package/index.js +1 -0
  121. package/package.json +71 -0
@@ -0,0 +1,42 @@
1
+ import { readLogs, getLogFilePath, clearLogs } from '../shared/logger.js';
2
+ import * as fs from 'fs';
3
+ import { exec } from 'child_process';
4
+ export async function showLocalLogs(options = {}) {
5
+ const logFile = getLogFilePath();
6
+ if (options.clear) {
7
+ clearLogs();
8
+ console.log('✅ 日志已清空');
9
+ return;
10
+ }
11
+ if (!fs.existsSync(logFile)) {
12
+ console.log('ℹ️ 暂无日志文件');
13
+ console.log(` 日志文件位置: ${logFile}`);
14
+ return;
15
+ }
16
+ if (options.follow) {
17
+ console.log('📋 实时日志 (按 Ctrl+C 退出)\n');
18
+ const tail = exec(`tail -f "${logFile}"`);
19
+ tail.stdout?.pipe(process.stdout);
20
+ tail.stderr?.pipe(process.stderr);
21
+ process.on('SIGINT', () => {
22
+ tail.kill();
23
+ process.exit(0);
24
+ });
25
+ }
26
+ else {
27
+ const lines = options.lines || 50;
28
+ const logs = readLogs(lines);
29
+ if (logs.length === 0) {
30
+ console.log('ℹ️ 日志文件为空');
31
+ return;
32
+ }
33
+ console.log(`📋 最近 ${logs.length} 条日志:\n`);
34
+ logs.forEach(line => console.log(line));
35
+ console.log(`\n日志文件: ${logFile}`);
36
+ console.log(`\n提示:`);
37
+ console.log(` 查看更多: opencode-channels logs --lines 200`);
38
+ console.log(` 实时查看: opencode-channels logs --follow`);
39
+ console.log(` 清空日志: opencode-channels logs --clear`);
40
+ }
41
+ }
42
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAErC,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAiE,EAAE;IACrG,MAAM,OAAO,GAAG,cAAc,EAAE,CAAC;IAEjC,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,SAAS,EAAE,CAAC;QACZ,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACvB,OAAO;IACT,CAAC;IAED,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,cAAc,OAAO,EAAE,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;QAEvC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,OAAO,GAAG,CAAC,CAAC;QAE1C,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAClC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAElC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;YACxB,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAC1B,OAAO;QACT,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,MAAM,SAAS,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC;IACxD,CAAC;AACH,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function startCommand(options?: {
2
+ noDaemon?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"AAwGA,wBAAsB,YAAY,CAAC,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqLtF"}
@@ -0,0 +1,254 @@
1
+ import { serve } from '@hono/node-server';
2
+ import { spawn, execSync } from 'child_process';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ import { loadConfig } from '../shared/config.js';
6
+ import { createServer } from '../server/index.js';
7
+ import { createBot } from '../bot/index.js';
8
+ import { setupLogger } from '../shared/logger.js';
9
+ import { setSendToTelegram } from '../server/events.js';
10
+ import { clearStaleMessages, getInflightMessages, removeInflightMessage, } from '../shared/message-queue.js';
11
+ import { getLatestAssistantMessage } from '../server/sdk.js';
12
+ import { formatCompensationReply } from '../bot/handlers/message.js';
13
+ const OPENCODE_PORT = 3838;
14
+ const OPENCODE_HOST = '127.0.0.1';
15
+ function killPort(port) {
16
+ try {
17
+ const pids = execSync(`lsof -ti :${port}`, { encoding: 'utf-8', timeout: 5000 })
18
+ .trim()
19
+ .split('\n')
20
+ .filter(Boolean);
21
+ if (pids.length === 0)
22
+ return;
23
+ for (const pid of pids) {
24
+ try {
25
+ process.kill(Number(pid), 'SIGTERM');
26
+ }
27
+ catch { }
28
+ }
29
+ console.log(`🔪 已终止端口 ${port} 上的旧进程: ${pids.join(', ')}`);
30
+ execSync('sleep 2');
31
+ try {
32
+ const remaining = execSync(`lsof -ti :${port}`, { encoding: 'utf-8', timeout: 5000 })
33
+ .trim()
34
+ .split('\n')
35
+ .filter(Boolean);
36
+ for (const pid of remaining) {
37
+ try {
38
+ process.kill(Number(pid), 'SIGKILL');
39
+ }
40
+ catch { }
41
+ }
42
+ if (remaining.length > 0) {
43
+ console.log(`🔪 强制终止残留进程: ${remaining.join(', ')}`);
44
+ execSync('sleep 1');
45
+ }
46
+ }
47
+ catch { }
48
+ }
49
+ catch { }
50
+ }
51
+ function findOpencodeCli() {
52
+ const globalBin = path.join(process.env.HOME || '', '.opencode/bin/opencode');
53
+ const candidates = [
54
+ globalBin,
55
+ '/Applications/OpenCode Dev.app/Contents/MacOS/opencode-cli',
56
+ '/Applications/OpenCode.app/Contents/MacOS/opencode-cli',
57
+ ];
58
+ for (const p of candidates) {
59
+ if (!fs.existsSync(p))
60
+ continue;
61
+ try {
62
+ execSync(`"${p}" --help`, { stdio: 'ignore', timeout: 3000 });
63
+ return p;
64
+ }
65
+ catch { }
66
+ }
67
+ return 'opencode';
68
+ }
69
+ async function waitForServer(url, timeoutMs = 15000) {
70
+ const start = Date.now();
71
+ while (Date.now() - start < timeoutMs) {
72
+ try {
73
+ const res = await fetch(url);
74
+ if (res.ok || res.status < 500)
75
+ return true;
76
+ }
77
+ catch { }
78
+ await new Promise((r) => setTimeout(r, 500));
79
+ }
80
+ return false;
81
+ }
82
+ function startOpencodeServer() {
83
+ killPort(OPENCODE_PORT);
84
+ const cli = findOpencodeCli();
85
+ console.log(`🚀 正在启动 OpenCode Server (${cli})...`);
86
+ console.log(` 端口: ${OPENCODE_PORT}`);
87
+ console.log(` 地址: ${OPENCODE_HOST}\n`);
88
+ const child = spawn(cli, ['serve', `--port=${OPENCODE_PORT}`, `--hostname=${OPENCODE_HOST}`], {
89
+ stdio: 'inherit',
90
+ env: {
91
+ ...process.env,
92
+ OPENCODE_SERVER_PASSWORD: '',
93
+ },
94
+ });
95
+ child.on('error', (error) => {
96
+ console.error('❌ OpenCode Server 启动失败:', error.message);
97
+ });
98
+ return child;
99
+ }
100
+ export async function startCommand(options = {}) {
101
+ setupLogger();
102
+ try {
103
+ const config = loadConfig();
104
+ if (!config) {
105
+ console.error('❌ 配置文件不存在,请先运行 opencode-channels init');
106
+ process.exit(1);
107
+ }
108
+ if (!config.channels.telegram.enabled || !config.channels.telegram.token) {
109
+ console.error('❌ Telegram 未配置或未启用,请先运行 opencode-channels init');
110
+ process.exit(1);
111
+ }
112
+ if (!options.noDaemon) {
113
+ console.log('🚀 正在启动 OpenCode Channels...\n');
114
+ }
115
+ let opencodeServer = null;
116
+ if (options.noDaemon) {
117
+ // daemon 模式:opencode server 由 PM2 独立管理,只等待它就绪
118
+ const ready = await waitForServer(`http://${OPENCODE_HOST}:${OPENCODE_PORT}`);
119
+ if (ready) {
120
+ console.log(`✅ OpenCode Server 已就绪 (http://${OPENCODE_HOST}:${OPENCODE_PORT})\n`);
121
+ }
122
+ else {
123
+ console.error('⚠️ OpenCode Server 未就绪,部分功能可能不可用\n');
124
+ }
125
+ }
126
+ else {
127
+ // 前台模式:自行启动 opencode server
128
+ opencodeServer = startOpencodeServer();
129
+ const ready = await waitForServer(`http://${OPENCODE_HOST}:${OPENCODE_PORT}`);
130
+ if (ready) {
131
+ console.log(`✅ OpenCode Server 已就绪 (http://${OPENCODE_HOST}:${OPENCODE_PORT})\n`);
132
+ }
133
+ else {
134
+ console.error('⚠️ OpenCode Server 未在预期时间内就绪,继续启动 Channels...\n');
135
+ }
136
+ }
137
+ killPort(config.server.port);
138
+ const app = createServer(config);
139
+ const server = serve({
140
+ fetch: app.fetch,
141
+ port: config.server.port,
142
+ hostname: config.server.host,
143
+ });
144
+ console.log(`✅ HTTP Server 已启动`);
145
+ console.log(` 地址: http://${config.server.host}:${config.server.port}\n`);
146
+ let bot = null;
147
+ try {
148
+ bot = await createBot(config.channels.telegram.token);
149
+ const botInfo = await bot.api.getMe();
150
+ console.log(`✅ Telegram Bot 已启动`);
151
+ console.log(` 用户名: @${botInfo.username}`);
152
+ console.log(` 名称: ${botInfo.first_name}\n`);
153
+ const sendToTelegram = async (chatId, topicId, message, options) => {
154
+ if (!bot)
155
+ return;
156
+ if (options?.deleteStatusMessage) {
157
+ const { getStatusMessageId, clearStatusMessageId } = await import('../shared/mapping.js');
158
+ const statusMessageId = getStatusMessageId(chatId, topicId);
159
+ if (statusMessageId) {
160
+ await bot.api.deleteMessage(chatId, statusMessageId).catch(() => { });
161
+ clearStatusMessageId(chatId, topicId);
162
+ }
163
+ }
164
+ const parseMode = options?.parse_mode === 'Markdown' ? 'Markdown' : undefined;
165
+ await bot.api.sendMessage(chatId, message, {
166
+ message_thread_id: topicId || undefined,
167
+ parse_mode: parseMode,
168
+ reply_markup: options?.reply_markup,
169
+ });
170
+ };
171
+ setSendToTelegram(sendToTelegram);
172
+ bot.catch((err) => {
173
+ console.error('❌ Telegram Bot 错误:', err.message);
174
+ });
175
+ bot.start({
176
+ drop_pending_updates: true,
177
+ onStart: async () => {
178
+ console.log('📡 Bot 正在监听消息...\n');
179
+ console.log('🔄 检查未完成的消息...');
180
+ clearStaleMessages(30 * 60 * 1000);
181
+ const inflightMessages = getInflightMessages();
182
+ if (inflightMessages.length > 0) {
183
+ console.log(`📬 发现 ${inflightMessages.length} 条未送达消息,开始恢复...`);
184
+ for (const msg of inflightMessages) {
185
+ try {
186
+ const latest = await getLatestAssistantMessage(msg.sessionId, msg.projectPath);
187
+ if (latest) {
188
+ const formatted = formatCompensationReply(latest);
189
+ await sendToTelegram(msg.chatId, msg.topicId, formatted);
190
+ removeInflightMessage(msg.id);
191
+ console.log(`✅ 恢复消息成功: ${msg.id}`);
192
+ }
193
+ else {
194
+ console.log(`⚠️ 未找到 AI 回复,跳过: ${msg.id}`);
195
+ }
196
+ }
197
+ catch (error) {
198
+ console.error(`❌ 恢复消息失败: ${msg.id}`, error);
199
+ }
200
+ }
201
+ console.log('✅ 消息恢复完成\n');
202
+ }
203
+ else {
204
+ console.log('✅ 无需恢复消息\n');
205
+ }
206
+ if (!options.noDaemon) {
207
+ console.log('按 Ctrl+C 停止服务');
208
+ }
209
+ },
210
+ });
211
+ }
212
+ catch (error) {
213
+ console.error('❌ Telegram Bot 启动失败:', error instanceof Error ? error.message : String(error));
214
+ console.error('\n可能的原因:');
215
+ console.error(' 1. Bot Token 无效或已被撤销');
216
+ console.error(' 2. 网络无法访问 Telegram API (需要代理)');
217
+ console.error(' 3. Token 格式错误\n');
218
+ console.error('解决方法:');
219
+ console.error(' 1. 前往 @BotFather 重新生成 Token');
220
+ console.error(' 2. 运行 opencode-channels init 重新配置');
221
+ console.error(' 3. 检查网络连接或配置代理\n');
222
+ console.error('⚠️ HTTP Server 仍在运行,但 Telegram Bot 功能不可用');
223
+ bot = null;
224
+ }
225
+ const shutdown = async () => {
226
+ console.log('\n\n🛑 正在关闭服务...');
227
+ try {
228
+ if (bot) {
229
+ await bot.stop();
230
+ console.log('✅ Telegram Bot 已停止');
231
+ }
232
+ server.close();
233
+ console.log('✅ HTTP Server 已停止');
234
+ if (opencodeServer && !opencodeServer.killed) {
235
+ opencodeServer.kill('SIGTERM');
236
+ console.log('✅ OpenCode Server 已停止');
237
+ }
238
+ console.log('\n👋 服务已关闭');
239
+ process.exit(0);
240
+ }
241
+ catch (error) {
242
+ console.error('❌ 关闭服务时出错:', error);
243
+ process.exit(1);
244
+ }
245
+ };
246
+ process.on('SIGINT', shutdown);
247
+ process.on('SIGTERM', shutdown);
248
+ }
249
+ catch (error) {
250
+ console.error('❌ 启动失败:', error instanceof Error ? error.message : String(error));
251
+ process.exit(1);
252
+ }
253
+ }
254
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/cli/start.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { Plugin } from '@opencode-ai/plugin';
2
+ declare const OpenCodeChannelsPlugin: Plugin;
3
+ export default OpenCodeChannelsPlugin;
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAoClD,QAAA,MAAM,sBAAsB,EAAE,MAiD7B,CAAC;AAEF,eAAe,sBAAsB,CAAC"}
@@ -0,0 +1,73 @@
1
+ // 延迟加载配置,避免在模块加载时执行同步 I/O
2
+ let cachedConfig = null;
3
+ let configLoadAttempted = false;
4
+ function getConfig() {
5
+ if (configLoadAttempted) {
6
+ return cachedConfig;
7
+ }
8
+ configLoadAttempted = true;
9
+ try {
10
+ // 动态导入以避免模块加载时的副作用
11
+ const fs = require('fs');
12
+ const path = require('path');
13
+ const os = require('os');
14
+ const configFile = path.join(os.homedir(), '.config', 'opencode', 'channels.json');
15
+ if (!fs.existsSync(configFile)) {
16
+ console.log('[opencode-channels] Config file not found:', configFile);
17
+ return null;
18
+ }
19
+ const content = fs.readFileSync(configFile, 'utf-8');
20
+ cachedConfig = JSON.parse(content);
21
+ console.log('[opencode-channels] Config loaded successfully');
22
+ return cachedConfig;
23
+ }
24
+ catch (error) {
25
+ console.error('[opencode-channels] Failed to load config:', error);
26
+ return null;
27
+ }
28
+ }
29
+ const OpenCodeChannelsPlugin = async (_ctx) => {
30
+ console.log('[opencode-channels] Plugin initializing...');
31
+ // 预加载配置,但不阻塞
32
+ const config = getConfig();
33
+ if (!config) {
34
+ console.log('[opencode-channels] No config found, plugin will be inactive');
35
+ }
36
+ else {
37
+ console.log('[opencode-channels] Plugin initialized with config');
38
+ }
39
+ return {
40
+ event: async ({ event }) => {
41
+ try {
42
+ const config = getConfig();
43
+ if (!config) {
44
+ return;
45
+ }
46
+ const { notifications } = config;
47
+ const eventType = event.type;
48
+ // Map SDK event types to notification config
49
+ const shouldForward = (eventType === 'permission.updated' && notifications.onPermission) ||
50
+ (eventType === 'session.idle' && notifications.onIdle) ||
51
+ (eventType === 'session.error' && notifications.onError);
52
+ if (!shouldForward) {
53
+ return;
54
+ }
55
+ console.log('[opencode-channels] Forwarding event:', eventType);
56
+ const baseUrl = `http://${config.server.host}:${config.server.port}`;
57
+ await fetch(`${baseUrl}/events`, {
58
+ method: 'POST',
59
+ headers: {
60
+ 'Content-Type': 'application/json',
61
+ },
62
+ body: JSON.stringify(event),
63
+ });
64
+ console.log('[opencode-channels] Event forwarded successfully');
65
+ }
66
+ catch (error) {
67
+ console.error('[opencode-channels] Failed to forward event:', error);
68
+ }
69
+ },
70
+ };
71
+ };
72
+ export default OpenCodeChannelsPlugin;
73
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/plugin/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Hono } from 'hono';
2
+ export declare function registerRoutes(app: Hono): void;
3
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAA;AAIhC,wBAAgB,cAAc,CAAC,GAAG,EAAE,IAAI,QA6BvC"}
@@ -0,0 +1,30 @@
1
+ import { handleEvent } from './events.js';
2
+ import { addGroupMapping, getAllMappings } from '../shared/mapping.js';
3
+ export function registerRoutes(app) {
4
+ app.post('/events', async (c) => {
5
+ const event = await c.req.json();
6
+ await handleEvent(event);
7
+ return c.json({ success: true });
8
+ });
9
+ app.get('/status', (c) => {
10
+ const mappings = getAllMappings();
11
+ return c.json({
12
+ running: true,
13
+ telegram: {
14
+ connected: true
15
+ },
16
+ mappings: {
17
+ count: mappings.groups.length + mappings.topics.length
18
+ }
19
+ });
20
+ });
21
+ app.post('/mappings/group', async (c) => {
22
+ const { chatId, projectPath } = await c.req.json();
23
+ addGroupMapping(chatId, projectPath);
24
+ return c.json({ success: true });
25
+ });
26
+ app.get('/mappings', (c) => {
27
+ return c.json(getAllMappings());
28
+ });
29
+ }
30
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/server/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAEtE,MAAM,UAAU,cAAc,CAAC,GAAS;IACtC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAChC,MAAM,WAAW,CAAC,KAAK,CAAC,CAAA;QACxB,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE;QACvB,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAA;QACjC,OAAO,CAAC,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE;gBACR,SAAS,EAAE,IAAI;aAChB;YACD,QAAQ,EAAE;gBACR,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM;aACvD;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACtC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,CAAA;QAClD,eAAe,CAAC,MAAM,EAAE,WAAW,CAAC,CAAA;QACpC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IAEF,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE;QACzB,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * 事件处理模块
3
+ *
4
+ * 负责处理 OpenCode 事件,查找对应的 Telegram 映射并发送通知
5
+ */
6
+ import type { OpenCodeEvent } from '../shared/types.js';
7
+ type SendToTelegramFn = (chatId: number, topicId: number, message: string, options?: {
8
+ deleteStatusMessage?: boolean;
9
+ reply_markup?: any;
10
+ parse_mode?: string;
11
+ }) => Promise<void>;
12
+ export declare function setSendToTelegram(fn: SendToTelegramFn | null): void;
13
+ export declare function handleEvent(event: OpenCodeEvent): Promise<{
14
+ success: boolean;
15
+ error?: string;
16
+ }>;
17
+ export {};
18
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../src/server/events.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAKxD,KAAK,gBAAgB,GAAG,CACtB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,KACE,OAAO,CAAC,IAAI,CAAC,CAAC;AAInB,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,gBAAgB,GAAG,IAAI,GAAG,IAAI,CAEnE;AAgBD,wBAAsB,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiIrG"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * 事件处理模块
3
+ *
4
+ * 负责处理 OpenCode 事件,查找对应的 Telegram 映射并发送通知
5
+ */
6
+ import { getAllMappings } from '../shared/mapping.js';
7
+ import { getLatestAssistantMessage } from './sdk.js';
8
+ import { formatAiReply } from '../bot/handlers/message.js';
9
+ let _sendToTelegram = null;
10
+ export function setSendToTelegram(fn) {
11
+ _sendToTelegram = fn;
12
+ }
13
+ function getTopicBySession(sessionId) {
14
+ const mappings = getAllMappings();
15
+ const topicMapping = mappings.topics.find(t => t.sessionId === sessionId);
16
+ if (!topicMapping) {
17
+ return null;
18
+ }
19
+ return {
20
+ chatId: topicMapping.chatId,
21
+ topicId: topicMapping.topicId,
22
+ };
23
+ }
24
+ export async function handleEvent(event) {
25
+ try {
26
+ const sessionId = event.properties.sessionID;
27
+ if (!sessionId) {
28
+ console.log(`[Event] ${event.type} - No sessionID in properties`);
29
+ return { success: true };
30
+ }
31
+ const topicInfo = getTopicBySession(sessionId);
32
+ if (!topicInfo) {
33
+ console.log(`[Event] ${event.type} - No mapping found for session: ${sessionId}`);
34
+ return { success: true };
35
+ }
36
+ if (!_sendToTelegram) {
37
+ console.log(`[Event] ${event.type} - No sendToTelegram callback set`);
38
+ return { success: true };
39
+ }
40
+ switch (event.type) {
41
+ case 'session.idle': {
42
+ console.log(`[Bot] session.idle event for session: ${sessionId}`);
43
+ const latest = await getLatestAssistantMessage(sessionId);
44
+ if (latest) {
45
+ const formatted = formatAiReply(latest);
46
+ await _sendToTelegram(topicInfo.chatId, topicInfo.topicId, formatted, {
47
+ deleteStatusMessage: true,
48
+ });
49
+ console.log(`[Bot] 发送 AI 回复成功`);
50
+ }
51
+ else {
52
+ console.log(`[Bot] 未找到 AI 回复,跳过发送`);
53
+ }
54
+ break;
55
+ }
56
+ case 'session.error': {
57
+ console.log(`[Bot] session.error event for session: ${sessionId}`);
58
+ console.log(`[Bot] 错误详情:`, JSON.stringify(event.properties, null, 2));
59
+ const error = event.properties.error;
60
+ let errorMsg = '❌ AI 处理出错';
61
+ if (error?.data?.message) {
62
+ errorMsg = `❌ AI 错误: ${error.data.message}`;
63
+ }
64
+ await _sendToTelegram(topicInfo.chatId, topicInfo.topicId, errorMsg, {
65
+ deleteStatusMessage: true,
66
+ });
67
+ console.log(`[Bot] 发送错误通知成功`);
68
+ break;
69
+ }
70
+ case 'permission.updated':
71
+ case 'permission.asked': {
72
+ console.log(`[Bot] ${event.type} event for session: ${sessionId}`);
73
+ const id = event.properties.id;
74
+ const permissionType = event.properties.type;
75
+ const pattern = event.properties.pattern;
76
+ const patterns = Array.isArray(pattern) ? pattern : [pattern];
77
+ const title = event.properties.title;
78
+ const metadata = event.properties.metadata;
79
+ let msg = `🔐 权限请求\n\n${title || '权限请求'}\n类型: ${permissionType}\n模式: ${patterns.join(', ')}`;
80
+ if (metadata?.tool) {
81
+ msg += `\n工具: ${metadata.tool}`;
82
+ }
83
+ if (metadata?.path) {
84
+ msg += `\n路径: ${metadata.path}`;
85
+ }
86
+ const buttons = [
87
+ { text: '✅ 允许一次', callback_data: `perm:${id}:once` },
88
+ { text: '✅ 始终允许', callback_data: `perm:${id}:always` },
89
+ { text: '❌ 拒绝', callback_data: `perm:${id}:reject` },
90
+ ];
91
+ await _sendToTelegram(topicInfo.chatId, topicInfo.topicId, msg, {
92
+ reply_markup: { inline_keyboard: [buttons] },
93
+ });
94
+ console.log(`[Bot] 发送权限请求成功`);
95
+ break;
96
+ }
97
+ case 'question.asked': {
98
+ console.log(`[Bot] question.asked event for session: ${sessionId}`);
99
+ const id = event.properties.id;
100
+ const questions = event.properties.questions;
101
+ if (!questions || questions.length === 0) {
102
+ console.log(`[Bot] 无问题数据,跳过`);
103
+ break;
104
+ }
105
+ const question = questions[0];
106
+ let msg = `❓ ${question.header}\n\n${question.question}`;
107
+ if (question.custom === true) {
108
+ msg += '\n\n💡 也可以直接输入文字回复';
109
+ }
110
+ const buttons = question.options.map((opt, idx) => ({
111
+ text: opt.label,
112
+ callback_data: `question:${id}:0:${opt.label}`,
113
+ }));
114
+ await _sendToTelegram(topicInfo.chatId, topicInfo.topicId, msg, {
115
+ reply_markup: { inline_keyboard: [buttons] },
116
+ });
117
+ console.log(`[Bot] 发送问题成功`);
118
+ break;
119
+ }
120
+ default:
121
+ console.log(`[Event] Unknown event type: ${event.type}`);
122
+ }
123
+ return { success: true };
124
+ }
125
+ catch (error) {
126
+ const errorMessage = error instanceof Error ? error.message : String(error);
127
+ console.error(`[Event] Error handling event:`, errorMessage);
128
+ return { success: false, error: errorMessage };
129
+ }
130
+ }
131
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../src/server/events.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import type { AgentInfo, ProviderInfo, ModelInfo } from '../shared/types.js';
2
+ export interface ModelWithProvider extends ModelInfo {
3
+ provider: ProviderInfo;
4
+ }
5
+ export declare function filterVisibleModels(providers: ProviderInfo[]): ModelWithProvider[];
6
+ export declare function filterVisibleAgents(agents: AgentInfo[]): AgentInfo[];
7
+ export declare function findMatchingAgent(agents: AgentInfo[], searchName: string): AgentInfo | null;
8
+ export declare function sortProviders(providerIds: string[]): string[];
9
+ export declare function groupModelsByProvider(models: ModelWithProvider[]): Map<string, ModelWithProvider[]>;
10
+ export declare function formatModelList(models: ModelWithProvider[]): string;
11
+ export declare function formatAgentList(agents: AgentInfo[]): string;
12
+ export declare function formatModelCommand(providerID: string, modelID: string): string;
13
+ export declare function formatAgentCommand(agentName: string): string;
14
+ export declare function parseModelCommand(command: string): {
15
+ providerID: string;
16
+ modelID: string;
17
+ } | null;
18
+ export declare function parseAgentCommand(command: string): string | null;
19
+ //# sourceMappingURL=filters.d.ts.map