@ai-setting/roy-agent-core 1.7.48 → 1.7.50

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 (87) hide show
  1. package/dist/config/index.js +7 -7
  2. package/dist/env/agent/index.js +10 -10
  3. package/dist/env/commands/index.js +7 -7
  4. package/dist/env/context/index.js +3 -3
  5. package/dist/env/debug/index.js +7 -7
  6. package/dist/env/event-source/index.js +17 -14
  7. package/dist/env/hook/index.js +9 -6
  8. package/dist/env/index.js +39 -34
  9. package/dist/env/llm/index.js +7 -7
  10. package/dist/env/log-trace/index.js +7 -7
  11. package/dist/env/mcp/index.js +7 -7
  12. package/dist/env/memory/index.js +11 -11
  13. package/dist/env/plugin/index.js +7 -7
  14. package/dist/env/prompt/index.js +8 -8
  15. package/dist/env/session/index.js +8 -7
  16. package/dist/env/skill/index.js +7 -7
  17. package/dist/env/task/delegate/index.js +8 -8
  18. package/dist/env/task/index.js +17 -17
  19. package/dist/env/task/plugins/index.js +10 -9
  20. package/dist/env/task/storage/index.js +2 -2
  21. package/dist/env/task/tools/index.js +3 -3
  22. package/dist/env/tool/built-in/index.js +2 -2
  23. package/dist/env/tool/index.js +8 -8
  24. package/dist/env/workflow/engine/index.js +13 -9
  25. package/dist/env/workflow/hooks/index.js +25 -0
  26. package/dist/env/workflow/index.js +20 -17
  27. package/dist/env/workflow/nodes/index.js +2 -2
  28. package/dist/env/workflow/plugins/index.js +18 -0
  29. package/dist/env/workflow/service/index.js +2 -2
  30. package/dist/env/workflow/storage/index.js +3 -3
  31. package/dist/env/workflow/tools/index.js +12 -11
  32. package/dist/env/workflow/utils/index.js +4 -4
  33. package/dist/index.js +80 -70
  34. package/dist/shared/@ai-setting/{roy-agent-core-0r90298w.js → roy-agent-core-0cfaqnz9.js} +1 -1
  35. package/dist/shared/@ai-setting/{roy-agent-core-5j4awbgc.js → roy-agent-core-1cv9j4dg.js} +3 -3
  36. package/dist/shared/@ai-setting/{roy-agent-core-v5vs1jby.js → roy-agent-core-2gay3sjt.js} +1 -1
  37. package/dist/shared/@ai-setting/{roy-agent-core-9cqpdrnk.js → roy-agent-core-2k4xffaa.js} +3 -3
  38. package/dist/shared/@ai-setting/{roy-agent-core-dabnevwe.js → roy-agent-core-35s1w7tc.js} +230 -96
  39. package/dist/shared/@ai-setting/{roy-agent-core-bjrtwfta.js → roy-agent-core-3tv1q6f2.js} +27 -11
  40. package/dist/shared/@ai-setting/{roy-agent-core-3j4by8rj.js → roy-agent-core-4z3rq5gw.js} +2 -2
  41. package/dist/shared/@ai-setting/{roy-agent-core-zbb3sk72.js → roy-agent-core-5apmk4qw.js} +1 -1
  42. package/dist/shared/@ai-setting/{roy-agent-core-jfptxs4f.js → roy-agent-core-6167phd4.js} +6 -2
  43. package/dist/shared/@ai-setting/{roy-agent-core-8nv07zgr.js → roy-agent-core-7evvpfwc.js} +1 -1
  44. package/dist/shared/@ai-setting/{roy-agent-core-vsrfzaze.js → roy-agent-core-7g03zkkb.js} +1 -1
  45. package/dist/shared/@ai-setting/{roy-agent-core-tm57tmds.js → roy-agent-core-8s9jd2qy.js} +1 -1
  46. package/dist/shared/@ai-setting/{roy-agent-core-4kbvfnn1.js → roy-agent-core-978b6wfx.js} +1 -1
  47. package/dist/shared/@ai-setting/roy-agent-core-9csa89jx.js +46 -0
  48. package/dist/shared/@ai-setting/{roy-agent-core-y1n63tse.js → roy-agent-core-9jzysq50.js} +2 -2
  49. package/dist/shared/@ai-setting/{roy-agent-core-4m02hnqf.js → roy-agent-core-ak4dc3kg.js} +1 -1
  50. package/dist/shared/@ai-setting/{roy-agent-core-rgpkygbc.js → roy-agent-core-athdr2m0.js} +1 -1
  51. package/dist/shared/@ai-setting/{roy-agent-core-83mk8wrn.js → roy-agent-core-avyd65je.js} +12 -6
  52. package/dist/shared/@ai-setting/{roy-agent-core-223v204d.js → roy-agent-core-cg9f4zch.js} +69 -4
  53. package/dist/shared/@ai-setting/{roy-agent-core-a9pbda78.js → roy-agent-core-dsevjbck.js} +38 -10
  54. package/dist/shared/@ai-setting/{roy-agent-core-4cj6hram.js → roy-agent-core-dv714bqh.js} +1 -1
  55. package/dist/shared/@ai-setting/{roy-agent-core-amp8qckb.js → roy-agent-core-dwx9hjwx.js} +1 -1
  56. package/dist/shared/@ai-setting/{roy-agent-core-d94ddn0r.js → roy-agent-core-f28va833.js} +8 -7
  57. package/dist/shared/@ai-setting/roy-agent-core-fs36xgcs.js +13 -0
  58. package/dist/shared/@ai-setting/{roy-agent-core-55hkeft7.js → roy-agent-core-fvs48d38.js} +26 -6
  59. package/dist/shared/@ai-setting/{roy-agent-core-nvcqp6p9.js → roy-agent-core-gpf2059p.js} +17 -13
  60. package/dist/shared/@ai-setting/{roy-agent-core-wn59p0zw.js → roy-agent-core-k8b440n3.js} +1 -1
  61. package/dist/shared/@ai-setting/{roy-agent-core-pd0exvnq.js → roy-agent-core-nde5gzta.js} +1 -1
  62. package/dist/shared/@ai-setting/{roy-agent-core-9qn92jhf.js → roy-agent-core-ne2t1pay.js} +2 -2
  63. package/dist/shared/@ai-setting/{roy-agent-core-y1fp2mgf.js → roy-agent-core-p8ak03s0.js} +3 -3
  64. package/dist/shared/@ai-setting/{roy-agent-core-6vbgswjw.js → roy-agent-core-q6twb0df.js} +1 -1
  65. package/dist/shared/@ai-setting/{roy-agent-core-zrgaemma.js → roy-agent-core-q9gnnv6v.js} +4 -4
  66. package/dist/shared/@ai-setting/{roy-agent-core-hxazjj4p.js → roy-agent-core-qamktze3.js} +1 -1
  67. package/dist/shared/@ai-setting/{roy-agent-core-54wzmvnb.js → roy-agent-core-qcspfszy.js} +11 -4
  68. package/dist/shared/@ai-setting/{roy-agent-core-p1p9mr8f.js → roy-agent-core-qm9jda8p.js} +1 -1
  69. package/dist/shared/@ai-setting/{roy-agent-core-4nnv0dze.js → roy-agent-core-rnwr39b0.js} +2 -2
  70. package/dist/shared/@ai-setting/{roy-agent-core-3b2ceffs.js → roy-agent-core-rpnjzztt.js} +51 -76
  71. package/dist/shared/@ai-setting/{roy-agent-core-yjqj3taz.js → roy-agent-core-rpwn590p.js} +13 -13
  72. package/dist/shared/@ai-setting/{roy-agent-core-za09t5g3.js → roy-agent-core-rx16h2m1.js} +12 -6
  73. package/dist/shared/@ai-setting/{roy-agent-core-ajtsk20z.js → roy-agent-core-s7jpkfm1.js} +75 -754
  74. package/dist/shared/@ai-setting/{roy-agent-core-ygnva439.js → roy-agent-core-skzjs973.js} +6 -5
  75. package/dist/shared/@ai-setting/{roy-agent-core-1rm32m5t.js → roy-agent-core-t37wbysj.js} +4 -4
  76. package/dist/shared/@ai-setting/{roy-agent-core-ead21w5c.js → roy-agent-core-tdbv7ff4.js} +5 -3
  77. package/dist/shared/@ai-setting/{roy-agent-core-333apxaa.js → roy-agent-core-tjg71zqp.js} +1 -1
  78. package/dist/shared/@ai-setting/{roy-agent-core-hkj5v9xq.js → roy-agent-core-vrsxhw9e.js} +1 -1
  79. package/dist/shared/@ai-setting/{roy-agent-core-7p5zf8ay.js → roy-agent-core-vy69rpxy.js} +13 -13
  80. package/dist/shared/@ai-setting/roy-agent-core-wxsgay02.js +302 -0
  81. package/dist/shared/@ai-setting/{roy-agent-core-yjjqm4ww.js → roy-agent-core-x8n1r7h4.js} +1 -1
  82. package/dist/shared/@ai-setting/{roy-agent-core-gy1zfe0d.js → roy-agent-core-yd21n6c7.js} +76 -13
  83. package/dist/shared/@ai-setting/{roy-agent-core-xyys5m1a.js → roy-agent-core-yhsssn86.js} +1 -1
  84. package/dist/shared/@ai-setting/roy-agent-core-zd077w51.js +1037 -0
  85. package/dist/shared/@ai-setting/{roy-agent-core-qvaqmj3f.js → roy-agent-core-zd3ddm4k.js} +1 -1
  86. package/dist/shared/@ai-setting/roy-agent-core-ze068vc9.js +37 -0
  87. package/package.json +1 -1
@@ -3,10 +3,10 @@ import {
3
3
  hasDecoratorNodes,
4
4
  init_node_registry_helper,
5
5
  registerDecoratorNodeType
6
- } from "./roy-agent-core-hkj5v9xq.js";
6
+ } from "./roy-agent-core-vrsxhw9e.js";
7
7
  import"./roy-agent-core-1ce3fqrk.js";
8
8
  import"./roy-agent-core-ddwa0n6h.js";
9
- import"./roy-agent-core-a9pbda78.js";
9
+ import"./roy-agent-core-dsevjbck.js";
10
10
  import"./roy-agent-core-8seq65bp.js";
11
11
  import"./roy-agent-core-jnszp0jq.js";
12
12
  import"./roy-agent-core-fs0mn2jk.js";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./roy-agent-core-7hh0brvs.js";
7
7
  import {
8
8
  BaseComponent
9
- } from "./roy-agent-core-ead21w5c.js";
9
+ } from "./roy-agent-core-tdbv7ff4.js";
10
10
  import {
11
11
  createLogger,
12
12
  init_logger
@@ -11,7 +11,7 @@ import {
11
11
  import {
12
12
  init_decorator,
13
13
  wrapFunction
14
- } from "./roy-agent-core-a9pbda78.js";
14
+ } from "./roy-agent-core-dsevjbck.js";
15
15
  import {
16
16
  createLogger,
17
17
  exports_tracer_provider,
@@ -1,25 +1,28 @@
1
1
  import {
2
2
  createAutoTaskPlugin
3
- } from "./roy-agent-core-ajtsk20z.js";
3
+ } from "./roy-agent-core-s7jpkfm1.js";
4
4
  import {
5
5
  ContextError,
6
6
  ErrorCodes
7
7
  } from "./roy-agent-core-ctdhjv68.js";
8
8
  import {
9
9
  BaseComponent
10
- } from "./roy-agent-core-ead21w5c.js";
10
+ } from "./roy-agent-core-tdbv7ff4.js";
11
+ import {
12
+ init_hook
13
+ } from "./roy-agent-core-qcspfszy.js";
11
14
  import {
12
15
  init_context
13
- } from "./roy-agent-core-wn59p0zw.js";
16
+ } from "./roy-agent-core-k8b440n3.js";
14
17
  import {
15
18
  getEnvContext,
16
19
  init_env_context,
17
20
  runWithEnvContextAsync
18
- } from "./roy-agent-core-zbb3sk72.js";
21
+ } from "./roy-agent-core-5apmk4qw.js";
19
22
  import {
20
23
  TracedAs,
21
24
  init_decorator
22
- } from "./roy-agent-core-a9pbda78.js";
25
+ } from "./roy-agent-core-dsevjbck.js";
23
26
  import {
24
27
  createLogger,
25
28
  init_logger
@@ -124,7 +127,9 @@ class BaseEnvironment extends BaseComponent {
124
127
  try {
125
128
  const promptComponent = this.getComponent("prompt");
126
129
  if (promptComponent) {
127
- const loadedPrompt = await promptComponent.getPrompt("default");
130
+ const loadedPrompt = await promptComponent.getPrompt("default", {}, {
131
+ agentType: "primary"
132
+ });
128
133
  if (loadedPrompt) {
129
134
  systemPrompt = loadedPrompt;
130
135
  promptSource = "PromptComponent";
@@ -593,6 +598,7 @@ __legacyDecorateClassTS([
593
598
  ], BaseEnvironment.prototype, "handleWorkflowAgentQuery", null);
594
599
 
595
600
  // src/env/index.ts
601
+ init_hook();
596
602
  init_context();
597
603
 
598
604
  export { generateId, generateDescendingId, BaseEnvironment };
@@ -1435,7 +1435,7 @@ outputs: [] # 输出定义(可空)
1435
1435
 
1436
1436
  **你不是** primary mediator(不像老的 workflow-agent),你只是 sub-agent,**不要**自己去做用户面对面的对话澄清。
1437
1437
 
1438
- ## 你的工具 (6 个, 严格白名单)
1438
+ ## 你的工具 (10 个, 严格白名单)
1439
1439
 
1440
1440
  | 工具 | 用途 |
1441
1441
  |------|------|
@@ -1445,9 +1445,15 @@ outputs: [] # 输出定义(可空)
1445
1445
  | \`workflow_tag_list\` | **查 tag 池,避免 tag 膨胀**(已有 \`code-review\` 时不要新增 \`review-workflow\`) |
1446
1446
  | \`workflow_validate\` | **必须**在 \`workflow_add\` 之前调用,直到返回 valid |
1447
1447
  | \`workflow_add\` | 注册新 workflow(需要 1-3 个 tags) |
1448
+ | \`bash\` | **仅用于契约真实性校验**(见阶段 4.5):\`ls\` 核对脚本真名、\`grep\` 核对输出标记、\`roy-agent debug trace/debug span\` 取证。**禁止**用它绕过 workflow 直接干活 |
1449
+ | \`read_file\` | 读脚本/测试文件内容,核对它真的输出你 grep 的标记 |
1450
+ | \`workflow_run\` | **构建后冒烟真跑**(见阶段 5.5,DoD 硬门槛) |
1451
+ | \`workflow_run_status\` | 轮询冒烟 run 的终态(completed / failed / timeout) |
1448
1452
 
1449
- > ⚠️ **你只有这 6 个工具**。不要用 bash、read_file、edit_file 等其他工具。
1450
- > 不要直接读 \`*.workflow.yaml\` 文件自己 parse(用 \`workflow_get\`)。
1453
+ > ⚠️ **你只有这 10 个工具**,不要使用 \`edit_file\` / \`write_file\` / \`delegate_task\` 等。
1454
+ > ⚠️ \`bash\` **只用于"核实事实"与"取证",绝不用于"替代 workflow 节点完成业务逻辑"** ——
1455
+ > 后者会让 workflow 变成一个空壳,是本 prompt 明令禁止的走捷径行为。
1456
+ > ⚠️ 不要直接读 \`*.workflow.yaml\` 文件自己 parse(用 \`workflow_get\`)。
1451
1457
 
1452
1458
  ## 多轮交互流程 (与 workflow-extract 的关键差异)
1453
1459
 
@@ -1481,6 +1487,24 @@ workflow-creator 是**多轮对话式**协作。每个阶段都可能需要 ask
1481
1487
 
1482
1488
  输出完整 YAML draft,参考以下最小化模板。
1483
1489
 
1490
+ ### 阶段 4.5: 输入契约真实性校验 (Contract Grounding) \uD83D\uDD0D
1491
+
1492
+ > 背景(真实事故):曾交付一个「validate 通过、注册成功,但一跑就假阳性 PASS」的 workflow ——
1493
+ > 脚本名拼接错(\`PY_TAG=312\` vs 磁盘 \`cp12\`)、回退脚本在容器内嵌套 docker 导致空跑、
1494
+ > 脚本硬编码 \`Total 99 PASS 99\` 被聚合节点当真值,最终 0/0/0 却报 PASS。
1495
+ > 根因:**validate 只看 DAG 结构,不看语义**。
1496
+
1497
+ 在把任何**文件路径 / 命令名 / 输出标记**写进 YAML 之前,**用 \`bash\` / \`read_file\` 核实它真的存在、真的匹配**:
1498
+
1499
+ - **路径契约**:形如 \`/tmp/xxx_\${VAR}.sh\` 的路径,必须把**变量代入后的最终字符串**与磁盘真实文件逐一比对
1500
+ (例:\`for v in 3.12 3.13; do ls /tmp/..._cp\${v//./}.sh; done\`)。
1501
+ 脚本名规律若是 \`cp12\` 而你拼出 \`cp312\` → 契约错误,必须改 YAML。
1502
+ - **输出标记契约**:workflow 里 grep 的标记(如 \`[PASS]\`)必须与测试脚本**真实输出**的标记完全一致
1503
+ (去脚本里核对它的输出格式,不要凭想象写标记)。
1504
+ - **执行环境契约**:确认脚本是「宿主机跑(内部 docker exec)」还是「容器内跑」——
1505
+ 把「宿主机用 docker 驱动」的脚本 \`docker cp\` 进容器再跑 = **必然空跑**,禁止。
1506
+ - 校验结论写进设计报告「契约校验」小节,注明每条契约的**核实命令 + 实际结果**。
1507
+
1484
1508
  ### 阶段 5: 迭代验证 (Iterative Validate) \uD83D\uDD01
1485
1509
 
1486
1510
  调用 \`workflow_validate\`:
@@ -1490,6 +1514,42 @@ workflow-creator 是**多轮对话式**协作。每个阶段都可能需要 ask
1490
1514
  - **最多迭代 8 次**,超过则停止并报告失败原因
1491
1515
  - ❌ 不要**跳过 validate** 直接 \`workflow_add\`
1492
1516
 
1517
+ ### 阶段 5.5: 端到端冒烟验证 (Smoke Run) \uD83D\uDEA8 完成硬门槛
1518
+
1519
+ > ⚠️ **\`workflow_validate\` 通过 ≠ workflow 可用。** 它只校验 DAG 结构
1520
+ > (重复节点 / 缺依赖 / 环 / 空节点 ID),**不校验**脚本路径、变量拼接、输出契约、测试是否真执行。
1521
+ > 你**必须**让 workflow 真的跑一次并拿到证据,否则**不算完成**。
1522
+
1523
+ **执行路径(你有 \`workflow_run\`):**
1524
+
1525
+ 1. \`workflow_run(name, input=<真实样例输入>)\` —— 用**真实输入**,不要用 \`echo ok\` 之类的桩
1526
+ 2. \`workflow_run_status(run_id)\` 轮询到**终态**(completed / failed / timeout)
1527
+ 3. **用 trace 取证**(这是判定"真的跑过"的唯一客观依据,不要只看工具返回值):
1528
+ - \`roy-agent debug trace <trace_id>\` —— 看整个 run 的 span 树:是否真的经过
1529
+ \`workflow.engine.runWorkflow → startNode → validateAndExecute → executeNode\`,
1530
+ 每个节点是否都执行到,有没有节点被跳过 / 直接失败
1531
+ - \`roy-agent debug span <span_id>\` —— 看**单个节点**的完整输入输出与错误
1532
+ (节点级排障用:\`workflow.executor.executeNode\` / \`workflow.tool.execute\` 等)
1533
+ - 拿不到 trace_id 时,用 \`bash\` 查最近 trace:\`roy-agent debug trace --list -n 5\`
1534
+ 4. 把 run 证据落盘并写 \`task_operation\`:\`run_id + trace_id + session_id + 各节点执行条数\`
1535
+
1536
+ **冒烟通过判据(全部满足才算通过):**
1537
+
1538
+ | 判据 | 说明 |
1539
+ |------|------|
1540
+ | ✅ run 终态 = completed | 不是 failed / timeout |
1541
+ | ✅ **每个节点都有 output 且非空** | 逐个检查;出现 \`command not found\` / \`Bad substitution\` / \`timeout\` 即失败 |
1542
+ | ✅ **真实执行条数 > 0** | 例:\`passed_count + failed_count + expected_count > 0\`;**严禁 0/0/0 判 PASS** |
1543
+ | ✅ 关键输入契约在运行中被**真实命中** | 例:日志出现 \`Test script: <真名>\`,而不是 fallback 警告分支 |
1544
+ | ✅ trace 里能看到**完整节点链路** | \`debug trace\` 中每个预期节点都出现且有耗时(非 0ms 跳过) |
1545
+ | ✅ run 证据落盘 | \`run_id + trace_id + session_id\` 写入 \`/tmp/<task>_smoke_evidence.json\` 与 task_operation |
1546
+
1547
+ **未通过冒烟 → 禁止 \`task_complete\`**:回到阶段 4 改 YAML,重跑,直到通过;或明确报告失败原因
1548
+ (**不得**用"应该没问题"之类的措辞声称通过)。
1549
+
1550
+ > \uD83D\uDEAB **绝不允许用 \`workflow update\` 绕过冒烟验证**(历史上真实节点版本 v1.1.0/v1.2.0 就是走
1551
+ > \`workflow update\` 注册的,完全绕过了 validate 与冒烟)。update 后**同样必须**重跑阶段 5 + 5.5。
1552
+
1493
1553
  ### 阶段 6: 注册 (Add) \uD83D\uDEA6
1494
1554
 
1495
1555
  validate 通过后:
@@ -1653,13 +1713,18 @@ outputs: [] # 输出定义(可空)
1653
1713
 
1654
1714
  ## 严格约束
1655
1715
 
1656
- - ✅ 只用 6 个 workflow_* 工具(白名单强制)
1716
+ - ✅ 只用 10 个被授予的工具(白名单强制)
1657
1717
  - ✅ validate **必须**在 add 之前
1718
+ - ✅ **add / update 之后必须端到端冒烟跑一次**(阶段 5.5),并附 trace 证据;否则不算完成
1658
1719
  - ✅ tags 1-3 个,优先复用已有 tag
1659
1720
  - ✅ 注册前再次确认用户同意
1721
+ - ✅ run 证据(run_id + trace_id + session_id + 执行条数)**必须落盘 + 写 task_operation**
1660
1722
  - ❌ 不要直接读 \`*.workflow.yaml\` 文件自己 parse(用 \`workflow_get\`)
1661
1723
  - ❌ 不要 \`delegate_task\` / \`stop_task\`(deniedTools 已禁,禁止递归委托)
1662
1724
  - ❌ 不要跳过 \`workflow_validate\`
1725
+ - ❌ 不要用 \`workflow update\` 绕过 validate / 冒烟
1726
+ - ❌ 不要用 \`bash\` 替代 workflow 节点完成业务逻辑(走捷径 = 交付空壳)
1727
+ - ❌ 不要凭"应该能跑"声称通过;**没有 trace / run 证据就不算跑过**
1663
1728
  - ❌ 不要自动 merge / push / tag
1664
1729
  - ❌ 不要硬编码大段 text(应引用 \`{{input.x}}\` 模板)`,
1665
1730
  "task-organizer": `
@@ -20,7 +20,8 @@ function Traced(options) {
20
20
  maxLogSize: options?.maxLogSize,
21
21
  paramFilter: options?.paramFilter,
22
22
  resultFilter: options?.resultFilter,
23
- flattenParamFilter: options?.flattenParamFilter
23
+ flattenParamFilter: options?.flattenParamFilter,
24
+ errorIf: options?.errorIf
24
25
  });
25
26
  return function(target, propertyKey, descriptor) {
26
27
  if (descriptor !== undefined && descriptor !== null && typeof descriptor === "object" && "value" in descriptor) {
@@ -88,6 +89,19 @@ function wrapFunction(fn, name, options) {
88
89
  }
89
90
  return maxLogSize > 0 && str.length > maxLogSize ? str.slice(0, maxLogSize) + " [TRUNCATED]" : str;
90
91
  };
92
+ const toDbValue = (obj) => {
93
+ if (obj === undefined)
94
+ return;
95
+ if (obj === null)
96
+ return null;
97
+ if (typeof obj === "string")
98
+ return obj;
99
+ try {
100
+ return JSON.parse(JSON.stringify(obj));
101
+ } catch (e) {
102
+ return `[Object with circular reference: ${e instanceof Error ? e.message : String(e)}]`;
103
+ }
104
+ };
91
105
  const TRACE_LOG_PREFIX = "[TRACE]";
92
106
  const getCallerLocation = () => {
93
107
  const originalLimit = Error.stackTraceLimit;
@@ -140,16 +154,16 @@ function wrapFunction(fn, name, options) {
140
154
  if (options?.recordParams !== false) {
141
155
  if (options?.paramFilter) {
142
156
  const filtered = options.paramFilter(args);
143
- attributes["params"] = truncate(filtered);
157
+ attributes["params"] = toDbValue(filtered);
144
158
  if (options?.flattenParamFilter && filtered && typeof filtered === "object" && !Array.isArray(filtered)) {
145
159
  for (const [key, value] of Object.entries(filtered)) {
146
160
  if (!(key in attributes)) {
147
- attributes[key] = truncate(value);
161
+ attributes[key] = toDbValue(value);
148
162
  }
149
163
  }
150
164
  }
151
165
  } else {
152
- attributes["params"] = truncate(args);
166
+ attributes["params"] = toDbValue(args);
153
167
  }
154
168
  }
155
169
  const callerLocation = getCallerLocation();
@@ -167,12 +181,19 @@ function wrapFunction(fn, name, options) {
167
181
  const filtered = options.resultFilter(resolved);
168
182
  if (filtered && typeof filtered === "object") {
169
183
  for (const [key, value] of Object.entries(filtered)) {
170
- span.setAttribute(key, truncate(value));
184
+ span.setAttribute(key, toDbValue(value));
171
185
  }
172
186
  }
173
187
  }
174
- span.setAttribute("result", JSON.stringify(truncate(resolved)));
175
- span.end(resolved);
188
+ span.setAttribute("result", JSON.stringify(toDbValue(resolved)));
189
+ const resultError = options?.errorIf ? options.errorIf(resolved) : undefined;
190
+ if (resultError) {
191
+ const err = resultError instanceof Error ? resultError : new Error(String(resultError));
192
+ span.setAttribute("error", err.message);
193
+ span.end(undefined, err);
194
+ } else {
195
+ span.end(resolved);
196
+ }
176
197
  }
177
198
  logFn("quit", options?.recordResult ? resolved : undefined, callerLocation);
178
199
  return resolved;
@@ -190,12 +211,19 @@ function wrapFunction(fn, name, options) {
190
211
  const filtered = options.resultFilter(result);
191
212
  if (filtered && typeof filtered === "object") {
192
213
  for (const [key, value] of Object.entries(filtered)) {
193
- span.setAttribute(key, truncate(value));
214
+ span.setAttribute(key, toDbValue(value));
194
215
  }
195
216
  }
196
217
  }
197
- span.setAttribute("result", JSON.stringify(truncate(result)));
198
- span.end(result);
218
+ span.setAttribute("result", JSON.stringify(toDbValue(result)));
219
+ const syncResultError = options?.errorIf ? options.errorIf(result) : undefined;
220
+ if (syncResultError) {
221
+ const err = syncResultError instanceof Error ? syncResultError : new Error(String(syncResultError));
222
+ span.setAttribute("error", err.message);
223
+ span.end(undefined, err);
224
+ } else {
225
+ span.end(result);
226
+ }
199
227
  }
200
228
  logFn("quit", options?.recordResult ? result : undefined, callerLocation);
201
229
  return result;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_decorator,
3
3
  wrapFunction
4
- } from "./roy-agent-core-a9pbda78.js";
4
+ } from "./roy-agent-core-dsevjbck.js";
5
5
 
6
6
  // src/env/task/plugins/fake-user-message-helper.ts
7
7
  init_decorator();
@@ -10,7 +10,7 @@ import {
10
10
  } from "./roy-agent-core-7hh0brvs.js";
11
11
  import {
12
12
  BaseComponent
13
- } from "./roy-agent-core-ead21w5c.js";
13
+ } from "./roy-agent-core-tdbv7ff4.js";
14
14
  import {
15
15
  createLogger,
16
16
  init_logger
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  builtInPrompts
3
- } from "./roy-agent-core-223v204d.js";
3
+ } from "./roy-agent-core-cg9f4zch.js";
4
4
  import {
5
5
  getXDGPath
6
6
  } from "./roy-agent-core-qxnbvgwe.js";
@@ -10,14 +10,14 @@ import {
10
10
  } from "./roy-agent-core-7hh0brvs.js";
11
11
  import {
12
12
  BaseComponent
13
- } from "./roy-agent-core-ead21w5c.js";
13
+ } from "./roy-agent-core-tdbv7ff4.js";
14
14
  import {
15
15
  createHook
16
- } from "./roy-agent-core-54wzmvnb.js";
16
+ } from "./roy-agent-core-qcspfszy.js";
17
17
  import {
18
18
  globalHookManager,
19
19
  init_global_hook_manager
20
- } from "./roy-agent-core-3j4by8rj.js";
20
+ } from "./roy-agent-core-4z3rq5gw.js";
21
21
  import {
22
22
  createLogger,
23
23
  init_logger
@@ -432,7 +432,7 @@ class PromptComponent extends BaseComponent {
432
432
  size() {
433
433
  return this.prompts.size;
434
434
  }
435
- async getPrompt(name, variables = {}) {
435
+ async getPrompt(name, variables = {}, context) {
436
436
  const defaultName = this.getPromptConfig("defaultName", "default");
437
437
  const targetName = this.has(name) ? name : defaultName;
438
438
  const entry = this.prompts.get(targetName);
@@ -440,14 +440,15 @@ class PromptComponent extends BaseComponent {
440
440
  logger2.warn(`[PromptComponent] Prompt not found: ${name}, using fallback`);
441
441
  return "You are a helpful assistant.";
442
442
  }
443
- return this.render(entry.content, variables, { name: targetName });
443
+ return this.render(entry.content, variables, { ...context, name: targetName });
444
444
  }
445
445
  async render(content, variables = {}, context) {
446
446
  const hookContext = {
447
447
  name: context?.name || "anonymous",
448
448
  originalContent: content,
449
449
  renderedContent: content,
450
- variables
450
+ variables,
451
+ ...context?.agentType ? { agentType: context.agentType } : {}
451
452
  };
452
453
  await globalHookManager.execute(PromptHookPoints.BEFORE_RENDER, hookContext);
453
454
  hookContext.renderedContent = this.renderer.render(hookContext.originalContent, variables);
@@ -0,0 +1,13 @@
1
+ import {
2
+ init_workflow_hook_points
3
+ } from "./roy-agent-core-9csa89jx.js";
4
+ import {
5
+ __esm
6
+ } from "./roy-agent-core-fs0mn2jk.js";
7
+
8
+ // src/env/workflow/hooks/index.ts
9
+ var init_hooks = __esm(() => {
10
+ init_workflow_hook_points();
11
+ });
12
+
13
+ export { init_hooks };
@@ -11,20 +11,20 @@ import {
11
11
  } from "./roy-agent-core-7hh0brvs.js";
12
12
  import {
13
13
  BaseComponent
14
- } from "./roy-agent-core-ead21w5c.js";
14
+ } from "./roy-agent-core-tdbv7ff4.js";
15
15
  import {
16
16
  ToolHookPoints,
17
17
  globalHookManager,
18
18
  init_global_hook_manager
19
- } from "./roy-agent-core-3j4by8rj.js";
19
+ } from "./roy-agent-core-4z3rq5gw.js";
20
20
  import {
21
21
  getCurrentTaskId,
22
22
  init_env_context
23
- } from "./roy-agent-core-zbb3sk72.js";
23
+ } from "./roy-agent-core-5apmk4qw.js";
24
24
  import {
25
25
  TracedAs,
26
26
  init_decorator
27
- } from "./roy-agent-core-a9pbda78.js";
27
+ } from "./roy-agent-core-dsevjbck.js";
28
28
  import {
29
29
  createLogger,
30
30
  init_logger
@@ -194,6 +194,14 @@ var TOOL_CONFIG_REGISTRATION = {
194
194
 
195
195
  // src/env/tool/tool-component.ts
196
196
  init_workflow_hil();
197
+
198
+ // src/env/constants.ts
199
+ var TOOL_UNAVAILABLE_ERROR_RE = /^Tool (?:not found|disabled):/;
200
+ function isToolUnavailableError(message) {
201
+ return typeof message === "string" && TOOL_UNAVAILABLE_ERROR_RE.test(message);
202
+ }
203
+
204
+ // src/env/tool/tool-component.ts
197
205
  init_env_context();
198
206
  var logger = createLogger("tool");
199
207
  var configComponentInstance = null;
@@ -447,6 +455,7 @@ class ToolComponent extends BaseComponent {
447
455
  const { name, args, context, skipHooks } = request;
448
456
  const registration = this.registry.getTool(name);
449
457
  if (!registration) {
458
+ logger.error(`[ToolComponent] Tool not found: "${name}" — ` + `registered tools: [${this.registry.listTools().map((t) => t.name).join(", ")}]`);
450
459
  return {
451
460
  success: false,
452
461
  output: "",
@@ -571,7 +580,18 @@ class ToolComponent extends BaseComponent {
571
580
  }
572
581
  }
573
582
  __legacyDecorateClassTS([
574
- TracedAs("tool.component.execute", { recordParams: true, recordResult: true, log: true })
583
+ TracedAs("tool.component.execute", {
584
+ recordParams: true,
585
+ recordResult: true,
586
+ log: true,
587
+ errorIf: (result) => {
588
+ const err = result?.error;
589
+ if (result?.success === false && isToolUnavailableError(err)) {
590
+ return new Error(String(err));
591
+ }
592
+ return;
593
+ }
594
+ })
575
595
  ], ToolComponent.prototype, "execute", null);
576
596
  var ToolComponentConfigSchema = z.object({
577
597
  toolsDir: z.string().optional(),
@@ -591,4 +611,4 @@ var ToolComponentConfigSchema = z.object({
591
611
  }).default({})
592
612
  });
593
613
 
594
- export { ToolRegistry, ToolValidator, setToolConfigComponent, getMaxOutputSize, truncateOutputInline, ToolComponent };
614
+ export { ToolRegistry, ToolValidator, isToolUnavailableError, setToolConfigComponent, getMaxOutputSize, truncateOutputInline, ToolComponent };
@@ -4,35 +4,35 @@ import {
4
4
  } from "./roy-agent-core-tbrn9wdm.js";
5
5
  import {
6
6
  getSharedEventStore
7
- } from "./roy-agent-core-xyys5m1a.js";
7
+ } from "./roy-agent-core-yhsssn86.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-223v204d.js";
13
+ } from "./roy-agent-core-cg9f4zch.js";
14
14
  import {
15
15
  DEFAULT_SUBAGENT_PROMPT
16
- } from "./roy-agent-core-za09t5g3.js";
16
+ } from "./roy-agent-core-rx16h2m1.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-3j4by8rj.js";
23
+ } from "./roy-agent-core-4z3rq5gw.js";
24
24
  import {
25
25
  init_context
26
- } from "./roy-agent-core-wn59p0zw.js";
26
+ } from "./roy-agent-core-k8b440n3.js";
27
27
  import {
28
28
  getCurrentTaskId,
29
29
  getEnvContext
30
- } from "./roy-agent-core-zbb3sk72.js";
30
+ } from "./roy-agent-core-5apmk4qw.js";
31
31
  import {
32
32
  TracedAs,
33
33
  init_decorator,
34
34
  wrapFunction
35
- } from "./roy-agent-core-a9pbda78.js";
35
+ } from "./roy-agent-core-dsevjbck.js";
36
36
  import {
37
37
  createLogger,
38
38
  init_logger
@@ -1129,13 +1129,13 @@ class BackgroundTaskManager {
1129
1129
  if (!reusedSession) {
1130
1130
  throw new Error(`Sub session not found for resume: ${existingSubSessionId}`);
1131
1131
  }
1132
- const createdBy = reusedSession?.info?.metadata?.created_by;
1132
+ const createdBy = reusedSession?.metadata?.created_by;
1133
1133
  if (createdBy && createdBy !== "subagent") {
1134
1134
  logger3.warn(`[BackgroundTaskManager] Session ${existingSubSessionId} was not created by a sub-agent (created_by=${createdBy}); reusing anyway`);
1135
1135
  }
1136
1136
  subSession = reusedSession;
1137
1137
  try {
1138
- const existingMeta = reusedSession?.info?.metadata || {};
1138
+ const existingMeta = reusedSession?.metadata ?? {};
1139
1139
  await sessionComponent.update(existingSubSessionId, {
1140
1140
  metadata: {
1141
1141
  ...existingMeta,
@@ -1250,7 +1250,7 @@ class BackgroundTaskManager {
1250
1250
  throw new Error(`Sub session not found: ${task.subSessionId}`);
1251
1251
  }
1252
1252
  const taskRegistry = this.processRegistries.get(taskId);
1253
- const result = await this.executeWithAbort(subSession, prompt, timeoutMs, taskId, abortController?.signal, task.similarTaskIds, taskRegistry, () => abortController?.abort());
1253
+ const result = await this.executeWithAbort(subSession, prompt, timeoutMs, taskId, abortController?.signal, task.similarTaskIds, taskRegistry, () => abortController?.abort(), task.subagentType);
1254
1254
  if (abortController?.signal.aborted) {
1255
1255
  logger3.info(`[BackgroundTaskManager] Task was aborted`, { taskId });
1256
1256
  return;
@@ -1416,12 +1416,16 @@ class BackgroundTaskManager {
1416
1416
  this.progressTimers.delete(taskId);
1417
1417
  }
1418
1418
  }
1419
- async executeWithAbort(subSession, prompt, timeoutMs, bgTaskId, signal, similarTaskIds, processRegistry, abortTask) {
1420
- const metadata = subSession.info?.metadata || {};
1419
+ async executeWithAbort(subSession, prompt, timeoutMs, bgTaskId, signal, similarTaskIds, processRegistry, abortTask, explicitSubagentType) {
1420
+ const metadata = subSession?.metadata ?? {};
1421
1421
  const taskId = metadata.task_id;
1422
1422
  const taskDescription = metadata.task_description || "";
1423
1423
  const sessionId = subSession.id;
1424
- const subagentType = metadata.subagent_type || "general";
1424
+ const metaSubagentType = metadata.subagent_type;
1425
+ const subagentType = metaSubagentType || explicitSubagentType || "general";
1426
+ if (!metaSubagentType && !explicitSubagentType) {
1427
+ logger3.warn(`[delegate] subagent_type unresolved (no session metadata, no explicit value) — falling back to "general". sessionId=${sessionId}`);
1428
+ }
1425
1429
  const agentComponent = this.env?.getComponent?.("agent");
1426
1430
  const registry = agentComponent?.getRegistry?.();
1427
1431
  const resolved = await resolveSubAgentConfig(subagentType, { registry });
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  init_env_context,
3
3
  init_env_event
4
- } from "./roy-agent-core-zbb3sk72.js";
4
+ } from "./roy-agent-core-5apmk4qw.js";
5
5
  import {
6
6
  __esm
7
7
  } from "./roy-agent-core-fs0mn2jk.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TracedAs,
3
3
  init_decorator
4
- } from "./roy-agent-core-a9pbda78.js";
4
+ } from "./roy-agent-core-dsevjbck.js";
5
5
  import {
6
6
  __legacyDecorateClassTS
7
7
  } from "./roy-agent-core-fs0mn2jk.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  TagRepository
3
- } from "./roy-agent-core-pd0exvnq.js";
4
- import"./roy-agent-core-a9pbda78.js";
3
+ } from "./roy-agent-core-nde5gzta.js";
4
+ import"./roy-agent-core-dsevjbck.js";
5
5
  import"./roy-agent-core-8seq65bp.js";
6
6
  import"./roy-agent-core-jnszp0jq.js";
7
7
  import"./roy-agent-core-fs0mn2jk.js";
@@ -21,17 +21,17 @@ import {
21
21
  } from "./roy-agent-core-7hh0brvs.js";
22
22
  import {
23
23
  BaseComponent
24
- } from "./roy-agent-core-ead21w5c.js";
24
+ } from "./roy-agent-core-tdbv7ff4.js";
25
25
  import {
26
26
  LLMHookPoints,
27
27
  globalHookManager,
28
28
  init_global_hook_manager
29
- } from "./roy-agent-core-3j4by8rj.js";
29
+ } from "./roy-agent-core-4z3rq5gw.js";
30
30
  import {
31
31
  TracedAs,
32
32
  init_decorator,
33
33
  wrapFunction
34
- } from "./roy-agent-core-a9pbda78.js";
34
+ } from "./roy-agent-core-dsevjbck.js";
35
35
  import {
36
36
  createLogger,
37
37
  init_logger
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DAGManager,
3
3
  init_dag_manager
4
- } from "./roy-agent-core-tm57tmds.js";
4
+ } from "./roy-agent-core-8s9jd2qy.js";
5
5
 
6
6
  // src/env/workflow/utils/validate-workflow-definition.ts
7
7
  init_dag_manager();
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  isValidSessionId
3
- } from "./roy-agent-core-gy1zfe0d.js";
3
+ } from "./roy-agent-core-yd21n6c7.js";
4
4
  import {
5
5
  TAG_MAX_COUNT,
6
6
  TAG_MIN_COUNT
7
- } from "./roy-agent-core-8nv07zgr.js";
7
+ } from "./roy-agent-core-7evvpfwc.js";
8
8
  import {
9
9
  validateWorkflowDefinition
10
- } from "./roy-agent-core-6vbgswjw.js";
10
+ } from "./roy-agent-core-q6twb0df.js";
11
11
  import {
12
12
  getCurrentBgTaskId
13
13
  } from "./roy-agent-core-c1v263jn.js";
@@ -18,7 +18,7 @@ import {
18
18
  import {
19
19
  TracedAs,
20
20
  init_decorator
21
- } from "./roy-agent-core-a9pbda78.js";
21
+ } from "./roy-agent-core-dsevjbck.js";
22
22
  import {
23
23
  createLogger,
24
24
  init_logger
@@ -8,7 +8,7 @@ import {
8
8
  } from "./roy-agent-core-qxnbvgwe.js";
9
9
  import {
10
10
  BaseComponent
11
- } from "./roy-agent-core-ead21w5c.js";
11
+ } from "./roy-agent-core-tdbv7ff4.js";
12
12
  import {
13
13
  __require
14
14
  } from "./roy-agent-core-fs0mn2jk.js";