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