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.
- package/README.md +2 -2
- package/README.zh.md +2 -2
- package/dist/agent-priming.js +169 -200
- package/dist/cli/read.js +2 -7
- package/dist/dialog-factory.js +6 -4
- package/dist/dialog-instance-registry.js +2 -2
- package/dist/dialog.js +99 -91
- package/dist/docs/dialog-persistence.md +2 -2
- package/dist/docs/dialog-persistence.zh.md +2 -2
- package/dist/docs/dialog-system.md +86 -90
- package/dist/docs/dialog-system.zh.md +82 -83
- package/dist/docs/diligence-push.md +2 -2
- package/dist/docs/diligence-push.zh.md +2 -2
- package/dist/docs/dominds-agent-priming.md +11 -11
- package/dist/docs/dominds-agent-priming.zh.md +9 -9
- package/dist/docs/dominds-terminology.md +34 -34
- package/dist/docs/fbr-implementation.md +4 -4
- package/dist/docs/fbr-implementation.zh.md +4 -4
- package/dist/docs/fbr.md +31 -53
- package/dist/docs/fbr.zh.md +30 -48
- package/dist/docs/mottos.md +2 -3
- package/dist/docs/mottos.zh.md +2 -2
- package/dist/docs/q4h.md +6 -6
- package/dist/docs/q4h.zh.md +6 -6
- package/dist/docs/tellask-collab.md +13 -13
- package/dist/docs/tellask-collab.zh.md +18 -18
- package/dist/llm/driver-entry.js +9 -33
- package/dist/llm/driver-v2/core.js +413 -111
- package/dist/llm/driver-v2/index.js +5 -0
- package/dist/llm/driver-v2/orchestrator.js +4 -3
- package/dist/llm/driver-v2/policy.js +17 -23
- package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
- package/dist/llm/driver-v2/round.js +18 -7
- package/dist/llm/driver-v2/runtime-utils.js +3 -5
- package/dist/llm/driver-v2/saying-events.js +4 -42
- package/dist/llm/driver-v2/supdialog-response.js +110 -23
- package/dist/llm/driver-v2/tellask-bridge.js +560 -458
- package/dist/mcp/sdk-client.js +1 -1
- package/dist/mcp/server-runtime.js +1 -1
- package/dist/mcp/stdio-client.js +6 -6
- package/dist/mcp/tool-names.js +1 -1
- package/dist/minds/builtin/fuxi/persona.en.md +10 -10
- package/dist/minds/builtin/fuxi/persona.zh.md +12 -12
- package/dist/minds/builtin/pangu/persona.en.md +7 -7
- package/dist/minds/builtin/pangu/persona.zh.md +6 -6
- package/dist/minds/minds-i18n.js +2 -2
- package/dist/minds/system-prompt-parts.js +15 -12
- package/dist/minds/system-prompt.js +58 -56
- package/dist/persistence.js +675 -527
- package/dist/server/api-routes.js +1 -1
- package/dist/server/websocket-handler.js +10 -20
- package/dist/server.js +3 -3
- package/dist/shared/diligence.js +12 -12
- package/dist/shared/i18n/driver-messages.js +28 -118
- package/dist/shared/utils/inter-dialog-format.js +53 -53
- package/dist/snippets/starting.en.md +1 -1
- package/dist/snippets/starting.zh.md +1 -2
- package/dist/static/assets/{_baseUniq-2IQvcpiv.js → _baseUniq-D4N_zVXV.js} +2 -2
- package/dist/static/assets/{_baseUniq-2IQvcpiv.js.map → _baseUniq-D4N_zVXV.js.map} +1 -1
- package/dist/static/assets/{arc-Boi4s2EY.js → arc-7bP9qomB.js} +2 -2
- package/dist/static/assets/{arc-Boi4s2EY.js.map → arc-7bP9qomB.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js → architectureDiagram-VXUJARFQ-DToIiZuZ.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js.map → architectureDiagram-VXUJARFQ-DToIiZuZ.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js → blockDiagram-VD42YOAC-C-pRNHpf.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js.map → blockDiagram-VD42YOAC-C-pRNHpf.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js → c4Diagram-YG6GDRKO-Bnp-nWKO.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js.map → c4Diagram-YG6GDRKO-Bnp-nWKO.js.map} +1 -1
- package/dist/static/assets/{channel-DBG_xYT_.js → channel-CTv1SsAF.js} +2 -2
- package/dist/static/assets/{channel-DBG_xYT_.js.map → channel-CTv1SsAF.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js → chunk-4BX2VUAB-D_OGa3ss.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js.map → chunk-4BX2VUAB-D_OGa3ss.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js → chunk-55IACEB6-I4o4MCuM.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js.map → chunk-55IACEB6-I4o4MCuM.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js → chunk-B4BG7PRW-Bp-TIXg6.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js.map → chunk-B4BG7PRW-Bp-TIXg6.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js → chunk-DI55MBZ5-Bnph5Hmd.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js.map → chunk-DI55MBZ5-Bnph5Hmd.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js → chunk-FMBD7UC4-q3UyRsNI.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js.map → chunk-FMBD7UC4-q3UyRsNI.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js → chunk-QN33PNHL-BxUlvLXP.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js.map → chunk-QN33PNHL-BxUlvLXP.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js → chunk-QZHKN3VN-DpQR9BVw.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js.map → chunk-QZHKN3VN-DpQR9BVw.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js → chunk-TZMSLE5B-BX8vrVo0.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js.map → chunk-TZMSLE5B-BX8vrVo0.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js → classDiagram-2ON5EDUG-Ccx5_2Xq.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js.map → classDiagram-2ON5EDUG-Ccx5_2Xq.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js.map → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js.map} +1 -1
- package/dist/static/assets/{clone-rjxmrDHc.js → clone-Cl5zSMrO.js} +2 -2
- package/dist/static/assets/{clone-rjxmrDHc.js.map → clone-Cl5zSMrO.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js → cose-bilkent-S5V4N54A-B-FUX86B.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js.map → cose-bilkent-S5V4N54A-B-FUX86B.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js → dagre-6UL2VRFP-Bj8vSSpT.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js.map → dagre-6UL2VRFP-Bj8vSSpT.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js → diagram-PSM6KHXK-BPcgy7jf.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js.map → diagram-PSM6KHXK-BPcgy7jf.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js → diagram-QEK2KX5R-DHxd6LWi.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js.map → diagram-QEK2KX5R-DHxd6LWi.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js → diagram-S2PKOQOG-C4ynhhLr.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js.map → diagram-S2PKOQOG-C4ynhhLr.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js → erDiagram-Q2GNP2WA-CQ25uxxf.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js.map → erDiagram-Q2GNP2WA-CQ25uxxf.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js → flowDiagram-NV44I4VS-ChkkAldk.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js.map → flowDiagram-NV44I4VS-ChkkAldk.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js → ganttDiagram-JELNMOA3-CBt_Zorl.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js.map → ganttDiagram-JELNMOA3-CBt_Zorl.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js → gitGraphDiagram-NY62KEGX-CtBc2dOO.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js.map → gitGraphDiagram-NY62KEGX-CtBc2dOO.js.map} +1 -1
- package/dist/static/assets/{graph-DDHIhCSW.js → graph-BGzNnzuI.js} +3 -3
- package/dist/static/assets/{graph-DDHIhCSW.js.map → graph-BGzNnzuI.js.map} +1 -1
- package/dist/static/assets/{index-CUZD-Ua6.js → index-Vrp1PT3b.js} +654 -355
- package/dist/static/assets/index-Vrp1PT3b.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js → infoDiagram-WHAUD3N6-BYJF-Ol5.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js.map → infoDiagram-WHAUD3N6-BYJF-Ol5.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js.map → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js → kanban-definition-3W4ZIXB7-DBH-HEwY.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js.map → kanban-definition-3W4ZIXB7-DBH-HEwY.js.map} +1 -1
- package/dist/static/assets/{layout-C7mFT1m6.js → layout-DdWO-uEo.js} +5 -5
- package/dist/static/assets/{layout-C7mFT1m6.js.map → layout-DdWO-uEo.js.map} +1 -1
- package/dist/static/assets/{linear-WSX0brRY.js → linear-BY3MovaF.js} +2 -2
- package/dist/static/assets/{linear-WSX0brRY.js.map → linear-BY3MovaF.js.map} +1 -1
- package/dist/static/assets/{min-DOTQTP4p.js → min-aHCJK1uN.js} +3 -3
- package/dist/static/assets/{min-DOTQTP4p.js.map → min-aHCJK1uN.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js → mindmap-definition-VGOIOE7T-BjJnBRtB.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js.map → mindmap-definition-VGOIOE7T-BjJnBRtB.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js → pieDiagram-ADFJNKIX-xAcmdymv.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js.map → pieDiagram-ADFJNKIX-xAcmdymv.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js → quadrantDiagram-AYHSOK5B-BPbEGCEj.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js.map → quadrantDiagram-AYHSOK5B-BPbEGCEj.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js → requirementDiagram-UZGBJVZJ--w6UfXy0.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js.map → requirementDiagram-UZGBJVZJ--w6UfXy0.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js → sankeyDiagram-TZEHDZUN-B_T6TQwh.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js.map → sankeyDiagram-TZEHDZUN-B_T6TQwh.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js → sequenceDiagram-WL72ISMW-DX_oVvqA.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js.map → sequenceDiagram-WL72ISMW-DX_oVvqA.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js → stateDiagram-FKZM4ZOC-BAybZU8l.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js.map → stateDiagram-FKZM4ZOC-BAybZU8l.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js.map → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js → timeline-definition-IT6M3QCI-DOYN-4XM.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js.map → timeline-definition-IT6M3QCI-DOYN-4XM.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js → treemap-KMMF4GRG-CQXygT0T.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js.map → treemap-KMMF4GRG-CQXygT0T.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js → xychartDiagram-PRI3JC2R-ByFAvTeN.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js.map → xychartDiagram-PRI3JC2R-ByFAvTeN.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/tools/builtins.js +0 -8
- package/dist/tools/env.js +1 -1
- package/dist/tools/mcp.js +31 -9
- package/dist/tools/pending-tellask-reminder.js +14 -17
- package/dist/tools/team-mgmt.js +1 -1
- package/package.json +1 -1
- 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
|
|
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
|
|
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.
|
|
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.
|
|
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
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 (
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
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 ||
|
|
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
|
-
|
|
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
|
|
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 (
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
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 ||
|
|
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);
|