@ai-setting/roy-agent-core 1.7.53 → 1.7.56

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 (124) hide show
  1. package/dist/config/index.js +7 -7
  2. package/dist/env/agent/agent-component.d.ts +30 -0
  3. package/dist/env/agent/index.js +13 -12
  4. package/dist/env/commands/index.js +7 -7
  5. package/dist/env/context/index.js +3 -3
  6. package/dist/env/debug/index.js +7 -7
  7. package/dist/env/environment.d.ts +7 -0
  8. package/dist/env/error-reply.d.ts +184 -0
  9. package/dist/env/event-source/event-source-handlers.d.ts +9 -23
  10. package/dist/env/event-source/index.js +17 -17
  11. package/dist/env/hook/index.js +5 -5
  12. package/dist/env/index.js +41 -40
  13. package/dist/env/llm/adapter-ai-sdk.d.ts +6 -0
  14. package/dist/env/llm/adapter-pi-ai.d.ts +152 -2
  15. package/dist/env/llm/adapter.d.ts +21 -1
  16. package/dist/env/llm/index.js +10 -10
  17. package/dist/env/llm/invoke.d.ts +74 -2
  18. package/dist/env/llm/llm.d.ts +38 -0
  19. package/dist/env/llm/outbound-defense.d.ts +140 -0
  20. package/dist/env/llm/reasoning-defense.d.ts +104 -0
  21. package/dist/env/llm/types.d.ts +26 -0
  22. package/dist/env/log-trace/decorator.d.ts +46 -3
  23. package/dist/env/log-trace/index.d.ts +1 -0
  24. package/dist/env/log-trace/index.js +33 -7
  25. package/dist/env/log-trace/trace-filters.d.ts +127 -0
  26. package/dist/env/mcp/index.js +7 -7
  27. package/dist/env/memory/index.js +7 -7
  28. package/dist/env/plugin/index.js +7 -7
  29. package/dist/env/prompt/index.js +8 -8
  30. package/dist/env/prompt/prompts-index.d.ts +1 -1
  31. package/dist/env/session/index.js +11 -10
  32. package/dist/env/session/session-component.d.ts +4 -0
  33. package/dist/env/session/storage/index.js +5 -3
  34. package/dist/env/skill/index.js +7 -7
  35. package/dist/env/task/backend/index.js +0 -2
  36. package/dist/env/task/backend/types.d.ts +0 -11
  37. package/dist/env/task/delegate/index.js +8 -8
  38. package/dist/env/task/index.js +13 -13
  39. package/dist/env/task/plugins/card-chat-routing.d.ts +42 -89
  40. package/dist/env/task/plugins/index.js +10 -10
  41. package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +0 -51
  42. package/dist/env/task/plugins/lark-cli-task-notify-plugin.d.ts +14 -31
  43. package/dist/env/task/plugins/per-task-group-chat-plugin.d.ts +4 -4
  44. package/dist/env/task/storage/index.js +2 -2
  45. package/dist/env/task/tools/index.js +3 -3
  46. package/dist/env/tool/built-in/index.js +3 -3
  47. package/dist/env/tool/index.js +9 -9
  48. package/dist/env/workflow/engine/engine.d.ts +65 -0
  49. package/dist/env/workflow/engine/index.js +12 -12
  50. package/dist/env/workflow/hooks/index.js +7 -7
  51. package/dist/env/workflow/index.js +23 -22
  52. package/dist/env/workflow/nodes/index.js +2 -2
  53. package/dist/env/workflow/nodes/tool-node.d.ts +6 -0
  54. package/dist/env/workflow/plugins/index.js +8 -8
  55. package/dist/env/workflow/service/index.js +2 -2
  56. package/dist/env/workflow/storage/index.js +3 -3
  57. package/dist/env/workflow/tools/index.js +15 -14
  58. package/dist/env/workflow/tools/workflow-validate-tool.d.ts +11 -2
  59. package/dist/env/workflow/types/run.d.ts +19 -0
  60. package/dist/env/workflow/utils/agent-session-metadata.d.ts +13 -0
  61. package/dist/env/workflow/utils/index.js +5 -5
  62. package/dist/env/workflow/utils/redact-command-secrets.d.ts +70 -0
  63. package/dist/env/workflow/utils/shell-dialect-lint.d.ts +75 -0
  64. package/dist/env/workflow/utils/validate-workflow-definition.d.ts +22 -0
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.js +82 -56
  67. package/dist/shared/@ai-setting/{roy-agent-core-k25gv86p.js → roy-agent-core-0b3fdnn3.js} +1 -1
  68. package/dist/shared/@ai-setting/{roy-agent-core-vvxb9522.js → roy-agent-core-0bmk44ye.js} +71 -10
  69. package/dist/shared/@ai-setting/{roy-agent-core-k8b440n3.js → roy-agent-core-16t0zfbk.js} +1 -1
  70. package/dist/shared/@ai-setting/{roy-agent-core-4z3rq5gw.js → roy-agent-core-1pnfkspm.js} +2 -2
  71. package/dist/shared/@ai-setting/{roy-agent-core-na73mym1.js → roy-agent-core-202v00x4.js} +213 -2
  72. package/dist/shared/@ai-setting/{roy-agent-core-ph5qbqcx.js → roy-agent-core-2044fbsd.js} +471 -134
  73. package/dist/shared/@ai-setting/{roy-agent-core-fs36xgcs.js → roy-agent-core-3dkzqqsd.js} +1 -1
  74. package/dist/shared/@ai-setting/{roy-agent-core-qm9jda8p.js → roy-agent-core-3kz6934b.js} +1 -1
  75. package/dist/shared/@ai-setting/{roy-agent-core-tjg71zqp.js → roy-agent-core-3mc6vmvj.js} +1 -1
  76. package/dist/shared/@ai-setting/{roy-agent-core-tdbv7ff4.js → roy-agent-core-40xzbjtm.js} +2 -2
  77. package/dist/shared/@ai-setting/{roy-agent-core-athdr2m0.js → roy-agent-core-4zy2v3br.js} +10 -2
  78. package/dist/shared/@ai-setting/{roy-agent-core-t37wbysj.js → roy-agent-core-5gw6w424.js} +4 -4
  79. package/dist/shared/@ai-setting/{roy-agent-core-978b6wfx.js → roy-agent-core-5psjwd08.js} +1 -1
  80. package/dist/shared/@ai-setting/{roy-agent-core-7evvpfwc.js → roy-agent-core-5rxs0ra3.js} +1 -1
  81. package/dist/shared/@ai-setting/{roy-agent-core-gdsqp6j8.js → roy-agent-core-6masakz4.js} +45 -0
  82. package/dist/shared/@ai-setting/{roy-agent-core-stnddvx9.js → roy-agent-core-6qgq7h1g.js} +4 -4
  83. package/dist/shared/@ai-setting/{roy-agent-core-6167phd4.js → roy-agent-core-833t16n1.js} +3 -3
  84. package/dist/shared/@ai-setting/{roy-agent-core-2k4xffaa.js → roy-agent-core-8cgtwytv.js} +3 -3
  85. package/dist/shared/@ai-setting/{roy-agent-core-rx16h2m1.js → roy-agent-core-97eyghsp.js} +2 -2
  86. package/dist/shared/@ai-setting/{roy-agent-core-fvs48d38.js → roy-agent-core-98aa9r0x.js} +12 -7
  87. package/dist/shared/@ai-setting/{roy-agent-core-3tv1q6f2.js → roy-agent-core-9nv586rw.js} +57 -19
  88. package/dist/shared/@ai-setting/roy-agent-core-b599jgyd.js +578 -0
  89. package/dist/shared/@ai-setting/{roy-agent-core-yd21n6c7.js → roy-agent-core-bwzy00t2.js} +12 -5
  90. package/dist/shared/@ai-setting/{roy-agent-core-dwx9hjwx.js → roy-agent-core-c6at31ra.js} +1 -1
  91. package/dist/shared/@ai-setting/{roy-agent-core-1cv9j4dg.js → roy-agent-core-d14h726p.js} +3 -3
  92. package/dist/shared/@ai-setting/{roy-agent-core-4sx6sdb2.js → roy-agent-core-d4jpn06f.js} +22 -9
  93. package/dist/shared/@ai-setting/{roy-agent-core-39xejr39.js → roy-agent-core-e0wbq0qq.js} +7 -7
  94. package/dist/shared/@ai-setting/{roy-agent-core-vrsxhw9e.js → roy-agent-core-e677am8e.js} +1 -1
  95. package/dist/shared/@ai-setting/{roy-agent-core-hch2geta.js → roy-agent-core-ezsyyjxw.js} +21 -190
  96. package/dist/shared/@ai-setting/{roy-agent-core-ne2t1pay.js → roy-agent-core-f8sp1txg.js} +2 -2
  97. package/dist/shared/@ai-setting/{roy-agent-core-ak4dc3kg.js → roy-agent-core-gn8f4rhs.js} +1 -1
  98. package/dist/shared/@ai-setting/{roy-agent-core-qcspfszy.js → roy-agent-core-gngjkw3b.js} +1 -1
  99. package/dist/shared/@ai-setting/{roy-agent-core-9jzysq50.js → roy-agent-core-heft3j4c.js} +2 -2
  100. package/dist/shared/@ai-setting/{roy-agent-core-5apmk4qw.js → roy-agent-core-jszgaevt.js} +1 -1
  101. package/dist/shared/@ai-setting/{roy-agent-core-nde5gzta.js → roy-agent-core-m8n0dffe.js} +1 -1
  102. package/dist/shared/@ai-setting/{roy-agent-core-x8n1r7h4.js → roy-agent-core-n3b7ztms.js} +189 -8
  103. package/dist/shared/@ai-setting/{roy-agent-core-4vpk40ss.js → roy-agent-core-nhk0dsxr.js} +13 -13
  104. package/dist/shared/@ai-setting/{roy-agent-core-j8e92gj8.js → roy-agent-core-nntphgww.js} +1 -60
  105. package/dist/shared/@ai-setting/{roy-agent-core-8s9jd2qy.js → roy-agent-core-nra8vfrs.js} +1 -1
  106. package/dist/shared/@ai-setting/{roy-agent-core-pk1b3kvf.js → roy-agent-core-ns3pbyz4.js} +1 -1
  107. package/dist/shared/@ai-setting/{roy-agent-core-7g03zkkb.js → roy-agent-core-pemxr5n4.js} +1 -1
  108. package/dist/shared/@ai-setting/{roy-agent-core-skzjs973.js → roy-agent-core-pjxa78mp.js} +5 -5
  109. package/dist/shared/@ai-setting/{roy-agent-core-p8ak03s0.js → roy-agent-core-q7zksbw0.js} +117 -315
  110. package/dist/shared/@ai-setting/{roy-agent-core-zd3ddm4k.js → roy-agent-core-qjjf4tjb.js} +1 -1
  111. package/dist/shared/@ai-setting/{roy-agent-core-qamktze3.js → roy-agent-core-qyqnmz8c.js} +1 -1
  112. package/dist/shared/@ai-setting/{roy-agent-core-9csa89jx.js → roy-agent-core-r9qe0ghe.js} +2 -2
  113. package/dist/shared/@ai-setting/{roy-agent-core-h93v6p6y.js → roy-agent-core-tc7gw38m.js} +2 -2
  114. package/dist/shared/@ai-setting/{roy-agent-core-35s1w7tc.js → roy-agent-core-v2188rnk.js} +157 -85
  115. package/dist/shared/@ai-setting/{roy-agent-core-p2r27era.js → roy-agent-core-vmg30n5x.js} +8 -8
  116. package/dist/shared/@ai-setting/{roy-agent-core-rnwr39b0.js → roy-agent-core-w7hnjhvx.js} +5 -3
  117. package/dist/shared/@ai-setting/{roy-agent-core-dv714bqh.js → roy-agent-core-wafk25ff.js} +1 -1
  118. package/dist/shared/@ai-setting/{roy-agent-core-brwzs8wf.js → roy-agent-core-xcq04fq0.js} +5 -5
  119. package/dist/shared/@ai-setting/{roy-agent-core-2gay3sjt.js → roy-agent-core-yg247mk4.js} +1 -1
  120. package/dist/shared/@ai-setting/{roy-agent-core-zy3hqfwg.js → roy-agent-core-yv9x4wmg.js} +631 -35
  121. package/dist/shared/@ai-setting/{roy-agent-core-yhsssn86.js → roy-agent-core-zmeka63k.js} +1 -1
  122. package/dist/test-utils/child-process-mock.d.ts +73 -0
  123. package/package.json +2 -2
  124. package/dist/shared/@ai-setting/roy-agent-core-dsevjbck.js +0 -245
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  AgentComponentAdapter,
9
9
  init_agent_component_adapter
10
- } from "./roy-agent-core-6167phd4.js";
10
+ } from "./roy-agent-core-833t16n1.js";
11
11
  import {
12
12
  PythonCallNode,
13
13
  SkillNode,
@@ -17,7 +17,7 @@ import {
17
17
  init_skill_node,
18
18
  init_tool_node,
19
19
  init_workflow_node
20
- } from "./roy-agent-core-x8n1r7h4.js";
20
+ } from "./roy-agent-core-n3b7ztms.js";
21
21
  import {
22
22
  WORKFLOW_SUBMIT_OUTPUT_TOOL_NAME,
23
23
  init_json_schema_to_zod,
@@ -28,20 +28,20 @@ import {
28
28
  } from "./roy-agent-core-1db4vpc6.js";
29
29
  import {
30
30
  init_hooks
31
- } from "./roy-agent-core-fs36xgcs.js";
31
+ } from "./roy-agent-core-3dkzqqsd.js";
32
32
  import {
33
33
  WorkflowHookPoints,
34
34
  emitWorkflowNodeHook,
35
35
  emitWorkflowRunHook
36
- } from "./roy-agent-core-9csa89jx.js";
36
+ } from "./roy-agent-core-r9qe0ghe.js";
37
37
  import {
38
38
  TemplateResolver,
39
39
  init_template_resolver
40
- } from "./roy-agent-core-tjg71zqp.js";
40
+ } from "./roy-agent-core-3mc6vmvj.js";
41
41
  import {
42
42
  DAGManager,
43
43
  init_dag_manager
44
- } from "./roy-agent-core-8s9jd2qy.js";
44
+ } from "./roy-agent-core-nra8vfrs.js";
45
45
  import {
46
46
  WorkflowError,
47
47
  createWorkflowEvent,
@@ -57,7 +57,7 @@ import {
57
57
  import {
58
58
  TracedAs,
59
59
  init_decorator
60
- } from "./roy-agent-core-dsevjbck.js";
60
+ } from "./roy-agent-core-b599jgyd.js";
61
61
  import {
62
62
  createLogger,
63
63
  init_logger
@@ -801,13 +801,13 @@ var init_executor = __esm(() => {
801
801
  }
802
802
  };
803
803
  __legacyDecorateClassTS([
804
- TracedAs("workflow.executor.executeNode", { recordParams: true, recordResult: true })
804
+ TracedAs("workflow.executor.executeNode", { recordParams: true, recordResult: false })
805
805
  ], Executor.prototype, "executeNode", null);
806
806
  __legacyDecorateClassTS([
807
- TracedAs("workflow.executor.executeWithTimeout", { recordParams: true, recordResult: true })
807
+ TracedAs("workflow.executor.executeWithTimeout", { recordParams: true, recordResult: false })
808
808
  ], Executor.prototype, "executeWithTimeout", null);
809
809
  __legacyDecorateClassTS([
810
- TracedAs("workflow.executor.executeWithRetry", { recordParams: true, recordResult: true })
810
+ TracedAs("workflow.executor.executeWithRetry", { recordParams: true, recordResult: false })
811
811
  ], Executor.prototype, "executeWithRetry", null);
812
812
  __legacyDecorateClassTS([
813
813
  TracedAs("workflow.executor.cancelNode", { recordParams: true, recordResult: false })
@@ -1254,6 +1254,10 @@ ${promptInjection}`;
1254
1254
  workflowName: context.workflowName
1255
1255
  }
1256
1256
  });
1257
+ if (typeof context.registerAgentSubSession === "function") {
1258
+ await context.registerAgentSubSession(this.definition.id, agentSessionId);
1259
+ return agentSessionId;
1260
+ }
1257
1261
  const workflowSession = await sessionComponent.get(context.sessionId);
1258
1262
  if (workflowSession) {
1259
1263
  const metadata = workflowSession.metadata || {};
@@ -1285,7 +1289,7 @@ ${promptInjection}`;
1285
1289
  }
1286
1290
  };
1287
1291
  __legacyDecorateClassTS([
1288
- TracedAs("workflow.agent.execute")
1292
+ TracedAs("workflow.agent.execute", { recordResult: false })
1289
1293
  ], AgentNode.prototype, "execute", null);
1290
1294
  __legacyDecorateClassTS([
1291
1295
  TracedAs("workflow.agent.applyPromptInjection", { recordParams: true, recordResult: false })
@@ -1437,6 +1441,20 @@ function updateAgentSessionStatus(agentSessions, nodeId, status) {
1437
1441
  function markAgentSessionCompleted(agentSessions, nodeId) {
1438
1442
  return updateAgentSessionStatus(agentSessions, nodeId, "completed");
1439
1443
  }
1444
+ function upsertAgentSession(agentSessions, nodeId, agentSessionId) {
1445
+ const next = {
1446
+ nodeId,
1447
+ sessionId: agentSessionId,
1448
+ status: "active",
1449
+ createdAt: Date.now()
1450
+ };
1451
+ const list = agentSessions ?? [];
1452
+ const existingIndex = list.findIndex((ref) => ref.nodeId === nodeId);
1453
+ if (existingIndex >= 0) {
1454
+ return list.map((ref, index) => index === existingIndex ? { ...next } : ref);
1455
+ }
1456
+ return [...list, next];
1457
+ }
1440
1458
  function markAgentSessionFailed(agentSessions, nodeId) {
1441
1459
  return updateAgentSessionStatus(agentSessions, nodeId, "failed");
1442
1460
  }
@@ -1903,7 +1921,9 @@ var init_engine = __esm(() => {
1903
1921
  agentSessions: new Map,
1904
1922
  edges: dagManager.buildEdges(definition.edges || []),
1905
1923
  loopIterationCount: 0,
1906
- loopGuardCounters: new Map
1924
+ loopGuardCounters: new Map,
1925
+ inFlight: new Map,
1926
+ sessionMetadataQueue: Promise.resolve()
1907
1927
  };
1908
1928
  this.setupEventHandlers(sessionState);
1909
1929
  return sessionState;
@@ -1995,10 +2015,10 @@ var init_engine = __esm(() => {
1995
2015
  sessionState.abortController.abort();
1996
2016
  sessionState.executor.cancelAll();
1997
2017
  if (this.sessionComponent) {
1998
- const metadata = await this.getSessionMetadata(sessionId);
1999
- await this.sessionComponent.update(sessionId, {
2000
- metadata: { ...metadata, status: "paused" }
2001
- });
2018
+ await this.updateSessionMetadata(sessionState, (metadata) => ({
2019
+ ...metadata,
2020
+ status: "paused"
2021
+ }));
2002
2022
  }
2003
2023
  await sessionState.eventBus.publish(createWorkflowEvent("workflow.paused", this.getRunIdFromSessionId(sessionId), {}));
2004
2024
  logger3.info(`[WorkflowEngine] Workflow paused: ${sessionId}`);
@@ -2036,15 +2056,11 @@ var init_engine = __esm(() => {
2036
2056
  }
2037
2057
  sessionState.executor.cancelAll();
2038
2058
  if (this.sessionComponent) {
2039
- const metadata = await this.getSessionMetadata(sessionId);
2040
- const updatedAgentSessions = markAllAgentSessionsStopped(metadata.agentSessions);
2041
- await this.sessionComponent.update(sessionId, {
2042
- metadata: {
2043
- ...metadata,
2044
- status: "stopped",
2045
- agentSessions: updatedAgentSessions
2046
- }
2047
- });
2059
+ await this.updateSessionMetadata(sessionState, (metadata) => ({
2060
+ ...metadata,
2061
+ status: "stopped",
2062
+ agentSessions: markAllAgentSessionsStopped(metadata.agentSessions)
2063
+ }));
2048
2064
  await this.propagateStopToChildSessions(sessionId, stopReason);
2049
2065
  }
2050
2066
  await sessionState.eventBus.publish(createWorkflowEvent("workflow.stopped", this.getRunIdFromSessionId(sessionId), {
@@ -2151,28 +2167,18 @@ var init_engine = __esm(() => {
2151
2167
  sessionState.workflowHistory.push(...messages);
2152
2168
  }
2153
2169
  }
2154
- if (this.sessionComponent) {
2155
- const metadata = await this.getSessionMetadata(sessionId);
2156
- await this.sessionComponent.update(sessionId, {
2157
- metadata: {
2158
- ...metadata,
2159
- agentSessions: markAgentSessionCompleted(metadata.agentSessions, event.node_id)
2160
- }
2161
- });
2162
- }
2170
+ await this.updateSessionMetadata(sessionState, (metadata) => ({
2171
+ ...metadata,
2172
+ agentSessions: markAgentSessionCompleted(metadata.agentSessions, event.node_id)
2173
+ }));
2163
2174
  });
2164
2175
  eventBus.on("node.failed", async (event) => {
2165
2176
  if (event.type !== "node.failed")
2166
2177
  return;
2167
- if (this.sessionComponent) {
2168
- const metadata = await this.getSessionMetadata(sessionId);
2169
- await this.sessionComponent.update(sessionId, {
2170
- metadata: {
2171
- ...metadata,
2172
- agentSessions: markAgentSessionFailed(metadata.agentSessions, event.node_id)
2173
- }
2174
- });
2175
- }
2178
+ await this.updateSessionMetadata(sessionState, (metadata) => ({
2179
+ ...metadata,
2180
+ agentSessions: markAgentSessionFailed(metadata.agentSessions, event.node_id)
2181
+ }));
2176
2182
  scheduler.markFailed(event.node_id);
2177
2183
  await this.failWorkflow(sessionState, new Error(event.error.message));
2178
2184
  });
@@ -2183,10 +2189,9 @@ var init_engine = __esm(() => {
2183
2189
  sessionState.status = "paused";
2184
2190
  sessionState.abortController.abort();
2185
2191
  if (this.sessionComponent) {
2186
- const metadata = await this.getSessionMetadata(sessionId);
2187
- const agentSessions = updateAgentSessionStatus(metadata.agentSessions, event.node_id, "paused");
2188
- await this.sessionComponent.update(sessionId, {
2189
- metadata: {
2192
+ await this.updateSessionMetadata(sessionState, (metadata) => {
2193
+ const agentSessions = updateAgentSessionStatus(metadata.agentSessions, event.node_id, "paused");
2194
+ return {
2190
2195
  ...metadata,
2191
2196
  status: "paused",
2192
2197
  pendingNodeId: event.node_id,
@@ -2194,7 +2199,7 @@ var init_engine = __esm(() => {
2194
2199
  pendingAskUserQuery: event.query,
2195
2200
  pendingAskUserAgentSessionId: event.agent_session_id,
2196
2201
  agentSessions
2197
- }
2202
+ };
2198
2203
  });
2199
2204
  }
2200
2205
  await eventBus.publish(createWorkflowEvent("workflow.paused", runId, {
@@ -2237,14 +2242,16 @@ var init_engine = __esm(() => {
2237
2242
  if (readyNodes.length === 0 || !canStart) {
2238
2243
  return false;
2239
2244
  }
2245
+ const parallelLimit = sessionState.config.parallelLimit ?? Infinity;
2240
2246
  let scheduled = 0;
2241
2247
  for (const nodeId of readyNodes) {
2242
2248
  if (!scheduler.canStartMore())
2243
2249
  break;
2244
- if (scheduled >= (sessionState.config.parallelLimit ?? Infinity))
2250
+ if (scheduled >= parallelLimit)
2245
2251
  break;
2246
- await this.startNode(sessionState, nodeId, sessionState.config.workflowInput);
2247
- scheduled++;
2252
+ if (this.dispatchNode(sessionState, nodeId, sessionState.config.workflowInput)) {
2253
+ scheduled++;
2254
+ }
2248
2255
  }
2249
2256
  return true;
2250
2257
  };
@@ -2258,13 +2265,12 @@ var init_engine = __esm(() => {
2258
2265
  }
2259
2266
  while (sessionState.status === "running" && !abortController.signal.aborted && !sessionState.cancellationScope?.signal.aborted) {
2260
2267
  const state = scheduler.getState();
2261
- if (state.pending.length === 0 && state.running.length === 0) {
2268
+ if (state.pending.length === 0 && state.running.length === 0 && sessionState.inFlight.size === 0) {
2262
2269
  break;
2263
2270
  }
2264
- if (sessionState.config.loopEnabled && sessionState.loopIterationCount >= maxIterations) {
2271
+ if (sessionState.config.loopEnabled && sessionState.loopIterationCount > maxIterations) {
2265
2272
  logger3.error(`[WorkflowEngine] Max loop iterations ${maxIterations} exceeded`);
2266
- sessionState.rejectCompleted(new WorkflowError(`Workflow exceeded maximum loop iterations: ${maxIterations}`));
2267
- await this.stop(sessionState.sessionId, "Max iterations exceeded");
2273
+ await this.failWorkflow(sessionState, new WorkflowError(`Workflow exceeded maximum loop iterations: ${maxIterations}`));
2268
2274
  return;
2269
2275
  }
2270
2276
  try {
@@ -2274,13 +2280,42 @@ var init_engine = __esm(() => {
2274
2280
  }
2275
2281
  await scheduleAvailableNodes();
2276
2282
  }
2283
+ while (sessionState.inFlight.size > 0) {
2284
+ const pending = Array.from(sessionState.inFlight.values());
2285
+ await Promise.allSettled(pending);
2286
+ for (const [nodeId, promise] of Array.from(sessionState.inFlight.entries())) {
2287
+ if (pending.includes(promise)) {
2288
+ sessionState.inFlight.delete(nodeId);
2289
+ }
2290
+ }
2291
+ }
2292
+ }
2293
+ dispatchNode(sessionState, nodeId, input) {
2294
+ const { scheduler } = sessionState;
2295
+ if (scheduler.isRunning(nodeId) || scheduler.isCompleted(nodeId) || scheduler.isFailed(nodeId)) {
2296
+ return false;
2297
+ }
2298
+ const promise = this.startNode(sessionState, nodeId, input).catch((error) => {
2299
+ logger3.error(`[WorkflowEngine] Unhandled dispatch error for node "${nodeId}":`, error);
2300
+ }).finally(() => {
2301
+ if (sessionState.inFlight.get(nodeId) === promise) {
2302
+ sessionState.inFlight.delete(nodeId);
2303
+ }
2304
+ });
2305
+ sessionState.inFlight.set(nodeId, promise);
2306
+ return true;
2277
2307
  }
2278
2308
  waitForNextNodeEvent(sessionState, signal) {
2279
2309
  return new Promise((resolve) => {
2280
2310
  const state = sessionState.scheduler.getState();
2281
2311
  const hasRunningNodes = state.running.length > 0;
2312
+ const hasInFlight = sessionState.inFlight.size > 0;
2313
+ const limit = sessionState.config.parallelLimit ?? Infinity;
2314
+ const atCapacity = sessionState.inFlight.size >= limit;
2315
+ const mayHaveDeferredWork = atCapacity && state.pending.length + state.ready.length > 0;
2316
+ const pureEventDriven = hasRunningNodes && hasInFlight && !mayHaveDeferredWork;
2282
2317
  let timeoutId;
2283
- if (!hasRunningNodes) {
2318
+ if (!pureEventDriven) {
2284
2319
  timeoutId = setTimeout(() => {
2285
2320
  cleanup();
2286
2321
  resolve();
@@ -2291,6 +2326,7 @@ var init_engine = __esm(() => {
2291
2326
  clearTimeout(timeoutId);
2292
2327
  sessionState.eventBus.off("node.completed", onCompleted);
2293
2328
  sessionState.eventBus.off("node.failed", onFailed);
2329
+ sessionState.eventBus.off("node.scheduled", onScheduled);
2294
2330
  };
2295
2331
  const onCompleted = (event) => {
2296
2332
  if (event.type === "node.completed") {
@@ -2304,8 +2340,15 @@ var init_engine = __esm(() => {
2304
2340
  resolve();
2305
2341
  }
2306
2342
  };
2343
+ const onScheduled = (event) => {
2344
+ if (event.type === "node.scheduled") {
2345
+ cleanup();
2346
+ resolve();
2347
+ }
2348
+ };
2307
2349
  sessionState.eventBus.on("node.completed", onCompleted);
2308
2350
  sessionState.eventBus.on("node.failed", onFailed);
2351
+ sessionState.eventBus.on("node.scheduled", onScheduled);
2309
2352
  if (signal.aborted) {
2310
2353
  cleanup();
2311
2354
  resolve();
@@ -2541,6 +2584,9 @@ var init_engine = __esm(() => {
2541
2584
  logger3.debug(`[WorkflowEngine] Processing edges after "${completedNodeId}" completed. edges=${JSON.stringify(sessionState.edges)}`);
2542
2585
  const edgeResult = scheduler.processEdgesAfterCompletion(completedNodeId, sessionState.edges, templateResolver, sessionState.config.loopEnabled);
2543
2586
  logger3.debug(`[WorkflowEngine] Edge processing result: ${JSON.stringify(edgeResult)}`);
2587
+ for (const reEntryId of edgeResult.reEntries) {
2588
+ scheduler.markStarted(reEntryId);
2589
+ }
2544
2590
  const loopGuardSnapshots = new Map;
2545
2591
  for (const reEntryId of edgeResult.reEntries) {
2546
2592
  const guard = sessionState.dagManager.getLoopGuard(reEntryId);
@@ -2609,6 +2655,8 @@ var init_engine = __esm(() => {
2609
2655
  }
2610
2656
  }
2611
2657
  const workflowInput = sessionState.config.workflowInput || {};
2658
+ const parallelLimit = sessionState.config.parallelLimit ?? Infinity;
2659
+ const reEntries = new Set(edgeResult.reEntries);
2612
2660
  for (const targetId of edgeResult.toStart) {
2613
2661
  if (loopGuardTripped.has(targetId)) {
2614
2662
  continue;
@@ -2617,8 +2665,14 @@ var init_engine = __esm(() => {
2617
2665
  logger3.info(`[WorkflowEngine] Workflow terminated via __end__ edge from node "${completedNodeId}"`);
2618
2666
  scheduler.markCompleted("__end__");
2619
2667
  await this.completeWorkflow(sessionState);
2620
- } else {
2668
+ } else if (reEntries.has(targetId)) {
2621
2669
  await this.startNode(sessionState, targetId, workflowInput);
2670
+ } else {
2671
+ if (sessionState.inFlight.size >= parallelLimit) {
2672
+ logger3.debug(`[WorkflowEngine] Deferring edge-triggered node "${targetId}" — in-flight ${sessionState.inFlight.size} >= parallel_limit ${parallelLimit}`);
2673
+ continue;
2674
+ }
2675
+ this.dispatchNode(sessionState, targetId, workflowInput);
2622
2676
  }
2623
2677
  }
2624
2678
  }
@@ -2668,6 +2722,15 @@ var init_engine = __esm(() => {
2668
2722
  attachAgentSessionToLastStart: async (targetNodeId, agentSessionId) => {
2669
2723
  await sessionState.executor.attachAgentSessionToLastStart(sessionState.sessionId, targetNodeId, agentSessionId);
2670
2724
  },
2725
+ registerAgentSubSession: async (targetNodeId, agentSessionId) => {
2726
+ await this.updateSessionMetadata(sessionState, (metadata) => {
2727
+ const existing = Array.isArray(metadata.agentSessions) ? metadata.agentSessions : [];
2728
+ return {
2729
+ ...metadata,
2730
+ agentSessions: upsertAgentSession(existing, targetNodeId, agentSessionId)
2731
+ };
2732
+ });
2733
+ },
2671
2734
  workflowInput,
2672
2735
  templateResolver,
2673
2736
  resolvedConfig: templateResolver.resolveValue(effectiveConfig),
@@ -2703,19 +2766,16 @@ var init_engine = __esm(() => {
2703
2766
  allNodeOutputs[nodeId] = nodeOutput;
2704
2767
  }
2705
2768
  if (this.sessionComponent) {
2706
- const metadata = await this.getSessionMetadata(sessionId);
2707
- await this.sessionComponent.update(sessionId, {
2708
- metadata: {
2709
- ...metadata,
2710
- status: "completed",
2711
- completedAt: Date.now(),
2712
- durationMs,
2713
- output: allNodeOutputs,
2714
- pendingNodeId: undefined,
2715
- pauseReason: undefined,
2716
- agentSessions: markAllAgentSessionsCompleted(metadata.agentSessions)
2717
- }
2718
- });
2769
+ await this.updateSessionMetadata(sessionState, (metadata) => ({
2770
+ ...metadata,
2771
+ status: "completed",
2772
+ completedAt: Date.now(),
2773
+ durationMs,
2774
+ output: allNodeOutputs,
2775
+ pendingNodeId: undefined,
2776
+ pauseReason: undefined,
2777
+ agentSessions: markAllAgentSessionsCompleted(metadata.agentSessions)
2778
+ }));
2719
2779
  }
2720
2780
  await sessionState.eventBus.publish(createWorkflowEvent("workflow.completed", runId, {
2721
2781
  result: finalOutput,
@@ -2750,16 +2810,13 @@ var init_engine = __esm(() => {
2750
2810
  const runId = this.getRunIdFromSessionId(sessionId);
2751
2811
  sessionState.executor.cancelAll();
2752
2812
  if (this.sessionComponent) {
2753
- const metadata = await this.getSessionMetadata(sessionId);
2754
- await this.sessionComponent.update(sessionId, {
2755
- metadata: {
2756
- ...metadata,
2757
- status: "failed",
2758
- failedAt: Date.now(),
2759
- durationMs,
2760
- agentSessions: markAllAgentSessionsFailed(metadata.agentSessions)
2761
- }
2762
- });
2813
+ await this.updateSessionMetadata(sessionState, (metadata) => ({
2814
+ ...metadata,
2815
+ status: "failed",
2816
+ failedAt: Date.now(),
2817
+ durationMs,
2818
+ agentSessions: markAllAgentSessionsFailed(metadata.agentSessions)
2819
+ }));
2763
2820
  }
2764
2821
  await sessionState.eventBus.publish(createWorkflowEvent("workflow.failed", runId, {
2765
2822
  error: { message: error.message, stack: error.stack },
@@ -2825,6 +2882,21 @@ var init_engine = __esm(() => {
2825
2882
  const session = await this.sessionComponent.get(sessionId);
2826
2883
  return session?.metadata || { type: "workflow", workflowId: "", workflowName: "", status: "running" };
2827
2884
  }
2885
+ async updateSessionMetadata(sessionState, mutate) {
2886
+ if (!this.sessionComponent)
2887
+ return;
2888
+ const sessionId = sessionState.sessionId;
2889
+ const run = (sessionState.sessionMetadataQueue ?? Promise.resolve()).then(async () => {
2890
+ try {
2891
+ const metadata = await this.getSessionMetadata(sessionId);
2892
+ await this.sessionComponent.update(sessionId, { metadata: mutate(metadata) });
2893
+ } catch (error) {
2894
+ logger3.error(`[WorkflowEngine] Failed to update session metadata for ${sessionId}:`, error);
2895
+ }
2896
+ });
2897
+ sessionState.sessionMetadataQueue = run;
2898
+ await run;
2899
+ }
2828
2900
  findDefinitionForWorkflow(workflowIdOrName) {
2829
2901
  if (!this.workflowRepository) {
2830
2902
  return null;
@@ -2842,16 +2914,16 @@ var init_engine = __esm(() => {
2842
2914
  TracedAs("workflow.engine.createSession", { recordParams: true, recordResult: true, log: true })
2843
2915
  ], WorkflowEngine.prototype, "createSession", null);
2844
2916
  __legacyDecorateClassTS([
2845
- TracedAs("workflow.engine.run", { recordParams: true, recordResult: true, log: true })
2917
+ TracedAs("workflow.engine.run", { recordParams: true, recordResult: false, log: true })
2846
2918
  ], WorkflowEngine.prototype, "run", null);
2847
2919
  __legacyDecorateClassTS([
2848
- TracedAs("workflow.engine.initializeSessionState", { recordParams: true, recordResult: true })
2920
+ TracedAs("workflow.engine.initializeSessionState", { recordParams: true, recordResult: false })
2849
2921
  ], WorkflowEngine.prototype, "initializeSessionState", null);
2850
2922
  __legacyDecorateClassTS([
2851
- TracedAs("workflow.engine.runWithResume", { recordParams: true, recordResult: true })
2923
+ TracedAs("workflow.engine.runWithResume", { recordParams: true, recordResult: false })
2852
2924
  ], WorkflowEngine.prototype, "runWithResume", null);
2853
2925
  __legacyDecorateClassTS([
2854
- TracedAs("workflow.engine.runWorkflow", { recordParams: true, recordResult: true, log: true })
2926
+ TracedAs("workflow.engine.runWorkflow", { recordParams: true, recordResult: false, log: true })
2855
2927
  ], WorkflowEngine.prototype, "runWorkflow", null);
2856
2928
  __legacyDecorateClassTS([
2857
2929
  TracedAs("workflow.engine.pause", { recordParams: true, recordResult: true, log: true })
@@ -2901,7 +2973,7 @@ var init_engine = __esm(() => {
2901
2973
  __legacyDecorateClassTS([
2902
2974
  TracedAs("workflow.engine.waitForCompletion", {
2903
2975
  recordParams: true,
2904
- recordResult: true
2976
+ recordResult: false
2905
2977
  })
2906
2978
  ], WorkflowEngine.prototype, "waitForCompletion", null);
2907
2979
  });
@@ -4,35 +4,35 @@ import {
4
4
  } from "./roy-agent-core-tbrn9wdm.js";
5
5
  import {
6
6
  getSharedEventStore
7
- } from "./roy-agent-core-yhsssn86.js";
7
+ } from "./roy-agent-core-zmeka63k.js";
8
8
  import {
9
9
  TaskHookPoints
10
10
  } from "./roy-agent-core-1pg0fepg.js";
11
11
  import {
12
12
  builtInPrompts
13
- } from "./roy-agent-core-gdsqp6j8.js";
13
+ } from "./roy-agent-core-6masakz4.js";
14
14
  import {
15
15
  DEFAULT_SUBAGENT_PROMPT
16
- } from "./roy-agent-core-rx16h2m1.js";
16
+ } from "./roy-agent-core-97eyghsp.js";
17
17
  import {
18
18
  runWithBgTaskIdAsync
19
19
  } from "./roy-agent-core-c1v263jn.js";
20
20
  import {
21
21
  globalHookManager,
22
22
  init_global_hook_manager
23
- } from "./roy-agent-core-4z3rq5gw.js";
23
+ } from "./roy-agent-core-1pnfkspm.js";
24
24
  import {
25
25
  init_context
26
- } from "./roy-agent-core-k8b440n3.js";
26
+ } from "./roy-agent-core-16t0zfbk.js";
27
27
  import {
28
28
  getCurrentTaskId,
29
29
  getEnvContext
30
- } from "./roy-agent-core-5apmk4qw.js";
30
+ } from "./roy-agent-core-jszgaevt.js";
31
31
  import {
32
32
  TracedAs,
33
33
  init_decorator,
34
34
  wrapFunction
35
- } from "./roy-agent-core-dsevjbck.js";
35
+ } from "./roy-agent-core-b599jgyd.js";
36
36
  import {
37
37
  createLogger,
38
38
  init_logger
@@ -1875,7 +1875,7 @@ __legacyDecorateClassTS([
1875
1875
  TracedAs("task.background.stopProgressReporter", { recordParams: false, recordResult: true, log: true })
1876
1876
  ], BackgroundTaskManager.prototype, "stopProgressReporter", null);
1877
1877
  __legacyDecorateClassTS([
1878
- TracedAs("delegate.executeWithAbort", { recordParams: true, recordResult: true, log: true })
1878
+ TracedAs("delegate.executeWithAbort", { recordParams: true, recordResult: false, log: true })
1879
1879
  ], BackgroundTaskManager.prototype, "executeWithAbort", null);
1880
1880
  __legacyDecorateClassTS([
1881
1881
  TracedAs("task.background.stopAllForParent", {
@@ -3,10 +3,11 @@ import {
3
3
  } from "./roy-agent-core-7hh0brvs.js";
4
4
  import {
5
5
  BaseComponent
6
- } from "./roy-agent-core-tdbv7ff4.js";
6
+ } from "./roy-agent-core-40xzbjtm.js";
7
7
  import {
8
- init_decorator
9
- } from "./roy-agent-core-dsevjbck.js";
8
+ init_decorator,
9
+ init_trace_filters
10
+ } from "./roy-agent-core-b599jgyd.js";
10
11
  import {
11
12
  createLogger,
12
13
  getTracerProvider,
@@ -417,5 +418,6 @@ function getTraceparentHeader() {
417
418
  // src/env/log-trace/index.ts
418
419
  init_logger();
419
420
  init_decorator();
421
+ init_trace_filters();
420
422
 
421
423
  export { getDefaultLogDir, getDefaultSpanDbPath, LogTraceConfigSchema, LogTraceComponent, injectToEnv, injectToEnvWithContext, injectToEnvFromCarrier, getTraceparentHeader };
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_decorator,
3
3
  wrapFunction
4
- } from "./roy-agent-core-dsevjbck.js";
4
+ } from "./roy-agent-core-b599jgyd.js";
5
5
 
6
6
  // src/env/task/plugins/fake-user-message-helper.ts
7
7
  init_decorator();
@@ -1,21 +1,21 @@
1
1
  import {
2
2
  LarkCardPatchNotifier,
3
3
  formatDurationMs
4
- } from "./roy-agent-core-j8e92gj8.js";
4
+ } from "./roy-agent-core-nntphgww.js";
5
5
  import {
6
6
  WorkflowHookPoints,
7
7
  init_workflow_hook_points
8
- } from "./roy-agent-core-9csa89jx.js";
8
+ } from "./roy-agent-core-r9qe0ghe.js";
9
9
  import {
10
10
  init_context
11
- } from "./roy-agent-core-k8b440n3.js";
11
+ } from "./roy-agent-core-16t0zfbk.js";
12
12
  import {
13
13
  getEnvContextOrEmpty
14
- } from "./roy-agent-core-5apmk4qw.js";
14
+ } from "./roy-agent-core-jszgaevt.js";
15
15
  import {
16
16
  TracedAs,
17
17
  init_decorator
18
- } from "./roy-agent-core-dsevjbck.js";
18
+ } from "./roy-agent-core-b599jgyd.js";
19
19
  import {
20
20
  createLogger,
21
21
  init_logger
@@ -6,7 +6,7 @@ import {
6
6
  } from "./roy-agent-core-7hh0brvs.js";
7
7
  import {
8
8
  BaseComponent
9
- } from "./roy-agent-core-tdbv7ff4.js";
9
+ } from "./roy-agent-core-40xzbjtm.js";
10
10
  import {
11
11
  createLogger,
12
12
  init_logger