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
@@ -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.info(`Dialog ${rootDialog.id.rootId} suspended, waiting for subdialogs`, undefined, {
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.info(`Dialog ${rootDialog.id.rootId} awaiting Q4H answer`, undefined, {
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
- return dlg instanceof dialog_1.SubDialog && isFbrSelfTellaskHeadLine(dlg.assignmentFromSup.tellaskHead);
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
- '- 你正在处理一次由 `!?@self` 发起的 FBR 支线对话。',
34
- '- 诉请正文是主要任务上下文;不要假设能访问诉请者对话历史。',
35
- '- 若使用可恢复的 `!tellaskSession` 形式,你可以使用本支线对话自身的 `tellaskSession` 历史作为显式上下文。',
32
+ '- 你正在处理一次由 `freshBootsReasoning` 函数触发的 FBR 支线对话。',
33
+ '- 诉请正文是主要任务上下文;不要假设能访问上游对话历史。',
34
+ '- 若使用可恢复会话,你可以使用本支线对话自身的 tellaskSession 历史作为显式上下文。',
36
35
  '- 若诉请正文缺少关键上下文,请在输出中列出缺失信息与阻塞原因。',
37
- '- 仅当必须澄清关键缺失上下文时,允许用 `!?@tellasker` 回问诉请者;除此之外不要发起任何诉请。',
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 created by `!?@self`.',
43
- '- The tellask body is the primary task context; do not assume access to tellasker dialog history.',
44
- '- If this is the resumable `!tellaskSession` form, you may use this sideline dialog’s own tellaskSession history as explicit context.',
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
- '- `!?@tellasker` is allowed only when you must clarify critical missing context; otherwise do not emit any tellasks.',
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: 'tellasker_only',
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 !== 'tellasker_only') {
93
- return { ok: false, detail: 'FBR tellaskPolicy must be tellasker_only.' };
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, calls) {
110
+ function hasTellaskPolicyViolation(policy, tellaskCallCount) {
112
111
  if (policy.tellaskPolicy === 'allow_any') {
113
112
  return false;
114
113
  }
115
- return calls.some((call) => {
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.tellaskCalls);
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
- tellaskSession: record.tellaskSession,
33
+ sessionSlug: record.sessionSlug,
34
34
  createdAt: record.createdAt,
35
- tellaskHeadSummary: record.tellaskHead.trim().slice(0, 160),
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.info('driver-v2 skip drive while stop request is still being processed', undefined, {
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.info('driver-v2 skip drive for interrupted dialog without explicit resume/user prompt', undefined, {
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.info('driver-v2 skip queued auto-drive while dialog is suspended', undefined, {
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
- tellaskHead: '@human',
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
- tellaskHead: question.tellaskHead,
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
- const receiver = createSayingEventsReceiver(dlg);
54
- const parser = new tellask_1.TellaskStreamParser(receiver);
55
- await parser.takeUpstreamChunk(content);
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 tellaskHead = responseText;
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
- const assignmentHead = metadata.assignmentFromSup.tellaskHead;
69
- if (typeof assignmentHead === 'string' && assignmentHead.trim() !== '') {
70
- tellaskHead = assignmentHead;
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
- tellaskHead = pendingRecord.tellaskHead;
133
+ mentionList = pendingRecord.mentionList;
134
+ tellaskContent = pendingRecord.tellaskContent;
95
135
  }
96
- if (tellaskHead.trim() === '') {
97
- tellaskHead = responseText.slice(0, 100) + (responseText.length > 100 ? '...' : '');
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
- tellaskHead,
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.tellaskHead, status, subdialogId, {
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: 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
- tellaskHead: result.tellaskHead,
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
- originalCallHeadLine: result.tellaskHead,
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.info(`All Type ${callType} subdialogs complete, parent ${parentDialog.id.selfId} scheduling auto-revive`, undefined, {
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;