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
@@ -88,7 +88,6 @@ export declare class DiskFileDialogStore extends DialogStore {
88
88
  * to ensure proper event ordering on the frontend.
89
89
  */
90
90
  notifyGeneratingStart(dialog: Dialog, msgId?: string): Promise<readonly DialogNextStepTrigger[]>;
91
- private getResultArrivalBatchIdsFromAcceptedTriggers;
92
91
  /**
93
92
  * Notify end of LLM generation for frontend bubble management
94
93
  */
@@ -516,7 +515,6 @@ export declare class DialogPersistence {
516
515
  * Load active callee dispatches projected from active-callees.json.
517
516
  */
518
517
  static loadActiveCalleeDispatches(mainDialogId: DialogID, status?: DialogStatusKind): Promise<ActiveCalleeDispatchRecord[]>;
519
- private static isActiveCalleeDispatchRecord;
520
518
  private static activeCalleeDispatchCalleeDialogId;
521
519
  private static buildActiveCalleeRecordFromDispatch;
522
520
  private static isActiveCalleeCompletion;
@@ -530,7 +528,7 @@ export declare class DialogPersistence {
530
528
  static appendActiveCalleeDispatch(mainDialogId: DialogID, record: ActiveCalleeDispatchRecord, rootAnchor?: RootGenerationAnchor, status?: DialogStatusKind): Promise<void>;
531
529
  static saveActiveCalleeDispatches(mainDialogId: DialogID, dispatches: ActiveCalleeDispatchRecord[], rootAnchor?: RootGenerationAnchor, status?: DialogStatusKind): Promise<void>;
532
530
  static mutateActiveCalleeDispatches(mainDialogId: DialogID, mutator: (previous: ActiveCalleeDispatchRecord[]) => ActiveCalleeDispatchRecord[], rootAnchor?: RootGenerationAnchor, status?: DialogStatusKind): Promise<ActiveCalleeDispatchRecord[]>;
533
- static removeActiveCalleeDispatch(mainDialogId: DialogID, calleeDialogId: string, rootAnchor?: RootGenerationAnchor, status?: DialogStatusKind): Promise<void>;
531
+ static removeActiveCalleeDispatch(mainDialogId: DialogID, calleeDialogId: string, callId: string, rootAnchor?: RootGenerationAnchor, status?: DialogStatusKind): Promise<void>;
534
532
  static clearActiveCalleeDispatches(mainDialogId: DialogID, rootAnchor?: RootGenerationAnchor, status?: DialogStatusKind): Promise<void>;
535
533
  private static loadActiveCalleesFromDisk;
536
534
  static loadActiveCallees(dialogId: DialogID, status?: DialogStatusKind): Promise<ActiveCalleesFile>;
@@ -561,10 +559,6 @@ export declare class DialogPersistence {
561
559
  deliveryMode: 'reply_tool' | 'direct_fallback';
562
560
  directFallbackSource?: 'saying' | 'thinking_only';
563
561
  }>, status?: DialogStatusKind): Promise<ActiveCalleeResolveOutcome>;
564
- static removeActiveCallee(dialogId: DialogID, args: Readonly<{
565
- batchId: string;
566
- callId: string;
567
- }>, status?: DialogStatusKind): Promise<void>;
568
562
  static removeActiveCalleeBatch(dialogId: DialogID, batchId: string, status?: DialogStatusKind): Promise<void>;
569
563
  /**
570
564
  * Get the path for storing sideDialog responses (supports both main dialog and sideDialog tellaskers).
@@ -180,6 +180,9 @@ function emitInvariantWarning(message, details) {
180
180
  ...details,
181
181
  diagnosticJson,
182
182
  });
183
+ if (process.env.DOMINDS_FULL_INVARIANT_DIAGNOSTICS !== '1') {
184
+ return;
185
+ }
183
186
  if (diagnosticJson !== null) {
184
187
  const parts = chunkInvariantDiagnosticJson(diagnosticJson, 1600);
185
188
  for (const [index, part] of parts.entries()) {
@@ -264,7 +267,7 @@ async function normalizeSideDialogIdleWhileReplyObligationPending(dialogId, stat
264
267
  return latest;
265
268
  }
266
269
  const top = askerStackState?.askerStack[askerStackState.askerStack.length - 1];
267
- emitInvariantWarning('Dialog latest projection invariant warning: sideDialog awaiting Q4H attempted to enter idle displayState; healing from persistence facts', {
270
+ log_1.log.debug('Dialog latest projection invariant warning: sideDialog awaiting Q4H attempted to enter idle displayState; healing from persistence facts', undefined, {
268
271
  trigger: context.trigger,
269
272
  mutationKind: context.mutationKind,
270
273
  latestSource: context.latestSource,
@@ -2270,7 +2273,7 @@ function isReminderPriority(value) {
2270
2273
  return value === 'high' || value === 'medium' || value === 'low';
2271
2274
  }
2272
2275
  function isReminderScope(value) {
2273
- return value === 'dialog' || value === 'personal' || value === 'agent_shared';
2276
+ return value === 'dialog' || value === 'task' || value === 'agent' || value === 'runtime';
2274
2277
  }
2275
2278
  function isReminderRenderMode(value) {
2276
2279
  return value === 'plain' || value === 'markdown';
@@ -2791,11 +2794,34 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2791
2794
  (0, evt_registry_1.postDialogEvent)(dialog, genStartEvt);
2792
2795
  // Update generating flag in latest.yaml
2793
2796
  await DialogPersistence.mutateDialogLatest(this.dialogId, (previous) => {
2794
- acceptedTriggers = sortNextStepTriggersForConsumption(previous.nextStep.triggers);
2797
+ const triggerSelection = filterNextStepTriggersForGenerationStart({
2798
+ dialogId: this.dialogId,
2799
+ currentCourse: (0, storage_1.toDialogCourseNumber)(course),
2800
+ msgId,
2801
+ triggers: previous.nextStep.triggers,
2802
+ });
2803
+ acceptedTriggers = triggerSelection.acceptedTriggers;
2804
+ if (triggerSelection.supersededTriggers.length > 0) {
2805
+ log_1.log.debug('Superseded stale next-step triggers while starting queued runtime prompt generation', undefined, {
2806
+ dialogId: this.dialogId.valueOf(),
2807
+ rootId: this.dialogId.rootId,
2808
+ selfId: this.dialogId.selfId,
2809
+ course,
2810
+ genseq,
2811
+ msgId: msgId ?? null,
2812
+ acceptedTriggerIds: acceptedTriggers.map((trigger) => trigger.triggerId),
2813
+ supersededTriggerIds: triggerSelection.supersededTriggers.map((trigger) => trigger.triggerId),
2814
+ reason: 'queued_runtime_prompt_new_course_takes_precedence',
2815
+ });
2816
+ }
2795
2817
  const acceptedTriggerIds = acceptedTriggers.map((trigger) => trigger.triggerId);
2796
- const nextStep = acceptedTriggerIds.length === 0
2818
+ const consumedTriggerIds = new Set([
2819
+ ...acceptedTriggerIds,
2820
+ ...triggerSelection.supersededTriggers.map((trigger) => trigger.triggerId),
2821
+ ]);
2822
+ const nextStep = consumedTriggerIds.size === 0
2797
2823
  ? previous.nextStep
2798
- : removeNextStepTrigger(previous.nextStep, (trigger) => acceptedTriggerIds.includes(trigger.triggerId));
2824
+ : removeNextStepTrigger(previous.nextStep, (trigger) => consumedTriggerIds.has(trigger.triggerId));
2799
2825
  return {
2800
2826
  kind: 'patch',
2801
2827
  patch: {
@@ -2828,16 +2854,6 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2828
2854
  }
2829
2855
  return acceptedTriggers;
2830
2856
  }
2831
- getResultArrivalBatchIdsFromAcceptedTriggers(triggerIds) {
2832
- const batchIds = [];
2833
- for (const triggerId of triggerIds) {
2834
- const prefix = 'result-arrival:';
2835
- if (triggerId.startsWith(prefix) && triggerId.length > prefix.length) {
2836
- batchIds.push(triggerId.slice(prefix.length));
2837
- }
2838
- }
2839
- return batchIds;
2840
- }
2841
2857
  /**
2842
2858
  * Notify end of LLM generation for frontend bubble management
2843
2859
  */
@@ -2848,7 +2864,6 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2848
2864
  throw new Error('Missing active genseq for notifyGeneratingFinish');
2849
2865
  }
2850
2866
  const finishedAt = (0, time_1.formatUnifiedTimestamp)(new Date());
2851
- let acceptedTriggerIds = [];
2852
2867
  const ev = {
2853
2868
  ts: finishedAt,
2854
2869
  type: 'gen_finish_record',
@@ -2876,10 +2891,6 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2876
2891
  }
2877
2892
  // Update generating flag in latest.yaml
2878
2893
  await DialogPersistence.mutateDialogLatest(this.dialogId, (previous) => {
2879
- acceptedTriggerIds =
2880
- previous.generationRunState?.kind === 'open'
2881
- ? previous.generationRunState.acceptedTriggerIds
2882
- : [];
2883
2894
  return {
2884
2895
  kind: 'patch',
2885
2896
  patch: {
@@ -2893,9 +2904,6 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2893
2904
  },
2894
2905
  };
2895
2906
  });
2896
- for (const batchId of this.getResultArrivalBatchIdsFromAcceptedTriggers(acceptedTriggerIds)) {
2897
- await DialogPersistence.removeActiveCalleeBatch(this.dialogId, batchId);
2898
- }
2899
2907
  }
2900
2908
  async sayingStart(dialog) {
2901
2909
  const course = dialog.activeGenCourseOrUndefined ?? dialog.currentCourse;
@@ -3753,7 +3761,7 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
3753
3761
  async loadSideDialogRegistry(mainDialog, status) {
3754
3762
  const entries = await DialogPersistence.loadSideDialogRegistry(mainDialog.id, status);
3755
3763
  const shouldPruneDead = status === 'running';
3756
- let prunedDeadRegistryEntries = false;
3764
+ let prunedRegistryEntries = false;
3757
3765
  const restoringSideDialogs = new Map();
3758
3766
  const ensureSideDialogLoaded = async (sideDialogId, ancestry = new Set()) => {
3759
3767
  if (ancestry.has(sideDialogId.selfId)) {
@@ -3852,39 +3860,64 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
3852
3860
  for (const entry of entries) {
3853
3861
  if (!entry.sessionSlug)
3854
3862
  continue;
3855
- if (shouldPruneDead) {
3856
- const latest = await DialogPersistence.loadDialogLatest(entry.sideDialogId, status);
3857
- const executionMarker = latest?.executionMarker;
3858
- if (executionMarker && executionMarker.kind === 'dead') {
3859
- prunedDeadRegistryEntries = true;
3860
- mainDialog.unregisterSideDialog(entry.agentId, entry.sessionSlug);
3861
- log_1.log.debug('Skip dead sideDialog while loading Type B registry', undefined, {
3862
- rootId: mainDialog.id.rootId,
3863
- sideDialogId: entry.sideDialogId.selfId,
3864
- agentId: entry.agentId,
3865
- sessionSlug: entry.sessionSlug,
3866
- });
3867
- continue;
3863
+ try {
3864
+ if (shouldPruneDead) {
3865
+ const latest = await DialogPersistence.loadDialogLatest(entry.sideDialogId, status);
3866
+ const executionMarker = latest?.executionMarker;
3867
+ if (executionMarker && executionMarker.kind === 'dead') {
3868
+ prunedRegistryEntries = true;
3869
+ mainDialog.unregisterSideDialog(entry.agentId, entry.sessionSlug);
3870
+ log_1.log.debug('Skip dead sideDialog while loading Type B registry', undefined, {
3871
+ rootId: mainDialog.id.rootId,
3872
+ sideDialogId: entry.sideDialogId.selfId,
3873
+ agentId: entry.agentId,
3874
+ sessionSlug: entry.sessionSlug,
3875
+ });
3876
+ continue;
3877
+ }
3868
3878
  }
3879
+ const sideDialog = await ensureSideDialogLoaded(entry.sideDialogId);
3880
+ if (!sideDialog.sessionSlug) {
3881
+ throw new Error(`SideDialog registry invariant violation: missing sessionSlug on loaded sideDialog ` +
3882
+ `(rootId=${mainDialog.id.rootId}, selfId=${entry.sideDialogId.selfId}, expectedSessionSlug=${entry.sessionSlug})`);
3883
+ }
3884
+ if (sideDialog.sessionSlug !== entry.sessionSlug) {
3885
+ throw new Error(`SideDialog registry invariant violation: sessionSlug mismatch ` +
3886
+ `(rootId=${mainDialog.id.rootId}, selfId=${entry.sideDialogId.selfId}, ` +
3887
+ `expected=${entry.sessionSlug}, actual=${sideDialog.sessionSlug})`);
3888
+ }
3889
+ if (sideDialog.agentId !== entry.agentId) {
3890
+ throw new Error(`SideDialog registry invariant violation: agentId mismatch ` +
3891
+ `(rootId=${mainDialog.id.rootId}, selfId=${entry.sideDialogId.selfId}, ` +
3892
+ `expected=${entry.agentId}, actual=${sideDialog.agentId})`);
3893
+ }
3894
+ mainDialog.registerSideDialog(sideDialog);
3869
3895
  }
3870
- const sideDialog = await ensureSideDialogLoaded(entry.sideDialogId);
3871
- if (!sideDialog.sessionSlug) {
3872
- throw new Error(`SideDialog registry invariant violation: missing sessionSlug on loaded sideDialog ` +
3873
- `(rootId=${mainDialog.id.rootId}, selfId=${entry.sideDialogId.selfId}, expectedSessionSlug=${entry.sessionSlug})`);
3874
- }
3875
- if (sideDialog.sessionSlug !== entry.sessionSlug) {
3876
- throw new Error(`SideDialog registry invariant violation: sessionSlug mismatch ` +
3877
- `(rootId=${mainDialog.id.rootId}, selfId=${entry.sideDialogId.selfId}, ` +
3878
- `expected=${entry.sessionSlug}, actual=${sideDialog.sessionSlug})`);
3879
- }
3880
- if (sideDialog.agentId !== entry.agentId) {
3881
- throw new Error(`SideDialog registry invariant violation: agentId mismatch ` +
3882
- `(rootId=${mainDialog.id.rootId}, selfId=${entry.sideDialogId.selfId}, ` +
3883
- `expected=${entry.agentId}, actual=${sideDialog.agentId})`);
3896
+ catch (error) {
3897
+ if ((0, persistence_errors_1.findDomindsPersistenceFileError)(error)) {
3898
+ throw error;
3899
+ }
3900
+ prunedRegistryEntries = true;
3901
+ const loadedDialog = mainDialog.lookupDialog(entry.sideDialogId.selfId);
3902
+ if (loadedDialog instanceof dialog_1.SideDialog &&
3903
+ loadedDialog.sessionSlug &&
3904
+ (loadedDialog.agentId !== entry.agentId || loadedDialog.sessionSlug !== entry.sessionSlug)) {
3905
+ mainDialog.unregisterSideDialog(loadedDialog.agentId, loadedDialog.sessionSlug);
3906
+ }
3907
+ mainDialog.unregisterDialog(entry.sideDialogId.selfId);
3908
+ if (entry.sessionSlug) {
3909
+ mainDialog.unregisterSideDialog(entry.agentId, entry.sessionSlug);
3910
+ }
3911
+ log_1.log.error('Pruned invalid sideDialog registry entry while loading Type B registry', error, {
3912
+ rootId: mainDialog.id.rootId,
3913
+ sideDialogId: entry.sideDialogId.selfId,
3914
+ agentId: entry.agentId,
3915
+ sessionSlug: entry.sessionSlug,
3916
+ status,
3917
+ });
3884
3918
  }
3885
- mainDialog.registerSideDialog(sideDialog);
3886
3919
  }
3887
- if (prunedDeadRegistryEntries) {
3920
+ if (prunedRegistryEntries) {
3888
3921
  await mainDialog.saveSideDialogRegistry();
3889
3922
  }
3890
3923
  }
@@ -4792,6 +4825,47 @@ function sortNextStepTriggersForConsumption(triggers) {
4792
4825
  return left.triggerId.localeCompare(right.triggerId);
4793
4826
  });
4794
4827
  }
4828
+ function filterNextStepTriggersForGenerationStart(args) {
4829
+ const orderedTriggers = sortNextStepTriggersForConsumption(args.triggers);
4830
+ if (typeof args.msgId !== 'string' || args.msgId.trim() === '') {
4831
+ return { acceptedTriggers: orderedTriggers, supersededTriggers: [] };
4832
+ }
4833
+ const promptTrigger = orderedTriggers.find((trigger) => trigger.kind === 'queued_prompt' &&
4834
+ trigger.promptId === args.msgId &&
4835
+ trigger.course === args.currentCourse);
4836
+ if (promptTrigger === undefined) {
4837
+ return { acceptedTriggers: orderedTriggers, supersededTriggers: [] };
4838
+ }
4839
+ const acceptedTriggers = [];
4840
+ const supersededTriggers = [];
4841
+ for (const trigger of orderedTriggers) {
4842
+ const belongsToPromptCourse = (() => {
4843
+ switch (trigger.kind) {
4844
+ case 'queued_prompt':
4845
+ case 'user_input':
4846
+ case 'open_generation_recovery':
4847
+ return trigger.course === args.currentCourse;
4848
+ case 'followup':
4849
+ return trigger.sourceGeneration.course === args.currentCourse;
4850
+ case 'mainline_diligence':
4851
+ case 'result_arrival':
4852
+ case 'reply_delivery_recovery':
4853
+ return true;
4854
+ default: {
4855
+ const _exhaustive = trigger;
4856
+ throw new Error(`next-step trigger filtering invariant violation: unsupported trigger kind for dialog=${args.dialogId.valueOf()}`);
4857
+ }
4858
+ }
4859
+ })();
4860
+ if (belongsToPromptCourse) {
4861
+ acceptedTriggers.push(trigger);
4862
+ }
4863
+ else {
4864
+ supersededTriggers.push(trigger);
4865
+ }
4866
+ }
4867
+ return { acceptedTriggers, supersededTriggers };
4868
+ }
4795
4869
  function buildReplyDeliveryId(dialogId, replyCallId) {
4796
4870
  return `reply-delivery:${dialogId.rootId}:${dialogId.selfId}:${replyCallId}`;
4797
4871
  }
@@ -6425,66 +6499,6 @@ class DialogPersistence {
6425
6499
  throw new Error('unreachable after loadActiveCalleeDispatches persistence rethrow');
6426
6500
  }
6427
6501
  }
6428
- static isActiveCalleeDispatchRecord(value) {
6429
- if (!isRecord(value))
6430
- return false;
6431
- if (typeof value.calleeDialogId !== 'string')
6432
- return false;
6433
- if (value.calleeDialogId.trim() === '')
6434
- return false;
6435
- if (typeof value.createdAt !== 'string')
6436
- return false;
6437
- if (typeof value.batchId !== 'string')
6438
- return false;
6439
- if (value.batchId.trim() === '')
6440
- return false;
6441
- if (value.callName !== 'tellask' &&
6442
- value.callName !== 'tellaskSessionless' &&
6443
- value.callName !== 'freshBootsReasoning') {
6444
- return false;
6445
- }
6446
- switch (value.callName) {
6447
- case 'tellask':
6448
- case 'tellaskSessionless':
6449
- if (!Array.isArray(value.mentionList))
6450
- return false;
6451
- if (!value.mentionList.every((item) => typeof item === 'string'))
6452
- return false;
6453
- if (value.mentionList.length < 1)
6454
- return false;
6455
- break;
6456
- case 'freshBootsReasoning':
6457
- if (value.mentionList !== undefined)
6458
- return false;
6459
- break;
6460
- }
6461
- if (typeof value.tellaskContent !== 'string')
6462
- return false;
6463
- if (typeof value.targetAgentId !== 'string')
6464
- return false;
6465
- if (typeof value.callId !== 'string')
6466
- return false;
6467
- if (typeof value.callSiteCourse !== 'number')
6468
- return false;
6469
- if (!Number.isInteger(value.callSiteCourse))
6470
- return false;
6471
- if (value.callSiteCourse <= 0)
6472
- return false;
6473
- if (typeof value.callSiteGenseq !== 'number')
6474
- return false;
6475
- if (!Number.isInteger(value.callSiteGenseq))
6476
- return false;
6477
- if (value.callSiteGenseq <= 0)
6478
- return false;
6479
- if (value.callType !== 'A' && value.callType !== 'B' && value.callType !== 'C')
6480
- return false;
6481
- if ('sessionSlug' in value) {
6482
- const sessionSlug = value.sessionSlug;
6483
- if (sessionSlug !== undefined && typeof sessionSlug !== 'string')
6484
- return false;
6485
- }
6486
- return true;
6487
- }
6488
6502
  static activeCalleeDispatchCalleeDialogId(record) {
6489
6503
  const calleeDialogId = record.calleeDialogId;
6490
6504
  if (calleeDialogId.trim() === '') {
@@ -6617,10 +6631,16 @@ class DialogPersistence {
6617
6631
  if (!value.batches.every((batch) => this.isActiveCalleeBatch(batch)))
6618
6632
  return false;
6619
6633
  const seenBatchIds = new Set();
6634
+ const seenCallIds = new Set();
6620
6635
  for (const batch of value.batches) {
6621
6636
  if (seenBatchIds.has(batch.batchId))
6622
6637
  return false;
6623
6638
  seenBatchIds.add(batch.batchId);
6639
+ for (const callee of batch.callees) {
6640
+ if (seenCallIds.has(callee.callId))
6641
+ return false;
6642
+ seenCallIds.add(callee.callId);
6643
+ }
6624
6644
  }
6625
6645
  return true;
6626
6646
  }
@@ -6679,7 +6699,13 @@ class DialogPersistence {
6679
6699
  }
6680
6700
  static buildActiveCalleesFileFromDispatches(dispatches) {
6681
6701
  const batchesById = new Map();
6702
+ const callIds = new Set();
6682
6703
  for (const dispatch of dispatches) {
6704
+ if (callIds.has(dispatch.callId)) {
6705
+ throw new Error(`active-callees dispatch invariant violation: duplicate callId ` +
6706
+ `(calleeDialogId=${dispatch.calleeDialogId}, batchId=${dispatch.batchId}, callId=${dispatch.callId})`);
6707
+ }
6708
+ callIds.add(dispatch.callId);
6683
6709
  const existingBatch = batchesById.get(dispatch.batchId);
6684
6710
  const callee = this.buildActiveCalleeRecordFromDispatch(dispatch);
6685
6711
  if (!existingBatch) {
@@ -6700,9 +6726,6 @@ class DialogPersistence {
6700
6726
  throw new Error(`active-callees dispatch invariant violation: batch call-site mismatch ` +
6701
6727
  `(calleeDialogId=${dispatch.calleeDialogId}, batchId=${dispatch.batchId})`);
6702
6728
  }
6703
- if (existingBatch.callees.some((entry) => entry.callId === dispatch.callId)) {
6704
- continue;
6705
- }
6706
6729
  batchesById.set(dispatch.batchId, {
6707
6730
  ...existingBatch,
6708
6731
  callees: [...existingBatch.callees, callee],
@@ -6734,15 +6757,30 @@ class DialogPersistence {
6734
6757
  }
6735
6758
  return next;
6736
6759
  }
6737
- static async removeActiveCalleeDispatch(mainDialogId, calleeDialogId, rootAnchor, status = 'running') {
6738
- await this.mutateActiveCallees(mainDialogId, (previous) => ({
6739
- batches: previous.batches
6740
- .map((batch) => ({
6741
- ...batch,
6742
- callees: batch.callees.filter((callee) => callee.calleeDialogId !== calleeDialogId),
6743
- }))
6744
- .filter((batch) => batch.callees.length > 0),
6745
- }), status);
6760
+ static async removeActiveCalleeDispatch(mainDialogId, calleeDialogId, callId, rootAnchor, status = 'running') {
6761
+ const normalizedCallId = callId.trim();
6762
+ if (normalizedCallId === '') {
6763
+ throw new Error(`active-callees remove invariant violation: callId is required ` +
6764
+ `(rootId=${mainDialogId.rootId}, selfId=${mainDialogId.selfId}, calleeDialogId=${calleeDialogId})`);
6765
+ }
6766
+ await this.mutateActiveCallees(mainDialogId, (previous) => {
6767
+ const removedCount = previous.batches.reduce((count, batch) => {
6768
+ return (count +
6769
+ batch.callees.filter((callee) => callee.calleeDialogId === calleeDialogId && callee.callId === normalizedCallId).length);
6770
+ }, 0);
6771
+ if (removedCount !== 1) {
6772
+ throw new Error(`active-callees remove invariant violation: expected exactly one dispatch ` +
6773
+ `(rootId=${mainDialogId.rootId}, selfId=${mainDialogId.selfId}, calleeDialogId=${calleeDialogId}, callId=${normalizedCallId}, removedCount=${removedCount})`);
6774
+ }
6775
+ const batches = [];
6776
+ for (const batch of previous.batches) {
6777
+ const callees = batch.callees.filter((callee) => !(callee.calleeDialogId === calleeDialogId && callee.callId === normalizedCallId));
6778
+ if (callees.length > 0) {
6779
+ batches.push({ ...batch, callees });
6780
+ }
6781
+ }
6782
+ return { batches };
6783
+ }, status);
6746
6784
  if (rootAnchor) {
6747
6785
  await this.appendActiveCalleesReconciledRecord(mainDialogId, await this.loadActiveCalleeDispatches(mainDialogId, status), rootAnchorWriteTarget(rootAnchor), status);
6748
6786
  }
@@ -6774,6 +6812,11 @@ class DialogPersistence {
6774
6812
  filePath,
6775
6813
  });
6776
6814
  }
6815
+ this.assertNoDuplicateSessionedTellaskPendingRecords(this.projectActiveCalleeDispatches(parsed), {
6816
+ rootId: dialogId.rootId,
6817
+ selfId: dialogId.selfId,
6818
+ status,
6819
+ });
6777
6820
  return parsed;
6778
6821
  }
6779
6822
  catch (error) {
@@ -7225,6 +7268,13 @@ class DialogPersistence {
7225
7268
  }
7226
7269
  static async upsertActiveCalleeFromPendingRecord(dialogId, record, status = 'running') {
7227
7270
  await this.mutateActiveCallees(dialogId, (previous) => {
7271
+ const duplicateCallId = previous.batches.some((batch) => batch.batchId === record.batchId
7272
+ ? false
7273
+ : batch.callees.some((entry) => entry.callId === record.callId));
7274
+ if (duplicateCallId) {
7275
+ throw new Error(`active-callees duplicate call invariant violation ` +
7276
+ `(rootId=${dialogId.rootId}, selfId=${dialogId.selfId}, batchId=${record.batchId}, callId=${record.callId})`);
7277
+ }
7228
7278
  const existingBatch = previous.batches.find((batch) => batch.batchId === record.batchId);
7229
7279
  const callee = this.buildActiveCalleeRecordFromDispatch(record);
7230
7280
  if (existingBatch === undefined) {
@@ -7255,12 +7305,8 @@ class DialogPersistence {
7255
7305
  }
7256
7306
  const existingCallee = existingBatch.callees.find((entry) => entry.callId === record.callId);
7257
7307
  if (existingCallee !== undefined) {
7258
- if (existingCallee.calleeDialogId !== callee.calleeDialogId ||
7259
- existingCallee.callName !== record.callName) {
7260
- throw new Error(`active-callees duplicate call invariant violation ` +
7261
- `(rootId=${dialogId.rootId}, selfId=${dialogId.selfId}, batchId=${record.batchId}, callId=${record.callId})`);
7262
- }
7263
- return previous;
7308
+ throw new Error(`active-callees duplicate call invariant violation ` +
7309
+ `(rootId=${dialogId.rootId}, selfId=${dialogId.selfId}, batchId=${record.batchId}, callId=${record.callId})`);
7264
7310
  }
7265
7311
  return {
7266
7312
  batches: previous.batches.map((batch) => batch.batchId === record.batchId
@@ -7323,27 +7369,18 @@ class DialogPersistence {
7323
7369
  }
7324
7370
  return outcome;
7325
7371
  }
7326
- static async removeActiveCallee(dialogId, args, status = 'running') {
7372
+ static async removeActiveCalleeBatch(dialogId, batchId, status = 'running') {
7327
7373
  await this.mutateActiveCallees(dialogId, (previous) => {
7328
- const batches = [];
7329
- for (const batch of previous.batches) {
7330
- if (batch.batchId !== args.batchId) {
7331
- batches.push(batch);
7332
- continue;
7333
- }
7334
- const callees = batch.callees.filter((callee) => callee.callId !== args.callId);
7335
- if (callees.length > 0) {
7336
- batches.push({ ...batch, callees });
7337
- }
7374
+ const removedCount = previous.batches.filter((batch) => batch.batchId === batchId).length;
7375
+ if (removedCount !== 1) {
7376
+ throw new Error(`active-callees remove batch invariant violation: expected exactly one batch ` +
7377
+ `(rootId=${dialogId.rootId}, selfId=${dialogId.selfId}, batchId=${batchId}, removedCount=${removedCount})`);
7338
7378
  }
7339
- return { batches };
7379
+ return {
7380
+ batches: previous.batches.filter((batch) => batch.batchId !== batchId),
7381
+ };
7340
7382
  }, status);
7341
7383
  }
7342
- static async removeActiveCalleeBatch(dialogId, batchId, status = 'running') {
7343
- await this.mutateActiveCallees(dialogId, (previous) => ({
7344
- batches: previous.batches.filter((batch) => batch.batchId !== batchId),
7345
- }), status);
7346
- }
7347
7384
  /**
7348
7385
  * Get the path for storing sideDialog responses (supports both main dialog and sideDialog tellaskers).
7349
7386
  * For Type C sideDialogs created inside another sideDialog, responses are stored at the parent's level.
@@ -8561,7 +8598,7 @@ class DialogPersistence {
8561
8598
  }),
8562
8599
  callStack: captureInvariantWarningStack(),
8563
8600
  };
8564
- emitInvariantWarning('clearPendingRuntimePrompt invariant warning: generating dialog still projected as pending_runtime_prompt; healing displayState to proceeding', warningDetails);
8601
+ log_1.log.debug('clearPendingRuntimePrompt invariant warning: generating dialog still projected as pending_runtime_prompt; healing displayState to proceeding', undefined, warningDetails);
8565
8602
  return { kind: 'proceeding' };
8566
8603
  })()
8567
8604
  : { kind: 'idle_waiting_user' }