dominds 1.23.1 → 1.23.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 (145) hide show
  1. package/dist/cli/webui.js +8 -1
  2. package/dist/dialog-display-state.d.ts +1 -0
  3. package/dist/dialog-display-state.js +147 -12
  4. package/dist/dialog.js +4 -0
  5. package/dist/docs/dialog-system.md +6 -2
  6. package/dist/docs/dialog-system.zh.md +5 -1
  7. package/dist/docs/diligence-push.md +27 -6
  8. package/dist/docs/diligence-push.zh.md +13 -6
  9. package/dist/docs/llm-provider-isolation.md +1 -1
  10. package/dist/docs/llm-provider-isolation.zh.md +1 -1
  11. package/dist/docs/tellask-revive-context-refactor.zh.md +13 -1
  12. package/dist/docs/volcengine-coding-plan-openai-compatible.zh.md +3 -2
  13. package/dist/llm/api-quirks.d.ts +1 -0
  14. package/dist/llm/api-quirks.js +35 -1
  15. package/dist/llm/defaults.yaml +7 -0
  16. package/dist/llm/gen/mock.js +29 -17
  17. package/dist/llm/gen/openai-compatible.js +1 -2
  18. package/dist/llm/kernel-driver/context-health.d.ts +3 -4
  19. package/dist/llm/kernel-driver/context-health.js +5 -2
  20. package/dist/llm/kernel-driver/context.d.ts +4 -8
  21. package/dist/llm/kernel-driver/context.js +5 -25
  22. package/dist/llm/kernel-driver/drive.js +158 -58
  23. package/dist/llm/kernel-driver/engine.d.ts +1 -1
  24. package/dist/llm/kernel-driver/engine.js +5 -3
  25. package/dist/llm/kernel-driver/flow.js +173 -58
  26. package/dist/llm/kernel-driver/loop.js +3 -1
  27. package/dist/llm/kernel-driver/reply-guidance.js +3 -7
  28. package/dist/llm/kernel-driver/runtime.d.ts +12 -11
  29. package/dist/llm/kernel-driver/runtime.js +106 -18
  30. package/dist/llm/kernel-driver/sideDialog.d.ts +3 -0
  31. package/dist/llm/kernel-driver/sideDialog.js +4 -1
  32. package/dist/llm/kernel-driver/tellask-special.d.ts +1 -0
  33. package/dist/llm/kernel-driver/tellask-special.js +30 -30
  34. package/dist/llm/kernel-driver/types.d.ts +8 -3
  35. package/dist/persistence.js +1 -0
  36. package/dist/recovery/proceeding-drive.d.ts +1 -0
  37. package/dist/recovery/proceeding-drive.js +89 -0
  38. package/dist/recovery/reply-special.js +1 -1
  39. package/dist/runtime/driver-messages.d.ts +14 -1
  40. package/dist/runtime/driver-messages.js +116 -6
  41. package/dist/runtime/inter-dialog-format.d.ts +1 -0
  42. package/dist/runtime/inter-dialog-format.js +7 -3
  43. package/dist/runtime/reply-prompt-copy.d.ts +5 -1
  44. package/dist/runtime/reply-prompt-copy.js +13 -3
  45. package/dist/server/websocket-handler.js +0 -1
  46. package/dist/server.d.ts +1 -0
  47. package/dist/server.js +68 -14
  48. package/dist/tools/cmd-runner.js +76 -17
  49. package/dist/tools/team_mgmt-manual.js +2 -2
  50. package/package.json +1 -1
  51. package/webapp/dist/assets/{_basePickBy-C3SVVywm.js → _basePickBy-DMD1UhXs.js} +3 -3
  52. package/webapp/dist/assets/{_basePickBy-C3SVVywm.js.map → _basePickBy-DMD1UhXs.js.map} +1 -1
  53. package/webapp/dist/assets/{_baseUniq-egNq6cCa.js → _baseUniq-CsE8Qvwt.js} +2 -2
  54. package/webapp/dist/assets/{_baseUniq-egNq6cCa.js.map → _baseUniq-CsE8Qvwt.js.map} +1 -1
  55. package/webapp/dist/assets/{arc-CASAlRvm.js → arc-0h8sV6e1.js} +2 -2
  56. package/webapp/dist/assets/{arc-CASAlRvm.js.map → arc-0h8sV6e1.js.map} +1 -1
  57. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B6n5FQmS.js → architectureDiagram-2XIMDMQ5-BbMESECO.js} +7 -7
  58. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B6n5FQmS.js.map → architectureDiagram-2XIMDMQ5-BbMESECO.js.map} +1 -1
  59. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D2UGGjic.js → blockDiagram-WCTKOSBZ-DwkN-9a4.js} +7 -7
  60. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-D2UGGjic.js.map → blockDiagram-WCTKOSBZ-DwkN-9a4.js.map} +1 -1
  61. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BOY_bQFP.js → c4Diagram-IC4MRINW-CGYONEh1.js} +3 -3
  62. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BOY_bQFP.js.map → c4Diagram-IC4MRINW-CGYONEh1.js.map} +1 -1
  63. package/webapp/dist/assets/{channel-CZ_X09H1.js → channel-DbSJhm5-.js} +2 -2
  64. package/webapp/dist/assets/{channel-CZ_X09H1.js.map → channel-DbSJhm5-.js.map} +1 -1
  65. package/webapp/dist/assets/{chunk-4BX2VUAB-BIwyAzZQ.js → chunk-4BX2VUAB-D1inRfgf.js} +2 -2
  66. package/webapp/dist/assets/{chunk-4BX2VUAB-BIwyAzZQ.js.map → chunk-4BX2VUAB-D1inRfgf.js.map} +1 -1
  67. package/webapp/dist/assets/{chunk-55IACEB6-zSjTFoCX.js → chunk-55IACEB6-DL1IDg_h.js} +2 -2
  68. package/webapp/dist/assets/{chunk-55IACEB6-zSjTFoCX.js.map → chunk-55IACEB6-DL1IDg_h.js.map} +1 -1
  69. package/webapp/dist/assets/{chunk-FMBD7UC4-CTpuRfdB.js → chunk-FMBD7UC4-CugIlRDV.js} +2 -2
  70. package/webapp/dist/assets/{chunk-FMBD7UC4-CTpuRfdB.js.map → chunk-FMBD7UC4-CugIlRDV.js.map} +1 -1
  71. package/webapp/dist/assets/{chunk-JSJVCQXG-CJ3DM4in.js → chunk-JSJVCQXG-DKHSdeu1.js} +2 -2
  72. package/webapp/dist/assets/{chunk-JSJVCQXG-CJ3DM4in.js.map → chunk-JSJVCQXG-DKHSdeu1.js.map} +1 -1
  73. package/webapp/dist/assets/{chunk-KX2RTZJC-B97EakhO.js → chunk-KX2RTZJC-DCU9tkq6.js} +2 -2
  74. package/webapp/dist/assets/{chunk-KX2RTZJC-B97EakhO.js.map → chunk-KX2RTZJC-DCU9tkq6.js.map} +1 -1
  75. package/webapp/dist/assets/{chunk-NQ4KR5QH-5o1o5x0z.js → chunk-NQ4KR5QH-DN3O2s2M.js} +4 -4
  76. package/webapp/dist/assets/{chunk-NQ4KR5QH-5o1o5x0z.js.map → chunk-NQ4KR5QH-DN3O2s2M.js.map} +1 -1
  77. package/webapp/dist/assets/{chunk-QZHKN3VN-D33FSIEb.js → chunk-QZHKN3VN-e3ztIJg0.js} +2 -2
  78. package/webapp/dist/assets/{chunk-QZHKN3VN-D33FSIEb.js.map → chunk-QZHKN3VN-e3ztIJg0.js.map} +1 -1
  79. package/webapp/dist/assets/{chunk-WL4C6EOR-C2InqFin.js → chunk-WL4C6EOR-Dv907NPM.js} +6 -6
  80. package/webapp/dist/assets/{chunk-WL4C6EOR-C2InqFin.js.map → chunk-WL4C6EOR-Dv907NPM.js.map} +1 -1
  81. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BfLZmK48.js → classDiagram-VBA2DB6C-DOTXtxYZ.js} +7 -7
  82. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BfLZmK48.js.map → classDiagram-VBA2DB6C-DOTXtxYZ.js.map} +1 -1
  83. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BfLZmK48.js → classDiagram-v2-RAHNMMFH-DOTXtxYZ.js} +7 -7
  84. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BfLZmK48.js.map → classDiagram-v2-RAHNMMFH-DOTXtxYZ.js.map} +1 -1
  85. package/webapp/dist/assets/{clone-BSCHnHfl.js → clone-6lYQMWpu.js} +2 -2
  86. package/webapp/dist/assets/{clone-BSCHnHfl.js.map → clone-6lYQMWpu.js.map} +1 -1
  87. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CeQ1jAJJ.js → cose-bilkent-S5V4N54A-DoJeDXV0.js} +2 -2
  88. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CeQ1jAJJ.js.map → cose-bilkent-S5V4N54A-DoJeDXV0.js.map} +1 -1
  89. package/webapp/dist/assets/{dagre-KLK3FWXG-WUuNYzcK.js → dagre-KLK3FWXG-F_n_vhV9.js} +7 -7
  90. package/webapp/dist/assets/{dagre-KLK3FWXG-WUuNYzcK.js.map → dagre-KLK3FWXG-F_n_vhV9.js.map} +1 -1
  91. package/webapp/dist/assets/{diagram-E7M64L7V-jOVCIExP.js → diagram-E7M64L7V-Crwhgyjv.js} +8 -8
  92. package/webapp/dist/assets/{diagram-E7M64L7V-jOVCIExP.js.map → diagram-E7M64L7V-Crwhgyjv.js.map} +1 -1
  93. package/webapp/dist/assets/{diagram-IFDJBPK2-cCeQqotA.js → diagram-IFDJBPK2-CIt1nnn5.js} +7 -7
  94. package/webapp/dist/assets/{diagram-IFDJBPK2-cCeQqotA.js.map → diagram-IFDJBPK2-CIt1nnn5.js.map} +1 -1
  95. package/webapp/dist/assets/{diagram-P4PSJMXO-DjAYFRLv.js → diagram-P4PSJMXO-qowipEfV.js} +7 -7
  96. package/webapp/dist/assets/{diagram-P4PSJMXO-DjAYFRLv.js.map → diagram-P4PSJMXO-qowipEfV.js.map} +1 -1
  97. package/webapp/dist/assets/{erDiagram-INFDFZHY-Dl_6U5fV.js → erDiagram-INFDFZHY-DV2BcYNa.js} +5 -5
  98. package/webapp/dist/assets/{erDiagram-INFDFZHY-Dl_6U5fV.js.map → erDiagram-INFDFZHY-DV2BcYNa.js.map} +1 -1
  99. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D80nrZ3S.js → flowDiagram-PKNHOUZH-CAbWV161.js} +7 -7
  100. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D80nrZ3S.js.map → flowDiagram-PKNHOUZH-CAbWV161.js.map} +1 -1
  101. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-T3WdMrgj.js → ganttDiagram-A5KZAMGK-CfdR7FRr.js} +3 -3
  102. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-T3WdMrgj.js.map → ganttDiagram-A5KZAMGK-CfdR7FRr.js.map} +1 -1
  103. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js → gitGraphDiagram-K3NZZRJ6-DuJFTELz.js} +8 -8
  104. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js.map → gitGraphDiagram-K3NZZRJ6-DuJFTELz.js.map} +1 -1
  105. package/webapp/dist/assets/{graph-D5jmnb35.js → graph-cjRyzujT.js} +3 -3
  106. package/webapp/dist/assets/{graph-D5jmnb35.js.map → graph-cjRyzujT.js.map} +1 -1
  107. package/webapp/dist/assets/{index-CGbZlct2.js → index-DgfF56L4.js} +36 -36
  108. package/webapp/dist/assets/{index-CGbZlct2.js.map → index-DgfF56L4.js.map} +1 -1
  109. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-C340CY5x.js → infoDiagram-LFFYTUFH-3wx-7AdD.js} +6 -6
  110. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-C340CY5x.js.map → infoDiagram-LFFYTUFH-3wx-7AdD.js.map} +1 -1
  111. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bu4RsELK.js → ishikawaDiagram-PHBUUO56-g6CMb1Qc.js} +2 -2
  112. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bu4RsELK.js.map → ishikawaDiagram-PHBUUO56-g6CMb1Qc.js.map} +1 -1
  113. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Dvv3ypKA.js → journeyDiagram-4ABVD52K-DdCcmOBO.js} +5 -5
  114. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-Dvv3ypKA.js.map → journeyDiagram-4ABVD52K-DdCcmOBO.js.map} +1 -1
  115. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-D_rsetjW.js → kanban-definition-K7BYSVSG-BFw2emGl.js} +3 -3
  116. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-D_rsetjW.js.map → kanban-definition-K7BYSVSG-BFw2emGl.js.map} +1 -1
  117. package/webapp/dist/assets/{layout-CLmOfwnS.js → layout-Clazq06r.js} +5 -5
  118. package/webapp/dist/assets/{layout-CLmOfwnS.js.map → layout-Clazq06r.js.map} +1 -1
  119. package/webapp/dist/assets/{linear-DFAmViqi.js → linear-jdsBGgvD.js} +2 -2
  120. package/webapp/dist/assets/{linear-DFAmViqi.js.map → linear-jdsBGgvD.js.map} +1 -1
  121. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-Ce3_czeS.js → mindmap-definition-YRQLILUH-DLSZrW6l.js} +4 -4
  122. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-Ce3_czeS.js.map → mindmap-definition-YRQLILUH-DLSZrW6l.js.map} +1 -1
  123. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-U6_un5Sc.js → pieDiagram-SKSYHLDU-Uj-Zpci6.js} +8 -8
  124. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-U6_un5Sc.js.map → pieDiagram-SKSYHLDU-Uj-Zpci6.js.map} +1 -1
  125. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DmVJQItS.js → quadrantDiagram-337W2JSQ-DO7Sl1nV.js} +3 -3
  126. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DmVJQItS.js.map → quadrantDiagram-337W2JSQ-DO7Sl1nV.js.map} +1 -1
  127. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BkNhSY-g.js → requirementDiagram-Z7DCOOCP-WrurrDKQ.js} +4 -4
  128. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-BkNhSY-g.js.map → requirementDiagram-Z7DCOOCP-WrurrDKQ.js.map} +1 -1
  129. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-E3UEy5SX.js → sankeyDiagram-WA2Y5GQK-gcxbxuZB.js} +2 -2
  130. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-E3UEy5SX.js.map → sankeyDiagram-WA2Y5GQK-gcxbxuZB.js.map} +1 -1
  131. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-k0w9WKAO.js → sequenceDiagram-2WXFIKYE-B98U2Npa.js} +4 -4
  132. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-k0w9WKAO.js.map → sequenceDiagram-2WXFIKYE-B98U2Npa.js.map} +1 -1
  133. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DRgdJrlx.js → stateDiagram-RAJIS63D-BUgfHMbd.js} +9 -9
  134. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DRgdJrlx.js.map → stateDiagram-RAJIS63D-BUgfHMbd.js.map} +1 -1
  135. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-edtkX9x6.js → stateDiagram-v2-FVOUBMTO-C8gH0rSW.js} +5 -5
  136. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-edtkX9x6.js.map → stateDiagram-v2-FVOUBMTO-C8gH0rSW.js.map} +1 -1
  137. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D0zyXyNL.js → timeline-definition-YZTLITO2-DnVikX3B.js} +3 -3
  138. package/webapp/dist/assets/{timeline-definition-YZTLITO2-D0zyXyNL.js.map → timeline-definition-YZTLITO2-DnVikX3B.js.map} +1 -1
  139. package/webapp/dist/assets/{treemap-KZPCXAKY-CglsYqbQ.js → treemap-KZPCXAKY-BjhjT1IM.js} +5 -5
  140. package/webapp/dist/assets/{treemap-KZPCXAKY-CglsYqbQ.js.map → treemap-KZPCXAKY-BjhjT1IM.js.map} +1 -1
  141. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DsUizzvt.js → vennDiagram-LZ73GAT5-CXjPMxrl.js} +2 -2
  142. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DsUizzvt.js.map → vennDiagram-LZ73GAT5-CXjPMxrl.js.map} +1 -1
  143. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DvYQ4zKY.js → xychartDiagram-JWTSCODW-ByKmk3Cb.js} +3 -3
  144. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-DvYQ4zKY.js.map → xychartDiagram-JWTSCODW-ByKmk3Cb.js.map} +1 -1
  145. package/webapp/dist/index.html +1 -1
@@ -14,6 +14,9 @@
14
14
  # `500 auth_unavailable: no auth available` infrastructure failures.
15
15
  # `apiQuirks: same-context-empty-response` detects repeated empty responses in the same
16
16
  # dialog generation context and stops same-context retry loops with a deadlock-break prompt.
17
+ # `apiQuirks: volcengine-invalid-parameter-aggressive-retry` classifies Volcano Ark Coding Plan
18
+ # transient `400 InvalidParameter` failures as aggressive retry when the shape matches that
19
+ # provider's replay-successful instability.
17
20
  # - tool_result_max_chars: optional transport-level cap for a single tool-result text payload
18
21
  # before Dominds projects it into the provider request. Use this when a provider/gateway enforces
19
22
  # a stricter per-item string limit than Dominds' built-in defaults.
@@ -484,6 +487,7 @@ providers:
484
487
  models:
485
488
  kimi-for-coding:
486
489
  name: Kimi For Coding
490
+ optimal_max_tokens: 180000
487
491
  supports_thinking: true
488
492
  default_thinking: true
489
493
  supports_tool_choice: false
@@ -497,6 +501,7 @@ providers:
497
501
  apiType: openai-compatible
498
502
  apiQuirks:
499
503
  - same-context-empty-response
504
+ - volcengine-invalid-parameter-aggressive-retry
500
505
  baseUrl: https://ark.cn-beijing.volces.com/api/coding/v3
501
506
  apiKeyEnvVar: ARK_API_KEY
502
507
  tech_spec_url: https://www.volcengine.com/docs/82379/1928261
@@ -603,6 +608,7 @@ providers:
603
608
  context_window: '128K'
604
609
  kimi-k2.6:
605
610
  name: Kimi-K2.6
611
+ optimal_max_tokens: 180000
606
612
  supports_thinking: true
607
613
  default_thinking: true
608
614
  supports_tool_choice: false
@@ -613,6 +619,7 @@ providers:
613
619
  context_window: '200K'
614
620
  kimi-k2.5:
615
621
  name: Kimi-K2.5
622
+ optimal_max_tokens: 180000
616
623
  supports_thinking: true
617
624
  default_thinking: false
618
625
  supports_tool_choice: false
@@ -66,13 +66,11 @@ const log_1 = require("../../log");
66
66
  const reply_prompt_copy_1 = require("../../runtime/reply-prompt-copy");
67
67
  const gen_1 = require("../gen");
68
68
  const stop_reason_i18n_1 = require("../stop-reason-i18n");
69
- const REPLY_TOOL_REMINDER_PREFIXES = [
70
- '[Dominds replyTellask required]',
71
- '[Dominds 必须调用回复工具]',
72
- ];
73
69
  const RUNTIME_PROMPT_WRAPPER_PREFIXES = [
74
70
  reply_prompt_copy_1.ACTIVE_REPLY_TOOL_PREFIX_EN,
75
71
  reply_prompt_copy_1.ACTIVE_REPLY_TOOL_PREFIX_ZH,
72
+ reply_prompt_copy_1.NO_ACTIVE_REPLY_PREFIX_EN,
73
+ reply_prompt_copy_1.NO_ACTIVE_REPLY_PREFIX_ZH,
76
74
  reply_prompt_copy_1.REPLY_REASSERTION_PREFIX_EN,
77
75
  reply_prompt_copy_1.REPLY_REASSERTION_PREFIX_ZH,
78
76
  reply_prompt_copy_1.REPLY_SUPPRESSION_PREFIX_EN,
@@ -277,8 +275,7 @@ class MockGen {
277
275
  return null;
278
276
  }
279
277
  buildReplyToolReminderAutoResponse(input, role, context) {
280
- if (role !== 'user' ||
281
- !REPLY_TOOL_REMINDER_PREFIXES.some((prefix) => input.startsWith(prefix))) {
278
+ if (role !== 'user' || !(0, reply_prompt_copy_1.isReplyToolReminderPromptContent)(input)) {
282
279
  return null;
283
280
  }
284
281
  const toolMatch = input.match(/`(replyTellask(?:Sessionless|Back)?)`/);
@@ -382,10 +379,14 @@ responses:
382
379
  const matched = this.findMatchingResponse(db, content, role, context) ??
383
380
  this.buildReplyToolReminderAutoResponse(content, role, context);
384
381
  await delayWithAbort(matched?.delayMs ?? 0, abortSignal);
385
- await receiver.thinkingStart();
386
- await receiver.thinkingChunk(`[${modelName}] `);
387
- await receiver.thinkingChunk(content.substring(0, 50) || '(empty)');
388
- await receiver.thinkingFinish();
382
+ const thinkingText = matched?.omitDefaultThinking === true
383
+ ? (matched.thinkingResponse ?? '')
384
+ : (matched?.thinkingResponse ?? `[${modelName}] ${content.substring(0, 50) || '(empty)'}`);
385
+ if (thinkingText !== '') {
386
+ await receiver.thinkingStart();
387
+ await receiver.thinkingChunk(thinkingText);
388
+ await receiver.thinkingFinish();
389
+ }
389
390
  if (matched?.streamError) {
390
391
  if (matched.emitStreamErrorBeforeThrow && receiver.streamError) {
391
392
  await receiver.streamError(matched.streamError);
@@ -491,12 +492,17 @@ responses:
491
492
  this.buildReplyToolReminderAutoResponse(content, role, context);
492
493
  await delayWithAbort(matched?.delayMs ?? 0, abortSignal);
493
494
  const responseText = matched?.response ?? this.makeFallbackResponse(dbPath, content, role, modelName);
494
- const thinking = {
495
- type: 'thinking_msg',
496
- role: 'assistant',
497
- genseq,
498
- content: `[${modelName}] ${content.substring(0, 100)}`,
499
- };
495
+ const thinkingText = matched?.omitDefaultThinking === true
496
+ ? (matched.thinkingResponse ?? '')
497
+ : (matched?.thinkingResponse ?? `[${modelName}] ${content.substring(0, 100)}`);
498
+ const thinking = thinkingText === ''
499
+ ? undefined
500
+ : {
501
+ type: 'thinking_msg',
502
+ role: 'assistant',
503
+ genseq,
504
+ content: thinkingText,
505
+ };
500
506
  const saying = matched?.streamError || responseText !== ''
501
507
  ? {
502
508
  type: 'saying_msg',
@@ -570,7 +576,13 @@ responses:
570
576
  };
571
577
  }) ?? [];
572
578
  return {
573
- messages: saying ? [thinking, saying, ...funcMsgs] : [thinking, ...funcMsgs],
579
+ messages: thinking !== undefined
580
+ ? saying
581
+ ? [thinking, saying, ...funcMsgs]
582
+ : [thinking, ...funcMsgs]
583
+ : saying
584
+ ? [saying, ...funcMsgs]
585
+ : [...funcMsgs],
574
586
  usage,
575
587
  llmGenModel: modelName,
576
588
  };
@@ -48,7 +48,6 @@ const OPENAI_COMPATIBLE_REJECTED_REQUEST_ERROR_CODE = 'OPENAI_COMPATIBLE_REJECTE
48
48
  const KIMI_CODE_API_QUIRK = 'kimi-code';
49
49
  const KIMI_CODE_REASONING_EFFORTS = new Set(['low', 'medium', 'high']);
50
50
  const KIMI_CLI_CLOAK_API_QUIRK = 'kimi-cli-cloak';
51
- const KIMI_CLI_USER_AGENT = 'KimiCLI/1.41.0';
52
51
  const DISABLE_ASSISTANT_TOOL_CALL_REASONING_CONTENT_API_QUIRK = 'disable-assistant-tool-call-reasoning-content';
53
52
  const JSON_SCHEMA_COMBINATOR_KEYS = new Set([
54
53
  'anyOf',
@@ -578,7 +577,7 @@ function createOpenAiCompatibleClient(args) {
578
577
  };
579
578
  if (isKimiCliCloakProvider(args.providerConfig)) {
580
579
  options.defaultHeaders = {
581
- 'User-Agent': KIMI_CLI_USER_AGENT,
580
+ 'User-Agent': `KimiCLI/Dominds/${dominds_running_version_1.DOMINDS_RUNNING_VERSION}`,
582
581
  };
583
582
  }
584
583
  else if (isKimiCodeProvider(args.providerConfig)) {
@@ -3,10 +3,7 @@ export type KernelDriverContextHealthDecision = Readonly<{
3
3
  kind: 'proceed';
4
4
  }> | Readonly<{
5
5
  kind: 'continue';
6
- reason: 'caution_soft_remediation' | 'critical_countdown_remediation' | 'critical_force_new_course';
7
- }> | Readonly<{
8
- kind: 'suspend';
9
- reason: 'critical_wait_human';
6
+ reason: 'caution_soft_remediation' | 'critical_countdown_remediation' | 'critical_user_prompt_remediation' | 'critical_force_new_course';
10
7
  }>;
11
8
  export declare const KERNEL_DRIVER_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS = 5;
12
9
  export declare const KERNEL_DRIVER_DEFAULT_CAUTION_REMEDIATION_CADENCE_GENERATIONS = 10;
@@ -18,6 +15,8 @@ export declare function decideKernelDriverContextHealth(args: {
18
15
  dialogKey: string;
19
16
  snapshot?: ContextHealthSnapshot;
20
17
  hadUserPromptThisGen: boolean;
18
+ hadUserPromptInImmediateToolChain?: boolean;
19
+ userPromptCriticalRemediationAlreadyApplied?: boolean;
21
20
  canInjectPromptThisGen: boolean;
22
21
  cautionRemediationCadenceGenerations: number;
23
22
  criticalCountdownRemaining: number;
@@ -111,8 +111,11 @@ function decideKernelDriverContextHealth(args) {
111
111
  if (args.criticalCountdownRemaining <= 0) {
112
112
  return { kind: 'continue', reason: 'critical_force_new_course' };
113
113
  }
114
- return args.hadUserPromptThisGen
115
- ? { kind: 'suspend', reason: 'critical_wait_human' }
114
+ if (args.userPromptCriticalRemediationAlreadyApplied === true) {
115
+ return { kind: 'proceed' };
116
+ }
117
+ return args.hadUserPromptThisGen || args.hadUserPromptInImmediateToolChain === true
118
+ ? { kind: 'continue', reason: 'critical_user_prompt_remediation' }
116
119
  : { kind: 'continue', reason: 'critical_countdown_remediation' };
117
120
  }
118
121
  const _exhaustive = snapshot.level;
@@ -4,19 +4,15 @@ export type DriveBaseContextParts = Readonly<{
4
4
  memories: readonly ChatMessage[];
5
5
  taskDocMsg?: ChatMessage;
6
6
  coursePrefixMsgs: readonly ChatMessage[];
7
- dialogMsgsForContext: readonly ChatMessage[];
8
- }>;
9
- export type DriveEphemeralContextParts = Readonly<{
10
- sideDialogResponseContextMsgs?: readonly ChatMessage[];
11
- runtimeGuideMsgs?: readonly ChatMessage[];
7
+ historicalDialogMsgsForContext: readonly ChatMessage[];
8
+ currentTurnDialogMsgsForContext: readonly ChatMessage[];
12
9
  }>;
13
10
  export type DriveTailContextParts = Readonly<{
14
11
  renderedReminders: readonly ChatMessage[];
12
+ activeReplyObligationContext: readonly ChatMessage[];
13
+ runtimeGuideMsgs: readonly ChatMessage[];
15
14
  }>;
16
- export declare function buildDriveBaseContextMessages(parts: DriveBaseContextParts): ChatMessage[];
17
- export declare function appendDriveEphemeralContext(base: readonly ChatMessage[], parts: DriveEphemeralContextParts): ChatMessage[];
18
15
  export declare function assembleDriveContextMessages(args: {
19
16
  base: DriveBaseContextParts;
20
- ephemeral: DriveEphemeralContextParts;
21
17
  tail: DriveTailContextParts;
22
18
  }): ChatMessage[];
@@ -1,36 +1,16 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.buildDriveBaseContextMessages = buildDriveBaseContextMessages;
4
- exports.appendDriveEphemeralContext = appendDriveEphemeralContext;
5
3
  exports.assembleDriveContextMessages = assembleDriveContextMessages;
6
- function buildDriveBaseContextMessages(parts) {
7
- return [
8
- ...parts.prependedContextMessages,
9
- ...parts.memories,
10
- ...(parts.taskDocMsg ? [parts.taskDocMsg] : []),
11
- ...parts.coursePrefixMsgs,
12
- ...parts.dialogMsgsForContext,
13
- ];
14
- }
15
- function appendDriveEphemeralContext(base, parts) {
16
- const next = [...base];
17
- if (Array.isArray(parts.sideDialogResponseContextMsgs) &&
18
- parts.sideDialogResponseContextMsgs.length > 0) {
19
- next.push(...parts.sideDialogResponseContextMsgs);
20
- }
21
- if (Array.isArray(parts.runtimeGuideMsgs) && parts.runtimeGuideMsgs.length > 0) {
22
- next.push(...parts.runtimeGuideMsgs);
23
- }
24
- return next;
25
- }
26
4
  function assembleDriveContextMessages(args) {
27
- const baseMsgs = [
5
+ return [
28
6
  ...args.base.prependedContextMessages,
29
7
  ...args.base.memories,
30
8
  ...(args.base.taskDocMsg ? [args.base.taskDocMsg] : []),
31
9
  ...args.base.coursePrefixMsgs,
10
+ ...args.base.historicalDialogMsgsForContext,
32
11
  ...args.tail.renderedReminders,
33
- ...args.base.dialogMsgsForContext,
12
+ ...args.tail.activeReplyObligationContext,
13
+ ...args.tail.runtimeGuideMsgs,
14
+ ...args.base.currentTurnDialogMsgsForContext,
34
15
  ];
35
- return appendDriveEphemeralContext(baseMsgs, args.ephemeral);
36
16
  }
@@ -165,7 +165,53 @@ 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 persistence_1.DialogPersistence.persistRuntimeGuide(dlg, content, dlg.activeGenSeq);
209
+ (0, evt_registry_1.postDialogEvent)(dlg, {
210
+ type: 'runtime_guide_evt',
211
+ course: dlg.currentCourse,
212
+ genseq: dlg.activeGenSeq,
213
+ content,
214
+ });
169
215
  }
170
216
  function resolveToolUseRequirement(dlg, policy) {
171
217
  // FBR middle rounds are deliberately isolated from callable tools. Final closure is the opposite:
@@ -804,26 +850,28 @@ async function projectTellaskFuncResultsForContext(args) {
804
850
  messages: projected,
805
851
  };
806
852
  }
853
+ async function buildActiveReplyObligationContext(dlg) {
854
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dlg.id, dlg.status);
855
+ if (activeReplyObligation === undefined)
856
+ return [];
857
+ return [
858
+ {
859
+ type: 'environment_msg',
860
+ role: 'user',
861
+ content: (0, reply_prompt_copy_1.buildActiveReplyObligationContextText)({
862
+ language: (0, work_language_1.getWorkLanguage)(),
863
+ directive: activeReplyObligation,
864
+ }),
865
+ },
866
+ ];
867
+ }
807
868
  async function buildDialogMsgsForContext(dlg) {
808
869
  const rawDialogMsgsForContext = dlg.msgs.filter((m) => !!m);
809
870
  const projected = await projectTellaskFuncResultsForContext({
810
871
  dialog: dlg,
811
872
  dialogMsgsForContext: rawDialogMsgsForContext,
812
873
  });
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) => {
874
+ const businessFiltered = projected.messages.filter((msg) => {
827
875
  return msg.type !== 'tellask_result_msg' || msg.content.trim() !== '';
828
876
  });
829
877
  const sanitized = (0, tool_call_context_1.sanitizeToolContextForProvider)(businessFiltered);
@@ -1252,38 +1300,39 @@ async function preserveDiligenceBudgetAcrossQ4H(dlg) {
1252
1300
  }
1253
1301
  async function maybeContinueWithDiligencePrompt(args) {
1254
1302
  const { dlg, team, suppressDiligencePushForDrive, allowPendingSideDialogs, ignoreBudgetExhaustion, } = args;
1255
- if (!(dlg instanceof dialog_1.MainDialog)) {
1256
- return { kind: 'break' };
1257
- }
1258
1303
  const suspension = await dlg.getSuspensionStatus({
1259
1304
  allowPendingSideDialogs: allowPendingSideDialogs === true,
1260
1305
  });
1261
1306
  if (!suspension.canDrive) {
1262
- if (suspension.q4h) {
1307
+ if (suspension.q4h && dlg instanceof dialog_1.MainDialog) {
1263
1308
  await preserveDiligenceBudgetAcrossQ4H(dlg);
1264
1309
  }
1265
1310
  return { kind: 'break' };
1266
1311
  }
1267
1312
  const prepared = await (0, runtime_1.maybePrepareDiligenceAutoContinuePrompt)({
1268
1313
  dlg,
1269
- isMainDialog: true,
1270
1314
  remainingBudget: dlg.diligencePushRemainingBudget,
1271
1315
  diligencePushMax: resolveMemberDiligencePushMax(team, dlg.agentId),
1272
1316
  suppressDiligencePush: suppressDiligencePushForDrive,
1273
1317
  ignoreBudgetExhaustion,
1274
1318
  });
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') {
1319
+ if (dlg instanceof dialog_1.MainDialog) {
1320
+ dlg.diligencePushRemainingBudget = prepared.nextRemainingBudget;
1321
+ void persistence_1.DialogPersistence.mutateDialogLatest(dlg.id, () => ({
1322
+ kind: 'patch',
1323
+ patch: { diligencePushRemainingBudget: dlg.diligencePushRemainingBudget },
1324
+ }));
1325
+ }
1326
+ if (dlg instanceof dialog_1.MainDialog && prepared.kind !== 'disabled') {
1281
1327
  emitDiligenceBudgetEvent(dlg, {
1282
1328
  maxInjectCount: prepared.maxInjectCount,
1283
1329
  nextRemainingBudget: prepared.nextRemainingBudget,
1284
1330
  });
1285
1331
  }
1286
1332
  if (prepared.kind === 'budget_exhausted') {
1333
+ if (!(dlg instanceof dialog_1.MainDialog)) {
1334
+ throw new Error(`kernel-driver Diligence Push invariant violation: non-main dialog returned budget_exhausted (${dlg.id.valueOf()})`);
1335
+ }
1287
1336
  await (0, runtime_1.suspendForKeepGoingBudgetExhausted)({
1288
1337
  dlg,
1289
1338
  maxInjectCount: prepared.maxInjectCount,
@@ -1333,9 +1382,6 @@ async function maybeContinueWithHealthPromptBeforeDiligence(args) {
1333
1382
  cautionRemediationCadenceGenerations,
1334
1383
  criticalCountdownRemaining,
1335
1384
  });
1336
- if (healthDecision.kind === 'suspend') {
1337
- return { kind: 'health_suspend' };
1338
- }
1339
1385
  if (healthDecision.kind !== 'continue') {
1340
1386
  return { kind: 'no_health_prompt' };
1341
1387
  }
@@ -1389,13 +1435,22 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1389
1435
  const suppressDiligencePushForDrive = driveOptions?.suppressDiligencePush === true && dlg.disableDiligencePush;
1390
1436
  const abortSignal = (0, dialog_display_state_1.getActiveRunSignal)(dlg.id) ?? (0, dialog_display_state_1.createActiveRun)(dlg.id);
1391
1437
  let finalDisplayState;
1438
+ let criticalUserInterjectionRuntimeGuide = driveOptions?.criticalUserInterjectionRuntimeGuide;
1392
1439
  let lastAssistantSayingContent = null;
1393
1440
  let lastAssistantSayingGenseq = null;
1441
+ let lastAssistantThinkingContent = null;
1442
+ let lastAssistantThinkingGenseq = null;
1394
1443
  let lastFunctionCallGenseq = null;
1395
1444
  let lastAssistantReplyTarget;
1396
1445
  let fbrConclusion;
1397
1446
  let pubRemindersVer = dlg.remindersVer;
1398
1447
  let pendingPrompt = humanPrompt;
1448
+ let resolvingImmediateToolResultForUserPrompt = false;
1449
+ let resolvingImmediateToolResultUserPromptMsgId;
1450
+ let criticalRemediationAppliedUserPromptMsgId = driveOptions?.criticalUserInterjectionRuntimeGuide !== undefined &&
1451
+ humanPrompt?.origin === 'user'
1452
+ ? humanPrompt.msgId
1453
+ : undefined;
1399
1454
  let retryStoppedRecoveryPrompt;
1400
1455
  let skipTaskdocForThisDrive = humanPrompt?.skipTaskdoc === true;
1401
1456
  let genIterNo = 0;
@@ -1507,7 +1562,17 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1507
1562
  : canonicalFuncTools;
1508
1563
  const projected = (0, tools_projection_1.projectFuncToolsForProvider)(providerCfg.apiType, effectiveFuncTools);
1509
1564
  const funcTools = projected.tools;
1565
+ const currentPendingPrompt = pendingPrompt;
1566
+ let currentGenerationBelongsToUserPrompt = isUserOriginPrompt(currentPendingPrompt);
1567
+ let currentGenerationBelongsToUserToolChain = false;
1568
+ let currentUserPromptMsgId = getUserOriginPromptMsgId(currentPendingPrompt);
1510
1569
  if (genIterNo > 1) {
1570
+ currentGenerationBelongsToUserToolChain = resolvingImmediateToolResultForUserPrompt;
1571
+ if (currentUserPromptMsgId === undefined) {
1572
+ currentUserPromptMsgId = resolvingImmediateToolResultUserPromptMsgId;
1573
+ }
1574
+ resolvingImmediateToolResultForUserPrompt = false;
1575
+ resolvingImmediateToolResultUserPromptMsgId = undefined;
1511
1576
  const snapshot = dlg.getLastContextHealth();
1512
1577
  const hasQueuedUpNext = dlg.hasUpNext() || pendingPrompt !== undefined;
1513
1578
  const modelInfoForRemediation = resolveModelInfo(providerCfg, model);
@@ -1516,21 +1581,14 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1516
1581
  const healthDecision = (0, context_health_1.decideKernelDriverContextHealth)({
1517
1582
  dialogKey: dlg.id.key(),
1518
1583
  snapshot,
1519
- hadUserPromptThisGen: isUserOriginPrompt(pendingPrompt),
1584
+ hadUserPromptThisGen: currentGenerationBelongsToUserPrompt,
1585
+ hadUserPromptInImmediateToolChain: currentGenerationBelongsToUserToolChain,
1586
+ userPromptCriticalRemediationAlreadyApplied: criticalRemediationAppliedUserPromptMsgId !== undefined &&
1587
+ criticalRemediationAppliedUserPromptMsgId === currentUserPromptMsgId,
1520
1588
  canInjectPromptThisGen: !hasQueuedUpNext,
1521
1589
  cautionRemediationCadenceGenerations,
1522
1590
  criticalCountdownRemaining,
1523
1591
  });
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
1592
  if (healthDecision.kind === 'continue') {
1535
1593
  if (healthDecision.reason === 'critical_force_new_course') {
1536
1594
  const language = (0, work_language_1.getWorkLanguage)();
@@ -1548,6 +1606,16 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1548
1606
  pendingPrompt = nextPrompt;
1549
1607
  skipTaskdocForThisDrive = false;
1550
1608
  }
1609
+ else if (healthDecision.reason === 'critical_user_prompt_remediation') {
1610
+ const language = (0, work_language_1.getWorkLanguage)();
1611
+ const dialogScope = dlg instanceof dialog_1.SideDialog ? 'sideDialog' : 'mainDialog';
1612
+ criticalUserInterjectionRuntimeGuide =
1613
+ (0, driver_messages_1.formatAgentFacingCriticalUserInterjectionRemediationGuide)(language, {
1614
+ dialogScope,
1615
+ promptsRemainingAfterThis: (0, context_health_1.consumeCriticalCountdown)(dlg.id.key()),
1616
+ });
1617
+ criticalRemediationAppliedUserPromptMsgId = currentUserPromptMsgId;
1618
+ }
1551
1619
  else if (!hasQueuedUpNext) {
1552
1620
  const language = (0, work_language_1.getWorkLanguage)();
1553
1621
  const dialogScope = dlg instanceof dialog_1.SideDialog ? 'sideDialog' : 'mainDialog';
@@ -1586,6 +1654,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1586
1654
  pendingPrompt = undefined;
1587
1655
  await dlg.notifyGeneratingStart(currentPrompt?.msgId);
1588
1656
  try {
1657
+ if (criticalUserInterjectionRuntimeGuide !== undefined) {
1658
+ await persistAndEmitRuntimeGuide(dlg, criticalUserInterjectionRuntimeGuide);
1659
+ criticalUserInterjectionRuntimeGuide = undefined;
1660
+ }
1589
1661
  if (currentPrompt) {
1590
1662
  const origin = currentPrompt.origin;
1591
1663
  if (origin === 'diligence_push' &&
@@ -1665,14 +1737,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1665
1737
  const renderPromptAsRuntimeGuideBubble = origin === 'runtime' &&
1666
1738
  (0, reply_prompt_copy_1.isStandaloneRuntimeGuidePromptContent)(replyGuidance.promptContent);
1667
1739
  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
- });
1740
+ await persistAndEmitRuntimeGuide(dlg, currentRuntimeGuideMsg.content);
1676
1741
  currentRuntimeGuideMsg = undefined;
1677
1742
  }
1678
1743
  if (isQ4HAnswerPrompt) {
@@ -1796,13 +1861,18 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1796
1861
  : undefined;
1797
1862
  const renderedReminders = await renderRemindersForContext(dlg);
1798
1863
  const dialogMsgsForContext = await buildDialogMsgsForContext(dlg);
1864
+ const activeReplyObligationContext = await buildActiveReplyObligationContext(dlg);
1865
+ const splitDialogMsgs = splitDialogMsgsForReminderInsertion({
1866
+ msgs: dialogMsgsForContext,
1867
+ currentPrompt,
1868
+ });
1799
1869
  const reminderContextBlock = renderedReminders.length > 0
1800
1870
  ? [
1801
1871
  ...renderedReminders,
1802
1872
  {
1803
1873
  type: 'environment_msg',
1804
1874
  role: 'user',
1805
- content: (0, driver_messages_1.formatReminderContextFooter)((0, work_language_1.getWorkLanguage)()),
1875
+ content: (0, driver_messages_1.formatReminderContextFooter)((0, work_language_1.getWorkLanguage)(), resolveReminderContextFollowingDialogState(currentPrompt, splitDialogMsgs.currentTurnDialogMsgsForContext)),
1806
1876
  },
1807
1877
  ]
1808
1878
  : renderedReminders;
@@ -1812,12 +1882,14 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1812
1882
  memories: minds.memories,
1813
1883
  taskDocMsg,
1814
1884
  coursePrefixMsgs: dlg.getCoursePrefixMsgs(),
1815
- dialogMsgsForContext,
1885
+ historicalDialogMsgsForContext: splitDialogMsgs.historicalDialogMsgsForContext,
1886
+ currentTurnDialogMsgsForContext: splitDialogMsgs.currentTurnDialogMsgsForContext,
1816
1887
  },
1817
- ephemeral: {
1818
- runtimeGuideMsgs: currentRuntimeGuideMsg ? [currentRuntimeGuideMsg] : undefined,
1888
+ tail: {
1889
+ renderedReminders: reminderContextBlock,
1890
+ activeReplyObligationContext,
1891
+ runtimeGuideMsgs: currentRuntimeGuideMsg ? [currentRuntimeGuideMsg] : [],
1819
1892
  },
1820
- tail: { renderedReminders: reminderContextBlock },
1821
1893
  });
1822
1894
  const newMsgs = [];
1823
1895
  const streamedFuncCalls = [];
@@ -1906,6 +1978,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1906
1978
  let streamAttemptCheckpointOffset;
1907
1979
  let streamAttemptSayingContent;
1908
1980
  let streamAttemptSayingGenseq;
1981
+ let streamAttemptThinkingContent;
1982
+ let streamAttemptThinkingGenseq;
1909
1983
  let streamActive = { kind: 'idle' };
1910
1984
  const rollbackStreamAttempt = async () => {
1911
1985
  if (streamAttemptCourse === undefined ||
@@ -1925,6 +1999,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1925
1999
  currentSayingContent = '';
1926
2000
  streamAttemptSayingContent = undefined;
1927
2001
  streamAttemptSayingGenseq = undefined;
2002
+ streamAttemptThinkingContent = undefined;
2003
+ streamAttemptThinkingGenseq = undefined;
1928
2004
  sawWebSearchSideChannelOutput = false;
1929
2005
  sawNativeToolSideChannelOutput = false;
1930
2006
  streamedFuncCalls.length = 0;
@@ -1975,13 +2051,16 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1975
2051
  currentThinkingReasoning = reasoning;
1976
2052
  await dlg.thinkingFinish(reasoning);
1977
2053
  if (currentThinkingContent.length > 0 || currentThinkingReasoning !== undefined) {
1978
- newMsgs.push({
2054
+ const thinkingMessage = {
1979
2055
  type: 'thinking_msg',
1980
2056
  role: 'assistant',
1981
2057
  genseq: dlg.activeGenSeq,
1982
2058
  content: currentThinkingContent,
1983
2059
  reasoning: currentThinkingReasoning,
1984
- });
2060
+ };
2061
+ newMsgs.push(thinkingMessage);
2062
+ streamAttemptThinkingContent = currentThinkingContent;
2063
+ streamAttemptThinkingGenseq = thinkingMessage.genseq;
1985
2064
  }
1986
2065
  currentThinkingContent = '';
1987
2066
  currentThinkingReasoning = undefined;
@@ -2093,6 +2172,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2093
2172
  currentSayingContent = '';
2094
2173
  streamAttemptSayingContent = undefined;
2095
2174
  streamAttemptSayingGenseq = undefined;
2175
+ streamAttemptThinkingContent = undefined;
2176
+ streamAttemptThinkingGenseq = undefined;
2096
2177
  sawWebSearchSideChannelOutput = false;
2097
2178
  sawNativeToolSideChannelOutput = false;
2098
2179
  streamedFuncCalls.length = 0;
@@ -2128,6 +2209,14 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2128
2209
  streamAttemptSayingGenseq === undefined ? null : streamAttemptSayingGenseq;
2129
2210
  lastAssistantReplyTarget = currentReplyTarget;
2130
2211
  }
2212
+ if (streamAttemptThinkingContent !== undefined) {
2213
+ lastAssistantThinkingContent = streamAttemptThinkingContent;
2214
+ lastAssistantThinkingGenseq =
2215
+ streamAttemptThinkingGenseq === undefined ? null : streamAttemptThinkingGenseq;
2216
+ if (streamAttemptSayingContent === undefined) {
2217
+ lastAssistantReplyTarget = currentReplyTarget;
2218
+ }
2219
+ }
2131
2220
  return { usage: res.usage, llmGenModel: res.llmGenModel };
2132
2221
  };
2133
2222
  const llmOutput = await streamOrBatch();
@@ -2152,6 +2241,9 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2152
2241
  if (msg.type === 'thinking_msg' || msg.type === 'saying_msg') {
2153
2242
  newMsgs.push(msg);
2154
2243
  if (msg.type === 'thinking_msg') {
2244
+ lastAssistantThinkingContent = msg.content;
2245
+ lastAssistantThinkingGenseq = msg.genseq;
2246
+ lastAssistantReplyTarget = currentReplyTarget;
2155
2247
  await (0, events_1.emitThinkingEvents)(dlg, msg.content, msg.reasoning);
2156
2248
  }
2157
2249
  else {
@@ -2225,6 +2317,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2225
2317
  return {
2226
2318
  lastAssistantSayingContent,
2227
2319
  lastAssistantSayingGenseq,
2320
+ lastAssistantThinkingContent,
2321
+ lastAssistantThinkingGenseq,
2228
2322
  lastFunctionCallGenseq,
2229
2323
  lastAssistantReplyTarget,
2230
2324
  };
@@ -2388,9 +2482,6 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2388
2482
  }
2389
2483
  continue;
2390
2484
  }
2391
- if (healthFirst.kind === 'health_suspend') {
2392
- break;
2393
- }
2394
2485
  const next = await maybeContinueWithDiligencePrompt({
2395
2486
  dlg,
2396
2487
  team,
@@ -2403,6 +2494,13 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2403
2494
  break;
2404
2495
  }
2405
2496
  if (shouldStartImmediatePostToolGeneration) {
2497
+ resolvingImmediateToolResultForUserPrompt =
2498
+ currentGenerationBelongsToUserPrompt ||
2499
+ currentGenerationBelongsToUserToolChain ||
2500
+ isUserOriginPrompt(currentPrompt);
2501
+ resolvingImmediateToolResultUserPromptMsgId = resolvingImmediateToolResultForUserPrompt
2502
+ ? currentUserPromptMsgId
2503
+ : undefined;
2406
2504
  continue;
2407
2505
  }
2408
2506
  }
@@ -2543,6 +2641,8 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
2543
2641
  return {
2544
2642
  lastAssistantSayingContent,
2545
2643
  lastAssistantSayingGenseq,
2644
+ lastAssistantThinkingContent,
2645
+ lastAssistantThinkingGenseq,
2546
2646
  lastFunctionCallGenseq,
2547
2647
  lastAssistantReplyTarget,
2548
2648
  fbrConclusion,