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
|
@@ -5,7 +5,9 @@ exports.driveDialogStream = driveDialogStream;
|
|
|
5
5
|
exports.emitSayingEvents = emitSayingEvents;
|
|
6
6
|
exports.supplyResponseToSupdialog = supplyResponseToSupdialog;
|
|
7
7
|
exports.runBackendDriver = runBackendDriver;
|
|
8
|
+
exports.restoreDialogHierarchy = restoreDialogHierarchy;
|
|
8
9
|
const orchestrator_1 = require("./orchestrator");
|
|
10
|
+
const restore_dialog_hierarchy_1 = require("./restore-dialog-hierarchy");
|
|
9
11
|
exports.DRIVER_V2_IMPLEMENTATION_STATE = 'active';
|
|
10
12
|
async function driveDialogStream(...args) {
|
|
11
13
|
return await (0, orchestrator_1.driveDialogStream)(...args);
|
|
@@ -19,3 +21,6 @@ async function supplyResponseToSupdialog(...args) {
|
|
|
19
21
|
function runBackendDriver() {
|
|
20
22
|
return (0, orchestrator_1.runBackendDriver)();
|
|
21
23
|
}
|
|
24
|
+
async function restoreDialogHierarchy(...args) {
|
|
25
|
+
return await (0, restore_dialog_hierarchy_1.restoreDialogHierarchy)(...args);
|
|
26
|
+
}
|
|
@@ -29,7 +29,7 @@ async function emitSayingEvents(...args) {
|
|
|
29
29
|
return await (0, saying_events_1.emitSayingEvents)(dlg, content);
|
|
30
30
|
}
|
|
31
31
|
async function supplyResponseToSupdialog(...args) {
|
|
32
|
-
const [parentDialog, subdialogId, responseText, callType, callId, status] = args;
|
|
32
|
+
const [parentDialog, subdialogId, responseText, callType, callId, status, calleeResponseRef] = args;
|
|
33
33
|
return await (0, supdialog_response_1.supplyResponseToSupdialogV2)({
|
|
34
34
|
parentDialog,
|
|
35
35
|
subdialogId,
|
|
@@ -37,6 +37,7 @@ async function supplyResponseToSupdialog(...args) {
|
|
|
37
37
|
callType,
|
|
38
38
|
callId,
|
|
39
39
|
status,
|
|
40
|
+
calleeResponseRef,
|
|
40
41
|
scheduleDrive: (dialog, options) => {
|
|
41
42
|
void driveDialogStream(dialog, options.humanPrompt, options.waitInQue, options.driveOptions);
|
|
42
43
|
},
|
|
@@ -91,7 +92,7 @@ async function driveQueuedDialogsOnce() {
|
|
|
91
92
|
const lastTrigger = dialog_global_registry_1.globalDialogRegistry.getLastDriveTrigger(rootDialog.id.rootId);
|
|
92
93
|
const lastTriggerAgeMs = lastTrigger !== undefined ? Math.max(0, Date.now() - lastTrigger.emittedAtMs) : undefined;
|
|
93
94
|
if (status.subdialogs) {
|
|
94
|
-
log_1.log.
|
|
95
|
+
log_1.log.debug(`Dialog ${rootDialog.id.rootId} suspended, waiting for subdialogs`, undefined, {
|
|
95
96
|
rootId: rootDialog.id.rootId,
|
|
96
97
|
waitingQ4H: status.q4h,
|
|
97
98
|
waitingSubdialogs: status.subdialogs,
|
|
@@ -111,7 +112,7 @@ async function driveQueuedDialogsOnce() {
|
|
|
111
112
|
});
|
|
112
113
|
}
|
|
113
114
|
if (status.q4h) {
|
|
114
|
-
log_1.log.
|
|
115
|
+
log_1.log.debug(`Dialog ${rootDialog.id.rootId} awaiting Q4H answer`, undefined, {
|
|
115
116
|
rootId: rootDialog.id.rootId,
|
|
116
117
|
waitingQ4H: status.q4h,
|
|
117
118
|
waitingSubdialogs: status.subdialogs,
|
|
@@ -5,11 +5,10 @@ exports.validateDriverV2PolicyInvariants = validateDriverV2PolicyInvariants;
|
|
|
5
5
|
exports.resolveDriverV2PolicyViolationKind = resolveDriverV2PolicyViolationKind;
|
|
6
6
|
const dialog_1 = require("../../dialog");
|
|
7
7
|
const system_prompt_parts_1 = require("../../minds/system-prompt-parts");
|
|
8
|
-
function isFbrSelfTellaskHeadLine(tellaskHead) {
|
|
9
|
-
return /^\s*@self\b/.test(tellaskHead);
|
|
10
|
-
}
|
|
11
8
|
function isToollessFbrSelfSubdialog(dlg) {
|
|
12
|
-
|
|
9
|
+
if (!(dlg instanceof dialog_1.SubDialog))
|
|
10
|
+
return false;
|
|
11
|
+
return dlg.assignmentFromSup.callName === 'freshBootsReasoning';
|
|
13
12
|
}
|
|
14
13
|
function mergeModelParams(base, overlay) {
|
|
15
14
|
if (!base && !overlay)
|
|
@@ -30,20 +29,20 @@ function buildFbrSystemPrompt(language) {
|
|
|
30
29
|
? [
|
|
31
30
|
'# 扪心自问(FBR)支线对话',
|
|
32
31
|
'',
|
|
33
|
-
'- 你正在处理一次由
|
|
34
|
-
'-
|
|
35
|
-
'-
|
|
32
|
+
'- 你正在处理一次由 `freshBootsReasoning` 函数触发的 FBR 支线对话。',
|
|
33
|
+
'- 诉请正文是主要任务上下文;不要假设能访问上游对话历史。',
|
|
34
|
+
'- 若使用可恢复会话,你可以使用本支线对话自身的 tellaskSession 历史作为显式上下文。',
|
|
36
35
|
'- 若诉请正文缺少关键上下文,请在输出中列出缺失信息与阻塞原因。',
|
|
37
|
-
'-
|
|
36
|
+
'- 当前 FBR 为技术性禁函数工具模式:不得发起任何函数调用(包括 tellaskBack / tellask / tellaskSessionless / askHuman)。',
|
|
38
37
|
].join('\n')
|
|
39
38
|
: [
|
|
40
39
|
'# Fresh Boots Reasoning (FBR) sideline dialog',
|
|
41
40
|
'',
|
|
42
|
-
'- This is an FBR sideline dialog
|
|
43
|
-
'- The tellask body is the primary task context; do not assume access to
|
|
44
|
-
'- If this is
|
|
41
|
+
'- This is an FBR sideline dialog triggered via the `freshBootsReasoning` function.',
|
|
42
|
+
'- The tellask body is the primary task context; do not assume access to upstream dialog history.',
|
|
43
|
+
'- If this is a resumable session, you may use this sideline dialog’s own tellaskSession history as explicit context.',
|
|
45
44
|
'- If the tellask body is missing critical context, list what is missing and why it blocks reasoning.',
|
|
46
|
-
'-
|
|
45
|
+
'- This FBR turn is in technical no-function mode: do not emit any function call (including tellaskBack / tellask / tellaskSessionless / askHuman).',
|
|
47
46
|
].join('\n');
|
|
48
47
|
return prefix.trim();
|
|
49
48
|
}
|
|
@@ -75,7 +74,7 @@ function buildDriverV2Policy(args) {
|
|
|
75
74
|
content: (0, system_prompt_parts_1.buildNoToolsNotice)(language),
|
|
76
75
|
},
|
|
77
76
|
],
|
|
78
|
-
tellaskPolicy: '
|
|
77
|
+
tellaskPolicy: 'deny_all',
|
|
79
78
|
allowFunctionCalls: false,
|
|
80
79
|
};
|
|
81
80
|
}
|
|
@@ -89,8 +88,8 @@ function validateDriverV2PolicyInvariants(policy, language) {
|
|
|
89
88
|
if (policy.allowFunctionCalls) {
|
|
90
89
|
return { ok: false, detail: 'FBR allowFunctionCalls must be false.' };
|
|
91
90
|
}
|
|
92
|
-
if (policy.tellaskPolicy !== '
|
|
93
|
-
return { ok: false, detail: 'FBR tellaskPolicy must be
|
|
91
|
+
if (policy.tellaskPolicy !== 'deny_all') {
|
|
92
|
+
return { ok: false, detail: 'FBR tellaskPolicy must be deny_all.' };
|
|
94
93
|
}
|
|
95
94
|
const expectedNoToolsNotice = (0, system_prompt_parts_1.buildNoToolsNotice)(language);
|
|
96
95
|
if (policy.prependedContextMessages.length !== 1) {
|
|
@@ -108,19 +107,14 @@ function validateDriverV2PolicyInvariants(policy, language) {
|
|
|
108
107
|
}
|
|
109
108
|
return { ok: true };
|
|
110
109
|
}
|
|
111
|
-
function hasTellaskPolicyViolation(policy,
|
|
110
|
+
function hasTellaskPolicyViolation(policy, tellaskCallCount) {
|
|
112
111
|
if (policy.tellaskPolicy === 'allow_any') {
|
|
113
112
|
return false;
|
|
114
113
|
}
|
|
115
|
-
return
|
|
116
|
-
if (call.validation.kind !== 'valid') {
|
|
117
|
-
return true;
|
|
118
|
-
}
|
|
119
|
-
return call.validation.firstMention !== 'tellasker';
|
|
120
|
-
});
|
|
114
|
+
return tellaskCallCount > 0;
|
|
121
115
|
}
|
|
122
116
|
function resolveDriverV2PolicyViolationKind(args) {
|
|
123
|
-
const tellaskViolation = hasTellaskPolicyViolation(args.policy, args.
|
|
117
|
+
const tellaskViolation = hasTellaskPolicyViolation(args.policy, args.tellaskCallCount);
|
|
124
118
|
const toolViolation = !args.policy.allowFunctionCalls && args.functionCallCount > 0;
|
|
125
119
|
if (tellaskViolation && toolViolation) {
|
|
126
120
|
return 'tellask_and_tool';
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.restoreDialogHierarchy = restoreDialogHierarchy;
|
|
7
|
+
const fs_1 = __importDefault(require("fs"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const dialog_1 = require("../../dialog");
|
|
10
|
+
const dialog_global_registry_1 = require("../../dialog-global-registry");
|
|
11
|
+
const dialog_instance_registry_1 = require("../../dialog-instance-registry");
|
|
12
|
+
const log_1 = require("../../log");
|
|
13
|
+
const persistence_1 = require("../../persistence");
|
|
14
|
+
async function restoreDialogHierarchy(rootDialogId, status = 'running') {
|
|
15
|
+
try {
|
|
16
|
+
const rootDialogIdent = new dialog_1.DialogID(rootDialogId);
|
|
17
|
+
const rootMeta = await persistence_1.DialogPersistence.loadRootDialogMetadata(rootDialogIdent, status);
|
|
18
|
+
if (rootMeta?.supdialogId) {
|
|
19
|
+
throw new Error(`Expected root dialog ${rootDialogId} but found subdialog metadata with supdialogId: ${rootMeta.supdialogId}`);
|
|
20
|
+
}
|
|
21
|
+
const rootDialog = await (0, dialog_instance_registry_1.getOrRestoreRootDialog)(rootDialogId, status);
|
|
22
|
+
if (!rootDialog) {
|
|
23
|
+
throw new Error(`Failed to restore dialog hierarchy for ${rootDialogId} from status ${status}`);
|
|
24
|
+
}
|
|
25
|
+
dialog_global_registry_1.globalDialogRegistry.register(rootDialog);
|
|
26
|
+
const subdialogs = new Map();
|
|
27
|
+
const rootPath = persistence_1.DialogPersistence.getRootDialogPath(rootDialogIdent, status);
|
|
28
|
+
const subdialogsPath = path_1.default.join(rootPath, 'subdialogs');
|
|
29
|
+
let allSubdialogIds = [];
|
|
30
|
+
try {
|
|
31
|
+
const entries = await fs_1.default.promises.readdir(subdialogsPath, { withFileTypes: true });
|
|
32
|
+
allSubdialogIds = entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
const code = typeof err === 'object' && err !== null && 'code' in err
|
|
36
|
+
? err.code
|
|
37
|
+
: undefined;
|
|
38
|
+
if (code !== 'ENOENT') {
|
|
39
|
+
log_1.log.warn(`Failed to read subdialogs directory: ${subdialogsPath}, returning empty array`, err);
|
|
40
|
+
}
|
|
41
|
+
allSubdialogIds = [];
|
|
42
|
+
}
|
|
43
|
+
for (const subdialogId of allSubdialogIds) {
|
|
44
|
+
const restoredSubdialogId = new dialog_1.DialogID(subdialogId, rootDialog.id.rootId);
|
|
45
|
+
const dialog = await (0, dialog_instance_registry_1.ensureDialogLoaded)(rootDialog, restoredSubdialogId, status);
|
|
46
|
+
if (dialog && dialog.id.selfId !== dialog.id.rootId) {
|
|
47
|
+
subdialogs.set(subdialogId, dialog);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
let totalMessages = rootDialog.msgs.length;
|
|
51
|
+
let totalCourses = rootDialog.currentCourse;
|
|
52
|
+
for (const dialog of subdialogs.values()) {
|
|
53
|
+
totalMessages += dialog.msgs.length;
|
|
54
|
+
if (dialog.currentCourse > totalCourses) {
|
|
55
|
+
totalCourses = dialog.currentCourse;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
const summary = {
|
|
59
|
+
totalMessages,
|
|
60
|
+
totalCourses,
|
|
61
|
+
completionStatus: 'incomplete',
|
|
62
|
+
};
|
|
63
|
+
return {
|
|
64
|
+
rootDialog,
|
|
65
|
+
subdialogs,
|
|
66
|
+
summary,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
catch (error) {
|
|
70
|
+
log_1.log.error(`Failed to restore dialog hierarchy for ${rootDialogId}:`, error);
|
|
71
|
+
throw error;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -30,9 +30,11 @@ async function loadPendingDiagnosticsSnapshot(args) {
|
|
|
30
30
|
subdialogId: record.subdialogId,
|
|
31
31
|
callType: record.callType,
|
|
32
32
|
targetAgentId: record.targetAgentId,
|
|
33
|
-
|
|
33
|
+
sessionSlug: record.sessionSlug,
|
|
34
34
|
createdAt: record.createdAt,
|
|
35
|
-
|
|
35
|
+
tellaskSummary: `${(record.mentionList ?? []).join(' ')} ${record.tellaskContent}`
|
|
36
|
+
.trim()
|
|
37
|
+
.slice(0, 160),
|
|
36
38
|
})),
|
|
37
39
|
};
|
|
38
40
|
}
|
|
@@ -88,7 +90,7 @@ async function executeDriveRound(args) {
|
|
|
88
90
|
return;
|
|
89
91
|
}
|
|
90
92
|
if (latest && latest.runState && latest.runState.kind === 'proceeding_stop_requested') {
|
|
91
|
-
log_1.log.
|
|
93
|
+
log_1.log.debug('driver-v2 skip drive while stop request is still being processed', undefined, {
|
|
92
94
|
dialogId: dialog.id.valueOf(),
|
|
93
95
|
reason: latest.runState.reason,
|
|
94
96
|
});
|
|
@@ -98,7 +100,7 @@ async function executeDriveRound(args) {
|
|
|
98
100
|
latest.runState &&
|
|
99
101
|
latest.runState.kind === 'interrupted' &&
|
|
100
102
|
!allowResumeFromInterrupted) {
|
|
101
|
-
log_1.log.
|
|
103
|
+
log_1.log.debug('driver-v2 skip drive for interrupted dialog without explicit resume/user prompt', undefined, {
|
|
102
104
|
dialogId: dialog.id.valueOf(),
|
|
103
105
|
reason: latest.runState.reason,
|
|
104
106
|
});
|
|
@@ -118,7 +120,7 @@ async function executeDriveRound(args) {
|
|
|
118
120
|
if (!suspension.canDrive) {
|
|
119
121
|
const lastTrigger = dialog_global_registry_1.globalDialogRegistry.getLastDriveTrigger(dialog.id.rootId);
|
|
120
122
|
const lastTriggerAgeMs = lastTrigger !== undefined ? Math.max(0, Date.now() - lastTrigger.emittedAtMs) : undefined;
|
|
121
|
-
log_1.log.
|
|
123
|
+
log_1.log.debug('driver-v2 skip queued auto-drive while dialog is suspended', undefined, {
|
|
122
124
|
dialogId: dialog.id.valueOf(),
|
|
123
125
|
rootId: dialog.id.rootId,
|
|
124
126
|
selfId: dialog.id.selfId,
|
|
@@ -227,11 +229,18 @@ async function executeDriveRound(args) {
|
|
|
227
229
|
driveResult &&
|
|
228
230
|
!driveResult.interrupted &&
|
|
229
231
|
driveResult.lastAssistantSayingContent !== null) {
|
|
232
|
+
if (typeof driveResult.lastAssistantSayingGenseq !== 'number' ||
|
|
233
|
+
!Number.isFinite(driveResult.lastAssistantSayingGenseq) ||
|
|
234
|
+
driveResult.lastAssistantSayingGenseq <= 0) {
|
|
235
|
+
throw new Error(`Subdialog response supply invariant violation: missing lastAssistantSayingGenseq for dialog=${dialog.id.valueOf()}`);
|
|
236
|
+
}
|
|
237
|
+
const responseGenseq = Math.floor(driveResult.lastAssistantSayingGenseq);
|
|
230
238
|
let supplied = false;
|
|
231
239
|
if (subdialogReplyTarget) {
|
|
232
240
|
supplied = await (0, supdialog_response_1.supplySubdialogResponseToSpecificCallerIfPendingV2)({
|
|
233
241
|
subdialog: dialog,
|
|
234
242
|
responseText: driveResult.lastAssistantSayingContent,
|
|
243
|
+
responseGenseq,
|
|
235
244
|
target: subdialogReplyTarget,
|
|
236
245
|
scheduleDrive: args.scheduleDrive,
|
|
237
246
|
});
|
|
@@ -239,6 +248,7 @@ async function executeDriveRound(args) {
|
|
|
239
248
|
supplied = await (0, supdialog_response_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
|
|
240
249
|
subdialog: dialog,
|
|
241
250
|
responseText: driveResult.lastAssistantSayingContent,
|
|
251
|
+
responseGenseq,
|
|
242
252
|
scheduleDrive: args.scheduleDrive,
|
|
243
253
|
});
|
|
244
254
|
}
|
|
@@ -247,6 +257,7 @@ async function executeDriveRound(args) {
|
|
|
247
257
|
supplied = await (0, supdialog_response_1.supplySubdialogResponseToAssignedCallerIfPendingV2)({
|
|
248
258
|
subdialog: dialog,
|
|
249
259
|
responseText: driveResult.lastAssistantSayingContent,
|
|
260
|
+
responseGenseq,
|
|
250
261
|
scheduleDrive: args.scheduleDrive,
|
|
251
262
|
});
|
|
252
263
|
}
|
|
@@ -267,7 +278,7 @@ async function executeDriveRound(args) {
|
|
|
267
278
|
await dialog.streamError(streamErr);
|
|
268
279
|
}
|
|
269
280
|
catch (streamErrPost) {
|
|
270
|
-
log_1.log.warn('driver-v2 failed to emit stream_error_evt for response supply violation', {
|
|
281
|
+
log_1.log.warn('driver-v2 failed to emit stream_error_evt for response supply violation', undefined, {
|
|
271
282
|
rootId: dialog.id.rootId,
|
|
272
283
|
selfId: dialog.id.selfId,
|
|
273
284
|
targetOwnerDialogId: subdialogReplyTarget.ownerDialogId,
|
|
@@ -279,7 +290,7 @@ async function executeDriveRound(args) {
|
|
|
279
290
|
error: streamErrPost instanceof Error ? streamErrPost.message : String(streamErrPost),
|
|
280
291
|
});
|
|
281
292
|
}
|
|
282
|
-
log_1.log.error('driver-v2 subdialog produced response but found no pending caller to supply', {
|
|
293
|
+
log_1.log.error('driver-v2 subdialog produced response but found no pending caller to supply', undefined, {
|
|
283
294
|
rootId: dialog.id.rootId,
|
|
284
295
|
selfId: dialog.id.selfId,
|
|
285
296
|
targetOwnerDialogId: subdialogReplyTarget.ownerDialogId,
|
|
@@ -163,8 +163,7 @@ async function suspendForKeepGoingBudgetExhausted(options) {
|
|
|
163
163
|
const language = dlg.getLastUserLanguageCode();
|
|
164
164
|
const question = {
|
|
165
165
|
id: questionId,
|
|
166
|
-
|
|
167
|
-
bodyContent: (0, driver_messages_1.formatQ4HDiligencePushBudgetExhausted)(language, { maxInjectCount }),
|
|
166
|
+
tellaskContent: (0, driver_messages_1.formatQ4HDiligencePushBudgetExhausted)(language, { maxInjectCount }),
|
|
168
167
|
askedAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
169
168
|
callSiteRef: {
|
|
170
169
|
course: dlg.currentCourse,
|
|
@@ -177,8 +176,7 @@ async function suspendForKeepGoingBudgetExhausted(options) {
|
|
|
177
176
|
question: {
|
|
178
177
|
id: question.id,
|
|
179
178
|
selfId: dlg.id.selfId,
|
|
180
|
-
|
|
181
|
-
bodyContent: question.bodyContent,
|
|
179
|
+
tellaskContent: question.tellaskContent,
|
|
182
180
|
askedAt: question.askedAt,
|
|
183
181
|
callId: question.callId,
|
|
184
182
|
remainingCallIds: question.remainingCallIds,
|
|
@@ -349,7 +347,7 @@ async function runLlmRequestWithRetry(params) {
|
|
|
349
347
|
: `LLM failed: ${failure.message}`);
|
|
350
348
|
}
|
|
351
349
|
const backoffMs = Math.min(30000, 1000 * 2 ** attempt);
|
|
352
|
-
log_1.log.warn(`Retrying LLM request after retriable error`, {
|
|
350
|
+
log_1.log.warn(`Retrying LLM request after retriable error`, undefined, {
|
|
353
351
|
provider: params.provider,
|
|
354
352
|
attempt: attempt + 1,
|
|
355
353
|
backoffMs,
|
|
@@ -1,43 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.createSayingEventsReceiver = createSayingEventsReceiver;
|
|
4
3
|
exports.emitThinkingEvents = emitThinkingEvents;
|
|
5
4
|
exports.emitSayingEvents = emitSayingEvents;
|
|
6
|
-
const tellask_1 = require("../../tellask");
|
|
7
|
-
function createSayingEventsReceiver(dlg) {
|
|
8
|
-
return {
|
|
9
|
-
markdownStart: async () => {
|
|
10
|
-
await dlg.markdownStart();
|
|
11
|
-
},
|
|
12
|
-
markdownChunk: async (chunk) => {
|
|
13
|
-
await dlg.markdownChunk(chunk);
|
|
14
|
-
},
|
|
15
|
-
markdownFinish: async () => {
|
|
16
|
-
await dlg.markdownFinish();
|
|
17
|
-
},
|
|
18
|
-
callStart: async (validation) => {
|
|
19
|
-
await dlg.callingStart(validation);
|
|
20
|
-
},
|
|
21
|
-
callHeadLineChunk: async (chunk) => {
|
|
22
|
-
await dlg.callingHeadlineChunk(chunk);
|
|
23
|
-
},
|
|
24
|
-
callHeadLineFinish: async () => {
|
|
25
|
-
await dlg.callingHeadlineFinish();
|
|
26
|
-
},
|
|
27
|
-
tellaskBodyStart: async () => {
|
|
28
|
-
await dlg.callingBodyStart();
|
|
29
|
-
},
|
|
30
|
-
tellaskBodyChunk: async (chunk) => {
|
|
31
|
-
await dlg.callingBodyChunk(chunk);
|
|
32
|
-
},
|
|
33
|
-
tellaskBodyFinish: async () => {
|
|
34
|
-
await dlg.callingBodyFinish();
|
|
35
|
-
},
|
|
36
|
-
callFinish: async (call) => {
|
|
37
|
-
await dlg.callingFinish(call.callId);
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
5
|
async function emitThinkingEvents(dlg, content) {
|
|
42
6
|
if (!content.trim())
|
|
43
7
|
return undefined;
|
|
@@ -49,10 +13,8 @@ async function emitThinkingEvents(dlg, content) {
|
|
|
49
13
|
}
|
|
50
14
|
async function emitSayingEvents(dlg, content) {
|
|
51
15
|
if (!content.trim())
|
|
52
|
-
return
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
await
|
|
56
|
-
await parser.finalize();
|
|
57
|
-
return parser.getCollectedCalls();
|
|
16
|
+
return;
|
|
17
|
+
await dlg.markdownStart();
|
|
18
|
+
await dlg.markdownChunk(content);
|
|
19
|
+
await dlg.markdownFinish();
|
|
58
20
|
}
|
|
@@ -10,6 +10,7 @@ const log_1 = require("../../log");
|
|
|
10
10
|
const persistence_1 = require("../../persistence");
|
|
11
11
|
const runtime_language_1 = require("../../shared/runtime-language");
|
|
12
12
|
const inter_dialog_format_1 = require("../../shared/utils/inter-dialog-format");
|
|
13
|
+
const time_1 = require("../../shared/utils/time");
|
|
13
14
|
const pending_tellask_reminder_1 = require("../../tools/pending-tellask-reminder");
|
|
14
15
|
const subdialog_txn_1 = require("./subdialog-txn");
|
|
15
16
|
async function syncPendingTellaskReminderBestEffort(dlg, where) {
|
|
@@ -20,7 +21,7 @@ async function syncPendingTellaskReminderBestEffort(dlg, where) {
|
|
|
20
21
|
await dlg.processReminderUpdates();
|
|
21
22
|
}
|
|
22
23
|
catch (err) {
|
|
23
|
-
log_1.log.warn('Failed to sync pending tellask reminder', {
|
|
24
|
+
log_1.log.warn('Failed to sync pending tellask reminder', undefined, {
|
|
24
25
|
where,
|
|
25
26
|
dialogId: dlg.id.selfId,
|
|
26
27
|
rootId: dlg.id.rootId,
|
|
@@ -38,8 +39,44 @@ async function resolveOwnerDialogBySelfId(subdialog, ownerDialogId) {
|
|
|
38
39
|
return existing;
|
|
39
40
|
return await (0, dialog_instance_registry_1.ensureDialogLoaded)(rootDialog, new dialog_1.DialogID(ownerDialogId, rootDialog.id.rootId), 'running');
|
|
40
41
|
}
|
|
42
|
+
async function resolveLatestAssignmentAnchorRef(args) {
|
|
43
|
+
const normalizedCallId = args.callId.trim();
|
|
44
|
+
if (normalizedCallId === '') {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
const runningLatest = await persistence_1.DialogPersistence.loadDialogLatest(args.calleeDialogId, 'running');
|
|
48
|
+
const completedLatest = runningLatest
|
|
49
|
+
? null
|
|
50
|
+
: await persistence_1.DialogPersistence.loadDialogLatest(args.calleeDialogId, 'completed');
|
|
51
|
+
const latest = runningLatest ?? completedLatest;
|
|
52
|
+
if (!latest) {
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
const status = runningLatest ? 'running' : 'completed';
|
|
56
|
+
const maxCourse = Math.floor(latest.currentCourse);
|
|
57
|
+
for (let course = maxCourse; course >= 1; course -= 1) {
|
|
58
|
+
const courseEvents = await persistence_1.DialogPersistence.loadCourseEvents(args.calleeDialogId, course, status);
|
|
59
|
+
for (let i = courseEvents.length - 1; i >= 0; i -= 1) {
|
|
60
|
+
const event = courseEvents[i];
|
|
61
|
+
if (event.type !== 'teammate_call_anchor_record') {
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (event.anchorRole !== 'assignment') {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
if (event.callId.trim() !== normalizedCallId) {
|
|
68
|
+
continue;
|
|
69
|
+
}
|
|
70
|
+
if (!Number.isFinite(event.genseq) || event.genseq <= 0) {
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
return { course, genseq: Math.floor(event.genseq) };
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
41
78
|
async function supplyResponseToSupdialogV2(args) {
|
|
42
|
-
const { parentDialog, subdialogId, responseText, callType, callId, status = 'completed', scheduleDrive, } = args;
|
|
79
|
+
const { parentDialog, subdialogId, responseText, callType, callId, status = 'completed', calleeResponseRef, scheduleDrive, } = args;
|
|
43
80
|
try {
|
|
44
81
|
const result = await (0, subdialog_txn_1.withSubdialogTxnLock)(parentDialog.id, async () => {
|
|
45
82
|
const pendingSubdialogs = await persistence_1.DialogPersistence.loadPendingSubdialogs(parentDialog.id);
|
|
@@ -55,7 +92,9 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
55
92
|
}
|
|
56
93
|
let responderId = subdialogId.rootId;
|
|
57
94
|
let responderAgentId;
|
|
58
|
-
let
|
|
95
|
+
let callName = 'tellaskSessionless';
|
|
96
|
+
let mentionList;
|
|
97
|
+
let tellaskContent = responseText;
|
|
59
98
|
let originMemberId;
|
|
60
99
|
try {
|
|
61
100
|
let metadata = await persistence_1.DialogPersistence.loadDialogMetadata(subdialogId, 'running');
|
|
@@ -65,10 +104,9 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
65
104
|
if (metadata && metadata.assignmentFromSup) {
|
|
66
105
|
originMemberId = metadata.assignmentFromSup.originMemberId;
|
|
67
106
|
if (!pendingRecord) {
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
107
|
+
callName = metadata.assignmentFromSup.callName;
|
|
108
|
+
mentionList = metadata.assignmentFromSup.mentionList;
|
|
109
|
+
tellaskContent = metadata.assignmentFromSup.tellaskContent;
|
|
72
110
|
}
|
|
73
111
|
}
|
|
74
112
|
if (!pendingRecord && metadata && typeof metadata.agentId === 'string') {
|
|
@@ -79,7 +117,7 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
79
117
|
}
|
|
80
118
|
}
|
|
81
119
|
catch (err) {
|
|
82
|
-
log_1.log.warn('Failed to load subdialog metadata for response record', {
|
|
120
|
+
log_1.log.warn('Failed to load subdialog metadata for response record', undefined, {
|
|
83
121
|
parentId: parentDialog.id.selfId,
|
|
84
122
|
subdialogId: subdialogId.selfId,
|
|
85
123
|
error: err,
|
|
@@ -89,12 +127,15 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
89
127
|
originMemberId = parentDialog.agentId;
|
|
90
128
|
}
|
|
91
129
|
if (pendingRecord) {
|
|
130
|
+
callName = pendingRecord.callName;
|
|
92
131
|
responderId = pendingRecord.targetAgentId;
|
|
93
132
|
responderAgentId = pendingRecord.targetAgentId;
|
|
94
|
-
|
|
133
|
+
mentionList = pendingRecord.mentionList;
|
|
134
|
+
tellaskContent = pendingRecord.tellaskContent;
|
|
95
135
|
}
|
|
96
|
-
if (
|
|
97
|
-
|
|
136
|
+
if ((callName === 'tellask' || callName === 'tellaskSessionless') &&
|
|
137
|
+
(!Array.isArray(mentionList) || mentionList.length < 1)) {
|
|
138
|
+
mentionList = [`@${responderId}`];
|
|
98
139
|
}
|
|
99
140
|
await persistence_1.DialogPersistence.savePendingSubdialogs(parentDialog.id, filteredPending);
|
|
100
141
|
const hasQ4H = await parentDialog.hasPendingQ4H();
|
|
@@ -105,17 +146,58 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
105
146
|
return {
|
|
106
147
|
responderId,
|
|
107
148
|
responderAgentId,
|
|
108
|
-
|
|
149
|
+
callName,
|
|
150
|
+
mentionList,
|
|
151
|
+
tellaskContent,
|
|
109
152
|
originMemberId,
|
|
153
|
+
callId: pendingRecord?.callId,
|
|
154
|
+
callingCourse: pendingRecord &&
|
|
155
|
+
typeof pendingRecord.callingCourse === 'number' &&
|
|
156
|
+
Number.isFinite(pendingRecord.callingCourse) &&
|
|
157
|
+
pendingRecord.callingCourse > 0
|
|
158
|
+
? Math.floor(pendingRecord.callingCourse)
|
|
159
|
+
: undefined,
|
|
110
160
|
shouldRevive,
|
|
111
161
|
};
|
|
112
162
|
});
|
|
163
|
+
const normalizedCallId = typeof callId === 'string' ? callId.trim() : '';
|
|
164
|
+
const fallbackCallId = typeof result.callId === 'string' ? result.callId.trim() : '';
|
|
165
|
+
const resolvedCallId = normalizedCallId !== '' ? normalizedCallId : fallbackCallId;
|
|
166
|
+
if (resolvedCallId !== '' && calleeResponseRef) {
|
|
167
|
+
const assignmentRef = await resolveLatestAssignmentAnchorRef({
|
|
168
|
+
calleeDialogId: subdialogId,
|
|
169
|
+
callId: resolvedCallId,
|
|
170
|
+
});
|
|
171
|
+
if (!assignmentRef) {
|
|
172
|
+
log_1.log.error('Missing assignment anchor for teammate response anchor', undefined, {
|
|
173
|
+
parentId: parentDialog.id.selfId,
|
|
174
|
+
subdialogId: subdialogId.selfId,
|
|
175
|
+
callId: resolvedCallId,
|
|
176
|
+
responseCourse: calleeResponseRef.course,
|
|
177
|
+
responseGenseq: calleeResponseRef.genseq,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
const anchorRecord = {
|
|
181
|
+
ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
|
|
182
|
+
type: 'teammate_call_anchor_record',
|
|
183
|
+
anchorRole: 'response',
|
|
184
|
+
callId: resolvedCallId,
|
|
185
|
+
genseq: calleeResponseRef.genseq,
|
|
186
|
+
assignmentCourse: assignmentRef?.course,
|
|
187
|
+
assignmentGenseq: assignmentRef?.genseq,
|
|
188
|
+
callerDialogId: parentDialog.id.selfId,
|
|
189
|
+
callerCourse: result.callingCourse,
|
|
190
|
+
};
|
|
191
|
+
await persistence_1.DialogPersistence.appendEvent(subdialogId, calleeResponseRef.course, anchorRecord);
|
|
192
|
+
}
|
|
113
193
|
await syncPendingTellaskReminderBestEffort(parentDialog, 'driver-v2:supplyResponseToSupdialog');
|
|
114
|
-
await parentDialog.receiveTeammateResponse(result.responderId, result.
|
|
194
|
+
await parentDialog.receiveTeammateResponse(result.responderId, result.callName, result.mentionList, result.tellaskContent, status, subdialogId, {
|
|
115
195
|
response: responseText,
|
|
116
196
|
agentId: result.responderAgentId ?? result.responderId,
|
|
117
|
-
callId:
|
|
197
|
+
callId: resolvedCallId,
|
|
118
198
|
originMemberId: result.originMemberId ?? parentDialog.agentId,
|
|
199
|
+
calleeCourse: calleeResponseRef?.course,
|
|
200
|
+
calleeGenseq: calleeResponseRef?.genseq,
|
|
119
201
|
});
|
|
120
202
|
// Keep in-memory dialog context in sync with live teammate-response events immediately.
|
|
121
203
|
// v2 context assembly now relies on dialog msgs + persisted teammate_response_record only.
|
|
@@ -123,12 +205,16 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
123
205
|
type: 'tellask_result_msg',
|
|
124
206
|
role: 'tool',
|
|
125
207
|
responderId: result.responderId,
|
|
126
|
-
|
|
208
|
+
mentionList: result.mentionList,
|
|
209
|
+
tellaskContent: result.tellaskContent,
|
|
127
210
|
status,
|
|
211
|
+
callId: resolvedCallId,
|
|
128
212
|
content: (0, inter_dialog_format_1.formatTeammateResponseContent)({
|
|
213
|
+
callName: result.callName,
|
|
129
214
|
responderId: result.responderId,
|
|
130
215
|
requesterId: result.originMemberId ?? parentDialog.agentId,
|
|
131
|
-
|
|
216
|
+
mentionList: result.mentionList,
|
|
217
|
+
tellaskContent: result.tellaskContent,
|
|
132
218
|
responseBody: responseText,
|
|
133
219
|
language: (0, runtime_language_1.getWorkLanguage)(),
|
|
134
220
|
}),
|
|
@@ -139,7 +225,7 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
139
225
|
const hasRegistryEntry = isRoot
|
|
140
226
|
? dialog_global_registry_1.globalDialogRegistry.get(parentDialog.id.rootId) !== undefined
|
|
141
227
|
: false;
|
|
142
|
-
log_1.log.
|
|
228
|
+
log_1.log.debug(`All Type ${callType} subdialogs complete, parent ${parentDialog.id.selfId} scheduling auto-revive`, undefined, {
|
|
143
229
|
rootId: parentDialog.id.rootId,
|
|
144
230
|
selfId: parentDialog.id.selfId,
|
|
145
231
|
via: isRoot && hasRegistryEntry ? 'backend_loop_trigger' : 'direct_schedule_drive',
|
|
@@ -164,16 +250,15 @@ async function supplyResponseToSupdialogV2(args) {
|
|
|
164
250
|
}
|
|
165
251
|
}
|
|
166
252
|
catch (error) {
|
|
167
|
-
log_1.log.error('driver-v2 failed to supply subdialog response', {
|
|
253
|
+
log_1.log.error('driver-v2 failed to supply subdialog response', error, {
|
|
168
254
|
parentId: parentDialog.id.selfId,
|
|
169
255
|
subdialogId: subdialogId.selfId,
|
|
170
|
-
error,
|
|
171
256
|
});
|
|
172
257
|
throw error;
|
|
173
258
|
}
|
|
174
259
|
}
|
|
175
260
|
async function supplySubdialogResponseToSpecificCallerIfPendingV2(args) {
|
|
176
|
-
const { subdialog, responseText, target, scheduleDrive } = args;
|
|
261
|
+
const { subdialog, responseText, responseGenseq, target, scheduleDrive } = args;
|
|
177
262
|
const assignment = subdialog.assignmentFromSup;
|
|
178
263
|
if (!assignment) {
|
|
179
264
|
return false;
|
|
@@ -188,7 +273,7 @@ async function supplySubdialogResponseToSpecificCallerIfPendingV2(args) {
|
|
|
188
273
|
return false;
|
|
189
274
|
}
|
|
190
275
|
if (pendingRecord.callType !== target.callType) {
|
|
191
|
-
log_1.log.warn('Reply target callType does not match pending callType; skipping stale reply target', {
|
|
276
|
+
log_1.log.warn('Reply target callType does not match pending callType; skipping stale reply target', undefined, {
|
|
192
277
|
rootId: subdialog.rootDialog.id.rootId,
|
|
193
278
|
subdialogId: subdialog.id.selfId,
|
|
194
279
|
ownerDialogId: ownerDialog.id.selfId,
|
|
@@ -204,19 +289,20 @@ async function supplySubdialogResponseToSpecificCallerIfPendingV2(args) {
|
|
|
204
289
|
callType: pendingRecord.callType,
|
|
205
290
|
callId: target.callId,
|
|
206
291
|
status: 'completed',
|
|
292
|
+
calleeResponseRef: { course: subdialog.currentCourse, genseq: responseGenseq },
|
|
207
293
|
scheduleDrive,
|
|
208
294
|
});
|
|
209
295
|
return true;
|
|
210
296
|
}
|
|
211
297
|
async function supplySubdialogResponseToAssignedCallerIfPendingV2(args) {
|
|
212
|
-
const { subdialog, responseText, scheduleDrive } = args;
|
|
298
|
+
const { subdialog, responseText, responseGenseq, scheduleDrive } = args;
|
|
213
299
|
const assignment = subdialog.assignmentFromSup;
|
|
214
300
|
if (!assignment) {
|
|
215
301
|
return false;
|
|
216
302
|
}
|
|
217
303
|
const callerDialog = await resolveOwnerDialogBySelfId(subdialog, assignment.callerDialogId);
|
|
218
304
|
if (!callerDialog) {
|
|
219
|
-
log_1.log.warn('Missing caller dialog for subdialog response supply', {
|
|
305
|
+
log_1.log.warn('Missing caller dialog for subdialog response supply', undefined, {
|
|
220
306
|
rootId: subdialog.rootDialog.id.rootId,
|
|
221
307
|
subdialogId: subdialog.id.selfId,
|
|
222
308
|
callerDialogId: assignment.callerDialogId,
|
|
@@ -235,6 +321,7 @@ async function supplySubdialogResponseToAssignedCallerIfPendingV2(args) {
|
|
|
235
321
|
callType: pendingRecord.callType,
|
|
236
322
|
callId: assignment.callId,
|
|
237
323
|
status: 'completed',
|
|
324
|
+
calleeResponseRef: { course: subdialog.currentCourse, genseq: responseGenseq },
|
|
238
325
|
scheduleDrive,
|
|
239
326
|
});
|
|
240
327
|
return true;
|