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.
Files changed (148) hide show
  1. package/README.md +1 -1
  2. package/dist/dialog-run-state.js +52 -0
  3. package/dist/dialog.js +14 -14
  4. package/dist/docs/OEC-philosophy.zh.md +8 -8
  5. package/dist/docs/cli-usage.zh.md +3 -3
  6. package/dist/docs/context-health.md +1 -6
  7. package/dist/docs/context-health.zh.md +6 -10
  8. package/dist/docs/design.md +5 -5
  9. package/dist/docs/design.zh.md +64 -64
  10. package/dist/docs/dialog-persistence.md +1 -0
  11. package/dist/docs/dialog-persistence.zh.md +38 -37
  12. package/dist/docs/dialog-system.md +44 -38
  13. package/dist/docs/dialog-system.zh.md +49 -50
  14. package/dist/docs/dominds-terminology.md +85 -21
  15. package/dist/docs/encapsulated-taskdoc.md +2 -2
  16. package/dist/docs/encapsulated-taskdoc.zh.md +9 -9
  17. package/dist/docs/interruption-resumption.md +1 -1
  18. package/dist/docs/mcp-support.md +23 -1
  19. package/dist/docs/mcp-support.zh.md +28 -8
  20. package/dist/docs/memory-system.md +5 -5
  21. package/dist/docs/memory-system.zh.md +2 -2
  22. package/dist/docs/mottos.zh.md +27 -27
  23. package/dist/docs/team-mgmt-toolset.md +6 -0
  24. package/dist/docs/team-mgmt-toolset.zh.md +6 -0
  25. package/dist/docs/txt-editing-tools.md +1 -1
  26. package/dist/llm/defaults.yaml +5 -5
  27. package/dist/llm/driver.js +104 -33
  28. package/dist/llm/gen/anthropic.js +104 -7
  29. package/dist/llm/gen/artifacts.js +132 -0
  30. package/dist/llm/gen/codex.js +59 -8
  31. package/dist/llm/gen/openai-compatible.js +591 -0
  32. package/dist/llm/gen/openai.js +90 -11
  33. package/dist/llm/gen/registry.js +2 -0
  34. package/dist/mcp/sdk-client.js +17 -0
  35. package/dist/mcp/server-runtime.js +15 -0
  36. package/dist/mcp/supervisor.js +191 -8
  37. package/dist/minds/load.js +48 -2
  38. package/dist/minds/minds-i18n.js +1 -1
  39. package/dist/minds/system-prompt.js +64 -39
  40. package/dist/persistence.js +54 -33
  41. package/dist/server/api-routes.js +123 -0
  42. package/dist/server/websocket-handler.js +87 -1
  43. package/dist/shared/i18n/driver-messages.js +21 -21
  44. package/dist/shared/team-mgmt-manual.js +4 -0
  45. package/dist/static/assets/{_baseUniq-IySq1VQ3.js → _baseUniq-B2sVW3D4.js} +2 -2
  46. package/dist/static/assets/{_baseUniq-IySq1VQ3.js.map → _baseUniq-B2sVW3D4.js.map} +1 -1
  47. package/dist/static/assets/{arc-D_0v1_GT.js → arc-BFq7_TMc.js} +2 -2
  48. package/dist/static/assets/{arc-D_0v1_GT.js.map → arc-BFq7_TMc.js.map} +1 -1
  49. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DjtPdAc_.js → architectureDiagram-VXUJARFQ-_T6aHd0q.js} +6 -6
  50. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DjtPdAc_.js.map → architectureDiagram-VXUJARFQ-_T6aHd0q.js.map} +1 -1
  51. package/dist/static/assets/{blockDiagram-VD42YOAC-xTQ-l3yQ.js → blockDiagram-VD42YOAC-DEi7fjsU.js} +7 -7
  52. package/dist/static/assets/{blockDiagram-VD42YOAC-xTQ-l3yQ.js.map → blockDiagram-VD42YOAC-DEi7fjsU.js.map} +1 -1
  53. package/dist/static/assets/{c4Diagram-YG6GDRKO-CMKKv91j.js → c4Diagram-YG6GDRKO-DsgtlnW1.js} +3 -3
  54. package/dist/static/assets/{c4Diagram-YG6GDRKO-CMKKv91j.js.map → c4Diagram-YG6GDRKO-DsgtlnW1.js.map} +1 -1
  55. package/dist/static/assets/{channel-CRKIVjHv.js → channel-D8XY6fY8.js} +2 -2
  56. package/dist/static/assets/{channel-CRKIVjHv.js.map → channel-D8XY6fY8.js.map} +1 -1
  57. package/dist/static/assets/{chunk-4BX2VUAB-CczzKjHP.js → chunk-4BX2VUAB-BXavLJHX.js} +2 -2
  58. package/dist/static/assets/{chunk-4BX2VUAB-CczzKjHP.js.map → chunk-4BX2VUAB-BXavLJHX.js.map} +1 -1
  59. package/dist/static/assets/{chunk-55IACEB6-ACUQE03I.js → chunk-55IACEB6-TVh3_rJY.js} +2 -2
  60. package/dist/static/assets/{chunk-55IACEB6-ACUQE03I.js.map → chunk-55IACEB6-TVh3_rJY.js.map} +1 -1
  61. package/dist/static/assets/{chunk-B4BG7PRW-vQ1NxBhN.js → chunk-B4BG7PRW-BW4XDN74.js} +5 -5
  62. package/dist/static/assets/{chunk-B4BG7PRW-vQ1NxBhN.js.map → chunk-B4BG7PRW-BW4XDN74.js.map} +1 -1
  63. package/dist/static/assets/{chunk-DI55MBZ5-CYJ0966n.js → chunk-DI55MBZ5-6-zlf3d9.js} +4 -4
  64. package/dist/static/assets/{chunk-DI55MBZ5-CYJ0966n.js.map → chunk-DI55MBZ5-6-zlf3d9.js.map} +1 -1
  65. package/dist/static/assets/{chunk-FMBD7UC4-B2VZLM0L.js → chunk-FMBD7UC4-DTf_1eJX.js} +2 -2
  66. package/dist/static/assets/{chunk-FMBD7UC4-B2VZLM0L.js.map → chunk-FMBD7UC4-DTf_1eJX.js.map} +1 -1
  67. package/dist/static/assets/{chunk-QN33PNHL-CHUNzj8Y.js → chunk-QN33PNHL-BqTE4-ru.js} +2 -2
  68. package/dist/static/assets/{chunk-QN33PNHL-CHUNzj8Y.js.map → chunk-QN33PNHL-BqTE4-ru.js.map} +1 -1
  69. package/dist/static/assets/{chunk-QZHKN3VN-gMDHzg0I.js → chunk-QZHKN3VN-Y9cm19qF.js} +2 -2
  70. package/dist/static/assets/{chunk-QZHKN3VN-gMDHzg0I.js.map → chunk-QZHKN3VN-Y9cm19qF.js.map} +1 -1
  71. package/dist/static/assets/{chunk-TZMSLE5B-BIgjMOir.js → chunk-TZMSLE5B-il_N_54T.js} +2 -2
  72. package/dist/static/assets/{chunk-TZMSLE5B-BIgjMOir.js.map → chunk-TZMSLE5B-il_N_54T.js.map} +1 -1
  73. package/dist/static/assets/{classDiagram-2ON5EDUG-CAQtEg_0.js → classDiagram-2ON5EDUG-BApxZww_.js} +6 -6
  74. package/dist/static/assets/{classDiagram-2ON5EDUG-CAQtEg_0.js.map → classDiagram-2ON5EDUG-BApxZww_.js.map} +1 -1
  75. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CAQtEg_0.js → classDiagram-v2-WZHVMYZB-BApxZww_.js} +6 -6
  76. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-CAQtEg_0.js.map → classDiagram-v2-WZHVMYZB-BApxZww_.js.map} +1 -1
  77. package/dist/static/assets/{clone-DNETFbtK.js → clone-C3zblQcx.js} +2 -2
  78. package/dist/static/assets/{clone-DNETFbtK.js.map → clone-C3zblQcx.js.map} +1 -1
  79. package/dist/static/assets/{cose-bilkent-S5V4N54A-ssrS_ozh.js → cose-bilkent-S5V4N54A-DqkHO1Av.js} +2 -2
  80. package/dist/static/assets/{cose-bilkent-S5V4N54A-ssrS_ozh.js.map → cose-bilkent-S5V4N54A-DqkHO1Av.js.map} +1 -1
  81. package/dist/static/assets/{dagre-6UL2VRFP-Bu4cduK4.js → dagre-6UL2VRFP-jy0XRAqR.js} +7 -7
  82. package/dist/static/assets/{dagre-6UL2VRFP-Bu4cduK4.js.map → dagre-6UL2VRFP-jy0XRAqR.js.map} +1 -1
  83. package/dist/static/assets/{diagram-PSM6KHXK-TopJipkw.js → diagram-PSM6KHXK-Bf5eWQO4.js} +7 -7
  84. package/dist/static/assets/{diagram-PSM6KHXK-TopJipkw.js.map → diagram-PSM6KHXK-Bf5eWQO4.js.map} +1 -1
  85. package/dist/static/assets/{diagram-QEK2KX5R-YPIKk7UN.js → diagram-QEK2KX5R-B8O1x6s2.js} +6 -6
  86. package/dist/static/assets/{diagram-QEK2KX5R-YPIKk7UN.js.map → diagram-QEK2KX5R-B8O1x6s2.js.map} +1 -1
  87. package/dist/static/assets/{diagram-S2PKOQOG-C61aFK6h.js → diagram-S2PKOQOG-D3FDgXbX.js} +6 -6
  88. package/dist/static/assets/{diagram-S2PKOQOG-C61aFK6h.js.map → diagram-S2PKOQOG-D3FDgXbX.js.map} +1 -1
  89. package/dist/static/assets/{erDiagram-Q2GNP2WA-CyW-28SO.js → erDiagram-Q2GNP2WA-9z9xHjnH.js} +5 -5
  90. package/dist/static/assets/{erDiagram-Q2GNP2WA-CyW-28SO.js.map → erDiagram-Q2GNP2WA-9z9xHjnH.js.map} +1 -1
  91. package/dist/static/assets/{flowDiagram-NV44I4VS-B2ZSAkDb.js → flowDiagram-NV44I4VS-BwcoP6mb.js} +6 -6
  92. package/dist/static/assets/{flowDiagram-NV44I4VS-B2ZSAkDb.js.map → flowDiagram-NV44I4VS-BwcoP6mb.js.map} +1 -1
  93. package/dist/static/assets/{ganttDiagram-JELNMOA3-7M4RBqzS.js → ganttDiagram-JELNMOA3-DTxymBuZ.js} +3 -3
  94. package/dist/static/assets/{ganttDiagram-JELNMOA3-7M4RBqzS.js.map → ganttDiagram-JELNMOA3-DTxymBuZ.js.map} +1 -1
  95. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-esQryKY5.js → gitGraphDiagram-NY62KEGX-D_gXk1gO.js} +7 -7
  96. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-esQryKY5.js.map → gitGraphDiagram-NY62KEGX-D_gXk1gO.js.map} +1 -1
  97. package/dist/static/assets/{graph-CiUwLoK6.js → graph-BuwrGKeW.js} +3 -3
  98. package/dist/static/assets/{graph-CiUwLoK6.js.map → graph-BuwrGKeW.js.map} +1 -1
  99. package/dist/static/assets/{index--tkbs_Q1.js → index-BsoeBQZ-.js} +533 -119
  100. package/dist/static/assets/index-BsoeBQZ-.js.map +1 -0
  101. package/dist/static/assets/{infoDiagram-WHAUD3N6-BtGwlvel.js → infoDiagram-WHAUD3N6-CZoUYjvD.js} +5 -5
  102. package/dist/static/assets/{infoDiagram-WHAUD3N6-BtGwlvel.js.map → infoDiagram-WHAUD3N6-CZoUYjvD.js.map} +1 -1
  103. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-OG_bZVNn.js → journeyDiagram-XKPGCS4Q-BePDKeg1.js} +5 -5
  104. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-OG_bZVNn.js.map → journeyDiagram-XKPGCS4Q-BePDKeg1.js.map} +1 -1
  105. package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cv9Vlgp-.js → kanban-definition-3W4ZIXB7-C-ToxWuS.js} +3 -3
  106. package/dist/static/assets/{kanban-definition-3W4ZIXB7-Cv9Vlgp-.js.map → kanban-definition-3W4ZIXB7-C-ToxWuS.js.map} +1 -1
  107. package/dist/static/assets/{layout-CwU5VRA8.js → layout-CMhaiMtq.js} +5 -5
  108. package/dist/static/assets/{layout-CwU5VRA8.js.map → layout-CMhaiMtq.js.map} +1 -1
  109. package/dist/static/assets/{linear-BdxEG_yr.js → linear-BFFtKZ55.js} +2 -2
  110. package/dist/static/assets/{linear-BdxEG_yr.js.map → linear-BFFtKZ55.js.map} +1 -1
  111. package/dist/static/assets/{min-DwrBYJbp.js → min-Dfm0bwcG.js} +3 -3
  112. package/dist/static/assets/{min-DwrBYJbp.js.map → min-Dfm0bwcG.js.map} +1 -1
  113. package/dist/static/assets/{mindmap-definition-VGOIOE7T-D0rcE-nw.js → mindmap-definition-VGOIOE7T-KJ4wuuPs.js} +4 -4
  114. package/dist/static/assets/{mindmap-definition-VGOIOE7T-D0rcE-nw.js.map → mindmap-definition-VGOIOE7T-KJ4wuuPs.js.map} +1 -1
  115. package/dist/static/assets/{pieDiagram-ADFJNKIX-BvaJvjf0.js → pieDiagram-ADFJNKIX-B8yHUm80.js} +7 -7
  116. package/dist/static/assets/{pieDiagram-ADFJNKIX-BvaJvjf0.js.map → pieDiagram-ADFJNKIX-B8yHUm80.js.map} +1 -1
  117. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-Bcj_xOgy.js → quadrantDiagram-AYHSOK5B-BdAra1H_.js} +3 -3
  118. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-Bcj_xOgy.js.map → quadrantDiagram-AYHSOK5B-BdAra1H_.js.map} +1 -1
  119. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-BEyvE0te.js → requirementDiagram-UZGBJVZJ-Bg9AEI1n.js} +4 -4
  120. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-BEyvE0te.js.map → requirementDiagram-UZGBJVZJ-Bg9AEI1n.js.map} +1 -1
  121. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DgUuT-8m.js → sankeyDiagram-TZEHDZUN-B-LujBRP.js} +2 -2
  122. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-DgUuT-8m.js.map → sankeyDiagram-TZEHDZUN-B-LujBRP.js.map} +1 -1
  123. package/dist/static/assets/{sequenceDiagram-WL72ISMW-BUUdKln_.js → sequenceDiagram-WL72ISMW-Ctethirl.js} +4 -4
  124. package/dist/static/assets/{sequenceDiagram-WL72ISMW-BUUdKln_.js.map → sequenceDiagram-WL72ISMW-Ctethirl.js.map} +1 -1
  125. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CRudpqrn.js → stateDiagram-FKZM4ZOC-DhgNaoOm.js} +9 -9
  126. package/dist/static/assets/{stateDiagram-FKZM4ZOC-CRudpqrn.js.map → stateDiagram-FKZM4ZOC-DhgNaoOm.js.map} +1 -1
  127. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CIcTkWXG.js → stateDiagram-v2-4FDKWEC3-S5n1tnCJ.js} +5 -5
  128. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-CIcTkWXG.js.map → stateDiagram-v2-4FDKWEC3-S5n1tnCJ.js.map} +1 -1
  129. package/dist/static/assets/{timeline-definition-IT6M3QCI-CJO9Jpoj.js → timeline-definition-IT6M3QCI-tIDoJIBZ.js} +3 -3
  130. package/dist/static/assets/{timeline-definition-IT6M3QCI-CJO9Jpoj.js.map → timeline-definition-IT6M3QCI-tIDoJIBZ.js.map} +1 -1
  131. package/dist/static/assets/{treemap-KMMF4GRG-ChlAb63h.js → treemap-KMMF4GRG-7MxcPSQ7.js} +4 -4
  132. package/dist/static/assets/{treemap-KMMF4GRG-ChlAb63h.js.map → treemap-KMMF4GRG-7MxcPSQ7.js.map} +1 -1
  133. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DD-kXv8c.js → xychartDiagram-PRI3JC2R-DoGRC1ZA.js} +3 -3
  134. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DD-kXv8c.js.map → xychartDiagram-PRI3JC2R-DoGRC1ZA.js.map} +1 -1
  135. package/dist/static/index.html +1 -1
  136. package/dist/static/testing/e2e-test-helper.js +41 -41
  137. package/dist/tools/builtins.js +7 -5
  138. package/dist/tools/ctrl.js +25 -3
  139. package/dist/tools/mcp.js +27 -6
  140. package/dist/tools/plan.js +154 -0
  141. package/dist/tools/prompts/team_mgmt.en.md +1 -1
  142. package/dist/tools/prompts/ws_mod.en.md +1 -1
  143. package/dist/tools/team-mgmt.js +88 -21
  144. package/dist/tools/txt.js +2 -2
  145. package/dist/utils/id.js +2 -2
  146. package/dist/utils/taskdoc.js +3 -3
  147. package/package.json +1 -1
  148. 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-call noise when a dialog becomes cluttered.
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
 
@@ -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 tool-call correlation
105
- // - Set during tool_call_finish_evt (from TellaskStreamParser)
106
- // - Retrieved during tool response (for receiveToolResponse callId parameter)
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 tool-call correlation
167
+ * Get the current callId for tellask call correlation
168
168
  *
169
169
  * Call Types:
170
- * - Tool Call (`!?@tool_name`): callId is set during tool_call_start_evt, used for inline result
171
- * - Teammate Tellask (@agentName): Uses calleeDialogId, not callId
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 tool correlation, or null if no active tool call
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 tool_call_finish_evt for tool calls)
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 tool call correlation
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 tool response with callId for inline correlation
633
+ * Receive call result with callId for inline correlation
634
634
  */
635
- async receiveToolResponse(responderId, headLine, result, status, callId) {
636
- return await this.dlgStore.receiveToolResponse(this, responderId, headLine, result, status, callId);
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 tool response with callId for inline correlation
947
+ * Receive call result with callId for inline correlation
948
948
  */
949
- async receiveToolResponse(_dialog, _responderId, _headLine, _result, _status, _callId) { }
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 在代理 DevOps 上下文中的应用
164
+ ## OEC 在智能体 DevOps 上下文中的应用
165
165
 
166
- 在代理 DevOps 工作中,快速清除至关重要。OEC 原则直接转化为自动化系统管理:
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` - 当前轮次 + lastModified 跟踪
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 conversation’s prompt/context is
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),指示代理整理提醒项(`update_reminder`/`add_reminder`),然后执行 `clear_mind`。
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 次生成;可按模型配置)。每次代理必须至少调用 `update_reminder` / `add_reminder` 之一并维护接续包草稿,然后在就绪时执行 `clear_mind`。
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 显示上下文健康状态:绿色/黄色/红色(以及使用情况不可用时的"未知"处理)。
@@ -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 chat history that obscures current priorities
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
- ├── Chat Messages (Ephemeral)
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 Chat Messages
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 Chat Messages
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. **Chat Messages**: Ephemeral, subject to cleanup for mental clarity
374
+ 4. **Dialog Messages**: Ephemeral, subject to cleanup for mental clarity
375
375
 
376
376
  #### Workspace-Persistent Memory (DevOps Lifecycle)
377
377