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
@@ -11,7 +11,7 @@ const diligence_1 = require("../../shared/diligence");
11
11
  const driver_messages_1 = require("../../shared/i18n/driver-messages");
12
12
  const runtime_language_1 = require("../../shared/runtime-language");
13
13
  const id_1 = require("../../shared/utils/id");
14
- const tellask_1 = require("../../tellask");
14
+ const time_1 = require("../../shared/utils/time");
15
15
  const taskdoc_1 = require("../../utils/taskdoc");
16
16
  const client_1 = require("../client");
17
17
  const registry_1 = require("../gen/registry");
@@ -116,6 +116,103 @@ function resolveEffectiveOptimalMaxTokens(args) {
116
116
  criticalMaxTokensConfigured,
117
117
  };
118
118
  }
119
+ const TELLASK_SPECIAL_VIRTUAL_TOOLS = [
120
+ {
121
+ type: 'func',
122
+ name: 'tellaskBack',
123
+ description: 'Ask back to the requester dialog in sideline context.',
124
+ parameters: {
125
+ type: 'object',
126
+ properties: {
127
+ tellaskContent: { type: 'string' },
128
+ },
129
+ required: ['tellaskContent'],
130
+ additionalProperties: false,
131
+ },
132
+ call: async () => {
133
+ throw new Error('tellaskBack is handled by driver-v2 tellask-special channel');
134
+ },
135
+ },
136
+ {
137
+ type: 'func',
138
+ name: 'tellask',
139
+ description: 'Create or resume a teammate sideline dialog with sessionSlug.',
140
+ parameters: {
141
+ type: 'object',
142
+ properties: {
143
+ targetAgentId: { type: 'string' },
144
+ sessionSlug: { type: 'string' },
145
+ tellaskContent: { type: 'string' },
146
+ },
147
+ required: ['targetAgentId', 'sessionSlug', 'tellaskContent'],
148
+ additionalProperties: false,
149
+ },
150
+ call: async () => {
151
+ throw new Error('tellask is handled by driver-v2 tellask-special channel');
152
+ },
153
+ },
154
+ {
155
+ type: 'func',
156
+ name: 'tellaskSessionless',
157
+ description: 'Create a one-shot teammate sideline dialog.',
158
+ parameters: {
159
+ type: 'object',
160
+ properties: {
161
+ targetAgentId: { type: 'string' },
162
+ tellaskContent: { type: 'string' },
163
+ },
164
+ required: ['targetAgentId', 'tellaskContent'],
165
+ additionalProperties: false,
166
+ },
167
+ call: async () => {
168
+ throw new Error('tellaskSessionless is handled by driver-v2 tellask-special channel');
169
+ },
170
+ },
171
+ {
172
+ type: 'func',
173
+ name: 'askHuman',
174
+ description: 'Ask for required clarification/decision from human.',
175
+ parameters: {
176
+ type: 'object',
177
+ properties: {
178
+ tellaskContent: { type: 'string' },
179
+ },
180
+ required: ['tellaskContent'],
181
+ additionalProperties: false,
182
+ },
183
+ call: async () => {
184
+ throw new Error('askHuman is handled by driver-v2 tellask-special channel');
185
+ },
186
+ },
187
+ {
188
+ type: 'func',
189
+ name: 'freshBootsReasoning',
190
+ description: 'Start an FBR sideline dialog for tool-less fresh-boots reasoning.',
191
+ parameters: {
192
+ type: 'object',
193
+ properties: {
194
+ tellaskContent: { type: 'string' },
195
+ },
196
+ required: ['tellaskContent'],
197
+ additionalProperties: false,
198
+ },
199
+ call: async () => {
200
+ throw new Error('freshBootsReasoning is handled by driver-v2 tellask-special channel');
201
+ },
202
+ },
203
+ ];
204
+ function mergeTellaskSpecialVirtualTools(baseTools) {
205
+ const merged = [...baseTools];
206
+ const seen = new Set(merged.map((tool) => tool.name));
207
+ for (const virtualTool of TELLASK_SPECIAL_VIRTUAL_TOOLS) {
208
+ if (seen.has(virtualTool.name)) {
209
+ throw new Error(`driver-v2 tool invariant violation: function tool name '${virtualTool.name}' collides with tellask-special virtual tool`);
210
+ }
211
+ merged.push(virtualTool);
212
+ seen.add(virtualTool.name);
213
+ }
214
+ return merged;
215
+ }
119
216
  function computeContextHealthSnapshot(args) {
120
217
  const modelInfo = args.providerCfg.models[args.model];
121
218
  const modelContextWindowText = modelInfo && typeof modelInfo.context_window === 'string'
@@ -242,7 +339,7 @@ async function executeFunctionCalls(args) {
242
339
  }
243
340
  catch (parseErr) {
244
341
  rawArgs = null;
245
- log_1.log.warn('driver-v2 failed to parse function arguments as JSON', {
342
+ log_1.log.warn('driver-v2 failed to parse function arguments as JSON', undefined, {
246
343
  funcName: func.name,
247
344
  arguments: func.arguments,
248
345
  error: parseErr,
@@ -311,6 +408,248 @@ async function executeFunctionCalls(args) {
311
408
  });
312
409
  return await Promise.all(functionPromises);
313
410
  }
411
+ async function executeRoutedFunctionCalls(args) {
412
+ const { dialog, agent, agentTools, funcCalls, callbacks, abortSignal } = args;
413
+ if (funcCalls.length === 0) {
414
+ return { suspendForHuman: false, pairedMessages: [], tellaskToolOutputs: [] };
415
+ }
416
+ const classified = (0, tellask_bridge_1.classifyTellaskSpecialFunctionCalls)(funcCalls);
417
+ const specialCallById = new Map(classified.specialCalls.map((call) => [call.callId, call]));
418
+ const toPersistedSpecialCallArgs = (call) => {
419
+ switch (call.callName) {
420
+ case 'tellaskBack':
421
+ return { tellaskContent: call.tellaskContent };
422
+ case 'askHuman':
423
+ return { tellaskContent: call.tellaskContent };
424
+ case 'freshBootsReasoning':
425
+ return { tellaskContent: call.tellaskContent };
426
+ case 'tellask':
427
+ return {
428
+ targetAgentId: call.targetAgentId,
429
+ sessionSlug: call.sessionSlug,
430
+ tellaskContent: call.tellaskContent,
431
+ };
432
+ case 'tellaskSessionless':
433
+ return {
434
+ targetAgentId: call.targetAgentId,
435
+ tellaskContent: call.tellaskContent,
436
+ };
437
+ }
438
+ };
439
+ for (const callMsg of funcCalls) {
440
+ const special = specialCallById.get(callMsg.id);
441
+ if (!special) {
442
+ continue;
443
+ }
444
+ try {
445
+ await dialog.persistFunctionCall(callMsg.id, callMsg.name, toPersistedSpecialCallArgs(special), callMsg.genseq);
446
+ }
447
+ catch (err) {
448
+ log_1.log.warn('driver-v2 failed to persist special function call', err, {
449
+ dialogId: dialog.id.valueOf(),
450
+ callId: callMsg.id,
451
+ callName: callMsg.name,
452
+ });
453
+ }
454
+ }
455
+ const issueResults = [];
456
+ for (const issue of classified.parseIssues) {
457
+ const result = {
458
+ type: 'func_result_msg',
459
+ id: issue.call.id,
460
+ name: issue.call.name,
461
+ content: `Invalid arguments for tellask special function '${issue.call.name}': ${issue.error}`,
462
+ role: 'tool',
463
+ genseq: issue.call.genseq,
464
+ };
465
+ await dialog.receiveFuncResult(result);
466
+ issueResults.push(result);
467
+ }
468
+ const specialResult = await (0, tellask_bridge_1.executeTellaskSpecialCalls)({
469
+ dlg: dialog,
470
+ agent,
471
+ calls: classified.specialCalls,
472
+ callbacks,
473
+ });
474
+ const specialCallIds = new Set(classified.specialCalls.map((call) => call.callId));
475
+ const genericResults = await executeFunctionCalls({
476
+ dialog,
477
+ agent,
478
+ agentTools,
479
+ funcCalls: classified.normalCalls,
480
+ abortSignal,
481
+ });
482
+ const resultByCallId = new Map();
483
+ const register = (result) => {
484
+ const existing = resultByCallId.get(result.id);
485
+ if (existing) {
486
+ throw new Error(`driver-v2 function result invariant violation: duplicate call id '${result.id}'`);
487
+ }
488
+ resultByCallId.set(result.id, result);
489
+ };
490
+ for (const result of issueResults) {
491
+ register(result);
492
+ }
493
+ for (const result of genericResults) {
494
+ register(result);
495
+ }
496
+ const pairedMessages = [];
497
+ for (const call of funcCalls) {
498
+ pairedMessages.push(call);
499
+ const result = resultByCallId.get(call.id);
500
+ if (result) {
501
+ pairedMessages.push(result);
502
+ continue;
503
+ }
504
+ if (specialCallIds.has(call.id)) {
505
+ // Tellask-special calls get func_result via dynamic context projection instead of persisted records.
506
+ continue;
507
+ }
508
+ if (!result) {
509
+ throw new Error(`driver-v2 function result invariant violation: missing result for call id '${call.id}' (${call.name})`);
510
+ }
511
+ }
512
+ return {
513
+ suspendForHuman: specialResult.suspend,
514
+ pairedMessages,
515
+ tellaskToolOutputs: specialResult.toolOutputs,
516
+ };
517
+ }
518
+ function parseUnifiedTimestampMs(ts) {
519
+ const normalized = ts.trim();
520
+ if (normalized === '') {
521
+ return null;
522
+ }
523
+ const parsed = Date.parse(normalized.replace(' ', 'T'));
524
+ if (!Number.isFinite(parsed)) {
525
+ return null;
526
+ }
527
+ return parsed;
528
+ }
529
+ function formatElapsedSecondsText(startedAtMs) {
530
+ const language = (0, runtime_language_1.getWorkLanguage)();
531
+ if (startedAtMs === null) {
532
+ return language === 'zh' ? '未知时长' : 'unknown elapsed time';
533
+ }
534
+ const elapsedMs = Math.max(0, Date.now() - startedAtMs);
535
+ const elapsedSec = Math.floor(elapsedMs / 1000);
536
+ return language === 'zh' ? `${elapsedSec} 秒` : `${elapsedSec}s`;
537
+ }
538
+ function formatPendingSpecialFuncResult(name, startedAtMs) {
539
+ const language = (0, runtime_language_1.getWorkLanguage)();
540
+ const elapsed = formatElapsedSecondsText(startedAtMs);
541
+ if (name === 'askHuman') {
542
+ return language === 'zh'
543
+ ? `Q4H 仍在等待人类回复,已持续 ${elapsed}。`
544
+ : `Q4H is still waiting for human reply (elapsed ${elapsed}).`;
545
+ }
546
+ return language === 'zh'
547
+ ? `支线对话仍在进行中,已持续 ${elapsed}。`
548
+ : `Sideline dialog is still running (elapsed ${elapsed}).`;
549
+ }
550
+ function formatResolvedAskHumanResult() {
551
+ return (0, runtime_language_1.getWorkLanguage)() === 'zh'
552
+ ? 'Q4H 已结束等待状态,请参考后续用户消息。'
553
+ : 'Q4H wait is resolved; refer to subsequent user messages.';
554
+ }
555
+ async function projectTellaskSpecialFuncResultsForContext(args) {
556
+ const hasSpecialFuncCall = args.dialogMsgsForContext.some((msg) => msg.type === 'func_call_msg' && (0, tellask_bridge_1.isTellaskSpecialFunctionName)(msg.name));
557
+ if (!hasSpecialFuncCall) {
558
+ return [...args.dialogMsgsForContext];
559
+ }
560
+ const pendingSubdialogs = await persistence_1.DialogPersistence.loadPendingSubdialogs(args.dialog.id, args.dialog.status);
561
+ const pendingSubByCallId = new Map();
562
+ for (const pending of pendingSubdialogs) {
563
+ const callId = pending.callId.trim();
564
+ if (callId === '') {
565
+ continue;
566
+ }
567
+ pendingSubByCallId.set(callId, { createdAt: pending.createdAt });
568
+ }
569
+ const pendingQ4H = await persistence_1.DialogPersistence.loadQuestions4HumanState(args.dialog.id, args.dialog.status);
570
+ const pendingQ4HByCallId = new Map();
571
+ for (const question of pendingQ4H) {
572
+ if (typeof question.callId !== 'string') {
573
+ continue;
574
+ }
575
+ const callId = question.callId.trim();
576
+ if (callId === '') {
577
+ continue;
578
+ }
579
+ pendingQ4HByCallId.set(callId, { askedAt: question.askedAt });
580
+ }
581
+ const settledByCallId = new Map();
582
+ const existingSpecialFuncResults = new Map();
583
+ for (const msg of args.dialogMsgsForContext) {
584
+ if (msg.type === 'tellask_result_msg') {
585
+ const callId = typeof msg.callId === 'string' ? msg.callId.trim() : '';
586
+ if (callId !== '') {
587
+ settledByCallId.set(callId, msg.content);
588
+ }
589
+ continue;
590
+ }
591
+ if (msg.type === 'func_result_msg' && (0, tellask_bridge_1.isTellaskSpecialFunctionName)(msg.name)) {
592
+ existingSpecialFuncResults.set(msg.id, msg);
593
+ }
594
+ }
595
+ const projected = [];
596
+ const specialCallIds = new Set();
597
+ for (const msg of args.dialogMsgsForContext) {
598
+ if (msg.type === 'func_result_msg' && specialCallIds.has(msg.id)) {
599
+ continue;
600
+ }
601
+ projected.push(msg);
602
+ if (msg.type !== 'func_call_msg') {
603
+ continue;
604
+ }
605
+ if (!(0, tellask_bridge_1.isTellaskSpecialFunctionName)(msg.name)) {
606
+ continue;
607
+ }
608
+ specialCallIds.add(msg.id);
609
+ const settled = settledByCallId.get(msg.id);
610
+ if (settled !== undefined) {
611
+ projected.push({
612
+ type: 'func_result_msg',
613
+ role: 'tool',
614
+ genseq: msg.genseq,
615
+ id: msg.id,
616
+ name: msg.name,
617
+ content: settled,
618
+ });
619
+ continue;
620
+ }
621
+ const existingResult = existingSpecialFuncResults.get(msg.id);
622
+ if (existingResult) {
623
+ projected.push(existingResult);
624
+ continue;
625
+ }
626
+ if (msg.name === 'askHuman') {
627
+ const pendingQ4HState = pendingQ4HByCallId.get(msg.id);
628
+ const content = pendingQ4HState
629
+ ? formatPendingSpecialFuncResult(msg.name, parseUnifiedTimestampMs(pendingQ4HState.askedAt))
630
+ : formatResolvedAskHumanResult();
631
+ projected.push({
632
+ type: 'func_result_msg',
633
+ role: 'tool',
634
+ genseq: msg.genseq,
635
+ id: msg.id,
636
+ name: msg.name,
637
+ content,
638
+ });
639
+ continue;
640
+ }
641
+ const pendingSubState = pendingSubByCallId.get(msg.id);
642
+ projected.push({
643
+ type: 'func_result_msg',
644
+ role: 'tool',
645
+ genseq: msg.genseq,
646
+ id: msg.id,
647
+ name: msg.name,
648
+ content: formatPendingSpecialFuncResult(msg.name, pendingSubState ? parseUnifiedTimestampMs(pendingSubState.createdAt) : null),
649
+ });
650
+ }
651
+ return projected;
652
+ }
314
653
  async function resetDiligenceBudgetAfterQ4H(dlg, team) {
315
654
  try {
316
655
  if (!(await dlg.hasPendingQ4H())) {
@@ -399,6 +738,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
399
738
  await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
400
739
  let pubRemindersVer = dlg.remindersVer;
401
740
  let lastAssistantSayingContent = null;
741
+ let lastAssistantSayingGenseq = null;
402
742
  let internalDrivePromptMsg;
403
743
  let genIterNo = 0;
404
744
  let pendingPrompt = humanPrompt;
@@ -434,7 +774,10 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
434
774
  throw new Error(`LLM generator not found: API type '${providerCfg.apiType}' for provider '${provider}' in agent '${dlg.agentId}'. Please check .minds/llm.yaml configuration.`);
435
775
  }
436
776
  const canonicalFuncTools = agentTools.filter((t) => t.type === 'func');
437
- const projected = (0, tools_projection_1.projectFuncToolsForProvider)(providerCfg.apiType, canonicalFuncTools);
777
+ const effectiveFuncTools = policy.allowFunctionCalls
778
+ ? mergeTellaskSpecialVirtualTools(canonicalFuncTools)
779
+ : canonicalFuncTools;
780
+ const projected = (0, tools_projection_1.projectFuncToolsForProvider)(providerCfg.apiType, effectiveFuncTools);
438
781
  const funcTools = projected.tools;
439
782
  if (genIterNo > 1) {
440
783
  const snapshot = dlg.getLastContextHealth();
@@ -446,7 +789,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
446
789
  criticalCountdownRemaining,
447
790
  });
448
791
  if (healthDecision.kind === 'suspend') {
449
- log_1.log.info('driver-v2 suspend iterative generation due to critical context while waiting for human prompt', undefined, {
792
+ log_1.log.debug('driver-v2 suspend iterative generation due to critical context while waiting for human prompt', undefined, {
450
793
  dialogId: dlg.id.valueOf(),
451
794
  rootId: dlg.id.rootId,
452
795
  selfId: dlg.id.selfId,
@@ -504,7 +847,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
504
847
  const promptOrigin = currentPrompt.origin ?? 'user';
505
848
  const isDiligencePrompt = promptOrigin === 'diligence_push';
506
849
  if (isDiligencePrompt && (dlg.disableDiligencePush || suppressDiligencePushForDrive)) {
507
- log_1.log.info('driver-v2 skip diligence prompt after disable toggle', undefined, {
850
+ log_1.log.debug('driver-v2 skip diligence prompt after disable toggle', undefined, {
508
851
  dialogId: dlg.id.valueOf(),
509
852
  msgId: currentPrompt.msgId,
510
853
  });
@@ -539,28 +882,30 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
539
882
  grammar: promptGrammar,
540
883
  });
541
884
  await dlg.persistUserMessage(promptContent, msgId, promptGrammar, persistedUserLanguageCode);
542
- }
543
- if (persistMode !== 'internal' && promptGrammar === 'tellask') {
544
- throwIfAborted(abortSignal, dlg);
545
- const collectedUserCalls = await (0, saying_events_1.emitSayingEvents)(dlg, promptContent);
546
- throwIfAborted(abortSignal, dlg);
547
- const userResult = await (0, tellask_bridge_1.executeTellaskCalls)({
548
- dlg,
549
- agent,
550
- collectedCalls: collectedUserCalls,
551
- callbacks,
552
- });
553
- if (dlg.hasUpNext()) {
554
- return { lastAssistantSayingContent, interrupted: false };
555
- }
556
- if (userResult.toolOutputs.length > 0) {
557
- await dlg.addChatMessages(...userResult.toolOutputs);
558
- }
559
- if (userResult.suspend) {
560
- suspendForHuman = true;
885
+ if (currentPrompt.subdialogReplyTarget) {
886
+ const normalizedCallId = currentPrompt.subdialogReplyTarget.callId.trim();
887
+ if (normalizedCallId === '') {
888
+ throw new Error(`driver-v2 assignment anchor invariant violation: empty callId for subdialogReplyTarget (dialog=${dlg.id.valueOf()})`);
889
+ }
890
+ const rawCourse = dlg.activeGenCourseOrUndefined ?? dlg.currentCourse;
891
+ if (!Number.isFinite(rawCourse) || rawCourse <= 0) {
892
+ throw new Error(`driver-v2 assignment anchor invariant violation: invalid course=${String(rawCourse)} (dialog=${dlg.id.valueOf()})`);
893
+ }
894
+ const rawGenseq = dlg.activeGenSeq;
895
+ if (!Number.isFinite(rawGenseq) || rawGenseq <= 0) {
896
+ throw new Error(`driver-v2 assignment anchor invariant violation: invalid genseq=${String(rawGenseq)} (dialog=${dlg.id.valueOf()})`);
897
+ }
898
+ const assignmentAnchor = {
899
+ ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
900
+ type: 'teammate_call_anchor_record',
901
+ anchorRole: 'assignment',
902
+ callId: normalizedCallId,
903
+ genseq: Math.floor(rawGenseq),
904
+ };
905
+ await persistence_1.DialogPersistence.appendEvent(dlg.id, Math.floor(rawCourse), assignmentAnchor);
561
906
  }
562
907
  }
563
- else if (persistMode !== 'internal') {
908
+ if (persistMode !== 'internal') {
564
909
  await emitUserMarkdown(dlg, promptContent);
565
910
  }
566
911
  if (persistMode !== 'internal') {
@@ -589,13 +934,17 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
589
934
  const msgs = dlg.getCoursePrefixMsgs();
590
935
  return msgs.length > 0 ? [...msgs] : [];
591
936
  })();
592
- const dialogMsgsForContext = dlg.msgs.filter((m) => {
937
+ const rawDialogMsgsForContext = dlg.msgs.filter((m) => {
593
938
  if (!m)
594
939
  return false;
595
940
  if (m.type === 'ui_only_markdown_msg')
596
941
  return false;
597
942
  return true;
598
943
  });
944
+ const dialogMsgsForContext = await projectTellaskSpecialFuncResultsForContext({
945
+ dialog: dlg,
946
+ dialogMsgsForContext: rawDialogMsgsForContext,
947
+ });
599
948
  await dlg.processReminderUpdates();
600
949
  const renderedReminders = dlg.reminders.length > 0
601
950
  ? await Promise.all(dlg.reminders.map(async (reminder, index) => {
@@ -657,7 +1006,6 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
657
1006
  dlg.setLastContextHealth(contextHealthForGen);
658
1007
  const nonStreamMsgs = nonStreamResult.messages;
659
1008
  const assistantMsgs = nonStreamMsgs.filter((m) => m.type === 'saying_msg' || m.type === 'thinking_msg');
660
- const collectedAssistantCalls = [];
661
1009
  if (assistantMsgs.length > 0) {
662
1010
  await dlg.addChatMessages(...assistantMsgs);
663
1011
  for (const msg of assistantMsgs) {
@@ -666,9 +1014,9 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
666
1014
  (msg.type === 'thinking_msg' || msg.type === 'saying_msg')) {
667
1015
  if (msg.type === 'saying_msg') {
668
1016
  lastAssistantSayingContent = msg.content;
1017
+ lastAssistantSayingGenseq = msg.genseq;
669
1018
  await dlg.persistAgentMessage(msg.content, msg.genseq, 'saying_msg');
670
- const calls = await (0, saying_events_1.emitSayingEvents)(dlg, msg.content);
671
- collectedAssistantCalls.push(...calls);
1019
+ await emitUserMarkdown(dlg, msg.content);
672
1020
  }
673
1021
  if (msg.type === 'thinking_msg') {
674
1022
  await (0, saying_events_1.emitThinkingEvents)(dlg, msg.content);
@@ -676,48 +1024,10 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
676
1024
  }
677
1025
  }
678
1026
  }
679
- const policyViolation = (0, policy_1.resolveDriverV2PolicyViolationKind)({
680
- policy,
681
- tellaskCalls: collectedAssistantCalls,
682
- functionCallCount: 0,
683
- });
684
- if (policyViolation === 'tellask') {
685
- const violationText = (0, driver_messages_1.formatDomindsNoteFbrToollessViolation)((0, runtime_language_1.getWorkLanguage)(), {
686
- kind: 'tellask',
687
- });
688
- const genseq = dlg.activeGenSeq ?? 0;
689
- await dlg.addChatMessages({
690
- type: 'saying_msg',
691
- role: 'assistant',
692
- genseq,
693
- content: violationText,
694
- });
695
- lastAssistantSayingContent = violationText;
696
- await dlg.persistAgentMessage(violationText, genseq, 'saying_msg');
697
- return { lastAssistantSayingContent, interrupted: false };
698
- }
699
- if (collectedAssistantCalls.length > 0) {
700
- throwIfAborted(abortSignal, dlg);
701
- const assistantResult = await (0, tellask_bridge_1.executeTellaskCalls)({
702
- dlg,
703
- agent,
704
- collectedCalls: collectedAssistantCalls,
705
- callbacks,
706
- });
707
- if (dlg.hasUpNext()) {
708
- return { lastAssistantSayingContent, interrupted: false };
709
- }
710
- if (assistantResult.toolOutputs.length > 0) {
711
- await dlg.addChatMessages(...assistantResult.toolOutputs);
712
- }
713
- if (assistantResult.suspend) {
714
- suspendForHuman = true;
715
- }
716
- }
717
1027
  const funcCalls = nonStreamMsgs.filter((m) => m.type === 'func_call_msg');
718
1028
  const toolPolicyViolation = (0, policy_1.resolveDriverV2PolicyViolationKind)({
719
1029
  policy,
720
- tellaskCalls: [],
1030
+ tellaskCallCount: 0,
721
1031
  functionCallCount: funcCalls.length,
722
1032
  });
723
1033
  if (toolPolicyViolation === 'tool') {
@@ -732,23 +1042,26 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
732
1042
  content: violationText,
733
1043
  });
734
1044
  lastAssistantSayingContent = violationText;
1045
+ lastAssistantSayingGenseq = genseq;
735
1046
  await dlg.persistAgentMessage(violationText, genseq, 'saying_msg');
736
- return { lastAssistantSayingContent, interrupted: false };
1047
+ return { lastAssistantSayingContent, lastAssistantSayingGenseq, interrupted: false };
737
1048
  }
738
- const funcResults = await executeFunctionCalls({
1049
+ const routedFunctionResult = await executeRoutedFunctionCalls({
739
1050
  dialog: dlg,
740
1051
  agent,
741
1052
  agentTools,
742
1053
  funcCalls,
1054
+ callbacks,
743
1055
  abortSignal,
744
1056
  });
745
- if (funcCalls.length > 0) {
746
- const paired = [];
747
- for (let i = 0; i < funcCalls.length; i++) {
748
- paired.push(funcCalls[i]);
749
- paired.push(funcResults[i]);
750
- }
751
- await dlg.addChatMessages(...paired);
1057
+ if (routedFunctionResult.tellaskToolOutputs.length > 0) {
1058
+ await dlg.addChatMessages(...routedFunctionResult.tellaskToolOutputs);
1059
+ }
1060
+ if (routedFunctionResult.pairedMessages.length > 0) {
1061
+ await dlg.addChatMessages(...routedFunctionResult.pairedMessages);
1062
+ }
1063
+ if (routedFunctionResult.suspendForHuman) {
1064
+ suspendForHuman = true;
752
1065
  }
753
1066
  if (dlg.hasUpNext()) {
754
1067
  pendingPrompt = resolveUpNextPrompt(dlg);
@@ -758,7 +1071,9 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
758
1071
  await resetDiligenceBudgetAfterQ4H(dlg, team);
759
1072
  break;
760
1073
  }
761
- const shouldContinue = funcCalls.length > 0 || (funcResults.length > 0 && funcCalls.length === 0);
1074
+ const shouldContinue = funcCalls.length > 0 ||
1075
+ routedFunctionResult.pairedMessages.length > 0 ||
1076
+ routedFunctionResult.tellaskToolOutputs.length > 0;
762
1077
  if (!shouldContinue) {
763
1078
  const next = await maybeContinueWithDiligencePrompt({
764
1079
  dlg,
@@ -779,7 +1094,6 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
779
1094
  let currentThinkingSignature = '';
780
1095
  let currentSayingContent = '';
781
1096
  let sawAnyStreamContent = false;
782
- const parser = new tellask_1.TellaskStreamParser((0, saying_events_1.createSayingEventsReceiver)(dlg));
783
1097
  let streamActive = { kind: 'idle' };
784
1098
  const streamResult = await (0, runtime_utils_1.runLlmRequestWithRetry)({
785
1099
  dlg,
@@ -854,7 +1168,6 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
854
1168
  throwIfAborted(abortSignal, dlg);
855
1169
  sawAnyStreamContent = true;
856
1170
  currentSayingContent += chunk;
857
- await parser.takeUpstreamChunk(chunk);
858
1171
  await dlg.sayingChunk(chunk);
859
1172
  },
860
1173
  sayingFinish: async () => {
@@ -865,7 +1178,6 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
865
1178
  throw new Error(detail);
866
1179
  }
867
1180
  streamActive = { kind: 'idle' };
868
- await parser.finalize();
869
1181
  const sayingMessage = {
870
1182
  type: 'saying_msg',
871
1183
  role: 'assistant',
@@ -874,6 +1186,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
874
1186
  };
875
1187
  newMsgs.push(sayingMessage);
876
1188
  lastAssistantSayingContent = currentSayingContent;
1189
+ lastAssistantSayingGenseq = sayingMessage.genseq;
877
1190
  await dlg.sayingFinish();
878
1191
  },
879
1192
  funcCall: async (callId, name, args) => {
@@ -910,10 +1223,9 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
910
1223
  usage: streamResult.usage,
911
1224
  });
912
1225
  dlg.setLastContextHealth(contextHealthForGen);
913
- const collectedCalls = parser.getCollectedCalls();
914
1226
  const policyViolation = (0, policy_1.resolveDriverV2PolicyViolationKind)({
915
1227
  policy,
916
- tellaskCalls: collectedCalls,
1228
+ tellaskCallCount: 0,
917
1229
  functionCallCount: streamedFuncCalls.length,
918
1230
  });
919
1231
  if (policyViolation) {
@@ -928,39 +1240,27 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
928
1240
  content: violationText,
929
1241
  });
930
1242
  lastAssistantSayingContent = violationText;
1243
+ lastAssistantSayingGenseq = genseq;
931
1244
  await dlg.addChatMessages(...newMsgs);
932
1245
  await dlg.persistAgentMessage(violationText, genseq, 'saying_msg');
933
- return { lastAssistantSayingContent, interrupted: false };
934
- }
935
- const assistantResult = await (0, tellask_bridge_1.executeTellaskCalls)({
936
- dlg,
937
- agent,
938
- collectedCalls,
939
- callbacks,
940
- });
941
- if (dlg.hasUpNext()) {
942
- return { lastAssistantSayingContent, interrupted: false };
943
- }
944
- if (assistantResult.toolOutputs.length > 0) {
945
- newMsgs.push(...assistantResult.toolOutputs);
946
- }
947
- if (assistantResult.suspend) {
948
- suspendForHuman = true;
1246
+ return { lastAssistantSayingContent, lastAssistantSayingGenseq, interrupted: false };
949
1247
  }
950
- const funcResults = await executeFunctionCalls({
1248
+ const routedFunctionResult = await executeRoutedFunctionCalls({
951
1249
  dialog: dlg,
952
1250
  agent,
953
1251
  agentTools,
954
1252
  funcCalls: streamedFuncCalls,
1253
+ callbacks,
955
1254
  abortSignal,
956
1255
  });
957
- if (streamedFuncCalls.length > 0) {
958
- for (let i = 0; i < streamedFuncCalls.length; i++) {
959
- newMsgs.push(streamedFuncCalls[i]);
960
- if (i < funcResults.length) {
961
- newMsgs.push(funcResults[i]);
962
- }
963
- }
1256
+ if (routedFunctionResult.tellaskToolOutputs.length > 0) {
1257
+ newMsgs.push(...routedFunctionResult.tellaskToolOutputs);
1258
+ }
1259
+ if (routedFunctionResult.pairedMessages.length > 0) {
1260
+ newMsgs.push(...routedFunctionResult.pairedMessages);
1261
+ }
1262
+ if (routedFunctionResult.suspendForHuman) {
1263
+ suspendForHuman = true;
964
1264
  }
965
1265
  await dlg.addChatMessages(...newMsgs);
966
1266
  if (dlg.hasUpNext()) {
@@ -980,7 +1280,9 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
980
1280
  await resetDiligenceBudgetAfterQ4H(dlg, team);
981
1281
  break;
982
1282
  }
983
- const shouldContinue = streamedFuncCalls.length > 0 || funcResults.length > 0;
1283
+ const shouldContinue = streamedFuncCalls.length > 0 ||
1284
+ routedFunctionResult.pairedMessages.length > 0 ||
1285
+ routedFunctionResult.tellaskToolOutputs.length > 0;
984
1286
  if (!shouldContinue) {
985
1287
  const next = await maybeContinueWithDiligencePrompt({
986
1288
  dlg,
@@ -999,7 +1301,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
999
1301
  }
1000
1302
  }
1001
1303
  finalRunState = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
1002
- return { lastAssistantSayingContent, interrupted: false };
1304
+ return { lastAssistantSayingContent, lastAssistantSayingGenseq, interrupted: false };
1003
1305
  }
1004
1306
  catch (err) {
1005
1307
  const stopRequested = (0, dialog_run_state_1.getStopRequestedReason)(dlg.id);
@@ -1015,7 +1317,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
1015
1317
  if (interruptedReason) {
1016
1318
  finalRunState = { kind: 'interrupted', reason: interruptedReason };
1017
1319
  (0, dialog_run_state_1.broadcastRunStateMarker)(dlg.id, { kind: 'interrupted', reason: interruptedReason });
1018
- return { lastAssistantSayingContent, interrupted: true };
1320
+ return { lastAssistantSayingContent, lastAssistantSayingGenseq, interrupted: true };
1019
1321
  }
1020
1322
  const errText = (0, log_1.extractErrorDetails)(err).message;
1021
1323
  try {
@@ -1029,7 +1331,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
1029
1331
  kind: 'interrupted',
1030
1332
  reason: { kind: 'system_stop', detail: errText },
1031
1333
  });
1032
- return { lastAssistantSayingContent, interrupted: true };
1334
+ return { lastAssistantSayingContent, lastAssistantSayingGenseq, interrupted: true };
1033
1335
  }
1034
1336
  finally {
1035
1337
  (0, dialog_run_state_1.clearActiveRun)(dlg.id);