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
@@ -0,0 +1,185 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pendingTellaskReminderOwner = void 0;
4
+ exports.syncPendingTellaskReminderState = syncPendingTellaskReminderState;
5
+ const persistence_1 = require("../persistence");
6
+ const runtime_language_1 = require("../shared/runtime-language");
7
+ const time_1 = require("../shared/utils/time");
8
+ function isRecord(value) {
9
+ return typeof value === 'object' && value !== null;
10
+ }
11
+ function isPendingTellaskReminderMeta(value) {
12
+ if (!isRecord(value))
13
+ return false;
14
+ if (value.kind !== 'pending_tellask')
15
+ return false;
16
+ if (typeof value.pendingCount !== 'number')
17
+ return false;
18
+ if (typeof value.pendingSignature !== 'string')
19
+ return false;
20
+ if (typeof value.updatedAt !== 'string')
21
+ return false;
22
+ return true;
23
+ }
24
+ function callTypeLabel(language, callType) {
25
+ if (language === 'zh') {
26
+ if (callType === 'A')
27
+ return '回问诉请';
28
+ if (callType === 'B')
29
+ return '长线诉请';
30
+ return '一次性诉请';
31
+ }
32
+ if (callType === 'A')
33
+ return 'TellaskBack';
34
+ if (callType === 'B')
35
+ return 'Tellask Session';
36
+ return 'Fresh Tellask';
37
+ }
38
+ function summarizeTellaskHead(tellaskHead) {
39
+ const normalized = tellaskHead.replace(/\s+/g, ' ').trim();
40
+ if (!normalized)
41
+ return '(empty tellaskHead)';
42
+ const max = 140;
43
+ if (normalized.length <= max)
44
+ return normalized;
45
+ return `${normalized.slice(0, max).trimEnd()}...`;
46
+ }
47
+ function makePendingSignature(pending) {
48
+ return pending
49
+ .map((p) => [
50
+ p.subdialogId,
51
+ p.targetAgentId,
52
+ p.callType,
53
+ p.tellaskSession ?? '',
54
+ summarizeTellaskHead(p.tellaskHead),
55
+ ].join('|'))
56
+ .sort()
57
+ .join('||');
58
+ }
59
+ function buildReminderMeta(pending) {
60
+ return {
61
+ kind: 'pending_tellask',
62
+ pendingCount: pending.length,
63
+ pendingSignature: makePendingSignature(pending),
64
+ updatedAt: (0, time_1.formatUnifiedTimestamp)(new Date()),
65
+ };
66
+ }
67
+ function buildReminderContent(language, pending) {
68
+ const heading = language === 'zh' ? '⏳ 进行中诉请(自动维护)' : '⏳ In-flight Tellasks (auto-managed)';
69
+ const summary = language === 'zh'
70
+ ? '以下诉请仍在执行中;除这些条目外,当前没有其它仍在执行中的诉请。'
71
+ : 'Only the Tellasks listed below are still in flight; besides them, no other Tellasks are currently executing.';
72
+ const lines = pending.map((p, idx) => {
73
+ const base = language === 'zh'
74
+ ? `${idx + 1}. @${p.targetAgentId} | ${callTypeLabel(language, p.callType)} | ${summarizeTellaskHead(p.tellaskHead)}`
75
+ : `${idx + 1}. @${p.targetAgentId} | ${callTypeLabel(language, p.callType)} | ${summarizeTellaskHead(p.tellaskHead)}`;
76
+ if (!p.tellaskSession)
77
+ return base;
78
+ return language === 'zh'
79
+ ? `${base} | 会话: ${p.tellaskSession}`
80
+ : `${base} | session: ${p.tellaskSession}`;
81
+ });
82
+ return [heading, '', summary, '', ...lines].join('\n');
83
+ }
84
+ function findOwnedReminderIndices(dlg) {
85
+ const indices = [];
86
+ for (let i = 0; i < dlg.reminders.length; i++) {
87
+ if (dlg.reminders[i]?.owner === exports.pendingTellaskReminderOwner) {
88
+ indices.push(i);
89
+ }
90
+ }
91
+ return indices;
92
+ }
93
+ function assertSingleOwnedReminder(dlg) {
94
+ const indices = findOwnedReminderIndices(dlg);
95
+ if (indices.length === 0)
96
+ return null;
97
+ if (indices.length === 1)
98
+ return indices[0] ?? null;
99
+ throw new Error(`pendingTellask reminder invariant violated: expected <=1 owner reminder, got ${indices.length} (dialog=${dlg.id.valueOf()})`);
100
+ }
101
+ async function loadPendingSubdialogView(dlg) {
102
+ const pending = await persistence_1.DialogPersistence.loadPendingSubdialogs(dlg.id, dlg.status);
103
+ return pending.map((p) => ({
104
+ subdialogId: p.subdialogId,
105
+ tellaskHead: p.tellaskHead,
106
+ targetAgentId: p.targetAgentId,
107
+ callType: p.callType,
108
+ tellaskSession: p.tellaskSession,
109
+ }));
110
+ }
111
+ async function withDialogLockIfNeeded(dlg, fn) {
112
+ if (dlg.isLocked()) {
113
+ return await fn();
114
+ }
115
+ return await dlg.withLock(fn);
116
+ }
117
+ async function syncPendingTellaskReminderState(dlg) {
118
+ const pending = await loadPendingSubdialogView(dlg);
119
+ return await withDialogLockIfNeeded(dlg, async () => {
120
+ const reminderIndex = assertSingleOwnedReminder(dlg);
121
+ const language = (0, runtime_language_1.getWorkLanguage)();
122
+ if (pending.length === 0) {
123
+ if (reminderIndex === null)
124
+ return false;
125
+ dlg.deleteReminder(reminderIndex);
126
+ return true;
127
+ }
128
+ const content = buildReminderContent(language, pending);
129
+ const nextMeta = buildReminderMeta(pending);
130
+ if (reminderIndex === null) {
131
+ dlg.addReminder(content, exports.pendingTellaskReminderOwner, nextMeta, 0);
132
+ return true;
133
+ }
134
+ const current = dlg.reminders[reminderIndex];
135
+ const currentMeta = current?.meta;
136
+ const unchanged = current?.content === content &&
137
+ isPendingTellaskReminderMeta(currentMeta) &&
138
+ currentMeta.pendingSignature === nextMeta.pendingSignature &&
139
+ currentMeta.pendingCount === nextMeta.pendingCount;
140
+ if (unchanged)
141
+ return false;
142
+ dlg.updateReminder(reminderIndex, content, nextMeta);
143
+ return true;
144
+ });
145
+ }
146
+ exports.pendingTellaskReminderOwner = {
147
+ name: 'pendingTellask',
148
+ async updateReminder(dlg, reminder) {
149
+ if (reminder.owner !== exports.pendingTellaskReminderOwner) {
150
+ return { treatment: 'keep' };
151
+ }
152
+ const pending = await loadPendingSubdialogView(dlg);
153
+ if (pending.length === 0) {
154
+ return { treatment: 'drop' };
155
+ }
156
+ const language = (0, runtime_language_1.getWorkLanguage)();
157
+ const updatedContent = buildReminderContent(language, pending);
158
+ const updatedMeta = buildReminderMeta(pending);
159
+ const unchanged = reminder.content === updatedContent &&
160
+ isPendingTellaskReminderMeta(reminder.meta) &&
161
+ reminder.meta.pendingSignature === updatedMeta.pendingSignature &&
162
+ reminder.meta.pendingCount === updatedMeta.pendingCount;
163
+ if (unchanged) {
164
+ return { treatment: 'keep' };
165
+ }
166
+ return { treatment: 'update', updatedContent, updatedMeta };
167
+ },
168
+ async renderReminder(_dlg, reminder, index) {
169
+ if (reminder.owner !== exports.pendingTellaskReminderOwner) {
170
+ const language = (0, runtime_language_1.getWorkLanguage)();
171
+ return {
172
+ type: 'transient_guide_msg',
173
+ role: 'assistant',
174
+ content: language === 'zh'
175
+ ? `系统提醒 #${index + 1}\n\n${reminder.content}`
176
+ : `System reminder #${index + 1}\n\n${reminder.content}`,
177
+ };
178
+ }
179
+ return {
180
+ type: 'transient_guide_msg',
181
+ role: 'assistant',
182
+ content: reminder.content,
183
+ };
184
+ },
185
+ };
@@ -66,6 +66,7 @@ exports.updatePlanTool = {
66
66
  step: { type: 'string', description: 'Step description.' },
67
67
  status: {
68
68
  type: 'string',
69
+ enum: ['pending', 'in_progress', 'completed'],
69
70
  description: 'One of: pending, in_progress, completed',
70
71
  },
71
72
  },
@@ -109,13 +109,122 @@ function buildAccessControlGlobs(member) {
109
109
  }
110
110
  // Taskdocs are encapsulated and forbidden to all general file tools.
111
111
  exclude.push('**/*.tsk');
112
+ exclude.push('**/*.tsk/*');
112
113
  exclude.push('**/*.tsk/**');
113
- // `.minds/**` is reserved rtws state and is hard-denied for general file tools.
114
- // Dedicated `.minds/`-scoped tools (team-mgmt) should be used for managing it.
115
- exclude.push('.minds');
116
- exclude.push('.minds/**');
114
+ // `.dialogs/**` at rtws root is reserved runtime persistence state and hard-denied.
115
+ exclude.push('.dialogs');
116
+ exclude.push('.dialogs/**');
117
+ // `.minds/**` is reserved rtws state and hard-denied for general file tools.
118
+ // Dedicated `.minds/`-scoped tools (team-mgmt) may bypass this with internal_allow_minds=true.
119
+ if (member.internal_allow_minds !== true) {
120
+ exclude.push('.minds');
121
+ exclude.push('.minds/**');
122
+ }
117
123
  return { include, exclude };
118
124
  }
125
+ function normalizeRelFromRtwsRoot(relPath) {
126
+ return relPath.replace(/\\/g, '/').replace(/^\/+/, '');
127
+ }
128
+ function isEncapsulatedTaskPath(relFromRoot) {
129
+ const normalized = normalizeRelFromRtwsRoot(relFromRoot);
130
+ return /(^|\/)[^/]+\.tsk(\/|$)/.test(normalized);
131
+ }
132
+ function detectRootReservedPath(relFromRoot) {
133
+ const normalized = normalizeRelFromRtwsRoot(relFromRoot);
134
+ if (normalized === '.minds' || normalized.startsWith('.minds/'))
135
+ return '.minds';
136
+ if (normalized === '.dialogs' || normalized.startsWith('.dialogs/'))
137
+ return '.dialogs';
138
+ return null;
139
+ }
140
+ function detectForbiddenRipgrepSearchPath(member, searchPath) {
141
+ const cwd = path_1.default.resolve(process.cwd());
142
+ const abs = path_1.default.resolve(cwd, searchPath);
143
+ const relFromRoot = path_1.default.relative(cwd, abs);
144
+ if (isEncapsulatedTaskPath(relFromRoot))
145
+ return '*.tsk/';
146
+ const reserved = detectRootReservedPath(relFromRoot);
147
+ if (!reserved)
148
+ return null;
149
+ if (reserved === '.minds' && member.internal_allow_minds === true)
150
+ return null;
151
+ return reserved;
152
+ }
153
+ function normalizeGlobToken(glob) {
154
+ return glob
155
+ .trim()
156
+ .replace(/\\/g, '/')
157
+ .replace(/^!+/, '')
158
+ .replace(/^\.\/+/, '')
159
+ .replace(/^\/+/, '');
160
+ }
161
+ function detectForbiddenPathFromGlob(member, glob) {
162
+ const normalized = normalizeGlobToken(glob);
163
+ if (normalized === '')
164
+ return null;
165
+ if (/(^|\/)[^/]*\.tsk(\/|$)/.test(normalized))
166
+ return '*.tsk/';
167
+ if (normalized === '.dialogs' || normalized.startsWith('.dialogs/'))
168
+ return '.dialogs';
169
+ if ((normalized === '.minds' || normalized.startsWith('.minds/')) &&
170
+ member.internal_allow_minds !== true) {
171
+ return '.minds';
172
+ }
173
+ return null;
174
+ }
175
+ function detectForbiddenRipgrepGlobs(member, globs) {
176
+ for (const glob of globs) {
177
+ const forbidden = detectForbiddenPathFromGlob(member, glob);
178
+ if (forbidden)
179
+ return forbidden;
180
+ }
181
+ return null;
182
+ }
183
+ function detectForbiddenRipgrepRawArgs(member, rawRgArgs) {
184
+ for (let i = 0; i < rawRgArgs.length; i++) {
185
+ const tok = rawRgArgs[i] ?? '';
186
+ let globPattern = null;
187
+ if (tok === '--glob' || tok === '--iglob' || tok === '-g') {
188
+ const next = rawRgArgs[i + 1];
189
+ if (typeof next === 'string') {
190
+ globPattern = next;
191
+ i += 1;
192
+ }
193
+ }
194
+ else if (tok.startsWith('--glob=')) {
195
+ globPattern = tok.slice('--glob='.length);
196
+ }
197
+ else if (tok.startsWith('--iglob=')) {
198
+ globPattern = tok.slice('--iglob='.length);
199
+ }
200
+ else if (tok.startsWith('-g') && tok.length > 2) {
201
+ globPattern = tok.slice(2);
202
+ }
203
+ if (!globPattern)
204
+ continue;
205
+ const forbidden = detectForbiddenPathFromGlob(member, globPattern);
206
+ if (forbidden)
207
+ return forbidden;
208
+ }
209
+ return null;
210
+ }
211
+ function formatForbiddenSearchPathAccessDeniedYaml(mode, pattern, searchPath, forbiddenPath) {
212
+ const summary = forbiddenPath === '.minds'
213
+ ? 'ACCESS_DENIED: `.minds/**` is reserved rtws state for team config/memory/assets. Use `team_mgmt_ripgrep_*` (or other `team_mgmt_*`) for `.minds/**`.'
214
+ : forbiddenPath === '.dialogs'
215
+ ? 'ACCESS_DENIED: `.dialogs/**` at rtws root is reserved dialog/runtime persistence and is not searchable by general `ripgrep_*` tools. For Dominds debugging, reproduce under a nested rtws (e.g. `ux-rtws/.dialogs/**`).'
216
+ : 'ACCESS_DENIED: `*.tsk/` is an encapsulated Taskdoc path and is hard-denied for general `ripgrep_*` tools.';
217
+ const yaml = [
218
+ `status: error`,
219
+ `pattern: ${yamlQuote(pattern)}`,
220
+ `mode: ${mode}`,
221
+ `path: ${yamlQuote(searchPath)}`,
222
+ `error: ACCESS_DENIED`,
223
+ `reserved_path: ${yamlQuote(forbiddenPath)}`,
224
+ `summary: ${yamlQuote(summary)}`,
225
+ ].join('\n');
226
+ return formatYamlCodeBlock(yaml);
227
+ }
119
228
  function defaultBaseOptions() {
120
229
  return {
121
230
  globs: [],
@@ -184,6 +293,14 @@ async function loadFileLines(relPath) {
184
293
  return parts;
185
294
  }
186
295
  async function runRipgrepFiles(caller, pattern, searchPath, options) {
296
+ const forbiddenPath = detectForbiddenRipgrepSearchPath(caller, searchPath);
297
+ if (forbiddenPath) {
298
+ return formatForbiddenSearchPathAccessDeniedYaml('files', pattern, searchPath, forbiddenPath);
299
+ }
300
+ const forbiddenGlob = detectForbiddenRipgrepGlobs(caller, options.globs);
301
+ if (forbiddenGlob) {
302
+ return formatForbiddenSearchPathAccessDeniedYaml('files', pattern, searchPath, forbiddenGlob);
303
+ }
187
304
  const args = [...baseRgArgs(options, caller), '--files-with-matches', '--', pattern, searchPath];
188
305
  try {
189
306
  const { stdoutLines } = await runRgLines(args);
@@ -272,6 +389,14 @@ exports.ripgrepFilesTool = {
272
389
  },
273
390
  };
274
391
  async function runRipgrepCount(caller, pattern, searchPath, options) {
392
+ const forbiddenPath = detectForbiddenRipgrepSearchPath(caller, searchPath);
393
+ if (forbiddenPath) {
394
+ return formatForbiddenSearchPathAccessDeniedYaml('count', pattern, searchPath, forbiddenPath);
395
+ }
396
+ const forbiddenGlob = detectForbiddenRipgrepGlobs(caller, options.globs);
397
+ if (forbiddenGlob) {
398
+ return formatForbiddenSearchPathAccessDeniedYaml('count', pattern, searchPath, forbiddenGlob);
399
+ }
275
400
  const args = [...baseRgArgs(options, caller), '--count-matches', '--', pattern, searchPath];
276
401
  try {
277
402
  const { stdoutLines } = await runRgLines(args);
@@ -371,6 +496,14 @@ exports.ripgrepCountTool = {
371
496
  },
372
497
  };
373
498
  async function runRipgrepSnippets(caller, pattern, searchPath, options) {
499
+ const forbiddenPath = detectForbiddenRipgrepSearchPath(caller, searchPath);
500
+ if (forbiddenPath) {
501
+ return formatForbiddenSearchPathAccessDeniedYaml('snippets', pattern, searchPath, forbiddenPath);
502
+ }
503
+ const forbiddenGlob = detectForbiddenRipgrepGlobs(caller, options.globs);
504
+ if (forbiddenGlob) {
505
+ return formatForbiddenSearchPathAccessDeniedYaml('snippets', pattern, searchPath, forbiddenGlob);
506
+ }
374
507
  const args = [...baseRgArgs(options, caller), '--vimgrep', '--', pattern, searchPath];
375
508
  try {
376
509
  const { stdoutLines } = await runRgLines(args);
@@ -561,6 +694,14 @@ exports.ripgrepFixedTool = {
561
694
  };
562
695
  const DISALLOWED_RG_ARGS = new Set(['--pre', '--pre-glob']);
563
696
  async function runRipgrepSearch(caller, pattern, searchPath, rawRgArgs) {
697
+ const forbiddenPath = detectForbiddenRipgrepSearchPath(caller, searchPath);
698
+ if (forbiddenPath) {
699
+ return formatForbiddenSearchPathAccessDeniedYaml('snippets', pattern, searchPath, forbiddenPath);
700
+ }
701
+ const forbiddenInArgs = detectForbiddenRipgrepRawArgs(caller, rawRgArgs);
702
+ if (forbiddenInArgs) {
703
+ return formatForbiddenSearchPathAccessDeniedYaml('snippets', pattern, searchPath, forbiddenInArgs);
704
+ }
564
705
  for (const tok of rawRgArgs) {
565
706
  if (DISALLOWED_RG_ARGS.has(tok)) {
566
707
  return formatYamlCodeBlock(`status: error\nerror: DISALLOWED_ARG\nsummary: ${yamlQuote(`Disallowed rg arg: ${tok}`)}`);
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SHELL_TOOL_NAMES = void 0;
4
+ exports.isShellToolName = isShellToolName;
5
+ exports.listShellSpecialistMemberIds = listShellSpecialistMemberIds;
6
+ exports.SHELL_TOOL_NAMES = ['shell_cmd', 'stop_daemon', 'get_daemon_output'];
7
+ function isShellToolName(name) {
8
+ return exports.SHELL_TOOL_NAMES.includes(name);
9
+ }
10
+ function listShellSpecialistMemberIds(team) {
11
+ const out = [];
12
+ for (const id of team.shellSpecialists) {
13
+ const member = team.getMember(id);
14
+ if (!member)
15
+ continue;
16
+ if (member.hidden === true)
17
+ continue;
18
+ out.push(id);
19
+ }
20
+ return out;
21
+ }
@@ -2724,7 +2724,7 @@ function renderTeamManual(language) {
2724
2724
  '风格提醒:保持 `team.yaml` 的可读性。推荐用空行分隔段落/成员块,避免连续多行空行;每次修改后运行 `team_mgmt_validate_team_cfg({})` 以便在 Problems 面板看到错误与风格提醒。',
2725
2725
  '默认策略(可被用户覆盖):\n' +
2726
2726
  '1) 新增成员时,`diligence-push-max` 默认设为 `3`(除非用户明确要求其他值)。\n' +
2727
- '2) 切换成员的 LLM `provider/model` 时,应同步切换到与该 provider 习惯匹配的工具集(例如 Codex 风格 vs Dominds 原生工具),除非用户明确要求保留原工具集。',
2727
+ '2) 切换成员的 LLM `provider/model` 时,默认保留 `ws_read` / `ws_mod` 作为基线;当目标是 `provider: codex` 时,在基线上追加 `codex_style_tools`(而不是替代),除非用户明确要求其他组合。',
2728
2728
  '成员配置通过 prototype 继承 `member_defaults`(省略字段会继承默认值)。',
2729
2729
  '修改 provider/model 前请务必确认该 provider 可用(至少 env var 已配置)。可用 `team_mgmt_check_provider({ provider_key: \"<providerKey>\", model: \"\", all_models: false, live: false, max_models: 0 })` 做检查,避免把系统刷成板砖。',
2730
2730
  '想快速查看有哪些 provider / models / model_param_options:用 `team_mgmt_list_providers({})` 和 `team_mgmt_list_models({ provider_pattern: \"*\", model_pattern: \"*\" })`。',
@@ -2784,7 +2784,7 @@ function renderTeamManual(language) {
2784
2784
  'Per-role default models: set global defaults via `member_defaults.provider/model`, then override `members.<id>.provider/model` per member (e.g. use `gpt-5.2` by default, and `gpt-5.2-codex` for code-writing members).',
2785
2785
  'Model params (e.g. `reasoning_effort` / `verbosity` / `temperature`) must be nested under `member_defaults.model_params.codex.*` or `members.<id>.model_params.codex.*` (for the built-in `codex` provider). Do not put them directly under `member_defaults`/`members.<id>` root.',
2786
2786
  'Style reminder: keep `team.yaml` readable. Prefer single blank lines between sections/member blocks; avoid long runs of blank lines. Run `team_mgmt_validate_team_cfg({})` after edits to surface errors and style warnings in the Problems panel.',
2787
- 'Default policy (override only when requested):\n1) When adding a member, set `diligence-push-max` to `3` unless the user explicitly asks otherwise.\n2) When switching a member’s LLM `provider/model`, also switch to the provider-appropriate toolsets (Codex-style vs Dominds-native) unless the user explicitly asks to keep the existing toolsets.',
2787
+ 'Default policy (override only when requested):\n1) When adding a member, set `diligence-push-max` to `3` unless the user explicitly asks otherwise.\n2) When switching a member’s LLM `provider/model`, keep `ws_read` / `ws_mod` as the baseline; when the target is `provider: codex`, add `codex_style_tools` on top (not as a replacement), unless the user explicitly asks for a different combination.',
2788
2788
  'Deployment/org suggestion (optional): if you do not want a visible team manager, keep `team-mgmt` only on a hidden/shadow member and have a human trigger it when needed; Dominds does not require this organizational setup.',
2789
2789
  'Recommended editing workflow: use `team_mgmt_read_file({ path: \"team.yaml\", range: \"<start~end>\", max_lines: 0, show_linenos: true })` to find line numbers; for small edits, run `team_mgmt_prepare_file_range_edit({ path: \"team.yaml\", range: \"<line~range>\", existing_hunk_id: \"\", content: \"<new content>\" })` to get a diff (the tool returns hunk_id), then confirm with `team_mgmt_apply_file_modification({ hunk_id: \"<hunk_id>\" })`; to revise the same prepared diff, call `team_mgmt_prepare_file_range_edit({ path: \"team.yaml\", range: \"<line~range>\", existing_hunk_id: \"<hunk_id>\", content: \"<new content>\" })` again; if you truly need a full overwrite: first `team_mgmt_read_file({ path: \"team.yaml\", range: \"\", max_lines: 0, show_linenos: true })` and read total_lines/size_bytes from the YAML header, then use `team_mgmt_overwrite_entire_file({ path: \"team.yaml\", known_old_total_lines: <n>, known_old_total_bytes: <n>, content_format: \"\", content: \"...\" })`.',
2790
2790
  ])) +
@@ -3139,7 +3139,7 @@ async function renderToolsets(language) {
3139
3139
  '`control`:对话控制类工具属于“内建必备能力”,运行时会自动包含给所有成员;因此不需要(也不建议)在 `members.<id>.toolsets` 里显式列出,本页也默认不展示它。',
3140
3140
  '`diag`:诊断类工具集不应默认授予任何成员;仅当用户明确要求“诊断/排查/验证解析/流式分段”等能力时才添加。',
3141
3141
  '多数情况下推荐用 `members.<id>.toolsets` 做粗粒度授权;`members.<id>.tools` 更适合做少量补充/收敛。',
3142
- '按 provider 选择匹配的 toolsets:当 `provider: codex`(偏 Codex CLI 风格提示/工具名)时,优先给 `codex_style_tools`(`apply_patch`);如果还需要“读 rtws”,通常要再给 `os`(`shell_cmd`)并严格限制在少数专员成员手里。其他 provider 或采用 Dominds 原生工具习惯时,优先给 `ws_read` / `ws_mod`(txt prepare→apply 工作流:prepare_* → apply_file_modification)。',
3142
+ '按 provider 选择匹配的 toolsets:默认把 `ws_read` / `ws_mod` 作为通用基线;当 `provider: codex`(偏 Codex CLI 风格提示/工具名)时,在基线上追加 `codex_style_tools`(`apply_patch` 等),不是替换 `ws_read` / `ws_mod`。如果还需要“读/探测 rtws”,通常要再给 `os`(`shell_cmd`)并严格限制在少数专员成员手里。',
3143
3143
  '最佳实践:把 `os`(尤其 `shell_cmd`)只授予具备良好纪律/风控意识的人设成员(例如 “cmdr/ops”)。对不具备 shell 工具的成员,系统提示会明确要求其将 shell 执行委派给这类专员,并提供可审查的命令提案与理由。',
3144
3144
  '常见三种模式(示例写在 `.minds/team.yaml` 的 `members.<id>.toolsets` 下):',
3145
3145
  ])
@@ -3147,7 +3147,7 @@ async function renderToolsets(language) {
3147
3147
  '`control`: dialog-control tools are intrinsic and automatically included for all members at runtime; you do not need (and should not) list it under `members.<id>.toolsets`. It is omitted from the list below.',
3148
3148
  '`diag`: diagnostics tools should not be granted by default; only add it when the user explicitly asks for diagnostics/troubleshooting/streaming-parse verification.',
3149
3149
  'Typically use `members.<id>.toolsets` for coarse-grained access; use `members.<id>.tools` for a small number of additions/limits.',
3150
- 'Pick toolsets to match the provider: for `provider: codex` (Codex CLI-style prompts/tool names), prefer `codex_style_tools` (`apply_patch`); if you also need read the rtws”, you typically must grant `os` (`shell_cmd`) and keep it restricted to a small number of specialist operators. For other providers or when using Dominds-native tool habits, prefer `ws_read` / `ws_mod` (txt prepare→apply workflow: prepare_* → apply_file_modification).',
3150
+ 'Pick toolsets to match the provider: keep `ws_read` / `ws_mod` as the general baseline; for `provider: codex` (Codex CLI-style prompts/tool names), add `codex_style_tools` (`apply_patch`, etc.) on top rather than replacing `ws_read` / `ws_mod`. If you also need to read/probe the rtws, you typically must grant `os` (`shell_cmd`) and keep it restricted to a small number of specialist operators.',
3151
3151
  'Best practice: grant `os` (especially `shell_cmd`) only to a disciplined, risk-aware operator persona (e.g. “cmdr/ops”). For members without shell tools, the system prompt explicitly tells them to delegate shell execution to such a specialist, with a reviewable command proposal and justification.',
3152
3152
  'Three common patterns (in `.minds/team.yaml` under `members.<id>.toolsets`):',
3153
3153
  ]);
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.buildToolsetManualTools = buildToolsetManualTools;
4
+ exports.formatToolsetManualIntro = formatToolsetManualIntro;
5
+ const tool_names_1 = require("../mcp/tool-names");
6
+ const text_1 = require("../shared/i18n/text");
7
+ const runtime_language_1 = require("../shared/runtime-language");
8
+ const registry_1 = require("./registry");
9
+ function buildToolsetManualTools(options) {
10
+ const tools = [];
11
+ const toolNames = [];
12
+ const seen = new Set();
13
+ for (const toolsetName of options.toolsetNames) {
14
+ if (seen.has(toolsetName))
15
+ continue;
16
+ seen.add(toolsetName);
17
+ if (!(0, registry_1.getToolsetPromptI18n)(toolsetName)) {
18
+ continue;
19
+ }
20
+ const toolName = `man_${toolsetName}`;
21
+ if (!(0, tool_names_1.isValidProviderToolName)(toolName)) {
22
+ continue;
23
+ }
24
+ if (options.existingToolNames.has(toolName)) {
25
+ continue;
26
+ }
27
+ const tool = buildToolsetManualTool(toolsetName, toolName);
28
+ tools.push(tool);
29
+ toolNames.push(toolName);
30
+ options.existingToolNames.add(toolName);
31
+ }
32
+ return { tools, toolNames };
33
+ }
34
+ function formatToolsetManualIntro(language, toolNames) {
35
+ const names = toolNames.map((name) => `\`${name}\``).join(', ');
36
+ const calls = toolNames.map((name) => `\`${name}({})\``).join(', ');
37
+ if (toolNames.length === 0) {
38
+ return language === 'zh' ? '(无可用 toolset 手册)' : '(no toolset manuals available)';
39
+ }
40
+ return language === 'zh'
41
+ ? `手册:${names}(调用:${calls})`
42
+ : `Manuals: ${names} (call: ${calls})`;
43
+ }
44
+ function buildToolsetManualTool(toolsetName, toolName) {
45
+ return {
46
+ type: 'func',
47
+ name: toolName,
48
+ description: `Show manual for toolset '${toolsetName}'.`,
49
+ descriptionI18n: {
50
+ en: `Show manual for toolset '${toolsetName}'.`,
51
+ zh: `查看 toolset '${toolsetName}' 的使用手册。`,
52
+ },
53
+ parameters: {
54
+ type: 'object',
55
+ additionalProperties: false,
56
+ properties: {},
57
+ },
58
+ argsValidation: 'dominds',
59
+ async call() {
60
+ const language = (0, runtime_language_1.getWorkLanguage)();
61
+ const promptI18n = (0, registry_1.getToolsetPromptI18n)(toolsetName);
62
+ const prompt = (0, text_1.getTextForLanguage)({ i18n: promptI18n, fallback: '' }, language).trim();
63
+ if (prompt === '') {
64
+ return language === 'zh'
65
+ ? `未找到 toolset '${toolsetName}' 的说明。`
66
+ : `No manual available for toolset '${toolsetName}'.`;
67
+ }
68
+ const title = language === 'zh'
69
+ ? `**toolset 手册:${toolsetName}**`
70
+ : `**Toolset manual: ${toolsetName}**`;
71
+ return `${title}\n\n${prompt}`;
72
+ },
73
+ };
74
+ }
@@ -120,33 +120,33 @@ If you provided a regular file path (e.g. a \`.md\`), that is unexpected. Please
120
120
  return [
121
121
  `**差遣牒结构(封装差遣牒 \`*.tsk/\`):**`,
122
122
  `- 我们的差遣牒是一个 \`*.tsk/\` 目录,分为 3 个分段:\`goals\` / \`constraints\` / \`progress\`。`,
123
- `- 维护方式:每次 \`!?@change_mind\` 必须指定一个分段(\`!goals\` / \`!constraints\` / \`!progress\`);可在同一条消息中连续发出多个 \`!?@change_mind\` 来一次更新多个分段。`,
123
+ `- 维护方式:每次调用函数工具 \`change_mind\` 必须指定一个分段(selector: \`!goals\` / \`!constraints\` / \`!progress\`);可在同一轮中多次调用 \`change_mind\` 来一次更新多个分段。`,
124
124
  ``,
125
125
  `**分段状态:**`,
126
126
  `- \`goals.md\`:${goalsZh}`,
127
127
  `- \`constraints.md\`:${constraintsZh}`,
128
128
  `- \`progress.md\`:${progressZh}`,
129
129
  ``,
130
- `若某个分段缺失,请用 \`!?@change_mind\` 创建(不要用通用文件工具):`,
131
- `- \`!?@change_mind !goals\\n!?<content>\``,
132
- `- \`!?@change_mind !constraints\\n!?<content>\``,
133
- `- \`!?@change_mind !progress\\n!?<content>\``,
130
+ `若某个分段缺失,请用函数工具 \`change_mind\` 创建(不要用通用文件工具):`,
131
+ `- \`change_mind({\"selector\":\"!goals\",\"content\":\"...\"})\``,
132
+ `- \`change_mind({\"selector\":\"!constraints\",\"content\":\"...\"})\``,
133
+ `- \`change_mind({\"selector\":\"!progress\",\"content\":\"...\"})\``,
134
134
  ].join('\n');
135
135
  }
136
136
  return [
137
137
  `**Task Doc Constitution (Encapsulated \`*.tsk/\`):**`,
138
138
  `- Our Task Doc is a \`*.tsk/\` directory with exactly 3 sections: \`goals\` / \`constraints\` / \`progress\`.`,
139
- `- Maintenance: each \`!?@change_mind\` call must target one section (\`!goals\` / \`!constraints\` / \`!progress\`). You may include multiple \`!?@change_mind\` calls in a single message to update multiple sections.`,
139
+ `- Maintenance: each function tool call \`change_mind\` must target one section (selector: \`!goals\` / \`!constraints\` / \`!progress\`). You may call \`change_mind\` multiple times in a single turn to update multiple sections.`,
140
140
  ``,
141
141
  `**Sections:**`,
142
142
  `- \`goals.md\`: ${goalsStatus}`,
143
143
  `- \`constraints.md\`: ${constraintsStatus}`,
144
144
  `- \`progress.md\`: ${progressStatus}`,
145
145
  ``,
146
- `If any section is missing, create it with \`!?@change_mind\` (never via general file tools):`,
147
- `- \`!?@change_mind !goals\\n!?<content>\``,
148
- `- \`!?@change_mind !constraints\\n!?<content>\``,
149
- `- \`!?@change_mind !progress\\n!?<content>\``,
146
+ `If any section is missing, create it with the function tool \`change_mind\` (never via general file tools):`,
147
+ `- \`change_mind({\"selector\":\"!goals\",\"content\":\"...\"})\``,
148
+ `- \`change_mind({\"selector\":\"!constraints\",\"content\":\"...\"})\``,
149
+ `- \`change_mind({\"selector\":\"!progress\",\"content\":\"...\"})\``,
150
150
  ].join('\n');
151
151
  })();
152
152
  const effectiveDoc = (0, task_package_1.formatEffectiveTaskDocFromSections)(language, sections);
@@ -164,7 +164,7 @@ If you provided a regular file path (e.g. a \`.md\`), that is unexpected. Please
164
164
  ${statusBlock}
165
165
 
166
166
  ⚠️ **注意:** 差遣牒是封装的。不要用文件工具去读/写/列目录 \`*.tsk/\` 下的任何路径。
167
- 请用 \`!?@change_mind !goals\` / \`!?@change_mind !constraints\` / \`!?@change_mind !progress\` 来更新(每次调用只更新一个分段;你可以在同一条消息里写多个 \`!?@change_mind\` 调用来批量更新)。`,
167
+ 请用函数工具 \`change_mind\` 来更新(每次调用只更新一个分段;你可以在同一轮中多次调用来批量更新),例如:\`change_mind({\"selector\":\"!goals\",\"content\":\"...\"})\` / \`change_mind({\"selector\":\"!constraints\",\"content\":\"...\"})\` / \`change_mind({\"selector\":\"!progress\",\"content\":\"...\"})\`。`,
168
168
  };
169
169
  }
170
170
  return {
@@ -177,7 +177,7 @@ ${statusBlock}
177
177
  ${statusBlock}
178
178
 
179
179
  ⚠️ **Note:** Task Docs are encapsulated. Do not use file tools to read/write/list anything under \`*.tsk/\`.
180
- Use \`!?@change_mind !goals\` / \`!?@change_mind !constraints\` / \`!?@change_mind !progress\` to update (each call updates one section; you may include multiple \`!?@change_mind\` calls in a single message to batch updates).`,
180
+ Use the function tool \`change_mind\` to update (each call updates one section; you may call it multiple times in a single turn to batch updates), e.g. \`change_mind({\"selector\":\"!goals\",\"content\":\"...\"})\` / \`change_mind({\"selector\":\"!constraints\",\"content\":\"...\"})\` / \`change_mind({\"selector\":\"!progress\",\"content\":\"...\"})\`.`,
181
181
  };
182
182
  }
183
183
  if (language === 'zh') {
@@ -194,9 +194,9 @@ ${statusBlock}
194
194
  ${effectiveDoc}
195
195
  ---
196
196
 
197
- *用 \`!?@change_mind !goals\` / \`!?@change_mind !constraints\` / \`!?@change_mind !progress\` 来替换分段(每次调用只替换一个分段;你可以在同一条消息里写多个 \`!?@change_mind\` 调用来批量替换)。*
197
+ *用函数工具 \`change_mind\` 来替换分段(每次调用只替换一个分段;你可以在同一轮中多次调用来批量替换)。*
198
198
 
199
- 指令:不要对 \`*.tsk/\` 下的任何路径调用通用文件工具(\`!?@read_file\`, \`!?@replace_file_contents\`, \`!?@plan_file_modification\`, \`!?@apply_file_modification\`, \`!?@list_dir\`, \`!?@rm_file\`, \`!?@rm_dir\`)。差遣牒状态只能通过显式的差遣牒操作进行管理。`,
199
+ 指令:不要对 \`*.tsk/\` 下的任何路径调用通用文件工具(\`read_file\`, \`overwrite_entire_file\`, \`preview_file_modification\`, \`apply_file_modification\`, \`list_dir\`, \`rm_file\`, \`rm_dir\`)。差遣牒状态只能通过显式的差遣牒操作进行管理。`,
200
200
  };
201
201
  }
202
202
  return {
@@ -212,9 +212,9 @@ ${statusBlock}
212
212
  ${effectiveDoc}
213
213
  ---
214
214
 
215
- *Use \`!?@change_mind !goals\` / \`!?@change_mind !constraints\` / \`!?@change_mind !progress\` to replace sections (each call replaces one section; you may include multiple \`!?@change_mind\` calls in a single message to batch replacements).*
215
+ *Use the function tool \`change_mind\` to replace sections (each call replaces one section; you may call it multiple times in a single turn to batch replacements).*
216
216
 
217
- Directive: Do not invoke any general file tools (\`!?@read_file\`, \`!?@replace_file_contents\`, \`!?@plan_file_modification\`, \`!?@apply_file_modification\`, \`!?@list_dir\`, \`!?@rm_file\`, \`!?@rm_dir\`) on any path under \`*.tsk/\`. Task package state is managed only through explicit task-doc actions.`,
217
+ Directive: Do not invoke any general file tools (\`read_file\`, \`overwrite_entire_file\`, \`preview_file_modification\`, \`apply_file_modification\`, \`list_dir\`, \`rm_file\`, \`rm_dir\`) on any path under \`*.tsk/\`. Task package state is managed only through explicit task-doc actions.`,
218
218
  };
219
219
  }
220
220
  catch (error) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dominds",
3
- "version": "0.6.2",
3
+ "version": "0.6.4",
4
4
  "description": "in-tree developer team with self-improving mindsets",
5
5
  "type": "commonjs",
6
6
  "private": false,
@@ -1,3 +0,0 @@
1
- You are the commander, in charge of os shell command execution.
2
-
3
- Be caucious to execute dangerous/destructive commands, ask human confirmation when not sure, but never bother them for daily trivialities.