dominds 1.13.2 → 1.15.2

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 (200) hide show
  1. package/dist/bootstrap/global-dialog-event-broadcaster.d.ts +18 -0
  2. package/dist/bootstrap/global-dialog-event-broadcaster.js +81 -0
  3. package/dist/dialog-fork.js +13 -12
  4. package/dist/dialog.d.ts +61 -50
  5. package/dist/dialog.js +284 -78
  6. package/dist/docs/dialog-system.md +12 -0
  7. package/dist/docs/dialog-system.zh.md +12 -0
  8. package/dist/docs/dominds-terminology.md +17 -0
  9. package/dist/docs/issues/global-dialog-event-broadcaster-missing.md +128 -0
  10. package/dist/docs/llm-provider-isolation.md +35 -0
  11. package/dist/docs/llm-provider-isolation.zh.md +35 -0
  12. package/dist/llm/client.d.ts +2 -1
  13. package/dist/llm/defaults.yaml +118 -4
  14. package/dist/llm/gen/anthropic.js +2 -4
  15. package/dist/llm/gen/codex.d.ts +11 -0
  16. package/dist/llm/gen/codex.js +41 -31
  17. package/dist/llm/gen/failure-classifier.js +17 -0
  18. package/dist/llm/gen/mock.js +45 -21
  19. package/dist/llm/gen/openai-compatible.d.ts +2 -0
  20. package/dist/llm/gen/openai-compatible.js +43 -38
  21. package/dist/llm/gen/openai.d.ts +3 -1
  22. package/dist/llm/gen/openai.js +888 -71
  23. package/dist/llm/gen/tool-call-context.d.ts +7 -2
  24. package/dist/llm/gen/tool-call-context.js +55 -13
  25. package/dist/llm/gen.d.ts +60 -3
  26. package/dist/llm/kernel-driver/context.js +1 -1
  27. package/dist/llm/kernel-driver/drive.js +374 -348
  28. package/dist/llm/kernel-driver/flow.js +3 -3
  29. package/dist/llm/kernel-driver/guardrails.d.ts +1 -1
  30. package/dist/llm/kernel-driver/guardrails.js +4 -4
  31. package/dist/llm/kernel-driver/runtime.js +11 -29
  32. package/dist/llm/kernel-driver/subdialog.js +56 -5
  33. package/dist/llm/kernel-driver/tellask-special.d.ts +38 -12
  34. package/dist/llm/kernel-driver/tellask-special.js +489 -180
  35. package/dist/llm/kernel-driver/types.d.ts +1 -1
  36. package/dist/persistence.d.ts +30 -62
  37. package/dist/persistence.js +978 -986
  38. package/dist/priming.js +398 -365
  39. package/dist/recovery/reply-special.js +3 -3
  40. package/dist/runtime/inter-dialog-format.d.ts +1 -1
  41. package/dist/runtime/inter-dialog-format.js +1 -1
  42. package/dist/runtime/reply-prompt-copy.js +4 -4
  43. package/dist/server/setup-routes.js +26 -5
  44. package/dist/server/snippets-routes.d.ts +1 -0
  45. package/dist/server/snippets-routes.js +20 -9
  46. package/dist/server/websocket-handler.js +58 -25
  47. package/dist/shared/utils/fbr.js +12 -8
  48. package/dist/shared/utils/inter-dialog-format.js +6 -4
  49. package/dist/team.d.ts +24 -13
  50. package/dist/team.js +123 -32
  51. package/dist/tool.d.ts +26 -0
  52. package/dist/tool.js +97 -0
  53. package/dist/tools/team_mgmt.js +18 -0
  54. package/package.json +2 -2
  55. package/webapp/dist/assets/{_basePickBy-CBOtd63g.js → _basePickBy-DsirmCgI.js} +3 -3
  56. package/webapp/dist/assets/_basePickBy-DsirmCgI.js.map +1 -0
  57. package/webapp/dist/assets/{_baseUniq-mfoKz4Wm.js → _baseUniq-tR6G8loB.js} +2 -2
  58. package/webapp/dist/assets/_baseUniq-tR6G8loB.js.map +1 -0
  59. package/webapp/dist/assets/{arc-Dq0WZLyu.js → arc-CzxpASkZ.js} +2 -2
  60. package/webapp/dist/assets/arc-CzxpASkZ.js.map +1 -0
  61. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-CNmygmp3.js → architectureDiagram-2XIMDMQ5-BSH7H5oI.js} +26 -8
  62. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-BSH7H5oI.js.map +1 -0
  63. package/webapp/dist/assets/{blockDiagram-VD42YOAC-DvE0lybt.js → blockDiagram-WCTKOSBZ-DpLIr7yO.js} +187 -170
  64. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-DpLIr7yO.js.map +1 -0
  65. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CR7zJ2_u.js → c4Diagram-IC4MRINW-WuYKgWfY.js} +4 -4
  66. package/webapp/dist/assets/c4Diagram-IC4MRINW-WuYKgWfY.js.map +1 -0
  67. package/webapp/dist/assets/{channel-DrTrnYx4.js → channel-B-v9dqLN.js} +2 -2
  68. package/webapp/dist/assets/channel-B-v9dqLN.js.map +1 -0
  69. package/webapp/dist/assets/{chunk-4BX2VUAB-CVuJEIeN.js → chunk-4BX2VUAB-MtFUfKZy.js} +2 -2
  70. package/webapp/dist/assets/chunk-4BX2VUAB-MtFUfKZy.js.map +1 -0
  71. package/webapp/dist/assets/{chunk-55IACEB6-BxUoXApB.js → chunk-55IACEB6-rY9AJdzj.js} +2 -2
  72. package/webapp/dist/assets/chunk-55IACEB6-rY9AJdzj.js.map +1 -0
  73. package/webapp/dist/assets/{chunk-FMBD7UC4-TX-LVAaV.js → chunk-FMBD7UC4-B-RtOs7e.js} +2 -2
  74. package/webapp/dist/assets/chunk-FMBD7UC4-B-RtOs7e.js.map +1 -0
  75. package/webapp/dist/assets/{chunk-TZMSLE5B-Cw689yRl.js → chunk-JSJVCQXG-Da1d3uS4.js} +14 -6
  76. package/webapp/dist/assets/chunk-JSJVCQXG-Da1d3uS4.js.map +1 -0
  77. package/webapp/dist/assets/{chunk-QN33PNHL-D1uiKlOO.js → chunk-KX2RTZJC-DH9UrpuG.js} +2 -2
  78. package/webapp/dist/assets/chunk-KX2RTZJC-DH9UrpuG.js.map +1 -0
  79. package/webapp/dist/assets/{chunk-DI55MBZ5-SAhxUTqQ.js → chunk-NQ4KR5QH-CK365lrr.js} +9 -7
  80. package/webapp/dist/assets/chunk-NQ4KR5QH-CK365lrr.js.map +1 -0
  81. package/webapp/dist/assets/{chunk-QZHKN3VN-BxuV0Oba.js → chunk-QZHKN3VN-BCaWPGDm.js} +2 -2
  82. package/webapp/dist/assets/chunk-QZHKN3VN-BCaWPGDm.js.map +1 -0
  83. package/webapp/dist/assets/{chunk-B4BG7PRW-DpMa3-9L.js → chunk-WL4C6EOR-DDCnEwft.js} +171 -121
  84. package/webapp/dist/assets/chunk-WL4C6EOR-DDCnEwft.js.map +1 -0
  85. package/webapp/dist/assets/{classDiagram-2ON5EDUG-BTTGianr.js → classDiagram-VBA2DB6C-CvMBU4WA.js} +7 -6
  86. package/webapp/dist/assets/classDiagram-VBA2DB6C-CvMBU4WA.js.map +1 -0
  87. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-BTTGianr.js → classDiagram-v2-RAHNMMFH-CvMBU4WA.js} +7 -6
  88. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-CvMBU4WA.js.map +1 -0
  89. package/webapp/dist/assets/{clone-Dk8cAI3I.js → clone-r98jR0MC.js} +2 -2
  90. package/webapp/dist/assets/clone-r98jR0MC.js.map +1 -0
  91. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BjJnzB2N.js → cose-bilkent-S5V4N54A-t6J60Ogk.js} +2 -2
  92. package/webapp/dist/assets/cose-bilkent-S5V4N54A-t6J60Ogk.js.map +1 -0
  93. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  94. package/webapp/dist/assets/{dagre-6UL2VRFP-VF-xGhAf.js → dagre-KLK3FWXG-BlqmY2DV.js} +7 -7
  95. package/webapp/dist/assets/dagre-KLK3FWXG-BlqmY2DV.js.map +1 -0
  96. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  97. package/webapp/dist/assets/{diagram-PSM6KHXK-Ba5U0oRY.js → diagram-E7M64L7V-FwCHeIUD.js} +10 -10
  98. package/webapp/dist/assets/diagram-E7M64L7V-FwCHeIUD.js.map +1 -0
  99. package/webapp/dist/assets/{diagram-QEK2KX5R-DoYCnEw_.js → diagram-IFDJBPK2-NhtmkuZG.js} +9 -8
  100. package/webapp/dist/assets/diagram-IFDJBPK2-NhtmkuZG.js.map +1 -0
  101. package/webapp/dist/assets/{diagram-S2PKOQOG-CkK4SRyE.js → diagram-P4PSJMXO-B9FcmokX.js} +8 -8
  102. package/webapp/dist/assets/diagram-P4PSJMXO-B9FcmokX.js.map +1 -0
  103. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-DkI5eYww.js → erDiagram-INFDFZHY-DHKmWvtB.js} +96 -75
  104. package/webapp/dist/assets/erDiagram-INFDFZHY-DHKmWvtB.js.map +1 -0
  105. package/webapp/dist/assets/{flowDiagram-NV44I4VS-wOdPUQ7Y.js → flowDiagram-PKNHOUZH-C7Zi8I7T.js} +98 -81
  106. package/webapp/dist/assets/flowDiagram-PKNHOUZH-C7Zi8I7T.js.map +1 -0
  107. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-BtRWgkUH.js → ganttDiagram-A5KZAMGK-Cv2T8tz_.js} +28 -3
  108. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-Cv2T8tz_.js.map +1 -0
  109. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-Bsz7u1vi.js → gitGraphDiagram-K3NZZRJ6-DztaipJU.js} +38 -46
  110. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-DztaipJU.js.map +1 -0
  111. package/webapp/dist/assets/graph-C5yf62Vs.js +782 -0
  112. package/webapp/dist/assets/graph-C5yf62Vs.js.map +1 -0
  113. package/webapp/dist/assets/{index-xvYYeHuy.css → index-YaxF76or.css} +1 -1
  114. package/webapp/dist/assets/{index-rYmIohM_.js → index-hve5MWPs.js} +1603 -1415
  115. package/webapp/dist/assets/index-hve5MWPs.js.map +1 -0
  116. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-BMaxCvH5.js → infoDiagram-LFFYTUFH-VgsbBPZP.js} +7 -7
  117. package/webapp/dist/assets/infoDiagram-LFFYTUFH-VgsbBPZP.js.map +1 -0
  118. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  119. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-C7j3YWdw.js +966 -0
  120. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-C7j3YWdw.js.map +1 -0
  121. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-ejyerzmG.js → journeyDiagram-4ABVD52K-OO8sev-Y.js} +5 -5
  122. package/webapp/dist/assets/journeyDiagram-4ABVD52K-OO8sev-Y.js.map +1 -0
  123. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-CYj35TEs.js → kanban-definition-K7BYSVSG-DiYCC1Ig.js} +5 -3
  124. package/webapp/dist/assets/kanban-definition-K7BYSVSG-DiYCC1Ig.js.map +1 -0
  125. package/webapp/dist/assets/{layout-7Ql4zmuL.js → layout-DdZSgGdu.js} +5 -5
  126. package/webapp/dist/assets/layout-DdZSgGdu.js.map +1 -0
  127. package/webapp/dist/assets/{linear-CVmgVPuZ.js → linear-7-aHtaFi.js} +2 -2
  128. package/webapp/dist/assets/linear-7-aHtaFi.js.map +1 -0
  129. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-DOpxjGVo.js → mindmap-definition-YRQLILUH-IG3I-RdD.js} +7 -5
  130. package/webapp/dist/assets/mindmap-definition-YRQLILUH-IG3I-RdD.js.map +1 -0
  131. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  132. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-CLQjpmAG.js → pieDiagram-SKSYHLDU-z68KJT5r.js} +8 -8
  133. package/webapp/dist/assets/pieDiagram-SKSYHLDU-z68KJT5r.js.map +1 -0
  134. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-ClD_bz7z.js → quadrantDiagram-337W2JSQ-DaENWdO6.js} +3 -3
  135. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DaENWdO6.js.map +1 -0
  136. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-DOpb-TWH.js → requirementDiagram-Z7DCOOCP-ROTFv4sa.js} +16 -6
  137. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-ROTFv4sa.js.map +1 -0
  138. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-D8Hsj3yx.js → sankeyDiagram-WA2Y5GQK-CK7qtpzw.js} +2 -2
  139. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CK7qtpzw.js.map +1 -0
  140. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-CFMNjBER.js → sequenceDiagram-2WXFIKYE-R5lDySeI.js} +601 -201
  141. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-R5lDySeI.js.map +1 -0
  142. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-BQeDlw0P.js → stateDiagram-RAJIS63D-sr7msF5U.js} +9 -9
  143. package/webapp/dist/assets/stateDiagram-RAJIS63D-sr7msF5U.js.map +1 -0
  144. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-DscX61Rs.js → stateDiagram-v2-FVOUBMTO-X663liwS.js} +5 -5
  145. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-X663liwS.js.map +1 -0
  146. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BcXPSTiw.js → timeline-definition-YZTLITO2-Bw0TdG26.js} +3 -3
  147. package/webapp/dist/assets/timeline-definition-YZTLITO2-Bw0TdG26.js.map +1 -0
  148. package/webapp/dist/assets/{treemap-GDKQZRPO-BBr4UV0Z.js → treemap-KZPCXAKY-D_sjKwI7.js} +37 -24
  149. package/webapp/dist/assets/treemap-KZPCXAKY-D_sjKwI7.js.map +1 -0
  150. package/webapp/dist/assets/vennDiagram-LZ73GAT5-DhlHIHid.js +2487 -0
  151. package/webapp/dist/assets/vennDiagram-LZ73GAT5-DhlHIHid.js.map +1 -0
  152. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-CS5RAtQE.js → xychartDiagram-JWTSCODW-C65ESjTc.js} +4 -4
  153. package/webapp/dist/assets/xychartDiagram-JWTSCODW-C65ESjTc.js.map +1 -0
  154. package/webapp/dist/index.html +2 -2
  155. package/webapp/dist/assets/_basePickBy-CBOtd63g.js.map +0 -1
  156. package/webapp/dist/assets/_baseUniq-mfoKz4Wm.js.map +0 -1
  157. package/webapp/dist/assets/arc-Dq0WZLyu.js.map +0 -1
  158. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-CNmygmp3.js.map +0 -1
  159. package/webapp/dist/assets/blockDiagram-VD42YOAC-DvE0lybt.js.map +0 -1
  160. package/webapp/dist/assets/c4Diagram-YG6GDRKO-CR7zJ2_u.js.map +0 -1
  161. package/webapp/dist/assets/channel-DrTrnYx4.js.map +0 -1
  162. package/webapp/dist/assets/chunk-4BX2VUAB-CVuJEIeN.js.map +0 -1
  163. package/webapp/dist/assets/chunk-55IACEB6-BxUoXApB.js.map +0 -1
  164. package/webapp/dist/assets/chunk-B4BG7PRW-DpMa3-9L.js.map +0 -1
  165. package/webapp/dist/assets/chunk-DI55MBZ5-SAhxUTqQ.js.map +0 -1
  166. package/webapp/dist/assets/chunk-FMBD7UC4-TX-LVAaV.js.map +0 -1
  167. package/webapp/dist/assets/chunk-QN33PNHL-D1uiKlOO.js.map +0 -1
  168. package/webapp/dist/assets/chunk-QZHKN3VN-BxuV0Oba.js.map +0 -1
  169. package/webapp/dist/assets/chunk-TZMSLE5B-Cw689yRl.js.map +0 -1
  170. package/webapp/dist/assets/classDiagram-2ON5EDUG-BTTGianr.js.map +0 -1
  171. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-BTTGianr.js.map +0 -1
  172. package/webapp/dist/assets/clone-Dk8cAI3I.js.map +0 -1
  173. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BjJnzB2N.js.map +0 -1
  174. package/webapp/dist/assets/dagre-6UL2VRFP-VF-xGhAf.js.map +0 -1
  175. package/webapp/dist/assets/diagram-PSM6KHXK-Ba5U0oRY.js.map +0 -1
  176. package/webapp/dist/assets/diagram-QEK2KX5R-DoYCnEw_.js.map +0 -1
  177. package/webapp/dist/assets/diagram-S2PKOQOG-CkK4SRyE.js.map +0 -1
  178. package/webapp/dist/assets/erDiagram-Q2GNP2WA-DkI5eYww.js.map +0 -1
  179. package/webapp/dist/assets/flowDiagram-NV44I4VS-wOdPUQ7Y.js.map +0 -1
  180. package/webapp/dist/assets/ganttDiagram-JELNMOA3-BtRWgkUH.js.map +0 -1
  181. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-Bsz7u1vi.js.map +0 -1
  182. package/webapp/dist/assets/graph-DAMkuTbn.js +0 -425
  183. package/webapp/dist/assets/graph-DAMkuTbn.js.map +0 -1
  184. package/webapp/dist/assets/index-rYmIohM_.js.map +0 -1
  185. package/webapp/dist/assets/infoDiagram-HS3SLOUP-BMaxCvH5.js.map +0 -1
  186. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-ejyerzmG.js.map +0 -1
  187. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CYj35TEs.js.map +0 -1
  188. package/webapp/dist/assets/layout-7Ql4zmuL.js.map +0 -1
  189. package/webapp/dist/assets/linear-CVmgVPuZ.js.map +0 -1
  190. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-DOpxjGVo.js.map +0 -1
  191. package/webapp/dist/assets/pieDiagram-ADFJNKIX-CLQjpmAG.js.map +0 -1
  192. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-ClD_bz7z.js.map +0 -1
  193. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DOpb-TWH.js.map +0 -1
  194. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-D8Hsj3yx.js.map +0 -1
  195. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-CFMNjBER.js.map +0 -1
  196. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-BQeDlw0P.js.map +0 -1
  197. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-DscX61Rs.js.map +0 -1
  198. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BcXPSTiw.js.map +0 -1
  199. package/webapp/dist/assets/treemap-GDKQZRPO-BBr4UV0Z.js.map +0 -1
  200. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CS5RAtQE.js.map +0 -1
@@ -1,11 +1,15 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.isTellaskSpecialFunctionName = isTellaskSpecialFunctionName;
3
+ exports.isTellaskCallFunctionName = isTellaskCallFunctionName;
4
4
  exports.loadLatestActiveTellaskReplyDirective = loadLatestActiveTellaskReplyDirective;
5
5
  exports.deliverTellaskBackReplyFromDirective = deliverTellaskBackReplyFromDirective;
6
6
  exports.recoverPendingReplyTellaskCalls = recoverPendingReplyTellaskCalls;
7
- exports.classifyTellaskSpecialFunctionCalls = classifyTellaskSpecialFunctionCalls;
8
- exports.executeTellaskSpecialCalls = executeTellaskSpecialCalls;
7
+ exports.resolveTellaskFunctionCalls = resolveTellaskFunctionCalls;
8
+ exports.formatTellaskInvalidCallResult = formatTellaskInvalidCallResult;
9
+ exports.formatPendingTellaskFuncResultContent = formatPendingTellaskFuncResultContent;
10
+ exports.formatResolvedAskHumanResultContent = formatResolvedAskHumanResultContent;
11
+ exports.executeTellaskCalls = executeTellaskCalls;
12
+ exports.processTellaskFunctionRound = processTellaskFunctionRound;
9
13
  const util_1 = require("util");
10
14
  const storage_1 = require("@longrun-ai/kernel/types/storage");
11
15
  const id_1 = require("@longrun-ai/kernel/utils/id");
@@ -33,7 +37,8 @@ const TELLASK_SPECIAL_FUNCTION_NAMES = [
33
37
  'askHuman',
34
38
  'freshBootsReasoning',
35
39
  ];
36
- function isTellaskSpecialFunctionName(name) {
40
+ const MULTIPLE_ASKHUMAN_CALLS_ERROR = '不允许一轮多次调用 askHuman,必须单次调用问所有问题。 Do not call askHuman multiple times in one round; ask all questions in a single askHuman call.';
41
+ function isTellaskCallFunctionName(name) {
37
42
  return TELLASK_SPECIAL_FUNCTION_NAMES.includes(name);
38
43
  }
39
44
  function isReplyTellaskCallName(name) {
@@ -156,17 +161,39 @@ async function deliverTellaskBackReplyFromDirective(args) {
156
161
  deliveryMode: args.deliveryMode,
157
162
  language: (0, work_language_1.getWorkLanguage)(),
158
163
  });
159
- await targetDialog.receiveTellaskResponse(args.dlg.agentId, 'tellaskBack', undefined, args.directive.tellaskContent, 'completed', args.dlg.id, {
164
+ const replyMirror = await targetDialog.receiveTellaskResponse(args.dlg.agentId, 'tellaskBack', undefined, args.directive.tellaskContent, 'completed', args.dlg.id, {
160
165
  response,
161
166
  agentId: args.dlg.agentId,
162
167
  callId: args.directive.targetCallId,
163
168
  originMemberId: targetDialog.agentId,
164
169
  });
170
+ await targetDialog.addChatMessages(replyMirror);
165
171
  await reviveDialogIfUnblocked(targetDialog, args.callbacks, 'reply_tellask_back_delivered');
166
172
  }
167
- function isReplyTellaskSpecialCallRecord(record) {
173
+ function isReplyTellaskCallRecord(record) {
168
174
  return isReplyTellaskCallName(record.name);
169
175
  }
176
+ function parseReplyTellaskCallRecord(record) {
177
+ const parsed = parseTellaskCall({
178
+ type: 'func_call_msg',
179
+ role: 'assistant',
180
+ genseq: record.genseq,
181
+ id: record.id,
182
+ name: record.name,
183
+ arguments: record.rawArgumentsText,
184
+ });
185
+ if (!parsed.ok) {
186
+ throw new Error(`reply recovery invariant violation: invalid persisted raw arguments for ${record.name} (callId=${record.id})`);
187
+ }
188
+ switch (parsed.value.callName) {
189
+ case 'replyTellask':
190
+ case 'replyTellaskSessionless':
191
+ case 'replyTellaskBack':
192
+ return parsed.value;
193
+ default:
194
+ throw new Error(`reply recovery invariant violation: unexpected persisted call type ${parsed.value.callName} (callId=${record.id})`);
195
+ }
196
+ }
170
197
  function formatReplyRecoveryFailureResult(args) {
171
198
  return (0, work_language_1.getWorkLanguage)() === 'zh'
172
199
  ? `恢复重试 \`${args.callName}\` 失败:${args.errorText}`
@@ -181,8 +208,8 @@ async function recoverPendingReplyTellaskCalls(args) {
181
208
  const resolvedReplyCallIds = new Set();
182
209
  const replyCalls = [];
183
210
  for (const event of events) {
184
- if (event.type === 'func_result_record') {
185
- const callId = event.id.trim();
211
+ if (event.type === 'func_result_record' || event.type === 'tellask_result_record') {
212
+ const callId = event.type === 'func_result_record' ? event.id.trim() : event.callId.trim();
186
213
  if (callId !== '') {
187
214
  funcResultIds.add(callId);
188
215
  }
@@ -195,10 +222,10 @@ async function recoverPendingReplyTellaskCalls(args) {
195
222
  }
196
223
  continue;
197
224
  }
198
- if (event.type !== 'tellask_special_call_record') {
225
+ if (event.type !== 'tellask_call_record') {
199
226
  continue;
200
227
  }
201
- if (!isReplyTellaskSpecialCallRecord(event)) {
228
+ if (!isReplyTellaskCallRecord(event)) {
202
229
  continue;
203
230
  }
204
231
  replyCalls.push(event);
@@ -209,6 +236,7 @@ async function recoverPendingReplyTellaskCalls(args) {
209
236
  if (callId === '' || funcResultIds.has(callId)) {
210
237
  continue;
211
238
  }
239
+ const parsedCall = parseReplyTellaskCallRecord(call);
212
240
  if (resolvedReplyCallIds.has(callId)) {
213
241
  await args.dlg.receiveFuncResult({
214
242
  type: 'func_result_msg',
@@ -218,7 +246,7 @@ async function recoverPendingReplyTellaskCalls(args) {
218
246
  name: call.name,
219
247
  content: formatReplyFuncResult({
220
248
  replyCallName: call.name,
221
- replyContent: call.replyContent,
249
+ replyContent: parsedCall.replyContent,
222
250
  }),
223
251
  });
224
252
  funcResultIds.add(callId);
@@ -228,11 +256,7 @@ async function recoverPendingReplyTellaskCalls(args) {
228
256
  try {
229
257
  const execution = await executeReplyTellaskCall({
230
258
  dlg: args.dlg,
231
- call: {
232
- callId: call.id,
233
- callName: call.name,
234
- replyContent: call.replyContent,
235
- },
259
+ call: parsedCall,
236
260
  callbacks: args.callbacks,
237
261
  });
238
262
  for (const message of execution.messages) {
@@ -240,8 +264,13 @@ async function recoverPendingReplyTellaskCalls(args) {
240
264
  throw new Error(`reply recovery invariant violation: unexpected message type ${message.type}`);
241
265
  }
242
266
  await args.dlg.receiveFuncResult({
243
- ...message,
267
+ type: 'func_result_msg',
268
+ role: 'tool',
244
269
  genseq: call.genseq,
270
+ id: message.id,
271
+ name: message.name,
272
+ content: message.content,
273
+ contentItems: message.contentItems,
245
274
  });
246
275
  }
247
276
  funcResultIds.add(callId);
@@ -353,8 +382,8 @@ function normalizeTeammateTargetAgentId(rawTarget) {
353
382
  }
354
383
  return { ok: true, value: withoutAt };
355
384
  }
356
- function parseTellaskSpecialCall(call) {
357
- if (!isTellaskSpecialFunctionName(call.name)) {
385
+ function parseTellaskCall(call) {
386
+ if (!isTellaskCallFunctionName(call.name)) {
358
387
  return { ok: false, error: `unsupported tellask special function '${call.name}'` };
359
388
  }
360
389
  const argsResult = parseFuncCallArgsObject(call);
@@ -487,13 +516,16 @@ function parseTellaskSpecialCall(call) {
487
516
  }
488
517
  }
489
518
  }
490
- function classifyTellaskSpecialFunctionCalls(funcCalls, options) {
491
- const specialCalls = [];
519
+ function getRawArgumentsText(call) {
520
+ return typeof call.arguments === 'string' ? call.arguments : JSON.stringify(call.arguments ?? {});
521
+ }
522
+ function resolveTellaskFunctionCalls(funcCalls, options) {
523
+ const validCalls = [];
524
+ const invalidCalls = [];
492
525
  const normalCalls = [];
493
- const parseIssues = [];
494
526
  const allowed = options?.allowedSpecials ?? null;
495
527
  for (const call of funcCalls) {
496
- if (!isTellaskSpecialFunctionName(call.name)) {
528
+ if (!isTellaskCallFunctionName(call.name)) {
497
529
  normalCalls.push(call);
498
530
  continue;
499
531
  }
@@ -501,14 +533,147 @@ function classifyTellaskSpecialFunctionCalls(funcCalls, options) {
501
533
  normalCalls.push(call);
502
534
  continue;
503
535
  }
504
- const parsed = parseTellaskSpecialCall(call);
536
+ const rawArgumentsText = getRawArgumentsText(call);
537
+ const parsed = parseTellaskCall(call);
505
538
  if (!parsed.ok) {
506
- parseIssues.push({ call, error: parsed.error });
539
+ invalidCalls.push({
540
+ originalCall: call,
541
+ error: parsed.error,
542
+ rawArgumentsText,
543
+ contextArguments: rawArgumentsText,
544
+ });
507
545
  continue;
508
546
  }
509
- specialCalls.push(parsed.value);
547
+ validCalls.push({
548
+ originalCall: call,
549
+ call: parsed.value,
550
+ });
551
+ }
552
+ return { validCalls, invalidCalls, normalCalls };
553
+ }
554
+ function formatTellaskInvalidCallResult(args) {
555
+ return {
556
+ type: 'func_result_msg',
557
+ id: args.call.id,
558
+ name: args.call.name,
559
+ content: args.call.name === 'askHuman' && args.error === MULTIPLE_ASKHUMAN_CALLS_ERROR
560
+ ? args.error
561
+ : `Invalid arguments for tellask special function '${args.call.name}': ${args.error}`,
562
+ role: 'tool',
563
+ genseq: args.call.genseq,
564
+ };
565
+ }
566
+ function formatPendingTellaskFuncResultContent(name, startedAtMs) {
567
+ const language = (0, work_language_1.getWorkLanguage)();
568
+ const elapsed = (() => {
569
+ if (startedAtMs === null) {
570
+ return language === 'zh' ? '未知时长' : 'unknown elapsed time';
571
+ }
572
+ const elapsedMs = Math.max(0, Date.now() - startedAtMs);
573
+ const elapsedSec = Math.floor(elapsedMs / 1000);
574
+ return language === 'zh' ? `${elapsedSec} 秒` : `${elapsedSec}s`;
575
+ })();
576
+ if (name === 'askHuman') {
577
+ return language === 'zh'
578
+ ? `Q4H 仍在等待人类回复,已持续 ${elapsed}。`
579
+ : `Q4H is still waiting for human reply (elapsed ${elapsed}).`;
580
+ }
581
+ return language === 'zh'
582
+ ? `支线对话仍在进行中,已持续 ${elapsed}。`
583
+ : `Sideline dialog is still running (elapsed ${elapsed}).`;
584
+ }
585
+ function formatResolvedAskHumanResultContent() {
586
+ return (0, work_language_1.getWorkLanguage)() === 'zh'
587
+ ? 'Q4H 已结束等待状态,请参考 askHuman 结果气泡。'
588
+ : 'Q4H wait is resolved; refer to the askHuman result bubble.';
589
+ }
590
+ function buildPendingTellaskFuncResult(args) {
591
+ return {
592
+ type: 'func_result_msg',
593
+ role: 'tool',
594
+ genseq: args.genseq,
595
+ id: args.callId,
596
+ name: args.callName,
597
+ content: formatPendingTellaskFuncResultContent(args.callName, null),
598
+ };
599
+ }
600
+ async function persistTellaskFuncResult(dlg, result) {
601
+ if (!isTellaskCallFunctionName(result.name)) {
602
+ throw new Error(`persistTellaskFuncResult invariant violation: ${result.name} is not tellask special`);
510
603
  }
511
- return { specialCalls, normalCalls, parseIssues };
604
+ await dlg.receiveFuncResult(result);
605
+ }
606
+ function buildTellaskResultToolOutput(args) {
607
+ return {
608
+ type: 'tellask_result_msg',
609
+ role: 'tool',
610
+ genseq: args.genseq,
611
+ callId: args.callId,
612
+ callName: args.callName,
613
+ status: args.status,
614
+ content: args.content,
615
+ call: args.callName === 'tellask'
616
+ ? {
617
+ tellaskContent: args.tellaskContent,
618
+ mentionList: args.mentionList ?? [],
619
+ ...(args.sessionSlug ? { sessionSlug: args.sessionSlug } : {}),
620
+ }
621
+ : args.callName === 'tellaskSessionless'
622
+ ? {
623
+ tellaskContent: args.tellaskContent,
624
+ mentionList: args.mentionList ?? [],
625
+ }
626
+ : {
627
+ tellaskContent: args.tellaskContent,
628
+ },
629
+ responder: {
630
+ responderId: args.responderId,
631
+ ...(args.agentId ? { agentId: args.agentId } : {}),
632
+ ...(args.originMemberId ? { originMemberId: args.originMemberId } : {}),
633
+ },
634
+ ...(args.calleeDialogId !== undefined ||
635
+ args.calleeCourse !== undefined ||
636
+ args.calleeGenseq !== undefined
637
+ ? {
638
+ route: {
639
+ ...(args.calleeDialogId ? { calleeDialogId: args.calleeDialogId } : {}),
640
+ ...(typeof args.calleeCourse === 'number' ? { calleeCourse: args.calleeCourse } : {}),
641
+ ...(typeof args.calleeGenseq === 'number' ? { calleeGenseq: args.calleeGenseq } : {}),
642
+ },
643
+ }
644
+ : {}),
645
+ };
646
+ }
647
+ function buildTellaskCarryoverToolOutput(args) {
648
+ return {
649
+ type: 'tellask_carryover_msg',
650
+ role: 'user',
651
+ genseq: args.genseq,
652
+ content: args.content,
653
+ originCourse: args.originCourse,
654
+ carryoverCourse: args.carryoverCourse,
655
+ responderId: args.responderId,
656
+ callName: args.callName,
657
+ tellaskContent: args.tellaskContent,
658
+ status: args.status,
659
+ response: args.response,
660
+ agentId: args.agentId,
661
+ callId: args.callId,
662
+ originMemberId: args.originMemberId,
663
+ ...(args.callName === 'tellask'
664
+ ? {
665
+ mentionList: args.mentionList ?? [],
666
+ sessionSlug: args.sessionSlug ?? '',
667
+ }
668
+ : args.callName === 'tellaskSessionless'
669
+ ? {
670
+ mentionList: args.mentionList ?? [],
671
+ }
672
+ : {}),
673
+ ...(args.calleeDialogId ? { calleeDialogId: args.calleeDialogId } : {}),
674
+ ...(typeof args.calleeCourse === 'number' ? { calleeCourse: args.calleeCourse } : {}),
675
+ ...(typeof args.calleeGenseq === 'number' ? { calleeGenseq: args.calleeGenseq } : {}),
676
+ };
512
677
  }
513
678
  function showErrorToAi(err) {
514
679
  try {
@@ -644,27 +809,37 @@ async function finishRegisteredTellaskReplacement(args) {
644
809
  sessionSlug: pendingRecord.sessionSlug,
645
810
  });
646
811
  const immediateMirror = carryoverContent !== undefined
647
- ? {
648
- type: 'tellask_carryover_result_msg',
649
- role: 'user',
812
+ ? buildTellaskCarryoverToolOutput({
813
+ genseq: ownerDialog.activeGenSeqOrUndefined ?? 1,
650
814
  content: carryoverContent,
651
815
  originCourse: carryoverOriginCourse,
816
+ carryoverCourse: ownerDialog.currentCourse,
652
817
  responderId: subdialog.agentId,
653
818
  callName: pendingRecord.callName,
654
819
  tellaskContent: pendingRecord.tellaskContent,
655
820
  status: 'failed',
821
+ response,
822
+ agentId: subdialog.agentId,
656
823
  callId: pendingRecord.callId,
657
- }
658
- : {
659
- type: 'tellask_result_msg',
660
- role: 'tool',
661
- responderId: subdialog.agentId,
824
+ originMemberId: requesterId,
662
825
  mentionList: pendingRecord.mentionList,
663
- tellaskContent: pendingRecord.tellaskContent,
664
- status: 'failed',
826
+ sessionSlug: pendingRecord.sessionSlug,
827
+ calleeDialogId: subdialog.id.selfId,
828
+ })
829
+ : buildTellaskResultToolOutput({
830
+ genseq: ownerDialog.activeGenSeqOrUndefined ?? 1,
665
831
  callId: pendingRecord.callId,
832
+ callName: pendingRecord.callName,
666
833
  content: response,
667
- };
834
+ status: 'failed',
835
+ responderId: subdialog.agentId,
836
+ tellaskContent: pendingRecord.tellaskContent,
837
+ mentionList: pendingRecord.mentionList,
838
+ sessionSlug: pendingRecord.sessionSlug,
839
+ agentId: subdialog.agentId,
840
+ originMemberId: requesterId,
841
+ calleeDialogId: subdialog.id.selfId,
842
+ });
668
843
  await ownerDialog.addChatMessages(immediateMirror);
669
844
  }
670
845
  async function reviveDialogIfUnblocked(dialog, callbacks, reason) {
@@ -733,15 +908,11 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
733
908
  throw new Error(`Q4H call invariant violation: empty callId (rootId=${dlg.id.rootId} selfId=${dlg.id.selfId})`);
734
909
  }
735
910
  const questionId = `q4h-${dlg.id.rootId}-${dlg.id.selfId}-c${dlg.currentCourse}-${normalizedCallId}`;
736
- const normalizedRemainingCallIds = Array.from(new Set((options?.q4hRemainingCallIds ?? [])
737
- .map((value) => value.trim())
738
- .filter((value) => value !== '' && value !== normalizedCallId)));
739
911
  const question = {
740
912
  id: questionId,
741
913
  tellaskContent: body.trim(),
742
914
  askedAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
743
915
  callId: normalizedCallId,
744
- remainingCallIds: normalizedRemainingCallIds.length > 0 ? normalizedRemainingCallIds : undefined,
745
916
  callSiteRef: {
746
917
  course: dlg.currentCourse,
747
918
  messageIndex: dlg.msgs.length,
@@ -756,7 +927,6 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
756
927
  tellaskContent: question.tellaskContent,
757
928
  askedAt: question.askedAt,
758
929
  callId: question.callId,
759
- remainingCallIds: question.remainingCallIds,
760
930
  callSiteRef: question.callSiteRef,
761
931
  rootId: dlg.id.rootId,
762
932
  agentId: dlg.agentId,
@@ -783,16 +953,18 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
783
953
  });
784
954
  const msg = (0, driver_messages_1.formatDomindsNoteQ4HRegisterFailed)((0, work_language_1.getWorkLanguage)(), { error: errMsg });
785
955
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
786
- toolOutputs.push({
787
- type: 'tellask_result_msg',
788
- role: 'tool',
789
- responderId: 'dominds',
790
- mentionList: normalizedMentionList,
791
- tellaskContent: body,
792
- status: 'failed',
956
+ toolOutputs.push(buildTellaskResultToolOutput({
957
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
793
958
  callId,
959
+ callName,
794
960
  content: msg,
795
- });
961
+ status: 'failed',
962
+ responderId: 'dominds',
963
+ tellaskContent: body,
964
+ mentionList: normalizedMentionList,
965
+ agentId: 'dominds',
966
+ originMemberId: dlg.agentId,
967
+ }));
796
968
  await dlg.receiveTellaskCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
797
969
  dlg.clearCurrentCallId();
798
970
  return toolOutputs;
@@ -813,16 +985,18 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
813
985
  firstMention: firstMentionForError,
814
986
  });
815
987
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
816
- toolOutputs.push({
817
- type: 'tellask_result_msg',
818
- role: 'tool',
819
- responderId: 'dominds',
820
- mentionList: normalizedMentionList,
821
- tellaskContent: body,
822
- status: 'failed',
988
+ toolOutputs.push(buildTellaskResultToolOutput({
989
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
823
990
  callId,
991
+ callName,
824
992
  content: msg,
825
- });
993
+ status: 'failed',
994
+ responderId: 'dominds',
995
+ tellaskContent: body,
996
+ mentionList: normalizedMentionList,
997
+ agentId: 'dominds',
998
+ originMemberId: dlg.agentId,
999
+ }));
826
1000
  await dlg.receiveTellaskCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
827
1001
  dlg.clearCurrentCallId();
828
1002
  return toolOutputs;
@@ -832,16 +1006,18 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
832
1006
  if (memberFbrEffort < 1) {
833
1007
  const msg = (0, driver_messages_1.formatDomindsNoteFbrDisabled)((0, work_language_1.getWorkLanguage)());
834
1008
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
835
- toolOutputs.push({
836
- type: 'tellask_result_msg',
837
- role: 'tool',
838
- responderId: 'dominds',
839
- mentionList: normalizedMentionList,
840
- tellaskContent: body,
841
- status: 'failed',
1009
+ toolOutputs.push(buildTellaskResultToolOutput({
1010
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
842
1011
  callId,
1012
+ callName,
843
1013
  content: msg,
844
- });
1014
+ status: 'failed',
1015
+ responderId: 'dominds',
1016
+ tellaskContent: body,
1017
+ mentionList: normalizedMentionList,
1018
+ agentId: 'dominds',
1019
+ originMemberId: dlg.agentId,
1020
+ }));
845
1021
  await dlg.receiveTellaskCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
846
1022
  dlg.clearCurrentCallId();
847
1023
  return toolOutputs;
@@ -858,16 +1034,18 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
858
1034
  if (fbrEffort < 1) {
859
1035
  const msg = (0, driver_messages_1.formatDomindsNoteFbrDisabled)((0, work_language_1.getWorkLanguage)());
860
1036
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
861
- toolOutputs.push({
862
- type: 'tellask_result_msg',
863
- role: 'tool',
864
- responderId: 'dominds',
865
- mentionList: normalizedMentionList,
866
- tellaskContent: body,
867
- status: 'failed',
1037
+ toolOutputs.push(buildTellaskResultToolOutput({
1038
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
868
1039
  callId,
1040
+ callName,
869
1041
  content: msg,
870
- });
1042
+ status: 'failed',
1043
+ responderId: 'dominds',
1044
+ tellaskContent: body,
1045
+ mentionList: normalizedMentionList,
1046
+ agentId: 'dominds',
1047
+ originMemberId: dlg.agentId,
1048
+ }));
871
1049
  await dlg.receiveTellaskCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
872
1050
  dlg.clearCurrentCallId();
873
1051
  return toolOutputs;
@@ -880,16 +1058,18 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
880
1058
  kind: 'internal_error',
881
1059
  });
882
1060
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
883
- toolOutputs.push({
884
- type: 'tellask_result_msg',
885
- role: 'tool',
886
- responderId: 'dominds',
887
- mentionList: normalizedMentionList,
888
- tellaskContent: body,
889
- status: 'failed',
1061
+ toolOutputs.push(buildTellaskResultToolOutput({
1062
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
890
1063
  callId,
1064
+ callName,
891
1065
  content: msg,
892
- });
1066
+ status: 'failed',
1067
+ responderId: 'dominds',
1068
+ tellaskContent: body,
1069
+ mentionList: normalizedMentionList,
1070
+ agentId: 'dominds',
1071
+ originMemberId: dlg.agentId,
1072
+ }));
893
1073
  await dlg.receiveTellaskCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
894
1074
  dlg.clearCurrentCallId();
895
1075
  return toolOutputs;
@@ -960,16 +1140,18 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
960
1140
  if (isDirectSelfCall) {
961
1141
  const msg = (0, driver_messages_1.formatDomindsNoteDirectSelfCall)((0, work_language_1.getWorkLanguage)());
962
1142
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
963
- toolOutputs.push({
964
- type: 'tellask_result_msg',
965
- role: 'tool',
966
- responderId: 'dominds',
967
- mentionList: normalizedMentionList,
968
- tellaskContent: body,
969
- status: 'failed',
1143
+ toolOutputs.push(buildTellaskResultToolOutput({
1144
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
970
1145
  callId,
1146
+ callName,
971
1147
  content: msg,
972
- });
1148
+ status: 'failed',
1149
+ responderId: 'dominds',
1150
+ tellaskContent: body,
1151
+ mentionList: normalizedMentionList,
1152
+ agentId: 'dominds',
1153
+ originMemberId: dlg.agentId,
1154
+ }));
973
1155
  await dlg.receiveTellaskCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
974
1156
  dlg.clearCurrentCallId();
975
1157
  return toolOutputs;
@@ -1025,16 +1207,19 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
1025
1207
  language: (0, work_language_1.getWorkLanguage)(),
1026
1208
  });
1027
1209
  dlg.setSuspensionState('resumed');
1028
- toolOutputs.push({
1029
- type: 'tellask_result_msg',
1030
- role: 'tool',
1031
- responderId: parseResult.agentId,
1032
- mentionList,
1033
- tellaskContent: body,
1034
- status: 'completed',
1210
+ toolOutputs.push(buildTellaskResultToolOutput({
1211
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
1035
1212
  callId,
1213
+ callName,
1036
1214
  content: responseContent,
1037
- });
1215
+ status: 'completed',
1216
+ responderId: parseResult.agentId,
1217
+ tellaskContent: body,
1218
+ mentionList,
1219
+ agentId: parseResult.agentId,
1220
+ originMemberId: dlg.agentId,
1221
+ calleeDialogId: supdialog.id.selfId,
1222
+ }));
1038
1223
  await dlg.receiveTellaskResponse(parseResult.agentId, callName, mentionList, body, 'completed', supdialog.id, {
1039
1224
  response: responseContent,
1040
1225
  agentId: parseResult.agentId,
@@ -1056,16 +1241,19 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
1056
1241
  status: 'failed',
1057
1242
  language: (0, work_language_1.getWorkLanguage)(),
1058
1243
  });
1059
- toolOutputs.push({
1060
- type: 'tellask_result_msg',
1061
- role: 'tool',
1062
- responderId: parseResult.agentId,
1063
- mentionList,
1064
- tellaskContent: body,
1065
- status: 'failed',
1244
+ toolOutputs.push(buildTellaskResultToolOutput({
1245
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
1066
1246
  callId,
1247
+ callName,
1067
1248
  content: errorContent,
1068
- });
1249
+ status: 'failed',
1250
+ responderId: parseResult.agentId,
1251
+ tellaskContent: body,
1252
+ mentionList,
1253
+ agentId: parseResult.agentId,
1254
+ originMemberId: dlg.agentId,
1255
+ calleeDialogId: supdialog.id.selfId,
1256
+ }));
1069
1257
  await dlg.receiveTellaskResponse(parseResult.agentId, callName, mentionList, body, 'failed', supdialog.id, {
1070
1258
  response: errorContent,
1071
1259
  agentId: parseResult.agentId,
@@ -1320,7 +1508,7 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
1320
1508
  msgId: resumePrompt.msgId,
1321
1509
  grammar: resumePrompt.grammar,
1322
1510
  userLanguageCode: resumePrompt.userLanguageCode,
1323
- q4hAnswerCallIds: resumePrompt.q4hAnswerCallIds,
1511
+ q4hAnswerCallId: resumePrompt.q4hAnswerCallId,
1324
1512
  tellaskReplyDirective: resumePrompt.tellaskReplyDirective,
1325
1513
  skipTaskdoc: resumePrompt.skipTaskdoc,
1326
1514
  subdialogReplyTarget: resumePrompt.subdialogReplyTarget,
@@ -1464,22 +1652,24 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
1464
1652
  firstMention: options.targetForError ?? 'unknown',
1465
1653
  });
1466
1654
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
1467
- toolOutputs.push({
1468
- type: 'tellask_result_msg',
1469
- role: 'tool',
1470
- responderId: 'dominds',
1471
- mentionList: normalizedMentionList,
1472
- tellaskContent: body,
1473
- status: 'failed',
1655
+ toolOutputs.push(buildTellaskResultToolOutput({
1656
+ genseq: dlg.activeGenSeqOrUndefined ?? 1,
1474
1657
  callId,
1658
+ callName,
1475
1659
  content: msg,
1476
- });
1660
+ status: 'failed',
1661
+ responderId: 'dominds',
1662
+ tellaskContent: body,
1663
+ mentionList: normalizedMentionList,
1664
+ agentId: 'dominds',
1665
+ originMemberId: dlg.agentId,
1666
+ }));
1477
1667
  await dlg.receiveTellaskCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
1478
1668
  dlg.clearCurrentCallId();
1479
1669
  }
1480
1670
  return toolOutputs;
1481
1671
  }
1482
- async function emitTellaskSpecialCallEvents(args) {
1672
+ async function emitTellaskCallEvents(args) {
1483
1673
  await args.dlg.callingStart({
1484
1674
  callName: args.callName,
1485
1675
  callId: args.callId,
@@ -1667,69 +1857,10 @@ function toExecutableValidTellaskCall(call) {
1667
1857
  };
1668
1858
  }
1669
1859
  }
1670
- function normalizeQ4HCalls(calls, dlg) {
1671
- const q4hCalls = calls.filter((call) => call.callName === 'askHuman');
1672
- const nonQ4HCalls = calls
1673
- .filter((call) => call.callName !== 'askHuman')
1674
- .map((call) => {
1675
- switch (call.callName) {
1676
- case 'tellask':
1677
- case 'tellaskSessionless':
1678
- return { ...call, mentionList: [...call.mentionList] };
1679
- case 'tellaskBack':
1680
- case 'replyTellask':
1681
- case 'replyTellaskSessionless':
1682
- case 'replyTellaskBack':
1683
- case 'freshBootsReasoning':
1684
- return { ...call };
1685
- }
1686
- });
1687
- if (q4hCalls.length <= 1) {
1688
- return q4hCalls.length === 1 ? [...nonQ4HCalls, { ...q4hCalls[0] }] : nonQ4HCalls;
1689
- }
1690
- const primary = q4hCalls[0];
1691
- const remainingCallIds = q4hCalls
1692
- .slice(1)
1693
- .map((call) => call.callId.trim())
1694
- .filter((callId) => callId !== '');
1695
- const language = (0, work_language_1.getWorkLanguage)();
1696
- const intro = language === 'zh'
1697
- ? `我这次有 ${q4hCalls.length} 个问题,想请你一次性回复:`
1698
- : `I have ${q4hCalls.length} questions this round. Please answer them in one response:`;
1699
- const mergedBody = [
1700
- intro,
1701
- ...q4hCalls.map((call, index) => {
1702
- const body = call.tellaskContent.trim();
1703
- const normalizedBody = body !== ''
1704
- ? body
1705
- : language === 'zh'
1706
- ? '请结合当前上下文补充这一项。'
1707
- : 'Please provide this item based on the current context.';
1708
- return language === 'zh'
1709
- ? `问题 ${index + 1}:\n${normalizedBody}`
1710
- : `Question ${index + 1}:\n${normalizedBody}`;
1711
- }),
1712
- ].join('\n\n');
1713
- const mergedQ4HCall = {
1714
- callName: 'askHuman',
1715
- callId: primary.callId,
1716
- tellaskContent: mergedBody,
1717
- q4hRemainingCallIds: remainingCallIds.length > 0 ? remainingCallIds : undefined,
1718
- };
1719
- log_1.log.debug('Q4H multi-question normalized into a single prompt', undefined, {
1720
- rootId: dlg.id.rootId,
1721
- selfId: dlg.id.selfId,
1722
- mergedCount: q4hCalls.length,
1723
- primaryCallId: primary.callId,
1724
- remainingCallIds,
1725
- });
1726
- return [...nonQ4HCalls, mergedQ4HCall];
1727
- }
1728
1860
  async function executeValidTellaskCalls(args) {
1729
- const executionCalls = normalizeQ4HCalls(args.calls, args.dlg);
1730
1861
  const results = [];
1731
1862
  const successfulReplyCallIds = [];
1732
- for (const call of executionCalls) {
1863
+ for (const call of args.calls) {
1733
1864
  const runtimeMentionList = (() => {
1734
1865
  switch (call.callName) {
1735
1866
  case 'tellask':
@@ -1747,7 +1878,7 @@ async function executeValidTellaskCalls(args) {
1747
1878
  if (!isReplyTellaskCallName(call.callName)) {
1748
1879
  const nonReplyCall = call;
1749
1880
  const sessionSlug = nonReplyCall.callName === 'tellask' ? nonReplyCall.sessionSlug : undefined;
1750
- await emitTellaskSpecialCallEvents({
1881
+ await emitTellaskCallEvents({
1751
1882
  dlg: args.dlg,
1752
1883
  callName: nonReplyCall.callName,
1753
1884
  mentionList: runtimeMentionList,
@@ -1818,7 +1949,6 @@ async function executeValidTellaskCalls(args) {
1818
1949
  callName: call.callName,
1819
1950
  parseResult,
1820
1951
  targetForError,
1821
- q4hRemainingCallIds: call.q4hRemainingCallIds,
1822
1952
  fbrEffortOverride: call.callName === 'freshBootsReasoning' ? call.effort : undefined,
1823
1953
  });
1824
1954
  results.push(toolOutputs);
@@ -1828,7 +1958,7 @@ async function executeValidTellaskCalls(args) {
1828
1958
  successfulReplyCallIds,
1829
1959
  };
1830
1960
  }
1831
- async function executeTellaskSpecialCalls(args) {
1961
+ async function executeTellaskCalls(args) {
1832
1962
  if (args.calls.length === 0) {
1833
1963
  return { toolOutputs: [], successfulReplyCallIds: [] };
1834
1964
  }
@@ -1838,3 +1968,182 @@ async function executeTellaskSpecialCalls(args) {
1838
1968
  callbacks: args.callbacks,
1839
1969
  });
1840
1970
  }
1971
+ async function processTellaskFunctionRound(args) {
1972
+ const multiAskHumanCalls = args.funcCalls.filter((call) => call.name === 'askHuman' && args.allowedSpecials.has('askHuman'));
1973
+ const funcCallsForResolution = multiAskHumanCalls.length > 1
1974
+ ? args.funcCalls.filter((call) => call.name !== 'askHuman')
1975
+ : args.funcCalls;
1976
+ const resolvedTellask = resolveTellaskFunctionCalls(funcCallsForResolution, {
1977
+ allowedSpecials: args.allowedSpecials,
1978
+ });
1979
+ const validByCallId = new Map(resolvedTellask.validCalls.map((handled) => [handled.originalCall.id, handled]));
1980
+ const invalidByCallId = new Map(resolvedTellask.invalidCalls.map((issue) => [issue.originalCall.id, issue]));
1981
+ const orderedSpecialDispositions = [];
1982
+ for (const originalCall of args.funcCalls) {
1983
+ if (!isTellaskCallFunctionName(originalCall.name) ||
1984
+ !args.allowedSpecials.has(originalCall.name)) {
1985
+ continue;
1986
+ }
1987
+ if (multiAskHumanCalls.length > 1 && originalCall.name === 'askHuman') {
1988
+ orderedSpecialDispositions.push({
1989
+ kind: 'invalid',
1990
+ issue: {
1991
+ originalCall,
1992
+ error: MULTIPLE_ASKHUMAN_CALLS_ERROR,
1993
+ rawArgumentsText: getRawArgumentsText(originalCall),
1994
+ contextArguments: getRawArgumentsText(originalCall),
1995
+ },
1996
+ });
1997
+ continue;
1998
+ }
1999
+ const handled = validByCallId.get(originalCall.id);
2000
+ if (handled) {
2001
+ orderedSpecialDispositions.push({ kind: 'valid', handled });
2002
+ continue;
2003
+ }
2004
+ const issue = invalidByCallId.get(originalCall.id);
2005
+ if (issue) {
2006
+ orderedSpecialDispositions.push({ kind: 'invalid', issue });
2007
+ continue;
2008
+ }
2009
+ throw new Error(`kernel-driver tellask special call invariant violation: unresolved tellask disposition for '${originalCall.id}' (${originalCall.name})`);
2010
+ }
2011
+ const orderedValidCalls = orderedSpecialDispositions.flatMap((entry) => entry.kind === 'valid' ? [entry.handled] : []);
2012
+ const orderedInvalidCalls = orderedSpecialDispositions.flatMap((entry) => entry.kind === 'invalid' ? [entry.issue] : []);
2013
+ const specialCallById = new Map(orderedValidCalls.map(({ call }) => [call.callId, call]));
2014
+ const originalCallById = new Map(args.funcCalls.map((call) => [call.id, call]));
2015
+ const tellaskCallMessages = [];
2016
+ const issueResults = [];
2017
+ for (const disposition of orderedSpecialDispositions) {
2018
+ if (disposition.kind === 'valid') {
2019
+ const handled = disposition.handled;
2020
+ await args.dlg.persistTellaskCall(handled.originalCall.id, handled.call.callName, getRawArgumentsText(handled.originalCall), handled.originalCall.genseq, {
2021
+ deliveryMode: isReplyTellaskCallName(handled.call.callName)
2022
+ ? 'func_call_requested'
2023
+ : 'tellask_call_start',
2024
+ });
2025
+ tellaskCallMessages.push({
2026
+ type: 'func_call_msg',
2027
+ role: 'assistant',
2028
+ genseq: handled.originalCall.genseq,
2029
+ id: handled.originalCall.id,
2030
+ name: handled.call.callName,
2031
+ arguments: getRawArgumentsText(handled.originalCall),
2032
+ });
2033
+ continue;
2034
+ }
2035
+ const issue = disposition.issue;
2036
+ await args.dlg.funcCallRequested(issue.originalCall.id, issue.originalCall.name, issue.contextArguments);
2037
+ const result = formatTellaskInvalidCallResult({
2038
+ call: issue.originalCall,
2039
+ error: issue.error,
2040
+ });
2041
+ await args.dlg.persistTellaskCallResultPair({
2042
+ id: issue.originalCall.id,
2043
+ name: issue.originalCall.name,
2044
+ rawArgumentsText: issue.rawArgumentsText,
2045
+ genseq: issue.originalCall.genseq,
2046
+ result,
2047
+ deliveryMode: 'func_call_requested',
2048
+ });
2049
+ tellaskCallMessages.push({
2050
+ type: 'func_call_msg',
2051
+ role: 'assistant',
2052
+ genseq: issue.originalCall.genseq,
2053
+ id: issue.originalCall.id,
2054
+ name: issue.originalCall.name,
2055
+ arguments: issue.rawArgumentsText,
2056
+ });
2057
+ issueResults.push(result);
2058
+ }
2059
+ let tellaskExecution;
2060
+ try {
2061
+ tellaskExecution = await executeTellaskCalls({
2062
+ dlg: args.dlg,
2063
+ calls: orderedValidCalls.map((handled) => handled.call),
2064
+ callbacks: args.callbacks,
2065
+ });
2066
+ }
2067
+ catch (err) {
2068
+ const errText = err instanceof Error ? `${err.name}: ${err.message}` : String(err);
2069
+ for (const { call } of orderedValidCalls) {
2070
+ if (issueResults.some((result) => result.id === call.callId)) {
2071
+ continue;
2072
+ }
2073
+ const originalCall = originalCallById.get(call.callId);
2074
+ if (!originalCall) {
2075
+ throw new Error(`kernel-driver tellask special call invariant violation: missing original call for '${call.callId}'`);
2076
+ }
2077
+ await persistTellaskFuncResult(args.dlg, {
2078
+ type: 'func_result_msg',
2079
+ id: call.callId,
2080
+ name: call.callName,
2081
+ content: `Special function '${call.callName}' execution failed: ${errText}`,
2082
+ role: 'tool',
2083
+ genseq: originalCall.genseq,
2084
+ });
2085
+ }
2086
+ throw err;
2087
+ }
2088
+ const tellaskFuncResults = [];
2089
+ const tellaskFuncResultByCallId = new Map();
2090
+ const tellaskToolOutputs = [];
2091
+ for (const output of tellaskExecution.toolOutputs) {
2092
+ if (output.type === 'func_result_msg') {
2093
+ const result = output;
2094
+ tellaskFuncResultByCallId.set(result.id, result);
2095
+ tellaskFuncResults.push(result);
2096
+ continue;
2097
+ }
2098
+ if (output.type === 'tellask_result_msg') {
2099
+ const callId = typeof output.callId === 'string' ? output.callId : '';
2100
+ if (callId === '') {
2101
+ tellaskToolOutputs.push(output);
2102
+ continue;
2103
+ }
2104
+ const originatingCall = specialCallById.get(callId);
2105
+ if (originatingCall) {
2106
+ const originalCall = originalCallById.get(callId);
2107
+ const result = {
2108
+ type: 'func_result_msg',
2109
+ role: 'tool',
2110
+ genseq: originalCall?.genseq ?? 1,
2111
+ id: callId,
2112
+ name: originatingCall.callName,
2113
+ content: output.content,
2114
+ };
2115
+ tellaskFuncResultByCallId.set(callId, result);
2116
+ tellaskFuncResults.push(result);
2117
+ }
2118
+ continue;
2119
+ }
2120
+ tellaskToolOutputs.push(output);
2121
+ }
2122
+ for (const { call } of orderedValidCalls) {
2123
+ if (tellaskFuncResultByCallId.has(call.callId)) {
2124
+ continue;
2125
+ }
2126
+ const originalCall = originalCallById.get(call.callId);
2127
+ if (!originalCall) {
2128
+ throw new Error(`kernel-driver tellask call invariant violation: missing original call for '${call.callId}'`);
2129
+ }
2130
+ const pendingResult = buildPendingTellaskFuncResult({
2131
+ callId: call.callId,
2132
+ callName: call.callName,
2133
+ genseq: originalCall.genseq,
2134
+ });
2135
+ tellaskFuncResultByCallId.set(call.callId, pendingResult);
2136
+ tellaskFuncResults.push(pendingResult);
2137
+ }
2138
+ for (const result of tellaskFuncResults) {
2139
+ await persistTellaskFuncResult(args.dlg, result);
2140
+ }
2141
+ return {
2142
+ normalCalls: resolvedTellask.normalCalls,
2143
+ tellaskCallMessages,
2144
+ tellaskResults: [...issueResults, ...tellaskFuncResults],
2145
+ toolOutputs: tellaskToolOutputs,
2146
+ handledCallIds: orderedValidCalls.map(({ call }) => call.callId),
2147
+ shouldStopAfterReplyTool: tellaskExecution.successfulReplyCallIds.length > 0,
2148
+ };
2149
+ }