dominds 1.23.2 → 1.23.4

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 (138) hide show
  1. package/dist/dialog-display-state.js +112 -9
  2. package/dist/dialog.js +4 -0
  3. package/dist/docs/dialog-system.md +6 -2
  4. package/dist/docs/dialog-system.zh.md +5 -1
  5. package/dist/docs/diligence-push.md +27 -6
  6. package/dist/docs/diligence-push.zh.md +13 -6
  7. package/dist/docs/llm-provider-isolation.md +1 -1
  8. package/dist/docs/llm-provider-isolation.zh.md +1 -1
  9. package/dist/docs/tellask-revive-context-refactor.zh.md +13 -1
  10. package/dist/docs/volcengine-coding-plan-openai-compatible.zh.md +3 -2
  11. package/dist/llm/api-quirks.d.ts +1 -0
  12. package/dist/llm/api-quirks.js +35 -1
  13. package/dist/llm/defaults.yaml +6 -0
  14. package/dist/llm/gen/anthropic.js +6 -2
  15. package/dist/llm/gen/mock.js +44 -11
  16. package/dist/llm/gen/openai-compatible.d.ts +2 -1
  17. package/dist/llm/gen/openai-compatible.js +88 -20
  18. package/dist/llm/gen.d.ts +12 -0
  19. package/dist/llm/kernel-driver/context-health.d.ts +3 -4
  20. package/dist/llm/kernel-driver/context-health.js +5 -2
  21. package/dist/llm/kernel-driver/context.d.ts +4 -8
  22. package/dist/llm/kernel-driver/context.js +5 -25
  23. package/dist/llm/kernel-driver/drive.js +263 -59
  24. package/dist/llm/kernel-driver/engine.d.ts +1 -1
  25. package/dist/llm/kernel-driver/engine.js +5 -3
  26. package/dist/llm/kernel-driver/flow.js +162 -45
  27. package/dist/llm/kernel-driver/runtime.d.ts +12 -11
  28. package/dist/llm/kernel-driver/runtime.js +106 -18
  29. package/dist/llm/kernel-driver/sideDialog.d.ts +3 -0
  30. package/dist/llm/kernel-driver/sideDialog.js +4 -1
  31. package/dist/llm/kernel-driver/tellask-special.d.ts +1 -0
  32. package/dist/llm/kernel-driver/tellask-special.js +30 -30
  33. package/dist/llm/kernel-driver/types.d.ts +7 -3
  34. package/dist/log.js +35 -2
  35. package/dist/persistence.js +12 -1
  36. package/dist/recovery/reply-special.js +1 -1
  37. package/dist/runtime/driver-messages.d.ts +14 -1
  38. package/dist/runtime/driver-messages.js +116 -6
  39. package/dist/runtime/inter-dialog-format.d.ts +1 -0
  40. package/dist/runtime/inter-dialog-format.js +7 -3
  41. package/dist/server/websocket-handler.js +0 -1
  42. package/dist/tools/team_mgmt-manual.js +2 -2
  43. package/package.json +2 -2
  44. package/webapp/dist/assets/{_basePickBy-C3SVVywm.js → _basePickBy-DMD1UhXs.js} +3 -3
  45. package/webapp/dist/assets/{_basePickBy-C3SVVywm.js.map → _basePickBy-DMD1UhXs.js.map} +1 -1
  46. package/webapp/dist/assets/{_baseUniq-egNq6cCa.js → _baseUniq-CsE8Qvwt.js} +2 -2
  47. package/webapp/dist/assets/{_baseUniq-egNq6cCa.js.map → _baseUniq-CsE8Qvwt.js.map} +1 -1
  48. package/webapp/dist/assets/{arc-CASAlRvm.js → arc-0h8sV6e1.js} +2 -2
  49. package/webapp/dist/assets/{arc-CASAlRvm.js.map → arc-0h8sV6e1.js.map} +1 -1
  50. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B6n5FQmS.js → architectureDiagram-2XIMDMQ5-BbMESECO.js} +7 -7
  51. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B6n5FQmS.js.map → architectureDiagram-2XIMDMQ5-BbMESECO.js.map} +1 -1
  52. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D2UGGjic.js → blockDiagram-WCTKOSBZ-DwkN-9a4.js} +7 -7
  53. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D2UGGjic.js.map → blockDiagram-WCTKOSBZ-DwkN-9a4.js.map} +1 -1
  54. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BOY_bQFP.js → c4Diagram-IC4MRINW-CGYONEh1.js} +3 -3
  55. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BOY_bQFP.js.map → c4Diagram-IC4MRINW-CGYONEh1.js.map} +1 -1
  56. package/webapp/dist/assets/{channel-CZ_X09H1.js → channel-DbSJhm5-.js} +2 -2
  57. package/webapp/dist/assets/{channel-CZ_X09H1.js.map → channel-DbSJhm5-.js.map} +1 -1
  58. package/webapp/dist/assets/{chunk-4BX2VUAB-BIwyAzZQ.js → chunk-4BX2VUAB-D1inRfgf.js} +2 -2
  59. package/webapp/dist/assets/{chunk-4BX2VUAB-BIwyAzZQ.js.map → chunk-4BX2VUAB-D1inRfgf.js.map} +1 -1
  60. package/webapp/dist/assets/{chunk-55IACEB6-zSjTFoCX.js → chunk-55IACEB6-DL1IDg_h.js} +2 -2
  61. package/webapp/dist/assets/{chunk-55IACEB6-zSjTFoCX.js.map → chunk-55IACEB6-DL1IDg_h.js.map} +1 -1
  62. package/webapp/dist/assets/{chunk-FMBD7UC4-CTpuRfdB.js → chunk-FMBD7UC4-CugIlRDV.js} +2 -2
  63. package/webapp/dist/assets/{chunk-FMBD7UC4-CTpuRfdB.js.map → chunk-FMBD7UC4-CugIlRDV.js.map} +1 -1
  64. package/webapp/dist/assets/{chunk-JSJVCQXG-CJ3DM4in.js → chunk-JSJVCQXG-DKHSdeu1.js} +2 -2
  65. package/webapp/dist/assets/{chunk-JSJVCQXG-CJ3DM4in.js.map → chunk-JSJVCQXG-DKHSdeu1.js.map} +1 -1
  66. package/webapp/dist/assets/{chunk-KX2RTZJC-B97EakhO.js → chunk-KX2RTZJC-DCU9tkq6.js} +2 -2
  67. package/webapp/dist/assets/{chunk-KX2RTZJC-B97EakhO.js.map → chunk-KX2RTZJC-DCU9tkq6.js.map} +1 -1
  68. package/webapp/dist/assets/{chunk-NQ4KR5QH-5o1o5x0z.js → chunk-NQ4KR5QH-DN3O2s2M.js} +4 -4
  69. package/webapp/dist/assets/{chunk-NQ4KR5QH-5o1o5x0z.js.map → chunk-NQ4KR5QH-DN3O2s2M.js.map} +1 -1
  70. package/webapp/dist/assets/{chunk-QZHKN3VN-D33FSIEb.js → chunk-QZHKN3VN-e3ztIJg0.js} +2 -2
  71. package/webapp/dist/assets/{chunk-QZHKN3VN-D33FSIEb.js.map → chunk-QZHKN3VN-e3ztIJg0.js.map} +1 -1
  72. package/webapp/dist/assets/{chunk-WL4C6EOR-C2InqFin.js → chunk-WL4C6EOR-Dv907NPM.js} +6 -6
  73. package/webapp/dist/assets/{chunk-WL4C6EOR-C2InqFin.js.map → chunk-WL4C6EOR-Dv907NPM.js.map} +1 -1
  74. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BfLZmK48.js → classDiagram-VBA2DB6C-DOTXtxYZ.js} +7 -7
  75. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BfLZmK48.js.map → classDiagram-VBA2DB6C-DOTXtxYZ.js.map} +1 -1
  76. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BfLZmK48.js → classDiagram-v2-RAHNMMFH-DOTXtxYZ.js} +7 -7
  77. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BfLZmK48.js.map → classDiagram-v2-RAHNMMFH-DOTXtxYZ.js.map} +1 -1
  78. package/webapp/dist/assets/{clone-BSCHnHfl.js → clone-6lYQMWpu.js} +2 -2
  79. package/webapp/dist/assets/{clone-BSCHnHfl.js.map → clone-6lYQMWpu.js.map} +1 -1
  80. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CeQ1jAJJ.js → cose-bilkent-S5V4N54A-DoJeDXV0.js} +2 -2
  81. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CeQ1jAJJ.js.map → cose-bilkent-S5V4N54A-DoJeDXV0.js.map} +1 -1
  82. package/webapp/dist/assets/{dagre-KLK3FWXG-WUuNYzcK.js → dagre-KLK3FWXG-F_n_vhV9.js} +7 -7
  83. package/webapp/dist/assets/{dagre-KLK3FWXG-WUuNYzcK.js.map → dagre-KLK3FWXG-F_n_vhV9.js.map} +1 -1
  84. package/webapp/dist/assets/{diagram-E7M64L7V-jOVCIExP.js → diagram-E7M64L7V-Crwhgyjv.js} +8 -8
  85. package/webapp/dist/assets/{diagram-E7M64L7V-jOVCIExP.js.map → diagram-E7M64L7V-Crwhgyjv.js.map} +1 -1
  86. package/webapp/dist/assets/{diagram-IFDJBPK2-cCeQqotA.js → diagram-IFDJBPK2-CIt1nnn5.js} +7 -7
  87. package/webapp/dist/assets/{diagram-IFDJBPK2-cCeQqotA.js.map → diagram-IFDJBPK2-CIt1nnn5.js.map} +1 -1
  88. package/webapp/dist/assets/{diagram-P4PSJMXO-DjAYFRLv.js → diagram-P4PSJMXO-qowipEfV.js} +7 -7
  89. package/webapp/dist/assets/{diagram-P4PSJMXO-DjAYFRLv.js.map → diagram-P4PSJMXO-qowipEfV.js.map} +1 -1
  90. package/webapp/dist/assets/{erDiagram-INFDFZHY-Dl_6U5fV.js → erDiagram-INFDFZHY-DV2BcYNa.js} +5 -5
  91. package/webapp/dist/assets/{erDiagram-INFDFZHY-Dl_6U5fV.js.map → erDiagram-INFDFZHY-DV2BcYNa.js.map} +1 -1
  92. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D80nrZ3S.js → flowDiagram-PKNHOUZH-CAbWV161.js} +7 -7
  93. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D80nrZ3S.js.map → flowDiagram-PKNHOUZH-CAbWV161.js.map} +1 -1
  94. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-T3WdMrgj.js → ganttDiagram-A5KZAMGK-CfdR7FRr.js} +3 -3
  95. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-T3WdMrgj.js.map → ganttDiagram-A5KZAMGK-CfdR7FRr.js.map} +1 -1
  96. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js → gitGraphDiagram-K3NZZRJ6-DuJFTELz.js} +8 -8
  97. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js.map → gitGraphDiagram-K3NZZRJ6-DuJFTELz.js.map} +1 -1
  98. package/webapp/dist/assets/{graph-D5jmnb35.js → graph-cjRyzujT.js} +3 -3
  99. package/webapp/dist/assets/{graph-D5jmnb35.js.map → graph-cjRyzujT.js.map} +1 -1
  100. package/webapp/dist/assets/{index-CGbZlct2.js → index-DgfF56L4.js} +36 -36
  101. package/webapp/dist/assets/{index-CGbZlct2.js.map → index-DgfF56L4.js.map} +1 -1
  102. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-C340CY5x.js → infoDiagram-LFFYTUFH-3wx-7AdD.js} +6 -6
  103. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-C340CY5x.js.map → infoDiagram-LFFYTUFH-3wx-7AdD.js.map} +1 -1
  104. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bu4RsELK.js → ishikawaDiagram-PHBUUO56-g6CMb1Qc.js} +2 -2
  105. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bu4RsELK.js.map → ishikawaDiagram-PHBUUO56-g6CMb1Qc.js.map} +1 -1
  106. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Dvv3ypKA.js → journeyDiagram-4ABVD52K-DdCcmOBO.js} +5 -5
  107. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Dvv3ypKA.js.map → journeyDiagram-4ABVD52K-DdCcmOBO.js.map} +1 -1
  108. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-D_rsetjW.js → kanban-definition-K7BYSVSG-BFw2emGl.js} +3 -3
  109. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-D_rsetjW.js.map → kanban-definition-K7BYSVSG-BFw2emGl.js.map} +1 -1
  110. package/webapp/dist/assets/{layout-CLmOfwnS.js → layout-Clazq06r.js} +5 -5
  111. package/webapp/dist/assets/{layout-CLmOfwnS.js.map → layout-Clazq06r.js.map} +1 -1
  112. package/webapp/dist/assets/{linear-DFAmViqi.js → linear-jdsBGgvD.js} +2 -2
  113. package/webapp/dist/assets/{linear-DFAmViqi.js.map → linear-jdsBGgvD.js.map} +1 -1
  114. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-Ce3_czeS.js → mindmap-definition-YRQLILUH-DLSZrW6l.js} +4 -4
  115. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-Ce3_czeS.js.map → mindmap-definition-YRQLILUH-DLSZrW6l.js.map} +1 -1
  116. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-U6_un5Sc.js → pieDiagram-SKSYHLDU-Uj-Zpci6.js} +8 -8
  117. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-U6_un5Sc.js.map → pieDiagram-SKSYHLDU-Uj-Zpci6.js.map} +1 -1
  118. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DmVJQItS.js → quadrantDiagram-337W2JSQ-DO7Sl1nV.js} +3 -3
  119. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DmVJQItS.js.map → quadrantDiagram-337W2JSQ-DO7Sl1nV.js.map} +1 -1
  120. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BkNhSY-g.js → requirementDiagram-Z7DCOOCP-WrurrDKQ.js} +4 -4
  121. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BkNhSY-g.js.map → requirementDiagram-Z7DCOOCP-WrurrDKQ.js.map} +1 -1
  122. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-E3UEy5SX.js → sankeyDiagram-WA2Y5GQK-gcxbxuZB.js} +2 -2
  123. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-E3UEy5SX.js.map → sankeyDiagram-WA2Y5GQK-gcxbxuZB.js.map} +1 -1
  124. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-k0w9WKAO.js → sequenceDiagram-2WXFIKYE-B98U2Npa.js} +4 -4
  125. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-k0w9WKAO.js.map → sequenceDiagram-2WXFIKYE-B98U2Npa.js.map} +1 -1
  126. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DRgdJrlx.js → stateDiagram-RAJIS63D-BUgfHMbd.js} +9 -9
  127. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DRgdJrlx.js.map → stateDiagram-RAJIS63D-BUgfHMbd.js.map} +1 -1
  128. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-edtkX9x6.js → stateDiagram-v2-FVOUBMTO-C8gH0rSW.js} +5 -5
  129. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-edtkX9x6.js.map → stateDiagram-v2-FVOUBMTO-C8gH0rSW.js.map} +1 -1
  130. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D0zyXyNL.js → timeline-definition-YZTLITO2-DnVikX3B.js} +3 -3
  131. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D0zyXyNL.js.map → timeline-definition-YZTLITO2-DnVikX3B.js.map} +1 -1
  132. package/webapp/dist/assets/{treemap-KZPCXAKY-CglsYqbQ.js → treemap-KZPCXAKY-BjhjT1IM.js} +5 -5
  133. package/webapp/dist/assets/{treemap-KZPCXAKY-CglsYqbQ.js.map → treemap-KZPCXAKY-BjhjT1IM.js.map} +1 -1
  134. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DsUizzvt.js → vennDiagram-LZ73GAT5-CXjPMxrl.js} +2 -2
  135. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DsUizzvt.js.map → vennDiagram-LZ73GAT5-CXjPMxrl.js.map} +1 -1
  136. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DvYQ4zKY.js → xychartDiagram-JWTSCODW-ByKmk3Cb.js} +3 -3
  137. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DvYQ4zKY.js.map → xychartDiagram-JWTSCODW-ByKmk3Cb.js.map} +1 -1
  138. package/webapp/dist/index.html +1 -1
@@ -165,7 +165,56 @@ function normalizeQ4HAnswerCallId(raw) {
165
165
  function isUserOriginPrompt(prompt) {
166
166
  if (!prompt)
167
167
  return false;
168
- return prompt.origin === 'user';
168
+ return prompt.origin === 'user' && normalizeQ4HAnswerCallId(prompt.q4hAnswerCallId) === undefined;
169
+ }
170
+ function resolveReminderContextFollowingDialogState(prompt, currentTurnDialogMsgsForContext) {
171
+ if (prompt === undefined || currentTurnDialogMsgsForContext.length === 0)
172
+ return 'none';
173
+ return prompt.origin === 'user' ? 'user_message' : 'runtime_notice';
174
+ }
175
+ function splitDialogMsgsForReminderInsertion(args) {
176
+ const msgId = args.currentPrompt?.msgId;
177
+ if (typeof msgId !== 'string' || msgId.trim() === '') {
178
+ return {
179
+ historicalDialogMsgsForContext: [...args.msgs],
180
+ currentTurnDialogMsgsForContext: [],
181
+ };
182
+ }
183
+ const currentTurnStart = args.msgs.findIndex((msg) => msg.type === 'prompting_msg' && msg.msgId === msgId);
184
+ if (currentTurnStart < 0) {
185
+ return {
186
+ historicalDialogMsgsForContext: [...args.msgs],
187
+ currentTurnDialogMsgsForContext: [],
188
+ };
189
+ }
190
+ return {
191
+ historicalDialogMsgsForContext: args.msgs.slice(0, currentTurnStart),
192
+ currentTurnDialogMsgsForContext: args.msgs.slice(currentTurnStart),
193
+ };
194
+ }
195
+ function getUserOriginPromptMsgId(prompt) {
196
+ if (!prompt)
197
+ return undefined;
198
+ return prompt.origin === 'user' && normalizeQ4HAnswerCallId(prompt.q4hAnswerCallId) === undefined
199
+ ? prompt.msgId
200
+ : undefined;
201
+ }
202
+ async function persistAndEmitRuntimeGuide(dlg, content) {
203
+ await dlg.addChatMessages({
204
+ type: 'transient_guide_msg',
205
+ role: 'assistant',
206
+ content,
207
+ });
208
+ await persistAndPostRuntimeGuide(dlg, content);
209
+ }
210
+ async function persistAndPostRuntimeGuide(dlg, content) {
211
+ await persistence_1.DialogPersistence.persistRuntimeGuide(dlg, content, dlg.activeGenSeq);
212
+ (0, evt_registry_1.postDialogEvent)(dlg, {
213
+ type: 'runtime_guide_evt',
214
+ course: dlg.currentCourse,
215
+ genseq: dlg.activeGenSeq,
216
+ content,
217
+ });
169
218
  }
170
219
  function resolveToolUseRequirement(dlg, policy) {
171
220
  // FBR middle rounds are deliberately isolated from callable tools. Final closure is the opposite:
@@ -255,6 +304,9 @@ function hasMeaningfulBatchOutput(batch) {
255
304
  if (output.kind === 'user_image_ingest') {
256
305
  continue;
257
306
  }
307
+ if (output.kind === 'invalid_func_call') {
308
+ return true;
309
+ }
258
310
  if (output.kind !== 'message') {
259
311
  return true;
260
312
  }
@@ -804,26 +856,28 @@ async function projectTellaskFuncResultsForContext(args) {
804
856
  messages: projected,
805
857
  };
806
858
  }
859
+ async function buildActiveReplyObligationContext(dlg) {
860
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dlg.id, dlg.status);
861
+ if (activeReplyObligation === undefined)
862
+ return [];
863
+ return [
864
+ {
865
+ type: 'environment_msg',
866
+ role: 'user',
867
+ content: (0, reply_prompt_copy_1.buildActiveReplyObligationContextText)({
868
+ language: (0, work_language_1.getWorkLanguage)(),
869
+ directive: activeReplyObligation,
870
+ }),
871
+ },
872
+ ];
873
+ }
807
874
  async function buildDialogMsgsForContext(dlg) {
808
875
  const rawDialogMsgsForContext = dlg.msgs.filter((m) => !!m);
809
876
  const projected = await projectTellaskFuncResultsForContext({
810
877
  dialog: dlg,
811
878
  dialogMsgsForContext: rawDialogMsgsForContext,
812
879
  });
813
- const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dlg.id, dlg.status);
814
- const activeReplyObligationContext = activeReplyObligation === undefined
815
- ? []
816
- : [
817
- {
818
- type: 'environment_msg',
819
- role: 'user',
820
- content: (0, reply_prompt_copy_1.buildActiveReplyObligationContextText)({
821
- language: (0, work_language_1.getWorkLanguage)(),
822
- directive: activeReplyObligation,
823
- }),
824
- },
825
- ];
826
- const businessFiltered = [...activeReplyObligationContext, ...projected.messages].filter((msg) => {
880
+ const businessFiltered = projected.messages.filter((msg) => {
827
881
  return msg.type !== 'tellask_result_msg' || msg.content.trim() !== '';
828
882
  });
829
883
  const sanitized = (0, tool_call_context_1.sanitizeToolContextForProvider)(businessFiltered);
@@ -862,6 +916,75 @@ async function emitAssistantSaying(dlg, content) {
862
916
  await dlg.sayingChunk(content);
863
917
  await dlg.sayingFinish();
864
918
  }
919
+ function formatInvalidFuncCallRuntimeGuide(language, call) {
920
+ const rawName = call.rawFunctionName !== undefined && call.rawFunctionName.trim() !== ''
921
+ ? call.rawFunctionName.trim()
922
+ : '<missing>';
923
+ const rawArguments = call.rawArgumentsText !== undefined && call.rawArgumentsText.trim() !== ''
924
+ ? call.rawArgumentsText
925
+ : '<empty>';
926
+ const indexLine = call.toolCallIndex === undefined ? undefined : `- toolCallIndex: ${String(call.toolCallIndex)}`;
927
+ if (language === 'en') {
928
+ return [
929
+ '[Runtime notice] The previous model output contained an invalid tool-call payload that could not be represented as a normal provider tool call in the next generation context.',
930
+ '',
931
+ `- provider: ${call.provider}`,
932
+ `- callId: ${call.callId}`,
933
+ `- problem: ${call.detail}`,
934
+ `- rawFunctionName: ${rawName}`,
935
+ `- rawArgumentsText:`,
936
+ '```json',
937
+ rawArguments,
938
+ '```',
939
+ ...(indexLine === undefined ? [] : [indexLine]),
940
+ '',
941
+ 'Treat that payload as failed. Do not assume the tool ran. Continue from the current task, and if a tool call is still needed, emit a new valid tool call with a non-empty function name and valid arguments.',
942
+ ]
943
+ .filter((line) => line.length > 0)
944
+ .join('\n');
945
+ }
946
+ return [
947
+ '[运行时提示] 上一轮模型输出包含一个无效工具调用载荷,无法按正常 provider tool call 形态进入下一轮生成上下文。',
948
+ '',
949
+ `- provider: ${call.provider}`,
950
+ `- callId: ${call.callId}`,
951
+ `- 问题: ${call.detail}`,
952
+ `- rawFunctionName: ${rawName}`,
953
+ `- rawArgumentsText:`,
954
+ '```json',
955
+ rawArguments,
956
+ '```',
957
+ ...(indexLine === undefined ? [] : [indexLine]),
958
+ '',
959
+ '请把该载荷视为调用失败,不要假设工具已经执行。继续当前任务;如果仍需要调用工具,请重新发起一个函数名非空、参数有效的新工具调用。',
960
+ ]
961
+ .filter((line) => line.length > 0)
962
+ .join('\n');
963
+ }
964
+ async function persistInvalidFuncCallRuntimeGuide(args) {
965
+ const { dlg, call } = args;
966
+ const sourceText = args.source === 'streamed' ? 'streamed' : 'batch';
967
+ log_1.log.error(`kernel-driver received invalid ${sourceText} function call payload`, new Error(`kernel_driver_invalid_${sourceText}_function_call_payload`), {
968
+ rootId: dlg.id.rootId,
969
+ selfId: dlg.id.selfId,
970
+ course: dlg.activeGenCourseOrUndefined ?? dlg.currentCourse,
971
+ genseq: dlg.activeGenSeq,
972
+ callId: call.callId,
973
+ provider: call.provider,
974
+ detail: call.detail,
975
+ toolCallIndex: call.toolCallIndex,
976
+ });
977
+ if (args.emitStreamError) {
978
+ await dlg.streamError(call.detail);
979
+ }
980
+ const content = formatInvalidFuncCallRuntimeGuide((0, work_language_1.getWorkLanguage)(), call);
981
+ args.newMsgs.push({
982
+ type: 'transient_guide_msg',
983
+ role: 'assistant',
984
+ content,
985
+ });
986
+ await persistAndPostRuntimeGuide(dlg, content);
987
+ }
865
988
  function resolveFuncToolFollowupMode(tool) {
866
989
  return tool?.followupMode ?? 'immediate';
867
990
  }
@@ -1252,38 +1375,39 @@ async function preserveDiligenceBudgetAcrossQ4H(dlg) {
1252
1375
  }
1253
1376
  async function maybeContinueWithDiligencePrompt(args) {
1254
1377
  const { dlg, team, suppressDiligencePushForDrive, allowPendingSideDialogs, ignoreBudgetExhaustion, } = args;
1255
- if (!(dlg instanceof dialog_1.MainDialog)) {
1256
- return { kind: 'break' };
1257
- }
1258
1378
  const suspension = await dlg.getSuspensionStatus({
1259
1379
  allowPendingSideDialogs: allowPendingSideDialogs === true,
1260
1380
  });
1261
1381
  if (!suspension.canDrive) {
1262
- if (suspension.q4h) {
1382
+ if (suspension.q4h && dlg instanceof dialog_1.MainDialog) {
1263
1383
  await preserveDiligenceBudgetAcrossQ4H(dlg);
1264
1384
  }
1265
1385
  return { kind: 'break' };
1266
1386
  }
1267
1387
  const prepared = await (0, runtime_1.maybePrepareDiligenceAutoContinuePrompt)({
1268
1388
  dlg,
1269
- isMainDialog: true,
1270
1389
  remainingBudget: dlg.diligencePushRemainingBudget,
1271
1390
  diligencePushMax: resolveMemberDiligencePushMax(team, dlg.agentId),
1272
1391
  suppressDiligencePush: suppressDiligencePushForDrive,
1273
1392
  ignoreBudgetExhaustion,
1274
1393
  });
1275
- dlg.diligencePushRemainingBudget = prepared.nextRemainingBudget;
1276
- void persistence_1.DialogPersistence.mutateDialogLatest(dlg.id, () => ({
1277
- kind: 'patch',
1278
- patch: { diligencePushRemainingBudget: dlg.diligencePushRemainingBudget },
1279
- }));
1280
- if (prepared.kind !== 'disabled') {
1394
+ if (dlg instanceof dialog_1.MainDialog) {
1395
+ dlg.diligencePushRemainingBudget = prepared.nextRemainingBudget;
1396
+ void persistence_1.DialogPersistence.mutateDialogLatest(dlg.id, () => ({
1397
+ kind: 'patch',
1398
+ patch: { diligencePushRemainingBudget: dlg.diligencePushRemainingBudget },
1399
+ }));
1400
+ }
1401
+ if (dlg instanceof dialog_1.MainDialog && prepared.kind !== 'disabled') {
1281
1402
  emitDiligenceBudgetEvent(dlg, {
1282
1403
  maxInjectCount: prepared.maxInjectCount,
1283
1404
  nextRemainingBudget: prepared.nextRemainingBudget,
1284
1405
  });
1285
1406
  }
1286
1407
  if (prepared.kind === 'budget_exhausted') {
1408
+ if (!(dlg instanceof dialog_1.MainDialog)) {
1409
+ throw new Error(`kernel-driver Diligence Push invariant violation: non-main dialog returned budget_exhausted (${dlg.id.valueOf()})`);
1410
+ }
1287
1411
  await (0, runtime_1.suspendForKeepGoingBudgetExhausted)({
1288
1412
  dlg,
1289
1413
  maxInjectCount: prepared.maxInjectCount,
@@ -1333,9 +1457,6 @@ async function maybeContinueWithHealthPromptBeforeDiligence(args) {
1333
1457
  cautionRemediationCadenceGenerations,
1334
1458
  criticalCountdownRemaining,
1335
1459
  });
1336
- if (healthDecision.kind === 'suspend') {
1337
- return { kind: 'health_suspend' };
1338
- }
1339
1460
  if (healthDecision.kind !== 'continue') {
1340
1461
  return { kind: 'no_health_prompt' };
1341
1462
  }
@@ -1389,13 +1510,22 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1389
1510
  const suppressDiligencePushForDrive = driveOptions?.suppressDiligencePush === true && dlg.disableDiligencePush;
1390
1511
  const abortSignal = (0, dialog_display_state_1.getActiveRunSignal)(dlg.id) ?? (0, dialog_display_state_1.createActiveRun)(dlg.id);
1391
1512
  let finalDisplayState;
1513
+ let criticalUserInterjectionRuntimeGuide = driveOptions?.criticalUserInterjectionRuntimeGuide;
1392
1514
  let lastAssistantSayingContent = null;
1393
1515
  let lastAssistantSayingGenseq = null;
1516
+ let lastAssistantThinkingContent = null;
1517
+ let lastAssistantThinkingGenseq = null;
1394
1518
  let lastFunctionCallGenseq = null;
1395
1519
  let lastAssistantReplyTarget;
1396
1520
  let fbrConclusion;
1397
1521
  let pubRemindersVer = dlg.remindersVer;
1398
1522
  let pendingPrompt = humanPrompt;
1523
+ let resolvingImmediateToolResultForUserPrompt = false;
1524
+ let resolvingImmediateToolResultUserPromptMsgId;
1525
+ let criticalRemediationAppliedUserPromptMsgId = driveOptions?.criticalUserInterjectionRuntimeGuide !== undefined &&
1526
+ humanPrompt?.origin === 'user'
1527
+ ? humanPrompt.msgId
1528
+ : undefined;
1399
1529
  let retryStoppedRecoveryPrompt;
1400
1530
  let skipTaskdocForThisDrive = humanPrompt?.skipTaskdoc === true;
1401
1531
  let genIterNo = 0;
@@ -1507,7 +1637,17 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1507
1637
  : canonicalFuncTools;
1508
1638
  const projected = (0, tools_projection_1.projectFuncToolsForProvider)(providerCfg.apiType, effectiveFuncTools);
1509
1639
  const funcTools = projected.tools;
1640
+ const currentPendingPrompt = pendingPrompt;
1641
+ let currentGenerationBelongsToUserPrompt = isUserOriginPrompt(currentPendingPrompt);
1642
+ let currentGenerationBelongsToUserToolChain = false;
1643
+ let currentUserPromptMsgId = getUserOriginPromptMsgId(currentPendingPrompt);
1510
1644
  if (genIterNo > 1) {
1645
+ currentGenerationBelongsToUserToolChain = resolvingImmediateToolResultForUserPrompt;
1646
+ if (currentUserPromptMsgId === undefined) {
1647
+ currentUserPromptMsgId = resolvingImmediateToolResultUserPromptMsgId;
1648
+ }
1649
+ resolvingImmediateToolResultForUserPrompt = false;
1650
+ resolvingImmediateToolResultUserPromptMsgId = undefined;
1511
1651
  const snapshot = dlg.getLastContextHealth();
1512
1652
  const hasQueuedUpNext = dlg.hasUpNext() || pendingPrompt !== undefined;
1513
1653
  const modelInfoForRemediation = resolveModelInfo(providerCfg, model);
@@ -1516,21 +1656,14 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1516
1656
  const healthDecision = (0, context_health_1.decideKernelDriverContextHealth)({
1517
1657
  dialogKey: dlg.id.key(),
1518
1658
  snapshot,
1519
- hadUserPromptThisGen: isUserOriginPrompt(pendingPrompt),
1659
+ hadUserPromptThisGen: currentGenerationBelongsToUserPrompt,
1660
+ hadUserPromptInImmediateToolChain: currentGenerationBelongsToUserToolChain,
1661
+ userPromptCriticalRemediationAlreadyApplied: criticalRemediationAppliedUserPromptMsgId !== undefined &&
1662
+ criticalRemediationAppliedUserPromptMsgId === currentUserPromptMsgId,
1520
1663
  canInjectPromptThisGen: !hasQueuedUpNext,
1521
1664
  cautionRemediationCadenceGenerations,
1522
1665
  criticalCountdownRemaining,
1523
1666
  });
1524
- if (healthDecision.kind === 'suspend') {
1525
- log_1.log.debug('kernel-driver suspend iterative generation due to critical context while waiting for human prompt', undefined, {
1526
- dialogId: dlg.id.valueOf(),
1527
- rootId: dlg.id.rootId,
1528
- selfId: dlg.id.selfId,
1529
- genIterNo,
1530
- pendingPromptOrigin: pendingPrompt?.origin ?? null,
1531
- });
1532
- break;
1533
- }
1534
1667
  if (healthDecision.kind === 'continue') {
1535
1668
  if (healthDecision.reason === 'critical_force_new_course') {
1536
1669
  const language = (0, work_language_1.getWorkLanguage)();
@@ -1548,6 +1681,16 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1548
1681
  pendingPrompt = nextPrompt;
1549
1682
  skipTaskdocForThisDrive = false;
1550
1683
  }
1684
+ else if (healthDecision.reason === 'critical_user_prompt_remediation') {
1685
+ const language = (0, work_language_1.getWorkLanguage)();
1686
+ const dialogScope = dlg instanceof dialog_1.SideDialog ? 'sideDialog' : 'mainDialog';
1687
+ criticalUserInterjectionRuntimeGuide =
1688
+ (0, driver_messages_1.formatAgentFacingCriticalUserInterjectionRemediationGuide)(language, {
1689
+ dialogScope,
1690
+ promptsRemainingAfterThis: (0, context_health_1.consumeCriticalCountdown)(dlg.id.key()),
1691
+ });
1692
+ criticalRemediationAppliedUserPromptMsgId = currentUserPromptMsgId;
1693
+ }
1551
1694
  else if (!hasQueuedUpNext) {
1552
1695
  const language = (0, work_language_1.getWorkLanguage)();
1553
1696
  const dialogScope = dlg instanceof dialog_1.SideDialog ? 'sideDialog' : 'mainDialog';
@@ -1586,6 +1729,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1586
1729
  pendingPrompt = undefined;
1587
1730
  await dlg.notifyGeneratingStart(currentPrompt?.msgId);
1588
1731
  try {
1732
+ if (criticalUserInterjectionRuntimeGuide !== undefined) {
1733
+ await persistAndEmitRuntimeGuide(dlg, criticalUserInterjectionRuntimeGuide);
1734
+ criticalUserInterjectionRuntimeGuide = undefined;
1735
+ }
1589
1736
  if (currentPrompt) {
1590
1737
  const origin = currentPrompt.origin;
1591
1738
  if (origin === 'diligence_push' &&
@@ -1665,14 +1812,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1665
1812
  const renderPromptAsRuntimeGuideBubble = origin === 'runtime' &&
1666
1813
  (0, reply_prompt_copy_1.isStandaloneRuntimeGuidePromptContent)(replyGuidance.promptContent);
1667
1814
  if (currentRuntimeGuideMsg) {
1668
- await dlg.addChatMessages(currentRuntimeGuideMsg);
1669
- await persistence_1.DialogPersistence.persistRuntimeGuide(dlg, currentRuntimeGuideMsg.content, dlg.activeGenSeq);
1670
- (0, evt_registry_1.postDialogEvent)(dlg, {
1671
- type: 'runtime_guide_evt',
1672
- course: dlg.currentCourse,
1673
- genseq: dlg.activeGenSeq,
1674
- content: currentRuntimeGuideMsg.content,
1675
- });
1815
+ await persistAndEmitRuntimeGuide(dlg, currentRuntimeGuideMsg.content);
1676
1816
  currentRuntimeGuideMsg = undefined;
1677
1817
  }
1678
1818
  if (isQ4HAnswerPrompt) {
@@ -1796,13 +1936,18 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1796
1936
  : undefined;
1797
1937
  const renderedReminders = await renderRemindersForContext(dlg);
1798
1938
  const dialogMsgsForContext = await buildDialogMsgsForContext(dlg);
1939
+ const activeReplyObligationContext = await buildActiveReplyObligationContext(dlg);
1940
+ const splitDialogMsgs = splitDialogMsgsForReminderInsertion({
1941
+ msgs: dialogMsgsForContext,
1942
+ currentPrompt,
1943
+ });
1799
1944
  const reminderContextBlock = renderedReminders.length > 0
1800
1945
  ? [
1801
1946
  ...renderedReminders,
1802
1947
  {
1803
1948
  type: 'environment_msg',
1804
1949
  role: 'user',
1805
- content: (0, driver_messages_1.formatReminderContextFooter)((0, work_language_1.getWorkLanguage)()),
1950
+ content: (0, driver_messages_1.formatReminderContextFooter)((0, work_language_1.getWorkLanguage)(), resolveReminderContextFollowingDialogState(currentPrompt, splitDialogMsgs.currentTurnDialogMsgsForContext)),
1806
1951
  },
1807
1952
  ]
1808
1953
  : renderedReminders;
@@ -1812,17 +1957,20 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1812
1957
  memories: minds.memories,
1813
1958
  taskDocMsg,
1814
1959
  coursePrefixMsgs: dlg.getCoursePrefixMsgs(),
1815
- dialogMsgsForContext,
1960
+ historicalDialogMsgsForContext: splitDialogMsgs.historicalDialogMsgsForContext,
1961
+ currentTurnDialogMsgsForContext: splitDialogMsgs.currentTurnDialogMsgsForContext,
1816
1962
  },
1817
- ephemeral: {
1818
- runtimeGuideMsgs: currentRuntimeGuideMsg ? [currentRuntimeGuideMsg] : undefined,
1963
+ tail: {
1964
+ renderedReminders: reminderContextBlock,
1965
+ activeReplyObligationContext,
1966
+ runtimeGuideMsgs: currentRuntimeGuideMsg ? [currentRuntimeGuideMsg] : [],
1819
1967
  },
1820
- tail: { renderedReminders: reminderContextBlock },
1821
1968
  });
1822
1969
  const newMsgs = [];
1823
1970
  const streamedFuncCalls = [];
1824
1971
  let sawWebSearchSideChannelOutput = false;
1825
1972
  let sawNativeToolSideChannelOutput = false;
1973
+ let invalidFuncCallCount = 0;
1826
1974
  const streamOrBatch = async () => {
1827
1975
  let batchAttemptCourse;
1828
1976
  let batchAttemptCheckpointOffset;
@@ -1839,6 +1987,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1839
1987
  });
1840
1988
  sawWebSearchSideChannelOutput = false;
1841
1989
  sawNativeToolSideChannelOutput = false;
1990
+ invalidFuncCallCount = 0;
1842
1991
  streamedFuncCalls.length = 0;
1843
1992
  newMsgs.length = 0;
1844
1993
  };
@@ -1906,6 +2055,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1906
2055
  let streamAttemptCheckpointOffset;
1907
2056
  let streamAttemptSayingContent;
1908
2057
  let streamAttemptSayingGenseq;
2058
+ let streamAttemptThinkingContent;
2059
+ let streamAttemptThinkingGenseq;
1909
2060
  let streamActive = { kind: 'idle' };
1910
2061
  const rollbackStreamAttempt = async () => {
1911
2062
  if (streamAttemptCourse === undefined ||
@@ -1925,9 +2076,12 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1925
2076
  currentSayingContent = '';
1926
2077
  streamAttemptSayingContent = undefined;
1927
2078
  streamAttemptSayingGenseq = undefined;
2079
+ streamAttemptThinkingContent = undefined;
2080
+ streamAttemptThinkingGenseq = undefined;
1928
2081
  sawWebSearchSideChannelOutput = false;
1929
2082
  sawNativeToolSideChannelOutput = false;
1930
2083
  streamedFuncCalls.length = 0;
2084
+ invalidFuncCallCount = 0;
1931
2085
  newMsgs.length = 0;
1932
2086
  };
1933
2087
  const receiver = {
@@ -1975,13 +2129,16 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1975
2129
  currentThinkingReasoning = reasoning;
1976
2130
  await dlg.thinkingFinish(reasoning);
1977
2131
  if (currentThinkingContent.length > 0 || currentThinkingReasoning !== undefined) {
1978
- newMsgs.push({
2132
+ const thinkingMessage = {
1979
2133
  type: 'thinking_msg',
1980
2134
  role: 'assistant',
1981
2135
  genseq: dlg.activeGenSeq,
1982
2136
  content: currentThinkingContent,
1983
2137
  reasoning: currentThinkingReasoning,
1984
- });
2138
+ };
2139
+ newMsgs.push(thinkingMessage);
2140
+ streamAttemptThinkingContent = currentThinkingContent;
2141
+ streamAttemptThinkingGenseq = thinkingMessage.genseq;
1985
2142
  }
1986
2143
  currentThinkingContent = '';
1987
2144
  currentThinkingReasoning = undefined;
@@ -2048,6 +2205,17 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2048
2205
  arguments: argsStr,
2049
2206
  });
2050
2207
  },
2208
+ invalidFuncCall: async (call) => {
2209
+ throwIfAborted(abortSignal, dlg);
2210
+ invalidFuncCallCount += 1;
2211
+ await persistInvalidFuncCallRuntimeGuide({
2212
+ dlg,
2213
+ call,
2214
+ source: 'streamed',
2215
+ newMsgs,
2216
+ emitStreamError: true,
2217
+ });
2218
+ },
2051
2219
  webSearchCall: async (call) => {
2052
2220
  throwIfAborted(abortSignal, dlg);
2053
2221
  sawWebSearchSideChannelOutput = true;
@@ -2093,9 +2261,12 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2093
2261
  currentSayingContent = '';
2094
2262
  streamAttemptSayingContent = undefined;
2095
2263
  streamAttemptSayingGenseq = undefined;
2264
+ streamAttemptThinkingContent = undefined;
2265
+ streamAttemptThinkingGenseq = undefined;
2096
2266
  sawWebSearchSideChannelOutput = false;
2097
2267
  sawNativeToolSideChannelOutput = false;
2098
2268
  streamedFuncCalls.length = 0;
2269
+ invalidFuncCallCount = 0;
2099
2270
  newMsgs.length = 0;
2100
2271
  const promptCacheKey = prepareLlmRequestContextKey();
2101
2272
  const streamResult = await llmGen.genToReceiver(providerCfg, agent, systemPrompt, funcTools, {
@@ -2111,6 +2282,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2111
2282
  const hasFunctionCall = streamedFuncCalls.length > 0;
2112
2283
  if (!hasFinishedMessageContent &&
2113
2284
  !hasFunctionCall &&
2285
+ invalidFuncCallCount === 0 &&
2114
2286
  !sawWebSearchSideChannelOutput &&
2115
2287
  !sawNativeToolSideChannelOutput) {
2116
2288
  throw {
@@ -2128,6 +2300,14 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2128
2300
  streamAttemptSayingGenseq === undefined ? null : streamAttemptSayingGenseq;
2129
2301
  lastAssistantReplyTarget = currentReplyTarget;
2130
2302
  }
2303
+ if (streamAttemptThinkingContent !== undefined) {
2304
+ lastAssistantThinkingContent = streamAttemptThinkingContent;
2305
+ lastAssistantThinkingGenseq =
2306
+ streamAttemptThinkingGenseq === undefined ? null : streamAttemptThinkingGenseq;
2307
+ if (streamAttemptSayingContent === undefined) {
2308
+ lastAssistantReplyTarget = currentReplyTarget;
2309
+ }
2310
+ }
2131
2311
  return { usage: res.usage, llmGenModel: res.llmGenModel };
2132
2312
  };
2133
2313
  const llmOutput = await streamOrBatch();
@@ -2152,6 +2332,9 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2152
2332
  if (msg.type === 'thinking_msg' || msg.type === 'saying_msg') {
2153
2333
  newMsgs.push(msg);
2154
2334
  if (msg.type === 'thinking_msg') {
2335
+ lastAssistantThinkingContent = msg.content;
2336
+ lastAssistantThinkingGenseq = msg.genseq;
2337
+ lastAssistantReplyTarget = currentReplyTarget;
2155
2338
  await (0, events_1.emitThinkingEvents)(dlg, msg.content, msg.reasoning);
2156
2339
  }
2157
2340
  else {
@@ -2167,6 +2350,17 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2167
2350
  }
2168
2351
  break;
2169
2352
  }
2353
+ case 'invalid_func_call': {
2354
+ invalidFuncCallCount += 1;
2355
+ await persistInvalidFuncCallRuntimeGuide({
2356
+ dlg,
2357
+ call: output.call,
2358
+ source: 'batch',
2359
+ newMsgs,
2360
+ emitStreamError: true,
2361
+ });
2362
+ break;
2363
+ }
2170
2364
  case 'web_search_call': {
2171
2365
  sawWebSearchSideChannelOutput = true;
2172
2366
  await dlg.webSearchCall(projectLlmWebSearchCall(output.call));
@@ -2225,6 +2419,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2225
2419
  return {
2226
2420
  lastAssistantSayingContent,
2227
2421
  lastAssistantSayingGenseq,
2422
+ lastAssistantThinkingContent,
2423
+ lastAssistantThinkingGenseq,
2228
2424
  lastFunctionCallGenseq,
2229
2425
  lastAssistantReplyTarget,
2230
2426
  };
@@ -2374,7 +2570,9 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2374
2570
  // warrant same-drive LLM reaction right away. Provider-native side-channel UI events are
2375
2571
  // meaningful output, but they are not transcript/context inputs and therefore must not
2376
2572
  // trigger another immediate generation round by themselves.
2377
- const shouldStartImmediatePostToolGeneration = routed.hasImmediateFollowupToolCalls || routed.tellaskToolOutputs.length > 0;
2573
+ const shouldStartImmediatePostToolGeneration = routed.hasImmediateFollowupToolCalls ||
2574
+ routed.tellaskToolOutputs.length > 0 ||
2575
+ invalidFuncCallCount > 0;
2378
2576
  if (!shouldStartImmediatePostToolGeneration) {
2379
2577
  const healthFirst = await maybeContinueWithHealthPromptBeforeDiligence({
2380
2578
  dlg,
@@ -2388,9 +2586,6 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2388
2586
  }
2389
2587
  continue;
2390
2588
  }
2391
- if (healthFirst.kind === 'health_suspend') {
2392
- break;
2393
- }
2394
2589
  const next = await maybeContinueWithDiligencePrompt({
2395
2590
  dlg,
2396
2591
  team,
@@ -2403,6 +2598,13 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2403
2598
  break;
2404
2599
  }
2405
2600
  if (shouldStartImmediatePostToolGeneration) {
2601
+ resolvingImmediateToolResultForUserPrompt =
2602
+ currentGenerationBelongsToUserPrompt ||
2603
+ currentGenerationBelongsToUserToolChain ||
2604
+ isUserOriginPrompt(currentPrompt);
2605
+ resolvingImmediateToolResultUserPromptMsgId = resolvingImmediateToolResultForUserPrompt
2606
+ ? currentUserPromptMsgId
2607
+ : undefined;
2406
2608
  continue;
2407
2609
  }
2408
2610
  }
@@ -2543,6 +2745,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2543
2745
  return {
2544
2746
  lastAssistantSayingContent,
2545
2747
  lastAssistantSayingGenseq,
2748
+ lastAssistantThinkingContent,
2749
+ lastAssistantThinkingGenseq,
2546
2750
  lastFunctionCallGenseq,
2547
2751
  lastAssistantReplyTarget,
2548
2752
  fbrConclusion,
@@ -7,4 +7,4 @@ export declare function driveDialogStreamCore(dlg: Dialog, callbacks: KernelDriv
7
7
  export declare function supplyResponseToSideDialogBridge(parentDialog: Dialog, sideDialogId: DialogID, responseText: string, callType: 'A' | 'B' | 'C', callId?: string, status?: 'completed' | 'failed', calleeResponseRef?: {
8
8
  course: number;
9
9
  genseq: number;
10
- }): Promise<void>;
10
+ }, directFallbackSource?: 'saying' | 'thinking_only'): Promise<void>;
@@ -25,7 +25,7 @@ async function driveDialogStream(...driveArgs) {
25
25
  void dispatchDrive(dialog, options);
26
26
  },
27
27
  driveDialog: async (dialog, options) => {
28
- await dispatchDrive(dialog, options);
28
+ return await dispatchDrive(dialog, options);
29
29
  },
30
30
  });
31
31
  }
@@ -34,7 +34,7 @@ async function emitSayingEventsBridge(...args) {
34
34
  return await (0, events_1.emitSayingEvents)(dlg, content);
35
35
  }
36
36
  async function supplyResponseToAskerDialog(...args) {
37
- const [parentDialog, sideDialogId, responseText, callType, callId, status, calleeResponseRef] = args;
37
+ const [parentDialog, sideDialogId, responseText, callType, callId, status, calleeResponseRef, directFallbackSource,] = args;
38
38
  return await (0, sideDialog_1.supplyResponseToAskerDialog)({
39
39
  parentDialog,
40
40
  sideDialogId,
@@ -43,6 +43,7 @@ async function supplyResponseToAskerDialog(...args) {
43
43
  callId,
44
44
  status,
45
45
  calleeResponseRef,
46
+ directFallbackSource,
46
47
  scheduleDrive: (dialog, options) => {
47
48
  void dispatchDrive(dialog, options);
48
49
  },
@@ -51,7 +52,7 @@ async function supplyResponseToAskerDialog(...args) {
51
52
  async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions) {
52
53
  return await (0, drive_1.driveDialogStreamCore)(dlg, callbacks, humanPrompt, driveOptions);
53
54
  }
54
- async function supplyResponseToSideDialogBridge(parentDialog, sideDialogId, responseText, callType, callId, status, calleeResponseRef) {
55
+ async function supplyResponseToSideDialogBridge(parentDialog, sideDialogId, responseText, callType, callId, status, calleeResponseRef, directFallbackSource) {
55
56
  await (0, sideDialog_1.supplyResponseToAskerDialog)({
56
57
  parentDialog,
57
58
  sideDialogId,
@@ -60,6 +61,7 @@ async function supplyResponseToSideDialogBridge(parentDialog, sideDialogId, resp
60
61
  callId,
61
62
  status,
62
63
  calleeResponseRef,
64
+ directFallbackSource,
63
65
  scheduleDrive: (dialog, options) => {
64
66
  void dispatchDrive(dialog, options);
65
67
  },