@ai-setting/roy-agent-core 1.5.35 → 1.5.36

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 (41) hide show
  1. package/dist/config/index.js +3 -3
  2. package/dist/env/agent/index.js +3 -3
  3. package/dist/env/commands/index.js +3 -3
  4. package/dist/env/debug/index.js +3 -3
  5. package/dist/env/event-source/index.js +5 -9
  6. package/dist/env/hook/index.js +1 -1
  7. package/dist/env/index.js +11 -15
  8. package/dist/env/llm/index.js +3 -3
  9. package/dist/env/log-trace/index.js +3 -3
  10. package/dist/env/mcp/index.js +3 -3
  11. package/dist/env/memory/index.js +3 -3
  12. package/dist/env/prompt/index.js +3 -3
  13. package/dist/env/session/index.js +3 -3
  14. package/dist/env/skill/index.js +3 -3
  15. package/dist/env/task/delegate/index.js +2 -2
  16. package/dist/env/task/index.js +4 -4
  17. package/dist/env/tool/index.js +3 -3
  18. package/dist/env/workflow/index.js +3 -3
  19. package/dist/index.js +21 -25
  20. package/dist/shared/@ai-setting/{roy-agent-core-f7q2x5z6.js → roy-agent-core-0wdjp769.js} +1 -1
  21. package/dist/shared/@ai-setting/{roy-agent-core-vf215qfv.js → roy-agent-core-3prpabp8.js} +1 -1
  22. package/dist/shared/@ai-setting/{roy-agent-core-gjq1yk68.js → roy-agent-core-86gphny5.js} +7 -0
  23. package/dist/shared/@ai-setting/{roy-agent-core-zbkpc41z.js → roy-agent-core-97ma0pr5.js} +1 -1
  24. package/dist/shared/@ai-setting/{roy-agent-core-8jxva565.js → roy-agent-core-9mj7vzsm.js} +1 -1
  25. package/dist/shared/@ai-setting/{roy-agent-core-81w1963m.js → roy-agent-core-by55z88t.js} +1 -1
  26. package/dist/shared/@ai-setting/{roy-agent-core-vkz81f7v.js → roy-agent-core-c0d3dtjd.js} +2 -2
  27. package/dist/shared/@ai-setting/{roy-agent-core-b0x5dda6.js → roy-agent-core-c2wjwx16.js} +9 -1
  28. package/dist/shared/@ai-setting/{roy-agent-core-kkbwepqb.js → roy-agent-core-cefh9hjv.js} +1 -1
  29. package/dist/shared/@ai-setting/{roy-agent-core-pw7cv1px.js → roy-agent-core-e2vk2qh7.js} +1 -1
  30. package/dist/shared/@ai-setting/{roy-agent-core-g99pxzn5.js → roy-agent-core-fg1kxf70.js} +1 -1
  31. package/dist/shared/@ai-setting/{roy-agent-core-7nwwzxf6.js → roy-agent-core-gf2c2pxr.js} +1 -1
  32. package/dist/shared/@ai-setting/{roy-agent-core-vn2bc59q.js → roy-agent-core-hd1z20yq.js} +1 -1
  33. package/dist/shared/@ai-setting/{roy-agent-core-4wjywp3c.js → roy-agent-core-hkb529dw.js} +1 -1
  34. package/dist/shared/@ai-setting/{roy-agent-core-j1sr5pk9.js → roy-agent-core-j0ke54vy.js} +1 -1
  35. package/dist/shared/@ai-setting/{roy-agent-core-5ex3za0m.js → roy-agent-core-np1w5dpe.js} +145 -287
  36. package/dist/shared/@ai-setting/{roy-agent-core-4txzpsbt.js → roy-agent-core-qdmt6nz7.js} +1 -1
  37. package/dist/shared/@ai-setting/{roy-agent-core-5wp5grzj.js → roy-agent-core-vqspcspb.js} +2 -2
  38. package/dist/shared/@ai-setting/{roy-agent-core-mrcxzpbg.js → roy-agent-core-wjd5kars.js} +2 -2
  39. package/dist/shared/@ai-setting/{roy-agent-core-avq1x4t7.js → roy-agent-core-xb4hvk1m.js} +2 -22
  40. package/dist/shared/@ai-setting/{roy-agent-core-gwc4h96n.js → roy-agent-core-xt3fx7m1.js} +3 -3
  41. 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-kkbwepqb.js";
11
+ } from "./roy-agent-core-cefh9hjv.js";
12
12
  import {
13
13
  LLMHookPoints,
14
14
  globalHookManager
15
- } from "./roy-agent-core-gjq1yk68.js";
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-kkbwepqb.js";
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,7 @@ import {
3
3
  } from "./roy-agent-core-2dhd60aw.js";
4
4
  import {
5
5
  HookManager
6
- } from "./roy-agent-core-gjq1yk68.js";
6
+ } from "./roy-agent-core-86gphny5.js";
7
7
 
8
8
  // src/env/component.ts
9
9
  class BaseComponent {
@@ -15,7 +15,7 @@ import {
15
15
  } from "./roy-agent-core-0vbdz0x7.js";
16
16
  import {
17
17
  BaseComponent
18
- } from "./roy-agent-core-kkbwepqb.js";
18
+ } from "./roy-agent-core-cefh9hjv.js";
19
19
  import {
20
20
  createLogger,
21
21
  init_logger
@@ -4,7 +4,7 @@ import {
4
4
  } from "./roy-agent-core-rvv6ydff.js";
5
5
  import {
6
6
  BaseComponent
7
- } from "./roy-agent-core-kkbwepqb.js";
7
+ } from "./roy-agent-core-cefh9hjv.js";
8
8
  import {
9
9
  __require
10
10
  } from "./roy-agent-core-fs0mn2jk.js";
@@ -10,7 +10,7 @@ import {
10
10
  } from "./roy-agent-core-qxhq8ven.js";
11
11
  import {
12
12
  BaseComponent
13
- } from "./roy-agent-core-kkbwepqb.js";
13
+ } from "./roy-agent-core-cefh9hjv.js";
14
14
  import {
15
15
  createLogger,
16
16
  init_logger
@@ -7,7 +7,7 @@ import {
7
7
  } from "./roy-agent-core-qxhq8ven.js";
8
8
  import {
9
9
  BaseComponent
10
- } from "./roy-agent-core-kkbwepqb.js";
10
+ } from "./roy-agent-core-cefh9hjv.js";
11
11
  import {
12
12
  __require
13
13
  } from "./roy-agent-core-fs0mn2jk.js";
@@ -3,7 +3,7 @@ import {
3
3
  } from "./roy-agent-core-qxhq8ven.js";
4
4
  import {
5
5
  BaseComponent
6
- } from "./roy-agent-core-kkbwepqb.js";
6
+ } from "./roy-agent-core-cefh9hjv.js";
7
7
  import {
8
8
  init_decorator
9
9
  } from "./roy-agent-core-zgypchmt.js";
@@ -4,7 +4,7 @@ import {
4
4
  } from "./roy-agent-core-ctdhjv68.js";
5
5
  import {
6
6
  BaseComponent
7
- } from "./roy-agent-core-kkbwepqb.js";
7
+ } from "./roy-agent-core-cefh9hjv.js";
8
8
  import {
9
9
  TracedAs,
10
10
  init_decorator
@@ -3,7 +3,10 @@ import {
3
3
  } from "./roy-agent-core-qxhq8ven.js";
4
4
  import {
5
5
  BaseComponent
6
- } from "./roy-agent-core-kkbwepqb.js";
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 formatEventMessage(sourceType, rawEvent, eventType) {
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
- switch (sourceType) {
69
- case "lark-cli": {
70
- const larkInnerEvent = event.event;
71
- const header = event.header;
72
- const message = larkInnerEvent?.message || event.message;
73
- const sender = larkInnerEvent?.sender || event.sender;
74
- const senderId = sender?.sender_id;
75
- if (header) {
76
- metadata.eventType = header.event_type;
77
- metadata.appId = header.app_id;
78
- metadata.tenantKey = header.tenant_key;
79
- }
80
- if (message) {
81
- metadata.chatId = message.chat_id;
82
- metadata.chatType = message.chat_type;
83
- metadata.messageId = message.message_id;
84
- metadata.messageType = message.message_type;
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 (sourceType === "lark-cli" && eventType === "im.message.receive_v1") {
57
+ if (eventType === "im.message.receive_v1") {
102
58
  recommendedAction = {
103
- action: "处理飞书消息并回复",
59
+ action: "处理飞书消息并以机器人身份回复",
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
- const command = this.config.command || "lark-cli event +subscribe";
142
- const isWindows = process.platform === "win32";
143
- const shell = isWindows ? "cmd.exe" : "sh";
144
- const shellArgs = isWindows ? ["/c", command] : ["-c", `exec ${command}`];
145
- this.child = spawn(shell, shellArgs, {
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
- this.processStream(data.toString());
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.child?.kill("SIGTERM");
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,18 @@ 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("lark-cli", rawEvent, eventType);
218
- const message = formatEventMessage("lark-cli", rawEvent, eventType);
243
+ const { metadata, replyChannel, recommendedAction } = extractMetadata(rawEvent, eventType);
244
+ const message = rawData;
245
+ const timestamp = Date.now();
219
246
  const evt = {
220
- sourceId: this.config.id,
221
- type: eventType,
222
- timestamp: Date.now(),
247
+ id: `es-${this.config.id}-${timestamp}`,
248
+ type: "event-source.event.lark-cli",
249
+ timestamp,
250
+ metadata: {
251
+ source: "event-source",
252
+ sourceId: this.config.id,
253
+ sourceMessageType: eventType
254
+ },
223
255
  payload: {
224
256
  sourceId: this.config.id,
225
257
  sourceType: "lark-cli",
@@ -228,11 +260,13 @@ class LarkCliInstance {
228
260
  metadata,
229
261
  replyChannel,
230
262
  recommendedAction,
231
- timestamp: Date.now()
263
+ timestamp
232
264
  }
233
265
  };
234
266
  this.eventHandler?.(evt);
235
- } catch (error) {}
267
+ } catch (error) {
268
+ console.error(`[LarkCliInstance] Error handling event: ${error}`);
269
+ }
236
270
  }
237
271
  }
238
272
  var larkCliHandler = {
@@ -240,7 +274,7 @@ var larkCliHandler = {
240
274
  validateConfig(config) {
241
275
  const errors = [];
242
276
  if (!config.command) {
243
- errors.push("lark-cli command is required");
277
+ errors.push("command is optional, will use default: lark-cli event consume im.message.receive_v1 --as bot");
244
278
  }
245
279
  return errors;
246
280
  },
@@ -248,187 +282,8 @@ var larkCliHandler = {
248
282
  return new LarkCliInstance(config);
249
283
  }
250
284
  };
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
285
  var builtInHandlers = [
429
- larkCliHandler,
430
- timerHandler,
431
- websocketHandler
286
+ larkCliHandler
432
287
  ];
433
288
  function getBuiltInHandler(type) {
434
289
  return builtInHandlers.find((h) => h.type === type);
@@ -515,6 +370,11 @@ class EventSourceComponent extends BaseComponent {
515
370
  this.handlers.clear();
516
371
  this.buffers.clear();
517
372
  }
373
+ createDefaultEventHandler(sourceId, sourceType) {
374
+ return (event) => {
375
+ this.getEnv()?.pushEnvEvent(event);
376
+ };
377
+ }
518
378
  registerBuiltInHandlers() {
519
379
  for (const handler of builtInHandlers) {
520
380
  if (!this.handlers.has(handler.type)) {
@@ -524,7 +384,7 @@ class EventSourceComponent extends BaseComponent {
524
384
  }
525
385
  }
526
386
  async executeInitHooks() {
527
- const { EventSourceInitHooks } = await import("./roy-agent-core-8jxva565.js");
387
+ const { EventSourceInitHooks } = await import("./roy-agent-core-9mj7vzsm.js");
528
388
  await EventSourceInitHooks.execute(this);
529
389
  }
530
390
  registerHandler(handler) {
@@ -713,10 +573,8 @@ class EventSourceComponent extends BaseComponent {
713
573
  }
714
574
  const instance = handler.createInstance(config);
715
575
  this.instances.set(id, instance);
716
- const eventHandler = this.eventHandlers.get(id);
717
- if (eventHandler) {
718
- instance.onEvent(eventHandler);
719
- }
576
+ const eventHandler = this.eventHandlers.get(id) ?? this.createDefaultEventHandler(id, config.type);
577
+ instance.onEvent(eventHandler);
720
578
  await instance.start();
721
579
  this.statuses.set(id, "running");
722
580
  this.getEnv()?.pushEnvEvent({
@@ -814,4 +672,4 @@ class EventSourceComponent extends BaseComponent {
814
672
  }
815
673
  }
816
674
 
817
- export { larkCliHandler, timerHandler, websocketHandler, builtInHandlers, getBuiltInHandler, EventSourceComponent };
675
+ export { larkCliHandler, builtInHandlers, getBuiltInHandler, EventSourceComponent };
@@ -6,7 +6,7 @@ import {
6
6
  } from "./roy-agent-core-qxhq8ven.js";
7
7
  import {
8
8
  BaseComponent
9
- } from "./roy-agent-core-kkbwepqb.js";
9
+ } from "./roy-agent-core-cefh9hjv.js";
10
10
  import {
11
11
  createLogger,
12
12
  init_logger
@@ -8,11 +8,11 @@ import {
8
8
  } from "./roy-agent-core-qxhq8ven.js";
9
9
  import {
10
10
  BaseComponent
11
- } from "./roy-agent-core-kkbwepqb.js";
11
+ } from "./roy-agent-core-cefh9hjv.js";
12
12
  import {
13
13
  ToolHookPoints,
14
14
  globalHookManager
15
- } from "./roy-agent-core-gjq1yk68.js";
15
+ } from "./roy-agent-core-86gphny5.js";
16
16
  import {
17
17
  createLogger,
18
18
  init_logger