@ai-setting/roy-agent-core 1.5.35 → 1.5.37
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/dist/config/index.js +3 -3
- package/dist/env/agent/index.js +3 -3
- package/dist/env/commands/index.js +3 -3
- package/dist/env/debug/index.js +3 -3
- package/dist/env/event-source/index.js +5 -9
- package/dist/env/hook/index.js +1 -1
- package/dist/env/index.js +11 -15
- package/dist/env/llm/index.js +3 -3
- package/dist/env/log-trace/index.js +3 -3
- package/dist/env/mcp/index.js +3 -3
- package/dist/env/memory/index.js +3 -3
- package/dist/env/prompt/index.js +3 -3
- package/dist/env/session/index.js +3 -3
- package/dist/env/skill/index.js +3 -3
- package/dist/env/task/delegate/index.js +2 -2
- package/dist/env/task/index.js +4 -4
- package/dist/env/tool/index.js +3 -3
- package/dist/env/workflow/index.js +3 -3
- package/dist/index.js +21 -25
- package/dist/shared/@ai-setting/{roy-agent-core-f7q2x5z6.js → roy-agent-core-0wdjp769.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-vf215qfv.js → roy-agent-core-3prpabp8.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-gjq1yk68.js → roy-agent-core-86gphny5.js} +7 -0
- package/dist/shared/@ai-setting/{roy-agent-core-zbkpc41z.js → roy-agent-core-97ma0pr5.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-8jxva565.js → roy-agent-core-9mj7vzsm.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-81w1963m.js → roy-agent-core-by55z88t.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-vkz81f7v.js → roy-agent-core-c0d3dtjd.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-b0x5dda6.js → roy-agent-core-c2wjwx16.js} +9 -1
- package/dist/shared/@ai-setting/{roy-agent-core-kkbwepqb.js → roy-agent-core-cefh9hjv.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-pw7cv1px.js → roy-agent-core-e2vk2qh7.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-g99pxzn5.js → roy-agent-core-fg1kxf70.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-7nwwzxf6.js → roy-agent-core-gf2c2pxr.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-vn2bc59q.js → roy-agent-core-hd1z20yq.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-4wjywp3c.js → roy-agent-core-hkb529dw.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-j1sr5pk9.js → roy-agent-core-j0ke54vy.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-5ex3za0m.js → roy-agent-core-mx489p7f.js} +148 -287
- package/dist/shared/@ai-setting/{roy-agent-core-4txzpsbt.js → roy-agent-core-qdmt6nz7.js} +1 -1
- package/dist/shared/@ai-setting/{roy-agent-core-5wp5grzj.js → roy-agent-core-vqspcspb.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-mrcxzpbg.js → roy-agent-core-wjd5kars.js} +2 -2
- package/dist/shared/@ai-setting/{roy-agent-core-avq1x4t7.js → roy-agent-core-xb4hvk1m.js} +2 -22
- package/dist/shared/@ai-setting/{roy-agent-core-gwc4h96n.js → roy-agent-core-xt3fx7m1.js} +3 -3
- package/package.json +1 -1
|
@@ -8,11 +8,11 @@ import {
|
|
|
8
8
|
} from "./roy-agent-core-qxhq8ven.js";
|
|
9
9
|
import {
|
|
10
10
|
BaseComponent
|
|
11
|
-
} from "./roy-agent-core-
|
|
11
|
+
} from "./roy-agent-core-cefh9hjv.js";
|
|
12
12
|
import {
|
|
13
13
|
LLMHookPoints,
|
|
14
14
|
globalHookManager
|
|
15
|
-
} from "./roy-agent-core-
|
|
15
|
+
} from "./roy-agent-core-86gphny5.js";
|
|
16
16
|
import {
|
|
17
17
|
TracedAs,
|
|
18
18
|
init_decorator
|
|
@@ -10,7 +10,10 @@ import {
|
|
|
10
10
|
} from "./roy-agent-core-qxhq8ven.js";
|
|
11
11
|
import {
|
|
12
12
|
BaseComponent
|
|
13
|
-
} from "./roy-agent-core-
|
|
13
|
+
} from "./roy-agent-core-cefh9hjv.js";
|
|
14
|
+
import {
|
|
15
|
+
globalHookManager
|
|
16
|
+
} from "./roy-agent-core-86gphny5.js";
|
|
14
17
|
import {
|
|
15
18
|
SessionMessageConverter
|
|
16
19
|
} from "./roy-agent-core-jfh9q2qh.js";
|
|
@@ -1009,6 +1012,11 @@ ${ctx.context.additionInfo}`
|
|
|
1009
1012
|
});
|
|
1010
1013
|
}
|
|
1011
1014
|
}
|
|
1015
|
+
const metadata = {
|
|
1016
|
+
pluginEnabled: ctx.context?.pluginEnabled,
|
|
1017
|
+
envEvent: ctx.context?.envEvent
|
|
1018
|
+
};
|
|
1019
|
+
await globalHookManager.execute(point, ctx, metadata);
|
|
1012
1020
|
}
|
|
1013
1021
|
async handleHookAction(action, ctx) {
|
|
1014
1022
|
switch (action.type) {
|
|
@@ -3,7 +3,10 @@ import {
|
|
|
3
3
|
} from "./roy-agent-core-qxhq8ven.js";
|
|
4
4
|
import {
|
|
5
5
|
BaseComponent
|
|
6
|
-
} from "./roy-agent-core-
|
|
6
|
+
} from "./roy-agent-core-cefh9hjv.js";
|
|
7
|
+
import {
|
|
8
|
+
globalHookManager
|
|
9
|
+
} from "./roy-agent-core-86gphny5.js";
|
|
7
10
|
import {
|
|
8
11
|
createLogger,
|
|
9
12
|
init_logger
|
|
@@ -28,101 +31,45 @@ function matchEventType(eventType, patterns) {
|
|
|
28
31
|
}
|
|
29
32
|
return false;
|
|
30
33
|
}
|
|
31
|
-
function
|
|
32
|
-
const event = rawEvent;
|
|
33
|
-
switch (sourceType) {
|
|
34
|
-
case "lark-cli": {
|
|
35
|
-
const larkEvent = event;
|
|
36
|
-
const larkInnerEvent = larkEvent.event;
|
|
37
|
-
const larkMessage = larkInnerEvent?.message || larkEvent.message;
|
|
38
|
-
const larkSender = larkInnerEvent?.sender || larkEvent.sender;
|
|
39
|
-
const senderId = larkSender?.sender_id;
|
|
40
|
-
if (larkMessage) {
|
|
41
|
-
const openId = senderId?.open_id || senderId?.user_id || senderId?.email || senderId?.union_id || "未知用户";
|
|
42
|
-
let content = "无消息内容";
|
|
43
|
-
if (larkMessage.content) {
|
|
44
|
-
try {
|
|
45
|
-
const contentObj = JSON.parse(larkMessage.content);
|
|
46
|
-
content = contentObj.text || contentObj.content || larkMessage.content;
|
|
47
|
-
} catch {
|
|
48
|
-
content = larkMessage.content;
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
return `[飞书消息] ${openId}: ${content}`;
|
|
52
|
-
}
|
|
53
|
-
return `[飞书事件] ${eventType || larkEvent.schema || "unknown"}`;
|
|
54
|
-
}
|
|
55
|
-
case "timer": {
|
|
56
|
-
const timerMessage = event.payload?.message || event.message || "tick";
|
|
57
|
-
return `[定时任务] ${timerMessage}`;
|
|
58
|
-
}
|
|
59
|
-
case "websocket":
|
|
60
|
-
return `[WebSocket] ${JSON.stringify(rawEvent).substring(0, 200)}`;
|
|
61
|
-
default:
|
|
62
|
-
return `[${sourceType}] ${JSON.stringify(rawEvent).substring(0, 200)}`;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
function extractMetadata(sourceType, rawEvent, eventType) {
|
|
34
|
+
function extractMetadata(rawEvent, eventType) {
|
|
66
35
|
const event = rawEvent;
|
|
67
36
|
const metadata = {};
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
if (senderId) {
|
|
87
|
-
metadata.senderId = senderId.open_id || senderId.user_id || senderId.union_id;
|
|
88
|
-
}
|
|
89
|
-
break;
|
|
90
|
-
}
|
|
91
|
-
case "timer":
|
|
92
|
-
metadata.eventType = "timer.tick";
|
|
93
|
-
break;
|
|
94
|
-
case "websocket":
|
|
95
|
-
metadata.eventType = eventType;
|
|
96
|
-
break;
|
|
97
|
-
default:
|
|
98
|
-
metadata.eventType = eventType;
|
|
37
|
+
const larkInnerEvent = event.event;
|
|
38
|
+
const header = event.header;
|
|
39
|
+
const message = larkInnerEvent?.message || event.message;
|
|
40
|
+
const sender = larkInnerEvent?.sender || event.sender;
|
|
41
|
+
const senderId = sender?.sender_id;
|
|
42
|
+
if (header) {
|
|
43
|
+
metadata.eventType = header.event_type;
|
|
44
|
+
metadata.appId = header.app_id;
|
|
45
|
+
metadata.tenantKey = header.tenant_key;
|
|
46
|
+
}
|
|
47
|
+
if (message) {
|
|
48
|
+
metadata.chatId = message.chat_id;
|
|
49
|
+
metadata.chatType = message.chat_type;
|
|
50
|
+
metadata.messageId = message.message_id;
|
|
51
|
+
metadata.messageType = message.message_type;
|
|
52
|
+
}
|
|
53
|
+
if (senderId) {
|
|
54
|
+
metadata.senderId = senderId.open_id || senderId.user_id || senderId.union_id;
|
|
99
55
|
}
|
|
100
56
|
let recommendedAction;
|
|
101
|
-
if (
|
|
57
|
+
if (eventType === "im.message.receive_v1") {
|
|
102
58
|
recommendedAction = {
|
|
103
|
-
action: "
|
|
59
|
+
action: '处理飞书消息并以机器人身份回复,比如lark-cli im +messages-reply --message-id "xxxxid" --as bot --text "回复内容"',
|
|
104
60
|
replyTo: {
|
|
105
61
|
appId: metadata.appId,
|
|
106
62
|
chatId: metadata.chatId,
|
|
107
63
|
messageId: metadata.messageId
|
|
108
64
|
}
|
|
109
65
|
};
|
|
110
|
-
} else if (sourceType === "timer") {
|
|
111
|
-
recommendedAction = { action: "执行定时任务" };
|
|
112
|
-
} else if (sourceType === "websocket") {
|
|
113
|
-
recommendedAction = { action: "处理 WebSocket 消息" };
|
|
114
|
-
}
|
|
115
|
-
let replyChannel;
|
|
116
|
-
if (sourceType === "lark-cli") {
|
|
117
|
-
replyChannel = {
|
|
118
|
-
type: "lark-cli",
|
|
119
|
-
appId: metadata.appId,
|
|
120
|
-
chatId: metadata.chatId,
|
|
121
|
-
messageId: metadata.messageId
|
|
122
|
-
};
|
|
123
|
-
} else if (sourceType === "websocket") {
|
|
124
|
-
replyChannel = { type: "websocket" };
|
|
125
66
|
}
|
|
67
|
+
const replyChannel = {
|
|
68
|
+
type: "lark-cli",
|
|
69
|
+
appId: metadata.appId,
|
|
70
|
+
chatId: metadata.chatId,
|
|
71
|
+
messageId: metadata.messageId
|
|
72
|
+
};
|
|
126
73
|
return { metadata, replyChannel, recommendedAction };
|
|
127
74
|
}
|
|
128
75
|
|
|
@@ -132,26 +79,35 @@ class LarkCliInstance {
|
|
|
132
79
|
child;
|
|
133
80
|
buffer = "";
|
|
134
81
|
eventHandler;
|
|
82
|
+
loadedPlugins = [];
|
|
135
83
|
constructor(config) {
|
|
136
84
|
this.config = config;
|
|
137
85
|
}
|
|
138
86
|
async start() {
|
|
139
87
|
if (this.status === "running")
|
|
140
88
|
return;
|
|
141
|
-
|
|
142
|
-
const
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
147
|
-
detached: false,
|
|
89
|
+
await this.loadPlugins();
|
|
90
|
+
const command = this.config.command || "lark-cli event consume im.message.receive_v1 --as bot";
|
|
91
|
+
this.child = spawn("exec " + command, [], {
|
|
92
|
+
shell: true,
|
|
93
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
148
94
|
windowsHide: true
|
|
149
95
|
});
|
|
96
|
+
let stdoutBuffer = "";
|
|
97
|
+
let stderrBuffer = "";
|
|
150
98
|
this.child.stdout?.on("data", (data) => {
|
|
151
|
-
|
|
99
|
+
const str = data.toString();
|
|
100
|
+
stdoutBuffer += str;
|
|
101
|
+
this.processStream(stdoutBuffer);
|
|
102
|
+
stdoutBuffer = "";
|
|
152
103
|
});
|
|
153
104
|
this.child.stderr?.on("data", (data) => {
|
|
154
105
|
const output = data.toString();
|
|
106
|
+
if (!output.startsWith("[event]") && output.startsWith("{")) {
|
|
107
|
+
stderrBuffer += output;
|
|
108
|
+
this.processStream(stderrBuffer);
|
|
109
|
+
stderrBuffer = "";
|
|
110
|
+
}
|
|
155
111
|
if (output.includes('"ok": false')) {
|
|
156
112
|
this.status = "error";
|
|
157
113
|
}
|
|
@@ -159,15 +115,37 @@ class LarkCliInstance {
|
|
|
159
115
|
this.child.on("exit", (code) => {
|
|
160
116
|
if (code !== 0 && code !== null) {
|
|
161
117
|
this.status = "error";
|
|
118
|
+
} else {
|
|
119
|
+
this.status = "stopped";
|
|
162
120
|
}
|
|
163
121
|
});
|
|
122
|
+
this.child.on("error", (error) => {
|
|
123
|
+
console.error(`[LarkCliInstance] Process error: ${error.message}`);
|
|
124
|
+
this.status = "error";
|
|
125
|
+
});
|
|
164
126
|
await new Promise((resolve) => setTimeout(resolve, 1000));
|
|
165
127
|
this.status = "running";
|
|
166
128
|
}
|
|
167
129
|
async stop() {
|
|
168
130
|
if (this.status === "stopped" || this.status === "created")
|
|
169
131
|
return;
|
|
170
|
-
this.
|
|
132
|
+
this.unloadPlugins();
|
|
133
|
+
if (this.child && this.child.pid) {
|
|
134
|
+
try {
|
|
135
|
+
this.child.kill("SIGTERM");
|
|
136
|
+
await new Promise((resolve) => {
|
|
137
|
+
setTimeout(resolve, 5000);
|
|
138
|
+
});
|
|
139
|
+
if (!this.child?.killed) {
|
|
140
|
+
this.child.kill("SIGKILL");
|
|
141
|
+
}
|
|
142
|
+
} catch (error) {
|
|
143
|
+
console.error(`[LarkCliInstance] Error stopping process: ${error}`);
|
|
144
|
+
try {
|
|
145
|
+
this.child?.kill("SIGKILL");
|
|
146
|
+
} catch {}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
171
149
|
this.child = undefined;
|
|
172
150
|
this.buffer = "";
|
|
173
151
|
this.status = "stopped";
|
|
@@ -181,6 +159,54 @@ class LarkCliInstance {
|
|
|
181
159
|
offEvent() {
|
|
182
160
|
this.eventHandler = undefined;
|
|
183
161
|
}
|
|
162
|
+
async loadPlugins() {
|
|
163
|
+
const plugins = this.config.handleRule?.plugins || [];
|
|
164
|
+
for (const pluginName of plugins) {
|
|
165
|
+
const plugin = await this.importPlugin(pluginName);
|
|
166
|
+
if (plugin) {
|
|
167
|
+
this.registerPluginHooks(plugin);
|
|
168
|
+
this.loadedPlugins.push({
|
|
169
|
+
name: pluginName,
|
|
170
|
+
hooks: plugin.hooks.map((h) => ({ point: h.point, name: `${pluginName}:${h.point}` }))
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
async importPlugin(name) {
|
|
176
|
+
const PLUGIN_PATHS = {
|
|
177
|
+
"task-tag": "@ai-setting/roy-agent-core/env/task/plugins/task-tag-plugin"
|
|
178
|
+
};
|
|
179
|
+
const path = PLUGIN_PATHS[name] || name;
|
|
180
|
+
try {
|
|
181
|
+
const module = await import(path);
|
|
182
|
+
const PluginClass = module.TaskPlugin || module.default;
|
|
183
|
+
return new PluginClass;
|
|
184
|
+
} catch (error) {
|
|
185
|
+
console.error(`[LarkCliInstance] Failed to load plugin ${name}:`, error);
|
|
186
|
+
return null;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
registerPluginHooks(plugin) {
|
|
190
|
+
for (const hook of plugin.hooks) {
|
|
191
|
+
globalHookManager.register(hook.point, {
|
|
192
|
+
name: `${plugin.name}:${hook.point}`,
|
|
193
|
+
priority: hook.priority ?? 0,
|
|
194
|
+
pluginName: plugin.name,
|
|
195
|
+
sourceId: this.config.id,
|
|
196
|
+
execute: async (ctx) => {
|
|
197
|
+
await plugin.execute(ctx);
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
unloadPlugins() {
|
|
203
|
+
for (const plugin of this.loadedPlugins) {
|
|
204
|
+
for (const hook of plugin.hooks) {
|
|
205
|
+
globalHookManager.unregister(hook.point, `${plugin.name}:${hook.point}`);
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
this.loadedPlugins = [];
|
|
209
|
+
}
|
|
184
210
|
processStream(data) {
|
|
185
211
|
this.buffer += data;
|
|
186
212
|
const lines = this.buffer.split(`
|
|
@@ -214,12 +240,21 @@ class LarkCliInstance {
|
|
|
214
240
|
if (this.config.eventTypes?.length && !matchEventType(eventType, this.config.eventTypes)) {
|
|
215
241
|
return;
|
|
216
242
|
}
|
|
217
|
-
const { metadata, replyChannel, recommendedAction } = extractMetadata(
|
|
218
|
-
const message =
|
|
243
|
+
const { metadata, replyChannel, recommendedAction } = extractMetadata(rawEvent, eventType);
|
|
244
|
+
const message = JSON.stringify({
|
|
245
|
+
rawData,
|
|
246
|
+
recommendedAction
|
|
247
|
+
});
|
|
248
|
+
const timestamp = Date.now();
|
|
219
249
|
const evt = {
|
|
220
|
-
|
|
221
|
-
type:
|
|
222
|
-
timestamp
|
|
250
|
+
id: `es-${this.config.id}-${timestamp}`,
|
|
251
|
+
type: "event-source.event.lark-cli",
|
|
252
|
+
timestamp,
|
|
253
|
+
metadata: {
|
|
254
|
+
source: "event-source",
|
|
255
|
+
sourceId: this.config.id,
|
|
256
|
+
sourceMessageType: eventType
|
|
257
|
+
},
|
|
223
258
|
payload: {
|
|
224
259
|
sourceId: this.config.id,
|
|
225
260
|
sourceType: "lark-cli",
|
|
@@ -228,11 +263,13 @@ class LarkCliInstance {
|
|
|
228
263
|
metadata,
|
|
229
264
|
replyChannel,
|
|
230
265
|
recommendedAction,
|
|
231
|
-
timestamp
|
|
266
|
+
timestamp
|
|
232
267
|
}
|
|
233
268
|
};
|
|
234
269
|
this.eventHandler?.(evt);
|
|
235
|
-
} catch (error) {
|
|
270
|
+
} catch (error) {
|
|
271
|
+
console.error(`[LarkCliInstance] Error handling event: ${error}`);
|
|
272
|
+
}
|
|
236
273
|
}
|
|
237
274
|
}
|
|
238
275
|
var larkCliHandler = {
|
|
@@ -240,7 +277,7 @@ var larkCliHandler = {
|
|
|
240
277
|
validateConfig(config) {
|
|
241
278
|
const errors = [];
|
|
242
279
|
if (!config.command) {
|
|
243
|
-
errors.push("lark-cli
|
|
280
|
+
errors.push("command is optional, will use default: lark-cli event consume im.message.receive_v1 --as bot");
|
|
244
281
|
}
|
|
245
282
|
return errors;
|
|
246
283
|
},
|
|
@@ -248,187 +285,8 @@ var larkCliHandler = {
|
|
|
248
285
|
return new LarkCliInstance(config);
|
|
249
286
|
}
|
|
250
287
|
};
|
|
251
|
-
|
|
252
|
-
class TimerInstance {
|
|
253
|
-
config;
|
|
254
|
-
status = "created";
|
|
255
|
-
timer;
|
|
256
|
-
eventHandler;
|
|
257
|
-
constructor(config) {
|
|
258
|
-
this.config = config;
|
|
259
|
-
}
|
|
260
|
-
async start() {
|
|
261
|
-
if (this.status === "running")
|
|
262
|
-
return;
|
|
263
|
-
const interval = this.config.interval || 60000;
|
|
264
|
-
const message = this.config.options?.message || `Timer event from ${this.config.name}`;
|
|
265
|
-
this.timer = setInterval(() => {
|
|
266
|
-
this.emitEvent(message);
|
|
267
|
-
}, interval);
|
|
268
|
-
this.emitEvent(message);
|
|
269
|
-
this.status = "running";
|
|
270
|
-
}
|
|
271
|
-
async stop() {
|
|
272
|
-
if (this.timer) {
|
|
273
|
-
clearInterval(this.timer);
|
|
274
|
-
this.timer = undefined;
|
|
275
|
-
}
|
|
276
|
-
this.status = "stopped";
|
|
277
|
-
}
|
|
278
|
-
getStatus() {
|
|
279
|
-
return this.status;
|
|
280
|
-
}
|
|
281
|
-
onEvent(handler) {
|
|
282
|
-
this.eventHandler = handler;
|
|
283
|
-
}
|
|
284
|
-
offEvent() {
|
|
285
|
-
this.eventHandler = undefined;
|
|
286
|
-
}
|
|
287
|
-
emitEvent(message) {
|
|
288
|
-
const rawEvent = {
|
|
289
|
-
type: "timer.tick",
|
|
290
|
-
payload: {
|
|
291
|
-
message,
|
|
292
|
-
timestamp: Date.now()
|
|
293
|
-
}
|
|
294
|
-
};
|
|
295
|
-
const { metadata, recommendedAction } = extractMetadata("timer", rawEvent, "timer.tick");
|
|
296
|
-
const evt = {
|
|
297
|
-
sourceId: this.config.id,
|
|
298
|
-
type: "timer.tick",
|
|
299
|
-
timestamp: Date.now(),
|
|
300
|
-
payload: {
|
|
301
|
-
sourceId: this.config.id,
|
|
302
|
-
sourceType: "timer",
|
|
303
|
-
rawEvent,
|
|
304
|
-
message: formatEventMessage("timer", rawEvent),
|
|
305
|
-
metadata,
|
|
306
|
-
recommendedAction,
|
|
307
|
-
timestamp: Date.now()
|
|
308
|
-
}
|
|
309
|
-
};
|
|
310
|
-
this.eventHandler?.(evt);
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
var timerHandler = {
|
|
314
|
-
type: "timer",
|
|
315
|
-
validateConfig(config) {
|
|
316
|
-
const errors = [];
|
|
317
|
-
if (!config.interval || config.interval <= 0) {
|
|
318
|
-
errors.push("Timer interval must be a positive number");
|
|
319
|
-
}
|
|
320
|
-
return errors;
|
|
321
|
-
},
|
|
322
|
-
createInstance(config) {
|
|
323
|
-
return new TimerInstance(config);
|
|
324
|
-
}
|
|
325
|
-
};
|
|
326
|
-
|
|
327
|
-
class WebSocketInstance {
|
|
328
|
-
config;
|
|
329
|
-
status = "created";
|
|
330
|
-
ws;
|
|
331
|
-
buffer = "";
|
|
332
|
-
eventHandler;
|
|
333
|
-
constructor(config) {
|
|
334
|
-
this.config = config;
|
|
335
|
-
}
|
|
336
|
-
async start() {
|
|
337
|
-
if (this.status === "running")
|
|
338
|
-
return;
|
|
339
|
-
const url = this.config.url;
|
|
340
|
-
if (!url) {
|
|
341
|
-
throw new Error("WebSocket URL is required");
|
|
342
|
-
}
|
|
343
|
-
const { WebSocket } = await import("ws");
|
|
344
|
-
this.ws = new WebSocket(url, { headers: this.config.headers });
|
|
345
|
-
this.ws.on("open", () => {
|
|
346
|
-
this.status = "running";
|
|
347
|
-
});
|
|
348
|
-
this.ws.on("message", (data) => {
|
|
349
|
-
this.processStream(data.toString());
|
|
350
|
-
});
|
|
351
|
-
this.ws.on("error", () => {
|
|
352
|
-
this.status = "error";
|
|
353
|
-
});
|
|
354
|
-
this.ws.on("close", () => {
|
|
355
|
-
this.status = "stopped";
|
|
356
|
-
});
|
|
357
|
-
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
358
|
-
}
|
|
359
|
-
async stop() {
|
|
360
|
-
if (this.ws) {
|
|
361
|
-
this.ws.close();
|
|
362
|
-
this.ws = undefined;
|
|
363
|
-
}
|
|
364
|
-
this.buffer = "";
|
|
365
|
-
this.status = "stopped";
|
|
366
|
-
}
|
|
367
|
-
getStatus() {
|
|
368
|
-
return this.status;
|
|
369
|
-
}
|
|
370
|
-
onEvent(handler) {
|
|
371
|
-
this.eventHandler = handler;
|
|
372
|
-
}
|
|
373
|
-
offEvent() {
|
|
374
|
-
this.eventHandler = undefined;
|
|
375
|
-
}
|
|
376
|
-
processStream(data) {
|
|
377
|
-
this.buffer += data;
|
|
378
|
-
const lines = this.buffer.split(`
|
|
379
|
-
`);
|
|
380
|
-
this.buffer = lines.pop() || "";
|
|
381
|
-
for (const line of lines) {
|
|
382
|
-
if (line.trim()) {
|
|
383
|
-
this.handleEvent(line);
|
|
384
|
-
}
|
|
385
|
-
}
|
|
386
|
-
}
|
|
387
|
-
handleEvent(rawData) {
|
|
388
|
-
try {
|
|
389
|
-
let rawEvent;
|
|
390
|
-
try {
|
|
391
|
-
rawEvent = JSON.parse(rawData);
|
|
392
|
-
} catch {
|
|
393
|
-
rawEvent = rawData;
|
|
394
|
-
}
|
|
395
|
-
const { metadata, replyChannel, recommendedAction } = extractMetadata("websocket", rawEvent);
|
|
396
|
-
const evt = {
|
|
397
|
-
sourceId: this.config.id,
|
|
398
|
-
type: "websocket.message",
|
|
399
|
-
timestamp: Date.now(),
|
|
400
|
-
payload: {
|
|
401
|
-
sourceId: this.config.id,
|
|
402
|
-
sourceType: "websocket",
|
|
403
|
-
rawEvent,
|
|
404
|
-
message: formatEventMessage("websocket", rawEvent),
|
|
405
|
-
metadata,
|
|
406
|
-
replyChannel,
|
|
407
|
-
recommendedAction,
|
|
408
|
-
timestamp: Date.now()
|
|
409
|
-
}
|
|
410
|
-
};
|
|
411
|
-
this.eventHandler?.(evt);
|
|
412
|
-
} catch (error) {}
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
var websocketHandler = {
|
|
416
|
-
type: "websocket",
|
|
417
|
-
validateConfig(config) {
|
|
418
|
-
const errors = [];
|
|
419
|
-
if (!config.url) {
|
|
420
|
-
errors.push("WebSocket URL is required");
|
|
421
|
-
}
|
|
422
|
-
return errors;
|
|
423
|
-
},
|
|
424
|
-
createInstance(config) {
|
|
425
|
-
return new WebSocketInstance(config);
|
|
426
|
-
}
|
|
427
|
-
};
|
|
428
288
|
var builtInHandlers = [
|
|
429
|
-
larkCliHandler
|
|
430
|
-
timerHandler,
|
|
431
|
-
websocketHandler
|
|
289
|
+
larkCliHandler
|
|
432
290
|
];
|
|
433
291
|
function getBuiltInHandler(type) {
|
|
434
292
|
return builtInHandlers.find((h) => h.type === type);
|
|
@@ -515,6 +373,11 @@ class EventSourceComponent extends BaseComponent {
|
|
|
515
373
|
this.handlers.clear();
|
|
516
374
|
this.buffers.clear();
|
|
517
375
|
}
|
|
376
|
+
createDefaultEventHandler(sourceId, sourceType) {
|
|
377
|
+
return (event) => {
|
|
378
|
+
this.getEnv()?.pushEnvEvent(event);
|
|
379
|
+
};
|
|
380
|
+
}
|
|
518
381
|
registerBuiltInHandlers() {
|
|
519
382
|
for (const handler of builtInHandlers) {
|
|
520
383
|
if (!this.handlers.has(handler.type)) {
|
|
@@ -524,7 +387,7 @@ class EventSourceComponent extends BaseComponent {
|
|
|
524
387
|
}
|
|
525
388
|
}
|
|
526
389
|
async executeInitHooks() {
|
|
527
|
-
const { EventSourceInitHooks } = await import("./roy-agent-core-
|
|
390
|
+
const { EventSourceInitHooks } = await import("./roy-agent-core-9mj7vzsm.js");
|
|
528
391
|
await EventSourceInitHooks.execute(this);
|
|
529
392
|
}
|
|
530
393
|
registerHandler(handler) {
|
|
@@ -713,10 +576,8 @@ class EventSourceComponent extends BaseComponent {
|
|
|
713
576
|
}
|
|
714
577
|
const instance = handler.createInstance(config);
|
|
715
578
|
this.instances.set(id, instance);
|
|
716
|
-
const eventHandler = this.eventHandlers.get(id);
|
|
717
|
-
|
|
718
|
-
instance.onEvent(eventHandler);
|
|
719
|
-
}
|
|
579
|
+
const eventHandler = this.eventHandlers.get(id) ?? this.createDefaultEventHandler(id, config.type);
|
|
580
|
+
instance.onEvent(eventHandler);
|
|
720
581
|
await instance.start();
|
|
721
582
|
this.statuses.set(id, "running");
|
|
722
583
|
this.getEnv()?.pushEnvEvent({
|
|
@@ -814,4 +675,4 @@ class EventSourceComponent extends BaseComponent {
|
|
|
814
675
|
}
|
|
815
676
|
}
|
|
816
677
|
|
|
817
|
-
export { larkCliHandler,
|
|
678
|
+
export { larkCliHandler, builtInHandlers, getBuiltInHandler, EventSourceComponent };
|
|
@@ -8,11 +8,11 @@ import {
|
|
|
8
8
|
} from "./roy-agent-core-qxhq8ven.js";
|
|
9
9
|
import {
|
|
10
10
|
BaseComponent
|
|
11
|
-
} from "./roy-agent-core-
|
|
11
|
+
} from "./roy-agent-core-cefh9hjv.js";
|
|
12
12
|
import {
|
|
13
13
|
ToolHookPoints,
|
|
14
14
|
globalHookManager
|
|
15
|
-
} from "./roy-agent-core-
|
|
15
|
+
} from "./roy-agent-core-86gphny5.js";
|
|
16
16
|
import {
|
|
17
17
|
createLogger,
|
|
18
18
|
init_logger
|