dominds 0.7.4 → 0.7.5

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 (98) hide show
  1. package/dist/dialog-global-registry.js +8 -2
  2. package/dist/llm/driver-v2/context-health.js +55 -0
  3. package/dist/llm/driver-v2/core.js +65 -0
  4. package/dist/llm/driver-v2/orchestrator.js +38 -2
  5. package/dist/llm/driver-v2/round.js +19 -56
  6. package/dist/llm/driver-v2/supdialog-response.js +21 -6
  7. package/dist/static/assets/{_baseUniq-C_6DmNp6.js → _baseUniq-Dv0SNM-n.js} +2 -2
  8. package/dist/static/assets/{_baseUniq-C_6DmNp6.js.map → _baseUniq-Dv0SNM-n.js.map} +1 -1
  9. package/dist/static/assets/{arc-CbWoOhl1.js → arc-nblUuKKs.js} +2 -2
  10. package/dist/static/assets/{arc-CbWoOhl1.js.map → arc-nblUuKKs.js.map} +1 -1
  11. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CTckhB9O.js → architectureDiagram-VXUJARFQ-Q49jOqLH.js} +6 -6
  12. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CTckhB9O.js.map → architectureDiagram-VXUJARFQ-Q49jOqLH.js.map} +1 -1
  13. package/dist/static/assets/{blockDiagram-VD42YOAC-mX558EDN.js → blockDiagram-VD42YOAC-DOz0byeQ.js} +7 -7
  14. package/dist/static/assets/{blockDiagram-VD42YOAC-mX558EDN.js.map → blockDiagram-VD42YOAC-DOz0byeQ.js.map} +1 -1
  15. package/dist/static/assets/{c4Diagram-YG6GDRKO-Bti3To3b.js → c4Diagram-YG6GDRKO-CuE9ekBX.js} +3 -3
  16. package/dist/static/assets/{c4Diagram-YG6GDRKO-Bti3To3b.js.map → c4Diagram-YG6GDRKO-CuE9ekBX.js.map} +1 -1
  17. package/dist/static/assets/{channel-Dxi4rUwG.js → channel-C6JhcfrE.js} +2 -2
  18. package/dist/static/assets/{channel-Dxi4rUwG.js.map → channel-C6JhcfrE.js.map} +1 -1
  19. package/dist/static/assets/{chunk-4BX2VUAB-CAbdAd2-.js → chunk-4BX2VUAB-D9HNI-Q6.js} +2 -2
  20. package/dist/static/assets/{chunk-4BX2VUAB-CAbdAd2-.js.map → chunk-4BX2VUAB-D9HNI-Q6.js.map} +1 -1
  21. package/dist/static/assets/{chunk-55IACEB6-D4r4rpB1.js → chunk-55IACEB6-D_Pczcp6.js} +2 -2
  22. package/dist/static/assets/{chunk-55IACEB6-D4r4rpB1.js.map → chunk-55IACEB6-D_Pczcp6.js.map} +1 -1
  23. package/dist/static/assets/{chunk-B4BG7PRW-sNmEhJCQ.js → chunk-B4BG7PRW-CPzaEhe0.js} +5 -5
  24. package/dist/static/assets/{chunk-B4BG7PRW-sNmEhJCQ.js.map → chunk-B4BG7PRW-CPzaEhe0.js.map} +1 -1
  25. package/dist/static/assets/{chunk-DI55MBZ5-BSutc2-e.js → chunk-DI55MBZ5-CZ3yprSl.js} +4 -4
  26. package/dist/static/assets/{chunk-DI55MBZ5-BSutc2-e.js.map → chunk-DI55MBZ5-CZ3yprSl.js.map} +1 -1
  27. package/dist/static/assets/{chunk-FMBD7UC4-DafIeMhA.js → chunk-FMBD7UC4-DgRX4mC9.js} +2 -2
  28. package/dist/static/assets/{chunk-FMBD7UC4-DafIeMhA.js.map → chunk-FMBD7UC4-DgRX4mC9.js.map} +1 -1
  29. package/dist/static/assets/{chunk-QN33PNHL-1EobqGS_.js → chunk-QN33PNHL-Czn5ZbJU.js} +2 -2
  30. package/dist/static/assets/{chunk-QN33PNHL-1EobqGS_.js.map → chunk-QN33PNHL-Czn5ZbJU.js.map} +1 -1
  31. package/dist/static/assets/{chunk-QZHKN3VN-C4U4YGsG.js → chunk-QZHKN3VN-CNl9lQSy.js} +2 -2
  32. package/dist/static/assets/{chunk-QZHKN3VN-C4U4YGsG.js.map → chunk-QZHKN3VN-CNl9lQSy.js.map} +1 -1
  33. package/dist/static/assets/{chunk-TZMSLE5B-BAuDx0ol.js → chunk-TZMSLE5B-B4SsArOO.js} +2 -2
  34. package/dist/static/assets/{chunk-TZMSLE5B-BAuDx0ol.js.map → chunk-TZMSLE5B-B4SsArOO.js.map} +1 -1
  35. package/dist/static/assets/{classDiagram-2ON5EDUG-B0n34y1v.js → classDiagram-2ON5EDUG-D96Cleku.js} +6 -6
  36. package/dist/static/assets/{classDiagram-2ON5EDUG-B0n34y1v.js.map → classDiagram-2ON5EDUG-D96Cleku.js.map} +1 -1
  37. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-B0n34y1v.js → classDiagram-v2-WZHVMYZB-D96Cleku.js} +6 -6
  38. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-B0n34y1v.js.map → classDiagram-v2-WZHVMYZB-D96Cleku.js.map} +1 -1
  39. package/dist/static/assets/{clone-DMVEoZzo.js → clone-FxJrYcZB.js} +2 -2
  40. package/dist/static/assets/{clone-DMVEoZzo.js.map → clone-FxJrYcZB.js.map} +1 -1
  41. package/dist/static/assets/{cose-bilkent-S5V4N54A-BM7Q-IjT.js → cose-bilkent-S5V4N54A-BbEE6cnq.js} +2 -2
  42. package/dist/static/assets/{cose-bilkent-S5V4N54A-BM7Q-IjT.js.map → cose-bilkent-S5V4N54A-BbEE6cnq.js.map} +1 -1
  43. package/dist/static/assets/{dagre-6UL2VRFP-DsBBLjwD.js → dagre-6UL2VRFP-CGR7eURR.js} +7 -7
  44. package/dist/static/assets/{dagre-6UL2VRFP-DsBBLjwD.js.map → dagre-6UL2VRFP-CGR7eURR.js.map} +1 -1
  45. package/dist/static/assets/{diagram-PSM6KHXK-uinTtuhJ.js → diagram-PSM6KHXK-WWLa68Lv.js} +7 -7
  46. package/dist/static/assets/{diagram-PSM6KHXK-uinTtuhJ.js.map → diagram-PSM6KHXK-WWLa68Lv.js.map} +1 -1
  47. package/dist/static/assets/{diagram-QEK2KX5R-ChxmtmD8.js → diagram-QEK2KX5R-Cb0ZJQOH.js} +6 -6
  48. package/dist/static/assets/{diagram-QEK2KX5R-ChxmtmD8.js.map → diagram-QEK2KX5R-Cb0ZJQOH.js.map} +1 -1
  49. package/dist/static/assets/{diagram-S2PKOQOG-2cukzOFZ.js → diagram-S2PKOQOG-zqkdDUKQ.js} +6 -6
  50. package/dist/static/assets/{diagram-S2PKOQOG-2cukzOFZ.js.map → diagram-S2PKOQOG-zqkdDUKQ.js.map} +1 -1
  51. package/dist/static/assets/{erDiagram-Q2GNP2WA-CwIFDwop.js → erDiagram-Q2GNP2WA-BmPf0wOM.js} +5 -5
  52. package/dist/static/assets/{erDiagram-Q2GNP2WA-CwIFDwop.js.map → erDiagram-Q2GNP2WA-BmPf0wOM.js.map} +1 -1
  53. package/dist/static/assets/{flowDiagram-NV44I4VS-jKMMhPpA.js → flowDiagram-NV44I4VS-DXrfnkgV.js} +6 -6
  54. package/dist/static/assets/{flowDiagram-NV44I4VS-jKMMhPpA.js.map → flowDiagram-NV44I4VS-DXrfnkgV.js.map} +1 -1
  55. package/dist/static/assets/{ganttDiagram-JELNMOA3-0onO7ppU.js → ganttDiagram-JELNMOA3-bfZ5tWX_.js} +3 -3
  56. package/dist/static/assets/{ganttDiagram-JELNMOA3-0onO7ppU.js.map → ganttDiagram-JELNMOA3-bfZ5tWX_.js.map} +1 -1
  57. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-CxBFzFla.js → gitGraphDiagram-NY62KEGX-DXitZi7r.js} +7 -7
  58. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-CxBFzFla.js.map → gitGraphDiagram-NY62KEGX-DXitZi7r.js.map} +1 -1
  59. package/dist/static/assets/{graph-DuuInXXc.js → graph-mjLq--Ga.js} +3 -3
  60. package/dist/static/assets/{graph-DuuInXXc.js.map → graph-mjLq--Ga.js.map} +1 -1
  61. package/dist/static/assets/{index-CIEJ2QXv.js → index-DRzDnV-j.js} +37 -32
  62. package/dist/static/assets/{index-CIEJ2QXv.js.map → index-DRzDnV-j.js.map} +1 -1
  63. package/dist/static/assets/{infoDiagram-WHAUD3N6-TznEGa7r.js → infoDiagram-WHAUD3N6-Ba9c7MOp.js} +5 -5
  64. package/dist/static/assets/{infoDiagram-WHAUD3N6-TznEGa7r.js.map → infoDiagram-WHAUD3N6-Ba9c7MOp.js.map} +1 -1
  65. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BHyegEi7.js → journeyDiagram-XKPGCS4Q-5Wkm5er9.js} +5 -5
  66. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BHyegEi7.js.map → journeyDiagram-XKPGCS4Q-5Wkm5er9.js.map} +1 -1
  67. package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cb42cM0l.js → kanban-definition-3W4ZIXB7-CeARk6gJ.js} +3 -3
  68. package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cb42cM0l.js.map → kanban-definition-3W4ZIXB7-CeARk6gJ.js.map} +1 -1
  69. package/dist/static/assets/{layout-BmWDm7l3.js → layout-CHbcpbOV.js} +5 -5
  70. package/dist/static/assets/{layout-BmWDm7l3.js.map → layout-CHbcpbOV.js.map} +1 -1
  71. package/dist/static/assets/{linear-CnzPs1-w.js → linear-DPPAqhrM.js} +2 -2
  72. package/dist/static/assets/{linear-CnzPs1-w.js.map → linear-DPPAqhrM.js.map} +1 -1
  73. package/dist/static/assets/{min-B10Xh5Ux.js → min-JoIHYtgB.js} +3 -3
  74. package/dist/static/assets/{min-B10Xh5Ux.js.map → min-JoIHYtgB.js.map} +1 -1
  75. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CrN1eydc.js → mindmap-definition-VGOIOE7T-DKkSIiut.js} +4 -4
  76. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CrN1eydc.js.map → mindmap-definition-VGOIOE7T-DKkSIiut.js.map} +1 -1
  77. package/dist/static/assets/{pieDiagram-ADFJNKIX-B30qa_F6.js → pieDiagram-ADFJNKIX-QjFxhjCK.js} +7 -7
  78. package/dist/static/assets/{pieDiagram-ADFJNKIX-B30qa_F6.js.map → pieDiagram-ADFJNKIX-QjFxhjCK.js.map} +1 -1
  79. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-CqcwrOFK.js → quadrantDiagram-AYHSOK5B-D8rsSvFI.js} +3 -3
  80. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-CqcwrOFK.js.map → quadrantDiagram-AYHSOK5B-D8rsSvFI.js.map} +1 -1
  81. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-D_pK_WHp.js → requirementDiagram-UZGBJVZJ-C1x_1vZ2.js} +4 -4
  82. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-D_pK_WHp.js.map → requirementDiagram-UZGBJVZJ-C1x_1vZ2.js.map} +1 -1
  83. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DCWsFfhe.js → sankeyDiagram-TZEHDZUN-C3Ou5-Sj.js} +2 -2
  84. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DCWsFfhe.js.map → sankeyDiagram-TZEHDZUN-C3Ou5-Sj.js.map} +1 -1
  85. package/dist/static/assets/{sequenceDiagram-WL72ISMW-bYELxg0L.js → sequenceDiagram-WL72ISMW-CRVq_Rpl.js} +4 -4
  86. package/dist/static/assets/{sequenceDiagram-WL72ISMW-bYELxg0L.js.map → sequenceDiagram-WL72ISMW-CRVq_Rpl.js.map} +1 -1
  87. package/dist/static/assets/{stateDiagram-FKZM4ZOC-DETJEZs6.js → stateDiagram-FKZM4ZOC-DAp-SG30.js} +9 -9
  88. package/dist/static/assets/{stateDiagram-FKZM4ZOC-DETJEZs6.js.map → stateDiagram-FKZM4ZOC-DAp-SG30.js.map} +1 -1
  89. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DEfNRBx4.js → stateDiagram-v2-4FDKWEC3-BLi0n8xt.js} +5 -5
  90. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DEfNRBx4.js.map → stateDiagram-v2-4FDKWEC3-BLi0n8xt.js.map} +1 -1
  91. package/dist/static/assets/{timeline-definition-IT6M3QCI-BRvufh0i.js → timeline-definition-IT6M3QCI-DaJrX5LR.js} +3 -3
  92. package/dist/static/assets/{timeline-definition-IT6M3QCI-BRvufh0i.js.map → timeline-definition-IT6M3QCI-DaJrX5LR.js.map} +1 -1
  93. package/dist/static/assets/{treemap-KMMF4GRG-D4s4uF2T.js → treemap-KMMF4GRG-WuFw4QSO.js} +4 -4
  94. package/dist/static/assets/{treemap-KMMF4GRG-D4s4uF2T.js.map → treemap-KMMF4GRG-WuFw4QSO.js.map} +1 -1
  95. package/dist/static/assets/{xychartDiagram-PRI3JC2R-eBEH5utX.js → xychartDiagram-PRI3JC2R-B8iG9ezA.js} +3 -3
  96. package/dist/static/assets/{xychartDiagram-PRI3JC2R-eBEH5utX.js.map → xychartDiagram-PRI3JC2R-B8iG9ezA.js.map} +1 -1
  97. package/dist/static/index.html +1 -1
  98. package/package.json +1 -1
@@ -6,6 +6,7 @@ const evt_1 = require("./shared/evt");
6
6
  class GlobalDialogRegistry {
7
7
  constructor() {
8
8
  this.entries = new Map();
9
+ this.lastDriveTriggerByRootId = new Map();
9
10
  this.driveTriggerPubChan = (0, evt_1.createPubChan)();
10
11
  this.driveTriggerSubChan = (0, evt_1.createSubChan)(this.driveTriggerPubChan);
11
12
  }
@@ -48,7 +49,7 @@ class GlobalDialogRegistry {
48
49
  this.entries.delete(rootId);
49
50
  }
50
51
  publishDriveTrigger(args) {
51
- this.driveTriggerPubChan.write({
52
+ const trigger = {
52
53
  type: 'drive_trigger_evt',
53
54
  action: args.action,
54
55
  rootId: args.rootId,
@@ -58,7 +59,9 @@ class GlobalDialogRegistry {
58
59
  source: args.meta.source,
59
60
  reason: args.meta.reason,
60
61
  emittedAtMs: Date.now(),
61
- });
62
+ };
63
+ this.lastDriveTriggerByRootId.set(args.rootId, trigger);
64
+ this.driveTriggerPubChan.write(trigger);
62
65
  }
63
66
  async waitForDriveTrigger() {
64
67
  for (;;) {
@@ -113,6 +116,9 @@ class GlobalDialogRegistry {
113
116
  .filter((entry) => entry.needsDrive)
114
117
  .map((entry) => entry.rootDialog);
115
118
  }
119
+ getLastDriveTrigger(rootId) {
120
+ return this.lastDriveTriggerByRootId.get(rootId);
121
+ }
116
122
  getAll() {
117
123
  return Array.from(this.entries.values()).map((entry) => entry.rootDialog);
118
124
  }
@@ -1,6 +1,61 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS = void 0;
4
+ exports.resetContextHealthRoundState = resetContextHealthRoundState;
5
+ exports.resolveCriticalCountdownRemaining = resolveCriticalCountdownRemaining;
6
+ exports.consumeCriticalCountdown = consumeCriticalCountdown;
3
7
  exports.decideDriverV2ContextHealth = decideDriverV2ContextHealth;
8
+ exports.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS = 5;
9
+ const contextHealthRoundStateByDialogKey = new Map();
10
+ function getContextHealthRoundState(dialogKey) {
11
+ const existing = contextHealthRoundStateByDialogKey.get(dialogKey);
12
+ if (existing) {
13
+ return existing;
14
+ }
15
+ const created = {};
16
+ contextHealthRoundStateByDialogKey.set(dialogKey, created);
17
+ return created;
18
+ }
19
+ function resetContextHealthRoundState(dialogKey) {
20
+ contextHealthRoundStateByDialogKey.delete(dialogKey);
21
+ }
22
+ function resolveCriticalCountdownRemaining(dialogKey, snapshot) {
23
+ if (!snapshot || snapshot.kind !== 'available') {
24
+ resetContextHealthRoundState(dialogKey);
25
+ return exports.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS;
26
+ }
27
+ if (snapshot.level !== 'critical') {
28
+ if (snapshot.level === 'healthy') {
29
+ resetContextHealthRoundState(dialogKey);
30
+ return exports.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS;
31
+ }
32
+ const state = getContextHealthRoundState(dialogKey);
33
+ state.lastSeenLevel = snapshot.level;
34
+ state.criticalCountdownRemaining = undefined;
35
+ return exports.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS;
36
+ }
37
+ const state = getContextHealthRoundState(dialogKey);
38
+ if (state.lastSeenLevel !== 'critical' ||
39
+ typeof state.criticalCountdownRemaining !== 'number' ||
40
+ !Number.isFinite(state.criticalCountdownRemaining)) {
41
+ state.lastSeenLevel = 'critical';
42
+ state.criticalCountdownRemaining = exports.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS;
43
+ }
44
+ const remaining = Math.floor(state.criticalCountdownRemaining);
45
+ return remaining > 0 ? remaining : 0;
46
+ }
47
+ function consumeCriticalCountdown(dialogKey) {
48
+ const state = getContextHealthRoundState(dialogKey);
49
+ const currentRaw = typeof state.criticalCountdownRemaining === 'number' &&
50
+ Number.isFinite(state.criticalCountdownRemaining)
51
+ ? Math.floor(state.criticalCountdownRemaining)
52
+ : exports.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS;
53
+ const current = currentRaw > 0 ? currentRaw : 0;
54
+ const next = Math.max(0, current - 1);
55
+ state.lastSeenLevel = 'critical';
56
+ state.criticalCountdownRemaining = next;
57
+ return next;
58
+ }
4
59
  function decideDriverV2ContextHealth(args) {
5
60
  const { snapshot } = args;
6
61
  if (!snapshot || snapshot.kind !== 'available') {
@@ -10,12 +10,14 @@ 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 id_1 = require("../../shared/utils/id");
13
14
  const tellask_1 = require("../../tellask");
14
15
  const taskdoc_1 = require("../../utils/taskdoc");
15
16
  const client_1 = require("../client");
16
17
  const registry_1 = require("../gen/registry");
17
18
  const tools_projection_1 = require("../tools-projection");
18
19
  const context_1 = require("./context");
20
+ const context_health_1 = require("./context-health");
19
21
  const policy_1 = require("./policy");
20
22
  const runtime_utils_1 = require("./runtime-utils");
21
23
  const saying_events_1 = require("./saying-events");
@@ -58,6 +60,12 @@ function resolveUpNextPrompt(dlg) {
58
60
  userLanguageCode: upNext.userLanguageCode,
59
61
  };
60
62
  }
63
+ function isUserOriginPrompt(prompt) {
64
+ if (!prompt) {
65
+ return false;
66
+ }
67
+ return (prompt.origin ?? 'user') === 'user';
68
+ }
61
69
  async function emitUserMarkdown(dlg, content) {
62
70
  if (!content.trim()) {
63
71
  return;
@@ -428,6 +436,63 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
428
436
  const canonicalFuncTools = agentTools.filter((t) => t.type === 'func');
429
437
  const projected = (0, tools_projection_1.projectFuncToolsForProvider)(providerCfg.apiType, canonicalFuncTools);
430
438
  const funcTools = projected.tools;
439
+ if (genIterNo > 1) {
440
+ const snapshot = dlg.getLastContextHealth();
441
+ const hasQueuedUpNext = dlg.hasUpNext() || pendingPrompt !== undefined;
442
+ const criticalCountdownRemaining = (0, context_health_1.resolveCriticalCountdownRemaining)(dlg.id.key(), snapshot);
443
+ const healthDecision = (0, context_health_1.decideDriverV2ContextHealth)({
444
+ snapshot,
445
+ hadUserPromptThisGen: isUserOriginPrompt(pendingPrompt),
446
+ criticalCountdownRemaining,
447
+ });
448
+ if (healthDecision.kind === 'suspend') {
449
+ log_1.log.info('driver-v2 suspend iterative generation due to critical context while waiting for human prompt', undefined, {
450
+ dialogId: dlg.id.valueOf(),
451
+ rootId: dlg.id.rootId,
452
+ selfId: dlg.id.selfId,
453
+ genIterNo,
454
+ pendingPromptOrigin: pendingPrompt?.origin ?? null,
455
+ });
456
+ break;
457
+ }
458
+ if (healthDecision.kind === 'continue') {
459
+ if (healthDecision.reason === 'critical_force_new_course') {
460
+ const language = (0, runtime_language_1.getWorkLanguage)();
461
+ const newCoursePrompt = language === 'zh'
462
+ ? '系统因上下文已告急(critical)而自动开启新一程对话,请继续推进任务。'
463
+ : 'System auto-started a new dialog course because context health is critical. Please continue the task.';
464
+ await dlg.startNewCourse(newCoursePrompt);
465
+ dlg.setLastContextHealth({ kind: 'unavailable', reason: 'usage_unavailable' });
466
+ (0, context_health_1.resetContextHealthRoundState)(dlg.id.key());
467
+ const nextPrompt = resolveUpNextPrompt(dlg);
468
+ if (!nextPrompt) {
469
+ throw new Error(`driver-v2 critical force-new-course invariant violation: missing upNext prompt after startNewCourse for dialog=${dlg.id.valueOf()}`);
470
+ }
471
+ pendingPrompt = nextPrompt;
472
+ skipTaskdocForThisDrive = false;
473
+ }
474
+ else if (!hasQueuedUpNext) {
475
+ const language = (0, runtime_language_1.getWorkLanguage)();
476
+ const guideText = healthDecision.reason === 'caution_soft_remediation'
477
+ ? (0, driver_messages_1.formatUserFacingContextHealthV3RemediationGuide)(language, {
478
+ kind: 'caution',
479
+ mode: 'soft',
480
+ })
481
+ : (0, driver_messages_1.formatUserFacingContextHealthV3RemediationGuide)(language, {
482
+ kind: 'critical',
483
+ mode: 'countdown',
484
+ promptsRemainingAfterThis: (0, context_health_1.consumeCriticalCountdown)(dlg.id.key()),
485
+ promptsTotal: context_health_1.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS,
486
+ });
487
+ pendingPrompt = {
488
+ content: guideText,
489
+ msgId: (0, id_1.generateShortId)(),
490
+ grammar: 'markdown',
491
+ userLanguageCode: language,
492
+ };
493
+ }
494
+ }
495
+ }
431
496
  let suspendForHuman = false;
432
497
  let llmGenModelForGen = model;
433
498
  let contextHealthForGen;
@@ -88,11 +88,47 @@ async function driveQueuedDialogsOnce() {
88
88
  });
89
89
  await persistence_1.DialogPersistence.setNeedsDrive(rootDialog.id, false, rootDialog.status);
90
90
  }
91
+ const lastTrigger = dialog_global_registry_1.globalDialogRegistry.getLastDriveTrigger(rootDialog.id.rootId);
92
+ const lastTriggerAgeMs = lastTrigger !== undefined ? Math.max(0, Date.now() - lastTrigger.emittedAtMs) : undefined;
91
93
  if (status.subdialogs) {
92
- log_1.log.info(`Dialog ${rootDialog.id.rootId} suspended, waiting for subdialogs`);
94
+ log_1.log.info(`Dialog ${rootDialog.id.rootId} suspended, waiting for subdialogs`, {
95
+ rootId: rootDialog.id.rootId,
96
+ waitingQ4H: status.q4h,
97
+ waitingSubdialogs: status.subdialogs,
98
+ hasQueuedUpNext: rootDialog.hasUpNext(),
99
+ lastDriveTrigger: lastTrigger
100
+ ? {
101
+ action: lastTrigger.action,
102
+ source: lastTrigger.source,
103
+ reason: lastTrigger.reason,
104
+ emittedAtMs: lastTrigger.emittedAtMs,
105
+ ageMs: lastTriggerAgeMs,
106
+ entryFound: lastTrigger.entryFound,
107
+ previousNeedsDrive: lastTrigger.previousNeedsDrive,
108
+ nextNeedsDrive: lastTrigger.nextNeedsDrive,
109
+ }
110
+ : null,
111
+ });
93
112
  }
94
113
  if (status.q4h) {
95
- log_1.log.info(`Dialog ${rootDialog.id.rootId} awaiting Q4H answer`);
114
+ log_1.log.info(`Dialog ${rootDialog.id.rootId} awaiting Q4H answer`, {
115
+ rootId: rootDialog.id.rootId,
116
+ waitingQ4H: status.q4h,
117
+ waitingSubdialogs: status.subdialogs,
118
+ hasQueuedUpNext: rootDialog.hasUpNext(),
119
+ lastDriveTrigger: lastTrigger
120
+ ? {
121
+ action: lastTrigger.action,
122
+ source: lastTrigger.source,
123
+ reason: lastTrigger.reason,
124
+ emittedAtMs: lastTrigger.emittedAtMs,
125
+ ageMs: lastTriggerAgeMs,
126
+ entryFound: lastTrigger.entryFound,
127
+ previousNeedsDrive: lastTrigger.previousNeedsDrive,
128
+ nextNeedsDrive: lastTrigger.nextNeedsDrive,
129
+ }
130
+ : null,
131
+ });
96
132
  }
97
133
  }
98
134
  catch (err) {
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.executeDriveRound = executeDriveRound;
4
4
  const dialog_1 = require("../../dialog");
5
+ const dialog_global_registry_1 = require("../../dialog-global-registry");
5
6
  const dialog_run_state_1 = require("../../dialog-run-state");
6
7
  const log_1 = require("../../log");
7
8
  const load_1 = require("../../minds/load");
@@ -13,7 +14,6 @@ const context_health_1 = require("./context-health");
13
14
  const core_1 = require("./core");
14
15
  const policy_1 = require("./policy");
15
16
  const supdialog_response_1 = require("./supdialog-response");
16
- const defaultCriticalCountdownGenerations = 5;
17
17
  async function loadPendingDiagnosticsSnapshot(args) {
18
18
  const ownerDialogIdObj = new dialog_1.DialogID(args.ownerDialogId, args.rootId);
19
19
  try {
@@ -44,57 +44,6 @@ async function loadPendingDiagnosticsSnapshot(args) {
44
44
  };
45
45
  }
46
46
  }
47
- const contextHealthRoundStateByDialogKey = new Map();
48
- function getContextHealthRoundState(dialog) {
49
- const key = dialog.id.key();
50
- const existing = contextHealthRoundStateByDialogKey.get(key);
51
- if (existing) {
52
- return existing;
53
- }
54
- const created = {};
55
- contextHealthRoundStateByDialogKey.set(key, created);
56
- return created;
57
- }
58
- function resetContextHealthRoundState(dialog) {
59
- contextHealthRoundStateByDialogKey.delete(dialog.id.key());
60
- }
61
- function resolveCriticalCountdownRemaining(dialog, snapshot) {
62
- if (!snapshot || snapshot.kind !== 'available') {
63
- resetContextHealthRoundState(dialog);
64
- return defaultCriticalCountdownGenerations;
65
- }
66
- if (snapshot.level !== 'critical') {
67
- if (snapshot.level === 'healthy') {
68
- resetContextHealthRoundState(dialog);
69
- return defaultCriticalCountdownGenerations;
70
- }
71
- const state = getContextHealthRoundState(dialog);
72
- state.lastSeenLevel = snapshot.level;
73
- state.criticalCountdownRemaining = undefined;
74
- return defaultCriticalCountdownGenerations;
75
- }
76
- const state = getContextHealthRoundState(dialog);
77
- if (state.lastSeenLevel !== 'critical' ||
78
- typeof state.criticalCountdownRemaining !== 'number' ||
79
- !Number.isFinite(state.criticalCountdownRemaining)) {
80
- state.lastSeenLevel = 'critical';
81
- state.criticalCountdownRemaining = defaultCriticalCountdownGenerations;
82
- }
83
- const remaining = Math.floor(state.criticalCountdownRemaining);
84
- return remaining > 0 ? remaining : 0;
85
- }
86
- function consumeCriticalCountdown(dialog) {
87
- const state = getContextHealthRoundState(dialog);
88
- const currentRaw = typeof state.criticalCountdownRemaining === 'number' &&
89
- Number.isFinite(state.criticalCountdownRemaining)
90
- ? Math.floor(state.criticalCountdownRemaining)
91
- : defaultCriticalCountdownGenerations;
92
- const current = currentRaw > 0 ? currentRaw : 0;
93
- const next = Math.max(0, current - 1);
94
- state.lastSeenLevel = 'critical';
95
- state.criticalCountdownRemaining = next;
96
- return next;
97
- }
98
47
  function resolveEffectivePrompt(dialog, humanPrompt) {
99
48
  if (humanPrompt) {
100
49
  return humanPrompt;
@@ -167,6 +116,8 @@ async function executeDriveRound(args) {
167
116
  if (!humanPrompt) {
168
117
  const suspension = await dialog.getSuspensionStatus();
169
118
  if (!suspension.canDrive) {
119
+ const lastTrigger = dialog_global_registry_1.globalDialogRegistry.getLastDriveTrigger(dialog.id.rootId);
120
+ const lastTriggerAgeMs = lastTrigger !== undefined ? Math.max(0, Date.now() - lastTrigger.emittedAtMs) : undefined;
170
121
  log_1.log.info('driver-v2 skip queued auto-drive while dialog is suspended', {
171
122
  dialogId: dialog.id.valueOf(),
172
123
  rootId: dialog.id.rootId,
@@ -175,6 +126,18 @@ async function executeDriveRound(args) {
175
126
  hasQueuedUpNext: dialog.hasUpNext(),
176
127
  waitingQ4H: suspension.q4h,
177
128
  waitingSubdialogs: suspension.subdialogs,
129
+ lastDriveTrigger: lastTrigger
130
+ ? {
131
+ action: lastTrigger.action,
132
+ source: lastTrigger.source,
133
+ reason: lastTrigger.reason,
134
+ emittedAtMs: lastTrigger.emittedAtMs,
135
+ ageMs: lastTriggerAgeMs,
136
+ entryFound: lastTrigger.entryFound,
137
+ previousNeedsDrive: lastTrigger.previousNeedsDrive,
138
+ nextNeedsDrive: lastTrigger.nextNeedsDrive,
139
+ }
140
+ : null,
178
141
  });
179
142
  return;
180
143
  }
@@ -193,7 +156,7 @@ async function executeDriveRound(args) {
193
156
  }
194
157
  const snapshot = dialog.getLastContextHealth();
195
158
  const hasQueuedUpNext = dialog.hasUpNext();
196
- const criticalCountdownRemaining = resolveCriticalCountdownRemaining(dialog, snapshot);
159
+ const criticalCountdownRemaining = (0, context_health_1.resolveCriticalCountdownRemaining)(dialog.id.key(), snapshot);
197
160
  const healthDecision = (0, context_health_1.decideDriverV2ContextHealth)({
198
161
  snapshot,
199
162
  hadUserPromptThisGen: humanPrompt !== undefined,
@@ -211,7 +174,7 @@ async function executeDriveRound(args) {
211
174
  : 'System auto-started a new dialog course because context health is critical. Please continue the task.';
212
175
  await dialog.startNewCourse(newCoursePrompt);
213
176
  dialog.setLastContextHealth({ kind: 'unavailable', reason: 'usage_unavailable' });
214
- resetContextHealthRoundState(dialog);
177
+ (0, context_health_1.resetContextHealthRoundState)(dialog.id.key());
215
178
  }
216
179
  else if (!hasQueuedUpNext) {
217
180
  const language = (0, runtime_language_1.getWorkLanguage)();
@@ -223,8 +186,8 @@ async function executeDriveRound(args) {
223
186
  : (0, driver_messages_1.formatUserFacingContextHealthV3RemediationGuide)(language, {
224
187
  kind: 'critical',
225
188
  mode: 'countdown',
226
- promptsRemainingAfterThis: consumeCriticalCountdown(dialog),
227
- promptsTotal: defaultCriticalCountdownGenerations,
189
+ promptsRemainingAfterThis: (0, context_health_1.consumeCriticalCountdown)(dialog.id.key()),
190
+ promptsTotal: context_health_1.DRIVER_V2_DEFAULT_CRITICAL_COUNTDOWN_GENERATIONS,
228
191
  });
229
192
  healthPrompt = {
230
193
  content: guideText,
@@ -135,17 +135,32 @@ async function supplyResponseToSupdialogV2(args) {
135
135
  };
136
136
  await parentDialog.addChatMessages(immediateMirror);
137
137
  if (result.shouldRevive) {
138
- log_1.log.info(`All Type ${callType} subdialogs complete, parent ${parentDialog.id.selfId} auto-reviving`);
139
- if (parentDialog instanceof dialog_1.RootDialog) {
138
+ const isRoot = parentDialog instanceof dialog_1.RootDialog;
139
+ const hasRegistryEntry = isRoot
140
+ ? dialog_global_registry_1.globalDialogRegistry.get(parentDialog.id.rootId) !== undefined
141
+ : false;
142
+ log_1.log.info(`All Type ${callType} subdialogs complete, parent ${parentDialog.id.selfId} scheduling auto-revive`, {
143
+ rootId: parentDialog.id.rootId,
144
+ selfId: parentDialog.id.selfId,
145
+ via: isRoot && hasRegistryEntry ? 'backend_loop_trigger' : 'direct_schedule_drive',
146
+ isRoot,
147
+ hasRegistryEntry,
148
+ });
149
+ if (isRoot) {
140
150
  dialog_global_registry_1.globalDialogRegistry.markNeedsDrive(parentDialog.id.rootId, {
141
151
  source: 'driver_v2_supply_response',
142
152
  reason: `all_pending_subdialogs_resolved:type_${callType}`,
143
153
  });
144
154
  }
145
- scheduleDrive(parentDialog, {
146
- waitInQue: true,
147
- driveOptions: { suppressDiligencePush: parentDialog.disableDiligencePush },
148
- });
155
+ // Root dialogs should normally be resumed by backend loop drive-trigger.
156
+ // Direct schedule is kept only as fallback for non-root callers or when registry
157
+ // entry is not available yet (e.g., transient bootstrap windows).
158
+ if (!isRoot || !hasRegistryEntry) {
159
+ scheduleDrive(parentDialog, {
160
+ waitInQue: true,
161
+ driveOptions: { suppressDiligencePush: parentDialog.disableDiligencePush },
162
+ });
163
+ }
149
164
  }
150
165
  }
151
166
  catch (error) {
@@ -1,4 +1,4 @@
1
- import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-CIEJ2QXv.js";
1
+ import { aV as isObjectLike, br as baseGetTag, aE as isArray, aT as Symbol$1, bs as arrayLikeKeys, bt as baseKeys, aD as isArrayLike, bu as memoize, bv as isArguments, bw as MapCache, bm as eq, bx as Uint8Array, aW as getTag, a$ as isBuffer, b2 as Stack, by as isTypedArray, aZ as isObject, bz as isLength, bp as isIndex, aF as identity, bn as baseFor, bA as Set } from "./index-DRzDnV-j.js";
2
2
  var symbolTag$1 = "[object Symbol]";
3
3
  function isSymbol(value) {
4
4
  return typeof value == "symbol" || isObjectLike(value) && baseGetTag(value) == symbolTag$1;
@@ -658,4 +658,4 @@ export {
658
658
  hasIn as x,
659
659
  toString as y
660
660
  };
661
- //# sourceMappingURL=_baseUniq-C_6DmNp6.js.map
661
+ //# sourceMappingURL=_baseUniq-Dv0SNM-n.js.map