@neomei/opencode-feishu 0.2.5 → 0.2.7
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 +18 -1
- package/dist/core/message-handler.d.ts +27 -9
- package/dist/core/message-handler.d.ts.map +1 -1
- package/dist/core/message-handler.js +362 -79
- package/dist/core/message-handler.js.map +1 -1
- package/dist/core/session-manager.d.ts +4 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +15 -0
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/types.d.ts +49 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/feishu/api.d.ts +6 -0
- package/dist/feishu/api.d.ts.map +1 -1
- package/dist/feishu/api.js +71 -6
- package/dist/feishu/api.js.map +1 -1
- package/dist/feishu/card.d.ts +5 -2
- package/dist/feishu/card.d.ts.map +1 -1
- package/dist/feishu/card.js +145 -18
- package/dist/feishu/card.js.map +1 -1
- package/dist/feishu/event-source.d.ts +6 -0
- package/dist/feishu/event-source.d.ts.map +1 -1
- package/dist/feishu/event-source.js +54 -0
- package/dist/feishu/event-source.js.map +1 -1
- package/dist/opencode/client.d.ts +4 -0
- package/dist/opencode/client.d.ts.map +1 -1
- package/dist/opencode/client.js +55 -5
- package/dist/opencode/client.js.map +1 -1
- package/dist/opencode/event-handler.d.ts +6 -0
- package/dist/opencode/event-handler.d.ts.map +1 -1
- package/dist/opencode/event-handler.js +170 -10
- package/dist/opencode/event-handler.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +10 -3
- package/dist/plugin.js.map +1 -1
- package/dist/services/doc-service.d.ts +11 -45
- package/dist/services/doc-service.d.ts.map +1 -1
- package/dist/services/doc-service.js +72 -174
- package/dist/services/doc-service.js.map +1 -1
- package/dist/services/im-service.d.ts.map +1 -1
- package/dist/services/im-service.js +10 -6
- package/dist/services/im-service.js.map +1 -1
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +10 -3
- package/dist/standalone.js.map +1 -1
- package/dist/types/extended.d.ts +2 -1
- package/dist/types/extended.d.ts.map +1 -1
- package/package.json +5 -5
package/dist/feishu/card.js
CHANGED
|
@@ -4,12 +4,13 @@ const TOOL_ICON = {
|
|
|
4
4
|
error: '❌',
|
|
5
5
|
};
|
|
6
6
|
export class FeishuCard {
|
|
7
|
-
static createThinkingCard(botName
|
|
7
|
+
static createThinkingCard(botName) {
|
|
8
8
|
return {
|
|
9
9
|
config: { wide_screen_mode: true },
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
header: {
|
|
11
|
+
title: { tag: 'plain_text', content: `💭 ${botName}思考中...` },
|
|
12
|
+
},
|
|
13
|
+
elements: [],
|
|
13
14
|
};
|
|
14
15
|
}
|
|
15
16
|
static createErrorCard(error) {
|
|
@@ -32,29 +33,41 @@ export class FeishuCard {
|
|
|
32
33
|
};
|
|
33
34
|
}
|
|
34
35
|
static createStreamingCard(opts) {
|
|
35
|
-
const { content, tools = [], done = false, retry, showProcess = false, botName } = opts;
|
|
36
|
+
const { content, tools = [], done = false, retry, showProcess = false, botName, interaction } = opts;
|
|
36
37
|
const anyRunning = tools.some(t => t.status === 'running');
|
|
37
|
-
if (!showProcess) {
|
|
38
|
+
if (!showProcess && !interaction && tools.length === 0) {
|
|
39
|
+
const headerTitle = done
|
|
40
|
+
? '✅ 完成'
|
|
41
|
+
: retry
|
|
42
|
+
? '🔄 重试中...'
|
|
43
|
+
: `💭 ${botName}思考中...`;
|
|
38
44
|
const elements = [];
|
|
39
45
|
if (content) {
|
|
40
46
|
elements.push({ tag: 'div', text: { tag: 'lark_md', content } });
|
|
41
47
|
}
|
|
42
|
-
|
|
43
|
-
|
|
48
|
+
if (retry) {
|
|
49
|
+
if (elements.length > 0)
|
|
50
|
+
elements.push({ tag: 'hr' });
|
|
44
51
|
elements.push({
|
|
45
52
|
tag: 'div',
|
|
46
|
-
text: { tag: 'lark_md', content:
|
|
53
|
+
text: { tag: 'lark_md', content: `🔄 **重试中**:${retry}` },
|
|
47
54
|
});
|
|
48
55
|
}
|
|
49
|
-
return {
|
|
56
|
+
return {
|
|
57
|
+
config: { wide_screen_mode: true },
|
|
58
|
+
header: { title: { tag: 'plain_text', content: headerTitle } },
|
|
59
|
+
elements,
|
|
60
|
+
};
|
|
50
61
|
}
|
|
51
|
-
const headerTitle =
|
|
52
|
-
? '
|
|
53
|
-
:
|
|
54
|
-
? '
|
|
55
|
-
:
|
|
56
|
-
? '
|
|
57
|
-
:
|
|
62
|
+
const headerTitle = interaction
|
|
63
|
+
? (interaction.kind === 'permission' ? '🔒 等待授权' : '❓ 等待选择')
|
|
64
|
+
: done
|
|
65
|
+
? '✅ 完成'
|
|
66
|
+
: retry
|
|
67
|
+
? '🔄 重试中...'
|
|
68
|
+
: anyRunning
|
|
69
|
+
? '🔧 执行工具...'
|
|
70
|
+
: '💭 思考中...';
|
|
58
71
|
const elements = [];
|
|
59
72
|
if (retry) {
|
|
60
73
|
elements.push({
|
|
@@ -76,17 +89,131 @@ export class FeishuCard {
|
|
|
76
89
|
if (content)
|
|
77
90
|
elements.push({ tag: 'hr' });
|
|
78
91
|
}
|
|
79
|
-
if (content || (tools.length === 0 && !retry)) {
|
|
92
|
+
if (content || (tools.length === 0 && !retry && !interaction)) {
|
|
80
93
|
elements.push({
|
|
81
94
|
tag: 'div',
|
|
82
95
|
text: { tag: 'lark_md', content: content || '...' },
|
|
83
96
|
});
|
|
84
97
|
}
|
|
98
|
+
if (interaction) {
|
|
99
|
+
if (elements.length > 0)
|
|
100
|
+
elements.push({ tag: 'hr' });
|
|
101
|
+
if (interaction.kind === 'permission') {
|
|
102
|
+
const perm = interaction.data;
|
|
103
|
+
const patterns = perm.patterns.map((p) => `- \`${p}\``).join('\n');
|
|
104
|
+
elements.push({
|
|
105
|
+
tag: 'div',
|
|
106
|
+
text: {
|
|
107
|
+
tag: 'lark_md',
|
|
108
|
+
content: `**🔒 权限请求:${perm.permission}**\n` +
|
|
109
|
+
`${perm.title}\n\n` +
|
|
110
|
+
`**匹配范围:**\n${patterns || '(未指定)'}`,
|
|
111
|
+
},
|
|
112
|
+
});
|
|
113
|
+
elements.push({
|
|
114
|
+
tag: 'action',
|
|
115
|
+
layout: 'default',
|
|
116
|
+
actions: [
|
|
117
|
+
{
|
|
118
|
+
tag: 'button',
|
|
119
|
+
text: { tag: 'plain_text', content: '✅ 确认' },
|
|
120
|
+
type: 'primary',
|
|
121
|
+
value: { action: 'perm', id: perm.id, reply: 'once' },
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
tag: 'button',
|
|
125
|
+
text: { tag: 'plain_text', content: '🔓 始终允许' },
|
|
126
|
+
type: 'default',
|
|
127
|
+
value: { action: 'perm', id: perm.id, reply: 'always' },
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
tag: 'button',
|
|
131
|
+
text: { tag: 'plain_text', content: '❌ 拒绝' },
|
|
132
|
+
type: 'default',
|
|
133
|
+
value: { action: 'perm', id: perm.id, reply: 'reject' },
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
const q = interaction.data;
|
|
140
|
+
for (const [idx, question] of q.questions.entries()) {
|
|
141
|
+
const header = question.header || question.question.substring(0, 30);
|
|
142
|
+
elements.push({
|
|
143
|
+
tag: 'div',
|
|
144
|
+
text: { tag: 'lark_md', content: `**${idx + 1}. ${header}**` },
|
|
145
|
+
});
|
|
146
|
+
if (question.question !== header) {
|
|
147
|
+
elements.push({
|
|
148
|
+
tag: 'div',
|
|
149
|
+
text: { tag: 'lark_md', content: question.question },
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
// Render each option as a clickable button
|
|
153
|
+
for (const [optIdx, opt] of question.options.entries()) {
|
|
154
|
+
elements.push({
|
|
155
|
+
tag: 'action',
|
|
156
|
+
actions: [
|
|
157
|
+
{
|
|
158
|
+
tag: 'button',
|
|
159
|
+
text: { tag: 'plain_text', content: `${optIdx + 1}. ${opt.label}` },
|
|
160
|
+
type: 'default',
|
|
161
|
+
value: { action: 'q', id: q.id, ans: [[opt.label]] },
|
|
162
|
+
},
|
|
163
|
+
],
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
if (question.multiple) {
|
|
167
|
+
elements.push({
|
|
168
|
+
tag: 'div',
|
|
169
|
+
text: {
|
|
170
|
+
tag: 'lark_md',
|
|
171
|
+
content: '*(支持多选,回复如 `1,3`)*',
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
if (idx < q.questions.length - 1)
|
|
176
|
+
elements.push({ tag: 'hr' });
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
85
180
|
return {
|
|
86
181
|
config: { wide_screen_mode: true },
|
|
87
182
|
header: { title: { tag: 'plain_text', content: headerTitle } },
|
|
88
183
|
elements,
|
|
89
184
|
};
|
|
90
185
|
}
|
|
186
|
+
static createInteractionRepliedCard(kind, label) {
|
|
187
|
+
return {
|
|
188
|
+
config: { wide_screen_mode: true },
|
|
189
|
+
header: { title: { tag: 'plain_text', content: '✅ 已处理' } },
|
|
190
|
+
elements: [
|
|
191
|
+
{
|
|
192
|
+
tag: 'div',
|
|
193
|
+
text: {
|
|
194
|
+
tag: 'lark_md',
|
|
195
|
+
content: kind === 'permission'
|
|
196
|
+
? `已${label === 'reject' ? '拒绝' : label === 'always' ? '永久授权' : '授权一次'}该权限请求。`
|
|
197
|
+
: `已提交选择:${label}`,
|
|
198
|
+
},
|
|
199
|
+
},
|
|
200
|
+
],
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
static createExpiredCard() {
|
|
204
|
+
return {
|
|
205
|
+
config: { wide_screen_mode: true },
|
|
206
|
+
header: { title: { tag: 'plain_text', content: '⏱️ 操作已过期' } },
|
|
207
|
+
elements: [
|
|
208
|
+
{
|
|
209
|
+
tag: 'div',
|
|
210
|
+
text: {
|
|
211
|
+
tag: 'lark_md',
|
|
212
|
+
content: '该操作已过期,请重新发起请求。',
|
|
213
|
+
},
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
};
|
|
217
|
+
}
|
|
91
218
|
}
|
|
92
219
|
//# sourceMappingURL=card.js.map
|
package/dist/feishu/card.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/feishu/card.ts"],"names":[],"mappings":"AAEA,MAAM,SAAS,GAAwC;IACrD,OAAO,EAAE,IAAI;IACb,SAAS,EAAE,GAAG;IACd,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,kBAAkB,CAAC,OAAe
|
|
1
|
+
{"version":3,"file":"card.js","sourceRoot":"","sources":["../../src/feishu/card.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,7 @@ import type { FeishuAPI } from './api.js';
|
|
|
4
4
|
* Long-connection event source backed by Lark.WSClient.
|
|
5
5
|
*
|
|
6
6
|
* Emits `message` (FeishuMessage) for every `im.message.receive_v1` event.
|
|
7
|
+
* Emits `cardAction` (FeishuCardAction) for every `card.action.trigger` event.
|
|
7
8
|
* Emits `error` on fatal WSClient errors. Reconnection is handled internally
|
|
8
9
|
* by the SDK (autoReconnect=true, ping/pong loop, exponential backoff).
|
|
9
10
|
*/
|
|
@@ -13,6 +14,11 @@ export declare class FeishuEventSource extends EventEmitter {
|
|
|
13
14
|
private started;
|
|
14
15
|
constructor(api: FeishuAPI);
|
|
15
16
|
connect(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Emit cardAction and await the first listener's return value.
|
|
19
|
+
* This lets us propagate the card callback response back to Feishu.
|
|
20
|
+
*/
|
|
21
|
+
private emitCardAction;
|
|
16
22
|
disconnect(): Promise<void>;
|
|
17
23
|
isConnected(): boolean;
|
|
18
24
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-source.d.ts","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"event-source.d.ts","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAmC1C;;;;;;;GAOG;AACH,qBAAa,iBAAkB,SAAQ,YAAY;IACjD,OAAO,CAAC,QAAQ,CAAC,CAAgB;IACjC,OAAO,CAAC,GAAG,CAAY;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,GAAG,EAAE,SAAS;IAKpB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAyD9B;;;OAGG;YACW,cAAc;IAWtB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAYjC,WAAW,IAAI,OAAO;CAGvB"}
|
|
@@ -3,10 +3,38 @@ import * as Lark from '@larksuiteoapi/node-sdk';
|
|
|
3
3
|
import { createLogger } from '../core/logger.js';
|
|
4
4
|
import { silentLogger } from './silent-logger.js';
|
|
5
5
|
const log = createLogger('FeishuEventSource');
|
|
6
|
+
/**
|
|
7
|
+
* Parse raw card.action.trigger event data into a normalized FeishuCardAction.
|
|
8
|
+
* Matches the shape produced by Lark SDK's normalizeCardAction().
|
|
9
|
+
*/
|
|
10
|
+
function parseCardAction(event) {
|
|
11
|
+
const messageId = event.context?.open_message_id ?? event.open_message_id;
|
|
12
|
+
const chatId = event.context?.open_chat_id ?? event.open_chat_id;
|
|
13
|
+
const operatorOpenId = event.operator?.open_id;
|
|
14
|
+
if (!messageId || !chatId || !operatorOpenId) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
return {
|
|
18
|
+
messageId,
|
|
19
|
+
chatId,
|
|
20
|
+
operator: {
|
|
21
|
+
openId: operatorOpenId,
|
|
22
|
+
userId: event.operator?.user_id,
|
|
23
|
+
name: event.operator?.name,
|
|
24
|
+
},
|
|
25
|
+
action: {
|
|
26
|
+
value: event.action?.value,
|
|
27
|
+
tag: event.action?.tag ?? 'unknown',
|
|
28
|
+
name: event.action?.name,
|
|
29
|
+
option: event.action?.option,
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
6
33
|
/**
|
|
7
34
|
* Long-connection event source backed by Lark.WSClient.
|
|
8
35
|
*
|
|
9
36
|
* Emits `message` (FeishuMessage) for every `im.message.receive_v1` event.
|
|
37
|
+
* Emits `cardAction` (FeishuCardAction) for every `card.action.trigger` event.
|
|
10
38
|
* Emits `error` on fatal WSClient errors. Reconnection is handled internally
|
|
11
39
|
* by the SDK (autoReconnect=true, ping/pong loop, exponential backoff).
|
|
12
40
|
*/
|
|
@@ -43,6 +71,18 @@ export class FeishuEventSource extends EventEmitter {
|
|
|
43
71
|
this.emit('message', message);
|
|
44
72
|
return { ok: true };
|
|
45
73
|
},
|
|
74
|
+
'card.action.trigger': async (data) => {
|
|
75
|
+
const action = parseCardAction(data);
|
|
76
|
+
if (!action) {
|
|
77
|
+
log.warn({ data }, 'Failed to parse card action event');
|
|
78
|
+
return { toast: { type: 'error', content: '无效的操作' } };
|
|
79
|
+
}
|
|
80
|
+
log.info({ chatId: action.chatId, messageId: action.messageId, tag: action.action.tag }, 'Card action triggered');
|
|
81
|
+
// Hand off to the listener (MessageHandler). The return value from
|
|
82
|
+
// the listener is propagated back to Feishu as the card callback response.
|
|
83
|
+
const result = await this.emitCardAction(action);
|
|
84
|
+
return result ?? { toast: { type: 'success', content: '已处理' } };
|
|
85
|
+
},
|
|
46
86
|
// Suppress SDK warnings for events we intentionally don't handle
|
|
47
87
|
'im.chat.access_event.bot_p2p_chat_entered_v1': async () => ({ ok: true }),
|
|
48
88
|
'im.message.message_read_v1': async () => ({ ok: true }),
|
|
@@ -60,6 +100,20 @@ export class FeishuEventSource extends EventEmitter {
|
|
|
60
100
|
throw err;
|
|
61
101
|
}
|
|
62
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Emit cardAction and await the first listener's return value.
|
|
105
|
+
* This lets us propagate the card callback response back to Feishu.
|
|
106
|
+
*/
|
|
107
|
+
async emitCardAction(action) {
|
|
108
|
+
const listeners = this.listeners('cardAction');
|
|
109
|
+
if (listeners.length === 0) {
|
|
110
|
+
log.warn('No cardAction listener registered');
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
// Await the first listener; EventEmitter normally ignores async returns,
|
|
114
|
+
// but the EventDispatcher.invoke() caller awaits our handler return.
|
|
115
|
+
return listeners[0](action);
|
|
116
|
+
}
|
|
63
117
|
async disconnect() {
|
|
64
118
|
if (!this.wsClient)
|
|
65
119
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-source.js","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,IAAI,MAAM,yBAAyB,CAAC;AAGhD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,GAAG,GAAG,YAAY,CAAC,mBAAmB,CAAC,CAAC;AAE9C
|
|
1
|
+
{"version":3,"file":"event-source.js","sourceRoot":"","sources":["../../src/feishu/event-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@ export declare class OpenCodeClient {
|
|
|
7
7
|
directory?: string;
|
|
8
8
|
password?: string;
|
|
9
9
|
});
|
|
10
|
+
private formatError;
|
|
10
11
|
createSession(title?: string): Promise<any>;
|
|
11
12
|
sendPrompt(sessionId: string, text: string, files?: Array<{
|
|
12
13
|
filePath: string;
|
|
@@ -25,6 +26,9 @@ export declare class OpenCodeClient {
|
|
|
25
26
|
* against the server (sessions may have been deleted externally).
|
|
26
27
|
*/
|
|
27
28
|
sessionExists(sessionId: string): Promise<boolean>;
|
|
29
|
+
replyPermission(requestID: string, reply: 'once' | 'always' | 'reject'): Promise<boolean>;
|
|
30
|
+
replyQuestion(requestID: string, answers: string[][]): Promise<boolean>;
|
|
31
|
+
sendCommand(sessionId: string, command: string, args?: string): Promise<any>;
|
|
28
32
|
getBaseUrl(): string;
|
|
29
33
|
getDirectory(): string;
|
|
30
34
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAEA,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAA0C;IACxD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE;IAmB/E,OAAO,CAAC,WAAW;IAcb,aAAa,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAY3C,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC;IA8BlI,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC;IAK/B,gBAAgB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAU7D,YAAY,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAU9B,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMpD;;;;OAIG;IACG,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAUlD,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAazF,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAavE,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAelF,UAAU,IAAI,MAAM;IAIpB,YAAY,IAAI,MAAM;CAGvB"}
|
package/dist/opencode/client.js
CHANGED
|
@@ -18,12 +18,28 @@ export class OpenCodeClient {
|
|
|
18
18
|
}
|
|
19
19
|
this.client = createOpencodeClient(config);
|
|
20
20
|
}
|
|
21
|
+
formatError(error) {
|
|
22
|
+
if (typeof error === 'string')
|
|
23
|
+
return error;
|
|
24
|
+
if (error instanceof Error)
|
|
25
|
+
return error.message;
|
|
26
|
+
try {
|
|
27
|
+
// Try to stringify with all own property names (including non-enumerable)
|
|
28
|
+
const props = error && typeof error === 'object'
|
|
29
|
+
? Object.getOwnPropertyNames(error)
|
|
30
|
+
: undefined;
|
|
31
|
+
return JSON.stringify(error, props);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
return String(error);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
21
37
|
async createSession(title) {
|
|
22
38
|
const { data, error } = await this.client.session.create({
|
|
23
39
|
title: title || 'Feishu Chat',
|
|
24
40
|
});
|
|
25
41
|
if (error) {
|
|
26
|
-
throw new Error(`Failed to create session: ${error}`);
|
|
42
|
+
throw new Error(`Failed to create session: ${this.formatError(error)}`);
|
|
27
43
|
}
|
|
28
44
|
return data;
|
|
29
45
|
}
|
|
@@ -41,12 +57,14 @@ export class OpenCodeClient {
|
|
|
41
57
|
});
|
|
42
58
|
}
|
|
43
59
|
}
|
|
44
|
-
|
|
60
|
+
// Use promptAsync so the call returns immediately instead of blocking
|
|
61
|
+
// until the AI finishes. Responses arrive through the event stream.
|
|
62
|
+
const { data, error } = await this.client.session.promptAsync({
|
|
45
63
|
sessionID: sessionId,
|
|
46
64
|
parts,
|
|
47
65
|
});
|
|
48
66
|
if (error) {
|
|
49
|
-
throw new Error(`Failed to send prompt: ${error}`);
|
|
67
|
+
throw new Error(`Failed to send prompt: ${this.formatError(error)}`);
|
|
50
68
|
}
|
|
51
69
|
return data;
|
|
52
70
|
}
|
|
@@ -57,14 +75,14 @@ export class OpenCodeClient {
|
|
|
57
75
|
async getSessionStatus() {
|
|
58
76
|
const { data, error } = await this.client.session.status({});
|
|
59
77
|
if (error) {
|
|
60
|
-
throw new Error(`Failed to get session status: ${error}`);
|
|
78
|
+
throw new Error(`Failed to get session status: ${this.formatError(error)}`);
|
|
61
79
|
}
|
|
62
80
|
return data || {};
|
|
63
81
|
}
|
|
64
82
|
async listSessions() {
|
|
65
83
|
const { data, error } = await this.client.session.list({});
|
|
66
84
|
if (error) {
|
|
67
|
-
throw new Error(`Failed to list sessions: ${error}`);
|
|
85
|
+
throw new Error(`Failed to list sessions: ${this.formatError(error)}`);
|
|
68
86
|
}
|
|
69
87
|
return data || [];
|
|
70
88
|
}
|
|
@@ -89,6 +107,38 @@ export class OpenCodeClient {
|
|
|
89
107
|
return false;
|
|
90
108
|
}
|
|
91
109
|
}
|
|
110
|
+
async replyPermission(requestID, reply) {
|
|
111
|
+
const { data, error } = await this.client.permission.reply({
|
|
112
|
+
requestID,
|
|
113
|
+
reply,
|
|
114
|
+
});
|
|
115
|
+
if (error) {
|
|
116
|
+
throw new Error(`Failed to reply to permission: ${this.formatError(error)}`);
|
|
117
|
+
}
|
|
118
|
+
return !!data;
|
|
119
|
+
}
|
|
120
|
+
async replyQuestion(requestID, answers) {
|
|
121
|
+
const { data, error } = await this.client.question.reply({
|
|
122
|
+
requestID,
|
|
123
|
+
answers,
|
|
124
|
+
});
|
|
125
|
+
if (error) {
|
|
126
|
+
throw new Error(`Failed to reply to question: ${this.formatError(error)}`);
|
|
127
|
+
}
|
|
128
|
+
return !!data;
|
|
129
|
+
}
|
|
130
|
+
async sendCommand(sessionId, command, args) {
|
|
131
|
+
const { data, error } = await this.client.session.command({
|
|
132
|
+
sessionID: sessionId,
|
|
133
|
+
command,
|
|
134
|
+
arguments: args || '',
|
|
135
|
+
});
|
|
136
|
+
if (error) {
|
|
137
|
+
const msg = typeof error === 'string' ? error : JSON.stringify(error);
|
|
138
|
+
throw new Error(`Failed to send command: ${msg}`);
|
|
139
|
+
}
|
|
140
|
+
return data;
|
|
141
|
+
}
|
|
92
142
|
getBaseUrl() {
|
|
93
143
|
return this.baseUrl;
|
|
94
144
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAElE,MAAM,OAAO,cAAc;IACjB,MAAM,CAA0C;IAChD,OAAO,CAAS;IAChB,SAAS,CAAS;IAE1B,YAAY,OAAmE;QAC7E,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;QAEpD,MAAM,MAAM,GAAQ;YAClB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,CAAC;QAEF,iBAAiB;QACjB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,CAAC,OAAO,GAAG;gBACf,eAAe,EAAE,SAAS,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;aAC3F,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAc;QAChC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YACvD,KAAK,EAAE,KAAK,IAAI,aAAa;SAC9B,CAAC,CAAC;QAEH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/opencode/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,12 @@ export declare class OpenCodeEventHandler {
|
|
|
20
20
|
private handleStatusChange;
|
|
21
21
|
private handleError;
|
|
22
22
|
private handleSessionIdle;
|
|
23
|
+
private handlePermissionAsked;
|
|
24
|
+
private handlePermissionReplied;
|
|
25
|
+
private handleQuestionAsked;
|
|
26
|
+
private handleQuestionReplied;
|
|
27
|
+
private handleQuestionRejected;
|
|
28
|
+
private handleCommandExecuted;
|
|
23
29
|
/**
|
|
24
30
|
* 合成并推送主流式卡片(一个 chat 对应一张持续更新的卡片)。
|
|
25
31
|
* - 首次调用:sendCard 新建一张并记录 message_id
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-handler.d.ts","sourceRoot":"","sources":["../../src/opencode/event-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQ3D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEtB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,UAAQ,EACnB,OAAO,SAAO;IAUV,KAAK,CAAC,WAAW,EAAE;QAAE,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvF,IAAI,IAAI,IAAI;YAKE,WAAW;
|
|
1
|
+
{"version":3,"file":"event-handler.d.ts","sourceRoot":"","sources":["../../src/opencode/event-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAQ3D,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAC,CAAc;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,OAAO,CAAS;gBAEtB,cAAc,EAAE,cAAc,EAC9B,SAAS,EAAE,SAAS,EACpB,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,UAAQ,EACnB,OAAO,SAAO;IAUV,KAAK,CAAC,WAAW,EAAE;QAAE,MAAM,EAAE,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBvF,IAAI,IAAI,IAAI;YAKE,WAAW;YAoDX,eAAe;YAsBf,gBAAgB;YA0ChB,kBAAkB;YAsClB,WAAW;YAkBX,iBAAiB;YAkCjB,qBAAqB;YA4BrB,uBAAuB;YAiBvB,mBAAmB;YA6BnB,qBAAqB;YAerB,sBAAsB;YAatB,qBAAqB;IAmBnC;;;;;OAKG;YACW,SAAS;CAoExB"}
|