@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.
Files changed (81) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/LICENSE +21 -0
  3. package/README.md +140 -0
  4. package/bin/opencode-feishu +2 -0
  5. package/dist/cli.d.ts +2 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +273 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/core/config.d.ts +48 -0
  10. package/dist/core/config.d.ts.map +1 -0
  11. package/dist/core/config.js +76 -0
  12. package/dist/core/config.js.map +1 -0
  13. package/dist/core/daemon.d.ts +42 -0
  14. package/dist/core/daemon.d.ts.map +1 -0
  15. package/dist/core/daemon.js +134 -0
  16. package/dist/core/daemon.js.map +1 -0
  17. package/dist/core/logger.d.ts +10 -0
  18. package/dist/core/logger.d.ts.map +1 -0
  19. package/dist/core/logger.js +42 -0
  20. package/dist/core/logger.js.map +1 -0
  21. package/dist/core/message-handler.d.ts +13 -0
  22. package/dist/core/message-handler.d.ts.map +1 -0
  23. package/dist/core/message-handler.js +120 -0
  24. package/dist/core/message-handler.js.map +1 -0
  25. package/dist/core/session-manager.d.ts +34 -0
  26. package/dist/core/session-manager.d.ts.map +1 -0
  27. package/dist/core/session-manager.js +187 -0
  28. package/dist/core/session-manager.js.map +1 -0
  29. package/dist/core/types.d.ts +87 -0
  30. package/dist/core/types.d.ts.map +1 -0
  31. package/dist/core/types.js +3 -0
  32. package/dist/core/types.js.map +1 -0
  33. package/dist/feishu/api.d.ts +23 -0
  34. package/dist/feishu/api.d.ts.map +1 -0
  35. package/dist/feishu/api.js +97 -0
  36. package/dist/feishu/api.js.map +1 -0
  37. package/dist/feishu/card.d.ts +11 -0
  38. package/dist/feishu/card.d.ts.map +1 -0
  39. package/dist/feishu/card.js +62 -0
  40. package/dist/feishu/card.js.map +1 -0
  41. package/dist/feishu/event-source.d.ts +19 -0
  42. package/dist/feishu/event-source.d.ts.map +1 -0
  43. package/dist/feishu/event-source.js +70 -0
  44. package/dist/feishu/event-source.js.map +1 -0
  45. package/dist/feishu/silent-logger.d.ts +16 -0
  46. package/dist/feishu/silent-logger.d.ts.map +1 -0
  47. package/dist/feishu/silent-logger.js +16 -0
  48. package/dist/feishu/silent-logger.js.map +1 -0
  49. package/dist/index.d.ts +6 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +6 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/opencode/client.d.ts +27 -0
  54. package/dist/opencode/client.d.ts.map +1 -0
  55. package/dist/opencode/client.js +86 -0
  56. package/dist/opencode/client.js.map +1 -0
  57. package/dist/opencode/event-handler.d.ts +26 -0
  58. package/dist/opencode/event-handler.d.ts.map +1 -0
  59. package/dist/opencode/event-handler.js +212 -0
  60. package/dist/opencode/event-handler.js.map +1 -0
  61. package/dist/plugin.d.ts +4 -0
  62. package/dist/plugin.d.ts.map +1 -0
  63. package/dist/plugin.js +64 -0
  64. package/dist/plugin.js.map +1 -0
  65. package/dist/setup/preflight.d.ts +29 -0
  66. package/dist/setup/preflight.d.ts.map +1 -0
  67. package/dist/setup/preflight.js +125 -0
  68. package/dist/setup/preflight.js.map +1 -0
  69. package/dist/setup/wizard.d.ts +11 -0
  70. package/dist/setup/wizard.d.ts.map +1 -0
  71. package/dist/setup/wizard.js +263 -0
  72. package/dist/setup/wizard.js.map +1 -0
  73. package/dist/standalone.d.ts +2 -0
  74. package/dist/standalone.d.ts.map +1 -0
  75. package/dist/standalone.js +116 -0
  76. package/dist/standalone.js.map +1 -0
  77. package/dist/types/plugin.d.ts +23 -0
  78. package/dist/types/plugin.d.ts.map +1 -0
  79. package/dist/types/plugin.js +2 -0
  80. package/dist/types/plugin.js.map +1 -0
  81. 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,2 @@
1
+ export declare function startStandalone(configPath?: string): Promise<void>;
2
+ //# sourceMappingURL=standalone.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plugin.js.map
@@ -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
+ }