dominds 0.6.6 → 0.7.0
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/dist/agent-priming.js +7 -7
- package/dist/docs/drive-logic-context-refactor-plan.zh.md +338 -0
- package/dist/llm/driver-entry.js +52 -0
- package/dist/llm/driver-v2/context-health.js +27 -0
- package/dist/llm/driver-v2/context.js +58 -0
- package/dist/llm/driver-v2/core.js +1015 -0
- package/dist/llm/driver-v2/index.js +21 -0
- package/dist/llm/driver-v2/orchestrator.js +87 -0
- package/dist/llm/driver-v2/policy.js +135 -0
- package/dist/llm/driver-v2/round.js +148 -0
- package/dist/llm/driver-v2/runtime-utils.js +362 -0
- package/dist/llm/driver-v2/saying-events.js +58 -0
- package/dist/llm/driver-v2/subdialog-txn.js +42 -0
- package/dist/llm/driver-v2/supdialog-response.js +239 -0
- package/dist/llm/driver-v2/tellask-bridge.js +1057 -0
- package/dist/llm/driver-v2/types.js +10 -0
- package/dist/llm/driver.js +95 -94
- package/dist/llm/gen/mock.js +129 -8
- package/dist/log.js +12 -8
- package/dist/mcp/supervisor.js +1 -4
- package/dist/persistence.js +10 -38
- package/dist/server/api-routes.js +13 -5
- package/dist/server/websocket-handler.js +7 -7
- package/dist/server.js +2 -2
- package/dist/static/assets/{_baseUniq-DucuKHj3.js → _baseUniq-BxKNVs_E.js} +2 -2
- package/dist/static/assets/{_baseUniq-DucuKHj3.js.map → _baseUniq-BxKNVs_E.js.map} +1 -1
- package/dist/static/assets/{arc-CNlZ9dTp.js → arc-SobL0GO-.js} +2 -2
- package/dist/static/assets/{arc-CNlZ9dTp.js.map → arc-SobL0GO-.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-BXkEOfVt.js → architectureDiagram-VXUJARFQ-MMDS1QOC.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-BXkEOfVt.js.map → architectureDiagram-VXUJARFQ-MMDS1QOC.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-CyxI2bRF.js → blockDiagram-VD42YOAC-BOsSirNK.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-CyxI2bRF.js.map → blockDiagram-VD42YOAC-BOsSirNK.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-sS8T1IDn.js → c4Diagram-YG6GDRKO-D4jQkzwx.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-sS8T1IDn.js.map → c4Diagram-YG6GDRKO-D4jQkzwx.js.map} +1 -1
- package/dist/static/assets/{channel-DBu0JRwo.js → channel-CNJ5IKbI.js} +2 -2
- package/dist/static/assets/{channel-DBu0JRwo.js.map → channel-CNJ5IKbI.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-D499BCnz.js → chunk-4BX2VUAB-Dzp3xxyo.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-D499BCnz.js.map → chunk-4BX2VUAB-Dzp3xxyo.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-Dbe3sqC4.js → chunk-55IACEB6-CbmixuSI.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-Dbe3sqC4.js.map → chunk-55IACEB6-CbmixuSI.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-BHkSNS9y.js → chunk-B4BG7PRW-CdpmYjdb.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-BHkSNS9y.js.map → chunk-B4BG7PRW-CdpmYjdb.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-idwTV08g.js → chunk-DI55MBZ5-wBUIgR3h.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-idwTV08g.js.map → chunk-DI55MBZ5-wBUIgR3h.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-DLYv0YzD.js → chunk-FMBD7UC4-l62jcBz-.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-DLYv0YzD.js.map → chunk-FMBD7UC4-l62jcBz-.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-DIC5_nYD.js → chunk-QN33PNHL-BXfKZUpE.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-DIC5_nYD.js.map → chunk-QN33PNHL-BXfKZUpE.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-DM_s2fcN.js → chunk-QZHKN3VN-BYB4VxWj.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-DM_s2fcN.js.map → chunk-QZHKN3VN-BYB4VxWj.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-BjrSLFBO.js → chunk-TZMSLE5B-CvlWEnXl.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-BjrSLFBO.js.map → chunk-TZMSLE5B-CvlWEnXl.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-CSPkR9uh.js → classDiagram-2ON5EDUG-x2kw_AQY.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-CSPkR9uh.js.map → classDiagram-2ON5EDUG-x2kw_AQY.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CSPkR9uh.js → classDiagram-v2-WZHVMYZB-x2kw_AQY.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CSPkR9uh.js.map → classDiagram-v2-WZHVMYZB-x2kw_AQY.js.map} +1 -1
- package/dist/static/assets/{clone-DO2rSUBP.js → clone-CfBpi3MU.js} +2 -2
- package/dist/static/assets/{clone-DO2rSUBP.js.map → clone-CfBpi3MU.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-CyS4z2hF.js → cose-bilkent-S5V4N54A-DQSzPb7y.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-CyS4z2hF.js.map → cose-bilkent-S5V4N54A-DQSzPb7y.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-CvybKTFb.js → dagre-6UL2VRFP-BuBo_U3J.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-CvybKTFb.js.map → dagre-6UL2VRFP-BuBo_U3J.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-Cl2rD6o-.js → diagram-PSM6KHXK-J2z13Z5A.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-Cl2rD6o-.js.map → diagram-PSM6KHXK-J2z13Z5A.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-RCrqu1G0.js → diagram-QEK2KX5R-x8XUGykE.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-RCrqu1G0.js.map → diagram-QEK2KX5R-x8XUGykE.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-BeHOCxq7.js → diagram-S2PKOQOG-BE6Nr1BM.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-BeHOCxq7.js.map → diagram-S2PKOQOG-BE6Nr1BM.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-MdKfm7lU.js → erDiagram-Q2GNP2WA-D3qVnFAh.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-MdKfm7lU.js.map → erDiagram-Q2GNP2WA-D3qVnFAh.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-DNo7ZxVC.js → flowDiagram-NV44I4VS-Cjp9Rt9t.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-DNo7ZxVC.js.map → flowDiagram-NV44I4VS-Cjp9Rt9t.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-Bxs02jb2.js → ganttDiagram-JELNMOA3-D_hc66FC.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-Bxs02jb2.js.map → ganttDiagram-JELNMOA3-D_hc66FC.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BJsaVPOp.js → gitGraphDiagram-NY62KEGX-1I_zaTtz.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BJsaVPOp.js.map → gitGraphDiagram-NY62KEGX-1I_zaTtz.js.map} +1 -1
- package/dist/static/assets/{graph-DBSDya0j.js → graph-K6mmQESm.js} +3 -3
- package/dist/static/assets/{graph-DBSDya0j.js.map → graph-K6mmQESm.js.map} +1 -1
- package/dist/static/assets/{index-gn-aSKfG.js → index-RV1MEt3b.js} +35 -34
- package/dist/static/assets/index-RV1MEt3b.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D4Hvl0bK.js → infoDiagram-WHAUD3N6-CqazW4ov.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-D4Hvl0bK.js.map → infoDiagram-WHAUD3N6-CqazW4ov.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-B3YmIoCv.js → journeyDiagram-XKPGCS4Q-CCwUViz2.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-B3YmIoCv.js.map → journeyDiagram-XKPGCS4Q-CCwUViz2.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-dGCbR9Ty.js → kanban-definition-3W4ZIXB7-BKj9P06Z.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-dGCbR9Ty.js.map → kanban-definition-3W4ZIXB7-BKj9P06Z.js.map} +1 -1
- package/dist/static/assets/{layout-D7y0xA6C.js → layout-BcrPlYah.js} +5 -5
- package/dist/static/assets/{layout-D7y0xA6C.js.map → layout-BcrPlYah.js.map} +1 -1
- package/dist/static/assets/{linear-Cep1oHAS.js → linear-DYXbzldi.js} +2 -2
- package/dist/static/assets/{linear-Cep1oHAS.js.map → linear-DYXbzldi.js.map} +1 -1
- package/dist/static/assets/{min-DWRXZ2qP.js → min-CAfJrdkg.js} +3 -3
- package/dist/static/assets/{min-DWRXZ2qP.js.map → min-CAfJrdkg.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-FO6xgPgW.js → mindmap-definition-VGOIOE7T-CXWJYrd0.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-FO6xgPgW.js.map → mindmap-definition-VGOIOE7T-CXWJYrd0.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-ChJaCst9.js → pieDiagram-ADFJNKIX-DjKlsPYr.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-ChJaCst9.js.map → pieDiagram-ADFJNKIX-DjKlsPYr.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B8KuqHte.js → quadrantDiagram-AYHSOK5B-fcJtlyUO.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-B8KuqHte.js.map → quadrantDiagram-AYHSOK5B-fcJtlyUO.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DoJMxEmX.js → requirementDiagram-UZGBJVZJ-DmB9Ezaa.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DoJMxEmX.js.map → requirementDiagram-UZGBJVZJ-DmB9Ezaa.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CsLnys5W.js → sankeyDiagram-TZEHDZUN-CdGDwaMo.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CsLnys5W.js.map → sankeyDiagram-TZEHDZUN-CdGDwaMo.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CT4FY3X1.js → sequenceDiagram-WL72ISMW-C-jiKkhi.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-CT4FY3X1.js.map → sequenceDiagram-WL72ISMW-C-jiKkhi.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3IXupz6.js → stateDiagram-FKZM4ZOC-M9808W5W.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-B3IXupz6.js.map → stateDiagram-FKZM4ZOC-M9808W5W.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C80vDn17.js → stateDiagram-v2-4FDKWEC3-JE0YQyVh.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-C80vDn17.js.map → stateDiagram-v2-4FDKWEC3-JE0YQyVh.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-Bk2mvjhh.js → timeline-definition-IT6M3QCI-a2Rh8B62.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-Bk2mvjhh.js.map → timeline-definition-IT6M3QCI-a2Rh8B62.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-mWi2Ai-0.js → treemap-KMMF4GRG-D3tvybuo.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-mWi2Ai-0.js.map → treemap-KMMF4GRG-D3tvybuo.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-B5-7mQpW.js → xychartDiagram-PRI3JC2R-kmwKLP3Y.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-B5-7mQpW.js.map → xychartDiagram-PRI3JC2R-kmwKLP3Y.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/tools/env.js +11 -3
- package/package.json +1 -1
- package/dist/static/assets/index-gn-aSKfG.js.map +0 -1
package/dist/agent-priming.js
CHANGED
|
@@ -46,7 +46,7 @@ const fs = __importStar(require("node:fs/promises"));
|
|
|
46
46
|
const path = __importStar(require("node:path"));
|
|
47
47
|
const dialog_1 = require("./dialog");
|
|
48
48
|
const dialog_run_state_1 = require("./dialog-run-state");
|
|
49
|
-
const
|
|
49
|
+
const driver_entry_1 = require("./llm/driver-entry");
|
|
50
50
|
const log_1 = require("./log");
|
|
51
51
|
const runtime_language_1 = require("./shared/runtime-language");
|
|
52
52
|
const id_1 = require("./shared/utils/id");
|
|
@@ -58,7 +58,7 @@ const PRIMING_VCS_SESSION_SLUG = 'rtws-vcs-inventory';
|
|
|
58
58
|
const cacheByAgentId = new Map();
|
|
59
59
|
const inflightByAgentId = new Map();
|
|
60
60
|
async function emitSayingEventsAndPersist(dlg, content) {
|
|
61
|
-
const calls = await (0,
|
|
61
|
+
const calls = await (0, driver_entry_1.emitSayingEvents)(dlg, content);
|
|
62
62
|
const genseq = dlg.activeGenSeqOrUndefined;
|
|
63
63
|
if (dlg.generationStarted &&
|
|
64
64
|
typeof genseq === 'number' &&
|
|
@@ -949,7 +949,7 @@ async function generatePrimingNoteViaMainlineAgent(options) {
|
|
|
949
949
|
].join('\n');
|
|
950
950
|
// IMPORTANT: this is an internal (non-persisted) prompt. driver.ts will inject it into
|
|
951
951
|
// the LLM context for this drive only, without polluting dialog history.
|
|
952
|
-
await (0,
|
|
952
|
+
await (0, driver_entry_1.driveDialogStream)(dlg, {
|
|
953
953
|
content: internalPrompt,
|
|
954
954
|
msgId: (0, id_1.generateShortId)(),
|
|
955
955
|
grammar: 'markdown',
|
|
@@ -1451,7 +1451,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1451
1451
|
language,
|
|
1452
1452
|
collectiveTargets: [ensuredSpecialistId],
|
|
1453
1453
|
});
|
|
1454
|
-
await (0,
|
|
1454
|
+
await (0, driver_entry_1.driveDialogStream)(sub, { content: initPrompt, msgId: (0, id_1.generateShortId)(), grammar: 'markdown', skipTaskdoc: true }, true);
|
|
1455
1455
|
shellResponseText = extractLastAssistantSaying(sub.msgs);
|
|
1456
1456
|
const toolResult = extractLastShellCmdResultText(sub.msgs);
|
|
1457
1457
|
snapshotText = toolResult ? toolResult : shellResponseText;
|
|
@@ -1525,7 +1525,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1525
1525
|
language,
|
|
1526
1526
|
collectiveTargets: [ensuredSpecialistId],
|
|
1527
1527
|
});
|
|
1528
|
-
await (0,
|
|
1528
|
+
await (0, driver_entry_1.driveDialogStream)(round1Sub, {
|
|
1529
1529
|
content: round1Prompt,
|
|
1530
1530
|
msgId: (0, id_1.generateShortId)(),
|
|
1531
1531
|
grammar: 'markdown',
|
|
@@ -1581,7 +1581,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1581
1581
|
language,
|
|
1582
1582
|
collectiveTargets: [ensuredSpecialistId],
|
|
1583
1583
|
});
|
|
1584
|
-
await (0,
|
|
1584
|
+
await (0, driver_entry_1.driveDialogStream)(round1Sub, {
|
|
1585
1585
|
content: round2Prompt,
|
|
1586
1586
|
msgId: (0, id_1.generateShortId)(),
|
|
1587
1587
|
grammar: 'markdown',
|
|
@@ -1743,7 +1743,7 @@ async function runAgentPrimingLive(dlg) {
|
|
|
1743
1743
|
language,
|
|
1744
1744
|
collectiveTargets: [dlg.agentId],
|
|
1745
1745
|
});
|
|
1746
|
-
await (0,
|
|
1746
|
+
await (0, driver_entry_1.driveDialogStream)(sub, {
|
|
1747
1747
|
content: initPrompt,
|
|
1748
1748
|
msgId: (0, id_1.generateShortId)(),
|
|
1749
1749
|
grammar: 'markdown',
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
# Drive 逻辑上下文拼装现状与重构计划(2026-02)
|
|
2
|
+
|
|
3
|
+
状态:Draft
|
|
4
|
+
语义基线:以 `dominds/main/llm/driver.ts` 与 `dominds/main/persistence.ts` 当前实现为准。
|
|
5
|
+
测试基线(2026-02-09 更新):drive 相关脚本统一通过 `main/llm/driver-entry.ts` 调用,可用 `DOMINDS_DRIVER_ENGINE=v1|v2` 进行引擎切换验证。
|
|
6
|
+
|
|
7
|
+
## 1. 背景与目标
|
|
8
|
+
|
|
9
|
+
近期在对话 `@ux (39/12/417f4a49)` 中暴露出一个上下文一致性问题:同一主线对话内已经收到了 `@cmdr/@browser_tester` 的回贴并据此更新 Taskdoc,但后续回复仍声称“没看到原始回贴文本”。
|
|
10
|
+
|
|
11
|
+
这类问题的根因不是单条提示词,而是 **drive 内多轮生成的上下文来源语义不统一**:有的上下文是持久消息(`dlg.msgs`),有的是一次性注入(仅首轮),还有的是消费队列(take/commit/rollback)。
|
|
12
|
+
|
|
13
|
+
本文目标:
|
|
14
|
+
|
|
15
|
+
1. 固化“当前代码结构现状”的可审计视图。
|
|
16
|
+
2. 记录本轮已做的修补。
|
|
17
|
+
3. 制定一次更大范围的 drive logic 重构计划,使后续维护更清晰、不易回归。
|
|
18
|
+
|
|
19
|
+
## 2. 当前结构(代码现状)
|
|
20
|
+
|
|
21
|
+
### 2.1 核心文件与职责
|
|
22
|
+
|
|
23
|
+
- `main/llm/driver.ts`
|
|
24
|
+
- `_driveDialogStream()`:单次 drive 主循环,负责 prompt 处理、上下文拼装、LLM 调用、工具调用、suspend/continue。
|
|
25
|
+
- `supplyResponseToSupdialog()`:子对话回贴写入父对话响应队列、更新 pending、触发 auto-revive。
|
|
26
|
+
- `main/persistence.ts`
|
|
27
|
+
- `takeSubdialogResponses()/commitTakenSubdialogResponses()/rollbackTakenSubdialogResponses()`:子对话回贴队列的“取走-提交/回滚”机制。
|
|
28
|
+
- `rebuildFromEvents()`:重建 `dlg.msgs`(包含 `teammate_response_record -> tellask_result_msg` 映射)。
|
|
29
|
+
- `main/dialog.ts`
|
|
30
|
+
- `addChatMessages()`:运行时消息容器(in-memory)。
|
|
31
|
+
|
|
32
|
+
### 2.2 当前上下文来源(进入 LLM 的入口)
|
|
33
|
+
|
|
34
|
+
在 `_driveDialogStream()` 中,每轮 gen 的 `ctxMsgs` 由以下部分拼装:
|
|
35
|
+
|
|
36
|
+
1. `prependedContextMessages`(策略注入)
|
|
37
|
+
2. `memories`
|
|
38
|
+
3. `taskDocMsg`
|
|
39
|
+
4. `coursePrefixMsgs`
|
|
40
|
+
5. `dialogMsgsForContext`(来自 `dlg.msgs`)
|
|
41
|
+
6. `subdialogResponseContextMsgs`(来自 `takeSubdialogResponses` 的注入)
|
|
42
|
+
7. `internalDrivePromptMsg`(internal prompt 注入)
|
|
43
|
+
8. reminders + language guide(末尾插入)
|
|
44
|
+
|
|
45
|
+
要点:`dlg.msgs` 是“稳定上下文”;队列/内部 prompt 属于“drive 级上下文”。
|
|
46
|
+
|
|
47
|
+
## 3. 本轮修补(已落地)
|
|
48
|
+
|
|
49
|
+
### 3.1 已修问题
|
|
50
|
+
|
|
51
|
+
1. **同一 drive 多轮丢失 teammate response 上下文**
|
|
52
|
+
- 修复:把 `takeSubdialogResponses` 生成的 `subdialogResponseContextMsgs` 在同一 drive 内跨迭代保留,而非仅 `genIterNo===1` 注入。
|
|
53
|
+
|
|
54
|
+
2. **中断时误 commit 已 take 队列**
|
|
55
|
+
- 修复:在 interrupted 分支标记 `generationHadError = true`,确保 finally 走 rollback,不会把未稳定消费的队列当作已消费。
|
|
56
|
+
|
|
57
|
+
3. **internal prompt 语义收敛为 drive 级 priming**
|
|
58
|
+
- 修复:移除生命周期分支;`persistMode='internal'` 统一为 drive-scoped priming 注入。
|
|
59
|
+
- 语义:仅在当前 drive 生效、不入 `dlg.msgs`、不持久化、不渲染 UI。
|
|
60
|
+
- 依据:当前唯一使用场景是 Agent Priming,且明确要求 loop 迭代中持续可见。
|
|
61
|
+
|
|
62
|
+
4. **teammate response 稳定化到 `dlg.msgs`(与工具结果语义对齐)**
|
|
63
|
+
- 修复:当 take/commit 成功后,把该批回贴镜像为 `tellask_result_msg` 写入 `dlg.msgs`,让后续 drive 不依赖一次性队列注入。
|
|
64
|
+
|
|
65
|
+
5. **队列记录补齐状态字段**
|
|
66
|
+
- 修复:`subdialog-responses` 记录新增可选 `status`(`completed|failed`),并在镜像消息时使用该状态(默认 `completed`)。
|
|
67
|
+
|
|
68
|
+
## 4. 仍存在的结构债务
|
|
69
|
+
|
|
70
|
+
### 4.1 状态语义分散
|
|
71
|
+
|
|
72
|
+
同一类“队友回贴事实”同时存在于:
|
|
73
|
+
|
|
74
|
+
- `teammate_response_record`(事件持久层)
|
|
75
|
+
- `subdialog-responses.json`(消费队列)
|
|
76
|
+
- `dlg.msgs`(运行时上下文)
|
|
77
|
+
|
|
78
|
+
缺少单一“源事实 -> 视图派生”的规范,维护成本高。
|
|
79
|
+
|
|
80
|
+
### 4.2 拼装流程耦合过深
|
|
81
|
+
|
|
82
|
+
`_driveDialogStream()` 同时承担:
|
|
83
|
+
|
|
84
|
+
- prompt 生命周期管理
|
|
85
|
+
- 上下文装配
|
|
86
|
+
- policy 校验
|
|
87
|
+
- 流式/非流式分支
|
|
88
|
+
- 工具调用循环
|
|
89
|
+
- suspend/revive 与队列提交事务
|
|
90
|
+
|
|
91
|
+
单函数职责过重,不利于做语义回归验证。
|
|
92
|
+
|
|
93
|
+
### 4.3 缺少针对性回归测试矩阵
|
|
94
|
+
|
|
95
|
+
现有 tellask 测试覆盖“auto-revive 能跑通”,但对以下关键边界覆盖不足:
|
|
96
|
+
|
|
97
|
+
- 同一 drive 的多轮迭代上下文一致性
|
|
98
|
+
- interrupted + take queue 的 rollback 语义
|
|
99
|
+
- committed queue 镜像到 `dlg.msgs` 后的去重/恢复语义
|
|
100
|
+
|
|
101
|
+
## 5. 语义决策记录(本轮确认)
|
|
102
|
+
|
|
103
|
+
1. `persistMode='internal'` 不是“下一轮临时补丁”,而是 **drive 级 priming 通道**。
|
|
104
|
+
2. 当前无 `next_gen` 真实业务需求,先不保留该分支,避免语义包袱。
|
|
105
|
+
3. 如未来出现单轮内部提示需求,新增能力应基于明确场景和回归测试,不提前抽象。
|
|
106
|
+
|
|
107
|
+
## 6. Priming 重点支持目标
|
|
108
|
+
|
|
109
|
+
本次重构把 Agent Priming 作为第一优先级目标,不再作为“顺带兼容”。
|
|
110
|
+
|
|
111
|
+
### 6.1 Priming 对 drive 的硬需求
|
|
112
|
+
|
|
113
|
+
1. Priming 使用的临时引导 prompt 只作用于当前 drive。
|
|
114
|
+
2. 在同一 drive 的多轮迭代中(工具调用、context remediation、continue)必须持续可见。
|
|
115
|
+
3. 该 prompt 不进入 `dlg.msgs`,不写事件,不落盘,不渲染 UI。
|
|
116
|
+
4. drive 中断/失败后不得残留到下一次 drive。
|
|
117
|
+
|
|
118
|
+
### 6.2 Priming 支持实现(简化方案)
|
|
119
|
+
|
|
120
|
+
核心原则:**不做通用“多生命周期临时 prompt 框架”,只保留 drive 级 priming 通道**。
|
|
121
|
+
|
|
122
|
+
1. 在新 driver 中把 priming 输入建模为单一字段:`internalDrivePrimingMsg?: ChatMessage`。
|
|
123
|
+
2. 上下文装配时固定规则:每轮迭代都在末尾注入 `internalDrivePrimingMsg`。
|
|
124
|
+
3. 通过 driver 生命周期自然回收:drive 结束即销毁,不做额外状态机。
|
|
125
|
+
4. 仅保留 `persistMode='internal'` 这一种 priming 入口,不再引入 `next_gen`/scope 分叉。
|
|
126
|
+
|
|
127
|
+
这样可以把 priming 需求落实为“一个字段 + 一条注入规则”,实现面最小化。
|
|
128
|
+
|
|
129
|
+
## 7. 两阶段重构计划(按新模块重写)
|
|
130
|
+
|
|
131
|
+
### 阶段 1:新建并上线 `driver-v2`,旧模块原样保留
|
|
132
|
+
|
|
133
|
+
目标:在新模块里重写 drive 逻辑,旧 `driver.ts` 保持原样,便于并排对比与问题定位。
|
|
134
|
+
|
|
135
|
+
交付物:
|
|
136
|
+
|
|
137
|
+
1. 新模块(建议):
|
|
138
|
+
- `main/llm/driver-v2/index.ts`(对外入口)
|
|
139
|
+
- `main/llm/driver-v2/orchestrator.ts`(drive 级编排入口)
|
|
140
|
+
- `main/llm/driver-v2/types.ts`(v2 内部类型与运行态)
|
|
141
|
+
- `main/llm/driver-v2/context.ts`(上下文装配,含 priming 注入)
|
|
142
|
+
- `main/llm/driver-v2/policy.ts`(策略模型骨架)
|
|
143
|
+
- `main/llm/driver-v2/context-health.ts`(context-health 决策骨架)
|
|
144
|
+
- `main/llm/driver-v2/subdialog-txn.ts`(take/commit/rollback 事务)
|
|
145
|
+
- `main/llm/driver-v2/supdialog-response.ts`(subdialog 回贴与 auto-revive 编排)
|
|
146
|
+
- `main/llm/driver-v2/round.ts`(单轮生成与 side effects)
|
|
147
|
+
- 当前状态(2026-02-09 最新):`orchestrator` 已去除 `emitSayingEvents / supplyResponseToSupdialog / runBackendDriver` 的 v1 passthrough;`round` 已接管 lock/dead-check/upNext/subdialog-reply 收尾流程;核心循环已切换到 `driver-v2/core.ts:driveDialogStreamCoreV2`,不再调用 `_driveDialogStream/driveDialogStreamCoreV1`。
|
|
148
|
+
- 仍保留的过渡 bridge(2026-02-09):`coreV2` 已把重试、diligence、参数校验、saying-event 处理迁入 `driver-v2/`(`runtime-utils.ts`、`saying-events.ts`);当前仅 `tellask` 执行链仍通过 `driver-v2/tellask-bridge.ts -> driver.ts` 过渡调用,属于阶段 1 末尾需继续收敛的技术债。
|
|
149
|
+
2. 保持旧模块文件不动:
|
|
150
|
+
- `main/llm/driver.ts` 继续存在,作为对照基线。
|
|
151
|
+
3. 切换方式:
|
|
152
|
+
- 通过单点入口切换到 v2(建议配置开关或固定切换点),避免多处散改 import。
|
|
153
|
+
- 当前状态(2026-02-09):`main/llm/driver-entry.ts` 已支持 `DOMINDS_DRIVER_ENGINE=v1|v2`(默认 `v2`)。
|
|
154
|
+
4. Priming 专项支持:
|
|
155
|
+
- v2 内置 `internalDrivePrimingMsg` 注入规则(每轮注入、drive 内有效、绝不持久化)。
|
|
156
|
+
5. 关键回归与复放:
|
|
157
|
+
- `multi-iter subdialog response`
|
|
158
|
+
- `interrupt rollback`
|
|
159
|
+
- `commit mirror to dlg.msgs`
|
|
160
|
+
- `no duplicate after restore`
|
|
161
|
+
- `internal drive priming persists across iterations`
|
|
162
|
+
- 复放 `39/12/417f4a49` 风格样本
|
|
163
|
+
|
|
164
|
+
阶段 1 验收门槛:
|
|
165
|
+
|
|
166
|
+
1. `pnpm -C dominds run lint:types` 通过。
|
|
167
|
+
2. tellask 相关回归通过。
|
|
168
|
+
3. priming 专项回归通过。
|
|
169
|
+
4. 对比旧 driver,关键语义一致且已知 bug 被修复。
|
|
170
|
+
|
|
171
|
+
### 阶段 2:v2 稳定后删除旧模块并清理
|
|
172
|
+
|
|
173
|
+
目标:确认 v2 可稳定替代后,删除旧逻辑,收敛维护面。
|
|
174
|
+
|
|
175
|
+
交付物:
|
|
176
|
+
|
|
177
|
+
1. 删除旧 `driver.ts` 中被 v2 覆盖的实现(或将其瘦身为转发壳并最终移除)。
|
|
178
|
+
2. 清理迁移期开关、对照代码、过渡注释和 dead code。
|
|
179
|
+
3. 固化最终文档:
|
|
180
|
+
- 新 driver 模块边界
|
|
181
|
+
- priming 通道语义
|
|
182
|
+
- 事务边界与错误处理约束
|
|
183
|
+
|
|
184
|
+
阶段 2 验收门槛:
|
|
185
|
+
|
|
186
|
+
1. 全量类型检查与回归通过。
|
|
187
|
+
2. 无旧模块引用残留(import/调用链清零)。
|
|
188
|
+
3. 行为与阶段 1 上线结果一致。
|
|
189
|
+
|
|
190
|
+
## 8. 目标接口草案(v2,简化版)
|
|
191
|
+
|
|
192
|
+
```ts
|
|
193
|
+
type DriveV2Input = {
|
|
194
|
+
persistedPrompt?: HumanPrompt; // 常规用户输入(会持久化)
|
|
195
|
+
internalDrivePrimingMsg?: ChatMessage; // 仅 drive 内可见
|
|
196
|
+
skipTaskdoc?: boolean;
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
type DriveV2Runtime = {
|
|
200
|
+
takenSubdialogResponses: TakenSubdialogResponse[];
|
|
201
|
+
generationAttempted: boolean;
|
|
202
|
+
};
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
说明:
|
|
206
|
+
|
|
207
|
+
1. priming 只保留 `internalDrivePrimingMsg` 一条路径。
|
|
208
|
+
2. 不提供“下一轮临时注入”接口,避免再次引入语义分叉。
|
|
209
|
+
3. 所有持久化副作用统一在编排层执行,不放进上下文纯函数。
|
|
210
|
+
|
|
211
|
+
## 9. 重构约束(必须保持)
|
|
212
|
+
|
|
213
|
+
1. 不改变现有 wire 协议事件名与基础语义(除非显式版本升级)。
|
|
214
|
+
2. 不引入 silent fallback;上下文事务异常需 loud 日志与可见错误信号。
|
|
215
|
+
3. 保持 TypeScript strict 与可静态验证属性;禁止 `any`。
|
|
216
|
+
4. 旧模块在阶段 1 必须原样保留,便于对照和回滚。
|
|
217
|
+
|
|
218
|
+
## 10. 现有测试合理性评估(针对 dlg drive)
|
|
219
|
+
|
|
220
|
+
结论(2026-02-09 更新):**覆盖面已明显提升,足以支撑阶段 1 的持续迁移;但仍有未完成的对照/复放用例,尚未达到“可删除旧模块”的阶段 2 门槛**。
|
|
221
|
+
|
|
222
|
+
### 10.1 现有测试的合理性(优点)
|
|
223
|
+
|
|
224
|
+
1. 以脚本方式在临时 rtws 跑通关键链路,具备真实文件系统与持久化路径,能抓到不少“运行态”问题。
|
|
225
|
+
2. 已覆盖部分核心行为:
|
|
226
|
+
- tellask 解析/流式解析稳定性
|
|
227
|
+
- root auto-revive 基础路径
|
|
228
|
+
- type B 注册去重基础路径
|
|
229
|
+
- diligence push/Q4H 的部分事件行为
|
|
230
|
+
3. 执行成本低,适合快速 smoke。
|
|
231
|
+
|
|
232
|
+
### 10.2 仍存关键缺口(阶段 2 前需补齐)
|
|
233
|
+
|
|
234
|
+
1. `v1-v2-parity-diligence-q4h.ts` 仍未实现(当前只有 switch-smoke 级别验证,不是逐断言 parity)。
|
|
235
|
+
2. `replay-39-12-417f4a49-style.ts` 仍未实现(尚未形成稳定复放门禁)。
|
|
236
|
+
3. 旧模块仍保留;v2 已激活入口与外围编排,且核心生成循环已独立到 `coreV2`,但仍存在 bridge 依赖(tellask/重试/diligence 等辅助函数),尚未进入“删除旧模块”收敛阶段。
|
|
237
|
+
|
|
238
|
+
## 11. v2 测试设计与上线门禁
|
|
239
|
+
|
|
240
|
+
### 11.1 分层策略
|
|
241
|
+
|
|
242
|
+
1. L0 单元层(纯逻辑,零 I/O)
|
|
243
|
+
- 目标:验证 v2 新模块内部规则和数据变换。
|
|
244
|
+
- 关注:context 装配顺序、priming 注入规则、txn 状态机。
|
|
245
|
+
2. L1 集成层(临时 rtws + mock provider)
|
|
246
|
+
- 目标:验证 drive 主链路和持久化副作用。
|
|
247
|
+
- 关注:take/commit/rollback、auto-revive、runState、event 语义。
|
|
248
|
+
3. L2 对照/复放层(v1 vs v2)
|
|
249
|
+
- 目标:验证重写后与既有正确语义一致,且已知 bug 被修复。
|
|
250
|
+
- 关注:同输入下关键输出等价、上下文可见性不回退。
|
|
251
|
+
|
|
252
|
+
### 11.2 v2 必做用例(最小集)
|
|
253
|
+
|
|
254
|
+
1. `driver-v2/context-assembly-order.ts`
|
|
255
|
+
- 断言:`base -> ephemeral -> tail` 装配顺序稳定,且 reminders/language guide 插入点与现有语义一致。
|
|
256
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
257
|
+
2. `driver-v2/internal-drive-priming-multi-iter.ts`
|
|
258
|
+
- 断言:priming 提示在同一 drive 第 1/2/3 轮均可见。
|
|
259
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
260
|
+
3. `driver-v2/internal-drive-priming-not-persisted.ts`
|
|
261
|
+
- 断言:priming 不进入 `dlg.msgs`、不写 events、不落盘。
|
|
262
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
263
|
+
4. `driver-v2/internal-drive-priming-no-leak-next-drive.ts`
|
|
264
|
+
- 断言:drive 结束后 priming 不泄漏到下一次 drive。
|
|
265
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
266
|
+
5. `driver-v2/subdialog-queue-interrupt-rollback.ts`
|
|
267
|
+
- 断言:take 后 interrupted/error 必 rollback,下一次 drive 可重见。
|
|
268
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
269
|
+
6. `driver-v2/subdialog-queue-commit-mirror.ts`
|
|
270
|
+
- 断言:成功 commit 后镜像到 `dlg.msgs`,后续不依赖队列注入。
|
|
271
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
272
|
+
7. `driver-v2/subdialog-restore-live-equivalence.ts`
|
|
273
|
+
- 断言:restore 路径与 live 路径对 teammate response 的上下文等价。
|
|
274
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。`restoreDialogHierarchy(rootId, status)` 需由调用方显式传入状态。
|
|
275
|
+
8. `driver-v2/multi-iter-tool-round-context-continuity.ts`
|
|
276
|
+
- 断言:工具回合 continue 后,前序关键上下文不丢失。
|
|
277
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
278
|
+
9. `driver-v2/v1-v2-parity-basic-tellask.ts`
|
|
279
|
+
- 断言:同 mock 输入下,v1/v2 在可观察语义上等价(除已知 bug 修复差异)。
|
|
280
|
+
- v1 状态:可跑;已实现并通过(2026-02-09)。
|
|
281
|
+
10. `driver-v2/v1-v2-parity-diligence-q4h.ts`
|
|
282
|
+
- 断言:diligence/Q4H 关键事件与 runState 语义一致。
|
|
283
|
+
- v1 状态:尚未实现专门 parity 用例;但已通过 `driver-v2:switch-smoke:engine-v1|v2` 覆盖该链路的切换可用性验证(2026-02-09)。
|
|
284
|
+
|
|
285
|
+
11. `driver-v2/replay-39-12-417f4a49-style.ts`
|
|
286
|
+
- 断言:复放样本不再出现“已收到回贴却声称没看到”的语义回归。
|
|
287
|
+
- v1 状态:可先做“现状复放”脚本;v2 需要转为门禁回归。当前未实现。
|
|
288
|
+
|
|
289
|
+
### 11.3 阶段 1/2 的测试门禁
|
|
290
|
+
|
|
291
|
+
阶段 1(v2 上线前)必须通过:
|
|
292
|
+
|
|
293
|
+
1. `lint:types`
|
|
294
|
+
2. 全部 L0 用例
|
|
295
|
+
3. 全部 L1 最小集(上面 1~7)
|
|
296
|
+
4. 至少 2 个 L2 对照用例(上面 8~9)
|
|
297
|
+
5. priming 专项 3 条(上面 1~3)全部通过
|
|
298
|
+
|
|
299
|
+
阶段 2(删除旧模块前)必须通过:
|
|
300
|
+
|
|
301
|
+
1. 阶段 1 全部门禁
|
|
302
|
+
2. 全部 L2 用例(含复放样本)
|
|
303
|
+
3. old-driver 引用清零后再跑一次全套,确保无隐性依赖
|
|
304
|
+
|
|
305
|
+
### 11.4 执行组织建议
|
|
306
|
+
|
|
307
|
+
在 `tests/package.json` 里新增独立脚本分组(阶段 1 即可开始):
|
|
308
|
+
|
|
309
|
+
1. `driver-v2:unit`
|
|
310
|
+
2. `driver-v2:integration`
|
|
311
|
+
3. `driver-v2:parity`
|
|
312
|
+
4. `driver-v2:replay`
|
|
313
|
+
5. `driver-v2:gate`(汇总门禁脚本)
|
|
314
|
+
|
|
315
|
+
目的:把“能跑”与“可上线”分开,避免只凭单条 smoke 测试判断重写完成。
|
|
316
|
+
|
|
317
|
+
当前已落地脚本(2026-02-09):
|
|
318
|
+
|
|
319
|
+
1. `driver-v2:integration:engine-v1`
|
|
320
|
+
2. `driver-v2:integration:engine-v2`
|
|
321
|
+
3. `driver-v2:switch-smoke:engine-v1`
|
|
322
|
+
4. `driver-v2:switch-smoke:engine-v2`
|
|
323
|
+
5. `driver-v2:parity`
|
|
324
|
+
|
|
325
|
+
### 11.5 测试基座约定(script-rtws + mock provider)
|
|
326
|
+
|
|
327
|
+
1. 阶段 1 的集成测试默认基于 `tests/script-rtws` 运行,避免污染真实 rtws。
|
|
328
|
+
- 执行约束:统一通过 `tests/cli.ts` 入口传 `-C script-rtws`;不允许其它 rtws。
|
|
329
|
+
- 并发约束:同一时刻只允许一个 `tests/cli.ts` 进程使用 `script-rtws`,禁止并发执行多个脚本(会互相污染快照与恢复过程)。
|
|
330
|
+
- 运行收尾:`tests/cli.ts` 默认会在脚本结束后将 `tests/script-rtws` 恢复到“测试前快照”(可通过 `DOMINDS_TEST_RTWS_RESTORE_MODE=head` 改为恢复到 git HEAD;`DOMINDS_TEST_RTWS_RESTORE=0` 可禁用自动恢复用于调试)。
|
|
331
|
+
2. 默认使用 `apiType: mock`,通过 `mock-db/<model>.yaml` 驱动可重复测试。
|
|
332
|
+
- driver 入口切换统一走 `main/llm/driver-entry.ts`,通过环境变量 `DOMINDS_DRIVER_ENGINE=v1|v2` 选择引擎;测试代码避免直接调用 `driveDialogStream` 的 v1 直连入口。
|
|
333
|
+
3. mock 响应可使用:
|
|
334
|
+
- `delayMs`:整次响应前延迟(用于中断/rollback窗口)
|
|
335
|
+
- `chunkDelayMs`:流式分块延迟(用于流顺序与 stop 时序)
|
|
336
|
+
- `funcCalls`:响应后追加函数调用序列(用于工具回合/continue 测试)
|
|
337
|
+
- `contextContains`:要求上下文中必须包含指定片段(用于上下文连续性断言)
|
|
338
|
+
4. 需要“慢速请求”场景时,优先在 mock 数据层配置,不依赖真实外部 provider。
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getActiveDriverEngine = getActiveDriverEngine;
|
|
4
|
+
exports.driveDialogStream = driveDialogStream;
|
|
5
|
+
exports.emitSayingEvents = emitSayingEvents;
|
|
6
|
+
exports.supplyResponseToSupdialog = supplyResponseToSupdialog;
|
|
7
|
+
exports.runBackendDriver = runBackendDriver;
|
|
8
|
+
const driver_1 = require("./driver");
|
|
9
|
+
const driver_v2_1 = require("./driver-v2");
|
|
10
|
+
function resolveActiveDriverEngine() {
|
|
11
|
+
const raw = process.env.DOMINDS_DRIVER_ENGINE;
|
|
12
|
+
if (raw === undefined) {
|
|
13
|
+
return 'v2';
|
|
14
|
+
}
|
|
15
|
+
const normalized = raw.trim().toLowerCase();
|
|
16
|
+
if (normalized === '' || normalized === 'v2') {
|
|
17
|
+
return 'v2';
|
|
18
|
+
}
|
|
19
|
+
if (normalized === 'v1') {
|
|
20
|
+
return 'v1';
|
|
21
|
+
}
|
|
22
|
+
throw new Error(`Invalid DOMINDS_DRIVER_ENGINE=${JSON.stringify(raw)} (expected "v1" or "v2")`);
|
|
23
|
+
}
|
|
24
|
+
// Single switch point for rollout/tests.
|
|
25
|
+
const ACTIVE_DRIVER_ENGINE = resolveActiveDriverEngine();
|
|
26
|
+
function getActiveDriverEngine() {
|
|
27
|
+
return ACTIVE_DRIVER_ENGINE;
|
|
28
|
+
}
|
|
29
|
+
async function driveDialogStream(...args) {
|
|
30
|
+
if (ACTIVE_DRIVER_ENGINE === 'v2') {
|
|
31
|
+
return await (0, driver_v2_1.driveDialogStream)(...args);
|
|
32
|
+
}
|
|
33
|
+
return await (0, driver_1.driveDialogStream)(...args);
|
|
34
|
+
}
|
|
35
|
+
async function emitSayingEvents(...args) {
|
|
36
|
+
if (ACTIVE_DRIVER_ENGINE === 'v2') {
|
|
37
|
+
return await (0, driver_v2_1.emitSayingEvents)(...args);
|
|
38
|
+
}
|
|
39
|
+
return await (0, driver_1.emitSayingEvents)(...args);
|
|
40
|
+
}
|
|
41
|
+
async function supplyResponseToSupdialog(...args) {
|
|
42
|
+
if (ACTIVE_DRIVER_ENGINE === 'v2') {
|
|
43
|
+
return await (0, driver_v2_1.supplyResponseToSupdialog)(...args);
|
|
44
|
+
}
|
|
45
|
+
return await (0, driver_1.supplyResponseToSupdialog)(...args);
|
|
46
|
+
}
|
|
47
|
+
function runBackendDriver() {
|
|
48
|
+
if (ACTIVE_DRIVER_ENGINE === 'v2') {
|
|
49
|
+
return (0, driver_v2_1.runBackendDriver)();
|
|
50
|
+
}
|
|
51
|
+
return (0, driver_1.runBackendDriver)();
|
|
52
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.decideDriverV2ContextHealth = decideDriverV2ContextHealth;
|
|
4
|
+
function decideDriverV2ContextHealth(args) {
|
|
5
|
+
const { snapshot } = args;
|
|
6
|
+
if (!snapshot || snapshot.kind !== 'available') {
|
|
7
|
+
return { kind: 'proceed' };
|
|
8
|
+
}
|
|
9
|
+
if (snapshot.level === 'healthy') {
|
|
10
|
+
return { kind: 'proceed' };
|
|
11
|
+
}
|
|
12
|
+
if (snapshot.level === 'caution') {
|
|
13
|
+
return args.hadUserPromptThisGen
|
|
14
|
+
? { kind: 'proceed' }
|
|
15
|
+
: { kind: 'continue', reason: 'caution_soft_remediation' };
|
|
16
|
+
}
|
|
17
|
+
if (snapshot.level === 'critical') {
|
|
18
|
+
if (args.criticalCountdownRemaining <= 0) {
|
|
19
|
+
return { kind: 'continue', reason: 'critical_force_new_course' };
|
|
20
|
+
}
|
|
21
|
+
return args.hadUserPromptThisGen
|
|
22
|
+
? { kind: 'suspend', reason: 'critical_wait_human' }
|
|
23
|
+
: { kind: 'continue', reason: 'critical_countdown_remediation' };
|
|
24
|
+
}
|
|
25
|
+
const _exhaustive = snapshot.level;
|
|
26
|
+
return _exhaustive;
|
|
27
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildDriveBaseContextMessages = buildDriveBaseContextMessages;
|
|
4
|
+
exports.appendDriveEphemeralContext = appendDriveEphemeralContext;
|
|
5
|
+
exports.appendDriveTailContext = appendDriveTailContext;
|
|
6
|
+
exports.assembleDriveContextMessages = assembleDriveContextMessages;
|
|
7
|
+
function findLastUserPromptLikeIndex(msgs) {
|
|
8
|
+
for (let i = msgs.length - 1; i >= 0; i--) {
|
|
9
|
+
const msg = msgs[i];
|
|
10
|
+
if (msg &&
|
|
11
|
+
(msg.type === 'prompting_msg' || msg.type === 'environment_msg') &&
|
|
12
|
+
msg.role === 'user') {
|
|
13
|
+
return i;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
return -1;
|
|
17
|
+
}
|
|
18
|
+
function insertBeforeLastUserPromptLike(msgs, toInsert) {
|
|
19
|
+
if (toInsert.length === 0)
|
|
20
|
+
return [...msgs];
|
|
21
|
+
const next = [...msgs];
|
|
22
|
+
const insertIndex = findLastUserPromptLikeIndex(next);
|
|
23
|
+
if (insertIndex >= 0) {
|
|
24
|
+
next.splice(insertIndex, 0, ...toInsert);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
next.push(...toInsert);
|
|
28
|
+
}
|
|
29
|
+
return next;
|
|
30
|
+
}
|
|
31
|
+
function buildDriveBaseContextMessages(parts) {
|
|
32
|
+
return [
|
|
33
|
+
...parts.prependedContextMessages,
|
|
34
|
+
...parts.memories,
|
|
35
|
+
...(parts.taskDocMsg ? [parts.taskDocMsg] : []),
|
|
36
|
+
...parts.coursePrefixMsgs,
|
|
37
|
+
...parts.dialogMsgsForContext,
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
function appendDriveEphemeralContext(base, parts) {
|
|
41
|
+
const next = [...base];
|
|
42
|
+
if (parts.subdialogResponseContextMsgs.length > 0) {
|
|
43
|
+
next.push(...parts.subdialogResponseContextMsgs);
|
|
44
|
+
}
|
|
45
|
+
if (parts.internalDrivePromptMsg) {
|
|
46
|
+
next.push(parts.internalDrivePromptMsg);
|
|
47
|
+
}
|
|
48
|
+
return next;
|
|
49
|
+
}
|
|
50
|
+
function appendDriveTailContext(source, parts) {
|
|
51
|
+
const withReminders = insertBeforeLastUserPromptLike(source, parts.renderedReminders);
|
|
52
|
+
return insertBeforeLastUserPromptLike(withReminders, [parts.languageGuideMsg]);
|
|
53
|
+
}
|
|
54
|
+
function assembleDriveContextMessages(args) {
|
|
55
|
+
const baseMsgs = buildDriveBaseContextMessages(args.base);
|
|
56
|
+
const withEphemeral = appendDriveEphemeralContext(baseMsgs, args.ephemeral);
|
|
57
|
+
return appendDriveTailContext(withEphemeral, args.tail);
|
|
58
|
+
}
|