@ai-setting/roy-agent-core 1.7.72 → 1.7.76

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 (91) hide show
  1. package/dist/env/agent/agent-component.js +6 -6
  2. package/dist/env/agent/agent-registry.d.ts +4 -1
  3. package/dist/env/agent/index.js +6 -6
  4. package/dist/env/error-reply.d.ts +46 -0
  5. package/dist/env/error-reply.js +3 -1
  6. package/dist/env/event-source/event-source-handlers.js +13 -12
  7. package/dist/env/event-source/index.js +14 -13
  8. package/dist/env/index.js +31 -30
  9. package/dist/env/llm/index.js +2 -2
  10. package/dist/env/llm/orphan-toolcall.d.ts +107 -0
  11. package/dist/env/plugin/index.js +3 -3
  12. package/dist/env/prompt/index.js +4 -3
  13. package/dist/env/prompt/prompts-index.d.ts +27 -3
  14. package/dist/env/session/index.js +4 -4
  15. package/dist/env/session/storage/index.js +3 -3
  16. package/dist/env/task/backend/index.js +9 -1
  17. package/dist/env/task/delegate/delegate-tool.d.ts +8 -0
  18. package/dist/env/task/delegate/delegate-tool.js +5 -4
  19. package/dist/env/task/delegate/index.js +5 -4
  20. package/dist/env/task/hooks/contexts.d.ts +12 -1
  21. package/dist/env/task/hooks/task-hook-points.d.ts +8 -3
  22. package/dist/env/task/index.d.ts +1 -0
  23. package/dist/env/task/index.js +17 -7
  24. package/dist/env/task/mcp/index.js +3 -2
  25. package/dist/env/task/plugins/index.d.ts +3 -0
  26. package/dist/env/task/plugins/index.js +33 -9
  27. package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +61 -0
  28. package/dist/env/task/plugins/lark-card-patch-notifier.js +6 -2
  29. package/dist/env/task/plugins/lark-cli-task-notify-plugin.d.ts +42 -0
  30. package/dist/env/task/prompt/index.js +2 -1
  31. package/dist/env/task/prompt/task-discipline.d.ts +9 -3
  32. package/dist/env/task/task-component.d.ts +79 -0
  33. package/dist/env/task/tools/cancel-tool.d.ts +36 -0
  34. package/dist/env/task/tools/completion-copy.d.ts +92 -0
  35. package/dist/env/task/tools/index.d.ts +2 -0
  36. package/dist/env/task/tools/index.js +7 -2
  37. package/dist/env/task/tools/pre-complete-tool.d.ts +32 -0
  38. package/dist/env/task/tools/task-types.d.ts +71 -17
  39. package/dist/env/task/types.d.ts +13 -1
  40. package/dist/env/tool/built-in/compact-session-tool.d.ts +120 -0
  41. package/dist/env/tool/built-in/index.d.ts +2 -0
  42. package/dist/env/tool/built-in/index.js +6 -2
  43. package/dist/env/tool/index.js +4 -4
  44. package/dist/env/workflow/engine/index.js +6 -6
  45. package/dist/env/workflow/index.js +15 -13
  46. package/dist/env/workflow/plugins/index.js +2 -2
  47. package/dist/env/workflow/tools/ask-user-tool.d.ts +88 -0
  48. package/dist/env/workflow/tools/index.js +11 -9
  49. package/dist/env/workflow/tools/run-workflow.d.ts +2 -2
  50. package/dist/env/workflow/types/index.js +2 -2
  51. package/dist/env/workflow/types/workflow-hil.d.ts +25 -1
  52. package/dist/env/workflow/utils/index.js +5 -5
  53. package/dist/index.d.ts +1 -1
  54. package/dist/index.js +43 -33
  55. package/dist/shared/@ai-setting/{roy-agent-core-sm0sf6sb.js → roy-agent-core-0qyrk5k0.js} +2 -2
  56. package/dist/shared/@ai-setting/{roy-agent-core-kmbct9yg.js → roy-agent-core-0snm5hc5.js} +1 -1
  57. package/dist/shared/@ai-setting/{roy-agent-core-yr1mryb8.js → roy-agent-core-1v4g0d4x.js} +1 -1
  58. package/dist/shared/@ai-setting/{roy-agent-core-rxb00gjm.js → roy-agent-core-264qexac.js} +1 -1
  59. package/dist/shared/@ai-setting/roy-agent-core-2akfd64z.js +374 -0
  60. package/dist/shared/@ai-setting/{roy-agent-core-skyc30qx.js → roy-agent-core-3fh1f7s7.js} +2 -2
  61. package/dist/shared/@ai-setting/roy-agent-core-4rtg69cn.js +26 -0
  62. package/dist/shared/@ai-setting/{roy-agent-core-add1zqsh.js → roy-agent-core-6cy43nss.js} +22 -1
  63. package/dist/shared/@ai-setting/{roy-agent-core-vah6g5yx.js → roy-agent-core-6rh8k6ba.js} +5 -5
  64. package/dist/shared/@ai-setting/{roy-agent-core-kpg25s2q.js → roy-agent-core-8ez6mccb.js} +4 -2
  65. package/dist/shared/@ai-setting/{roy-agent-core-yhwxpj12.js → roy-agent-core-9vxh6f8h.js} +233 -16
  66. package/dist/shared/@ai-setting/{roy-agent-core-7qvw65jt.js → roy-agent-core-aa2j7bk9.js} +11 -8
  67. package/dist/shared/@ai-setting/{roy-agent-core-sjr1kmfz.js → roy-agent-core-acj8ag08.js} +1 -1
  68. package/dist/shared/@ai-setting/{roy-agent-core-mds8tqd0.js → roy-agent-core-cgtq6427.js} +1 -1
  69. package/dist/shared/@ai-setting/{roy-agent-core-34jz9mgh.js → roy-agent-core-cmprygrp.js} +1 -1
  70. package/dist/shared/@ai-setting/{roy-agent-core-wr7mv7k3.js → roy-agent-core-cxy143m4.js} +1 -1
  71. package/dist/shared/@ai-setting/{roy-agent-core-pakhchy7.js → roy-agent-core-ddyk1rc0.js} +1 -1
  72. package/dist/shared/@ai-setting/{roy-agent-core-attpry6g.js → roy-agent-core-dqxec05w.js} +4 -3
  73. package/dist/shared/@ai-setting/{roy-agent-core-vm8h5zyj.js → roy-agent-core-ed233k5z.js} +1 -1
  74. package/dist/shared/@ai-setting/{roy-agent-core-jrj30vq3.js → roy-agent-core-er070zjq.js} +1 -1
  75. package/dist/shared/@ai-setting/{roy-agent-core-40rv283c.js → roy-agent-core-fghc2m8z.js} +152 -2
  76. package/dist/shared/@ai-setting/{roy-agent-core-5gw0qa8m.js → roy-agent-core-ghnagzrh.js} +557 -92
  77. package/dist/shared/@ai-setting/{roy-agent-core-4jjwewvw.js → roy-agent-core-m46fe3x4.js} +41 -30
  78. package/dist/shared/@ai-setting/{roy-agent-core-e25xkv53.js → roy-agent-core-mkc3zshb.js} +3 -1
  79. package/dist/shared/@ai-setting/{roy-agent-core-hfyfavp3.js → roy-agent-core-mww0mnd9.js} +231 -27
  80. package/dist/shared/@ai-setting/{roy-agent-core-46rv4d7d.js → roy-agent-core-nmx9934r.js} +92 -2
  81. package/dist/shared/@ai-setting/{roy-agent-core-1w9y7mxj.js → roy-agent-core-p3zv1mx5.js} +1 -1
  82. package/dist/shared/@ai-setting/{roy-agent-core-jgb3bb42.js → roy-agent-core-q5r75vev.js} +17 -8
  83. package/dist/shared/@ai-setting/{roy-agent-core-y12kyxwa.js → roy-agent-core-t3rrb959.js} +33 -9
  84. package/dist/shared/@ai-setting/{roy-agent-core-dt104qa1.js → roy-agent-core-v85n42ve.js} +1 -1
  85. package/dist/shared/@ai-setting/{roy-agent-core-gr48c89p.js → roy-agent-core-v87njmq7.js} +3 -3
  86. package/dist/shared/@ai-setting/{roy-agent-core-7sj9xs9c.js → roy-agent-core-vffccgf6.js} +252 -25
  87. package/dist/shared/@ai-setting/{roy-agent-core-2gzt2q8c.js → roy-agent-core-z43aj03k.js} +134 -29
  88. package/dist/shared/@ai-setting/roy-agent-core-zycadbpx.js +662 -0
  89. package/package.json +1 -1
  90. package/dist/shared/@ai-setting/roy-agent-core-1p6syv85.js +0 -1083
  91. package/dist/shared/@ai-setting/roy-agent-core-58804s3j.js +0 -155
@@ -838,6 +838,126 @@ import { createGoogleGenerativeAI } from "@ai-sdk/google";
838
838
  import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
839
839
  init_logger();
840
840
 
841
+ // src/env/llm/orphan-toolcall.ts
842
+ var ORPHAN_PLACEHOLDER_PREFIX = "[Tool result missing: run interrupted]";
843
+ function toolNameOf(tc) {
844
+ return tc.function?.name || tc.name || "unknown";
845
+ }
846
+ function extractPendingEvent(msg, events) {
847
+ const added = [];
848
+ const removed = [];
849
+ const toolCalls = msg.toolCalls;
850
+ if (Array.isArray(toolCalls)) {
851
+ for (const tc of toolCalls) {
852
+ if (tc?.id)
853
+ added.push({ id: tc.id, name: toolNameOf(tc) });
854
+ }
855
+ }
856
+ const content = msg.content;
857
+ if (Array.isArray(content)) {
858
+ for (const part of content) {
859
+ if (!part)
860
+ continue;
861
+ if (part.type === "tool-call" && typeof part.toolCallId === "string") {
862
+ added.push({
863
+ id: part.toolCallId,
864
+ name: typeof part.toolName === "string" ? part.toolName : "unknown"
865
+ });
866
+ }
867
+ if (part.type === "tool-result" && typeof part.toolCallId === "string") {
868
+ removed.push(part.toolCallId);
869
+ }
870
+ }
871
+ }
872
+ if (msg.role === "tool" && typeof msg.toolCallId === "string") {
873
+ removed.push(msg.toolCallId);
874
+ }
875
+ events.push({ added, removed });
876
+ }
877
+ function collectOrphans(roles, events) {
878
+ const pending = new Map;
879
+ const orphans = [];
880
+ const reported = new Set;
881
+ for (let index = 0;index < roles.length; index++) {
882
+ const { added, removed } = events[index];
883
+ for (const id of removed)
884
+ pending.delete(id);
885
+ for (const { id, name } of added) {
886
+ if (!pending.has(id))
887
+ pending.set(id, name);
888
+ }
889
+ const role = roles[index];
890
+ if ((role === "user" || role === "system") && pending.size > 0) {
891
+ for (const [id, name] of pending) {
892
+ if (!reported.has(id)) {
893
+ reported.add(id);
894
+ orphans.push({ toolCallId: id, toolName: name, messageIndex: index });
895
+ }
896
+ }
897
+ pending.clear();
898
+ }
899
+ }
900
+ for (const [id, name] of pending) {
901
+ if (!reported.has(id)) {
902
+ reported.add(id);
903
+ orphans.push({
904
+ toolCallId: id,
905
+ toolName: name,
906
+ messageIndex: roles.length
907
+ });
908
+ }
909
+ }
910
+ return orphans;
911
+ }
912
+ function repairOrphanSdkMessages(messages, options) {
913
+ const events = [];
914
+ const roles = [];
915
+ for (const msg of messages) {
916
+ roles.push(msg.role);
917
+ extractPendingEvent(msg, events);
918
+ }
919
+ const orphans = collectOrphans(roles, events);
920
+ if (orphans.length === 0) {
921
+ return { messages, orphans: [], repairedCount: 0 };
922
+ }
923
+ const reason = options?.reason ?? "context limit or crash";
924
+ const value = JSON.stringify({ error: `${ORPHAN_PLACEHOLDER_PREFIX} ${reason}` });
925
+ const byIndex = new Map;
926
+ for (const orphan of orphans) {
927
+ const list = byIndex.get(orphan.messageIndex) ?? [];
928
+ list.push(orphan);
929
+ byIndex.set(orphan.messageIndex, list);
930
+ }
931
+ const result = [];
932
+ const endGroup = byIndex.get(messages.length);
933
+ const placeholder = (orphan) => ({
934
+ role: "tool",
935
+ content: [
936
+ {
937
+ type: "tool-result",
938
+ toolCallId: orphan.toolCallId,
939
+ toolName: orphan.toolName,
940
+ output: { type: "text", value }
941
+ }
942
+ ]
943
+ });
944
+ messages.forEach((msg, index) => {
945
+ const group = byIndex.get(index);
946
+ if (group) {
947
+ for (const orphan of group) {
948
+ result.push(placeholder(orphan));
949
+ }
950
+ }
951
+ result.push(msg);
952
+ });
953
+ if (endGroup) {
954
+ for (const orphan of endGroup) {
955
+ result.push(placeholder(orphan));
956
+ }
957
+ }
958
+ return { messages: result, orphans, repairedCount: orphans.length };
959
+ }
960
+
841
961
  // src/env/llm/llm-cache.ts
842
962
  function isOpenAICompatibleProvider(providerName) {
843
963
  return providerName === "openai-compatible" || providerName === "openai" || providerName.startsWith("minimax") || providerName === "deepseek" || providerName.startsWith("deepseek") || providerName === "glm" || providerName.startsWith("glm");
@@ -1207,6 +1327,24 @@ function convertToSDKMessages(messages, options) {
1207
1327
  };
1208
1328
  }
1209
1329
  if (msg.role === "tool") {
1330
+ if (!msg.toolCallId && Array.isArray(msg.content)) {
1331
+ const part = msg.content.find((p) => p?.type === "tool-result" && typeof p.toolCallId === "string");
1332
+ if (part) {
1333
+ const convertedPart = {
1334
+ role: "tool",
1335
+ content: [{
1336
+ type: "tool-result",
1337
+ toolCallId: part.toolCallId,
1338
+ toolName: part.toolName || "unknown",
1339
+ output: {
1340
+ type: "text",
1341
+ value: typeof part.output === "string" ? part.output : JSON.stringify(part.output ?? "")
1342
+ }
1343
+ }]
1344
+ };
1345
+ return convertedPart;
1346
+ }
1347
+ }
1210
1348
  if (!msg.toolCallId) {
1211
1349
  logger3.warn("Tool message missing toolCallId", { msg });
1212
1350
  }
@@ -1410,6 +1548,12 @@ async function invoke(config, options, ctx) {
1410
1548
  sessionId: options.context?.sessionId,
1411
1549
  provider: providerId
1412
1550
  });
1551
+ const orphanRepair = repairOrphanSdkMessages(messages, {
1552
+ reason: "repaired before AI SDK fallback (Task #4992 defence 2)"
1553
+ });
1554
+ if (orphanRepair.repairedCount > 0) {
1555
+ logger3.warn(`[invoke] Repaired ${orphanRepair.repairedCount} orphan tool-call(s) before AI SDK fallback: ` + orphanRepair.orphans.map((o) => o.toolCallId).join(", "));
1556
+ }
1413
1557
  const toolCallIds = new Set;
1414
1558
  const assistantToolCalls = [];
1415
1559
  const toolResultIds = [];
@@ -1457,7 +1601,7 @@ async function invoke(config, options, ctx) {
1457
1601
  }
1458
1602
  const streamTextOptions = {
1459
1603
  model: provider.languageModel(modelId),
1460
- messages,
1604
+ messages: orphanRepair.messages,
1461
1605
  tools,
1462
1606
  temperature: providerOptions.temperature,
1463
1607
  maxTokens: providerOptions.maxTokens,
@@ -1704,6 +1848,12 @@ async function invokeNonStream(config, options, ctx) {
1704
1848
  sessionId: options.context?.sessionId,
1705
1849
  provider: providerId
1706
1850
  });
1851
+ const orphanRepair = repairOrphanSdkMessages(messages, {
1852
+ reason: "repaired before AI SDK generateText (Task #4992 defence 2)"
1853
+ });
1854
+ if (orphanRepair.repairedCount > 0) {
1855
+ logger3.warn(`[invokeNonStream] Repaired ${orphanRepair.repairedCount} orphan tool-call(s): ` + orphanRepair.orphans.map((o) => o.toolCallId).join(", "));
1856
+ }
1707
1857
  const tools = options.tools && options.tools.length > 0 ? convertToolsToSDK(options.tools, providerId) : undefined;
1708
1858
  const providerOptions = generateProviderOptions(providerId, {
1709
1859
  temperature: options.temperature,
@@ -1713,7 +1863,7 @@ async function invokeNonStream(config, options, ctx) {
1713
1863
  const genTextFn = generateText;
1714
1864
  const result = await genTextFn({
1715
1865
  model: provider.languageModel(modelId),
1716
- messages,
1866
+ messages: orphanRepair.messages,
1717
1867
  tools,
1718
1868
  temperature: providerOptions.temperature,
1719
1869
  maxTokens: providerOptions.maxTokens,