dominds 1.1.3 → 1.1.4

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 (152) hide show
  1. package/dist/access-control.js +4 -0
  2. package/dist/cli/read.js +284 -102
  3. package/dist/docs/memory-system.md +10 -4
  4. package/dist/docs/memory-system.zh.md +10 -4
  5. package/dist/docs/team_mgmt-toolset.md +2 -2
  6. package/dist/docs/team_mgmt-toolset.zh.md +2 -2
  7. package/dist/minds/load.js +6 -6
  8. package/dist/minds/system-prompt-parts.js +5 -2
  9. package/dist/minds/system-prompt.js +2 -2
  10. package/dist/shared/diligence.js +8 -4
  11. package/dist/static/assets/{_basePickBy-BAy0WcNn.js → _basePickBy-D4H_CIr2.js} +3 -3
  12. package/dist/static/assets/{_basePickBy-BAy0WcNn.js.map → _basePickBy-D4H_CIr2.js.map} +1 -1
  13. package/dist/static/assets/{_baseUniq-C22j0Hu6.js → _baseUniq-Cam_qUTC.js} +2 -2
  14. package/dist/static/assets/{_baseUniq-C22j0Hu6.js.map → _baseUniq-Cam_qUTC.js.map} +1 -1
  15. package/dist/static/assets/{arc-THa7P_CQ.js → arc-Cp03tble.js} +2 -2
  16. package/dist/static/assets/{arc-THa7P_CQ.js.map → arc-Cp03tble.js.map} +1 -1
  17. package/dist/static/assets/{architectureDiagram-VXUJARFQ-B255PlmG.js → architectureDiagram-VXUJARFQ-CqzFAYuR.js} +7 -7
  18. package/dist/static/assets/{architectureDiagram-VXUJARFQ-B255PlmG.js.map → architectureDiagram-VXUJARFQ-CqzFAYuR.js.map} +1 -1
  19. package/dist/static/assets/{blockDiagram-VD42YOAC-CA-y1RON.js → blockDiagram-VD42YOAC-BJzUefd3.js} +7 -7
  20. package/dist/static/assets/{blockDiagram-VD42YOAC-CA-y1RON.js.map → blockDiagram-VD42YOAC-BJzUefd3.js.map} +1 -1
  21. package/dist/static/assets/{c4Diagram-YG6GDRKO-BgCQQIBi.js → c4Diagram-YG6GDRKO-DVeJDi8g.js} +3 -3
  22. package/dist/static/assets/{c4Diagram-YG6GDRKO-BgCQQIBi.js.map → c4Diagram-YG6GDRKO-DVeJDi8g.js.map} +1 -1
  23. package/dist/static/assets/{channel-2_zRJ_1r.js → channel-BP8WCdPp.js} +2 -2
  24. package/dist/static/assets/{channel-2_zRJ_1r.js.map → channel-BP8WCdPp.js.map} +1 -1
  25. package/dist/static/assets/{chunk-4BX2VUAB-DYUdPijE.js → chunk-4BX2VUAB-6gGHbPPy.js} +2 -2
  26. package/dist/static/assets/{chunk-4BX2VUAB-DYUdPijE.js.map → chunk-4BX2VUAB-6gGHbPPy.js.map} +1 -1
  27. package/dist/static/assets/{chunk-55IACEB6-CC0Uw3Fc.js → chunk-55IACEB6-DavH-eLA.js} +2 -2
  28. package/dist/static/assets/{chunk-55IACEB6-CC0Uw3Fc.js.map → chunk-55IACEB6-DavH-eLA.js.map} +1 -1
  29. package/dist/static/assets/{chunk-B4BG7PRW-NMnANHPi.js → chunk-B4BG7PRW-BIEHGik-.js} +5 -5
  30. package/dist/static/assets/{chunk-B4BG7PRW-NMnANHPi.js.map → chunk-B4BG7PRW-BIEHGik-.js.map} +1 -1
  31. package/dist/static/assets/{chunk-DI55MBZ5-l-bZZU50.js → chunk-DI55MBZ5-Clu1GQTF.js} +4 -4
  32. package/dist/static/assets/{chunk-DI55MBZ5-l-bZZU50.js.map → chunk-DI55MBZ5-Clu1GQTF.js.map} +1 -1
  33. package/dist/static/assets/{chunk-FMBD7UC4-Czi371-x.js → chunk-FMBD7UC4-BrQ6SHlP.js} +2 -2
  34. package/dist/static/assets/{chunk-FMBD7UC4-Czi371-x.js.map → chunk-FMBD7UC4-BrQ6SHlP.js.map} +1 -1
  35. package/dist/static/assets/{chunk-QN33PNHL-B7b7Tdpo.js → chunk-QN33PNHL-BTHZ40VN.js} +2 -2
  36. package/dist/static/assets/{chunk-QN33PNHL-B7b7Tdpo.js.map → chunk-QN33PNHL-BTHZ40VN.js.map} +1 -1
  37. package/dist/static/assets/{chunk-QZHKN3VN-Bux8WX8T.js → chunk-QZHKN3VN-hag0dT3B.js} +2 -2
  38. package/dist/static/assets/{chunk-QZHKN3VN-Bux8WX8T.js.map → chunk-QZHKN3VN-hag0dT3B.js.map} +1 -1
  39. package/dist/static/assets/{chunk-TZMSLE5B-Da1P65RK.js → chunk-TZMSLE5B-D0AYZy0F.js} +2 -2
  40. package/dist/static/assets/{chunk-TZMSLE5B-Da1P65RK.js.map → chunk-TZMSLE5B-D0AYZy0F.js.map} +1 -1
  41. package/dist/static/assets/{classDiagram-2ON5EDUG-DB_U2rp6.js → classDiagram-2ON5EDUG-TV5Ns2XR.js} +6 -6
  42. package/dist/static/assets/{classDiagram-2ON5EDUG-DB_U2rp6.js.map → classDiagram-2ON5EDUG-TV5Ns2XR.js.map} +1 -1
  43. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DB_U2rp6.js → classDiagram-v2-WZHVMYZB-TV5Ns2XR.js} +6 -6
  44. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-DB_U2rp6.js.map → classDiagram-v2-WZHVMYZB-TV5Ns2XR.js.map} +1 -1
  45. package/dist/static/assets/{clone-DdPxcQQp.js → clone-C27DK4mX.js} +2 -2
  46. package/dist/static/assets/{clone-DdPxcQQp.js.map → clone-C27DK4mX.js.map} +1 -1
  47. package/dist/static/assets/{cose-bilkent-S5V4N54A-CMH0eqGL.js → cose-bilkent-S5V4N54A-D1WKk9KM.js} +2 -2
  48. package/dist/static/assets/{cose-bilkent-S5V4N54A-CMH0eqGL.js.map → cose-bilkent-S5V4N54A-D1WKk9KM.js.map} +1 -1
  49. package/dist/static/assets/{dagre-6UL2VRFP-CfVnyuff.js → dagre-6UL2VRFP-BHV9AbhM.js} +7 -7
  50. package/dist/static/assets/{dagre-6UL2VRFP-CfVnyuff.js.map → dagre-6UL2VRFP-BHV9AbhM.js.map} +1 -1
  51. package/dist/static/assets/{diagram-PSM6KHXK-CjlYpDPZ.js → diagram-PSM6KHXK-Bc-sx7s7.js} +8 -8
  52. package/dist/static/assets/{diagram-PSM6KHXK-CjlYpDPZ.js.map → diagram-PSM6KHXK-Bc-sx7s7.js.map} +1 -1
  53. package/dist/static/assets/{diagram-QEK2KX5R-C5i6LKF8.js → diagram-QEK2KX5R-DEMTGbLs.js} +7 -7
  54. package/dist/static/assets/{diagram-QEK2KX5R-C5i6LKF8.js.map → diagram-QEK2KX5R-DEMTGbLs.js.map} +1 -1
  55. package/dist/static/assets/{diagram-S2PKOQOG-aSKKxvOh.js → diagram-S2PKOQOG-Z0e4bRPr.js} +7 -7
  56. package/dist/static/assets/{diagram-S2PKOQOG-aSKKxvOh.js.map → diagram-S2PKOQOG-Z0e4bRPr.js.map} +1 -1
  57. package/dist/static/assets/{erDiagram-Q2GNP2WA-CUjiyvMh.js → erDiagram-Q2GNP2WA-CVrz2zW-.js} +5 -5
  58. package/dist/static/assets/{erDiagram-Q2GNP2WA-CUjiyvMh.js.map → erDiagram-Q2GNP2WA-CVrz2zW-.js.map} +1 -1
  59. package/dist/static/assets/{flowDiagram-NV44I4VS-KIQWqjoI.js → flowDiagram-NV44I4VS-D0G87s2C.js} +6 -6
  60. package/dist/static/assets/{flowDiagram-NV44I4VS-KIQWqjoI.js.map → flowDiagram-NV44I4VS-D0G87s2C.js.map} +1 -1
  61. package/dist/static/assets/{ganttDiagram-JELNMOA3-BUPbaIK1.js → ganttDiagram-JELNMOA3-C6oOkrt2.js} +3 -3
  62. package/dist/static/assets/{ganttDiagram-JELNMOA3-BUPbaIK1.js.map → ganttDiagram-JELNMOA3-C6oOkrt2.js.map} +1 -1
  63. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DADfyXv6.js → gitGraphDiagram-V2S2FVAM-CRky7qmU.js} +8 -8
  64. package/dist/static/assets/{gitGraphDiagram-V2S2FVAM-DADfyXv6.js.map → gitGraphDiagram-V2S2FVAM-CRky7qmU.js.map} +1 -1
  65. package/dist/static/assets/{graph-HLDnoJij.js → graph-BA9_VK_c.js} +3 -3
  66. package/dist/static/assets/{graph-HLDnoJij.js.map → graph-BA9_VK_c.js.map} +1 -1
  67. package/dist/static/assets/{index-BHhN1AS0.js → index-C2LCoXUh.js} +39 -35
  68. package/dist/static/assets/index-C2LCoXUh.js.map +1 -0
  69. package/dist/static/assets/{infoDiagram-HS3SLOUP-DV5fAmxD.js → infoDiagram-HS3SLOUP-h2v1r5U4.js} +6 -6
  70. package/dist/static/assets/{infoDiagram-HS3SLOUP-DV5fAmxD.js.map → infoDiagram-HS3SLOUP-h2v1r5U4.js.map} +1 -1
  71. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CxNVhQK8.js → journeyDiagram-XKPGCS4Q-DsdOz9je.js} +5 -5
  72. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-CxNVhQK8.js.map → journeyDiagram-XKPGCS4Q-DsdOz9je.js.map} +1 -1
  73. package/dist/static/assets/{kanban-definition-3W4ZIXB7-Ddo9NqZm.js → kanban-definition-3W4ZIXB7-BtgqtUWK.js} +3 -3
  74. package/dist/static/assets/{kanban-definition-3W4ZIXB7-Ddo9NqZm.js.map → kanban-definition-3W4ZIXB7-BtgqtUWK.js.map} +1 -1
  75. package/dist/static/assets/{layout-BwhvAAwL.js → layout-CaqskGvk.js} +5 -5
  76. package/dist/static/assets/{layout-BwhvAAwL.js.map → layout-CaqskGvk.js.map} +1 -1
  77. package/dist/static/assets/{linear-Ts0sbFeV.js → linear-GIia-X9J.js} +2 -2
  78. package/dist/static/assets/{linear-Ts0sbFeV.js.map → linear-GIia-X9J.js.map} +1 -1
  79. package/dist/static/assets/{mindmap-definition-VGOIOE7T-C6Fjr_53.js → mindmap-definition-VGOIOE7T-BV8RaD59.js} +4 -4
  80. package/dist/static/assets/{mindmap-definition-VGOIOE7T-C6Fjr_53.js.map → mindmap-definition-VGOIOE7T-BV8RaD59.js.map} +1 -1
  81. package/dist/static/assets/{pieDiagram-ADFJNKIX-bNP_VNuI.js → pieDiagram-ADFJNKIX-CWVKMbU0.js} +8 -8
  82. package/dist/static/assets/{pieDiagram-ADFJNKIX-bNP_VNuI.js.map → pieDiagram-ADFJNKIX-CWVKMbU0.js.map} +1 -1
  83. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-8oe73Msv.js → quadrantDiagram-AYHSOK5B-Bq0kwFa2.js} +3 -3
  84. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-8oe73Msv.js.map → quadrantDiagram-AYHSOK5B-Bq0kwFa2.js.map} +1 -1
  85. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-FifVoWZR.js → requirementDiagram-UZGBJVZJ-BPrfIKvO.js} +4 -4
  86. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-FifVoWZR.js.map → requirementDiagram-UZGBJVZJ-BPrfIKvO.js.map} +1 -1
  87. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CYZbmiul.js → sankeyDiagram-TZEHDZUN-CM2zak8H.js} +2 -2
  88. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-CYZbmiul.js.map → sankeyDiagram-TZEHDZUN-CM2zak8H.js.map} +1 -1
  89. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CbtrBuXL.js → sequenceDiagram-WL72ISMW-De4dbz48.js} +4 -4
  90. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CbtrBuXL.js.map → sequenceDiagram-WL72ISMW-De4dbz48.js.map} +1 -1
  91. package/dist/static/assets/{stateDiagram-FKZM4ZOC-D-U0YJry.js → stateDiagram-FKZM4ZOC-BmpggztQ.js} +9 -9
  92. package/dist/static/assets/{stateDiagram-FKZM4ZOC-D-U0YJry.js.map → stateDiagram-FKZM4ZOC-BmpggztQ.js.map} +1 -1
  93. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BjHWtB6u.js → stateDiagram-v2-4FDKWEC3-bDNB8r1W.js} +5 -5
  94. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-BjHWtB6u.js.map → stateDiagram-v2-4FDKWEC3-bDNB8r1W.js.map} +1 -1
  95. package/dist/static/assets/{timeline-definition-IT6M3QCI-BHGBcy0d.js → timeline-definition-IT6M3QCI-CeYsZOwA.js} +3 -3
  96. package/dist/static/assets/{timeline-definition-IT6M3QCI-BHGBcy0d.js.map → timeline-definition-IT6M3QCI-CeYsZOwA.js.map} +1 -1
  97. package/dist/static/assets/{treemap-GDKQZRPO-BIWTr3M2.js → treemap-GDKQZRPO-_U4bMBrl.js} +5 -5
  98. package/dist/static/assets/{treemap-GDKQZRPO-BIWTr3M2.js.map → treemap-GDKQZRPO-_U4bMBrl.js.map} +1 -1
  99. package/dist/static/assets/{xychartDiagram-PRI3JC2R-Cbfb9kZD.js → xychartDiagram-PRI3JC2R-CC2Utdsb.js} +3 -3
  100. package/dist/static/assets/{xychartDiagram-PRI3JC2R-Cbfb9kZD.js.map → xychartDiagram-PRI3JC2R-CC2Utdsb.js.map} +1 -1
  101. package/dist/static/index.html +1 -1
  102. package/dist/tools/builtins.js +13 -8
  103. package/dist/tools/mem.js +36 -25
  104. package/dist/tools/pending-tellask-reminder.js +14 -12
  105. package/dist/tools/prompts/control/en/scenarios.md +3 -3
  106. package/dist/tools/prompts/control/en/tools.md +1 -1
  107. package/dist/tools/prompts/control/zh/scenarios.md +3 -3
  108. package/dist/tools/prompts/control/zh/tools.md +1 -1
  109. package/dist/tools/prompts/memory/en/principles.md +5 -13
  110. package/dist/tools/prompts/memory/en/tools.md +36 -11
  111. package/dist/tools/prompts/memory/zh/principles.md +8 -18
  112. package/dist/tools/prompts/memory/zh/tools.md +36 -11
  113. package/dist/tools/prompts/personal_memory/en/errors.md +155 -0
  114. package/dist/tools/prompts/personal_memory/en/index.md +57 -0
  115. package/dist/tools/prompts/personal_memory/en/principles.md +94 -0
  116. package/dist/tools/prompts/personal_memory/en/scenarios.md +174 -0
  117. package/dist/tools/prompts/personal_memory/en/tools.md +129 -0
  118. package/dist/tools/prompts/personal_memory/zh/errors.md +155 -0
  119. package/dist/tools/prompts/personal_memory/zh/index.md +53 -0
  120. package/dist/tools/prompts/personal_memory/zh/principles.md +96 -0
  121. package/dist/tools/prompts/personal_memory/zh/scenarios.md +174 -0
  122. package/dist/tools/prompts/personal_memory/zh/tools.md +129 -0
  123. package/dist/tools/prompts/team_memory/en/principles.md +2 -2
  124. package/dist/tools/prompts/team_memory/zh/principles.md +2 -2
  125. package/dist/tools/prompts/team_mgmt/en/tools.md +1 -1
  126. package/dist/tools/prompts/team_mgmt/zh/tools.md +1 -1
  127. package/package.json +1 -1
  128. package/dist/agent-priming.js +0 -2051
  129. package/dist/docs/dominds-agent-priming.md +0 -218
  130. package/dist/docs/dominds-agent-priming.zh.md +0 -196
  131. package/dist/docs/drive-logic-context-refactor-plan.zh.md +0 -338
  132. package/dist/docs/keep-going.md +0 -176
  133. package/dist/docs/keep-going.zh.md +0 -162
  134. package/dist/docs/showing-by-doing.md +0 -208
  135. package/dist/docs/showing-by-doing.zh.md +0 -177
  136. package/dist/docs/team-mgmt-toolset.md +0 -482
  137. package/dist/docs/team-mgmt-toolset.zh.md +0 -426
  138. package/dist/llm/driver.js +0 -4093
  139. package/dist/minds/promptdocs.js +0 -263
  140. package/dist/server/prompts-routes.js +0 -545
  141. package/dist/shared/team-mgmt-manual.js +0 -120
  142. package/dist/shared/types/prompts.js +0 -2
  143. package/dist/shared/types/tellask.js +0 -8
  144. package/dist/showing-by-doing.js +0 -1091
  145. package/dist/snippets/README.en.md +0 -3
  146. package/dist/snippets/README.md +0 -4
  147. package/dist/static/assets/index-BHhN1AS0.js.map +0 -1
  148. package/dist/tellask.js +0 -439
  149. package/dist/tools/context-health.js +0 -177
  150. package/dist/tools/diag.js +0 -583
  151. package/dist/tools/team-mgmt.js +0 -3487
  152. package/dist/utils/task-doc.js +0 -236
@@ -333,10 +333,14 @@ function getAccessDeniedMessage(operation, targetPath, language = 'en') {
333
333
  lines.push('');
334
334
  if (language === 'zh') {
335
335
  lines.push(`- 说明:\`.minds/\` 是 rtws(运行时工作区)的“团队配置/记忆/资产”目录,通用文件工具无法读写(硬编码无条件拒绝)。`);
336
+ lines.push(`- 提示:如果你是在管理“个人记忆”,请不要尝试直接读/写/列目录 \`.minds/memory/**\`(会被拒绝)。请使用个人记忆工具:\`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`。首次创建时直接 \`add_personal_memory\` 即可,目录会自动创建;\`path\` 不应包含你的成员 id。`);
337
+ lines.push(`- 提示:如果你是在管理“团队共享记忆”,请使用团队共享记忆工具:\`add_team_memory\` / \`replace_team_memory\` / \`drop_team_memory\` / \`clear_team_memory\`。`);
336
338
  lines.push(`- 提示:若团队配置了 \`team_mgmt\` 工具集,请使用其中工具(\`team_mgmt_*\`)代管;若未配置或你不具备权限,请诉请具备 \`team_mgmt\` 权限的成员/团队管理员成员代管。`);
337
339
  }
338
340
  else {
339
341
  lines.push(`- Note: \`.minds/\` stores rtws (runtime workspace) team config/memory/assets and is hard-denied for general file tools.`);
342
+ lines.push(`- Hint: If you're trying to manage **personal memory**, do not read/write/list \`.minds/memory/**\` directly (it will be denied). Use personal-memory tools: \`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`. For first-time setup, just call \`add_personal_memory\`—the directory is created automatically; \`path\` must not include your member id.`);
343
+ lines.push(`- Hint: If you're trying to manage **team shared memory**, use: \`add_team_memory\` / \`replace_team_memory\` / \`drop_team_memory\` / \`clear_team_memory\`.`);
340
344
  lines.push(`- Hint: If your team configured the \`team_mgmt\` toolset, use its tools (\`team_mgmt_*\`); otherwise (or if you lack access), tellask a team-admin / a member with \`team_mgmt\` access to manage it for you.`);
341
345
  }
342
346
  }
package/dist/cli/read.js CHANGED
@@ -10,11 +10,44 @@
10
10
  * --no-hints Don't show hints
11
11
  * --only-prompt Show only system prompt
12
12
  * --only-mem Show only memories
13
- * --audit Run built-in prompt audit checks
13
+ * --audit Run prompt audit via hidden teammate @fuxi (skip when default LLM unavailable)
14
14
  * --fail-on-audit-warning Exit non-zero when audit emits warnings
15
15
  * --find <pattern> Find case-insensitive text in rendered output
16
16
  * --help Show help
17
17
  */
18
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
19
+ if (k2 === undefined) k2 = k;
20
+ var desc = Object.getOwnPropertyDescriptor(m, k);
21
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
22
+ desc = { enumerable: true, get: function() { return m[k]; } };
23
+ }
24
+ Object.defineProperty(o, k2, desc);
25
+ }) : (function(o, m, k, k2) {
26
+ if (k2 === undefined) k2 = k;
27
+ o[k2] = m[k];
28
+ }));
29
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
30
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
31
+ }) : function(o, v) {
32
+ o["default"] = v;
33
+ });
34
+ var __importStar = (this && this.__importStar) || (function () {
35
+ var ownKeys = function(o) {
36
+ ownKeys = Object.getOwnPropertyNames || function (o) {
37
+ var ar = [];
38
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
39
+ return ar;
40
+ };
41
+ return ownKeys(o);
42
+ };
43
+ return function (mod) {
44
+ if (mod && mod.__esModule) return mod;
45
+ var result = {};
46
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
47
+ __setModuleDefault(result, mod);
48
+ return result;
49
+ };
50
+ })();
18
51
  Object.defineProperty(exports, "__esModule", { value: true });
19
52
  exports.main = main;
20
53
  const promises_1 = require("fs/promises");
@@ -26,7 +59,7 @@ function printUsage() {
26
59
  console.log('Usage: dominds read [<member-id>] [--no-hints] [--only-prompt|--only-mem] [--audit] [--find <pattern>]');
27
60
  console.log('');
28
61
  console.log('Print agent system prompt and memories with filtering flags.');
29
- console.log('`--audit` also includes static toolset checks (registry vs `.minds/mcp.yaml` declarations).');
62
+ console.log('`--audit` runs prompt audit via hidden teammate @fuxi using default LLM config (skips when unavailable), and also includes static toolset checks (registry vs `.minds/mcp.yaml` declarations).');
30
63
  console.log('When <member-id> is omitted, reads all visible team members.');
31
64
  console.log('');
32
65
  console.log("Note: rtws (runtime workspace) directory is `process.cwd()`. Use 'dominds -C <dir> read' to run in another rtws.");
@@ -40,118 +73,259 @@ function printUsage() {
40
73
  console.log(' dominds read ux --only-prompt --find "pending Tellask"');
41
74
  console.log(' dominds read --only-prompt --audit --fail-on-audit-warning');
42
75
  }
43
- function normalizeForDuplicateScan(line) {
44
- return line
45
- .trim()
46
- .replace(/^[-*]\s+/, '')
47
- .replace(/[`*_]/g, '')
48
- .replace(/\s+/g, ' ')
49
- .toLowerCase();
76
+ function isRecord(value) {
77
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
50
78
  }
51
- function buildPromptAudit(systemPrompt) {
52
- const checks = [
53
- {
54
- id: 'collaboration_protocol',
55
- label: 'Has collaboration protocol section',
56
- pass: /## (Collaboration Protocol|协作协议)/.test(systemPrompt),
57
- },
58
- {
59
- id: 'response_closes_round',
60
- label: 'Has "response closes call round" rule',
61
- pass: /response closes that call round/.test(systemPrompt) ||
62
- /收到回贴即表示该轮调用已结束/.test(systemPrompt),
63
- },
64
- {
65
- id: 'pending_wait_guard',
66
- label: 'Has pending tellask wait guard',
67
- pass: /pending Tellask|pending tellask/.test(systemPrompt) ||
68
- /存在明确 pending tellask/.test(systemPrompt),
69
- },
70
- {
71
- id: 'relay_ban',
72
- label: 'Has no-human-relay rule',
73
- pass: /relay for executable teammate work/.test(systemPrompt) || /转发员/.test(systemPrompt),
74
- },
75
- {
76
- id: 'tellask_function_boundary',
77
- label: 'Has tellask vs function-calling boundary',
78
- pass: /native function-calling/.test(systemPrompt) &&
79
- (/is only for tellasking teammates\/freshBootsReasoning\/askHuman/.test(systemPrompt) ||
80
- /仅用于诉请队友\/freshBootsReasoning\/askHuman/.test(systemPrompt)),
81
- },
82
- {
83
- id: 'fbr_phase_contract',
84
- label: 'Has FBR phase contract',
85
- pass: /FBR phase contract|FBR 阶段协议/.test(systemPrompt),
79
+ function truncateForAuditInput(text, maxChars) {
80
+ if (text.length <= maxChars)
81
+ return { text, truncated: false };
82
+ return { text: text.slice(0, maxChars), truncated: true };
83
+ }
84
+ async function runFuxiAuditCall(runtime, userContent) {
85
+ let output = '';
86
+ let sawFuncCall = false;
87
+ const receiver = {
88
+ thinkingStart: async () => { },
89
+ thinkingChunk: async () => { },
90
+ thinkingFinish: async () => { },
91
+ sayingStart: async () => { },
92
+ sayingChunk: async (chunk) => {
93
+ output += chunk;
86
94
  },
87
- {
88
- id: 'taskdoc_encapsulation',
89
- label: 'Has Taskdoc encapsulation section',
90
- pass: /Taskdoc encapsulation & access restrictions/.test(systemPrompt) ||
91
- /差遣牒.*封装/.test(systemPrompt),
95
+ sayingFinish: async () => { },
96
+ funcCall: async () => {
97
+ sawFuncCall = true;
92
98
  },
93
- ];
94
- const hasDomindsRuntime = /Dominds runtime|genuine Codex CLI/.test(systemPrompt);
95
- const hasCodexHostIdentity = /You are GPT-5\.2 running in the Codex CLI/.test(systemPrompt) ||
96
- /^You are Codex CLI\.$/m.test(systemPrompt);
97
- const toolSectionMarkers = ['\n## Intrinsic Tools\n', '\n## 内置工具\n'];
98
- let duplicateScope = systemPrompt;
99
- for (const marker of toolSectionMarkers) {
100
- const idx = duplicateScope.indexOf(marker);
101
- if (idx >= 0) {
102
- duplicateScope = duplicateScope.slice(0, idx);
103
- break;
99
+ };
100
+ const context = [{ type: 'environment_msg', role: 'user', content: userContent }];
101
+ await runtime.llmGen.genToReceiver(runtime.providerCfg, runtime.auditAgent, runtime.auditorSystemPrompt, [], context, receiver, 0);
102
+ const trimmed = output.trim();
103
+ if (trimmed.length > 0)
104
+ return trimmed;
105
+ if (sawFuncCall)
106
+ return '{"verdict":"WARN","warnings":["LLM emitted tool call during prompt audit"],"rewrite":""}';
107
+ return '';
108
+ }
109
+ function parseFuxiAuditJson(raw) {
110
+ const start = raw.indexOf('{');
111
+ const end = raw.lastIndexOf('}');
112
+ if (start < 0 || end < start)
113
+ return null;
114
+ const candidate = raw.slice(start, end + 1);
115
+ let parsed;
116
+ try {
117
+ parsed = JSON.parse(candidate);
118
+ }
119
+ catch {
120
+ return null;
121
+ }
122
+ if (!isRecord(parsed))
123
+ return null;
124
+ const verdictRaw = parsed['verdict'];
125
+ if (verdictRaw !== 'PASS' && verdictRaw !== 'WARN')
126
+ return null;
127
+ const warningsRaw = parsed['warnings'];
128
+ if (!Array.isArray(warningsRaw))
129
+ return null;
130
+ const warnings = [];
131
+ for (const item of warningsRaw) {
132
+ if (typeof item !== 'string')
133
+ return null;
134
+ const trimmed = item.trim();
135
+ if (trimmed.length === 0)
136
+ continue;
137
+ warnings.push(trimmed);
138
+ }
139
+ const rewriteRaw = parsed['rewrite'];
140
+ const rewriteSuggestion = typeof rewriteRaw === 'string' && rewriteRaw.trim().length > 0 ? rewriteRaw.trim() : undefined;
141
+ return { verdict: verdictRaw, warnings, rewriteSuggestion };
142
+ }
143
+ async function preparePromptAuditRuntime(team) {
144
+ const fuxi = team.getMember('fuxi');
145
+ if (!fuxi) {
146
+ return { kind: 'skip', reason: 'Hidden teammate @fuxi is not available in current team.' };
147
+ }
148
+ const providerKey = fuxi.provider ?? team.memberDefaults.provider;
149
+ const modelKey = fuxi.model ?? team.memberDefaults.model;
150
+ if (!providerKey || !modelKey) {
151
+ return {
152
+ kind: 'skip',
153
+ reason: 'Default LLM provider/model is not configured for @fuxi (resolved from member + member_defaults).',
154
+ };
155
+ }
156
+ let providerCfg;
157
+ try {
158
+ const { LlmConfig } = await Promise.resolve().then(() => __importStar(require('../llm/client')));
159
+ const llmCfg = await LlmConfig.load();
160
+ const resolved = llmCfg.getProvider(providerKey);
161
+ if (!resolved) {
162
+ return {
163
+ kind: 'skip',
164
+ reason: `Provider '${providerKey}' is missing in effective LLM config.`,
165
+ };
104
166
  }
167
+ if (!resolved.models || !Object.prototype.hasOwnProperty.call(resolved.models, modelKey)) {
168
+ return {
169
+ kind: 'skip',
170
+ reason: `Model '${modelKey}' is not configured under provider '${providerKey}'.`,
171
+ };
172
+ }
173
+ providerCfg = resolved;
105
174
  }
106
- const lineCounts = new Map();
107
- const representative = new Map();
108
- for (const rawLine of duplicateScope.split('\n')) {
109
- const line = rawLine.trim();
110
- if (line === '' || line.startsWith('#'))
111
- continue;
112
- const normalized = normalizeForDuplicateScan(line);
113
- if (normalized.length < 24)
114
- continue;
115
- lineCounts.set(normalized, (lineCounts.get(normalized) ?? 0) + 1);
116
- if (!representative.has(normalized))
117
- representative.set(normalized, line);
118
- }
119
- const duplicates = Array.from(lineCounts.entries())
120
- .filter(([, count]) => count > 1)
121
- .sort((a, b) => b[1] - a[1])
122
- .slice(0, 12)
123
- .map(([normalized, count]) => ({
124
- line: representative.get(normalized) ?? normalized,
125
- count,
126
- }));
127
- const warnings = [];
128
- for (const check of checks) {
129
- if (!check.pass)
130
- warnings.push(`Missing: ${check.label}`);
175
+ catch (err) {
176
+ return {
177
+ kind: 'skip',
178
+ reason: `Failed to load effective LLM config: ${err instanceof Error ? err.message : String(err)}`,
179
+ };
180
+ }
181
+ if (providerCfg.apiType !== 'codex') {
182
+ const envVar = providerCfg.apiKeyEnvVar;
183
+ const envValue = process.env[envVar];
184
+ const envConfigured = typeof envValue === 'string' && envValue.trim().length > 0;
185
+ if (!envConfigured) {
186
+ return {
187
+ kind: 'skip',
188
+ reason: `Provider env var '${envVar}' is not configured (required for non-codex providers).`,
189
+ };
190
+ }
191
+ }
192
+ const { getLlmGenerator } = await Promise.resolve().then(() => __importStar(require('../llm/gen/registry')));
193
+ const llmGen = getLlmGenerator(providerCfg.apiType);
194
+ if (!llmGen) {
195
+ return {
196
+ kind: 'skip',
197
+ reason: `LLM generator not found for apiType='${providerCfg.apiType}'.`,
198
+ };
131
199
  }
132
- if (hasDomindsRuntime && hasCodexHostIdentity) {
133
- warnings.push('Potential host identity conflict: both Dominds runtime and Codex host identity text found.');
200
+ let auditorSystemPrompt;
201
+ try {
202
+ const minds = await (0, load_1.loadAgentMinds)('fuxi', undefined, { missingToolsetPolicy: 'silent' });
203
+ auditorSystemPrompt = minds.systemPrompt;
134
204
  }
135
- if (duplicates.length > 0) {
136
- warnings.push(`Detected ${duplicates.length} repeated prompt lines (top duplicates shown).`);
205
+ catch (err) {
206
+ return {
207
+ kind: 'skip',
208
+ reason: `Failed to load @fuxi minds: ${err instanceof Error ? err.message : String(err)}`,
209
+ };
210
+ }
211
+ const auditAgent = new team_1.Team.Member({
212
+ id: fuxi.id,
213
+ name: fuxi.name,
214
+ provider: providerKey,
215
+ model: modelKey,
216
+ model_params: fuxi.model_params,
217
+ streaming: fuxi.streaming,
218
+ hidden: true,
219
+ internal_allow_minds: true,
220
+ });
221
+ try {
222
+ const probe = await runFuxiAuditCall({
223
+ kind: 'ready',
224
+ auditorId: 'fuxi',
225
+ providerKey,
226
+ modelKey,
227
+ providerCfg,
228
+ llmGen,
229
+ auditAgent,
230
+ auditorSystemPrompt,
231
+ }, 'Connectivity check for prompt audit. Reply with a short JSON: {"verdict":"PASS","warnings":[],"rewrite":""}');
232
+ if (probe.trim().length === 0) {
233
+ return { kind: 'skip', reason: 'Connectivity probe returned empty response.' };
234
+ }
235
+ }
236
+ catch (err) {
237
+ return {
238
+ kind: 'skip',
239
+ reason: `Connectivity probe failed: ${err instanceof Error ? err.message : String(err)}`,
240
+ };
241
+ }
242
+ return {
243
+ kind: 'ready',
244
+ auditorId: 'fuxi',
245
+ providerKey,
246
+ modelKey,
247
+ providerCfg,
248
+ llmGen,
249
+ auditAgent,
250
+ auditorSystemPrompt,
251
+ };
252
+ }
253
+ async function buildPromptAudit(targetMemberId, systemPrompt, runtime) {
254
+ if (runtime.kind === 'skip') {
255
+ return {
256
+ mode: 'skipped',
257
+ targetMemberId,
258
+ auditorId: 'fuxi',
259
+ warnings: [],
260
+ skipReason: runtime.reason,
261
+ };
262
+ }
263
+ const clipped = truncateForAuditInput(systemPrompt, 28000);
264
+ const userPrompt = [
265
+ '你是隐藏队友 @fuxi。请审计下面候选系统提示词,只关注会导致真实执行偏差/协作风险的问题,忽略纯措辞润色。',
266
+ '只输出 JSON,不要 markdown,不要额外解释。',
267
+ 'JSON schema: {"verdict":"PASS|WARN","warnings":["..."],"rewrite":"..."}',
268
+ '- 若没有实质问题:verdict=PASS 且 warnings=[]。',
269
+ '- 若有问题:verdict=WARN,warnings 只列实质问题(最多 5 条)。',
270
+ '- rewrite 提供一段可直接替换的合并改写建议(最多 8 行)。',
271
+ `target_member_id: ${targetMemberId}`,
272
+ `prompt_truncated: ${clipped.truncated ? 'true' : 'false'}`,
273
+ 'candidate_system_prompt:',
274
+ clipped.text,
275
+ ].join('\n\n');
276
+ let raw = '';
277
+ try {
278
+ raw = await runFuxiAuditCall(runtime, userPrompt);
137
279
  }
138
- return { checks, duplicates, warnings };
280
+ catch (err) {
281
+ return {
282
+ mode: 'skipped',
283
+ targetMemberId,
284
+ auditorId: 'fuxi',
285
+ warnings: [],
286
+ skipReason: `@fuxi audit call failed: ${err instanceof Error ? err.message : String(err)}`,
287
+ };
288
+ }
289
+ const parsed = parseFuxiAuditJson(raw);
290
+ if (!parsed) {
291
+ return {
292
+ mode: 'fuxi_llm',
293
+ targetMemberId,
294
+ auditorId: 'fuxi',
295
+ providerKey: runtime.providerKey,
296
+ modelKey: runtime.modelKey,
297
+ verdict: 'WARN',
298
+ warnings: ['@fuxi audit output is not valid JSON as requested'],
299
+ rewriteSuggestion: raw.trim().length > 0 ? raw.trim() : undefined,
300
+ };
301
+ }
302
+ const warnings = parsed.warnings;
303
+ const verdict = warnings.length === 0 ? 'PASS' : parsed.verdict;
304
+ return {
305
+ mode: 'fuxi_llm',
306
+ targetMemberId,
307
+ auditorId: 'fuxi',
308
+ providerKey: runtime.providerKey,
309
+ modelKey: runtime.modelKey,
310
+ verdict,
311
+ warnings,
312
+ rewriteSuggestion: parsed.rewriteSuggestion,
313
+ };
139
314
  }
140
315
  function printPromptAudit(report) {
141
316
  process.stdout.write('\n## Prompt Audit\n');
142
- for (const check of report.checks) {
143
- const tag = check.pass ? 'OK' : 'MISS';
144
- process.stdout.write(`- [${tag}] ${check.label}\n`);
145
- }
146
- if (report.duplicates.length > 0) {
147
- process.stdout.write('- Duplicate Lines (top):\n');
148
- for (const d of report.duplicates) {
149
- process.stdout.write(` - x${d.count}: ${d.line}\n`);
150
- }
317
+ process.stdout.write(`- Target: @${report.targetMemberId}\n`);
318
+ if (report.mode === 'skipped') {
319
+ process.stdout.write('- Mode: skipped (@fuxi audit disabled due to unavailable default LLM)\n');
320
+ process.stdout.write(`- Reason: ${report.skipReason ?? 'unknown'}\n`);
321
+ process.stdout.write('- Warnings: none (audit step skipped)\n');
322
+ return;
151
323
  }
152
- else {
153
- process.stdout.write('- Duplicate Lines: none\n');
324
+ process.stdout.write('- Mode: @fuxi (LLM)\n');
325
+ if (report.providerKey && report.modelKey) {
326
+ process.stdout.write(`- Runtime: provider='${report.providerKey}', model='${report.modelKey}'\n`);
154
327
  }
328
+ process.stdout.write(`- Verdict: ${report.verdict ?? 'WARN'}\n`);
155
329
  if (report.warnings.length > 0) {
156
330
  process.stdout.write('- Warnings:\n');
157
331
  for (const warning of report.warnings) {
@@ -161,6 +335,10 @@ function printPromptAudit(report) {
161
335
  else {
162
336
  process.stdout.write('- Warnings: none\n');
163
337
  }
338
+ if (report.rewriteSuggestion && report.rewriteSuggestion.trim().length > 0) {
339
+ process.stdout.write('- Suggested Rewrite:\n');
340
+ process.stdout.write(`${report.rewriteSuggestion.trim()}\n`);
341
+ }
164
342
  }
165
343
  function listExplicitToolsets(member) {
166
344
  if (!member.toolsets)
@@ -401,6 +579,7 @@ async function main() {
401
579
  const team = await team_1.Team.load();
402
580
  const targetMemberIds = resolveTargetMemberIds(team, parsed.memberId);
403
581
  const isMultiMemberRun = targetMemberIds.length > 1;
582
+ const promptAuditRuntime = parsed.audit ? await preparePromptAuditRuntime(team) : undefined;
404
583
  const toolsetAudit = parsed.audit
405
584
  ? buildToolsetAuditReport({
406
585
  team,
@@ -433,7 +612,10 @@ async function main() {
433
612
  }
434
613
  }
435
614
  if (parsed.audit) {
436
- const report = buildPromptAudit(systemPrompt);
615
+ const report = await buildPromptAudit(agent.id, systemPrompt, promptAuditRuntime ?? {
616
+ kind: 'skip',
617
+ reason: 'Prompt audit runtime was not initialized.',
618
+ });
437
619
  printPromptAudit(report);
438
620
  auditWarningCount += report.warnings.length;
439
621
  }
@@ -32,7 +32,7 @@ The same information can be categorized by “who needs to see it / who maintain
32
32
 
33
33
  - **Individual-scope (per-agent / per-dialog)**:
34
34
  - `persona` / `knowledge` / `lessons` (role definitions assigned per member)
35
- - individual memory (`memory`)
35
+ - individual memory (`personal_memory`)
36
36
  - dialog history (including tool calls and outputs)
37
37
  - reminders (working set / worklog)
38
38
  - **Collective-scope (shared by team/task)**:
@@ -102,11 +102,17 @@ Individual memory is your long-lived “how I work” asset, especially a compac
102
102
  - exact paths of key docs/code you own
103
103
  - minimal key facts (entrypoints, key symbols, local contracts)
104
104
 
105
- This lets you start work within your scope with “0 ripgrep”. The hard constraint is accuracy: if you change related files or detect staleness/conflicts, immediately `replace_memory` to keep it true.
105
+ This lets you start work within your scope with “0 ripgrep”. The hard constraint is accuracy: if you change related files or detect staleness/conflicts, immediately `replace_personal_memory` to keep it true.
106
106
 
107
107
  Tools:
108
108
 
109
- - `add_memory` / `replace_memory` / `drop_memory` / `clear_memory`
109
+ - `add_personal_memory` / `replace_personal_memory` / `drop_personal_memory` / `clear_personal_memory`
110
+
111
+ Key notes:
112
+
113
+ - Do not read/write/list `.minds/memory/**` via general file tools (it will be hard-denied). Manage personal memory via the tools above.
114
+ - Personal memory is automatically isolated on disk under `.minds/memory/individual/<member-id>/...`, so your `path` must NOT include your member id (do not write `<member-id>/...`).
115
+ - If you have zero personal memory entries, just call `add_personal_memory` — the directory will be created automatically.
110
116
 
111
117
  ### B) Task-term memory: Taskdoc is the single source of truth
112
118
 
@@ -202,7 +208,7 @@ The goal for agents’ day-to-day work is not “write more docs”. It’s a lo
202
208
  - **Taskdoc `constraints`**: hard rules/safety/compliance/style (must be visible to all mainlines)
203
209
  - **Team memory `team_memory`**: stable team conventions and invariants (worth reusing)
204
210
  - **Env notes `.minds/env*.md`**: rtws baseline facts, runtime constraints, gotchas (align humans + all agents to the same environment)
205
- - **Individual memory `memory`**: personal preferences + responsibility-area rtws index (keep accurate)
211
+ - **Individual memory `personal_memory`**: personal preferences + responsibility-area rtws index (keep accurate)
206
212
  - **Reminders**: short-term, high-frequency details (working set / worklog; delete freely)
207
213
  - **Dialog history / tool output**: disposable by default; only keep distilled excerpts, not raw dumps
208
214
 
@@ -32,7 +32,7 @@ TL;DR:
32
32
 
33
33
  - **个体记忆(个人/对话局部)**:
34
34
  - `persona` / `knowledge` / `lessons`(按成员分配的角色定义)
35
- - 个人记忆(`memory`)
35
+ - 个人记忆(`personal_memory`)
36
36
  - 对话历史(含工具调用与反馈)
37
37
  - 提醒项(工作集/工作日志)
38
38
  - **集体记忆(团队/任务共享)**:
@@ -101,11 +101,17 @@ TL;DR:
101
101
  - 你负责的关键文档/代码的**精确路径**
102
102
  - 对应的最小关键事实(入口点、关键符号、局部契约)
103
103
 
104
- 这样你在职责范围内可以尽量做到“0 次 ripgrep 就能开工”。同时有一个硬约束:**必须保持准确**——一旦你改了相关文件或发现记忆过期/冲突,立刻用 `replace_memory` 更新。
104
+ 这样你在职责范围内可以尽量做到“0 次 ripgrep 就能开工”。同时有一个硬约束:**必须保持准确**——一旦你改了相关文件或发现记忆过期/冲突,立刻用 `replace_personal_memory` 更新。
105
105
 
106
106
  工具:
107
107
 
108
- - `add_memory` / `replace_memory` / `drop_memory` / `clear_memory`
108
+ - `add_personal_memory` / `replace_personal_memory` / `drop_personal_memory` / `clear_personal_memory`
109
+
110
+ 关键提示:
111
+
112
+ - 不要用通用文件工具去读/写/列目录 `.minds/memory/**`(会被硬拒绝);个人记忆应通过上述个人记忆工具管理。
113
+ - 个人记忆会自动隔离到 `.minds/memory/individual/<member-id>/...`,因此 `path` 不应包含你的成员 id(不要写 `<member-id>/...`)。
114
+ - 若你当前没有任何个人记忆条目,直接 `add_personal_memory` 即可:目录会由系统自动创建。
109
115
 
110
116
  ### B) 中期(任务)记忆:差遣牒(Taskdoc)是单一真源
111
117
 
@@ -201,7 +207,7 @@ TL;DR:
201
207
  - **差遣牒 `constraints`**:硬规则/安全/合规/风格(必须被所有主线及时看到)
202
208
  - **团队记忆 `team_memory`**:稳定的团队约定与不变量(值得长期复用)
203
209
  - **环境提示 `.minds/env*.md`**:rtws 的基本事实、运行约束、注意事项(让人类与所有智能体对齐同一环境)
204
- - **个人记忆 `memory`**:个人偏好 + 职责域 rtws 索引(保持准确)
210
+ - **个人记忆 `personal_memory`**:个人偏好 + 职责域 rtws 索引(保持准确)
205
211
  - **提醒项**:短期高频细节(工作集/工作日志,随时可删)
206
212
  - **对话历史/工具输出**:默认可丢弃;需要留的只留“精炼摘录”,不要长期背着原始转储
207
213
 
@@ -129,7 +129,7 @@ Notes:
129
129
  - Prefer an explicit allowlist over “anything in the rtws”.
130
130
  - For `team_mgmt`, that explicit allowlist is `.minds/**` (including `.minds/memory/**`) so the
131
131
  team manager can repair accidental corruptions made by other tools (even though `.minds/memory/**`
132
- already has dedicated `memory` / `team_memory` tools for normal use).
132
+ already has dedicated `personal_memory` / `team_memory` tools for normal use).
133
133
  - Require explicit `.minds/...` paths and validate them; do not support “implicitly scoped” paths
134
134
  like `team.yaml`.
135
135
 
@@ -429,7 +429,7 @@ member_defaults:
429
429
  model: gpt-5.2
430
430
  toolsets:
431
431
  - ws_read
432
- - memory
432
+ - personal_memory
433
433
  # Default posture: deny `.minds/` edits for normal members.
434
434
  # (Team management should be done via `team_mgmt` tools, not general file tools.)
435
435
  no_read_dirs:
@@ -106,7 +106,7 @@
106
106
  - 拒绝包含 `..` 的路径
107
107
  - 拒绝规范化后解析到 `.minds/` 之外的任何路径
108
108
  - 优先使用显式白名单而非" rtws 中的任何内容"
109
- - 对于 `team_mgmt`,该显式白名单是 `.minds/**`(包括 `.minds/memory/**`),以便团队管理者可以修复其他工具造成的意外损坏(即使 `.minds/memory/**` 已有专用的 `memory` / `team_memory` 工具供正常使用)
109
+ - 对于 `team_mgmt`,该显式白名单是 `.minds/**`(包括 `.minds/memory/**`),以便团队管理者可以修复其他工具造成的意外损坏(即使 `.minds/memory/**` 已有专用的 `personal_memory` / `team_memory` 工具供正常使用)
110
110
  - 需要显式的 `.minds/...` 路径并验证它们;不支持像 `team.yaml` 这样的"隐式作用域"路径
111
111
 
112
112
  ### 为什么需要专用工具集(而不是仅 `read_dirs` / `write_dirs`)?
@@ -373,7 +373,7 @@ member_defaults:
373
373
  model: gpt-5.2
374
374
  toolsets:
375
375
  - ws_read
376
- - memory
376
+ - personal_memory
377
377
  # 默认姿态:拒绝普通成员的 `.minds/` 编辑
378
378
  #(团队管理应通过 `team_mgmt` 工具完成,而非通用文件工具)
379
379
  no_read_dirs:
@@ -196,10 +196,10 @@ async function loadAgentMinds(agentId, dialog, options) {
196
196
  'clear_team_memory',
197
197
  ];
198
198
  const PERSONAL_MEMORY_TOOL_NAMES = [
199
- 'add_memory',
200
- 'replace_memory',
201
- 'drop_memory',
202
- 'clear_memory',
199
+ 'add_personal_memory',
200
+ 'replace_personal_memory',
201
+ 'drop_personal_memory',
202
+ 'clear_personal_memory',
203
203
  ];
204
204
  function isTeamMemoryToolName(name) {
205
205
  return TEAM_MEMORY_TOOL_NAMES.includes(name);
@@ -346,8 +346,8 @@ async function loadAgentMinds(agentId, dialog, options) {
346
346
  'drop_team_memory',
347
347
  ]);
348
348
  await readMemFiles(personalFiles, 'personal', personalScopeLabelText, [
349
- 'replace_memory',
350
- 'drop_memory',
349
+ 'replace_personal_memory',
350
+ 'drop_personal_memory',
351
351
  ]);
352
352
  }
353
353
  catch (err) {
@@ -149,8 +149,9 @@ function getMemoryPromptCopy(ctx) {
149
149
  personalMemoryLine: '- 个人记忆:稳定的个人习惯/偏好与职责域知识;记忆会在每次生成时自动注入上下文,应保持少量且准确(关键文档/代码的精确路径 + 最小必要事实)。不要记录具体任务状态。',
150
150
  subdialogDutyLine: `你当前处于支线对话:此处不允许 \`change_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出你已合并好的“新全文/替换稿”(用于替换对应章节全文)。不要声称已更新,除非看到回执。`,
151
151
  mainlineDutyLine: '你当前处于主线对话:你负责综合维护全队共享差遣牒(尤其是 progress 公告牌)。当队友/支线对话提出更新建议时,及时合并、压缩并保持清晰。',
152
+ teammateTellaskRoundDoneLine: '队友诉请重要语义:当你在上游上下文中收到带【最终完成】标记的回贴,表示该轮诉请已经结束;对方不会继续执行同一轮诉请。此时如果目标未达成,“等待”是错误的:必须显式发起新一轮 tellask 才能继续推进。',
152
153
  teamMemoryHintLine: '提示:你具备团队记忆工具(`add_team_memory` / `replace_team_memory` / `drop_team_memory` / `clear_team_memory`),可在必要时维护团队记忆(谨慎、少量、只写稳定约定)。',
153
- personalMemoryHintLine: '提示:你具备个人记忆工具(`add_memory` / `replace_memory` / `drop_memory` / `clear_memory`)。记忆会在每次生成时自动注入上下文:保持少量、保持准确、按“未来会一起更新的内容”合并;写稳定事实(关键路径 + 最小必要约定),不要写任务进度/当天状态;一旦你修改了相关文件或发现记忆过期/冲突,立刻用 `replace_memory` 更新。',
154
+ personalMemoryHintLine: `提示:你具备个人记忆工具(\`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`)。个人记忆仅对当前智能体可见,且系统会自动按成员隔离到 \`.minds/memory/individual/<member-id>/...\`;因此 \`path\` 不应包含你的成员 id(不要写 \`${ctx.agentId}/...\`)。首次创建时直接用 \`add_personal_memory\` 即可,目录会由系统自动创建。记忆会在每次生成时自动注入上下文:保持少量、保持准确、按“未来会一起更新的内容”合并;写稳定事实(关键路径 + 最小必要约定),不要写任务进度/当天状态;一旦你修改了相关文件或发现记忆过期/冲突,立刻用 \`replace_personal_memory\` 更新。`,
154
155
  subdialogWorkflowLine: `工作流:先做事 → 再提炼(\`update_reminder\`;必要时整理差遣牒更新提案并诉请 \`@${ctx.taskdocMaintainerId}\` 合并写入)→ 然后 \`clear_mind\` 清空噪音。`,
155
156
  mainlineWorkflowLine: '工作流:先做事 → 再提炼(`update_reminder` + `change_mind(progress)`)→ 然后 `clear_mind` 清空噪音。',
156
157
  contextHealthLine: '系统会自动监控并提示上下文健康度:进入"吃紧"或"告急"状态时会插入用户可见提示。当收到此类提示时,立刻停止继续大实现/大阅读;先提炼,再 clear。',
@@ -171,8 +172,9 @@ function getMemoryPromptCopy(ctx) {
171
172
  personalMemoryLine: '- Personal memory: stable personal habits/preferences and responsibility-scope knowledge. Memory is automatically injected into context on each generation: keep it small and accurate (exact key doc/code paths + minimal key facts); do not store per-task state.',
172
173
  subdialogDutyLine: `You are currently in a subdialog: \`change_mind\` is not allowed here. When Taskdoc should be updated (especially the shared progress bulletin board), tellask the Taskdoc maintainer \`@${ctx.taskdocMaintainerId}\` with a fully merged replacement draft (full-section replacement). Do not claim it is updated until you see a receipt.`,
173
174
  mainlineDutyLine: 'You are currently in the main dialog: you are responsible for keeping the team-shared Taskdoc coherent and up to date (especially the progress bulletin board). Merge proposals from teammates/subdialogs promptly and keep it concise.',
175
+ teammateTellaskRoundDoneLine: 'Teammate Tellask semantics: when you receive an upstream reply with the 【最终完成】 marker, that Tellask round is finished; the responder will not keep executing the same call in the background. If the objective is not met, “waiting” is wrong: you must explicitly start a new Tellask round to continue.',
174
176
  teamMemoryHintLine: 'Hint: you have team-memory tools (`add_team_memory` / `replace_team_memory` / `drop_team_memory` / `clear_team_memory`) and may maintain team memory when it is truly stable and worth sharing.',
175
- personalMemoryHintLine: 'Hint: you have personal-memory tools (`add_memory` / `replace_memory` / `drop_memory` / `clear_memory`). Memory is automatically injected into context on each generation: keep it small, keep it accurate, and group facts that are updated together. Store stable facts (exact key paths + minimal contracts), not daily state/progress. If you changed those files or detect staleness/conflicts, immediately `replace_memory` to keep it accurate.',
177
+ personalMemoryHintLine: `Hint: you have personal-memory tools (\`add_personal_memory\` / \`replace_personal_memory\` / \`drop_personal_memory\` / \`clear_personal_memory\`). Personal memory is private to the current agent and is automatically isolated under \`.minds/memory/individual/<member-id>/...\`; therefore \`path\` MUST NOT include your member id (do not write \`${ctx.agentId}/...\`). For first-time setup, just call \`add_personal_memory\`—the directory will be created automatically. Memory is automatically injected into context on each generation: keep it small, keep it accurate, and group facts that are updated together. Store stable facts (exact key paths + minimal contracts), not daily state/progress. If you changed those files or detect staleness/conflicts, immediately \`replace_personal_memory\` to keep it accurate.`,
176
178
  subdialogWorkflowLine: `Workflow: do work → distill (\`update_reminder\`; when Taskdoc needs updates, draft a merged replacement and ask \`@${ctx.taskdocMaintainerId}\`) → then \`clear_mind\` to drop noise.`,
177
179
  mainlineWorkflowLine: 'Workflow: do work → distill (`update_reminder` + `change_mind(progress)`) → then `clear_mind` to drop noise.',
178
180
  contextHealthLine: 'System will automatically monitor and alert on context health: yellow (caution/"Caution") or red (critical/"Critical") will insert a user-visible prompt. When you receive such alerts, immediately stop large implementations/reads; distill first, then clear.',
@@ -194,6 +196,7 @@ function buildMemorySystemPrompt(ctx) {
194
196
  copy.personalMemoryLine,
195
197
  '',
196
198
  ctx.isSubdialog ? copy.subdialogDutyLine : copy.mainlineDutyLine,
199
+ copy.teammateTellaskRoundDoneLine,
197
200
  ...(ctx.agentHasTeamMemoryTools ? [copy.teamMemoryHintLine] : []),
198
201
  ...(ctx.agentHasPersonalMemoryTools ? [copy.personalMemoryHintLine] : []),
199
202
  ctx.isSubdialog ? copy.subdialogWorkflowLine : copy.mainlineWorkflowLine,