dominds 0.6.7 → 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 +201 -105
- 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 +40 -75
- 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 +8 -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',
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
状态:Draft
|
|
4
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` 进行引擎切换验证。
|
|
5
6
|
|
|
6
7
|
## 1. 背景与目标
|
|
7
8
|
|
|
@@ -103,140 +104,235 @@
|
|
|
103
104
|
2. 当前无 `next_gen` 真实业务需求,先不保留该分支,避免语义包袱。
|
|
104
105
|
3. 如未来出现单轮内部提示需求,新增能力应基于明确场景和回归测试,不提前抽象。
|
|
105
106
|
|
|
106
|
-
## 6.
|
|
107
|
+
## 6. Priming 重点支持目标
|
|
107
108
|
|
|
108
|
-
|
|
109
|
+
本次重构把 Agent Priming 作为第一优先级目标,不再作为“顺带兼容”。
|
|
109
110
|
|
|
110
|
-
|
|
111
|
+
### 6.1 Priming 对 drive 的硬需求
|
|
111
112
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
- `transientMessages`(subdialog 注入、internal drive priming、reminder/language guide)
|
|
117
|
-
- `diagnostics`(各来源计数、关键 id、去重统计)
|
|
118
|
-
2. 新建 `renderDriveContextMessages(snapshot)`,仅负责有序拼接,不负责业务决策。
|
|
119
|
-
3. `_driveDialogStream()` 改为“准备输入 -> 调纯函数 -> 用输出”。
|
|
120
|
-
|
|
121
|
-
验收:
|
|
122
|
-
|
|
123
|
-
1. 对同一输入快照,render 结果稳定(可 snapshot test)。
|
|
124
|
-
2. 现有行为不变(含 remind/language guide 插入顺序)。
|
|
125
|
-
|
|
126
|
-
### 阶段 B:take/commit/rollback 事务边界显式化(核心)
|
|
113
|
+
1. Priming 使用的临时引导 prompt 只作用于当前 drive。
|
|
114
|
+
2. 在同一 drive 的多轮迭代中(工具调用、context remediation、continue)必须持续可见。
|
|
115
|
+
3. 该 prompt 不进入 `dlg.msgs`,不写事件,不落盘,不渲染 UI。
|
|
116
|
+
4. drive 中断/失败后不得残留到下一次 drive。
|
|
127
117
|
|
|
128
|
-
|
|
118
|
+
### 6.2 Priming 支持实现(简化方案)
|
|
129
119
|
|
|
130
|
-
|
|
120
|
+
核心原则:**不做通用“多生命周期临时 prompt 框架”,只保留 drive 级 priming 通道**。
|
|
131
121
|
|
|
132
|
-
1.
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
- `finalize(outcome)`:`commit|rollback`
|
|
137
|
-
2. 用显式 outcome 替代隐式 `generationHadError` 推断。
|
|
138
|
-
3. 把 interrupted 与 error 的 finalize 语义统一。
|
|
122
|
+
1. 在新 driver 中把 priming 输入建模为单一字段:`internalDrivePrimingMsg?: ChatMessage`。
|
|
123
|
+
2. 上下文装配时固定规则:每轮迭代都在末尾注入 `internalDrivePrimingMsg`。
|
|
124
|
+
3. 通过 driver 生命周期自然回收:drive 结束即销毁,不做额外状态机。
|
|
125
|
+
4. 仅保留 `persistMode='internal'` 这一种 priming 入口,不再引入 `next_gen`/scope 分叉。
|
|
139
126
|
|
|
140
|
-
|
|
127
|
+
这样可以把 priming 需求落实为“一个字段 + 一条注入规则”,实现面最小化。
|
|
141
128
|
|
|
142
|
-
|
|
143
|
-
2. 成功且已尝试生成时 commit。
|
|
144
|
-
3. finalize 幂等(重复调用不会破坏状态)。
|
|
129
|
+
## 7. 两阶段重构计划(按新模块重写)
|
|
145
130
|
|
|
146
|
-
### 阶段
|
|
131
|
+
### 阶段 1:新建并上线 `driver-v2`,旧模块原样保留
|
|
147
132
|
|
|
148
|
-
|
|
133
|
+
目标:在新模块里重写 drive 逻辑,旧 `driver.ts` 保持原样,便于并排对比与问题定位。
|
|
149
134
|
|
|
150
135
|
交付物:
|
|
151
136
|
|
|
152
|
-
1.
|
|
153
|
-
-
|
|
154
|
-
- `
|
|
155
|
-
|
|
156
|
-
-
|
|
157
|
-
-
|
|
158
|
-
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
2.
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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 可稳定替代后,删除旧逻辑,收敛维护面。
|
|
169
174
|
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
1. `prepareDriveInputs(...)`
|
|
173
|
-
2. `buildGenerationContext(...)`
|
|
174
|
-
3. `runGenerationRound(...)`(流式/非流式统一返回形态)
|
|
175
|
-
4. `applyRoundSideEffects(...)`(tool outputs / tellask outputs / upNext)
|
|
176
|
-
5. `finalizeDrive(...)`
|
|
177
|
-
|
|
178
|
-
验收:
|
|
179
|
-
|
|
180
|
-
1. `_driveDialogStream` 主体降到“编排层”。
|
|
181
|
-
2. 单模块改动不需触碰整个 while-loop。
|
|
182
|
-
|
|
183
|
-
### 阶段 E:回归矩阵与复放样本
|
|
184
|
-
|
|
185
|
-
新增最小回归:
|
|
175
|
+
交付物:
|
|
186
176
|
|
|
187
|
-
1. `
|
|
188
|
-
2.
|
|
189
|
-
3.
|
|
190
|
-
|
|
191
|
-
|
|
177
|
+
1. 删除旧 `driver.ts` 中被 v2 覆盖的实现(或将其瘦身为转发壳并最终移除)。
|
|
178
|
+
2. 清理迁移期开关、对照代码、过渡注释和 dead code。
|
|
179
|
+
3. 固化最终文档:
|
|
180
|
+
- 新 driver 模块边界
|
|
181
|
+
- priming 通道语义
|
|
182
|
+
- 事务边界与错误处理约束
|
|
192
183
|
|
|
193
|
-
|
|
184
|
+
阶段 2 验收门槛:
|
|
194
185
|
|
|
195
|
-
1.
|
|
186
|
+
1. 全量类型检查与回归通过。
|
|
187
|
+
2. 无旧模块引用残留(import/调用链清零)。
|
|
188
|
+
3. 行为与阶段 1 上线结果一致。
|
|
196
189
|
|
|
197
|
-
##
|
|
190
|
+
## 8. 目标接口草案(v2,简化版)
|
|
198
191
|
|
|
199
192
|
```ts
|
|
200
|
-
type
|
|
201
|
-
|
|
202
|
-
internalDrivePrimingMsg?: ChatMessage;
|
|
203
|
-
|
|
204
|
-
languageGuideMsg: ChatMessage;
|
|
193
|
+
type DriveV2Input = {
|
|
194
|
+
persistedPrompt?: HumanPrompt; // 常规用户输入(会持久化)
|
|
195
|
+
internalDrivePrimingMsg?: ChatMessage; // 仅 drive 内可见
|
|
196
|
+
skipTaskdoc?: boolean;
|
|
205
197
|
};
|
|
206
198
|
|
|
207
|
-
type
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
diagnostics: {
|
|
211
|
-
counts: Record<string, number>;
|
|
212
|
-
dedupe: { before: number; after: number; by: string[] };
|
|
213
|
-
genseq?: number;
|
|
214
|
-
callIds: string[];
|
|
215
|
-
};
|
|
199
|
+
type DriveV2Runtime = {
|
|
200
|
+
takenSubdialogResponses: TakenSubdialogResponse[];
|
|
201
|
+
generationAttempted: boolean;
|
|
216
202
|
};
|
|
217
203
|
```
|
|
218
204
|
|
|
219
205
|
说明:
|
|
220
206
|
|
|
221
|
-
1. `internalDrivePrimingMsg`
|
|
222
|
-
2.
|
|
223
|
-
3.
|
|
207
|
+
1. priming 只保留 `internalDrivePrimingMsg` 一条路径。
|
|
208
|
+
2. 不提供“下一轮临时注入”接口,避免再次引入语义分叉。
|
|
209
|
+
3. 所有持久化副作用统一在编排层执行,不放进上下文纯函数。
|
|
224
210
|
|
|
225
|
-
##
|
|
211
|
+
## 9. 重构约束(必须保持)
|
|
226
212
|
|
|
227
213
|
1. 不改变现有 wire 协议事件名与基础语义(除非显式版本升级)。
|
|
228
214
|
2. 不引入 silent fallback;上下文事务异常需 loud 日志与可见错误信号。
|
|
229
215
|
3. 保持 TypeScript strict 与可静态验证属性;禁止 `any`。
|
|
230
|
-
4.
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
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
|
+
}
|