dominds 1.19.3 → 1.20.2

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 (195) hide show
  1. package/README.md +1 -0
  2. package/dist/access-control.js +2 -2
  3. package/dist/dialog.d.ts +6 -1
  4. package/dist/dialog.js +13 -4
  5. package/dist/docs/context-health.md +39 -13
  6. package/dist/docs/context-health.zh.md +14 -7
  7. package/dist/docs/idle-reminder-wake.md +227 -0
  8. package/dist/docs/idle-reminder-wake.zh.md +227 -0
  9. package/dist/llm/client.d.ts +2 -0
  10. package/dist/llm/client.js +32 -2
  11. package/dist/llm/defaults.yaml +51 -10
  12. package/dist/llm/gen/codex.js +15 -0
  13. package/dist/llm/gen/failure-classifier.js +22 -1
  14. package/dist/llm/kernel-driver/drive.js +6 -0
  15. package/dist/llm/kernel-driver/flow.js +9 -0
  16. package/dist/llm/kernel-driver/idle-reminder-wake.d.ts +4 -0
  17. package/dist/llm/kernel-driver/idle-reminder-wake.js +351 -0
  18. package/dist/llm/kernel-driver/types.d.ts +1 -1
  19. package/dist/minds/load.js +2 -1
  20. package/dist/minds/minds-i18n.js +2 -2
  21. package/dist/minds/system-prompt-parts.js +56 -20
  22. package/dist/minds/system-prompt.js +10 -10
  23. package/dist/persistence.js +1 -1
  24. package/dist/runtime/driver-messages.d.ts +3 -0
  25. package/dist/runtime/driver-messages.js +91 -8
  26. package/dist/server/setup-routes.js +5 -5
  27. package/dist/tool.d.ts +8 -0
  28. package/dist/tools/builtins.js +4 -2
  29. package/dist/tools/ctrl.d.ts +2 -0
  30. package/dist/tools/ctrl.js +255 -68
  31. package/dist/tools/os.js +198 -0
  32. package/dist/tools/prompts/control/en/errors.md +2 -2
  33. package/dist/tools/prompts/control/en/index.md +1 -1
  34. package/dist/tools/prompts/control/en/principles.md +21 -14
  35. package/dist/tools/prompts/control/en/scenarios.md +12 -4
  36. package/dist/tools/prompts/control/en/tools.md +45 -5
  37. package/dist/tools/prompts/control/zh/errors.md +2 -2
  38. package/dist/tools/prompts/control/zh/index.md +1 -1
  39. package/dist/tools/prompts/control/zh/principles.md +21 -14
  40. package/dist/tools/prompts/control/zh/scenarios.md +10 -4
  41. package/dist/tools/prompts/control/zh/tools.md +40 -5
  42. package/dist/tools/prompts/personal_memory/en/principles.md +1 -1
  43. package/dist/tools/prompts/personal_memory/zh/principles.md +1 -1
  44. package/dist/tools/prompts/team_memory/en/principles.md +1 -1
  45. package/dist/tools/prompts/team_memory/zh/principles.md +1 -1
  46. package/dist/tools/team_mgmt.js +5 -8
  47. package/dist/utils/task-package.d.ts +7 -0
  48. package/dist/utils/task-package.js +65 -28
  49. package/dist/utils/taskdoc.js +21 -17
  50. package/package.json +4 -4
  51. package/webapp/dist/assets/{_basePickBy-Dnh413xT.js → _basePickBy-B7M9Q0Fa.js} +3 -3
  52. package/webapp/dist/assets/_basePickBy-B7M9Q0Fa.js.map +1 -0
  53. package/webapp/dist/assets/{_baseUniq-DWzYqpN_.js → _baseUniq-DAeYoL6j.js} +2 -2
  54. package/webapp/dist/assets/_baseUniq-DAeYoL6j.js.map +1 -0
  55. package/webapp/dist/assets/{arc-vfBkNCOx.js → arc-Bh4nDbNR.js} +2 -2
  56. package/webapp/dist/assets/arc-Bh4nDbNR.js.map +1 -0
  57. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-DiUEBXOa.js → architectureDiagram-2XIMDMQ5-CxqmdsIm.js} +26 -8
  58. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CxqmdsIm.js.map +1 -0
  59. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BqK1KM2m.js → blockDiagram-WCTKOSBZ-CxIWLtpt.js} +187 -170
  60. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-CxIWLtpt.js.map +1 -0
  61. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-ClHNu1Uo.js → c4Diagram-IC4MRINW-1qErOIgG.js} +4 -4
  62. package/webapp/dist/assets/c4Diagram-IC4MRINW-1qErOIgG.js.map +1 -0
  63. package/webapp/dist/assets/{channel-BbWLVc8W.js → channel-DkgZHNUe.js} +2 -2
  64. package/webapp/dist/assets/channel-DkgZHNUe.js.map +1 -0
  65. package/webapp/dist/assets/{chunk-4BX2VUAB-CItdSmZH.js → chunk-4BX2VUAB-BmdMbU9v.js} +2 -2
  66. package/webapp/dist/assets/chunk-4BX2VUAB-BmdMbU9v.js.map +1 -0
  67. package/webapp/dist/assets/{chunk-55IACEB6-DSCX9WCf.js → chunk-55IACEB6-D6LDTDBy.js} +2 -2
  68. package/webapp/dist/assets/chunk-55IACEB6-D6LDTDBy.js.map +1 -0
  69. package/webapp/dist/assets/{chunk-FMBD7UC4-BJ1vT2se.js → chunk-FMBD7UC4-C-BdCe4C.js} +2 -2
  70. package/webapp/dist/assets/chunk-FMBD7UC4-C-BdCe4C.js.map +1 -0
  71. package/webapp/dist/assets/{chunk-TZMSLE5B-D2g6Tj7Z.js → chunk-JSJVCQXG-WA_BLIm9.js} +14 -6
  72. package/webapp/dist/assets/chunk-JSJVCQXG-WA_BLIm9.js.map +1 -0
  73. package/webapp/dist/assets/{chunk-QN33PNHL-CGyezTSD.js → chunk-KX2RTZJC-CA7sDJO5.js} +2 -2
  74. package/webapp/dist/assets/chunk-KX2RTZJC-CA7sDJO5.js.map +1 -0
  75. package/webapp/dist/assets/{chunk-DI55MBZ5-CRMf6XZu.js → chunk-NQ4KR5QH-wlvxalE3.js} +9 -7
  76. package/webapp/dist/assets/chunk-NQ4KR5QH-wlvxalE3.js.map +1 -0
  77. package/webapp/dist/assets/{chunk-QZHKN3VN-9xs15j8C.js → chunk-QZHKN3VN-Bo1VMcph.js} +2 -2
  78. package/webapp/dist/assets/chunk-QZHKN3VN-Bo1VMcph.js.map +1 -0
  79. package/webapp/dist/assets/{chunk-B4BG7PRW-5CRXFeD9.js → chunk-WL4C6EOR-B-Pk44be.js} +171 -121
  80. package/webapp/dist/assets/chunk-WL4C6EOR-B-Pk44be.js.map +1 -0
  81. package/webapp/dist/assets/{classDiagram-2ON5EDUG-BQFGGJNm.js → classDiagram-VBA2DB6C-BqKuyb49.js} +7 -6
  82. package/webapp/dist/assets/classDiagram-VBA2DB6C-BqKuyb49.js.map +1 -0
  83. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-BQFGGJNm.js → classDiagram-v2-RAHNMMFH-BqKuyb49.js} +7 -6
  84. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-BqKuyb49.js.map +1 -0
  85. package/webapp/dist/assets/{clone-DOfPd4cz.js → clone-BX5z8WVZ.js} +2 -2
  86. package/webapp/dist/assets/clone-BX5z8WVZ.js.map +1 -0
  87. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BYN-vqm8.js → cose-bilkent-S5V4N54A-B-s11SgN.js} +2 -2
  88. package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-s11SgN.js.map +1 -0
  89. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  90. package/webapp/dist/assets/{dagre-6UL2VRFP-ClEaFABE.js → dagre-KLK3FWXG-DmQFV2qK.js} +7 -7
  91. package/webapp/dist/assets/dagre-KLK3FWXG-DmQFV2qK.js.map +1 -0
  92. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  93. package/webapp/dist/assets/{diagram-PSM6KHXK-CM4hLE_0.js → diagram-E7M64L7V-QRaBfST8.js} +10 -10
  94. package/webapp/dist/assets/diagram-E7M64L7V-QRaBfST8.js.map +1 -0
  95. package/webapp/dist/assets/{diagram-QEK2KX5R-BZjGFX-2.js → diagram-IFDJBPK2-lrWn1Obo.js} +9 -8
  96. package/webapp/dist/assets/diagram-IFDJBPK2-lrWn1Obo.js.map +1 -0
  97. package/webapp/dist/assets/{diagram-S2PKOQOG-Bvw01OOG.js → diagram-P4PSJMXO-sTU7Hh-Y.js} +8 -8
  98. package/webapp/dist/assets/diagram-P4PSJMXO-sTU7Hh-Y.js.map +1 -0
  99. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-ctHu5zQL.js → erDiagram-INFDFZHY-Cx6jc9Wq.js} +96 -75
  100. package/webapp/dist/assets/erDiagram-INFDFZHY-Cx6jc9Wq.js.map +1 -0
  101. package/webapp/dist/assets/{flowDiagram-NV44I4VS-m7ofIhri.js → flowDiagram-PKNHOUZH-DfGI49Dz.js} +98 -81
  102. package/webapp/dist/assets/flowDiagram-PKNHOUZH-DfGI49Dz.js.map +1 -0
  103. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-D9wS5Veb.js → ganttDiagram-A5KZAMGK-nrcHWWaM.js} +28 -3
  104. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-nrcHWWaM.js.map +1 -0
  105. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-B86qqJx7.js → gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js} +38 -46
  106. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D8ivAqd6.js.map +1 -0
  107. package/webapp/dist/assets/graph-R5G-y8tB.js +782 -0
  108. package/webapp/dist/assets/graph-R5G-y8tB.js.map +1 -0
  109. package/webapp/dist/assets/{index-tinPEZoH.js → index--fy89xGh.js} +1034 -1059
  110. package/webapp/dist/assets/{index-tinPEZoH.js.map → index--fy89xGh.js.map} +1 -1
  111. package/webapp/dist/assets/{index-BGdI3lWA.css → index-DZFkLLVz.css} +1 -1
  112. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-DwRPUctP.js → infoDiagram-LFFYTUFH-PIoZHr7s.js} +7 -7
  113. package/webapp/dist/assets/infoDiagram-LFFYTUFH-PIoZHr7s.js.map +1 -0
  114. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  115. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js +966 -0
  116. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-oCM-LYk1.js.map +1 -0
  117. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-B91ZO-ec.js → journeyDiagram-4ABVD52K-C2qidjQ5.js} +5 -5
  118. package/webapp/dist/assets/journeyDiagram-4ABVD52K-C2qidjQ5.js.map +1 -0
  119. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-CoogrZ07.js → kanban-definition-K7BYSVSG-Du0TC8WS.js} +5 -3
  120. package/webapp/dist/assets/kanban-definition-K7BYSVSG-Du0TC8WS.js.map +1 -0
  121. package/webapp/dist/assets/{layout-BrzQmqFJ.js → layout-VmEo1OEB.js} +5 -5
  122. package/webapp/dist/assets/layout-VmEo1OEB.js.map +1 -0
  123. package/webapp/dist/assets/{linear-C6H7K9Zy.js → linear-B662YHAc.js} +2 -2
  124. package/webapp/dist/assets/linear-B662YHAc.js.map +1 -0
  125. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-UDHZQkNZ.js → mindmap-definition-YRQLILUH-D7arZj95.js} +7 -5
  126. package/webapp/dist/assets/mindmap-definition-YRQLILUH-D7arZj95.js.map +1 -0
  127. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  128. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-M81uyQ1J.js → pieDiagram-SKSYHLDU-DvjPP4PA.js} +8 -8
  129. package/webapp/dist/assets/pieDiagram-SKSYHLDU-DvjPP4PA.js.map +1 -0
  130. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-ClzIh9Gb.js → quadrantDiagram-337W2JSQ-B_JUGMj_.js} +3 -3
  131. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-B_JUGMj_.js.map +1 -0
  132. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-DLK3A-pn.js → requirementDiagram-Z7DCOOCP-DF0mpvE3.js} +16 -6
  133. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-DF0mpvE3.js.map +1 -0
  134. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-CYqju8I1.js → sankeyDiagram-WA2Y5GQK-CoXlxv00.js} +2 -2
  135. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-CoXlxv00.js.map +1 -0
  136. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-2guv6eOd.js → sequenceDiagram-2WXFIKYE-DYqT5Pg7.js} +601 -201
  137. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYqT5Pg7.js.map +1 -0
  138. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-iujqSp0X.js → stateDiagram-RAJIS63D-D9b1mN8-.js} +9 -9
  139. package/webapp/dist/assets/stateDiagram-RAJIS63D-D9b1mN8-.js.map +1 -0
  140. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-BxzY81ky.js → stateDiagram-v2-FVOUBMTO-DNzgudL_.js} +5 -5
  141. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DNzgudL_.js.map +1 -0
  142. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-DjCFSC8d.js → timeline-definition-YZTLITO2-CkyKUY7A.js} +3 -3
  143. package/webapp/dist/assets/timeline-definition-YZTLITO2-CkyKUY7A.js.map +1 -0
  144. package/webapp/dist/assets/{treemap-GDKQZRPO-iaBzDWCP.js → treemap-KZPCXAKY-CZd09kF-.js} +37 -24
  145. package/webapp/dist/assets/treemap-KZPCXAKY-CZd09kF-.js.map +1 -0
  146. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js +2487 -0
  147. package/webapp/dist/assets/vennDiagram-LZ73GAT5-BxVF5Olo.js.map +1 -0
  148. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-R6Jl1c89.js → xychartDiagram-JWTSCODW-BRwRloPc.js} +4 -4
  149. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BRwRloPc.js.map +1 -0
  150. package/webapp/dist/index.html +2 -2
  151. package/webapp/dist/assets/_basePickBy-Dnh413xT.js.map +0 -1
  152. package/webapp/dist/assets/_baseUniq-DWzYqpN_.js.map +0 -1
  153. package/webapp/dist/assets/arc-vfBkNCOx.js.map +0 -1
  154. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DiUEBXOa.js.map +0 -1
  155. package/webapp/dist/assets/blockDiagram-VD42YOAC-BqK1KM2m.js.map +0 -1
  156. package/webapp/dist/assets/c4Diagram-YG6GDRKO-ClHNu1Uo.js.map +0 -1
  157. package/webapp/dist/assets/channel-BbWLVc8W.js.map +0 -1
  158. package/webapp/dist/assets/chunk-4BX2VUAB-CItdSmZH.js.map +0 -1
  159. package/webapp/dist/assets/chunk-55IACEB6-DSCX9WCf.js.map +0 -1
  160. package/webapp/dist/assets/chunk-B4BG7PRW-5CRXFeD9.js.map +0 -1
  161. package/webapp/dist/assets/chunk-DI55MBZ5-CRMf6XZu.js.map +0 -1
  162. package/webapp/dist/assets/chunk-FMBD7UC4-BJ1vT2se.js.map +0 -1
  163. package/webapp/dist/assets/chunk-QN33PNHL-CGyezTSD.js.map +0 -1
  164. package/webapp/dist/assets/chunk-QZHKN3VN-9xs15j8C.js.map +0 -1
  165. package/webapp/dist/assets/chunk-TZMSLE5B-D2g6Tj7Z.js.map +0 -1
  166. package/webapp/dist/assets/classDiagram-2ON5EDUG-BQFGGJNm.js.map +0 -1
  167. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-BQFGGJNm.js.map +0 -1
  168. package/webapp/dist/assets/clone-DOfPd4cz.js.map +0 -1
  169. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BYN-vqm8.js.map +0 -1
  170. package/webapp/dist/assets/dagre-6UL2VRFP-ClEaFABE.js.map +0 -1
  171. package/webapp/dist/assets/diagram-PSM6KHXK-CM4hLE_0.js.map +0 -1
  172. package/webapp/dist/assets/diagram-QEK2KX5R-BZjGFX-2.js.map +0 -1
  173. package/webapp/dist/assets/diagram-S2PKOQOG-Bvw01OOG.js.map +0 -1
  174. package/webapp/dist/assets/erDiagram-Q2GNP2WA-ctHu5zQL.js.map +0 -1
  175. package/webapp/dist/assets/flowDiagram-NV44I4VS-m7ofIhri.js.map +0 -1
  176. package/webapp/dist/assets/ganttDiagram-JELNMOA3-D9wS5Veb.js.map +0 -1
  177. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-B86qqJx7.js.map +0 -1
  178. package/webapp/dist/assets/graph-u844GGQC.js +0 -425
  179. package/webapp/dist/assets/graph-u844GGQC.js.map +0 -1
  180. package/webapp/dist/assets/infoDiagram-HS3SLOUP-DwRPUctP.js.map +0 -1
  181. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-B91ZO-ec.js.map +0 -1
  182. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CoogrZ07.js.map +0 -1
  183. package/webapp/dist/assets/layout-BrzQmqFJ.js.map +0 -1
  184. package/webapp/dist/assets/linear-C6H7K9Zy.js.map +0 -1
  185. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-UDHZQkNZ.js.map +0 -1
  186. package/webapp/dist/assets/pieDiagram-ADFJNKIX-M81uyQ1J.js.map +0 -1
  187. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-ClzIh9Gb.js.map +0 -1
  188. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DLK3A-pn.js.map +0 -1
  189. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-CYqju8I1.js.map +0 -1
  190. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-2guv6eOd.js.map +0 -1
  191. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-iujqSp0X.js.map +0 -1
  192. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-BxzY81ky.js.map +0 -1
  193. package/webapp/dist/assets/timeline-definition-IT6M3QCI-DjCFSC8d.js.map +0 -1
  194. package/webapp/dist/assets/treemap-GDKQZRPO-iaBzDWCP.js.map +0 -1
  195. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-R6Jl1c89.js.map +0 -1
package/dist/tools/os.js CHANGED
@@ -311,9 +311,18 @@ function buildShellCmdReminderMeta(previousMeta, daemon, options) {
311
311
  if (previousMeta.originDialogId !== undefined) {
312
312
  nextMeta['originDialogId'] = previousMeta.originDialogId;
313
313
  }
314
+ if (previousMeta.originRootId !== undefined) {
315
+ nextMeta['originRootId'] = previousMeta.originRootId;
316
+ }
314
317
  if (daemon.processGroupId !== undefined) {
315
318
  nextMeta['processGroupId'] = daemon.processGroupId;
316
319
  }
320
+ if (previousMeta.exitWakeEventId !== undefined) {
321
+ nextMeta['exitWakeEventId'] = previousMeta.exitWakeEventId;
322
+ }
323
+ if (previousMeta.exitWakeNotifiedAt !== undefined) {
324
+ nextMeta['exitWakeNotifiedAt'] = previousMeta.exitWakeNotifiedAt;
325
+ }
317
326
  if (options?.completed) {
318
327
  nextMeta['completed'] = true;
319
328
  }
@@ -400,6 +409,141 @@ function stripDaemonLifecyclePhaseSummary(content) {
400
409
  }
401
410
  return normalized.slice(separatorIndex + 2);
402
411
  }
412
+ function buildShellCmdExitWakeEventId(meta) {
413
+ return `shellCmd:daemonExited:${String(meta.pid)}:${meta.startTime}`;
414
+ }
415
+ function buildShellCmdExitWakeMeta(meta, eventId, notifiedAt) {
416
+ return {
417
+ ...meta,
418
+ exitWakeEventId: eventId,
419
+ exitWakeNotifiedAt: notifiedAt,
420
+ };
421
+ }
422
+ function assertShellCmdExitWakeNotPreviouslyDelivered(meta, eventId) {
423
+ if (meta.exitWakeEventId !== undefined && meta.exitWakeEventId !== eventId) {
424
+ throw new Error(`shell_cmd daemon wake invariant violation: conflicting exit wake event id for pid ${String(meta.pid)}`);
425
+ }
426
+ if (meta.exitWakeNotifiedAt !== undefined) {
427
+ throw new Error(`shell_cmd daemon wake invariant violation: exit wake event already delivered for pid ${String(meta.pid)}`);
428
+ }
429
+ }
430
+ function assertShellCmdExitWakeDeliveryFieldsConsistent(meta, eventId) {
431
+ if (meta.exitWakeNotifiedAt !== undefined && meta.exitWakeEventId === undefined) {
432
+ throw new Error(`shell_cmd daemon wake invariant violation: exit wake notified timestamp without event id for pid ${String(meta.pid)}`);
433
+ }
434
+ if (meta.exitWakeEventId !== undefined && meta.exitWakeEventId !== eventId) {
435
+ throw new Error(`shell_cmd daemon wake invariant violation: delivered event id mismatch for pid ${String(meta.pid)}`);
436
+ }
437
+ }
438
+ function formatShellCmdDaemonExitWakeContent(args) {
439
+ const prefix = (0, driver_messages_1.formatSystemNoticePrefix)(args.language);
440
+ const status = args.exitCode !== undefined || args.exitSignal !== undefined
441
+ ? `code ${String(args.exitCode ?? 'null')}, signal ${String(args.exitSignal ?? 'null')}`
442
+ : args.language === 'zh'
443
+ ? '未知(runner 已不可用)'
444
+ : 'unknown (runner unavailable)';
445
+ return args.language === 'zh'
446
+ ? `${prefix}
447
+ 后台进程已退出。这是 runtime 环境事件,不是新的用户指令。
448
+
449
+ - PID: ${String(args.pid)}
450
+ - 命令: ${args.command}
451
+ - 退出状态: ${status}
452
+
453
+ 请根据当前任务上下文判断是否需要查看最终 stdout/stderr 或向用户汇报结果;不要只回复“收到”。`
454
+ : `${prefix}
455
+ A background process has exited. This is a runtime environment event, not a new user instruction.
456
+
457
+ - PID: ${String(args.pid)}
458
+ - Command: ${args.command}
459
+ - Exit status: ${status}
460
+
461
+ Decide from the current task context whether you need to inspect final stdout/stderr or report the result to the user; do not reply with a standalone acknowledgement.`;
462
+ }
463
+ function abortableDelay(ms, signal) {
464
+ return new Promise((resolve) => {
465
+ if (signal.aborted) {
466
+ resolve();
467
+ return;
468
+ }
469
+ let timeout;
470
+ let settled = false;
471
+ const finish = () => {
472
+ if (settled)
473
+ return;
474
+ settled = true;
475
+ clearTimeout(timeout);
476
+ signal.removeEventListener('abort', onAbort);
477
+ resolve();
478
+ };
479
+ const onAbort = () => {
480
+ finish();
481
+ };
482
+ timeout = setTimeout(finish, ms);
483
+ signal.addEventListener('abort', onAbort, { once: true });
484
+ });
485
+ }
486
+ async function waitForShellCmdReminderWakeEvent(reminder, signal) {
487
+ const eventId = buildShellCmdExitWakeEventId(reminder.meta);
488
+ assertShellCmdExitWakeDeliveryFieldsConsistent(reminder.meta, eventId);
489
+ if (reminder.meta.completed === true) {
490
+ return null;
491
+ }
492
+ if (reminder.meta.exitWakeNotifiedAt !== undefined) {
493
+ return null;
494
+ }
495
+ while (!signal.aborted) {
496
+ const resolved = await resolveDaemonFromMeta(reminder.meta);
497
+ const notifiedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
498
+ const language = (0, work_language_1.getWorkLanguage)();
499
+ if (resolved.kind === 'gone') {
500
+ const isTrackedDaemon = reminder.meta.runnerEndpoint !== undefined || reminder.meta.runnerPid !== undefined;
501
+ if (!isTrackedDaemon)
502
+ return null;
503
+ assertShellCmdExitWakeNotPreviouslyDelivered(reminder.meta, eventId);
504
+ const updatedMeta = buildShellCmdExitWakeMeta(buildShellCmdFinalizedMeta(reminder.meta, notifiedAt), eventId, notifiedAt);
505
+ const updatedContent = formatExitedDaemonReminderContent(reminder.meta.initialCommandLine, reminder.meta.pid, language, stripDaemonLifecyclePhaseSummary(reminder.content));
506
+ return {
507
+ eventId,
508
+ reminderId: reminder.id,
509
+ content: formatShellCmdDaemonExitWakeContent({
510
+ command: reminder.meta.initialCommandLine,
511
+ pid: reminder.meta.pid,
512
+ language,
513
+ }),
514
+ updatedContent,
515
+ updatedMeta,
516
+ };
517
+ }
518
+ if (resolved.kind === 'error') {
519
+ throw new Error(resolved.errorText);
520
+ }
521
+ const daemon = resolved.daemon;
522
+ if (!daemon.isRunning) {
523
+ assertShellCmdExitWakeNotPreviouslyDelivered(reminder.meta, eventId);
524
+ const updatedContent = formatExitedDaemonReminderContent(daemon.command, reminder.meta.pid, language, formatRunnerBackedDaemonStatusDetails(daemon, language));
525
+ const completedMeta = buildShellCmdReminderMeta(reminder.meta, daemon, {
526
+ completed: true,
527
+ lastUpdated: notifiedAt,
528
+ });
529
+ return {
530
+ eventId,
531
+ reminderId: reminder.id,
532
+ content: formatShellCmdDaemonExitWakeContent({
533
+ command: daemon.command,
534
+ pid: reminder.meta.pid,
535
+ exitCode: daemon.exitCode,
536
+ exitSignal: daemon.exitSignal,
537
+ language,
538
+ }),
539
+ updatedContent,
540
+ updatedMeta: buildShellCmdExitWakeMeta(completedMeta, eventId, notifiedAt),
541
+ };
542
+ }
543
+ await abortableDelay(1000, signal);
544
+ }
545
+ return null;
546
+ }
403
547
  function getOsToolMessages(language) {
404
548
  if (language === 'zh') {
405
549
  return {
@@ -1162,6 +1306,59 @@ exports.shellCmdReminderOwner = {
1162
1306
  }),
1163
1307
  };
1164
1308
  },
1309
+ async waitForReminderWakeEvent(_dlg, reminders, signal) {
1310
+ const candidates = reminders.filter(isShellCmdReminder);
1311
+ if (candidates.length === 0)
1312
+ return null;
1313
+ const controller = new AbortController();
1314
+ const onAbort = () => {
1315
+ controller.abort();
1316
+ };
1317
+ signal.addEventListener('abort', onAbort, { once: true });
1318
+ if (signal.aborted) {
1319
+ controller.abort();
1320
+ }
1321
+ const pending = candidates.map((reminder) => waitForShellCmdReminderWakeEvent(reminder, controller.signal));
1322
+ return await new Promise((resolve, reject) => {
1323
+ let settled = false;
1324
+ let remaining = pending.length;
1325
+ const cleanup = () => {
1326
+ signal.removeEventListener('abort', onAbort);
1327
+ controller.abort();
1328
+ };
1329
+ const finish = (event) => {
1330
+ if (settled)
1331
+ return;
1332
+ settled = true;
1333
+ cleanup();
1334
+ resolve(event);
1335
+ };
1336
+ const settleEmpty = () => {
1337
+ if (settled)
1338
+ return;
1339
+ remaining -= 1;
1340
+ if (remaining === 0)
1341
+ finish(null);
1342
+ };
1343
+ for (const promise of pending) {
1344
+ void promise
1345
+ .then((event) => {
1346
+ if (event !== null) {
1347
+ finish(event);
1348
+ return;
1349
+ }
1350
+ settleEmpty();
1351
+ })
1352
+ .catch((error) => {
1353
+ if (settled)
1354
+ return;
1355
+ settled = true;
1356
+ cleanup();
1357
+ reject(error instanceof Error ? error : new Error(String(error)));
1358
+ });
1359
+ }
1360
+ });
1361
+ },
1165
1362
  async renderReminder(dlg, reminder) {
1166
1363
  const language = (0, work_language_1.getWorkLanguage)();
1167
1364
  const prefix = (0, driver_messages_1.formatSystemNoticePrefix)(language);
@@ -1309,6 +1506,7 @@ exports.shellCmdTool = {
1309
1506
  shell: initialMessage.shell,
1310
1507
  startTime: initialMessage.startTime,
1311
1508
  originDialogId: dlg.id.selfId,
1509
+ originRootId: dlg.id.rootId,
1312
1510
  };
1313
1511
  if (initialMessage.processGroupId !== undefined) {
1314
1512
  reminderSeedMeta.processGroupId = initialMessage.processGroupId;
@@ -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: Does change_mind reset dialog rounds?
96
+ ### Q: Do mind_more / change_mind reset dialog rounds?
97
97
 
98
- A: No. `change_mind` only updates taskdoc content, it doesn't reset dialog rounds.
98
+ A: No. `mind_more` / `change_mind` only update Taskdoc content; they do not reset dialog rounds.
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**: Update task contracts (goals/constraints/progress); within Taskdoc, `progress` is the team-shared, quasi-real-time, scannable task bulletin board
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
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
 
@@ -40,7 +40,7 @@ Default to `dialog`. Use `personal` only when you should keep seeing that note i
40
40
  - `personal` reminders stay visible in all later dialogs you lead
41
41
  - Can be added, modified, or deleted at any time
42
42
  - Should stay compact, scannable, and directly actionable by default
43
- - Before `clear_mind`, default to a structured continuation-package reminder; if the current course is already under system remediation, rough multi-reminder carry-over is acceptable
43
+ - Before `clear_mind`, the Main Dialog first records undocumented discussion details the next course needs to know into Taskdoc, then creates a structured continuation-package reminder; a Side Dialog directly maintains sufficiently detailed continuation-package reminders. If the current course is already under system remediation, Side Dialog reminder length has no technical limit and rough multi-reminder carry-over is acceptable
44
44
 
45
45
  **Difference from memory:**
46
46
  | Feature | dialog reminder | personal reminder | personal memory |
@@ -73,20 +73,23 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
73
73
 
74
74
  **Update Rules:**
75
75
 
76
- - Each `change_mind` call replaces entire chapter
76
+ - `mind_more` appends small entries; `change_mind` replaces a full section
77
77
  - Does not reset dialog rounds
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
+ - 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
81
+ - Detailed investigations, long logs, full plans, acceptance records, and expanded rationale belong in formal rtws documentation; Taskdoc should keep only the key point, current conclusion, next step, and a location pointer such as path/section/command
80
82
 
81
83
  ## Tool Overview
82
84
 
83
- | Tool | Function |
84
- | --------------- | ------------------------------------------- |
85
- | add_reminder | Add reminder |
86
- | delete_reminder | Delete reminder |
87
- | update_reminder | Update reminder content |
88
- | change_mind | Update taskdoc (goals/constraints/progress) |
89
- | recall_taskdoc | Read taskdoc chapter |
85
+ | Tool | Function |
86
+ | --------------- | ---------------------------------------------------- |
87
+ | add_reminder | Add reminder |
88
+ | delete_reminder | Delete reminder |
89
+ | update_reminder | Update reminder content |
90
+ | mind_more | Append entries to Taskdoc (defaults to progress) |
91
+ | change_mind | Replace Taskdoc section (goals/constraints/progress) |
92
+ | recall_taskdoc | Read taskdoc chapter |
90
93
 
91
94
  ## Inter-dialog Reply Routing
92
95
 
@@ -127,9 +130,11 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
127
130
 
128
131
  - Keep concise: reminders are often 1-3 items; prefer `update_reminder` to compress/merge
129
132
  - Separate carriers: information that must synchronize the team's current effective state, key decisions, next steps, or still-active blockers belongs in `progress`, the quasi-real-time task bulletin board; reminders keep local resume details
130
- - Team-facing: keep `progress` scannable and centered on what is still effective now; do not let it degrade into a personal log, raw chronology, scratchpad, or stale history pile
131
- - Collapse before clearing: default to a structured continuation-package reminder; if the current course is already under system remediation, rough multi-reminder carry-over is acceptable but must be reconciled first in the new course
133
+ - Team-facing: keep `progress` scannable and centered on what is still effective now; do not let it degrade into a personal log, raw chronology, scratchpad, or stale history pile. Use `mind_more` for small additions and `change_mind` when cleanup/reordering/compression is needed
134
+ - Condense when needed: `mind_more` is not the default bookkeeping move. If one topic already has several phase notes, prefer `change_mind` to merge them into the current summary; put the detailed expansion in formal rtws documentation and keep a document pointer in Taskdoc
135
+ - Collapse before clearing: the Main Dialog first records undocumented discussion details the next course needs to know into the appropriate Taskdoc sections, then creates a structured continuation-package reminder; a Side Dialog must not maintain Taskdoc or draft Taskdoc update proposals, and should directly maintain sufficiently detailed continuation-package reminders. If the current course is already under system remediation, rough multi-reminder carry-over is acceptable but must be reconciled first in the new course
132
136
  - Avoid raw-material dumps: do not paste long logs or large tool outputs into reminders
137
+ - Documentation layering: Taskdoc says “what the team should sync on / do next now”; formal rtws documentation carries “why, how, detailed evidence, and the full process”. When Taskdoc references formal rtws documentation, use a stable path/section name/relevant command instead of copying the full content
133
138
 
134
139
  ### 4. What Belongs in `progress`
135
140
 
@@ -138,16 +143,18 @@ Taskdoc is a **task contract** and the task's **team-shared source of current tr
138
143
  - blockers that are confirmed and still active
139
144
  - the next step the team should currently align on
140
145
  - completed stage closures and remaining gaps
146
+ - a short summary of content already written to formal rtws documentation, plus a pointer to that document
141
147
  - Poor fits for `progress`:
142
148
  - “I just read file X”
143
149
  - “I might try a small idea next”
144
150
  - scratch notes only useful to the current speaker
145
151
  - historical traces whose current validity is unclear
152
+ - detailed expansions, long logs, full plans, or acceptance-record text that belongs in formal rtws documentation
146
153
 
147
154
  ## Limitations and Notes
148
155
 
149
156
  1. `dialog` reminders end with the dialog; `personal` reminders stay visible in all later dialogs you lead
150
- 2. Taskdoc updates use full section replacement, ensure to merge existing content
151
- 3. `change_mind` does not reset dialog rounds
152
- 4. A continuation-package reminder should keep only details not already covered by Taskdoc but easy to lose during resume
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
159
+ 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
153
160
  5. Do not turn `personal` reminders into a long-term fact dump; move durable knowledge into `personal_memory`
@@ -117,15 +117,23 @@ replyTellaskBack({
117
117
 
118
118
  ### Scenario Description
119
119
 
120
- Announce the current effective state, key decisions, next step, and still-active blockers to the whole team rather than writing a private chronology.
120
+ Announce the current effective state, key decisions, next step, and still-active blockers to the whole team rather than writing a private chronology. If details have been organized into formal rtws documentation, `progress` should keep only the summary and document pointer.
121
121
 
122
122
  ### Example
123
123
 
124
124
  ```typescript
125
+ // Small additions that are still effective now
126
+ mind_more({
127
+ items: [
128
+ '- Next: verify control / team_mgmt manuals and tests are aligned (details: <doc-path>#<section>)',
129
+ ],
130
+ });
131
+
132
+ // Full-section replacement when cleanup, reordering, same-topic consolidation, or chronology compression is needed
125
133
  change_mind({
126
134
  selector: 'progress',
127
135
  content:
128
- '## Progress\n\n### Current Effective State\n- The memory-carrier boundary cleanup is complete; next we strengthen the Taskdoc bulletin-board semantics\n\n### Decisions In Effect\n- `personal_memory` is no longer treated as a short-term junk drawer\n- `team_memory` now carries only long-lived team conventions and invariants\n\n### Next Step\n- Add stronger `progress` bulletin-board guidance in control / team_mgmt manuals\n\n### Still-Active Blockers\n- None',
136
+ '## Progress\n\n### Current Effective State\n- The memory-carrier boundary cleanup is complete; next we strengthen the Taskdoc bulletin-board semantics; details: <doc-path>#<section>\n\n### Decisions In Effect\n- `personal_memory` is no longer treated as a short-term junk drawer\n- `team_memory` now carries only long-lived team conventions and invariants\n\n### Next Step\n- Add stronger `progress` bulletin-board guidance in control / team_mgmt manuals\n\n### Still-Active Blockers\n- None',
129
137
  });
130
138
  ```
131
139
 
@@ -187,7 +195,7 @@ recall_taskdoc({
187
195
 
188
196
  ### Scenario Description
189
197
 
190
- Maintain taskdoc integrity and consistency, and keep `progress` as a team-scannable current-truth snapshot.
198
+ Maintain taskdoc integrity and consistency, and keep `progress` as a team-scannable current-truth snapshot; put detailed expansion in formal rtws documentation and keep only the summary plus location pointer in Taskdoc.
191
199
 
192
200
  ### Example
193
201
 
@@ -196,6 +204,6 @@ Maintain taskdoc integrity and consistency, and keep `progress` as a team-scanna
196
204
  change_mind({
197
205
  selector: 'progress',
198
206
  content:
199
- '## Progress\n\n### Current Effective State\n- The boundary wording has been propagated into handbook sources and tests\n\n### Decisions In Effect\n- role assets / personal_memory / team_memory / Taskdoc-progress / reminders now have separated responsibilities\n\n### Next Step\n- Re-verify control manual wording, Taskdoc display text, and boundary tests\n\n### Still-Active Blockers\n- None',
207
+ '## Progress\n\n### Current Effective State\n- The boundary wording has been propagated into handbook sources and tests; details: <doc-path>#<section>\n\n### Decisions In Effect\n- role assets / personal_memory / team_memory / Taskdoc-progress / reminders now have separated responsibilities\n\n### Next Step\n- Re-verify control manual wording, Taskdoc display text, and boundary tests\n\n### Still-Active Blockers\n- None',
200
208
  });
201
209
  ```
@@ -45,7 +45,7 @@ Add reminder.
45
45
  Use when:
46
46
 
47
47
  - Adding a new temporary working-set item
48
- - Creating continuation-package notes before `clear_mind`; rough bridge notes are acceptable when context is already degraded
48
+ - Before `clear_mind`, the Main Dialog first records undocumented discussion details the next course needs to know into Taskdoc, then creates continuation-package notes; a Side Dialog directly maintains sufficiently detailed continuation-package reminders. When the current course is already under caution/critical remediation, Side Dialog reminder length has no technical limit and rough bridge notes are acceptable
49
49
 
50
50
  **Parameters:**
51
51
 
@@ -160,7 +160,37 @@ updated_at: <update timestamp>
160
160
  - Changes visible to all teammates
161
161
  - 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
162
 
163
- ### 6. recall_taskdoc
163
+ ### 6. mind_more
164
+
165
+ Append entries to a Taskdoc section; defaults to `progress`, reducing full-section replacement pressure.
166
+
167
+ **Parameters:**
168
+
169
+ - `items` (required): Entries to append; each item must be a non-empty string
170
+ - `sep` (optional): Separator between existing content and new content, and between entries. Defaults to `\n`
171
+ - `selector` (optional): Chapter selector. Defaults to `progress`; use `goals` / `constraints` / `progress`
172
+ - `category` (optional): Extra section directory; with `selector`, targets `<category>/<selector>.md`
173
+
174
+ **Example:**
175
+
176
+ ```typescript
177
+ mind_more({
178
+ items: [
179
+ '- Next: review verification results (details: <doc-path>#<section>)',
180
+ '- Blocker: API acceptance criteria pending',
181
+ ],
182
+ });
183
+ ```
184
+
185
+ **Characteristics:**
186
+
187
+ - Append-only: it does not deduplicate, rewrite, or compress old content
188
+ - Good for adding one or two still-effective states, decisions, next steps, or blockers to `progress`
189
+ - 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
+ - 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
+ ### 7. recall_taskdoc
164
194
 
165
195
  Read taskdoc chapter.
166
196
 
@@ -230,11 +260,21 @@ update_reminder({
230
260
 
231
261
  ### Update Taskdoc Progress
232
262
 
263
+ ```typescript
264
+ mind_more({
265
+ items: [
266
+ '- Next: strengthen the bulletin-board semantics of Taskdoc `progress` (details: <doc-path>#<section>)',
267
+ ],
268
+ });
269
+ ```
270
+
271
+ ### Replace Taskdoc Progress
272
+
233
273
  ```typescript
234
274
  change_mind({
235
275
  selector: 'progress',
236
276
  content:
237
- '## Progress\n\n### Current Effective State\n- The handbook boundary split is now agreed: role assets / personal long-lived experience / Taskdoc-progress / reminders\n\n### Decisions In Effect\n- `persona / knowhow / pitfalls` no longer absorb daily member experience\n- `personal_memory` is reserved for one member\\'s reusable long-lived experience\n\n### Next Step\n- Strengthen the bulletin-board semantics of Taskdoc `progress`\n\n### Still-Active Blockers\n- None',
277
+ '## Progress\n\n### Current Effective State\n- The handbook boundary split is now agreed: role assets / personal long-lived experience / Taskdoc-progress / reminders; details: <doc-path>#<section>\n\n### Decisions In Effect\n- `persona / knowhow / pitfalls` no longer absorb daily member experience\n- `personal_memory` is reserved for one member\\'s reusable long-lived experience\n\n### Next Step\n- Strengthen the bulletin-board semantics of Taskdoc `progress`\n\n### Still-Active Blockers\n- None',
238
278
  });
239
279
  ```
240
280
 
@@ -274,6 +314,6 @@ message: <error message>
274
314
 
275
315
  - Normal reminders should stay concise, fresh, and directly actionable; often 1-3 items total
276
316
  - For a continuation package, use structured notes by default: next step, key pointers, run/verify, easy-to-lose volatile details
277
- - If the current course is already under caution/critical remediation, rough multi-reminder bridge notes are acceptable; in the current course only preserve info + `clear_mind`, and reconcile them as the first step only after the system actually starts the new course
278
- - Keep only details not already covered by Taskdoc; do not repeat team-shared status. If the team needs “where we are now / which decisions are in effect / what is next / which blockers still hold”, write it back to Taskdoc `progress`
317
+ - If the current course is already under caution/critical remediation: the Main Dialog first records undocumented discussion details the next course needs to know into the appropriate Taskdoc sections, then keeps necessary continuation-package reminders; a Side Dialog must not maintain Taskdoc or draft Taskdoc update proposals, and should directly maintain sufficiently detailed continuation-package reminders with no technical length limit. Rough multi-reminder bridge notes are acceptable and should be reconciled as the first step only after the system actually starts the new course
318
+ - Keep only details still not covered by Taskdoc; do not repeat team-shared status. If the team needs “where we are now / which decisions are in effect / what is next / which blockers still hold”, write it back to Taskdoc `progress`
279
319
  - Do not paste long logs, large tool outputs, or raw material into reminders
@@ -93,9 +93,9 @@ A: `dialog` 提醒只用于当前对话的工作集。`personal` 提醒会在所
93
93
 
94
94
  A: 只有当这条提醒与你的持续职责相关,且在所有由你主理的后续对话里也应该继续被看到时,才用 `personal`。其它情况默认都用 `dialog`。
95
95
 
96
- ### Q: change_mind 会重置对话轮次吗?
96
+ ### Q: mind_more / change_mind 会重置对话轮次吗?
97
97
 
98
- A: 不会。`change_mind` 仅更新差遣牒内容,不重置对话轮次。
98
+ A: 不会。`mind_more` / `change_mind` 仅更新差遣牒内容,不重置对话轮次。
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
 
@@ -40,7 +40,7 @@
40
40
  - `personal` 提醒会在所有由你主理的后续对话里继续可见
41
41
  - 可随时添加、修改、删除
42
42
  - 默认应保持少量、可扫读、可直接指导下一步
43
- - 准备 `clear_mind` 时,默认优先压缩成结构化接续包提醒项;若当前程已被系统置于吃紧/告急处置态,也可先保留多条粗略提醒项过桥
43
+ - 准备 `clear_mind` 时,主线对话先把应由下一程知会的未落文档讨论细节补进差遣牒,再压缩成结构化接续包提醒项;支线对话直接维护足够详尽的接续包提醒项。若当前程已被系统置于吃紧/告急处置态,支线提醒项长度没有技术限制,也可先保留多条粗略提醒项过桥
44
44
 
45
45
  **与 memory 的区别:**
46
46
  | 特性 | dialog reminder | personal reminder | personal memory |
@@ -73,20 +73,23 @@
73
73
 
74
74
  **更新规则:**
75
75
 
76
- - 每次调用 `change_mind` 会替换整个章节
76
+ - `mind_more` 用于少量追加条目;`change_mind` 用于整章替换
77
77
  - 不重置对话轮次
78
78
  - 变更对所有队友可见
79
79
  - 写入 `progress` 时,应默认假设全队成员会用它快速同步“当前任务真相”,而不是阅读你的个人过程记录
80
+ - 不要无脑连续使用 `mind_more` 把 `progress` 写成流水账;当公告牌开始堆积、重复或含过期信息时,用 `change_mind` 按当前仍有效的事实压缩整理
81
+ - 细节展开、调查过程、长日志、方案全文和验收记录应落进 rtws 正式文档;差遣牒只保留要点、当前结论、下一步,以及指向正式文档的路径/章节/命令等定位 pointer
80
82
 
81
83
  ## 工具概览
82
84
 
83
- | 工具 | 功能 |
84
- | --------------- | ---------------------------------------- |
85
- | add_reminder | 添加提醒 |
86
- | delete_reminder | 删除提醒 |
87
- | update_reminder | 更新提醒内容 |
88
- | change_mind | 更新差遣牒(goals/constraints/progress) |
89
- | recall_taskdoc | 读取差遣牒章节 |
85
+ | 工具 | 功能 |
86
+ | --------------- | -------------------------------------------- |
87
+ | add_reminder | 添加提醒 |
88
+ | delete_reminder | 删除提醒 |
89
+ | update_reminder | 更新提醒内容 |
90
+ | mind_more | 向差遣牒追加条目(默认 progress) |
91
+ | change_mind | 整章替换差遣牒(goals/constraints/progress) |
92
+ | recall_taskdoc | 读取差遣牒章节 |
90
93
 
91
94
  ## 跨对话回复路由
92
95
 
@@ -127,9 +130,11 @@
127
130
 
128
131
  - 保持简洁:默认提醒项常见 1–3 条,优先 `update_reminder` 压缩/合并
129
132
  - 区分载体:需要向全队同步的当前有效状态、关键决策、下一步与仍成立阻塞,写入 `progress` 这一准实时任务公告牌;提醒项只留个人/当前对话恢复所需细节
130
- - 面向全队:`progress` 应保持可扫读、以“当前仍有效”为准,不要退化成个人日志、流水账、临时便签或历史残影堆积
131
- - 换程前收束:默认优先整理成结构化接续包提醒项;若系统已把当前程切到吃紧/告急处置态,则先保留多条粗略提醒项过桥也可以;当前程只做保信息 + `clear_mind`,系统真正开启新一程后第一步再收敛
133
+ - 面向全队:`progress` 应保持可扫读、以“当前仍有效”为准,不要退化成个人日志、流水账、临时便签或历史残影堆积;少量新增用 `mind_more`,需要清旧/重排/压缩时用 `change_mind`
134
+ - 按需整理:`mind_more` 不是默认记账动作。若同一主题已有多条阶段性记录,优先用 `change_mind` 合并成当前摘要;把细节放进 rtws 正式文档,并在差遣牒里保留文档定位 pointer
135
+ - 换程前收束:主线对话先把尚未落实到文档、且下一程需要知会的讨论细节写入差遣牒合适章节,再整理结构化接续包提醒项;支线对话不要维护差遣牒,也不要整理差遣牒更新提案,直接维护足够详尽的接续包提醒项。若系统已把当前程切到吃紧/告急处置态,则先保留多条粗略提醒项过桥也可以;当前程只做落文档/保信息 + `clear_mind`(支线只做保信息 + `clear_mind`),系统真正开启新一程后第一步再收敛
132
136
  - 拒绝原料堆积:不要把长日志/大段 tool output 直接塞进提醒项
137
+ - 文档分层:差遣牒写“现在应如何同步/推进”,正式文档写“为什么、怎么做、详细证据和完整过程”。差遣牒需要引用正式文档时,写稳定路径/章节名/相关命令,而不是复制整段内容
133
138
 
134
139
  ### 4. `progress` 内容取舍
135
140
 
@@ -138,16 +143,18 @@
138
143
  - 当前已确认、仍成立的 blocker
139
144
  - 当前全队应共识的下一步
140
145
  - 当前阶段性闭环与尚未闭环的 gap
146
+ - 已落正式文档的关键内容摘要,以及定位该文档的 pointer
141
147
  - 不适合写进 `progress`:
142
148
  - “我刚刚看了什么文件”
143
149
  - “我准备先试一个小想法”
144
150
  - 只对当前说话者自己有用的临时便签
145
151
  - 无法判断是否仍然有效的历史痕迹
152
+ - 可在 rtws 正式文档中承载的细节展开、长日志、完整方案或验收记录全文
146
153
 
147
154
  ## 限制与注意事项
148
155
 
149
156
  1. `dialog` 提醒会随对话结束而结束;`personal` 提醒会在所有由你主理的后续对话里继续可见
150
- 2. 差遣牒更新使用整段替换,请确保合并已有内容
151
- 3. `change_mind` 不重置对话轮次
152
- 4. 接续包提醒项只保留差遣牒未覆盖、但恢复工作容易丢的细节
157
+ 2. 差遣牒少量新增可用 `mind_more` 追加;整段替换用 `change_mind`,请确保合并已有内容。不要把 `mind_more` 当流水账工具;需要整理、去旧、合并同主题记录时直接 `change_mind`
158
+ 3. `mind_more` / `change_mind` 不重置对话轮次
159
+ 4. 接续包提醒项只保留差遣牒仍未覆盖、但恢复工作容易丢的细节;主线对话应先把当前对话历史中应由下一程知会的未落文档讨论细节写入差遣牒合适章节;支线对话在吃紧/告急时只维护足够详尽的接续包提醒项
153
160
  5. 不要把 `personal` 提醒堆成长期事实仓库;耐久知识应迁到 `personal_memory`
@@ -116,15 +116,21 @@ replyTellaskBack({
116
116
 
117
117
  ### 场景描述
118
118
 
119
- 把当前有效状态、关键决策、下一步与仍成立阻塞公告给全队,而不是写个人流水账。
119
+ 把当前有效状态、关键决策、下一步与仍成立阻塞公告给全队,而不是写个人流水账。若细节已整理到 rtws 正式文档,`progress` 只写摘要和文档定位 pointer。
120
120
 
121
121
  ### 示例
122
122
 
123
123
  ```typescript
124
+ // 少量新增当前仍有效的公告条目
125
+ mind_more({
126
+ items: ['- 下一步:复核 control / team_mgmt 手册与测试是否对齐(详见 <文档路径>#<章节>)'],
127
+ });
128
+
129
+ // 需要清理旧项、重排、同主题合并或压缩流水账时,整章替换
124
130
  change_mind({
125
131
  selector: 'progress',
126
132
  content:
127
- '## Progress\n\n### 当前有效状态\n- 已完成三类记忆载体边界收口,准备补 Taskdoc 公告牌属性\n\n### 已生效决策\n- `personal_memory` 不再作为短期杂物柜\n- `team_memory` 只承接团队长期共识与不变量\n\n### 下一步\n- 在 control / team_mgmt 手册中补强 `progress` 的公告牌语义\n\n### 仍成立阻塞\n- 无',
133
+ '## Progress\n\n### 当前有效状态\n- 已完成三类记忆载体边界收口,准备补 Taskdoc 公告牌属性;细节见 <文档路径>#<章节>\n\n### 已生效决策\n- `personal_memory` 不再作为短期杂物柜\n- `team_memory` 只承接团队长期共识与不变量\n\n### 下一步\n- 在 control / team_mgmt 手册中补强 `progress` 的公告牌语义\n\n### 仍成立阻塞\n- 无',
128
134
  });
129
135
  ```
130
136
 
@@ -186,7 +192,7 @@ recall_taskdoc({
186
192
 
187
193
  ### 场景描述
188
194
 
189
- 维护差遣牒的完整性和一致性,并确保 `progress` 始终是可供全队扫读的当前真相快照。
195
+ 维护差遣牒的完整性和一致性,并确保 `progress` 始终是可供全队扫读的当前真相快照;细节展开放入 rtws 正式文档,差遣牒只保留摘要和定位 pointer。
190
196
 
191
197
  ### 示例
192
198
 
@@ -195,6 +201,6 @@ recall_taskdoc({
195
201
  change_mind({
196
202
  selector: 'progress',
197
203
  content:
198
- '## Progress\n\n### 当前有效状态\n- 边界口径已统一到手册源头与测试\n\n### 已生效决策\n- 角色级资产 / personal_memory / team_memory / Taskdoc-progress / reminders 的职责已经切开\n\n### 下一步\n- 复验 control 手册、Taskdoc 展示文案与边界测试\n\n### 仍成立阻塞\n- 无',
204
+ '## Progress\n\n### 当前有效状态\n- 边界口径已统一到手册源头与测试;细节见 <文档路径>#<章节>\n\n### 已生效决策\n- 角色级资产 / personal_memory / team_memory / Taskdoc-progress / reminders 的职责已经切开\n\n### 下一步\n- 复验 control 手册、Taskdoc 展示文案与边界测试\n\n### 仍成立阻塞\n- 无',
199
205
  });
200
206
  ```