dominds 1.22.0 → 1.22.1

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 (125) hide show
  1. package/dist/dialog-instance-registry.js +3 -4
  2. package/dist/dialog.d.ts +2 -2
  3. package/dist/dialog.js +3 -3
  4. package/dist/docs/diligence-push.md +19 -12
  5. package/dist/docs/diligence-push.zh.md +11 -9
  6. package/dist/docs/dominds-terminology.md +3 -3
  7. package/dist/docs/llm-provider-isolation.md +1 -1
  8. package/dist/docs/llm-provider-isolation.zh.md +1 -1
  9. package/dist/docs/team_mgmt-toolset.md +1 -1
  10. package/dist/docs/team_mgmt-toolset.zh.md +1 -1
  11. package/dist/docs/volcengine-coding-plan-openai-compatible.zh.md +11 -10
  12. package/dist/llm/api-quirks.d.ts +0 -2
  13. package/dist/llm/api-quirks.js +1 -3
  14. package/dist/llm/client.d.ts +1 -0
  15. package/dist/llm/defaults.yaml +2 -6
  16. package/dist/llm/gen/anthropic.d.ts +0 -6
  17. package/dist/llm/gen/anthropic.js +21 -468
  18. package/dist/llm/gen/openai-compatible.d.ts +11 -1
  19. package/dist/llm/gen/openai-compatible.js +188 -8
  20. package/dist/llm/gen.d.ts +4 -2
  21. package/dist/llm/kernel-driver/drive.js +164 -114
  22. package/dist/llm/kernel-driver/runtime.js +36 -11
  23. package/dist/llm/kernel-driver/tellask-special.js +12 -9
  24. package/dist/persistence.d.ts +2 -3
  25. package/dist/persistence.js +53 -76
  26. package/dist/problems.js +2 -1
  27. package/dist/server/websocket-handler.js +17 -3
  28. package/dist/tools/team_mgmt-manual.js +4 -4
  29. package/dist/tools/team_mgmt.js +13 -3
  30. package/package.json +3 -3
  31. package/webapp/dist/assets/{_basePickBy-BYnYcdaa.js → _basePickBy-DUbW5G8a.js} +3 -3
  32. package/webapp/dist/assets/{_basePickBy-BYnYcdaa.js.map → _basePickBy-DUbW5G8a.js.map} +1 -1
  33. package/webapp/dist/assets/{_baseUniq-CHLBB955.js → _baseUniq-vou1IeXB.js} +2 -2
  34. package/webapp/dist/assets/{_baseUniq-CHLBB955.js.map → _baseUniq-vou1IeXB.js.map} +1 -1
  35. package/webapp/dist/assets/{arc-DQXtgZdO.js → arc-D_O9oO0B.js} +2 -2
  36. package/webapp/dist/assets/{arc-DQXtgZdO.js.map → arc-D_O9oO0B.js.map} +1 -1
  37. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CzP5Yf9x.js → architectureDiagram-2XIMDMQ5-B7k9SWSL.js} +7 -7
  38. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CzP5Yf9x.js.map → architectureDiagram-2XIMDMQ5-B7k9SWSL.js.map} +1 -1
  39. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-sOx5Byq8.js → blockDiagram-WCTKOSBZ-e3xTmffi.js} +7 -7
  40. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-sOx5Byq8.js.map → blockDiagram-WCTKOSBZ-e3xTmffi.js.map} +1 -1
  41. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D8-GiS6c.js → c4Diagram-IC4MRINW-DVvi-N2o.js} +3 -3
  42. package/webapp/dist/assets/{c4Diagram-IC4MRINW-D8-GiS6c.js.map → c4Diagram-IC4MRINW-DVvi-N2o.js.map} +1 -1
  43. package/webapp/dist/assets/{channel-Bvke0iMP.js → channel-CH387UD2.js} +2 -2
  44. package/webapp/dist/assets/{channel-Bvke0iMP.js.map → channel-CH387UD2.js.map} +1 -1
  45. package/webapp/dist/assets/{chunk-4BX2VUAB-C9pln2M7.js → chunk-4BX2VUAB-BOo0Xj3m.js} +2 -2
  46. package/webapp/dist/assets/{chunk-4BX2VUAB-C9pln2M7.js.map → chunk-4BX2VUAB-BOo0Xj3m.js.map} +1 -1
  47. package/webapp/dist/assets/{chunk-55IACEB6-BLDXNtAM.js → chunk-55IACEB6-CI4uRAx_.js} +2 -2
  48. package/webapp/dist/assets/{chunk-55IACEB6-BLDXNtAM.js.map → chunk-55IACEB6-CI4uRAx_.js.map} +1 -1
  49. package/webapp/dist/assets/{chunk-FMBD7UC4-dYd3QdHa.js → chunk-FMBD7UC4-C4N1ovxD.js} +2 -2
  50. package/webapp/dist/assets/{chunk-FMBD7UC4-dYd3QdHa.js.map → chunk-FMBD7UC4-C4N1ovxD.js.map} +1 -1
  51. package/webapp/dist/assets/{chunk-JSJVCQXG-SqHEmHHd.js → chunk-JSJVCQXG-5U4Hu7pC.js} +2 -2
  52. package/webapp/dist/assets/{chunk-JSJVCQXG-SqHEmHHd.js.map → chunk-JSJVCQXG-5U4Hu7pC.js.map} +1 -1
  53. package/webapp/dist/assets/{chunk-KX2RTZJC-CRXgzI2d.js → chunk-KX2RTZJC-BXPDNuct.js} +2 -2
  54. package/webapp/dist/assets/{chunk-KX2RTZJC-CRXgzI2d.js.map → chunk-KX2RTZJC-BXPDNuct.js.map} +1 -1
  55. package/webapp/dist/assets/{chunk-NQ4KR5QH-IMA2JZhH.js → chunk-NQ4KR5QH-oVsExnnn.js} +4 -4
  56. package/webapp/dist/assets/{chunk-NQ4KR5QH-IMA2JZhH.js.map → chunk-NQ4KR5QH-oVsExnnn.js.map} +1 -1
  57. package/webapp/dist/assets/{chunk-QZHKN3VN-DBaGWjY3.js → chunk-QZHKN3VN-C6FzEv2C.js} +2 -2
  58. package/webapp/dist/assets/{chunk-QZHKN3VN-DBaGWjY3.js.map → chunk-QZHKN3VN-C6FzEv2C.js.map} +1 -1
  59. package/webapp/dist/assets/{chunk-WL4C6EOR-QLmsLbcS.js → chunk-WL4C6EOR-Ir7e_B7t.js} +6 -6
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-QLmsLbcS.js.map → chunk-WL4C6EOR-Ir7e_B7t.js.map} +1 -1
  61. package/webapp/dist/assets/{classDiagram-VBA2DB6C-jN4lhUtx.js → classDiagram-VBA2DB6C-CPYs_LAr.js} +7 -7
  62. package/webapp/dist/assets/{classDiagram-VBA2DB6C-jN4lhUtx.js.map → classDiagram-VBA2DB6C-CPYs_LAr.js.map} +1 -1
  63. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-jN4lhUtx.js → classDiagram-v2-RAHNMMFH-CPYs_LAr.js} +7 -7
  64. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-jN4lhUtx.js.map → classDiagram-v2-RAHNMMFH-CPYs_LAr.js.map} +1 -1
  65. package/webapp/dist/assets/{clone-DPC4Vt09.js → clone-CToca8rS.js} +2 -2
  66. package/webapp/dist/assets/{clone-DPC4Vt09.js.map → clone-CToca8rS.js.map} +1 -1
  67. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BtVgObsc.js → cose-bilkent-S5V4N54A-DLNtqY7a.js} +2 -2
  68. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BtVgObsc.js.map → cose-bilkent-S5V4N54A-DLNtqY7a.js.map} +1 -1
  69. package/webapp/dist/assets/{dagre-KLK3FWXG-Bv6mn-UV.js → dagre-KLK3FWXG-Bkt-O9uW.js} +7 -7
  70. package/webapp/dist/assets/{dagre-KLK3FWXG-Bv6mn-UV.js.map → dagre-KLK3FWXG-Bkt-O9uW.js.map} +1 -1
  71. package/webapp/dist/assets/{diagram-E7M64L7V-D2OPgDkq.js → diagram-E7M64L7V-B4JR_u4V.js} +8 -8
  72. package/webapp/dist/assets/{diagram-E7M64L7V-D2OPgDkq.js.map → diagram-E7M64L7V-B4JR_u4V.js.map} +1 -1
  73. package/webapp/dist/assets/{diagram-IFDJBPK2-CZpDu-e5.js → diagram-IFDJBPK2-D9zRh8b7.js} +7 -7
  74. package/webapp/dist/assets/{diagram-IFDJBPK2-CZpDu-e5.js.map → diagram-IFDJBPK2-D9zRh8b7.js.map} +1 -1
  75. package/webapp/dist/assets/{diagram-P4PSJMXO-BkMbbW0p.js → diagram-P4PSJMXO-CAaXVWnX.js} +7 -7
  76. package/webapp/dist/assets/{diagram-P4PSJMXO-BkMbbW0p.js.map → diagram-P4PSJMXO-CAaXVWnX.js.map} +1 -1
  77. package/webapp/dist/assets/{erDiagram-INFDFZHY-Kf17ek1z.js → erDiagram-INFDFZHY-DDeoaSkJ.js} +5 -5
  78. package/webapp/dist/assets/{erDiagram-INFDFZHY-Kf17ek1z.js.map → erDiagram-INFDFZHY-DDeoaSkJ.js.map} +1 -1
  79. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-Cort4hNL.js → flowDiagram-PKNHOUZH-DEYqzSEJ.js} +7 -7
  80. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-Cort4hNL.js.map → flowDiagram-PKNHOUZH-DEYqzSEJ.js.map} +1 -1
  81. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DcXFKB1Y.js → ganttDiagram-A5KZAMGK-BuLOSh0d.js} +3 -3
  82. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DcXFKB1Y.js.map → ganttDiagram-A5KZAMGK-BuLOSh0d.js.map} +1 -1
  83. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BORnqZ0-.js → gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js} +8 -8
  84. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BORnqZ0-.js.map → gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js.map} +1 -1
  85. package/webapp/dist/assets/{graph-D4Uth-MK.js → graph-fX6cvjwR.js} +3 -3
  86. package/webapp/dist/assets/{graph-D4Uth-MK.js.map → graph-fX6cvjwR.js.map} +1 -1
  87. package/webapp/dist/assets/{index-YBIJr7jH.js → index-B3WzTLcD.js} +67 -40
  88. package/webapp/dist/assets/{index-YBIJr7jH.js.map → index-B3WzTLcD.js.map} +1 -1
  89. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DDjsEPg3.js → infoDiagram-LFFYTUFH-Ci3XYvve.js} +6 -6
  90. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-DDjsEPg3.js.map → infoDiagram-LFFYTUFH-Ci3XYvve.js.map} +1 -1
  91. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bb2sPnCX.js → ishikawaDiagram-PHBUUO56-DOH5ua9R.js} +2 -2
  92. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-Bb2sPnCX.js.map → ishikawaDiagram-PHBUUO56-DOH5ua9R.js.map} +1 -1
  93. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BtRY6eBa.js → journeyDiagram-4ABVD52K-DM_fiZlj.js} +5 -5
  94. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-BtRY6eBa.js.map → journeyDiagram-4ABVD52K-DM_fiZlj.js.map} +1 -1
  95. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-aGmxT2H9.js → kanban-definition-K7BYSVSG-CSh2hqc2.js} +3 -3
  96. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-aGmxT2H9.js.map → kanban-definition-K7BYSVSG-CSh2hqc2.js.map} +1 -1
  97. package/webapp/dist/assets/{layout-BuLicmwh.js → layout-yZEK1LgL.js} +5 -5
  98. package/webapp/dist/assets/{layout-BuLicmwh.js.map → layout-yZEK1LgL.js.map} +1 -1
  99. package/webapp/dist/assets/{linear-DIPh96mp.js → linear-m76SmdtZ.js} +2 -2
  100. package/webapp/dist/assets/{linear-DIPh96mp.js.map → linear-m76SmdtZ.js.map} +1 -1
  101. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ofWsysn9.js → mindmap-definition-YRQLILUH-NiwP-SLH.js} +4 -4
  102. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-ofWsysn9.js.map → mindmap-definition-YRQLILUH-NiwP-SLH.js.map} +1 -1
  103. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DQqCTITO.js → pieDiagram-SKSYHLDU-CSCapDSD.js} +8 -8
  104. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DQqCTITO.js.map → pieDiagram-SKSYHLDU-CSCapDSD.js.map} +1 -1
  105. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DxWc0avu.js → quadrantDiagram-337W2JSQ-CbDGQH91.js} +3 -3
  106. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DxWc0avu.js.map → quadrantDiagram-337W2JSQ-CbDGQH91.js.map} +1 -1
  107. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DHgYfzwt.js → requirementDiagram-Z7DCOOCP-CeG2yodp.js} +4 -4
  108. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DHgYfzwt.js.map → requirementDiagram-Z7DCOOCP-CeG2yodp.js.map} +1 -1
  109. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cuhwe80W.js → sankeyDiagram-WA2Y5GQK-B_l8tKqa.js} +2 -2
  110. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-Cuhwe80W.js.map → sankeyDiagram-WA2Y5GQK-B_l8tKqa.js.map} +1 -1
  111. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DqSNoro8.js → sequenceDiagram-2WXFIKYE-Dc5gBIi5.js} +4 -4
  112. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DqSNoro8.js.map → sequenceDiagram-2WXFIKYE-Dc5gBIi5.js.map} +1 -1
  113. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D1mvuJi6.js → stateDiagram-RAJIS63D-DMYeNS1r.js} +9 -9
  114. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D1mvuJi6.js.map → stateDiagram-RAJIS63D-DMYeNS1r.js.map} +1 -1
  115. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BCYX5Gy-.js → stateDiagram-v2-FVOUBMTO-MfUJuUEe.js} +5 -5
  116. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BCYX5Gy-.js.map → stateDiagram-v2-FVOUBMTO-MfUJuUEe.js.map} +1 -1
  117. package/webapp/dist/assets/{timeline-definition-YZTLITO2-DDLYGao7.js → timeline-definition-YZTLITO2-Ci2CZEky.js} +3 -3
  118. package/webapp/dist/assets/{timeline-definition-YZTLITO2-DDLYGao7.js.map → timeline-definition-YZTLITO2-Ci2CZEky.js.map} +1 -1
  119. package/webapp/dist/assets/{treemap-KZPCXAKY-DXkv1e6y.js → treemap-KZPCXAKY-CNgzp4sT.js} +5 -5
  120. package/webapp/dist/assets/{treemap-KZPCXAKY-DXkv1e6y.js.map → treemap-KZPCXAKY-CNgzp4sT.js.map} +1 -1
  121. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DMxsg9P0.js → vennDiagram-LZ73GAT5-BYxtNx2s.js} +2 -2
  122. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-DMxsg9P0.js.map → vennDiagram-LZ73GAT5-BYxtNx2s.js.map} +1 -1
  123. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BJ2qipzT.js → xychartDiagram-JWTSCODW-BUS3bn9p.js} +3 -3
  124. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BJ2qipzT.js.map → xychartDiagram-JWTSCODW-BUS3bn9p.js.map} +1 -1
  125. package/webapp/dist/index.html +1 -1
@@ -85,10 +85,9 @@ async function getOrRestoreMainDialog(rootId, status) {
85
85
  ? latest.diligencePushRemainingBudget
86
86
  : undefined;
87
87
  const normalizedRemainingBudget = clampNonNegativeFiniteInt(persistedRemainingBudget, diligencePushMax > 0 ? diligencePushMax : 0);
88
- mainDialog.diligencePushRemainingBudget =
89
- diligencePushMax > 0
90
- ? Math.min(normalizedRemainingBudget, diligencePushMax)
91
- : normalizedRemainingBudget;
88
+ // `diligence-push-max` only seeds defaults. Persisted per-dialog budget is the runtime source of
89
+ // truth, including operator-added budget above (or despite) the current team default.
90
+ mainDialog.diligencePushRemainingBudget = normalizedRemainingBudget;
92
91
  mainDialog.setPersistenceStatus(status);
93
92
  dialog_global_registry_1.globalDialogRegistry.register(mainDialog);
94
93
  // Keep the in-memory main dialog fully hydrated regardless of persistence status
package/dist/dialog.d.ts CHANGED
@@ -438,7 +438,7 @@ export declare abstract class Dialog {
438
438
  }): Promise<void>;
439
439
  persistAgentMessage(content: string, genseq: number, type: 'thinking_msg' | 'saying_msg', provider_data?: ProviderData, reasoning?: ReasoningPayload): Promise<void>;
440
440
  persistUiOnlyMarkdown(content: string, genseq: number): Promise<void>;
441
- persistFunctionCall(id: string, name: string, rawArgumentsText: string, genseq: number): Promise<void>;
441
+ persistFunctionCall(id: string, name: string, rawArgumentsText: string, genseq: number, rawId?: string): Promise<void>;
442
442
  persistTellaskCall(id: string, name: TellaskCallRecordName, rawArgumentsText: string, genseq: number, options?: {
443
443
  deliveryMode?: 'tellask_call_start' | 'func_call_requested';
444
444
  }): Promise<void>;
@@ -670,7 +670,7 @@ export declare abstract class DialogStore {
670
670
  /**
671
671
  * Persist a function call to storage
672
672
  */
673
- persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number): Promise<void>;
673
+ persistFunctionCall(_dialog: Dialog, _id: string, _name: string, _rawArgumentsText: string, _genseq: number, _rawId?: string): Promise<void>;
674
674
  persistTellaskCall(_dialog: Dialog, _id: string, _name: TellaskCallRecordName, _rawArgumentsText: string, _genseq: number, _options?: {
675
675
  deliveryMode?: 'tellask_call_start' | 'func_call_requested';
676
676
  }): Promise<void>;
package/dist/dialog.js CHANGED
@@ -1452,8 +1452,8 @@ class Dialog {
1452
1452
  async persistUiOnlyMarkdown(content, genseq) {
1453
1453
  return await this.dlgStore.persistUiOnlyMarkdown(this, content, genseq);
1454
1454
  }
1455
- async persistFunctionCall(id, name, rawArgumentsText, genseq) {
1456
- return await this.dlgStore.persistFunctionCall(this, id, name, rawArgumentsText, genseq);
1455
+ async persistFunctionCall(id, name, rawArgumentsText, genseq, rawId) {
1456
+ return await this.dlgStore.persistFunctionCall(this, id, name, rawArgumentsText, genseq, rawId);
1457
1457
  }
1458
1458
  async persistTellaskCall(id, name, rawArgumentsText, genseq, options) {
1459
1459
  return await this.dlgStore.persistTellaskCall(this, id, name, rawArgumentsText, genseq, options);
@@ -1895,7 +1895,7 @@ class DialogStore {
1895
1895
  /**
1896
1896
  * Persist a function call to storage
1897
1897
  */
1898
- async persistFunctionCall(_dialog, _id, _name, _rawArgumentsText, _genseq) { }
1898
+ async persistFunctionCall(_dialog, _id, _name, _rawArgumentsText, _genseq, _rawId) { }
1899
1899
  async persistTellaskCall(_dialog, _id, _name, _rawArgumentsText, _genseq, _options) { }
1900
1900
  /**
1901
1901
  * Start a new course in storage
@@ -82,15 +82,20 @@ To avoid infinite loops, diligence-push has a per-dialog budget (per-member `dil
82
82
  how many auto-continued diligence prompts can be injected for a given dialog before the runtime stops
83
83
  issuing further automatic Diligence Pushes for that budget.
84
84
 
85
- - Default: **3**
86
- - If `< 1`, diligence-push is effectively disabled for that member
85
+ - Default: **99**
86
+ - If `< 1`, new dialogs start with no automatic Diligence Push budget
87
87
  - Configurable per-member via `diligence-push-max` in `.minds/team.yaml`
88
88
 
89
- ### Reset on Q4H
89
+ Important: `diligence-push-max` is only the default budget used when a dialog instance is created
90
+ or reset. Runtime decisions must use the concrete dialog's remaining budget
91
+ (`diligencePushRemainingBudget`), so a manually refilled dialog can keep auto-continuing even when
92
+ the team default is `0`.
90
93
 
91
- When a dialog becomes suspended due to a pending Q4H (Questions for Human), the diligence-push injection
92
- counter is reset. This ensures that after the human answers the Q4H and the dialog is resumed, the
93
- dialog gets a fresh diligence-push budget again.
94
+ ### Q4H suspension
95
+
96
+ When a dialog becomes suspended due to a pending Q4H (Questions for Human), Diligence Push stops
97
+ while that suspension is active. Q4H does not reapply the member default budget; the dialog keeps its
98
+ own remaining budget so operator adjustments survive the suspension boundary.
94
99
 
95
100
  ### Budget exhausted → stop auto-pushing for that budget
96
101
 
@@ -103,9 +108,8 @@ Diligence-push can be disabled per-rtws in either of these ways:
103
108
 
104
109
  - If the selected diligence file exists but its content is empty/whitespace, diligence-push is disabled (no injection).
105
110
 
106
- Diligence-push can be disabled per-member in either of these ways:
107
-
108
- - If `diligence-push-max < 1`, diligence-push is disabled for that member (no injection).
111
+ To stop auto-continue for a specific dialog, set that dialog's remaining budget to `0` or use the
112
+ per-dialog Diligence Push disable switch.
109
113
 
110
114
  ## Diligence prompt resolution
111
115
 
@@ -122,9 +126,10 @@ If the first existing file in the above order has empty/whitespace content, **di
122
126
  Note: YAML frontmatter in diligence files is **ignored** by the runtime. If present, it is treated as
123
127
  non-content metadata and stripped from the prompt body.
124
128
 
125
- ### Team member cap: `diligence-push-max`
129
+ ### Team member default budget: `diligence-push-max`
126
130
 
127
- Each team member can optionally cap diligence-push via `.minds/team.yaml`:
131
+ Each team member can optionally set the starting Diligence Push budget for new or reset dialogs via
132
+ `.minds/team.yaml`:
128
133
 
129
134
  ```yaml
130
135
  members:
@@ -135,7 +140,9 @@ members:
135
140
  Rules:
136
141
 
137
142
  - If missing, `diligence-push-max` defaults to **99** for that member.
138
- - If `diligence-push-max < 1`, diligence-push is disabled for that member (no injection), even if the diligence file exists.
143
+ - If `diligence-push-max < 1`, newly created dialogs start with remaining budget `0`.
144
+ - After creation or reset, runtime business logic follows the dialog's own remaining budget rather
145
+ than treating `diligence-push-max` as runtime authority.
139
146
  - Built-in shadow members `fuxi` and `pangu` default to `diligence-push-max: 0` unless explicitly overridden in team.yaml.
140
147
 
141
148
  ## UX notes
@@ -70,12 +70,15 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
70
70
  为避免无限循环,diligence-push 有一个按对话的预算(每个成员的 `diligence-push-max`),控制对于给定对话在当前预算内还能注入多少个自动继续的鞭策语;预算耗尽后,运行时会停止继续自动鞭策。
71
71
 
72
72
  - 默认值:**99**
73
- - 如果 `< 1`,则该成员的 diligence-push 有效禁用
73
+ - 如果 `< 1`,则新建对话从 0 个自动鞭策预算开始
74
74
  - 可通过 `.minds/team.yaml` 中的 `diligence-push-max` 按成员配置
75
75
 
76
- ### Q4H 时重置
76
+ 重要:`diligence-push-max` 只是在创建或重置对话实例时使用的默认预算。运行时业务判断必须以具体对话自己的剩余预算
77
+ (`diligencePushRemainingBudget`)为准;因此即使团队默认值是 `0`,手工补充过预算的对话也应继续自动鞭策。
77
78
 
78
- 当对话因待处理的 Q4H(Questions for Human)而暂停时,diligence-push 注入计数器会被重置。这确保在人类回答 Q4H 并恢复对话后,对话会获得新的 diligence-push 预算。
79
+ ### Q4H 暂停
80
+
81
+ 当对话因待处理的 Q4H(Questions for Human)而暂停时,鞭策会在该暂停期间停止。Q4H 不会重新套用成员默认预算;对话会保留自己的剩余预算,因此操作员调整过的预算能跨过暂停边界继续生效。
79
82
 
80
83
  ### 预算耗尽 → 停止继续自动鞭策当前预算
81
84
 
@@ -87,9 +90,7 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
87
90
 
88
91
  - 如果选中的鞭策语文件存在但其内容为空/仅空白,则禁用 diligence-push(不注入)。
89
92
 
90
- 可以通过以下任一方式按成员禁用 diligence-push:
91
-
92
- - 如果 `diligence-push-max < 1`,则该成员的 diligence-push 被禁用(不注入)。
93
+ 若要停止某个具体对话的自动续推,应将该对话的剩余预算设为 `0`,或使用该对话自己的鞭策禁用开关。
93
94
 
94
95
  ## 鞭策语解析
95
96
 
@@ -105,9 +106,9 @@ Dominds 主线对话旨在长期运行。主线对话"停止"(变为空闲)
105
106
 
106
107
  注意:鞭策语文件中的 YAML frontmatter 会被运行时忽略。如果存在,它被视为非内容元数据并从提示正文中剥离。
107
108
 
108
- ### 团队成员上限:`diligence-push-max`
109
+ ### 团队成员默认预算:`diligence-push-max`
109
110
 
110
- 每个团队成员可以选择通过 `.minds/team.yaml` 限制 diligence-push:
111
+ 每个团队成员可以选择通过 `.minds/team.yaml` 设置新建或重置对话的鞭策起始预算:
111
112
 
112
113
  ```yaml
113
114
  members:
@@ -118,7 +119,8 @@ members:
118
119
  规则:
119
120
 
120
121
  - 如果缺失,`diligence-push-max` 对于该成员默认为 **99**。
121
- - 如果 `diligence-push-max < 1`,则该成员的 diligence-push 被禁用(不注入),即使鞭策语文件存在。
122
+ - 如果 `diligence-push-max < 1`,则新建对话的剩余预算从 `0` 开始。
123
+ - 创建或重置之后,运行时业务逻辑以对话自己的剩余预算为准,而不是再次把 `diligence-push-max` 当作启停闸门。
122
124
  - 内置影子成员 `fuxi` 和 `pangu` 默认为 `diligence-push-max: 0`,除非在 team.yaml 中显式覆盖。
123
125
 
124
126
  ## UX 备注
@@ -425,11 +425,11 @@ Example / 示例(概念):
425
425
 
426
426
  ### Diligence Push(鞭策)
427
427
 
428
- - EN: A proactive continuation mechanism that nudges an agent forward when it's idle or blocked (a "Diligence Push"), using configurable prompts and budget limits. **Always use "Diligence Push"; never use "keep-going", "勤奋", "proactive-push", or "auto-continue".**
429
- - ZH: 一种主动继续机制,在智能体空闲或阻塞时通过可配置的提示词和预算上限进行"鞭策"。**统一使用"鞭策";禁止使用"保持运行"、"勤奋"、"自动继续"、"催促"等变体。**
428
+ - EN: A proactive continuation mechanism that nudges an agent forward when it's idle or blocked (a "Diligence Push"), using configurable prompts and per-dialog remaining budgets. **Always use "Diligence Push"; never use "keep-going", "勤奋", "proactive-push", or "auto-continue".**
429
+ - ZH: 一种主动继续机制,在智能体空闲或阻塞时通过可配置的提示词和每个对话自己的剩余预算进行"鞭策"。**统一使用"鞭策";禁止使用"保持运行"、"勤奋"、"自动继续"、"催促"等变体。**
430
430
 
431
431
  - EN: Related terms: "Diligence Push prompt" (prompt file), "Diligence Push-max" config, "Diligence Push injection" (prompt injection).
432
- - ZH: 相关术语:"鞭策提示词"(提示词文件)、"鞭策上限"(配置项)、"鞭策注入"(注入机制)。
432
+ - ZH: 相关术语:"鞭策提示词"(提示词文件)、"鞭策默认预算"(配置项)、"鞭策注入"(注入机制)。
433
433
 
434
434
  ### 用词原则:者 / 器 与 -or / -er
435
435
 
@@ -12,7 +12,7 @@ This means:
12
12
  - `apiType: anthropic` owns official Anthropic Messages semantics, including object-shaped `model_params.anthropic.thinking`.
13
13
  - `apiType: anthropic-compatible` owns Anthropic-compatible gateway semantics, including boolean `model_params.anthropic-compatible.thinking` mapped to provider `enabled` / `disabled` request objects.
14
14
 
15
- Some providers expose OpenAI-compatible or Anthropic-compatible endpoints while still requiring an explicit provider quirk profile. Volcano Engine Ark Coding Plan is the canonical example: its OpenAI-compatible integration reuses the Chat Completions transport shape, but `thinking`, `reasoning_content`, tool-call/thinking alternation, `<think>` compatibility, and model capability metadata must stay inside the `volcengine-coding-plan` quirk instead of becoming generic `openai-compatible` semantics. See [`volcengine-coding-plan-openai-compatible.zh.md`](./volcengine-coding-plan-openai-compatible.zh.md) for the design record.
15
+ Some providers expose OpenAI-compatible or Anthropic-compatible endpoints while still requiring explicit provider quirks. Volcano Engine Ark Coding Plan now uses the OpenAI-compatible Chat Completions shape with its dedicated `/api/coding/v3` endpoint; the historical Anthropic-compatible Volcano tool-call quirks have been removed. See [`volcengine-coding-plan-openai-compatible.zh.md`](./volcengine-coding-plan-openai-compatible.zh.md) for the design record.
16
16
 
17
17
  Similar field names across wrappers do not imply compatibility. For example, `reasoning_effort`, `verbosity`, `parallel_tool_calls`, and web search controls may look similar but can still differ in accepted values, payload shape, lifecycle events, validation rules, and runtime meaning.
18
18
 
@@ -12,7 +12,7 @@ Dominds 把每个 LLM provider wrapper 视为独立的协议适配器,而不
12
12
  - `apiType: anthropic` 只负责 Anthropic 官方 Messages 语义,包括 object 形态的 `model_params.anthropic.thinking`。
13
13
  - `apiType: anthropic-compatible` 负责 Anthropic 兼容网关语义,包括 boolean 形态的 `model_params.anthropic-compatible.thinking`,并映射为 provider 请求里的 `enabled` / `disabled` object。
14
14
 
15
- 某些 provider 虽然暴露 OpenAI-compatible 或 Anthropic-compatible endpoint,但仍可能需要明确的 provider quirk profile。典型例子是火山方舟 Coding PlanOpenAI-compatible 接入应复用 Chat Completions 的基础传输形态,但它的 `thinking`、`reasoning_content`、工具调用交替、`<think>` 兼容与模型能力表必须留在 `volcengine-coding-plan` 专项 quirk 中,不能进入通用 `openai-compatible` 语义。设计记录见 [`volcengine-coding-plan-openai-compatible.zh.md`](./volcengine-coding-plan-openai-compatible.zh.md)。
15
+ 某些 provider 虽然暴露 OpenAI-compatible 或 Anthropic-compatible endpoint,但仍可能需要明确的 provider quirk profile。火山方舟 Coding Plan 现在走 OpenAI-compatible Chat Completions 形态,并使用专属 `/api/coding/v3` endpoint;历史 Anthropic-compatible 火山工具调用 quirk 已取消。设计记录见 [`volcengine-coding-plan-openai-compatible.zh.md`](./volcengine-coding-plan-openai-compatible.zh.md)。
16
16
 
17
17
  不同 wrapper 下看起来同名的字段,不代表它们可以互相兼容。比如 `reasoning_effort`、`verbosity`、`parallel_tool_calls`、web search 相关开关,名字可能相似,但可接受值、请求载荷形状、流事件生命周期、校验规则和运行时含义都可能不同。
18
18
 
@@ -327,7 +327,7 @@ used in `.minds/team.yaml` member configurations.
327
327
  - `openai`: uses the OpenAI **Responses API** (best for OpenAI official endpoints; requires a `/v1`-style `responses` endpoint)
328
328
  - `anthropic`: uses the official Anthropic **Messages API**. `model_params.anthropic.thinking` uses the official Anthropic object shape.
329
329
  - `anthropic-compatible`: uses Anthropic-compatible **Messages API**. `model_params.anthropic-compatible.thinking` uses the Dominds boolean switch: `true` sends `thinking.type=enabled`; `false` sends `thinking.type=disabled`.
330
- - `openai-compatible`: uses the OpenAI **Chat Completions API** (best for most “OpenAI-compatible” third-party/proxy endpoints; e.g. a manually configured Ark `.../api/v3` endpoint; Volcano Engine Ark Coding Plan must use its dedicated `.../api/coding/v3` endpoint and declare the matching quirk)
330
+ - `openai-compatible`: uses the OpenAI **Chat Completions API** (best for most “OpenAI-compatible” third-party/proxy endpoints; e.g. a manually configured Ark `.../api/v3` endpoint; Volcano Engine Ark Coding Plan must use its dedicated `.../api/coding/v3` endpoint)
331
331
  - **Vision support**: if the provider/model supports multimodal Chat Completions, Dominds will pass tool-output images (`func_result_msg.contentItems[].type=input_image`, e.g. from MCP tools) to the model as `image_url` inputs after reading the persisted artifact; unsupported mime types are downgraded to text.
332
332
 
333
333
  ```yaml
@@ -268,7 +268,7 @@
268
268
  - `openai`:使用 OpenAI **Responses API**(适用于 OpenAI 官方;需要 `/v1` 语义的 `responses` 端点)
269
269
  - `anthropic`:使用 Anthropic 官方 **Messages API**。`model_params.anthropic.thinking` 使用 Anthropic 官方 object 形态。
270
270
  - `anthropic-compatible`:使用 Anthropic 兼容的 **Messages API**。`model_params.anthropic-compatible.thinking` 使用 Dominds boolean 开关:`true` 发送 `thinking.type=enabled`,`false` 发送 `thinking.type=disabled`。
271
- - `openai-compatible`:使用 OpenAI **Chat Completions API**(适用于多数“OpenAI 兼容”第三方/代理;例如手动配置的 Ark `.../api/v3` 端点;火山方舟 Coding Plan 必须使用专属 `.../api/coding/v3` 端点并声明对应 quirk)
271
+ - `openai-compatible`:使用 OpenAI **Chat Completions API**(适用于多数“OpenAI 兼容”第三方/代理;例如手动配置的 Ark `.../api/v3` 端点;火山方舟 Coding Plan 必须使用专属 `.../api/coding/v3` 端点)
272
272
  - **识图支持**:如果该 provider/model 支持 Chat Completions 的多模态输入,Dominds 会把工具输出里的图片(`func_result_msg.contentItems[].type=input_image`,来自 MCP 等工具)读取 artifact 后作为 `image_url` 形式喂给模型;不支持的 mimeType 会降级成文本提示。
273
273
 
274
274
  ```yaml
@@ -1,6 +1,6 @@
1
1
  # 火山方舟 Coding Plan OpenAI-Compatible 接入记录
2
2
 
3
- 本文记录 Dominds 试行将火山方舟 Coding Plan 从 Anthropic-compatible 协议切换到 OpenAI-compatible 协议的调研结论、设计边界和实施计划。
3
+ 本文记录 Dominds 将火山方舟 Coding Plan 从 Anthropic-compatible 协议切换到 OpenAI-compatible 协议的调研结论、设计边界和实施记录。
4
4
 
5
5
  调研日期:2026-05-06
6
6
 
@@ -15,7 +15,7 @@ Dominds 现有火山方舟 Coding Plan 接入主要围绕 Anthropic-compatible
15
15
 
16
16
  官方明确提醒:Coding Plan 不应使用普通数据面 `https://ark.cn-beijing.volces.com/api/v3`,否则不会消耗 Coding Plan 额度,可能产生额外 API 调用费用。
17
17
 
18
- 本轮试行目标是验证 OpenAI-compatible 路线是否更适合 Dominds 的工具调用、流式输出、thinking/saying 顺序与多模型支持。
18
+ 结论:Dominds 最终取消火山方舟 Coding Plan + Anthropic-compatible 组合,内置 `volcano-engine-coding-plan` 改用 OpenAI-compatible 路线,以降低工具调用、流式输出、thinking/saying 顺序与多模型支持上的兼容成本。
19
19
 
20
20
  ## 资料来源
21
21
 
@@ -56,19 +56,20 @@ Dominds 现有火山方舟 Coding Plan 接入主要围绕 Anthropic-compatible
56
56
 
57
57
  ### Provider Profile
58
58
 
59
- 新增或调整为一个明确 provider profile,例如:
59
+ 当前内置 provider profile
60
60
 
61
61
  ```yaml
62
62
  providers:
63
63
  volcano-engine-coding-plan:
64
64
  name: Volcano Engine Coding Plan
65
65
  apiType: openai-compatible
66
- apiQuirks: volcengine-coding-plan
66
+ apiQuirks:
67
+ - same-context-empty-response
67
68
  baseUrl: https://ark.cn-beijing.volces.com/api/coding/v3
68
69
  apiKeyEnvVar: ARK_API_KEY
69
70
  ```
70
71
 
71
- `apiType: openai-compatible` 只表示底层 HTTP endpoint、Chat Completions 请求形态和 SSE 基础形态接近 OpenAI Chat Completions。所有火山行为差异都由 `apiQuirks: volcengine-coding-plan` 明确承接。
72
+ `apiType: openai-compatible` 表示底层 HTTP endpoint、Chat Completions 请求形态和 SSE 基础形态接近 OpenAI Chat Completions。历史上用于火山 Anthropic-compatible 文本 tool_use / 空对象参数拼接的专项 quirks 已删除;当前内置只保留 `same-context-empty-response` 这类通用 provider 重试/诊断 quirk。
72
73
 
73
74
  ### 具体模型优先
74
75
 
@@ -86,9 +87,9 @@ Dominds 只声明具体模型,不声明 `ark-code-latest`。原因:
86
87
  建议边界:
87
88
 
88
89
  - 通用 OpenAI-compatible wrapper 保持 Chat Completions 标准假设。
89
- - 火山 Coding Plan request shaping 放在 quirk/profile 层。
90
- - 火山 Coding Plan stream delta 解释放在 quirk/profile 层。
91
- - 火山 Coding Plan 工具调用历史修复和字段校验放在 quirk/profile 层。
90
+ - 火山 Coding Plan request shaping OpenAI-compatible Chat Completions 形态为基准。
91
+ - 火山 Coding Plan stream delta 解释以 OpenAI-compatible SSE 形态为基准。
92
+ - 火山 Coding Plan 工具调用历史必须满足 Chat Completions 的 tool_calls / tool result 关联要求。
92
93
  - driver/storage/UI 只接收 Dominds 已解码后的 thinking/saying/calling 投影事件。
93
94
 
94
95
  ## 支持模型与能力草案
@@ -291,13 +292,13 @@ OpenAI Chat Completions 风格下,`delta.tool_calls` 可能按 index 分块返
291
292
  ### Phase 1:文档与配置边界
292
293
 
293
294
  - 新增本文档。
294
- - 更新 provider 隔离文档,注明火山 Coding Plan 作为 OpenAI-compatible quirk profile,而不是通用语义。
295
+ - 更新 provider 隔离文档,注明火山 Coding Plan 使用 OpenAI-compatible + 专属 endpoint,不再支持 Anthropic-compatible 火山工具 quirks。
295
296
  - 在 defaults 中将 `volcano-engine-coding-plan` 调整为 OpenAI-compatible profile,仅列具体模型。
296
297
  - 不提供 `ark-code-latest`。
297
298
 
298
299
  ### Phase 2:请求构造
299
300
 
300
- - OpenAI-compatible wrapper 中识别 `apiQuirks: volcengine-coding-plan`。
301
+ - 使用 OpenAI-compatible wrapper 的标准工具调用与流式解析路径。
301
302
  - 增加火山模型能力表。
302
303
  - 为火山 provider 增加 `thinking` / `reasoning_effort` 参数冲突校验。
303
304
  - 确保 tool call history 满足 `type: function`、arguments string 等要求。
@@ -3,8 +3,6 @@ import type { LanguageCode } from '@longrun-ai/kernel/types/language';
3
3
  import type { ProviderConfig } from './client';
4
4
  import type { LlmRetryStrategy } from './gen';
5
5
  export type LlmFailureKind = 'retriable' | 'rejected' | 'fatal';
6
- export declare const GLM_VIA_VOLCANO_API_QUIRK = "glm-via-volcano";
7
- export declare const VOLCANO_TOOL_USE_API_QUIRK = "volcano-tool-use";
8
6
  export declare const SAME_CONTEXT_EMPTY_RESPONSE_API_QUIRK = "same-context-empty-response";
9
7
  export type LlmFailureSummary = {
10
8
  kind: LlmFailureKind;
@@ -1,11 +1,9 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.XCODE_BEST_STREAM_INTERNAL_ERROR_CODE = exports.SAME_CONTEXT_EMPTY_RESPONSE_API_QUIRK = exports.VOLCANO_TOOL_USE_API_QUIRK = exports.GLM_VIA_VOLCANO_API_QUIRK = void 0;
3
+ exports.XCODE_BEST_STREAM_INTERNAL_ERROR_CODE = exports.SAME_CONTEXT_EMPTY_RESPONSE_API_QUIRK = void 0;
4
4
  exports.normalizeProviderApiQuirks = normalizeProviderApiQuirks;
5
5
  exports.createLlmFailureQuirkHandlerSession = createLlmFailureQuirkHandlerSession;
6
6
  const persistence_errors_1 = require("../persistence-errors");
7
- exports.GLM_VIA_VOLCANO_API_QUIRK = 'glm-via-volcano';
8
- exports.VOLCANO_TOOL_USE_API_QUIRK = 'volcano-tool-use';
9
7
  exports.SAME_CONTEXT_EMPTY_RESPONSE_API_QUIRK = 'same-context-empty-response';
10
8
  const DOMINDS_LLM_EMPTY_RESPONSE_ERROR_CODE = 'DOMINDS_LLM_EMPTY_RESPONSE';
11
9
  const XCODE_BEST_EMPTY_RESPONSE_SINGLE_RETRY_DELAY_MS = 3000;
@@ -3,6 +3,7 @@ export interface ModelInfo {
3
3
  name?: string;
4
4
  default_thinking?: boolean;
5
5
  supports_thinking?: boolean;
6
+ supports_tool_choice?: boolean;
6
7
  context_length?: number;
7
8
  input_length?: number;
8
9
  output_length?: number;
@@ -12,12 +12,6 @@
12
12
  # repeated empty-response deadlock detection for the same unchanged dialog context, plus conservative retry
13
13
  # classification for gateway-returned HTML 502 Bad Gateway pages and
14
14
  # `500 auth_unavailable: no auth available` infrastructure failures.
15
- # `apiQuirks: glm-via-volcano` enables a narrow Anthropic-compatible stream quirk for
16
- # Volcano Ark Coding Plan tool calls where an empty-object tool input may arrive as
17
- # content_block_start.input={} followed by a lone `partial_json: "}"`.
18
- # `apiQuirks: volcano-tool-use` enables a narrow Anthropic-compatible stream quirk for
19
- # Volcano Ark Coding Plan text blocks that render a tool call as textual
20
- # "Function call emitted by the assistant." metadata instead of protocol tool_use blocks.
21
15
  # `apiQuirks: same-context-empty-response` detects repeated empty responses in the same
22
16
  # dialog generation context and stops same-context retry loops with a deadlock-break prompt.
23
17
  # - tool_result_max_chars: optional transport-level cap for a single tool-result text payload
@@ -568,6 +562,7 @@ providers:
568
562
  name: Kimi-K2.6
569
563
  supports_thinking: true
570
564
  default_thinking: true
565
+ supports_tool_choice: false
571
566
  supports_image_input: true
572
567
  context_length: 200000
573
568
  input_length: 200000
@@ -577,6 +572,7 @@ providers:
577
572
  name: Kimi-K2.5
578
573
  supports_thinking: true
579
574
  default_thinking: false
575
+ supports_tool_choice: false
580
576
  supports_image_input: true
581
577
  context_length: 200000
582
578
  input_length: 200000
@@ -4,16 +4,10 @@ import type { Team } from '../../team';
4
4
  import type { FuncTool } from '../../tool';
5
5
  import type { ChatMessage, ProviderConfig } from '../client';
6
6
  import type { LlmBatchResult, LlmFailureDisposition, LlmGenerator, LlmRequestContext, LlmStreamReceiver, LlmStreamResult } from '../gen';
7
- export type AnthropicStreamConsumeQuirks = {
8
- normalizeLoneClosingBraceEmptyToolInputDelta: boolean;
9
- convertVolcanoTextToolUseBlocks: boolean;
10
- };
11
7
  export type AnthropicStreamConsumeOptions = {
12
8
  abortSignal?: AbortSignal;
13
9
  forcedJsonToolName?: string;
14
- quirks?: AnthropicStreamConsumeQuirks;
15
10
  genseq?: number;
16
- knownFunctionCallIds?: ReadonlySet<string>;
17
11
  };
18
12
  export type AnthropicStreamConsumeResult = {
19
13
  usage: LlmUsageStats;