dominds 1.25.0 → 1.25.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 (230) hide show
  1. package/README.md +4 -3
  2. package/README.zh.md +4 -3
  3. package/dist/dialog-display-state.d.ts +3 -3
  4. package/dist/dialog-display-state.js +12 -8
  5. package/dist/dialog.d.ts +3 -3
  6. package/dist/dialog.js +42 -20
  7. package/dist/docs/design.md +4 -0
  8. package/dist/docs/design.zh.md +4 -0
  9. package/dist/docs/dlg-drive-algo.zh.md +5 -0
  10. package/dist/docs/roadmap.md +2 -0
  11. package/dist/docs/roadmap.zh.md +2 -0
  12. package/dist/llm/gen/mock.d.ts +2 -2
  13. package/dist/llm/gen/mock.js +2 -2
  14. package/dist/llm/kernel-driver/drive.js +41 -14
  15. package/dist/llm/kernel-driver/engine.d.ts +1 -1
  16. package/dist/llm/kernel-driver/idle-reminder-wake.js +1 -1
  17. package/dist/llm/kernel-driver/sideDialog.d.ts +1 -1
  18. package/dist/llm/kernel-driver/sideDialog.js +7 -3
  19. package/dist/llm/kernel-driver/tellask-special.js +1 -6
  20. package/dist/llm/kernel-driver/types.d.ts +1 -1
  21. package/dist/minds/system-prompt-parts.js +4 -4
  22. package/dist/persistence.d.ts +1 -7
  23. package/dist/persistence.js +186 -149
  24. package/dist/priming.js +116 -35
  25. package/dist/runtime/driver-messages.d.ts +1 -1
  26. package/dist/runtime/driver-messages.js +37 -19
  27. package/dist/server/api-routes.js +18 -0
  28. package/dist/server/server-core.d.ts +1 -0
  29. package/dist/server/server-core.js +11 -0
  30. package/dist/server/websocket-handler.js +2 -1
  31. package/dist/shared-reminders.d.ts +11 -3
  32. package/dist/shared-reminders.js +62 -34
  33. package/dist/team.js +4 -1
  34. package/dist/tool.d.ts +1 -1
  35. package/dist/tool.js +1 -1
  36. package/dist/tools/app-reminders.js +8 -2
  37. package/dist/tools/builtins.js +30 -0
  38. package/dist/tools/ctrl.js +34 -109
  39. package/dist/tools/fs.d.ts +2 -0
  40. package/dist/tools/fs.js +281 -2
  41. package/dist/tools/os.d.ts +11 -0
  42. package/dist/tools/os.js +26 -15
  43. package/dist/tools/picture.d.ts +1 -0
  44. package/dist/tools/picture.js +64 -1
  45. package/dist/tools/prompts/codex_inspect_and_patch_tools/en/tools.md +5 -0
  46. package/dist/tools/prompts/codex_inspect_and_patch_tools/zh/tools.md +5 -0
  47. package/dist/tools/prompts/control/en/errors.md +5 -19
  48. package/dist/tools/prompts/control/en/index.md +5 -4
  49. package/dist/tools/prompts/control/en/principles.md +23 -19
  50. package/dist/tools/prompts/control/en/scenarios.md +17 -11
  51. package/dist/tools/prompts/control/en/tools.md +4 -6
  52. package/dist/tools/prompts/control/zh/errors.md +5 -19
  53. package/dist/tools/prompts/control/zh/index.md +5 -4
  54. package/dist/tools/prompts/control/zh/principles.md +22 -19
  55. package/dist/tools/prompts/control/zh/scenarios.md +17 -11
  56. package/dist/tools/prompts/control/zh/tools.md +4 -6
  57. package/dist/tools/prompts/fs_read/en/errors.md +6 -0
  58. package/dist/tools/prompts/fs_read/en/index.md +17 -0
  59. package/dist/tools/prompts/fs_read/en/principles.md +5 -0
  60. package/dist/tools/prompts/fs_read/en/scenarios.md +3 -0
  61. package/dist/tools/prompts/fs_read/en/tools.md +11 -0
  62. package/dist/tools/prompts/fs_read/zh/errors.md +6 -0
  63. package/dist/tools/prompts/fs_read/zh/index.md +17 -0
  64. package/dist/tools/prompts/fs_read/zh/principles.md +5 -0
  65. package/dist/tools/prompts/fs_read/zh/scenarios.md +3 -0
  66. package/dist/tools/prompts/fs_read/zh/tools.md +11 -0
  67. package/dist/tools/prompts/os/en/index.md +1 -1
  68. package/dist/tools/prompts/os/en/principles.md +1 -1
  69. package/dist/tools/prompts/os/en/scenarios.md +21 -0
  70. package/dist/tools/prompts/os/en/tools.md +6 -0
  71. package/dist/tools/prompts/os/zh/index.md +1 -1
  72. package/dist/tools/prompts/os/zh/principles.md +1 -1
  73. package/dist/tools/prompts/os/zh/scenarios.md +21 -0
  74. package/dist/tools/prompts/os/zh/tools.md +6 -0
  75. package/dist/tools/prompts/personal_memory/en/index.md +1 -1
  76. package/dist/tools/prompts/personal_memory/en/principles.md +2 -2
  77. package/dist/tools/prompts/personal_memory/zh/index.md +1 -1
  78. package/dist/tools/prompts/personal_memory/zh/principles.md +2 -2
  79. package/dist/tools/registry.d.ts +6 -0
  80. package/dist/tools/ripgrep.d.ts +5 -0
  81. package/dist/tools/ripgrep.js +482 -1
  82. package/dist/tools/team_mgmt.js +8 -8
  83. package/dist/tools/txt.d.ts +34 -0
  84. package/dist/tools/txt.js +221 -1
  85. package/package.json +3 -3
  86. package/webapp/dist/assets/{_basePickBy-ZLV93S3E.js → _basePickBy-CbWZ8qnS.js} +3 -3
  87. package/webapp/dist/assets/_basePickBy-CbWZ8qnS.js.map +1 -0
  88. package/webapp/dist/assets/{_baseUniq-D0wSOJ06.js → _baseUniq-IY-Vfzx1.js} +2 -2
  89. package/webapp/dist/assets/_baseUniq-IY-Vfzx1.js.map +1 -0
  90. package/webapp/dist/assets/{arc-BHclbMTS.js → arc--U2Vks6y.js} +2 -2
  91. package/webapp/dist/assets/arc--U2Vks6y.js.map +1 -0
  92. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-CK99gE_D.js → architectureDiagram-VXUJARFQ-DpryGqjy.js} +8 -26
  93. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-DpryGqjy.js.map +1 -0
  94. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-fE5MBTEU.js → blockDiagram-VD42YOAC-TTufCfiE.js} +170 -187
  95. package/webapp/dist/assets/blockDiagram-VD42YOAC-TTufCfiE.js.map +1 -0
  96. package/webapp/dist/assets/{c4Diagram-IC4MRINW-BSLyPyoU.js → c4Diagram-YG6GDRKO-B4RPsw5H.js} +4 -4
  97. package/webapp/dist/assets/c4Diagram-YG6GDRKO-B4RPsw5H.js.map +1 -0
  98. package/webapp/dist/assets/{channel-DSvMpp-a.js → channel-DAtGYJHZ.js} +2 -2
  99. package/webapp/dist/assets/channel-DAtGYJHZ.js.map +1 -0
  100. package/webapp/dist/assets/{chunk-4BX2VUAB-OXEX170k.js → chunk-4BX2VUAB-JtO__vAF.js} +2 -2
  101. package/webapp/dist/assets/chunk-4BX2VUAB-JtO__vAF.js.map +1 -0
  102. package/webapp/dist/assets/{chunk-55IACEB6-BFQ_spQD.js → chunk-55IACEB6-JMRC8yG1.js} +2 -2
  103. package/webapp/dist/assets/chunk-55IACEB6-JMRC8yG1.js.map +1 -0
  104. package/webapp/dist/assets/{chunk-WL4C6EOR-PtH-blkK.js → chunk-B4BG7PRW-BDIpf8Iz.js} +121 -171
  105. package/webapp/dist/assets/chunk-B4BG7PRW-BDIpf8Iz.js.map +1 -0
  106. package/webapp/dist/assets/{chunk-NQ4KR5QH-B_ZhWMXR.js → chunk-DI55MBZ5-j9B4rifK.js} +7 -9
  107. package/webapp/dist/assets/chunk-DI55MBZ5-j9B4rifK.js.map +1 -0
  108. package/webapp/dist/assets/{chunk-FMBD7UC4-CbQ2BBPs.js → chunk-FMBD7UC4-DFXKLjHC.js} +2 -2
  109. package/webapp/dist/assets/chunk-FMBD7UC4-DFXKLjHC.js.map +1 -0
  110. package/webapp/dist/assets/{chunk-KX2RTZJC-BMd-daMY.js → chunk-QN33PNHL-BKzkeJ-b.js} +2 -2
  111. package/webapp/dist/assets/chunk-QN33PNHL-BKzkeJ-b.js.map +1 -0
  112. package/webapp/dist/assets/{chunk-QZHKN3VN-Cbf92xIw.js → chunk-QZHKN3VN-DiZd3UNl.js} +2 -2
  113. package/webapp/dist/assets/chunk-QZHKN3VN-DiZd3UNl.js.map +1 -0
  114. package/webapp/dist/assets/{chunk-JSJVCQXG-C4P1mjCL.js → chunk-TZMSLE5B-BaE4C244.js} +6 -14
  115. package/webapp/dist/assets/chunk-TZMSLE5B-BaE4C244.js.map +1 -0
  116. package/webapp/dist/assets/{classDiagram-VBA2DB6C-Dc3ncaD0.js → classDiagram-2ON5EDUG-CNF8ZohD.js} +6 -7
  117. package/webapp/dist/assets/classDiagram-2ON5EDUG-CNF8ZohD.js.map +1 -0
  118. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-Dc3ncaD0.js → classDiagram-v2-WZHVMYZB-CNF8ZohD.js} +6 -7
  119. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-CNF8ZohD.js.map +1 -0
  120. package/webapp/dist/assets/{clone-E9Ad85BC.js → clone-Nq0Ko0Gv.js} +2 -2
  121. package/webapp/dist/assets/clone-Nq0Ko0Gv.js.map +1 -0
  122. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-B-nj0o74.js → cose-bilkent-S5V4N54A-uHPLSeKv.js} +2 -2
  123. package/webapp/dist/assets/cose-bilkent-S5V4N54A-uHPLSeKv.js.map +1 -0
  124. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  125. package/webapp/dist/assets/{dagre-KLK3FWXG-CyJYNIbm.js → dagre-6UL2VRFP-C1awWpU3.js} +7 -7
  126. package/webapp/dist/assets/dagre-6UL2VRFP-C1awWpU3.js.map +1 -0
  127. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  128. package/webapp/dist/assets/{diagram-E7M64L7V-C8eweQ7b.js → diagram-PSM6KHXK-Bf69p76M.js} +10 -10
  129. package/webapp/dist/assets/diagram-PSM6KHXK-Bf69p76M.js.map +1 -0
  130. package/webapp/dist/assets/{diagram-IFDJBPK2-DMdygRl0.js → diagram-QEK2KX5R-Bvlbx8Jp.js} +8 -9
  131. package/webapp/dist/assets/diagram-QEK2KX5R-Bvlbx8Jp.js.map +1 -0
  132. package/webapp/dist/assets/{diagram-P4PSJMXO-BQDZHb0a.js → diagram-S2PKOQOG-CGjGalBu.js} +8 -8
  133. package/webapp/dist/assets/diagram-S2PKOQOG-CGjGalBu.js.map +1 -0
  134. package/webapp/dist/assets/{erDiagram-INFDFZHY-C1HaXN6E.js → erDiagram-Q2GNP2WA-Ds3qhwkG.js} +75 -96
  135. package/webapp/dist/assets/erDiagram-Q2GNP2WA-Ds3qhwkG.js.map +1 -0
  136. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-24nNqQyo.js → flowDiagram-NV44I4VS-B1wDG_l5.js} +81 -98
  137. package/webapp/dist/assets/flowDiagram-NV44I4VS-B1wDG_l5.js.map +1 -0
  138. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-BWPOFaLV.js → ganttDiagram-JELNMOA3-BwuYt2bO.js} +3 -28
  139. package/webapp/dist/assets/ganttDiagram-JELNMOA3-BwuYt2bO.js.map +1 -0
  140. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-D7_L-p_Y.js → gitGraphDiagram-V2S2FVAM-B2Tw773z.js} +46 -38
  141. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-B2Tw773z.js.map +1 -0
  142. package/webapp/dist/assets/graph-CS_H7jBi.js +425 -0
  143. package/webapp/dist/assets/graph-CS_H7jBi.js.map +1 -0
  144. package/webapp/dist/assets/{index-CDCDAfqP.js → index-arD81Nnh.js} +1086 -1044
  145. package/webapp/dist/assets/{index-CDCDAfqP.js.map → index-arD81Nnh.js.map} +1 -1
  146. package/webapp/dist/assets/{index-BQoNJEGT.css → index-yycTJNYb.css} +1 -1
  147. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-CvaBM5j6.js → infoDiagram-HS3SLOUP-C9_JKYhm.js} +7 -7
  148. package/webapp/dist/assets/infoDiagram-HS3SLOUP-C9_JKYhm.js.map +1 -0
  149. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  150. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-TQR6_teO.js → journeyDiagram-XKPGCS4Q-BhZggYOL.js} +5 -5
  151. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-BhZggYOL.js.map +1 -0
  152. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-B-BOuC-U.js → kanban-definition-3W4ZIXB7-B-R2Xm4Y.js} +3 -5
  153. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-B-R2Xm4Y.js.map +1 -0
  154. package/webapp/dist/assets/{layout-B8yqIqbx.js → layout-BzMatxDa.js} +5 -5
  155. package/webapp/dist/assets/layout-BzMatxDa.js.map +1 -0
  156. package/webapp/dist/assets/{linear-CoLfiZKK.js → linear-BuuJkw_U.js} +2 -2
  157. package/webapp/dist/assets/linear-BuuJkw_U.js.map +1 -0
  158. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-P70BMIHI.js → mindmap-definition-VGOIOE7T-BR7oDKBR.js} +5 -7
  159. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BR7oDKBR.js.map +1 -0
  160. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  161. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-DsS_4dTB.js → pieDiagram-ADFJNKIX--QWeT2vZ.js} +8 -8
  162. package/webapp/dist/assets/pieDiagram-ADFJNKIX--QWeT2vZ.js.map +1 -0
  163. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DoM9PEq-.js → quadrantDiagram-AYHSOK5B-BpqtmN3r.js} +3 -3
  164. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-BpqtmN3r.js.map +1 -0
  165. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-Bn3lYMMI.js → requirementDiagram-UZGBJVZJ-CIXjIi4F.js} +6 -16
  166. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-CIXjIi4F.js.map +1 -0
  167. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-97kCegRT.js → sankeyDiagram-TZEHDZUN-DJIt7SRz.js} +2 -2
  168. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-DJIt7SRz.js.map +1 -0
  169. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DXqjQjf6.js → sequenceDiagram-WL72ISMW-BpDK1ROT.js} +201 -601
  170. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-BpDK1ROT.js.map +1 -0
  171. package/webapp/dist/assets/{stateDiagram-RAJIS63D-DQcTPKWP.js → stateDiagram-FKZM4ZOC-BoKGfmHf.js} +9 -9
  172. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-BoKGfmHf.js.map +1 -0
  173. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-DHmxRVJn.js → stateDiagram-v2-4FDKWEC3--haXC2JK.js} +5 -5
  174. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3--haXC2JK.js.map +1 -0
  175. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BlovQQ4B.js → timeline-definition-IT6M3QCI-BmSg3Hjf.js} +3 -3
  176. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BmSg3Hjf.js.map +1 -0
  177. package/webapp/dist/assets/{treemap-KZPCXAKY-CGu93c9S.js → treemap-GDKQZRPO-D9OuyDVA.js} +24 -37
  178. package/webapp/dist/assets/treemap-GDKQZRPO-D9OuyDVA.js.map +1 -0
  179. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BKa1DxVq.js → xychartDiagram-PRI3JC2R-CVqSvO_S.js} +4 -4
  180. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CVqSvO_S.js.map +1 -0
  181. package/webapp/dist/index.html +2 -2
  182. package/webapp/dist/assets/_basePickBy-ZLV93S3E.js.map +0 -1
  183. package/webapp/dist/assets/_baseUniq-D0wSOJ06.js.map +0 -1
  184. package/webapp/dist/assets/arc-BHclbMTS.js.map +0 -1
  185. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CK99gE_D.js.map +0 -1
  186. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-fE5MBTEU.js.map +0 -1
  187. package/webapp/dist/assets/c4Diagram-IC4MRINW-BSLyPyoU.js.map +0 -1
  188. package/webapp/dist/assets/channel-DSvMpp-a.js.map +0 -1
  189. package/webapp/dist/assets/chunk-4BX2VUAB-OXEX170k.js.map +0 -1
  190. package/webapp/dist/assets/chunk-55IACEB6-BFQ_spQD.js.map +0 -1
  191. package/webapp/dist/assets/chunk-FMBD7UC4-CbQ2BBPs.js.map +0 -1
  192. package/webapp/dist/assets/chunk-JSJVCQXG-C4P1mjCL.js.map +0 -1
  193. package/webapp/dist/assets/chunk-KX2RTZJC-BMd-daMY.js.map +0 -1
  194. package/webapp/dist/assets/chunk-NQ4KR5QH-B_ZhWMXR.js.map +0 -1
  195. package/webapp/dist/assets/chunk-QZHKN3VN-Cbf92xIw.js.map +0 -1
  196. package/webapp/dist/assets/chunk-WL4C6EOR-PtH-blkK.js.map +0 -1
  197. package/webapp/dist/assets/classDiagram-VBA2DB6C-Dc3ncaD0.js.map +0 -1
  198. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-Dc3ncaD0.js.map +0 -1
  199. package/webapp/dist/assets/clone-E9Ad85BC.js.map +0 -1
  200. package/webapp/dist/assets/cose-bilkent-S5V4N54A-B-nj0o74.js.map +0 -1
  201. package/webapp/dist/assets/dagre-KLK3FWXG-CyJYNIbm.js.map +0 -1
  202. package/webapp/dist/assets/diagram-E7M64L7V-C8eweQ7b.js.map +0 -1
  203. package/webapp/dist/assets/diagram-IFDJBPK2-DMdygRl0.js.map +0 -1
  204. package/webapp/dist/assets/diagram-P4PSJMXO-BQDZHb0a.js.map +0 -1
  205. package/webapp/dist/assets/erDiagram-INFDFZHY-C1HaXN6E.js.map +0 -1
  206. package/webapp/dist/assets/flowDiagram-PKNHOUZH-24nNqQyo.js.map +0 -1
  207. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-BWPOFaLV.js.map +0 -1
  208. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-D7_L-p_Y.js.map +0 -1
  209. package/webapp/dist/assets/graph-OHu4dL2n.js +0 -782
  210. package/webapp/dist/assets/graph-OHu4dL2n.js.map +0 -1
  211. package/webapp/dist/assets/infoDiagram-LFFYTUFH-CvaBM5j6.js.map +0 -1
  212. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DB1l2Uue.js +0 -966
  213. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-DB1l2Uue.js.map +0 -1
  214. package/webapp/dist/assets/journeyDiagram-4ABVD52K-TQR6_teO.js.map +0 -1
  215. package/webapp/dist/assets/kanban-definition-K7BYSVSG-B-BOuC-U.js.map +0 -1
  216. package/webapp/dist/assets/layout-B8yqIqbx.js.map +0 -1
  217. package/webapp/dist/assets/linear-CoLfiZKK.js.map +0 -1
  218. package/webapp/dist/assets/mindmap-definition-YRQLILUH-P70BMIHI.js.map +0 -1
  219. package/webapp/dist/assets/pieDiagram-SKSYHLDU-DsS_4dTB.js.map +0 -1
  220. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DoM9PEq-.js.map +0 -1
  221. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-Bn3lYMMI.js.map +0 -1
  222. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-97kCegRT.js.map +0 -1
  223. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DXqjQjf6.js.map +0 -1
  224. package/webapp/dist/assets/stateDiagram-RAJIS63D-DQcTPKWP.js.map +0 -1
  225. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DHmxRVJn.js.map +0 -1
  226. package/webapp/dist/assets/timeline-definition-YZTLITO2-BlovQQ4B.js.map +0 -1
  227. package/webapp/dist/assets/treemap-KZPCXAKY-CGu93c9S.js.map +0 -1
  228. package/webapp/dist/assets/vennDiagram-LZ73GAT5-Do1jprrz.js +0 -2487
  229. package/webapp/dist/assets/vennDiagram-LZ73GAT5-Do1jprrz.js.map +0 -1
  230. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BKa1DxVq.js.map +0 -1
package/dist/priming.js CHANGED
@@ -20,15 +20,25 @@ const time_1 = require("@longrun-ai/kernel/utils/time");
20
20
  const promises_1 = __importDefault(require("fs/promises"));
21
21
  const path_1 = __importDefault(require("path"));
22
22
  const yaml_1 = __importDefault(require("yaml"));
23
+ const zlib_1 = require("zlib");
23
24
  const frontmatter_1 = require("./markdown/frontmatter");
24
25
  const persistence_1 = require("./persistence");
26
+ const shared_reminders_1 = require("./shared-reminders");
25
27
  const tool_1 = require("./tool");
26
28
  const registry_1 = require("./tools/registry");
27
- const PRIMING_ROOT_DIR = path_1.default.resolve(process.cwd(), '.minds', 'priming');
28
- const PRIMING_INDIVIDUAL_DIR = path_1.default.resolve(PRIMING_ROOT_DIR, 'individual');
29
- const PRIMING_TEAM_SHARED_DIR = path_1.default.resolve(PRIMING_ROOT_DIR, 'team_shared');
30
- const RECENT_PRIMING_DIR = path_1.default.resolve(process.cwd(), '.dialogs', 'recent-priming');
31
29
  const RECENT_PRIMING_MAX = 20;
30
+ function getPrimingRootDir() {
31
+ return path_1.default.resolve(process.cwd(), '.minds', 'priming');
32
+ }
33
+ function getPrimingIndividualDir() {
34
+ return path_1.default.resolve(getPrimingRootDir(), 'individual');
35
+ }
36
+ function getPrimingTeamSharedDir() {
37
+ return path_1.default.resolve(getPrimingRootDir(), 'team_shared');
38
+ }
39
+ function getRecentPrimingDir() {
40
+ return path_1.default.resolve(process.cwd(), '.dialogs', 'recent-priming');
41
+ }
32
42
  function isRecord(value) {
33
43
  return typeof value === 'object' && value !== null && !Array.isArray(value);
34
44
  }
@@ -104,8 +114,9 @@ function normalizeScriptRef(raw) {
104
114
  return null;
105
115
  }
106
116
  function scriptRefToAbsolutePath(scriptRef) {
107
- const absPath = path_1.default.resolve(PRIMING_ROOT_DIR, `${scriptRef}.md`);
108
- if (!ensureInside(PRIMING_ROOT_DIR, absPath)) {
117
+ const primingRootDir = getPrimingRootDir();
118
+ const absPath = path_1.default.resolve(primingRootDir, `${scriptRef}.md`);
119
+ if (!ensureInside(primingRootDir, absPath)) {
109
120
  throw new Error(`Priming script path escapes priming root: ${scriptRef}`);
110
121
  }
111
122
  return absPath;
@@ -178,9 +189,10 @@ function parseReminderSnapshots(frontmatter) {
178
189
  const scope = item['scope'];
179
190
  if (scope !== undefined &&
180
191
  scope !== 'dialog' &&
181
- scope !== 'personal' &&
182
- scope !== 'agent_shared') {
183
- throw new Error(`${context}.scope must be "dialog", "personal", or "agent_shared" when provided`);
192
+ scope !== 'task' &&
193
+ scope !== 'agent' &&
194
+ scope !== 'runtime') {
195
+ throw new Error(`${context}.scope must be "dialog", "task", "agent", or "runtime" when provided`);
184
196
  }
185
197
  const createdAt = item['createdAt'];
186
198
  if (createdAt !== undefined && typeof createdAt !== 'string') {
@@ -197,7 +209,9 @@ function parseReminderSnapshots(frontmatter) {
197
209
  ownerName: typeof ownerName === 'string' ? ownerName.trim() : undefined,
198
210
  meta,
199
211
  echoback,
200
- scope: scope === 'dialog' || scope === 'personal' || scope === 'agent_shared' ? scope : undefined,
212
+ scope: scope === 'dialog' || scope === 'task' || scope === 'agent' || scope === 'runtime'
213
+ ? scope
214
+ : undefined,
201
215
  renderMode: renderMode === 'plain' || renderMode === 'markdown' ? renderMode : undefined,
202
216
  createdAt: typeof createdAt === 'string' ? createdAt : undefined,
203
217
  priority,
@@ -218,7 +232,11 @@ function reminderToSnapshot(reminder) {
218
232
  priority: reminder.priority,
219
233
  };
220
234
  }
221
- function materializeReminderSnapshot(snapshot, context) {
235
+ function generatePrimingReminderId(scriptRef, index) {
236
+ const checksum = (0, zlib_1.crc32)(`${scriptRef}\n${String(index)}`) >>> 0;
237
+ return `priming-${checksum.toString(16).padStart(8, '0')}`;
238
+ }
239
+ function materializeReminderSnapshot(snapshot, context, defaultScope, fallbackId) {
222
240
  const owner = snapshot.ownerName === undefined
223
241
  ? undefined
224
242
  : (() => {
@@ -229,12 +247,12 @@ function materializeReminderSnapshot(snapshot, context) {
229
247
  return resolved;
230
248
  })();
231
249
  return (0, tool_1.materializeReminder)({
232
- id: snapshot.id,
250
+ id: snapshot.id ?? fallbackId,
233
251
  content: snapshot.content,
234
252
  owner,
235
253
  meta: snapshot.meta,
236
254
  echoback: snapshot.echoback,
237
- scope: snapshot.scope,
255
+ scope: snapshot.scope ?? defaultScope,
238
256
  renderMode: snapshot.renderMode ?? 'markdown',
239
257
  createdAt: snapshot.createdAt,
240
258
  priority: snapshot.priority,
@@ -1537,9 +1555,6 @@ function parseRecordsFromBody(body) {
1537
1555
  }
1538
1556
  records.push(normalizedRecord);
1539
1557
  }
1540
- if (records.length === 0) {
1541
- throw new Error("Priming script must contain at least one '### record <type>' block");
1542
- }
1543
1558
  return records;
1544
1559
  }
1545
1560
  function parsePrimingScript(raw) {
@@ -1580,7 +1595,7 @@ async function listMarkdownFilesRecursively(dirPath) {
1580
1595
  return files;
1581
1596
  }
1582
1597
  async function validateAllPrimingScriptsInRtws() {
1583
- const absFiles = await listMarkdownFilesRecursively(PRIMING_ROOT_DIR);
1598
+ const absFiles = await listMarkdownFilesRecursively(getPrimingRootDir());
1584
1599
  const sorted = [...absFiles].sort((a, b) => a.localeCompare(b));
1585
1600
  const issues = [];
1586
1601
  for (const absPath of sorted) {
@@ -1609,7 +1624,7 @@ async function validateAllPrimingScriptsInRtws() {
1609
1624
  };
1610
1625
  }
1611
1626
  function parseSummaryFromAbsolutePath(absPath) {
1612
- const rel = path_1.default.relative(PRIMING_ROOT_DIR, absPath).replace(/\\/g, '/');
1627
+ const rel = path_1.default.relative(getPrimingRootDir(), absPath).replace(/\\/g, '/');
1613
1628
  const relNoExt = rel.toLowerCase().endsWith('.md') ? rel.slice(0, -'.md'.length) : rel;
1614
1629
  const parts = relNoExt.split('/');
1615
1630
  if (parts[0] === 'individual') {
@@ -1677,8 +1692,9 @@ function normalizeRecentUsageAgentId(agentIdRaw) {
1677
1692
  }
1678
1693
  function resolveRecentUsageFilePath(agentIdRaw) {
1679
1694
  const agentId = normalizeRecentUsageAgentId(agentIdRaw);
1680
- const absPath = path_1.default.resolve(RECENT_PRIMING_DIR, `${agentId}.json`);
1681
- if (!ensureInside(RECENT_PRIMING_DIR, absPath)) {
1695
+ const recentPrimingDir = getRecentPrimingDir();
1696
+ const absPath = path_1.default.resolve(recentPrimingDir, `${agentId}.json`);
1697
+ if (!ensureInside(recentPrimingDir, absPath)) {
1682
1698
  throw new Error(`Recent-priming path escapes expected directory: ${absPath}`);
1683
1699
  }
1684
1700
  return absPath;
@@ -1725,7 +1741,7 @@ async function loadRecentUsage(agentIdRaw) {
1725
1741
  }
1726
1742
  async function saveRecentUsage(agentIdRaw, file) {
1727
1743
  const filePath = resolveRecentUsageFilePath(agentIdRaw);
1728
- await promises_1.default.mkdir(RECENT_PRIMING_DIR, { recursive: true });
1744
+ await promises_1.default.mkdir(getRecentPrimingDir(), { recursive: true });
1729
1745
  await promises_1.default.writeFile(filePath, JSON.stringify(file, null, 2), 'utf-8');
1730
1746
  }
1731
1747
  async function recordRecentPrimingUsage(agentIdRaw, scriptRefs) {
@@ -1828,9 +1844,9 @@ async function searchApplicablePrimingScripts(args) {
1828
1844
  const limit = typeof args.limit === 'number' && Number.isFinite(args.limit) && args.limit > 0
1829
1845
  ? Math.floor(args.limit)
1830
1846
  : 50;
1831
- const individualDir = path_1.default.resolve(PRIMING_INDIVIDUAL_DIR, agentId);
1847
+ const individualDir = path_1.default.resolve(getPrimingIndividualDir(), agentId);
1832
1848
  const individualFiles = await listMarkdownFilesRecursively(individualDir);
1833
- const teamSharedFiles = await listMarkdownFilesRecursively(PRIMING_TEAM_SHARED_DIR);
1849
+ const teamSharedFiles = await listMarkdownFilesRecursively(getPrimingTeamSharedDir());
1834
1850
  const matched = [];
1835
1851
  const warnings = [];
1836
1852
  for (const absPath of [...individualFiles, ...teamSharedFiles]) {
@@ -1870,7 +1886,7 @@ async function loadPrimingScriptByRef(scriptRefRaw, agentIdRaw) {
1870
1886
  throw new Error(`Invalid priming script ref: ${scriptRefRaw}`);
1871
1887
  }
1872
1888
  const absPath = scriptRefToAbsolutePath(scriptRef);
1873
- if (!ensureInside(PRIMING_ROOT_DIR, absPath)) {
1889
+ if (!ensureInside(getPrimingRootDir(), absPath)) {
1874
1890
  throw new Error(`Priming script path escapes priming root: ${scriptRef}`);
1875
1891
  }
1876
1892
  const loaded = await loadScriptFromAbsolutePath(absPath);
@@ -1879,7 +1895,7 @@ async function loadPrimingScriptByRef(scriptRefRaw, agentIdRaw) {
1879
1895
  }
1880
1896
  return {
1881
1897
  summary: loaded.summary,
1882
- reminders: (loaded.parsed.reminders ?? []).map((item, index) => materializeReminderSnapshot(item, `priming script '${scriptRef}' frontmatter.reminders[${String(index)}]`)),
1898
+ reminders: (loaded.parsed.reminders ?? []).map((item, index) => materializeReminderSnapshot(item, `priming script '${scriptRef}' frontmatter.reminders[${String(index)}]`, 'task', generatePrimingReminderId(scriptRef, index))),
1883
1899
  records: loaded.parsed.records,
1884
1900
  };
1885
1901
  }
@@ -2152,11 +2168,79 @@ function primingRecordToChatMessage(record) {
2152
2168
  }
2153
2169
  }
2154
2170
  }
2171
+ function assertUniquePrimingReminderIds(reminders) {
2172
+ const seen = new Set();
2173
+ for (const reminder of reminders) {
2174
+ if (seen.has(reminder.id)) {
2175
+ throw new Error(`Duplicate reminder id in priming scripts: ${reminder.id}`);
2176
+ }
2177
+ seen.add(reminder.id);
2178
+ }
2179
+ }
2180
+ async function upsertPrimingSharedReminders(target, incoming) {
2181
+ if (incoming.length === 0)
2182
+ return;
2183
+ await (0, shared_reminders_1.mutateSharedReminders)(target, (reminders) => {
2184
+ const byId = new Map();
2185
+ reminders.forEach((reminder, index) => byId.set(reminder.id, index));
2186
+ for (const reminder of incoming) {
2187
+ const existingIndex = byId.get(reminder.id);
2188
+ if (existingIndex === undefined) {
2189
+ byId.set(reminder.id, reminders.length);
2190
+ reminders.push(reminder);
2191
+ }
2192
+ else {
2193
+ reminders[existingIndex] = reminder;
2194
+ }
2195
+ }
2196
+ });
2197
+ }
2198
+ async function applyPrimingRemindersToDialog(args) {
2199
+ if (args.reminders.length === 0)
2200
+ return;
2201
+ assertUniquePrimingReminderIds(args.reminders);
2202
+ const dialogReminders = [];
2203
+ const taskReminders = [];
2204
+ const agentReminders = [];
2205
+ for (const reminder of args.reminders) {
2206
+ const scope = reminder.scope ?? 'task';
2207
+ switch (scope) {
2208
+ case 'dialog':
2209
+ dialogReminders.push(reminder);
2210
+ break;
2211
+ case 'task':
2212
+ taskReminders.push(reminder);
2213
+ break;
2214
+ case 'agent':
2215
+ case 'runtime':
2216
+ agentReminders.push(reminder);
2217
+ break;
2218
+ }
2219
+ }
2220
+ if (dialogReminders.length > 0) {
2221
+ args.dialog.reminders.splice(0, args.dialog.reminders.length, ...dialogReminders);
2222
+ await persistence_1.DialogPersistence._saveReminderState(args.dialog.id, [...args.dialog.reminders], args.status);
2223
+ await persistence_1.DialogPersistence.appendRemindersReconciledRecord(args.dialog.id, args.dialog.reminders, {
2224
+ kind: 'root_anchor',
2225
+ rootAnchor: (0, storage_1.toRootGenerationAnchor)({ rootCourse: 1, rootGenseq: 0 }),
2226
+ }, args.status);
2227
+ }
2228
+ await upsertPrimingSharedReminders({ kind: 'task', agentId: args.agentId, taskDocPath: args.dialog.taskDocPath }, taskReminders);
2229
+ await upsertPrimingSharedReminders({ kind: 'agent', agentId: args.agentId }, agentReminders);
2230
+ args.dialog.touchReminders();
2231
+ }
2155
2232
  async function applyPrimingScriptsToDialog(args) {
2156
2233
  const agentId = args.agentId.trim();
2157
2234
  if (agentId === '') {
2158
2235
  throw new Error('agentId is required');
2159
2236
  }
2237
+ const dialogAgentId = args.dialog.agentId.trim();
2238
+ if (dialogAgentId === '') {
2239
+ throw new Error(`Dialog agentId missing for ${args.dialog.id.valueOf()}`);
2240
+ }
2241
+ if (dialogAgentId !== agentId) {
2242
+ throw new Error(`applyPrimingScriptsToDialog agentId mismatch: dialog=${dialogAgentId} request=${agentId}`);
2243
+ }
2160
2244
  const normalizedRefs = [];
2161
2245
  const seen = new Set();
2162
2246
  for (const raw of args.priming.scriptRefs) {
@@ -2182,16 +2266,13 @@ async function applyPrimingScriptsToDialog(args) {
2182
2266
  allReminders.push(...loaded.reminders);
2183
2267
  allRecords.push(...remapped.records);
2184
2268
  }
2185
- if (allRecords.length === 0) {
2186
- return { appliedScriptRefs: normalizedRefs, appendedMessageCount: 0 };
2187
- }
2188
2269
  if (allReminders.length > 0) {
2189
- args.dialog.reminders.splice(0, args.dialog.reminders.length, ...allReminders);
2190
- await persistence_1.DialogPersistence._saveReminderState(args.dialog.id, [...args.dialog.reminders], args.status);
2191
- await persistence_1.DialogPersistence.appendRemindersReconciledRecord(args.dialog.id, args.dialog.reminders, {
2192
- kind: 'root_anchor',
2193
- rootAnchor: (0, storage_1.toRootGenerationAnchor)({ rootCourse: 1, rootGenseq: 0 }),
2194
- }, args.status);
2270
+ await applyPrimingRemindersToDialog({
2271
+ dialog: args.dialog,
2272
+ agentId,
2273
+ status: args.status,
2274
+ reminders: allReminders,
2275
+ });
2195
2276
  }
2196
2277
  for (const record of allRecords) {
2197
2278
  const withSourceTag = addPrimingSourceTag(record);
@@ -2584,7 +2665,7 @@ async function saveDialogCourseAsIndividualPrimingScript(args) {
2584
2665
  const scriptRef = `individual/${ownerAgentId}/${normalizedSlug}`;
2585
2666
  const absPath = scriptRefToAbsolutePath(scriptRef);
2586
2667
  const parentDir = path_1.default.dirname(absPath);
2587
- if (!ensureInside(PRIMING_INDIVIDUAL_DIR, parentDir)) {
2668
+ if (!ensureInside(getPrimingIndividualDir(), parentDir)) {
2588
2669
  throw new Error(`Priming script directory escapes individual scope: ${parentDir}`);
2589
2670
  }
2590
2671
  const now = (0, time_1.formatUnifiedTimestamp)(new Date());
@@ -16,7 +16,7 @@ export type ReminderContextFollowingDialogState = 'user_message' | 'runtime_noti
16
16
  export declare function formatReminderContextFooter(language: LanguageCode, followingState: ReminderContextFollowingDialogState): string;
17
17
  export declare function formatReminderItemGuide(language: LanguageCode, reminderId: string, content: string, options?: {
18
18
  meta?: unknown;
19
- scope?: 'dialog' | 'personal' | 'agent_shared';
19
+ scope?: 'dialog' | 'task' | 'agent' | 'runtime';
20
20
  }): string;
21
21
  export declare function formatQ4HDiligencePushBudgetExhausted(language: LanguageCode, args: {
22
22
  maxInjectCount: number;
@@ -127,7 +127,7 @@ function formatNewCourseStartPrompt(language, args) {
127
127
  : `系统因上下文已告急(critical)而自动开启了第 ${args.nextCourse} 程对话。`;
128
128
  return (`${noticePrefix} ${prefix} ` +
129
129
  '这是一条运行时换程指令,不是新的用户诉求;不要把这条提示当成新的待办,也不要只回复“收到/好的/我会先整理提醒项”。' +
130
- '现在已经进入新一程:第一步先复核并在必要时整理接续包提醒项,以清醒头脑删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项;若提醒项已经足够清晰,就不要为了整理而整理。' +
130
+ '现在已经进入新一程:上下文已经不再吃紧,告急状况已改观。第一步先复核并在必要时整理接续包提醒项,以清醒头脑删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项;若提醒项已经足够清晰,就不要为了整理而整理。' +
131
131
  '完成这一步后,直接继续推进原任务本身;除非任务自然需要对用户交付结果,否则不要为这条提示单独回复。');
132
132
  }
133
133
  const prefix = args.source === 'clear_mind'
@@ -171,14 +171,14 @@ function formatReminderContextGuide(language) {
171
171
  `${formatSystemNoticePrefix(language)} 提醒项上下文块开始`,
172
172
  '以下是当前可见提醒项的运行时上下文投影。由于当前 LLM Provider 通常不支持 role=environment,Dominds 默认把系统运行时提醒包装投影为 role=user;个别提醒项可由其 owner 按自身契约选择 role。无论最终 role 如何,它们都不是用户的新诉求/指令,也不是聊天正文。',
173
173
  '在 WebUI 中,用户通过独立的 Reminder 小组件/面板项看到这些提醒,并能把它们和聊天正文区分开。',
174
- '请把提醒项作为工作集/状态参考;只有实际改变你的判断、计划或风险的信息,才需要提炼进后续有实质内容的对外回复。不要为了提醒项单独回复“收到/已了解/静默吸收”。',
174
+ '请把提醒项作为手头工作/状态参考;只有实际改变你的判断、计划或风险的信息,才需要提炼进后续有实质内容的对外回复。不要为了提醒项单独回复“收到/已了解/静默吸收”。',
175
175
  ].join('\n');
176
176
  }
177
177
  return [
178
178
  `${formatSystemNoticePrefix(language)} Reminder context block begins`,
179
179
  'The following visible reminders are runtime-added context projections. Because current LLM providers usually do not support role=environment, Dominds projects default system-runtime reminder wrappers as role=user; individual reminder owners may choose the role required by their own contract. Regardless of their final role, these reminders are not new user requests/instructions, and not chat transcript text.',
180
180
  'In the WebUI, the user sees these reminders through a separate Reminder widget/panel item and can distinguish them from the chat transcript.',
181
- 'Use reminders as workset/state references; only carry information into a later substantive outward reply when it materially changes your current judgment, plan, or risk. Do not send a standalone "acknowledged/noted/silently absorbed" reply for reminder items.',
181
+ 'Use reminders as current-work/state references; only carry information into a later substantive outward reply when it materially changes your current judgment, plan, or risk. Do not send a standalone "acknowledged/noted/silently absorbed" reply for reminder items.',
182
182
  ].join('\n');
183
183
  }
184
184
  function formatReminderItemProjectionNote(language) {
@@ -195,7 +195,9 @@ function formatReminderContextFooter(language, followingState) {
195
195
  if (followingState === 'runtime_notice') {
196
196
  return `${base}本轮提醒项块之后会接着出现一条运行时提示;它不是用户的新诉求/指令,请按其中的运行时要求继续推进。`;
197
197
  }
198
- return `${base}本轮没有新的用户消息或运行时提示;这是工具调用后的自动续推,请基于已有任务状态继续推进,不要把“没有新消息”理解为空系统提示。`;
198
+ return (`${base}本轮没有新的用户消息或运行时提示;这是工具调用后的自动续推。` +
199
+ '请基于已有任务状态判断下一步:若已有明确、相关且有价值的动作,就继续执行;若当前确实只能等待外部结果或用户输入,不要为了避免“等待”而寻找无关小事。' +
200
+ '不要把“没有新消息”理解为空系统提示。');
199
201
  }
200
202
  const base = `${formatSystemNoticePrefix(language)} Reminder context block ends. The reminder items between ` +
201
203
  '"Reminder context block begins" and "Reminder context block ends" are system reminders, ' +
@@ -208,7 +210,9 @@ function formatReminderContextFooter(language, followingState) {
208
210
  if (followingState === 'runtime_notice') {
209
211
  return `${base}A runtime notice follows this reminder block in this round; it is not a new user request/instruction, so follow that runtime guidance and continue the work.`;
210
212
  }
211
- return `${base}There is no new user message or runtime notice in this round; this is an automatic continuation after a tool call. Continue from the existing task state, and do not interpret the absence of a new message as an empty system notice.`;
213
+ return (`${base}There is no new user message or runtime notice in this round; this is an automatic continuation after a tool call. ` +
214
+ 'Judge the next step from the existing task state: if there is a clear, relevant, valuable action, continue with it; if the work genuinely can only wait for an external result or user input, do not invent unrelated work just to avoid "waiting". ' +
215
+ 'Do not interpret the absence of a new message as an empty system notice.');
212
216
  }
213
217
  function formatReminderItemGuide(language, reminderId, content, options) {
214
218
  function isRecord(value) {
@@ -303,16 +307,23 @@ function formatReminderItemGuide(language, reminderId, content, options) {
303
307
  content,
304
308
  ].join('\n');
305
309
  }
310
+ const scopeLabel = scope === 'task' ? '(任务范围)' : scope === 'agent' ? '(智能体范围)' : '';
311
+ const scopeGuide = scope === 'task'
312
+ ? `${projectionNote}你设置了任务范围提醒项,让运行时系统在当前差遣牒任务内、所有由你主理的对话里提醒你。请把它当作当前任务的手头工作提示,不要自动当成系统下发的下一步动作。`
313
+ : scope === 'agent'
314
+ ? `${projectionNote}你设置了智能体范围提醒项,让运行时系统在所有由你主理的对话里提醒你。它只适合紧急、短期、全局刺眼提醒;不要用来记录普通任务状态,也不要自动当成系统下发的下一步动作。`
315
+ : `${projectionNote}你设置了提醒项,让运行时系统提醒你。请把它当作用来保留当前对话里容易丢的手头工作信息的提示,不要自动当成系统下发的下一步动作。`;
316
+ const scopeMaintenance = scope === 'task'
317
+ ? '你应保持简洁、及时更新;不再需要时就删除。若它只对当前对话有效,应改写成 dialog 范围提醒;若需要全队同步当前任务状态,应写入差遣牒 progress,而不是扩大提醒范围。'
318
+ : scope === 'agent'
319
+ ? '你应主动保持极少量、短期、强相关;不再需要时必须删除。普通任务进展不要放在 agent 范围,当前任务内跨对话可见请改用 task 范围。'
320
+ : '你应保持简洁、及时更新;不再需要时就删除。若后续准备换程,也可以把它整理成接续包。';
306
321
  return [
307
- `${systemPrefix} 提醒项 [${reminderId}]${scope === 'personal' ? '(个人范围)' : ''}`,
322
+ `${systemPrefix} 提醒项 [${reminderId}]${scopeLabel}`,
308
323
  '',
309
- scope === 'personal'
310
- ? `${projectionNote}你设置了个人范围提醒项,让运行时系统在所有由你主理的后续对话里提醒你。请把它当作你的工作集提示,不要自动当成系统下发的下一步动作。`
311
- : `${projectionNote}你设置了提醒项,让运行时系统提醒你。请把它当作用来保留当前对话里容易丢的工作信息的工作集提示,不要自动当成系统下发的下一步动作。`,
324
+ scopeGuide,
312
325
  '',
313
- scope === 'personal'
314
- ? '你应保持简洁、及时更新;不再需要时就删除。若它只对当前对话有效,应改写成 dialog 范围提醒而不是长期堆在个人范围里。'
315
- : '你应保持简洁、及时更新;不再需要时就删除。若后续准备换程,也可以把它整理成接续包。',
326
+ scopeMaintenance,
316
327
  '',
317
328
  `如果你要更新这条提醒项,可执行:update_reminder({ "reminder_id": "${reminderId}", "content": "..." })`,
318
329
  deleteInstruction,
@@ -362,15 +373,22 @@ ${deleteInstruction}
362
373
  ---
363
374
  ${content}`;
364
375
  }
365
- return `${systemPrefix} REMINDER [${reminderId}]${scope === 'personal' ? ' (PERSONAL SCOPE)' : ''}
376
+ const scopeLabel = scope === 'task' ? ' (TASK SCOPE)' : scope === 'agent' ? ' (AGENT SCOPE)' : '';
377
+ const scopeGuide = scope === 'task'
378
+ ? `${enProjectionPrefix}You set a task-scope reminder so the runtime system can remind you in every dialog you lead for the current Taskdoc. Treat it as a current-work reference for this task, not as an automatically assigned next action.`
379
+ : scope === 'agent'
380
+ ? `${enProjectionPrefix}You set an agent-scope reminder so the runtime system can remind you in every dialog you lead. This is only for urgent, short-lived, globally visible cues; do not use it for ordinary task state, and do not treat it as an automatically assigned next action.`
381
+ : `${enProjectionPrefix}You set a reminder so the runtime system can remind you. Treat it as a current-work reference for easy-to-lose details in the current dialog, not as an automatically assigned next action.`;
382
+ const scopeMaintenance = scope === 'task'
383
+ ? 'Keep it concise, refresh it when needed, and delete it when obsolete. If it is only useful for the current dialog, rewrite it into dialog scope; if the team must synchronize current task state, update Taskdoc progress instead of broadening reminder scope.'
384
+ : scope === 'agent'
385
+ ? 'Keep this scope rare, short-lived, and strongly relevant; delete it as soon as it is no longer needed. Ordinary task progress does not belong in agent scope; use task scope for current-task cross-dialog visibility.'
386
+ : 'Keep it concise, refresh it when needed, and delete it when obsolete. If you are preparing a new course, you can also rewrite it into a continuation package.';
387
+ return `${systemPrefix} REMINDER [${reminderId}]${scopeLabel}
366
388
 
367
- ${scope === 'personal'
368
- ? `${enProjectionPrefix}You set a personal-scope reminder so the runtime system can remind you in every later dialog you lead. Treat it as your workset reference, not as an automatically assigned next action.`
369
- : `${enProjectionPrefix}You set a reminder so the runtime system can remind you. Treat it as your workset reference for easy-to-lose work details in the current dialog, not as an automatically assigned next action.`}
389
+ ${scopeGuide}
370
390
 
371
- ${scope === 'personal'
372
- ? 'Keep it concise, refresh it when needed, and delete it when obsolete. If it is only useful for the current dialog, rewrite it into dialog scope instead of letting personal scope accumulate noise.'
373
- : 'Keep it concise, refresh it when needed, and delete it when obsolete. If you are preparing a new course, you can also rewrite it into a continuation package.'}
391
+ ${scopeMaintenance}
374
392
 
375
393
  Update path: update_reminder({ "reminder_id": "${reminderId}", "content": "..." })
376
394
  ${deleteInstruction}
@@ -66,6 +66,7 @@ const id_1 = require("../utils/id");
66
66
  const taskdoc_search_1 = require("../utils/taskdoc-search");
67
67
  const taskdoc_search_worker_client_1 = require("../utils/taskdoc-search-worker-client");
68
68
  const create_dialog_contract_1 = require("./create-dialog-contract");
69
+ const dominds_runtime_status_1 = require("./dominds-runtime-status");
69
70
  const dominds_self_update_1 = require("./dominds-self-update");
70
71
  const mime_types_1 = require("./mime-types");
71
72
  const setup_routes_1 = require("./setup-routes");
@@ -1059,6 +1060,9 @@ async function handleApiRoute(req, res, pathname, context) {
1059
1060
  if (pathname === '/api/live-reload' && req.method === 'GET') {
1060
1061
  return await handleLiveReload(res, context);
1061
1062
  }
1063
+ if (pathname === '/api/info' && req.method === 'GET') {
1064
+ return await handleGetRuntimeInfo(res, context);
1065
+ }
1062
1066
  if (pathname === '/api/dominds/self-update' && req.method === 'POST') {
1063
1067
  const body = await readRequestBody(req);
1064
1068
  let parsed;
@@ -2079,6 +2083,20 @@ async function handleLiveReload(res, context) {
2079
2083
  return true;
2080
2084
  }
2081
2085
  }
2086
+ /**
2087
+ * Runtime info endpoint
2088
+ */
2089
+ async function handleGetRuntimeInfo(res, context) {
2090
+ try {
2091
+ respondJson(res, 200, await (0, dominds_runtime_status_1.getDomindsRuntimeStatus)(context.mode));
2092
+ return true;
2093
+ }
2094
+ catch (error) {
2095
+ log.error('Runtime info failed:', error);
2096
+ respondJson(res, 500, { success: false, error: 'Failed to get runtime info' });
2097
+ return true;
2098
+ }
2099
+ }
2082
2100
  /**
2083
2101
  * Team configuration endpoint
2084
2102
  * Returns full team configuration with member defaults, default responder,
@@ -45,6 +45,7 @@ export declare class HttpServerCore {
45
45
  */
46
46
  private sendError;
47
47
  private sendUnauthorized;
48
+ private sendApiNotFound;
48
49
  /**
49
50
  * Start the server on the configured port.
50
51
  */
@@ -138,6 +138,8 @@ class HttpServerCore {
138
138
  if (await (0, api_routes_1.handleApiRoute)(req, res, pathname, apiContext)) {
139
139
  return;
140
140
  }
141
+ this.sendApiNotFound(res);
142
+ return;
141
143
  }
142
144
  // Handle static files
143
145
  const staticHandled = await (0, static_server_1.serveStatic)(pathname, res, {
@@ -181,6 +183,15 @@ class HttpServerCore {
181
183
  });
182
184
  res.end(JSON.stringify({ error: 'unauthorized' }));
183
185
  }
186
+ sendApiNotFound(res) {
187
+ if (res.headersSent)
188
+ return;
189
+ res.writeHead(404, {
190
+ 'Content-Type': 'application/json',
191
+ 'Cache-Control': 'no-store',
192
+ });
193
+ res.end(JSON.stringify({ success: false, error: 'Not Found' }));
194
+ }
184
195
  /**
185
196
  * Start the server on the configured port.
186
197
  */
@@ -598,7 +598,8 @@ async function handleDeclareSideDialogDead(ws, packet) {
598
598
  return;
599
599
  const askerDialogIdObj = new dialog_1.DialogID(askerDialogId, dialogIdObj.rootId);
600
600
  const activeCalleeDispatches = await persistence_1.DialogPersistence.loadActiveCalleeDispatches(askerDialogIdObj, requestedStatus);
601
- const activeCalleeDispatch = activeCalleeDispatches.find((dispatch) => dispatch.calleeDialogId === dialogIdObj.selfId);
601
+ const activeCalleeDispatch = activeCalleeDispatches.find((dispatch) => dispatch.calleeDialogId === dialogIdObj.selfId &&
602
+ dispatch.callId === assignmentFromAsker.callId);
602
603
  if (!activeCalleeDispatch) {
603
604
  // Asker is not waiting on this sideDialog anymore; do not schedule a continuation drive.
604
605
  return;
@@ -1,4 +1,12 @@
1
1
  import { type Reminder } from './tool';
2
- export declare function loadAgentSharedReminders(agentId: string): Promise<Reminder[]>;
3
- export declare function replaceAgentSharedReminders(agentId: string, reminders: readonly Reminder[]): Promise<void>;
4
- export declare function mutateAgentSharedReminders<T>(agentId: string, mutate: (reminders: Reminder[]) => Promise<T> | T): Promise<T>;
2
+ export type SharedReminderTarget = Readonly<{
3
+ kind: 'agent';
4
+ agentId: string;
5
+ }> | Readonly<{
6
+ kind: 'task';
7
+ agentId: string;
8
+ taskDocPath: string;
9
+ }>;
10
+ export declare function loadSharedReminders(target: SharedReminderTarget): Promise<Reminder[]>;
11
+ export declare function replaceSharedReminders(target: SharedReminderTarget, reminders: readonly Reminder[]): Promise<void>;
12
+ export declare function mutateSharedReminders<T>(target: SharedReminderTarget, mutate: (reminders: Reminder[]) => Promise<T> | T): Promise<T>;