dominds 0.7.2 → 0.7.3

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 (105) hide show
  1. package/dist/dialog-global-registry.js +58 -3
  2. package/dist/dialog.js +17 -0
  3. package/dist/evt-registry.js +16 -7
  4. package/dist/llm/driver-v2/context.js +2 -1
  5. package/dist/llm/driver-v2/core.js +1 -118
  6. package/dist/llm/driver-v2/orchestrator.js +65 -38
  7. package/dist/llm/driver-v2/round.js +117 -31
  8. package/dist/llm/driver-v2/runtime-utils.js +1 -0
  9. package/dist/llm/driver-v2/supdialog-response.js +5 -18
  10. package/dist/llm/driver-v2/tellask-bridge.js +66 -4
  11. package/dist/persistence.js +8 -0
  12. package/dist/server/websocket-handler.js +43 -26
  13. package/dist/static/assets/{_baseUniq-C04fddeD.js → _baseUniq-zV3pyJ-s.js} +2 -2
  14. package/dist/static/assets/{_baseUniq-C04fddeD.js.map → _baseUniq-zV3pyJ-s.js.map} +1 -1
  15. package/dist/static/assets/{arc-qmZerooe.js → arc-Ctgmrh71.js} +2 -2
  16. package/dist/static/assets/{arc-qmZerooe.js.map → arc-Ctgmrh71.js.map} +1 -1
  17. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DPAwJ19g.js → architectureDiagram-VXUJARFQ-CAH1Zinn.js} +6 -6
  18. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DPAwJ19g.js.map → architectureDiagram-VXUJARFQ-CAH1Zinn.js.map} +1 -1
  19. package/dist/static/assets/{blockDiagram-VD42YOAC-M0jbEJ-1.js → blockDiagram-VD42YOAC-Djz6JdD2.js} +7 -7
  20. package/dist/static/assets/{blockDiagram-VD42YOAC-M0jbEJ-1.js.map → blockDiagram-VD42YOAC-Djz6JdD2.js.map} +1 -1
  21. package/dist/static/assets/{c4Diagram-YG6GDRKO-DlF8gwFw.js → c4Diagram-YG6GDRKO-CSuskOyq.js} +3 -3
  22. package/dist/static/assets/{c4Diagram-YG6GDRKO-DlF8gwFw.js.map → c4Diagram-YG6GDRKO-CSuskOyq.js.map} +1 -1
  23. package/dist/static/assets/{channel-B2Ph7be3.js → channel-Ym6U59Kh.js} +2 -2
  24. package/dist/static/assets/{channel-B2Ph7be3.js.map → channel-Ym6U59Kh.js.map} +1 -1
  25. package/dist/static/assets/{chunk-4BX2VUAB-BZ2L6PK1.js → chunk-4BX2VUAB-CqbVylSz.js} +2 -2
  26. package/dist/static/assets/{chunk-4BX2VUAB-BZ2L6PK1.js.map → chunk-4BX2VUAB-CqbVylSz.js.map} +1 -1
  27. package/dist/static/assets/{chunk-55IACEB6-COXFmnJW.js → chunk-55IACEB6-CeWj8Jm_.js} +2 -2
  28. package/dist/static/assets/{chunk-55IACEB6-COXFmnJW.js.map → chunk-55IACEB6-CeWj8Jm_.js.map} +1 -1
  29. package/dist/static/assets/{chunk-B4BG7PRW-B1HiWlBq.js → chunk-B4BG7PRW-BjxJkuhq.js} +5 -5
  30. package/dist/static/assets/{chunk-B4BG7PRW-B1HiWlBq.js.map → chunk-B4BG7PRW-BjxJkuhq.js.map} +1 -1
  31. package/dist/static/assets/{chunk-DI55MBZ5-BO3wQRnL.js → chunk-DI55MBZ5-9kxfXB4B.js} +4 -4
  32. package/dist/static/assets/{chunk-DI55MBZ5-BO3wQRnL.js.map → chunk-DI55MBZ5-9kxfXB4B.js.map} +1 -1
  33. package/dist/static/assets/{chunk-FMBD7UC4-BdavRHSy.js → chunk-FMBD7UC4-DyM3IVWB.js} +2 -2
  34. package/dist/static/assets/{chunk-FMBD7UC4-BdavRHSy.js.map → chunk-FMBD7UC4-DyM3IVWB.js.map} +1 -1
  35. package/dist/static/assets/{chunk-QN33PNHL-DchoUNF7.js → chunk-QN33PNHL-DGU21aEB.js} +2 -2
  36. package/dist/static/assets/{chunk-QN33PNHL-DchoUNF7.js.map → chunk-QN33PNHL-DGU21aEB.js.map} +1 -1
  37. package/dist/static/assets/{chunk-QZHKN3VN-Dr3uVTtK.js → chunk-QZHKN3VN-Cw9Hpt-y.js} +2 -2
  38. package/dist/static/assets/{chunk-QZHKN3VN-Dr3uVTtK.js.map → chunk-QZHKN3VN-Cw9Hpt-y.js.map} +1 -1
  39. package/dist/static/assets/{chunk-TZMSLE5B-BhOcHZNs.js → chunk-TZMSLE5B-J-eTCnFj.js} +2 -2
  40. package/dist/static/assets/{chunk-TZMSLE5B-BhOcHZNs.js.map → chunk-TZMSLE5B-J-eTCnFj.js.map} +1 -1
  41. package/dist/static/assets/{classDiagram-2ON5EDUG-Dep-MR6W.js → classDiagram-2ON5EDUG-BvoDAd8E.js} +6 -6
  42. package/dist/static/assets/{classDiagram-2ON5EDUG-Dep-MR6W.js.map → classDiagram-2ON5EDUG-BvoDAd8E.js.map} +1 -1
  43. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dep-MR6W.js → classDiagram-v2-WZHVMYZB-BvoDAd8E.js} +6 -6
  44. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dep-MR6W.js.map → classDiagram-v2-WZHVMYZB-BvoDAd8E.js.map} +1 -1
  45. package/dist/static/assets/{clone-DzoL-dSX.js → clone-CojsCkky.js} +2 -2
  46. package/dist/static/assets/{clone-DzoL-dSX.js.map → clone-CojsCkky.js.map} +1 -1
  47. package/dist/static/assets/{cose-bilkent-S5V4N54A-Bqu_DqDB.js → cose-bilkent-S5V4N54A-BEtK3OcG.js} +2 -2
  48. package/dist/static/assets/{cose-bilkent-S5V4N54A-Bqu_DqDB.js.map → cose-bilkent-S5V4N54A-BEtK3OcG.js.map} +1 -1
  49. package/dist/static/assets/{dagre-6UL2VRFP-49InNTzs.js → dagre-6UL2VRFP-C5DMaVj0.js} +7 -7
  50. package/dist/static/assets/{dagre-6UL2VRFP-49InNTzs.js.map → dagre-6UL2VRFP-C5DMaVj0.js.map} +1 -1
  51. package/dist/static/assets/{diagram-PSM6KHXK-C1IsQq8m.js → diagram-PSM6KHXK-kVP0dZ6K.js} +7 -7
  52. package/dist/static/assets/{diagram-PSM6KHXK-C1IsQq8m.js.map → diagram-PSM6KHXK-kVP0dZ6K.js.map} +1 -1
  53. package/dist/static/assets/{diagram-QEK2KX5R-DyJeSg_Y.js → diagram-QEK2KX5R-C4p2yibe.js} +6 -6
  54. package/dist/static/assets/{diagram-QEK2KX5R-DyJeSg_Y.js.map → diagram-QEK2KX5R-C4p2yibe.js.map} +1 -1
  55. package/dist/static/assets/{diagram-S2PKOQOG-aeLjjldp.js → diagram-S2PKOQOG-B3vObsYY.js} +6 -6
  56. package/dist/static/assets/{diagram-S2PKOQOG-aeLjjldp.js.map → diagram-S2PKOQOG-B3vObsYY.js.map} +1 -1
  57. package/dist/static/assets/{erDiagram-Q2GNP2WA-BUcv4AUq.js → erDiagram-Q2GNP2WA-AKQItpVu.js} +5 -5
  58. package/dist/static/assets/{erDiagram-Q2GNP2WA-BUcv4AUq.js.map → erDiagram-Q2GNP2WA-AKQItpVu.js.map} +1 -1
  59. package/dist/static/assets/{flowDiagram-NV44I4VS-DfmTKlf_.js → flowDiagram-NV44I4VS-2dalJoL3.js} +6 -6
  60. package/dist/static/assets/{flowDiagram-NV44I4VS-DfmTKlf_.js.map → flowDiagram-NV44I4VS-2dalJoL3.js.map} +1 -1
  61. package/dist/static/assets/{ganttDiagram-JELNMOA3-BpJE8Lhp.js → ganttDiagram-JELNMOA3-DUw98Lbz.js} +3 -3
  62. package/dist/static/assets/{ganttDiagram-JELNMOA3-BpJE8Lhp.js.map → ganttDiagram-JELNMOA3-DUw98Lbz.js.map} +1 -1
  63. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-DmznjSYb.js → gitGraphDiagram-NY62KEGX-DdwIFk8M.js} +7 -7
  64. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-DmznjSYb.js.map → gitGraphDiagram-NY62KEGX-DdwIFk8M.js.map} +1 -1
  65. package/dist/static/assets/{graph-CcKyIZaL.js → graph-BBEAP9Z9.js} +3 -3
  66. package/dist/static/assets/{graph-CcKyIZaL.js.map → graph-BBEAP9Z9.js.map} +1 -1
  67. package/dist/static/assets/{index-CQr8MdPI.js → index-CqMOe9zt.js} +149 -101
  68. package/dist/static/assets/index-CqMOe9zt.js.map +1 -0
  69. package/dist/static/assets/{infoDiagram-WHAUD3N6-DwRPjndM.js → infoDiagram-WHAUD3N6-Cep11ST9.js} +5 -5
  70. package/dist/static/assets/{infoDiagram-WHAUD3N6-DwRPjndM.js.map → infoDiagram-WHAUD3N6-Cep11ST9.js.map} +1 -1
  71. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BRAFSgVa.js → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js} +5 -5
  72. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BRAFSgVa.js.map → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js.map} +1 -1
  73. package/dist/static/assets/{kanban-definition-3W4ZIXB7-DlJ7-fgN.js → kanban-definition-3W4ZIXB7-DhxNBORX.js} +3 -3
  74. package/dist/static/assets/{kanban-definition-3W4ZIXB7-DlJ7-fgN.js.map → kanban-definition-3W4ZIXB7-DhxNBORX.js.map} +1 -1
  75. package/dist/static/assets/{layout-CcW5-Iee.js → layout-Ckbr6Zyz.js} +5 -5
  76. package/dist/static/assets/{layout-CcW5-Iee.js.map → layout-Ckbr6Zyz.js.map} +1 -1
  77. package/dist/static/assets/{linear-sKdPIuOH.js → linear-BrSsI51I.js} +2 -2
  78. package/dist/static/assets/{linear-sKdPIuOH.js.map → linear-BrSsI51I.js.map} +1 -1
  79. package/dist/static/assets/{min-CQ0AYqmk.js → min-CeEvLc8D.js} +3 -3
  80. package/dist/static/assets/{min-CQ0AYqmk.js.map → min-CeEvLc8D.js.map} +1 -1
  81. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CTRwSlu8.js → mindmap-definition-VGOIOE7T-7ctLd3o3.js} +4 -4
  82. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CTRwSlu8.js.map → mindmap-definition-VGOIOE7T-7ctLd3o3.js.map} +1 -1
  83. package/dist/static/assets/{pieDiagram-ADFJNKIX-DmD5KRKE.js → pieDiagram-ADFJNKIX-CqyILziW.js} +7 -7
  84. package/dist/static/assets/{pieDiagram-ADFJNKIX-DmD5KRKE.js.map → pieDiagram-ADFJNKIX-CqyILziW.js.map} +1 -1
  85. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-C5sqZOBF.js → quadrantDiagram-AYHSOK5B-Byi_xYum.js} +3 -3
  86. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-C5sqZOBF.js.map → quadrantDiagram-AYHSOK5B-Byi_xYum.js.map} +1 -1
  87. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DBAUwM-7.js → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js} +4 -4
  88. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DBAUwM-7.js.map → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js.map} +1 -1
  89. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CkaxkOo7.js → sankeyDiagram-TZEHDZUN-DzoUAdfa.js} +2 -2
  90. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CkaxkOo7.js.map → sankeyDiagram-TZEHDZUN-DzoUAdfa.js.map} +1 -1
  91. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CJ6wMDXh.js → sequenceDiagram-WL72ISMW-BKKxpG1m.js} +4 -4
  92. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CJ6wMDXh.js.map → sequenceDiagram-WL72ISMW-BKKxpG1m.js.map} +1 -1
  93. package/dist/static/assets/{stateDiagram-FKZM4ZOC-C66ZP2NW.js → stateDiagram-FKZM4ZOC-B-J7uRZT.js} +9 -9
  94. package/dist/static/assets/{stateDiagram-FKZM4ZOC-C66ZP2NW.js.map → stateDiagram-FKZM4ZOC-B-J7uRZT.js.map} +1 -1
  95. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DdoOy271.js → stateDiagram-v2-4FDKWEC3-BOzmoUba.js} +5 -5
  96. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DdoOy271.js.map → stateDiagram-v2-4FDKWEC3-BOzmoUba.js.map} +1 -1
  97. package/dist/static/assets/{timeline-definition-IT6M3QCI-2A2Mqedz.js → timeline-definition-IT6M3QCI-zu1Rojx9.js} +3 -3
  98. package/dist/static/assets/{timeline-definition-IT6M3QCI-2A2Mqedz.js.map → timeline-definition-IT6M3QCI-zu1Rojx9.js.map} +1 -1
  99. package/dist/static/assets/{treemap-KMMF4GRG-CTbGSr5o.js → treemap-KMMF4GRG-C4D91awC.js} +4 -4
  100. package/dist/static/assets/{treemap-KMMF4GRG-CTbGSr5o.js.map → treemap-KMMF4GRG-C4D91awC.js.map} +1 -1
  101. package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_S3XXZI.js → xychartDiagram-PRI3JC2R-YvLKaPZ-.js} +3 -3
  102. package/dist/static/assets/{xychartDiagram-PRI3JC2R-C_S3XXZI.js.map → xychartDiagram-PRI3JC2R-YvLKaPZ-.js.map} +1 -1
  103. package/dist/static/index.html +1 -1
  104. package/package.json +1 -1
  105. package/dist/static/assets/index-CQr8MdPI.js.map +0 -1
@@ -181,6 +181,7 @@ async function suspendForKeepGoingBudgetExhausted(options) {
181
181
  bodyContent: question.bodyContent,
182
182
  askedAt: question.askedAt,
183
183
  callId: question.callId,
184
+ remainingCallIds: question.remainingCallIds,
184
185
  callSiteRef: question.callSiteRef,
185
186
  rootId: dlg.id.rootId,
186
187
  agentId: dlg.agentId,
@@ -9,9 +9,7 @@ const dialog_instance_registry_1 = require("../../dialog-instance-registry");
9
9
  const log_1 = require("../../log");
10
10
  const persistence_1 = require("../../persistence");
11
11
  const runtime_language_1 = require("../../shared/runtime-language");
12
- const id_1 = require("../../shared/utils/id");
13
12
  const inter_dialog_format_1 = require("../../shared/utils/inter-dialog-format");
14
- const time_1 = require("../../shared/utils/time");
15
13
  const pending_tellask_reminder_1 = require("../../tools/pending-tellask-reminder");
16
14
  const subdialog_txn_1 = require("./subdialog-txn");
17
15
  async function syncPendingTellaskReminderBestEffort(dlg, where) {
@@ -98,20 +96,6 @@ async function supplyResponseToSupdialogV2(args) {
98
96
  if (tellaskHead.trim() === '') {
99
97
  tellaskHead = responseText.slice(0, 100) + (responseText.length > 100 ? '...' : '');
100
98
  }
101
- const completedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
102
- const responseId = (0, id_1.generateShortId)();
103
- await persistence_1.DialogPersistence.appendSubdialogResponse(parentDialog.id, {
104
- responseId,
105
- subdialogId: subdialogId.selfId,
106
- response: responseText,
107
- completedAt,
108
- status,
109
- callType,
110
- tellaskHead,
111
- responderId,
112
- originMemberId,
113
- callId: callId ?? '',
114
- });
115
99
  await persistence_1.DialogPersistence.savePendingSubdialogs(parentDialog.id, filteredPending);
116
100
  const hasQ4H = await parentDialog.hasPendingQ4H();
117
101
  const shouldRevive = !hasQ4H && filteredPending.length === 0;
@@ -134,7 +118,7 @@ async function supplyResponseToSupdialogV2(args) {
134
118
  originMemberId: result.originMemberId ?? parentDialog.agentId,
135
119
  });
136
120
  // Keep in-memory dialog context in sync with live teammate-response events immediately.
137
- // Without this, tellask_result_msg can appear batched at drive-finalization mirror time.
121
+ // v2 context assembly now relies on dialog msgs + persisted teammate_response_record only.
138
122
  const immediateMirror = {
139
123
  type: 'tellask_result_msg',
140
124
  role: 'tool',
@@ -153,7 +137,10 @@ async function supplyResponseToSupdialogV2(args) {
153
137
  if (result.shouldRevive) {
154
138
  log_1.log.info(`All Type ${callType} subdialogs complete, parent ${parentDialog.id.selfId} auto-reviving`);
155
139
  if (parentDialog instanceof dialog_1.RootDialog) {
156
- dialog_global_registry_1.globalDialogRegistry.markNeedsDrive(parentDialog.id.rootId);
140
+ dialog_global_registry_1.globalDialogRegistry.markNeedsDrive(parentDialog.id.rootId, {
141
+ source: 'driver_v2_supply_response',
142
+ reason: `all_pending_subdialogs_resolved:type_${callType}`,
143
+ });
157
144
  }
158
145
  scheduleDrive(parentDialog, {
159
146
  waitInQue: true,
@@ -46,7 +46,6 @@ const inter_dialog_format_1 = require("../../shared/utils/inter-dialog-format");
46
46
  const time_1 = require("../../shared/utils/time");
47
47
  const team_1 = require("../../team");
48
48
  const pending_tellask_reminder_1 = require("../../tools/pending-tellask-reminder");
49
- const id_2 = require("../../utils/id");
50
49
  const subdialog_txn_1 = require("./subdialog-txn");
51
50
  function showErrorToAi(err) {
52
51
  try {
@@ -419,13 +418,21 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
419
418
  const isQ4H = firstMention === 'human';
420
419
  if (isQ4H) {
421
420
  try {
422
- const questionId = `q4h-${(0, id_2.generateDialogID)()}`;
421
+ const normalizedCallId = callId.trim();
422
+ if (normalizedCallId === '') {
423
+ throw new Error(`Q4H call invariant violation: empty callId (rootId=${dlg.id.rootId} selfId=${dlg.id.selfId})`);
424
+ }
425
+ const questionId = `q4h-${dlg.id.rootId}-${dlg.id.selfId}-c${dlg.currentCourse}-${normalizedCallId}`;
426
+ const normalizedRemainingCallIds = Array.from(new Set((options?.q4hRemainingCallIds ?? [])
427
+ .map((value) => value.trim())
428
+ .filter((value) => value !== '' && value !== normalizedCallId)));
423
429
  const question = {
424
430
  id: questionId,
425
431
  tellaskHead: tellaskHead.trim(),
426
432
  bodyContent: body.trim(),
427
433
  askedAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
428
- callId: callId.trim() === '' ? undefined : callId,
434
+ callId: normalizedCallId,
435
+ remainingCallIds: normalizedRemainingCallIds.length > 0 ? normalizedRemainingCallIds : undefined,
429
436
  callSiteRef: {
430
437
  course: dlg.currentCourse,
431
438
  messageIndex: dlg.msgs.length,
@@ -441,6 +448,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
441
448
  bodyContent: question.bodyContent,
442
449
  askedAt: question.askedAt,
443
450
  callId: question.callId,
451
+ remainingCallIds: question.remainingCallIds,
444
452
  callSiteRef: question.callSiteRef,
445
453
  rootId: dlg.id.rootId,
446
454
  agentId: dlg.agentId,
@@ -1076,7 +1084,61 @@ async function executeTellaskCalls(args) {
1076
1084
  const callbacks = ensureCallbacks(args.callbacks);
1077
1085
  const malformedToolOutputs = await emitMalformedTellaskResponses(dlg, collectedCalls);
1078
1086
  const validCalls = collectedCalls.filter((call) => call.validation.kind === 'valid');
1079
- const results = await Promise.all(validCalls.map((call) => executeTellaskCall(dlg, agent, call.validation.firstMention, call.tellaskHead, call.body, call.callId, callbacks)));
1087
+ const q4hCalls = validCalls.filter((call) => call.validation.firstMention === 'human');
1088
+ const nonQ4HCalls = validCalls
1089
+ .filter((call) => call.validation.firstMention !== 'human')
1090
+ .map((call) => ({ ...call }));
1091
+ let mergedQ4HCall = null;
1092
+ if (q4hCalls.length === 1) {
1093
+ mergedQ4HCall = { ...q4hCalls[0] };
1094
+ }
1095
+ else if (q4hCalls.length > 1) {
1096
+ const primary = q4hCalls[0];
1097
+ const remainingCallIds = q4hCalls
1098
+ .slice(1)
1099
+ .map((call) => call.callId.trim())
1100
+ .filter((callId) => callId !== '');
1101
+ const language = (0, runtime_language_1.getWorkLanguage)();
1102
+ const intro = language === 'zh'
1103
+ ? `我这次有 ${q4hCalls.length} 个问题,想请你一次性回复:`
1104
+ : `I have ${q4hCalls.length} questions this round. Please answer them in one response:`;
1105
+ const mergedBody = [
1106
+ intro,
1107
+ ...q4hCalls.map((call, index) => {
1108
+ const body = call.body.trim();
1109
+ const normalizedBody = body !== ''
1110
+ ? body
1111
+ : language === 'zh'
1112
+ ? '请结合当前上下文补充这一项。'
1113
+ : 'Please provide this item based on the current context.';
1114
+ return language === 'zh'
1115
+ ? `问题 ${index + 1}:\n${normalizedBody}`
1116
+ : `Question ${index + 1}:\n${normalizedBody}`;
1117
+ }),
1118
+ ].join('\n\n');
1119
+ mergedQ4HCall = {
1120
+ ...primary,
1121
+ body: mergedBody,
1122
+ q4hRemainingCallIds: remainingCallIds.length > 0 ? remainingCallIds : undefined,
1123
+ };
1124
+ log_1.log.info('Q4H multi-question normalized into a single prompt', {
1125
+ rootId: dlg.id.rootId,
1126
+ selfId: dlg.id.selfId,
1127
+ mergedCount: q4hCalls.length,
1128
+ primaryCallId: primary.callId,
1129
+ remainingCallIds,
1130
+ });
1131
+ }
1132
+ const executionCalls = mergedQ4HCall
1133
+ ? [...nonQ4HCalls, mergedQ4HCall]
1134
+ : nonQ4HCalls;
1135
+ const results = [];
1136
+ for (const call of executionCalls) {
1137
+ const result = await executeTellaskCall(dlg, agent, call.validation.firstMention, call.tellaskHead, call.body, call.callId, callbacks, {
1138
+ q4hRemainingCallIds: call.q4hRemainingCallIds,
1139
+ });
1140
+ results.push(result);
1141
+ }
1080
1142
  const suspend = results.some((result) => result.suspend);
1081
1143
  const toolOutputs = [...malformedToolOutputs, ...results.flatMap((result) => result.toolOutputs)];
1082
1144
  const subdialogsCreated = results.flatMap((result) => result.subdialogsCreated);
@@ -2451,6 +2451,14 @@ class DialogPersistence {
2451
2451
  throw new Error(`Q4H duplicate call id violation: dialog=${dialogId.valueOf()} status=${status} callId=${normalizedCallId} existingQuestionId=${byCallId.id} incomingQuestionId=${questionId} existingAskedAt=${byCallId.askedAt} incomingAskedAt=${question.askedAt}`);
2452
2452
  }
2453
2453
  }
2454
+ if (previousQuestions.length > 0) {
2455
+ const existingIds = previousQuestions.map((q) => q.id).join(',');
2456
+ const existingCallIds = previousQuestions
2457
+ .map((q) => (typeof q.callId === 'string' ? q.callId.trim() : ''))
2458
+ .filter((value) => value !== '')
2459
+ .join(',');
2460
+ throw new Error(`Q4H multi-pending violation: dialog=${dialogId.valueOf()} status=${status} existingCount=${previousQuestions.length} existingQuestionIds=${existingIds} existingCallIds=${existingCallIds} incomingQuestionId=${questionId} incomingCallId=${normalizedCallId ?? ''}`);
2461
+ }
2454
2462
  return { kind: 'append', question };
2455
2463
  }, status);
2456
2464
  }
@@ -390,9 +390,11 @@ async function maybeTriggerImmediateDiligencePrompt(rootDialog) {
390
390
  if (!suspension.canDrive) {
391
391
  return;
392
392
  }
393
- const queuedResponses = await persistence_1.DialogPersistence.loadSubdialogResponsesQueue(rootDialog.id);
394
- if (queuedResponses.length > 0) {
395
- return;
393
+ if ((0, driver_entry_1.getActiveDriverEngine)() === 'v1') {
394
+ const queuedResponses = await persistence_1.DialogPersistence.loadSubdialogResponsesQueue(rootDialog.id);
395
+ if (queuedResponses.length > 0) {
396
+ return;
397
+ }
396
398
  }
397
399
  const team = await team_1.Team.load();
398
400
  const prepared = await (0, runtime_utils_1.maybePrepareDiligenceAutoContinuePrompt)({
@@ -755,31 +757,29 @@ async function handleDisplayDialog(ws, packet) {
755
757
  catch (err) {
756
758
  log.warn(`Failed to send dlg_run_state_evt for ${dialogIdObj.valueOf()}:`, err);
757
759
  }
758
- // Emit Q4H state to ensure frontend has current questions count
759
- // Load Q4H from ALL running dialogs for global display (not just this dialog)
760
+ // Emit one Q4H snapshot to ensure frontend has current global questions state.
761
+ // Do NOT replay per-question `new_q4h_asked` events here: those are real-time
762
+ // incremental events and replaying them on display refresh can create duplicate
763
+ // delivery paths and blur event semantics.
760
764
  try {
761
765
  const allQuestions = await persistence_1.DialogPersistence.loadAllQ4HState();
762
- // Emit new_q4h_asked events for each question (best-effort sync on dialog display).
763
- // Include full dialog context (selfId/rootId/agentId/taskDocPath) so the frontend can
764
- // render origin info without relying on additional lookups.
765
- for (const q of allQuestions) {
766
- const newQ4HEvent = {
767
- type: 'new_q4h_asked',
768
- question: {
769
- id: q.id,
770
- selfId: q.selfId,
771
- rootId: q.rootId,
772
- agentId: q.agentId,
773
- taskDocPath: q.taskDocPath,
774
- tellaskHead: q.tellaskHead,
775
- bodyContent: q.bodyContent,
776
- askedAt: q.askedAt,
777
- callId: q.callId,
778
- callSiteRef: q.callSiteRef,
779
- },
780
- };
781
- ws.send(JSON.stringify(newQ4HEvent));
782
- }
766
+ const response = {
767
+ type: 'q4h_state_response',
768
+ questions: allQuestions.map((q) => ({
769
+ id: q.id,
770
+ selfId: q.selfId,
771
+ rootId: q.rootId,
772
+ agentId: q.agentId,
773
+ taskDocPath: q.taskDocPath,
774
+ tellaskHead: q.tellaskHead,
775
+ bodyContent: q.bodyContent,
776
+ askedAt: q.askedAt,
777
+ callId: q.callId,
778
+ remainingCallIds: q.remainingCallIds,
779
+ callSiteRef: q.callSiteRef,
780
+ })),
781
+ };
782
+ ws.send(JSON.stringify(response));
783
783
  }
784
784
  catch (err) {
785
785
  log.warn(`Failed to emit Q4H state for ${dialogIdObj}:`, err);
@@ -818,6 +818,7 @@ async function handleGetQ4HState(ws, _packet) {
818
818
  bodyContent: q.bodyContent,
819
819
  askedAt: q.askedAt,
820
820
  callId: q.callId,
821
+ remainingCallIds: q.remainingCallIds,
821
822
  callSiteRef: q.callSiteRef,
822
823
  }));
823
824
  // Send single response packet with all questions (not PubChan events)
@@ -1157,6 +1158,22 @@ async function handleUserAnswer2Q4H(ws, packet) {
1157
1158
  selfId: dialogId,
1158
1159
  };
1159
1160
  (0, evt_registry_1.postDialogEvent)(dialog, answeredEvent);
1161
+ const hasPendingSubdialogs = await dialog.hasPendingSubdialogs();
1162
+ if (hasPendingSubdialogs) {
1163
+ dialog.queueUpNextPrompt({
1164
+ prompt: content,
1165
+ msgId,
1166
+ grammar: 'tellask',
1167
+ userLanguageCode,
1168
+ });
1169
+ log.info('Deferred Q4H answer until pending subdialogs resolve', {
1170
+ rootId: dialog.id.rootId,
1171
+ selfId: dialog.id.selfId,
1172
+ questionId,
1173
+ msgId,
1174
+ });
1175
+ return;
1176
+ }
1160
1177
  // Resume the dialog with the user's answer.
1161
1178
  await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'tellask', userLanguageCode, origin: 'user' }, true);
1162
1179
  }
@@ -1,4 +1,4 @@
1
- import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-CQr8MdPI.js";
1
+ import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-CqMOe9zt.js";
2
2
  var symbolTag$1 = "[object Symbol]";
3
3
  function isSymbol(value) {
4
4
  return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$1;
@@ -658,4 +658,4 @@ export {
658
658
  hasIn as x,
659
659
  toString as y
660
660
  };
661
- //# sourceMappingURL=_baseUniq-C04fddeD.js.map
661
+ //# sourceMappingURL=_baseUniq-zV3pyJ-s.js.map