dominds 1.25.6 → 1.25.8

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 (165) hide show
  1. package/dist/dialog-display-state.js +166 -45
  2. package/dist/dialog-fork.js +45 -20
  3. package/dist/dialog-interruption.js +2 -1
  4. package/dist/dialog.d.ts +4 -0
  5. package/dist/dialog.js +14 -0
  6. package/dist/llm/gen/mock.d.ts +1 -0
  7. package/dist/llm/gen/mock.js +12 -0
  8. package/dist/llm/kernel-driver/drive.js +253 -4
  9. package/dist/llm/kernel-driver/flow.js +61 -22
  10. package/dist/llm/kernel-driver/runtime.d.ts +1 -1
  11. package/dist/llm/kernel-driver/runtime.js +12 -0
  12. package/dist/llm/kernel-driver/sideDialog.js +13 -0
  13. package/dist/llm/kernel-driver/tellask-special.js +4 -0
  14. package/dist/persistence.d.ts +1 -0
  15. package/dist/persistence.js +83 -26
  16. package/dist/server/dominds-self-update.js +312 -22
  17. package/dist/server/websocket-handler.js +49 -7
  18. package/dist/tools/os.d.ts +1 -0
  19. package/dist/tools/os.js +19 -1
  20. package/package.json +3 -3
  21. package/webapp/dist/assets/{_basePickBy-fZ31r-iF.js → _basePickBy-CATeRp8S.js} +3 -3
  22. package/webapp/dist/assets/_basePickBy-CATeRp8S.js.map +1 -0
  23. package/webapp/dist/assets/{_baseUniq-CI1keLoL.js → _baseUniq-CFRLPgeM.js} +2 -2
  24. package/webapp/dist/assets/_baseUniq-CFRLPgeM.js.map +1 -0
  25. package/webapp/dist/assets/{arc-1NeUqzoV.js → arc-CB9bI1EY.js} +2 -2
  26. package/webapp/dist/assets/arc-CB9bI1EY.js.map +1 -0
  27. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-C7SdzYIh.js → architectureDiagram-VXUJARFQ-CCpiy2xw.js} +8 -26
  28. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-CCpiy2xw.js.map +1 -0
  29. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Cmpu3kIy.js → blockDiagram-VD42YOAC-DgzrbcBd.js} +170 -187
  30. package/webapp/dist/assets/blockDiagram-VD42YOAC-DgzrbcBd.js.map +1 -0
  31. package/webapp/dist/assets/{c4Diagram-IC4MRINW-ChGTHIor.js → c4Diagram-YG6GDRKO-C0LCDSs6.js} +4 -4
  32. package/webapp/dist/assets/c4Diagram-YG6GDRKO-C0LCDSs6.js.map +1 -0
  33. package/webapp/dist/assets/{channel-ndS-XTQQ.js → channel-sKpY2JZ5.js} +2 -2
  34. package/webapp/dist/assets/channel-sKpY2JZ5.js.map +1 -0
  35. package/webapp/dist/assets/{chunk-4BX2VUAB-Cw5FtBd_.js → chunk-4BX2VUAB-D9_yL_TQ.js} +2 -2
  36. package/webapp/dist/assets/chunk-4BX2VUAB-D9_yL_TQ.js.map +1 -0
  37. package/webapp/dist/assets/{chunk-55IACEB6-D3G71JdA.js → chunk-55IACEB6-CTuUncSx.js} +2 -2
  38. package/webapp/dist/assets/chunk-55IACEB6-CTuUncSx.js.map +1 -0
  39. package/webapp/dist/assets/{chunk-WL4C6EOR-CIwdSg5q.js → chunk-B4BG7PRW-Ceelj1iX.js} +121 -171
  40. package/webapp/dist/assets/chunk-B4BG7PRW-Ceelj1iX.js.map +1 -0
  41. package/webapp/dist/assets/{chunk-NQ4KR5QH-CGEMYTch.js → chunk-DI55MBZ5-BoHV50iw.js} +7 -9
  42. package/webapp/dist/assets/chunk-DI55MBZ5-BoHV50iw.js.map +1 -0
  43. package/webapp/dist/assets/{chunk-FMBD7UC4-BcugPyy7.js → chunk-FMBD7UC4-CyCMHG2I.js} +2 -2
  44. package/webapp/dist/assets/chunk-FMBD7UC4-CyCMHG2I.js.map +1 -0
  45. package/webapp/dist/assets/{chunk-KX2RTZJC-BQ42xd4s.js → chunk-QN33PNHL-DPr_6BJj.js} +2 -2
  46. package/webapp/dist/assets/chunk-QN33PNHL-DPr_6BJj.js.map +1 -0
  47. package/webapp/dist/assets/{chunk-QZHKN3VN-CxNTVm5w.js → chunk-QZHKN3VN-B87nIEZP.js} +2 -2
  48. package/webapp/dist/assets/chunk-QZHKN3VN-B87nIEZP.js.map +1 -0
  49. package/webapp/dist/assets/{chunk-JSJVCQXG-DvuxYuNq.js → chunk-TZMSLE5B-CEOLgAwG.js} +6 -14
  50. package/webapp/dist/assets/chunk-TZMSLE5B-CEOLgAwG.js.map +1 -0
  51. package/webapp/dist/assets/{classDiagram-VBA2DB6C-Dl05PJAP.js → classDiagram-2ON5EDUG-OU3Rb0MK.js} +6 -7
  52. package/webapp/dist/assets/classDiagram-2ON5EDUG-OU3Rb0MK.js.map +1 -0
  53. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-Dl05PJAP.js → classDiagram-v2-WZHVMYZB-OU3Rb0MK.js} +6 -7
  54. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-OU3Rb0MK.js.map +1 -0
  55. package/webapp/dist/assets/{clone-KCj1-QMr.js → clone-DPJ1e01h.js} +2 -2
  56. package/webapp/dist/assets/clone-DPJ1e01h.js.map +1 -0
  57. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BttciCz5.js → cose-bilkent-S5V4N54A-Eb4tTnqa.js} +2 -2
  58. package/webapp/dist/assets/cose-bilkent-S5V4N54A-Eb4tTnqa.js.map +1 -0
  59. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  60. package/webapp/dist/assets/{dagre-KLK3FWXG-Dm5yE9k2.js → dagre-6UL2VRFP--wouwNZD.js} +7 -7
  61. package/webapp/dist/assets/dagre-6UL2VRFP--wouwNZD.js.map +1 -0
  62. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  63. package/webapp/dist/assets/{diagram-E7M64L7V-C80ZsiBG.js → diagram-PSM6KHXK-Da_Qnble.js} +10 -10
  64. package/webapp/dist/assets/diagram-PSM6KHXK-Da_Qnble.js.map +1 -0
  65. package/webapp/dist/assets/{diagram-IFDJBPK2-CqKidH4n.js → diagram-QEK2KX5R-BhOtufwo.js} +8 -9
  66. package/webapp/dist/assets/diagram-QEK2KX5R-BhOtufwo.js.map +1 -0
  67. package/webapp/dist/assets/{diagram-P4PSJMXO-EHVjfzUV.js → diagram-S2PKOQOG-k-LiSr-7.js} +8 -8
  68. package/webapp/dist/assets/diagram-S2PKOQOG-k-LiSr-7.js.map +1 -0
  69. package/webapp/dist/assets/{erDiagram-INFDFZHY-7MrtsOIt.js → erDiagram-Q2GNP2WA-DSTHWIXm.js} +75 -96
  70. package/webapp/dist/assets/erDiagram-Q2GNP2WA-DSTHWIXm.js.map +1 -0
  71. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D6hXqCy7.js → flowDiagram-NV44I4VS-BjS-xbaY.js} +81 -98
  72. package/webapp/dist/assets/flowDiagram-NV44I4VS-BjS-xbaY.js.map +1 -0
  73. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DLO0XCDk.js → ganttDiagram-JELNMOA3-DAgcUpJe.js} +3 -28
  74. package/webapp/dist/assets/ganttDiagram-JELNMOA3-DAgcUpJe.js.map +1 -0
  75. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BmVD_nQP.js → gitGraphDiagram-V2S2FVAM-i1vEkfoe.js} +46 -38
  76. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-i1vEkfoe.js.map +1 -0
  77. package/webapp/dist/assets/graph-CxNIZAUJ.js +425 -0
  78. package/webapp/dist/assets/graph-CxNIZAUJ.js.map +1 -0
  79. package/webapp/dist/assets/{index-BXjq-k48.js → index-piqwT9B7.js} +1156 -1048
  80. package/webapp/dist/assets/{index-BXjq-k48.js.map → index-piqwT9B7.js.map} +1 -1
  81. package/webapp/dist/assets/{index-BQoNJEGT.css → index-yycTJNYb.css} +1 -1
  82. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-D2fqM9Fn.js → infoDiagram-HS3SLOUP-BH-Wj-38.js} +7 -7
  83. package/webapp/dist/assets/infoDiagram-HS3SLOUP-BH-Wj-38.js.map +1 -0
  84. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  85. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DmbA52J-.js → journeyDiagram-XKPGCS4Q-B5c5iW9X.js} +5 -5
  86. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-B5c5iW9X.js.map +1 -0
  87. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DRUw-P-d.js → kanban-definition-3W4ZIXB7-fgYwmV5l.js} +3 -5
  88. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-fgYwmV5l.js.map +1 -0
  89. package/webapp/dist/assets/{layout-BUoHHXzn.js → layout-Dc9UeLis.js} +5 -5
  90. package/webapp/dist/assets/layout-Dc9UeLis.js.map +1 -0
  91. package/webapp/dist/assets/{linear-xVSAq8rI.js → linear-DFqZ7yVr.js} +2 -2
  92. package/webapp/dist/assets/linear-DFqZ7yVr.js.map +1 -0
  93. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BcajbGmW.js → mindmap-definition-VGOIOE7T-CWXQmWf-.js} +5 -7
  94. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-CWXQmWf-.js.map +1 -0
  95. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  96. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Bu8kmCW6.js → pieDiagram-ADFJNKIX-Dmm4opIx.js} +8 -8
  97. package/webapp/dist/assets/pieDiagram-ADFJNKIX-Dmm4opIx.js.map +1 -0
  98. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DIBSNUGa.js → quadrantDiagram-AYHSOK5B-L48S6y-Y.js} +3 -3
  99. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-L48S6y-Y.js.map +1 -0
  100. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CkrDkbBt.js → requirementDiagram-UZGBJVZJ-uQa6qCTU.js} +6 -16
  101. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-uQa6qCTU.js.map +1 -0
  102. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BZ-1R8pc.js → sankeyDiagram-TZEHDZUN-4wM4sZjA.js} +2 -2
  103. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-4wM4sZjA.js.map +1 -0
  104. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYoNARdO.js → sequenceDiagram-WL72ISMW-EZlETI0Q.js} +201 -601
  105. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-EZlETI0Q.js.map +1 -0
  106. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9v19nvh.js → stateDiagram-FKZM4ZOC-CeCT7b7S.js} +9 -9
  107. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-CeCT7b7S.js.map +1 -0
  108. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BYw5ZwtH.js → stateDiagram-v2-4FDKWEC3-3oDsYGFz.js} +5 -5
  109. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-3oDsYGFz.js.map +1 -0
  110. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BT10dRIJ.js → timeline-definition-IT6M3QCI-9k0ahO0m.js} +3 -3
  111. package/webapp/dist/assets/timeline-definition-IT6M3QCI-9k0ahO0m.js.map +1 -0
  112. package/webapp/dist/assets/{treemap-KZPCXAKY-yPoPC5hc.js → treemap-GDKQZRPO--DQUhriC.js} +24 -37
  113. package/webapp/dist/assets/treemap-GDKQZRPO--DQUhriC.js.map +1 -0
  114. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BWLUzo9S.js → xychartDiagram-PRI3JC2R-VhFrAQO2.js} +4 -4
  115. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-VhFrAQO2.js.map +1 -0
  116. package/webapp/dist/index.html +2 -2
  117. package/webapp/dist/assets/_basePickBy-fZ31r-iF.js.map +0 -1
  118. package/webapp/dist/assets/_baseUniq-CI1keLoL.js.map +0 -1
  119. package/webapp/dist/assets/arc-1NeUqzoV.js.map +0 -1
  120. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-C7SdzYIh.js.map +0 -1
  121. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-Cmpu3kIy.js.map +0 -1
  122. package/webapp/dist/assets/c4Diagram-IC4MRINW-ChGTHIor.js.map +0 -1
  123. package/webapp/dist/assets/channel-ndS-XTQQ.js.map +0 -1
  124. package/webapp/dist/assets/chunk-4BX2VUAB-Cw5FtBd_.js.map +0 -1
  125. package/webapp/dist/assets/chunk-55IACEB6-D3G71JdA.js.map +0 -1
  126. package/webapp/dist/assets/chunk-FMBD7UC4-BcugPyy7.js.map +0 -1
  127. package/webapp/dist/assets/chunk-JSJVCQXG-DvuxYuNq.js.map +0 -1
  128. package/webapp/dist/assets/chunk-KX2RTZJC-BQ42xd4s.js.map +0 -1
  129. package/webapp/dist/assets/chunk-NQ4KR5QH-CGEMYTch.js.map +0 -1
  130. package/webapp/dist/assets/chunk-QZHKN3VN-CxNTVm5w.js.map +0 -1
  131. package/webapp/dist/assets/chunk-WL4C6EOR-CIwdSg5q.js.map +0 -1
  132. package/webapp/dist/assets/classDiagram-VBA2DB6C-Dl05PJAP.js.map +0 -1
  133. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-Dl05PJAP.js.map +0 -1
  134. package/webapp/dist/assets/clone-KCj1-QMr.js.map +0 -1
  135. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BttciCz5.js.map +0 -1
  136. package/webapp/dist/assets/dagre-KLK3FWXG-Dm5yE9k2.js.map +0 -1
  137. package/webapp/dist/assets/diagram-E7M64L7V-C80ZsiBG.js.map +0 -1
  138. package/webapp/dist/assets/diagram-IFDJBPK2-CqKidH4n.js.map +0 -1
  139. package/webapp/dist/assets/diagram-P4PSJMXO-EHVjfzUV.js.map +0 -1
  140. package/webapp/dist/assets/erDiagram-INFDFZHY-7MrtsOIt.js.map +0 -1
  141. package/webapp/dist/assets/flowDiagram-PKNHOUZH-D6hXqCy7.js.map +0 -1
  142. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-DLO0XCDk.js.map +0 -1
  143. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-BmVD_nQP.js.map +0 -1
  144. package/webapp/dist/assets/graph-DQTj8O0Q.js +0 -782
  145. package/webapp/dist/assets/graph-DQTj8O0Q.js.map +0 -1
  146. package/webapp/dist/assets/infoDiagram-LFFYTUFH-D2fqM9Fn.js.map +0 -1
  147. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-kp7lB6-f.js +0 -966
  148. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-kp7lB6-f.js.map +0 -1
  149. package/webapp/dist/assets/journeyDiagram-4ABVD52K-DmbA52J-.js.map +0 -1
  150. package/webapp/dist/assets/kanban-definition-K7BYSVSG-DRUw-P-d.js.map +0 -1
  151. package/webapp/dist/assets/layout-BUoHHXzn.js.map +0 -1
  152. package/webapp/dist/assets/linear-xVSAq8rI.js.map +0 -1
  153. package/webapp/dist/assets/mindmap-definition-YRQLILUH-BcajbGmW.js.map +0 -1
  154. package/webapp/dist/assets/pieDiagram-SKSYHLDU-Bu8kmCW6.js.map +0 -1
  155. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DIBSNUGa.js.map +0 -1
  156. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-CkrDkbBt.js.map +0 -1
  157. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-BZ-1R8pc.js.map +0 -1
  158. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYoNARdO.js.map +0 -1
  159. package/webapp/dist/assets/stateDiagram-RAJIS63D-D9v19nvh.js.map +0 -1
  160. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-BYw5ZwtH.js.map +0 -1
  161. package/webapp/dist/assets/timeline-definition-YZTLITO2-BT10dRIJ.js.map +0 -1
  162. package/webapp/dist/assets/treemap-KZPCXAKY-yPoPC5hc.js.map +0 -1
  163. package/webapp/dist/assets/vennDiagram-LZ73GAT5-tryg3OaY.js +0 -2487
  164. package/webapp/dist/assets/vennDiagram-LZ73GAT5-tryg3OaY.js.map +0 -1
  165. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BWLUzo9S.js.map +0 -1
@@ -97,12 +97,29 @@ function isNonIdleDisplayProjection(state) {
97
97
  function hasPendingNextStepTriggers(latest) {
98
98
  return (latest?.nextStep.triggers.length ?? 0) > 0;
99
99
  }
100
- function q4hSuspensionDisplayState(hasQ4H) {
100
+ function waitingHumanInputDisplayState(hasQ4H) {
101
101
  if (hasQ4H) {
102
102
  return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
103
103
  }
104
104
  return undefined;
105
105
  }
106
+ async function waitingSideDialogDisplayState(dialogId, status, activeReplyObligation) {
107
+ if (status !== 'running' || activeReplyObligation === undefined) {
108
+ return undefined;
109
+ }
110
+ const activeCallees = await persistence_1.DialogPersistence.loadActiveCallees(dialogId, status);
111
+ const hasPendingSideDialog = activeCallees.batches.some((batch) => batch.callees.some((callee) => callee.status === 'pending'));
112
+ if (!hasPendingSideDialog) {
113
+ return undefined;
114
+ }
115
+ return { kind: 'waiting_side_dialog' };
116
+ }
117
+ function pendingReplyObligationDisplayState(activeReplyObligation) {
118
+ if (activeReplyObligation === undefined) {
119
+ return undefined;
120
+ }
121
+ return { kind: 'proceeding' };
122
+ }
106
123
  async function resolveSideDialogFinalResponseClosure(args) {
107
124
  if (!args.latest) {
108
125
  return { kind: 'no_final_response' };
@@ -111,26 +128,50 @@ async function resolveSideDialogFinalResponseClosure(args) {
111
128
  if (!finalResponseAnchor) {
112
129
  return { kind: 'no_final_response' };
113
130
  }
131
+ const finalResponseCallId = finalResponseAnchor.callId.trim();
114
132
  const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(args.dialogId, 'running');
115
133
  if (activeReplyObligation === undefined) {
116
134
  return {
117
135
  kind: 'closed_without_active_reply_obligation',
118
- callId: finalResponseAnchor.callId,
136
+ callId: finalResponseCallId,
119
137
  };
120
138
  }
121
- if (activeReplyObligation.targetCallId === finalResponseAnchor.callId) {
139
+ if (activeReplyObligation.targetCallId.trim() === finalResponseCallId) {
122
140
  return {
123
141
  kind: 'closed_with_matching_reply_obligation',
124
- callId: finalResponseAnchor.callId,
142
+ callId: finalResponseCallId,
125
143
  activeReplyObligation,
126
144
  };
127
145
  }
128
146
  return {
129
147
  kind: 'blocked_by_different_reply_obligation',
130
- callId: finalResponseAnchor.callId,
148
+ callId: finalResponseCallId,
131
149
  activeReplyObligation,
132
150
  };
133
151
  }
152
+ async function clearMatchingFinalResponseReplyObligation(dialogId, closure) {
153
+ if (closure.kind !== 'closed_with_matching_reply_obligation') {
154
+ return false;
155
+ }
156
+ await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(dialogId, undefined, 'running');
157
+ return true;
158
+ }
159
+ async function settleFinalResponseClosureForIdleProjection(dialogId, closure) {
160
+ switch (closure.kind) {
161
+ case 'no_final_response':
162
+ case 'blocked_by_different_reply_obligation':
163
+ return false;
164
+ case 'closed_without_active_reply_obligation':
165
+ return true;
166
+ case 'closed_with_matching_reply_obligation':
167
+ await clearMatchingFinalResponseReplyObligation(dialogId, closure);
168
+ return true;
169
+ default: {
170
+ const _exhaustive = closure;
171
+ throw new Error(`Unhandled final response closure kind: ${String(_exhaustive)}`);
172
+ }
173
+ }
174
+ }
134
175
  function classifyRunControlBucket(state) {
135
176
  if (!state)
136
177
  return 'none';
@@ -181,7 +222,7 @@ async function getRunControlCountsSnapshot() {
181
222
  else if (latest?.executionMarker?.kind === 'interrupted' &&
182
223
  isStoppedReasonResumable(latest.executionMarker.reason)) {
183
224
  // Keep run-control counts aligned with actual Continue affordance:
184
- // - ordinary interrupted dialogs count as resumable only when no Q4H suspension remains
225
+ // - ordinary interrupted dialogs count as resumable only when no Q4H human-input wait remains
185
226
  // - legacy interjection-paused dialogs still count as resumable even if Q4H remains,
186
227
  // because Continue only re-evaluates the original task from fresh facts
187
228
  if ((0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
@@ -372,6 +413,7 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
372
413
  });
373
414
  return;
374
415
  }
416
+ let nextDisplayState = displayState;
375
417
  let previousDisplayState;
376
418
  let previousExecutionMarker;
377
419
  // "dead" is irreversible. Once a dialog is marked dead, do not allow overwriting it with
@@ -397,24 +439,82 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
397
439
  }
398
440
  return;
399
441
  }
442
+ if (status === 'running' && displayState.kind === 'idle_waiting_user') {
443
+ const waitingHumanInput = waitingHumanInputDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
444
+ if (waitingHumanInput) {
445
+ nextDisplayState = waitingHumanInput;
446
+ log.warn('Redirecting idle displayState to waiting-human-input state', undefined, {
447
+ dialogId: dialogId.valueOf(),
448
+ rootId: dialogId.rootId,
449
+ selfId: dialogId.selfId,
450
+ status,
451
+ nextDisplayState,
452
+ previousDisplayState: latest?.displayState ?? null,
453
+ previousExecutionMarker: latest?.executionMarker ?? null,
454
+ });
455
+ }
456
+ else if (!(await settleFinalResponseClosureForIdleProjection(dialogId, await resolveSideDialogFinalResponseClosure({
457
+ dialogId,
458
+ latest,
459
+ })))) {
460
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, status);
461
+ const waitingSideDialog = await waitingSideDialogDisplayState(dialogId, status, activeReplyObligation);
462
+ if (waitingSideDialog) {
463
+ nextDisplayState = waitingSideDialog;
464
+ log.warn('Redirecting idle displayState to waiting-side-dialog state', undefined, {
465
+ dialogId: dialogId.valueOf(),
466
+ rootId: dialogId.rootId,
467
+ selfId: dialogId.selfId,
468
+ status,
469
+ nextDisplayState,
470
+ targetCallId: activeReplyObligation?.targetCallId ?? null,
471
+ targetDialogId: activeReplyObligation?.targetDialogId.valueOf() ?? null,
472
+ previousDisplayState: latest?.displayState ?? null,
473
+ previousExecutionMarker: latest?.executionMarker ?? null,
474
+ });
475
+ }
476
+ else {
477
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
478
+ if (pendingReplyObligation) {
479
+ nextDisplayState = pendingReplyObligation;
480
+ log.warn('Redirecting idle displayState to active reply obligation state', undefined, {
481
+ dialogId: dialogId.valueOf(),
482
+ rootId: dialogId.rootId,
483
+ selfId: dialogId.selfId,
484
+ status,
485
+ nextDisplayState,
486
+ targetCallId: activeReplyObligation?.targetCallId ?? null,
487
+ targetDialogId: activeReplyObligation?.targetDialogId.valueOf() ?? null,
488
+ previousDisplayState: latest?.displayState ?? null,
489
+ previousExecutionMarker: latest?.executionMarker ?? null,
490
+ sideDialogFinalResponseCallId: latest?.sideDialogFinalResponse?.callId ?? null,
491
+ });
492
+ }
493
+ }
494
+ }
495
+ }
400
496
  }
401
497
  catch (err) {
402
498
  log.warn('Failed to check existing displayState before setDialogDisplayState', err, {
403
499
  dialogId: dialogId.valueOf(),
404
500
  status,
501
+ intendedDisplayState: displayState,
405
502
  });
503
+ if (status === 'running' && displayState.kind === 'idle_waiting_user') {
504
+ return;
505
+ }
406
506
  }
407
- const nextExecutionMarker = displayState.kind === 'stopped'
408
- ? { kind: 'interrupted', reason: displayState.reason }
409
- : displayState.kind === 'dead'
410
- ? { kind: 'dead', reason: displayState.reason }
507
+ const nextExecutionMarker = nextDisplayState.kind === 'stopped'
508
+ ? { kind: 'interrupted', reason: nextDisplayState.reason }
509
+ : nextDisplayState.kind === 'dead'
510
+ ? { kind: 'dead', reason: nextDisplayState.reason }
411
511
  : previousExecutionMarker?.kind === 'interrupted'
412
512
  ? undefined
413
513
  : previousExecutionMarker;
414
514
  try {
415
515
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
416
516
  kind: 'patch',
417
- patch: { displayState, executionMarker: nextExecutionMarker },
517
+ patch: { displayState: nextDisplayState, executionMarker: nextExecutionMarker },
418
518
  }), status);
419
519
  }
420
520
  catch (err) {
@@ -424,16 +524,17 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
424
524
  selfId: dialogId.selfId,
425
525
  status,
426
526
  intendedDisplayState: displayState,
527
+ persistedDisplayState: nextDisplayState,
427
528
  });
428
529
  }
429
530
  const typed = evt_registry_1.dialogEventRegistry.createTypedEvent(dialogId, {
430
531
  type: 'dlg_display_state_evt',
431
- displayState,
532
+ displayState: nextDisplayState,
432
533
  });
433
534
  if (broadcastToClients) {
434
535
  broadcastToClients(typed);
435
536
  }
436
- if (shouldBroadcastRunControlCounts(previousDisplayState, displayState)) {
537
+ if (shouldBroadcastRunControlCounts(previousDisplayState, nextDisplayState)) {
437
538
  try {
438
539
  await broadcastRunControlCountsSnapshot();
439
540
  }
@@ -479,18 +580,26 @@ async function computeIdleDisplayState(dlg) {
479
580
  continueEnabled: true,
480
581
  };
481
582
  }
482
- const q4hSuspension = q4hSuspensionDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
483
- if (q4hSuspension) {
484
- return q4hSuspension;
583
+ const waitingHumanInput = waitingHumanInputDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
584
+ if (waitingHumanInput) {
585
+ return waitingHumanInput;
485
586
  }
486
587
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({
487
588
  dialogId: dlg.id,
488
589
  latest,
489
590
  });
490
- if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
491
- finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
591
+ if (await settleFinalResponseClosureForIdleProjection(dlg.id, finalResponseClosure)) {
492
592
  return { kind: 'idle_waiting_user' };
493
593
  }
594
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dlg.id, dlg.status);
595
+ const waitingSideDialog = await waitingSideDialogDisplayState(dlg.id, dlg.status, activeReplyObligation);
596
+ if (waitingSideDialog) {
597
+ return waitingSideDialog;
598
+ }
599
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
600
+ if (pendingReplyObligation) {
601
+ return pendingReplyObligation;
602
+ }
494
603
  return { kind: 'idle_waiting_user' };
495
604
  }
496
605
  async function computeIdleDisplayStateFromPersistence(dialogId) {
@@ -520,15 +629,23 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
520
629
  continueEnabled: true,
521
630
  };
522
631
  }
523
- const q4hSuspension = q4hSuspensionDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
524
- if (q4hSuspension) {
525
- return q4hSuspension;
632
+ const waitingHumanInput = waitingHumanInputDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
633
+ if (waitingHumanInput) {
634
+ return waitingHumanInput;
526
635
  }
527
636
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
528
- if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
529
- finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
637
+ if (await settleFinalResponseClosureForIdleProjection(dialogId, finalResponseClosure)) {
530
638
  return { kind: 'idle_waiting_user' };
531
639
  }
640
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
641
+ const waitingSideDialog = await waitingSideDialogDisplayState(dialogId, 'running', activeReplyObligation);
642
+ if (waitingSideDialog) {
643
+ return waitingSideDialog;
644
+ }
645
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
646
+ if (pendingReplyObligation) {
647
+ return pendingReplyObligation;
648
+ }
532
649
  return { kind: 'idle_waiting_user' };
533
650
  }
534
651
  async function healStaleSideDialogRunControlAfterFinalResponse(args) {
@@ -549,19 +666,12 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
549
666
  dialogId: args.dialogId,
550
667
  latest: args.latest,
551
668
  });
552
- switch (finalResponseClosure.kind) {
553
- case 'no_final_response':
554
- case 'blocked_by_different_reply_obligation':
555
- return args.latest;
556
- case 'closed_without_active_reply_obligation':
557
- break;
558
- case 'closed_with_matching_reply_obligation':
559
- await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(args.dialogId, undefined, 'running');
560
- break;
561
- default: {
562
- const _exhaustive = finalResponseClosure;
563
- throw new Error(`Unhandled final response closure kind: ${String(_exhaustive)}`);
564
- }
669
+ if (finalResponseClosure.kind !== 'closed_without_active_reply_obligation' &&
670
+ finalResponseClosure.kind !== 'closed_with_matching_reply_obligation') {
671
+ return args.latest;
672
+ }
673
+ if (!(await settleFinalResponseClosureForIdleProjection(args.dialogId, finalResponseClosure))) {
674
+ return args.latest;
565
675
  }
566
676
  const clearedReplyObligation = finalResponseClosure.kind === 'closed_with_matching_reply_obligation';
567
677
  log.warn('Healing stale sideDialog run-control flags after final response anchor', undefined, {
@@ -615,15 +725,15 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
615
725
  (0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
616
726
  // WARNING:
617
727
  // This is the one place where the projection intentionally preserves legacy
618
- // paused-interjection stopped state ahead of the current suspension facts. That is not a bug:
728
+ // paused-interjection stopped state ahead of the current wait facts. That is not a bug:
619
729
  // the UI may still need to show that the original task was paused even if the underlying
620
730
  // dialog is now waiting on Q4H.
621
731
  //
622
732
  // The true source-of-truth decision about what Continue should do next lives in `flow.ts`'s
623
733
  // resume path, which performs a fresh fact scan at resume time and then either restores the
624
- // Q4H suspension projection or keeps driving immediately.
734
+ // Q4H waiting-human-input state or keeps driving immediately.
625
735
  //
626
- // Do not "heal" this branch away by prioritizing suspension facts here; that would collapse the
736
+ // Do not "heal" this branch away by prioritizing wait facts here; that would collapse the
627
737
  // temporary interjection UX and make repeated interjection turns revert too early.
628
738
  return {
629
739
  kind: 'stopped',
@@ -638,15 +748,23 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
638
748
  continueEnabled: true,
639
749
  };
640
750
  }
641
- const q4hSuspension = q4hSuspensionDisplayState(latest.userWait?.kind === 'awaiting_user_answer');
642
- if (q4hSuspension) {
643
- return q4hSuspension;
751
+ const waitingHumanInput = waitingHumanInputDisplayState(latest.userWait?.kind === 'awaiting_user_answer');
752
+ if (waitingHumanInput) {
753
+ return waitingHumanInput;
644
754
  }
645
755
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
646
- if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
647
- finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
756
+ if (await settleFinalResponseClosureForIdleProjection(dialogId, finalResponseClosure)) {
648
757
  return { kind: 'idle_waiting_user' };
649
758
  }
759
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
760
+ const waitingSideDialog = await waitingSideDialogDisplayState(dialogId, 'running', activeReplyObligation);
761
+ if (waitingSideDialog) {
762
+ return waitingSideDialog;
763
+ }
764
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
765
+ if (pendingReplyObligation) {
766
+ return pendingReplyObligation;
767
+ }
650
768
  if (latest.executionMarker?.kind === 'interrupted' &&
651
769
  latest.executionMarker.reason.kind !== 'pending_reply_obligation') {
652
770
  return {
@@ -790,7 +908,10 @@ async function reconcileDisplayStatesAfterRestart() {
790
908
  if (!nextIdle) {
791
909
  continue;
792
910
  }
793
- const next = nextIdle.kind === 'blocked' || nextIdle.kind === 'stopped' || nextIdle.kind === 'dead'
911
+ const next = nextIdle.kind === 'blocked' ||
912
+ nextIdle.kind === 'waiting_side_dialog' ||
913
+ nextIdle.kind === 'stopped' ||
914
+ nextIdle.kind === 'dead'
794
915
  ? nextIdle
795
916
  : {
796
917
  kind: 'stopped',
@@ -272,6 +272,10 @@ function countFunctionCalls(events) {
272
272
  return count;
273
273
  }
274
274
  function computeRootForkDisplayState(args) {
275
+ const topFrame = args.askerStack?.askerStack[args.askerStack.askerStack.length - 1];
276
+ if (topFrame?.tellaskReplyObligation !== undefined) {
277
+ return { kind: 'proceeding' };
278
+ }
275
279
  if (args.action.kind === 'draft_user_text') {
276
280
  return { kind: 'idle_waiting_user' };
277
281
  }
@@ -281,6 +285,13 @@ function computeRootForkDisplayState(args) {
281
285
  }
282
286
  return { kind: 'stopped', reason: { kind: 'fork_continue_ready' }, continueEnabled: true };
283
287
  }
288
+ function computeSideDialogForkDisplayState(askerStack) {
289
+ const topFrame = askerStack?.askerStack[askerStack.askerStack.length - 1];
290
+ if (topFrame?.tellaskReplyObligation !== undefined) {
291
+ return { kind: 'proceeding' };
292
+ }
293
+ return { kind: 'idle_waiting_user' };
294
+ }
284
295
  async function copyArtifactsIfPresent(sourceId, targetId, sourceStatus) {
285
296
  const sourceDir = node_path_1.default.join(persistence_1.DialogPersistence.getDialogEventsPath(sourceId, sourceStatus), 'artifacts');
286
297
  const targetDir = node_path_1.default.join(persistence_1.DialogPersistence.getDialogEventsPath(targetId, 'running'), 'artifacts');
@@ -535,32 +546,14 @@ async function persistForkPlan(args) {
535
546
  if (sourceAskerStack.askerStack.length > 0) {
536
547
  await persistence_1.DialogPersistence.saveDialogAskerStack(plan.targetId, rewriteSideDialogAskerStackStateForFork(sourceAskerStack, plan.sourceId.rootId, plan.targetId.rootId), 'running');
537
548
  }
538
- for (const course of plan.retainedCourses) {
539
- for (const event of course.events) {
540
- await persistence_1.DialogPersistence.appendEvent(plan.targetId, course.course, rewriteRecordForFork(event, plan.targetId.rootId), 'running');
541
- }
542
- }
543
- await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
544
- await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
545
- await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
546
- for (const record of plan.activeCalleeDispatches) {
547
- await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
548
- }
549
- await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
550
- key: entry.key,
551
- sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
552
- agentId: entry.agentId,
553
- sessionSlug: entry.sessionSlug,
554
- })), 'running');
555
- await persistence_1.DialogPersistence.saveSideDialogResponses(plan.targetId, [...plan.sideDialogResponses], undefined, 'running');
556
- await copyArtifactsIfPresent(plan.sourceId, plan.targetId, args.sourceStatus);
557
549
  const currentCourseEvents = plan.retainedCourses.find((item) => item.course === plan.currentCourse)?.events ?? [];
558
550
  const displayState = plan.targetId.selfId === plan.targetId.rootId
559
551
  ? computeRootForkDisplayState({
560
552
  action: args.action,
561
553
  questions: plan.questions,
554
+ askerStack: sourceAskerStack,
562
555
  })
563
- : { kind: 'idle_waiting_user' };
556
+ : computeSideDialogForkDisplayState(sourceAskerStack);
564
557
  await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, () => ({
565
558
  kind: 'replace',
566
559
  next: {
@@ -581,6 +574,38 @@ async function persistForkPlan(args) {
581
574
  : undefined,
582
575
  },
583
576
  }));
577
+ for (const course of plan.retainedCourses) {
578
+ for (const event of course.events) {
579
+ await persistence_1.DialogPersistence.appendEvent(plan.targetId, course.course, rewriteRecordForFork(event, plan.targetId.rootId), 'running');
580
+ }
581
+ }
582
+ await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
583
+ await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
584
+ await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
585
+ for (const record of plan.activeCalleeDispatches) {
586
+ await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
587
+ }
588
+ await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
589
+ key: entry.key,
590
+ sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
591
+ agentId: entry.agentId,
592
+ sessionSlug: entry.sessionSlug,
593
+ })), 'running');
594
+ await persistence_1.DialogPersistence.saveSideDialogResponses(plan.targetId, [...plan.sideDialogResponses], undefined, 'running');
595
+ await copyArtifactsIfPresent(plan.sourceId, plan.targetId, args.sourceStatus);
596
+ await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, (previous) => ({
597
+ kind: 'patch',
598
+ patch: {
599
+ currentCourse: plan.currentCourse,
600
+ messageCount: countMessages(currentCourseEvents),
601
+ functionCallCount: countFunctionCalls(currentCourseEvents),
602
+ sideDialogCount: plan.childCount,
603
+ displayState,
604
+ executionMarker: displayState.kind === 'stopped'
605
+ ? { kind: 'interrupted', reason: displayState.reason }
606
+ : previous.executionMarker,
607
+ },
608
+ }));
584
609
  }
585
610
  async function forkMainDialogTreeAtGeneration(args) {
586
611
  const sourceRootId = args.sourceRootId.trim();
@@ -25,11 +25,12 @@ function isInterruptionReasonManualResumeEligible(reason) {
25
25
  case 'emergency_stop':
26
26
  case 'server_restart':
27
27
  case 'pending_runtime_prompt':
28
- case 'pending_reply_obligation':
29
28
  case 'fork_continue_ready':
30
29
  case 'system_stop':
31
30
  case 'llm_retry_stopped':
32
31
  return true;
32
+ case 'pending_reply_obligation':
33
+ return false;
33
34
  default: {
34
35
  const _exhaustive = reason;
35
36
  return _exhaustive;
package/dist/dialog.d.ts CHANGED
@@ -375,6 +375,8 @@ export declare abstract class Dialog {
375
375
  hasQueuedPrompt(): boolean;
376
376
  peekQueuedPrompt(): DialogQueuedPromptState | undefined;
377
377
  takeQueuedPrompt(): DialogQueuedPromptState | undefined;
378
+ removeQueuedPromptByMsgId(msgId: string): boolean;
379
+ removeQueuedPromptsMatching(predicate: (prompt: DialogQueuedPromptState) => boolean): number;
378
380
  setActiveRunControlSpec(spec?: DialogRunControlSpec): void;
379
381
  getActiveRunControlSpec(): DialogRunControlSpec | undefined;
380
382
  setNewCourseHook(hook?: NewCourseHook): void;
@@ -459,6 +461,7 @@ export declare abstract class Dialog {
459
461
  persistFunctionCall(id: string, name: string, rawArgumentsText: string, genseq: number, rawId?: string): Promise<void>;
460
462
  persistTellaskCall(id: string, name: TellaskCallRecordName, rawArgumentsText: string, genseq: number, options?: {
461
463
  deliveryMode?: 'tellask_call_start' | 'func_call_requested';
464
+ replyDirective?: TellaskReplyDirective;
462
465
  }): Promise<void>;
463
466
  /**
464
467
  * Post sideDialog completion response to this dialog.
@@ -693,6 +696,7 @@ export declare abstract class DialogStore {
693
696
  persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number, _rawId?: string): Promise<void>;
694
697
  persistTellaskCall(_dialog: Dialog, _id: string, _name: TellaskCallRecordName, _rawArgumentsText: string, _genseq: number, _options?: {
695
698
  deliveryMode?: 'tellask_call_start' | 'func_call_requested';
699
+ replyDirective?: TellaskReplyDirective;
696
700
  }): Promise<void>;
697
701
  /**
698
702
  * Start a new course in storage
package/dist/dialog.js CHANGED
@@ -1186,6 +1186,20 @@ class Dialog {
1186
1186
  takeQueuedPrompt() {
1187
1187
  return this._queuedPrompts.shift();
1188
1188
  }
1189
+ removeQueuedPromptByMsgId(msgId) {
1190
+ const normalized = msgId.trim();
1191
+ if (normalized === '') {
1192
+ return false;
1193
+ }
1194
+ const before = this._queuedPrompts.length;
1195
+ this._queuedPrompts = this._queuedPrompts.filter((prompt) => prompt.msgId !== normalized);
1196
+ return this._queuedPrompts.length !== before;
1197
+ }
1198
+ removeQueuedPromptsMatching(predicate) {
1199
+ const before = this._queuedPrompts.length;
1200
+ this._queuedPrompts = this._queuedPrompts.filter((prompt) => !predicate(prompt));
1201
+ return before - this._queuedPrompts.length;
1202
+ }
1189
1203
  setActiveRunControlSpec(spec) {
1190
1204
  this._activeRunControlSpec = spec;
1191
1205
  }
@@ -65,6 +65,7 @@ export declare class MockGen implements LlmGenerator {
65
65
  private responseMatchesContext;
66
66
  private normalizeFuncCallArgs;
67
67
  private extractLastAssistantSaying;
68
+ private extractCurrentPromptMsgId;
68
69
  private buildReplyToolReminderAutoResponse;
69
70
  /**
70
71
  * Find matching response using EXACT last message only.
@@ -276,6 +276,16 @@ class MockGen {
276
276
  }
277
277
  return null;
278
278
  }
279
+ extractCurrentPromptMsgId(context) {
280
+ for (let index = context.length - 1; index >= 0; index -= 1) {
281
+ const msg = context[index];
282
+ if (msg?.type === 'prompting_msg') {
283
+ const trimmed = msg.msgId.trim();
284
+ return trimmed === '' ? undefined : trimmed;
285
+ }
286
+ }
287
+ return undefined;
288
+ }
279
289
  buildReplyToolReminderAutoResponse(input, role, context) {
280
290
  if (role !== 'user' || !(0, reply_prompt_copy_1.isReplyToolReminderPromptContent)(input)) {
281
291
  return null;
@@ -288,12 +298,14 @@ class MockGen {
288
298
  if (!replyContent) {
289
299
  return null;
290
300
  }
301
+ const promptMsgId = this.extractCurrentPromptMsgId(context);
291
302
  return {
292
303
  message: input,
293
304
  role,
294
305
  response: '',
295
306
  funcCalls: [
296
307
  {
308
+ id: promptMsgId ? `mock_reply_${promptMsgId}` : undefined,
297
309
  name: toolMatch[1],
298
310
  arguments: { replyContent },
299
311
  },