@neomei/opencode-feishu 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/CHANGELOG.md +67 -0
- package/LICENSE +21 -0
- package/README.md +140 -0
- package/bin/opencode-feishu +2 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +273 -0
- package/dist/cli.js.map +1 -0
- package/dist/core/config.d.ts +48 -0
- package/dist/core/config.d.ts.map +1 -0
- package/dist/core/config.js +76 -0
- package/dist/core/config.js.map +1 -0
- package/dist/core/daemon.d.ts +42 -0
- package/dist/core/daemon.d.ts.map +1 -0
- package/dist/core/daemon.js +134 -0
- package/dist/core/daemon.js.map +1 -0
- package/dist/core/logger.d.ts +10 -0
- package/dist/core/logger.d.ts.map +1 -0
- package/dist/core/logger.js +42 -0
- package/dist/core/logger.js.map +1 -0
- package/dist/core/message-handler.d.ts +13 -0
- package/dist/core/message-handler.d.ts.map +1 -0
- package/dist/core/message-handler.js +120 -0
- package/dist/core/message-handler.js.map +1 -0
- package/dist/core/session-manager.d.ts +34 -0
- package/dist/core/session-manager.d.ts.map +1 -0
- package/dist/core/session-manager.js +187 -0
- package/dist/core/session-manager.js.map +1 -0
- package/dist/core/types.d.ts +87 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +3 -0
- package/dist/core/types.js.map +1 -0
- package/dist/feishu/api.d.ts +23 -0
- package/dist/feishu/api.d.ts.map +1 -0
- package/dist/feishu/api.js +97 -0
- package/dist/feishu/api.js.map +1 -0
- package/dist/feishu/card.d.ts +11 -0
- package/dist/feishu/card.d.ts.map +1 -0
- package/dist/feishu/card.js +62 -0
- package/dist/feishu/card.js.map +1 -0
- package/dist/feishu/event-source.d.ts +19 -0
- package/dist/feishu/event-source.d.ts.map +1 -0
- package/dist/feishu/event-source.js +70 -0
- package/dist/feishu/event-source.js.map +1 -0
- package/dist/feishu/silent-logger.d.ts +16 -0
- package/dist/feishu/silent-logger.d.ts.map +1 -0
- package/dist/feishu/silent-logger.js +16 -0
- package/dist/feishu/silent-logger.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/opencode/client.d.ts +27 -0
- package/dist/opencode/client.d.ts.map +1 -0
- package/dist/opencode/client.js +86 -0
- package/dist/opencode/client.js.map +1 -0
- package/dist/opencode/event-handler.d.ts +26 -0
- package/dist/opencode/event-handler.d.ts.map +1 -0
- package/dist/opencode/event-handler.js +212 -0
- package/dist/opencode/event-handler.js.map +1 -0
- package/dist/plugin.d.ts +4 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +64 -0
- package/dist/plugin.js.map +1 -0
- package/dist/setup/preflight.d.ts +29 -0
- package/dist/setup/preflight.d.ts.map +1 -0
- package/dist/setup/preflight.js +125 -0
- package/dist/setup/preflight.js.map +1 -0
- package/dist/setup/wizard.d.ts +11 -0
- package/dist/setup/wizard.d.ts.map +1 -0
- package/dist/setup/wizard.js +263 -0
- package/dist/setup/wizard.js.map +1 -0
- package/dist/standalone.d.ts +2 -0
- package/dist/standalone.d.ts.map +1 -0
- package/dist/standalone.js +116 -0
- package/dist/standalone.js.map +1 -0
- package/dist/types/plugin.d.ts +23 -0
- package/dist/types/plugin.d.ts.map +1 -0
- package/dist/types/plugin.js +2 -0
- package/dist/types/plugin.js.map +1 -0
- package/package.json +80 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import inquirer from 'inquirer';
|
|
2
|
+
import { ConfigManager } from '../core/config.js';
|
|
3
|
+
import { createLogger } from '../core/logger.js';
|
|
4
|
+
import * as preflight from './preflight.js';
|
|
5
|
+
const log = createLogger('SetupWizard');
|
|
6
|
+
export class SetupWizard {
|
|
7
|
+
configManager;
|
|
8
|
+
constructor(configPath) {
|
|
9
|
+
this.configManager = new ConfigManager(configPath);
|
|
10
|
+
}
|
|
11
|
+
async run() {
|
|
12
|
+
console.log('šÆ OpenCode é£ä¹¦ęä»¶é
ē½®å导\n');
|
|
13
|
+
// If a config already exists, run preflight and let the user skip reconfiguring
|
|
14
|
+
// when everything is already green.
|
|
15
|
+
if (this.configManager.exists()) {
|
|
16
|
+
const existing = this.configManager.load();
|
|
17
|
+
console.log('š ę£ęµå°ē°ęé
ē½®ļ¼ę£åØčæč” preflight ę£ę„...\n');
|
|
18
|
+
const results = await preflight.runAll(existing, {
|
|
19
|
+
configPath: this.configManager.getConfigPath(),
|
|
20
|
+
});
|
|
21
|
+
for (const r of results) {
|
|
22
|
+
console.log(` ${r.ok ? 'ā
' : 'ā'} ${r.label}${r.detail ? ' ā ' + r.detail : ''}`);
|
|
23
|
+
if (!r.ok && r.fix)
|
|
24
|
+
console.log(` š ${r.fix}`);
|
|
25
|
+
}
|
|
26
|
+
console.log();
|
|
27
|
+
if (results.every(r => r.ok)) {
|
|
28
|
+
const { reconfigure } = await inquirer.prompt([
|
|
29
|
+
{
|
|
30
|
+
type: 'confirm',
|
|
31
|
+
name: 'reconfigure',
|
|
32
|
+
message: 'ęęę£ę„éčæćč¦éę°é
ē½®åļ¼',
|
|
33
|
+
default: false,
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
36
|
+
if (!reconfigure) {
|
|
37
|
+
console.log('äæęē°ęé
ē½®ćčæč” `opencode-feishu start` åÆåØęä»¶ć\n');
|
|
38
|
+
return existing;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
const { setupMode } = await inquirer.prompt([
|
|
43
|
+
{
|
|
44
|
+
type: 'list',
|
|
45
|
+
name: 'setupMode',
|
|
46
|
+
message: '请éę©é
ē½®ę¹å¼ļ¼',
|
|
47
|
+
choices: [
|
|
48
|
+
{
|
|
49
|
+
name: 'š„ åæ«éé
ē½®ļ¼ęØčļ¼',
|
|
50
|
+
value: 'quick',
|
|
51
|
+
description: '使ēØé£ä¹¦ę«ē åæ«éé
ē½®',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: 'š ęåØé
ē½®',
|
|
55
|
+
value: 'manual',
|
|
56
|
+
description: 'č¾å
„å·²ęē App ID å App Secret',
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
},
|
|
60
|
+
]);
|
|
61
|
+
let config;
|
|
62
|
+
if (setupMode === 'quick') {
|
|
63
|
+
config = await this.runQuickSetup();
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
config = await this.runManualSetup();
|
|
67
|
+
}
|
|
68
|
+
// Save configuration
|
|
69
|
+
this.configManager.save(config);
|
|
70
|
+
console.log('\nā
é
置已äæåļ¼');
|
|
71
|
+
console.log(`š é
ē½®ęä»¶: ${this.configManager.getConfigPath()}`);
|
|
72
|
+
console.log('\nš åÆåØęä»¶:');
|
|
73
|
+
console.log(' opencode-feishu start\n');
|
|
74
|
+
return config;
|
|
75
|
+
}
|
|
76
|
+
async runQuickSetup() {
|
|
77
|
+
console.log('\nš åæ«éé
置樔å¼\n');
|
|
78
|
+
console.log('čæå°å¼åÆ¼ä½ éčæé£ä¹¦ęęåæ«éé
ē½®ęä»¶ć\n');
|
|
79
|
+
console.log('š ę„éŖ¤ 1: å建é£ä¹¦åŗēØ');
|
|
80
|
+
console.log(' 1. 访é®: https://open.feishu.cn/app');
|
|
81
|
+
console.log(' 2. ē¹å»"å建ä¼äøčŖå»ŗåŗēØ"');
|
|
82
|
+
console.log(' 3. 唫ååŗēØåē§°ļ¼å¦: OpenCode Assistantļ¼');
|
|
83
|
+
console.log(' 4. čæå
„"åčÆäøåŗē”äæ”ęÆ"锵é¢\n');
|
|
84
|
+
const { appId, appSecret } = await inquirer.prompt([
|
|
85
|
+
{
|
|
86
|
+
type: 'input',
|
|
87
|
+
name: 'appId',
|
|
88
|
+
message: '请č¾å
„ App ID (cli_xxx):',
|
|
89
|
+
validate: (input) => {
|
|
90
|
+
if (!input.startsWith('cli_')) {
|
|
91
|
+
return 'App ID åŗä»„ cli_ å¼å¤“';
|
|
92
|
+
}
|
|
93
|
+
if (input.length < 10) {
|
|
94
|
+
return 'App ID ę ¼å¼äøę£ē”®';
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
type: 'password',
|
|
101
|
+
name: 'appSecret',
|
|
102
|
+
message: '请č¾å
„ App Secret:',
|
|
103
|
+
mask: '*',
|
|
104
|
+
validate: (input) => input.length >= 10 || 'App Secret ę ¼å¼äøę£ē”®',
|
|
105
|
+
},
|
|
106
|
+
]);
|
|
107
|
+
console.log('\nš ę„éŖ¤ 2: é
ē½®åŗēØč½å');
|
|
108
|
+
console.log(' 1. čæå
„"åŗēØč½å" ā "ęŗåØäŗŗ"');
|
|
109
|
+
console.log(' 2. å¼åÆęŗåØäŗŗč½å');
|
|
110
|
+
console.log(' 3. čæå
„"ęéē®”ē"ļ¼ę·»å 仄äøęéļ¼');
|
|
111
|
+
console.log(' ⢠im:message');
|
|
112
|
+
console.log(' ⢠im:message.p2p_msg:readonly');
|
|
113
|
+
console.log(' ⢠im:message.group_at_msg:readonly');
|
|
114
|
+
console.log(' ⢠im:message:send_as_bot');
|
|
115
|
+
console.log(' ⢠im:resource');
|
|
116
|
+
console.log(' ⢠contact:user.base:readonly');
|
|
117
|
+
console.log(' 4. čæå
„"äŗä»¶äøåč°" ā "ę·»å äŗä»¶"');
|
|
118
|
+
console.log(' ⢠éę©"使ēØéæčæę„ę„ę¶äŗä»¶"');
|
|
119
|
+
console.log(' ⢠添å äŗä»¶: im.message.receive_v1');
|
|
120
|
+
console.log(' 5. čæå
„"ēę¬ē®”ēäøååø"ļ¼å建ēę¬å¹¶ååø\n');
|
|
121
|
+
await inquirer.prompt([
|
|
122
|
+
{
|
|
123
|
+
type: 'input',
|
|
124
|
+
name: 'confirm',
|
|
125
|
+
message: 'å®ęäøčæ°ę„éŖ¤åę Enter ē»§ē»...',
|
|
126
|
+
},
|
|
127
|
+
]);
|
|
128
|
+
console.log('\nš§Ŗ éŖčÆåčÆ...');
|
|
129
|
+
const isValid = await this.verifyFeishuCredentials(appId, appSecret, 'feishu');
|
|
130
|
+
if (!isValid) {
|
|
131
|
+
console.log('\nā éŖčÆå¤±č“„ļ¼čÆ·ę£ę„ App ID / App Secret ęÆå¦ę£ē”®ćåŗēØęÆå¦å·²ååøćęéęÆå¦å¼éć');
|
|
132
|
+
throw new Error('Feishu credentials check failed');
|
|
133
|
+
}
|
|
134
|
+
console.log('ā
éŖčÆéčæļ¼\n');
|
|
135
|
+
// Configure OpenCode URL
|
|
136
|
+
const { opencodeUrl } = await inquirer.prompt([
|
|
137
|
+
{
|
|
138
|
+
type: 'input',
|
|
139
|
+
name: 'opencodeUrl',
|
|
140
|
+
message: 'OpenCode ęå”åØå°å:',
|
|
141
|
+
default: 'http://localhost:19876',
|
|
142
|
+
validate: (input) => {
|
|
143
|
+
try {
|
|
144
|
+
new URL(input);
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
return '请č¾å
„ęęē URL';
|
|
149
|
+
}
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
]);
|
|
153
|
+
// Configure options
|
|
154
|
+
const { streaming, requireMention } = await inquirer.prompt([
|
|
155
|
+
{
|
|
156
|
+
type: 'confirm',
|
|
157
|
+
name: 'streaming',
|
|
158
|
+
message: 'åÆēØęµå¼č¾åŗļ¼',
|
|
159
|
+
default: true,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'confirm',
|
|
163
|
+
name: 'requireMention',
|
|
164
|
+
message: '群čäøéč¦ @ęŗåØäŗŗęåå¤ļ¼',
|
|
165
|
+
default: true,
|
|
166
|
+
},
|
|
167
|
+
]);
|
|
168
|
+
return {
|
|
169
|
+
appId,
|
|
170
|
+
appSecret,
|
|
171
|
+
domain: 'feishu',
|
|
172
|
+
opencodeUrl,
|
|
173
|
+
streaming,
|
|
174
|
+
requireMention,
|
|
175
|
+
groupPolicy: 'allowlist',
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
async runManualSetup() {
|
|
179
|
+
console.log('\nš ęåØé
置樔å¼\n');
|
|
180
|
+
const answers = await inquirer.prompt([
|
|
181
|
+
{
|
|
182
|
+
type: 'input',
|
|
183
|
+
name: 'appId',
|
|
184
|
+
message: '请č¾å
„é£ä¹¦ App ID (cli_xxx):',
|
|
185
|
+
validate: (input) => {
|
|
186
|
+
if (!input.startsWith('cli_')) {
|
|
187
|
+
return 'App ID åŗä»„ cli_ å¼å¤“';
|
|
188
|
+
}
|
|
189
|
+
return true;
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'password',
|
|
194
|
+
name: 'appSecret',
|
|
195
|
+
message: '请č¾å
„é£ä¹¦ App Secret:',
|
|
196
|
+
mask: '*',
|
|
197
|
+
validate: (input) => input.length >= 10 || 'App Secret ę ¼å¼äøę£ē”®',
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
type: 'list',
|
|
201
|
+
name: 'domain',
|
|
202
|
+
message: 'éę©ååļ¼',
|
|
203
|
+
choices: [
|
|
204
|
+
{ name: 'é£ä¹¦ (open.feishu.cn)', value: 'feishu' },
|
|
205
|
+
{ name: 'Lark (open.larksuite.com)', value: 'lark' },
|
|
206
|
+
],
|
|
207
|
+
default: 'feishu',
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
type: 'input',
|
|
211
|
+
name: 'opencodeUrl',
|
|
212
|
+
message: 'OpenCode ęå”åØå°å:',
|
|
213
|
+
default: 'http://localhost:19876',
|
|
214
|
+
validate: (input) => {
|
|
215
|
+
try {
|
|
216
|
+
new URL(input);
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
catch {
|
|
220
|
+
return '请č¾å
„ęęē URL';
|
|
221
|
+
}
|
|
222
|
+
},
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
type: 'confirm',
|
|
226
|
+
name: 'streaming',
|
|
227
|
+
message: 'åÆēØęµå¼č¾åŗļ¼',
|
|
228
|
+
default: true,
|
|
229
|
+
},
|
|
230
|
+
{
|
|
231
|
+
type: 'confirm',
|
|
232
|
+
name: 'requireMention',
|
|
233
|
+
message: '群čäøéč¦ @ęŗåØäŗŗęåå¤ļ¼',
|
|
234
|
+
default: true,
|
|
235
|
+
},
|
|
236
|
+
]);
|
|
237
|
+
console.log('\nš§Ŗ éŖčÆåčÆ...');
|
|
238
|
+
const isValid = await this.verifyFeishuCredentials(answers.appId, answers.appSecret, answers.domain);
|
|
239
|
+
if (!isValid) {
|
|
240
|
+
console.log('\nā éŖčÆå¤±č“„ļ¼čÆ·ę£ę„ App ID / App Secret ęÆå¦ę£ē”®ćåŗēØęÆå¦å·²ååøć');
|
|
241
|
+
throw new Error('Feishu credentials check failed');
|
|
242
|
+
}
|
|
243
|
+
console.log('ā
éŖčÆéčæļ¼\n');
|
|
244
|
+
return {
|
|
245
|
+
appId: answers.appId,
|
|
246
|
+
appSecret: answers.appSecret,
|
|
247
|
+
domain: answers.domain,
|
|
248
|
+
opencodeUrl: answers.opencodeUrl,
|
|
249
|
+
streaming: answers.streaming,
|
|
250
|
+
requireMention: answers.requireMention,
|
|
251
|
+
groupPolicy: 'allowlist',
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
/** Shared preflight check ā confirms the app is published, secret is right, bot ability is on. */
|
|
255
|
+
async verifyFeishuCredentials(appId, appSecret, domain) {
|
|
256
|
+
const result = await preflight.checkFeishuCredentials(appId, appSecret, domain);
|
|
257
|
+
if (!result.ok) {
|
|
258
|
+
log.error({ detail: result.detail, fix: result.fix }, 'verifyFeishuCredentials failed');
|
|
259
|
+
}
|
|
260
|
+
return result.ok;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=wizard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wizard.js","sourceRoot":"","sources":["../../src/setup/wizard.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"AAaA,wBAAsB,eAAe,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgIxE"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { ConfigManager } from './core/config.js';
|
|
2
|
+
import { SessionManager } from './core/session-manager.js';
|
|
3
|
+
import { MessageHandler } from './core/message-handler.js';
|
|
4
|
+
import { FeishuAPI } from './feishu/api.js';
|
|
5
|
+
import { FeishuEventSource } from './feishu/event-source.js';
|
|
6
|
+
import { OpenCodeClient } from './opencode/client.js';
|
|
7
|
+
import { OpenCodeEventHandler } from './opencode/event-handler.js';
|
|
8
|
+
import { createLogger } from './core/logger.js';
|
|
9
|
+
import { startStatusWriter } from './core/daemon.js';
|
|
10
|
+
const log = createLogger('standalone');
|
|
11
|
+
export async function startStandalone(configPath) {
|
|
12
|
+
console.log('š Starting OpenCode Feishu Plugin (Standalone Mode)\n');
|
|
13
|
+
// 1. Load configuration
|
|
14
|
+
const configManager = new ConfigManager(configPath);
|
|
15
|
+
const config = configManager.load();
|
|
16
|
+
console.log('š Configuration:');
|
|
17
|
+
console.log(` App ID: ${config.appId}`);
|
|
18
|
+
console.log(` Domain: ${config.domain}`);
|
|
19
|
+
console.log(` OpenCode: ${config.opencodeUrl}`);
|
|
20
|
+
console.log(` Streaming: ${config.streaming}`);
|
|
21
|
+
console.log(` Require Mention: ${config.requireMention}`);
|
|
22
|
+
console.log();
|
|
23
|
+
// 2. Initialize OpenCode client
|
|
24
|
+
console.log('š Connecting to OpenCode...');
|
|
25
|
+
const opencode = new OpenCodeClient({
|
|
26
|
+
baseUrl: config.opencodeUrl,
|
|
27
|
+
directory: process.cwd(),
|
|
28
|
+
password: process.env.OPENCODE_SERVER_PASSWORD,
|
|
29
|
+
});
|
|
30
|
+
// Test OpenCode connection
|
|
31
|
+
try {
|
|
32
|
+
await opencode.listSessions();
|
|
33
|
+
console.log('ā
OpenCode connected\n');
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
log.error({ err, opencodeUrl: config.opencodeUrl }, 'Failed to connect to OpenCode');
|
|
37
|
+
console.error('\nPlease make sure OpenCode is running:');
|
|
38
|
+
console.error(` ${config.opencodeUrl}`);
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
// 3. Initialize Feishu API
|
|
42
|
+
console.log('š Connecting to Feishu...');
|
|
43
|
+
const feishuApi = new FeishuAPI(config);
|
|
44
|
+
await feishuApi.initialize();
|
|
45
|
+
console.log('ā
Feishu API initialized\n');
|
|
46
|
+
// 4. Initialize session manager
|
|
47
|
+
const sessionManager = new SessionManager(opencode);
|
|
48
|
+
// 5. Initialize message handler
|
|
49
|
+
const messageHandler = new MessageHandler(config, sessionManager, feishuApi, opencode);
|
|
50
|
+
// 6. Start event handler for streaming
|
|
51
|
+
let eventHandler;
|
|
52
|
+
if (config.streaming) {
|
|
53
|
+
console.log('š” Starting event stream...');
|
|
54
|
+
eventHandler = new OpenCodeEventHandler(sessionManager, feishuApi);
|
|
55
|
+
try {
|
|
56
|
+
const eventStream = await opencode.subscribeEvents();
|
|
57
|
+
eventHandler.start(eventStream).catch((err) => {
|
|
58
|
+
log.error({ err }, 'Event stream error');
|
|
59
|
+
});
|
|
60
|
+
console.log('ā
Event stream started\n');
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
log.warn({ err }, 'Failed to start event stream');
|
|
64
|
+
console.warn(' Streaming output will be disabled\n');
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
// 7. Connect Feishu event source (long connection via SDK WSClient)
|
|
68
|
+
console.log('š” Connecting to Feishu event stream...');
|
|
69
|
+
const feishuEvents = new FeishuEventSource(feishuApi);
|
|
70
|
+
feishuEvents.on('message', async (message) => {
|
|
71
|
+
await messageHandler.handleMessage(message);
|
|
72
|
+
});
|
|
73
|
+
feishuEvents.on('error', (err) => {
|
|
74
|
+
log.error({ err }, 'Event stream error');
|
|
75
|
+
});
|
|
76
|
+
try {
|
|
77
|
+
await feishuEvents.connect();
|
|
78
|
+
console.log('ā
Feishu event stream connected\n');
|
|
79
|
+
}
|
|
80
|
+
catch (err) {
|
|
81
|
+
log.error({ err }, 'Failed to connect to Feishu');
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
// 8. Display status
|
|
85
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā');
|
|
86
|
+
console.log('ā OpenCode Feishu Plugin Running ā');
|
|
87
|
+
console.log('ā āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā£');
|
|
88
|
+
console.log(`ā Mode: Standalone ā`);
|
|
89
|
+
console.log(`ā OpenCode: ${config.opencodeUrl.padEnd(36)} ā`);
|
|
90
|
+
console.log(`ā Directory: ${process.cwd().substring(0, 36).padEnd(36)} ā`);
|
|
91
|
+
console.log(`ā Streaming: ${(config.streaming ? 'Enabled' : 'Disabled').padEnd(36)} ā`);
|
|
92
|
+
console.log('āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā\n');
|
|
93
|
+
console.log('Press Ctrl+C to stop\n');
|
|
94
|
+
// 9. Start periodic status writer so `opencode-feishu status` can observe us
|
|
95
|
+
const stopStatusWriter = startStatusWriter({
|
|
96
|
+
getSessionCount: () => sessionManager.getAllSessions().length,
|
|
97
|
+
isFeishuConnected: () => feishuEvents.isConnected(),
|
|
98
|
+
getOpencodeUrl: () => config.opencodeUrl,
|
|
99
|
+
});
|
|
100
|
+
// 10. Handle shutdown
|
|
101
|
+
const shutdown = async (signal) => {
|
|
102
|
+
console.log(`\nš Received ${signal}, shutting down...`);
|
|
103
|
+
stopStatusWriter();
|
|
104
|
+
if (eventHandler)
|
|
105
|
+
eventHandler.stop();
|
|
106
|
+
await feishuEvents.disconnect();
|
|
107
|
+
await sessionManager.cleanup();
|
|
108
|
+
console.log('š Goodbye!');
|
|
109
|
+
process.exit(0);
|
|
110
|
+
};
|
|
111
|
+
process.on('SIGINT', () => shutdown('SIGINT'));
|
|
112
|
+
process.on('SIGTERM', () => shutdown('SIGTERM'));
|
|
113
|
+
// Keep process alive
|
|
114
|
+
setInterval(() => { }, 1000);
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=standalone.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standalone.js","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export interface PluginInput {
|
|
2
|
+
client: any;
|
|
3
|
+
project: any;
|
|
4
|
+
directory: string;
|
|
5
|
+
worktree: string;
|
|
6
|
+
experimental_workspace: {
|
|
7
|
+
register(type: string, adaptor: any): void;
|
|
8
|
+
};
|
|
9
|
+
serverUrl: URL;
|
|
10
|
+
$: any;
|
|
11
|
+
}
|
|
12
|
+
export interface PluginOptions {
|
|
13
|
+
[key: string]: any;
|
|
14
|
+
}
|
|
15
|
+
export interface PluginHooks {
|
|
16
|
+
cleanup?: () => Promise<void>;
|
|
17
|
+
[key: string]: any;
|
|
18
|
+
}
|
|
19
|
+
export interface Plugin {
|
|
20
|
+
id: string;
|
|
21
|
+
server: (input: PluginInput, options?: PluginOptions) => Promise<PluginHooks>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=plugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,GAAG,CAAC;IACZ,OAAO,EAAE,GAAG,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE;QACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAAC;KAC5C,CAAC;IACF,SAAS,EAAE,GAAG,CAAC;IACf,CAAC,EAAE,GAAG,CAAC;CACR;AAED,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAED,MAAM,WAAW,MAAM;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;CAC/E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/types/plugin.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@neomei/opencode-feishu",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Node.js-native Feishu/Lark bridge for OpenCode ā production-grade daemon, persistence, preflight, structured logs.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"types": "dist/index.d.ts",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": {
|
|
9
|
+
"opencode-feishu": "bin/opencode-feishu"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"build": "tsc",
|
|
13
|
+
"dev": "tsc --watch",
|
|
14
|
+
"test": "jest",
|
|
15
|
+
"test:watch": "jest --watch",
|
|
16
|
+
"lint": "eslint src/**/*.ts",
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
18
|
+
"clean": "rm -rf dist",
|
|
19
|
+
"prepublishOnly": "npm run clean && npm run build && npm test"
|
|
20
|
+
},
|
|
21
|
+
"keywords": [
|
|
22
|
+
"opencode",
|
|
23
|
+
"feishu",
|
|
24
|
+
"lark",
|
|
25
|
+
"bridge",
|
|
26
|
+
"ai",
|
|
27
|
+
"chatbot",
|
|
28
|
+
"messaging",
|
|
29
|
+
"agent",
|
|
30
|
+
"multi-agent"
|
|
31
|
+
],
|
|
32
|
+
"author": "neomei",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"homepage": "https://github.com/neomei/opencode-feishu#readme",
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "git+https://github.com/neomei/opencode-feishu.git"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/neomei/opencode-feishu/issues"
|
|
41
|
+
},
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=18.0.0"
|
|
44
|
+
},
|
|
45
|
+
"publishConfig": {
|
|
46
|
+
"access": "public"
|
|
47
|
+
},
|
|
48
|
+
"dependencies": {
|
|
49
|
+
"@larksuiteoapi/node-sdk": "^1.61.1",
|
|
50
|
+
"@opencode-ai/sdk": "^1.0.0",
|
|
51
|
+
"commander": "^11.0.0",
|
|
52
|
+
"inquirer": "^9.2.0",
|
|
53
|
+
"pino": "^10.3.1",
|
|
54
|
+
"pino-pretty": "^13.1.3",
|
|
55
|
+
"zod": "^3.22.0"
|
|
56
|
+
},
|
|
57
|
+
"devDependencies": {
|
|
58
|
+
"@types/inquirer": "^9.0.0",
|
|
59
|
+
"@types/jest": "^29.5.0",
|
|
60
|
+
"@types/node": "^20.0.0",
|
|
61
|
+
"jest": "^29.7.0",
|
|
62
|
+
"ts-jest": "^29.1.0",
|
|
63
|
+
"typescript": "^5.0.0"
|
|
64
|
+
},
|
|
65
|
+
"peerDependencies": {
|
|
66
|
+
"@opencode-ai/plugin": "^1.0.0"
|
|
67
|
+
},
|
|
68
|
+
"peerDependenciesMeta": {
|
|
69
|
+
"@opencode-ai/plugin": {
|
|
70
|
+
"optional": true
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"files": [
|
|
74
|
+
"dist",
|
|
75
|
+
"bin",
|
|
76
|
+
"README.md",
|
|
77
|
+
"LICENSE",
|
|
78
|
+
"CHANGELOG.md"
|
|
79
|
+
]
|
|
80
|
+
}
|