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/README.md CHANGED
@@ -103,7 +103,8 @@ Supported proxy variables:
103
103
  Practical guidance:
104
104
 
105
105
  - Set both `HTTP_PROXY` and `HTTPS_PROXY` when your network uses the same proxy for both schemes. Lowercase forms also work.
106
- - Use `NO_PROXY` for localhost, loopback, and internal domains that should bypass the proxy.
106
+ - Use `NO_PROXY` for hosts that should bypass the proxy. Node's built-in support includes exact hosts, suffix matches like `.company.com`, wildcard hosts like `*.company.com`, exact IPs, IP ranges like `192.168.1.1-192.168.1.100`, and `host:port` entries.
107
+ - `NO_PROXY` syntax is not standardized across languages and clients. Do not assume CIDR notation such as `192.168.0.0/16` is supported unless the specific runtime documents it.
107
108
  - Values should be standard proxy URLs, for example `http://proxy.company.com:8080`.
108
109
  - If your shell already exports proxy variables, Dominds will read them too; clear unrelated proxy vars if you want a clean test environment.
109
110
 
@@ -113,13 +114,13 @@ Examples:
113
114
  # Windows PowerShell
114
115
  $env:HTTP_PROXY = "http://proxy.company.com:8080"
115
116
  $env:HTTPS_PROXY = "http://proxy.company.com:8080"
116
- $env:NO_PROXY = "localhost,127.0.0.1,.corp.local"
117
+ $env:NO_PROXY = "localhost,127.0.0.1,.corp.local,192.168.1.1-192.168.1.100"
117
118
  dominds
118
119
 
119
120
  # macOS / Linux shell
120
121
  export HTTP_PROXY="http://proxy.company.com:8080"
121
122
  export HTTPS_PROXY="http://proxy.company.com:8080"
122
- export NO_PROXY="localhost,127.0.0.1,.corp.local"
123
+ export NO_PROXY="localhost,127.0.0.1,.corp.local,192.168.1.1-192.168.1.100"
123
124
  dominds
124
125
 
125
126
  # Disable Dominds env-proxy handling
package/README.zh.md CHANGED
@@ -57,7 +57,8 @@ Dominds 在 Windows、macOS、Linux 上都可以使用 Node 内建的环境变
57
57
  实践建议:
58
58
 
59
59
  - 若同一网络对 HTTP/HTTPS 都走同一代理,建议 `HTTP_PROXY` 和 `HTTPS_PROXY` 一起设置。小写变量名同样有效。
60
- - `NO_PROXY` 用于排除 localhost、回环地址和内网域名。
60
+ - `NO_PROXY` 用于排除不经过代理的主机。Node 内置支持包括精确主机名、后缀匹配(如 `.company.com`)、通配主机(如 `*.company.com`)、精确 IP、IP 范围(如 `192.168.1.1-192.168.1.100`)以及带端口的主机名。
61
+ - `NO_PROXY` 的语法在不同语言和客户端里并没有统一标准。除非目标运行时明确支持,不要把 CIDR 写法如 `192.168.0.0/16` 当成默认可用。
61
62
  - 代理值应使用标准 URL 形式,例如 `http://proxy.company.com:8080`。
62
63
  - 如果你的 shell 已经导出了代理变量,Dominds 也会读取它们;想要干净的测试环境时,请清掉无关的代理变量。
63
64
 
@@ -67,13 +68,13 @@ Dominds 在 Windows、macOS、Linux 上都可以使用 Node 内建的环境变
67
68
  # Windows PowerShell
68
69
  $env:HTTP_PROXY = "http://proxy.company.com:8080"
69
70
  $env:HTTPS_PROXY = "http://proxy.company.com:8080"
70
- $env:NO_PROXY = "localhost,127.0.0.1,.corp.local"
71
+ $env:NO_PROXY = "localhost,127.0.0.1,.corp.local,192.168.1.1-192.168.1.100"
71
72
  dominds
72
73
 
73
74
  # macOS / Linux shell
74
75
  export HTTP_PROXY="http://proxy.company.com:8080"
75
76
  export HTTPS_PROXY="http://proxy.company.com:8080"
76
- export NO_PROXY="localhost,127.0.0.1,.corp.local"
77
+ export NO_PROXY="localhost,127.0.0.1,.corp.local,192.168.1.1-192.168.1.100"
77
78
  dominds
78
79
 
79
80
  # 关闭 Dominds 的环境代理支持
@@ -43,9 +43,9 @@ export declare function clearMainDialogQuarantining(mainDialogId: DialogID): voi
43
43
  export declare function forceStopActiveRunsForMainDialog(mainDialogId: DialogID): Promise<void>;
44
44
  export declare function getStopRequestedReason(dialogId: DialogID): StopRequestedReason | undefined;
45
45
  export declare function loadDialogExecutionMarker(dialogId: DialogID, status?: 'running' | 'completed' | 'archived'): Promise<DialogExecutionMarker | undefined>;
46
- export declare function setDialogExecutionMarker(dialogId: DialogID, executionMarker: DialogExecutionMarker | undefined): Promise<void>;
47
- export declare function clearDialogInterruptedExecutionMarker(dialogId: DialogID): Promise<void>;
48
- export declare function setDialogDisplayState(dialogId: DialogID, displayState: DialogDisplayState): Promise<void>;
46
+ export declare function setDialogExecutionMarker(dialogId: DialogID, executionMarker: DialogExecutionMarker | undefined, status?: 'running' | 'completed' | 'archived'): Promise<void>;
47
+ export declare function clearDialogInterruptedExecutionMarker(dialogId: DialogID, status?: 'running' | 'completed' | 'archived'): Promise<void>;
48
+ export declare function setDialogDisplayState(dialogId: DialogID, displayState: DialogDisplayState, status?: 'running' | 'completed' | 'archived'): Promise<void>;
49
49
  export declare function broadcastDisplayStateMarker(dialogId: DialogID, marker: {
50
50
  kind: 'interrupted' | 'resumed';
51
51
  reason?: DialogInterruptionReason;
@@ -327,7 +327,7 @@ async function loadDialogExecutionMarker(dialogId, status = 'running') {
327
327
  const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, status);
328
328
  return latest?.executionMarker;
329
329
  }
330
- async function setDialogExecutionMarker(dialogId, executionMarker) {
330
+ async function setDialogExecutionMarker(dialogId, executionMarker, status = 'running') {
331
331
  if (executionMarker?.kind === 'dead' && dialogId.selfId === dialogId.rootId) {
332
332
  log.warn('Rejecting dead executionMarker for main dialog (main dialogs must not be dead)', undefined, {
333
333
  dialogId: dialogId.valueOf(),
@@ -338,20 +338,21 @@ async function setDialogExecutionMarker(dialogId, executionMarker) {
338
338
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
339
339
  kind: 'patch',
340
340
  patch: { executionMarker },
341
- }));
341
+ }), status);
342
342
  }
343
343
  catch (err) {
344
344
  log.warn('Failed to persist dialog executionMarker', err, {
345
345
  dialogId: dialogId.valueOf(),
346
346
  rootId: dialogId.rootId,
347
347
  selfId: dialogId.selfId,
348
+ status,
348
349
  intendedExecutionMarker: executionMarker ?? null,
349
350
  });
350
351
  }
351
352
  }
352
- async function clearDialogInterruptedExecutionMarker(dialogId) {
353
+ async function clearDialogInterruptedExecutionMarker(dialogId, status = 'running') {
353
354
  try {
354
- const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
355
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, status);
355
356
  if (latest?.executionMarker?.kind !== 'interrupted') {
356
357
  return;
357
358
  }
@@ -359,12 +360,13 @@ async function clearDialogInterruptedExecutionMarker(dialogId) {
359
360
  catch (err) {
360
361
  log.warn('Failed to inspect executionMarker before clearing interrupted marker', err, {
361
362
  dialogId: dialogId.valueOf(),
363
+ status,
362
364
  });
363
365
  return;
364
366
  }
365
- await setDialogExecutionMarker(dialogId, undefined);
367
+ await setDialogExecutionMarker(dialogId, undefined, status);
366
368
  }
367
- async function setDialogDisplayState(dialogId, displayState) {
369
+ async function setDialogDisplayState(dialogId, displayState, status = 'running') {
368
370
  if (displayState.kind === 'dead' && dialogId.selfId === dialogId.rootId) {
369
371
  log.warn('Rejecting dead displayState for main dialog (main dialogs must not be dead)', undefined, {
370
372
  dialogId: dialogId.valueOf(),
@@ -376,7 +378,7 @@ async function setDialogDisplayState(dialogId, displayState) {
376
378
  // "dead" is irreversible. Once a dialog is marked dead, do not allow overwriting it with
377
379
  // another state (best-effort; races may still exist across concurrent writers).
378
380
  try {
379
- const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
381
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, status);
380
382
  previousDisplayState = latest?.displayState;
381
383
  previousExecutionMarker = latest?.executionMarker;
382
384
  if (dialogId.selfId !== dialogId.rootId &&
@@ -400,6 +402,7 @@ async function setDialogDisplayState(dialogId, displayState) {
400
402
  catch (err) {
401
403
  log.warn('Failed to check existing displayState before setDialogDisplayState', err, {
402
404
  dialogId: dialogId.valueOf(),
405
+ status,
403
406
  });
404
407
  }
405
408
  const nextExecutionMarker = displayState.kind === 'stopped'
@@ -413,13 +416,14 @@ async function setDialogDisplayState(dialogId, displayState) {
413
416
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
414
417
  kind: 'patch',
415
418
  patch: { displayState, executionMarker: nextExecutionMarker },
416
- }));
419
+ }), status);
417
420
  }
418
421
  catch (err) {
419
422
  log.warn('Failed to persist dialog displayState', err, {
420
423
  dialogId: dialogId.valueOf(),
421
424
  rootId: dialogId.rootId,
422
425
  selfId: dialogId.selfId,
426
+ status,
423
427
  intendedDisplayState: displayState,
424
428
  });
425
429
  }
package/dist/dialog.d.ts CHANGED
@@ -19,6 +19,7 @@ import type { LanguageCode } from '@longrun-ai/kernel/types/language';
19
19
  import type { ActiveCalleesFile, CalleeCourseNumber, CalleeGenerationSeqNumber, CallSiteCourseNo, CallSiteGenseqNo, DialogAskerStackState, DialogLatestFile, DialogMetadataFile, DialogNextStepTrigger, HumanQuestion, ProviderData, ReasoningPayload, TellaskCallRecordName, TellaskReplyDirective } from '@longrun-ai/kernel/types/storage';
20
20
  import { ChatMessage, FuncResultMsg, TellaskCarryoverMsg, TellaskResultMsg } from './llm/client';
21
21
  import type { ToolResultImageIngest, UserImageIngest } from './llm/gen';
22
+ import { type SharedReminderTarget } from './shared-reminders';
22
23
  import type { JsonValue } from './tool';
23
24
  import { Reminder, ReminderOptions, ReminderOwner } from './tool';
24
25
  export declare class InvalidReminderIndexError extends Error {
@@ -105,10 +106,10 @@ export type VisibleReminderTarget = Readonly<{
105
106
  index: number;
106
107
  reminder: Reminder;
107
108
  }> | Readonly<{
108
- source: 'agent_shared';
109
+ source: 'runtime';
109
110
  index: number;
110
111
  reminder: Reminder;
111
- agentId: string;
112
+ target: SharedReminderTarget;
112
113
  }>;
113
114
  /**
114
115
  * Assignment from askerDialog for sideDialogs
@@ -239,7 +240,6 @@ export declare abstract class Dialog {
239
240
  }>;
240
241
  get activeCalleeDialogIds(): ReadonlyArray<DialogID>;
241
242
  addActiveCalleeDialogs(ids: DialogID[]): void;
242
- removeActiveCalleeDispatch(id: DialogID): void;
243
243
  clearActiveCalleeDialogs(): void;
244
244
  /**
245
245
  * Load active callee dispatches from persistence into memory.
package/dist/dialog.js CHANGED
@@ -457,9 +457,6 @@ class Dialog {
457
457
  addActiveCalleeDialogs(ids) {
458
458
  this._activeCalleeDialogIds.push(...ids);
459
459
  }
460
- removeActiveCalleeDispatch(id) {
461
- this._activeCalleeDialogIds = this._activeCalleeDialogIds.filter((activeCallee) => activeCallee.selfId !== id.selfId);
462
- }
463
460
  clearActiveCalleeDialogs() {
464
461
  this._activeCalleeDialogIds = [];
465
462
  }
@@ -544,17 +541,23 @@ class Dialog {
544
541
  index,
545
542
  reminder,
546
543
  }));
547
- const sharedReminders = await (0, shared_reminders_1.loadAgentSharedReminders)(this.agentId);
548
- for (let index = 0; index < sharedReminders.length; index += 1) {
549
- const reminder = sharedReminders[index];
550
- if (!reminder)
551
- continue;
552
- targets.push({
553
- source: 'agent_shared',
554
- index,
555
- reminder,
556
- agentId: this.agentId,
557
- });
544
+ const sharedTargets = [
545
+ { kind: 'task', agentId: this.agentId, taskDocPath: this.taskDocPath },
546
+ { kind: 'agent', agentId: this.agentId },
547
+ ];
548
+ for (const sharedTarget of sharedTargets) {
549
+ const sharedReminders = await (0, shared_reminders_1.loadSharedReminders)(sharedTarget);
550
+ for (let index = 0; index < sharedReminders.length; index += 1) {
551
+ const reminder = sharedReminders[index];
552
+ if (!reminder)
553
+ continue;
554
+ targets.push({
555
+ source: 'runtime',
556
+ index,
557
+ reminder,
558
+ target: sharedTarget,
559
+ });
560
+ }
558
561
  }
559
562
  // Visible reminders are always merged into a single newest-first stream regardless of
560
563
  // storage scope, so UI rendering, reminder injection, and reminder-id targeting agree.
@@ -632,10 +635,18 @@ class Dialog {
632
635
  * Returns reminder contents with metadata for the frontend.
633
636
  */
634
637
  async processReminderUpdates() {
635
- const sharedReminders = await (0, shared_reminders_1.loadAgentSharedReminders)(this.agentId);
638
+ const taskSharedTarget = {
639
+ kind: 'task',
640
+ agentId: this.agentId,
641
+ taskDocPath: this.taskDocPath,
642
+ };
643
+ const runtimeTarget = { kind: 'agent', agentId: this.agentId };
644
+ const taskSharedReminders = await (0, shared_reminders_1.loadSharedReminders)(taskSharedTarget);
645
+ const runtimeReminders = await (0, shared_reminders_1.loadSharedReminders)(runtimeTarget);
636
646
  const localChanged = await this.processReminderCollection(this.reminders);
637
- const sharedChanged = await this.processReminderCollection(sharedReminders);
638
- if (localChanged || sharedChanged) {
647
+ const taskSharedChanged = await this.processReminderCollection(taskSharedReminders);
648
+ const runtimeChanged = await this.processReminderCollection(runtimeReminders);
649
+ if (localChanged || taskSharedChanged || runtimeChanged) {
639
650
  this.touchReminders();
640
651
  }
641
652
  // Centralized persistence - called when emitting event.
@@ -647,17 +658,28 @@ class Dialog {
647
658
  log_1.log.warn('Failed to persist reminders', err, { dialogId: this.id.valueOf() });
648
659
  }
649
660
  try {
650
- await (0, shared_reminders_1.replaceAgentSharedReminders)(this.agentId, sharedReminders);
661
+ await (0, shared_reminders_1.replaceSharedReminders)(taskSharedTarget, taskSharedReminders);
662
+ }
663
+ catch (err) {
664
+ log_1.log.warn('Failed to persist task-scoped reminders', err, {
665
+ dialogId: this.id.valueOf(),
666
+ agentId: this.agentId,
667
+ taskDocPath: this.taskDocPath,
668
+ });
669
+ }
670
+ try {
671
+ await (0, shared_reminders_1.replaceSharedReminders)(runtimeTarget, runtimeReminders);
651
672
  }
652
673
  catch (err) {
653
- log_1.log.warn('Failed to persist agent-shared reminders', err, {
674
+ log_1.log.warn('Failed to persist agent-scoped reminders', err, {
654
675
  dialogId: this.id.valueOf(),
655
676
  agentId: this.agentId,
656
677
  });
657
678
  }
658
679
  const visibleReminders = [
659
680
  ...this.reminders.map((reminder) => (0, tool_1.cloneReminder)(reminder)),
660
- ...sharedReminders,
681
+ ...taskSharedReminders,
682
+ ...runtimeReminders,
661
683
  ];
662
684
  visibleReminders.sort(tool_1.compareReminderDisplayOrder);
663
685
  const reminders = visibleReminders.map((r) => ({
@@ -10,6 +10,10 @@ Dominds implements **Social Division of Labor** for AI agents - a systematic app
10
10
 
11
11
  **Key Design Principle**: Agents operate in **autonomous "YOLO mode"** with **Fresh Boots Reasoning** - making independent decisions with clean mental states through strategic context reset and task-centered focus architecture.
12
12
 
13
+ **Liveness Principle**: If humans and agents can still continue the business dialogue with reasonable judgment, the system should prefer keeping the conversation alive. Technical projection drift, local semantic noise, or imperfect intermediate states should not automatically override the business continuation path. Only conflicts that would cause wrong delivery, duplicate consumption, unaccountable behavior, or broken safety boundaries must stop the path loudly.
14
+
15
+ **Expressiveness Principle**: After liveness, the system should keep business intent direct and easy to state. Prefer fewer extra abstractions, fewer newly invented labels, and less technical phrasing that obscures the business meaning. Specific “this should not be too wordy” judgments belong in the concrete business scenario, not as a low-level instruction to optimize for shortest paths or quiet logs.
16
+
13
17
  ## Table of Contents
14
18
 
15
19
  1. [The Problem: Agentic Disorientation](#the-problem-agentic-disorientation)
@@ -10,6 +10,10 @@ Dominds 为 AI 智能体实现了**社会分工**——一种通过战略性心
10
10
 
11
11
  **关键设计原则**:智能体在**自主 "YOLO 模式"** 下运行,配备**扪心自问(FBR)**——通过战略性上下文重置和以任务为中心的专注架构,以干净的心理状态做出独立决策。
12
12
 
13
+ **保活原则**:只要人类与智能体还能基于当前业务判断继续推进,系统就应优先让对话继续跑下去;技术投影、局部语义失真、日志噪音或中间态不洁净,不应自动覆盖业务接续路径。真正会导致错误交付、重复消费、不可判责或安全边界破坏的冲突,才必须阻断并 loud diagnostic。
14
+
15
+ **顺直原则**:在不削弱保活的前提下,业务意图的表达还应尽量更直白,少一点额外抽象、少一点新口径、少一点技术性兜圈子。真正“这里不该太啰嗦”的判断,应体现在具体业务场景里,而不是把“最短路径”“少噪音”这类技术抽象当成低阶工作的直接原则。
16
+
13
17
  ## 目录
14
18
 
15
19
  1. [问题:智能体迷失方向](#问题智能体迷失方向)
@@ -8,6 +8,10 @@
8
8
 
9
9
  任何进入 drive core 的动作,都必须先由一个本地化的业务 continuation handler 认领。技术形态上的“没有 human prompt”不是业务授权,不能作为 drive 的依据。
10
10
 
11
+ 同时,drive algorithm 的最高产品目标是**业务保活**。技术不变量服务于“对话能正确地继续”,而不是反过来要求业务对话为技术投影的瞬时洁净让路。若旧 course 的残留 follow-up、displayState 投影抖动、日志诊断噪声等问题不会造成错误交付、重复消费或不可判责,且新的 runtime prompt / 人类判断 / 智能体判断已经给出明确接续路径,系统应优先让对话继续,并保留足够诊断信号供后续自愈。只有会破坏业务消费账本、跨 dialog reply routing、Q4H 等待边界或安全交付边界的冲突,才应阻断 unsafe path。
12
+
13
+ 在保活之下,还要继续追求**顺直**:这里说的不是工程意义上的“最短路径”或“少噪音”,而是业务意图表达要更直白,少额外抽象、少新口径、少让技术概念盖住业务意思。真正“这里不该太啰嗦”的判断应在具体业务场景里落地,而不是把这些技术抽象当成低阶工作的直接口令。
14
+
11
15
  ## 背景问题
12
16
 
13
17
  历史实现里存在两个过宽的技术概念:
@@ -309,6 +313,7 @@ Stale cleanup:
309
313
 
310
314
  - 只能清理本 follow-up trigger;
311
315
  - 不能用“近期是否生成过内容”之类 transcript 猜测。
316
+ - 如果一个更新的 pending runtime prompt 已经开启新 course,旧 course 的 follow-up 不应和新 prompt 在同一 gen turn 中竞争 business continuation;此类残留应被视为被新 course prompt 取代,loud warn 后清理对应 trigger,让新程继续运行。
312
317
 
313
318
  注意:pending tellask dispatch ack 不是 immediate follow-up 的理由。只有真正需要当前 LLM 立刻消化的 tool result、invalid tool recovery、reply delivery result 等,才应形成 follow-up。
314
319
 
@@ -83,3 +83,5 @@ Positioning: Dominds only schedules and orchestrates; everything else becomes an
83
83
  - **rtws-first**: scope capabilities/state by rtws for project/team isolation and reuse.
84
84
  - **protocol-first**: align kernel↔Apps and frontend↔backend via stable protocols; avoid “must upgrade together” coupling.
85
85
  - **debuggability as a first-class feature**: every streaming/concurrent/collaboration mechanism must be replayable, diagnosable, and explainable.
86
+ - **Liveness first, semantic self-healing**: Dominds is not trying to make the technical state machine look perfect at every instant. The product goal is to keep the human-agent business dialog running whenever it can still make progress. When technical friction, local semantic drift, or projection inconsistency appears, prefer preserving dialog liveness if human and agent judgment can continue the work and later interactions can semantically self-heal. Conflicts that would cause wrong delivery, duplicate consumption, or unaccountable behavior must still emit loud diagnostics.
87
+ - **Expressiveness second, fewer abstractions**: after liveness, prefer business intent to be stated more directly, with fewer extra abstractions, fewer newly invented labels, and less technical phrasing that hides the business meaning. Specific “this should not be too wordy” judgments belong in the concrete business scenario, not as a low-level instruction to chase the shortest path or the quietest log.
@@ -83,3 +83,5 @@ Dominds 的长期方向是把“智能体分工协作”沉淀为一个可复用
83
83
  - **rtws-first**:能力与状态以 rtws 为边界,便于按项目/团队隔离与复用。
84
84
  - **协议优先**:内核与 Apps、前端与后端以稳定协议对齐,避免“只能一起升级”的紧耦合。
85
85
  - **可调试性是一等公民**:任何流式/并发/分工机制都必须可复盘、可定位、可解释。
86
+ - **保活优先,语义可自愈**:Dominds 的产品目标不是让技术状态机在每个瞬间都显得完美,而是让人类与智能体组成的业务对话尽量继续运行。遇到技术磕绊、局部语义失真或投影不一致时,只要仍能基于人类和智能体的判断继续推进,并能在后续交互中语义上自愈,系统应优先保活;真正会导致错误交付、重复消费或无法判责的冲突仍必须 loud diagnostic。
87
+ - **顺直优先,少额外抽象**:在不削弱保活的前提下,系统还应尽量让业务意图的表达更直白,少加额外抽象、少造新口径、少用技术概念遮住业务意思。真正的“这里不该太啰嗦”应体现在具体业务场景的表达里,而不是把“短路径”或“少噪音”当作低阶工作的直接口令。
@@ -49,9 +49,9 @@
49
49
  *
50
50
  * // Turn 2: Tool error (func_result_msg with role='tool'), LLM self-corrects
51
51
  * # docs/e2e-story-test/reminders.md: Tool syntax error recovery
52
- * - message: "Error: Invalid args. Use: add_reminder({ content: string, position?: number, scope?: \"dialog\" | \"personal\" }) (omit position to append)."
52
+ * - message: "Error: Invalid args. Use: add_reminder({ content: string, scope?: \"dialog\" | \"task\" | \"agent\" }) (omitting scope means task)."
53
53
  * role: "tool"
54
- * response: "Call the function tool `add_reminder` with {\"content\":\"Goals...\",\"position\":1}"
54
+ * response: "Call the function tool `add_reminder` with {\"content\":\"Goals...\",\"scope\":\"task\"}"
55
55
  */
56
56
  import type { Team } from '../../team';
57
57
  import type { FuncTool } from '../../tool';
@@ -50,9 +50,9 @@
50
50
  *
51
51
  * // Turn 2: Tool error (func_result_msg with role='tool'), LLM self-corrects
52
52
  * # docs/e2e-story-test/reminders.md: Tool syntax error recovery
53
- * - message: "Error: Invalid args. Use: add_reminder({ content: string, position?: number, scope?: \"dialog\" | \"personal\" }) (omit position to append)."
53
+ * - message: "Error: Invalid args. Use: add_reminder({ content: string, scope?: \"dialog\" | \"task\" | \"agent\" }) (omitting scope means task)."
54
54
  * role: "tool"
55
- * response: "Call the function tool `add_reminder` with {\"content\":\"Goals...\",\"position\":1}"
55
+ * response: "Call the function tool `add_reminder` with {\"content\":\"Goals...\",\"scope\":\"task\"}"
56
56
  */
57
57
  var __importDefault = (this && this.__importDefault) || function (mod) {
58
58
  return (mod && mod.__esModule) ? mod : { "default": mod };
@@ -138,6 +138,12 @@ function buildInterruptedFuncResult(args) {
138
138
  genseq: args.callGenseq,
139
139
  };
140
140
  }
141
+ function sameOpenGenerationRun(state, course, genseq) {
142
+ return (state?.kind === 'open' &&
143
+ state.course === course &&
144
+ genseq !== undefined &&
145
+ state.genseq === genseq);
146
+ }
141
147
  function sameDialogBusinessContinuation(left, right) {
142
148
  if (left.kind !== right.kind)
143
149
  return false;
@@ -211,7 +217,7 @@ async function persistDialogFbrState(dialog, fbrState) {
211
217
  await persistence_1.DialogPersistence.mutateDialogLatest(dialog.id, () => ({
212
218
  kind: 'patch',
213
219
  patch: { fbrState },
214
- }));
220
+ }), dialog.status);
215
221
  }
216
222
  function buildKernelDriverFbrPrompt(dlg, state) {
217
223
  const collectiveTargets = dlg.assignmentFromAsker.collectiveTargets &&
@@ -1571,7 +1577,7 @@ async function preserveDiligenceBudgetAcrossQ4H(dlg) {
1571
1577
  void persistence_1.DialogPersistence.mutateDialogLatest(dlg.id, () => ({
1572
1578
  kind: 'patch',
1573
1579
  patch: { diligencePushRemainingBudget: dlg.diligencePushRemainingBudget },
1574
- }));
1580
+ }), dlg.status);
1575
1581
  }
1576
1582
  catch (err) {
1577
1583
  log_1.log.error('kernel-driver failed to preserve Diligence Push budget after Q4H', err, {
@@ -1604,7 +1610,7 @@ async function maybeContinueWithDiligencePrompt(args) {
1604
1610
  void persistence_1.DialogPersistence.mutateDialogLatest(dlg.id, () => ({
1605
1611
  kind: 'patch',
1606
1612
  patch: { diligencePushRemainingBudget: dlg.diligencePushRemainingBudget },
1607
- }));
1613
+ }), dlg.status);
1608
1614
  }
1609
1615
  if (dlg instanceof dialog_1.MainDialog && prepared.kind !== 'disabled') {
1610
1616
  emitDiligenceBudgetEvent(dlg, {
@@ -3022,29 +3028,50 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
3022
3028
  reason: lateInterruptedReason,
3023
3029
  continueEnabled: resolveStoppedContinueEnabled(lateInterruptedReason),
3024
3030
  };
3025
- (0, dialog_display_state_1.broadcastDisplayStateMarker)(dlg.id, { kind: 'interrupted', reason: lateInterruptedReason });
3026
3031
  }
3032
+ let shouldPersistFinalDisplayProjection = true;
3027
3033
  try {
3028
- const latest = await persistence_1.DialogPersistence.loadDialogLatest(dlg.id, 'running');
3034
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(dlg.id, dlg.status);
3029
3035
  if (dlg.id.selfId !== dlg.id.rootId && latest?.executionMarker?.kind === 'dead') {
3030
3036
  finalDisplayState = { kind: 'dead', reason: latest.executionMarker.reason };
3031
3037
  }
3038
+ else if (finalDisplayState.kind === 'stopped' &&
3039
+ latest?.generating === true &&
3040
+ !sameOpenGenerationRun(latest.generationRunState, dlg.activeGenCourseOrUndefined ?? dlg.currentCourse, dlg.activeGenSeqOrUndefined)) {
3041
+ shouldPersistFinalDisplayProjection = false;
3042
+ log_1.log.debug('Skipped stale stopped projection from superseded generation to preserve liveness', undefined, {
3043
+ dialogId: dlg.id.valueOf(),
3044
+ rootId: dlg.id.rootId,
3045
+ selfId: dlg.id.selfId,
3046
+ activeCourse: dlg.activeGenCourseOrUndefined ?? dlg.currentCourse,
3047
+ activeGenseq: dlg.activeGenSeqOrUndefined ?? null,
3048
+ latestGenerationRunState: latest.generationRunState ?? null,
3049
+ latestDisplayState: latest.displayState ?? null,
3050
+ reason: 'newer_generation_active',
3051
+ });
3052
+ }
3032
3053
  }
3033
3054
  catch (err) {
3034
3055
  log_1.log.warn('kernel-driver failed to re-check displayState before finalizing', err, {
3035
3056
  dialogId: dlg.id.valueOf(),
3036
3057
  });
3037
3058
  }
3038
- if (finalDisplayState.kind === 'stopped') {
3039
- await (0, dialog_display_state_1.setDialogExecutionMarker)(dlg.id, {
3040
- kind: 'interrupted',
3041
- reason: finalDisplayState.reason,
3042
- });
3043
- }
3044
- else if (finalDisplayState.kind !== 'dead') {
3045
- await (0, dialog_display_state_1.clearDialogInterruptedExecutionMarker)(dlg.id);
3059
+ if (shouldPersistFinalDisplayProjection) {
3060
+ if (finalDisplayState.kind === 'stopped') {
3061
+ await (0, dialog_display_state_1.setDialogExecutionMarker)(dlg.id, {
3062
+ kind: 'interrupted',
3063
+ reason: finalDisplayState.reason,
3064
+ }, dlg.status);
3065
+ (0, dialog_display_state_1.broadcastDisplayStateMarker)(dlg.id, {
3066
+ kind: 'interrupted',
3067
+ reason: finalDisplayState.reason,
3068
+ });
3069
+ }
3070
+ else if (finalDisplayState.kind !== 'dead') {
3071
+ await (0, dialog_display_state_1.clearDialogInterruptedExecutionMarker)(dlg.id, dlg.status);
3072
+ }
3073
+ await (0, dialog_display_state_1.setDialogDisplayState)(dlg.id, finalDisplayState, dlg.status);
3046
3074
  }
3047
- await (0, dialog_display_state_1.setDialogDisplayState)(dlg.id, finalDisplayState);
3048
3075
  return {
3049
3076
  lastAssistantSayingContent,
3050
3077
  lastAssistantSayingGenseq,
@@ -4,7 +4,7 @@ export declare function driveDialogStream(...driveArgs: KernelDriverDriveArgs):
4
4
  export declare function emitSayingEventsBridge(...args: KernelDriverEmitSayingArgs): KernelDriverEmitSayingResult;
5
5
  export declare function supplyResponseToAskerDialog(...args: KernelDriverSupplyResponseArgs): KernelDriverSupplyResponseResult;
6
6
  export declare function driveDialogStreamCore(dlg: Dialog, callbacks: KernelDriverDriveCallbacks, humanPrompt?: KernelDriverDriveArgs[1], driveOptions?: KernelDriverDriveArgs[3]): Promise<KernelDriverCoreResult>;
7
- export declare function supplyResponseToSideDialogBridge(callerDialog: Dialog, sideDialogId: DialogID, responseText: string, callType: 'A' | 'B' | 'C', callId?: string, status?: 'completed' | 'failed', calleeResponseRef?: {
7
+ export declare function supplyResponseToSideDialogBridge(callerDialog: Dialog, sideDialogId: DialogID, responseText: string, callType: 'A' | 'B' | 'C', callId: string, status?: 'completed' | 'failed', calleeResponseRef?: {
8
8
  course: number;
9
9
  genseq: number;
10
10
  }, directFallbackSource?: 'saying' | 'thinking_only'): Promise<void>;
@@ -130,7 +130,7 @@ async function applyWakeEventUpdates(dialog, events) {
130
130
  });
131
131
  continue;
132
132
  }
133
- await (0, shared_reminders_1.mutateAgentSharedReminders)(target.agentId, (reminders) => {
133
+ await (0, shared_reminders_1.mutateSharedReminders)(target.target, (reminders) => {
134
134
  const index = reminders.findIndex((reminder) => reminder.id === target.reminder.id);
135
135
  if (index < 0) {
136
136
  throw new Error(`idle reminder wake invariant violation: shared reminder ${target.reminder.id} disappeared before update`);
@@ -8,7 +8,7 @@ export declare function supplyResponseToAskerDialog(args: {
8
8
  sideDialogId: DialogID;
9
9
  responseText: string;
10
10
  callType: 'A' | 'B' | 'C';
11
- callId?: string;
11
+ callId: string;
12
12
  status?: 'completed' | 'failed';
13
13
  deliveryMode?: 'reply_tool' | 'direct_fallback';
14
14
  directFallbackSource?: 'saying' | 'thinking_only';
@@ -137,14 +137,18 @@ async function resolveLatestAssignmentAnchorRef(args) {
137
137
  }
138
138
  async function supplyResponseToAskerDialog(args) {
139
139
  const { callerDialog, sideDialogId, responseText, callType, callId, status = 'completed', deliveryMode = 'reply_tool', directFallbackSource, calleeResponseRef, askerCourseOverride, scheduleDrive, sideDialog: maybeSideDialog, } = args;
140
+ const requestedCallId = typeof callId === 'string' ? callId.trim() : '';
141
+ if (requestedCallId === '') {
142
+ throw new Error(`sideDialog response supply invariant violation: callId is required ` +
143
+ `(callerId=${callerDialog.id.selfId}, sideDialogId=${sideDialogId.selfId})`);
144
+ }
140
145
  try {
141
146
  const result = await (0, sideDialog_txn_1.withSideDialogTxnLock)(callerDialog.id, async () => {
142
147
  const activeCalleeDispatches = await persistence_1.DialogPersistence.loadActiveCalleeDispatches(callerDialog.id, callerDialog.status);
143
148
  let activeCalleeDispatch;
144
- const requestedCallId = typeof callId === 'string' ? callId.trim() : '';
145
149
  for (const dispatch of activeCalleeDispatches) {
146
150
  if (dispatch.calleeDialogId === sideDialogId.selfId &&
147
- (requestedCallId === '' || dispatch.callId === requestedCallId) &&
151
+ dispatch.callId === requestedCallId &&
148
152
  activeCalleeDispatch === undefined) {
149
153
  activeCalleeDispatch = dispatch;
150
154
  }
@@ -239,7 +243,7 @@ async function supplyResponseToAskerDialog(args) {
239
243
  shouldDriveContinuation,
240
244
  };
241
245
  });
242
- const normalizedCallId = typeof callId === 'string' ? callId.trim() : '';
246
+ const normalizedCallId = requestedCallId;
243
247
  const fallbackCallId = typeof result.callId === 'string' ? result.callId.trim() : '';
244
248
  const resolvedCallId = normalizedCallId !== '' ? normalizedCallId : fallbackCallId;
245
249
  const rootForLookup = callerDialog instanceof dialog_1.MainDialog
@@ -1216,7 +1216,7 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
1216
1216
  executionMarker: undefined,
1217
1217
  fbrState: initialFbrState,
1218
1218
  },
1219
- }));
1219
+ }), sub.status);
1220
1220
  await syncPendingTellaskReminderBestEffort(dlg, 'kernel-driver:executeTellaskCall:FBR:appendPending');
1221
1221
  const initPrompt = {
1222
1222
  content: (0, fbr_1.buildFbrPromptForState)({
@@ -1542,10 +1542,6 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
1542
1542
  const previousOwnerId = previousAssignment.askerDialogId === pendingOwner.id.selfId
1543
1543
  ? pendingOwner.id
1544
1544
  : new dialog_1.DialogID(previousAssignment.askerDialogId, mainDialog.id.rootId);
1545
- await persistence_1.DialogPersistence.removeActiveCallee(previousOwnerId, {
1546
- batchId: replacedPending.batchId,
1547
- callId: replacedPending.callId,
1548
- }, pendingOwner.status);
1549
1545
  if (previousOwnerId.selfId !== pendingOwner.id.selfId) {
1550
1546
  const previousOwnerDialog = mainDialog.lookupDialog(previousOwnerId.selfId) ??
1551
1547
  (await (0, dialog_instance_registry_1.ensureDialogLoaded)(mainDialog, previousOwnerId, pendingOwner.status));
@@ -1562,7 +1558,6 @@ async function executeTellaskCall(dlg, mentionList, body, callId, callbacks, opt
1562
1558
  }
1563
1559
  }
1564
1560
  }
1565
- await persistence_1.DialogPersistence.upsertActiveCalleeFromPendingRecord(pendingOwner.id, pendingRecord, pendingOwner.status);
1566
1561
  await updateSideDialogAssignment(existing, assignment, {
1567
1562
  replacePendingCallId: previousAssignment.callId,
1568
1563
  replacePendingAskerDialogId: previousAssignment.askerDialogId,
@@ -75,7 +75,7 @@ export type KernelDriverSupplyResponseArgs = [
75
75
  sideDialogId: DialogID,
76
76
  responseText: string,
77
77
  callType: 'A' | 'B' | 'C',
78
- callId?: string,
78
+ callId: string,
79
79
  status?: 'completed' | 'failed',
80
80
  calleeResponseRef?: {
81
81
  course: number;
@@ -188,8 +188,8 @@ function getMemoryPromptCopy(ctx) {
188
188
  injectedTaskdocLine: '- 重要:差遣牒内容会被系统以内联形式注入到上下文中(本轮生成视角下即为最新;注入内容不包括全局约束)。需要回顾时请直接基于上下文里的差遣牒内容回顾与决策,不要试图用通用文件工具读取 `*.tsk/` 下的文件(会被拒绝)。',
189
189
  constraintsLine: '- 约定:`constraints` 只写任务特有的硬要求,不得写入系统提示/工具文档里已明确且由系统强制执行的通用规则(例如 `*.tsk/` 封装禁止通用文件工具)。一经发现重复,必须删除并告知用户。',
190
190
  remindersLine: ctx.isSideDialog
191
- ? '- 提醒项(以 `reminder_id` 标识,工作集):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);默认保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。准备 `clear_mind` 开启新一程对话时,整理“结构化接续包提醒项”;提醒项保留恢复工作容易丢的细节(如第一步、关键定位、运行/验证信息、临时 ids/路径)。若系统已把当前程切到吃紧/告急处置态,支线对话不要维护差遣牒,也不要整理差遣牒更新提案;只维护足够详尽的接续包提醒项,提醒项长度没有技术限制,允许先保留多条粗略提醒项把信息带过桥;当前程只做保信息 + clear_mind;只有系统实际开启新一程后,第一步才是以清醒头脑复核并整理这些接续包/粗略提醒项:删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项。'
192
- : '- 提醒项(以 `reminder_id` 标识,工作集):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);默认保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。准备 `clear_mind` 开启新一程对话时,先把尚未落实到文档、且下一程需要知会的讨论细节落到差遣牒合适章节,再整理“结构化接续包提醒项”;提醒项只保留差遣牒仍未覆盖、但恢复工作容易丢的细节(如第一步、关键定位、运行/验证信息、临时 ids/路径)。若系统已把当前程切到吃紧/告急处置态,则允许先保留多条粗略提醒项把信息带过桥;当前程只做落文档、保信息 + clear_mind;只有系统实际开启新一程后,第一步才是以清醒头脑复核并整理这些接续包/粗略提醒项:删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项。',
191
+ ? '- 提醒项(以 `reminder_id` 标识,手头工作):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);默认保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。准备 `clear_mind` 开启新一程对话时,整理“结构化接续包提醒项”;提醒项保留恢复工作容易丢的细节(如第一步、关键定位、运行/验证信息、临时 ids/路径)。若系统已把当前程切到吃紧/告急处置态,支线对话不要维护差遣牒,也不要整理差遣牒更新提案;只维护足够详尽的接续包提醒项,提醒项长度没有技术限制,允许先保留多条粗略提醒项把信息带过桥;当前程只做保信息 + clear_mind;只有系统实际开启新一程后,第一步才是以清醒头脑复核并整理这些接续包/粗略提醒项:删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项。'
192
+ : '- 提醒项(以 `reminder_id` 标识,手头工作):当前对话的高频工作记录/关键细节(偏私有,不作为全队公告);默认保持少量(常见 1–3 条),优先 `update_reminder` 压缩/合并,不再需要就 `delete_reminder`。准备 `clear_mind` 开启新一程对话时,先把尚未落实到文档、且下一程需要知会的讨论细节落到差遣牒合适章节,再整理“结构化接续包提醒项”;提醒项只保留差遣牒仍未覆盖、但恢复工作容易丢的细节(如第一步、关键定位、运行/验证信息、临时 ids/路径)。若系统已把当前程切到吃紧/告急处置态,则允许先保留多条粗略提醒项把信息带过桥;当前程只做落文档、保信息 + clear_mind;只有系统实际开启新一程后,第一步才是以清醒头脑复核并整理这些接续包/粗略提醒项:删除冗余、纠正偏激或失真的过桥思路、压缩成高质量提醒项。',
193
193
  teamMemoryLine: '- 团队记忆:稳定的团队约定/工程规约(跨任务共享)。',
194
194
  personalMemoryLine: '- 个人记忆:稳定的个人习惯/偏好与职责域知识;记忆会在每次生成时自动注入上下文,应保持少量且准确(关键文档/代码的精确路径 + 最小必要事实)。不要记录具体任务状态。',
195
195
  skillsLine: '- Skills:可复用操作指引/检查清单/触发条件与边界。工作区关联强的事实、路径、局部契约进 memory/env;独立于工作区内容的“怎么做”进 skill。skill 不授予工具权限;需要脚本/MCP/外部能力时应配套 app/toolset/权限配置。',
@@ -223,8 +223,8 @@ function getMemoryPromptCopy(ctx) {
223
223
  injectedTaskdocLine: '- Important: the Taskdoc content is injected inline into the context (the latest as of this generation; injected content excludes global constraints). Review the injected Taskdoc instead of trying to read files under `*.tsk/` via general file tools (they will be rejected).',
224
224
  constraintsLine: '- Convention: Taskdoc `constraints` must contain task-specific requirements only; do not include global, system-enforced rules already stated in system prompt/tool docs (e.g. `.tsk/` encapsulation bans general file tools). If duplication is found, you MUST remove it and notify the user.',
225
225
  remindersLine: ctx.isSideDialog
226
- ? '- Reminders (addressed by `reminder_id`, working set): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small by default (often 1–3 items), prefer `update_reminder` to compress/merge, and delete when obsolete. When preparing `clear_mind` to start a new course, create a structured continuation-package reminder that preserves details easy to lose during resume (first step, key pointers, run/verify info, volatile ids/paths). If the system has already put the current course into caution/critical remediation, you are in a Side Dialog: do not maintain Taskdoc and do not draft Taskdoc update proposals; only maintain sufficiently detailed continuation-package reminders. Reminder length has no technical limit, rough multi-reminder bridge notes are acceptable, and in the current course you should only preserve volatile information and clear_mind. Only after the system actually starts the new course does the mandatory first step become reviewing and rewriting those continuation/rough reminders with a clear head: remove redundancy, correct biased or distorted bridge notes, and compress them into high-quality reminders.'
227
- : '- Reminders (addressed by `reminder_id`, working set): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small by default (often 1–3 items), prefer `update_reminder` to compress/merge, and delete when obsolete. When preparing `clear_mind` to start a new course, first record undocumented discussion details that the next course needs to know into the appropriate Taskdoc sections, then create a structured continuation-package reminder. Reminders should keep only details still not covered by Taskdoc but easy to lose during resume (first step, key pointers, run/verify info, volatile ids/paths). If the system has already put the current course into caution/critical remediation, rough multi-reminder bridge notes are acceptable; in the current course, only document missing details, preserve volatile information, and clear_mind. Only after the system actually starts the new course does the mandatory first step become reviewing and rewriting those continuation/rough reminders with a clear head: remove redundancy, correct biased or distorted bridge notes, and compress them into high-quality reminders.',
226
+ ? '- Reminders (addressed by `reminder_id`, current work): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small by default (often 1–3 items), prefer `update_reminder` to compress/merge, and delete when obsolete. When preparing `clear_mind` to start a new course, create a structured continuation-package reminder that preserves details easy to lose during resume (first step, key pointers, run/verify info, volatile ids/paths). If the system has already put the current course into caution/critical remediation, you are in a Side Dialog: do not maintain Taskdoc and do not draft Taskdoc update proposals; only maintain sufficiently detailed continuation-package reminders. Reminder length has no technical limit, rough multi-reminder bridge notes are acceptable, and in the current course you should only preserve volatile information and clear_mind. Only after the system actually starts the new course does the mandatory first step become reviewing and rewriting those continuation/rough reminders with a clear head: remove redundancy, correct biased or distorted bridge notes, and compress them into high-quality reminders.'
227
+ : '- Reminders (addressed by `reminder_id`, current work): your high-frequency per-dialog worklog + critical details (not a team bulletin board); keep it small by default (often 1–3 items), prefer `update_reminder` to compress/merge, and delete when obsolete. When preparing `clear_mind` to start a new course, first record undocumented discussion details that the next course needs to know into the appropriate Taskdoc sections, then create a structured continuation-package reminder. Reminders should keep only details still not covered by Taskdoc but easy to lose during resume (first step, key pointers, run/verify info, volatile ids/paths). If the system has already put the current course into caution/critical remediation, rough multi-reminder bridge notes are acceptable; in the current course, only document missing details, preserve volatile information, and clear_mind. Only after the system actually starts the new course does the mandatory first step become reviewing and rewriting those continuation/rough reminders with a clear head: remove redundancy, correct biased or distorted bridge notes, and compress them into high-quality reminders.',
228
228
  teamMemoryLine: '- Team memory: stable shared conventions (cross-task).',
229
229
  personalMemoryLine: '- Personal memory: stable personal habits/preferences and responsibility-scope knowledge. Memory is automatically injected into context on each generation: keep it small and accurate (exact key doc/code paths + minimal key facts); do not store per-task state.',
230
230
  skillsLine: '- Skills: reusable operating guidance, checklists, triggers, and boundaries. Workspace-coupled facts, paths, and local contracts belong in memory/env; workspace-independent “how to do it” procedures belong in skills. Skills do not grant tool permissions; pair scripts/MCP/external capabilities with apps/toolsets/permission configuration.',