dominds 0.7.1 → 0.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (120) hide show
  1. package/dist/dialog-global-registry.js +58 -3
  2. package/dist/dialog.js +17 -0
  3. package/dist/docs/dialog-system.md +18 -16
  4. package/dist/docs/dialog-system.zh.md +20 -19
  5. package/dist/evt-registry.js +16 -7
  6. package/dist/llm/driver-v2/context.js +2 -1
  7. package/dist/llm/driver-v2/core.js +102 -119
  8. package/dist/llm/driver-v2/orchestrator.js +65 -38
  9. package/dist/llm/driver-v2/round.js +213 -35
  10. package/dist/llm/driver-v2/runtime-utils.js +1 -0
  11. package/dist/llm/driver-v2/supdialog-response.js +5 -18
  12. package/dist/llm/driver-v2/tellask-bridge.js +95 -6
  13. package/dist/llm/driver.js +29 -2
  14. package/dist/minds/builtin/cmdr/persona.md +3 -0
  15. package/dist/minds/builtin/dijiang/knowledge.md +287 -0
  16. package/dist/minds/builtin/dijiang/persona.md +7 -0
  17. package/dist/persistence.js +28 -0
  18. package/dist/server/websocket-handler.js +134 -25
  19. package/dist/shared/diligence.js +8 -2
  20. package/dist/showing-by-doing.js +31 -34
  21. package/dist/static/assets/{_baseUniq-BxKNVs_E.js → _baseUniq-zV3pyJ-s.js} +2 -2
  22. package/dist/static/assets/{_baseUniq-BxKNVs_E.js.map → _baseUniq-zV3pyJ-s.js.map} +1 -1
  23. package/dist/static/assets/{arc-SobL0GO-.js → arc-Ctgmrh71.js} +2 -2
  24. package/dist/static/assets/{arc-SobL0GO-.js.map → arc-Ctgmrh71.js.map} +1 -1
  25. package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js → architectureDiagram-VXUJARFQ-CAH1Zinn.js} +6 -6
  26. package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js.map → architectureDiagram-VXUJARFQ-CAH1Zinn.js.map} +1 -1
  27. package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js → blockDiagram-VD42YOAC-Djz6JdD2.js} +7 -7
  28. package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js.map → blockDiagram-VD42YOAC-Djz6JdD2.js.map} +1 -1
  29. package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js → c4Diagram-YG6GDRKO-CSuskOyq.js} +3 -3
  30. package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js.map → c4Diagram-YG6GDRKO-CSuskOyq.js.map} +1 -1
  31. package/dist/static/assets/{channel-CNJ5IKbI.js → channel-Ym6U59Kh.js} +2 -2
  32. package/dist/static/assets/{channel-CNJ5IKbI.js.map → channel-Ym6U59Kh.js.map} +1 -1
  33. package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js → chunk-4BX2VUAB-CqbVylSz.js} +2 -2
  34. package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js.map → chunk-4BX2VUAB-CqbVylSz.js.map} +1 -1
  35. package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js → chunk-55IACEB6-CeWj8Jm_.js} +2 -2
  36. package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js.map → chunk-55IACEB6-CeWj8Jm_.js.map} +1 -1
  37. package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js → chunk-B4BG7PRW-BjxJkuhq.js} +5 -5
  38. package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js.map → chunk-B4BG7PRW-BjxJkuhq.js.map} +1 -1
  39. package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js → chunk-DI55MBZ5-9kxfXB4B.js} +4 -4
  40. package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js.map → chunk-DI55MBZ5-9kxfXB4B.js.map} +1 -1
  41. package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js → chunk-FMBD7UC4-DyM3IVWB.js} +2 -2
  42. package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js.map → chunk-FMBD7UC4-DyM3IVWB.js.map} +1 -1
  43. package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js → chunk-QN33PNHL-DGU21aEB.js} +2 -2
  44. package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js.map → chunk-QN33PNHL-DGU21aEB.js.map} +1 -1
  45. package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js → chunk-QZHKN3VN-Cw9Hpt-y.js} +2 -2
  46. package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js.map → chunk-QZHKN3VN-Cw9Hpt-y.js.map} +1 -1
  47. package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js → chunk-TZMSLE5B-J-eTCnFj.js} +2 -2
  48. package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js.map → chunk-TZMSLE5B-J-eTCnFj.js.map} +1 -1
  49. package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js → classDiagram-2ON5EDUG-BvoDAd8E.js} +6 -6
  50. package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js.map → classDiagram-2ON5EDUG-BvoDAd8E.js.map} +1 -1
  51. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js → classDiagram-v2-WZHVMYZB-BvoDAd8E.js} +6 -6
  52. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js.map → classDiagram-v2-WZHVMYZB-BvoDAd8E.js.map} +1 -1
  53. package/dist/static/assets/{clone-CfBpi3MU.js → clone-CojsCkky.js} +2 -2
  54. package/dist/static/assets/{clone-CfBpi3MU.js.map → clone-CojsCkky.js.map} +1 -1
  55. package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js → cose-bilkent-S5V4N54A-BEtK3OcG.js} +2 -2
  56. package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js.map → cose-bilkent-S5V4N54A-BEtK3OcG.js.map} +1 -1
  57. package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js → dagre-6UL2VRFP-C5DMaVj0.js} +7 -7
  58. package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js.map → dagre-6UL2VRFP-C5DMaVj0.js.map} +1 -1
  59. package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js → diagram-PSM6KHXK-kVP0dZ6K.js} +7 -7
  60. package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js.map → diagram-PSM6KHXK-kVP0dZ6K.js.map} +1 -1
  61. package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js → diagram-QEK2KX5R-C4p2yibe.js} +6 -6
  62. package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js.map → diagram-QEK2KX5R-C4p2yibe.js.map} +1 -1
  63. package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js → diagram-S2PKOQOG-B3vObsYY.js} +6 -6
  64. package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js.map → diagram-S2PKOQOG-B3vObsYY.js.map} +1 -1
  65. package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js → erDiagram-Q2GNP2WA-AKQItpVu.js} +5 -5
  66. package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js.map → erDiagram-Q2GNP2WA-AKQItpVu.js.map} +1 -1
  67. package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js → flowDiagram-NV44I4VS-2dalJoL3.js} +6 -6
  68. package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js.map → flowDiagram-NV44I4VS-2dalJoL3.js.map} +1 -1
  69. package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js → ganttDiagram-JELNMOA3-DUw98Lbz.js} +3 -3
  70. package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js.map → ganttDiagram-JELNMOA3-DUw98Lbz.js.map} +1 -1
  71. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js → gitGraphDiagram-NY62KEGX-DdwIFk8M.js} +7 -7
  72. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js.map → gitGraphDiagram-NY62KEGX-DdwIFk8M.js.map} +1 -1
  73. package/dist/static/assets/{graph-K6mmQESm.js → graph-BBEAP9Z9.js} +3 -3
  74. package/dist/static/assets/{graph-K6mmQESm.js.map → graph-BBEAP9Z9.js.map} +1 -1
  75. package/dist/static/assets/{index-RV1MEt3b.js → index-CqMOe9zt.js} +195 -114
  76. package/dist/static/assets/index-CqMOe9zt.js.map +1 -0
  77. package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js → infoDiagram-WHAUD3N6-Cep11ST9.js} +5 -5
  78. package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js.map → infoDiagram-WHAUD3N6-Cep11ST9.js.map} +1 -1
  79. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js} +5 -5
  80. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js.map → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js.map} +1 -1
  81. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js → kanban-definition-3W4ZIXB7-DhxNBORX.js} +3 -3
  82. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js.map → kanban-definition-3W4ZIXB7-DhxNBORX.js.map} +1 -1
  83. package/dist/static/assets/{layout-BcrPlYah.js → layout-Ckbr6Zyz.js} +5 -5
  84. package/dist/static/assets/{layout-BcrPlYah.js.map → layout-Ckbr6Zyz.js.map} +1 -1
  85. package/dist/static/assets/{linear-DYXbzldi.js → linear-BrSsI51I.js} +2 -2
  86. package/dist/static/assets/{linear-DYXbzldi.js.map → linear-BrSsI51I.js.map} +1 -1
  87. package/dist/static/assets/{min-CAfJrdkg.js → min-CeEvLc8D.js} +3 -3
  88. package/dist/static/assets/{min-CAfJrdkg.js.map → min-CeEvLc8D.js.map} +1 -1
  89. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js → mindmap-definition-VGOIOE7T-7ctLd3o3.js} +4 -4
  90. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js.map → mindmap-definition-VGOIOE7T-7ctLd3o3.js.map} +1 -1
  91. package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js → pieDiagram-ADFJNKIX-CqyILziW.js} +7 -7
  92. package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js.map → pieDiagram-ADFJNKIX-CqyILziW.js.map} +1 -1
  93. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js → quadrantDiagram-AYHSOK5B-Byi_xYum.js} +3 -3
  94. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js.map → quadrantDiagram-AYHSOK5B-Byi_xYum.js.map} +1 -1
  95. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js} +4 -4
  96. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js.map → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js.map} +1 -1
  97. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js → sankeyDiagram-TZEHDZUN-DzoUAdfa.js} +2 -2
  98. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js.map → sankeyDiagram-TZEHDZUN-DzoUAdfa.js.map} +1 -1
  99. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js → sequenceDiagram-WL72ISMW-BKKxpG1m.js} +4 -4
  100. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js.map → sequenceDiagram-WL72ISMW-BKKxpG1m.js.map} +1 -1
  101. package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js → stateDiagram-FKZM4ZOC-B-J7uRZT.js} +9 -9
  102. package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js.map → stateDiagram-FKZM4ZOC-B-J7uRZT.js.map} +1 -1
  103. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js → stateDiagram-v2-4FDKWEC3-BOzmoUba.js} +5 -5
  104. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js.map → stateDiagram-v2-4FDKWEC3-BOzmoUba.js.map} +1 -1
  105. package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js → timeline-definition-IT6M3QCI-zu1Rojx9.js} +3 -3
  106. package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js.map → timeline-definition-IT6M3QCI-zu1Rojx9.js.map} +1 -1
  107. package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js → treemap-KMMF4GRG-C4D91awC.js} +4 -4
  108. package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js.map → treemap-KMMF4GRG-C4D91awC.js.map} +1 -1
  109. package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js → xychartDiagram-PRI3JC2R-YvLKaPZ-.js} +3 -3
  110. package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js.map → xychartDiagram-PRI3JC2R-YvLKaPZ-.js.map} +1 -1
  111. package/dist/static/index.html +1 -1
  112. package/dist/tools/context-health.js +7 -7
  113. package/dist/utils/task-doc.js +16 -16
  114. package/package.json +1 -1
  115. package/dist/docs/keep-going.zh.md +0 -162
  116. package/dist/docs/showing-by-doing.md +0 -208
  117. package/dist/docs/showing-by-doing.zh.md +0 -177
  118. package/dist/minds/promptdocs.js +0 -263
  119. package/dist/snippets/README.en.md +0 -3
  120. package/dist/static/assets/index-RV1MEt3b.js.map +0 -1
@@ -2,9 +2,12 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.globalDialogRegistry = void 0;
4
4
  const persistence_1 = require("./persistence");
5
+ const evt_1 = require("./shared/evt");
5
6
  class GlobalDialogRegistry {
6
7
  constructor() {
7
8
  this.entries = new Map();
9
+ this.driveTriggerPubChan = (0, evt_1.createPubChan)();
10
+ this.driveTriggerSubChan = (0, evt_1.createSubChan)(this.driveTriggerPubChan);
8
11
  }
9
12
  static getInstance() {
10
13
  if (!GlobalDialogRegistry.instance) {
@@ -30,7 +33,10 @@ class GlobalDialogRegistry {
30
33
  try {
31
34
  const needsDrive = await persistence_1.DialogPersistence.getNeedsDrive(rootDialog.id);
32
35
  if (needsDrive) {
33
- this.markNeedsDrive(rootDialog.id.rootId);
36
+ this.markNeedsDrive(rootDialog.id.rootId, {
37
+ source: 'dialog_registry_hydration',
38
+ reason: 'persisted_needs_drive_true',
39
+ });
34
40
  }
35
41
  }
36
42
  catch {
@@ -41,17 +47,66 @@ class GlobalDialogRegistry {
41
47
  unregister(rootId) {
42
48
  this.entries.delete(rootId);
43
49
  }
44
- markNeedsDrive(rootId) {
50
+ publishDriveTrigger(args) {
51
+ this.driveTriggerPubChan.write({
52
+ type: 'drive_trigger_evt',
53
+ action: args.action,
54
+ rootId: args.rootId,
55
+ entryFound: args.entryFound,
56
+ previousNeedsDrive: args.previousNeedsDrive,
57
+ nextNeedsDrive: args.nextNeedsDrive,
58
+ source: args.meta.source,
59
+ reason: args.meta.reason,
60
+ emittedAtMs: Date.now(),
61
+ });
62
+ }
63
+ async waitForDriveTrigger() {
64
+ for (;;) {
65
+ const trigger = await this.driveTriggerSubChan.read();
66
+ if (trigger !== evt_1.EndOfStream) {
67
+ return trigger;
68
+ }
69
+ // Recreate subscription if EOS is ever observed (should not happen in normal runtime).
70
+ this.driveTriggerSubChan = (0, evt_1.createSubChan)(this.driveTriggerPubChan);
71
+ }
72
+ }
73
+ markNeedsDrive(rootId, meta) {
74
+ const triggerMeta = meta ?? {
75
+ source: 'unknown',
76
+ reason: 'unspecified',
77
+ };
45
78
  const entry = this.entries.get(rootId);
79
+ const previousNeedsDrive = entry ? entry.needsDrive : null;
46
80
  if (entry) {
47
81
  entry.needsDrive = true;
48
82
  }
83
+ this.publishDriveTrigger({
84
+ action: 'mark_needs_drive',
85
+ rootId,
86
+ entryFound: entry !== undefined,
87
+ previousNeedsDrive,
88
+ nextNeedsDrive: true,
89
+ meta: triggerMeta,
90
+ });
49
91
  }
50
- markNotNeedingDrive(rootId) {
92
+ markNotNeedingDrive(rootId, meta) {
93
+ const triggerMeta = meta ?? {
94
+ source: 'unknown',
95
+ reason: 'unspecified',
96
+ };
51
97
  const entry = this.entries.get(rootId);
98
+ const previousNeedsDrive = entry ? entry.needsDrive : null;
52
99
  if (entry) {
53
100
  entry.needsDrive = false;
54
101
  }
102
+ this.publishDriveTrigger({
103
+ action: 'mark_not_needing_drive',
104
+ rootId,
105
+ entryFound: entry !== undefined,
106
+ previousNeedsDrive,
107
+ nextNeedsDrive: false,
108
+ meta: triggerMeta,
109
+ });
55
110
  }
56
111
  getDialogsNeedingDrive() {
57
112
  return Array.from(this.entries.values())
package/dist/dialog.js CHANGED
@@ -502,9 +502,26 @@ class Dialog {
502
502
  this._upNext = {
503
503
  prompt: trimmed,
504
504
  msgId: (0, id_1.generateShortId)(),
505
+ grammar: 'markdown',
505
506
  userLanguageCode: this._lastUserLanguageCode,
506
507
  };
507
508
  }
509
+ queueUpNextPrompt(options) {
510
+ if (this._upNext !== undefined) {
511
+ throw new Error(`UpNext prompt overwrite violation: dialog=${this.id.valueOf()} existingMsgId=${this._upNext.msgId} incomingMsgId=${options.msgId}`);
512
+ }
513
+ const trimmed = options.prompt.trim();
514
+ if (!trimmed) {
515
+ throw new Error('Prompt is required to queue upNext');
516
+ }
517
+ this._upNext = {
518
+ prompt: trimmed,
519
+ msgId: options.msgId,
520
+ grammar: options.grammar,
521
+ userLanguageCode: options.userLanguageCode ?? this._lastUserLanguageCode,
522
+ };
523
+ this._updatedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
524
+ }
508
525
  hasUpNext() {
509
526
  return this._upNext !== undefined;
510
527
  }
@@ -60,7 +60,8 @@ A **subdlg.yaml** file indexes pending subdialogs that a supdialog is waiting fo
60
60
 
61
61
  ### Subdialog Registry
62
62
 
63
- The **subdialog registry** is a root dialog-scoped Map that maintains persistent references to registered subdialogs. The registry uses `agentId!tellaskSession` as its key format and is never deleted during the dialog lifecycle. It moves with the root to `done/` when the root completes, and is rebuilt on root load by scanning done/ subdialog YAMLs.
63
+ The **subdialog registry** is a root dialog-scoped Map that maintains persistent references to registered subdialogs. The registry uses `agentId!tellaskSession` as its key format. It moves with the root to `done/` when the root completes, and is rebuilt on root load by scanning done/ subdialog YAMLs.
64
+ If a sideline dialog is declared dead, its Type B registry entry is removed so the same `agentId!tellaskSession` can start a brand-new sideline dialog on the next Tellask.
64
65
 
65
66
  ### Teammate Tellask
66
67
 
@@ -367,6 +368,7 @@ flowchart TD
367
368
  7. **State Preservation Contract**:
368
369
  - `clear_mind`: Clears messages, clears Q4H index, preserves reminders, preserves registry
369
370
  - Subdialog completion: Writes response to supdialog, removes from pending list (registry unchanged)
371
+ - Subdialog declared dead: marks runState dead and removes its Type B registry entry; same slug can be reused as a fresh sideline dialog
370
372
  - Q4H answer: Clears the answered question from index, continues the dialog
371
373
 
372
374
  ---
@@ -770,14 +772,14 @@ The **subdialog registry** is a root-dialog-scoped data structure that maintains
770
772
 
771
773
  ### Key Characteristics
772
774
 
773
- | Aspect | Description |
774
- | --------------- | ------------------------------------------------------ |
775
- | **Scope** | Root dialog only (not accessible to subdialogs) |
776
- | **Key Format** | `agentId!tellaskSession` (single-level Map) |
777
- | **Storage** | `registry.yaml` in root dialog directory |
778
- | **Lifecycle** | Never deleted during dialog lifetime |
779
- | **Persistence** | Moves with root to `done/` when root completes |
780
- | **Restoration** | Rebuilt on root load by scanning done/ subdialog YAMLs |
775
+ | Aspect | Description |
776
+ | --------------- | --------------------------------------------------------------- |
777
+ | **Scope** | Root dialog only (not accessible to subdialogs) |
778
+ | **Key Format** | `agentId!tellaskSession` (single-level Map) |
779
+ | **Storage** | `registry.yaml` in root dialog directory |
780
+ | **Lifecycle** | Retained during normal runs; dead subdialog entries are removed |
781
+ | **Persistence** | Moves with root to `done/` when root completes |
782
+ | **Restoration** | Rebuilt on root load by scanning done/ subdialog YAMLs |
781
783
 
782
784
  ### Registry Operations
783
785
 
@@ -1310,13 +1312,13 @@ The Dominds dialog system provides a robust framework for hierarchical, human-in
1310
1312
 
1311
1313
  ### Four Core Mechanisms
1312
1314
 
1313
- | Mechanism | Purpose | Survives Clarity | Cleared By |
1314
- | ---------------------- | ----------------------------- | ---------------- | ------------- |
1315
- | **Dialog Hierarchy** | Parent-child task delegation | N/A | N/A |
1316
- | **Q4H** | Human input requests | No | clear_mind |
1317
- | **Mental Clarity** | Context reset tools | N/A | N/A |
1318
- | **Reminders** | Persistent working memory | Yes | N/A |
1319
- | **Subdialog Registry** | Registered subdialog tracking | Yes | Never deleted |
1315
+ | Mechanism | Purpose | Survives Clarity | Cleared By |
1316
+ | ---------------------- | ----------------------------- | ---------------- | -------------------------------------------- |
1317
+ | **Dialog Hierarchy** | Parent-child task delegation | N/A | N/A |
1318
+ | **Q4H** | Human input requests | No | clear_mind |
1319
+ | **Mental Clarity** | Context reset tools | N/A | N/A |
1320
+ | **Reminders** | Persistent working memory | Yes | N/A |
1321
+ | **Subdialog Registry** | Registered subdialog tracking | Yes | dead-entry prune on `declare_subdialog_dead` |
1320
1322
 
1321
1323
  ### Three Types of Teammate Tellasks
1322
1324
 
@@ -60,7 +60,7 @@
60
60
 
61
61
  ### 子对话注册表
62
62
 
63
- **子对话注册表** 是根对话作用域的 Map,维护对已注册子对话的持久引用。注册表使用 `agentId!tellaskSession` 作为其键格式,在对话生命周期中永远不会被删除。当根完成时,它随根移动到 `done/`,并在根加载时通过扫描 done/ 子对话 YAML 重建。
63
+ **子对话注册表** 是根对话作用域的 Map,维护对已注册子对话的持久引用。注册表使用 `agentId!tellaskSession` 作为其键格式。当根完成时,它随根移动到 `done/`,并在根加载时通过扫描 done/ 子对话 YAML 重建。若某个支线对话被宣布卡死,其对应的 TYPE B 注册表条目会被移除,以便后续可用同一 `agentId!tellaskSession` 创建全新的支线对话。
64
64
 
65
65
  ### 队友 Tellask
66
66
 
@@ -225,7 +225,7 @@ LLM 发出:!?@orchestrator 我应该如何处理数据库迁移?
225
225
 
226
226
  - 每次 Tellask 都会执行注册表查找
227
227
  - 支持**恢复**先前的子对话
228
- - 已注册的子对话在注册表中持久存在直到根完成
228
+ - 已注册的子对话在正常流程中会保留;若支线被宣布卡死,其条目会从注册表移除
229
229
  - 注册表是根对话作用域的(子对话无法访问)
230
230
 
231
231
  **示例**:
@@ -358,6 +358,7 @@ flowchart TD
358
358
  7. **状态保留契约**:
359
359
  - `clear_mind`:清除消息,清除 Q4H 索引,保留提醒,保留注册表
360
360
  - 子对话完成:向父对话写入响应,从待处理列表中删除(注册表不变)
361
+ - 子对话宣布卡死:将 runState 标记为 dead,并移除对应 TYPE B 注册表条目;同一 slug 可作为全新支线重新发起
361
362
  - Q4H 回答:从索引中清除已回答的问题,继续对话
362
363
 
363
364
  ---
@@ -755,14 +756,14 @@ async function checkSubdialogRevival(supdialog: Dialog): Promise<void> {
755
756
 
756
757
  ### 关键特征
757
758
 
758
- | 方面 | 描述 |
759
- | ------------ | ----------------------------------------- |
760
- | **作用域** | 仅限根对话(子对话无法访问) |
761
- | **键格式** | `agentId!tellaskSession`(单级 Map) |
762
- | **存储** | 根对话目录中的 `registry.yaml` |
763
- | **生命周期** | 在对话生命周期中永远不会被删除 |
764
- | **持久化** | 根完成时随根移动到 `done/` |
765
- | **恢复** | 在根加载时通过扫描 done/ 子对话 YAML 重建 |
759
+ | 方面 | 描述 |
760
+ | ------------ | ------------------------------------------ |
761
+ | **作用域** | 仅限根对话(子对话无法访问) |
762
+ | **键格式** | `agentId!tellaskSession`(单级 Map) |
763
+ | **存储** | 根对话目录中的 `registry.yaml` |
764
+ | **生命周期** | 正常流程保留;被宣布卡死的子对话条目会移除 |
765
+ | **持久化** | 根完成时随根移动到 `done/` |
766
+ | **恢复** | 在根加载时通过扫描 done/ 子对话 YAML 重建 |
766
767
 
767
768
  ### 注册表操作
768
769
 
@@ -917,7 +918,7 @@ interface RegistryMethods {
917
918
 
918
919
  **导航**:每个子对话都保持对其父级的引用,向上遍历到主对话。
919
920
 
920
- **注册表**:已注册的子对话(TYPE B Tellask)在根对话的注册表中跟踪,并在重启后持久化。
921
+ **注册表**:已注册的子对话(TYPE B Tellask)在根对话的注册表中跟踪,并在重启后持久化;若子对话被宣布卡死,其条目会被裁剪,不再参与后续同 slug 复用。
921
922
 
922
923
  ### 生命周期管理
923
924
 
@@ -1309,13 +1310,13 @@ Dominds 对话系统为层次化、人在回路的 AI 协作提供了一个强
1309
1310
 
1310
1311
  ### 四个核心机制
1311
1312
 
1312
- | 机制 | 目的 | 存活于清晰度 | 清除方式 |
1313
- | ---------------- | ---------------- | ------------ | ---------- |
1314
- | **对话层次结构** | 父子任务委托 | N/A | N/A |
1315
- | **Q4H** | 人机交互请求 | 否 | clear_mind |
1316
- | **心智清晰度** | 上下文重置工具 | N/A | N/A |
1317
- | **提醒项** | 持久化工作内存 | 是 | N/A |
1318
- | **子对话注册表** | 已注册子对话跟踪 | 是 | 永不删除 |
1313
+ | 机制 | 目的 | 存活于清晰度 | 清除方式 |
1314
+ | ---------------- | ---------------- | ------------ | ----------------------------------------- |
1315
+ | **对话层次结构** | 父子任务委托 | N/A | N/A |
1316
+ | **Q4H** | 人机交互请求 | 否 | clear_mind |
1317
+ | **心智清晰度** | 上下文重置工具 | N/A | N/A |
1318
+ | **提醒项** | 持久化工作内存 | 是 | N/A |
1319
+ | **子对话注册表** | 已注册子对话跟踪 | 是 | `declare_subdialog_dead` 时裁剪 dead 条目 |
1319
1320
 
1320
1321
  ### 三种队友 Tellask 类型
1321
1322
 
@@ -1334,5 +1335,5 @@ Dominds 对话系统为层次化、人在回路的 AI 协作提供了一个强
1334
1335
 
1335
1336
  - **Q4H**:持久化,由清晰度操作清除
1336
1337
  - **提醒项**:持久化,在清晰度操作中存活
1337
- - **注册表**:持久化,在清晰度操作中存活,完成时移至 done/
1338
+ - **注册表**:持久化,在清晰度操作中存活,完成时移至 done/;dead 条目会在宣布卡死时被裁剪
1338
1339
  - **子对话**:已注册的子对话在注册表中持久化;临时子对话不会被注册
@@ -25,13 +25,18 @@ class DialogEventRegistryImpl {
25
25
  setQ4HBroadcaster(fn) {
26
26
  this.q4hBroadcaster = fn;
27
27
  }
28
- broadcastIfQ4H(evt) {
29
- // Only broadcast Q4H events; all other dialog events remain dialog-scoped streams.
28
+ dispatchQ4HGloballyIfNeeded(evt) {
29
+ // Q4H MUST be global-only: emit to all clients via broadcaster and do not
30
+ // also write into dialog-scoped stream, otherwise subscribed clients will
31
+ // receive duplicate deliveries via two independent paths.
30
32
  if (evt.type !== 'new_q4h_asked' && evt.type !== 'q4h_answered')
31
- return;
33
+ return false;
32
34
  const fn = this.q4hBroadcaster;
33
- if (fn)
34
- fn(evt);
35
+ if (!fn) {
36
+ throw new Error(`Q4H broadcaster missing: cannot publish ${evt.type} for dialog=${evt.dialog.selfId}`);
37
+ }
38
+ fn(evt);
39
+ return true;
35
40
  }
36
41
  /**
37
42
  * Get or create a PubChan for a specific dialog ID
@@ -75,13 +80,17 @@ class DialogEventRegistryImpl {
75
80
  */
76
81
  postEvent(dlg, event) {
77
82
  const typedEvent = this.createTypedEvent(dlg.id, event);
78
- this.broadcastIfQ4H(typedEvent);
83
+ if (this.dispatchQ4HGloballyIfNeeded(typedEvent)) {
84
+ return;
85
+ }
79
86
  const chan = this.getPubChan(dlg.id);
80
87
  chan.write(typedEvent);
81
88
  }
82
89
  postEventById(dialogId, event) {
83
90
  const typedEvent = this.createTypedEvent(dialogId, event);
84
- this.broadcastIfQ4H(typedEvent);
91
+ if (this.dispatchQ4HGloballyIfNeeded(typedEvent)) {
92
+ return;
93
+ }
85
94
  const chan = this.getPubChan(dialogId);
86
95
  chan.write(typedEvent);
87
96
  }
@@ -39,7 +39,8 @@ function buildDriveBaseContextMessages(parts) {
39
39
  }
40
40
  function appendDriveEphemeralContext(base, parts) {
41
41
  const next = [...base];
42
- if (parts.subdialogResponseContextMsgs.length > 0) {
42
+ if (Array.isArray(parts.subdialogResponseContextMsgs) &&
43
+ parts.subdialogResponseContextMsgs.length > 0) {
43
44
  next.push(...parts.subdialogResponseContextMsgs);
44
45
  }
45
46
  if (parts.internalDrivePromptMsg) {
@@ -10,7 +10,6 @@ const persistence_1 = require("../../persistence");
10
10
  const diligence_1 = require("../../shared/diligence");
11
11
  const driver_messages_1 = require("../../shared/i18n/driver-messages");
12
12
  const runtime_language_1 = require("../../shared/runtime-language");
13
- const inter_dialog_format_1 = require("../../shared/utils/inter-dialog-format");
14
13
  const tellask_1 = require("../../tellask");
15
14
  const taskdoc_1 = require("../../utils/taskdoc");
16
15
  const client_1 = require("../client");
@@ -20,7 +19,6 @@ const context_1 = require("./context");
20
19
  const policy_1 = require("./policy");
21
20
  const runtime_utils_1 = require("./runtime-utils");
22
21
  const saying_events_1 = require("./saying-events");
23
- const subdialog_txn_1 = require("./subdialog-txn");
24
22
  const tellask_bridge_1 = require("./tellask-bridge");
25
23
  class DialogInterruptedError extends Error {
26
24
  constructor(reason) {
@@ -56,7 +54,7 @@ function resolveUpNextPrompt(dlg) {
56
54
  return {
57
55
  content: upNext.prompt,
58
56
  msgId: upNext.msgId,
59
- grammar: 'markdown',
57
+ grammar: upNext.grammar ?? 'markdown',
60
58
  userLanguageCode: upNext.userLanguageCode,
61
59
  };
62
60
  }
@@ -71,6 +69,93 @@ async function emitUserMarkdown(dlg, content) {
71
69
  function resolveModelInfo(providerCfg, model) {
72
70
  return providerCfg.models[model];
73
71
  }
72
+ function resolveModelContextLimitTokens(modelInfo) {
73
+ if (modelInfo &&
74
+ typeof modelInfo.context_length === 'number' &&
75
+ Number.isFinite(modelInfo.context_length)) {
76
+ const n = Math.floor(modelInfo.context_length);
77
+ return n > 0 ? n : null;
78
+ }
79
+ if (modelInfo &&
80
+ typeof modelInfo.input_length === 'number' &&
81
+ Number.isFinite(modelInfo.input_length)) {
82
+ const n = Math.floor(modelInfo.input_length);
83
+ return n > 0 ? n : null;
84
+ }
85
+ return null;
86
+ }
87
+ function resolveEffectiveOptimalMaxTokens(args) {
88
+ const configuredOptimal = args.modelInfo &&
89
+ typeof args.modelInfo.optimal_max_tokens === 'number' &&
90
+ Number.isFinite(args.modelInfo.optimal_max_tokens)
91
+ ? Math.floor(args.modelInfo.optimal_max_tokens)
92
+ : undefined;
93
+ const optimalMaxTokensConfigured = configuredOptimal !== undefined && configuredOptimal > 0 ? configuredOptimal : undefined;
94
+ const configuredCritical = args.modelInfo &&
95
+ typeof args.modelInfo.critical_max_tokens === 'number' &&
96
+ Number.isFinite(args.modelInfo.critical_max_tokens)
97
+ ? Math.floor(args.modelInfo.critical_max_tokens)
98
+ : undefined;
99
+ const criticalMaxTokensConfigured = configuredCritical !== undefined && configuredCritical > 0 ? configuredCritical : undefined;
100
+ const defaultOptimal = 100000;
101
+ const effectiveOptimalMaxTokens = optimalMaxTokensConfigured !== undefined ? optimalMaxTokensConfigured : defaultOptimal;
102
+ const defaultCritical = Math.max(1, Math.floor(args.modelContextLimitTokens * 0.9));
103
+ const effectiveCriticalMaxTokens = criticalMaxTokensConfigured !== undefined ? criticalMaxTokensConfigured : defaultCritical;
104
+ return {
105
+ effectiveOptimalMaxTokens,
106
+ optimalMaxTokensConfigured,
107
+ effectiveCriticalMaxTokens,
108
+ criticalMaxTokensConfigured,
109
+ };
110
+ }
111
+ function computeContextHealthSnapshot(args) {
112
+ const modelInfo = args.providerCfg.models[args.model];
113
+ const modelContextWindowText = modelInfo && typeof modelInfo.context_window === 'string'
114
+ ? modelInfo.context_window
115
+ : undefined;
116
+ const modelContextLimitTokens = resolveModelContextLimitTokens(modelInfo);
117
+ if (modelContextLimitTokens === null) {
118
+ return { kind: 'unavailable', reason: 'model_limit_unavailable', modelContextWindowText };
119
+ }
120
+ const { effectiveOptimalMaxTokens, optimalMaxTokensConfigured, effectiveCriticalMaxTokens, criticalMaxTokensConfigured, } = resolveEffectiveOptimalMaxTokens({
121
+ modelInfo,
122
+ modelContextLimitTokens,
123
+ });
124
+ if (args.usage.kind !== 'available') {
125
+ return {
126
+ kind: 'unavailable',
127
+ reason: 'usage_unavailable',
128
+ modelContextWindowText,
129
+ modelContextLimitTokens,
130
+ effectiveOptimalMaxTokens,
131
+ optimalMaxTokensConfigured,
132
+ effectiveCriticalMaxTokens,
133
+ criticalMaxTokensConfigured,
134
+ };
135
+ }
136
+ const hardUtil = args.usage.promptTokens / modelContextLimitTokens;
137
+ const optimalUtil = args.usage.promptTokens / effectiveOptimalMaxTokens;
138
+ const level = args.usage.promptTokens > effectiveCriticalMaxTokens
139
+ ? 'critical'
140
+ : args.usage.promptTokens > effectiveOptimalMaxTokens
141
+ ? 'caution'
142
+ : 'healthy';
143
+ return {
144
+ kind: 'available',
145
+ promptTokens: args.usage.promptTokens,
146
+ completionTokens: args.usage.completionTokens,
147
+ totalTokens: args.usage.totalTokens,
148
+ modelContextWindowText,
149
+ modelContextLimitTokens,
150
+ effectiveOptimalMaxTokens,
151
+ optimalMaxTokensConfigured,
152
+ effectiveCriticalMaxTokens,
153
+ criticalMaxTokensConfigured,
154
+ hardUtil,
155
+ optimalUtil,
156
+ level,
157
+ };
158
+ }
74
159
  async function buildProviderContext(args) {
75
160
  const provider = args.agent.provider ?? args.team.memberDefaults.provider;
76
161
  const model = args.agent.model ?? args.team.memberDefaults.model;
@@ -123,21 +208,6 @@ async function buildProviderContext(args) {
123
208
  }
124
209
  return { provider, model, providerCfg };
125
210
  }
126
- async function hasQueuedSubdialogResponses(dialog) {
127
- try {
128
- const queued = await (0, subdialog_txn_1.withSubdialogTxnLock)(dialog.id, async () => {
129
- return await persistence_1.DialogPersistence.loadSubdialogResponsesQueue(dialog.id);
130
- });
131
- return queued.length > 0;
132
- }
133
- catch (err) {
134
- log_1.log.warn('driver-v2 failed to check queued subdialog responses; suppressing diligence as safe default', {
135
- dialogId: dialog.id.valueOf(),
136
- error: err,
137
- });
138
- return true;
139
- }
140
- }
141
211
  async function executeFunctionCalls(args) {
142
212
  const { dialog, agent, agentTools, funcCalls, abortSignal } = args;
143
213
  const functionPromises = funcCalls.map(async (func) => {
@@ -270,13 +340,6 @@ async function maybeContinueWithDiligencePrompt(args) {
270
340
  }
271
341
  return { kind: 'break' };
272
342
  }
273
- const queuedResponses = await hasQueuedSubdialogResponses(dlg);
274
- if (queuedResponses) {
275
- log_1.log.info('driver-v2 skip diligence prompt while subdialog responses remain queued', {
276
- dialogId: dlg.id.valueOf(),
277
- });
278
- return { kind: 'break' };
279
- }
280
343
  const prepared = await (0, runtime_utils_1.maybePrepareDiligenceAutoContinuePrompt)({
281
344
  dlg,
282
345
  isRootDialog: true,
@@ -328,12 +391,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
328
391
  await (0, dialog_run_state_1.setDialogRunState)(dlg.id, { kind: 'proceeding' });
329
392
  let pubRemindersVer = dlg.remindersVer;
330
393
  let lastAssistantSayingContent = null;
331
- let generationHadError = false;
332
- let tookSubdialogResponses = false;
333
- let takenSubdialogResponses = [];
334
- let subdialogResponseContextMsgs = [];
335
394
  let internalDrivePromptMsg;
336
- let committedTakenSubdialogResponses = false;
337
395
  let genIterNo = 0;
338
396
  let pendingPrompt = humanPrompt;
339
397
  let skipTaskdocForThisDrive = humanPrompt?.skipTaskdoc === true;
@@ -372,6 +430,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
372
430
  const funcTools = projected.tools;
373
431
  let suspendForHuman = false;
374
432
  let llmGenModelForGen = model;
433
+ let contextHealthForGen;
375
434
  await dlg.notifyGeneratingStart();
376
435
  try {
377
436
  const currentPrompt = pendingPrompt;
@@ -460,20 +519,6 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
460
519
  await resetDiligenceBudgetAfterQ4H(dlg, team);
461
520
  break;
462
521
  }
463
- if (genIterNo === 1 && !tookSubdialogResponses) {
464
- tookSubdialogResponses = true;
465
- try {
466
- takenSubdialogResponses = await (0, subdialog_txn_1.takeSubdialogResponses)(dlg.id);
467
- }
468
- catch (err) {
469
- log_1.log.warn('driver-v2 failed to take subdialog responses for injection', {
470
- dialogId: dlg.id.selfId,
471
- error: err,
472
- });
473
- generationHadError = true;
474
- takenSubdialogResponses = [];
475
- }
476
- }
477
522
  const taskDocMsg = dlg.taskDocPath && !skipTaskdocForThisDrive ? await (0, taskdoc_1.formatTaskDocContent)(dlg) : undefined;
478
523
  const coursePrefixMsgs = (() => {
479
524
  const msgs = dlg.getCoursePrefixMsgs();
@@ -486,19 +531,6 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
486
531
  return false;
487
532
  return true;
488
533
  });
489
- if (genIterNo === 1 && takenSubdialogResponses.length > 0) {
490
- subdialogResponseContextMsgs = takenSubdialogResponses.map((response) => ({
491
- type: 'environment_msg',
492
- role: 'user',
493
- content: (0, inter_dialog_format_1.formatTeammateResponseContent)({
494
- responderId: response.responderId,
495
- requesterId: response.originMemberId,
496
- originalCallHeadLine: response.tellaskHead,
497
- responseBody: response.response,
498
- language: (0, runtime_language_1.getWorkLanguage)(),
499
- }),
500
- }));
501
- }
502
534
  await dlg.processReminderUpdates();
503
535
  const renderedReminders = dlg.reminders.length > 0
504
536
  ? await Promise.all(dlg.reminders.map(async (reminder, index) => {
@@ -530,7 +562,6 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
530
562
  dialogMsgsForContext,
531
563
  },
532
564
  ephemeral: {
533
- subdialogResponseContextMsgs,
534
565
  internalDrivePromptMsg,
535
566
  },
536
567
  tail: {
@@ -553,6 +584,12 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
553
584
  nonStreamResult.llmGenModel.trim() !== '') {
554
585
  llmGenModelForGen = nonStreamResult.llmGenModel.trim();
555
586
  }
587
+ contextHealthForGen = computeContextHealthSnapshot({
588
+ providerCfg,
589
+ model,
590
+ usage: nonStreamResult.usage,
591
+ });
592
+ dlg.setLastContextHealth(contextHealthForGen);
556
593
  const nonStreamMsgs = nonStreamResult.messages;
557
594
  const assistantMsgs = nonStreamMsgs.filter((m) => m.type === 'saying_msg' || m.type === 'thinking_msg');
558
595
  const collectedAssistantCalls = [];
@@ -802,6 +839,12 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
802
839
  streamResult.llmGenModel.trim() !== '') {
803
840
  llmGenModelForGen = streamResult.llmGenModel.trim();
804
841
  }
842
+ contextHealthForGen = computeContextHealthSnapshot({
843
+ providerCfg,
844
+ model,
845
+ usage: streamResult.usage,
846
+ });
847
+ dlg.setLastContextHealth(contextHealthForGen);
805
848
  const collectedCalls = parser.getCollectedCalls();
806
849
  const policyViolation = (0, policy_1.resolveDriverV2PolicyViolationKind)({
807
850
  policy,
@@ -887,7 +930,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
887
930
  }
888
931
  }
889
932
  finally {
890
- await dlg.notifyGeneratingFinish(undefined, llmGenModelForGen);
933
+ await dlg.notifyGeneratingFinish(contextHealthForGen, llmGenModelForGen);
891
934
  }
892
935
  }
893
936
  finalRunState = await (0, dialog_run_state_1.computeIdleRunState)(dlg);
@@ -905,12 +948,10 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
905
948
  : { kind: 'system_stop', detail: 'Aborted.' }
906
949
  : undefined;
907
950
  if (interruptedReason) {
908
- generationHadError = true;
909
951
  finalRunState = { kind: 'interrupted', reason: interruptedReason };
910
952
  (0, dialog_run_state_1.broadcastRunStateMarker)(dlg.id, { kind: 'interrupted', reason: interruptedReason });
911
953
  return { lastAssistantSayingContent, interrupted: true };
912
954
  }
913
- generationHadError = true;
914
955
  const errText = (0, log_1.extractErrorDetails)(err).message;
915
956
  try {
916
957
  await dlg.streamError(errText);
@@ -953,63 +994,5 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
953
994
  });
954
995
  }
955
996
  await (0, dialog_run_state_1.setDialogRunState)(dlg.id, finalRunState);
956
- if (tookSubdialogResponses) {
957
- try {
958
- if (generationHadError) {
959
- await (0, subdialog_txn_1.rollbackTakenSubdialogResponses)(dlg.id);
960
- }
961
- else {
962
- await (0, subdialog_txn_1.commitTakenSubdialogResponses)(dlg.id);
963
- committedTakenSubdialogResponses = true;
964
- }
965
- }
966
- catch (err2) {
967
- log_1.log.warn('driver-v2 failed to finalize subdialog response queue after drive', {
968
- dialogId: dlg.id.selfId,
969
- error: err2,
970
- });
971
- }
972
- }
973
- if (committedTakenSubdialogResponses && takenSubdialogResponses.length > 0) {
974
- try {
975
- const mirroredMsgs = [];
976
- for (const response of takenSubdialogResponses) {
977
- const content = (0, inter_dialog_format_1.formatTeammateResponseContent)({
978
- responderId: response.responderId,
979
- requesterId: response.originMemberId,
980
- originalCallHeadLine: response.tellaskHead,
981
- responseBody: response.response,
982
- language: (0, runtime_language_1.getWorkLanguage)(),
983
- });
984
- const status = response.status ?? 'completed';
985
- const alreadyMirrored = dlg.msgs.some((msg) => msg.type === 'tellask_result_msg' &&
986
- msg.role === 'tool' &&
987
- msg.responderId === response.responderId &&
988
- msg.tellaskHead === response.tellaskHead &&
989
- msg.status === status &&
990
- msg.content === content);
991
- if (alreadyMirrored) {
992
- continue;
993
- }
994
- mirroredMsgs.push({
995
- type: 'tellask_result_msg',
996
- role: 'tool',
997
- responderId: response.responderId,
998
- tellaskHead: response.tellaskHead,
999
- status,
1000
- content,
1001
- });
1002
- }
1003
- if (mirroredMsgs.length > 0) {
1004
- await dlg.addChatMessages(...mirroredMsgs);
1005
- }
1006
- }
1007
- catch (err) {
1008
- log_1.log.warn('driver-v2 failed to mirror committed subdialog responses into dialog msgs', {
1009
- dialogId: dlg.id.selfId,
1010
- error: err,
1011
- });
1012
- }
1013
- }
1014
997
  }
1015
998
  }