dominds 1.22.1 → 1.23.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 (127) hide show
  1. package/dist/access-control.js +4 -4
  2. package/dist/docs/dialog-system.md +3 -2
  3. package/dist/docs/dialog-system.zh.md +3 -2
  4. package/dist/docs/encapsulated-taskdoc.md +18 -6
  5. package/dist/docs/encapsulated-taskdoc.zh.md +19 -7
  6. package/dist/docs/llm-provider-isolation.md +1 -1
  7. package/dist/docs/llm-provider-isolation.zh.md +1 -1
  8. package/dist/docs/team_mgmt-toolset.md +1 -0
  9. package/dist/docs/team_mgmt-toolset.zh.md +1 -0
  10. package/dist/llm/defaults.yaml +43 -0
  11. package/dist/llm/gen/openai-compatible.d.ts +3 -0
  12. package/dist/llm/gen/openai-compatible.js +294 -11
  13. package/dist/minds/minds-i18n.js +2 -2
  14. package/dist/minds/system-prompt-parts.js +8 -8
  15. package/dist/runtime/driver-messages.js +4 -4
  16. package/dist/team.d.ts +2 -1
  17. package/dist/team.js +11 -1
  18. package/dist/tools/ctrl.d.ts +1 -1
  19. package/dist/tools/ctrl.js +67 -28
  20. package/dist/tools/prompts/control/en/principles.md +3 -3
  21. package/dist/tools/prompts/control/en/scenarios.md +25 -0
  22. package/dist/tools/prompts/control/en/tools.md +18 -6
  23. package/dist/tools/prompts/control/zh/principles.md +3 -3
  24. package/dist/tools/prompts/control/zh/scenarios.md +25 -0
  25. package/dist/tools/prompts/control/zh/tools.md +18 -6
  26. package/dist/tools/team_mgmt-manual.js +2 -2
  27. package/dist/tools/team_mgmt.js +2 -2
  28. package/dist/utils/task-package.d.ts +16 -0
  29. package/dist/utils/task-package.js +131 -55
  30. package/dist/utils/taskdoc.js +12 -12
  31. package/package.json +1 -1
  32. package/webapp/dist/assets/{_basePickBy-DUbW5G8a.js → _basePickBy-C3SVVywm.js} +3 -3
  33. package/webapp/dist/assets/{_basePickBy-DUbW5G8a.js.map → _basePickBy-C3SVVywm.js.map} +1 -1
  34. package/webapp/dist/assets/{_baseUniq-vou1IeXB.js → _baseUniq-egNq6cCa.js} +2 -2
  35. package/webapp/dist/assets/{_baseUniq-vou1IeXB.js.map → _baseUniq-egNq6cCa.js.map} +1 -1
  36. package/webapp/dist/assets/{arc-D_O9oO0B.js → arc-CASAlRvm.js} +2 -2
  37. package/webapp/dist/assets/{arc-D_O9oO0B.js.map → arc-CASAlRvm.js.map} +1 -1
  38. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B7k9SWSL.js → architectureDiagram-2XIMDMQ5-B6n5FQmS.js} +7 -7
  39. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-B7k9SWSL.js.map → architectureDiagram-2XIMDMQ5-B6n5FQmS.js.map} +1 -1
  40. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-e3xTmffi.js → blockDiagram-WCTKOSBZ-D2UGGjic.js} +7 -7
  41. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-e3xTmffi.js.map → blockDiagram-WCTKOSBZ-D2UGGjic.js.map} +1 -1
  42. package/webapp/dist/assets/{c4Diagram-IC4MRINW-DVvi-N2o.js → c4Diagram-IC4MRINW-BOY_bQFP.js} +3 -3
  43. package/webapp/dist/assets/{c4Diagram-IC4MRINW-DVvi-N2o.js.map → c4Diagram-IC4MRINW-BOY_bQFP.js.map} +1 -1
  44. package/webapp/dist/assets/{channel-CH387UD2.js → channel-CZ_X09H1.js} +2 -2
  45. package/webapp/dist/assets/{channel-CH387UD2.js.map → channel-CZ_X09H1.js.map} +1 -1
  46. package/webapp/dist/assets/{chunk-4BX2VUAB-BOo0Xj3m.js → chunk-4BX2VUAB-BIwyAzZQ.js} +2 -2
  47. package/webapp/dist/assets/{chunk-4BX2VUAB-BOo0Xj3m.js.map → chunk-4BX2VUAB-BIwyAzZQ.js.map} +1 -1
  48. package/webapp/dist/assets/{chunk-55IACEB6-CI4uRAx_.js → chunk-55IACEB6-zSjTFoCX.js} +2 -2
  49. package/webapp/dist/assets/{chunk-55IACEB6-CI4uRAx_.js.map → chunk-55IACEB6-zSjTFoCX.js.map} +1 -1
  50. package/webapp/dist/assets/{chunk-FMBD7UC4-C4N1ovxD.js → chunk-FMBD7UC4-CTpuRfdB.js} +2 -2
  51. package/webapp/dist/assets/{chunk-FMBD7UC4-C4N1ovxD.js.map → chunk-FMBD7UC4-CTpuRfdB.js.map} +1 -1
  52. package/webapp/dist/assets/{chunk-JSJVCQXG-5U4Hu7pC.js → chunk-JSJVCQXG-CJ3DM4in.js} +2 -2
  53. package/webapp/dist/assets/{chunk-JSJVCQXG-5U4Hu7pC.js.map → chunk-JSJVCQXG-CJ3DM4in.js.map} +1 -1
  54. package/webapp/dist/assets/{chunk-KX2RTZJC-BXPDNuct.js → chunk-KX2RTZJC-B97EakhO.js} +2 -2
  55. package/webapp/dist/assets/{chunk-KX2RTZJC-BXPDNuct.js.map → chunk-KX2RTZJC-B97EakhO.js.map} +1 -1
  56. package/webapp/dist/assets/{chunk-NQ4KR5QH-oVsExnnn.js → chunk-NQ4KR5QH-5o1o5x0z.js} +4 -4
  57. package/webapp/dist/assets/{chunk-NQ4KR5QH-oVsExnnn.js.map → chunk-NQ4KR5QH-5o1o5x0z.js.map} +1 -1
  58. package/webapp/dist/assets/{chunk-QZHKN3VN-C6FzEv2C.js → chunk-QZHKN3VN-D33FSIEb.js} +2 -2
  59. package/webapp/dist/assets/{chunk-QZHKN3VN-C6FzEv2C.js.map → chunk-QZHKN3VN-D33FSIEb.js.map} +1 -1
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-Ir7e_B7t.js → chunk-WL4C6EOR-C2InqFin.js} +6 -6
  61. package/webapp/dist/assets/{chunk-WL4C6EOR-Ir7e_B7t.js.map → chunk-WL4C6EOR-C2InqFin.js.map} +1 -1
  62. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CPYs_LAr.js → classDiagram-VBA2DB6C-BfLZmK48.js} +7 -7
  63. package/webapp/dist/assets/{classDiagram-VBA2DB6C-CPYs_LAr.js.map → classDiagram-VBA2DB6C-BfLZmK48.js.map} +1 -1
  64. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CPYs_LAr.js → classDiagram-v2-RAHNMMFH-BfLZmK48.js} +7 -7
  65. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-CPYs_LAr.js.map → classDiagram-v2-RAHNMMFH-BfLZmK48.js.map} +1 -1
  66. package/webapp/dist/assets/{clone-CToca8rS.js → clone-BSCHnHfl.js} +2 -2
  67. package/webapp/dist/assets/{clone-CToca8rS.js.map → clone-BSCHnHfl.js.map} +1 -1
  68. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-DLNtqY7a.js → cose-bilkent-S5V4N54A-CeQ1jAJJ.js} +2 -2
  69. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-DLNtqY7a.js.map → cose-bilkent-S5V4N54A-CeQ1jAJJ.js.map} +1 -1
  70. package/webapp/dist/assets/{dagre-KLK3FWXG-Bkt-O9uW.js → dagre-KLK3FWXG-WUuNYzcK.js} +7 -7
  71. package/webapp/dist/assets/{dagre-KLK3FWXG-Bkt-O9uW.js.map → dagre-KLK3FWXG-WUuNYzcK.js.map} +1 -1
  72. package/webapp/dist/assets/{diagram-E7M64L7V-B4JR_u4V.js → diagram-E7M64L7V-jOVCIExP.js} +8 -8
  73. package/webapp/dist/assets/{diagram-E7M64L7V-B4JR_u4V.js.map → diagram-E7M64L7V-jOVCIExP.js.map} +1 -1
  74. package/webapp/dist/assets/{diagram-IFDJBPK2-D9zRh8b7.js → diagram-IFDJBPK2-cCeQqotA.js} +7 -7
  75. package/webapp/dist/assets/{diagram-IFDJBPK2-D9zRh8b7.js.map → diagram-IFDJBPK2-cCeQqotA.js.map} +1 -1
  76. package/webapp/dist/assets/{diagram-P4PSJMXO-CAaXVWnX.js → diagram-P4PSJMXO-DjAYFRLv.js} +7 -7
  77. package/webapp/dist/assets/{diagram-P4PSJMXO-CAaXVWnX.js.map → diagram-P4PSJMXO-DjAYFRLv.js.map} +1 -1
  78. package/webapp/dist/assets/{erDiagram-INFDFZHY-DDeoaSkJ.js → erDiagram-INFDFZHY-Dl_6U5fV.js} +5 -5
  79. package/webapp/dist/assets/{erDiagram-INFDFZHY-DDeoaSkJ.js.map → erDiagram-INFDFZHY-Dl_6U5fV.js.map} +1 -1
  80. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DEYqzSEJ.js → flowDiagram-PKNHOUZH-D80nrZ3S.js} +7 -7
  81. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DEYqzSEJ.js.map → flowDiagram-PKNHOUZH-D80nrZ3S.js.map} +1 -1
  82. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BuLOSh0d.js → ganttDiagram-A5KZAMGK-T3WdMrgj.js} +3 -3
  83. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BuLOSh0d.js.map → ganttDiagram-A5KZAMGK-T3WdMrgj.js.map} +1 -1
  84. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js → gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js} +8 -8
  85. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-CBrwZvBf.js.map → gitGraphDiagram-K3NZZRJ6-ifV-jkKL.js.map} +1 -1
  86. package/webapp/dist/assets/{graph-fX6cvjwR.js → graph-D5jmnb35.js} +3 -3
  87. package/webapp/dist/assets/{graph-fX6cvjwR.js.map → graph-D5jmnb35.js.map} +1 -1
  88. package/webapp/dist/assets/{index-B3WzTLcD.js → index-CGbZlct2.js} +622 -160
  89. package/webapp/dist/assets/index-CGbZlct2.js.map +1 -0
  90. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-Ci3XYvve.js → infoDiagram-LFFYTUFH-C340CY5x.js} +6 -6
  91. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-Ci3XYvve.js.map → infoDiagram-LFFYTUFH-C340CY5x.js.map} +1 -1
  92. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-DOH5ua9R.js → ishikawaDiagram-PHBUUO56-Bu4RsELK.js} +2 -2
  93. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-DOH5ua9R.js.map → ishikawaDiagram-PHBUUO56-Bu4RsELK.js.map} +1 -1
  94. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DM_fiZlj.js → journeyDiagram-4ABVD52K-Dvv3ypKA.js} +5 -5
  95. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DM_fiZlj.js.map → journeyDiagram-4ABVD52K-Dvv3ypKA.js.map} +1 -1
  96. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-CSh2hqc2.js → kanban-definition-K7BYSVSG-D_rsetjW.js} +3 -3
  97. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-CSh2hqc2.js.map → kanban-definition-K7BYSVSG-D_rsetjW.js.map} +1 -1
  98. package/webapp/dist/assets/{layout-yZEK1LgL.js → layout-CLmOfwnS.js} +5 -5
  99. package/webapp/dist/assets/{layout-yZEK1LgL.js.map → layout-CLmOfwnS.js.map} +1 -1
  100. package/webapp/dist/assets/{linear-m76SmdtZ.js → linear-DFAmViqi.js} +2 -2
  101. package/webapp/dist/assets/{linear-m76SmdtZ.js.map → linear-DFAmViqi.js.map} +1 -1
  102. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-NiwP-SLH.js → mindmap-definition-YRQLILUH-Ce3_czeS.js} +4 -4
  103. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-NiwP-SLH.js.map → mindmap-definition-YRQLILUH-Ce3_czeS.js.map} +1 -1
  104. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-CSCapDSD.js → pieDiagram-SKSYHLDU-U6_un5Sc.js} +8 -8
  105. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-CSCapDSD.js.map → pieDiagram-SKSYHLDU-U6_un5Sc.js.map} +1 -1
  106. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-CbDGQH91.js → quadrantDiagram-337W2JSQ-DmVJQItS.js} +3 -3
  107. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-CbDGQH91.js.map → quadrantDiagram-337W2JSQ-DmVJQItS.js.map} +1 -1
  108. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CeG2yodp.js → requirementDiagram-Z7DCOOCP-BkNhSY-g.js} +4 -4
  109. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CeG2yodp.js.map → requirementDiagram-Z7DCOOCP-BkNhSY-g.js.map} +1 -1
  110. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-B_l8tKqa.js → sankeyDiagram-WA2Y5GQK-E3UEy5SX.js} +2 -2
  111. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-B_l8tKqa.js.map → sankeyDiagram-WA2Y5GQK-E3UEy5SX.js.map} +1 -1
  112. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Dc5gBIi5.js → sequenceDiagram-2WXFIKYE-k0w9WKAO.js} +4 -4
  113. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-Dc5gBIi5.js.map → sequenceDiagram-2WXFIKYE-k0w9WKAO.js.map} +1 -1
  114. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DMYeNS1r.js → stateDiagram-RAJIS63D-DRgdJrlx.js} +9 -9
  115. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DMYeNS1r.js.map → stateDiagram-RAJIS63D-DRgdJrlx.js.map} +1 -1
  116. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-MfUJuUEe.js → stateDiagram-v2-FVOUBMTO-edtkX9x6.js} +5 -5
  117. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-MfUJuUEe.js.map → stateDiagram-v2-FVOUBMTO-edtkX9x6.js.map} +1 -1
  118. package/webapp/dist/assets/{timeline-definition-YZTLITO2-Ci2CZEky.js → timeline-definition-YZTLITO2-D0zyXyNL.js} +3 -3
  119. package/webapp/dist/assets/{timeline-definition-YZTLITO2-Ci2CZEky.js.map → timeline-definition-YZTLITO2-D0zyXyNL.js.map} +1 -1
  120. package/webapp/dist/assets/{treemap-KZPCXAKY-CNgzp4sT.js → treemap-KZPCXAKY-CglsYqbQ.js} +5 -5
  121. package/webapp/dist/assets/{treemap-KZPCXAKY-CNgzp4sT.js.map → treemap-KZPCXAKY-CglsYqbQ.js.map} +1 -1
  122. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BYxtNx2s.js → vennDiagram-LZ73GAT5-DsUizzvt.js} +2 -2
  123. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BYxtNx2s.js.map → vennDiagram-LZ73GAT5-DsUizzvt.js.map} +1 -1
  124. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BUS3bn9p.js → xychartDiagram-JWTSCODW-DvYQ4zKY.js} +3 -3
  125. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BUS3bn9p.js.map → xychartDiagram-JWTSCODW-DvYQ4zKY.js.map} +1 -1
  126. package/webapp/dist/index.html +1 -1
  127. package/webapp/dist/assets/index-B3WzTLcD.js.map +0 -1
@@ -311,13 +311,13 @@ function getAccessDeniedMessage(operation, targetPath, language = 'en') {
311
311
  lines.push('');
312
312
  if (language === 'zh') {
313
313
  lines.push(`- 说明:\`*.tsk/\` 是封装差遣牒。通用文件工具无法读/写/列目录/删除其中内容(硬编码无条件拒绝)。`);
314
- lines.push(`- 提示:新增章节请使用 \`do_mind\`;少量追加请使用 \`mind_more\`(默认 progress:\`mind_more({\"items\":[\"...\"]})\`);改写已有整章请使用 \`change_mind\`(顶层:\`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`;额外章节:\`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`)。`);
315
- lines.push(`- 提示:读取额外章节请使用函数工具 \`recall_taskdoc\`:\`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`。`);
314
+ lines.push(`- 提示:新增章节请使用 \`do_mind\`;少量追加请使用 \`mind_more\`(默认 progress:\`mind_more({\"items\":[\"...\"]})\`);改写已有整章请先用 \`recall_taskdoc\` 取得当前内容哈希,再使用带 \`previous_content_hash\` 的 \`change_mind\`(顶层示例:先 \`recall_taskdoc({\"selector\":\"progress\"})\`,再 \`change_mind({\"selector\":\"progress\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`;额外章节:先 \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`,再 \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`)。`);
315
+ lines.push(`- 提示:读取章节或取得 content_hash 请使用函数工具 \`recall_taskdoc\`:顶层 \`recall_taskdoc({\"selector\":\"progress\"})\`;额外章节 \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`。`);
316
316
  }
317
317
  else {
318
318
  lines.push(`- Note: \`*.tsk/\` is an encapsulated Taskdoc. It is hard-denied for all general file tools.`);
319
- lines.push(`- Hint: To create a section, use \`do_mind\`; for small append-only updates, use \`mind_more\` (defaults to progress: \`mind_more({\"items\":[\"...\"]})\`); for full-section replacements of existing sections, use \`change_mind\` (top-level: \`change_mind({\"selector\":\"goals|constraints|progress\",\"content\":\"...\"})\`; extra sections: \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\`).`);
320
- lines.push(`- Hint: To read extra sections, use \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`.`);
319
+ lines.push(`- Hint: To create a section, use \`do_mind\`; for small append-only updates, use \`mind_more\` (defaults to progress: \`mind_more({\"items\":[\"...\"]})\`); for full-section replacements, call \`recall_taskdoc\` for the current content hash first, then use \`change_mind\` with \`previous_content_hash\` (top-level example: first \`recall_taskdoc({\"selector\":\"progress\"})\`, then \`change_mind({\"selector\":\"progress\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`; extra sections: first \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`, then \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\",\"previous_content_hash\":\"crc32:...\"})\`).`);
320
+ lines.push(`- Hint: To read a section or get content_hash, use \`recall_taskdoc\`: top-level \`recall_taskdoc({\"selector\":\"progress\"})\`; extra section \`recall_taskdoc({\"category\":\"<category>\",\"selector\":\"<selector>\"})\`.`);
321
321
  }
322
322
  }
323
323
  if (isMindsPath(targetPath)) {
@@ -821,7 +821,7 @@ Invoke the function tool `clear_mind` with:
821
821
 
822
822
  - `do_mind`: create one new section; fails if the target already exists.
823
823
  - `mind_more`: append small entries to an existing section; defaults to `progress`.
824
- - `change_mind`: replace one existing section; fails if the target does not exist.
824
+ - `change_mind`: replace one existing section; fails if the target does not exist or `previous_content_hash` does not match the current content hash.
825
825
  - `never_mind`: delete one existing section.
826
826
 
827
827
  **Common section arguments**:
@@ -829,11 +829,12 @@ Invoke the function tool `clear_mind` with:
829
829
  - `selector: "goals" | "constraints" | "progress"` for top-level sections; or a valid selector with `category`
830
830
  - `category?: string`
831
831
  - `content: string` for `do_mind` / `change_mind`
832
+ - `previous_content_hash: string` for `change_mind`
832
833
 
833
834
  Example:
834
835
 
835
836
  ```text
836
- Invoke `do_mind` to create a missing section, or `change_mind` to replace an existing section.
837
+ Invoke `do_mind` to create a missing section, or `change_mind` with the current `content_hash` as `previous_content_hash` to replace an existing section.
837
838
  ```
838
839
 
839
840
  **Behavior**:
@@ -798,7 +798,7 @@ async function checkSideDialogRevival(askerDialog: Dialog): Promise<void> {
798
798
 
799
799
  - `do_mind`:创建一个新章节;若目标已存在则失败。
800
800
  - `mind_more`:向已有章节追加少量条目;默认追加到 `progress`。
801
- - `change_mind`:替换一个已有章节;若目标不存在则失败。
801
+ - `change_mind`:替换一个已有章节;若目标不存在,或 `previous_content_hash` 与当前内容哈希不匹配,则失败。
802
802
  - `never_mind`:删除一个已有章节。
803
803
 
804
804
  **通用章节参数**:
@@ -806,11 +806,12 @@ async function checkSideDialogRevival(askerDialog: Dialog): Promise<void> {
806
806
  - 顶层章节使用 `selector: "goals" | "constraints" | "progress"`;额外章节使用有效 `selector` 加 `category`
807
807
  - `category?: string`
808
808
  - `do_mind` / `change_mind` 使用 `content: string`
809
+ - `change_mind` 还需要 `previous_content_hash: string`
809
810
 
810
811
  示例:
811
812
 
812
813
  ```text
813
- 调用 `do_mind` 创建缺失章节,或调用 `change_mind` 替换已有章节。
814
+ 调用 `do_mind` 创建缺失章节,或调用 `change_mind` 并带上当前 `content_hash` 作为 `previous_content_hash` 替换已有章节。
814
815
  ```
815
816
 
816
817
  **行为**:
@@ -149,7 +149,7 @@ Below is the canonical copy. If you need to rephrase it for UI layout, you MUST
149
149
 
150
150
  - Any `.tsk/` directory and its subpaths (`**/*.tsk/**`) are encapsulated state: general file tools MUST NOT read/write/list them (e.g. `read_file` / `write_file` / `list_dir`).
151
151
  - Taskdoc updates MUST go through explicit Taskdoc function tools: `do_mind` creates a new section, `mind_more` appends small entries to an existing section, `change_mind` replaces an existing section, and `never_mind` deletes a section.
152
- - To read extra sections that are NOT auto-injected, use the function tool `recall_taskdoc({ category, selector })`.
152
+ - To read any Taskdoc section or get its `content_hash`, use the function tool `recall_taskdoc({ selector, category? })`.
153
153
 
154
154
  **Taskdoc auto-injection rules (system prompt)**
155
155
 
@@ -174,7 +174,7 @@ Taskdoc mutation function tools each affect **exactly one** section file of the
174
174
 
175
175
  - `do_mind` creates a new section file and MUST fail if the target already exists.
176
176
  - `mind_more` appends entries without deduplicating or rewriting old content.
177
- - `change_mind` replaces an existing section file and MUST fail if the target does not exist.
177
+ - `change_mind` replaces an existing section file and MUST fail if the target does not exist or if the supplied `previous_content_hash` does not match the current section content hash.
178
178
  - `never_mind` deletes an existing section file.
179
179
 
180
180
  Critically:
@@ -191,6 +191,7 @@ They take:
191
191
 
192
192
  - `selector` (required)
193
193
  - `content` (required)
194
+ - `previous_content_hash` (required for `change_mind`)
194
195
  - `category` (optional)
195
196
 
196
197
  When `category` is missing/empty, `selector` targets the **top-level** section files:
@@ -218,18 +219,26 @@ Hard prohibitions:
218
219
  - `contracts|acceptance|grants|runbook|decisions|risks` MUST NOT be written outside `category="bearinmind"`.
219
220
  - No other category is auto-injected into the system prompt (only an index may be shown).
220
221
 
221
- ### `recall_taskdoc` (read-only; for non-auto-injected sections)
222
+ `previous_content_hash` is the `crc32:...` checksum of the current section content after Dominds' canonical Markdown file-ending normalization. It is not stored as extra state.
223
+
224
+ - For top-level sections (`goals`, `constraints`, `progress`), call `recall_taskdoc({ selector })`; its result includes `content_hash`.
225
+ - For extra non-auto-injected sections, call `recall_taskdoc({ category, selector })`; its result includes `content_hash`.
226
+ - On hash mismatch, the write MUST fail. The agent must re-read/review the current section and retry only after fully merging existing content.
227
+ - If the proposed replacement would overwrite, delete, or materially replace existing content, the agent must have either direct human confirmation for that replacement, or a human-approved explicit SOP/acceptance standard that authorizes the replacement after considering the existing content.
228
+
229
+ ### `recall_taskdoc` (read-only; for Taskdoc sections and content_hash)
222
230
 
223
231
  Because general file tools cannot read anything under `*.tsk/`, Dominds provides a dedicated read tool:
224
232
 
225
233
  ```
226
- recall_taskdoc({ category, selector })
234
+ recall_taskdoc({ selector, category? })
227
235
  ```
228
236
 
229
237
  Behavior:
230
238
 
231
239
  - Reads `bearinmind/<whitelisted>.md` or `<category>/<selector>.md`.
232
- - The top-level three sections (`goals` / `constraints` / `progress`) are already auto-injected, so `recall_taskdoc` does not read them.
240
+ - The top-level three sections (`goals` / `constraints` / `progress`) are auto-injected as content, but their `content_hash` is only returned by `recall_taskdoc`.
241
+ - Returns the section `content_hash` for use as `change_mind.previous_content_hash`.
233
242
 
234
243
  Example (bearinmind):
235
244
 
@@ -248,8 +257,11 @@ Call the function tool `recall_taskdoc` with:
248
257
  Example:
249
258
 
250
259
  ```text
260
+ Call the function tool `recall_taskdoc` with:
261
+ { "selector": "constraints" }
262
+
251
263
  Call the function tool `change_mind` with:
252
- { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n" }
264
+ { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n", "previous_content_hash": "crc32:..." }
253
265
  ```
254
266
 
255
267
  ### Behavioral rules
@@ -148,7 +148,7 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
148
148
 
149
149
  - 任何 `.tsk/` 目录及其子路径(`**/*.tsk/**`)都是封装状态:禁止使用任何通用文件工具读取/写入/列目录(例如 `read_file` / `write_file` / `list_dir` 等)。
150
150
  - 更新差遣牒只能使用显式差遣牒函数工具:`do_mind` 创建新章节,`mind_more` 向已有章节追加少量条目,`change_mind` 替换已有章节,`never_mind` 删除章节。
151
- - 读取"不会自动注入上下文"的额外章节,只能使用函数工具 `recall_taskdoc({ category, selector })`。
151
+ - 读取任意差遣牒章节或取得其 `content_hash`,只能使用函数工具 `recall_taskdoc({ selector, category? })`。
152
152
 
153
153
  **差遣牒自动注入规则(系统提示)**
154
154
 
@@ -164,7 +164,7 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
164
164
 
165
165
  - Any `.tsk/` directory and its subpaths (`**/*.tsk/**`) are encapsulated state: general file tools MUST NOT read/write/list them (e.g. `read_file` / `write_file` / `list_dir`).
166
166
  - Taskdoc updates MUST go through explicit Taskdoc function tools: `do_mind` creates a new section, `mind_more` appends small entries to an existing section, `change_mind` replaces an existing section, and `never_mind` deletes a section.
167
- - To read extra sections that are NOT auto-injected, use the function tool `recall_taskdoc({ category, selector })`.
167
+ - To read any Taskdoc section or get its `content_hash`, use the function tool `recall_taskdoc({ selector, category? })`.
168
168
 
169
169
  **Taskdoc auto-injection rules (system prompt)**
170
170
 
@@ -185,7 +185,7 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
185
185
 
186
186
  - `do_mind` 创建新章节文件;如果目标已存在,必须失败。
187
187
  - `mind_more` 追加条目,不会自动去重或改写旧内容。
188
- - `change_mind` 替换已有章节文件;如果目标不存在,必须失败。
188
+ - `change_mind` 替换已有章节文件;如果目标不存在,或传入的 `previous_content_hash` 与当前章节内容哈希不匹配,必须失败。
189
189
  - `never_mind` 删除已有章节文件。
190
190
 
191
191
  关键点:
@@ -202,6 +202,7 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
202
202
 
203
203
  - `selector`(必需)
204
204
  - `content`(必需)
205
+ - `previous_content_hash`(`change_mind` 必需)
205
206
  - `category`(可选)
206
207
 
207
208
  当 `category` 缺失/为空时,`selector` 指向**顶层**部分文件:
@@ -229,18 +230,26 @@ Dominds 必须从任务包构造一个**有效差遣牒**用于提示词和 UI
229
230
  - `contracts|acceptance|grants|runbook|decisions|risks` 不得在 `category="bearinmind"` 之外编写。
230
231
  - 没有其他类别会自动注入系统提示(只会显示一个索引)。
231
232
 
232
- ### `recall_taskdoc`(只读;用于非自动注入的部分)
233
+ `previous_content_hash` 是当前章节内容在 Dominds 规范化 Markdown 文件结尾之后得到的 `crc32:...` 校验值;它不是额外持久状态。
234
+
235
+ - 顶层章节(`goals`、`constraints`、`progress`)需要调用 `recall_taskdoc({ selector })`;返回结果会包含 `content_hash`。
236
+ - 额外非自动注入章节需要调用 `recall_taskdoc({ category, selector })`;返回结果会包含 `content_hash`。
237
+ - 哈希不匹配时写入必须失败。智能体必须重新读取/回顾当前章节,并且只在充分合并原有内容后重试。
238
+ - 如果拟替换内容会冲掉、删除或实质替换原有内容,智能体必须已获得该替换的直接人类确认,或存在人类认可的明确 SOP/验收标准,并且已按该标准考虑过原有内容。
239
+
240
+ ### `recall_taskdoc`(只读;用于差遣牒章节与 content_hash)
233
241
 
234
242
  因为通用文件工具无法读取 `*.tsk/` 下的任何内容,Dominds 提供了一个专门的读取工具:
235
243
 
236
244
  ```
237
- recall_taskdoc({ category, selector })
245
+ recall_taskdoc({ selector, category? })
238
246
  ```
239
247
 
240
248
  行为:
241
249
 
242
250
  - 读取 `bearinmind/<whitelisted>.md` 或 `<category>/<selector>.md`。
243
- - 顶层三段(`goals` / `constraints` / `progress`)已经自动注入,因此 `recall_taskdoc` 不会读取它们。
251
+ - 顶层三段(`goals` / `constraints` / `progress`)会自动注入正文,但其 `content_hash` 只通过 `recall_taskdoc` 返回。
252
+ - 返回章节 `content_hash`,供 `change_mind.previous_content_hash` 使用。
244
253
 
245
254
  示例(bearinmind):
246
255
 
@@ -259,8 +268,11 @@ recall_taskdoc({ category, selector })
259
268
  示例:
260
269
 
261
270
  ```text
271
+ 使用函数工具 `recall_taskdoc` 调用:
272
+ { "selector": "constraints" }
273
+
262
274
  使用函数工具 `change_mind` 调用:
263
- { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n" }
275
+ { "selector": "constraints", "content": "- MUST not browse the web.\n- MUST keep responses under 10 lines unless asked otherwise.\n", "previous_content_hash": "crc32:..." }
264
276
  ```
265
277
 
266
278
  ### 行为规则
@@ -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 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.
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. Kimi Code also uses the OpenAI-compatible Chat Completions shape, but must use the built-in `kimi-code` provider's dedicated `/coding/v1` endpoint, real Dominds User-Agent, `prompt_cache_key`, and Kimi-specific `thinking`/`reasoning_effort` request shaping. See [`volcengine-coding-plan-openai-compatible.zh.md`](./volcengine-coding-plan-openai-compatible.zh.md) for the Volcano migration 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 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)。
15
+ 某些 provider 虽然暴露 OpenAI-compatible 或 Anthropic-compatible endpoint,但仍可能需要明确的 provider quirk profile。火山方舟 Coding Plan 现在走 OpenAI-compatible Chat Completions 形态,并使用专属 `/api/coding/v3` endpoint;历史 Anthropic-compatible 火山工具调用 quirk 已取消。Kimi Code 也走 OpenAI-compatible Chat Completions 形态,但必须使用内置 `kimi-code` provider 的专属 `/coding/v1` endpoint、真实 Dominds User-Agent、`prompt_cache_key` 和 Kimi 专用 `thinking`/`reasoning_effort` 请求整形。火山迁移设计记录见 [`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
 
@@ -328,6 +328,7 @@ used in `.minds/team.yaml` member configurations.
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
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
+ - Kimi Code uses the built-in `kimi-code` provider (`https://api.kimi.com/coding/v1`, `KIMI_CODE_API_KEY`, model `kimi-for-coding`) rather than a generic Moonshot/Open Platform endpoint.
331
332
  - **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
333
 
333
334
  ```yaml
@@ -269,6 +269,7 @@
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
271
  - `openai-compatible`:使用 OpenAI **Chat Completions API**(适用于多数“OpenAI 兼容”第三方/代理;例如手动配置的 Ark `.../api/v3` 端点;火山方舟 Coding Plan 必须使用专属 `.../api/coding/v3` 端点)
272
+ - Kimi Code 使用内置 `kimi-code` provider(`https://api.kimi.com/coding/v1`、`KIMI_CODE_API_KEY`、模型 `kimi-for-coding`),不要配置成普通 Moonshot/Open Platform endpoint。
272
273
  - **识图支持**:如果该 provider/model 支持 Chat Completions 的多模态输入,Dominds 会把工具输出里的图片(`func_result_msg.contentItems[].type=input_image`,来自 MCP 等工具)读取 artifact 后作为 `image_url` 形式喂给模型;不支持的 mimeType 会降级成文本提示。
273
274
 
274
275
  ```yaml
@@ -449,6 +449,49 @@ providers:
449
449
  input_length: 128000
450
450
  output_length: 8192
451
451
  context_window: '128K'
452
+ kimi-code:
453
+ name: Kimi Code
454
+ apiType: openai-compatible
455
+ apiQuirks:
456
+ - kimi-code
457
+ - kimi-cli-cloak # TODO: remove this once Kimi officially admits Dominds
458
+ baseUrl: https://api.kimi.com/coding/v1
459
+ apiKeyEnvVar: KIMI_CODE_API_KEY
460
+ tech_spec_url: https://www.kimi.com/code/docs/en/third-party-tools/other-coding-agents.html
461
+ api_mgmt_url: https://www.kimi.com/code/console
462
+ model_param_options:
463
+ openai-compatible:
464
+ thinking:
465
+ prominent: true
466
+ default: medium
467
+ type: enum
468
+ values: [auto, off, low, medium, high]
469
+ description: Kimi Code thinking mode. auto leaves thinking/reasoning_effort unset; off sends thinking.type=disabled; low/medium/high send thinking.type=enabled plus the matching reasoning_effort.
470
+ reasoning_effort:
471
+ type: enum
472
+ values: [low, medium, high]
473
+ description: Advanced Kimi Code wire-level reasoning effort override. Prefer the prominent thinking enum for normal setup; do not combine with auto/off/disabled thinking.
474
+ temperature:
475
+ type: number
476
+ min: 0
477
+ max: 2
478
+ description: Sampling temperature. Leave unset unless you have verified the current Kimi Code API accepts the chosen value.
479
+ top_p:
480
+ type: number
481
+ min: 0
482
+ max: 1
483
+ description: Nucleus sampling parameter.
484
+ models:
485
+ kimi-for-coding:
486
+ name: Kimi For Coding
487
+ supports_thinking: true
488
+ default_thinking: true
489
+ supports_tool_choice: false
490
+ supports_image_input: true
491
+ context_length: 262144
492
+ input_length: 262144
493
+ output_length: 32768
494
+ context_window: '262K'
452
495
  volcano-engine-coding-plan:
453
496
  name: Volcano Ark Coding Plan
454
497
  apiType: openai-compatible
@@ -18,11 +18,14 @@ import { type LlmBatchResult, type LlmFailureDisposition, type LlmGenerator, typ
18
18
  type OpenAiCompatibleChatExtraParams = {
19
19
  thinking?: boolean | Record<string, unknown>;
20
20
  reasoning_effort?: NonNullable<Team.ModelParams['openai-compatible']>['reasoning_effort'];
21
+ prompt_cache_key?: string;
21
22
  };
22
23
  export declare function resolveOpenAiCompatibleToolChoice(funcTools: readonly FuncTool[], requestContext: LlmRequestContext, modelInfo?: ModelInfo): 'none' | 'auto' | 'required' | undefined;
23
24
  export declare function buildOpenAiCompatibleExtraParamsForTest(args: {
25
+ providerConfig?: ProviderConfig;
24
26
  agent: Team.Member;
25
27
  openAiParams: NonNullable<Team.ModelParams['openai-compatible']>;
28
+ requestContext?: LlmRequestContext;
26
29
  }): OpenAiCompatibleChatExtraParams;
27
30
  export declare function wrapOpenAiCompatibleRejectedRequestErrorForTest(args: {
28
31
  error: unknown;