dominds 0.7.4 → 0.7.6
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.
- package/README.md +10 -0
- package/README.zh.md +10 -0
- package/dist/dialog-global-registry.js +8 -2
- package/dist/dialog.js +4 -13
- package/dist/llm/driver-v2/context-health.js +55 -0
- package/dist/llm/driver-v2/core.js +67 -2
- package/dist/llm/driver-v2/orchestrator.js +38 -2
- package/dist/llm/driver-v2/round.js +22 -59
- package/dist/llm/driver-v2/supdialog-response.js +21 -6
- package/dist/llm/driver-v2/tellask-bridge.js +1 -1
- package/dist/llm/driver.js +3 -3
- package/dist/persistence.js +106 -18
- package/dist/shared/i18n/driver-messages.js +4 -4
- package/dist/static/assets/{_baseUniq-C_6DmNp6.js → _baseUniq-2IQvcpiv.js} +2 -2
- package/dist/static/assets/{_baseUniq-C_6DmNp6.js.map → _baseUniq-2IQvcpiv.js.map} +1 -1
- package/dist/static/assets/{arc-CbWoOhl1.js → arc-Boi4s2EY.js} +2 -2
- package/dist/static/assets/{arc-CbWoOhl1.js.map → arc-Boi4s2EY.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CTckhB9O.js → architectureDiagram-VXUJARFQ-CV1IIalQ.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-CTckhB9O.js.map → architectureDiagram-VXUJARFQ-CV1IIalQ.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-mX558EDN.js → blockDiagram-VD42YOAC-C66ZvUb1.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-mX558EDN.js.map → blockDiagram-VD42YOAC-C66ZvUb1.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-Bti3To3b.js → c4Diagram-YG6GDRKO-2YQZQ-KQ.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-Bti3To3b.js.map → c4Diagram-YG6GDRKO-2YQZQ-KQ.js.map} +1 -1
- package/dist/static/assets/{channel-Dxi4rUwG.js → channel-DBG_xYT_.js} +2 -2
- package/dist/static/assets/{channel-Dxi4rUwG.js.map → channel-DBG_xYT_.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-CAbdAd2-.js → chunk-4BX2VUAB-D92pQ5qM.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-CAbdAd2-.js.map → chunk-4BX2VUAB-D92pQ5qM.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-D4r4rpB1.js → chunk-55IACEB6-T3IKxvjm.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-D4r4rpB1.js.map → chunk-55IACEB6-T3IKxvjm.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-sNmEhJCQ.js → chunk-B4BG7PRW-SKDCq7xY.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-sNmEhJCQ.js.map → chunk-B4BG7PRW-SKDCq7xY.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-BSutc2-e.js → chunk-DI55MBZ5-CKY9xXzj.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-BSutc2-e.js.map → chunk-DI55MBZ5-CKY9xXzj.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-DafIeMhA.js → chunk-FMBD7UC4-CzaQthG_.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-DafIeMhA.js.map → chunk-FMBD7UC4-CzaQthG_.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-1EobqGS_.js → chunk-QN33PNHL-8v7ASP75.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-1EobqGS_.js.map → chunk-QN33PNHL-8v7ASP75.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-C4U4YGsG.js → chunk-QZHKN3VN-Cd3_mr-D.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-C4U4YGsG.js.map → chunk-QZHKN3VN-Cd3_mr-D.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-BAuDx0ol.js → chunk-TZMSLE5B-BrTyfkJK.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-BAuDx0ol.js.map → chunk-TZMSLE5B-BrTyfkJK.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-B0n34y1v.js → classDiagram-2ON5EDUG-pLBmQ3Qa.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-B0n34y1v.js.map → classDiagram-2ON5EDUG-pLBmQ3Qa.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-B0n34y1v.js → classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-B0n34y1v.js.map → classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js.map} +1 -1
- package/dist/static/assets/{clone-DMVEoZzo.js → clone-rjxmrDHc.js} +2 -2
- package/dist/static/assets/{clone-DMVEoZzo.js.map → clone-rjxmrDHc.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-BM7Q-IjT.js → cose-bilkent-S5V4N54A-DaW3q2vS.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-BM7Q-IjT.js.map → cose-bilkent-S5V4N54A-DaW3q2vS.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-DsBBLjwD.js → dagre-6UL2VRFP-BT252775.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-DsBBLjwD.js.map → dagre-6UL2VRFP-BT252775.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-uinTtuhJ.js → diagram-PSM6KHXK-Cp0jEYgm.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-uinTtuhJ.js.map → diagram-PSM6KHXK-Cp0jEYgm.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-ChxmtmD8.js → diagram-QEK2KX5R-BYEiCch_.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-ChxmtmD8.js.map → diagram-QEK2KX5R-BYEiCch_.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-2cukzOFZ.js → diagram-S2PKOQOG-SNGZ1B53.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-2cukzOFZ.js.map → diagram-S2PKOQOG-SNGZ1B53.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CwIFDwop.js → erDiagram-Q2GNP2WA-CMdkkngT.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CwIFDwop.js.map → erDiagram-Q2GNP2WA-CMdkkngT.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-jKMMhPpA.js → flowDiagram-NV44I4VS-k203P84f.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-jKMMhPpA.js.map → flowDiagram-NV44I4VS-k203P84f.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-0onO7ppU.js → ganttDiagram-JELNMOA3-CgsVe01-.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-0onO7ppU.js.map → ganttDiagram-JELNMOA3-CgsVe01-.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-CxBFzFla.js → gitGraphDiagram-NY62KEGX-BGOR_N5w.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-CxBFzFla.js.map → gitGraphDiagram-NY62KEGX-BGOR_N5w.js.map} +1 -1
- package/dist/static/assets/{graph-DuuInXXc.js → graph-DDHIhCSW.js} +3 -3
- package/dist/static/assets/{graph-DuuInXXc.js.map → graph-DDHIhCSW.js.map} +1 -1
- package/dist/static/assets/{index-CIEJ2QXv.js → index-CUZD-Ua6.js} +118 -62
- package/dist/static/assets/index-CUZD-Ua6.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-TznEGa7r.js → infoDiagram-WHAUD3N6-D0GlWUIm.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-TznEGa7r.js.map → infoDiagram-WHAUD3N6-D0GlWUIm.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BHyegEi7.js → journeyDiagram-XKPGCS4Q-I0W1fDTZ.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-BHyegEi7.js.map → journeyDiagram-XKPGCS4Q-I0W1fDTZ.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cb42cM0l.js → kanban-definition-3W4ZIXB7-BY5xVZyl.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cb42cM0l.js.map → kanban-definition-3W4ZIXB7-BY5xVZyl.js.map} +1 -1
- package/dist/static/assets/{layout-BmWDm7l3.js → layout-C7mFT1m6.js} +5 -5
- package/dist/static/assets/{layout-BmWDm7l3.js.map → layout-C7mFT1m6.js.map} +1 -1
- package/dist/static/assets/{linear-CnzPs1-w.js → linear-WSX0brRY.js} +2 -2
- package/dist/static/assets/{linear-CnzPs1-w.js.map → linear-WSX0brRY.js.map} +1 -1
- package/dist/static/assets/{min-B10Xh5Ux.js → min-DOTQTP4p.js} +3 -3
- package/dist/static/assets/{min-B10Xh5Ux.js.map → min-DOTQTP4p.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CrN1eydc.js → mindmap-definition-VGOIOE7T-BWhHo-Hq.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-CrN1eydc.js.map → mindmap-definition-VGOIOE7T-BWhHo-Hq.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B30qa_F6.js → pieDiagram-ADFJNKIX-B91oxvos.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-B30qa_F6.js.map → pieDiagram-ADFJNKIX-B91oxvos.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-CqcwrOFK.js → quadrantDiagram-AYHSOK5B-DqMUyBPr.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-CqcwrOFK.js.map → quadrantDiagram-AYHSOK5B-DqMUyBPr.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-D_pK_WHp.js → requirementDiagram-UZGBJVZJ-COUayA3m.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-D_pK_WHp.js.map → requirementDiagram-UZGBJVZJ-COUayA3m.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DCWsFfhe.js → sankeyDiagram-TZEHDZUN-Bp9r8YDi.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DCWsFfhe.js.map → sankeyDiagram-TZEHDZUN-Bp9r8YDi.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-bYELxg0L.js → sequenceDiagram-WL72ISMW-CpuTC5cG.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-bYELxg0L.js.map → sequenceDiagram-WL72ISMW-CpuTC5cG.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-DETJEZs6.js → stateDiagram-FKZM4ZOC-Bxoo7e6E.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-DETJEZs6.js.map → stateDiagram-FKZM4ZOC-Bxoo7e6E.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DEfNRBx4.js → stateDiagram-v2-4FDKWEC3-Q-DL7tae.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DEfNRBx4.js.map → stateDiagram-v2-4FDKWEC3-Q-DL7tae.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BRvufh0i.js → timeline-definition-IT6M3QCI-DuOiHQPk.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-BRvufh0i.js.map → timeline-definition-IT6M3QCI-DuOiHQPk.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-D4s4uF2T.js → treemap-KMMF4GRG-YbrDC0fO.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-D4s4uF2T.js.map → treemap-KMMF4GRG-YbrDC0fO.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-eBEH5utX.js → xychartDiagram-PRI3JC2R-DDRlTIfV.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-eBEH5utX.js.map → xychartDiagram-PRI3JC2R-DDRlTIfV.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/package.json +1 -1
- package/dist/static/assets/index-CIEJ2QXv.js.map +0 -1
package/README.md
CHANGED
|
@@ -108,6 +108,16 @@ https://github.com/longrun-ai/dominds-feat-dev
|
|
|
108
108
|
2. Clone your dominds fork into dominds-feat-dev/dominds/
|
|
109
109
|
3. Open PRs against [longrun-ai/dominds](https://github.com/longrun-ai/dominds) from that inner repo
|
|
110
110
|
|
|
111
|
+
### Contributor Test Rule (Script rtws Isolation)
|
|
112
|
+
|
|
113
|
+
When running script tests inside the Dominds repo (for example `pnpm -C tests run rtws -- ...`):
|
|
114
|
+
|
|
115
|
+
- Start with `pnpm -C tests run` to list available scripts, then run target suites via `pnpm -C tests run <script-name>`.
|
|
116
|
+
- Default mode is **isolated rtws**: each run copies `tests/script-rtws` into a unique temp rtws before execution.
|
|
117
|
+
- Because isolation is default, script tests are safe to run in parallel; do not rely on shared-rtws serial assumptions.
|
|
118
|
+
- Use `--shared-rtws` for debugging only; it runs directly in `tests/script-rtws` and must not be used concurrently.
|
|
119
|
+
- Set `DOMINDS_TEST_RTWS_KEEP_TMP=1` if you want to keep temporary rtws artifacts for post-failure debugging.
|
|
120
|
+
|
|
111
121
|
### rtws Setup
|
|
112
122
|
|
|
113
123
|
There are two common ways to create an rtws:
|
package/README.zh.md
CHANGED
|
@@ -65,6 +65,16 @@ https://github.com/longrun-ai/dominds-feat-dev
|
|
|
65
65
|
2. 在 dominds-feat-dev/dominds/ 目录下,克隆你自己的 Dominds fork 仓库
|
|
66
66
|
3. 在内层 dominds/ 目录中,向 longrun-ai/dominds 提交 PR
|
|
67
67
|
|
|
68
|
+
### 贡献者测试约定(脚本测试 rtws 隔离)
|
|
69
|
+
|
|
70
|
+
当你在 Dominds 仓库里运行脚本测试(如 `pnpm -C tests run rtws -- ...`)时:
|
|
71
|
+
|
|
72
|
+
- 可先用 `pnpm -C tests run` 查看可用测试脚本,再用 `pnpm -C tests run <script-name>` 运行目标用例。
|
|
73
|
+
- 默认是**隔离 rtws**:每次运行都会把 `tests/script-rtws` 复制到独立临时目录后执行。
|
|
74
|
+
- 因为默认隔离,脚本测试可安全并发运行,不再依赖共享 `script-rtws` 的串行假设。
|
|
75
|
+
- `--shared-rtws` 仅用于调试,会直接使用 `tests/script-rtws`,禁止并发运行多个用例。
|
|
76
|
+
- 需要保留失败现场时,设置 `DOMINDS_TEST_RTWS_KEEP_TMP=1`,测试 CLI 会保留临时 rtws 路径。
|
|
77
|
+
|
|
68
78
|
## 快速上手(推荐:通过模板创建运行时工作区)
|
|
69
79
|
|
|
70
80
|
```bash
|
|
@@ -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
|
-
|
|
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
|
}
|
package/dist/dialog.js
CHANGED
|
@@ -790,24 +790,15 @@ class SubDialog extends Dialog {
|
|
|
790
790
|
this.assignmentFromSup = assignmentFromSup;
|
|
791
791
|
const resolvedSupdialog = rootDialog.lookupDialog(assignmentFromSup.callerDialogId);
|
|
792
792
|
if (resolvedSupdialog && resolvedSupdialog.id.selfId === this.id.selfId) {
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
callerDialogId: assignmentFromSup.callerDialogId,
|
|
796
|
-
});
|
|
797
|
-
this._supdialog = rootDialog;
|
|
793
|
+
throw new Error(`SubDialog supdialog invariant violation: caller resolved to self ` +
|
|
794
|
+
`(rootId=${rootDialog.id.rootId}, selfId=${this.id.selfId}, callerDialogId=${assignmentFromSup.callerDialogId})`);
|
|
798
795
|
}
|
|
799
796
|
else if (resolvedSupdialog) {
|
|
800
797
|
this._supdialog = resolvedSupdialog;
|
|
801
798
|
}
|
|
802
799
|
else {
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
log_1.log.warn('SubDialog failed to resolve callerDialogId in root registry; falling back to root', {
|
|
806
|
-
dialogId: this.id.selfId,
|
|
807
|
-
callerDialogId: assignmentFromSup.callerDialogId,
|
|
808
|
-
rootId: rootDialog.id.rootId,
|
|
809
|
-
});
|
|
810
|
-
this._supdialog = rootDialog;
|
|
800
|
+
throw new Error(`SubDialog supdialog invariant violation: caller missing from root registry ` +
|
|
801
|
+
`(rootId=${rootDialog.id.rootId}, selfId=${this.id.selfId}, callerDialogId=${assignmentFromSup.callerDialogId})`);
|
|
811
802
|
}
|
|
812
803
|
this.rootDialog.registerDialog(this);
|
|
813
804
|
}
|
|
@@ -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.formatAgentFacingContextHealthV3RemediationGuide)(language, {
|
|
478
|
+
kind: 'caution',
|
|
479
|
+
mode: 'soft',
|
|
480
|
+
})
|
|
481
|
+
: (0, driver_messages_1.formatAgentFacingContextHealthV3RemediationGuide)(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;
|
|
@@ -439,7 +504,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
|
|
|
439
504
|
const promptOrigin = currentPrompt.origin ?? 'user';
|
|
440
505
|
const isDiligencePrompt = promptOrigin === 'diligence_push';
|
|
441
506
|
if (isDiligencePrompt && (dlg.disableDiligencePush || suppressDiligencePushForDrive)) {
|
|
442
|
-
log_1.log.info('driver-v2 skip diligence prompt after disable toggle', {
|
|
507
|
+
log_1.log.info('driver-v2 skip diligence prompt after disable toggle', undefined, {
|
|
443
508
|
dialogId: dlg.id.valueOf(),
|
|
444
509
|
msgId: currentPrompt.msgId,
|
|
445
510
|
});
|
|
@@ -551,7 +616,7 @@ async function driveDialogStreamCoreV2(dlg, humanPrompt, driveOptions, callbacks
|
|
|
551
616
|
const guideMsg = {
|
|
552
617
|
type: 'transient_guide_msg',
|
|
553
618
|
role: 'assistant',
|
|
554
|
-
content: (0, driver_messages_1.
|
|
619
|
+
content: (0, driver_messages_1.formatCurrentUserLanguagePreference)(workingLanguage, uiLanguage),
|
|
555
620
|
};
|
|
556
621
|
const ctxMsgs = (0, context_1.assembleDriveContextMessages)({
|
|
557
622
|
base: {
|
|
@@ -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`, undefined, {
|
|
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`, undefined, {
|
|
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,7 +116,9 @@ async function executeDriveRound(args) {
|
|
|
167
116
|
if (!humanPrompt) {
|
|
168
117
|
const suspension = await dialog.getSuspensionStatus();
|
|
169
118
|
if (!suspension.canDrive) {
|
|
170
|
-
|
|
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;
|
|
121
|
+
log_1.log.info('driver-v2 skip queued auto-drive while dialog is suspended', undefined, {
|
|
171
122
|
dialogId: dialog.id.valueOf(),
|
|
172
123
|
rootId: dialog.id.rootId,
|
|
173
124
|
selfId: dialog.id.selfId,
|
|
@@ -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,20 +174,20 @@ 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)();
|
|
218
181
|
const guideText = healthDecision.reason === 'caution_soft_remediation'
|
|
219
|
-
? (0, driver_messages_1.
|
|
182
|
+
? (0, driver_messages_1.formatAgentFacingContextHealthV3RemediationGuide)(language, {
|
|
220
183
|
kind: 'caution',
|
|
221
184
|
mode: 'soft',
|
|
222
185
|
})
|
|
223
|
-
: (0, driver_messages_1.
|
|
186
|
+
: (0, driver_messages_1.formatAgentFacingContextHealthV3RemediationGuide)(language, {
|
|
224
187
|
kind: 'critical',
|
|
225
188
|
mode: 'countdown',
|
|
226
|
-
promptsRemainingAfterThis: consumeCriticalCountdown(dialog),
|
|
227
|
-
promptsTotal:
|
|
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
|
-
|
|
139
|
-
|
|
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`, undefined, {
|
|
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
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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) {
|
|
@@ -1121,7 +1121,7 @@ async function executeTellaskCalls(args) {
|
|
|
1121
1121
|
body: mergedBody,
|
|
1122
1122
|
q4hRemainingCallIds: remainingCallIds.length > 0 ? remainingCallIds : undefined,
|
|
1123
1123
|
};
|
|
1124
|
-
log_1.log.info('Q4H multi-question normalized into a single prompt', {
|
|
1124
|
+
log_1.log.info('Q4H multi-question normalized into a single prompt', undefined, {
|
|
1125
1125
|
rootId: dlg.id.rootId,
|
|
1126
1126
|
selfId: dlg.id.selfId,
|
|
1127
1127
|
mergedCount: q4hCalls.length,
|
package/dist/llm/driver.js
CHANGED
|
@@ -626,7 +626,7 @@ async function applyContextHealthV3Remediation(args) {
|
|
|
626
626
|
if (activeGenSeq === undefined) {
|
|
627
627
|
return { kind: 'proceed', ctxMsgs: args.ctxMsgs };
|
|
628
628
|
}
|
|
629
|
-
const guideText = (0, driver_messages_1.
|
|
629
|
+
const guideText = (0, driver_messages_1.formatAgentFacingContextHealthV3RemediationGuide)((0, runtime_language_1.getWorkLanguage)(), {
|
|
630
630
|
kind: 'caution',
|
|
631
631
|
mode: 'soft',
|
|
632
632
|
});
|
|
@@ -692,7 +692,7 @@ async function applyContextHealthV3Remediation(args) {
|
|
|
692
692
|
const nextPrompt = resolveUpNextPrompt(dlg);
|
|
693
693
|
return { kind: 'continue', nextPrompt };
|
|
694
694
|
}
|
|
695
|
-
const guideText = (0, driver_messages_1.
|
|
695
|
+
const guideText = (0, driver_messages_1.formatAgentFacingContextHealthV3RemediationGuide)((0, runtime_language_1.getWorkLanguage)(), {
|
|
696
696
|
kind: 'critical',
|
|
697
697
|
mode: 'countdown',
|
|
698
698
|
promptsRemainingAfterThis: promptsBeforeAutoClear - 1,
|
|
@@ -1432,7 +1432,7 @@ async function _driveDialogStream(dlg, humanPrompt, driveOptions) {
|
|
|
1432
1432
|
const guideMsg = {
|
|
1433
1433
|
type: 'transient_guide_msg',
|
|
1434
1434
|
role: 'assistant',
|
|
1435
|
-
content: (0, driver_messages_1.
|
|
1435
|
+
content: (0, driver_messages_1.formatCurrentUserLanguagePreference)(workingLanguage, uiLanguage),
|
|
1436
1436
|
};
|
|
1437
1437
|
const ctxMsgs = (0, context_1.assembleDriveContextMessages)({
|
|
1438
1438
|
base: {
|