dominds 1.25.6 → 1.25.7

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 (156) hide show
  1. package/dist/dialog-display-state.js +99 -29
  2. package/dist/dialog-fork.js +53 -20
  3. package/dist/llm/kernel-driver/drive.js +253 -4
  4. package/dist/llm/kernel-driver/flow.js +13 -15
  5. package/dist/llm/kernel-driver/sideDialog.js +13 -0
  6. package/dist/persistence.js +18 -17
  7. package/dist/server/dominds-self-update.js +312 -22
  8. package/dist/server/websocket-handler.js +41 -4
  9. package/dist/tools/os.d.ts +1 -0
  10. package/dist/tools/os.js +19 -1
  11. package/package.json +3 -3
  12. package/webapp/dist/assets/{_basePickBy-fZ31r-iF.js → _basePickBy-Y5Q2L95x.js} +3 -3
  13. package/webapp/dist/assets/_basePickBy-Y5Q2L95x.js.map +1 -0
  14. package/webapp/dist/assets/{_baseUniq-CI1keLoL.js → _baseUniq-Cj3ro8Ri.js} +2 -2
  15. package/webapp/dist/assets/_baseUniq-Cj3ro8Ri.js.map +1 -0
  16. package/webapp/dist/assets/{arc-1NeUqzoV.js → arc-Bz9VfJlg.js} +2 -2
  17. package/webapp/dist/assets/arc-Bz9VfJlg.js.map +1 -0
  18. package/webapp/dist/assets/{architectureDiagram-2XIMDMQ5-C7SdzYIh.js → architectureDiagram-VXUJARFQ-Ce6_zDEY.js} +8 -26
  19. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-Ce6_zDEY.js.map +1 -0
  20. package/webapp/dist/assets/{blockDiagram-WCTKOSBZ-Cmpu3kIy.js → blockDiagram-VD42YOAC-DIEKjBVU.js} +170 -187
  21. package/webapp/dist/assets/blockDiagram-VD42YOAC-DIEKjBVU.js.map +1 -0
  22. package/webapp/dist/assets/{c4Diagram-IC4MRINW-ChGTHIor.js → c4Diagram-YG6GDRKO-CQpAPdOt.js} +4 -4
  23. package/webapp/dist/assets/c4Diagram-YG6GDRKO-CQpAPdOt.js.map +1 -0
  24. package/webapp/dist/assets/{channel-ndS-XTQQ.js → channel-C_7bziVU.js} +2 -2
  25. package/webapp/dist/assets/channel-C_7bziVU.js.map +1 -0
  26. package/webapp/dist/assets/{chunk-4BX2VUAB-Cw5FtBd_.js → chunk-4BX2VUAB-CI07YP8x.js} +2 -2
  27. package/webapp/dist/assets/chunk-4BX2VUAB-CI07YP8x.js.map +1 -0
  28. package/webapp/dist/assets/{chunk-55IACEB6-D3G71JdA.js → chunk-55IACEB6-CH-ZnQdW.js} +2 -2
  29. package/webapp/dist/assets/chunk-55IACEB6-CH-ZnQdW.js.map +1 -0
  30. package/webapp/dist/assets/{chunk-WL4C6EOR-CIwdSg5q.js → chunk-B4BG7PRW-B8XZmRWD.js} +121 -171
  31. package/webapp/dist/assets/chunk-B4BG7PRW-B8XZmRWD.js.map +1 -0
  32. package/webapp/dist/assets/{chunk-NQ4KR5QH-CGEMYTch.js → chunk-DI55MBZ5-BTJEMG8W.js} +7 -9
  33. package/webapp/dist/assets/chunk-DI55MBZ5-BTJEMG8W.js.map +1 -0
  34. package/webapp/dist/assets/{chunk-FMBD7UC4-BcugPyy7.js → chunk-FMBD7UC4-u7Ho3qNZ.js} +2 -2
  35. package/webapp/dist/assets/chunk-FMBD7UC4-u7Ho3qNZ.js.map +1 -0
  36. package/webapp/dist/assets/{chunk-KX2RTZJC-BQ42xd4s.js → chunk-QN33PNHL-C-7kvetv.js} +2 -2
  37. package/webapp/dist/assets/chunk-QN33PNHL-C-7kvetv.js.map +1 -0
  38. package/webapp/dist/assets/{chunk-QZHKN3VN-CxNTVm5w.js → chunk-QZHKN3VN-Cutz7csQ.js} +2 -2
  39. package/webapp/dist/assets/chunk-QZHKN3VN-Cutz7csQ.js.map +1 -0
  40. package/webapp/dist/assets/{chunk-JSJVCQXG-DvuxYuNq.js → chunk-TZMSLE5B-b_LZteUW.js} +6 -14
  41. package/webapp/dist/assets/chunk-TZMSLE5B-b_LZteUW.js.map +1 -0
  42. package/webapp/dist/assets/{classDiagram-VBA2DB6C-Dl05PJAP.js → classDiagram-2ON5EDUG-CCGe8-bu.js} +6 -7
  43. package/webapp/dist/assets/classDiagram-2ON5EDUG-CCGe8-bu.js.map +1 -0
  44. package/webapp/dist/assets/{classDiagram-v2-RAHNMMFH-Dl05PJAP.js → classDiagram-v2-WZHVMYZB-CCGe8-bu.js} +6 -7
  45. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-CCGe8-bu.js.map +1 -0
  46. package/webapp/dist/assets/{clone-KCj1-QMr.js → clone-CEpSMVek.js} +2 -2
  47. package/webapp/dist/assets/clone-CEpSMVek.js.map +1 -0
  48. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-BttciCz5.js → cose-bilkent-S5V4N54A-JEt2Ncxk.js} +2 -2
  49. package/webapp/dist/assets/cose-bilkent-S5V4N54A-JEt2Ncxk.js.map +1 -0
  50. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  51. package/webapp/dist/assets/{dagre-KLK3FWXG-Dm5yE9k2.js → dagre-6UL2VRFP-dy6U1rpE.js} +7 -7
  52. package/webapp/dist/assets/dagre-6UL2VRFP-dy6U1rpE.js.map +1 -0
  53. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  54. package/webapp/dist/assets/{diagram-E7M64L7V-C80ZsiBG.js → diagram-PSM6KHXK-u1RaCst_.js} +10 -10
  55. package/webapp/dist/assets/diagram-PSM6KHXK-u1RaCst_.js.map +1 -0
  56. package/webapp/dist/assets/{diagram-IFDJBPK2-CqKidH4n.js → diagram-QEK2KX5R-Bm297BXQ.js} +8 -9
  57. package/webapp/dist/assets/diagram-QEK2KX5R-Bm297BXQ.js.map +1 -0
  58. package/webapp/dist/assets/{diagram-P4PSJMXO-EHVjfzUV.js → diagram-S2PKOQOG-B9Z57WnU.js} +8 -8
  59. package/webapp/dist/assets/diagram-S2PKOQOG-B9Z57WnU.js.map +1 -0
  60. package/webapp/dist/assets/{erDiagram-INFDFZHY-7MrtsOIt.js → erDiagram-Q2GNP2WA-CyXAp9Ik.js} +75 -96
  61. package/webapp/dist/assets/erDiagram-Q2GNP2WA-CyXAp9Ik.js.map +1 -0
  62. package/webapp/dist/assets/{flowDiagram-PKNHOUZH-D6hXqCy7.js → flowDiagram-NV44I4VS-ONR9JQsN.js} +81 -98
  63. package/webapp/dist/assets/flowDiagram-NV44I4VS-ONR9JQsN.js.map +1 -0
  64. package/webapp/dist/assets/{ganttDiagram-A5KZAMGK-DLO0XCDk.js → ganttDiagram-JELNMOA3-Coi5jLKz.js} +3 -28
  65. package/webapp/dist/assets/ganttDiagram-JELNMOA3-Coi5jLKz.js.map +1 -0
  66. package/webapp/dist/assets/{gitGraphDiagram-K3NZZRJ6-BmVD_nQP.js → gitGraphDiagram-V2S2FVAM-BoLPKg9P.js} +46 -38
  67. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-BoLPKg9P.js.map +1 -0
  68. package/webapp/dist/assets/graph-DLwD58eC.js +425 -0
  69. package/webapp/dist/assets/graph-DLwD58eC.js.map +1 -0
  70. package/webapp/dist/assets/{index-BXjq-k48.js → index-HwgQoWbn.js} +1118 -1041
  71. package/webapp/dist/assets/{index-BXjq-k48.js.map → index-HwgQoWbn.js.map} +1 -1
  72. package/webapp/dist/assets/{index-BQoNJEGT.css → index-yycTJNYb.css} +1 -1
  73. package/webapp/dist/assets/{infoDiagram-LFFYTUFH-D2fqM9Fn.js → infoDiagram-HS3SLOUP-BpEpEjG2.js} +7 -7
  74. package/webapp/dist/assets/infoDiagram-HS3SLOUP-BpEpEjG2.js.map +1 -0
  75. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  76. package/webapp/dist/assets/{journeyDiagram-4ABVD52K-DmbA52J-.js → journeyDiagram-XKPGCS4Q-C2HNBnMQ.js} +5 -5
  77. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-C2HNBnMQ.js.map +1 -0
  78. package/webapp/dist/assets/{kanban-definition-K7BYSVSG-DRUw-P-d.js → kanban-definition-3W4ZIXB7-DcELha9W.js} +3 -5
  79. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-DcELha9W.js.map +1 -0
  80. package/webapp/dist/assets/{layout-BUoHHXzn.js → layout-Cyg7MRlM.js} +5 -5
  81. package/webapp/dist/assets/layout-Cyg7MRlM.js.map +1 -0
  82. package/webapp/dist/assets/{linear-xVSAq8rI.js → linear-pOIWL8hY.js} +2 -2
  83. package/webapp/dist/assets/linear-pOIWL8hY.js.map +1 -0
  84. package/webapp/dist/assets/{mindmap-definition-YRQLILUH-BcajbGmW.js → mindmap-definition-VGOIOE7T-BTyvfLY3.js} +5 -7
  85. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BTyvfLY3.js.map +1 -0
  86. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  87. package/webapp/dist/assets/{pieDiagram-SKSYHLDU-Bu8kmCW6.js → pieDiagram-ADFJNKIX-D1CwcmEb.js} +8 -8
  88. package/webapp/dist/assets/pieDiagram-ADFJNKIX-D1CwcmEb.js.map +1 -0
  89. package/webapp/dist/assets/{quadrantDiagram-337W2JSQ-DIBSNUGa.js → quadrantDiagram-AYHSOK5B-DdlItwqV.js} +3 -3
  90. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-DdlItwqV.js.map +1 -0
  91. package/webapp/dist/assets/{requirementDiagram-Z7DCOOCP-CkrDkbBt.js → requirementDiagram-UZGBJVZJ-B6AntBtK.js} +6 -16
  92. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-B6AntBtK.js.map +1 -0
  93. package/webapp/dist/assets/{sankeyDiagram-WA2Y5GQK-BZ-1R8pc.js → sankeyDiagram-TZEHDZUN-Cb1skLgE.js} +2 -2
  94. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-Cb1skLgE.js.map +1 -0
  95. package/webapp/dist/assets/{sequenceDiagram-2WXFIKYE-DYoNARdO.js → sequenceDiagram-WL72ISMW-BXtnapRV.js} +201 -601
  96. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-BXtnapRV.js.map +1 -0
  97. package/webapp/dist/assets/{stateDiagram-RAJIS63D-D9v19nvh.js → stateDiagram-FKZM4ZOC-BEJSYJxc.js} +9 -9
  98. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-BEJSYJxc.js.map +1 -0
  99. package/webapp/dist/assets/{stateDiagram-v2-FVOUBMTO-BYw5ZwtH.js → stateDiagram-v2-4FDKWEC3-YlQ0hGcy.js} +5 -5
  100. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-YlQ0hGcy.js.map +1 -0
  101. package/webapp/dist/assets/{timeline-definition-YZTLITO2-BT10dRIJ.js → timeline-definition-IT6M3QCI-BHzyY6Ip.js} +3 -3
  102. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BHzyY6Ip.js.map +1 -0
  103. package/webapp/dist/assets/{treemap-KZPCXAKY-yPoPC5hc.js → treemap-GDKQZRPO-BMYh8Nea.js} +24 -37
  104. package/webapp/dist/assets/treemap-GDKQZRPO-BMYh8Nea.js.map +1 -0
  105. package/webapp/dist/assets/{xychartDiagram-JWTSCODW-BWLUzo9S.js → xychartDiagram-PRI3JC2R-C5vczZ0B.js} +4 -4
  106. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-C5vczZ0B.js.map +1 -0
  107. package/webapp/dist/index.html +2 -2
  108. package/webapp/dist/assets/_basePickBy-fZ31r-iF.js.map +0 -1
  109. package/webapp/dist/assets/_baseUniq-CI1keLoL.js.map +0 -1
  110. package/webapp/dist/assets/arc-1NeUqzoV.js.map +0 -1
  111. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-C7SdzYIh.js.map +0 -1
  112. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-Cmpu3kIy.js.map +0 -1
  113. package/webapp/dist/assets/c4Diagram-IC4MRINW-ChGTHIor.js.map +0 -1
  114. package/webapp/dist/assets/channel-ndS-XTQQ.js.map +0 -1
  115. package/webapp/dist/assets/chunk-4BX2VUAB-Cw5FtBd_.js.map +0 -1
  116. package/webapp/dist/assets/chunk-55IACEB6-D3G71JdA.js.map +0 -1
  117. package/webapp/dist/assets/chunk-FMBD7UC4-BcugPyy7.js.map +0 -1
  118. package/webapp/dist/assets/chunk-JSJVCQXG-DvuxYuNq.js.map +0 -1
  119. package/webapp/dist/assets/chunk-KX2RTZJC-BQ42xd4s.js.map +0 -1
  120. package/webapp/dist/assets/chunk-NQ4KR5QH-CGEMYTch.js.map +0 -1
  121. package/webapp/dist/assets/chunk-QZHKN3VN-CxNTVm5w.js.map +0 -1
  122. package/webapp/dist/assets/chunk-WL4C6EOR-CIwdSg5q.js.map +0 -1
  123. package/webapp/dist/assets/classDiagram-VBA2DB6C-Dl05PJAP.js.map +0 -1
  124. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-Dl05PJAP.js.map +0 -1
  125. package/webapp/dist/assets/clone-KCj1-QMr.js.map +0 -1
  126. package/webapp/dist/assets/cose-bilkent-S5V4N54A-BttciCz5.js.map +0 -1
  127. package/webapp/dist/assets/dagre-KLK3FWXG-Dm5yE9k2.js.map +0 -1
  128. package/webapp/dist/assets/diagram-E7M64L7V-C80ZsiBG.js.map +0 -1
  129. package/webapp/dist/assets/diagram-IFDJBPK2-CqKidH4n.js.map +0 -1
  130. package/webapp/dist/assets/diagram-P4PSJMXO-EHVjfzUV.js.map +0 -1
  131. package/webapp/dist/assets/erDiagram-INFDFZHY-7MrtsOIt.js.map +0 -1
  132. package/webapp/dist/assets/flowDiagram-PKNHOUZH-D6hXqCy7.js.map +0 -1
  133. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-DLO0XCDk.js.map +0 -1
  134. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-BmVD_nQP.js.map +0 -1
  135. package/webapp/dist/assets/graph-DQTj8O0Q.js +0 -782
  136. package/webapp/dist/assets/graph-DQTj8O0Q.js.map +0 -1
  137. package/webapp/dist/assets/infoDiagram-LFFYTUFH-D2fqM9Fn.js.map +0 -1
  138. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-kp7lB6-f.js +0 -966
  139. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-kp7lB6-f.js.map +0 -1
  140. package/webapp/dist/assets/journeyDiagram-4ABVD52K-DmbA52J-.js.map +0 -1
  141. package/webapp/dist/assets/kanban-definition-K7BYSVSG-DRUw-P-d.js.map +0 -1
  142. package/webapp/dist/assets/layout-BUoHHXzn.js.map +0 -1
  143. package/webapp/dist/assets/linear-xVSAq8rI.js.map +0 -1
  144. package/webapp/dist/assets/mindmap-definition-YRQLILUH-BcajbGmW.js.map +0 -1
  145. package/webapp/dist/assets/pieDiagram-SKSYHLDU-Bu8kmCW6.js.map +0 -1
  146. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-DIBSNUGa.js.map +0 -1
  147. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-CkrDkbBt.js.map +0 -1
  148. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-BZ-1R8pc.js.map +0 -1
  149. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-DYoNARdO.js.map +0 -1
  150. package/webapp/dist/assets/stateDiagram-RAJIS63D-D9v19nvh.js.map +0 -1
  151. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-BYw5ZwtH.js.map +0 -1
  152. package/webapp/dist/assets/timeline-definition-YZTLITO2-BT10dRIJ.js.map +0 -1
  153. package/webapp/dist/assets/treemap-KZPCXAKY-yPoPC5hc.js.map +0 -1
  154. package/webapp/dist/assets/vennDiagram-LZ73GAT5-tryg3OaY.js +0 -2487
  155. package/webapp/dist/assets/vennDiagram-LZ73GAT5-tryg3OaY.js.map +0 -1
  156. package/webapp/dist/assets/xychartDiagram-JWTSCODW-BWLUzo9S.js.map +0 -1
@@ -103,6 +103,16 @@ function q4hSuspensionDisplayState(hasQ4H) {
103
103
  }
104
104
  return undefined;
105
105
  }
106
+ function pendingReplyObligationDisplayState(activeReplyObligation) {
107
+ if (activeReplyObligation === undefined) {
108
+ return undefined;
109
+ }
110
+ return {
111
+ kind: 'stopped',
112
+ reason: { kind: 'pending_reply_obligation' },
113
+ continueEnabled: true,
114
+ };
115
+ }
106
116
  async function resolveSideDialogFinalResponseClosure(args) {
107
117
  if (!args.latest) {
108
118
  return { kind: 'no_final_response' };
@@ -111,26 +121,50 @@ async function resolveSideDialogFinalResponseClosure(args) {
111
121
  if (!finalResponseAnchor) {
112
122
  return { kind: 'no_final_response' };
113
123
  }
124
+ const finalResponseCallId = finalResponseAnchor.callId.trim();
114
125
  const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(args.dialogId, 'running');
115
126
  if (activeReplyObligation === undefined) {
116
127
  return {
117
128
  kind: 'closed_without_active_reply_obligation',
118
- callId: finalResponseAnchor.callId,
129
+ callId: finalResponseCallId,
119
130
  };
120
131
  }
121
- if (activeReplyObligation.targetCallId === finalResponseAnchor.callId) {
132
+ if (activeReplyObligation.targetCallId.trim() === finalResponseCallId) {
122
133
  return {
123
134
  kind: 'closed_with_matching_reply_obligation',
124
- callId: finalResponseAnchor.callId,
135
+ callId: finalResponseCallId,
125
136
  activeReplyObligation,
126
137
  };
127
138
  }
128
139
  return {
129
140
  kind: 'blocked_by_different_reply_obligation',
130
- callId: finalResponseAnchor.callId,
141
+ callId: finalResponseCallId,
131
142
  activeReplyObligation,
132
143
  };
133
144
  }
145
+ async function clearMatchingFinalResponseReplyObligation(dialogId, closure) {
146
+ if (closure.kind !== 'closed_with_matching_reply_obligation') {
147
+ return false;
148
+ }
149
+ await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(dialogId, undefined, 'running');
150
+ return true;
151
+ }
152
+ async function settleFinalResponseClosureForIdleProjection(dialogId, closure) {
153
+ switch (closure.kind) {
154
+ case 'no_final_response':
155
+ case 'blocked_by_different_reply_obligation':
156
+ return false;
157
+ case 'closed_without_active_reply_obligation':
158
+ return true;
159
+ case 'closed_with_matching_reply_obligation':
160
+ await clearMatchingFinalResponseReplyObligation(dialogId, closure);
161
+ return true;
162
+ default: {
163
+ const _exhaustive = closure;
164
+ throw new Error(`Unhandled final response closure kind: ${String(_exhaustive)}`);
165
+ }
166
+ }
167
+ }
134
168
  function classifyRunControlBucket(state) {
135
169
  if (!state)
136
170
  return 'none';
@@ -372,6 +406,7 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
372
406
  });
373
407
  return;
374
408
  }
409
+ let nextDisplayState = displayState;
375
410
  let previousDisplayState;
376
411
  let previousExecutionMarker;
377
412
  // "dead" is irreversible. Once a dialog is marked dead, do not allow overwriting it with
@@ -397,24 +432,53 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
397
432
  }
398
433
  return;
399
434
  }
435
+ if (status === 'running' && displayState.kind === 'idle_waiting_user') {
436
+ const finalResponseClosure = await resolveSideDialogFinalResponseClosure({
437
+ dialogId,
438
+ latest,
439
+ });
440
+ const finalResponseClosedForIdle = await settleFinalResponseClosureForIdleProjection(dialogId, finalResponseClosure);
441
+ if (!finalResponseClosedForIdle) {
442
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, status);
443
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
444
+ if (pendingReplyObligation) {
445
+ nextDisplayState = pendingReplyObligation;
446
+ log.warn('Redirecting idle displayState to pending reply obligation projection', undefined, {
447
+ dialogId: dialogId.valueOf(),
448
+ rootId: dialogId.rootId,
449
+ selfId: dialogId.selfId,
450
+ status,
451
+ targetCallId: activeReplyObligation?.targetCallId ?? null,
452
+ targetDialogId: activeReplyObligation?.targetDialogId.valueOf() ?? null,
453
+ previousDisplayState: latest?.displayState ?? null,
454
+ previousExecutionMarker: latest?.executionMarker ?? null,
455
+ sideDialogFinalResponseCallId: latest?.sideDialogFinalResponse?.callId ?? null,
456
+ });
457
+ }
458
+ }
459
+ }
400
460
  }
401
461
  catch (err) {
402
462
  log.warn('Failed to check existing displayState before setDialogDisplayState', err, {
403
463
  dialogId: dialogId.valueOf(),
404
464
  status,
465
+ intendedDisplayState: displayState,
405
466
  });
467
+ if (status === 'running' && displayState.kind === 'idle_waiting_user') {
468
+ return;
469
+ }
406
470
  }
407
- const nextExecutionMarker = displayState.kind === 'stopped'
408
- ? { kind: 'interrupted', reason: displayState.reason }
409
- : displayState.kind === 'dead'
410
- ? { kind: 'dead', reason: displayState.reason }
471
+ const nextExecutionMarker = nextDisplayState.kind === 'stopped'
472
+ ? { kind: 'interrupted', reason: nextDisplayState.reason }
473
+ : nextDisplayState.kind === 'dead'
474
+ ? { kind: 'dead', reason: nextDisplayState.reason }
411
475
  : previousExecutionMarker?.kind === 'interrupted'
412
476
  ? undefined
413
477
  : previousExecutionMarker;
414
478
  try {
415
479
  await persistence_1.DialogPersistence.mutateDialogLatest(dialogId, () => ({
416
480
  kind: 'patch',
417
- patch: { displayState, executionMarker: nextExecutionMarker },
481
+ patch: { displayState: nextDisplayState, executionMarker: nextExecutionMarker },
418
482
  }), status);
419
483
  }
420
484
  catch (err) {
@@ -424,11 +488,12 @@ async function setDialogDisplayState(dialogId, displayState, status = 'running')
424
488
  selfId: dialogId.selfId,
425
489
  status,
426
490
  intendedDisplayState: displayState,
491
+ persistedDisplayState: nextDisplayState,
427
492
  });
428
493
  }
429
494
  const typed = evt_registry_1.dialogEventRegistry.createTypedEvent(dialogId, {
430
495
  type: 'dlg_display_state_evt',
431
- displayState,
496
+ displayState: nextDisplayState,
432
497
  });
433
498
  if (broadcastToClients) {
434
499
  broadcastToClients(typed);
@@ -487,10 +552,14 @@ async function computeIdleDisplayState(dlg) {
487
552
  dialogId: dlg.id,
488
553
  latest,
489
554
  });
490
- if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
491
- finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
555
+ if (await settleFinalResponseClosureForIdleProjection(dlg.id, finalResponseClosure)) {
492
556
  return { kind: 'idle_waiting_user' };
493
557
  }
558
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dlg.id, dlg.status);
559
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
560
+ if (pendingReplyObligation) {
561
+ return pendingReplyObligation;
562
+ }
494
563
  return { kind: 'idle_waiting_user' };
495
564
  }
496
565
  async function computeIdleDisplayStateFromPersistence(dialogId) {
@@ -525,10 +594,14 @@ async function computeIdleDisplayStateFromPersistence(dialogId) {
525
594
  return q4hSuspension;
526
595
  }
527
596
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
528
- if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
529
- finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
597
+ if (await settleFinalResponseClosureForIdleProjection(dialogId, finalResponseClosure)) {
530
598
  return { kind: 'idle_waiting_user' };
531
599
  }
600
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
601
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
602
+ if (pendingReplyObligation) {
603
+ return pendingReplyObligation;
604
+ }
532
605
  return { kind: 'idle_waiting_user' };
533
606
  }
534
607
  async function healStaleSideDialogRunControlAfterFinalResponse(args) {
@@ -549,19 +622,12 @@ async function healStaleSideDialogRunControlAfterFinalResponse(args) {
549
622
  dialogId: args.dialogId,
550
623
  latest: args.latest,
551
624
  });
552
- switch (finalResponseClosure.kind) {
553
- case 'no_final_response':
554
- case 'blocked_by_different_reply_obligation':
555
- return args.latest;
556
- case 'closed_without_active_reply_obligation':
557
- break;
558
- case 'closed_with_matching_reply_obligation':
559
- await persistence_1.DialogPersistence.setActiveTellaskReplyObligation(args.dialogId, undefined, 'running');
560
- break;
561
- default: {
562
- const _exhaustive = finalResponseClosure;
563
- throw new Error(`Unhandled final response closure kind: ${String(_exhaustive)}`);
564
- }
625
+ if (finalResponseClosure.kind !== 'closed_without_active_reply_obligation' &&
626
+ finalResponseClosure.kind !== 'closed_with_matching_reply_obligation') {
627
+ return args.latest;
628
+ }
629
+ if (!(await settleFinalResponseClosureForIdleProjection(args.dialogId, finalResponseClosure))) {
630
+ return args.latest;
565
631
  }
566
632
  const clearedReplyObligation = finalResponseClosure.kind === 'closed_with_matching_reply_obligation';
567
633
  log.warn('Healing stale sideDialog run-control flags after final response anchor', undefined, {
@@ -643,10 +709,14 @@ async function refreshRunControlProjectionFromPersistenceFacts(dialogId, trigger
643
709
  return q4hSuspension;
644
710
  }
645
711
  const finalResponseClosure = await resolveSideDialogFinalResponseClosure({ dialogId, latest });
646
- if (finalResponseClosure.kind === 'closed_without_active_reply_obligation' ||
647
- finalResponseClosure.kind === 'closed_with_matching_reply_obligation') {
712
+ if (await settleFinalResponseClosureForIdleProjection(dialogId, finalResponseClosure)) {
648
713
  return { kind: 'idle_waiting_user' };
649
714
  }
715
+ const activeReplyObligation = await persistence_1.DialogPersistence.loadActiveTellaskReplyObligation(dialogId, 'running');
716
+ const pendingReplyObligation = pendingReplyObligationDisplayState(activeReplyObligation);
717
+ if (pendingReplyObligation) {
718
+ return pendingReplyObligation;
719
+ }
650
720
  if (latest.executionMarker?.kind === 'interrupted' &&
651
721
  latest.executionMarker.reason.kind !== 'pending_reply_obligation') {
652
722
  return {
@@ -272,6 +272,14 @@ function countFunctionCalls(events) {
272
272
  return count;
273
273
  }
274
274
  function computeRootForkDisplayState(args) {
275
+ const topFrame = args.askerStack?.askerStack[args.askerStack.askerStack.length - 1];
276
+ if (topFrame?.tellaskReplyObligation !== undefined) {
277
+ return {
278
+ kind: 'stopped',
279
+ reason: { kind: 'pending_reply_obligation' },
280
+ continueEnabled: true,
281
+ };
282
+ }
275
283
  if (args.action.kind === 'draft_user_text') {
276
284
  return { kind: 'idle_waiting_user' };
277
285
  }
@@ -281,6 +289,17 @@ function computeRootForkDisplayState(args) {
281
289
  }
282
290
  return { kind: 'stopped', reason: { kind: 'fork_continue_ready' }, continueEnabled: true };
283
291
  }
292
+ function computeSideDialogForkDisplayState(askerStack) {
293
+ const topFrame = askerStack?.askerStack[askerStack.askerStack.length - 1];
294
+ if (topFrame?.tellaskReplyObligation !== undefined) {
295
+ return {
296
+ kind: 'stopped',
297
+ reason: { kind: 'pending_reply_obligation' },
298
+ continueEnabled: true,
299
+ };
300
+ }
301
+ return { kind: 'idle_waiting_user' };
302
+ }
284
303
  async function copyArtifactsIfPresent(sourceId, targetId, sourceStatus) {
285
304
  const sourceDir = node_path_1.default.join(persistence_1.DialogPersistence.getDialogEventsPath(sourceId, sourceStatus), 'artifacts');
286
305
  const targetDir = node_path_1.default.join(persistence_1.DialogPersistence.getDialogEventsPath(targetId, 'running'), 'artifacts');
@@ -535,32 +554,14 @@ async function persistForkPlan(args) {
535
554
  if (sourceAskerStack.askerStack.length > 0) {
536
555
  await persistence_1.DialogPersistence.saveDialogAskerStack(plan.targetId, rewriteSideDialogAskerStackStateForFork(sourceAskerStack, plan.sourceId.rootId, plan.targetId.rootId), 'running');
537
556
  }
538
- for (const course of plan.retainedCourses) {
539
- for (const event of course.events) {
540
- await persistence_1.DialogPersistence.appendEvent(plan.targetId, course.course, rewriteRecordForFork(event, plan.targetId.rootId), 'running');
541
- }
542
- }
543
- await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
544
- await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
545
- await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
546
- for (const record of plan.activeCalleeDispatches) {
547
- await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
548
- }
549
- await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
550
- key: entry.key,
551
- sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
552
- agentId: entry.agentId,
553
- sessionSlug: entry.sessionSlug,
554
- })), 'running');
555
- await persistence_1.DialogPersistence.saveSideDialogResponses(plan.targetId, [...plan.sideDialogResponses], undefined, 'running');
556
- await copyArtifactsIfPresent(plan.sourceId, plan.targetId, args.sourceStatus);
557
557
  const currentCourseEvents = plan.retainedCourses.find((item) => item.course === plan.currentCourse)?.events ?? [];
558
558
  const displayState = plan.targetId.selfId === plan.targetId.rootId
559
559
  ? computeRootForkDisplayState({
560
560
  action: args.action,
561
561
  questions: plan.questions,
562
+ askerStack: sourceAskerStack,
562
563
  })
563
- : { kind: 'idle_waiting_user' };
564
+ : computeSideDialogForkDisplayState(sourceAskerStack);
564
565
  await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, () => ({
565
566
  kind: 'replace',
566
567
  next: {
@@ -581,6 +582,38 @@ async function persistForkPlan(args) {
581
582
  : undefined,
582
583
  },
583
584
  }));
585
+ for (const course of plan.retainedCourses) {
586
+ for (const event of course.events) {
587
+ await persistence_1.DialogPersistence.appendEvent(plan.targetId, course.course, rewriteRecordForFork(event, plan.targetId.rootId), 'running');
588
+ }
589
+ }
590
+ await appendForkBaselineState(plan, args.baselineRecordsByParentSelfId.get(plan.targetId.selfId) ?? []);
591
+ await persistence_1.DialogPersistence._saveReminderState(plan.targetId, [...plan.reminders], 'running');
592
+ await persistence_1.DialogPersistence._saveQuestions4HumanState(plan.targetId, [...plan.questions], 'running');
593
+ for (const record of plan.activeCalleeDispatches) {
594
+ await persistence_1.DialogPersistence.appendActiveCalleeDispatch(plan.targetId, record, undefined, 'running');
595
+ }
596
+ await persistence_1.DialogPersistence.saveSideDialogRegistry(plan.targetId, plan.registryEntries.map((entry) => ({
597
+ key: entry.key,
598
+ sideDialogId: new dialog_1.DialogID(entry.sideDialogId, plan.targetId.rootId),
599
+ agentId: entry.agentId,
600
+ sessionSlug: entry.sessionSlug,
601
+ })), 'running');
602
+ await persistence_1.DialogPersistence.saveSideDialogResponses(plan.targetId, [...plan.sideDialogResponses], undefined, 'running');
603
+ await copyArtifactsIfPresent(plan.sourceId, plan.targetId, args.sourceStatus);
604
+ await persistence_1.DialogPersistence.mutateDialogLatest(plan.targetId, (previous) => ({
605
+ kind: 'patch',
606
+ patch: {
607
+ currentCourse: plan.currentCourse,
608
+ messageCount: countMessages(currentCourseEvents),
609
+ functionCallCount: countFunctionCalls(currentCourseEvents),
610
+ sideDialogCount: plan.childCount,
611
+ displayState,
612
+ executionMarker: displayState.kind === 'stopped'
613
+ ? { kind: 'interrupted', reason: displayState.reason }
614
+ : previous.executionMarker,
615
+ },
616
+ }));
584
617
  }
585
618
  async function forkMainDialogTreeAtGeneration(args) {
586
619
  const sourceRootId = args.sourceRootId.trim();