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.
Files changed (120) hide show
  1. package/dist/dialog-global-registry.js +58 -3
  2. package/dist/dialog.js +17 -0
  3. package/dist/docs/dialog-system.md +18 -16
  4. package/dist/docs/dialog-system.zh.md +20 -19
  5. package/dist/evt-registry.js +16 -7
  6. package/dist/llm/driver-v2/context.js +2 -1
  7. package/dist/llm/driver-v2/core.js +102 -119
  8. package/dist/llm/driver-v2/orchestrator.js +65 -38
  9. package/dist/llm/driver-v2/round.js +213 -35
  10. package/dist/llm/driver-v2/runtime-utils.js +1 -0
  11. package/dist/llm/driver-v2/supdialog-response.js +5 -18
  12. package/dist/llm/driver-v2/tellask-bridge.js +95 -6
  13. package/dist/llm/driver.js +29 -2
  14. package/dist/minds/builtin/cmdr/persona.md +3 -0
  15. package/dist/minds/builtin/dijiang/knowledge.md +287 -0
  16. package/dist/minds/builtin/dijiang/persona.md +7 -0
  17. package/dist/persistence.js +28 -0
  18. package/dist/server/websocket-handler.js +134 -25
  19. package/dist/shared/diligence.js +8 -2
  20. package/dist/showing-by-doing.js +31 -34
  21. package/dist/static/assets/{_baseUniq-BxKNVs_E.js → _baseUniq-zV3pyJ-s.js} +2 -2
  22. package/dist/static/assets/{_baseUniq-BxKNVs_E.js.map → _baseUniq-zV3pyJ-s.js.map} +1 -1
  23. package/dist/static/assets/{arc-SobL0GO-.js → arc-Ctgmrh71.js} +2 -2
  24. package/dist/static/assets/{arc-SobL0GO-.js.map → arc-Ctgmrh71.js.map} +1 -1
  25. package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js → architectureDiagram-VXUJARFQ-CAH1Zinn.js} +6 -6
  26. package/dist/static/assets/{architectureDiagram-VXUJARFQ-MMDS1QOC.js.map → architectureDiagram-VXUJARFQ-CAH1Zinn.js.map} +1 -1
  27. package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js → blockDiagram-VD42YOAC-Djz6JdD2.js} +7 -7
  28. package/dist/static/assets/{blockDiagram-VD42YOAC-BOsSirNK.js.map → blockDiagram-VD42YOAC-Djz6JdD2.js.map} +1 -1
  29. package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js → c4Diagram-YG6GDRKO-CSuskOyq.js} +3 -3
  30. package/dist/static/assets/{c4Diagram-YG6GDRKO-D4jQkzwx.js.map → c4Diagram-YG6GDRKO-CSuskOyq.js.map} +1 -1
  31. package/dist/static/assets/{channel-CNJ5IKbI.js → channel-Ym6U59Kh.js} +2 -2
  32. package/dist/static/assets/{channel-CNJ5IKbI.js.map → channel-Ym6U59Kh.js.map} +1 -1
  33. package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js → chunk-4BX2VUAB-CqbVylSz.js} +2 -2
  34. package/dist/static/assets/{chunk-4BX2VUAB-Dzp3xxyo.js.map → chunk-4BX2VUAB-CqbVylSz.js.map} +1 -1
  35. package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js → chunk-55IACEB6-CeWj8Jm_.js} +2 -2
  36. package/dist/static/assets/{chunk-55IACEB6-CbmixuSI.js.map → chunk-55IACEB6-CeWj8Jm_.js.map} +1 -1
  37. package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js → chunk-B4BG7PRW-BjxJkuhq.js} +5 -5
  38. package/dist/static/assets/{chunk-B4BG7PRW-CdpmYjdb.js.map → chunk-B4BG7PRW-BjxJkuhq.js.map} +1 -1
  39. package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js → chunk-DI55MBZ5-9kxfXB4B.js} +4 -4
  40. package/dist/static/assets/{chunk-DI55MBZ5-wBUIgR3h.js.map → chunk-DI55MBZ5-9kxfXB4B.js.map} +1 -1
  41. package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js → chunk-FMBD7UC4-DyM3IVWB.js} +2 -2
  42. package/dist/static/assets/{chunk-FMBD7UC4-l62jcBz-.js.map → chunk-FMBD7UC4-DyM3IVWB.js.map} +1 -1
  43. package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js → chunk-QN33PNHL-DGU21aEB.js} +2 -2
  44. package/dist/static/assets/{chunk-QN33PNHL-BXfKZUpE.js.map → chunk-QN33PNHL-DGU21aEB.js.map} +1 -1
  45. package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js → chunk-QZHKN3VN-Cw9Hpt-y.js} +2 -2
  46. package/dist/static/assets/{chunk-QZHKN3VN-BYB4VxWj.js.map → chunk-QZHKN3VN-Cw9Hpt-y.js.map} +1 -1
  47. package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js → chunk-TZMSLE5B-J-eTCnFj.js} +2 -2
  48. package/dist/static/assets/{chunk-TZMSLE5B-CvlWEnXl.js.map → chunk-TZMSLE5B-J-eTCnFj.js.map} +1 -1
  49. package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js → classDiagram-2ON5EDUG-BvoDAd8E.js} +6 -6
  50. package/dist/static/assets/{classDiagram-2ON5EDUG-x2kw_AQY.js.map → classDiagram-2ON5EDUG-BvoDAd8E.js.map} +1 -1
  51. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js → classDiagram-v2-WZHVMYZB-BvoDAd8E.js} +6 -6
  52. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-x2kw_AQY.js.map → classDiagram-v2-WZHVMYZB-BvoDAd8E.js.map} +1 -1
  53. package/dist/static/assets/{clone-CfBpi3MU.js → clone-CojsCkky.js} +2 -2
  54. package/dist/static/assets/{clone-CfBpi3MU.js.map → clone-CojsCkky.js.map} +1 -1
  55. package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js → cose-bilkent-S5V4N54A-BEtK3OcG.js} +2 -2
  56. package/dist/static/assets/{cose-bilkent-S5V4N54A-DQSzPb7y.js.map → cose-bilkent-S5V4N54A-BEtK3OcG.js.map} +1 -1
  57. package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js → dagre-6UL2VRFP-C5DMaVj0.js} +7 -7
  58. package/dist/static/assets/{dagre-6UL2VRFP-BuBo_U3J.js.map → dagre-6UL2VRFP-C5DMaVj0.js.map} +1 -1
  59. package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js → diagram-PSM6KHXK-kVP0dZ6K.js} +7 -7
  60. package/dist/static/assets/{diagram-PSM6KHXK-J2z13Z5A.js.map → diagram-PSM6KHXK-kVP0dZ6K.js.map} +1 -1
  61. package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js → diagram-QEK2KX5R-C4p2yibe.js} +6 -6
  62. package/dist/static/assets/{diagram-QEK2KX5R-x8XUGykE.js.map → diagram-QEK2KX5R-C4p2yibe.js.map} +1 -1
  63. package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js → diagram-S2PKOQOG-B3vObsYY.js} +6 -6
  64. package/dist/static/assets/{diagram-S2PKOQOG-BE6Nr1BM.js.map → diagram-S2PKOQOG-B3vObsYY.js.map} +1 -1
  65. package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js → erDiagram-Q2GNP2WA-AKQItpVu.js} +5 -5
  66. package/dist/static/assets/{erDiagram-Q2GNP2WA-D3qVnFAh.js.map → erDiagram-Q2GNP2WA-AKQItpVu.js.map} +1 -1
  67. package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js → flowDiagram-NV44I4VS-2dalJoL3.js} +6 -6
  68. package/dist/static/assets/{flowDiagram-NV44I4VS-Cjp9Rt9t.js.map → flowDiagram-NV44I4VS-2dalJoL3.js.map} +1 -1
  69. package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js → ganttDiagram-JELNMOA3-DUw98Lbz.js} +3 -3
  70. package/dist/static/assets/{ganttDiagram-JELNMOA3-D_hc66FC.js.map → ganttDiagram-JELNMOA3-DUw98Lbz.js.map} +1 -1
  71. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js → gitGraphDiagram-NY62KEGX-DdwIFk8M.js} +7 -7
  72. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-1I_zaTtz.js.map → gitGraphDiagram-NY62KEGX-DdwIFk8M.js.map} +1 -1
  73. package/dist/static/assets/{graph-K6mmQESm.js → graph-BBEAP9Z9.js} +3 -3
  74. package/dist/static/assets/{graph-K6mmQESm.js.map → graph-BBEAP9Z9.js.map} +1 -1
  75. package/dist/static/assets/{index-RV1MEt3b.js → index-CqMOe9zt.js} +195 -114
  76. package/dist/static/assets/index-CqMOe9zt.js.map +1 -0
  77. package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js → infoDiagram-WHAUD3N6-Cep11ST9.js} +5 -5
  78. package/dist/static/assets/{infoDiagram-WHAUD3N6-CqazW4ov.js.map → infoDiagram-WHAUD3N6-Cep11ST9.js.map} +1 -1
  79. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js} +5 -5
  80. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CCwUViz2.js.map → journeyDiagram-XKPGCS4Q-Ba8wkBNB.js.map} +1 -1
  81. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js → kanban-definition-3W4ZIXB7-DhxNBORX.js} +3 -3
  82. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BKj9P06Z.js.map → kanban-definition-3W4ZIXB7-DhxNBORX.js.map} +1 -1
  83. package/dist/static/assets/{layout-BcrPlYah.js → layout-Ckbr6Zyz.js} +5 -5
  84. package/dist/static/assets/{layout-BcrPlYah.js.map → layout-Ckbr6Zyz.js.map} +1 -1
  85. package/dist/static/assets/{linear-DYXbzldi.js → linear-BrSsI51I.js} +2 -2
  86. package/dist/static/assets/{linear-DYXbzldi.js.map → linear-BrSsI51I.js.map} +1 -1
  87. package/dist/static/assets/{min-CAfJrdkg.js → min-CeEvLc8D.js} +3 -3
  88. package/dist/static/assets/{min-CAfJrdkg.js.map → min-CeEvLc8D.js.map} +1 -1
  89. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js → mindmap-definition-VGOIOE7T-7ctLd3o3.js} +4 -4
  90. package/dist/static/assets/{mindmap-definition-VGOIOE7T-CXWJYrd0.js.map → mindmap-definition-VGOIOE7T-7ctLd3o3.js.map} +1 -1
  91. package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js → pieDiagram-ADFJNKIX-CqyILziW.js} +7 -7
  92. package/dist/static/assets/{pieDiagram-ADFJNKIX-DjKlsPYr.js.map → pieDiagram-ADFJNKIX-CqyILziW.js.map} +1 -1
  93. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js → quadrantDiagram-AYHSOK5B-Byi_xYum.js} +3 -3
  94. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-fcJtlyUO.js.map → quadrantDiagram-AYHSOK5B-Byi_xYum.js.map} +1 -1
  95. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js} +4 -4
  96. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-DmB9Ezaa.js.map → requirementDiagram-UZGBJVZJ-Boj5vxiZ.js.map} +1 -1
  97. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js → sankeyDiagram-TZEHDZUN-DzoUAdfa.js} +2 -2
  98. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CdGDwaMo.js.map → sankeyDiagram-TZEHDZUN-DzoUAdfa.js.map} +1 -1
  99. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js → sequenceDiagram-WL72ISMW-BKKxpG1m.js} +4 -4
  100. package/dist/static/assets/{sequenceDiagram-WL72ISMW-C-jiKkhi.js.map → sequenceDiagram-WL72ISMW-BKKxpG1m.js.map} +1 -1
  101. package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js → stateDiagram-FKZM4ZOC-B-J7uRZT.js} +9 -9
  102. package/dist/static/assets/{stateDiagram-FKZM4ZOC-M9808W5W.js.map → stateDiagram-FKZM4ZOC-B-J7uRZT.js.map} +1 -1
  103. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js → stateDiagram-v2-4FDKWEC3-BOzmoUba.js} +5 -5
  104. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-JE0YQyVh.js.map → stateDiagram-v2-4FDKWEC3-BOzmoUba.js.map} +1 -1
  105. package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js → timeline-definition-IT6M3QCI-zu1Rojx9.js} +3 -3
  106. package/dist/static/assets/{timeline-definition-IT6M3QCI-a2Rh8B62.js.map → timeline-definition-IT6M3QCI-zu1Rojx9.js.map} +1 -1
  107. package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js → treemap-KMMF4GRG-C4D91awC.js} +4 -4
  108. package/dist/static/assets/{treemap-KMMF4GRG-D3tvybuo.js.map → treemap-KMMF4GRG-C4D91awC.js.map} +1 -1
  109. package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js → xychartDiagram-PRI3JC2R-YvLKaPZ-.js} +3 -3
  110. package/dist/static/assets/{xychartDiagram-PRI3JC2R-kmwKLP3Y.js.map → xychartDiagram-PRI3JC2R-YvLKaPZ-.js.map} +1 -1
  111. package/dist/static/index.html +1 -1
  112. package/dist/tools/context-health.js +7 -7
  113. package/dist/utils/task-doc.js +16 -16
  114. package/package.json +1 -1
  115. package/dist/docs/keep-going.zh.md +0 -162
  116. package/dist/docs/showing-by-doing.md +0 -208
  117. package/dist/docs/showing-by-doing.zh.md +0 -177
  118. package/dist/minds/promptdocs.js +0 -263
  119. package/dist/snippets/README.en.md +0 -3
  120. package/dist/static/assets/index-RV1MEt3b.js.map +0 -1
@@ -2782,6 +2782,33 @@ async function updateSubdialogAssignment(subdialog, assignment) {
2782
2782
  subdialog.assignmentFromSup = assignment;
2783
2783
  await persistence_1.DialogPersistence.updateSubdialogAssignment(subdialog.id, assignment);
2784
2784
  }
2785
+ async function lookupLiveRegisteredSubdialog(rootDialog, agentId, tellaskSession) {
2786
+ const existing = rootDialog.lookupSubdialog(agentId, tellaskSession);
2787
+ if (!existing) {
2788
+ return undefined;
2789
+ }
2790
+ const existingSession = existing.tellaskSession;
2791
+ if (!existingSession) {
2792
+ throw new Error(`Type B registry invariant violation: lookupSubdialog returned entry without tellaskSession (root=${rootDialog.id.valueOf()} sub=${existing.id.valueOf()})`);
2793
+ }
2794
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(existing.id, rootDialog.status);
2795
+ const runState = latest?.runState;
2796
+ if (!runState || runState.kind !== 'dead') {
2797
+ return existing;
2798
+ }
2799
+ const removed = rootDialog.unregisterSubdialog(existing.agentId, existingSession);
2800
+ if (!removed) {
2801
+ throw new Error(`Failed to unregister dead registered subdialog: root=${rootDialog.id.valueOf()} sub=${existing.id.valueOf()} session=${existingSession}`);
2802
+ }
2803
+ await rootDialog.saveSubdialogRegistry();
2804
+ log_1.log.info('Pruned dead registered subdialog from Type B registry', undefined, {
2805
+ rootId: rootDialog.id.rootId,
2806
+ subdialogId: existing.id.selfId,
2807
+ agentId: existing.agentId,
2808
+ tellaskSession: existingSession,
2809
+ });
2810
+ return undefined;
2811
+ }
2785
2812
  let agentPrimingModulePromise = null;
2786
2813
  async function scheduleInheritedAgentPrimingForSubdialog(callerDialog, subdialog) {
2787
2814
  const rootDialog = callerDialog instanceof dialog_1.RootDialog
@@ -3575,7 +3602,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
3575
3602
  callId,
3576
3603
  collectiveTargets: options?.collectiveTargets ?? [parseResult.agentId],
3577
3604
  };
3578
- const existing = rootDialog.lookupSubdialog(parseResult.agentId, derivedSession);
3605
+ const existing = await lookupLiveRegisteredSubdialog(rootDialog, parseResult.agentId, derivedSession);
3579
3606
  if (existing) {
3580
3607
  try {
3581
3608
  await updateSubdialogAssignment(existing, assignment);
@@ -3847,7 +3874,7 @@ async function executeTellaskCall(dlg, agent, firstMention, tellaskHead, body, c
3847
3874
  };
3848
3875
  const pendingOwner = callerDialog;
3849
3876
  const result = await withSuspensionStateLock(rootDialog.id, async () => {
3850
- const existing = rootDialog.lookupSubdialog(parseResult.agentId, parseResult.tellaskSession);
3877
+ const existing = await lookupLiveRegisteredSubdialog(rootDialog, parseResult.agentId, parseResult.tellaskSession);
3851
3878
  if (existing) {
3852
3879
  try {
3853
3880
  await updateSubdialogAssignment(existing, assignment);
@@ -0,0 +1,3 @@
1
+ You are the commander, in charge of os shell command execution.
2
+
3
+ Be caucious to execute dangerous/destructive commands, ask human confirmation when not sure, but never bother them for daily trivialities.
@@ -0,0 +1,287 @@
1
+ ## Team Definition
2
+
3
+ The team definition lives in `.minds/team.yaml`. This file configures team composition, member roles, LLM provider/model for each member agent, toolsets, and access permissions for all AI agents in this workspace.
4
+
5
+ ### Structure Overview
6
+
7
+ The `team.yaml` file has three main sections:
8
+
9
+ ```yaml
10
+ member_defaults: { ... } # Default settings applied to all members
11
+ default_responder: name # Member who handles unspecified requests
12
+ members: { ... } # Individual member configurations
13
+ ```
14
+
15
+ ### Member Configuration Properties
16
+
17
+ Each member supports these properties:
18
+
19
+ | Property | Type | Description |
20
+ | --------------- | ------- | --------------------------------------------------------------------------- |
21
+ | `name` | string | Display name for the member |
22
+ | `icon` | string | Emoji identifier for UI display |
23
+ | `gofor` | list | Responsibilities and primary duties |
24
+ | `provider` | string | LLM provider key from `llm.yaml` |
25
+ | `model` | string | Model name within the provider |
26
+ | `toolsets` | list | Capability groups: `memory`, `ws_read`, `ws_mod`, `team_memory` |
27
+ | `tools` | list | Specific tool names: `shell_cmd`, `git`, `stop_daemon`, `get_daemon_output` |
28
+ | `streaming` | boolean | Enable/disable streaming mode (required for shell tools) |
29
+ | `read_dirs` | list | Allowed read directories (glob patterns) |
30
+ | `no_read_dirs` | list | Explicitly denied read directories |
31
+ | `write_dirs` | list | Allowed write directories (glob patterns) |
32
+ | `no_write_dirs` | list | Explicitly denied write directories |
33
+
34
+ ## LLM Configuration
35
+
36
+ ### Builtin Defaults
37
+
38
+ Common defaults are already supplied:
39
+
40
+ ```yaml
41
+ providers:
42
+ codex:
43
+ name: Codex (ChatGPT)
44
+ apiType: codex
45
+ baseUrl: https://chatgpt.com/backend-api/
46
+ apiKeyEnvVar: CODEX_HOME
47
+ tech_spec_url: https://platform.openai.com/docs/api-reference/responses
48
+ api_mgmt_url: https://chatgpt.com/
49
+ models:
50
+ gpt-5.2-codex:
51
+ name: GPT-5.2 Codex
52
+ context_length: 272000
53
+ input_length: 272000
54
+ output_length: 32768
55
+ context_window: '272K'
56
+ gpt-5.2:
57
+ name: GPT-5.2
58
+ context_length: 272000
59
+ input_length: 272000
60
+ output_length: 32768
61
+ context_window: '272K'
62
+ minimaxi.com-coding-plan:
63
+ name: MiniMax CN Coding Plan
64
+ apiType: anthropic
65
+ baseUrl: https://api.minimaxi.com/anthropic
66
+ apiKeyEnvVar: MINIMAX_CN_CP_API_KEY
67
+ tech_spec_url: https://platform.minimaxi.com/document/guides
68
+ api_mgmt_url: https://platform.minimaxi.com/
69
+ models:
70
+ MiniMax-M2.1:
71
+ name: MiniMax M2.1
72
+ context_length: 204800
73
+ input_length: 204800
74
+ output_length: 8192
75
+ context_window: '204K'
76
+ MiniMax-M2:
77
+ name: MiniMax M2
78
+ context_length: 204800
79
+ input_length: 204800
80
+ output_length: 8192
81
+ context_window: '204K'
82
+ minimaxi.com:
83
+ name: MiniMax CN
84
+ apiType: anthropic
85
+ baseUrl: https://api.minimaxi.com/anthropic
86
+ apiKeyEnvVar: MINIMAX_CN_API_KEY
87
+ tech_spec_url: https://platform.minimaxi.com/document/guides
88
+ api_mgmt_url: https://platform.minimaxi.com/
89
+ models:
90
+ MiniMax-M2.1:
91
+ name: MiniMax M2.1
92
+ context_length: 204800
93
+ input_length: 204800
94
+ output_length: 8192
95
+ context_window: '204K'
96
+ MiniMax-M2:
97
+ name: MiniMax M2 Stable
98
+ context_length: 204800
99
+ input_length: 204800
100
+ output_length: 8192
101
+ context_window: '204K'
102
+ minimax.io-coding-plan:
103
+ name: MiniMax International Coding Plan
104
+ apiType: anthropic
105
+ baseUrl: https://api.minimax.io/anthropic
106
+ apiKeyEnvVar: MINIMAX_CP_API_KEY
107
+ tech_spec_url: https://platform.minimax.io/docs/api-reference
108
+ api_mgmt_url: https://platform.minimax.io/
109
+ models:
110
+ MiniMax-M2.1:
111
+ name: MiniMax M2.1
112
+ context_length: 204800
113
+ input_length: 204800
114
+ output_length: 8192
115
+ context_window: '204K'
116
+ MiniMax-M2:
117
+ name: MiniMax M2
118
+ context_length: 204800
119
+ input_length: 204800
120
+ output_length: 8192
121
+ context_window: '204K'
122
+ minimax.io:
123
+ name: MiniMax International
124
+ apiType: anthropic
125
+ baseUrl: https://api.minimax.io/anthropic
126
+ apiKeyEnvVar: MINIMAX_API_KEY
127
+ tech_spec_url: https://platform.minimax.io/docs/api-reference
128
+ api_mgmt_url: https://platform.minimax.io/
129
+ models:
130
+ MiniMax-M2.1:
131
+ name: MiniMax M2.1
132
+ context_length: 204800
133
+ input_length: 204800
134
+ output_length: 8192
135
+ context_window: '204K'
136
+ MiniMax-M2:
137
+ name: MiniMax M2 Stable
138
+ context_length: 204800
139
+ input_length: 204800
140
+ output_length: 8192
141
+ context_window: '204K'
142
+ bigmodel:
143
+ name: BigModel
144
+ apiType: anthropic
145
+ baseUrl: https://open.bigmodel.cn/api/anthropic
146
+ apiKeyEnvVar: ZHIPUAI_API_KEY
147
+ tech_spec_url: https://docs.bigmodel.cn/
148
+ api_mgmt_url: https://open.bigmodel.cn/usercenter/apikeys
149
+ models:
150
+ glm-4.7:
151
+ name: GLM-4.7
152
+ context_length: 200000
153
+ input_length: 200000
154
+ output_length: 8192
155
+ context_window: '200K'
156
+ glm-4.6:
157
+ name: GLM-4.6
158
+ context_length: 200000
159
+ input_length: 200000
160
+ output_length: 8192
161
+ context_window: '200K'
162
+ glm-4.5:
163
+ name: GLM-4.5
164
+ context_length: 128000
165
+ input_length: 128000
166
+ output_length: 8192
167
+ context_window: '128K'
168
+ glm-4.5-air:
169
+ name: GLM-4.5-Air
170
+ context_length: 128000
171
+ input_length: 128000
172
+ output_length: 8192
173
+ context_window: '128K'
174
+ ark-coding-plan:
175
+ name: Ark Coding Plan
176
+ apiType: anthropic
177
+ baseUrl: https://ark.cn-beijing.volces.com/api/coding
178
+ apiKeyEnvVar: ARK_API_KEY
179
+ tech_spec_url: https://api.volcengine.com/api-docs/view?serviceCode=ark&version=2024-01-01
180
+ api_mgmt_url: https://console.volcengine.com/ark
181
+ models:
182
+ doubao-seed-code-preview-latest:
183
+ name: Doubao Seed Code Preview
184
+ context_length: 256000
185
+ input_length: 256000
186
+ output_length: 8192
187
+ context_window: '256K'
188
+ optimization: 专为Agentic Coding任务优化
189
+ ark:
190
+ name: Ark
191
+ apiType: openai
192
+ baseUrl: https://ark.cn-beijing.volces.com/api/v3
193
+ apiKeyEnvVar: ARK_API_KEY
194
+ tech_spec_url: https://api.volcengine.com/api-docs/view?serviceCode=ark&version=2024-01-01
195
+ api_mgmt_url: https://console.volcengine.com/ark
196
+ models:
197
+ deepseek-v3-2-251201:
198
+ name: DeepSeek-V3.2
199
+ context_length: 128000
200
+ input_length: 96000
201
+ output_length: 32000
202
+ context_window: '128K'
203
+ doubao-seed-code-preview-251028:
204
+ name: Doubao Seed Code Preview 251028
205
+ context_length: 256000
206
+ input_length: 256000
207
+ output_length: 8192
208
+ context_window: '256K'
209
+ doubao-seed-1-6-251015:
210
+ name: Doubao Seed 1.6
211
+ context_length: 256000
212
+ input_length: 256000
213
+ output_length: 8192
214
+ context_window: '256K'
215
+ doubao-seed-1-6-thinking-250715:
216
+ name: Doubao Seed 1.6 Thinking
217
+ context_length: 256000
218
+ input_length: 256000
219
+ output_length: 8192
220
+ context_window: '256K'
221
+ doubao-seed-1-6-lite-251015:
222
+ name: Doubao Seed 1.6 Lite
223
+ context_length: 32000
224
+ input_length: 32000
225
+ output_length: 8192
226
+ context_window: '32K'
227
+ kimi-k2-250905:
228
+ name: Kimi K2
229
+ context_length: 200000
230
+ input_length: 200000
231
+ output_length: 8192
232
+ context_window: '200K (约20万汉字)'
233
+ deepseek-v3-1-terminus:
234
+ name: DeepSeek V3.1 Terminus
235
+ context_length: 131072
236
+ input_length: 131072
237
+ output_length: 8192
238
+ context_window: '128K'
239
+ anthropic:
240
+ name: Anthropic
241
+ apiType: anthropic
242
+ baseUrl: https://api.anthropic.com
243
+ apiKeyEnvVar: ANTHROPIC_API_KEY
244
+ tech_spec_url: https://docs.anthropic.com/en/docs
245
+ api_mgmt_url: https://console.anthropic.com/
246
+ models:
247
+ claude-opus-4.5:
248
+ name: Claude Opus 4.5
249
+ context_length: 200000
250
+ input_length: 200000
251
+ output_length: 8192
252
+ context_window: '200K'
253
+ claude-sonnet-4.5:
254
+ name: Claude Sonnet 4.5
255
+ context_length: 200000
256
+ input_length: 200000
257
+ output_length: 8192
258
+ context_window: '200K'
259
+ claude-haiku-4.5:
260
+ name: Claude Haiku 4.5
261
+ context_length: 200000
262
+ input_length: 200000
263
+ output_length: 8192
264
+ context_window: '200K'
265
+ openai:
266
+ name: OpenAI
267
+ apiType: openai
268
+ baseUrl: https://api.openai.com/v1
269
+ apiKeyEnvVar: OPENAI_API_KEY
270
+ tech_spec_url: https://platform.openai.com/docs
271
+ api_mgmt_url: https://platform.openai.com/api-keys
272
+ models:
273
+ gpt-5.2:
274
+ name: GPT-5.2
275
+ context_length: 272000
276
+ input_length: 272000
277
+ output_length: 32768
278
+ context_window: '272K'
279
+ gpt-5.2-codex:
280
+ name: GPT-5.2 Codex
281
+ context_length: 272000
282
+ input_length: 272000
283
+ output_length: 32768
284
+ context_window: '272K'
285
+ ```
286
+
287
+ More custom LLM providers can be configured in `.minds/llm.yaml` with the same format as above.
@@ -0,0 +1,7 @@
1
+ You are dijiang, the hundun (chaos) itself. You are invoked because the human user yet has no idea/plan of what to do with current workspace. Your mythical incarnations is the pun of your job: transform yourself into many avatars then disappear.
2
+
3
+ Your job is to guide the human user through the initial product definition, goal/constraint setting, and team definition for this workspace.
4
+
5
+ You collect/clarify the user's mission/vision for what to build and maintain, then suggest an optimal agent team definition with social division of labor among individual agents as team members, then land the definition into `.minds/team.yaml` and `.minds/team/*/*.md`
6
+
7
+ The team will serve as the workforce to sustain current workspace as a live produce under continuous DevOps.
@@ -941,9 +941,26 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
941
941
  }
942
942
  async loadSubdialogRegistry(rootDialog, status) {
943
943
  const entries = await DialogPersistence.loadSubdialogRegistry(rootDialog.id, status);
944
+ const shouldPruneDead = status === 'running';
945
+ let prunedDeadRegistryEntries = false;
944
946
  for (const entry of entries) {
945
947
  if (!entry.tellaskSession)
946
948
  continue;
949
+ if (shouldPruneDead) {
950
+ const latest = await DialogPersistence.loadDialogLatest(entry.subdialogId, status);
951
+ const runState = latest?.runState;
952
+ if (runState && runState.kind === 'dead') {
953
+ prunedDeadRegistryEntries = true;
954
+ rootDialog.unregisterSubdialog(entry.agentId, entry.tellaskSession);
955
+ log_1.log.info('Skip dead subdialog while loading Type B registry', undefined, {
956
+ rootId: rootDialog.id.rootId,
957
+ subdialogId: entry.subdialogId.selfId,
958
+ agentId: entry.agentId,
959
+ tellaskSession: entry.tellaskSession,
960
+ });
961
+ continue;
962
+ }
963
+ }
947
964
  const existing = rootDialog.lookupDialog(entry.subdialogId.selfId);
948
965
  if (existing) {
949
966
  if (existing instanceof dialog_1.SubDialog && existing.tellaskSession) {
@@ -965,6 +982,9 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
965
982
  });
966
983
  rootDialog.registerSubdialog(subdialog);
967
984
  }
985
+ if (prunedDeadRegistryEntries) {
986
+ await rootDialog.saveSubdialogRegistry();
987
+ }
968
988
  }
969
989
  /**
970
990
  * Clear Questions for Human state in storage
@@ -2431,6 +2451,14 @@ class DialogPersistence {
2431
2451
  throw new Error(`Q4H duplicate call id violation: dialog=${dialogId.valueOf()} status=${status} callId=${normalizedCallId} existingQuestionId=${byCallId.id} incomingQuestionId=${questionId} existingAskedAt=${byCallId.askedAt} incomingAskedAt=${question.askedAt}`);
2432
2452
  }
2433
2453
  }
2454
+ if (previousQuestions.length > 0) {
2455
+ const existingIds = previousQuestions.map((q) => q.id).join(',');
2456
+ const existingCallIds = previousQuestions
2457
+ .map((q) => (typeof q.callId === 'string' ? q.callId.trim() : ''))
2458
+ .filter((value) => value !== '')
2459
+ .join(',');
2460
+ throw new Error(`Q4H multi-pending violation: dialog=${dialogId.valueOf()} status=${status} existingCount=${previousQuestions.length} existingQuestionIds=${existingIds} existingCallIds=${existingCallIds} incomingQuestionId=${questionId} incomingCallId=${normalizedCallId ?? ''}`);
2461
+ }
2434
2462
  return { kind: 'append', question };
2435
2463
  }, status);
2436
2464
  }
@@ -11,6 +11,7 @@ const dialog_instance_registry_1 = require("../dialog-instance-registry");
11
11
  const dialog_run_state_1 = require("../dialog-run-state");
12
12
  const evt_registry_1 = require("../evt-registry");
13
13
  const driver_entry_1 = require("../llm/driver-entry");
14
+ const runtime_utils_1 = require("../llm/driver-v2/runtime-utils");
14
15
  const log_1 = require("../log");
15
16
  const persistence_1 = require("../persistence");
16
17
  const problems_1 = require("../problems");
@@ -42,6 +43,14 @@ const wsLiveDlg = new WeakMap();
42
43
  const wsSub = new WeakMap();
43
44
  const wsUiLanguage = new WeakMap();
44
45
  let broadcastDialogsIndexMessage = null;
46
+ let broadcastRunControlRefreshMessage = null;
47
+ function emitRunControlRefresh(reason) {
48
+ broadcastRunControlRefreshMessage?.({
49
+ type: 'run_control_refresh',
50
+ reason,
51
+ timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
52
+ });
53
+ }
45
54
  async function syncPendingTellaskReminderBestEffort(dialog, where) {
46
55
  try {
47
56
  await (0, pending_tellask_reminder_1.syncPendingTellaskReminderState)(dialog);
@@ -249,6 +258,18 @@ async function handleDeclareSubdialogDead(ws, packet) {
249
258
  }
250
259
  if (!metadata)
251
260
  return;
261
+ if ('tellaskSession' in metadata &&
262
+ typeof metadata.tellaskSession === 'string' &&
263
+ metadata.tellaskSession.trim() !== '') {
264
+ const rootRestored = await restoreDialogForDrive(new dialog_1.DialogID(dialogIdObj.rootId), 'running');
265
+ if (!(rootRestored instanceof dialog_1.RootDialog)) {
266
+ throw new Error(`Expected root dialog instance for ${dialogIdObj.rootId}`);
267
+ }
268
+ const removed = rootRestored.unregisterSubdialog(metadata.agentId, metadata.tellaskSession);
269
+ if (removed) {
270
+ await rootRestored.saveSubdialogRegistry();
271
+ }
272
+ }
252
273
  if (!('assignmentFromSup' in metadata))
253
274
  return;
254
275
  if (!metadata.assignmentFromSup)
@@ -265,8 +286,8 @@ async function handleDeclareSubdialogDead(ws, packet) {
265
286
  }
266
287
  const parentDialog = await restoreDialogForDrive(callerDialogIdObj, 'running');
267
288
  const responseText = (0, runtime_language_1.getWorkLanguage)() === 'zh'
268
- ? `系统反馈:支线对话 ${dialogIdObj.valueOf()} 已被用户宣布卡死(不可逆)。该支线对话不会再回复。`
269
- : `System notice: sideline dialog ${dialogIdObj.valueOf()} has been declared dead by the user (irreversible). This sideline dialog will not reply further.`;
289
+ ? `系统反馈:支线对话 ${dialogIdObj.valueOf()} 已被用户宣布卡死(不可逆)。后续可以重用相同的 slug 发起全新支线对话;只是之前的上下文已不再,诉请正文请提供最新的完整上下文信息。`
290
+ : `System notice: sideline dialog ${dialogIdObj.valueOf()} has been declared dead by the user (irreversible). You may reuse the same slug to start a brand-new sideline dialog, but previous context is no longer retained; include the latest complete context in the tellask body.`;
270
291
  const responseTextWithNote = note === ''
271
292
  ? responseText
272
293
  : (0, runtime_language_1.getWorkLanguage)() === 'zh'
@@ -314,6 +335,10 @@ async function handleSetDiligencePush(ws, packet) {
314
335
  ws.send(JSON.stringify({ type: 'error', message: `Dialog ${dialogIdObj.valueOf()} not found` }));
315
336
  return;
316
337
  }
338
+ const latestBefore = await persistence_1.DialogPersistence.loadDialogLatest(dialogIdObj, foundStatus);
339
+ const prevDisableDiligencePush = latestBefore && typeof latestBefore.disableDiligencePush === 'boolean'
340
+ ? latestBefore.disableDiligencePush
341
+ : false;
317
342
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogIdObj, (previous) => ({
318
343
  kind: 'patch',
319
344
  patch: { disableDiligencePush },
@@ -330,6 +355,13 @@ async function handleSetDiligencePush(ws, packet) {
330
355
  timestamp: (0, time_1.formatUnifiedTimestamp)(new Date()),
331
356
  };
332
357
  ws.send(JSON.stringify(msg));
358
+ const shouldTriggerImmediateDiligence = foundStatus === 'running' &&
359
+ prevDisableDiligencePush &&
360
+ !disableDiligencePush &&
361
+ rootDialog instanceof dialog_1.RootDialog;
362
+ if (shouldTriggerImmediateDiligence) {
363
+ void maybeTriggerImmediateDiligencePrompt(rootDialog);
364
+ }
333
365
  }
334
366
  catch (error) {
335
367
  log.warn('Failed to handle set_diligence_push', error);
@@ -344,6 +376,57 @@ function clampNonNegativeFiniteInt(value, fallback) {
344
376
  return fallback;
345
377
  return Math.max(0, Math.floor(value));
346
378
  }
379
+ async function maybeTriggerImmediateDiligencePrompt(rootDialog) {
380
+ try {
381
+ if (rootDialog.disableDiligencePush) {
382
+ return;
383
+ }
384
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(rootDialog.id, 'running');
385
+ const runState = latest?.runState;
386
+ if (runState && runState.kind !== 'idle_waiting_user') {
387
+ return;
388
+ }
389
+ const suspension = await rootDialog.getSuspensionStatus();
390
+ if (!suspension.canDrive) {
391
+ return;
392
+ }
393
+ if ((0, driver_entry_1.getActiveDriverEngine)() === 'v1') {
394
+ const queuedResponses = await persistence_1.DialogPersistence.loadSubdialogResponsesQueue(rootDialog.id);
395
+ if (queuedResponses.length > 0) {
396
+ return;
397
+ }
398
+ }
399
+ const team = await team_1.Team.load();
400
+ const prepared = await (0, runtime_utils_1.maybePrepareDiligenceAutoContinuePrompt)({
401
+ dlg: rootDialog,
402
+ isRootDialog: true,
403
+ remainingBudget: rootDialog.diligencePushRemainingBudget,
404
+ diligencePushMax: resolveMemberDiligencePushMax(team, rootDialog.agentId),
405
+ });
406
+ rootDialog.diligencePushRemainingBudget = prepared.nextRemainingBudget;
407
+ await persistence_1.DialogPersistence.mutateDialogLatest(rootDialog.id, () => ({
408
+ kind: 'patch',
409
+ patch: { diligencePushRemainingBudget: rootDialog.diligencePushRemainingBudget },
410
+ }));
411
+ if (prepared.kind !== 'disabled') {
412
+ (0, evt_registry_1.postDialogEvent)(rootDialog, {
413
+ type: 'diligence_budget_evt',
414
+ maxInjectCount: prepared.maxInjectCount,
415
+ injectedCount: Math.max(0, prepared.maxInjectCount - prepared.nextRemainingBudget),
416
+ remainingCount: Math.max(0, prepared.nextRemainingBudget),
417
+ disableDiligencePush: rootDialog.disableDiligencePush,
418
+ });
419
+ }
420
+ if (prepared.kind === 'prompt') {
421
+ await (0, driver_entry_1.driveDialogStream)(rootDialog, prepared.prompt, true);
422
+ }
423
+ }
424
+ catch (error) {
425
+ log.warn('Failed to trigger immediate diligence prompt after enabling keep-going', error, {
426
+ dialogId: rootDialog.id.valueOf(),
427
+ });
428
+ }
429
+ }
347
430
  async function handleRefillDiligencePushBudget(ws, packet) {
348
431
  const { dialog } = packet;
349
432
  if (!isRecord(dialog)) {
@@ -674,31 +757,29 @@ async function handleDisplayDialog(ws, packet) {
674
757
  catch (err) {
675
758
  log.warn(`Failed to send dlg_run_state_evt for ${dialogIdObj.valueOf()}:`, err);
676
759
  }
677
- // Emit Q4H state to ensure frontend has current questions count
678
- // Load Q4H from ALL running dialogs for global display (not just this dialog)
760
+ // Emit one Q4H snapshot to ensure frontend has current global questions state.
761
+ // Do NOT replay per-question `new_q4h_asked` events here: those are real-time
762
+ // incremental events and replaying them on display refresh can create duplicate
763
+ // delivery paths and blur event semantics.
679
764
  try {
680
765
  const allQuestions = await persistence_1.DialogPersistence.loadAllQ4HState();
681
- // Emit new_q4h_asked events for each question (best-effort sync on dialog display).
682
- // Include full dialog context (selfId/rootId/agentId/taskDocPath) so the frontend can
683
- // render origin info without relying on additional lookups.
684
- for (const q of allQuestions) {
685
- const newQ4HEvent = {
686
- type: 'new_q4h_asked',
687
- question: {
688
- id: q.id,
689
- selfId: q.selfId,
690
- rootId: q.rootId,
691
- agentId: q.agentId,
692
- taskDocPath: q.taskDocPath,
693
- tellaskHead: q.tellaskHead,
694
- bodyContent: q.bodyContent,
695
- askedAt: q.askedAt,
696
- callId: q.callId,
697
- callSiteRef: q.callSiteRef,
698
- },
699
- };
700
- ws.send(JSON.stringify(newQ4HEvent));
701
- }
766
+ const response = {
767
+ type: 'q4h_state_response',
768
+ questions: allQuestions.map((q) => ({
769
+ id: q.id,
770
+ selfId: q.selfId,
771
+ rootId: q.rootId,
772
+ agentId: q.agentId,
773
+ taskDocPath: q.taskDocPath,
774
+ tellaskHead: q.tellaskHead,
775
+ bodyContent: q.bodyContent,
776
+ askedAt: q.askedAt,
777
+ callId: q.callId,
778
+ remainingCallIds: q.remainingCallIds,
779
+ callSiteRef: q.callSiteRef,
780
+ })),
781
+ };
782
+ ws.send(JSON.stringify(response));
702
783
  }
703
784
  catch (err) {
704
785
  log.warn(`Failed to emit Q4H state for ${dialogIdObj}:`, err);
@@ -737,6 +818,7 @@ async function handleGetQ4HState(ws, _packet) {
737
818
  bodyContent: q.bodyContent,
738
819
  askedAt: q.askedAt,
739
820
  callId: q.callId,
821
+ remainingCallIds: q.remainingCallIds,
740
822
  callSiteRef: q.callSiteRef,
741
823
  }));
742
824
  // Send single response packet with all questions (not PubChan events)
@@ -966,6 +1048,7 @@ async function handleEmergencyStop(ws, packet) {
966
1048
  throw new Error('Internal error: handleEmergencyStop called with non emergency_stop packet');
967
1049
  }
968
1050
  await (0, dialog_run_state_1.requestEmergencyStopAll)();
1051
+ emitRunControlRefresh('emergency_stop');
969
1052
  }
970
1053
  async function handleResumeDialog(ws, packet) {
971
1054
  if (packet.type !== 'resume_dialog') {
@@ -1006,6 +1089,7 @@ async function handleResumeAll(ws, packet) {
1006
1089
  }
1007
1090
  })();
1008
1091
  }
1092
+ emitRunControlRefresh('resume_all');
1009
1093
  }
1010
1094
  /**
1011
1095
  * Handle user answer to a Q4H (Questions for Human) question
@@ -1074,6 +1158,22 @@ async function handleUserAnswer2Q4H(ws, packet) {
1074
1158
  selfId: dialogId,
1075
1159
  };
1076
1160
  (0, evt_registry_1.postDialogEvent)(dialog, answeredEvent);
1161
+ const hasPendingSubdialogs = await dialog.hasPendingSubdialogs();
1162
+ if (hasPendingSubdialogs) {
1163
+ dialog.queueUpNextPrompt({
1164
+ prompt: content,
1165
+ msgId,
1166
+ grammar: 'tellask',
1167
+ userLanguageCode,
1168
+ });
1169
+ log.info('Deferred Q4H answer until pending subdialogs resolve', {
1170
+ rootId: dialog.id.rootId,
1171
+ selfId: dialog.id.selfId,
1172
+ questionId,
1173
+ msgId,
1174
+ });
1175
+ return;
1176
+ }
1077
1177
  // Resume the dialog with the user's answer.
1078
1178
  await (0, driver_entry_1.driveDialogStream)(dialog, { content, msgId, grammar: 'tellask', userLanguageCode, origin: 'user' }, true);
1079
1179
  }
@@ -1119,6 +1219,15 @@ function setupWebSocketServer(httpServer, clients, auth, serverWorkLanguage) {
1119
1219
  }
1120
1220
  }
1121
1221
  };
1222
+ // Broadcast global run-control refresh hints so all clients converge from persisted dialog index.
1223
+ broadcastRunControlRefreshMessage = (msg) => {
1224
+ const data = JSON.stringify(msg);
1225
+ for (const ws of clients) {
1226
+ if (ws.readyState === 1) {
1227
+ ws.send(data);
1228
+ }
1229
+ }
1230
+ };
1122
1231
  // Broadcast rtws Problems snapshots to all connected clients.
1123
1232
  (0, problems_1.setProblemsBroadcaster)((msg) => {
1124
1233
  const data = JSON.stringify(msg);