dominds 0.6.2 → 0.6.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 (149) hide show
  1. package/dist/access-control.js +2 -2
  2. package/dist/agent-priming.js +826 -92
  3. package/dist/cli/read.js +406 -12
  4. package/dist/dialog.js +4 -0
  5. package/dist/docs/design.md +1 -0
  6. package/dist/docs/design.zh.md +1 -0
  7. package/dist/docs/dialog-system.md +12 -7
  8. package/dist/docs/dialog-system.zh.md +7 -3
  9. package/dist/docs/dominds-agent-priming.md +10 -1
  10. package/dist/docs/dominds-agent-priming.zh.md +9 -1
  11. package/dist/docs/dominds-terminology.md +8 -8
  12. package/dist/docs/fbr-implementation.md +77 -0
  13. package/dist/docs/fbr-implementation.zh.md +77 -0
  14. package/dist/docs/fbr.md +142 -141
  15. package/dist/docs/fbr.zh.md +129 -123
  16. package/dist/docs/keep-going.zh.md +162 -0
  17. package/dist/docs/showing-by-doing.md +208 -0
  18. package/dist/docs/showing-by-doing.zh.md +177 -0
  19. package/dist/docs/tellask-collab.md +250 -0
  20. package/dist/docs/tellask-collab.zh.md +254 -0
  21. package/dist/docs/txt-editing-tools.md +2 -2
  22. package/dist/docs/txt-editing-tools.zh.md +2 -2
  23. package/dist/llm/defaults.yaml +82 -4
  24. package/dist/llm/driver.js +280 -104
  25. package/dist/llm/gen/codex.js +49 -2
  26. package/dist/log.js +385 -30
  27. package/dist/mcp/supervisor.js +113 -40
  28. package/dist/minds/builtin/pangu/persona.zh.md +2 -2
  29. package/dist/minds/load.js +49 -284
  30. package/dist/minds/minds-i18n.js +2 -2
  31. package/dist/minds/promptdocs.js +263 -0
  32. package/dist/minds/system-prompt-parts.js +231 -0
  33. package/dist/minds/system-prompt.js +190 -223
  34. package/dist/persistence.js +66 -1
  35. package/dist/server/websocket-handler.js +14 -0
  36. package/dist/shared/diligence.js +40 -6
  37. package/dist/shared/utils/inter-dialog-format.js +3 -5
  38. package/dist/showing-by-doing.js +34 -31
  39. package/dist/snippets/README.en.md +3 -0
  40. package/dist/static/assets/{_baseUniq-C9vbtHF9.js → _baseUniq-C7IpU2Uk.js} +2 -2
  41. package/dist/static/assets/{_baseUniq-C9vbtHF9.js.map → _baseUniq-C7IpU2Uk.js.map} +1 -1
  42. package/dist/static/assets/{arc-hulXG01i.js → arc-1bhQqjON.js} +2 -2
  43. package/dist/static/assets/{arc-hulXG01i.js.map → arc-1bhQqjON.js.map} +1 -1
  44. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js → architectureDiagram-VXUJARFQ-CkEi1QpB.js} +6 -6
  45. package/dist/static/assets/{architectureDiagram-VXUJARFQ-DdLIAMT5.js.map → architectureDiagram-VXUJARFQ-CkEi1QpB.js.map} +1 -1
  46. package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js → blockDiagram-VD42YOAC-DaBQ5-pY.js} +7 -7
  47. package/dist/static/assets/{blockDiagram-VD42YOAC-DACsx66C.js.map → blockDiagram-VD42YOAC-DaBQ5-pY.js.map} +1 -1
  48. package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js → c4Diagram-YG6GDRKO-ChUgpgkP.js} +3 -3
  49. package/dist/static/assets/{c4Diagram-YG6GDRKO-Cd5xZlLy.js.map → c4Diagram-YG6GDRKO-ChUgpgkP.js.map} +1 -1
  50. package/dist/static/assets/{channel-NQehis0Z.js → channel-CxvmwllM.js} +2 -2
  51. package/dist/static/assets/{channel-NQehis0Z.js.map → channel-CxvmwllM.js.map} +1 -1
  52. package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js → chunk-4BX2VUAB-CKsrU2yk.js} +2 -2
  53. package/dist/static/assets/{chunk-4BX2VUAB-DZDPl76b.js.map → chunk-4BX2VUAB-CKsrU2yk.js.map} +1 -1
  54. package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js → chunk-55IACEB6-BAau9SFt.js} +2 -2
  55. package/dist/static/assets/{chunk-55IACEB6-CFSRDUbl.js.map → chunk-55IACEB6-BAau9SFt.js.map} +1 -1
  56. package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js → chunk-B4BG7PRW--IiJ7W1m.js} +5 -5
  57. package/dist/static/assets/{chunk-B4BG7PRW-BqQQ9M_z.js.map → chunk-B4BG7PRW--IiJ7W1m.js.map} +1 -1
  58. package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js → chunk-DI55MBZ5-B83KrPQj.js} +4 -4
  59. package/dist/static/assets/{chunk-DI55MBZ5-FiFzz1Gh.js.map → chunk-DI55MBZ5-B83KrPQj.js.map} +1 -1
  60. package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js → chunk-FMBD7UC4-BlDXzeza.js} +2 -2
  61. package/dist/static/assets/{chunk-FMBD7UC4-DqqtCyWK.js.map → chunk-FMBD7UC4-BlDXzeza.js.map} +1 -1
  62. package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js → chunk-QN33PNHL-B596W_v7.js} +2 -2
  63. package/dist/static/assets/{chunk-QN33PNHL-F0laQQ-J.js.map → chunk-QN33PNHL-B596W_v7.js.map} +1 -1
  64. package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js → chunk-QZHKN3VN-UBBCxgBb.js} +2 -2
  65. package/dist/static/assets/{chunk-QZHKN3VN-CWhEZPaV.js.map → chunk-QZHKN3VN-UBBCxgBb.js.map} +1 -1
  66. package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js → chunk-TZMSLE5B-D-wCX2wJ.js} +2 -2
  67. package/dist/static/assets/{chunk-TZMSLE5B-Dx9cnwUy.js.map → chunk-TZMSLE5B-D-wCX2wJ.js.map} +1 -1
  68. package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js → classDiagram-2ON5EDUG-DvtmzPcu.js} +6 -6
  69. package/dist/static/assets/{classDiagram-2ON5EDUG-Dp-dyEGy.js.map → classDiagram-2ON5EDUG-DvtmzPcu.js.map} +1 -1
  70. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js → classDiagram-v2-WZHVMYZB-DvtmzPcu.js} +6 -6
  71. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-Dp-dyEGy.js.map → classDiagram-v2-WZHVMYZB-DvtmzPcu.js.map} +1 -1
  72. package/dist/static/assets/{clone-C6mKvxs5.js → clone-DgJ0ZR-k.js} +2 -2
  73. package/dist/static/assets/{clone-C6mKvxs5.js.map → clone-DgJ0ZR-k.js.map} +1 -1
  74. package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js → cose-bilkent-S5V4N54A-DXMyFQvy.js} +2 -2
  75. package/dist/static/assets/{cose-bilkent-S5V4N54A-Dbwh3GoX.js.map → cose-bilkent-S5V4N54A-DXMyFQvy.js.map} +1 -1
  76. package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js → dagre-6UL2VRFP-BdaUG-j_.js} +7 -7
  77. package/dist/static/assets/{dagre-6UL2VRFP-BD_6e0Uk.js.map → dagre-6UL2VRFP-BdaUG-j_.js.map} +1 -1
  78. package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js → diagram-PSM6KHXK-NLiqKBzn.js} +7 -7
  79. package/dist/static/assets/{diagram-PSM6KHXK-BWt7Q59-.js.map → diagram-PSM6KHXK-NLiqKBzn.js.map} +1 -1
  80. package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js → diagram-QEK2KX5R-D-0fyvY_.js} +6 -6
  81. package/dist/static/assets/{diagram-QEK2KX5R-D0BvBR_a.js.map → diagram-QEK2KX5R-D-0fyvY_.js.map} +1 -1
  82. package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js → diagram-S2PKOQOG-BQ_FU59m.js} +6 -6
  83. package/dist/static/assets/{diagram-S2PKOQOG-D8uRdKXp.js.map → diagram-S2PKOQOG-BQ_FU59m.js.map} +1 -1
  84. package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js → erDiagram-Q2GNP2WA-DyftKeuC.js} +5 -5
  85. package/dist/static/assets/{erDiagram-Q2GNP2WA-CQoifjFq.js.map → erDiagram-Q2GNP2WA-DyftKeuC.js.map} +1 -1
  86. package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js → flowDiagram-NV44I4VS-9SGefONA.js} +6 -6
  87. package/dist/static/assets/{flowDiagram-NV44I4VS-CGhdeaG8.js.map → flowDiagram-NV44I4VS-9SGefONA.js.map} +1 -1
  88. package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js → ganttDiagram-JELNMOA3-k_WLhf-r.js} +3 -3
  89. package/dist/static/assets/{ganttDiagram-JELNMOA3-D8W0wb9H.js.map → ganttDiagram-JELNMOA3-k_WLhf-r.js.map} +1 -1
  90. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js → gitGraphDiagram-NY62KEGX-3eoLlCOY.js} +7 -7
  91. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-ChHni_jP.js.map → gitGraphDiagram-NY62KEGX-3eoLlCOY.js.map} +1 -1
  92. package/dist/static/assets/{graph-BWoi_FgC.js → graph-vUevIs4s.js} +3 -3
  93. package/dist/static/assets/{graph-BWoi_FgC.js.map → graph-vUevIs4s.js.map} +1 -1
  94. package/dist/static/assets/{index-th_praGg.js → index-BNBG2CE1.js} +399 -68
  95. package/dist/static/assets/index-BNBG2CE1.js.map +1 -0
  96. package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js → infoDiagram-WHAUD3N6-CwEhVxkU.js} +5 -5
  97. package/dist/static/assets/{infoDiagram-WHAUD3N6-B_XKKZTV.js.map → infoDiagram-WHAUD3N6-CwEhVxkU.js.map} +1 -1
  98. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js} +5 -5
  99. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-ChGuQ6T9.js.map → journeyDiagram-XKPGCS4Q-Dtdq4G4Q.js.map} +1 -1
  100. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js → kanban-definition-3W4ZIXB7-Bli-AycJ.js} +3 -3
  101. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BjWe623u.js.map → kanban-definition-3W4ZIXB7-Bli-AycJ.js.map} +1 -1
  102. package/dist/static/assets/{layout-BPyT310w.js → layout-CGlA8c09.js} +5 -5
  103. package/dist/static/assets/{layout-BPyT310w.js.map → layout-CGlA8c09.js.map} +1 -1
  104. package/dist/static/assets/{linear-xUsVjXWq.js → linear-Da2jDWL3.js} +2 -2
  105. package/dist/static/assets/{linear-xUsVjXWq.js.map → linear-Da2jDWL3.js.map} +1 -1
  106. package/dist/static/assets/{min-xFt7zeOd.js → min-Co741hTV.js} +3 -3
  107. package/dist/static/assets/{min-xFt7zeOd.js.map → min-Co741hTV.js.map} +1 -1
  108. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js → mindmap-definition-VGOIOE7T-DvkIjoq8.js} +4 -4
  109. package/dist/static/assets/{mindmap-definition-VGOIOE7T-DT_dvf2c.js.map → mindmap-definition-VGOIOE7T-DvkIjoq8.js.map} +1 -1
  110. package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js → pieDiagram-ADFJNKIX-BGuGhTu8.js} +7 -7
  111. package/dist/static/assets/{pieDiagram-ADFJNKIX-B1DQ-OaG.js.map → pieDiagram-ADFJNKIX-BGuGhTu8.js.map} +1 -1
  112. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js → quadrantDiagram-AYHSOK5B-DAZcrJMg.js} +3 -3
  113. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-IHqyr3iT.js.map → quadrantDiagram-AYHSOK5B-DAZcrJMg.js.map} +1 -1
  114. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js → requirementDiagram-UZGBJVZJ-CXN0DxZs.js} +4 -4
  115. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-CKBpht7B.js.map → requirementDiagram-UZGBJVZJ-CXN0DxZs.js.map} +1 -1
  116. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js → sankeyDiagram-TZEHDZUN-B7-yAePZ.js} +2 -2
  117. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-D2uGjv3i.js.map → sankeyDiagram-TZEHDZUN-B7-yAePZ.js.map} +1 -1
  118. package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js → sequenceDiagram-WL72ISMW-DfBNY6h_.js} +4 -4
  119. package/dist/static/assets/{sequenceDiagram-WL72ISMW-wLFRhAKd.js.map → sequenceDiagram-WL72ISMW-DfBNY6h_.js.map} +1 -1
  120. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js → stateDiagram-FKZM4ZOC-BLo1xRVY.js} +9 -9
  121. package/dist/static/assets/{stateDiagram-FKZM4ZOC-BFGQTbx5.js.map → stateDiagram-FKZM4ZOC-BLo1xRVY.js.map} +1 -1
  122. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js} +5 -5
  123. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-DF7AjJuk.js.map → stateDiagram-v2-4FDKWEC3-Dq7MAD0I.js.map} +1 -1
  124. package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js → timeline-definition-IT6M3QCI-ySWyBF3b.js} +3 -3
  125. package/dist/static/assets/{timeline-definition-IT6M3QCI-ChHFOb0o.js.map → timeline-definition-IT6M3QCI-ySWyBF3b.js.map} +1 -1
  126. package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js → treemap-KMMF4GRG-DOp4sqOh.js} +4 -4
  127. package/dist/static/assets/{treemap-KMMF4GRG-BxaNvQU4.js.map → treemap-KMMF4GRG-DOp4sqOh.js.map} +1 -1
  128. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js → xychartDiagram-PRI3JC2R-vkmh67qb.js} +3 -3
  129. package/dist/static/assets/{xychartDiagram-PRI3JC2R-CrNKeY_-.js.map → xychartDiagram-PRI3JC2R-vkmh67qb.js.map} +1 -1
  130. package/dist/static/index.html +1 -1
  131. package/dist/team.js +29 -6
  132. package/dist/tool.js +56 -0
  133. package/dist/tools/builtins.js +4 -2
  134. package/dist/tools/context-health.js +7 -7
  135. package/dist/tools/os.js +267 -30
  136. package/dist/tools/pending-tellask-reminder.js +185 -0
  137. package/dist/tools/plan.js +1 -0
  138. package/dist/tools/ripgrep.js +145 -4
  139. package/dist/tools/shell-tools.js +21 -0
  140. package/dist/tools/team-mgmt.js +4 -4
  141. package/dist/tools/toolset-manual.js +74 -0
  142. package/dist/utils/task-doc.js +16 -16
  143. package/package.json +1 -1
  144. package/dist/minds/builtin/cmdr/persona.md +0 -3
  145. package/dist/minds/builtin/dijiang/knowledge.md +0 -287
  146. package/dist/minds/builtin/dijiang/persona.md +0 -7
  147. package/dist/static/assets/index-th_praGg.js.map +0 -1
  148. package/dist/static/testing/dom-observation-utils.js +0 -425
  149. package/dist/static/testing/e2e-test-helper.js +0 -3119
@@ -45,8 +45,8 @@ function funcToolUsageLabels(language) {
45
45
  }
46
46
  function funcToolRulesText(language) {
47
47
  return language === 'zh'
48
- ? '\n- 对所有函数工具使用标准工具调用方式,不要在文本中写 `!?@name` 来调用。\n- 参数必须是标准 JSON 格式:与接口定义精确匹配,包含所有必填字段,不能有多余字段。'
49
- : '\n- Use standard function tool calls for all function tools; do not use `!?@name` syntax.\n- Use valid JSON that matches the tool schema; include all required fields; no extra fields.';
48
+ ? '\n- 对所有函数工具使用标准工具调用方式,不要在文本中写 `!?@name` 来调用。'
49
+ : '\n- Use standard function tool calls for all function tools; do not use `!?@name` syntax.';
50
50
  }
51
51
  function taskdocCanonicalCopy(language) {
52
52
  if (language === 'zh') {
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildNoToolsNotice = buildNoToolsNotice;
4
+ exports.buildShellPolicyPrompt = buildShellPolicyPrompt;
5
+ exports.buildMemorySystemPrompt = buildMemorySystemPrompt;
6
+ exports.buildIntrinsicToolUsageText = buildIntrinsicToolUsageText;
7
+ const minds_i18n_1 = require("./minds-i18n");
8
+ function buildNoToolsNotice(language) {
9
+ return language === 'zh'
10
+ ? '无工具:不能调用任何工具,也不能访问 rtws / 文件 / 浏览器 / shell。'
11
+ : 'No tools: do not call any tools, and do not access the rtws, files, browser, or shell.';
12
+ }
13
+ function buildShellPolicyPrompt(ctx) {
14
+ const { language, agentIsShellSpecialist, agentHasShellTools, agentHasReadonlyShell, shellSpecialistMemberIds, } = ctx;
15
+ const title = language === 'zh' ? '### Shell 执行策略(重要)' : '### Shell Execution Policy (Important)';
16
+ const devopsScriptPolicy = language === 'zh'
17
+ ? 'DevOps 场景:忌讳临时脚本。不要用临时脚本完成工作;如需工具脚本,请与队友和人类讨论并在 rtws 中正式设计/命名/规范化后使用。'
18
+ : 'DevOps context: ad-hoc temp scripts are a taboo. Do not rely on temp scripts; if a tool script is needed, align with teammates and the human and formalize it in the rtws before use.';
19
+ const shellSpecialists = shellSpecialistMemberIds.length > 0
20
+ ? shellSpecialistMemberIds.map((id) => `@${id}`).join(', ')
21
+ : language === 'zh'
22
+ ? '(未配置 shell 专员)'
23
+ : '(no shell specialists configured)';
24
+ if (agentIsShellSpecialist && agentHasShellTools) {
25
+ const body = language === 'zh'
26
+ ? [
27
+ '你是本队的 shell 专员,具备 shell 执行能力(高风险)。使用前必须先做风险识别与最小化:',
28
+ '- 说明目的、预期输出/验证方式、预期工作目录与影响面。',
29
+ '- 优先选择只读命令;写入/删除/网络/权限相关操作必须解释理由与安全边界。',
30
+ '- 如果不确定命令后果,先提出更安全的替代方案或向人类/队友确认。',
31
+ '',
32
+ '当队友请求你执行命令时:请先复述你将执行的命令与风险边界,再执行,并按结构化格式回传 command/exit_code/stdout/stderr。',
33
+ '',
34
+ `本队 shell 专员列表:${shellSpecialists}`,
35
+ ].join('\n')
36
+ : [
37
+ 'You are a designated shell specialist and have shell execution capability (high-risk). Before using it, do risk identification and minimize blast radius:',
38
+ '- State intent, expected output/verification, expected working directory, and scope of impact.',
39
+ '- Prefer read-only commands; for writes/deletes/network/privilege-related actions, justify and state safety boundaries.',
40
+ '- If unsure about consequences, propose a safer alternative or confirm with a human/teammate first.',
41
+ '',
42
+ 'When teammates ask you to run commands: restate the exact command and guardrails, then execute, and report back with a structured receipt: command/exit_code/stdout/stderr.',
43
+ '',
44
+ `Shell specialists in this team: ${shellSpecialists}`,
45
+ '',
46
+ devopsScriptPolicy,
47
+ ].join('\n');
48
+ return `${title}\n\n${body}`.trim();
49
+ }
50
+ if (agentIsShellSpecialist && !agentHasShellTools) {
51
+ const body = language === 'zh'
52
+ ? [
53
+ '你被配置为 shell 专员,但当前没有可用的 shell 工具(团队配置错误)。',
54
+ '在未修复配置前:不要声称自己执行过命令;如需验证,请让人类修复 team.yaml 或把 shell 能力授予正确的成员。',
55
+ '',
56
+ `本队 shell 专员列表:${shellSpecialists}`,
57
+ ].join('\n')
58
+ : [
59
+ 'You are configured as a shell specialist, but you do not currently have shell tools available (team configuration error).',
60
+ 'Until it is fixed: do not claim you ran any command; ask a human to fix team.yaml or grant shell tools to the correct specialist member.',
61
+ '',
62
+ `Shell specialists in this team: ${shellSpecialists}`,
63
+ '',
64
+ devopsScriptPolicy,
65
+ ].join('\n');
66
+ return `${title}\n\n${body}`.trim();
67
+ }
68
+ const body = language === 'zh'
69
+ ? agentHasReadonlyShell
70
+ ? [
71
+ '你不具备高权限 shell 工具(shell_cmd/stop_daemon/get_daemon_output)。',
72
+ '你已被明确授权使用 `readonly_shell` 自行执行只读命令(仅允许白名单命令前缀):请直接调用,不要去寻找 shell 专员代跑。',
73
+ '',
74
+ '当你需要的命令不在白名单内,或需要写入/删除/网络/长时间运行/进程管理等高风险能力时:再转交给具备 shell 工具的专员队友,并提供充分理由与可审查的命令提案:',
75
+ '- 你要达成的目标(why)',
76
+ '- 建议命令(what)+ 预期工作目录(cwd)+ 预期输出/验证方式(how to verify)',
77
+ '- 风险评估与安全边界(risk & guardrails)',
78
+ `可转交的 shell 专员队友:${shellSpecialists}`,
79
+ '',
80
+ devopsScriptPolicy,
81
+ '',
82
+ '重要:如果你打算让队友执行命令,请在同一条消息里给出完整的 tellask 诉请块(以第 0 列开头的 `!?@<shell-specialist>` 行),不要只说“我会请某人运行”。',
83
+ '重要:在你看到 shell 专员的回执(command/exit_code/stdout/stderr)之前,不要声称“已运行/已通过/无错”。',
84
+ ].join('\n')
85
+ : [
86
+ '你不具备 shell 工具(本环境仅 shell 专员可执行 shell):不要尝试“编造/假设”命令输出,也不要要求系统直接执行。',
87
+ '当你确实需要 shell 执行时:请转交给具备 shell 能力的专员队友,并提供充分理由与可审查的命令提案:',
88
+ '- 你要达成的目标(why)',
89
+ '- 建议命令(what)+ 预期工作目录(cwd)+ 预期输出/验证方式(how to verify)',
90
+ '- 风险评估与安全边界(risk & guardrails)',
91
+ `可转交的 shell 专员队友:${shellSpecialists}`,
92
+ '',
93
+ devopsScriptPolicy,
94
+ '',
95
+ '重要:如果你打算让队友执行命令,请在同一条消息里给出完整的 tellask 诉请块(以第 0 列开头的 `!?@<shell-specialist>` 行),不要只说“我会请某人运行”。',
96
+ '重要:在你看到 shell 专员的回执(command/exit_code/stdout/stderr)之前,不要声称“已运行/已通过/无错”。',
97
+ ].join('\n')
98
+ : agentHasReadonlyShell
99
+ ? [
100
+ 'You do not have high-risk shell tools (shell_cmd/stop_daemon/get_daemon_output).',
101
+ 'You are explicitly authorized to use `readonly_shell` yourself for read-only inspection via its small allowlist. Call it directly; do not go looking for a shell specialist to run it for you.',
102
+ '',
103
+ 'When the command you need is not in the allowlist, or you need high-risk capabilities like writes/deletes/network/long-running jobs/process management: delegate to a shell specialist teammate with a justified, reviewable proposal:',
104
+ '- Goal (why)',
105
+ '- Proposed command (what) + expected working directory (cwd) + expected output/verification (how to verify)',
106
+ '- Risk assessment and guardrails (risk & guardrails)',
107
+ '',
108
+ `Shell specialist teammates: ${shellSpecialists}`,
109
+ '',
110
+ devopsScriptPolicy,
111
+ '',
112
+ 'Important: if you intend to delegate, include the full tellask block (a column-0 `!?@<shell-specialist>` line) in the same message; do not just say “I will ask someone to run it”.',
113
+ 'Important: do not claim “ran/passed/no errors” until you see the shell specialist’s receipt (command/exit_code/stdout/stderr).',
114
+ ].join('\n')
115
+ : [
116
+ 'You do not have shell tools configured (shell execution is restricted to designated specialists): do not fabricate/assume command output, and do not ask the system to execute commands directly.',
117
+ 'When you truly need shell execution, delegate to a shell specialist teammate with a justified, reviewable proposal:',
118
+ '- Goal (why)',
119
+ '- Proposed command (what) + expected working directory (cwd) + expected output/verification (how to verify)',
120
+ '- Risk assessment and guardrails (risk & guardrails)',
121
+ '',
122
+ `Shell specialist teammates: ${shellSpecialists}`,
123
+ '',
124
+ devopsScriptPolicy,
125
+ '',
126
+ 'Important: if you intend to delegate, include the full tellask block (a column-0 `!?@<shell-specialist>` line) in the same message; do not just say “I will ask someone to run it”.',
127
+ 'Important: do not claim “ran/passed/no errors” until you see the shell specialist’s receipt (command/exit_code/stdout/stderr).',
128
+ ].join('\n');
129
+ return `${title}\n\n${body}`.trim();
130
+ }
131
+ function buildMemorySystemPrompt(ctx) {
132
+ const { language } = ctx;
133
+ const title = language === 'zh' ? '### 记忆系统(重要)' : '### Memory System (Important)';
134
+ if (language === 'zh') {
135
+ const teamMemoryLine = '- 团队记忆:稳定的团队约定/工程规约(跨任务共享)。';
136
+ const personalMemoryLine = '- 个人记忆:稳定的个人习惯/偏好与职责域知识;可维护你职责范围内的“rtws 索引”(关键文档/代码的准确路径 + 必要要点),以减少重复读文件;不要记录具体任务状态。';
137
+ const body = [
138
+ '你的聊天记录与工具输出是临时信息:会快速累积、很快过时,并增加你的认知负担。在同一轮对话中,除了 `clear_mind` 以外你无法真正丢弃这些历史。',
139
+ '`clear_mind` 会开启新一程对话(保留差遣牒、提醒项与记忆层),从而卸掉这部分认知负载并继续推进。因此你必须先把关键信息提炼到高价值载体:',
140
+ '- 差遣牒(Taskdoc,`*.tsk/`):全队共享的任务契约(goals/constraints/progress);保持足够短,每轮都应可通读。',
141
+ `- 更新差遣牒的任意分段时:每次调用会替换该分段全文;你必须先对照“上下文中注入的当前内容”做合并/压缩;禁止覆盖/抹掉他人条目;自己负责维护的条目必须标注责任人(例如 \`- [owner:@${ctx.agentId}] ...\` 或用 \`### @${ctx.agentId}\` 分块)。`,
142
+ '- 其中 `progress` 是全队共享公告牌:用于“阶段性进度快照”(关键决策/当前状态/下一步),不是流水账。',
143
+ '- 重要:差遣牒内容会被系统以内联形式注入到上下文中(本轮生成视角下即为最新)。需要回顾时请直接基于上下文里的差遣牒内容回顾与决策,不要试图用通用文件工具读取 `*.tsk/` 下的文件(会被拒绝)。',
144
+ '- 约定:`constraints` 尽量只写任务特有的硬要求。系统提示/工具文档里已明确且由系统强制执行的通用规则(例如 `*.tsk/` 封装禁止通用文件工具)无需重复写入 `constraints.md`。',
145
+ '- 提醒项(工作集):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。',
146
+ teamMemoryLine,
147
+ personalMemoryLine,
148
+ '',
149
+ ...(ctx.isSubdialog
150
+ ? [
151
+ `你当前处于支线对话:此处不允许 \`change_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出你已合并好的“新全文/替换稿”(用于替换对应章节全文)。不要声称已更新,除非看到回执。`,
152
+ ]
153
+ : [
154
+ '你当前处于主线对话:你负责综合维护全队共享差遣牒(尤其是 progress 公告牌)。当队友/支线对话提出更新建议时,及时合并、压缩并保持清晰。',
155
+ ]),
156
+ ...(ctx.agentHasTeamMemoryTools
157
+ ? [
158
+ '提示:你具备团队记忆工具(`add_team_memory` / `replace_team_memory` / `drop_team_memory` / `clear_team_memory`),可在必要时维护团队记忆(谨慎、少量、只写稳定约定)。',
159
+ ]
160
+ : []),
161
+ ...(ctx.agentHasPersonalMemoryTools
162
+ ? [
163
+ '提示:你具备个人记忆工具(`add_memory` / `replace_memory` / `drop_memory` / `clear_memory`)。目标:维护你职责域的“rtws 索引”(关键文档/代码的准确路径 + 最小必要要点,如入口文件/关键符号/约定),让你在职责范围内尽量做到“0 次 ripgrep 就能开始干活”;一旦你修改了相关文件或发现记忆有过期/冲突,必须立刻用 `replace_memory` 把对应条目更新为最新事实。',
164
+ ]
165
+ : []),
166
+ ...(ctx.isSubdialog
167
+ ? [
168
+ `工作流:先做事 → 再提炼(\`update_reminder\`;必要时整理差遣牒更新提案并诉请 \`@${ctx.taskdocMaintainerId}\` 合并写入)→ 然后 \`clear_mind\` 清空噪音。`,
169
+ ]
170
+ : [
171
+ '工作流:先做事 → 再提炼(`update_reminder` + `change_mind(progress)`)→ 然后 `clear_mind` 清空噪音。',
172
+ ]),
173
+ '当 context health 变黄/红:立刻停止继续大实现/大阅读;先提炼,再 clear。',
174
+ '不要把长日志/大段 tool output 直接塞进差遣牒;差遣牒只写结论+下一步;细节只保留必要摘录放提醒项。',
175
+ ].join('\n');
176
+ return `${title}\n\n${body}`.trim();
177
+ }
178
+ const teamMemoryLine = '- Team memory: stable shared conventions (cross-task).';
179
+ const personalMemoryLine = '- Personal memory: stable personal habits/preferences and responsibility-scope knowledge. Maintain a compact responsibility-area rtws index (exact key doc/code paths + minimal key facts) to reduce repeat file reads; do not store per-task state.';
180
+ const body = [
181
+ 'Dialog history and tool outputs are temporary: they accumulate quickly, become stale, and increase cognitive load. Within a course, you cannot truly drop that history except via `clear_mind`.',
182
+ '`clear_mind` starts a new course while preserving Taskdoc, reminders, and memory layers. Therefore, before clearing, distill key information into durable layers:',
183
+ '- Taskdoc (`*.tsk/`): team-shared task contract (goals/constraints/progress). Keep it small enough to read every course.',
184
+ `- When updating any Taskdoc section: each call replaces the entire section; always start from the current injected content and merge/compress; do not overwrite other contributors; add an explicit owner tag for entries you maintain (e.g., \`- [owner:@${ctx.agentId}] ...\` or a \`### @${ctx.agentId}\` block).`,
185
+ '- Taskdoc `progress` is the team’s shared bulletin board: distilled milestone snapshots (key decisions/current status/next steps), not raw logs.',
186
+ '- Important: the Taskdoc content is injected inline into the context (the latest as of this generation). Review the injected Taskdoc instead of trying to read files under `*.tsk/` via general file tools (they will be rejected).',
187
+ '- Convention: keep Taskdoc `constraints` focused on task-specific requirements. Do not duplicate global, system-enforced rules already stated in system prompt/tool docs (e.g. `.tsk/` encapsulation bans general file tools).',
188
+ '- Reminders (working set): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small (often 1–3 items), prefer `update_reminder` to compress/merge; delete when obsolete.',
189
+ teamMemoryLine,
190
+ personalMemoryLine,
191
+ '',
192
+ ...(ctx.isSubdialog
193
+ ? [
194
+ `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.`,
195
+ ]
196
+ : [
197
+ '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.',
198
+ ]),
199
+ ...(ctx.agentHasTeamMemoryTools
200
+ ? [
201
+ '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.',
202
+ ]
203
+ : []),
204
+ ...(ctx.agentHasPersonalMemoryTools
205
+ ? [
206
+ 'Hint: you have personal-memory tools (`add_memory` / `replace_memory` / `drop_memory` / `clear_memory`). Goal: maintain a compact responsibility-area rtws index (exact key doc/code paths + minimal key facts) so you can start work with 0 ripgrep within your scope. If you changed those files or detect staleness/conflicts, immediately `replace_memory` to keep it accurate.',
207
+ ]
208
+ : []),
209
+ ...(ctx.isSubdialog
210
+ ? [
211
+ `Workflow: do work → distill (\`update_reminder\`; when Taskdoc needs updates, draft a merged replacement and ask \`@${ctx.taskdocMaintainerId}\`) → then \`clear_mind\` to drop noise.`,
212
+ ]
213
+ : [
214
+ 'Workflow: do work → distill (`update_reminder` + `change_mind(progress)`) → then `clear_mind` to drop noise.',
215
+ ]),
216
+ 'When context health turns yellow/red: treat it as a hard stop; distill first, then clear.',
217
+ 'Do not paste long logs/tool outputs into Taskdoc; Taskdoc should record decisions + next steps; keep only essential excerpts in reminders.',
218
+ ].join('\n');
219
+ return `${title}\n\n${body}`.trim();
220
+ }
221
+ function buildFuncToolUsageText(language, funcTools) {
222
+ if (funcTools.length === 0) {
223
+ return language === 'zh' ? '没有可用的函数工具。' : 'No function tools available.';
224
+ }
225
+ return funcTools
226
+ .map((tool) => {
227
+ const schema = tool.parameters;
228
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
229
+ const requiredValue = schema['required'];
230
+ const required = Array.isArray(requiredValue) && requiredValue.every((v) => typeof v === 'string')
231
+ ? requiredValue
232
+ : [];
233
+ const req = required.length > 0 ? required.join(', ') : (0, minds_i18n_1.noneRequiredFieldsText)(language);
234
+ const propsValue = schema['properties'];
235
+ const propsRecord = isRecord(propsValue) ? propsValue : {};
236
+ const props = Object.entries(propsRecord)
237
+ .map(([k, v]) => {
238
+ const desc = isRecord(v) && 'description' in v && typeof v.description === 'string'
239
+ ? v.description
240
+ : 'parameter';
241
+ return `- ${k}: ${desc}`;
242
+ })
243
+ .join('\n');
244
+ const labels = (0, minds_i18n_1.funcToolUsageLabels)(language);
245
+ let toolDesc = tool.descriptionI18n
246
+ ? (tool.descriptionI18n[language] ?? tool.descriptionI18n.en ?? tool.description)
247
+ : (tool.description ?? '');
248
+ if (tool.name === 'readonly_shell') {
249
+ toolDesc =
250
+ language === 'zh'
251
+ ? '只读白名单 shell。node/python 仅允许版本探针,脚本执行一律拒绝。'
252
+ : 'Read-only allowlist shell. Node/python version probes only; scripts are rejected.';
253
+ }
254
+ return `#### ${labels.toolLabel}: ${tool.name}\n\n${toolDesc}\n\n- ${labels.invocationLabel}: ${labels.invocationBody}\n- ${labels.requiredLabel}: ${req}\n- ${labels.parametersLabel}:\n${props}`.trim();
255
+ })
256
+ .join('\n\n');
257
+ }
258
+ function buildIntrinsicToolUsageText(language, funcTools) {
259
+ const usage = buildFuncToolUsageText(language, funcTools).trim();
260
+ if (usage === '')
261
+ return language === 'zh' ? '(无)' : '(none)';
262
+ return usage;
263
+ }
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildNoToolsNotice = buildNoToolsNotice;
4
+ exports.buildShellPolicyPrompt = buildShellPolicyPrompt;
5
+ exports.buildMemorySystemPrompt = buildMemorySystemPrompt;
6
+ exports.buildIntrinsicToolUsageText = buildIntrinsicToolUsageText;
7
+ const minds_i18n_1 = require("./minds-i18n");
8
+ function buildNoToolsNotice(language) {
9
+ return language === 'zh'
10
+ ? '无工具:不能调用任何工具,也不能访问 rtws / 文件 / 浏览器 / shell。'
11
+ : 'No tools: do not call any tools, and do not access the rtws, files, browser, or shell.';
12
+ }
13
+ function getShellPolicyCopy(language) {
14
+ if (language === 'zh') {
15
+ return {
16
+ title: '### Shell 执行策略(重要)',
17
+ noSpecialistsText: '(未配置 shell 专员)',
18
+ specialistRoleReady: '你是本队的 shell 专员,具备 shell 执行能力(高风险)。使用前必须先做风险识别与最小化:',
19
+ specialistRiskBullets: [
20
+ '- 说明目的、预期输出/验证方式、预期工作目录与影响面。',
21
+ '- 优先选择只读命令;写入/删除/网络/权限相关操作必须解释理由与安全边界。',
22
+ '- 如果不确定命令后果,先提出更安全的替代方案或向人类/队友确认。',
23
+ ],
24
+ specialistExecutionReceipt: '当队友请求你执行命令时:请先复述你将执行的命令与风险边界,再执行,并按结构化格式回传 command/exit_code/stdout/stderr。',
25
+ specialistConfiguredNoTools: '你被配置为 shell 专员,但当前没有可用的 shell 工具(团队配置错误)。',
26
+ specialistFixConfig: '在未修复配置前:不要声称自己执行过命令;如需验证,请让人类修复 team.yaml 或把 shell 能力授予正确的成员。',
27
+ noHighRiskTools: '你不具备高权限 shell 工具(shell_cmd/stop_daemon/get_daemon_output)。',
28
+ readonlyAuthorized: '你已被明确授权使用 `readonly_shell` 自行执行只读命令(仅允许白名单命令前缀):请直接调用,不要去寻找 shell 专员代跑。',
29
+ readonlyDelegateWhenNeeded: '当你需要的命令不在白名单内,或需要写入/删除/网络/长时间运行/进程管理等高风险能力时:再转交给具备 shell 工具的专员队友,并提供充分理由与可审查的命令提案:',
30
+ noShellTools: '你不具备 shell 工具(本环境仅 shell 专员可执行 shell):不要尝试“编造/假设”命令输出,也不要要求系统直接执行。',
31
+ delegateWhenNeeded: '当你确实需要 shell 执行时:请转交给具备 shell 能力的专员队友,并提供充分理由与可审查的命令提案:',
32
+ delegationProposalBullets: [
33
+ '- 你要达成的目标(why)',
34
+ '- 建议命令(what)+ 预期工作目录(cwd)+ 预期输出/验证方式(how to verify)',
35
+ '- 风险评估与安全边界(risk & guardrails)',
36
+ ],
37
+ specialistListLine: (value) => `本队 shell 专员列表:${value}`,
38
+ delegationSpecialistsLine: (value) => `可转交的 shell 专员队友:${value}`,
39
+ tellaskBlockReminder: '重要:如果你打算让队友执行命令,请在同一条消息里给出完整的 tellask 诉请块(以第 0 列开头的 `!?@<shell-specialist>` 行),不要只说“我会请某人运行”。',
40
+ claimAfterReceiptReminder: '重要:在你看到 shell 专员的回执(command/exit_code/stdout/stderr)之前,不要声称“已运行/已通过/无错”。',
41
+ includeDevopsPolicyForSpecialist: false,
42
+ };
43
+ }
44
+ return {
45
+ title: '### Shell Execution Policy (Important)',
46
+ noSpecialistsText: '(no shell specialists configured)',
47
+ specialistRoleReady: 'You are a designated shell specialist and have shell execution capability (high-risk). Before using it, do risk identification and minimize blast radius:',
48
+ specialistRiskBullets: [
49
+ '- State intent, expected output/verification, expected working directory, and scope of impact.',
50
+ '- Prefer read-only commands; for writes/deletes/network/privilege-related actions, justify and state safety boundaries.',
51
+ '- If unsure about consequences, propose a safer alternative or confirm with a human/teammate first.',
52
+ ],
53
+ specialistExecutionReceipt: 'When teammates ask you to run commands: restate the exact command and guardrails, then execute, and report back with a structured receipt: command/exit_code/stdout/stderr.',
54
+ specialistConfiguredNoTools: 'You are configured as a shell specialist, but you do not currently have shell tools available (team configuration error).',
55
+ specialistFixConfig: 'Until it is fixed: do not claim you ran any command; ask a human to fix team.yaml or grant shell tools to the correct specialist member.',
56
+ noHighRiskTools: 'You do not have high-risk shell tools (shell_cmd/stop_daemon/get_daemon_output).',
57
+ readonlyAuthorized: 'You are explicitly authorized to use `readonly_shell` yourself for read-only inspection via its small allowlist. Call it directly; do not go looking for a shell specialist to run it for you.',
58
+ readonlyDelegateWhenNeeded: 'When the command you need is not in the allowlist, or you need high-risk capabilities like writes/deletes/network/long-running jobs/process management: delegate to a shell specialist teammate with a justified, reviewable proposal:',
59
+ noShellTools: 'You do not have shell tools configured (shell execution is restricted to designated specialists): do not fabricate/assume command output, and do not ask the system to execute commands directly.',
60
+ delegateWhenNeeded: 'When you truly need shell execution, delegate to a shell specialist teammate with a justified, reviewable proposal:',
61
+ delegationProposalBullets: [
62
+ '- Goal (why)',
63
+ '- Proposed command (what) + expected working directory (cwd) + expected output/verification (how to verify)',
64
+ '- Risk assessment and guardrails (risk & guardrails)',
65
+ ],
66
+ specialistListLine: (value) => `Shell specialists in this team: ${value}`,
67
+ delegationSpecialistsLine: (value) => `Shell specialist teammates: ${value}`,
68
+ tellaskBlockReminder: 'Important: if you intend to delegate, include the full tellask block (a column-0 `!?@<shell-specialist>` line) in the same message; do not just say “I will ask someone to run it”.',
69
+ claimAfterReceiptReminder: 'Important: do not claim “ran/passed/no errors” until you see the shell specialist’s receipt (command/exit_code/stdout/stderr).',
70
+ includeDevopsPolicyForSpecialist: true,
71
+ };
72
+ }
73
+ function buildShellPolicyPrompt(ctx) {
74
+ const { language, agentIsShellSpecialist, agentHasShellTools, agentHasReadonlyShell, shellSpecialistMemberIds, } = ctx;
75
+ const copy = getShellPolicyCopy(language);
76
+ const devopsScriptPolicy = language === 'zh'
77
+ ? 'DevOps 场景:忌讳临时脚本。不要用临时脚本完成工作;如需工具脚本,请与队友和人类讨论并在 rtws 中正式设计/命名/规范化后使用。'
78
+ : 'DevOps context: ad-hoc temp scripts are a taboo. Do not rely on temp scripts; if a tool script is needed, align with teammates and the human and formalize it in the rtws before use.';
79
+ const shellSpecialists = shellSpecialistMemberIds.length > 0
80
+ ? shellSpecialistMemberIds.map((id) => `@${id}`).join(', ')
81
+ : copy.noSpecialistsText;
82
+ const specialistListLine = copy.specialistListLine(shellSpecialists);
83
+ const specialistDelegationLine = copy.delegationSpecialistsLine(shellSpecialists);
84
+ const buildDelegationBlock = (introLine) => [
85
+ introLine,
86
+ ...copy.delegationProposalBullets,
87
+ specialistDelegationLine,
88
+ '',
89
+ devopsScriptPolicy,
90
+ '',
91
+ copy.tellaskBlockReminder,
92
+ copy.claimAfterReceiptReminder,
93
+ ];
94
+ if (agentIsShellSpecialist && agentHasShellTools) {
95
+ const bodyLines = [
96
+ copy.specialistRoleReady,
97
+ ...copy.specialistRiskBullets,
98
+ '',
99
+ copy.specialistExecutionReceipt,
100
+ '',
101
+ specialistListLine,
102
+ ...(copy.includeDevopsPolicyForSpecialist ? ['', devopsScriptPolicy] : []),
103
+ ];
104
+ return `${copy.title}\n\n${bodyLines.join('\n')}`.trim();
105
+ }
106
+ if (agentIsShellSpecialist && !agentHasShellTools) {
107
+ const bodyLines = [
108
+ copy.specialistConfiguredNoTools,
109
+ copy.specialistFixConfig,
110
+ '',
111
+ specialistListLine,
112
+ ...(copy.includeDevopsPolicyForSpecialist ? ['', devopsScriptPolicy] : []),
113
+ ];
114
+ return `${copy.title}\n\n${bodyLines.join('\n')}`.trim();
115
+ }
116
+ const bodyLines = agentHasReadonlyShell
117
+ ? [
118
+ copy.noHighRiskTools,
119
+ copy.readonlyAuthorized,
120
+ '',
121
+ ...buildDelegationBlock(copy.readonlyDelegateWhenNeeded),
122
+ ]
123
+ : [copy.noShellTools, ...buildDelegationBlock(copy.delegateWhenNeeded)];
124
+ return `${copy.title}\n\n${bodyLines.join('\n')}`.trim();
125
+ }
126
+ function getMemoryPromptCopy(ctx) {
127
+ if (ctx.language === 'zh') {
128
+ return {
129
+ title: '### 记忆系统(重要)',
130
+ temporaryInfoLine: '你的聊天记录与工具输出是临时信息:会快速累积、很快过时,并增加你的认知负担。在同一轮对话中,除了 `clear_mind` 以外你无法真正丢弃这些历史。',
131
+ clearMindLine: '`clear_mind` 会开启新一程对话(保留差遣牒、提醒项与记忆层),从而卸掉这部分认知负载并继续推进。因此你必须先把关键信息提炼到高价值载体:',
132
+ taskdocContractLine: '- 差遣牒(Taskdoc,`*.tsk/`):全队共享的任务契约(goals/constraints/progress);保持足够短,每轮都应可通读。',
133
+ taskdocSectionReplaceLine: `- 更新差遣牒的任意分段时:每次调用会替换该分段全文;你必须先对照“上下文中注入的当前内容”做合并/压缩;禁止覆盖/抹掉他人条目;自己负责维护的条目必须标注责任人(例如 \`- [owner:@${ctx.agentId}] ...\` 或用 \`### @${ctx.agentId}\` 分块)。`,
134
+ progressLine: '- 其中 `progress` 是全队共享公告牌:用于“阶段性进度快照”(关键决策/当前状态/下一步),不是流水账。',
135
+ injectedTaskdocLine: '- 重要:差遣牒内容会被系统以内联形式注入到上下文中(本轮生成视角下即为最新)。需要回顾时请直接基于上下文里的差遣牒内容回顾与决策,不要试图用通用文件工具读取 `*.tsk/` 下的文件(会被拒绝)。',
136
+ constraintsLine: '- 约定:`constraints` 尽量只写任务特有的硬要求。系统提示/工具文档里已明确且由系统强制执行的通用规则(例如 `*.tsk/` 封装禁止通用文件工具)无需重复写入 `constraints.md`。',
137
+ remindersLine: '- 提醒项(工作集):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。',
138
+ teamMemoryLine: '- 团队记忆:稳定的团队约定/工程规约(跨任务共享)。',
139
+ personalMemoryLine: '- 个人记忆:稳定的个人习惯/偏好与职责域知识;可维护你职责范围内的“rtws 索引”(关键文档/代码的准确路径 + 必要要点),以减少重复读文件;不要记录具体任务状态。',
140
+ subdialogDutyLine: `你当前处于支线对话:此处不允许 \`change_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出你已合并好的“新全文/替换稿”(用于替换对应章节全文)。不要声称已更新,除非看到回执。`,
141
+ mainlineDutyLine: '你当前处于主线对话:你负责综合维护全队共享差遣牒(尤其是 progress 公告牌)。当队友/支线对话提出更新建议时,及时合并、压缩并保持清晰。',
142
+ teamMemoryHintLine: '提示:你具备团队记忆工具(`add_team_memory` / `replace_team_memory` / `drop_team_memory` / `clear_team_memory`),可在必要时维护团队记忆(谨慎、少量、只写稳定约定)。',
143
+ personalMemoryHintLine: '提示:你具备个人记忆工具(`add_memory` / `replace_memory` / `drop_memory` / `clear_memory`)。目标:维护你职责域的“rtws 索引”(关键文档/代码的准确路径 + 最小必要要点,如入口文件/关键符号/约定),让你在职责范围内尽量做到“0 次 ripgrep 就能开始干活”;一旦你修改了相关文件或发现记忆有过期/冲突,必须立刻用 `replace_memory` 把对应条目更新为最新事实。',
144
+ subdialogWorkflowLine: `工作流:先做事 → 再提炼(\`update_reminder\`;必要时整理差遣牒更新提案并诉请 \`@${ctx.taskdocMaintainerId}\` 合并写入)→ 然后 \`clear_mind\` 清空噪音。`,
145
+ mainlineWorkflowLine: '工作流:先做事 → 再提炼(`update_reminder` + `change_mind(progress)`)→ 然后 `clear_mind` 清空噪音。',
146
+ contextHealthLine: '当 context health 变黄/红:立刻停止继续大实现/大阅读;先提炼,再 clear。',
147
+ taskdocLogLine: '不要把长日志/大段 tool output 直接塞进差遣牒;差遣牒只写结论+下一步;细节只保留必要摘录放提醒项。',
148
+ };
149
+ }
150
+ return {
151
+ title: '### Memory System (Important)',
152
+ temporaryInfoLine: 'Dialog history and tool outputs are temporary: they accumulate quickly, become stale, and increase cognitive load. Within a course, you cannot truly drop that history except via `clear_mind`.',
153
+ clearMindLine: '`clear_mind` starts a new course while preserving Taskdoc, reminders, and memory layers. Therefore, before clearing, distill key information into durable layers:',
154
+ taskdocContractLine: '- Taskdoc (`*.tsk/`): team-shared task contract (goals/constraints/progress). Keep it small enough to read every course.',
155
+ taskdocSectionReplaceLine: `- When updating any Taskdoc section: each call replaces the entire section; always start from the current injected content and merge/compress; do not overwrite other contributors; add an explicit owner tag for entries you maintain (e.g., \`- [owner:@${ctx.agentId}] ...\` or a \`### @${ctx.agentId}\` block).`,
156
+ progressLine: '- Taskdoc `progress` is the team’s shared bulletin board: distilled milestone snapshots (key decisions/current status/next steps), not raw logs.',
157
+ injectedTaskdocLine: '- Important: the Taskdoc content is injected inline into the context (the latest as of this generation). Review the injected Taskdoc instead of trying to read files under `*.tsk/` via general file tools (they will be rejected).',
158
+ constraintsLine: '- Convention: keep Taskdoc `constraints` focused on task-specific requirements. Do not duplicate global, system-enforced rules already stated in system prompt/tool docs (e.g. `.tsk/` encapsulation bans general file tools).',
159
+ remindersLine: '- Reminders (working set): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small (often 1–3 items), prefer `update_reminder` to compress/merge; delete when obsolete.',
160
+ teamMemoryLine: '- Team memory: stable shared conventions (cross-task).',
161
+ personalMemoryLine: '- Personal memory: stable personal habits/preferences and responsibility-scope knowledge. Maintain a compact responsibility-area rtws index (exact key doc/code paths + minimal key facts) to reduce repeat file reads; do not store per-task state.',
162
+ 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.`,
163
+ 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.',
164
+ 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.',
165
+ personalMemoryHintLine: 'Hint: you have personal-memory tools (`add_memory` / `replace_memory` / `drop_memory` / `clear_memory`). Goal: maintain a compact responsibility-area rtws index (exact key doc/code paths + minimal key facts) so you can start work with 0 ripgrep within your scope. If you changed those files or detect staleness/conflicts, immediately `replace_memory` to keep it accurate.',
166
+ 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.`,
167
+ mainlineWorkflowLine: 'Workflow: do work → distill (`update_reminder` + `change_mind(progress)`) → then `clear_mind` to drop noise.',
168
+ contextHealthLine: 'When context health turns yellow/red: treat it as a hard stop; distill first, then clear.',
169
+ taskdocLogLine: 'Do not paste long logs/tool outputs into Taskdoc; Taskdoc should record decisions + next steps; keep only essential excerpts in reminders.',
170
+ };
171
+ }
172
+ function buildMemorySystemPrompt(ctx) {
173
+ const copy = getMemoryPromptCopy(ctx);
174
+ const body = [
175
+ copy.temporaryInfoLine,
176
+ copy.clearMindLine,
177
+ copy.taskdocContractLine,
178
+ copy.taskdocSectionReplaceLine,
179
+ copy.progressLine,
180
+ copy.injectedTaskdocLine,
181
+ copy.constraintsLine,
182
+ copy.remindersLine,
183
+ copy.teamMemoryLine,
184
+ copy.personalMemoryLine,
185
+ '',
186
+ ctx.isSubdialog ? copy.subdialogDutyLine : copy.mainlineDutyLine,
187
+ ...(ctx.agentHasTeamMemoryTools ? [copy.teamMemoryHintLine] : []),
188
+ ...(ctx.agentHasPersonalMemoryTools ? [copy.personalMemoryHintLine] : []),
189
+ ctx.isSubdialog ? copy.subdialogWorkflowLine : copy.mainlineWorkflowLine,
190
+ copy.contextHealthLine,
191
+ copy.taskdocLogLine,
192
+ ].join('\n');
193
+ return `${copy.title}\n\n${body}`.trim();
194
+ }
195
+ function buildFuncToolUsageText(language, funcTools) {
196
+ if (funcTools.length === 0) {
197
+ return language === 'zh' ? '没有可用的函数工具。' : 'No function tools available.';
198
+ }
199
+ return funcTools
200
+ .map((tool) => {
201
+ const schema = tool.parameters;
202
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
203
+ const requiredValue = schema['required'];
204
+ const required = Array.isArray(requiredValue) && requiredValue.every((v) => typeof v === 'string')
205
+ ? requiredValue
206
+ : [];
207
+ const req = required.length > 0 ? required.join(', ') : (0, minds_i18n_1.noneRequiredFieldsText)(language);
208
+ const propsValue = schema['properties'];
209
+ const propsRecord = isRecord(propsValue) ? propsValue : {};
210
+ const props = Object.entries(propsRecord)
211
+ .map(([k, v]) => {
212
+ const desc = isRecord(v) && 'description' in v && typeof v.description === 'string'
213
+ ? v.description
214
+ : 'parameter';
215
+ return `- ${k}: ${desc}`;
216
+ })
217
+ .join('\n');
218
+ const labels = (0, minds_i18n_1.funcToolUsageLabels)(language);
219
+ const toolDesc = tool.descriptionI18n
220
+ ? (tool.descriptionI18n[language] ?? tool.descriptionI18n.en ?? tool.description)
221
+ : (tool.description ?? '');
222
+ return `#### ${labels.toolLabel}: ${tool.name}\n\n${toolDesc}\n\n- ${labels.invocationLabel}: ${labels.invocationBody}\n- ${labels.requiredLabel}: ${req}\n- ${labels.parametersLabel}:\n${props}`.trim();
223
+ })
224
+ .join('\n\n');
225
+ }
226
+ function buildIntrinsicToolUsageText(language, funcTools) {
227
+ const usage = buildFuncToolUsageText(language, funcTools).trim();
228
+ if (usage === '')
229
+ return language === 'zh' ? '(无)' : '(none)';
230
+ return usage;
231
+ }