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,66 @@
1
+ import { Bot, GrammyError, HttpError } from 'grammy';
2
+ import { registerHandlers } from './handlers/index.js';
3
+ import { setupCommands } from './commands/index.js';
4
+ import { setupSDKCommandHandlers, startPendingCommandCleanup } from './commands/sdk-commands.js';
5
+ import { buildUnboundMenu, buildBoundMenu } from './commands/dynamic.js';
6
+ import { getAllMappings } from '../shared/mapping.js';
7
+ export async function createBot(token) {
8
+ const bot = new Bot(token);
9
+ bot.catch((err) => {
10
+ const ctx = err.ctx;
11
+ const e = err.error;
12
+ const chatId = ctx?.chat?.id ?? 'unknown';
13
+ const topicId = ctx?.message?.message_thread_id ?? 0;
14
+ if (e instanceof GrammyError) {
15
+ if (e.error_code === 429) {
16
+ const retryAfter = e.parameters?.retry_after ?? 5;
17
+ console.log(`[Bot] 限流 (429),${retryAfter}s 后重试, chat=${chatId}`);
18
+ return;
19
+ }
20
+ console.error(`[Bot] Telegram API 错误: ${e.description}, chat=${chatId}, topic=${topicId}`);
21
+ }
22
+ else if (e instanceof HttpError) {
23
+ console.error(`[Bot] HTTP 错误: ${e.message}`);
24
+ }
25
+ else {
26
+ console.error(`[Bot] 未知错误: ${e}, chat=${chatId}, topic=${topicId}`);
27
+ }
28
+ });
29
+ await setupCommands(bot);
30
+ setupSDKCommandHandlers(bot);
31
+ registerHandlers(bot);
32
+ startPendingCommandCleanup();
33
+ await initializeCommandMenus(bot);
34
+ return bot;
35
+ }
36
+ async function initializeCommandMenus(bot) {
37
+ try {
38
+ const unboundMenu = await buildUnboundMenu();
39
+ await bot.api.setMyCommands(unboundMenu);
40
+ console.log('[Bot] 设置默认菜单(未绑定状态)');
41
+ const mappings = getAllMappings();
42
+ for (const group of mappings.groups) {
43
+ try {
44
+ const boundMenu = await buildBoundMenu(group.projectPath);
45
+ await bot.api.setMyCommands(boundMenu, {
46
+ scope: { type: 'chat', chat_id: group.chatId }
47
+ });
48
+ console.log(`[Bot] 为群组 ${group.chatId} 设置已绑定菜单`);
49
+ }
50
+ catch (error) {
51
+ const errorMessage = error instanceof Error ? error.message : String(error);
52
+ console.error(`[Bot] 为群组 ${group.chatId} 设置菜单失败: ${errorMessage}`);
53
+ }
54
+ }
55
+ }
56
+ catch (error) {
57
+ const errorMessage = error instanceof Error ? error.message : String(error);
58
+ console.error(`[Bot] 初始化菜单失败: ${errorMessage}`);
59
+ }
60
+ }
61
+ export async function sendNotification(bot, chatId, topicId, message) {
62
+ await bot.api.sendMessage(chatId, message, {
63
+ message_thread_id: topicId,
64
+ });
65
+ }
66
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bot/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function startDaemon(): Promise<void>;
2
+ export declare function stopDaemon(): Promise<void>;
3
+ export declare function restartDaemon(): Promise<void>;
4
+ export declare function showStatus(): Promise<void>;
5
+ export declare function showLogs(): Promise<void>;
6
+ //# sourceMappingURL=daemon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AA2FA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA0DjD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAmChD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAmCnD;AAED,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAiChD;AAED,wBAAsB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAyB9C"}
@@ -0,0 +1,255 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import * as path from 'path';
4
+ import * as fs from 'fs';
5
+ const execAsync = promisify(exec);
6
+ const PM2_CHANNELS_NAME = 'opencode-channels';
7
+ const PM2_SERVER_NAME = 'opencode-server';
8
+ function getPM2Command() {
9
+ const localPM2 = path.join(process.cwd(), 'node_modules', '.bin', 'pm2');
10
+ if (fs.existsSync(localPM2)) {
11
+ return localPM2;
12
+ }
13
+ return 'pm2';
14
+ }
15
+ function findOpencodeCli() {
16
+ const globalBin = path.join(process.env.HOME || '', '.opencode/bin/opencode');
17
+ const candidates = [
18
+ globalBin,
19
+ '/Applications/OpenCode Dev.app/Contents/MacOS/opencode-cli',
20
+ '/Applications/OpenCode.app/Contents/MacOS/opencode-cli',
21
+ ];
22
+ for (const p of candidates) {
23
+ if (!fs.existsSync(p))
24
+ continue;
25
+ try {
26
+ const { execSync } = require('child_process');
27
+ execSync(`"${p}" --help`, { stdio: 'ignore', timeout: 3000 });
28
+ return p;
29
+ }
30
+ catch { }
31
+ }
32
+ return 'opencode';
33
+ }
34
+ async function isPM2Installed() {
35
+ try {
36
+ const pm2Cmd = getPM2Command();
37
+ await execAsync(`${pm2Cmd} --version`);
38
+ return true;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ async function showPM2InstallGuide() {
45
+ console.error('❌ PM2 未安装\n');
46
+ console.log('后台服务需要 PM2 作为进程守护工具。\n');
47
+ console.log('安装方法:\n');
48
+ console.log(' 使用 npm:');
49
+ console.log(' npm install -g pm2\n');
50
+ console.log(' 使用 bun:');
51
+ console.log(' bun install -g pm2\n');
52
+ console.log(' 使用 yarn:');
53
+ console.log(' yarn global add pm2\n');
54
+ console.log(' 使用 pnpm:');
55
+ console.log(' pnpm add -g pm2\n');
56
+ console.log('安装完成后,重新运行此命令。\n');
57
+ console.log('或者使用前台服务(不需要 PM2):');
58
+ console.log(' opencode-channels start');
59
+ }
60
+ async function getAllProcesses() {
61
+ try {
62
+ const pm2Cmd = getPM2Command();
63
+ const { stdout } = await execAsync(`${pm2Cmd} jlist`);
64
+ return JSON.parse(stdout);
65
+ }
66
+ catch {
67
+ return [];
68
+ }
69
+ }
70
+ function findProcess(processes, name) {
71
+ return processes.find(p => p.name === name) || null;
72
+ }
73
+ export async function startDaemon() {
74
+ if (!(await isPM2Installed())) {
75
+ await showPM2InstallGuide();
76
+ process.exit(1);
77
+ }
78
+ const processes = await getAllProcesses();
79
+ const serverProc = findProcess(processes, PM2_SERVER_NAME);
80
+ const channelsProc = findProcess(processes, PM2_CHANNELS_NAME);
81
+ if (serverProc?.pm2_env.status === 'online' && channelsProc?.pm2_env.status === 'online') {
82
+ console.log('ℹ️ 服务已在后台运行\n');
83
+ printProcessStatus(PM2_SERVER_NAME, serverProc);
84
+ printProcessStatus(PM2_CHANNELS_NAME, channelsProc);
85
+ console.log('\n使用 opencode-channels stop 停止服务');
86
+ return;
87
+ }
88
+ try {
89
+ console.log('🚀 正在启动后台服务...\n');
90
+ const pm2Cmd = getPM2Command();
91
+ if (!serverProc || serverProc.pm2_env.status !== 'online') {
92
+ const opencodeCli = findOpencodeCli();
93
+ await execAsync(`${pm2Cmd} start "${opencodeCli}" --name "${PM2_SERVER_NAME}" --interpreter none -- serve --port=3838 --hostname=127.0.0.1`, {
94
+ cwd: process.cwd(),
95
+ env: { ...process.env, OPENCODE_SERVER_PASSWORD: '' },
96
+ });
97
+ console.log('✅ OpenCode Server 已启动 (http://127.0.0.1:3838)');
98
+ }
99
+ else {
100
+ console.log('ℹ️ OpenCode Server 已在运行');
101
+ }
102
+ if (!channelsProc || channelsProc.pm2_env.status !== 'online') {
103
+ const scriptPath = path.resolve(process.argv[1]);
104
+ await execAsync(`${pm2Cmd} start "${scriptPath}" --name "${PM2_CHANNELS_NAME}" -- start --no-daemon`, { cwd: process.cwd() });
105
+ console.log('✅ OpenCode Channels 已启动');
106
+ }
107
+ else {
108
+ console.log('ℹ️ OpenCode Channels 已在运行');
109
+ }
110
+ await execAsync(`${pm2Cmd} save`);
111
+ console.log('\n常用命令:');
112
+ console.log(' opencode-channels status - 查看服务状态');
113
+ console.log(' opencode-channels stop - 停止服务');
114
+ console.log(' opencode-channels logs - 查看日志');
115
+ console.log(' pm2 monit - 实时监控');
116
+ }
117
+ catch (error) {
118
+ console.error('❌ 启动失败:', error instanceof Error ? error.message : String(error));
119
+ process.exit(1);
120
+ }
121
+ }
122
+ export async function stopDaemon() {
123
+ if (!(await isPM2Installed())) {
124
+ await showPM2InstallGuide();
125
+ process.exit(1);
126
+ }
127
+ const processes = await getAllProcesses();
128
+ const serverProc = findProcess(processes, PM2_SERVER_NAME);
129
+ const channelsProc = findProcess(processes, PM2_CHANNELS_NAME);
130
+ if (!serverProc && !channelsProc) {
131
+ console.log('ℹ️ 服务未运行');
132
+ return;
133
+ }
134
+ try {
135
+ console.log('🛑 正在停止后台服务...\n');
136
+ const pm2Cmd = getPM2Command();
137
+ if (channelsProc) {
138
+ await execAsync(`${pm2Cmd} delete ${PM2_CHANNELS_NAME}`);
139
+ console.log('✅ OpenCode Channels 已停止');
140
+ }
141
+ if (serverProc) {
142
+ await execAsync(`${pm2Cmd} delete ${PM2_SERVER_NAME}`);
143
+ console.log('✅ OpenCode Server 已停止');
144
+ }
145
+ await execAsync(`${pm2Cmd} save --force`);
146
+ console.log('\n✅ 后台服务已停止');
147
+ }
148
+ catch (error) {
149
+ console.error('❌ 停止失败:', error instanceof Error ? error.message : String(error));
150
+ process.exit(1);
151
+ }
152
+ }
153
+ export async function restartDaemon() {
154
+ if (!(await isPM2Installed())) {
155
+ await showPM2InstallGuide();
156
+ process.exit(1);
157
+ }
158
+ const processes = await getAllProcesses();
159
+ const serverProc = findProcess(processes, PM2_SERVER_NAME);
160
+ const channelsProc = findProcess(processes, PM2_CHANNELS_NAME);
161
+ if (!serverProc && !channelsProc) {
162
+ console.log('ℹ️ 服务未运行,正在启动...');
163
+ await startDaemon();
164
+ return;
165
+ }
166
+ try {
167
+ console.log('🔄 正在重启后台服务...\n');
168
+ const pm2Cmd = getPM2Command();
169
+ if (serverProc) {
170
+ await execAsync(`${pm2Cmd} restart ${PM2_SERVER_NAME}`);
171
+ console.log('✅ OpenCode Server 已重启');
172
+ }
173
+ if (channelsProc) {
174
+ await execAsync(`${pm2Cmd} restart ${PM2_CHANNELS_NAME}`);
175
+ console.log('✅ OpenCode Channels 已重启');
176
+ }
177
+ console.log('\n✅ 后台服务已重启');
178
+ }
179
+ catch (error) {
180
+ console.error('❌ 重启失败:', error instanceof Error ? error.message : String(error));
181
+ process.exit(1);
182
+ }
183
+ }
184
+ export async function showStatus() {
185
+ if (!(await isPM2Installed())) {
186
+ await showPM2InstallGuide();
187
+ process.exit(1);
188
+ }
189
+ const processes = await getAllProcesses();
190
+ const serverProc = findProcess(processes, PM2_SERVER_NAME);
191
+ const channelsProc = findProcess(processes, PM2_CHANNELS_NAME);
192
+ if (!serverProc && !channelsProc) {
193
+ console.log('ℹ️ 服务未运行');
194
+ console.log('\n使用 opencode-channels daemon 启动后台服务');
195
+ return;
196
+ }
197
+ console.log('📊 OpenCode Channels 服务状态\n');
198
+ if (serverProc) {
199
+ printProcessStatus(PM2_SERVER_NAME, serverProc);
200
+ }
201
+ else {
202
+ console.log(`[${PM2_SERVER_NAME}] ❌ 未运行`);
203
+ }
204
+ console.log('');
205
+ if (channelsProc) {
206
+ printProcessStatus(PM2_CHANNELS_NAME, channelsProc);
207
+ }
208
+ else {
209
+ console.log(`[${PM2_CHANNELS_NAME}] ❌ 未运行`);
210
+ }
211
+ console.log('\n使用 opencode-channels logs 查看日志');
212
+ }
213
+ export async function showLogs() {
214
+ if (!(await isPM2Installed())) {
215
+ await showPM2InstallGuide();
216
+ process.exit(1);
217
+ }
218
+ const processes = await getAllProcesses();
219
+ const hasAny = findProcess(processes, PM2_SERVER_NAME) || findProcess(processes, PM2_CHANNELS_NAME);
220
+ if (!hasAny) {
221
+ console.log('ℹ️ 服务未运行');
222
+ return;
223
+ }
224
+ console.log('📋 查看日志 (按 Ctrl+C 退出)\n');
225
+ const pm2Cmd = getPM2Command();
226
+ const child = exec(`${pm2Cmd} logs --lines 50`);
227
+ child.stdout?.pipe(process.stdout);
228
+ child.stderr?.pipe(process.stderr);
229
+ process.on('SIGINT', () => {
230
+ child.kill();
231
+ process.exit(0);
232
+ });
233
+ }
234
+ function printProcessStatus(name, proc) {
235
+ const uptime = Math.floor((Date.now() - proc.pm2_env.pm_uptime) / 1000);
236
+ const status = proc.pm2_env.status === 'online' ? '✅ 运行中' : '❌ 已停止';
237
+ console.log(`[${name}] ${status} PID: ${proc.pid} 运行: ${formatUptime(uptime)} 重启: ${proc.pm2_env.restart_time}次`);
238
+ }
239
+ function formatUptime(seconds) {
240
+ const days = Math.floor(seconds / 86400);
241
+ const hours = Math.floor((seconds % 86400) / 3600);
242
+ const minutes = Math.floor((seconds % 3600) / 60);
243
+ const secs = seconds % 60;
244
+ const parts = [];
245
+ if (days > 0)
246
+ parts.push(`${days}天`);
247
+ if (hours > 0)
248
+ parts.push(`${hours}小时`);
249
+ if (minutes > 0)
250
+ parts.push(`${minutes}分钟`);
251
+ if (secs > 0 || parts.length === 0)
252
+ parts.push(`${secs}秒`);
253
+ return parts.join(' ');
254
+ }
255
+ //# sourceMappingURL=daemon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * 获取 OpenCode 配置目录(跨平台兼容)
3
+ */
4
+ declare function getOpencodeConfigDir(): string;
5
+ /**
6
+ * 创建目录(跨平台兼容)
7
+ */
8
+ declare function createDirSafe(dirPath: string): void;
9
+ /**
10
+ * 写入文件(跨平台兼容)
11
+ */
12
+ declare function writeFileSafe(filePath: string, content: string): void;
13
+ /**
14
+ * 检测是否为开发模式
15
+ */
16
+ declare function isDevelopmentMode(): boolean;
17
+ export declare function initCommand(): Promise<void>;
18
+ export { getOpencodeConfigDir, createDirSafe, writeFileSafe, isDevelopmentMode };
19
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,iBAAS,oBAAoB,IAAI,MAAM,CAWtC;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAW5C;AAED;;GAEG;AACH,iBAAS,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAS9D;AAED;;GAEG;AACH,iBAAS,iBAAiB,IAAI,OAAO,CAepC;AAyED,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA+GjD;AAED,OAAO,EACL,oBAAoB,EACpB,aAAa,EACb,aAAa,EACb,iBAAiB,EAClB,CAAC"}
@@ -0,0 +1,235 @@
1
+ import inquirer from 'inquirer';
2
+ import { saveConfig, getDefaultConfig } from '../shared/config.js';
3
+ import * as fs from 'fs';
4
+ import * as path from 'path';
5
+ import * as os from 'os';
6
+ import { startDaemon } from './daemon.js';
7
+ /**
8
+ * 获取 OpenCode 配置目录(跨平台兼容)
9
+ */
10
+ function getOpencodeConfigDir() {
11
+ const platform = os.platform();
12
+ if (platform === 'win32') {
13
+ // Windows: %APPDATA%\opencode
14
+ const appData = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming');
15
+ return path.join(appData, 'opencode');
16
+ }
17
+ else {
18
+ // macOS/Linux: ~/.config/opencode
19
+ return path.join(os.homedir(), '.config', 'opencode');
20
+ }
21
+ }
22
+ /**
23
+ * 创建目录(跨平台兼容)
24
+ */
25
+ function createDirSafe(dirPath) {
26
+ if (!fs.existsSync(dirPath)) {
27
+ const platform = os.platform();
28
+ if (platform === 'win32') {
29
+ // Windows 不支持 mode 参数
30
+ fs.mkdirSync(dirPath, { recursive: true });
31
+ }
32
+ else {
33
+ // Unix-like 系统设置权限
34
+ fs.mkdirSync(dirPath, { recursive: true, mode: 0o700 });
35
+ }
36
+ }
37
+ }
38
+ /**
39
+ * 写入文件(跨平台兼容)
40
+ */
41
+ function writeFileSafe(filePath, content) {
42
+ const platform = os.platform();
43
+ if (platform === 'win32') {
44
+ // Windows 不支持 mode 参数
45
+ fs.writeFileSync(filePath, content, { encoding: 'utf-8' });
46
+ }
47
+ else {
48
+ // Unix-like 系统设置权限
49
+ fs.writeFileSync(filePath, content, { encoding: 'utf-8', mode: 0o600 });
50
+ }
51
+ }
52
+ /**
53
+ * 检测是否为开发模式
54
+ */
55
+ function isDevelopmentMode() {
56
+ // 检查是否在项目源码目录中运行
57
+ const currentDir = process.cwd();
58
+ const packageJsonPath = path.join(currentDir, 'package.json');
59
+ if (fs.existsSync(packageJsonPath)) {
60
+ try {
61
+ const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf-8'));
62
+ return pkg.name === 'opencode-channels';
63
+ }
64
+ catch {
65
+ return false;
66
+ }
67
+ }
68
+ return false;
69
+ }
70
+ /**
71
+ * 配置 OpenCode 全局插件
72
+ */
73
+ function configureGlobalPlugin() {
74
+ const opencodeConfigDir = getOpencodeConfigDir();
75
+ const opencodeConfigFile = path.join(opencodeConfigDir, 'opencode.json');
76
+ try {
77
+ createDirSafe(opencodeConfigDir);
78
+ let opencodeConfig = {};
79
+ if (fs.existsSync(opencodeConfigFile)) {
80
+ const content = fs.readFileSync(opencodeConfigFile, 'utf-8');
81
+ opencodeConfig = JSON.parse(content);
82
+ }
83
+ // 支持两种格式:plugin (数组) 和 plugins (对象数组)
84
+ const pluginField = opencodeConfig.plugin ? 'plugin' : 'plugins';
85
+ if (!opencodeConfig[pluginField]) {
86
+ opencodeConfig[pluginField] = [];
87
+ }
88
+ // 检查插件是否已存在
89
+ const pluginExists = opencodeConfig[pluginField].some((p) => {
90
+ if (typeof p === 'string') {
91
+ return p.startsWith('opencode-channels');
92
+ }
93
+ return p.name === 'opencode-channels';
94
+ });
95
+ if (!pluginExists) {
96
+ const isDev = isDevelopmentMode();
97
+ const pluginConfig = {
98
+ name: 'opencode-channels',
99
+ enabled: true,
100
+ config: {
101
+ serverUrl: 'http://localhost:3737',
102
+ events: ['permission.asked', 'session.idle', 'session.error']
103
+ }
104
+ };
105
+ if (isDev) {
106
+ // 开发模式:使用绝对路径
107
+ const pluginPath = path.join(process.cwd(), 'src', 'plugin', 'index.ts');
108
+ pluginConfig.path = pluginPath;
109
+ console.log(`\n📝 检测到开发模式,使用本地路径: ${pluginPath}`);
110
+ }
111
+ else {
112
+ // 生产模式:使用包名
113
+ pluginConfig.package = 'opencode-channels';
114
+ }
115
+ opencodeConfig[pluginField].push(pluginConfig);
116
+ writeFileSafe(opencodeConfigFile, JSON.stringify(opencodeConfig, null, 2));
117
+ console.log(`✅ 已配置 OpenCode 全局插件: ${opencodeConfigFile}`);
118
+ }
119
+ else {
120
+ console.log('ℹ️ OpenCode 全局插件已存在,跳过配置');
121
+ }
122
+ }
123
+ catch (error) {
124
+ console.warn(`⚠️ 警告: 无法配置全局插件: ${error instanceof Error ? error.message : String(error)}`);
125
+ console.warn(' 你可以稍后手动配置,参考文档: AGENTS.md');
126
+ }
127
+ }
128
+ export async function initCommand() {
129
+ console.log('🚀 OpenCode Channels 配置向导\n');
130
+ const defaultConfig = getDefaultConfig();
131
+ const answers = await inquirer.prompt([
132
+ {
133
+ type: 'input',
134
+ name: 'workspace',
135
+ message: 'Workspace 目录 (OpenCode 项目所在目录):',
136
+ validate: (input) => {
137
+ if (!input || input.trim() === '') {
138
+ return '请输入有效的目录路径';
139
+ }
140
+ return true;
141
+ },
142
+ },
143
+ {
144
+ type: 'input',
145
+ name: 'token',
146
+ message: 'Telegram Bot Token:',
147
+ validate: (input) => {
148
+ if (!input || input.trim() === '') {
149
+ return '请输入有效的 Bot Token';
150
+ }
151
+ return true;
152
+ },
153
+ },
154
+ {
155
+ type: 'confirm',
156
+ name: 'onPermission',
157
+ message: '权限请求时发送通知?',
158
+ default: defaultConfig.notifications.onPermission,
159
+ },
160
+ {
161
+ type: 'confirm',
162
+ name: 'onComplete',
163
+ message: '任务完成时发送通知?',
164
+ default: defaultConfig.notifications.onComplete,
165
+ },
166
+ {
167
+ type: 'confirm',
168
+ name: 'onError',
169
+ message: '错误发生时发送通知?',
170
+ default: defaultConfig.notifications.onError,
171
+ },
172
+ {
173
+ type: 'confirm',
174
+ name: 'onIdle',
175
+ message: '空闲时发送通知?',
176
+ default: defaultConfig.notifications.onIdle,
177
+ },
178
+ ]);
179
+ const config = {
180
+ workspace: answers.workspace,
181
+ server: defaultConfig.server,
182
+ channels: {
183
+ telegram: {
184
+ enabled: true,
185
+ token: answers.token,
186
+ },
187
+ },
188
+ notifications: {
189
+ onPermission: answers.onPermission,
190
+ onComplete: answers.onComplete,
191
+ onError: answers.onError,
192
+ onIdle: answers.onIdle,
193
+ },
194
+ };
195
+ try {
196
+ saveConfig(config);
197
+ configureGlobalPlugin();
198
+ console.log('\n✅ 配置已保存到 ~/.config/opencode/channels.json');
199
+ console.log('✅ 全局插件已配置');
200
+ console.log('\n🎉 初始化完成!');
201
+ const { shouldStart } = await inquirer.prompt([
202
+ {
203
+ type: 'list',
204
+ name: 'shouldStart',
205
+ message: '是否现在启动服务?',
206
+ choices: [
207
+ { name: '启动后台服务 (推荐)', value: 'daemon' },
208
+ { name: '启动前台服务', value: 'foreground' },
209
+ { name: '稍后手动启动', value: 'no' }
210
+ ],
211
+ default: 'daemon'
212
+ }
213
+ ]);
214
+ if (shouldStart === 'daemon') {
215
+ console.log('');
216
+ await startDaemon();
217
+ }
218
+ else if (shouldStart === 'foreground') {
219
+ console.log('\n提示: 按 Ctrl+C 可停止服务\n');
220
+ const { startCommand } = await import('./start.js');
221
+ await startCommand();
222
+ }
223
+ else {
224
+ console.log('\n可以使用以下命令启动服务:');
225
+ console.log(' opencode-channels daemon - 后台运行 (推荐)');
226
+ console.log(' opencode-channels start - 前台运行');
227
+ }
228
+ }
229
+ catch (error) {
230
+ console.error(`\n❌ 保存配置失败: ${error instanceof Error ? error.message : String(error)}`);
231
+ process.exit(1);
232
+ }
233
+ }
234
+ export { getOpencodeConfigDir, createDirSafe, writeFileSafe, isDevelopmentMode };
235
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ export declare function showLocalLogs(options?: {
2
+ lines?: number;
3
+ follow?: boolean;
4
+ clear?: boolean;
5
+ }): Promise<void>;
6
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/cli/logs.ts"],"names":[],"mappings":"AAIA,wBAAsB,aAAa,CAAC,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CA4CtH"}