@ai-setting/roy-agent-core 1.6.21 → 1.6.22

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 (94) hide show
  1. package/dist/config/index.js +9 -9
  2. package/dist/env/agent/index.js +16 -15
  3. package/dist/env/commands/index.js +9 -9
  4. package/dist/env/context/index.js +5 -5
  5. package/dist/env/debug/index.js +9 -9
  6. package/dist/env/event-source/index.js +14 -13
  7. package/dist/env/hook/index.js +7 -7
  8. package/dist/env/index.js +40 -39
  9. package/dist/env/llm/index.js +11 -11
  10. package/dist/env/log-trace/index.js +9 -9
  11. package/dist/env/mcp/index.js +10 -10
  12. package/dist/env/mcp/tool/index.js +3 -3
  13. package/dist/env/memory/index.js +10 -10
  14. package/dist/env/memory/plugin/index.js +3 -3
  15. package/dist/env/plugin/index.js +9 -9
  16. package/dist/env/prompt/index.js +9 -9
  17. package/dist/env/session/index.js +12 -12
  18. package/dist/env/session/storage/index.js +5 -5
  19. package/dist/env/skill/index.js +9 -9
  20. package/dist/env/task/delegate/index.js +9 -9
  21. package/dist/env/task/index.js +14 -14
  22. package/dist/env/task/plugins/index.js +9 -8
  23. package/dist/env/task/storage/index.js +4 -4
  24. package/dist/env/task/tools/index.js +5 -5
  25. package/dist/env/tool/built-in/index.js +5 -5
  26. package/dist/env/tool/index.js +12 -12
  27. package/dist/env/workflow/engine/index.js +11 -11
  28. package/dist/env/workflow/index.js +22 -22
  29. package/dist/env/workflow/nodes/index.js +4 -4
  30. package/dist/env/workflow/service/index.js +4 -4
  31. package/dist/env/workflow/storage/index.js +5 -5
  32. package/dist/env/workflow/tools/index.js +16 -16
  33. package/dist/env/workflow/utils/index.js +6 -6
  34. package/dist/index.js +51 -50
  35. package/dist/shared/@ai-setting/{roy-agent-core-zvwdfm79.js → roy-agent-core-067w3nt1.js} +7 -7
  36. package/dist/shared/@ai-setting/{roy-agent-core-7kw06e4b.js → roy-agent-core-0qjw25e8.js} +1 -1
  37. package/dist/shared/@ai-setting/{roy-agent-core-bq1gskrf.js → roy-agent-core-0v74marc.js} +1 -1
  38. package/dist/shared/@ai-setting/{roy-agent-core-e0kaxcy1.js → roy-agent-core-12gac5zn.js} +1 -1
  39. package/dist/shared/@ai-setting/{roy-agent-core-f1cjs6c4.js → roy-agent-core-16dqrewm.js} +6 -6
  40. package/dist/shared/@ai-setting/{roy-agent-core-7r72622v.js → roy-agent-core-1k9j90s7.js} +1 -1
  41. package/dist/shared/@ai-setting/{roy-agent-core-m00kamqp.js → roy-agent-core-1khp1m0r.js} +8 -1
  42. package/dist/shared/@ai-setting/{roy-agent-core-77wfej1h.js → roy-agent-core-3e0w0ekw.js} +2 -2
  43. package/dist/shared/@ai-setting/{roy-agent-core-zdzkzx5g.js → roy-agent-core-3ep1dxf1.js} +2 -2
  44. package/dist/shared/@ai-setting/{roy-agent-core-gc75v3px.js → roy-agent-core-3x3k7gfs.js} +5 -5
  45. package/dist/shared/@ai-setting/roy-agent-core-4k8tv5q5.js +11 -0
  46. package/dist/shared/@ai-setting/{roy-agent-core-02aw62bv.js → roy-agent-core-5ts23mx0.js} +1 -1
  47. package/dist/shared/@ai-setting/{roy-agent-core-atpchjdz.js → roy-agent-core-6m2gh57e.js} +1 -1
  48. package/dist/shared/@ai-setting/{roy-agent-core-ehpnd2be.js → roy-agent-core-6re7eg4w.js} +2 -2
  49. package/dist/shared/@ai-setting/{roy-agent-core-ett06sn8.js → roy-agent-core-7cxdkcrz.js} +4 -4
  50. package/dist/shared/@ai-setting/{roy-agent-core-416rpxkp.js → roy-agent-core-7wv7gh6t.js} +5 -5
  51. package/dist/shared/@ai-setting/{roy-agent-core-fxembepv.js → roy-agent-core-90wp1rgb.js} +5 -5
  52. package/dist/shared/@ai-setting/{roy-agent-core-xjj88tpn.js → roy-agent-core-afb03wwp.js} +2 -2
  53. package/dist/shared/@ai-setting/{roy-agent-core-5pzegp1x.js → roy-agent-core-b64s2vk9.js} +2 -2
  54. package/dist/shared/@ai-setting/{roy-agent-core-ataagh3a.js → roy-agent-core-br7dmedr.js} +1 -1
  55. package/dist/shared/@ai-setting/{roy-agent-core-8n0e62y4.js → roy-agent-core-c1stgqnw.js} +2 -2
  56. package/dist/shared/@ai-setting/{roy-agent-core-gmnex23m.js → roy-agent-core-cjraf54z.js} +3 -3
  57. package/dist/shared/@ai-setting/{roy-agent-core-j8t1tyhr.js → roy-agent-core-dbwvfe0m.js} +5 -5
  58. package/dist/shared/@ai-setting/{roy-agent-core-mdp8y7ky.js → roy-agent-core-dxfd6p1c.js} +1 -1
  59. package/dist/shared/@ai-setting/{roy-agent-core-wsqnf2za.js → roy-agent-core-ef486rdm.js} +7 -7
  60. package/dist/shared/@ai-setting/{roy-agent-core-kr58bgz0.js → roy-agent-core-f2nync7q.js} +4 -4
  61. package/dist/shared/@ai-setting/{roy-agent-core-dh9rajdh.js → roy-agent-core-g7nmwg63.js} +1 -1
  62. package/dist/shared/@ai-setting/{roy-agent-core-96mj6gvc.js → roy-agent-core-gb7pm9c0.js} +2 -2
  63. package/dist/shared/@ai-setting/{roy-agent-core-grajzyhd.js → roy-agent-core-gns3wa97.js} +14 -18
  64. package/dist/shared/@ai-setting/{roy-agent-core-ez91vxas.js → roy-agent-core-h1cb2jzh.js} +1 -1
  65. package/dist/shared/@ai-setting/{roy-agent-core-eskgj8nc.js → roy-agent-core-h28gcd77.js} +6 -6
  66. package/dist/shared/@ai-setting/{roy-agent-core-bb20se79.js → roy-agent-core-h4sm7fyb.js} +8 -8
  67. package/dist/shared/@ai-setting/{roy-agent-core-sqt96sam.js → roy-agent-core-h7ak839w.js} +1 -1
  68. package/dist/shared/@ai-setting/{roy-agent-core-c7e3htaq.js → roy-agent-core-hks28tys.js} +2 -2
  69. package/dist/shared/@ai-setting/{roy-agent-core-vc7p80sd.js → roy-agent-core-j29yg06n.js} +2 -2
  70. package/dist/shared/@ai-setting/{roy-agent-core-r15sn7ve.js → roy-agent-core-j9ybhwnq.js} +2 -2
  71. package/dist/shared/@ai-setting/{roy-agent-core-nna4s0qs.js → roy-agent-core-kaq037np.js} +1 -1
  72. package/dist/shared/@ai-setting/{roy-agent-core-e9jf4w3z.js → roy-agent-core-kv7frw13.js} +4 -4
  73. package/dist/shared/@ai-setting/{roy-agent-core-44g3synv.js → roy-agent-core-mvs5sen6.js} +1 -1
  74. package/dist/shared/@ai-setting/{roy-agent-core-zeztnvvb.js → roy-agent-core-mz69jdvv.js} +178 -78
  75. package/dist/shared/@ai-setting/{roy-agent-core-akb8mb9v.js → roy-agent-core-pde8hkq4.js} +2 -2
  76. package/dist/shared/@ai-setting/{roy-agent-core-p4z6nxgz.js → roy-agent-core-pdnp5kj0.js} +4 -4
  77. package/dist/shared/@ai-setting/{roy-agent-core-1qjgwjjs.js → roy-agent-core-pz2n121t.js} +4 -4
  78. package/dist/shared/@ai-setting/{roy-agent-core-wr3pk3h3.js → roy-agent-core-qe3m3hec.js} +1 -1
  79. package/dist/shared/@ai-setting/{roy-agent-core-v20nxrs1.js → roy-agent-core-qpt5fa8h.js} +2 -2
  80. package/dist/shared/@ai-setting/{roy-agent-core-keb51jag.js → roy-agent-core-rs5tp44j.js} +4 -4
  81. package/dist/shared/@ai-setting/{roy-agent-core-2b0mw2h3.js → roy-agent-core-s07nere5.js} +3 -3
  82. package/dist/shared/@ai-setting/{roy-agent-core-ajp566yv.js → roy-agent-core-sfwt66pv.js} +2 -2
  83. package/dist/shared/@ai-setting/roy-agent-core-t3yqzgse.js +71 -0
  84. package/dist/shared/@ai-setting/{roy-agent-core-xzc53mnk.js → roy-agent-core-t9h4np6m.js} +4 -2
  85. package/dist/shared/@ai-setting/{roy-agent-core-1mrc9a1r.js → roy-agent-core-w8rv08d3.js} +1 -1
  86. package/dist/shared/@ai-setting/{roy-agent-core-b9q2jfx4.js → roy-agent-core-watkmj7d.js} +6 -6
  87. package/dist/shared/@ai-setting/{roy-agent-core-bwqjwa0d.js → roy-agent-core-wr1pgw0x.js} +8 -8
  88. package/dist/shared/@ai-setting/{roy-agent-core-fntxq0gf.js → roy-agent-core-x0yztmm6.js} +2 -2
  89. package/dist/shared/@ai-setting/{roy-agent-core-dtkbj8fk.js → roy-agent-core-xrr7t0qc.js} +2 -2
  90. package/dist/shared/@ai-setting/{roy-agent-core-q06h6qf8.js → roy-agent-core-xwnpygva.js} +14 -14
  91. package/dist/shared/@ai-setting/{roy-agent-core-pr4jekyy.js → roy-agent-core-z2w7wtqd.js} +5 -5
  92. package/dist/utils/temp-file-manager/index.js +3 -3
  93. package/package.json +1 -1
  94. package/dist/shared/@ai-setting/roy-agent-core-w6kj6nmj.js +0 -11
@@ -1,51 +1,54 @@
1
1
  import {
2
2
  withTimeout
3
- } from "./roy-agent-core-8n0e62y4.js";
3
+ } from "./roy-agent-core-c1stgqnw.js";
4
4
  import {
5
5
  truncateOutputInline
6
- } from "./roy-agent-core-eskgj8nc.js";
6
+ } from "./roy-agent-core-h28gcd77.js";
7
+ import {
8
+ enqueueToAddFakeUserMessage
9
+ } from "./roy-agent-core-t3yqzgse.js";
7
10
  import {
8
11
  AskUserError,
9
12
  init_workflow_hil
10
13
  } from "./roy-agent-core-e25xkv53.js";
11
14
  import {
12
15
  AgentRegistry
13
- } from "./roy-agent-core-fntxq0gf.js";
16
+ } from "./roy-agent-core-x0yztmm6.js";
14
17
  import {
15
18
  ContextError
16
19
  } from "./roy-agent-core-ctdhjv68.js";
17
20
  import {
18
21
  SessionMessageConverter
19
- } from "./roy-agent-core-7r72622v.js";
22
+ } from "./roy-agent-core-1k9j90s7.js";
20
23
  import {
21
24
  safeParseToolArgs
22
- } from "./roy-agent-core-e0kaxcy1.js";
25
+ } from "./roy-agent-core-12gac5zn.js";
23
26
  import {
24
27
  envKeyToConfigKey
25
28
  } from "./roy-agent-core-7hh0brvs.js";
26
29
  import {
27
30
  BaseComponent
28
- } from "./roy-agent-core-akb8mb9v.js";
31
+ } from "./roy-agent-core-pde8hkq4.js";
29
32
  import {
30
33
  globalHookManager,
31
34
  init_global_hook_manager
32
- } from "./roy-agent-core-vc7p80sd.js";
35
+ } from "./roy-agent-core-j29yg06n.js";
33
36
  import {
34
37
  init_context
35
- } from "./roy-agent-core-sqt96sam.js";
38
+ } from "./roy-agent-core-h7ak839w.js";
36
39
  import {
37
40
  getCurrentTaskId,
38
41
  getEnvContext,
39
42
  runWithEnvContextAsync
40
- } from "./roy-agent-core-dtkbj8fk.js";
43
+ } from "./roy-agent-core-xrr7t0qc.js";
41
44
  import {
42
45
  TracedAs,
43
46
  init_decorator
44
- } from "./roy-agent-core-96mj6gvc.js";
47
+ } from "./roy-agent-core-gb7pm9c0.js";
45
48
  import {
46
49
  createLogger,
47
50
  init_logger
48
- } from "./roy-agent-core-nna4s0qs.js";
51
+ } from "./roy-agent-core-kaq037np.js";
49
52
  import {
50
53
  __legacyDecorateClassTS,
51
54
  __require
@@ -55,6 +58,102 @@ import {
55
58
  init_logger();
56
59
  import { z } from "zod";
57
60
 
61
+ // src/env/task/plugins/max-iteration-reminder-plugin.ts
62
+ init_logger();
63
+ init_decorator();
64
+ var logger = createLogger("MaxIterationReminderPlugin");
65
+ var DEFAULT_REMINDER_MESSAGE = `⚠️ **系统提醒**: 你已经达到最大 ReAct 迭代次数({maxIterations}次)。
66
+
67
+ **请不要再调用任何工具**,利用目前已有的信息直接给用户一个简洁明了的总结,包括:
68
+ 1. 目前的进展
69
+ 2. 已完成的工作
70
+ 3. 遇到的问题(如有)
71
+ 4. 下一步建议(如有)
72
+
73
+ 总结后立即结束,不要继续工具调用。`;
74
+
75
+ class MaxIterationReminderPlugin {
76
+ name = "MaxIterationReminderPlugin";
77
+ version = "3.0.0";
78
+ description = "在 iteration === maxIterations - 1 时通过共享 meta-protocol helper 注入 fake user 消息;AgentComponent 现有 for-loop 后 flush;适用于所有 agent。maxIterations<=1 防御性跳过。";
79
+ priority = 50;
80
+ messageTemplate;
81
+ injectedTraceIds = new Set;
82
+ constructor(config) {
83
+ this.messageTemplate = config?.messageTemplate ?? DEFAULT_REMINDER_MESSAGE;
84
+ }
85
+ async execute(ctx) {
86
+ const { iteration, maxIterations } = ctx;
87
+ const traceId = ctx.context?.traceId ?? ctx.context?.sessionId ?? "unknown";
88
+ const kind = "max-iter";
89
+ const makeResult = (willSet, reason) => {
90
+ const decision = { willSet, iteration, maxIterations, kind, reason, traceId };
91
+ return { continue: true, __maxIterDecision: decision };
92
+ };
93
+ if (typeof iteration !== "number" || typeof maxIterations !== "number") {
94
+ logger.debug(`[MaxIterReminder] skip — non-numeric iter=${iteration} or maxIter=${maxIterations}`);
95
+ return makeResult(false, "non-numeric-iter-or-maxIter");
96
+ }
97
+ if (maxIterations <= 1) {
98
+ logger.debug(`[MaxIterReminder] skip — maxIterations=${maxIterations} <= 1 (one-shot agent)`);
99
+ return makeResult(false, "max-iterations-le-1");
100
+ }
101
+ if (iteration !== maxIterations - 1) {
102
+ return makeResult(false, "iter-not-equal-max-iter-minus-1");
103
+ }
104
+ if (!ctx.toolResult) {
105
+ logger.warn(`[MaxIterReminder] skip — toolResult missing at iter=${iteration}`);
106
+ return makeResult(false, "no-tool-result");
107
+ }
108
+ if (this.injectedTraceIds.has(traceId)) {
109
+ logger.debug(`[MaxIterReminder] skip — traceId=${traceId.slice(0, 20)} already processed`);
110
+ return makeResult(false, "trace-id-already-processed");
111
+ }
112
+ const reminderContent = this.messageTemplate.replace(/\{maxIterations\}/g, String(maxIterations));
113
+ enqueueToAddFakeUserMessage(ctx.toolResult, {
114
+ role: "user",
115
+ content: reminderContent
116
+ }, kind);
117
+ this.injectedTraceIds.add(traceId);
118
+ logger.info(`[MaxIterReminder] max-iter reminder meta-protocol set (session=${(ctx.context?.sessionId ?? "unknown").slice(0, 12)}..., iteration=${iteration}, maxIterations=${maxIterations})`);
119
+ return makeResult(true, "fired");
120
+ }
121
+ }
122
+ __legacyDecorateClassTS([
123
+ TracedAs("plugin.max-iter-reminder.evaluate", {
124
+ recordParams: false,
125
+ recordResult: false,
126
+ log: true,
127
+ resultFilter: (result) => {
128
+ const d = result?.__maxIterDecision;
129
+ if (!d)
130
+ return {};
131
+ return {
132
+ "max-iter.iteration": d.iteration,
133
+ "max-iter.max_iterations": d.maxIterations,
134
+ "max-iter.will_set": d.willSet,
135
+ "max-iter.kind": d.kind,
136
+ "max-iter.reason": d.reason,
137
+ "max-iter.trace_id": d.traceId
138
+ };
139
+ }
140
+ })
141
+ ], MaxIterationReminderPlugin.prototype, "execute", null);
142
+ function createMaxIterationReminderPlugin(config) {
143
+ const inst = new MaxIterationReminderPlugin(config);
144
+ return {
145
+ name: inst.name,
146
+ version: inst.version,
147
+ description: inst.description,
148
+ hooks: [
149
+ { point: "agent:after.tool", priority: inst.priority }
150
+ ],
151
+ execute: async (ctx) => {
152
+ return inst.execute(ctx);
153
+ }
154
+ };
155
+ }
156
+
58
157
  // src/env/agent/agent-config-registration.ts
59
158
  var AGENT_DEFAULTS = {
60
159
  "agent.defaultAgent.maxIterations": 200,
@@ -128,7 +227,7 @@ function composeToolOutputForLLM(toolName, result) {
128
227
  }
129
228
  return `${tag} tool=${toolName} status=${status} (no error message and no runId — tool did not surface a diagnostic)`;
130
229
  }
131
- var logger = createLogger("agent:component");
230
+ var logger2 = createLogger("agent:component");
132
231
  function toLLMMessage(msg) {
133
232
  let content;
134
233
  let toolCallId;
@@ -350,7 +449,7 @@ class AgentComponent extends BaseComponent {
350
449
  allowedTools: parseToolList(constructorDefaultAgent?.allowedTools ?? configComponent.get("agent.defaultAgent.allowedTools")),
351
450
  deniedTools: parseToolList(constructorDefaultAgent?.deniedTools ?? configComponent.get("agent.defaultAgent.deniedTools"))
352
451
  };
353
- logger.info(`[registerConfig] Synced config from ConfigComponent: maxIterations=${this.config.defaultAgent.maxIterations}`);
452
+ logger2.info(`[registerConfig] Synced config from ConfigComponent: maxIterations=${this.config.defaultAgent.maxIterations}`);
354
453
  this.registerConfigWatcher(configComponent);
355
454
  }
356
455
  flattenConfig(obj, prefix = "agent") {
@@ -374,7 +473,7 @@ class AgentComponent extends BaseComponent {
374
473
  });
375
474
  }
376
475
  onConfigChange(event) {
377
- logger.info(`Agent config changed: ${event.key}`, {
476
+ logger2.info(`Agent config changed: ${event.key}`, {
378
477
  oldValue: event.oldValue,
379
478
  newValue: event.newValue
380
479
  });
@@ -386,23 +485,23 @@ class AgentComponent extends BaseComponent {
386
485
  resolvePromptComponent: () => this.env?.getComponent?.("prompt") ?? null
387
486
  });
388
487
  const loadedCount = await this.registry.load();
389
- logger.info(`[AgentComponent] Loaded ${loadedCount} agents from config directory`);
488
+ logger2.info(`[AgentComponent] Loaded ${loadedCount} agents from config directory`);
390
489
  this.registry.registerWorkflowRunner();
391
- logger.info("[AgentComponent] Registered built-in workflow-runner");
490
+ logger2.info("[AgentComponent] Registered built-in workflow-runner");
392
491
  this.registry.registerTaskOrganizer();
393
- logger.info("[AgentComponent] Registered built-in task-organizer");
492
+ logger2.info("[AgentComponent] Registered built-in task-organizer");
394
493
  this.registry.registerJsonExtractAgent();
395
- logger.info("[AgentComponent] Registered built-in json-extract agent");
494
+ logger2.info("[AgentComponent] Registered built-in json-extract agent");
396
495
  this.registry.registerWorkflowCreator();
397
- logger.info("[AgentComponent] Registered built-in workflow-creator");
496
+ logger2.info("[AgentComponent] Registered built-in workflow-creator");
398
497
  this.registry.registerWorkflowExtractAgent();
399
- logger.info("[AgentComponent] Registered built-in workflow-extract agent");
498
+ logger2.info("[AgentComponent] Registered built-in workflow-extract agent");
400
499
  this.registry.registerCompactAgent();
401
- logger.info("[AgentComponent] Registered built-in compact agent");
500
+ logger2.info("[AgentComponent] Registered built-in compact agent");
402
501
  this.registry.registerCompactHintAgent();
403
- logger.info("[AgentComponent] Registered built-in compact-hint agent");
502
+ logger2.info("[AgentComponent] Registered built-in compact-hint agent");
404
503
  this.registry.registerRoyAgent();
405
- logger.info("[AgentComponent] Registered built-in roy agent");
504
+ logger2.info("[AgentComponent] Registered built-in roy agent");
406
505
  for (const agentDef of this.registry.list()) {
407
506
  if (!this.agents.has(agentDef.name)) {
408
507
  const systemPrompt = await this.registry.getSystemPrompt(agentDef.name);
@@ -415,11 +514,11 @@ class AgentComponent extends BaseComponent {
415
514
  model: agentDef.model,
416
515
  maxIterations: agentDef.maxIterations
417
516
  });
418
- logger.debug(`[AgentComponent] Registered agent from config: ${agentDef.name}`);
517
+ logger2.debug(`[AgentComponent] Registered agent from config: ${agentDef.name}`);
419
518
  }
420
519
  }
421
520
  } catch (error) {
422
- logger.warn(`[AgentComponent] Failed to initialize AgentRegistry: ${error}`);
521
+ logger2.warn(`[AgentComponent] Failed to initialize AgentRegistry: ${error}`);
423
522
  }
424
523
  }
425
524
  async syncRegistryAgentsFromConfig() {
@@ -447,7 +546,7 @@ class AgentComponent extends BaseComponent {
447
546
  maxIterations: agentDef.maxIterations
448
547
  });
449
548
  }
450
- logger.debug(`[AgentComponent] Synced registry agent: ${agentDef.name}`);
549
+ logger2.debug(`[AgentComponent] Synced registry agent: ${agentDef.name}`);
451
550
  }
452
551
  }
453
552
  getRegistry() {
@@ -460,11 +559,11 @@ class AgentComponent extends BaseComponent {
460
559
  return this.registry?.list() ?? [];
461
560
  }
462
561
  async onStop() {
463
- logger.info("[AgentComponent] Stopping and cleaning up resources...");
562
+ logger2.info("[AgentComponent] Stopping and cleaning up resources...");
464
563
  for (const [name, agent] of this.agents) {
465
564
  if (agent.status === "running" || agent.status === "idle") {
466
565
  this.abort(name);
467
- logger.debug(`[AgentComponent] Aborted agent: ${name}`);
566
+ logger2.debug(`[AgentComponent] Aborted agent: ${name}`);
468
567
  }
469
568
  }
470
569
  this.abortControllers.clear();
@@ -475,7 +574,7 @@ class AgentComponent extends BaseComponent {
475
574
  }
476
575
  this.agents.clear();
477
576
  this.setStatus("stopped");
478
- logger.info("[AgentComponent] Cleanup completed");
577
+ logger2.info("[AgentComponent] Cleanup completed");
479
578
  }
480
579
  async refreshDependencies() {
481
580
  if (this.env) {
@@ -498,12 +597,12 @@ class AgentComponent extends BaseComponent {
498
597
  });
499
598
  return result.output?.content ?? "";
500
599
  });
501
- logger.debug("[refreshDependencies] understand_image LLM provider injected");
600
+ logger2.debug("[refreshDependencies] understand_image LLM provider injected");
502
601
  } catch (err) {
503
- logger.warn(`[refreshDependencies] failed to inject understand_image provider: ${err.message}`);
602
+ logger2.warn(`[refreshDependencies] failed to inject understand_image provider: ${err.message}`);
504
603
  }
505
604
  }
506
- logger.debug("[refreshDependencies] AgentComponent refreshed", {
605
+ logger2.debug("[refreshDependencies] AgentComponent refreshed", {
507
606
  hasLLM: !!this.llmComponent,
508
607
  hasTool: !!this.toolComponent
509
608
  });
@@ -517,17 +616,17 @@ class AgentComponent extends BaseComponent {
517
616
  return;
518
617
  }
519
618
  if (!this.registry) {
520
- logger.debug(`[resolveSystemPrompt] No registry available for ${agentName}`);
619
+ logger2.debug(`[resolveSystemPrompt] No registry available for ${agentName}`);
521
620
  return;
522
621
  }
523
622
  try {
524
623
  const resolvedPrompt = await this.registry.getSystemPrompt(agentName);
525
624
  if (resolvedPrompt) {
526
625
  agent.config.systemPrompt = resolvedPrompt;
527
- logger.debug(`[AgentComponent] Resolved systemPrompt for agent: ${agentName}`);
626
+ logger2.debug(`[AgentComponent] Resolved systemPrompt for agent: ${agentName}`);
528
627
  }
529
628
  } catch (error) {
530
- logger.warn(`[AgentComponent] Failed to resolve systemPrompt for agent ${agentName}: ${error}`);
629
+ logger2.warn(`[AgentComponent] Failed to resolve systemPrompt for agent ${agentName}: ${error}`);
531
630
  }
532
631
  }
533
632
  getAgent(agentName) {
@@ -575,13 +674,14 @@ class AgentComponent extends BaseComponent {
575
674
  plugins: new Map
576
675
  };
577
676
  this.agents.set(name, instance);
578
- logger.info(`Agent registered: ${name}`, { type: instance.config.type });
677
+ this.registerPlugin(name, createMaxIterationReminderPlugin());
678
+ logger2.info(`Agent registered: ${name}`, { type: instance.config.type });
579
679
  return instance;
580
680
  }
581
681
  unregisterAgent(name) {
582
682
  const deleted = this.agents.delete(name);
583
683
  if (deleted) {
584
- logger.info(`Agent unregistered: ${name}`);
684
+ logger2.info(`Agent unregistered: ${name}`);
585
685
  }
586
686
  return deleted;
587
687
  }
@@ -591,7 +691,7 @@ class AgentComponent extends BaseComponent {
591
691
  throw new Error(`Agent not found: ${agentName}`);
592
692
  }
593
693
  agent.plugins.set(plugin.name, plugin);
594
- logger.info(`Plugin registered: ${plugin.name} to ${agentName}`, {
694
+ logger2.info(`Plugin registered: ${plugin.name} to ${agentName}`, {
595
695
  hooks: plugin.hooks.map((h) => h.point)
596
696
  });
597
697
  }
@@ -602,7 +702,7 @@ class AgentComponent extends BaseComponent {
602
702
  }
603
703
  const deleted = agent.plugins.delete(pluginName);
604
704
  if (deleted) {
605
- logger.info(`Plugin unregistered: ${pluginName} from ${agentName}`);
705
+ logger2.info(`Plugin unregistered: ${pluginName} from ${agentName}`);
606
706
  }
607
707
  return deleted;
608
708
  }
@@ -611,7 +711,7 @@ class AgentComponent extends BaseComponent {
611
711
  }
612
712
  getAvailableTools(agent, context) {
613
713
  let tools = filterToolsByAgent([...this.defaultTools], agent);
614
- logger.debug(`[getAvailableTools] After defaultTools (filtered): ${tools.length} tools`, {
714
+ logger2.debug(`[getAvailableTools] After defaultTools (filtered): ${tools.length} tools`, {
615
715
  toolNames: tools.map((t) => t.name)
616
716
  });
617
717
  if (this.toolComponent?.listTools) {
@@ -620,33 +720,33 @@ class AgentComponent extends BaseComponent {
620
720
  });
621
721
  const filteredComponentTools = filterToolsByAgent(componentTools, agent);
622
722
  tools = [...tools, ...filteredComponentTools];
623
- logger.debug(`[getAvailableTools] After adding componentTools: ${tools.length} tools`, {
723
+ logger2.debug(`[getAvailableTools] After adding componentTools: ${tools.length} tools`, {
624
724
  componentToolNames: filteredComponentTools.map((t) => t.name)
625
725
  });
626
726
  }
627
727
  const allowedTools = context?.allowedTools ?? agent.config.allowedTools;
628
728
  const deniedTools = context?.deniedTools ?? agent.config.deniedTools;
629
- logger.debug(`[getAvailableTools] Filtering: allowed=${allowedTools}, denied=${deniedTools}`);
729
+ logger2.debug(`[getAvailableTools] Filtering: allowed=${allowedTools}, denied=${deniedTools}`);
630
730
  if (allowedTools !== undefined && allowedTools !== null) {
631
731
  tools = tools.filter((t) => allowedTools.includes(t.name));
632
- logger.debug(`[getAvailableTools] After allowedTools filter: ${tools.length} tools`, {
732
+ logger2.debug(`[getAvailableTools] After allowedTools filter: ${tools.length} tools`, {
633
733
  toolNames: tools.map((t) => t.name)
634
734
  });
635
735
  }
636
736
  if (deniedTools?.length) {
637
737
  tools = tools.filter((t) => !deniedTools.includes(t.name));
638
- logger.debug(`[getAvailableTools] After deniedTools filter: ${tools.length} tools`, {
738
+ logger2.debug(`[getAvailableTools] After deniedTools filter: ${tools.length} tools`, {
639
739
  toolNames: tools.map((t) => t.name)
640
740
  });
641
741
  }
642
742
  if (context?.extraTools?.length) {
643
743
  const filteredExtraTools = filterToolsByAgent(context.extraTools, agent);
644
744
  tools = [...tools, ...filteredExtraTools];
645
- logger.debug(`[getAvailableTools] After extraTools (filtered): ${tools.length} tools`, {
745
+ logger2.debug(`[getAvailableTools] After extraTools (filtered): ${tools.length} tools`, {
646
746
  extraToolNames: filteredExtraTools.map((t) => t.name)
647
747
  });
648
748
  }
649
- logger.debug(`[getAvailableTools] Final tools: ${tools.length}`, {
749
+ logger2.debug(`[getAvailableTools] Final tools: ${tools.length}`, {
650
750
  toolNames: tools.map((t) => t.name)
651
751
  });
652
752
  return tools;
@@ -672,7 +772,7 @@ class AgentComponent extends BaseComponent {
672
772
  }
673
773
  flushPendingFakeUserMessage(hookCtx, pendingMsg, iter) {
674
774
  this.pushMessage(hookCtx, pendingMsg);
675
- logger.debug(`[ReAct] Meta-protocol: flushed user message AFTER all tool-results (iter=${iter})`);
775
+ logger2.debug(`[ReAct] Meta-protocol: flushed user message AFTER all tool-results (iter=${iter})`);
676
776
  }
677
777
  async _run(agentName, query, context) {
678
778
  await this.refreshDependencies();
@@ -682,7 +782,7 @@ class AgentComponent extends BaseComponent {
682
782
  }
683
783
  const runId = `${agentName}:${++this.runCounter}`;
684
784
  const querySummary = typeof query === "string" ? query.substring(0, 100) : query.filter((p) => p.type === "text").map((p) => p.text).join(" ").substring(0, 100) || "[multimodal query]";
685
- logger.info(`Starting agent run: ${agentName} (runId=${runId})`, { query: querySummary });
785
+ logger2.info(`Starting agent run: ${agentName} (runId=${runId})`, { query: querySummary });
686
786
  agent.status = "running";
687
787
  this.aborted.set(runId, false);
688
788
  const abortController = new AbortController;
@@ -708,7 +808,7 @@ class AgentComponent extends BaseComponent {
708
808
  resolvedSystemPrompt = resolvedSystemPrompt.replaceAll("{{memory}}", "(Memory component not available)");
709
809
  }
710
810
  } catch (err) {
711
- logger.warn(`[AgentComponent._run] Failed to replace {{memory}}: ${err}`);
811
+ logger2.warn(`[AgentComponent._run] Failed to replace {{memory}}: ${err}`);
712
812
  resolvedSystemPrompt = resolvedSystemPrompt.replaceAll("{{memory}}", "(Failed to load memory)");
713
813
  }
714
814
  }
@@ -757,7 +857,7 @@ class AgentComponent extends BaseComponent {
757
857
  historyMessageCount = hookCtx.messages.length;
758
858
  }
759
859
  } catch (err) {
760
- logger.warn(`Failed to load session history: ${err}`);
860
+ logger2.warn(`Failed to load session history: ${err}`);
761
861
  }
762
862
  }
763
863
  const parentEnvContext = getEnvContext();
@@ -813,14 +913,14 @@ class AgentComponent extends BaseComponent {
813
913
  iteration++;
814
914
  hookCtx.iteration = iteration;
815
915
  result.iterations = iteration;
816
- logger.debug(`Iteration ${iteration} started`);
916
+ logger2.debug(`Iteration ${iteration} started`);
817
917
  this.doomLoopCaches.set(runId, new Map);
818
918
  hookCtx.currentToolCall = undefined;
819
919
  hookCtx.maxIterations = agent.config.maxIterations;
820
920
  let iterAllToolCalls = [];
821
921
  let iterProcessedCount = 0;
822
922
  try {
823
- logger.debug(`[ReAct] Iteration ${iteration} buildMessages result: ${hookCtx.messages.length} messages`);
923
+ logger2.debug(`[ReAct] Iteration ${iteration} buildMessages result: ${hookCtx.messages.length} messages`);
824
924
  await this.executePluginHooks(agent, "agent:before.llm", hookCtx);
825
925
  if (hookCtx._stopped)
826
926
  break;
@@ -905,7 +1005,7 @@ class AgentComponent extends BaseComponent {
905
1005
  }
906
1006
  const assistantContent = llmOutput.content?.substring(0, 80) || "(no text)";
907
1007
  const toolCallNames = llmOutput.toolCalls?.map((tc) => tc.function?.name || tc.name).join(", ") || "none";
908
- logger.debug(`[ReAct] Iteration ${iteration} Adding assistant message: text="${assistantContent}" toolCalls=[${toolCallNames}]`);
1008
+ logger2.debug(`[ReAct] Iteration ${iteration} Adding assistant message: text="${assistantContent}" toolCalls=[${toolCallNames}]`);
909
1009
  this.pushMessage(hookCtx, {
910
1010
  role: "assistant",
911
1011
  content: assistantParts
@@ -954,7 +1054,7 @@ class AgentComponent extends BaseComponent {
954
1054
  }
955
1055
  const toolOutput = composeToolOutputForLLM(toolResult.name, toolResult.result);
956
1056
  const toolOutputPreview = typeof toolOutput === "string" ? toolOutput.substring(0, 50) : JSON.stringify(toolOutput).substring(0, 50);
957
- logger.debug(`[ReAct] Iteration ${iteration} Adding tool message: tool=${toolResult.name} output="${toolOutputPreview}..."`);
1057
+ logger2.debug(`[ReAct] Iteration ${iteration} Adding tool message: tool=${toolResult.name} output="${toolOutputPreview}..."`);
958
1058
  this.pushMessage(hookCtx, {
959
1059
  role: "tool",
960
1060
  content: [{
@@ -968,7 +1068,7 @@ class AgentComponent extends BaseComponent {
968
1068
  const captured = this.consumeMetaProtocolUserMessage(hookCtx);
969
1069
  if (captured) {
970
1070
  pendingFakeUserMessage = captured;
971
- logger.debug(`[ReAct] Meta-protocol: captured user message (tool=${toolResult.name}, iter=${iteration}); will flush after loop`);
1071
+ logger2.debug(`[ReAct] Meta-protocol: captured user message (tool=${toolResult.name}, iter=${iteration}); will flush after loop`);
972
1072
  }
973
1073
  }
974
1074
  result.toolCalls.push(hookCtx.currentToolCall);
@@ -980,7 +1080,7 @@ class AgentComponent extends BaseComponent {
980
1080
  await this.executePluginHooks(agent, "agent:on.iteration", hookCtx);
981
1081
  }
982
1082
  } catch (error) {
983
- logger.error(`Iteration ${iteration} error`, { error });
1083
+ logger2.error(`Iteration ${iteration} error`, { error });
984
1084
  hookCtx.error = error instanceof Error ? error : new Error(String(error));
985
1085
  if (error instanceof ContextError && error.llmOutput) {
986
1086
  const llmOutput = error.llmOutput;
@@ -1112,7 +1212,7 @@ class AgentComponent extends BaseComponent {
1112
1212
  if (effectiveContext.persistSession !== false) {
1113
1213
  await this.recordSessionMessages(effectiveContext.sessionId, newMessages);
1114
1214
  } else {
1115
- logger.debug(`Skipping session message recording (persistSession=false, sessionId=${effectiveContext.sessionId})`);
1215
+ logger2.debug(`Skipping session message recording (persistSession=false, sessionId=${effectiveContext.sessionId})`);
1116
1216
  }
1117
1217
  const reactContext = {
1118
1218
  messages: hookCtx.messages,
@@ -1152,7 +1252,7 @@ class AgentComponent extends BaseComponent {
1152
1252
  }
1153
1253
  });
1154
1254
  }
1155
- logger.info(`Agent run completed: ${agentName}`, {
1255
+ logger2.info(`Agent run completed: ${agentName}`, {
1156
1256
  iterations: result.iterations,
1157
1257
  hasError: !!result.error,
1158
1258
  hookCtxMessages: hookCtx.messages.length,
@@ -1171,10 +1271,10 @@ class AgentComponent extends BaseComponent {
1171
1271
  for (const [key, controller] of this.abortControllers) {
1172
1272
  if (key.startsWith(agentName + ":")) {
1173
1273
  controller.abort();
1174
- logger.debug(`[abort] AbortController.abort() called for run: ${key}`);
1274
+ logger2.debug(`[abort] AbortController.abort() called for run: ${key}`);
1175
1275
  }
1176
1276
  }
1177
- logger.info(`Agent aborted: ${agentName}`);
1277
+ logger2.info(`Agent aborted: ${agentName}`);
1178
1278
  }
1179
1279
  abortAll() {
1180
1280
  for (const key of this.aborted.keys()) {
@@ -1182,9 +1282,9 @@ class AgentComponent extends BaseComponent {
1182
1282
  }
1183
1283
  for (const [key, controller] of this.abortControllers) {
1184
1284
  controller.abort();
1185
- logger.debug(`[abortAll] AbortController.abort() called for run: ${key}`);
1285
+ logger2.debug(`[abortAll] AbortController.abort() called for run: ${key}`);
1186
1286
  }
1187
- logger.info(`All agents aborted (${this.abortControllers.size} runs)`);
1287
+ logger2.info(`All agents aborted (${this.abortControllers.size} runs)`);
1188
1288
  }
1189
1289
  async _buildAdditionInfo(ctx) {
1190
1290
  let additionInfo = ctx.context?.additionInfo || "";
@@ -1217,11 +1317,11 @@ ${additionInfo}`
1217
1317
  return messages;
1218
1318
  }
1219
1319
  async invokeLLM(ctx) {
1220
- logger.debug("[invokeLLM] Starting LLM invocation");
1320
+ logger2.debug("[invokeLLM] Starting LLM invocation");
1221
1321
  if (this.llmComponent?.invoke) {
1222
1322
  const messages = await this.buildMessages(ctx);
1223
1323
  const convertedMessages = messages.map(toLLMMessage);
1224
- logger.debug(`[invokeLLM] Calling LLMComponent.invoke with ${convertedMessages.length} messages`);
1324
+ logger2.debug(`[invokeLLM] Calling LLMComponent.invoke with ${convertedMessages.length} messages`);
1225
1325
  try {
1226
1326
  const llmPromise = this.llmComponent.invoke({
1227
1327
  messages: convertedMessages,
@@ -1240,7 +1340,7 @@ ${additionInfo}`
1240
1340
  ...ctx.context.toolChoice ? { toolChoice: ctx.context.toolChoice } : {}
1241
1341
  });
1242
1342
  const result = await withTimeout(llmPromise, 300000, "LLM invocation timeout after 300s");
1243
- logger.debug("[invokeLLM] LLMComponent.invoke returned successfully");
1343
+ logger2.debug("[invokeLLM] LLMComponent.invoke returned successfully");
1244
1344
  return {
1245
1345
  content: result.output?.content || "",
1246
1346
  reasoning: result.output?.reasoning,
@@ -1256,11 +1356,11 @@ ${additionInfo}`
1256
1356
  finishReason: result.output?.finishReason
1257
1357
  };
1258
1358
  } catch (error) {
1259
- logger.error("[invokeLLM] LLMComponent.invoke threw an error:", error);
1359
+ logger2.error("[invokeLLM] LLMComponent.invoke threw an error:", error);
1260
1360
  throw error;
1261
1361
  }
1262
1362
  }
1263
- logger.warn("[invokeLLM] No LLMComponent available, using mock");
1363
+ logger2.warn("[invokeLLM] No LLMComponent available, using mock");
1264
1364
  return {
1265
1365
  content: "Mock response: Hello!",
1266
1366
  finishReason: "stop"
@@ -1269,8 +1369,8 @@ ${additionInfo}`
1269
1369
  async executeTool(ctx) {
1270
1370
  const toolCall = ctx.currentToolCall;
1271
1371
  const toolName = toolCall.function?.name || toolCall.name || "unknown";
1272
- logger.debug(`[executeTool] Looking for tool: "${toolName}"`);
1273
- logger.debug(`[executeTool] Available tools: [${ctx.tools.map((t) => t.name).join(", ")}]`);
1372
+ logger2.debug(`[executeTool] Looking for tool: "${toolName}"`);
1373
+ logger2.debug(`[executeTool] Available tools: [${ctx.tools.map((t) => t.name).join(", ")}]`);
1274
1374
  const tool = ctx.tools.find((t) => t.name === toolName);
1275
1375
  if (!tool) {
1276
1376
  this.pushEnvEvent({
@@ -1316,7 +1416,7 @@ ${additionInfo}`
1316
1416
  const isLongRunningTool = toolName === "delegate_task" || toolName === "stop_task" || toolName === "bash" || toolName === "workflow_run" || toolName === "run-workflow";
1317
1417
  const isExtraTool = this.toolComponent?.getTool ? !this.toolComponent.getTool(toolName) : false;
1318
1418
  if (isExtraTool) {
1319
- logger.debug(`[executeTool] Tool "${toolName}" is an extraTool, executing directly`);
1419
+ logger2.debug(`[executeTool] Tool "${toolName}" is an extraTool, executing directly`);
1320
1420
  const toolPromise = tool.execute(toolCall.arguments, toolContext);
1321
1421
  if (isLongRunningTool) {
1322
1422
  result = await toolPromise;
@@ -1332,7 +1432,7 @@ ${additionInfo}`
1332
1432
  result = await withTimeout(toolPromise, 120000, `Tool '${toolName}' execution timeout after 120s`);
1333
1433
  }
1334
1434
  } else {
1335
- logger.debug(`[executeTool] No ToolComponent available, executing tool directly`);
1435
+ logger2.debug(`[executeTool] No ToolComponent available, executing tool directly`);
1336
1436
  const toolPromise = tool.execute(toolCall.arguments, toolContext);
1337
1437
  if (isLongRunningTool) {
1338
1438
  result = await toolPromise;
@@ -1399,14 +1499,14 @@ ${additionInfo}`
1399
1499
  if (!result.continue) {
1400
1500
  ctx._stopped = true;
1401
1501
  ctx._stopReason = `Plugin ${plugin.name} stopped execution`;
1402
- logger.info(`Hook ${point} stopped by plugin ${plugin.name}`);
1502
+ logger2.info(`Hook ${point} stopped by plugin ${plugin.name}`);
1403
1503
  break;
1404
1504
  }
1405
1505
  if (result.action) {
1406
1506
  await this.handleHookAction(result.action, ctx);
1407
1507
  }
1408
1508
  } catch (error) {
1409
- logger.error(`Hook ${point} error in plugin ${plugin.name}`, { error });
1509
+ logger2.error(`Hook ${point} error in plugin ${plugin.name}`, { error });
1410
1510
  ctx._errors = ctx._errors || [];
1411
1511
  ctx._errors.push({
1412
1512
  plugin: plugin.name,
@@ -1438,7 +1538,7 @@ ${additionInfo}`
1438
1538
  }
1439
1539
  }
1440
1540
  notifyMessageAdded(message) {
1441
- logger.debug(`Message added: ${message.role}`);
1541
+ logger2.debug(`Message added: ${message.role}`);
1442
1542
  }
1443
1543
  finalizeResult(result, ctx) {
1444
1544
  return {
@@ -1455,7 +1555,7 @@ ${additionInfo}`
1455
1555
  try {
1456
1556
  const sessionComponent = this.env.getComponent("session");
1457
1557
  if (!sessionComponent) {
1458
- logger.warn("SessionComponent not found, skipping session recording");
1558
+ logger2.warn("SessionComponent not found, skipping session recording");
1459
1559
  return;
1460
1560
  }
1461
1561
  filtered = [];
@@ -1480,9 +1580,9 @@ ${additionInfo}`
1480
1580
  } catch (err) {
1481
1581
  const kind = err && typeof err === "object" && "kind" in err ? err.kind : undefined;
1482
1582
  if (kind === "lock_exhausted") {
1483
- logger.error(`[recordSessionMessages] DROPPED ${filtered?.length ?? "?"} message(s) — SQLITE_BUSY retry exhausted after ${err.attempts ?? "?"} attempts. Session ${sessionId} is now inconsistent with LLM context. Original: ${err}`);
1583
+ logger2.error(`[recordSessionMessages] DROPPED ${filtered?.length ?? "?"} message(s) — SQLITE_BUSY retry exhausted after ${err.attempts ?? "?"} attempts. Session ${sessionId} is now inconsistent with LLM context. Original: ${err}`);
1484
1584
  } else {
1485
- logger.error(`[recordSessionMessages] Failed to record session messages for ${sessionId}: ${err}`);
1585
+ logger2.error(`[recordSessionMessages] Failed to record session messages for ${sessionId}: ${err}`);
1486
1586
  }
1487
1587
  }
1488
1588
  }
@@ -1513,7 +1613,7 @@ ${additionInfo}`
1513
1613
  };
1514
1614
  this.env?.pushEnvEvent(fullEvent);
1515
1615
  } catch (err) {
1516
- logger.warn(`[pushEnvEvent] Failed to push event: ${err}`);
1616
+ logger2.warn(`[pushEnvEvent] Failed to push event: ${err}`);
1517
1617
  }
1518
1618
  }
1519
1619
  }
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  createHook
3
- } from "./roy-agent-core-02aw62bv.js";
3
+ } from "./roy-agent-core-5ts23mx0.js";
4
4
  import {
5
5
  HookManager
6
- } from "./roy-agent-core-vc7p80sd.js";
6
+ } from "./roy-agent-core-j29yg06n.js";
7
7
 
8
8
  // src/env/component.ts
9
9
  class BaseComponent {
@@ -3,12 +3,12 @@ import {
3
3
  hasDecoratorNodes,
4
4
  init_node_registry_helper,
5
5
  registerDecoratorNodeType
6
- } from "./roy-agent-core-77wfej1h.js";
6
+ } from "./roy-agent-core-3e0w0ekw.js";
7
7
  import"./roy-agent-core-ddwa0n6h.js";
8
8
  import"./roy-agent-core-1ce3fqrk.js";
9
- import"./roy-agent-core-96mj6gvc.js";
10
- import"./roy-agent-core-nna4s0qs.js";
11
- import"./roy-agent-core-m00kamqp.js";
9
+ import"./roy-agent-core-gb7pm9c0.js";
10
+ import"./roy-agent-core-kaq037np.js";
11
+ import"./roy-agent-core-1khp1m0r.js";
12
12
  import"./roy-agent-core-4an1p9a1.js";
13
13
  import"./roy-agent-core-fs0mn2jk.js";
14
14
  init_node_registry_helper();