dominds 1.20.2 → 1.20.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/docs/OEC-philosophy.md +1 -1
  2. package/dist/minds/load.js +1 -0
  3. package/dist/minds/minds-i18n.js +2 -2
  4. package/dist/minds/system-prompt-parts.js +7 -7
  5. package/dist/server/api-routes.js +65 -0
  6. package/dist/server/static-server.js +1 -0
  7. package/dist/tools/builtins.js +2 -0
  8. package/dist/tools/ctrl.d.ts +2 -0
  9. package/dist/tools/ctrl.js +111 -16
  10. package/dist/tools/prompts/control/en/errors.md +2 -2
  11. package/dist/tools/prompts/control/en/index.md +1 -1
  12. package/dist/tools/prompts/control/en/principles.md +5 -4
  13. package/dist/tools/prompts/control/en/tools.md +19 -3
  14. package/dist/tools/prompts/control/zh/errors.md +2 -2
  15. package/dist/tools/prompts/control/zh/index.md +1 -1
  16. package/dist/tools/prompts/control/zh/principles.md +5 -4
  17. package/dist/tools/prompts/control/zh/tools.md +19 -3
  18. package/dist/tools/prompts/personal_memory/en/principles.md +1 -1
  19. package/dist/tools/prompts/personal_memory/zh/principles.md +1 -1
  20. package/dist/tools/prompts/team_memory/en/principles.md +1 -1
  21. package/dist/tools/prompts/team_memory/zh/principles.md +1 -1
  22. package/dist/tools/team_mgmt.js +2 -2
  23. package/dist/utils/task-package.d.ts +9 -0
  24. package/dist/utils/task-package.js +29 -4
  25. package/dist/utils/taskdoc-search-worker-client.d.ts +12 -0
  26. package/dist/utils/taskdoc-search-worker-client.js +320 -0
  27. package/dist/utils/taskdoc-search-worker.d.ts +1 -0
  28. package/dist/utils/taskdoc-search-worker.js +42 -0
  29. package/dist/utils/taskdoc-search.d.ts +28 -7
  30. package/dist/utils/taskdoc-search.js +62 -15
  31. package/package.json +4 -4
  32. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js → _basePickBy-B2wYdQcR.js} +3 -3
  33. package/webapp/dist/assets/{_basePickBy-B7M9Q0Fa.js.map → _basePickBy-B2wYdQcR.js.map} +1 -1
  34. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js → _baseUniq-zKoHgk38.js} +2 -2
  35. package/webapp/dist/assets/{_baseUniq-DAeYoL6j.js.map → _baseUniq-zKoHgk38.js.map} +1 -1
  36. package/webapp/dist/assets/{arc-Bh4nDbNR.js → arc-D8bQ-Nzm.js} +2 -2
  37. package/webapp/dist/assets/{arc-Bh4nDbNR.js.map → arc-D8bQ-Nzm.js.map} +1 -1
  38. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js → architectureDiagram-2XIMDMQ5-BiimGQW5.js} +7 -7
  39. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map → architectureDiagram-2XIMDMQ5-BiimGQW5.js.map} +1 -1
  40. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js → blockDiagram-WCTKOSBZ-BXPbS_wx.js} +7 -7
  41. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-CxIWLtpt.js.map → blockDiagram-WCTKOSBZ-BXPbS_wx.js.map} +1 -1
  42. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js → c4Diagram-IC4MRINW-BZC0c1Ke.js} +3 -3
  43. package/webapp/dist/assets/{c4Diagram-IC4MRINW-1qErOIgG.js.map → c4Diagram-IC4MRINW-BZC0c1Ke.js.map} +1 -1
  44. package/webapp/dist/assets/{channel-DkgZHNUe.js → channel-BP3Qyxui.js} +2 -2
  45. package/webapp/dist/assets/{channel-DkgZHNUe.js.map → channel-BP3Qyxui.js.map} +1 -1
  46. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js → chunk-4BX2VUAB-BXABHFQC.js} +2 -2
  47. package/webapp/dist/assets/{chunk-4BX2VUAB-BmdMbU9v.js.map → chunk-4BX2VUAB-BXABHFQC.js.map} +1 -1
  48. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js → chunk-55IACEB6-KdM20zpJ.js} +2 -2
  49. package/webapp/dist/assets/{chunk-55IACEB6-D6LDTDBy.js.map → chunk-55IACEB6-KdM20zpJ.js.map} +1 -1
  50. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js → chunk-FMBD7UC4-B2T04oKB.js} +2 -2
  51. package/webapp/dist/assets/{chunk-FMBD7UC4-C-BdCe4C.js.map → chunk-FMBD7UC4-B2T04oKB.js.map} +1 -1
  52. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js → chunk-JSJVCQXG-Bz-hhsBJ.js} +2 -2
  53. package/webapp/dist/assets/{chunk-JSJVCQXG-WA_BLIm9.js.map → chunk-JSJVCQXG-Bz-hhsBJ.js.map} +1 -1
  54. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js → chunk-KX2RTZJC-B1TcA_CH.js} +2 -2
  55. package/webapp/dist/assets/{chunk-KX2RTZJC-CA7sDJO5.js.map → chunk-KX2RTZJC-B1TcA_CH.js.map} +1 -1
  56. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js → chunk-NQ4KR5QH-BwsfKfyl.js} +4 -4
  57. package/webapp/dist/assets/{chunk-NQ4KR5QH-wlvxalE3.js.map → chunk-NQ4KR5QH-BwsfKfyl.js.map} +1 -1
  58. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js → chunk-QZHKN3VN-BX453Nua.js} +2 -2
  59. package/webapp/dist/assets/{chunk-QZHKN3VN-Bo1VMcph.js.map → chunk-QZHKN3VN-BX453Nua.js.map} +1 -1
  60. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js → chunk-WL4C6EOR-COCTYZ-S.js} +6 -6
  61. package/webapp/dist/assets/{chunk-WL4C6EOR-B-Pk44be.js.map → chunk-WL4C6EOR-COCTYZ-S.js.map} +1 -1
  62. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js → classDiagram-VBA2DB6C-aWgCJGiX.js} +7 -7
  63. package/webapp/dist/assets/{classDiagram-VBA2DB6C-BqKuyb49.js.map → classDiagram-VBA2DB6C-aWgCJGiX.js.map} +1 -1
  64. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js → classDiagram-v2-RAHNMMFH-aWgCJGiX.js} +7 -7
  65. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-BqKuyb49.js.map → classDiagram-v2-RAHNMMFH-aWgCJGiX.js.map} +1 -1
  66. package/webapp/dist/assets/{clone-BX5z8WVZ.js → clone-UCWLNsJ4.js} +2 -2
  67. package/webapp/dist/assets/{clone-BX5z8WVZ.js.map → clone-UCWLNsJ4.js.map} +1 -1
  68. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js → cose-bilkent-S5V4N54A-Blf43_-z.js} +2 -2
  69. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-s11SgN.js.map → cose-bilkent-S5V4N54A-Blf43_-z.js.map} +1 -1
  70. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js → dagre-KLK3FWXG-BLTVAduG.js} +7 -7
  71. package/webapp/dist/assets/{dagre-KLK3FWXG-DmQFV2qK.js.map → dagre-KLK3FWXG-BLTVAduG.js.map} +1 -1
  72. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js → diagram-E7M64L7V-eHyGJiW2.js} +8 -8
  73. package/webapp/dist/assets/{diagram-E7M64L7V-QRaBfST8.js.map → diagram-E7M64L7V-eHyGJiW2.js.map} +1 -1
  74. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js → diagram-IFDJBPK2-BzZS2fFL.js} +7 -7
  75. package/webapp/dist/assets/{diagram-IFDJBPK2-lrWn1Obo.js.map → diagram-IFDJBPK2-BzZS2fFL.js.map} +1 -1
  76. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js → diagram-P4PSJMXO-CUUSxkwu.js} +7 -7
  77. package/webapp/dist/assets/{diagram-P4PSJMXO-sTU7Hh-Y.js.map → diagram-P4PSJMXO-CUUSxkwu.js.map} +1 -1
  78. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js → erDiagram-INFDFZHY-DF_doi5_.js} +5 -5
  79. package/webapp/dist/assets/{erDiagram-INFDFZHY-Cx6jc9Wq.js.map → erDiagram-INFDFZHY-DF_doi5_.js.map} +1 -1
  80. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js → flowDiagram-PKNHOUZH-YcqCG3mt.js} +7 -7
  81. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-DfGI49Dz.js.map → flowDiagram-PKNHOUZH-YcqCG3mt.js.map} +1 -1
  82. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js → ganttDiagram-A5KZAMGK-BZNRb7SP.js} +3 -3
  83. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-nrcHWWaM.js.map → ganttDiagram-A5KZAMGK-BZNRb7SP.js.map} +1 -1
  84. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js → gitGraphDiagram-K3NZZRJ6-nAdujBg_.js} +8 -8
  85. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map → gitGraphDiagram-K3NZZRJ6-nAdujBg_.js.map} +1 -1
  86. package/webapp/dist/assets/{graph-R5G-y8tB.js → graph-Cv-ZJ4Fl.js} +3 -3
  87. package/webapp/dist/assets/{graph-R5G-y8tB.js.map → graph-Cv-ZJ4Fl.js.map} +1 -1
  88. package/webapp/dist/assets/{index--fy89xGh.js → index-Dhf_wAfo.js} +332 -134
  89. package/webapp/dist/assets/index-Dhf_wAfo.js.map +1 -0
  90. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js → infoDiagram-LFFYTUFH-CwtMOnIR.js} +6 -6
  91. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-PIoZHr7s.js.map → infoDiagram-LFFYTUFH-CwtMOnIR.js.map} +1 -1
  92. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js → ishikawaDiagram-PHBUUO56-Cfb8MPoG.js} +2 -2
  93. package/webapp/dist/assets/{ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map → ishikawaDiagram-PHBUUO56-Cfb8MPoG.js.map} +1 -1
  94. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js → journeyDiagram-4ABVD52K-u0xpmaEL.js} +5 -5
  95. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-C2qidjQ5.js.map → journeyDiagram-4ABVD52K-u0xpmaEL.js.map} +1 -1
  96. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js → kanban-definition-K7BYSVSG-BuwDgdXi.js} +3 -3
  97. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-Du0TC8WS.js.map → kanban-definition-K7BYSVSG-BuwDgdXi.js.map} +1 -1
  98. package/webapp/dist/assets/{layout-VmEo1OEB.js → layout-DwFR5fz7.js} +5 -5
  99. package/webapp/dist/assets/{layout-VmEo1OEB.js.map → layout-DwFR5fz7.js.map} +1 -1
  100. package/webapp/dist/assets/{linear-B662YHAc.js → linear-DK9kuyt6.js} +2 -2
  101. package/webapp/dist/assets/{linear-B662YHAc.js.map → linear-DK9kuyt6.js.map} +1 -1
  102. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js → mindmap-definition-YRQLILUH-BP26yHUE.js} +4 -4
  103. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-D7arZj95.js.map → mindmap-definition-YRQLILUH-BP26yHUE.js.map} +1 -1
  104. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js → pieDiagram-SKSYHLDU-Dg05ljR9.js} +8 -8
  105. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DvjPP4PA.js.map → pieDiagram-SKSYHLDU-Dg05ljR9.js.map} +1 -1
  106. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js → quadrantDiagram-337W2JSQ-BZwWQDeQ.js} +3 -3
  107. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-B_JUGMj_.js.map → quadrantDiagram-337W2JSQ-BZwWQDeQ.js.map} +1 -1
  108. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js → requirementDiagram-Z7DCOOCP-IZuN0Vt3.js} +4 -4
  109. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map → requirementDiagram-Z7DCOOCP-IZuN0Vt3.js.map} +1 -1
  110. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js → sankeyDiagram-WA2Y5GQK-BsVp8N4k.js} +2 -2
  111. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map → sankeyDiagram-WA2Y5GQK-BsVp8N4k.js.map} +1 -1
  112. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js → sequenceDiagram-2WXFIKYE-BkAT5uON.js} +4 -4
  113. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map → sequenceDiagram-2WXFIKYE-BkAT5uON.js.map} +1 -1
  114. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js → stateDiagram-RAJIS63D-qk_ajPAy.js} +9 -9
  115. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9b1mN8-.js.map → stateDiagram-RAJIS63D-qk_ajPAy.js.map} +1 -1
  116. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js → stateDiagram-v2-FVOUBMTO-CNtP8Lfm.js} +5 -5
  117. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map → stateDiagram-v2-FVOUBMTO-CNtP8Lfm.js.map} +1 -1
  118. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js → timeline-definition-YZTLITO2-DLU-Pyr1.js} +3 -3
  119. package/webapp/dist/assets/{timeline-definition-YZTLITO2-CkyKUY7A.js.map → timeline-definition-YZTLITO2-DLU-Pyr1.js.map} +1 -1
  120. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js → treemap-KZPCXAKY-hHk6fxaq.js} +5 -5
  121. package/webapp/dist/assets/{treemap-KZPCXAKY-CZd09kF-.js.map → treemap-KZPCXAKY-hHk6fxaq.js.map} +1 -1
  122. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js → vennDiagram-LZ73GAT5-CM1zd5GO.js} +2 -2
  123. package/webapp/dist/assets/{vennDiagram-LZ73GAT5-BxVF5Olo.js.map → vennDiagram-LZ73GAT5-CM1zd5GO.js.map} +1 -1
  124. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js → xychartDiagram-JWTSCODW-CccDexUn.js} +3 -3
  125. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BRwRloPc.js.map → xychartDiagram-JWTSCODW-CccDexUn.js.map} +1 -1
  126. package/webapp/dist/index.html +1 -1
  127. package/webapp/dist/assets/index--fy89xGh.js.map +0 -1
@@ -169,7 +169,7 @@ Fast-paced clearance is crucial in agentic DevOps working. OEC principles transl
169
169
 
170
170
  ### **Dialog Course Management**
171
171
 
172
- - **Daily Reset**: Start new dialog rounds with a Taskdoc that’s been brought up to date (it’s the live coordination bulletin board) and fresh chat logs
172
+ - **Daily Reset**: Start new courses with a Taskdoc that’s been brought up to date (it’s the live coordination bulletin board) and fresh chat logs
173
173
  - **Clear Context**: Ensure all agents work with optimal clarity and updated information
174
174
  - **Immediate Resolution**: Address issues and anomalies within the same operational cycle
175
175
 
@@ -222,6 +222,7 @@ async function loadAgentMinds(agentId, dialog, options) {
222
222
  if (dialog === undefined || dialog.askerDialog === undefined) {
223
223
  intrinsicFuncTools.push(ctrl_1.mindMoreTool);
224
224
  intrinsicFuncTools.push(ctrl_1.changeMindTool);
225
+ intrinsicFuncTools.push(ctrl_1.neverMindTool);
225
226
  }
226
227
  const agentTools = (() => {
227
228
  const out = [...baseAgentTools];
@@ -54,7 +54,7 @@ function taskdocCanonicalCopy(language) {
54
54
  '**Taskdoc 封装与访问限制**',
55
55
  '',
56
56
  '- 任何 `.tsk/` 目录及其子路径(`**/*.tsk/**`)都是封装状态:禁止使用任何通用文件工具读取/写入/列目录(例如 `read_file` / `write_file` / `list_dir` 等)。',
57
- '- 更新 Taskdoc 只能使用函数工具 `mind_more` / `change_mind`:少量新增用 `mind_more` 追加(默认 progress),需要删除陈旧项、重排或压缩时用 `change_mind` 整章替换。',
57
+ '- 更新 Taskdoc 只能使用函数工具 `mind_more` / `change_mind` / `never_mind`:少量新增用 `mind_more` 追加(默认 progress),需要删除陈旧项、重排或压缩时用 `change_mind` 整章替换,确需删除整章文件时用 `never_mind`。',
58
58
  '- 读取“不会自动注入上下文”的额外章节,只能使用函数工具 `recall_taskdoc({ category, selector })`。',
59
59
  '',
60
60
  '**Taskdoc 自动注入规则(系统提示)**',
@@ -70,7 +70,7 @@ function taskdocCanonicalCopy(language) {
70
70
  '**Taskdoc encapsulation & access restrictions**',
71
71
  '',
72
72
  '- Any `.tsk/` directory and its subpaths (`**/*.tsk/**`) are encapsulated state: general file tools MUST NOT read/write/list them (e.g. `read_file` / `write_file` / `list_dir`).',
73
- '- Taskdoc updates MUST go through `mind_more` / `change_mind`: use `mind_more` for small append-only additions (defaults to progress), and use `change_mind` for full-section replacement when cleanup, reordering, or compression is needed.',
73
+ '- Taskdoc updates MUST go through `mind_more` / `change_mind` / `never_mind`: use `mind_more` for small append-only additions (defaults to progress), use `change_mind` for full-section replacement when cleanup, reordering, or compression is needed, and use `never_mind` when a whole section file should be deleted.',
74
74
  '- To read extra sections that are NOT auto-injected, use the function tool `recall_taskdoc({ category, selector })`.',
75
75
  '',
76
76
  '**Taskdoc auto-injection rules (system prompt)**',
@@ -181,7 +181,7 @@ function getMemoryPromptCopy(ctx) {
181
181
  taskdocSemanticsLine: '- 章节语义约定:`progress` 是全队共享、准实时、可扫读的任务公告牌,用来记录当前有效状态、关键决策、下一步与仍成立阻塞;不是流水账,也不是个人工作记录。`goals` / `constraints` 是较稳定的任务契约;每次更新都必须保留仍然有效的他人条目。',
182
182
  taskdocSectionReplaceLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
183
183
  ? '- 当前处于支线对话的上下文健康处置态:本程不要维护差遣牒,也不要整理差遣牒更新提案;把下一程需要恢复的细节写入足够详尽的接续包提醒项。'
184
- : `- 更新差遣牒时:少量新增条目可用 \`mind_more\` 追加(默认 progress);需要删除陈旧项、重排结构或压缩时,用 \`change_mind\` 整章替换并先对照“上下文中注入的当前内容”做合并;禁止覆盖/抹掉他人条目;自己负责维护的条目必须标注责任人(例如 \`- [owner:@${ctx.agentId}] ...\` 或用 \`### @${ctx.agentId}\` 分块)。`,
184
+ : `- 更新差遣牒时:少量新增条目可用 \`mind_more\` 追加(默认 progress);需要删除陈旧项、重排结构或压缩时,用 \`change_mind\` 整章替换并先对照“上下文中注入的当前内容”做合并;需要删除整章文件时用 \`never_mind\`;禁止覆盖/抹掉他人条目;自己负责维护的条目必须标注责任人(例如 \`- [owner:@${ctx.agentId}] ...\` 或用 \`### @${ctx.agentId}\` 分块)。`,
185
185
  progressLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
186
186
  ? '- 当前处于支线对话的上下文健康处置态:本程不更新 `progress`;只把下一程接续所需信息写入提醒项。'
187
187
  : '- 更新 `progress` 时:它必须始终是可供全队扫读的完整当前快照,而不是只追加自己这一轮的零散笔记。',
@@ -193,7 +193,7 @@ function getMemoryPromptCopy(ctx) {
193
193
  teamMemoryLine: '- 团队记忆:稳定的团队约定/工程规约(跨任务共享)。',
194
194
  personalMemoryLine: '- 个人记忆:稳定的个人习惯/偏好与职责域知识;记忆会在每次生成时自动注入上下文,应保持少量且准确(关键文档/代码的精确路径 + 最小必要事实)。不要记录具体任务状态。',
195
195
  sideDialogDutyLine: ctx.contextHealthPromptMode === 'normal'
196
- ? `你当前处于支线对话:此处不允许 \`mind_more\` / \`change_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出要追加的条目或已合并好的“新全文/替换稿”。不要声称已更新,除非看到回执。`
196
+ ? `你当前处于支线对话:此处不允许 \`mind_more\` / \`change_mind\` / \`never_mind\`。当你判断需要更新差遣牒(尤其是 progress 公告牌)时,请在合适时机直接诉请差遣牒维护人 \`@${ctx.taskdocMaintainerId}\` 执行更新,并给出要追加的条目、已合并好的“新全文/替换稿”,或要删除的章节。不要声称已更新,除非看到回执。`
197
197
  : '你当前处于支线对话,且上下文已进入吃紧/告急处置态:本程不要维护差遣牒,也不要整理差遣牒更新提案。请把下一程需要恢复的讨论细节、定位、验证方式和临时信息写入足够详尽的接续包提醒项。',
198
198
  mainDialogDutyLine: '你当前处于主线对话:你负责综合维护全队共享差遣牒(尤其是 progress 公告牌)。当队友/支线对话提出更新建议时,及时合并、压缩并保持清晰。',
199
199
  teammateTellaskRoundDoneLine: `队友诉请重要语义:当你在诉请者上下文中收到带${runtimeMarkers.finalCompleted}标记的回贴,表示该轮诉请已经结束;对方不会继续执行同一轮诉请。此时如果目标未达成,“等待”是错误的:必须显式发起新一轮 tellask 才能继续推进。`,
@@ -202,7 +202,7 @@ function getMemoryPromptCopy(ctx) {
202
202
  sideDialogWorkflowLine: ctx.contextHealthPromptMode === 'normal'
203
203
  ? `工作流:先做事 → 再提炼(\`update_reminder\`;必要时整理差遣牒追加条目/更新提案并诉请 \`@${ctx.taskdocMaintainerId}\` 合并写入)→ 然后 \`clear_mind\` 清空噪音。`
204
204
  : '工作流:停止扩张上下文 → 维护足够详尽的接续包提醒项(`add_reminder` 或 `update_reminder`,长度没有技术限制)→ 然后 `clear_mind` 开启新一程。',
205
- mainDialogWorkflowLine: '工作流:先做事 → 再提炼(`update_reminder` + `mind_more(progress)`;需要压缩/删旧时用 `change_mind(progress)`)→ 然后 `clear_mind` 清空噪音。',
205
+ mainDialogWorkflowLine: '工作流:先做事 → 再提炼(`update_reminder` + `mind_more(progress)`;需要压缩/删旧时用 `change_mind(progress)`;要删除整章文件时用 `never_mind`)→ 然后 `clear_mind` 清空噪音。',
206
206
  contextHealthLine: contextHealthLineZh,
207
207
  taskdocLogLine: taskdocLogLineZh,
208
208
  };
@@ -215,7 +215,7 @@ function getMemoryPromptCopy(ctx) {
215
215
  taskdocSemanticsLine: '- Section semantics: `progress` is the team-shared, quasi-real-time, scannable task bulletin board for current effective state, key decisions, next steps, and still-active blockers; it is not a raw log or personal work record. `goals` / `constraints` are the more stable task contract; every update must preserve still-valid entries from others.',
216
216
  taskdocSectionReplaceLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
217
217
  ? '- Current mode is context-health remediation in a Side Dialog: do not maintain Taskdoc and do not draft Taskdoc update proposals in this course; put resume-critical details into sufficiently detailed continuation-package reminders.'
218
- : `- When updating Taskdoc: use \`mind_more\` for small append-only additions (defaults to progress); when stale entries must be removed, reordered, or compressed, use \`change_mind\` for a full-section replacement based on the current injected content; do not overwrite other contributors; add an explicit owner tag for entries you maintain (e.g., \`- [owner:@${ctx.agentId}] ...\` or a \`### @${ctx.agentId}\` block).`,
218
+ : `- When updating Taskdoc: use \`mind_more\` for small append-only additions (defaults to progress); when stale entries must be removed, reordered, or compressed, use \`change_mind\` for a full-section replacement based on the current injected content; when a whole section file should be removed, use \`never_mind\`; do not overwrite other contributors; add an explicit owner tag for entries you maintain (e.g., \`- [owner:@${ctx.agentId}] ...\` or a \`### @${ctx.agentId}\` block).`,
219
219
  progressLine: ctx.isSideDialog && ctx.contextHealthPromptMode !== 'normal'
220
220
  ? '- Current mode is context-health remediation in a Side Dialog: do not update `progress` in this course; put resume-critical information into reminders only.'
221
221
  : '- When updating `progress`, keep it as a complete, team-scannable current snapshot instead of appending only your own latest notes.',
@@ -227,16 +227,16 @@ function getMemoryPromptCopy(ctx) {
227
227
  teamMemoryLine: '- Team memory: stable shared conventions (cross-task).',
228
228
  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.',
229
229
  sideDialogDutyLine: ctx.contextHealthPromptMode === 'normal'
230
- ? `You are currently in a Side Dialog: \`mind_more\` / \`change_mind\` are not allowed here. When Taskdoc should be updated (especially the shared progress bulletin board), tellask the Taskdoc maintainer \`@${ctx.taskdocMaintainerId}\` with entries to append or a fully merged replacement draft. Do not claim it is updated until you see a receipt.`
230
+ ? `You are currently in a Side Dialog: \`mind_more\` / \`change_mind\` / \`never_mind\` are not allowed here. When Taskdoc should be updated (especially the shared progress bulletin board), tellask the Taskdoc maintainer \`@${ctx.taskdocMaintainerId}\` with entries to append, a fully merged replacement draft, or the section to delete. Do not claim it is updated until you see a receipt.`
231
231
  : 'You are currently in a Side Dialog under caution/critical context-health remediation: do not maintain Taskdoc and do not draft Taskdoc update proposals in this course. Put discussion details, pointers, verification method, and volatile resume information into sufficiently detailed continuation-package reminders.',
232
232
  mainDialogDutyLine: '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/Side Dialogs promptly and keep it concise.',
233
233
  teammateTellaskRoundDoneLine: `Teammate Tellask semantics: when you receive a tellasker reply with the ${runtimeMarkers.finalCompleted} marker, that Tellask round is finished; the tellaskee 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.`,
234
234
  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.',
235
235
  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.`,
236
236
  sideDialogWorkflowLine: ctx.contextHealthPromptMode === 'normal'
237
- ? `Workflow: do work → distill (\`update_reminder\`; when Taskdoc needs updates, draft append entries or a merged replacement and ask \`@${ctx.taskdocMaintainerId}\`) → then \`clear_mind\` to drop noise.`
237
+ ? `Workflow: do work → distill (\`update_reminder\`; when Taskdoc needs updates, draft append entries, a merged replacement, or a section deletion and ask \`@${ctx.taskdocMaintainerId}\`) → then \`clear_mind\` to drop noise.`
238
238
  : 'Workflow: stop expanding context → maintain sufficiently detailed continuation-package reminders (`add_reminder` or `update_reminder`, with no technical length limit) → then `clear_mind` to start a new course.',
239
- mainDialogWorkflowLine: 'Workflow: do work → distill (`update_reminder` + `mind_more(progress)`; use `change_mind(progress)` when compression/deletion is needed) → then `clear_mind` to drop noise.',
239
+ mainDialogWorkflowLine: 'Workflow: do work → distill (`update_reminder` + `mind_more(progress)`; use `change_mind(progress)` when compression/deletion is needed; use `never_mind` when removing a whole section file) → then `clear_mind` to drop noise.',
240
240
  contextHealthLine: contextHealthLineEn,
241
241
  taskdocLogLine: taskdocLogLineEn,
242
242
  };
@@ -45,6 +45,7 @@ exports.handleApiRoute = handleApiRoute;
45
45
  */
46
46
  const diligence_1 = require("@longrun-ai/kernel/diligence");
47
47
  const language_1 = require("@longrun-ai/kernel/types/language");
48
+ const html_1 = require("@longrun-ai/kernel/utils/html");
48
49
  const time_1 = require("@longrun-ai/kernel/utils/time");
49
50
  const promises_1 = __importDefault(require("fs/promises"));
50
51
  const path = __importStar(require("path"));
@@ -62,6 +63,7 @@ const team_1 = require("../team");
62
63
  const tool_availability_1 = require("../tool-availability");
63
64
  const id_1 = require("../utils/id");
64
65
  const taskdoc_search_1 = require("../utils/taskdoc-search");
66
+ const taskdoc_search_worker_client_1 = require("../utils/taskdoc-search-worker-client");
65
67
  const create_dialog_contract_1 = require("./create-dialog-contract");
66
68
  const dominds_self_update_1 = require("./dominds-self-update");
67
69
  const mime_types_1 = require("./mime-types");
@@ -1300,6 +1302,9 @@ async function handleApiRoute(req, res, pathname, context) {
1300
1302
  return await handleGetDialogArtifact(req, res, { rootId, selfId }, status);
1301
1303
  }
1302
1304
  // Taskdocs endpoint
1305
+ if (pathname === '/api/task-documents/suggestions' && req.method === 'GET') {
1306
+ return await handleGetTaskDocumentSuggestions(req, res);
1307
+ }
1303
1308
  if (pathname === '/api/task-documents' && req.method === 'GET') {
1304
1309
  return await handleGetTaskDocuments(res);
1305
1310
  }
@@ -2869,6 +2874,66 @@ async function handleGetTaskDocuments(res) {
2869
2874
  return true;
2870
2875
  }
2871
2876
  }
2877
+ function renderTaskDocumentSuggestionHtml(suggestions) {
2878
+ return suggestions
2879
+ .map((doc, index) => {
2880
+ const showName = doc.name.trim() !== '' && doc.name !== doc.relativePath;
2881
+ const nameHtml = showName ? `<div class="suggestion-name">${(0, html_1.escapeHtml)(doc.name)}</div>` : '';
2882
+ return `<div class="suggestion" data-index="${String(index)}"><div class="suggestion-path">${(0, html_1.escapeHtml)(doc.relativePath)}</div>${nameHtml}</div>`;
2883
+ })
2884
+ .join('');
2885
+ }
2886
+ async function handleGetTaskDocumentSuggestions(req, res) {
2887
+ try {
2888
+ const urlObj = new URL(req.url ?? '', 'http://127.0.0.1');
2889
+ const query = (urlObj.searchParams.get('q') ?? '').trim();
2890
+ const workerPayload = {
2891
+ rootDir: '.',
2892
+ query,
2893
+ limit: 50,
2894
+ };
2895
+ const requestKey = (0, taskdoc_search_worker_client_1.buildTaskDocumentSuggestionRequestKey)(workerPayload);
2896
+ const abortController = new AbortController();
2897
+ res.once('close', () => {
2898
+ if (!res.writableEnded)
2899
+ abortController.abort();
2900
+ });
2901
+ const result = await (0, taskdoc_search_worker_client_1.searchTaskDocumentSuggestionsInWorker)(workerPayload, {
2902
+ signal: abortController.signal,
2903
+ });
2904
+ if (abortController.signal.aborted || res.writableEnded)
2905
+ return true;
2906
+ if (result.kind === 'error') {
2907
+ log.error('Failed to search taskdoc suggestions', new Error(result.errorText), {
2908
+ query,
2909
+ });
2910
+ const payload = {
2911
+ success: false,
2912
+ error: result.errorText,
2913
+ };
2914
+ respondJson(res, 500, payload);
2915
+ return true;
2916
+ }
2917
+ const payload = {
2918
+ success: true,
2919
+ query,
2920
+ requestKey,
2921
+ suggestions: result.suggestions,
2922
+ html: renderTaskDocumentSuggestionHtml(result.suggestions),
2923
+ };
2924
+ respondJson(res, 200, payload);
2925
+ return true;
2926
+ }
2927
+ catch (error) {
2928
+ log.error('Failed to search taskdoc suggestions', error);
2929
+ const payload = {
2930
+ success: false,
2931
+ error: error instanceof Error ? error.message : 'Failed to search taskdoc suggestions',
2932
+ };
2933
+ respondJson(res, 500, payload);
2934
+ return true;
2935
+ }
2936
+ }
2872
2937
  /**
2873
2938
  * Helper function to read request body
2874
2939
  */
@@ -42,6 +42,7 @@ Available API endpoints:
42
42
  • GET /api/dialogs/:root/sideDialogs/:self/list-node - Get one dialog-list sideDialog node
43
43
  • GET /api/dialogs/:root/hierarchy - Get dialog hierarchy
44
44
  • GET /api/task-documents - Taskdoc listing
45
+ • GET /api/task-documents/suggestions?q=... - Worker-backed Taskdoc suggestions
45
46
 
46
47
  WebSocket endpoint: /ws
47
48
  Backend API endpoint: /api
@@ -98,6 +98,7 @@ function manualSpecFor(toolsetId) {
98
98
  (0, registry_1.registerTool)(ctrl_1.clearMindTool);
99
99
  (0, registry_1.registerTool)(ctrl_1.changeMindTool);
100
100
  (0, registry_1.registerTool)(ctrl_1.mindMoreTool);
101
+ (0, registry_1.registerTool)(ctrl_1.neverMindTool);
101
102
  (0, registry_1.registerTool)(ctrl_1.recallTaskdocTool);
102
103
  // Team management tools (scoped to `.minds/**`)
103
104
  for (const tool of team_mgmt_1.teamMgmtTools) {
@@ -141,6 +142,7 @@ for (const tool of team_mgmt_1.teamMgmtTools) {
141
142
  ctrl_1.clearMindTool,
142
143
  ctrl_1.changeMindTool,
143
144
  ctrl_1.mindMoreTool,
145
+ ctrl_1.neverMindTool,
144
146
  ctrl_1.recallTaskdocTool,
145
147
  ]);
146
148
  (0, registry_1.setToolsetMeta)('control', {
@@ -15,6 +15,7 @@
15
15
  * - clear_mind: Start a new course, optionally add a reminder
16
16
  * - change_mind: Update a `.tsk/` Taskdoc section without starting a new course
17
17
  * - mind_more: Append entries to a `.tsk/` Taskdoc section without starting a new course
18
+ * - never_mind: Delete a `.tsk/` Taskdoc section file without starting a new course
18
19
  * - recall_taskdoc: Read a Taskdoc section from `*.tsk/` by (category, selector)
19
20
  *
20
21
  * USAGE CONTEXT:
@@ -32,5 +33,6 @@ export declare const addReminderTool: FuncTool;
32
33
  export declare const updateReminderTool: FuncTool;
33
34
  export declare const clearMindTool: FuncTool;
34
35
  export declare const changeMindTool: FuncTool;
36
+ export declare const neverMindTool: FuncTool;
35
37
  export declare const mindMoreTool: FuncTool;
36
38
  export declare const recallTaskdocTool: FuncTool;
@@ -16,6 +16,7 @@
16
16
  * - clear_mind: Start a new course, optionally add a reminder
17
17
  * - change_mind: Update a `.tsk/` Taskdoc section without starting a new course
18
18
  * - mind_more: Append entries to a `.tsk/` Taskdoc section without starting a new course
19
+ * - never_mind: Delete a `.tsk/` Taskdoc section file without starting a new course
19
20
  * - recall_taskdoc: Read a Taskdoc section from `*.tsk/` by (category, selector)
20
21
  *
21
22
  * USAGE CONTEXT:
@@ -61,7 +62,7 @@ var __importStar = (this && this.__importStar) || (function () {
61
62
  };
62
63
  })();
63
64
  Object.defineProperty(exports, "__esModule", { value: true });
64
- exports.recallTaskdocTool = exports.mindMoreTool = exports.changeMindTool = exports.clearMindTool = exports.updateReminderTool = exports.addReminderTool = exports.deleteReminderTool = void 0;
65
+ exports.recallTaskdocTool = exports.mindMoreTool = exports.neverMindTool = exports.changeMindTool = exports.clearMindTool = exports.updateReminderTool = exports.addReminderTool = exports.deleteReminderTool = void 0;
65
66
  const fs = __importStar(require("fs"));
66
67
  const path = __importStar(require("path"));
67
68
  const dialog_1 = require("../dialog");
@@ -370,6 +371,7 @@ function getCtrlMessages(language) {
370
371
  invalidFormatChangeMind: '参数格式不对。用法:change_mind({ selector: string, category?: string, content: string })',
371
372
  tooManyArgsChangeMind: '参数格式不对。用法:change_mind({ selector: string, category?: string, content: string })',
372
373
  invalidFormatMindMore: '参数格式不对。用法:mind_more({ items: string[], sep?: string, selector?: string, category?: string })(selector 默认 progress)',
374
+ invalidFormatNeverMind: '参数格式不对。用法:never_mind({ selector: string, category?: string })',
373
375
  mindMoreItemsRequired: '需要提供要追加的条目(items),且每一项都必须是非空字符串。\n' +
374
376
  '示例:mind_more({"items":["- 下一步:复核验证结果(详见 <文档路径>#<章节>)","- 阻塞:等待 API 验收口径确认"]})',
375
377
  invalidFormatRecallTaskdoc: '参数格式不对。用法:recall_taskdoc({ category: string, selector: string })',
@@ -392,6 +394,7 @@ function getCtrlMessages(language) {
392
394
  topLevelSelectorRequiresNoCategory: (category, selector) => `选择器 '${selector}' 是顶层保留分段(goals/constraints/progress),不能与 category='${category}' 一起用。`,
393
395
  bearInMindSelectorRequiresBearInMindCategory: (category, selector) => `选择器 '${selector}' 只能在 category='bearinmind' 下用(当前 category='${category}')。`,
394
396
  taskDocSectionMissing: (relativePath) => `未找到:${relativePath}。\n\n少量追加/创建可用 mind_more;整章创建/替换用 change_mind:\n- mind_more({"category":"<category>","selector":"<selector>","items":["..."]})\n- change_mind({"category":"<category>","selector":"<selector>","content":"..."})`,
397
+ taskDocSectionDeleteMissing: (relativePath) => `无法删除:${relativePath} 不存在。请先确认要删除的差遣牒章节。`,
395
398
  clearedCoursePrompt: (nextCourse) => (0, driver_messages_1.formatNewCourseStartPrompt)('zh', { nextCourse, source: 'clear_mind' }),
396
399
  };
397
400
  }
@@ -407,6 +410,7 @@ function getCtrlMessages(language) {
407
410
  invalidFormatChangeMind: 'Error: Invalid args. Use: change_mind({ selector: string, category?: string, content: string })',
408
411
  tooManyArgsChangeMind: 'Error: Invalid args. Use: change_mind({ selector: string, category?: string, content: string })',
409
412
  invalidFormatMindMore: 'Error: Invalid args. Use: mind_more({ items: string[], sep?: string, selector?: string, category?: string }) (selector defaults to progress).',
413
+ invalidFormatNeverMind: 'Error: Invalid args. Use: never_mind({ selector: string, category?: string })',
410
414
  mindMoreItemsRequired: 'Error: items are required, and every item must be a non-empty string.\n' +
411
415
  'Example: mind_more({"items":["- Next: review verification results (details: <doc-path>#<section>)","- Blocker: API acceptance criteria pending"]})',
412
416
  invalidFormatRecallTaskdoc: 'Error: Invalid args. Use: recall_taskdoc({ category: string, selector: string })',
@@ -429,6 +433,7 @@ function getCtrlMessages(language) {
429
433
  topLevelSelectorRequiresNoCategory: (category, selector) => `Error: Selector '${selector}' is reserved for top-level sections (goals/constraints/progress) and must not be used with category='${category}'.`,
430
434
  bearInMindSelectorRequiresBearInMindCategory: (category, selector) => `Error: Selector '${selector}' is only valid under category='bearinmind' (got category='${category}').`,
431
435
  taskDocSectionMissing: (relativePath) => `Not found: \`${relativePath}\`.\n\nUse \`mind_more\` for small append/create updates, or \`change_mind\` for full-section create/replace:\n- \`mind_more({\"category\":\"<category>\",\"selector\":\"<selector>\",\"items\":[\"...\"]})\`\n- \`change_mind({\"category\":\"<category>\",\"selector\":\"<selector>\",\"content\":\"...\"})\``,
436
+ taskDocSectionDeleteMissing: (relativePath) => `Cannot delete: \`${relativePath}\` does not exist. Check the Taskdoc section target first.`,
432
437
  clearedCoursePrompt: (nextCourse) => (0, driver_messages_1.formatNewCourseStartPrompt)('en', { nextCourse, source: 'clear_mind' }),
433
438
  };
434
439
  }
@@ -740,6 +745,9 @@ exports.changeMindTool = {
740
745
  if (!selector)
741
746
  return (0, tool_1.toolFailure)(t.selectorRequired);
742
747
  const categoryValue = args['category'];
748
+ if (categoryValue !== undefined && typeof categoryValue !== 'string') {
749
+ return (0, tool_1.toolFailure)(t.invalidFormatChangeMind);
750
+ }
743
751
  const category = typeof categoryValue === 'string' ? categoryValue.trim() : undefined;
744
752
  const contentValue = args['content'];
745
753
  const newTaskDocContent = typeof contentValue === 'string' ? contentValue.trim() : '';
@@ -789,6 +797,103 @@ exports.changeMindTool = {
789
797
  return (0, tool_result_messages_1.formatToolActionResult)(language, 'mindChanged');
790
798
  },
791
799
  };
800
+ exports.neverMindTool = {
801
+ type: 'func',
802
+ name: 'never_mind',
803
+ description: 'Delete one shared Taskdoc section file in the Main Dialog.',
804
+ descriptionI18n: {
805
+ en: 'Delete one shared Taskdoc section file in the Main Dialog.',
806
+ zh: '在主线对话中删除一段共享差遣牒章节文件。',
807
+ },
808
+ parameters: {
809
+ type: 'object',
810
+ additionalProperties: false,
811
+ required: ['selector'],
812
+ properties: {
813
+ selector: {
814
+ type: 'string',
815
+ description: 'Target section selector. Top-level: goals|constraints|progress. Under category="bearinmind": contracts|acceptance|grants|runbook|decisions|risks. For other categories: any identifier.',
816
+ },
817
+ category: {
818
+ type: 'string',
819
+ description: 'Optional category directory within the Taskdoc package. When present, selector targets <category>/<selector>.md.',
820
+ },
821
+ },
822
+ },
823
+ argsValidation: 'dominds',
824
+ async call(dlg, _caller, args) {
825
+ const language = (0, work_language_1.getWorkLanguage)();
826
+ const t = getCtrlMessages(language);
827
+ if (dlg.askerDialog !== undefined) {
828
+ const maintainerId = dlg instanceof dialog_1.SideDialog ? dlg.mainDialog.agentId : dlg.agentId;
829
+ if (language === 'zh') {
830
+ return (0, tool_1.toolFailure)(`错误:\`never_mind\` 仅允许在主线对话中使用(支线对话中不可用)。\n` +
831
+ `请诉请差遣牒维护人 @${maintainerId} 在其对话中执行 \`never_mind\`,并提供要删除的章节选择器。`);
832
+ }
833
+ return (0, tool_1.toolFailure)(`Error: \`never_mind\` is only available in the Main Dialog (not in Side Dialogs).\n` +
834
+ `Ask the Taskdoc maintainer @${maintainerId} to run \`never_mind\` with the section selector to delete.`);
835
+ }
836
+ const selectorValue = args['selector'];
837
+ const selector = typeof selectorValue === 'string' ? selectorValue.trim() : '';
838
+ if (!selector)
839
+ return (0, tool_1.toolFailure)(t.selectorRequired);
840
+ const categoryValue = args['category'];
841
+ if (categoryValue !== undefined && typeof categoryValue !== 'string') {
842
+ return (0, tool_1.toolFailure)(t.invalidFormatNeverMind);
843
+ }
844
+ const category = typeof categoryValue === 'string' ? categoryValue.trim() : undefined;
845
+ // Taskdoc path is immutable for the dialog lifecycle.
846
+ const taskDocPath = dlg.taskDocPath;
847
+ if (!taskDocPath)
848
+ return (0, tool_1.toolFailure)(t.noTaskDocPathConfigured);
849
+ const workspaceRoot = path.resolve(process.cwd());
850
+ const fullPath = path.resolve(workspaceRoot, taskDocPath);
851
+ if (!isPathWithinDirectory(fullPath, workspaceRoot)) {
852
+ return (0, tool_1.toolFailure)(t.pathMustBeWithinWorkspace);
853
+ }
854
+ if (!(0, task_package_1.isTaskPackagePath)(taskDocPath))
855
+ return (0, tool_1.toolFailure)(t.invalidTaskDocPath(taskDocPath));
856
+ const parsed = (0, task_package_1.parseTaskPackageChangeMindTarget)({ selector, category });
857
+ if (parsed.kind !== 'ok') {
858
+ const e = parsed.error;
859
+ switch (e.kind) {
860
+ case 'selector_required':
861
+ return (0, tool_1.toolFailure)(t.selectorRequired);
862
+ case 'invalid_category_name':
863
+ return (0, tool_1.toolFailure)(t.invalidCategory(e.category));
864
+ case 'invalid_category_selector':
865
+ return (0, tool_1.toolFailure)(t.invalidCategorySelector(e.selector));
866
+ case 'invalid_top_level_selector':
867
+ return (0, tool_1.toolFailure)(t.invalidSelector(e.selector));
868
+ case 'invalid_bearinmind_selector':
869
+ return (0, tool_1.toolFailure)(t.invalidSelector(e.selector));
870
+ case 'top_level_selector_requires_no_category':
871
+ return (0, tool_1.toolFailure)(t.topLevelSelectorRequiresNoCategory(e.category, e.selector));
872
+ case 'bearinmind_selector_requires_bearinmind_category':
873
+ return (0, tool_1.toolFailure)(t.bearInMindSelectorRequiresBearInMindCategory(e.category, e.selector));
874
+ default: {
875
+ const _exhaustive = e;
876
+ return (0, tool_1.toolFailure)(String(_exhaustive));
877
+ }
878
+ }
879
+ }
880
+ const result = await (0, task_package_1.deleteTaskPackageByChangeMindTarget)({
881
+ taskPackageDirFullPath: fullPath,
882
+ target: parsed.target,
883
+ });
884
+ switch (result.kind) {
885
+ case 'deleted':
886
+ return (0, tool_result_messages_1.formatToolActionResult)(language, 'deleted');
887
+ case 'missing': {
888
+ return (0, tool_1.toolFailure)(t.taskDocSectionDeleteMissing((0, task_package_1.taskPackageRelativePathForChangeMindTarget)(parsed.target)));
889
+ }
890
+ default: {
891
+ const _exhaustive = result;
892
+ return _exhaustive;
893
+ }
894
+ }
895
+ },
896
+ };
792
897
  exports.mindMoreTool = {
793
898
  type: 'func',
794
899
  name: 'mind_more',
@@ -860,6 +965,9 @@ exports.mindMoreTool = {
860
965
  if (!selector)
861
966
  return (0, tool_1.toolFailure)(t.selectorRequired);
862
967
  const categoryValue = args['category'];
968
+ if (categoryValue !== undefined && typeof categoryValue !== 'string') {
969
+ return (0, tool_1.toolFailure)(t.invalidFormatMindMore);
970
+ }
863
971
  const category = typeof categoryValue === 'string' ? categoryValue.trim() : undefined;
864
972
  // Taskdoc path is immutable for the dialog lifecycle.
865
973
  const taskDocPath = dlg.taskDocPath;
@@ -971,23 +1079,10 @@ exports.recallTaskdocTool = {
971
1079
  }
972
1080
  }
973
1081
  const target = parsed.target;
974
- const relPath = (() => {
975
- switch (target.kind) {
976
- case 'bearinmind':
977
- return path.join('bearinmind', (0, task_package_1.bearInMindFilenameForSection)(target.section));
978
- case 'category':
979
- return path.join(target.category, `${target.selector}.md`);
980
- case 'top_level':
981
- return null;
982
- default: {
983
- const _exhaustive = target;
984
- return _exhaustive;
985
- }
986
- }
987
- })();
988
- if (relPath === null) {
1082
+ if (target.kind === 'top_level') {
989
1083
  return (0, tool_1.toolFailure)(t.invalidFormatRecallTaskdoc);
990
1084
  }
1085
+ const relPath = (0, task_package_1.taskPackageRelativePathForChangeMindTarget)(target);
991
1086
  const sectionPath = path.resolve(fullPath, relPath);
992
1087
  if (!isPathWithinDirectory(sectionPath, fullPath)) {
993
1088
  return (0, tool_1.toolFailure)(t.pathMustBeWithinWorkspace);
@@ -93,9 +93,9 @@ A: `dialog` reminders are only for the current dialog's working set. `personal`
93
93
 
94
94
  A: Use `personal` only for responsibility-related reminders that you should keep seeing in all later dialogs you lead. Everything else should default to `dialog`.
95
95
 
96
- ### Q: Do mind_more / change_mind reset dialog rounds?
96
+ ### Q: Do mind_more / change_mind / never_mind start a new course?
97
97
 
98
- A: No. `mind_more` / `change_mind` only update Taskdoc content; they do not reset dialog rounds.
98
+ A: No. `mind_more` / `change_mind` / `never_mind` only update Taskdoc content; they do not start a new course.
99
99
 
100
100
  ### Q: Are taskdoc updates immediately visible to all teammates?
101
101
 
@@ -27,7 +27,7 @@
27
27
  control is Dominds' **dialog control toolset** for managing dialog state, reminders, taskdocs, and inter-dialog reply closure semantics:
28
28
 
29
29
  - **Reminder management**: Two reminder scopes. Default to dialog-local working set; use `personal` only for responsibility-linked notes that you should keep seeing in all later dialogs you lead
30
- - **Taskdoc operations**: Append to or replace task contract sections (goals/constraints/progress); within Taskdoc, `progress` is the team-shared, quasi-real-time, scannable task bulletin board
30
+ - **Taskdoc operations**: Append to, replace, or delete task contract sections (goals/constraints/progress); within Taskdoc, `progress` is the team-shared, quasi-real-time, scannable task bulletin board
31
31
  - **Context maintenance**: Reduce cognitive load without losing key resume state
32
32
  - **Reply routing**: Separate `tellaskBack`, `replyTellask*`, and plain text by responsibility in Side Dialog / ask-back flows
33
33
 
@@ -73,8 +73,8 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
73
73
 
74
74
  **Update Rules:**
75
75
 
76
- - `mind_more` appends small entries; `change_mind` replaces a full section
77
- - Does not reset dialog rounds
76
+ - `mind_more` appends small entries; `change_mind` replaces a full section; `never_mind` deletes a whole section file
77
+ - Does not start a new course
78
78
  - Changes visible to all teammates
79
79
  - When writing `progress`, assume teammates will skim it to synchronize on the current task truth rather than read your private process log
80
80
  - Do not keep blindly calling `mind_more` until `progress` becomes a chronology; when the bulletin board starts accumulating duplicates, stale entries, or noisy history, use `change_mind` to condense it around facts that are still effective now
@@ -89,6 +89,7 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
89
89
  | update_reminder | Update reminder content |
90
90
  | mind_more | Append entries to Taskdoc (defaults to progress) |
91
91
  | change_mind | Replace Taskdoc section (goals/constraints/progress) |
92
+ | never_mind | Delete Taskdoc section file |
92
93
  | recall_taskdoc | Read taskdoc chapter |
93
94
 
94
95
  ## Inter-dialog Reply Routing
@@ -154,7 +155,7 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
154
155
  ## Limitations and Notes
155
156
 
156
157
  1. `dialog` reminders end with the dialog; `personal` reminders stay visible in all later dialogs you lead
157
- 2. Use `mind_more` for small Taskdoc additions; use `change_mind` for full-section replacement and merge existing content first. Do not treat `mind_more` as a chronology tool; when cleanup, stale-entry removal, or same-topic consolidation is needed, use `change_mind`
158
- 3. `mind_more` / `change_mind` do not reset dialog rounds
158
+ 2. Use `mind_more` for small Taskdoc additions; use `change_mind` for full-section replacement and merge existing content first; use `never_mind` when a whole section file should be deleted. Do not treat `mind_more` as a chronology tool; when cleanup, stale-entry removal, or same-topic consolidation is needed, use `change_mind`
159
+ 3. `mind_more` / `change_mind` / `never_mind` do not start a new course
159
160
  4. A continuation-package reminder should keep only details still not covered by Taskdoc but easy to lose during resume; in the Main Dialog, undocumented discussion details from current dialog history that the next course needs to know should be written to the appropriate Taskdoc sections first; in a Side Dialog under caution/critical remediation, maintain sufficiently detailed continuation-package reminders only
160
161
  5. Do not turn `personal` reminders into a long-term fact dump; move durable knowledge into `personal_memory`
@@ -143,6 +143,7 @@ Update taskdoc chapter.
143
143
  **Parameters:**
144
144
 
145
145
  - `selector` (required): Chapter selector (goals/constraints/progress)
146
+ - `category` (optional): Extra section directory; with `selector`, targets `<category>/<selector>.md`
146
147
  - `content` (required): New content (full section replacement)
147
148
 
148
149
  **Returns:**
@@ -156,7 +157,7 @@ updated_at: <update timestamp>
156
157
  **Characteristics:**
157
158
 
158
159
  - Each call replaces entire chapter
159
- - Does not reset dialog rounds
160
+ - Does not start a new course
160
161
  - Changes visible to all teammates
161
162
  - Constraint rule: `constraints` must include only task-specific hard requirements; do not repeat global rules. If a duplicate is found, delete it and inform the user
162
163
 
@@ -187,10 +188,25 @@ mind_more({
187
188
  - Append-only: it does not deduplicate, rewrite, or compress old content
188
189
  - Good for adding one or two still-effective states, decisions, next steps, or blockers to `progress`
189
190
  - Not for appending every investigation step, long log, full plan, or acceptance record as a chronology; those details belong in formal rtws documentation, while Taskdoc keeps the summary and document pointer
190
- - If stale entries must be removed, reordered, or compressed, use `change_mind` for a full-section replacement
191
+ - If stale entries must be removed, reordered, or compressed, use `change_mind` for a full-section replacement; if a whole section file should be deleted, use `never_mind`
191
192
  - When one topic already has several phase notes, prefer `change_mind` to merge them into a concise current announcement instead of continuing to call `mind_more`
192
193
 
193
- ### 7. recall_taskdoc
194
+ ### 7. never_mind
195
+
196
+ Delete a Taskdoc section file.
197
+
198
+ **Parameters:**
199
+
200
+ - `selector` (required): Chapter selector. Top-level sections use `goals` / `constraints` / `progress`
201
+ - `category` (optional): Extra section directory; with `selector`, targets `<category>/<selector>.md`
202
+
203
+ **Characteristics:**
204
+
205
+ - Deletes only the whole section file; it does not edit content
206
+ - Use it only when the whole section is no longer valid. If you only need to remove stale entries or compress structure, prefer `change_mind` with the cleaned full section
207
+ - Does not start a new course
208
+
209
+ ### 8. recall_taskdoc
194
210
 
195
211
  Read taskdoc chapter.
196
212
 
@@ -93,9 +93,9 @@ A: `dialog` 提醒只用于当前对话的工作集。`personal` 提醒会在所
93
93
 
94
94
  A: 只有当这条提醒与你的持续职责相关,且在所有由你主理的后续对话里也应该继续被看到时,才用 `personal`。其它情况默认都用 `dialog`。
95
95
 
96
- ### Q: mind_more / change_mind 会重置对话轮次吗?
96
+ ### Q: mind_more / change_mind / never_mind 会开启新 course 吗?
97
97
 
98
- A: 不会。`mind_more` / `change_mind` 仅更新差遣牒内容,不重置对话轮次。
98
+ A: 不会。`mind_more` / `change_mind` / `never_mind` 仅更新差遣牒内容,不开启新 course。
99
99
 
100
100
  ### Q: 差遣牒更新后立即对所有队友可见吗?
101
101
 
@@ -27,7 +27,7 @@
27
27
  control 是 Dominds 的**对话控制工具集**,用于管理对话状态、提醒、差遣牒,以及跨对话回复收口语义:
28
28
 
29
29
  - **提醒管理**:提醒分 `dialog` / `personal` 两个 scope;默认保持对话内工作集,只有职责相关且在所有由你主理的后续对话里也应继续看到的提醒才用 `personal`
30
- - **差遣牒操作**:追加或替换任务契约章节(goals/constraints/progress);其中 `progress` 是全队共享、准实时、可扫读的任务公告牌
30
+ - **差遣牒操作**:追加、替换或删除任务契约章节(goals/constraints/progress);其中 `progress` 是全队共享、准实时、可扫读的任务公告牌
31
31
  - **上下文维护**:在不丢关键恢复线索的前提下降低认知负载
32
32
  - **回复路由**:在支线/回问语境下,区分 `tellaskBack`、`replyTellask*` 与普通文本的职责边界
33
33
 
@@ -73,8 +73,8 @@
73
73
 
74
74
  **更新规则:**
75
75
 
76
- - `mind_more` 用于少量追加条目;`change_mind` 用于整章替换
77
- - 不重置对话轮次
76
+ - `mind_more` 用于少量追加条目;`change_mind` 用于整章替换;`never_mind` 用于删除整章文件
77
+ - 不开启新 course
78
78
  - 变更对所有队友可见
79
79
  - 写入 `progress` 时,应默认假设全队成员会用它快速同步“当前任务真相”,而不是阅读你的个人过程记录
80
80
  - 不要无脑连续使用 `mind_more` 把 `progress` 写成流水账;当公告牌开始堆积、重复或含过期信息时,用 `change_mind` 按当前仍有效的事实压缩整理
@@ -89,6 +89,7 @@
89
89
  | update_reminder | 更新提醒内容 |
90
90
  | mind_more | 向差遣牒追加条目(默认 progress) |
91
91
  | change_mind | 整章替换差遣牒(goals/constraints/progress) |
92
+ | never_mind | 删除差遣牒章节文件 |
92
93
  | recall_taskdoc | 读取差遣牒章节 |
93
94
 
94
95
  ## 跨对话回复路由
@@ -154,7 +155,7 @@
154
155
  ## 限制与注意事项
155
156
 
156
157
  1. `dialog` 提醒会随对话结束而结束;`personal` 提醒会在所有由你主理的后续对话里继续可见
157
- 2. 差遣牒少量新增可用 `mind_more` 追加;整段替换用 `change_mind`,请确保合并已有内容。不要把 `mind_more` 当流水账工具;需要整理、去旧、合并同主题记录时直接 `change_mind`
158
- 3. `mind_more` / `change_mind` 不重置对话轮次
158
+ 2. 差遣牒少量新增可用 `mind_more` 追加;整段替换用 `change_mind`,请确保合并已有内容;确需删除整章文件时用 `never_mind`。不要把 `mind_more` 当流水账工具;需要整理、去旧、合并同主题记录时直接 `change_mind`
159
+ 3. `mind_more` / `change_mind` / `never_mind` 不开启新 course
159
160
  4. 接续包提醒项只保留差遣牒仍未覆盖、但恢复工作容易丢的细节;主线对话应先把当前对话历史中应由下一程知会的未落文档讨论细节写入差遣牒合适章节;支线对话在吃紧/告急时只维护足够详尽的接续包提醒项
160
161
  5. 不要把 `personal` 提醒堆成长期事实仓库;耐久知识应迁到 `personal_memory`