dominds 0.7.6 → 0.8.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 (155) hide show
  1. package/README.md +2 -2
  2. package/README.zh.md +2 -2
  3. package/dist/agent-priming.js +169 -200
  4. package/dist/cli/read.js +2 -7
  5. package/dist/dialog-factory.js +6 -4
  6. package/dist/dialog-instance-registry.js +2 -2
  7. package/dist/dialog.js +99 -91
  8. package/dist/docs/dialog-persistence.md +2 -2
  9. package/dist/docs/dialog-persistence.zh.md +2 -2
  10. package/dist/docs/dialog-system.md +86 -90
  11. package/dist/docs/dialog-system.zh.md +82 -83
  12. package/dist/docs/diligence-push.md +2 -2
  13. package/dist/docs/diligence-push.zh.md +2 -2
  14. package/dist/docs/dominds-agent-priming.md +11 -11
  15. package/dist/docs/dominds-agent-priming.zh.md +9 -9
  16. package/dist/docs/dominds-terminology.md +34 -34
  17. package/dist/docs/fbr-implementation.md +4 -4
  18. package/dist/docs/fbr-implementation.zh.md +4 -4
  19. package/dist/docs/fbr.md +31 -53
  20. package/dist/docs/fbr.zh.md +30 -48
  21. package/dist/docs/mottos.md +2 -3
  22. package/dist/docs/mottos.zh.md +2 -2
  23. package/dist/docs/q4h.md +6 -6
  24. package/dist/docs/q4h.zh.md +6 -6
  25. package/dist/docs/tellask-collab.md +13 -13
  26. package/dist/docs/tellask-collab.zh.md +18 -18
  27. package/dist/llm/driver-entry.js +9 -33
  28. package/dist/llm/driver-v2/core.js +413 -111
  29. package/dist/llm/driver-v2/index.js +5 -0
  30. package/dist/llm/driver-v2/orchestrator.js +4 -3
  31. package/dist/llm/driver-v2/policy.js +17 -23
  32. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
  33. package/dist/llm/driver-v2/round.js +18 -7
  34. package/dist/llm/driver-v2/runtime-utils.js +3 -5
  35. package/dist/llm/driver-v2/saying-events.js +4 -42
  36. package/dist/llm/driver-v2/supdialog-response.js +110 -23
  37. package/dist/llm/driver-v2/tellask-bridge.js +560 -458
  38. package/dist/mcp/sdk-client.js +1 -1
  39. package/dist/mcp/server-runtime.js +1 -1
  40. package/dist/mcp/stdio-client.js +6 -6
  41. package/dist/mcp/tool-names.js +1 -1
  42. package/dist/minds/builtin/fuxi/persona.en.md +10 -10
  43. package/dist/minds/builtin/fuxi/persona.zh.md +12 -12
  44. package/dist/minds/builtin/pangu/persona.en.md +7 -7
  45. package/dist/minds/builtin/pangu/persona.zh.md +6 -6
  46. package/dist/minds/minds-i18n.js +2 -2
  47. package/dist/minds/system-prompt-parts.js +15 -12
  48. package/dist/minds/system-prompt.js +58 -56
  49. package/dist/persistence.js +675 -527
  50. package/dist/server/api-routes.js +1 -1
  51. package/dist/server/websocket-handler.js +10 -20
  52. package/dist/server.js +3 -3
  53. package/dist/shared/diligence.js +12 -12
  54. package/dist/shared/i18n/driver-messages.js +28 -118
  55. package/dist/shared/utils/inter-dialog-format.js +53 -53
  56. package/dist/snippets/starting.en.md +1 -1
  57. package/dist/snippets/starting.zh.md +1 -2
  58. package/dist/static/assets/{_baseUniq-2IQvcpiv.js → _baseUniq-D4N_zVXV.js} +2 -2
  59. package/dist/static/assets/{_baseUniq-2IQvcpiv.js.map → _baseUniq-D4N_zVXV.js.map} +1 -1
  60. package/dist/static/assets/{arc-Boi4s2EY.js → arc-7bP9qomB.js} +2 -2
  61. package/dist/static/assets/{arc-Boi4s2EY.js.map → arc-7bP9qomB.js.map} +1 -1
  62. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js → architectureDiagram-VXUJARFQ-DToIiZuZ.js} +6 -6
  63. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js.map → architectureDiagram-VXUJARFQ-DToIiZuZ.js.map} +1 -1
  64. package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js → blockDiagram-VD42YOAC-C-pRNHpf.js} +7 -7
  65. package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js.map → blockDiagram-VD42YOAC-C-pRNHpf.js.map} +1 -1
  66. package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js → c4Diagram-YG6GDRKO-Bnp-nWKO.js} +3 -3
  67. package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js.map → c4Diagram-YG6GDRKO-Bnp-nWKO.js.map} +1 -1
  68. package/dist/static/assets/{channel-DBG_xYT_.js → channel-CTv1SsAF.js} +2 -2
  69. package/dist/static/assets/{channel-DBG_xYT_.js.map → channel-CTv1SsAF.js.map} +1 -1
  70. package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js → chunk-4BX2VUAB-D_OGa3ss.js} +2 -2
  71. package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js.map → chunk-4BX2VUAB-D_OGa3ss.js.map} +1 -1
  72. package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js → chunk-55IACEB6-I4o4MCuM.js} +2 -2
  73. package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js.map → chunk-55IACEB6-I4o4MCuM.js.map} +1 -1
  74. package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js → chunk-B4BG7PRW-Bp-TIXg6.js} +5 -5
  75. package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js.map → chunk-B4BG7PRW-Bp-TIXg6.js.map} +1 -1
  76. package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js → chunk-DI55MBZ5-Bnph5Hmd.js} +4 -4
  77. package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js.map → chunk-DI55MBZ5-Bnph5Hmd.js.map} +1 -1
  78. package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js → chunk-FMBD7UC4-q3UyRsNI.js} +2 -2
  79. package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js.map → chunk-FMBD7UC4-q3UyRsNI.js.map} +1 -1
  80. package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js → chunk-QN33PNHL-BxUlvLXP.js} +2 -2
  81. package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js.map → chunk-QN33PNHL-BxUlvLXP.js.map} +1 -1
  82. package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js → chunk-QZHKN3VN-DpQR9BVw.js} +2 -2
  83. package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js.map → chunk-QZHKN3VN-DpQR9BVw.js.map} +1 -1
  84. package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js → chunk-TZMSLE5B-BX8vrVo0.js} +2 -2
  85. package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js.map → chunk-TZMSLE5B-BX8vrVo0.js.map} +1 -1
  86. package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js → classDiagram-2ON5EDUG-Ccx5_2Xq.js} +6 -6
  87. package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js.map → classDiagram-2ON5EDUG-Ccx5_2Xq.js.map} +1 -1
  88. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js} +6 -6
  89. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js.map → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js.map} +1 -1
  90. package/dist/static/assets/{clone-rjxmrDHc.js → clone-Cl5zSMrO.js} +2 -2
  91. package/dist/static/assets/{clone-rjxmrDHc.js.map → clone-Cl5zSMrO.js.map} +1 -1
  92. package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js → cose-bilkent-S5V4N54A-B-FUX86B.js} +2 -2
  93. package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js.map → cose-bilkent-S5V4N54A-B-FUX86B.js.map} +1 -1
  94. package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js → dagre-6UL2VRFP-Bj8vSSpT.js} +7 -7
  95. package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js.map → dagre-6UL2VRFP-Bj8vSSpT.js.map} +1 -1
  96. package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js → diagram-PSM6KHXK-BPcgy7jf.js} +7 -7
  97. package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js.map → diagram-PSM6KHXK-BPcgy7jf.js.map} +1 -1
  98. package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js → diagram-QEK2KX5R-DHxd6LWi.js} +6 -6
  99. package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js.map → diagram-QEK2KX5R-DHxd6LWi.js.map} +1 -1
  100. package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js → diagram-S2PKOQOG-C4ynhhLr.js} +6 -6
  101. package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js.map → diagram-S2PKOQOG-C4ynhhLr.js.map} +1 -1
  102. package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js → erDiagram-Q2GNP2WA-CQ25uxxf.js} +5 -5
  103. package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js.map → erDiagram-Q2GNP2WA-CQ25uxxf.js.map} +1 -1
  104. package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js → flowDiagram-NV44I4VS-ChkkAldk.js} +6 -6
  105. package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js.map → flowDiagram-NV44I4VS-ChkkAldk.js.map} +1 -1
  106. package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js → ganttDiagram-JELNMOA3-CBt_Zorl.js} +3 -3
  107. package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js.map → ganttDiagram-JELNMOA3-CBt_Zorl.js.map} +1 -1
  108. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js → gitGraphDiagram-NY62KEGX-CtBc2dOO.js} +7 -7
  109. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js.map → gitGraphDiagram-NY62KEGX-CtBc2dOO.js.map} +1 -1
  110. package/dist/static/assets/{graph-DDHIhCSW.js → graph-BGzNnzuI.js} +3 -3
  111. package/dist/static/assets/{graph-DDHIhCSW.js.map → graph-BGzNnzuI.js.map} +1 -1
  112. package/dist/static/assets/{index-CUZD-Ua6.js → index-Vrp1PT3b.js} +654 -355
  113. package/dist/static/assets/index-Vrp1PT3b.js.map +1 -0
  114. package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js → infoDiagram-WHAUD3N6-BYJF-Ol5.js} +5 -5
  115. package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js.map → infoDiagram-WHAUD3N6-BYJF-Ol5.js.map} +1 -1
  116. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js} +5 -5
  117. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js.map → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js.map} +1 -1
  118. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js → kanban-definition-3W4ZIXB7-DBH-HEwY.js} +3 -3
  119. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js.map → kanban-definition-3W4ZIXB7-DBH-HEwY.js.map} +1 -1
  120. package/dist/static/assets/{layout-C7mFT1m6.js → layout-DdWO-uEo.js} +5 -5
  121. package/dist/static/assets/{layout-C7mFT1m6.js.map → layout-DdWO-uEo.js.map} +1 -1
  122. package/dist/static/assets/{linear-WSX0brRY.js → linear-BY3MovaF.js} +2 -2
  123. package/dist/static/assets/{linear-WSX0brRY.js.map → linear-BY3MovaF.js.map} +1 -1
  124. package/dist/static/assets/{min-DOTQTP4p.js → min-aHCJK1uN.js} +3 -3
  125. package/dist/static/assets/{min-DOTQTP4p.js.map → min-aHCJK1uN.js.map} +1 -1
  126. package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js → mindmap-definition-VGOIOE7T-BjJnBRtB.js} +4 -4
  127. package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js.map → mindmap-definition-VGOIOE7T-BjJnBRtB.js.map} +1 -1
  128. package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js → pieDiagram-ADFJNKIX-xAcmdymv.js} +7 -7
  129. package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js.map → pieDiagram-ADFJNKIX-xAcmdymv.js.map} +1 -1
  130. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js → quadrantDiagram-AYHSOK5B-BPbEGCEj.js} +3 -3
  131. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js.map → quadrantDiagram-AYHSOK5B-BPbEGCEj.js.map} +1 -1
  132. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js → requirementDiagram-UZGBJVZJ--w6UfXy0.js} +4 -4
  133. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js.map → requirementDiagram-UZGBJVZJ--w6UfXy0.js.map} +1 -1
  134. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js → sankeyDiagram-TZEHDZUN-B_T6TQwh.js} +2 -2
  135. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js.map → sankeyDiagram-TZEHDZUN-B_T6TQwh.js.map} +1 -1
  136. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js → sequenceDiagram-WL72ISMW-DX_oVvqA.js} +4 -4
  137. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js.map → sequenceDiagram-WL72ISMW-DX_oVvqA.js.map} +1 -1
  138. package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js → stateDiagram-FKZM4ZOC-BAybZU8l.js} +9 -9
  139. package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js.map → stateDiagram-FKZM4ZOC-BAybZU8l.js.map} +1 -1
  140. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js} +5 -5
  141. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js.map → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js.map} +1 -1
  142. package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js → timeline-definition-IT6M3QCI-DOYN-4XM.js} +3 -3
  143. package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js.map → timeline-definition-IT6M3QCI-DOYN-4XM.js.map} +1 -1
  144. package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js → treemap-KMMF4GRG-CQXygT0T.js} +4 -4
  145. package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js.map → treemap-KMMF4GRG-CQXygT0T.js.map} +1 -1
  146. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js → xychartDiagram-PRI3JC2R-ByFAvTeN.js} +3 -3
  147. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js.map → xychartDiagram-PRI3JC2R-ByFAvTeN.js.map} +1 -1
  148. package/dist/static/index.html +1 -1
  149. package/dist/tools/builtins.js +0 -8
  150. package/dist/tools/env.js +1 -1
  151. package/dist/tools/mcp.js +31 -9
  152. package/dist/tools/pending-tellask-reminder.js +14 -17
  153. package/dist/tools/team-mgmt.js +1 -1
  154. package/package.json +1 -1
  155. package/dist/static/assets/index-CUZD-Ua6.js.map +0 -1
@@ -33,7 +33,9 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.executeTellaskCalls = executeTellaskCalls;
36
+ exports.isTellaskSpecialFunctionName = isTellaskSpecialFunctionName;
37
+ exports.classifyTellaskSpecialFunctionCalls = classifyTellaskSpecialFunctionCalls;
38
+ exports.executeTellaskSpecialCalls = executeTellaskSpecialCalls;
37
39
  const util_1 = require("util");
38
40
  const dialog_1 = require("../../dialog");
39
41
  const evt_registry_1 = require("../../evt-registry");
@@ -47,6 +49,194 @@ const time_1 = require("../../shared/utils/time");
47
49
  const team_1 = require("../../team");
48
50
  const pending_tellask_reminder_1 = require("../../tools/pending-tellask-reminder");
49
51
  const subdialog_txn_1 = require("./subdialog-txn");
52
+ const TELLASK_SPECIAL_FUNCTION_NAMES = [
53
+ 'tellaskBack',
54
+ 'tellask',
55
+ 'tellaskSessionless',
56
+ 'askHuman',
57
+ 'freshBootsReasoning',
58
+ ];
59
+ function isTellaskSpecialFunctionName(name) {
60
+ return TELLASK_SPECIAL_FUNCTION_NAMES.includes(name);
61
+ }
62
+ function isRecord(value) {
63
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
64
+ }
65
+ function parseFuncCallArgsObject(call) {
66
+ try {
67
+ const parsed = JSON.parse(call.arguments || '{}');
68
+ if (!isRecord(parsed)) {
69
+ return { ok: false, error: 'arguments must be a JSON object' };
70
+ }
71
+ return { ok: true, value: parsed };
72
+ }
73
+ catch (err) {
74
+ return {
75
+ ok: false,
76
+ error: `arguments must be valid JSON: ${err instanceof Error ? err.message : String(err)}`,
77
+ };
78
+ }
79
+ }
80
+ function readRequiredStringField(obj, field) {
81
+ const value = obj[field];
82
+ if (typeof value !== 'string') {
83
+ return { ok: false, error: `field '${field}' must be a string` };
84
+ }
85
+ const trimmed = value.trim();
86
+ if (trimmed === '') {
87
+ return { ok: false, error: `field '${field}' must not be empty` };
88
+ }
89
+ return { ok: true, value: trimmed };
90
+ }
91
+ function readOptionalStringField(obj, field) {
92
+ const value = obj[field];
93
+ if (value === undefined) {
94
+ return null;
95
+ }
96
+ if (typeof value !== 'string') {
97
+ return null;
98
+ }
99
+ const trimmed = value.trim();
100
+ return trimmed === '' ? null : trimmed;
101
+ }
102
+ function readTargetAgentId(obj) {
103
+ const target = readOptionalStringField(obj, 'targetAgentId') ??
104
+ readOptionalStringField(obj, 'agentId') ??
105
+ readOptionalStringField(obj, 'target');
106
+ if (!target) {
107
+ return {
108
+ ok: false,
109
+ error: "missing target agent id (expected 'targetAgentId' or 'agentId')",
110
+ };
111
+ }
112
+ return { ok: true, value: target };
113
+ }
114
+ function normalizeTeammateTargetAgentId(rawTarget) {
115
+ const trimmed = rawTarget.trim();
116
+ const withoutAt = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;
117
+ if (withoutAt === '') {
118
+ return {
119
+ ok: false,
120
+ error: 'targetAgentId must not be empty',
121
+ };
122
+ }
123
+ return { ok: true, value: withoutAt };
124
+ }
125
+ function parseTellaskSpecialCall(call) {
126
+ if (!isTellaskSpecialFunctionName(call.name)) {
127
+ return { ok: false, error: `unsupported tellask special function '${call.name}'` };
128
+ }
129
+ const argsResult = parseFuncCallArgsObject(call);
130
+ if (!argsResult.ok) {
131
+ return argsResult;
132
+ }
133
+ const args = argsResult.value;
134
+ const tellaskContent = readRequiredStringField(args, 'tellaskContent');
135
+ if (!tellaskContent.ok) {
136
+ return tellaskContent;
137
+ }
138
+ switch (call.name) {
139
+ case 'tellaskBack': {
140
+ return {
141
+ ok: true,
142
+ value: {
143
+ callId: call.id,
144
+ callName: 'tellaskBack',
145
+ tellaskContent: tellaskContent.value,
146
+ },
147
+ };
148
+ }
149
+ case 'askHuman': {
150
+ return {
151
+ ok: true,
152
+ value: {
153
+ callId: call.id,
154
+ callName: 'askHuman',
155
+ tellaskContent: tellaskContent.value,
156
+ },
157
+ };
158
+ }
159
+ case 'freshBootsReasoning': {
160
+ return {
161
+ ok: true,
162
+ value: {
163
+ callId: call.id,
164
+ callName: 'freshBootsReasoning',
165
+ tellaskContent: tellaskContent.value,
166
+ },
167
+ };
168
+ }
169
+ case 'tellask': {
170
+ const target = readTargetAgentId(args);
171
+ if (!target.ok) {
172
+ return target;
173
+ }
174
+ const normalizedTarget = normalizeTeammateTargetAgentId(target.value);
175
+ if (!normalizedTarget.ok) {
176
+ return normalizedTarget;
177
+ }
178
+ const sessionSlug = readRequiredStringField(args, 'sessionSlug');
179
+ if (!sessionSlug.ok) {
180
+ return sessionSlug;
181
+ }
182
+ if (!isValidSessionSlug(sessionSlug.value)) {
183
+ return {
184
+ ok: false,
185
+ error: "field 'sessionSlug' must match <alpha>[<alnum|_|->]*(.<segment>)*, e.g. 'build-loop' or 'repo.sync'",
186
+ };
187
+ }
188
+ return {
189
+ ok: true,
190
+ value: {
191
+ callId: call.id,
192
+ callName: 'tellask',
193
+ targetAgentId: normalizedTarget.value,
194
+ sessionSlug: sessionSlug.value,
195
+ mentionList: [`@${normalizedTarget.value}`],
196
+ tellaskContent: tellaskContent.value,
197
+ },
198
+ };
199
+ }
200
+ case 'tellaskSessionless': {
201
+ const target = readTargetAgentId(args);
202
+ if (!target.ok) {
203
+ return target;
204
+ }
205
+ const normalizedTarget = normalizeTeammateTargetAgentId(target.value);
206
+ if (!normalizedTarget.ok) {
207
+ return normalizedTarget;
208
+ }
209
+ return {
210
+ ok: true,
211
+ value: {
212
+ callId: call.id,
213
+ callName: 'tellaskSessionless',
214
+ targetAgentId: normalizedTarget.value,
215
+ mentionList: [`@${normalizedTarget.value}`],
216
+ tellaskContent: tellaskContent.value,
217
+ },
218
+ };
219
+ }
220
+ }
221
+ }
222
+ function classifyTellaskSpecialFunctionCalls(funcCalls) {
223
+ const specialCalls = [];
224
+ const normalCalls = [];
225
+ const parseIssues = [];
226
+ for (const call of funcCalls) {
227
+ if (!isTellaskSpecialFunctionName(call.name)) {
228
+ normalCalls.push(call);
229
+ continue;
230
+ }
231
+ const parsed = parseTellaskSpecialCall(call);
232
+ if (!parsed.ok) {
233
+ parseIssues.push({ call, error: parsed.error });
234
+ continue;
235
+ }
236
+ specialCalls.push(parsed.value);
237
+ }
238
+ return { specialCalls, normalCalls, parseIssues };
239
+ }
50
240
  function showErrorToAi(err) {
51
241
  try {
52
242
  if (err instanceof Error) {
@@ -76,7 +266,7 @@ async function syncPendingTellaskReminderBestEffort(dlg, where) {
76
266
  await dlg.processReminderUpdates();
77
267
  }
78
268
  catch (err) {
79
- log_1.log.warn('Failed to sync pending tellask reminder', {
269
+ log_1.log.warn('Failed to sync pending tellask reminder', undefined, {
80
270
  where,
81
271
  dialogId: dlg.id.selfId,
82
272
  rootId: dlg.id.rootId,
@@ -84,75 +274,12 @@ async function syncPendingTellaskReminderBestEffort(dlg, where) {
84
274
  });
85
275
  }
86
276
  }
87
- function isValidTellaskSession(tellaskSession) {
88
- const segments = tellaskSession.split('.');
277
+ function isValidSessionSlug(sessionSlug) {
278
+ const segments = sessionSlug.split('.');
89
279
  if (segments.length === 0)
90
280
  return false;
91
281
  return segments.every((segment) => /^[a-zA-Z][a-zA-Z0-9_-]*$/.test(segment));
92
282
  }
93
- function parseTellaskSessionDirectiveFromHeadline(tellaskHead) {
94
- const re = /(^|\s)!tellaskSession\s+([^\s]+)/g;
95
- const ids = [];
96
- for (const match of tellaskHead.matchAll(re)) {
97
- const raw = match[2] ?? '';
98
- const candidate = raw.trim();
99
- const m = candidate.match(/^([a-zA-Z][a-zA-Z0-9_-]*(?:\.[a-zA-Z0-9_-]+)*)/);
100
- const tellaskSession = (m?.[1] ?? '').trim();
101
- if (!isValidTellaskSession(tellaskSession)) {
102
- return { kind: 'invalid' };
103
- }
104
- ids.push(tellaskSession);
105
- }
106
- const unique = Array.from(new Set(ids));
107
- if (unique.length === 0)
108
- return { kind: 'none' };
109
- if (unique.length === 1)
110
- return { kind: 'one', tellaskSession: unique[0] ?? '' };
111
- return { kind: 'multiple' };
112
- }
113
- function extractSingleTellaskSessionFromHeadline(tellaskHead) {
114
- const parsed = parseTellaskSessionDirectiveFromHeadline(tellaskHead);
115
- if (parsed.kind === 'one')
116
- return parsed.tellaskSession;
117
- return null;
118
- }
119
- function parseTeammateTellask(firstMention, tellaskHead, currentDialog) {
120
- if (firstMention === 'self') {
121
- const agentId = currentDialog?.agentId ?? 'self';
122
- const tellaskSession = extractSingleTellaskSessionFromHeadline(tellaskHead);
123
- if (tellaskSession) {
124
- return {
125
- type: 'B',
126
- agentId,
127
- tellaskSession,
128
- };
129
- }
130
- return {
131
- type: 'C',
132
- agentId,
133
- };
134
- }
135
- const tellaskSession = extractSingleTellaskSessionFromHeadline(tellaskHead);
136
- if (tellaskSession) {
137
- return {
138
- type: 'B',
139
- agentId: firstMention,
140
- tellaskSession,
141
- };
142
- }
143
- if (currentDialog &&
144
- currentDialog.supdialog &&
145
- firstMention === currentDialog.supdialog.agentId) {
146
- return {
147
- type: 'A',
148
- agentId: firstMention,
149
- };
150
- }
151
- return {
152
- type: 'C',
153
- agentId: firstMention,
154
- };
155
- }
156
283
  function resolveFbrEffort(member) {
157
284
  const raw = member?.fbr_effort;
158
285
  if (typeof raw !== 'number' || !Number.isFinite(raw))
@@ -183,8 +310,8 @@ async function scheduleInheritedAgentPrimingForSubdialog(callerDialog, subdialog
183
310
  const agentPrimingModule = await agentPrimingModulePromise;
184
311
  await agentPrimingModule.scheduleAgentPrimingForNewDialog(subdialog, { mode: inheritedMode });
185
312
  }
186
- async function createSubDialogWithInheritedPriming(callerDialog, targetAgentId, tellaskHead, tellaskBody, options) {
187
- const subdialog = await callerDialog.createSubDialog(targetAgentId, tellaskHead, tellaskBody, options);
313
+ async function createSubDialogWithInheritedPriming(callerDialog, targetAgentId, mentionList, tellaskContent, options) {
314
+ const subdialog = await callerDialog.createSubDialog(targetAgentId, mentionList, tellaskContent, options);
188
315
  await scheduleInheritedAgentPrimingForSubdialog(callerDialog, subdialog);
189
316
  return subdialog;
190
317
  }
@@ -192,14 +319,14 @@ async function updateSubdialogAssignment(subdialog, assignment) {
192
319
  subdialog.assignmentFromSup = assignment;
193
320
  await persistence_1.DialogPersistence.updateSubdialogAssignment(subdialog.id, assignment);
194
321
  }
195
- async function lookupLiveRegisteredSubdialog(rootDialog, agentId, tellaskSession) {
196
- const existing = rootDialog.lookupSubdialog(agentId, tellaskSession);
322
+ async function lookupLiveRegisteredSubdialog(rootDialog, agentId, sessionSlug) {
323
+ const existing = rootDialog.lookupSubdialog(agentId, sessionSlug);
197
324
  if (!existing) {
198
325
  return undefined;
199
326
  }
200
- const existingSession = existing.tellaskSession;
327
+ const existingSession = existing.sessionSlug;
201
328
  if (!existingSession) {
202
- throw new Error(`Type B registry invariant violation: lookupSubdialog returned entry without tellaskSession (root=${rootDialog.id.valueOf()} sub=${existing.id.valueOf()})`);
329
+ throw new Error(`Type B registry invariant violation: lookupSubdialog returned entry without sessionSlug (root=${rootDialog.id.valueOf()} sub=${existing.id.valueOf()})`);
203
330
  }
204
331
  const latest = await persistence_1.DialogPersistence.loadDialogLatest(existing.id, rootDialog.status);
205
332
  const runState = latest?.runState;
@@ -211,11 +338,11 @@ async function lookupLiveRegisteredSubdialog(rootDialog, agentId, tellaskSession
211
338
  throw new Error(`Failed to unregister dead registered subdialog: root=${rootDialog.id.valueOf()} sub=${existing.id.valueOf()} session=${existingSession}`);
212
339
  }
213
340
  await rootDialog.saveSubdialogRegistry();
214
- log_1.log.info('Pruned dead registered subdialog from Type B registry', undefined, {
341
+ log_1.log.debug('Pruned dead registered subdialog from Type B registry', undefined, {
215
342
  rootId: rootDialog.id.rootId,
216
343
  subdialogId: existing.id.selfId,
217
344
  agentId: existing.agentId,
218
- tellaskSession: existingSession,
345
+ sessionSlug: existingSession,
219
346
  });
220
347
  return undefined;
221
348
  }
@@ -241,181 +368,21 @@ async function extractSupdialogResponseForTypeA(supdialog) {
241
368
  return extractLastAssistantResponse(supdialog.msgs, 'Supdialog completed without producing output.');
242
369
  }
243
370
  catch (err) {
244
- log_1.log.warn('Failed to extract supdialog response for Type A', { error: err });
371
+ log_1.log.warn('Failed to extract supdialog response for Type A', err);
245
372
  return 'Supdialog completed with errors.';
246
373
  }
247
374
  }
248
- function isValidMentionChar(char) {
249
- const charCode = char.charCodeAt(0);
250
- return ((charCode >= 48 && charCode <= 57) ||
251
- (charCode >= 65 && charCode <= 90) ||
252
- (charCode >= 97 && charCode <= 122) ||
253
- char === '_' ||
254
- char === '-' ||
255
- char === '.' ||
256
- /\p{L}/u.test(char) ||
257
- /\p{N}/u.test(char));
258
- }
259
- function trimTrailingDots(value) {
260
- let out = value;
261
- while (out.endsWith('.'))
262
- out = out.slice(0, -1);
263
- return out;
264
- }
265
- function isMentionBoundaryChar(char) {
266
- if (char === '' || char === '\n' || char === '\t' || char === ' ')
267
- return true;
268
- return !isValidMentionChar(char);
269
- }
270
- function extractMentionIdsFromHeadline(tellaskHead) {
271
- const out = [];
272
- const seen = new Set();
273
- for (let i = 0; i < tellaskHead.length; i++) {
274
- const ch = tellaskHead[i] ?? '';
275
- if (ch !== '@')
276
- continue;
277
- const prev = i === 0 ? '' : (tellaskHead[i - 1] ?? '');
278
- if (!isMentionBoundaryChar(prev))
279
- continue;
280
- let j = i + 1;
281
- let raw = '';
282
- while (j < tellaskHead.length) {
283
- const c = tellaskHead[j] ?? '';
284
- if (c !== '' && isValidMentionChar(c)) {
285
- raw += c;
286
- j += 1;
287
- continue;
288
- }
289
- break;
290
- }
291
- const id = trimTrailingDots(raw);
292
- if (id === '')
293
- continue;
294
- if (!seen.has(id)) {
295
- seen.add(id);
296
- out.push(id);
297
- }
298
- i = j - 1;
299
- }
300
- return out;
301
- }
302
- async function emitMalformedTellaskResponses(dlg, collectedCalls) {
303
- const toolOutputs = [];
304
- const language = (0, runtime_language_1.getWorkLanguage)();
305
- for (const call of collectedCalls) {
306
- if (call.validation.kind !== 'malformed')
307
- continue;
308
- const firstLineAfterPrefix = (call.tellaskHead.split('\n')[0] ?? '').trim();
309
- const msg = (0, driver_messages_1.formatDomindsNoteMalformedTellaskCall)(language, call.validation.reason, {
310
- firstLineAfterPrefix,
311
- });
312
- toolOutputs.push({
313
- type: 'environment_msg',
314
- role: 'user',
315
- content: msg,
316
- });
317
- toolOutputs.push({
318
- type: 'tellask_result_msg',
319
- role: 'tool',
320
- responderId: 'dominds',
321
- tellaskHead: call.tellaskHead,
322
- status: 'failed',
323
- content: msg,
324
- });
325
- await dlg.receiveTeammateCallResult('dominds', call.tellaskHead, msg, 'failed', call.callId);
326
- dlg.clearCurrentCallId();
327
- }
328
- return toolOutputs;
329
- }
330
- async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, callId, callbacks, options) {
375
+ async function executeTellaskCall(dlg, agent, mentionList, body, callId, callbacks, options) {
331
376
  const toolOutputs = [];
332
377
  let suspend = false;
333
378
  const subdialogsCreated = [];
379
+ const callName = options.callName;
380
+ const parseResult = options.parseResult;
381
+ const normalizedMentionList = mentionList ?? [];
382
+ const isFreshBootsCall = callName === 'freshBootsReasoning';
334
383
  const team = await team_1.Team.load();
335
- const isSelfAlias = firstMention === 'self';
336
- const isTellaskerAlias = firstMention === 'tellasker';
337
- const member = isSelfAlias
338
- ? team.getMember(dlg.agentId)
339
- : isTellaskerAlias
340
- ? null
341
- : team.getMember(firstMention);
342
- const allowMultiTeammateTargets = options?.allowMultiTeammateTargets ?? true;
343
- if (allowMultiTeammateTargets && member && !isSelfAlias && !isTellaskerAlias) {
344
- const mentioned = extractMentionIdsFromHeadline(tellaskHead);
345
- const uniqueMentioned = Array.from(new Set(mentioned));
346
- const knownTargets = uniqueMentioned.filter((id) => team.getMember(id) !== null);
347
- if (!knownTargets.includes(firstMention)) {
348
- knownTargets.unshift(firstMention);
349
- }
350
- if (knownTargets.length >= 2) {
351
- const unknown = uniqueMentioned.filter((id) => team.getMember(id) === null &&
352
- id !== 'self' &&
353
- id !== 'tellasker' &&
354
- id !== 'human' &&
355
- id !== 'dominds');
356
- if (unknown.length > 0) {
357
- const msg = (0, driver_messages_1.formatDomindsNoteInvalidMultiTeammateTargets)((0, runtime_language_1.getWorkLanguage)(), { unknown });
358
- toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
359
- toolOutputs.push({
360
- type: 'tellask_result_msg',
361
- role: 'tool',
362
- responderId: 'dominds',
363
- tellaskHead,
364
- status: 'failed',
365
- content: msg,
366
- });
367
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
368
- dlg.clearCurrentCallId();
369
- return { toolOutputs, suspend: false, subdialogsCreated: [] };
370
- }
371
- if (options?.skipTellaskSessionDirectiveValidation !== true) {
372
- const tellaskSessionDirective = parseTellaskSessionDirectiveFromHeadline(tellaskHead);
373
- if (tellaskSessionDirective.kind === 'multiple') {
374
- const msg = (0, driver_messages_1.formatDomindsNoteMultipleTellaskSessionDirectives)((0, runtime_language_1.getWorkLanguage)());
375
- toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
376
- toolOutputs.push({
377
- type: 'tellask_result_msg',
378
- role: 'tool',
379
- responderId: 'dominds',
380
- tellaskHead,
381
- status: 'failed',
382
- content: msg,
383
- });
384
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
385
- dlg.clearCurrentCallId();
386
- return { toolOutputs, suspend: false, subdialogsCreated: [] };
387
- }
388
- if (tellaskSessionDirective.kind === 'invalid') {
389
- const msg = (0, driver_messages_1.formatDomindsNoteInvalidTellaskSessionDirective)((0, runtime_language_1.getWorkLanguage)());
390
- toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
391
- toolOutputs.push({
392
- type: 'tellask_result_msg',
393
- role: 'tool',
394
- responderId: 'dominds',
395
- tellaskHead,
396
- status: 'failed',
397
- content: msg,
398
- });
399
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
400
- dlg.clearCurrentCallId();
401
- return { toolOutputs, suspend: false, subdialogsCreated: [] };
402
- }
403
- }
404
- const perTargetResults = await Promise.all(knownTargets.map(async (targetId) => {
405
- return await executeTellaskCall(dlg, agent, targetId, tellaskHead, body, callId, callbacks, {
406
- allowMultiTeammateTargets: false,
407
- collectiveTargets: knownTargets,
408
- skipTellaskSessionDirectiveValidation: true,
409
- });
410
- }));
411
- return {
412
- toolOutputs: perTargetResults.flatMap((r) => r.toolOutputs),
413
- suspend: perTargetResults.some((r) => r.suspend),
414
- subdialogsCreated: perTargetResults.flatMap((r) => r.subdialogsCreated),
415
- };
416
- }
417
- }
418
- const isQ4H = firstMention === 'human';
384
+ const member = parseResult !== null && parseResult.type !== 'A' ? team.getMember(parseResult.agentId) : null;
385
+ const isQ4H = callName === 'askHuman';
419
386
  if (isQ4H) {
420
387
  try {
421
388
  const normalizedCallId = callId.trim();
@@ -428,8 +395,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
428
395
  .filter((value) => value !== '' && value !== normalizedCallId)));
429
396
  const question = {
430
397
  id: questionId,
431
- tellaskHead: tellaskHead.trim(),
432
- bodyContent: body.trim(),
398
+ tellaskContent: body.trim(),
433
399
  askedAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
434
400
  callId: normalizedCallId,
435
401
  remainingCallIds: normalizedRemainingCallIds.length > 0 ? normalizedRemainingCallIds : undefined,
@@ -444,8 +410,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
444
410
  question: {
445
411
  id: question.id,
446
412
  selfId: dlg.id.selfId,
447
- tellaskHead: question.tellaskHead,
448
- bodyContent: question.bodyContent,
413
+ tellaskContent: question.tellaskContent,
449
414
  askedAt: question.askedAt,
450
415
  callId: question.callId,
451
416
  remainingCallIds: question.remainingCallIds,
@@ -471,7 +436,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
471
436
  }
472
437
  log_1.log.error('Q4H: Failed to register question', q4hErr, {
473
438
  dialogId: dlg.id.selfId,
474
- tellaskHead: tellaskHead.substring(0, 100),
439
+ callId,
475
440
  });
476
441
  const msg = (0, driver_messages_1.formatDomindsNoteQ4HRegisterFailed)((0, runtime_language_1.getWorkLanguage)(), { error: errMsg });
477
442
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
@@ -479,89 +444,47 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
479
444
  type: 'tellask_result_msg',
480
445
  role: 'tool',
481
446
  responderId: 'dominds',
482
- tellaskHead,
447
+ mentionList: normalizedMentionList,
448
+ tellaskContent: body,
483
449
  status: 'failed',
450
+ callId,
484
451
  content: msg,
485
452
  });
486
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
453
+ await dlg.receiveTeammateCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
487
454
  dlg.clearCurrentCallId();
488
455
  return { toolOutputs, suspend: false, subdialogsCreated: [] };
489
456
  }
490
457
  }
491
- if (member || isSelfAlias || isTellaskerAlias) {
492
- if (isTellaskerAlias && !(dlg instanceof dialog_1.SubDialog)) {
493
- const response = (0, driver_messages_1.formatDomindsNoteTellaskerOnlyInSidelineDialog)((0, runtime_language_1.getWorkLanguage)());
494
- try {
495
- await dlg.receiveTeammateResponse('dominds', tellaskHead, 'failed', dlg.id, {
496
- response,
497
- agentId: 'dominds',
498
- callId,
499
- originMemberId: dlg.agentId,
500
- });
501
- }
502
- catch (err) {
503
- log_1.log.warn('Failed to emit @tellasker misuse response', err, {
504
- dialogId: dlg.id.selfId,
505
- agentId: dlg.agentId,
506
- });
507
- }
508
- return { toolOutputs, suspend: false, subdialogsCreated: [] };
458
+ if (parseResult) {
459
+ if (callName === 'tellaskBack' && parseResult.type !== 'A') {
460
+ throw new Error(`tellaskBack invariant violation: expected Type A parseResult (callId=${callId}, got=${parseResult.type})`);
509
461
  }
510
- if (options?.skipTellaskSessionDirectiveValidation !== true) {
511
- const tellaskSessionDirective = parseTellaskSessionDirectiveFromHeadline(tellaskHead);
512
- if (isTellaskerAlias && tellaskSessionDirective.kind !== 'none') {
513
- const response = (0, driver_messages_1.formatDomindsNoteTellaskerNoTellaskSession)((0, runtime_language_1.getWorkLanguage)());
514
- try {
515
- await dlg.receiveTeammateResponse('dominds', tellaskHead, 'failed', dlg.id, {
516
- response,
517
- agentId: 'dominds',
518
- callId,
519
- originMemberId: dlg.agentId,
520
- });
521
- }
522
- catch (err) {
523
- log_1.log.warn('Failed to emit @tellasker !tellaskSession syntax error response', err, {
524
- dialogId: dlg.id.selfId,
525
- agentId: dlg.agentId,
526
- });
527
- }
528
- return { toolOutputs, suspend: false, subdialogsCreated: [] };
529
- }
530
- if (tellaskSessionDirective.kind === 'multiple') {
531
- const msg = (0, driver_messages_1.formatDomindsNoteMultipleTellaskSessionDirectives)((0, runtime_language_1.getWorkLanguage)());
532
- toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
533
- toolOutputs.push({
534
- type: 'tellask_result_msg',
535
- role: 'tool',
536
- responderId: 'dominds',
537
- tellaskHead,
538
- status: 'failed',
539
- content: msg,
540
- });
541
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
542
- dlg.clearCurrentCallId();
543
- return { toolOutputs, suspend: false, subdialogsCreated: [] };
544
- }
545
- if (tellaskSessionDirective.kind === 'invalid') {
546
- const msg = (0, driver_messages_1.formatDomindsNoteInvalidTellaskSessionDirective)((0, runtime_language_1.getWorkLanguage)());
547
- toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
548
- toolOutputs.push({
549
- type: 'tellask_result_msg',
550
- role: 'tool',
551
- responderId: 'dominds',
552
- tellaskHead,
553
- status: 'failed',
554
- content: msg,
555
- });
556
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
557
- dlg.clearCurrentCallId();
558
- return { toolOutputs, suspend: false, subdialogsCreated: [] };
559
- }
462
+ const subdialogCallName = callName === 'tellaskBack' ? 'freshBootsReasoning' : callName;
463
+ const rawCallingCourse = dlg.activeGenCourseOrUndefined ?? dlg.currentCourse;
464
+ const callingCourse = Number.isFinite(rawCallingCourse) && rawCallingCourse > 0
465
+ ? Math.floor(rawCallingCourse)
466
+ : undefined;
467
+ const firstMentionForError = options.targetForError ?? parseResult.agentId;
468
+ if (parseResult.type !== 'A' && member === null) {
469
+ const msg = (0, driver_messages_1.formatDomindsNoteTellaskForTeammatesOnly)((0, runtime_language_1.getWorkLanguage)(), {
470
+ firstMention: firstMentionForError,
471
+ });
472
+ toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
473
+ toolOutputs.push({
474
+ type: 'tellask_result_msg',
475
+ role: 'tool',
476
+ responderId: 'dominds',
477
+ mentionList: normalizedMentionList,
478
+ tellaskContent: body,
479
+ status: 'failed',
480
+ callId,
481
+ content: msg,
482
+ });
483
+ await dlg.receiveTeammateCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
484
+ dlg.clearCurrentCallId();
485
+ return { toolOutputs, suspend: false, subdialogsCreated: [] };
560
486
  }
561
- const parseResult = isTellaskerAlias
562
- ? { type: 'A', agentId: dlg.supdialog.agentId }
563
- : parseTeammateTellask(firstMention, tellaskHead, dlg);
564
- if (isSelfAlias) {
487
+ if (isFreshBootsCall) {
565
488
  const fbrEffort = resolveFbrEffort(member);
566
489
  if (fbrEffort < 1) {
567
490
  const msg = (0, driver_messages_1.formatDomindsNoteFbrDisabled)((0, runtime_language_1.getWorkLanguage)());
@@ -570,11 +493,13 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
570
493
  type: 'tellask_result_msg',
571
494
  role: 'tool',
572
495
  responderId: 'dominds',
573
- tellaskHead,
496
+ mentionList: normalizedMentionList,
497
+ tellaskContent: body,
574
498
  status: 'failed',
499
+ callId,
575
500
  content: msg,
576
501
  });
577
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
502
+ await dlg.receiveTeammateCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
578
503
  dlg.clearCurrentCallId();
579
504
  return { toolOutputs, suspend: false, subdialogsCreated: [] };
580
505
  }
@@ -584,7 +509,8 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
584
509
  const createdSubs = [];
585
510
  const pendingRecords = [];
586
511
  for (let i = 1; i <= fbrEffort; i++) {
587
- const sub = await createSubDialogWithInheritedPriming(dlg, parseResult.agentId, tellaskHead, body, {
512
+ const sub = await createSubDialogWithInheritedPriming(dlg, parseResult.agentId, mentionList, body, {
513
+ callName: subdialogCallName,
588
514
  originMemberId,
589
515
  callerDialogId: callerDialog.id.selfId,
590
516
  callId,
@@ -594,8 +520,12 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
594
520
  pendingRecords.push({
595
521
  subdialogId: sub.id.selfId,
596
522
  createdAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
597
- tellaskHead,
523
+ callName: subdialogCallName,
524
+ mentionList,
525
+ tellaskContent: body,
598
526
  targetAgentId: parseResult.agentId,
527
+ callId,
528
+ callingCourse,
599
529
  callType: 'C',
600
530
  });
601
531
  }
@@ -609,10 +539,11 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
609
539
  for (const sub of createdSubs) {
610
540
  const initPrompt = {
611
541
  content: (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
542
+ callName: subdialogCallName,
612
543
  fromAgentId: dlg.agentId,
613
544
  toAgentId: sub.agentId,
614
- tellaskHead,
615
- tellaskBody: body,
545
+ mentionList,
546
+ tellaskContent: body,
616
547
  language: (0, runtime_language_1.getWorkLanguage)(),
617
548
  collectiveTargets: options?.collectiveTargets ?? [sub.agentId],
618
549
  }),
@@ -646,16 +577,18 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
646
577
  type: 'tellask_result_msg',
647
578
  role: 'tool',
648
579
  responderId: 'dominds',
649
- tellaskHead,
580
+ mentionList: normalizedMentionList,
581
+ tellaskContent: body,
650
582
  status: 'failed',
583
+ callId,
651
584
  content: msg,
652
585
  });
653
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
586
+ await dlg.receiveTeammateCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
654
587
  dlg.clearCurrentCallId();
655
588
  return { toolOutputs, suspend: false, subdialogsCreated: [] };
656
589
  }
657
590
  const pendingOwner = callerDialog;
658
- const baseSession = parseResult.tellaskSession;
591
+ const baseSession = parseResult.sessionSlug;
659
592
  const derivedPrefix = `${baseSession}.fbr-`;
660
593
  const createdOrExisting = await (0, subdialog_txn_1.withSubdialogTxnLock)(rootDialog.id, async () => {
661
594
  const results = [];
@@ -664,14 +597,14 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
664
597
  return [baseSession];
665
598
  const set = new Set();
666
599
  for (const sub of rootDialog.getRegisteredSubdialogs()) {
667
- const tellaskSession = sub.tellaskSession;
668
- if (typeof tellaskSession !== 'string')
600
+ const sessionSlug = sub.sessionSlug;
601
+ if (typeof sessionSlug !== 'string')
669
602
  continue;
670
603
  if (sub.agentId !== parseResult.agentId)
671
604
  continue;
672
- if (!tellaskSession.startsWith(derivedPrefix))
605
+ if (!sessionSlug.startsWith(derivedPrefix))
673
606
  continue;
674
- set.add(tellaskSession);
607
+ set.add(sessionSlug);
675
608
  }
676
609
  while (set.size < desired) {
677
610
  const candidate = `${derivedPrefix}${(0, id_1.generateShortId)()}`;
@@ -688,10 +621,10 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
688
621
  };
689
622
  const sessions = ensurePoolSessions(fbrEffort);
690
623
  for (const derivedSession of sessions) {
691
- const indexedHeadLine = tellaskHead;
692
624
  const assignment = {
693
- tellaskHead: indexedHeadLine,
694
- tellaskBody: body,
625
+ callName: subdialogCallName,
626
+ mentionList,
627
+ tellaskContent: body,
695
628
  originMemberId,
696
629
  callerDialogId: callerDialog.id.selfId,
697
630
  callId,
@@ -708,24 +641,23 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
708
641
  results.push({
709
642
  kind: 'existing',
710
643
  subdialog: existing,
711
- tellaskSession: derivedSession,
712
- indexedHeadLine,
644
+ sessionSlug: derivedSession,
713
645
  });
714
646
  continue;
715
647
  }
716
- const created = await createSubDialogWithInheritedPriming(rootDialog, parseResult.agentId, indexedHeadLine, body, {
648
+ const created = await createSubDialogWithInheritedPriming(rootDialog, parseResult.agentId, mentionList, body, {
649
+ callName: subdialogCallName,
717
650
  originMemberId,
718
651
  callerDialogId: callerDialog.id.selfId,
719
652
  callId,
720
- tellaskSession: derivedSession,
653
+ sessionSlug: derivedSession,
721
654
  collectiveTargets: options?.collectiveTargets ?? [parseResult.agentId],
722
655
  });
723
656
  rootDialog.registerSubdialog(created);
724
657
  results.push({
725
658
  kind: 'created',
726
659
  subdialog: created,
727
- tellaskSession: derivedSession,
728
- indexedHeadLine,
660
+ sessionSlug: derivedSession,
729
661
  });
730
662
  }
731
663
  await rootDialog.saveSubdialogRegistry();
@@ -734,10 +666,14 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
734
666
  const pendingRecords = createdOrExisting.map((r) => ({
735
667
  subdialogId: r.subdialog.id.selfId,
736
668
  createdAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
737
- tellaskHead: r.indexedHeadLine,
669
+ callName: subdialogCallName,
670
+ mentionList,
671
+ tellaskContent: body,
738
672
  targetAgentId: parseResult.agentId,
673
+ callId,
674
+ callingCourse,
739
675
  callType: 'B',
740
- tellaskSession: r.tellaskSession,
676
+ sessionSlug: r.sessionSlug,
741
677
  }));
742
678
  await (0, subdialog_txn_1.withSubdialogTxnLock)(pendingOwner.id, async () => {
743
679
  const toRemove = new Set(pendingRecords.map((p) => p.subdialogId));
@@ -751,10 +687,11 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
751
687
  for (const r of createdOrExisting) {
752
688
  const prompt = {
753
689
  content: (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
690
+ callName: subdialogCallName,
754
691
  fromAgentId: dlg.agentId,
755
692
  toAgentId: r.subdialog.agentId,
756
- tellaskHead: r.indexedHeadLine,
757
- tellaskBody: body,
693
+ mentionList,
694
+ tellaskContent: body,
758
695
  language: (0, runtime_language_1.getWorkLanguage)(),
759
696
  collectiveTargets: options?.collectiveTargets ?? [r.subdialog.agentId],
760
697
  }),
@@ -772,44 +709,43 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
772
709
  return { toolOutputs, suspend: true, subdialogsCreated };
773
710
  }
774
711
  }
775
- const isDirectSelfCall = !isSelfAlias && !isTellaskerAlias && parseResult.agentId === dlg.agentId;
712
+ const isDirectSelfCall = !isFreshBootsCall && parseResult.agentId === dlg.agentId;
776
713
  if (isDirectSelfCall) {
777
- const response = (0, driver_messages_1.formatDomindsNoteDirectSelfCall)((0, runtime_language_1.getWorkLanguage)());
778
- try {
779
- await dlg.receiveTeammateResponse('dominds', tellaskHead, 'completed', dlg.id, {
780
- response,
781
- agentId: 'dominds',
782
- callId,
783
- originMemberId: dlg.agentId,
784
- });
785
- }
786
- catch (err) {
787
- log_1.log.warn('Failed to emit self-tellask correction response', err, {
788
- dialogId: dlg.id.selfId,
789
- agentId: dlg.agentId,
790
- });
791
- }
714
+ const msg = (0, driver_messages_1.formatDomindsNoteDirectSelfCall)((0, runtime_language_1.getWorkLanguage)());
715
+ toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
716
+ toolOutputs.push({
717
+ type: 'tellask_result_msg',
718
+ role: 'tool',
719
+ responderId: 'dominds',
720
+ mentionList: normalizedMentionList,
721
+ tellaskContent: body,
722
+ status: 'failed',
723
+ callId,
724
+ content: msg,
725
+ });
726
+ await dlg.receiveTeammateCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
727
+ dlg.clearCurrentCallId();
728
+ return { toolOutputs, suspend: false, subdialogsCreated: [] };
792
729
  }
793
730
  if (parseResult.type === 'A') {
794
731
  if (dlg instanceof dialog_1.SubDialog) {
795
732
  const supdialog = dlg.supdialog;
796
733
  dlg.setSuspensionState('suspended');
797
734
  try {
798
- const tellaskHeadForSupdialog = isTellaskerAlias && tellaskHead.startsWith('@tellasker')
799
- ? `@${supdialog.agentId}${tellaskHead.slice('@tellasker'.length)}`
800
- : tellaskHead;
801
735
  const assignment = dlg.assignmentFromSup;
802
736
  const supPrompt = {
803
737
  content: (0, inter_dialog_format_1.formatSupdialogCallPrompt)({
804
738
  fromAgentId: dlg.agentId,
805
739
  toAgentId: supdialog.agentId,
806
740
  subdialogRequest: {
807
- tellaskHead: tellaskHeadForSupdialog,
808
- tellaskBody: body,
741
+ callName,
742
+ mentionList,
743
+ tellaskContent: body,
809
744
  },
810
745
  supdialogAssignment: {
811
- tellaskHead: assignment.tellaskHead,
812
- tellaskBody: assignment.tellaskBody,
746
+ callName: assignment.callName,
747
+ mentionList: assignment.mentionList,
748
+ tellaskContent: assignment.tellaskContent,
813
749
  },
814
750
  language: (0, runtime_language_1.getWorkLanguage)(),
815
751
  }),
@@ -819,9 +755,11 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
819
755
  await callbacks.driveDialog(supdialog, { humanPrompt: supPrompt, waitInQue: true });
820
756
  const responseText = await extractSupdialogResponseForTypeA(supdialog);
821
757
  const responseContent = (0, inter_dialog_format_1.formatTeammateResponseContent)({
758
+ callName,
822
759
  responderId: parseResult.agentId,
823
760
  requesterId: dlg.agentId,
824
- originalCallHeadLine: tellaskHead,
761
+ mentionList,
762
+ tellaskContent: body,
825
763
  responseBody: responseText,
826
764
  language: (0, runtime_language_1.getWorkLanguage)(),
827
765
  });
@@ -830,11 +768,13 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
830
768
  type: 'tellask_result_msg',
831
769
  role: 'tool',
832
770
  responderId: parseResult.agentId,
833
- tellaskHead,
771
+ mentionList,
772
+ tellaskContent: body,
834
773
  status: 'completed',
774
+ callId,
835
775
  content: responseContent,
836
776
  });
837
- await dlg.receiveTeammateResponse(parseResult.agentId, tellaskHead, 'completed', supdialog.id, {
777
+ await dlg.receiveTeammateResponse(parseResult.agentId, callName, mentionList, body, 'completed', supdialog.id, {
838
778
  response: responseText,
839
779
  agentId: parseResult.agentId,
840
780
  callId,
@@ -849,11 +789,13 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
849
789
  type: 'tellask_result_msg',
850
790
  role: 'tool',
851
791
  responderId: parseResult.agentId,
852
- tellaskHead,
792
+ mentionList,
793
+ tellaskContent: body,
853
794
  status: 'failed',
795
+ callId,
854
796
  content: errorText,
855
797
  });
856
- await dlg.receiveTeammateResponse(parseResult.agentId, tellaskHead, 'failed', supdialog.id, {
798
+ await dlg.receiveTeammateResponse(parseResult.agentId, callName, mentionList, body, 'failed', supdialog.id, {
857
799
  response: errorText,
858
800
  agentId: parseResult.agentId,
859
801
  callId,
@@ -862,7 +804,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
862
804
  }
863
805
  }
864
806
  else {
865
- log_1.log.warn('Type A call on dialog without supdialog, falling back to Type C', {
807
+ log_1.log.warn('Type A call on dialog without supdialog, falling back to Type C', undefined, {
866
808
  dialogId: dlg.id.selfId,
867
809
  });
868
810
  }
@@ -877,24 +819,29 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
877
819
  rootDialog = dlg.rootDialog;
878
820
  }
879
821
  if (!rootDialog) {
880
- log_1.log.warn('Type B call without root dialog, falling back to Type C', {
822
+ log_1.log.warn('Type B call without root dialog, falling back to Type C', undefined, {
881
823
  dialogId: dlg.id.selfId,
882
824
  });
883
825
  try {
884
- const sub = await createSubDialogWithInheritedPriming(dlg, parseResult.agentId, tellaskHead, body, {
826
+ const sub = await createSubDialogWithInheritedPriming(dlg, parseResult.agentId, mentionList, body, {
827
+ callName: subdialogCallName,
885
828
  originMemberId: dlg.agentId,
886
829
  callerDialogId: callerDialog.id.selfId,
887
830
  callId,
888
- tellaskSession: parseResult.tellaskSession,
831
+ sessionSlug: parseResult.sessionSlug,
889
832
  collectiveTargets: options?.collectiveTargets ?? [parseResult.agentId],
890
833
  });
891
834
  const pendingRecord = {
892
835
  subdialogId: sub.id.selfId,
893
836
  createdAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
894
- tellaskHead,
837
+ callName: subdialogCallName,
838
+ mentionList,
839
+ tellaskContent: body,
895
840
  targetAgentId: parseResult.agentId,
841
+ callId,
842
+ callingCourse,
896
843
  callType: 'C',
897
- tellaskSession: parseResult.tellaskSession,
844
+ sessionSlug: parseResult.sessionSlug,
898
845
  };
899
846
  await (0, subdialog_txn_1.withSubdialogTxnLock)(dlg.id, async () => {
900
847
  await persistence_1.DialogPersistence.appendPendingSubdialog(dlg.id, pendingRecord);
@@ -902,10 +849,11 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
902
849
  await syncPendingTellaskReminderBestEffort(dlg, 'driver-v2:executeTellaskCall:TypeB-fallback:appendPending');
903
850
  const initPrompt = {
904
851
  content: (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
852
+ callName: subdialogCallName,
905
853
  fromAgentId: dlg.agentId,
906
854
  toAgentId: sub.agentId,
907
- tellaskHead,
908
- tellaskBody: body,
855
+ mentionList,
856
+ tellaskContent: body,
909
857
  language: (0, runtime_language_1.getWorkLanguage)(),
910
858
  collectiveTargets: options?.collectiveTargets ?? [sub.agentId],
911
859
  }),
@@ -928,8 +876,9 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
928
876
  else {
929
877
  const originMemberId = dlg.agentId;
930
878
  const assignment = {
931
- tellaskHead,
932
- tellaskBody: body,
879
+ callName: subdialogCallName,
880
+ mentionList,
881
+ tellaskContent: body,
933
882
  originMemberId,
934
883
  callerDialogId: callerDialog.id.selfId,
935
884
  callId,
@@ -937,7 +886,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
937
886
  };
938
887
  const pendingOwner = callerDialog;
939
888
  const result = await (0, subdialog_txn_1.withSubdialogTxnLock)(rootDialog.id, async () => {
940
- const existing = await lookupLiveRegisteredSubdialog(rootDialog, parseResult.agentId, parseResult.tellaskSession);
889
+ const existing = await lookupLiveRegisteredSubdialog(rootDialog, parseResult.agentId, parseResult.sessionSlug);
941
890
  if (existing) {
942
891
  try {
943
892
  await updateSubdialogAssignment(existing, assignment);
@@ -947,11 +896,12 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
947
896
  }
948
897
  return { kind: 'existing', subdialog: existing };
949
898
  }
950
- const created = await createSubDialogWithInheritedPriming(rootDialog, parseResult.agentId, tellaskHead, body, {
899
+ const created = await createSubDialogWithInheritedPriming(rootDialog, parseResult.agentId, mentionList, body, {
900
+ callName: subdialogCallName,
951
901
  originMemberId,
952
902
  callerDialogId: callerDialog.id.selfId,
953
903
  callId,
954
- tellaskSession: parseResult.tellaskSession,
904
+ sessionSlug: parseResult.sessionSlug,
955
905
  collectiveTargets: options?.collectiveTargets ?? [parseResult.agentId],
956
906
  });
957
907
  rootDialog.registerSubdialog(created);
@@ -961,10 +911,14 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
961
911
  const pendingRecord = {
962
912
  subdialogId: result.subdialog.id.selfId,
963
913
  createdAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
964
- tellaskHead,
914
+ callName: subdialogCallName,
915
+ mentionList,
916
+ tellaskContent: body,
965
917
  targetAgentId: parseResult.agentId,
918
+ callId,
919
+ callingCourse,
966
920
  callType: 'B',
967
- tellaskSession: parseResult.tellaskSession,
921
+ sessionSlug: parseResult.sessionSlug,
968
922
  };
969
923
  await (0, subdialog_txn_1.withSubdialogTxnLock)(pendingOwner.id, async () => {
970
924
  await persistence_1.DialogPersistence.mutatePendingSubdialogs(pendingOwner.id, (previous) => {
@@ -977,10 +931,11 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
977
931
  if (result.kind === 'existing') {
978
932
  const resumePrompt = {
979
933
  content: (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
934
+ callName: subdialogCallName,
980
935
  fromAgentId: dlg.agentId,
981
936
  toAgentId: result.subdialog.agentId,
982
- tellaskHead,
983
- tellaskBody: body,
937
+ mentionList,
938
+ tellaskContent: body,
984
939
  language: (0, runtime_language_1.getWorkLanguage)(),
985
940
  collectiveTargets: options?.collectiveTargets ?? [result.subdialog.agentId],
986
941
  }),
@@ -997,10 +952,11 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
997
952
  else {
998
953
  const initPrompt = {
999
954
  content: (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
955
+ callName: subdialogCallName,
1000
956
  fromAgentId: rootDialog.agentId,
1001
957
  toAgentId: result.subdialog.agentId,
1002
- tellaskHead,
1003
- tellaskBody: body,
958
+ mentionList,
959
+ tellaskContent: body,
1004
960
  language: (0, runtime_language_1.getWorkLanguage)(),
1005
961
  collectiveTargets: options?.collectiveTargets ?? [result.subdialog.agentId],
1006
962
  }),
@@ -1020,7 +976,8 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
1020
976
  }
1021
977
  if (parseResult.type === 'C') {
1022
978
  try {
1023
- const sub = await createSubDialogWithInheritedPriming(dlg, parseResult.agentId, tellaskHead, body, {
979
+ const sub = await createSubDialogWithInheritedPriming(dlg, parseResult.agentId, mentionList, body, {
980
+ callName: subdialogCallName,
1024
981
  originMemberId: dlg.agentId,
1025
982
  callerDialogId: dlg.id.selfId,
1026
983
  callId,
@@ -1029,8 +986,12 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
1029
986
  const pendingRecord = {
1030
987
  subdialogId: sub.id.selfId,
1031
988
  createdAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
1032
- tellaskHead,
989
+ callName: subdialogCallName,
990
+ mentionList,
991
+ tellaskContent: body,
1033
992
  targetAgentId: parseResult.agentId,
993
+ callId,
994
+ callingCourse,
1034
995
  callType: 'C',
1035
996
  };
1036
997
  await (0, subdialog_txn_1.withSubdialogTxnLock)(dlg.id, async () => {
@@ -1039,10 +1000,11 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
1039
1000
  await syncPendingTellaskReminderBestEffort(dlg, 'driver-v2:executeTellaskCall:TypeC:appendPending');
1040
1001
  const initPrompt = {
1041
1002
  content: (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
1003
+ callName,
1042
1004
  fromAgentId: dlg.agentId,
1043
1005
  toAgentId: sub.agentId,
1044
- tellaskHead,
1045
- tellaskBody: body,
1006
+ mentionList,
1007
+ tellaskContent: body,
1046
1008
  language: (0, runtime_language_1.getWorkLanguage)(),
1047
1009
  collectiveTargets: options?.collectiveTargets ?? [sub.agentId],
1048
1010
  }),
@@ -1064,83 +1026,223 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
1064
1026
  }
1065
1027
  }
1066
1028
  else {
1067
- const msg = (0, driver_messages_1.formatDomindsNoteTellaskForTeammatesOnly)((0, runtime_language_1.getWorkLanguage)(), { firstMention });
1029
+ const msg = callName === 'tellaskBack'
1030
+ ? (0, driver_messages_1.formatDomindsNoteTellaskerOnlyInSidelineDialog)((0, runtime_language_1.getWorkLanguage)())
1031
+ : (0, driver_messages_1.formatDomindsNoteTellaskForTeammatesOnly)((0, runtime_language_1.getWorkLanguage)(), {
1032
+ firstMention: options.targetForError ?? 'unknown',
1033
+ });
1068
1034
  toolOutputs.push({ type: 'environment_msg', role: 'user', content: msg });
1069
1035
  toolOutputs.push({
1070
1036
  type: 'tellask_result_msg',
1071
1037
  role: 'tool',
1072
1038
  responderId: 'dominds',
1073
- tellaskHead,
1039
+ mentionList: normalizedMentionList,
1040
+ tellaskContent: body,
1074
1041
  status: 'failed',
1042
+ callId,
1075
1043
  content: msg,
1076
1044
  });
1077
- await dlg.receiveTeammateCallResult('dominds', tellaskHead, msg, 'failed', callId);
1045
+ await dlg.receiveTeammateCallResult('dominds', callName, mentionList, body, msg, 'failed', callId);
1078
1046
  dlg.clearCurrentCallId();
1079
1047
  }
1080
1048
  return { toolOutputs, suspend, subdialogsCreated };
1081
1049
  }
1082
- async function executeTellaskCalls(args) {
1083
- const { dlg, agent, collectedCalls } = args;
1084
- const callbacks = ensureCallbacks(args.callbacks);
1085
- const malformedToolOutputs = await emitMalformedTellaskResponses(dlg, collectedCalls);
1086
- const validCalls = collectedCalls.filter((call) => call.validation.kind === 'valid');
1087
- const q4hCalls = validCalls.filter((call) => call.validation.firstMention === 'human');
1088
- const nonQ4HCalls = validCalls
1089
- .filter((call) => call.validation.firstMention !== 'human')
1090
- .map((call) => ({ ...call }));
1091
- let mergedQ4HCall = null;
1092
- if (q4hCalls.length === 1) {
1093
- mergedQ4HCall = { ...q4hCalls[0] };
1050
+ async function emitTellaskSpecialCallEvents(args) {
1051
+ await args.dlg.callingStart({
1052
+ callName: args.callName,
1053
+ callId: args.callId,
1054
+ mentionList: args.mentionList,
1055
+ tellaskContent: args.tellaskContent,
1056
+ });
1057
+ }
1058
+ function toExecutableValidTellaskCall(call) {
1059
+ switch (call.callName) {
1060
+ case 'tellaskBack':
1061
+ return {
1062
+ callName: call.callName,
1063
+ tellaskContent: call.tellaskContent,
1064
+ callId: call.callId,
1065
+ };
1066
+ case 'tellask':
1067
+ return {
1068
+ callName: call.callName,
1069
+ mentionList: [...call.mentionList],
1070
+ tellaskContent: call.tellaskContent,
1071
+ targetAgentId: call.targetAgentId,
1072
+ sessionSlug: call.sessionSlug,
1073
+ callId: call.callId,
1074
+ };
1075
+ case 'tellaskSessionless':
1076
+ return {
1077
+ callName: call.callName,
1078
+ mentionList: [...call.mentionList],
1079
+ tellaskContent: call.tellaskContent,
1080
+ targetAgentId: call.targetAgentId,
1081
+ callId: call.callId,
1082
+ };
1083
+ case 'askHuman':
1084
+ return {
1085
+ callName: call.callName,
1086
+ tellaskContent: call.tellaskContent,
1087
+ callId: call.callId,
1088
+ };
1089
+ case 'freshBootsReasoning':
1090
+ return {
1091
+ callName: call.callName,
1092
+ tellaskContent: call.tellaskContent,
1093
+ callId: call.callId,
1094
+ };
1094
1095
  }
1095
- else if (q4hCalls.length > 1) {
1096
- const primary = q4hCalls[0];
1097
- const remainingCallIds = q4hCalls
1098
- .slice(1)
1099
- .map((call) => call.callId.trim())
1100
- .filter((callId) => callId !== '');
1101
- const language = (0, runtime_language_1.getWorkLanguage)();
1102
- const intro = language === 'zh'
1103
- ? `我这次有 ${q4hCalls.length} 个问题,想请你一次性回复:`
1104
- : `I have ${q4hCalls.length} questions this round. Please answer them in one response:`;
1105
- const mergedBody = [
1106
- intro,
1107
- ...q4hCalls.map((call, index) => {
1108
- const body = call.body.trim();
1109
- const normalizedBody = body !== ''
1110
- ? body
1111
- : language === 'zh'
1112
- ? '请结合当前上下文补充这一项。'
1113
- : 'Please provide this item based on the current context.';
1114
- return language === 'zh'
1115
- ? `问题 ${index + 1}:\n${normalizedBody}`
1116
- : `Question ${index + 1}:\n${normalizedBody}`;
1117
- }),
1118
- ].join('\n\n');
1119
- mergedQ4HCall = {
1120
- ...primary,
1121
- body: mergedBody,
1122
- q4hRemainingCallIds: remainingCallIds.length > 0 ? remainingCallIds : undefined,
1123
- };
1124
- log_1.log.info('Q4H multi-question normalized into a single prompt', undefined, {
1125
- rootId: dlg.id.rootId,
1126
- selfId: dlg.id.selfId,
1127
- mergedCount: q4hCalls.length,
1128
- primaryCallId: primary.callId,
1129
- remainingCallIds,
1130
- });
1096
+ }
1097
+ function normalizeQ4HCalls(calls, dlg) {
1098
+ const q4hCalls = calls.filter((call) => call.callName === 'askHuman');
1099
+ const nonQ4HCalls = calls
1100
+ .filter((call) => call.callName !== 'askHuman')
1101
+ .map((call) => {
1102
+ switch (call.callName) {
1103
+ case 'tellask':
1104
+ case 'tellaskSessionless':
1105
+ return { ...call, mentionList: [...call.mentionList] };
1106
+ case 'tellaskBack':
1107
+ case 'freshBootsReasoning':
1108
+ return { ...call };
1109
+ }
1110
+ });
1111
+ if (q4hCalls.length <= 1) {
1112
+ return q4hCalls.length === 1 ? [...nonQ4HCalls, { ...q4hCalls[0] }] : nonQ4HCalls;
1131
1113
  }
1132
- const executionCalls = mergedQ4HCall
1133
- ? [...nonQ4HCalls, mergedQ4HCall]
1134
- : nonQ4HCalls;
1114
+ const primary = q4hCalls[0];
1115
+ const remainingCallIds = q4hCalls
1116
+ .slice(1)
1117
+ .map((call) => call.callId.trim())
1118
+ .filter((callId) => callId !== '');
1119
+ const language = (0, runtime_language_1.getWorkLanguage)();
1120
+ const intro = language === 'zh'
1121
+ ? `我这次有 ${q4hCalls.length} 个问题,想请你一次性回复:`
1122
+ : `I have ${q4hCalls.length} questions this round. Please answer them in one response:`;
1123
+ const mergedBody = [
1124
+ intro,
1125
+ ...q4hCalls.map((call, index) => {
1126
+ const body = call.tellaskContent.trim();
1127
+ const normalizedBody = body !== ''
1128
+ ? body
1129
+ : language === 'zh'
1130
+ ? '请结合当前上下文补充这一项。'
1131
+ : 'Please provide this item based on the current context.';
1132
+ return language === 'zh'
1133
+ ? `问题 ${index + 1}:\n${normalizedBody}`
1134
+ : `Question ${index + 1}:\n${normalizedBody}`;
1135
+ }),
1136
+ ].join('\n\n');
1137
+ const mergedQ4HCall = {
1138
+ callName: 'askHuman',
1139
+ callId: primary.callId,
1140
+ tellaskContent: mergedBody,
1141
+ q4hRemainingCallIds: remainingCallIds.length > 0 ? remainingCallIds : undefined,
1142
+ };
1143
+ log_1.log.debug('Q4H multi-question normalized into a single prompt', undefined, {
1144
+ rootId: dlg.id.rootId,
1145
+ selfId: dlg.id.selfId,
1146
+ mergedCount: q4hCalls.length,
1147
+ primaryCallId: primary.callId,
1148
+ remainingCallIds,
1149
+ });
1150
+ return [...nonQ4HCalls, mergedQ4HCall];
1151
+ }
1152
+ async function executeValidTellaskCalls(args) {
1153
+ const executionCalls = normalizeQ4HCalls(args.calls, args.dlg);
1135
1154
  const results = [];
1136
1155
  for (const call of executionCalls) {
1137
- const result = await executeTellaskCall(dlg, agent, call.validation.firstMention, call.tellaskHead, call.body, call.callId, callbacks, {
1156
+ const runtimeMentionList = (() => {
1157
+ switch (call.callName) {
1158
+ case 'tellask':
1159
+ case 'tellaskSessionless':
1160
+ return call.mentionList;
1161
+ case 'tellaskBack':
1162
+ case 'askHuman':
1163
+ case 'freshBootsReasoning':
1164
+ return undefined;
1165
+ }
1166
+ })();
1167
+ if (args.emitCallEvents) {
1168
+ await emitTellaskSpecialCallEvents({
1169
+ dlg: args.dlg,
1170
+ callName: call.callName,
1171
+ mentionList: runtimeMentionList,
1172
+ tellaskContent: call.tellaskContent,
1173
+ callId: call.callId,
1174
+ });
1175
+ }
1176
+ let targetForError;
1177
+ let parseResult;
1178
+ switch (call.callName) {
1179
+ case 'tellaskBack': {
1180
+ targetForError = args.dlg instanceof dialog_1.SubDialog ? args.dlg.supdialog.agentId : undefined;
1181
+ parseResult =
1182
+ args.dlg instanceof dialog_1.SubDialog ? { type: 'A', agentId: args.dlg.supdialog.agentId } : null;
1183
+ break;
1184
+ }
1185
+ case 'tellask': {
1186
+ const targetAgentId = call.targetAgentId;
1187
+ if (targetAgentId.trim() === '') {
1188
+ throw new Error(`tellask invariant violation: missing targetAgentId for callId=${call.callId}`);
1189
+ }
1190
+ if (!call.sessionSlug) {
1191
+ throw new Error(`tellask invariant violation: missing sessionSlug for callId=${call.callId}`);
1192
+ }
1193
+ targetForError = targetAgentId;
1194
+ parseResult = { type: 'B', agentId: targetAgentId, sessionSlug: call.sessionSlug };
1195
+ break;
1196
+ }
1197
+ case 'tellaskSessionless': {
1198
+ const targetAgentId = call.targetAgentId;
1199
+ if (targetAgentId.trim() === '') {
1200
+ throw new Error(`tellaskSessionless invariant violation: missing targetAgentId for callId=${call.callId}`);
1201
+ }
1202
+ targetForError = targetAgentId;
1203
+ parseResult = { type: 'C', agentId: targetAgentId };
1204
+ break;
1205
+ }
1206
+ case 'askHuman': {
1207
+ targetForError = undefined;
1208
+ parseResult = null;
1209
+ break;
1210
+ }
1211
+ case 'freshBootsReasoning': {
1212
+ targetForError = args.dlg.agentId;
1213
+ parseResult = { type: 'C', agentId: args.dlg.agentId };
1214
+ break;
1215
+ }
1216
+ }
1217
+ const result = await executeTellaskCall(args.dlg, args.agent, runtimeMentionList, call.tellaskContent, call.callId, args.callbacks, {
1218
+ callName: call.callName,
1219
+ parseResult,
1220
+ targetForError,
1138
1221
  q4hRemainingCallIds: call.q4hRemainingCallIds,
1139
1222
  });
1140
1223
  results.push(result);
1141
1224
  }
1142
- const suspend = results.some((result) => result.suspend);
1143
- const toolOutputs = [...malformedToolOutputs, ...results.flatMap((result) => result.toolOutputs)];
1144
- const subdialogsCreated = results.flatMap((result) => result.subdialogsCreated);
1145
- return { suspend, toolOutputs, subdialogsCreated };
1225
+ return {
1226
+ suspend: results.some((result) => result.suspend),
1227
+ toolOutputs: results.flatMap((result) => result.toolOutputs),
1228
+ subdialogsCreated: results.flatMap((result) => result.subdialogsCreated),
1229
+ };
1230
+ }
1231
+ async function executeTellaskSpecialCalls(args) {
1232
+ const callbacks = ensureCallbacks(args.callbacks);
1233
+ if (args.calls.length === 0) {
1234
+ return { suspend: false, toolOutputs: [], subdialogsCreated: [] };
1235
+ }
1236
+ const tellaskResult = await executeValidTellaskCalls({
1237
+ dlg: args.dlg,
1238
+ agent: args.agent,
1239
+ calls: args.calls.map((call) => toExecutableValidTellaskCall(call)),
1240
+ callbacks,
1241
+ emitCallEvents: true,
1242
+ });
1243
+ return {
1244
+ suspend: tellaskResult.suspend,
1245
+ toolOutputs: tellaskResult.toolOutputs,
1246
+ subdialogsCreated: tellaskResult.subdialogsCreated,
1247
+ };
1146
1248
  }