dominds 1.23.10 → 1.24.1

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 (257) hide show
  1. package/dist/apps/runtime.js +2 -2
  2. package/dist/dialog-display-state.d.ts +2 -3
  3. package/dist/dialog-display-state.js +53 -145
  4. package/dist/dialog-drive-work.d.ts +3 -0
  5. package/dist/dialog-drive-work.js +21 -0
  6. package/dist/dialog-fork.d.ts +0 -1
  7. package/dist/dialog-fork.js +28 -32
  8. package/dist/dialog-generation-run.d.ts +4 -0
  9. package/dist/dialog-generation-run.js +24 -0
  10. package/dist/dialog-global-registry.d.ts +7 -8
  11. package/dist/dialog-global-registry.js +39 -33
  12. package/dist/dialog-instance-registry.js +12 -12
  13. package/dist/dialog-interruption.js +2 -2
  14. package/dist/dialog-latest-state.d.ts +4 -0
  15. package/dist/dialog-latest-state.js +14 -0
  16. package/dist/dialog.d.ts +31 -30
  17. package/dist/dialog.js +146 -56
  18. package/dist/docs/agent-priming.md +1 -1
  19. package/dist/docs/agent-priming.zh.md +1 -1
  20. package/dist/docs/app-constitution.md +1 -1
  21. package/dist/docs/app-constitution.zh.md +1 -1
  22. package/dist/docs/dialog-persistence.md +2 -2
  23. package/dist/docs/dialog-persistence.zh.md +2 -2
  24. package/dist/docs/dialog-system.md +72 -75
  25. package/dist/docs/dialog-system.zh.md +79 -82
  26. package/dist/docs/diligence-push.md +30 -40
  27. package/dist/docs/diligence-push.zh.md +15 -20
  28. package/dist/docs/dominds-agent-collaboration.zh.md +12 -10
  29. package/dist/docs/dominds-terminology.md +5 -2
  30. package/dist/docs/idle-reminder-wake.md +1 -1
  31. package/dist/docs/idle-reminder-wake.zh.md +1 -1
  32. package/dist/docs/issues/tellask-background-continuation-live-bugs-2026-05-17.zh.md +101 -0
  33. package/dist/docs/mcp-prompts-resources.md +13 -6
  34. package/dist/docs/mcp-support.md +18 -9
  35. package/dist/docs/mcp-support.zh.md +13 -8
  36. package/dist/docs/memory-system.md +51 -1
  37. package/dist/docs/memory-system.zh.md +51 -1
  38. package/dist/docs/team_mgmt-toolset.md +27 -10
  39. package/dist/docs/team_mgmt-toolset.zh.md +20 -9
  40. package/dist/docs/tellask-background-continuation-refactor.zh.md +1017 -0
  41. package/dist/docs/tellask-collab.md +4 -4
  42. package/dist/docs/tellask-collab.zh.md +4 -4
  43. package/dist/evt-registry.js +1 -0
  44. package/dist/llm/defaults.yaml +12 -9
  45. package/dist/llm/kernel-driver/drive.js +295 -70
  46. package/dist/llm/kernel-driver/engine.d.ts +1 -1
  47. package/dist/llm/kernel-driver/engine.js +4 -4
  48. package/dist/llm/kernel-driver/flow.js +197 -130
  49. package/dist/llm/kernel-driver/idle-reminder-wake.js +2 -4
  50. package/dist/llm/kernel-driver/loop.d.ts +4 -1
  51. package/dist/llm/kernel-driver/loop.js +268 -62
  52. package/dist/llm/kernel-driver/reply-guidance.js +29 -50
  53. package/dist/llm/kernel-driver/runtime.d.ts +10 -0
  54. package/dist/llm/kernel-driver/runtime.js +29 -84
  55. package/dist/llm/kernel-driver/sideDialog-txn.js +3 -0
  56. package/dist/llm/kernel-driver/sideDialog.d.ts +4 -13
  57. package/dist/llm/kernel-driver/sideDialog.js +165 -161
  58. package/dist/llm/kernel-driver/tellask-special.d.ts +5 -2
  59. package/dist/llm/kernel-driver/tellask-special.js +166 -184
  60. package/dist/llm/kernel-driver/types.d.ts +12 -8
  61. package/dist/mcp/config.d.ts +13 -5
  62. package/dist/mcp/config.js +37 -24
  63. package/dist/mcp/resources.d.ts +14 -3
  64. package/dist/mcp/resources.js +9 -6
  65. package/dist/mcp/supervisor.js +6 -1
  66. package/dist/mcp/tool-names.d.ts +2 -2
  67. package/dist/mcp/tool-names.js +4 -7
  68. package/dist/minds/system-prompt-parts.js +3 -0
  69. package/dist/persistence-errors.d.ts +1 -1
  70. package/dist/persistence.d.ts +80 -51
  71. package/dist/persistence.js +1750 -427
  72. package/dist/priming.d.ts +1 -1
  73. package/dist/priming.js +2 -2
  74. package/dist/recovery/proceeding-drive.js +46 -11
  75. package/dist/recovery/reply-special.js +42 -35
  76. package/dist/runtime/background-callee-summary.d.ts +2 -0
  77. package/dist/runtime/background-callee-summary.js +14 -0
  78. package/dist/runtime/driver-messages.d.ts +0 -8
  79. package/dist/runtime/driver-messages.js +0 -59
  80. package/dist/server/api-routes.js +40 -27
  81. package/dist/server/websocket-handler.js +39 -78
  82. package/dist/server.js +2 -2
  83. package/dist/shared-reminders.js +14 -3
  84. package/dist/skills/load.d.ts +7 -0
  85. package/dist/tools/cmd-runner.js +2 -0
  86. package/dist/tools/ctrl.js +6 -6
  87. package/dist/tools/os.js +2 -0
  88. package/dist/tools/pending-tellask-reminder.js +9 -9
  89. package/dist/tools/prompts/control/en/index.md +2 -0
  90. package/dist/tools/prompts/control/en/principles.md +1 -0
  91. package/dist/tools/prompts/control/en/tools.md +3 -0
  92. package/dist/tools/prompts/control/zh/index.md +2 -0
  93. package/dist/tools/prompts/control/zh/principles.md +1 -0
  94. package/dist/tools/prompts/control/zh/tools.md +3 -0
  95. package/dist/tools/prompts/personal_memory/en/principles.md +4 -1
  96. package/dist/tools/prompts/personal_memory/zh/principles.md +4 -1
  97. package/dist/tools/prompts/skills/en/index.md +1 -1
  98. package/dist/tools/prompts/skills/en/principles.md +5 -1
  99. package/dist/tools/prompts/skills/zh/index.md +1 -1
  100. package/dist/tools/prompts/skills/zh/principles.md +5 -1
  101. package/dist/tools/prompts/team_memory/en/principles.md +3 -0
  102. package/dist/tools/prompts/team_memory/en/scenarios.md +1 -1
  103. package/dist/tools/prompts/team_memory/zh/principles.md +3 -0
  104. package/dist/tools/prompts/team_memory/zh/scenarios.md +1 -1
  105. package/dist/tools/shell-capture-env.d.ts +1 -0
  106. package/dist/tools/shell-capture-env.js +44 -0
  107. package/dist/tools/skills.js +2 -0
  108. package/dist/tools/team_mgmt-mcp-manual.js +8 -8
  109. package/dist/tools/team_mgmt.js +34 -12
  110. package/dist/utils/task-package.js +9 -1
  111. package/package.json +3 -3
  112. package/webapp/dist/assets/{_basePickBy-CBh9Agsi.js → _basePickBy-LdPzzrA2.js} +3 -3
  113. package/webapp/dist/assets/_basePickBy-LdPzzrA2.js.map +1 -0
  114. package/webapp/dist/assets/{_baseUniq-D2UXV506.js → _baseUniq-Dd4qkGWy.js} +2 -2
  115. package/webapp/dist/assets/_baseUniq-Dd4qkGWy.js.map +1 -0
  116. package/webapp/dist/assets/{arc-CmeRUuzC.js → arc-Bx35xRdo.js} +2 -2
  117. package/webapp/dist/assets/arc-Bx35xRdo.js.map +1 -0
  118. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-D5hfsb4A.js → architectureDiagram-2XIMDMQ5-CqJear9j.js} +26 -8
  119. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-CqJear9j.js.map +1 -0
  120. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BVswEa9D.js → blockDiagram-WCTKOSBZ-9tLmXg6W.js} +187 -170
  121. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-9tLmXg6W.js.map +1 -0
  122. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-Bgm6yzGX.js → c4Diagram-IC4MRINW-Dzv3iLb1.js} +4 -4
  123. package/webapp/dist/assets/c4Diagram-IC4MRINW-Dzv3iLb1.js.map +1 -0
  124. package/webapp/dist/assets/{channel-CDo0v82C.js → channel-DlYmbJjD.js} +2 -2
  125. package/webapp/dist/assets/channel-DlYmbJjD.js.map +1 -0
  126. package/webapp/dist/assets/{chunk-4BX2VUAB-DMqSdYxu.js → chunk-4BX2VUAB-H-sbLEAZ.js} +2 -2
  127. package/webapp/dist/assets/chunk-4BX2VUAB-H-sbLEAZ.js.map +1 -0
  128. package/webapp/dist/assets/{chunk-55IACEB6-CudmE3Fx.js → chunk-55IACEB6-DM99Uhn7.js} +2 -2
  129. package/webapp/dist/assets/chunk-55IACEB6-DM99Uhn7.js.map +1 -0
  130. package/webapp/dist/assets/{chunk-FMBD7UC4-BSVSuNxy.js → chunk-FMBD7UC4-BrYi5v3v.js} +2 -2
  131. package/webapp/dist/assets/chunk-FMBD7UC4-BrYi5v3v.js.map +1 -0
  132. package/webapp/dist/assets/{chunk-TZMSLE5B-aW2uEdtS.js → chunk-JSJVCQXG-xsaAqb_D.js} +14 -6
  133. package/webapp/dist/assets/chunk-JSJVCQXG-xsaAqb_D.js.map +1 -0
  134. package/webapp/dist/assets/{chunk-QN33PNHL-Cbf-pIxI.js → chunk-KX2RTZJC-DP9JzJzb.js} +2 -2
  135. package/webapp/dist/assets/chunk-KX2RTZJC-DP9JzJzb.js.map +1 -0
  136. package/webapp/dist/assets/{chunk-DI55MBZ5-CZCetJxI.js → chunk-NQ4KR5QH-B1Dmz0tx.js} +9 -7
  137. package/webapp/dist/assets/chunk-NQ4KR5QH-B1Dmz0tx.js.map +1 -0
  138. package/webapp/dist/assets/{chunk-QZHKN3VN-DYyIY8_q.js → chunk-QZHKN3VN-1BrJQ9T8.js} +2 -2
  139. package/webapp/dist/assets/chunk-QZHKN3VN-1BrJQ9T8.js.map +1 -0
  140. package/webapp/dist/assets/{chunk-B4BG7PRW-d5dfiagO.js → chunk-WL4C6EOR-m9798qm6.js} +171 -121
  141. package/webapp/dist/assets/chunk-WL4C6EOR-m9798qm6.js.map +1 -0
  142. package/webapp/dist/assets/{classDiagram-2ON5EDUG-C4-5PgVL.js → classDiagram-VBA2DB6C-DunVoVHy.js} +7 -6
  143. package/webapp/dist/assets/classDiagram-VBA2DB6C-DunVoVHy.js.map +1 -0
  144. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-C4-5PgVL.js → classDiagram-v2-RAHNMMFH-DunVoVHy.js} +7 -6
  145. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-DunVoVHy.js.map +1 -0
  146. package/webapp/dist/assets/{clone-DivPByZ0.js → clone-CxYNYmli.js} +2 -2
  147. package/webapp/dist/assets/clone-CxYNYmli.js.map +1 -0
  148. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CwBAjMT3.js → cose-bilkent-S5V4N54A-CnD5vxv9.js} +2 -2
  149. package/webapp/dist/assets/cose-bilkent-S5V4N54A-CnD5vxv9.js.map +1 -0
  150. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  151. package/webapp/dist/assets/{dagre-6UL2VRFP-tC56AIio.js → dagre-KLK3FWXG-D8iLo6g8.js} +7 -7
  152. package/webapp/dist/assets/dagre-KLK3FWXG-D8iLo6g8.js.map +1 -0
  153. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  154. package/webapp/dist/assets/{diagram-PSM6KHXK-dEF_O6uj.js → diagram-E7M64L7V-CCGf4yS4.js} +10 -10
  155. package/webapp/dist/assets/diagram-E7M64L7V-CCGf4yS4.js.map +1 -0
  156. package/webapp/dist/assets/{diagram-QEK2KX5R-BC3CyB81.js → diagram-IFDJBPK2-nZVTTM2s.js} +9 -8
  157. package/webapp/dist/assets/diagram-IFDJBPK2-nZVTTM2s.js.map +1 -0
  158. package/webapp/dist/assets/{diagram-S2PKOQOG-BV-YMbA_.js → diagram-P4PSJMXO-DUG05oR4.js} +8 -8
  159. package/webapp/dist/assets/diagram-P4PSJMXO-DUG05oR4.js.map +1 -0
  160. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-DIgdtwce.js → erDiagram-INFDFZHY-DTtcqarO.js} +96 -75
  161. package/webapp/dist/assets/erDiagram-INFDFZHY-DTtcqarO.js.map +1 -0
  162. package/webapp/dist/assets/{flowDiagram-NV44I4VS-C7Mawlld.js → flowDiagram-PKNHOUZH-Ol68h2lV.js} +98 -81
  163. package/webapp/dist/assets/flowDiagram-PKNHOUZH-Ol68h2lV.js.map +1 -0
  164. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-DgaYLOeL.js → ganttDiagram-A5KZAMGK-BD9KkhMb.js} +28 -3
  165. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-BD9KkhMb.js.map +1 -0
  166. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-Dwv1ZLFB.js → gitGraphDiagram-K3NZZRJ6-CZ4C5yhB.js} +38 -46
  167. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-CZ4C5yhB.js.map +1 -0
  168. package/webapp/dist/assets/graph-BICDsOFt.js +782 -0
  169. package/webapp/dist/assets/graph-BICDsOFt.js.map +1 -0
  170. package/webapp/dist/assets/{index-BGdI3lWA.css → index-BQoNJEGT.css} +19 -27
  171. package/webapp/dist/assets/{index-BsSFGqVX.js → index-BTMpGPk_.js} +1365 -1335
  172. package/webapp/dist/assets/{index-BsSFGqVX.js.map → index-BTMpGPk_.js.map} +1 -1
  173. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-PDKRqD6y.js → infoDiagram-LFFYTUFH-D0xrjViS.js} +7 -7
  174. package/webapp/dist/assets/infoDiagram-LFFYTUFH-D0xrjViS.js.map +1 -0
  175. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  176. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-Beaj-xkw.js +966 -0
  177. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-Beaj-xkw.js.map +1 -0
  178. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-DDD6YlTa.js → journeyDiagram-4ABVD52K-k7BmCpXO.js} +5 -5
  179. package/webapp/dist/assets/journeyDiagram-4ABVD52K-k7BmCpXO.js.map +1 -0
  180. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-CK-CJzXm.js → kanban-definition-K7BYSVSG-BBQOWu--.js} +5 -3
  181. package/webapp/dist/assets/kanban-definition-K7BYSVSG-BBQOWu--.js.map +1 -0
  182. package/webapp/dist/assets/{layout-DRs2ltCp.js → layout-B_h66HyR.js} +5 -5
  183. package/webapp/dist/assets/layout-B_h66HyR.js.map +1 -0
  184. package/webapp/dist/assets/{linear-CiMu0dYF.js → linear-QdCnoDG9.js} +2 -2
  185. package/webapp/dist/assets/linear-QdCnoDG9.js.map +1 -0
  186. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-C8yEoHXx.js → mindmap-definition-YRQLILUH-BTk4BxEf.js} +7 -5
  187. package/webapp/dist/assets/mindmap-definition-YRQLILUH-BTk4BxEf.js.map +1 -0
  188. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  189. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-BhtVILXQ.js → pieDiagram-SKSYHLDU-DQonY6Ln.js} +8 -8
  190. package/webapp/dist/assets/pieDiagram-SKSYHLDU-DQonY6Ln.js.map +1 -0
  191. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-B7Xuuv_G.js → quadrantDiagram-337W2JSQ-6tqc3Gus.js} +3 -3
  192. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-6tqc3Gus.js.map +1 -0
  193. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-DY6Q4U6l.js → requirementDiagram-Z7DCOOCP-C6r4anqd.js} +16 -6
  194. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-C6r4anqd.js.map +1 -0
  195. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-DZPox4PX.js → sankeyDiagram-WA2Y5GQK-DE2CTSeA.js} +2 -2
  196. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-DE2CTSeA.js.map +1 -0
  197. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-Bg6GPP0w.js → sequenceDiagram-2WXFIKYE-DSnyMSe6.js} +601 -201
  198. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DSnyMSe6.js.map +1 -0
  199. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-CcskYNpn.js → stateDiagram-RAJIS63D-BsQOXkdZ.js} +9 -9
  200. package/webapp/dist/assets/stateDiagram-RAJIS63D-BsQOXkdZ.js.map +1 -0
  201. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-Dja5UwuW.js → stateDiagram-v2-FVOUBMTO-DW0AWykH.js} +5 -5
  202. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-DW0AWykH.js.map +1 -0
  203. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-CA-Wvxg8.js → timeline-definition-YZTLITO2-Dyxr7fE4.js} +3 -3
  204. package/webapp/dist/assets/timeline-definition-YZTLITO2-Dyxr7fE4.js.map +1 -0
  205. package/webapp/dist/assets/{treemap-GDKQZRPO-CF_Fur4n.js → treemap-KZPCXAKY-CPaPLIL2.js} +37 -24
  206. package/webapp/dist/assets/treemap-KZPCXAKY-CPaPLIL2.js.map +1 -0
  207. package/webapp/dist/assets/vennDiagram-LZ73GAT5-CTduB1wl.js +2487 -0
  208. package/webapp/dist/assets/vennDiagram-LZ73GAT5-CTduB1wl.js.map +1 -0
  209. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-CYc3vOkZ.js → xychartDiagram-JWTSCODW-Sb80BTd7.js} +4 -4
  210. package/webapp/dist/assets/xychartDiagram-JWTSCODW-Sb80BTd7.js.map +1 -0
  211. package/webapp/dist/index.html +2 -2
  212. package/dist/docs/tellask-revive-context-refactor.zh.md +0 -604
  213. package/webapp/dist/assets/_basePickBy-CBh9Agsi.js.map +0 -1
  214. package/webapp/dist/assets/_baseUniq-D2UXV506.js.map +0 -1
  215. package/webapp/dist/assets/arc-CmeRUuzC.js.map +0 -1
  216. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-D5hfsb4A.js.map +0 -1
  217. package/webapp/dist/assets/blockDiagram-VD42YOAC-BVswEa9D.js.map +0 -1
  218. package/webapp/dist/assets/c4Diagram-YG6GDRKO-Bgm6yzGX.js.map +0 -1
  219. package/webapp/dist/assets/channel-CDo0v82C.js.map +0 -1
  220. package/webapp/dist/assets/chunk-4BX2VUAB-DMqSdYxu.js.map +0 -1
  221. package/webapp/dist/assets/chunk-55IACEB6-CudmE3Fx.js.map +0 -1
  222. package/webapp/dist/assets/chunk-B4BG7PRW-d5dfiagO.js.map +0 -1
  223. package/webapp/dist/assets/chunk-DI55MBZ5-CZCetJxI.js.map +0 -1
  224. package/webapp/dist/assets/chunk-FMBD7UC4-BSVSuNxy.js.map +0 -1
  225. package/webapp/dist/assets/chunk-QN33PNHL-Cbf-pIxI.js.map +0 -1
  226. package/webapp/dist/assets/chunk-QZHKN3VN-DYyIY8_q.js.map +0 -1
  227. package/webapp/dist/assets/chunk-TZMSLE5B-aW2uEdtS.js.map +0 -1
  228. package/webapp/dist/assets/classDiagram-2ON5EDUG-C4-5PgVL.js.map +0 -1
  229. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-C4-5PgVL.js.map +0 -1
  230. package/webapp/dist/assets/clone-DivPByZ0.js.map +0 -1
  231. package/webapp/dist/assets/cose-bilkent-S5V4N54A-CwBAjMT3.js.map +0 -1
  232. package/webapp/dist/assets/dagre-6UL2VRFP-tC56AIio.js.map +0 -1
  233. package/webapp/dist/assets/diagram-PSM6KHXK-dEF_O6uj.js.map +0 -1
  234. package/webapp/dist/assets/diagram-QEK2KX5R-BC3CyB81.js.map +0 -1
  235. package/webapp/dist/assets/diagram-S2PKOQOG-BV-YMbA_.js.map +0 -1
  236. package/webapp/dist/assets/erDiagram-Q2GNP2WA-DIgdtwce.js.map +0 -1
  237. package/webapp/dist/assets/flowDiagram-NV44I4VS-C7Mawlld.js.map +0 -1
  238. package/webapp/dist/assets/ganttDiagram-JELNMOA3-DgaYLOeL.js.map +0 -1
  239. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-Dwv1ZLFB.js.map +0 -1
  240. package/webapp/dist/assets/graph-saC_350a.js +0 -425
  241. package/webapp/dist/assets/graph-saC_350a.js.map +0 -1
  242. package/webapp/dist/assets/infoDiagram-HS3SLOUP-PDKRqD6y.js.map +0 -1
  243. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-DDD6YlTa.js.map +0 -1
  244. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-CK-CJzXm.js.map +0 -1
  245. package/webapp/dist/assets/layout-DRs2ltCp.js.map +0 -1
  246. package/webapp/dist/assets/linear-CiMu0dYF.js.map +0 -1
  247. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-C8yEoHXx.js.map +0 -1
  248. package/webapp/dist/assets/pieDiagram-ADFJNKIX-BhtVILXQ.js.map +0 -1
  249. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-B7Xuuv_G.js.map +0 -1
  250. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-DY6Q4U6l.js.map +0 -1
  251. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-DZPox4PX.js.map +0 -1
  252. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-Bg6GPP0w.js.map +0 -1
  253. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-CcskYNpn.js.map +0 -1
  254. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-Dja5UwuW.js.map +0 -1
  255. package/webapp/dist/assets/timeline-definition-IT6M3QCI-CA-Wvxg8.js.map +0 -1
  256. package/webapp/dist/assets/treemap-GDKQZRPO-CF_Fur4n.js.map +0 -1
  257. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-CYc3vOkZ.js.map +0 -1
@@ -55,7 +55,7 @@ async function ensureMainDialogLoaded(rootId) {
55
55
  const existing = dialog_global_registry_1.globalDialogRegistry.get(rootId);
56
56
  if (existing) {
57
57
  await existing.loadSideDialogRegistry();
58
- await existing.loadPendingSideDialogsFromPersistence();
58
+ await existing.loadActiveCalleeDispatchesFromPersistence();
59
59
  return existing;
60
60
  }
61
61
  return await (0, dialog_instance_registry_1.getOrRestoreMainDialog)(rootId, 'running');
@@ -118,7 +118,7 @@ async function resolveTargetDialog(sourceDlg, target) {
118
118
  throw new Error(`dialog reminder target root not found (${describeTarget(target)})`);
119
119
  }
120
120
  await targetRoot.loadSideDialogRegistry();
121
- await targetRoot.loadPendingSideDialogsFromPersistence();
121
+ await targetRoot.loadActiveCalleeDispatchesFromPersistence();
122
122
  if (target.sessionSlug) {
123
123
  const sideDialog = targetRoot.lookupSideDialog(target.agentId, target.sessionSlug);
124
124
  if (!sideDialog) {
@@ -7,7 +7,7 @@
7
7
  * Design constraints:
8
8
  * - `displayState` is a UI/diagnostic projection, not a business source of truth.
9
9
  * - Primary control flow must rely on underlying facts (active runs, stop requests,
10
- * pending Q4H, pending sideDialogs, queued prompts, persisted status, explicit
10
+ * pending Q4H, active callee dispatches, queued prompts, persisted status, explicit
11
11
  * interruption/death markers).
12
12
  * - The projection is persisted to latest.yaml (`DialogLatestFile.displayState`) so it survives
13
13
  * restarts and multi-tab views can converge quickly.
@@ -51,8 +51,7 @@ export declare function broadcastDisplayStateMarker(dialogId: DialogID, marker:
51
51
  reason?: DialogInterruptionReason;
52
52
  }): void;
53
53
  export declare function computeIdleDisplayState(dlg: Dialog): Promise<DialogDisplayState>;
54
- export declare function refreshRunControlProjectionFromPersistenceFacts(dialogId: DialogID, trigger: 'resume_dialog' | 'resume_all' | 'run_control_snapshot' | 'pending_sideDialogs_changed' | 'q4h_changed'): Promise<DialogLatestFile | null>;
55
- export declare function isRecoverableGeneratingLatest(latest: DialogLatestFile | null): boolean;
54
+ export declare function refreshRunControlProjectionFromPersistenceFacts(dialogId: DialogID, trigger: 'resume_dialog' | 'resume_all' | 'run_control_snapshot' | 'active_callee_dispatches_changed' | 'q4h_changed'): Promise<DialogLatestFile | null>;
56
55
  export declare function reconcileDisplayStatesAfterRestart(): Promise<void>;
57
56
  export declare function requestInterruptDialog(dialogId: DialogID, reason: StopRequestedReason): Promise<{
58
57
  applied: boolean;
@@ -8,7 +8,7 @@
8
8
  * Design constraints:
9
9
  * - `displayState` is a UI/diagnostic projection, not a business source of truth.
10
10
  * - Primary control flow must rely on underlying facts (active runs, stop requests,
11
- * pending Q4H, pending sideDialogs, queued prompts, persisted status, explicit
11
+ * pending Q4H, active callee dispatches, queued prompts, persisted status, explicit
12
12
  * interruption/death markers).
13
13
  * - The projection is persisted to latest.yaml (`DialogLatestFile.displayState`) so it survives
14
14
  * restarts and multi-tab views can converge quickly.
@@ -40,14 +40,15 @@ exports.setDialogDisplayState = setDialogDisplayState;
40
40
  exports.broadcastDisplayStateMarker = broadcastDisplayStateMarker;
41
41
  exports.computeIdleDisplayState = computeIdleDisplayState;
42
42
  exports.refreshRunControlProjectionFromPersistenceFacts = refreshRunControlProjectionFromPersistenceFacts;
43
- exports.isRecoverableGeneratingLatest = isRecoverableGeneratingLatest;
44
43
  exports.reconcileDisplayStatesAfterRestart = reconcileDisplayStatesAfterRestart;
45
44
  exports.requestInterruptDialog = requestInterruptDialog;
46
45
  exports.requestEmergencyStopAll = requestEmergencyStopAll;
47
46
  const time_1 = require("@longrun-ai/kernel/utils/time");
48
47
  const dialog_1 = require("./dialog");
48
+ const dialog_generation_run_1 = require("./dialog-generation-run");
49
49
  const dialog_global_registry_1 = require("./dialog-global-registry");
50
50
  const dialog_interruption_1 = require("./dialog-interruption");
51
+ const dialog_latest_state_1 = require("./dialog-latest-state");
51
52
  const evt_registry_1 = require("./evt-registry");
52
53
  const log_1 = require("./log");
53
54
  const persistence_1 = require("./persistence");
@@ -90,58 +91,23 @@ function isDialogLatestResumable(latest) {
90
91
  function isSameDisplayState(left, right) {
91
92
  return JSON.stringify(left) === JSON.stringify(right);
92
93
  }
93
- function isSideDialogResponseAnchor(record) {
94
- return record?.type === 'tellask_anchor_record' && record.anchorRole === 'response';
95
- }
96
94
  function isNonIdleDisplayProjection(state) {
97
95
  return state !== undefined && state.kind !== 'idle_waiting_user';
98
96
  }
99
- function pendingReplyObligationDisplayState() {
100
- return {
101
- kind: 'stopped',
102
- reason: { kind: 'pending_reply_obligation' },
103
- continueEnabled: true,
104
- };
97
+ function hasPendingNextStepTriggers(latest) {
98
+ return (latest?.nextStep.triggers.length ?? 0) > 0;
105
99
  }
106
- function blockerDisplayState(args) {
107
- if (args.hasQ4H && args.hasSideDialogs) {
108
- return { kind: 'blocked', reason: { kind: 'needs_human_input_and_sideDialogs' } };
109
- }
110
- if (args.hasQ4H) {
100
+ function q4hSuspensionDisplayState(hasQ4H) {
101
+ if (hasQ4H) {
111
102
  return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
112
103
  }
113
- if (args.hasSideDialogs) {
114
- return { kind: 'blocked', reason: { kind: 'waiting_for_sideDialogs' } };
115
- }
116
104
  return undefined;
117
105
  }
118
- async function hasSideDialogFinalResponseAnchor(dialogId, latest) {
119
- if (dialogId.selfId === dialogId.rootId) {
120
- return undefined;
121
- }
122
- const rawCourse = latest.currentCourse;
123
- const currentCourse = Number.isFinite(rawCourse) && rawCourse > 0 ? Math.floor(rawCourse) : 1;
124
- const courseEvents = await persistence_1.DialogPersistence.loadCourseEvents(dialogId, currentCourse, 'running');
125
- for (let index = courseEvents.length - 1; index >= 0; index -= 1) {
126
- const event = courseEvents[index];
127
- if (event.type === 'tellask_anchor_record') {
128
- return isSideDialogResponseAnchor(event) ? { callId: event.callId } : undefined;
129
- }
130
- }
131
- return undefined;
132
- }
133
- async function hasActiveSideDialogReplyObligation(dialogId) {
134
- if (dialogId.selfId === dialogId.rootId) {
135
- return false;
136
- }
137
- const activeObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
138
- return activeObligation !== undefined;
139
- }
140
106
  async function resolveSideDialogFinalResponseClosure(args) {
141
107
  if (!args.latest) {
142
108
  return { kind: 'no_final_response' };
143
109
  }
144
- const finalResponseAnchor = await hasSideDialogFinalResponseAnchor(args.dialogId, args.latest);
110
+ const finalResponseAnchor = args.latest.sideDialogFinalResponse;
145
111
  if (!finalResponseAnchor) {
146
112
  return { kind: 'no_final_response' };
147
113
  }
@@ -165,37 +131,6 @@ async function resolveSideDialogFinalResponseClosure(args) {
165
131
  activeReplyObligation,
166
132
  };
167
133
  }
168
- async function coerceIdleDisplayStateForActiveSideDialogReplyObligation(dialogId, displayState) {
169
- if (displayState.kind !== 'idle_waiting_user') {
170
- return displayState;
171
- }
172
- if (!(await hasActiveSideDialogReplyObligation(dialogId))) {
173
- return displayState;
174
- }
175
- const latest = await persistence_1.DialogPersistence.loadDialogLatest(dialogId, 'running');
176
- const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
177
- if (finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
178
- await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(dialogId, undefined, 'running');
179
- return displayState;
180
- }
181
- if (finalResponseClosure.kind === 'closed_without_active_reply_obligation') {
182
- return displayState;
183
- }
184
- const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
185
- const pendingSideDialogs = await persistence_1.DialogPersistence.loadPendingSideDialogs(dialogId, 'running');
186
- const blocked = blockerDisplayState({
187
- hasQ4H: q4h.length > 0,
188
- hasSideDialogs: pendingSideDialogs.length > 0,
189
- });
190
- const healedDisplayState = blocked ?? pendingReplyObligationDisplayState();
191
- log.warn('Prevented sideDialog with active reply obligation from entering idle display state', new Error('sideDialog idle display-state invariant violation'), {
192
- dialogId: dialogId.valueOf(),
193
- rootId: dialogId.rootId,
194
- selfId: dialogId.selfId,
195
- healedDisplayState,
196
- });
197
- return healedDisplayState;
198
- }
199
134
  function classifyRunControlBucket(state) {
200
135
  if (!state)
201
136
  return 'none';
@@ -246,17 +181,15 @@ async function getRunControlCountsSnapshot() {
246
181
  else if (latest?.executionMarker?.kind === 'interrupted' &&
247
182
  isStoppedReasonResumable(latest.executionMarker.reason)) {
248
183
  // Keep run-control counts aligned with actual Continue affordance:
249
- // - ordinary interrupted dialogs count as resumable only when no blocker remains
250
- // - interjection-paused dialogs still count as resumable even if blocker facts remain,
184
+ // - ordinary interrupted dialogs count as resumable only when no Q4H suspension remains
185
+ // - interjection-paused dialogs still count as resumable even if Q4H remains,
251
186
  // because the intended UX is that Continue exits the temporary paused projection
252
187
  // and re-evaluates the original task from fresh facts
253
188
  if ((0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
254
189
  resumable++;
255
190
  }
256
191
  else {
257
- const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
258
- const pendingSideDialogs = await persistence_1.DialogPersistence.loadPendingSideDialogs(dialogId, 'running');
259
- if (q4h.length === 0 && pendingSideDialogs.length === 0) {
192
+ if (latest.userWait?.kind !== 'awaiting_user_answer') {
260
193
  resumable++;
261
194
  }
262
195
  }
@@ -430,7 +363,6 @@ async function clearDialogInterruptedExecutionMarker(dialogId) {
430
363
  await setDialogExecutionMarker(dialogId, undefined);
431
364
  }
432
365
  async function setDialogDisplayState(dialogId, displayState) {
433
- displayState = await coerceIdleDisplayStateForActiveSideDialogReplyObligation(dialogId, displayState);
434
366
  if (displayState.kind === 'dead' && dialogId.selfId === dialogId.rootId) {
435
367
  log.warn('Rejecting dead displayState for main dialog (main dialogs must not be dead)', undefined, {
436
368
  dialogId: dialogId.valueOf(),
@@ -535,18 +467,16 @@ async function computeIdleDisplayState(dlg) {
535
467
  continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
536
468
  };
537
469
  }
538
- if (latest?.pendingCourseStartPrompt) {
470
+ if (latest?.pendingRuntimePrompt) {
539
471
  return {
540
472
  kind: 'stopped',
541
- reason: { kind: 'pending_course_start' },
473
+ reason: { kind: 'pending_runtime_prompt' },
542
474
  continueEnabled: true,
543
475
  };
544
476
  }
545
- const hasQ4H = await dlg.hasPendingQ4H();
546
- const hasSideDialogs = await dlg.hasPendingSideDialogs();
547
- const blocked = blockerDisplayState({ hasQ4H, hasSideDialogs });
548
- if (blocked) {
549
- return blocked;
477
+ const q4hSuspension = q4hSuspensionDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
478
+ if (q4hSuspension) {
479
+ return q4hSuspension;
550
480
  }
551
481
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({
552
482
  dialogId: dlg.id,
@@ -556,9 +486,6 @@ async function computeIdleDisplayState(dlg) {
556
486
  finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
557
487
  return { kind: 'idle_waiting_user' };
558
488
  }
559
- if (await hasActiveSideDialogReplyObligation(dlg.id)) {
560
- return pendingReplyObligationDisplayState();
561
- }
562
489
  return { kind: 'idle_waiting_user' };
563
490
  }
564
491
  async function computeIdleDisplayStateFromPersistence(dialogId) {
@@ -581,34 +508,27 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
581
508
  continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
582
509
  };
583
510
  }
584
- if (latest?.pendingCourseStartPrompt) {
511
+ if (latest?.pendingRuntimePrompt) {
585
512
  return {
586
513
  kind: 'stopped',
587
- reason: { kind: 'pending_course_start' },
514
+ reason: { kind: 'pending_runtime_prompt' },
588
515
  continueEnabled: true,
589
516
  };
590
517
  }
591
- const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
592
- const pendingSideDialogs = await persistence_1.DialogPersistence.loadPendingSideDialogs(dialogId, 'running');
593
- const hasQ4H = q4h.length > 0;
594
- const hasSideDialogs = pendingSideDialogs.length > 0;
595
- const blocked = blockerDisplayState({ hasQ4H, hasSideDialogs });
596
- if (blocked) {
597
- return blocked;
518
+ const q4hSuspension = q4hSuspensionDisplayState(latest?.userWait?.kind === 'awaiting_user_answer');
519
+ if (q4hSuspension) {
520
+ return q4hSuspension;
598
521
  }
599
522
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
600
523
  if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
601
524
  finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
602
525
  return { kind: 'idle_waiting_user' };
603
526
  }
604
- if (await hasActiveSideDialogReplyObligation(dialogId)) {
605
- return pendingReplyObligationDisplayState();
606
- }
607
527
  return { kind: 'idle_waiting_user' };
608
528
  }
609
529
  async function healStaleSideDialogRunControlAfterFinalResponse(args) {
610
530
  if (args.dialogId.selfId === args.dialogId.rootId ||
611
- (args.latest.needsDrive !== true &&
531
+ (!hasPendingNextStepTriggers(args.latest) &&
612
532
  args.latest.generating !== true &&
613
533
  args.latest.executionMarker?.kind !== 'interrupted' &&
614
534
  !isNonIdleDisplayProjection(args.latest.displayState))) {
@@ -617,7 +537,7 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
617
537
  if (args.latest.executionMarker?.kind === 'dead') {
618
538
  return args.latest;
619
539
  }
620
- if (args.latest.pendingCourseStartPrompt) {
540
+ if (args.latest.pendingRuntimePrompt) {
621
541
  return args.latest;
622
542
  }
623
543
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({
@@ -645,7 +565,7 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
645
565
  responseCallId: finalResponseClosure.callId,
646
566
  clearedReplyObligation,
647
567
  previousGenerating: args.latest.generating ?? null,
648
- previousNeedsDrive: args.latest.needsDrive ?? null,
568
+ previousNextStepTriggerCount: args.latest.nextStep.triggers.length,
649
569
  previousDisplayState: args.latest.displayState ?? null,
650
570
  previousExecutionMarker: args.latest.executionMarker ?? null,
651
571
  });
@@ -653,7 +573,7 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
653
573
  kind: 'patch',
654
574
  patch: {
655
575
  generating: false,
656
- needsDrive: false,
576
+ nextStep: (0, dialog_latest_state_1.createEmptyDialogNextStepState)(),
657
577
  displayState: { kind: 'idle_waiting_user' },
658
578
  executionMarker: undefined,
659
579
  },
@@ -690,16 +610,15 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
690
610
  (0, interjection_pause_stop_1.isUserInterjectionPauseStopReason)(latest.executionMarker.reason)) {
691
611
  // WARNING:
692
612
  // This is the one place where the projection intentionally preserves the paused-interjection
693
- // stopped state ahead of the current blocker facts. That is not a bug: after a user
613
+ // stopped state ahead of the current suspension facts. That is not a bug: after a user
694
614
  // interjection we want the UI to keep showing "original task paused; click Continue" even if
695
- // the underlying dialog is still waiting on Q4H/sideDialogs.
615
+ // the underlying dialog is still waiting on Q4H.
696
616
  //
697
- // The true source-of-truth decision about what Continue should do next lives in
698
- // `flow.ts`'s resume path, which performs a fresh fact scan at resume time and then either:
699
- // - restores `blocked`, or
700
- // - keeps driving immediately.
617
+ // The true source-of-truth decision about what Continue should do next lives in `flow.ts`'s
618
+ // resume path, which performs a fresh fact scan at resume time and then either restores the
619
+ // Q4H suspension projection or keeps driving immediately.
701
620
  //
702
- // Do not "heal" this branch away by prioritizing blocker facts here; that would collapse the
621
+ // Do not "heal" this branch away by prioritizing suspension facts here; that would collapse the
703
622
  // temporary interjection UX and make repeated interjection turns revert too early.
704
623
  return {
705
624
  kind: 'stopped',
@@ -707,29 +626,22 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
707
626
  continueEnabled: isStoppedReasonResumable(latest.executionMarker.reason),
708
627
  };
709
628
  }
710
- if (latest.pendingCourseStartPrompt) {
629
+ if (latest.pendingRuntimePrompt) {
711
630
  return {
712
631
  kind: 'stopped',
713
- reason: { kind: 'pending_course_start' },
632
+ reason: { kind: 'pending_runtime_prompt' },
714
633
  continueEnabled: true,
715
634
  };
716
635
  }
717
- const q4h = await persistence_1.DialogPersistence.loadQuestions4HumanState(dialogId, 'running');
718
- const pendingSideDialogs = await persistence_1.DialogPersistence.loadPendingSideDialogs(dialogId, 'running');
719
- const hasQ4H = q4h.length > 0;
720
- const hasSideDialogs = pendingSideDialogs.length > 0;
721
- const blocked = blockerDisplayState({ hasQ4H, hasSideDialogs });
722
- if (blocked) {
723
- return blocked;
636
+ const q4hSuspension = q4hSuspensionDisplayState(latest.userWait?.kind === 'awaiting_user_answer');
637
+ if (q4hSuspension) {
638
+ return q4hSuspension;
724
639
  }
725
640
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
726
641
  if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
727
642
  finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
728
643
  return { kind: 'idle_waiting_user' };
729
644
  }
730
- if (await hasActiveSideDialogReplyObligation(dialogId)) {
731
- return pendingReplyObligationDisplayState();
732
- }
733
645
  if (latest.executionMarker?.kind === 'interrupted' &&
734
646
  latest.executionMarker.reason.kind !== 'pending_reply_obligation') {
735
647
  return {
@@ -775,21 +687,6 @@ async function computeIdleDisplayStateForReconciliation(dialogId) {
775
687
  return null;
776
688
  }
777
689
  }
778
- function isRecoverableGeneratingLatest(latest) {
779
- if (latest?.generating !== true) {
780
- return false;
781
- }
782
- const marker = latest.executionMarker;
783
- if (!marker) {
784
- return true;
785
- }
786
- if (marker.kind === 'dead') {
787
- return false;
788
- }
789
- return (marker.kind !== 'interrupted' ||
790
- marker.reason.kind === 'pending_course_start' ||
791
- marker.reason.kind === 'pending_reply_obligation');
792
- }
793
690
  async function reconcileDisplayStatesAfterRestart() {
794
691
  const dialogIds = await persistence_1.DialogPersistence.listAllDialogIds('running');
795
692
  for (const dialogId of dialogIds) {
@@ -832,9 +729,13 @@ async function reconcileDisplayStatesAfterRestart() {
832
729
  }
833
730
  continue;
834
731
  }
732
+ if (latest.generating === true && latest.generationRunState === undefined) {
733
+ await persistence_1.DialogPersistence.quarantineMalformedRuntimeState(dialogId, 'running', 'restart_reconciliation_missing_generation_run_state', `Restart reconciliation refused to recover generating dialog without generationRunState (rootId=${dialogId.rootId}, selfId=${dialogId.selfId})`);
734
+ continue;
735
+ }
835
736
  if (dialogId.selfId !== dialogId.rootId &&
836
737
  (latest.generating === true ||
837
- latest.needsDrive === true ||
738
+ hasPendingNextStepTriggers(latest) ||
838
739
  latest.executionMarker?.kind === 'interrupted' ||
839
740
  isNonIdleDisplayProjection(latest.displayState))) {
840
741
  const healedStaleSideDialogRunControl = await healStaleSideDialogRunControlAfterFinalResponse({
@@ -846,19 +747,26 @@ async function reconcileDisplayStatesAfterRestart() {
846
747
  continue;
847
748
  }
848
749
  latest = healedStaleSideDialogRunControl;
849
- if (latest.generating !== true && latest.needsDrive !== true) {
750
+ if (latest.generating !== true && !hasPendingNextStepTriggers(latest)) {
850
751
  continue;
851
752
  }
852
753
  }
853
- if (isRecoverableGeneratingLatest(latest)) {
754
+ const recoverableGenerationRunState = (0, dialog_generation_run_1.getRecoverableGenerationRunState)(latest);
755
+ if (recoverableGenerationRunState !== undefined) {
854
756
  try {
757
+ await persistence_1.DialogPersistence.upsertNextStepTrigger(dialogId, {
758
+ triggerId: `open-generation-recovery:${dialogId.selfId}:${recoverableGenerationRunState.course}:${recoverableGenerationRunState.genseq}`,
759
+ kind: 'open_generation_recovery',
760
+ course: recoverableGenerationRunState.course,
761
+ genseq: recoverableGenerationRunState.genseq,
762
+ createdAt: recoverableGenerationRunState.openedAt,
763
+ }, 'running');
855
764
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
856
765
  kind: 'patch',
857
766
  patch: {
858
- needsDrive: true,
859
767
  displayState: { kind: 'proceeding' },
860
768
  executionMarker: existingMarker?.kind === 'interrupted' &&
861
- (existingMarker.reason.kind === 'pending_course_start' ||
769
+ (existingMarker.reason.kind === 'pending_runtime_prompt' ||
862
770
  existingMarker.reason.kind === 'pending_reply_obligation')
863
771
  ? undefined
864
772
  : existingMarker,
@@ -872,7 +780,7 @@ async function reconcileDisplayStatesAfterRestart() {
872
780
  }
873
781
  continue;
874
782
  }
875
- if (latest.generating === true || latest.needsDrive === true) {
783
+ if (latest.generating === true || hasPendingNextStepTriggers(latest)) {
876
784
  const nextIdle = await computeIdleDisplayStateForReconciliation(dialogId);
877
785
  if (!nextIdle) {
878
786
  continue;
@@ -0,0 +1,3 @@
1
+ import type { DialogLatestFile } from '@longrun-ai/kernel/types/storage';
2
+ export type DialogLatestSnapshot = DialogLatestFile | null;
3
+ export declare function hasDurableDriveWork(latest: DialogLatestSnapshot): boolean;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasDurableDriveWork = hasDurableDriveWork;
4
+ const dialog_generation_run_1 = require("./dialog-generation-run");
5
+ function hasResultArrivalTrigger(latest) {
6
+ return latest.nextStep.triggers.some((trigger) => trigger.kind === 'result_arrival');
7
+ }
8
+ function hasDurableDriveWork(latest) {
9
+ if (!latest) {
10
+ return false;
11
+ }
12
+ const replyDelivery = latest.replyDelivery;
13
+ if (replyDelivery &&
14
+ (replyDelivery.status === 'pending' || replyDelivery.toolResultStatus === 'pending')) {
15
+ return true;
16
+ }
17
+ if (latest.sideDialogFinalResponse !== undefined) {
18
+ return hasResultArrivalTrigger(latest);
19
+ }
20
+ return (latest.nextStep.triggers.length > 0 || (0, dialog_generation_run_1.getRecoverableGenerationRunState)(latest) !== undefined);
21
+ }
@@ -5,7 +5,6 @@ type ForkDialogAction = Readonly<{
5
5
  }> | Readonly<{
6
6
  kind: 'restore_pending';
7
7
  pendingQ4H: boolean;
8
- pendingSideDialogs: boolean;
9
8
  }> | Readonly<{
10
9
  kind: 'auto_continue';
11
10
  }>;
@@ -9,6 +9,7 @@ const node_path_1 = __importDefault(require("node:path"));
9
9
  const storage_1 = require("@longrun-ai/kernel/types/storage");
10
10
  const time_1 = require("@longrun-ai/kernel/utils/time");
11
11
  const dialog_1 = require("./dialog");
12
+ const dialog_latest_state_1 = require("./dialog-latest-state");
12
13
  const persistence_1 = require("./persistence");
13
14
  const tool_1 = require("./tool");
14
15
  const id_1 = require("./utils/id");
@@ -49,8 +50,8 @@ function cloneQuestions(questions) {
49
50
  callSiteRef: { ...question.callSiteRef },
50
51
  }));
51
52
  }
52
- function clonePendingSideDialogs(pendingSideDialogs) {
53
- return pendingSideDialogs.map((entry) => ({
53
+ function cloneActiveCalleeDispatches(activeCalleeDispatches) {
54
+ return activeCalleeDispatches.map((entry) => ({
54
55
  ...entry,
55
56
  mentionList: entry.mentionList ? [...entry.mentionList] : undefined,
56
57
  }));
@@ -111,7 +112,7 @@ function isForkStateRecord(record) {
111
112
  case 'sideDialog_created_record':
112
113
  case 'reminders_reconciled_record':
113
114
  case 'questions4human_reconciled_record':
114
- case 'pending_sideDialogs_reconciled_record':
115
+ case 'active_callees_reconciled_record':
115
116
  case 'sideDialog_registry_reconciled_record':
116
117
  case 'sideDialog_responses_reconciled_record':
117
118
  return record;
@@ -147,7 +148,7 @@ function isPersistedMessageRecord(record) {
147
148
  case 'sideDialog_created_record':
148
149
  case 'reminders_reconciled_record':
149
150
  case 'questions4human_reconciled_record':
150
- case 'pending_sideDialogs_reconciled_record':
151
+ case 'active_callees_reconciled_record':
151
152
  case 'sideDialog_registry_reconciled_record':
152
153
  case 'sideDialog_responses_reconciled_record':
153
154
  return false;
@@ -242,7 +243,7 @@ function rewriteRecordForFork(record, newRootId) {
242
243
  case 'sideDialog_created_record':
243
244
  case 'reminders_reconciled_record':
244
245
  case 'questions4human_reconciled_record':
245
- case 'pending_sideDialogs_reconciled_record':
246
+ case 'active_callees_reconciled_record':
246
247
  case 'sideDialog_registry_reconciled_record':
247
248
  case 'sideDialog_responses_reconciled_record':
248
249
  throw new Error(`Fork transcript copy must not include state record ${record.type}`);
@@ -275,16 +276,9 @@ function computeRootForkDisplayState(args) {
275
276
  return { kind: 'idle_waiting_user' };
276
277
  }
277
278
  const hasQ4H = args.questions.length > 0;
278
- const hasSideDialogs = args.pendingSideDialogs.length > 0;
279
- if (hasQ4H && hasSideDialogs) {
280
- return { kind: 'blocked', reason: { kind: 'needs_human_input_and_sideDialogs' } };
281
- }
282
279
  if (hasQ4H) {
283
280
  return { kind: 'blocked', reason: { kind: 'needs_human_input' } };
284
281
  }
285
- if (hasSideDialogs) {
286
- return { kind: 'blocked', reason: { kind: 'waiting_for_sideDialogs' } };
287
- }
288
282
  return { kind: 'stopped', reason: { kind: 'fork_continue_ready' }, continueEnabled: true };
289
283
  }
290
284
  async function copyArtifactsIfPresent(sourceId, targetId, sourceStatus) {
@@ -329,7 +323,7 @@ async function collectForkSnapshot(dialogId, status, cutoffAnchor) {
329
323
  const courseNumbers = await listDialogCourseNumbers(dialogId, status);
330
324
  let latestReminders = null;
331
325
  let latestQuestions = null;
332
- let latestPending = null;
326
+ let latestActiveCalleeDispatches = null;
333
327
  let latestRegistry = null;
334
328
  let latestResponses = null;
335
329
  for (const course of courseNumbers) {
@@ -347,8 +341,8 @@ async function collectForkSnapshot(dialogId, status, cutoffAnchor) {
347
341
  case 'questions4human_reconciled_record':
348
342
  latestQuestions = cloneQuestions(stateRecord.questions);
349
343
  break;
350
- case 'pending_sideDialogs_reconciled_record':
351
- latestPending = clonePendingSideDialogs(stateRecord.pendingSideDialogs);
344
+ case 'active_callees_reconciled_record':
345
+ latestActiveCalleeDispatches = cloneActiveCalleeDispatches(stateRecord.activeCalleeDispatches);
352
346
  break;
353
347
  case 'sideDialog_registry_reconciled_record':
354
348
  latestRegistry = cloneRegistryEntries(stateRecord.entries);
@@ -368,7 +362,7 @@ async function collectForkSnapshot(dialogId, status, cutoffAnchor) {
368
362
  return {
369
363
  reminders: latestReminders !== null ? latestReminders.map((item) => cloneReminderSnapshot(item)) : [],
370
364
  questions: latestQuestions ?? [],
371
- pendingSideDialogs: latestPending ?? [],
365
+ activeCalleeDispatches: latestActiveCalleeDispatches ?? [],
372
366
  registryEntries: latestRegistry ?? [],
373
367
  sideDialogResponses: latestResponses ?? [],
374
368
  };
@@ -378,15 +372,15 @@ async function collectIncludedSideDialogs(args) {
378
372
  const scannedDialogSelfIds = new Set();
379
373
  const included = new Map();
380
374
  while (queue.length > 0) {
381
- const ownerDialogId = queue.shift();
382
- if (!ownerDialogId)
375
+ const sourceDialogId = queue.shift();
376
+ if (!sourceDialogId)
383
377
  break;
384
- if (scannedDialogSelfIds.has(ownerDialogId.selfId))
378
+ if (scannedDialogSelfIds.has(sourceDialogId.selfId))
385
379
  continue;
386
- scannedDialogSelfIds.add(ownerDialogId.selfId);
387
- const courseNumbers = await listDialogCourseNumbers(ownerDialogId, args.sourceStatus);
380
+ scannedDialogSelfIds.add(sourceDialogId.selfId);
381
+ const courseNumbers = await listDialogCourseNumbers(sourceDialogId, args.sourceStatus);
388
382
  for (const course of courseNumbers) {
389
- const events = await persistence_1.DialogPersistence.readCourseEvents(ownerDialogId, course, args.sourceStatus);
383
+ const events = await persistence_1.DialogPersistence.readCourseEvents(sourceDialogId, course, args.sourceStatus);
390
384
  for (const event of events) {
391
385
  if (event.type !== 'sideDialog_created_record')
392
386
  continue;
@@ -457,7 +451,7 @@ async function buildDialogForkPlan(args) {
457
451
  currentCourse: retainedCurrentCourse,
458
452
  reminders: snapshot.reminders,
459
453
  questions: snapshot.questions,
460
- pendingSideDialogs: snapshot.pendingSideDialogs,
454
+ activeCalleeDispatches: snapshot.activeCalleeDispatches,
461
455
  registryEntries: snapshot.registryEntries,
462
456
  sideDialogResponses: snapshot.sideDialogResponses,
463
457
  childCount: args.childCount,
@@ -489,11 +483,11 @@ async function appendForkBaselineState(plan, baselineSideDialogCreatedRecords) {
489
483
  ...FORK_BASELINE_ANCHOR,
490
484
  questions: cloneQuestions(plan.questions),
491
485
  };
492
- const pendingRecord = {
486
+ const activeCalleesRecord = {
493
487
  ts: baselineTs,
494
- type: 'pending_sideDialogs_reconciled_record',
488
+ type: 'active_callees_reconciled_record',
495
489
  ...FORK_BASELINE_ANCHOR,
496
- pendingSideDialogs: clonePendingSideDialogs(plan.pendingSideDialogs),
490
+ activeCalleeDispatches: cloneActiveCalleeDispatches(plan.activeCalleeDispatches),
497
491
  };
498
492
  const registryRecord = {
499
493
  ts: baselineTs,
@@ -509,7 +503,7 @@ async function appendForkBaselineState(plan, baselineSideDialogCreatedRecords) {
509
503
  };
510
504
  await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, remindersRecord, 'running');
511
505
  await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, q4hRecord, 'running');
512
- await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, pendingRecord, 'running');
506
+ await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, activeCalleesRecord, 'running');
513
507
  await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, registryRecord, 'running');
514
508
  await persistence_1.DialogPersistence.appendEvent(plan.targetId, 1, responsesRecord, 'running');
515
509
  }
@@ -549,7 +543,9 @@ async function persistForkPlan(args) {
549
543
  await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
550
544
  await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
551
545
  await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
552
- await persistence_1.DialogPersistence.savePendingSideDialogs(plan.targetId, [...plan.pendingSideDialogs], undefined, 'running');
546
+ for (const record of plan.activeCalleeDispatches) {
547
+ await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
548
+ }
553
549
  await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
554
550
  key: entry.key,
555
551
  sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
@@ -563,7 +559,6 @@ async function persistForkPlan(args) {
563
559
  ? computeRootForkDisplayState({
564
560
  action: args.action,
565
561
  questions: plan.questions,
566
- pendingSideDialogs: plan.pendingSideDialogs,
567
562
  })
568
563
  : { kind: 'idle_waiting_user' };
569
564
  await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, () => ({
@@ -576,7 +571,9 @@ async function persistForkPlan(args) {
576
571
  functionCallCount: countFunctionCalls(currentCourseEvents),
577
572
  sideDialogCount: plan.childCount,
578
573
  generating: false,
579
- needsDrive: false,
574
+ nextStep: (0, dialog_latest_state_1.createEmptyDialogNextStepState)(),
575
+ tellaskCalls: (0, dialog_latest_state_1.createEmptyDialogTellaskCallState)(),
576
+ tellaskResults: (0, dialog_latest_state_1.createEmptyDialogTellaskResultState)(),
580
577
  displayState,
581
578
  disableDiligencePush: plan.targetId.selfId === plan.targetId.rootId ? args.latestDisableDiligencePush : false,
582
579
  diligencePushRemainingBudget: plan.targetId.selfId === plan.targetId.rootId
@@ -642,11 +639,10 @@ async function forkMainDialogTreeAtGeneration(args) {
642
639
  });
643
640
  const action = draftUserText !== null
644
641
  ? { kind: 'draft_user_text', userText: draftUserText }
645
- : rootPlan.questions.length > 0 || rootPlan.pendingSideDialogs.length > 0
642
+ : rootPlan.questions.length > 0
646
643
  ? {
647
644
  kind: 'restore_pending',
648
645
  pendingQ4H: rootPlan.questions.length > 0,
649
- pendingSideDialogs: rootPlan.pendingSideDialogs.length > 0,
650
646
  }
651
647
  : { kind: 'auto_continue' };
652
648
  const sideDialogPlans = [];
@@ -0,0 +1,4 @@
1
+ import type { DialogGenerationRunState, DialogLatestFile } from '@longrun-ai/kernel/types/storage';
2
+ export declare function getRecoverableGenerationRunState(latest: DialogLatestFile | null | undefined): Extract<DialogGenerationRunState, {
3
+ kind: 'open';
4
+ }> | undefined;