dominds 0.3.5 → 0.4.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/README.md +1 -1
- package/dist/dialog-run-state.js +52 -0
- package/dist/dialog.js +14 -14
- package/dist/docs/OEC-philosophy.zh.md +8 -8
- package/dist/docs/cli-usage.zh.md +3 -3
- package/dist/docs/context-health.md +1 -6
- package/dist/docs/context-health.zh.md +6 -10
- package/dist/docs/design.md +5 -5
- package/dist/docs/design.zh.md +64 -64
- package/dist/docs/dialog-persistence.md +1 -0
- package/dist/docs/dialog-persistence.zh.md +38 -37
- package/dist/docs/dialog-system.md +44 -38
- package/dist/docs/dialog-system.zh.md +49 -50
- package/dist/docs/dominds-terminology.md +85 -21
- package/dist/docs/encapsulated-taskdoc.md +2 -2
- package/dist/docs/encapsulated-taskdoc.zh.md +9 -9
- package/dist/docs/interruption-resumption.md +1 -1
- package/dist/docs/mcp-support.md +23 -1
- package/dist/docs/mcp-support.zh.md +28 -8
- package/dist/docs/memory-system.md +5 -5
- package/dist/docs/memory-system.zh.md +2 -2
- package/dist/docs/mottos.zh.md +27 -27
- package/dist/docs/team-mgmt-toolset.md +6 -0
- package/dist/docs/team-mgmt-toolset.zh.md +6 -0
- package/dist/docs/txt-editing-tools.md +1 -1
- package/dist/llm/defaults.yaml +5 -5
- package/dist/llm/driver.js +104 -33
- package/dist/llm/gen/anthropic.js +104 -7
- package/dist/llm/gen/artifacts.js +132 -0
- package/dist/llm/gen/codex.js +59 -8
- package/dist/llm/gen/openai-compatible.js +591 -0
- package/dist/llm/gen/openai.js +90 -11
- package/dist/llm/gen/registry.js +2 -0
- package/dist/mcp/sdk-client.js +17 -0
- package/dist/mcp/server-runtime.js +15 -0
- package/dist/mcp/supervisor.js +191 -8
- package/dist/minds/load.js +48 -2
- package/dist/minds/minds-i18n.js +1 -1
- package/dist/minds/system-prompt.js +64 -39
- package/dist/persistence.js +54 -33
- package/dist/server/api-routes.js +123 -0
- package/dist/server/websocket-handler.js +87 -1
- package/dist/shared/i18n/driver-messages.js +21 -21
- package/dist/shared/team-mgmt-manual.js +4 -0
- package/dist/static/assets/{_baseUniq-IySq1VQ3.js → _baseUniq-B2sVW3D4.js} +2 -2
- package/dist/static/assets/{_baseUniq-IySq1VQ3.js.map → _baseUniq-B2sVW3D4.js.map} +1 -1
- package/dist/static/assets/{arc-D_0v1_GT.js → arc-BFq7_TMc.js} +2 -2
- package/dist/static/assets/{arc-D_0v1_GT.js.map → arc-BFq7_TMc.js.map} +1 -1
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DjtPdAc_.js → architectureDiagram-VXUJARFQ-_T6aHd0q.js} +6 -6
- package/dist/static/assets/{architectureDiagram-VXUJARFQ-DjtPdAc_.js.map → architectureDiagram-VXUJARFQ-_T6aHd0q.js.map} +1 -1
- package/dist/static/assets/{blockDiagram-VD42YOAC-xTQ-l3yQ.js → blockDiagram-VD42YOAC-DEi7fjsU.js} +7 -7
- package/dist/static/assets/{blockDiagram-VD42YOAC-xTQ-l3yQ.js.map → blockDiagram-VD42YOAC-DEi7fjsU.js.map} +1 -1
- package/dist/static/assets/{c4Diagram-YG6GDRKO-CMKKv91j.js → c4Diagram-YG6GDRKO-DsgtlnW1.js} +3 -3
- package/dist/static/assets/{c4Diagram-YG6GDRKO-CMKKv91j.js.map → c4Diagram-YG6GDRKO-DsgtlnW1.js.map} +1 -1
- package/dist/static/assets/{channel-CRKIVjHv.js → channel-D8XY6fY8.js} +2 -2
- package/dist/static/assets/{channel-CRKIVjHv.js.map → channel-D8XY6fY8.js.map} +1 -1
- package/dist/static/assets/{chunk-4BX2VUAB-CczzKjHP.js → chunk-4BX2VUAB-BXavLJHX.js} +2 -2
- package/dist/static/assets/{chunk-4BX2VUAB-CczzKjHP.js.map → chunk-4BX2VUAB-BXavLJHX.js.map} +1 -1
- package/dist/static/assets/{chunk-55IACEB6-ACUQE03I.js → chunk-55IACEB6-TVh3_rJY.js} +2 -2
- package/dist/static/assets/{chunk-55IACEB6-ACUQE03I.js.map → chunk-55IACEB6-TVh3_rJY.js.map} +1 -1
- package/dist/static/assets/{chunk-B4BG7PRW-vQ1NxBhN.js → chunk-B4BG7PRW-BW4XDN74.js} +5 -5
- package/dist/static/assets/{chunk-B4BG7PRW-vQ1NxBhN.js.map → chunk-B4BG7PRW-BW4XDN74.js.map} +1 -1
- package/dist/static/assets/{chunk-DI55MBZ5-CYJ0966n.js → chunk-DI55MBZ5-6-zlf3d9.js} +4 -4
- package/dist/static/assets/{chunk-DI55MBZ5-CYJ0966n.js.map → chunk-DI55MBZ5-6-zlf3d9.js.map} +1 -1
- package/dist/static/assets/{chunk-FMBD7UC4-B2VZLM0L.js → chunk-FMBD7UC4-DTf_1eJX.js} +2 -2
- package/dist/static/assets/{chunk-FMBD7UC4-B2VZLM0L.js.map → chunk-FMBD7UC4-DTf_1eJX.js.map} +1 -1
- package/dist/static/assets/{chunk-QN33PNHL-CHUNzj8Y.js → chunk-QN33PNHL-BqTE4-ru.js} +2 -2
- package/dist/static/assets/{chunk-QN33PNHL-CHUNzj8Y.js.map → chunk-QN33PNHL-BqTE4-ru.js.map} +1 -1
- package/dist/static/assets/{chunk-QZHKN3VN-gMDHzg0I.js → chunk-QZHKN3VN-Y9cm19qF.js} +2 -2
- package/dist/static/assets/{chunk-QZHKN3VN-gMDHzg0I.js.map → chunk-QZHKN3VN-Y9cm19qF.js.map} +1 -1
- package/dist/static/assets/{chunk-TZMSLE5B-BIgjMOir.js → chunk-TZMSLE5B-il_N_54T.js} +2 -2
- package/dist/static/assets/{chunk-TZMSLE5B-BIgjMOir.js.map → chunk-TZMSLE5B-il_N_54T.js.map} +1 -1
- package/dist/static/assets/{classDiagram-2ON5EDUG-CAQtEg_0.js → classDiagram-2ON5EDUG-BApxZww_.js} +6 -6
- package/dist/static/assets/{classDiagram-2ON5EDUG-CAQtEg_0.js.map → classDiagram-2ON5EDUG-BApxZww_.js.map} +1 -1
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CAQtEg_0.js → classDiagram-v2-WZHVMYZB-BApxZww_.js} +6 -6
- package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CAQtEg_0.js.map → classDiagram-v2-WZHVMYZB-BApxZww_.js.map} +1 -1
- package/dist/static/assets/{clone-DNETFbtK.js → clone-C3zblQcx.js} +2 -2
- package/dist/static/assets/{clone-DNETFbtK.js.map → clone-C3zblQcx.js.map} +1 -1
- package/dist/static/assets/{cose-bilkent-S5V4N54A-ssrS_ozh.js → cose-bilkent-S5V4N54A-DqkHO1Av.js} +2 -2
- package/dist/static/assets/{cose-bilkent-S5V4N54A-ssrS_ozh.js.map → cose-bilkent-S5V4N54A-DqkHO1Av.js.map} +1 -1
- package/dist/static/assets/{dagre-6UL2VRFP-Bu4cduK4.js → dagre-6UL2VRFP-jy0XRAqR.js} +7 -7
- package/dist/static/assets/{dagre-6UL2VRFP-Bu4cduK4.js.map → dagre-6UL2VRFP-jy0XRAqR.js.map} +1 -1
- package/dist/static/assets/{diagram-PSM6KHXK-TopJipkw.js → diagram-PSM6KHXK-Bf5eWQO4.js} +7 -7
- package/dist/static/assets/{diagram-PSM6KHXK-TopJipkw.js.map → diagram-PSM6KHXK-Bf5eWQO4.js.map} +1 -1
- package/dist/static/assets/{diagram-QEK2KX5R-YPIKk7UN.js → diagram-QEK2KX5R-B8O1x6s2.js} +6 -6
- package/dist/static/assets/{diagram-QEK2KX5R-YPIKk7UN.js.map → diagram-QEK2KX5R-B8O1x6s2.js.map} +1 -1
- package/dist/static/assets/{diagram-S2PKOQOG-C61aFK6h.js → diagram-S2PKOQOG-D3FDgXbX.js} +6 -6
- package/dist/static/assets/{diagram-S2PKOQOG-C61aFK6h.js.map → diagram-S2PKOQOG-D3FDgXbX.js.map} +1 -1
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CyW-28SO.js → erDiagram-Q2GNP2WA-9z9xHjnH.js} +5 -5
- package/dist/static/assets/{erDiagram-Q2GNP2WA-CyW-28SO.js.map → erDiagram-Q2GNP2WA-9z9xHjnH.js.map} +1 -1
- package/dist/static/assets/{flowDiagram-NV44I4VS-B2ZSAkDb.js → flowDiagram-NV44I4VS-BwcoP6mb.js} +6 -6
- package/dist/static/assets/{flowDiagram-NV44I4VS-B2ZSAkDb.js.map → flowDiagram-NV44I4VS-BwcoP6mb.js.map} +1 -1
- package/dist/static/assets/{ganttDiagram-JELNMOA3-7M4RBqzS.js → ganttDiagram-JELNMOA3-DTxymBuZ.js} +3 -3
- package/dist/static/assets/{ganttDiagram-JELNMOA3-7M4RBqzS.js.map → ganttDiagram-JELNMOA3-DTxymBuZ.js.map} +1 -1
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-esQryKY5.js → gitGraphDiagram-NY62KEGX-D_gXk1gO.js} +7 -7
- package/dist/static/assets/{gitGraphDiagram-NY62KEGX-esQryKY5.js.map → gitGraphDiagram-NY62KEGX-D_gXk1gO.js.map} +1 -1
- package/dist/static/assets/{graph-CiUwLoK6.js → graph-BuwrGKeW.js} +3 -3
- package/dist/static/assets/{graph-CiUwLoK6.js.map → graph-BuwrGKeW.js.map} +1 -1
- package/dist/static/assets/{index--tkbs_Q1.js → index-BsoeBQZ-.js} +533 -119
- package/dist/static/assets/index-BsoeBQZ-.js.map +1 -0
- package/dist/static/assets/{infoDiagram-WHAUD3N6-BtGwlvel.js → infoDiagram-WHAUD3N6-CZoUYjvD.js} +5 -5
- package/dist/static/assets/{infoDiagram-WHAUD3N6-BtGwlvel.js.map → infoDiagram-WHAUD3N6-CZoUYjvD.js.map} +1 -1
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-OG_bZVNn.js → journeyDiagram-XKPGCS4Q-BePDKeg1.js} +5 -5
- package/dist/static/assets/{journeyDiagram-XKPGCS4Q-OG_bZVNn.js.map → journeyDiagram-XKPGCS4Q-BePDKeg1.js.map} +1 -1
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cv9Vlgp-.js → kanban-definition-3W4ZIXB7-C-ToxWuS.js} +3 -3
- package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cv9Vlgp-.js.map → kanban-definition-3W4ZIXB7-C-ToxWuS.js.map} +1 -1
- package/dist/static/assets/{layout-CwU5VRA8.js → layout-CMhaiMtq.js} +5 -5
- package/dist/static/assets/{layout-CwU5VRA8.js.map → layout-CMhaiMtq.js.map} +1 -1
- package/dist/static/assets/{linear-BdxEG_yr.js → linear-BFFtKZ55.js} +2 -2
- package/dist/static/assets/{linear-BdxEG_yr.js.map → linear-BFFtKZ55.js.map} +1 -1
- package/dist/static/assets/{min-DwrBYJbp.js → min-Dfm0bwcG.js} +3 -3
- package/dist/static/assets/{min-DwrBYJbp.js.map → min-Dfm0bwcG.js.map} +1 -1
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-D0rcE-nw.js → mindmap-definition-VGOIOE7T-KJ4wuuPs.js} +4 -4
- package/dist/static/assets/{mindmap-definition-VGOIOE7T-D0rcE-nw.js.map → mindmap-definition-VGOIOE7T-KJ4wuuPs.js.map} +1 -1
- package/dist/static/assets/{pieDiagram-ADFJNKIX-BvaJvjf0.js → pieDiagram-ADFJNKIX-B8yHUm80.js} +7 -7
- package/dist/static/assets/{pieDiagram-ADFJNKIX-BvaJvjf0.js.map → pieDiagram-ADFJNKIX-B8yHUm80.js.map} +1 -1
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-Bcj_xOgy.js → quadrantDiagram-AYHSOK5B-BdAra1H_.js} +3 -3
- package/dist/static/assets/{quadrantDiagram-AYHSOK5B-Bcj_xOgy.js.map → quadrantDiagram-AYHSOK5B-BdAra1H_.js.map} +1 -1
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-BEyvE0te.js → requirementDiagram-UZGBJVZJ-Bg9AEI1n.js} +4 -4
- package/dist/static/assets/{requirementDiagram-UZGBJVZJ-BEyvE0te.js.map → requirementDiagram-UZGBJVZJ-Bg9AEI1n.js.map} +1 -1
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DgUuT-8m.js → sankeyDiagram-TZEHDZUN-B-LujBRP.js} +2 -2
- package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DgUuT-8m.js.map → sankeyDiagram-TZEHDZUN-B-LujBRP.js.map} +1 -1
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-BUUdKln_.js → sequenceDiagram-WL72ISMW-Ctethirl.js} +4 -4
- package/dist/static/assets/{sequenceDiagram-WL72ISMW-BUUdKln_.js.map → sequenceDiagram-WL72ISMW-Ctethirl.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-CRudpqrn.js → stateDiagram-FKZM4ZOC-DhgNaoOm.js} +9 -9
- package/dist/static/assets/{stateDiagram-FKZM4ZOC-CRudpqrn.js.map → stateDiagram-FKZM4ZOC-DhgNaoOm.js.map} +1 -1
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CIcTkWXG.js → stateDiagram-v2-4FDKWEC3-S5n1tnCJ.js} +5 -5
- package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CIcTkWXG.js.map → stateDiagram-v2-4FDKWEC3-S5n1tnCJ.js.map} +1 -1
- package/dist/static/assets/{timeline-definition-IT6M3QCI-CJO9Jpoj.js → timeline-definition-IT6M3QCI-tIDoJIBZ.js} +3 -3
- package/dist/static/assets/{timeline-definition-IT6M3QCI-CJO9Jpoj.js.map → timeline-definition-IT6M3QCI-tIDoJIBZ.js.map} +1 -1
- package/dist/static/assets/{treemap-KMMF4GRG-ChlAb63h.js → treemap-KMMF4GRG-7MxcPSQ7.js} +4 -4
- package/dist/static/assets/{treemap-KMMF4GRG-ChlAb63h.js.map → treemap-KMMF4GRG-7MxcPSQ7.js.map} +1 -1
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DD-kXv8c.js → xychartDiagram-PRI3JC2R-DoGRC1ZA.js} +3 -3
- package/dist/static/assets/{xychartDiagram-PRI3JC2R-DD-kXv8c.js.map → xychartDiagram-PRI3JC2R-DoGRC1ZA.js.map} +1 -1
- package/dist/static/index.html +1 -1
- package/dist/static/testing/e2e-test-helper.js +41 -41
- package/dist/tools/builtins.js +7 -5
- package/dist/tools/ctrl.js +25 -3
- package/dist/tools/mcp.js +27 -6
- package/dist/tools/plan.js +154 -0
- package/dist/tools/prompts/team_mgmt.en.md +1 -1
- package/dist/tools/prompts/ws_mod.en.md +1 -1
- package/dist/tools/team-mgmt.js +88 -21
- package/dist/tools/txt.js +2 -2
- package/dist/utils/id.js +2 -2
- package/dist/utils/taskdoc.js +3 -3
- package/package.json +1 -1
- package/dist/static/assets/index--tkbs_Q1.js.map +0 -1
package/README.md
CHANGED
|
@@ -184,7 +184,7 @@ dominds
|
|
|
184
184
|
|
|
185
185
|
Dominds is designed for long-running product development and operations, with a “division of labor” constitution:
|
|
186
186
|
|
|
187
|
-
- Reduce **agent mental overhead** by dividing and distributing work across a team of specialized agents, and by using more effective **dialog course control** (instead of brittle context condensation) to shed conversational/tool-
|
|
187
|
+
- Reduce **agent mental overhead** by dividing and distributing work across a team of specialized agents, and by using more effective **dialog course control** (instead of brittle context condensation) to shed conversational/tool-output noise when a dialog becomes cluttered.
|
|
188
188
|
- Prevent **tool misuse** by putting side-effectful tools only in the hands of well-prompted specialist agents, via least-privilege toolsets/policies.
|
|
189
189
|
- Prevent **staleness** (agents acting on outdated assumptions) by encoding decisions, conventions, configuration, and key repo facts into version-tracked workspace artifacts intended to be loaded into agent context (team-shared and agent-individual memory, task docs, and dialog-local reminders), rather than leaving them as “undiscovered” knowledge scattered across the repo.
|
|
190
190
|
|
package/dist/dialog-run-state.js
CHANGED
|
@@ -58,6 +58,36 @@ function getStopRequestedReason(dialogId) {
|
|
|
58
58
|
return activeRunsByDialogKey.get(dialogId.key())?.stopRequested;
|
|
59
59
|
}
|
|
60
60
|
async function setDialogRunState(dialogId, runState) {
|
|
61
|
+
if (runState.kind === 'dead' && dialogId.selfId === dialogId.rootId) {
|
|
62
|
+
log.warn('Rejecting dead runState for root dialog (root dialogs must not be dead)', undefined, {
|
|
63
|
+
dialogId: dialogId.valueOf(),
|
|
64
|
+
});
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
// "dead" is irreversible. Once a dialog is marked dead, do not allow overwriting it with
|
|
68
|
+
// another state (best-effort; races may still exist across concurrent writers).
|
|
69
|
+
try {
|
|
70
|
+
const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
|
|
71
|
+
if (dialogId.selfId !== dialogId.rootId &&
|
|
72
|
+
latest &&
|
|
73
|
+
latest.runState &&
|
|
74
|
+
latest.runState.kind === 'dead' &&
|
|
75
|
+
runState.kind !== 'dead') {
|
|
76
|
+
const typed = evt_registry_1.dialogEventRegistry.createTypedEvent(dialogId, {
|
|
77
|
+
type: 'dlg_run_state_evt',
|
|
78
|
+
runState: latest.runState,
|
|
79
|
+
});
|
|
80
|
+
if (broadcastToClients) {
|
|
81
|
+
broadcastToClients(typed);
|
|
82
|
+
}
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
log.warn('Failed to check existing runState before setDialogRunState', err, {
|
|
88
|
+
dialogId: dialogId.valueOf(),
|
|
89
|
+
});
|
|
90
|
+
}
|
|
61
91
|
try {
|
|
62
92
|
await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
|
|
63
93
|
kind: 'patch',
|
|
@@ -108,6 +138,12 @@ async function computeIdleRunStateFromPersistence(dialogId) {
|
|
|
108
138
|
if (status === 'completed' || status === 'archived') {
|
|
109
139
|
return { kind: 'terminal', status };
|
|
110
140
|
}
|
|
141
|
+
if (dialogId.selfId !== dialogId.rootId &&
|
|
142
|
+
latest &&
|
|
143
|
+
latest.runState &&
|
|
144
|
+
latest.runState.kind === 'dead') {
|
|
145
|
+
return latest.runState;
|
|
146
|
+
}
|
|
111
147
|
const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
|
|
112
148
|
const pendingSubdialogs = await persistence_1.DialogPersistence.loadPendingSubdialogs(dialogId, 'running');
|
|
113
149
|
const hasQ4H = q4h.length > 0;
|
|
@@ -128,6 +164,22 @@ async function reconcileRunStatesAfterRestart() {
|
|
|
128
164
|
for (const dialogId of dialogIds) {
|
|
129
165
|
const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
|
|
130
166
|
const existing = latest?.runState;
|
|
167
|
+
if (existing && existing.kind === 'dead' && dialogId.selfId !== dialogId.rootId) {
|
|
168
|
+
if (latest?.generating === true) {
|
|
169
|
+
try {
|
|
170
|
+
await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
|
|
171
|
+
kind: 'patch',
|
|
172
|
+
patch: { generating: false, runState: existing },
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
log.warn('Failed to clear generating flag for dead dialog after restart', err, {
|
|
177
|
+
dialogId: dialogId.valueOf(),
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
continue;
|
|
182
|
+
}
|
|
131
183
|
const wasProceeding = latest?.generating === true ||
|
|
132
184
|
(existing !== undefined &&
|
|
133
185
|
(existing.kind === 'proceeding' || existing.kind === 'proceeding_stop_requested'));
|
package/dist/dialog.js
CHANGED
|
@@ -101,9 +101,9 @@ class Dialog {
|
|
|
101
101
|
this.diligencePushRemainingBudget = 0;
|
|
102
102
|
// Diligence Push disable switch (persisted via latest.yaml; default = false).
|
|
103
103
|
this.disableDiligencePush = false;
|
|
104
|
-
// Current callId for tellask
|
|
105
|
-
// - Set during
|
|
106
|
-
// - Retrieved during
|
|
104
|
+
// Current callId for tellask call correlation
|
|
105
|
+
// - Set during teammate_call_finish_evt (from TellaskStreamParser)
|
|
106
|
+
// - Retrieved during inline call-result emission (for receiveTeammateCallResult callId parameter)
|
|
107
107
|
// - Enables frontend to attach result INLINE to the calling section
|
|
108
108
|
// - NOT used for teammate tellasks (which use calleeDialogId instead)
|
|
109
109
|
this._currentCallId = null;
|
|
@@ -164,19 +164,19 @@ class Dialog {
|
|
|
164
164
|
this._lastUserLanguageCode = language;
|
|
165
165
|
}
|
|
166
166
|
/**
|
|
167
|
-
* Get the current callId for
|
|
167
|
+
* Get the current callId for tellask call correlation
|
|
168
168
|
*
|
|
169
169
|
* Call Types:
|
|
170
|
-
* -
|
|
171
|
-
* - Teammate
|
|
170
|
+
* - Tellask call block (`!?@...`): callId is set during teammate_call_finish_evt, used for inline result correlation
|
|
171
|
+
* - Teammate tellask (@agentName): Uses calleeDialogId, not callId
|
|
172
172
|
*
|
|
173
|
-
* @returns The current callId for
|
|
173
|
+
* @returns The current callId for call correlation, or null if no active call
|
|
174
174
|
*/
|
|
175
175
|
getCurrentCallId() {
|
|
176
176
|
return this._currentCallId;
|
|
177
177
|
}
|
|
178
178
|
/**
|
|
179
|
-
* Set the current callId (called during
|
|
179
|
+
* Set the current callId (called during teammate_call_finish_evt for tellask call blocks)
|
|
180
180
|
*
|
|
181
181
|
* @param callId - The correlation ID from TellaskEventsReceiver.callFinish()
|
|
182
182
|
*/
|
|
@@ -625,15 +625,15 @@ class Dialog {
|
|
|
625
625
|
await this.dlgStore.callingBodyFinish(this);
|
|
626
626
|
}
|
|
627
627
|
async callingFinish(callId) {
|
|
628
|
-
// Store callId for
|
|
628
|
+
// Store callId for inline call-result correlation
|
|
629
629
|
this.setCurrentCallId(callId);
|
|
630
630
|
await this.dlgStore.callingFinish(this, callId);
|
|
631
631
|
}
|
|
632
632
|
/**
|
|
633
|
-
* Receive
|
|
633
|
+
* Receive call result with callId for inline correlation
|
|
634
634
|
*/
|
|
635
|
-
async
|
|
636
|
-
return await this.dlgStore.
|
|
635
|
+
async receiveTeammateCallResult(responderId, headLine, result, status, callId) {
|
|
636
|
+
return await this.dlgStore.receiveTeammateCallResult(this, responderId, headLine, result, status, callId);
|
|
637
637
|
}
|
|
638
638
|
/**
|
|
639
639
|
* Receive teammate response (separate bubble for @teammate tellasks)
|
|
@@ -944,9 +944,9 @@ class DialogStore {
|
|
|
944
944
|
sayingFinish(_dialog) { }
|
|
945
945
|
async receiveFuncResult(_dialog, _funcResult) { }
|
|
946
946
|
/**
|
|
947
|
-
* Receive
|
|
947
|
+
* Receive call result with callId for inline correlation
|
|
948
948
|
*/
|
|
949
|
-
async
|
|
949
|
+
async receiveTeammateCallResult(_dialog, _responderId, _headLine, _result, _status, _callId) { }
|
|
950
950
|
/**
|
|
951
951
|
* Receive teammate response (separate bubble for @teammate tellasks)
|
|
952
952
|
*/
|
|
@@ -161,21 +161,21 @@ OEC 代表了一种系统化的日常管理方法,强调**"日事日毕、日
|
|
|
161
161
|
- **DevOps 实践**:持续集成和部署反映了日常改进
|
|
162
162
|
- **知识管理**:系统化捕获和利用组织学习
|
|
163
163
|
|
|
164
|
-
## OEC
|
|
164
|
+
## OEC 在智能体 DevOps 上下文中的应用
|
|
165
165
|
|
|
166
|
-
|
|
166
|
+
在智能体 DevOps 工作中,快速清除至关重要。OEC 原则直接转化为自动化系统管理:
|
|
167
167
|
|
|
168
|
-
###
|
|
168
|
+
### **多进程对话**
|
|
169
169
|
|
|
170
|
-
-
|
|
171
|
-
-
|
|
170
|
+
- **每日重置**:使用更新的任务文档和空对话历史(主要是大篇幅、过时的工具调用结果)开启新一程对话
|
|
171
|
+
- **清除上下文**:确保所有智能体在最佳清晰度和更新信息下工作
|
|
172
172
|
- **即时解决**:在同一操作周期内解决问题和异常
|
|
173
173
|
|
|
174
|
-
###
|
|
174
|
+
### **智能体问责**
|
|
175
175
|
|
|
176
|
-
-
|
|
176
|
+
- **每人**:每个智能体有明确的操作参数和成功指标
|
|
177
177
|
- **每事**:每项流程、决策和结果都有日志记录且可追溯
|
|
178
|
-
-
|
|
178
|
+
- **每日**:智能体绩效的持续监控和改进
|
|
179
179
|
|
|
180
180
|
### **系统优化**
|
|
181
181
|
|
|
@@ -114,7 +114,7 @@ dominds webui -C ./my-workspace
|
|
|
114
114
|
dominds read [options] [member-id]
|
|
115
115
|
```
|
|
116
116
|
|
|
117
|
-
|
|
117
|
+
读取智能体系统提示词与工作区配置,常用于排查团队设置问题与核对当前生效配置。
|
|
118
118
|
|
|
119
119
|
**参数:**
|
|
120
120
|
|
|
@@ -214,8 +214,8 @@ dominds read
|
|
|
214
214
|
每个对话目录通常包含:
|
|
215
215
|
|
|
216
216
|
- `dialog.yaml` - 对话元数据
|
|
217
|
-
- `latest.yaml` -
|
|
218
|
-
- `course-001.jsonl
|
|
217
|
+
- `latest.yaml` - 当前进程编号 + lastModified 跟踪
|
|
218
|
+
- `course-001.jsonl`(第 1 程对话,后续还可以有编号递增的多程)- 流式消息文件
|
|
219
219
|
- `subdialogs/` - 嵌套子对话
|
|
220
220
|
|
|
221
221
|
## 错误处理
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Context Health Monitor
|
|
2
2
|
|
|
3
3
|
This document specifies a **context health monitor** feature for Dominds: a small, always-on signal
|
|
4
|
-
that helps the agent (and user) avoid degraded performance when the
|
|
4
|
+
that helps the agent (and user) avoid degraded performance when the dialog’s prompt/context is
|
|
5
5
|
getting too large relative to the model’s context window.
|
|
6
6
|
|
|
7
7
|
## Current Code Reality (as of 2026-01-28)
|
|
@@ -177,11 +177,6 @@ Note (zh UI copy):
|
|
|
177
177
|
- `caution` → “吃紧”
|
|
178
178
|
- `critical` → “告急”
|
|
179
179
|
|
|
180
|
-
### Q4H(kind=context_health_critical) send gating
|
|
181
|
-
|
|
182
|
-
This kind is retained as a reserved discriminator, but v3 no longer uses Q4H for critical context
|
|
183
|
-
health remediation by default.
|
|
184
|
-
|
|
185
180
|
## Implementation Outline
|
|
186
181
|
|
|
187
182
|
1. Refactor LLM provider wrappers to return token stats after each generation (including prompt
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# 上下文健康监控器
|
|
2
2
|
|
|
3
|
-
本文档为 Dominds
|
|
3
|
+
本文档为 Dominds 指定了一个**上下文健康监控器**特性:一个常驻的小型信号,帮助智能体(和用户)在对话的提示词/上下文相对于模型的上下文窗口变得过大时避免性能下降。
|
|
4
4
|
|
|
5
5
|
## 当前代码现状(截至 2026-01-28)
|
|
6
6
|
|
|
@@ -17,7 +17,7 @@ Dominds 已具备以下功能:
|
|
|
17
17
|
- 当对话上下文"过大"时,执行简短的、可执行的、可回归测试的 **v3 恢复**工作流:
|
|
18
18
|
- 在 **caution(警告)** 级别,记录一条自动插入的 **role=user prompt** 作为正常的、持久化的用户消息(UI 可见并渲染为正常的用户指令)。
|
|
19
19
|
- 在 **critical(严重)** 级别,通过**倒计时恢复**(最多 5 轮)强制执行稳定性:
|
|
20
|
-
- 每轮注入一条**记录的角色为 user 的 prompt**(UI 可见为用户 prompt
|
|
20
|
+
- 每轮注入一条**记录的角色为 user 的 prompt**(UI 可见为用户 prompt),指示智能体整理提醒项(`update_reminder`/`add_reminder`),然后执行 `clear_mind`。
|
|
21
21
|
- prompt 包含倒计时信号(在进行自动 `clear_mind` 之前还剩多少轮)。
|
|
22
22
|
- 当倒计时归零时,Dominds **自动**执行 `clear_mind`(无需 Q4H;无需暂停)以保持长期运行的自主性。
|
|
23
23
|
|
|
@@ -113,7 +113,7 @@ Dominds 计算比率:
|
|
|
113
113
|
|
|
114
114
|
- 进入 `caution` 时,Dominds 插入一次提示(入口注入)。
|
|
115
115
|
- 保持在 `caution` 状态时,Dominds 按节奏重新插入(默认:每 **10** 次生成;可按模型配置)。
|
|
116
|
-
-
|
|
116
|
+
- 每次插入的提示都要求智能体**整理提醒项**(至少一次调用):
|
|
117
117
|
- `update_reminder`(首选)/ `add_reminder`
|
|
118
118
|
- 在提醒项内维护接续包草稿
|
|
119
119
|
- 当可扫描/可操作时执行 `clear_mind`
|
|
@@ -122,7 +122,7 @@ Dominds 计算比率:
|
|
|
122
122
|
|
|
123
123
|
当 `level === 'critical'` 时,驱动程序进入**倒计时恢复**(最多 **5** 轮):
|
|
124
124
|
|
|
125
|
-
- 每轮,驱动程序记录一条 **role=user prompt**(持久化为用户消息),在 UI 中作为用户 prompt
|
|
125
|
+
- 每轮,驱动程序记录一条 **role=user prompt**(持久化为用户消息),在 UI 中作为用户 prompt 可见。此提示告诉智能体:
|
|
126
126
|
- 通过 `update_reminder` / `add_reminder` 整理提醒项(尽力而为的接续包),然后调用 `clear_mind` 开始新一程。
|
|
127
127
|
- 提示包含倒计时:经过 **N** 轮后系统将自动清空。
|
|
128
128
|
- 当倒计时归零时,驱动程序**自动调用** `clear_mind`(带空参数;不要求 `reminder_content`),开始新一程且无需暂停。
|
|
@@ -153,14 +153,10 @@ Dominds 计算比率:
|
|
|
153
153
|
- `caution` → "吃紧"
|
|
154
154
|
- `critical` → "告急"
|
|
155
155
|
|
|
156
|
-
### Q4H(kind=context_health_critical) 发送门控
|
|
157
|
-
|
|
158
|
-
此 kind 保留为预留的鉴别符,但 v3 默认不再使用 Q4H 进行关键上下文健康恢复。
|
|
159
|
-
|
|
160
156
|
## 实现大纲
|
|
161
157
|
|
|
162
158
|
1. 重构 LLM 提供商包装器以在每次生成后返回 token 统计(包括提供商报告时的提示词 token 计数)。
|
|
163
|
-
2.
|
|
159
|
+
2. 将使用统计传入对话状态(与每程对话一起持久化)。
|
|
164
160
|
3. 实现上下文健康监控计算并每次生成持久化。
|
|
165
161
|
4. 实现 v3 恢复(持久化的 role=user 提示插入 + 警告提醒整理节奏 + 严重倒计时 + 自动 clear_mind)。
|
|
166
162
|
5. 为 v3 行为添加最小回归防护(类型 + 门控)。
|
|
@@ -172,6 +168,6 @@ Dominds 计算比率:
|
|
|
172
168
|
- 未配置时 `optimal_max_tokens` 默认为 `100_000`。
|
|
173
169
|
- 未配置时 `critical_max_tokens` 默认为 `floor(modelContextLimitTokens * 0.9)`。
|
|
174
170
|
- v3 恢复:
|
|
175
|
-
- `caution`:驱动程序插入持久化的 role=user prompt(UI 可见的用户指令)。进入 `caution` 时插入一次;保持在 `caution` 状态时按节奏重新插入(默认:每 10
|
|
171
|
+
- `caution`:驱动程序插入持久化的 role=user prompt(UI 可见的用户指令)。进入 `caution` 时插入一次;保持在 `caution` 状态时按节奏重新插入(默认:每 10 次生成;可按模型配置)。每次智能体必须至少调用 `update_reminder` / `add_reminder` 之一并维护接续包草稿,然后在就绪时执行 `clear_mind`。
|
|
176
172
|
- `critical`:驱动程序使用**记录的角色为 user 的 prompt** 运行倒计时恢复(最多 5 轮)。每次提示包含倒计时并指示提醒整理 + `clear_mind`。当倒计时归零时,驱动程序自动执行 `clear_mind` 并开始新一程(无 Q4H,无暂停)。
|
|
177
173
|
- UI 显示上下文健康状态:绿色/黄色/红色(以及使用情况不可用时的"未知"处理)。
|
package/dist/docs/design.md
CHANGED
|
@@ -71,7 +71,7 @@ This fundamental problem manifests in several ways:
|
|
|
71
71
|
- Redundant information and circular conversations
|
|
72
72
|
|
|
73
73
|
2. **Context Pollution**
|
|
74
|
-
- Accumulated
|
|
74
|
+
- Accumulated dialog history that obscures current priorities
|
|
75
75
|
- Outdated information that conflicts with current state
|
|
76
76
|
- Mixed signal-to-noise ratio in conversation threads
|
|
77
77
|
|
|
@@ -335,19 +335,19 @@ Agent: [Clean mental state + Taskdoc only] + Specific sub-problem
|
|
|
335
335
|
Main Dialog (Root Dialog)
|
|
336
336
|
├── Taskdoc Reference → tasks/feature-auth.tsk/ (Workspace Taskdoc package)
|
|
337
337
|
├── Reminders (Working Memory)
|
|
338
|
-
├──
|
|
338
|
+
├── Dialog Messages (Ephemeral)
|
|
339
339
|
└── Subdialogs (Tree-Structured, Stored Flat Under Main Dialog)
|
|
340
340
|
├── Specialized Agent A
|
|
341
341
|
│ ├── Taskdoc Reference → tasks/feature-auth.tsk/ (Same Taskdoc package)
|
|
342
342
|
│ ├── Parent Call Context
|
|
343
343
|
│ ├── Local Reminders
|
|
344
|
-
│ └── Local
|
|
344
|
+
│ └── Local Dialog Messages
|
|
345
345
|
│ └── Sub-Subdialogs (Further Nesting Possible)
|
|
346
346
|
└── Specialized Agent B
|
|
347
347
|
├── Taskdoc Reference → tasks/feature-auth.tsk/ (Same Taskdoc package)
|
|
348
348
|
├── Parent Call Context
|
|
349
349
|
├── Local Reminders
|
|
350
|
-
└── Local
|
|
350
|
+
└── Local Dialog Messages
|
|
351
351
|
|
|
352
352
|
```
|
|
353
353
|
|
|
@@ -371,7 +371,7 @@ Main Dialog (Root Dialog)
|
|
|
371
371
|
- Can link to other product documentation and evolve as project requirements change
|
|
372
372
|
2. **Reminders**: Semi-persistent, dialog-scoped, survives conversation cleanup
|
|
373
373
|
3. **Parent Call Context**: Inherited context for subdialogs
|
|
374
|
-
4. **
|
|
374
|
+
4. **Dialog Messages**: Ephemeral, subject to cleanup for mental clarity
|
|
375
375
|
|
|
376
376
|
#### Workspace-Persistent Memory (DevOps Lifecycle)
|
|
377
377
|
|