dominds 1.17.7 → 1.18.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 (140) hide show
  1. package/dist/dialog-fork.js +11 -5
  2. package/dist/dialog-instance-registry.js +1 -18
  3. package/dist/dialog.d.ts +21 -31
  4. package/dist/dialog.js +207 -56
  5. package/dist/docs/dialog-system.md +3 -2
  6. package/dist/docs/dialog-system.zh.md +3 -2
  7. package/dist/docs/tellask-collab.md +2 -1
  8. package/dist/docs/tellask-collab.zh.md +2 -1
  9. package/dist/llm/defaults.yaml +43 -0
  10. package/dist/llm/gen/anthropic.js +153 -12
  11. package/dist/llm/gen/codex.js +160 -10
  12. package/dist/llm/gen/openai-compatible.js +141 -81
  13. package/dist/llm/gen/openai.js +178 -12
  14. package/dist/llm/gen/tool-result-image-ingest.d.ts +17 -8
  15. package/dist/llm/gen/tool-result-image-ingest.js +127 -27
  16. package/dist/llm/gen.d.ts +13 -0
  17. package/dist/llm/kernel-driver/drive.js +79 -15
  18. package/dist/llm/kernel-driver/flow.js +158 -41
  19. package/dist/llm/kernel-driver/reply-guidance.d.ts +6 -6
  20. package/dist/llm/kernel-driver/reply-guidance.js +169 -2
  21. package/dist/llm/kernel-driver/runtime.d.ts +2 -2
  22. package/dist/llm/kernel-driver/subdialog.js +4 -0
  23. package/dist/llm/kernel-driver/tellask-special.d.ts +2 -0
  24. package/dist/llm/kernel-driver/tellask-special.js +11 -6
  25. package/dist/llm/kernel-driver/types.d.ts +14 -24
  26. package/dist/minds/system-prompt.js +8 -8
  27. package/dist/persistence.d.ts +6 -5
  28. package/dist/persistence.js +198 -39
  29. package/dist/priming.js +98 -3
  30. package/dist/runtime/driver-messages.d.ts +1 -0
  31. package/dist/runtime/driver-messages.js +32 -10
  32. package/dist/runtime/reply-prompt-copy.js +4 -4
  33. package/dist/server/api-routes.js +11 -43
  34. package/dist/server/websocket-handler.js +155 -10
  35. package/dist/tools/builtins.js +10 -4
  36. package/dist/tools/cmd-runner.js +110 -49
  37. package/dist/tools/picture.d.ts +3 -0
  38. package/dist/tools/picture.js +344 -0
  39. package/dist/tools/prompts/control/en/principles.md +4 -2
  40. package/dist/tools/prompts/control/en/scenarios.md +2 -1
  41. package/dist/tools/prompts/control/en/tools.md +6 -6
  42. package/dist/tools/prompts/control/zh/principles.md +4 -2
  43. package/dist/tools/prompts/control/zh/scenarios.md +2 -1
  44. package/dist/tools/prompts/control/zh/tools.md +1 -1
  45. package/dist/tools/prompts/ws_mod.en.md +1 -0
  46. package/dist/tools/prompts/ws_mod.zh.md +1 -0
  47. package/dist/tools/prompts/ws_read/en/tools.md +25 -5
  48. package/dist/tools/prompts/ws_read/zh/tools.md +25 -5
  49. package/package.json +4 -4
  50. package/webapp/dist/assets/{_basePickBy-u7tNFRWr.js → _basePickBy-BPJaiZdW.js} +3 -3
  51. package/webapp/dist/assets/{_basePickBy-u7tNFRWr.js.map → _basePickBy-BPJaiZdW.js.map} +1 -1
  52. package/webapp/dist/assets/{_baseUniq-CH9LRkiH.js → _baseUniq-BEetT15i.js} +2 -2
  53. package/webapp/dist/assets/{_baseUniq-CH9LRkiH.js.map → _baseUniq-BEetT15i.js.map} +1 -1
  54. package/webapp/dist/assets/{arc-Bo0Lw3ZP.js → arc-Dm7Zf36f.js} +2 -2
  55. package/webapp/dist/assets/{arc-Bo0Lw3ZP.js.map → arc-Dm7Zf36f.js.map} +1 -1
  56. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Ckyr89Iw.js → architectureDiagram-VXUJARFQ-BpTPtkuo.js} +7 -7
  57. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Ckyr89Iw.js.map → architectureDiagram-VXUJARFQ-BpTPtkuo.js.map} +1 -1
  58. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BSXoLLq_.js → blockDiagram-VD42YOAC-C8fLN0iu.js} +7 -7
  59. package/webapp/dist/assets/{blockDiagram-VD42YOAC-BSXoLLq_.js.map → blockDiagram-VD42YOAC-C8fLN0iu.js.map} +1 -1
  60. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CgCG1cP0.js → c4Diagram-YG6GDRKO-BpPr62CH.js} +3 -3
  61. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-CgCG1cP0.js.map → c4Diagram-YG6GDRKO-BpPr62CH.js.map} +1 -1
  62. package/webapp/dist/assets/{channel-Crbz0zgt.js → channel-EMYoPjW3.js} +2 -2
  63. package/webapp/dist/assets/{channel-Crbz0zgt.js.map → channel-EMYoPjW3.js.map} +1 -1
  64. package/webapp/dist/assets/{chunk-4BX2VUAB-BIIEb_5S.js → chunk-4BX2VUAB-CefNtjWG.js} +2 -2
  65. package/webapp/dist/assets/{chunk-4BX2VUAB-BIIEb_5S.js.map → chunk-4BX2VUAB-CefNtjWG.js.map} +1 -1
  66. package/webapp/dist/assets/{chunk-55IACEB6-CaJzGgc9.js → chunk-55IACEB6-C_X7T43V.js} +2 -2
  67. package/webapp/dist/assets/{chunk-55IACEB6-CaJzGgc9.js.map → chunk-55IACEB6-C_X7T43V.js.map} +1 -1
  68. package/webapp/dist/assets/{chunk-B4BG7PRW-DHQwhO9F.js → chunk-B4BG7PRW-BRe3_2oA.js} +5 -5
  69. package/webapp/dist/assets/{chunk-B4BG7PRW-DHQwhO9F.js.map → chunk-B4BG7PRW-BRe3_2oA.js.map} +1 -1
  70. package/webapp/dist/assets/{chunk-DI55MBZ5-CG1lO0R8.js → chunk-DI55MBZ5-CbvrsI_w.js} +4 -4
  71. package/webapp/dist/assets/{chunk-DI55MBZ5-CG1lO0R8.js.map → chunk-DI55MBZ5-CbvrsI_w.js.map} +1 -1
  72. package/webapp/dist/assets/{chunk-FMBD7UC4-DAUsTLPS.js → chunk-FMBD7UC4-ORmtkrtS.js} +2 -2
  73. package/webapp/dist/assets/{chunk-FMBD7UC4-DAUsTLPS.js.map → chunk-FMBD7UC4-ORmtkrtS.js.map} +1 -1
  74. package/webapp/dist/assets/{chunk-QN33PNHL-BfQs-QHE.js → chunk-QN33PNHL-LTAOVhWu.js} +2 -2
  75. package/webapp/dist/assets/{chunk-QN33PNHL-BfQs-QHE.js.map → chunk-QN33PNHL-LTAOVhWu.js.map} +1 -1
  76. package/webapp/dist/assets/{chunk-QZHKN3VN-C5iKQ6mQ.js → chunk-QZHKN3VN-ZoUM_4u5.js} +2 -2
  77. package/webapp/dist/assets/{chunk-QZHKN3VN-C5iKQ6mQ.js.map → chunk-QZHKN3VN-ZoUM_4u5.js.map} +1 -1
  78. package/webapp/dist/assets/{chunk-TZMSLE5B-CBShDwy2.js → chunk-TZMSLE5B-Gao4qrq7.js} +2 -2
  79. package/webapp/dist/assets/{chunk-TZMSLE5B-CBShDwy2.js.map → chunk-TZMSLE5B-Gao4qrq7.js.map} +1 -1
  80. package/webapp/dist/assets/{classDiagram-2ON5EDUG-DrfJDzYO.js → classDiagram-2ON5EDUG-uha1vIGN.js} +6 -6
  81. package/webapp/dist/assets/{classDiagram-2ON5EDUG-DrfJDzYO.js.map → classDiagram-2ON5EDUG-uha1vIGN.js.map} +1 -1
  82. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-DrfJDzYO.js → classDiagram-v2-WZHVMYZB-uha1vIGN.js} +6 -6
  83. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-DrfJDzYO.js.map → classDiagram-v2-WZHVMYZB-uha1vIGN.js.map} +1 -1
  84. package/webapp/dist/assets/{clone-Cd-48URG.js → clone-_9Ayb1Gp.js} +2 -2
  85. package/webapp/dist/assets/{clone-Cd-48URG.js.map → clone-_9Ayb1Gp.js.map} +1 -1
  86. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CCji0YN3.js → cose-bilkent-S5V4N54A-C8wDw3NY.js} +2 -2
  87. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-CCji0YN3.js.map → cose-bilkent-S5V4N54A-C8wDw3NY.js.map} +1 -1
  88. package/webapp/dist/assets/{dagre-6UL2VRFP-B94p-Dpl.js → dagre-6UL2VRFP-BUSeNot0.js} +7 -7
  89. package/webapp/dist/assets/{dagre-6UL2VRFP-B94p-Dpl.js.map → dagre-6UL2VRFP-BUSeNot0.js.map} +1 -1
  90. package/webapp/dist/assets/{diagram-PSM6KHXK-DP-zGmAS.js → diagram-PSM6KHXK-CMZAksVC.js} +8 -8
  91. package/webapp/dist/assets/{diagram-PSM6KHXK-DP-zGmAS.js.map → diagram-PSM6KHXK-CMZAksVC.js.map} +1 -1
  92. package/webapp/dist/assets/{diagram-QEK2KX5R-DquJirs4.js → diagram-QEK2KX5R-BQKoRtwy.js} +7 -7
  93. package/webapp/dist/assets/{diagram-QEK2KX5R-DquJirs4.js.map → diagram-QEK2KX5R-BQKoRtwy.js.map} +1 -1
  94. package/webapp/dist/assets/{diagram-S2PKOQOG-Dt5W2t6V.js → diagram-S2PKOQOG-DjMG97kd.js} +7 -7
  95. package/webapp/dist/assets/{diagram-S2PKOQOG-Dt5W2t6V.js.map → diagram-S2PKOQOG-DjMG97kd.js.map} +1 -1
  96. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-Bs0-2Rfj.js → erDiagram-Q2GNP2WA-BujwA137.js} +5 -5
  97. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-Bs0-2Rfj.js.map → erDiagram-Q2GNP2WA-BujwA137.js.map} +1 -1
  98. package/webapp/dist/assets/{flowDiagram-NV44I4VS-cJjXWAlK.js → flowDiagram-NV44I4VS-DgwPjg4y.js} +6 -6
  99. package/webapp/dist/assets/{flowDiagram-NV44I4VS-cJjXWAlK.js.map → flowDiagram-NV44I4VS-DgwPjg4y.js.map} +1 -1
  100. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Du1AUaKm.js → ganttDiagram-JELNMOA3-Db2ykf3E.js} +3 -3
  101. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Du1AUaKm.js.map → ganttDiagram-JELNMOA3-Db2ykf3E.js.map} +1 -1
  102. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_jVOYOK.js → gitGraphDiagram-V2S2FVAM-D_gSifkv.js} +8 -8
  103. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-D_jVOYOK.js.map → gitGraphDiagram-V2S2FVAM-D_gSifkv.js.map} +1 -1
  104. package/webapp/dist/assets/{graph-CuF_sq4r.js → graph-BHjCU5xP.js} +3 -3
  105. package/webapp/dist/assets/{graph-CuF_sq4r.js.map → graph-BHjCU5xP.js.map} +1 -1
  106. package/webapp/dist/assets/{index-DAShQcjb.js → index-DLajsIDJ.js} +1363 -248
  107. package/webapp/dist/assets/{index-DAShQcjb.js.map → index-DLajsIDJ.js.map} +1 -1
  108. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-CEFlo_Hl.js → infoDiagram-HS3SLOUP-BDba5pKs.js} +6 -6
  109. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-CEFlo_Hl.js.map → infoDiagram-HS3SLOUP-BDba5pKs.js.map} +1 -1
  110. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-zc2Q4Se9.js → journeyDiagram-XKPGCS4Q-CmJAbmlm.js} +5 -5
  111. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-zc2Q4Se9.js.map → journeyDiagram-XKPGCS4Q-CmJAbmlm.js.map} +1 -1
  112. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-oT42RM2a.js → kanban-definition-3W4ZIXB7-DxQeBTDk.js} +3 -3
  113. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-oT42RM2a.js.map → kanban-definition-3W4ZIXB7-DxQeBTDk.js.map} +1 -1
  114. package/webapp/dist/assets/{layout-BvaOu3k2.js → layout-DteV_yE8.js} +5 -5
  115. package/webapp/dist/assets/{layout-BvaOu3k2.js.map → layout-DteV_yE8.js.map} +1 -1
  116. package/webapp/dist/assets/{linear-Cg-CjocS.js → linear-zItbPrND.js} +2 -2
  117. package/webapp/dist/assets/{linear-Cg-CjocS.js.map → linear-zItbPrND.js.map} +1 -1
  118. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-CVFVrU22.js → mindmap-definition-VGOIOE7T-BJXI7UqO.js} +4 -4
  119. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-CVFVrU22.js.map → mindmap-definition-VGOIOE7T-BJXI7UqO.js.map} +1 -1
  120. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Bai5CMos.js → pieDiagram-ADFJNKIX-BpM-aH2p.js} +8 -8
  121. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-Bai5CMos.js.map → pieDiagram-ADFJNKIX-BpM-aH2p.js.map} +1 -1
  122. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-BPXDO_2E.js → quadrantDiagram-AYHSOK5B-NXdIpA15.js} +3 -3
  123. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-BPXDO_2E.js.map → quadrantDiagram-AYHSOK5B-NXdIpA15.js.map} +1 -1
  124. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-Dgj9X9cE.js → requirementDiagram-UZGBJVZJ-D1AICAA0.js} +4 -4
  125. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-Dgj9X9cE.js.map → requirementDiagram-UZGBJVZJ-D1AICAA0.js.map} +1 -1
  126. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-Dc0mO4OD.js → sankeyDiagram-TZEHDZUN-WiReDPfo.js} +2 -2
  127. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-Dc0mO4OD.js.map → sankeyDiagram-TZEHDZUN-WiReDPfo.js.map} +1 -1
  128. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DZJTga0d.js → sequenceDiagram-WL72ISMW-Cw76oP8t.js} +4 -4
  129. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-DZJTga0d.js.map → sequenceDiagram-WL72ISMW-Cw76oP8t.js.map} +1 -1
  130. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-RNxYatKM.js → stateDiagram-FKZM4ZOC-QjCeRczs.js} +9 -9
  131. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-RNxYatKM.js.map → stateDiagram-FKZM4ZOC-QjCeRczs.js.map} +1 -1
  132. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-ADxYqWzo.js → stateDiagram-v2-4FDKWEC3-IClqxQ4s.js} +5 -5
  133. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-ADxYqWzo.js.map → stateDiagram-v2-4FDKWEC3-IClqxQ4s.js.map} +1 -1
  134. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-Qx_h1e-i.js → timeline-definition-IT6M3QCI-BfyfTY7m.js} +3 -3
  135. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-Qx_h1e-i.js.map → timeline-definition-IT6M3QCI-BfyfTY7m.js.map} +1 -1
  136. package/webapp/dist/assets/{treemap-GDKQZRPO-BHzYvXGn.js → treemap-GDKQZRPO-C5MiL6--.js} +5 -5
  137. package/webapp/dist/assets/{treemap-GDKQZRPO-BHzYvXGn.js.map → treemap-GDKQZRPO-C5MiL6--.js.map} +1 -1
  138. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-DGdjkYQQ.js → xychartDiagram-PRI3JC2R-ybaJrSry.js} +3 -3
  139. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-DGdjkYQQ.js.map → xychartDiagram-PRI3JC2R-ybaJrSry.js.map} +1 -1
  140. package/webapp/dist/index.html +1 -1
@@ -238,6 +238,9 @@ function hasMeaningfulBatchOutput(batch) {
238
238
  if (output.kind === 'tool_result_image_ingest') {
239
239
  continue;
240
240
  }
241
+ if (output.kind === 'user_image_ingest') {
242
+ continue;
243
+ }
241
244
  if (output.kind !== 'message') {
242
245
  return true;
243
246
  }
@@ -346,7 +349,7 @@ const TELLASK_SPECIAL_VIRTUAL_TOOLS = [
346
349
  {
347
350
  type: 'func',
348
351
  name: 'tellaskBack',
349
- description: 'Ask back to the requester dialog in sideline context.',
352
+ description: 'Ask back to the requester dialog in sideline context when upstream clarification/decision is required or ownership cannot be determined from SOP.',
350
353
  parameters: {
351
354
  type: 'object',
352
355
  properties: {
@@ -565,34 +568,70 @@ function resolveUpNextPrompt(dlg) {
565
568
  q4h: runControl.q4h,
566
569
  };
567
570
  })();
568
- return {
571
+ const common = {
569
572
  content: upNext.prompt,
570
573
  msgId: upNext.msgId,
571
574
  grammar: upNext.grammar ?? 'markdown',
572
- origin: upNext.origin,
573
- userLanguageCode: upNext.userLanguageCode,
574
- q4hAnswerCallId: upNext.q4hAnswerCallId,
575
- tellaskReplyDirective: upNext.tellaskReplyDirective,
576
- skipTaskdoc: upNext.skipTaskdoc,
577
- subdialogReplyTarget: upNext.subdialogReplyTarget,
578
- runControl: normalizedRunControl,
575
+ ...(upNext.userLanguageCode === undefined ? {} : { userLanguageCode: upNext.userLanguageCode }),
576
+ ...(normalizedRunControl === undefined ? {} : { runControl: normalizedRunControl }),
579
577
  };
578
+ switch (upNext.kind) {
579
+ case 'user_generation_boundary':
580
+ case 'deferred_q4h_answer': {
581
+ const prompt = {
582
+ ...common,
583
+ origin: 'user',
584
+ ...(upNext.q4hAnswerCallId === undefined
585
+ ? {}
586
+ : { q4hAnswerCallId: upNext.q4hAnswerCallId }),
587
+ };
588
+ return prompt;
589
+ }
590
+ case 'registered_assignment_update':
591
+ case 'new_course_runtime_guide':
592
+ case 'new_course_runtime_reply':
593
+ case 'new_course_runtime_subdialog': {
594
+ const runtimeCommon = {
595
+ ...common,
596
+ origin: 'runtime',
597
+ ...(upNext.skipTaskdoc === undefined ? {} : { skipTaskdoc: upNext.skipTaskdoc }),
598
+ };
599
+ if (upNext.kind === 'registered_assignment_update' ||
600
+ upNext.kind === 'new_course_runtime_subdialog') {
601
+ const prompt = {
602
+ ...runtimeCommon,
603
+ tellaskReplyDirective: upNext.tellaskReplyDirective,
604
+ subdialogReplyTarget: upNext.subdialogReplyTarget,
605
+ };
606
+ return prompt;
607
+ }
608
+ if (upNext.kind === 'new_course_runtime_reply') {
609
+ const prompt = {
610
+ ...runtimeCommon,
611
+ tellaskReplyDirective: upNext.tellaskReplyDirective,
612
+ };
613
+ return prompt;
614
+ }
615
+ const prompt = runtimeCommon;
616
+ return prompt;
617
+ }
618
+ }
580
619
  }
581
620
  async function renderRemindersForContext(dlg) {
582
621
  const reminders = await dlg.listVisibleReminders();
583
622
  if (reminders.length === 0)
584
623
  return [];
585
624
  const language = (0, work_language_1.getWorkLanguage)();
586
- const rendered = [];
625
+ const renderedItems = [];
587
626
  for (const reminder of reminders) {
588
627
  if (!reminder || !(0, tool_1.reminderEchoBackEnabled)(reminder)) {
589
628
  continue;
590
629
  }
591
630
  if (reminder.owner) {
592
- rendered.push(await reminder.owner.renderReminder(dlg, reminder));
631
+ renderedItems.push(await reminder.owner.renderReminder(dlg, reminder));
593
632
  continue;
594
633
  }
595
- rendered.push({
634
+ renderedItems.push({
596
635
  type: 'transient_guide_msg',
597
636
  role: 'assistant',
598
637
  content: (0, driver_messages_1.formatReminderItemGuide)(language, reminder.id, reminder.content, {
@@ -601,7 +640,16 @@ async function renderRemindersForContext(dlg) {
601
640
  }),
602
641
  });
603
642
  }
604
- return rendered;
643
+ if (renderedItems.length === 0)
644
+ return [];
645
+ return [
646
+ {
647
+ type: 'environment_msg',
648
+ role: 'user',
649
+ content: (0, driver_messages_1.formatReminderContextGuide)(language),
650
+ },
651
+ ...renderedItems,
652
+ ];
605
653
  }
606
654
  function hasSameReplyDirective(left, right) {
607
655
  if (!left || !right) {
@@ -835,7 +883,7 @@ async function executeFunctionCalls(args) {
835
883
  if (!preparedInvocationArgs || !preparedInvocationArgs.ok) {
836
884
  outcome = 'failure';
837
885
  const errorText = preparedInvocationArgs?.error ?? 'Arguments could not be prepared for tool invocation';
838
- log_1.log.warn('kernel-driver rejected function call arguments before execution', undefined, {
886
+ log_1.log.debug('kernel-driver rejected function call arguments before execution', undefined, {
839
887
  funcName: func.name,
840
888
  arguments: argsStr,
841
889
  error: errorText,
@@ -929,6 +977,7 @@ async function executeFunctionRound(args) {
929
977
  funcCalls: args.funcCalls,
930
978
  allowedSpecials,
931
979
  callbacks: args.callbacks,
980
+ activePromptReplyDirective: args.activePromptReplyDirective,
932
981
  });
933
982
  throwIfAborted(args.abortSignal, args.dlg);
934
983
  const genericExecutions = await executeFunctionCalls({
@@ -1464,8 +1513,11 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1464
1513
  msgId: currentPrompt.msgId,
1465
1514
  grammar: 'markdown',
1466
1515
  content: replyGuidance.promptContent,
1516
+ ...(currentPrompt.contentItems === undefined
1517
+ ? {}
1518
+ : { contentItems: currentPrompt.contentItems }),
1467
1519
  });
1468
- await dlg.persistUserMessage(replyGuidance.promptContent, currentPrompt.msgId, 'markdown', origin, persistedUserLanguageCode, q4hAnswerCallId, replyGuidance.persistedTellaskReplyDirective);
1520
+ await dlg.persistUserMessage(replyGuidance.promptContent, currentPrompt.msgId, 'markdown', origin, persistedUserLanguageCode, q4hAnswerCallId, replyGuidance.persistedTellaskReplyDirective, currentPrompt.contentItems);
1469
1521
  await persistence_1.DialogPersistence.clearPendingCourseStartPrompt(dlg.id, currentPrompt.msgId, dlg.status);
1470
1522
  }
1471
1523
  if (renderPromptAsRuntimeGuideBubble) {
@@ -1485,6 +1537,9 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1485
1537
  genseq: dlg.activeGenSeq,
1486
1538
  msgId: currentPrompt.msgId,
1487
1539
  content: replyGuidance.promptContent,
1540
+ ...(currentPrompt.contentItems === undefined
1541
+ ? {}
1542
+ : { contentItems: currentPrompt.contentItems }),
1488
1543
  grammar: 'markdown',
1489
1544
  origin,
1490
1545
  userLanguageCode: persistedUserLanguageCode,
@@ -1768,6 +1823,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1768
1823
  throwIfAborted(abortSignal, dlg);
1769
1824
  await dlg.toolResultImageIngest(ingest);
1770
1825
  },
1826
+ userImageIngest: async (ingest) => {
1827
+ throwIfAborted(abortSignal, dlg);
1828
+ await dlg.userImageIngest(ingest);
1829
+ },
1771
1830
  };
1772
1831
  const res = await (0, runtime_1.runLlmRequestWithRetry)({
1773
1832
  dlg,
@@ -1882,6 +1941,10 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1882
1941
  await dlg.toolResultImageIngest(output.ingest);
1883
1942
  break;
1884
1943
  }
1944
+ case 'user_image_ingest': {
1945
+ await dlg.userImageIngest(output.ingest);
1946
+ break;
1947
+ }
1885
1948
  default: {
1886
1949
  const _exhaustive = output;
1887
1950
  throw new Error(`Unhandled batch output kind: ${String(_exhaustive)}`);
@@ -1967,6 +2030,7 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1967
2030
  callbacks,
1968
2031
  abortSignal,
1969
2032
  allowTellaskFunctions: policy.allowTellaskFunctions,
2033
+ activePromptReplyDirective: currentPrompt?.tellaskReplyDirective,
1970
2034
  });
1971
2035
  if (routed.tellaskToolOutputs.length > 0) {
1972
2036
  newMsgs.push(...routed.tellaskToolOutputs);
@@ -140,6 +140,18 @@ function hasNoPromptSubdialogResumeEntitlement(dialog, driveOptions) {
140
140
  }
141
141
  return entitlement.ownerDialogId === dialog.id.selfId;
142
142
  }
143
+ function shouldAllowPendingSubdialogsForParentRevive(dialog, driveOptions) {
144
+ if (!(dialog instanceof dialog_1.SubDialog)) {
145
+ return false;
146
+ }
147
+ const entitlement = driveOptions?.noPromptSubdialogResumeEntitlement;
148
+ if (!entitlement) {
149
+ return false;
150
+ }
151
+ return (driveOptions?.source === 'kernel_driver_supply_response_parent_revive' &&
152
+ entitlement.ownerDialogId === dialog.id.selfId &&
153
+ entitlement.reason === 'reply_tellask_back_delivered');
154
+ }
143
155
  function resolveDriveRequestSource(humanPrompt, driveOptions) {
144
156
  if (driveOptions?.source) {
145
157
  return driveOptions.source;
@@ -355,20 +367,59 @@ async function resolveEffectivePrompt(dialog, humanPrompt) {
355
367
  }
356
368
  return {
357
369
  fromUpNext: true,
358
- prompt: {
359
- content: upNext.prompt,
360
- msgId: upNext.msgId,
361
- grammar: upNext.grammar ?? 'markdown',
362
- origin: upNext.origin,
363
- userLanguageCode: upNext.userLanguageCode === 'zh' || upNext.userLanguageCode === 'en'
370
+ prompt: (() => {
371
+ const normalizedUserLanguageCode = upNext.userLanguageCode === 'zh' || upNext.userLanguageCode === 'en'
364
372
  ? upNext.userLanguageCode
365
- : undefined,
366
- q4hAnswerCallId: upNext.q4hAnswerCallId,
367
- tellaskReplyDirective: upNext.tellaskReplyDirective,
368
- skipTaskdoc: upNext.skipTaskdoc,
369
- subdialogReplyTarget: upNext.subdialogReplyTarget,
370
- runControl: upNext.runControl,
371
- },
373
+ : undefined;
374
+ const common = {
375
+ content: upNext.prompt,
376
+ msgId: upNext.msgId,
377
+ grammar: upNext.grammar ?? 'markdown',
378
+ userLanguageCode: normalizedUserLanguageCode,
379
+ runControl: upNext.runControl,
380
+ };
381
+ switch (upNext.kind) {
382
+ case 'user_generation_boundary':
383
+ case 'deferred_q4h_answer': {
384
+ const prompt = {
385
+ ...common,
386
+ origin: 'user',
387
+ ...(upNext.q4hAnswerCallId === undefined
388
+ ? {}
389
+ : { q4hAnswerCallId: upNext.q4hAnswerCallId }),
390
+ };
391
+ return prompt;
392
+ }
393
+ case 'registered_assignment_update':
394
+ case 'new_course_runtime_guide':
395
+ case 'new_course_runtime_reply':
396
+ case 'new_course_runtime_subdialog': {
397
+ const runtimeCommon = {
398
+ ...common,
399
+ origin: 'runtime',
400
+ ...(upNext.skipTaskdoc === undefined ? {} : { skipTaskdoc: upNext.skipTaskdoc }),
401
+ };
402
+ if (upNext.kind === 'registered_assignment_update' ||
403
+ upNext.kind === 'new_course_runtime_subdialog') {
404
+ const prompt = {
405
+ ...runtimeCommon,
406
+ tellaskReplyDirective: upNext.tellaskReplyDirective,
407
+ subdialogReplyTarget: upNext.subdialogReplyTarget,
408
+ };
409
+ return prompt;
410
+ }
411
+ if (upNext.kind === 'new_course_runtime_reply') {
412
+ const prompt = {
413
+ ...runtimeCommon,
414
+ tellaskReplyDirective: upNext.tellaskReplyDirective,
415
+ };
416
+ return prompt;
417
+ }
418
+ const prompt = runtimeCommon;
419
+ return prompt;
420
+ }
421
+ }
422
+ })(),
372
423
  };
373
424
  }
374
425
  async function executeDriveRound(args) {
@@ -484,9 +535,12 @@ async function executeDriveRound(args) {
484
535
  // Do not refactor this branch using only `displayState` or only the previous interrupted
485
536
  // marker. The correct behavior emerges from combining fresh blocker facts, queued prompt
486
537
  // state, and the deferred reply reassertion logic elsewhere.
538
+ const allowPendingSubdialogsForParentRevive = shouldAllowPendingSubdialogsForParentRevive(dialog, driveOptions);
487
539
  const suspension = resumeFromInterjectionPause
488
540
  ? await loadFreshSuspensionStatusFromPersistence(dialog)
489
- : await dialog.getSuspensionStatus();
541
+ : await dialog.getSuspensionStatus({
542
+ allowPendingSubdialogs: allowPendingSubdialogsForParentRevive,
543
+ });
490
544
  const queuedPrompt = dialog.peekUpNext();
491
545
  const queuedSubdialogPromptCanResume = dialog instanceof dialog_1.SubDialog && queuedPrompt !== undefined;
492
546
  if (!suspension.canDrive && !queuedSubdialogPromptCanResume) {
@@ -714,25 +768,44 @@ async function executeDriveRound(args) {
714
768
  });
715
769
  }
716
770
  else {
717
- if (!activePromptWasReplyToolReminder) {
771
+ const shouldDirectFallbackAfterAskBackParentRevive = shouldAllowPendingSubdialogsForParentRevive(dialog, driveOptions);
772
+ if (!activePromptWasReplyToolReminder &&
773
+ !shouldDirectFallbackAfterAskBackParentRevive) {
718
774
  const language = (0, work_language_1.getWorkLanguage)();
719
- followUp = {
720
- prompt: await buildReplyToolReminderPrompt({
721
- dlg: dialog,
722
- directive: activeTellaskReplyDirective,
723
- language,
724
- }),
725
- msgId: (0, id_1.generateShortId)(),
726
- grammar: 'markdown',
727
- origin: 'runtime',
728
- userLanguageCode: language,
729
- tellaskReplyDirective: activeTellaskReplyDirective,
730
- subdialogReplyTarget,
731
- };
775
+ followUp =
776
+ subdialogReplyTarget === undefined
777
+ ? {
778
+ kind: 'runtime_reply_reminder',
779
+ prompt: await buildReplyToolReminderPrompt({
780
+ dlg: dialog,
781
+ directive: activeTellaskReplyDirective,
782
+ language,
783
+ }),
784
+ msgId: (0, id_1.generateShortId)(),
785
+ grammar: 'markdown',
786
+ origin: 'runtime',
787
+ userLanguageCode: language,
788
+ tellaskReplyDirective: activeTellaskReplyDirective,
789
+ }
790
+ : {
791
+ kind: 'runtime_subdialog_reply_reminder',
792
+ prompt: await buildReplyToolReminderPrompt({
793
+ dlg: dialog,
794
+ directive: activeTellaskReplyDirective,
795
+ language,
796
+ }),
797
+ msgId: (0, id_1.generateShortId)(),
798
+ grammar: 'markdown',
799
+ origin: 'runtime',
800
+ userLanguageCode: language,
801
+ tellaskReplyDirective: activeTellaskReplyDirective,
802
+ subdialogReplyTarget,
803
+ };
732
804
  log_1.log.debug('kernel-driver queued subdialog replyTellask reminder after plain reply', undefined, {
733
805
  dialogId: dialog.id.valueOf(),
734
806
  targetCallId: activeTellaskReplyDirective.targetCallId,
735
807
  targetOwnerDialogId: subdialogReplyTarget?.ownerDialogId,
808
+ directFallbackAfterAskBackParentRevive: shouldDirectFallbackAfterAskBackParentRevive,
736
809
  });
737
810
  }
738
811
  else {
@@ -821,6 +894,7 @@ async function executeDriveRound(args) {
821
894
  if (!activePromptWasReplyToolReminder) {
822
895
  const language = (0, work_language_1.getWorkLanguage)();
823
896
  followUp = {
897
+ kind: 'runtime_reply_reminder',
824
898
  prompt: await buildReplyToolReminderPrompt({
825
899
  dlg: dialog,
826
900
  directive: activeTellaskReplyDirective,
@@ -863,20 +937,63 @@ async function executeDriveRound(args) {
863
937
  source: 'kernel_driver_follow_up',
864
938
  reason: 'follow_up_prompt',
865
939
  },
866
- humanPrompt: {
867
- content: followUp.prompt,
868
- msgId: followUp.msgId,
869
- grammar: followUp.grammar ?? 'markdown',
870
- origin: followUp.origin,
871
- userLanguageCode: followUp.userLanguageCode === 'zh' || followUp.userLanguageCode === 'en'
940
+ humanPrompt: (() => {
941
+ const normalizedUserLanguageCode = followUp.userLanguageCode === 'zh' || followUp.userLanguageCode === 'en'
872
942
  ? followUp.userLanguageCode
873
- : undefined,
874
- q4hAnswerCallId: followUp.q4hAnswerCallId,
875
- tellaskReplyDirective: followUp.tellaskReplyDirective,
876
- skipTaskdoc: followUp.skipTaskdoc,
877
- subdialogReplyTarget: followUp.subdialogReplyTarget,
878
- runControl: followUp.runControl,
879
- },
943
+ : undefined;
944
+ const common = {
945
+ content: followUp.prompt,
946
+ msgId: followUp.msgId,
947
+ grammar: followUp.grammar ?? 'markdown',
948
+ userLanguageCode: normalizedUserLanguageCode,
949
+ runControl: followUp.runControl,
950
+ };
951
+ switch (followUp.kind) {
952
+ case 'user_generation_boundary':
953
+ case 'deferred_q4h_answer': {
954
+ const prompt = {
955
+ ...common,
956
+ origin: 'user',
957
+ ...(followUp.q4hAnswerCallId === undefined
958
+ ? {}
959
+ : { q4hAnswerCallId: followUp.q4hAnswerCallId }),
960
+ };
961
+ return prompt;
962
+ }
963
+ case 'registered_assignment_update':
964
+ case 'new_course_runtime_guide':
965
+ case 'new_course_runtime_reply':
966
+ case 'new_course_runtime_subdialog':
967
+ case 'runtime_reply_reminder':
968
+ case 'runtime_subdialog_reply_reminder': {
969
+ const runtimeCommon = {
970
+ ...common,
971
+ origin: 'runtime',
972
+ ...(followUp.skipTaskdoc === undefined
973
+ ? {}
974
+ : { skipTaskdoc: followUp.skipTaskdoc }),
975
+ };
976
+ if (followUp.kind === 'registered_assignment_update' ||
977
+ followUp.kind === 'new_course_runtime_subdialog') {
978
+ const prompt = {
979
+ ...runtimeCommon,
980
+ tellaskReplyDirective: followUp.tellaskReplyDirective,
981
+ subdialogReplyTarget: followUp.subdialogReplyTarget,
982
+ };
983
+ return prompt;
984
+ }
985
+ if (followUp.kind === 'new_course_runtime_reply') {
986
+ const prompt = {
987
+ ...runtimeCommon,
988
+ tellaskReplyDirective: followUp.tellaskReplyDirective,
989
+ };
990
+ return prompt;
991
+ }
992
+ const prompt = runtimeCommon;
993
+ return prompt;
994
+ }
995
+ }
996
+ })(),
880
997
  });
881
998
  }
882
999
  if (shouldPauseAfterLocalUserInterjection &&
@@ -1,20 +1,20 @@
1
1
  import type { TellaskReplyDirective } from '@longrun-ai/kernel/types/storage';
2
2
  import { Dialog } from '../../dialog';
3
- import type { KernelDriverHumanPrompt } from './types';
3
+ import type { KernelDriverPrompt } from './types';
4
4
  export declare function resolveReplyTargetAgentId(args: {
5
5
  dlg: Dialog;
6
6
  directive: TellaskReplyDirective;
7
7
  }): Promise<string | undefined>;
8
8
  export declare function resolvePromptReplyGuidance(args: {
9
9
  dlg: Dialog;
10
- prompt: KernelDriverHumanPrompt | undefined;
10
+ prompt: KernelDriverPrompt | undefined;
11
11
  language?: 'zh' | 'en';
12
12
  }): Promise<{
13
- activeReplyDirective: KernelDriverHumanPrompt['tellaskReplyDirective'];
14
- deferredReplyReassertionDirective: KernelDriverHumanPrompt['tellaskReplyDirective'];
13
+ activeReplyDirective: KernelDriverPrompt['tellaskReplyDirective'];
14
+ deferredReplyReassertionDirective: KernelDriverPrompt['tellaskReplyDirective'];
15
15
  isQ4HAnswerPrompt: boolean;
16
16
  promptContent: string | undefined;
17
- persistedTellaskReplyDirective: KernelDriverHumanPrompt['tellaskReplyDirective'];
17
+ persistedTellaskReplyDirective: KernelDriverPrompt['tellaskReplyDirective'];
18
18
  suppressInterDialogReplyGuidance: boolean;
19
19
  transientGuideContent: string | undefined;
20
20
  }>;
@@ -23,6 +23,6 @@ export declare function buildReplyObligationSuppressionGuide(args: {
23
23
  }): string;
24
24
  export declare function buildReplyObligationReassertionPrompt(args: {
25
25
  dlg: Dialog;
26
- directive: NonNullable<KernelDriverHumanPrompt['tellaskReplyDirective']>;
26
+ directive: NonNullable<KernelDriverPrompt['tellaskReplyDirective']>;
27
27
  language: 'zh' | 'en';
28
28
  }): Promise<string>;
@@ -82,6 +82,149 @@ function buildPromptContentWithExactReplyToolName(args) {
82
82
  });
83
83
  return `${note}\n\n${args.prompt.content}`;
84
84
  }
85
+ function hasSameReplyDirective(left, right) {
86
+ if (!left || !right) {
87
+ return left === right;
88
+ }
89
+ if (left.expectedReplyCallName !== right.expectedReplyCallName) {
90
+ return false;
91
+ }
92
+ if (left.targetCallId !== right.targetCallId || left.tellaskContent !== right.tellaskContent) {
93
+ return false;
94
+ }
95
+ if (left.expectedReplyCallName === 'replyTellaskBack') {
96
+ return (right.expectedReplyCallName === 'replyTellaskBack' &&
97
+ left.targetDialogId === right.targetDialogId);
98
+ }
99
+ return true;
100
+ }
101
+ function buildCurrentSubdialogAssignmentDirective(dlg) {
102
+ switch (dlg.assignmentFromSup.callName) {
103
+ case 'tellask':
104
+ return {
105
+ expectedReplyCallName: 'replyTellask',
106
+ targetCallId: dlg.assignmentFromSup.callId,
107
+ tellaskContent: dlg.assignmentFromSup.tellaskContent,
108
+ };
109
+ case 'tellaskSessionless':
110
+ case 'freshBootsReasoning':
111
+ return {
112
+ expectedReplyCallName: 'replyTellaskSessionless',
113
+ targetCallId: dlg.assignmentFromSup.callId,
114
+ tellaskContent: dlg.assignmentFromSup.tellaskContent,
115
+ };
116
+ default: {
117
+ const _exhaustive = dlg.assignmentFromSup.callName;
118
+ throw new Error(`Unsupported subdialog assignment callName: ${_exhaustive}`);
119
+ }
120
+ }
121
+ }
122
+ async function hasCurrentCourseHumanPromptRecord(args) {
123
+ const events = await persistence_1.DialogPersistence.loadCourseEvents(args.dlg.id, args.dlg.currentCourse, args.dlg.status);
124
+ for (const event of events) {
125
+ if (event.type === 'human_text_record' && event.msgId === args.msgId) {
126
+ return true;
127
+ }
128
+ }
129
+ return false;
130
+ }
131
+ async function resolveFreshCurrentSubdialogAssignmentDirective(args) {
132
+ if (!(args.dlg instanceof dialog_1.SubDialog) || args.prompt?.origin !== 'runtime') {
133
+ return undefined;
134
+ }
135
+ const promptDirective = args.prompt.tellaskReplyDirective;
136
+ if (!promptDirective) {
137
+ return undefined;
138
+ }
139
+ const currentAssignmentDirective = buildCurrentSubdialogAssignmentDirective(args.dlg);
140
+ if (!hasSameReplyDirective(promptDirective, currentAssignmentDirective)) {
141
+ return undefined;
142
+ }
143
+ if (await hasCurrentCourseHumanPromptRecord({
144
+ dlg: args.dlg,
145
+ msgId: args.prompt.msgId,
146
+ })) {
147
+ return undefined;
148
+ }
149
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(args.dlg.id, args.dlg.status);
150
+ if (!latest) {
151
+ return undefined;
152
+ }
153
+ const targetCallId = currentAssignmentDirective.targetCallId.trim();
154
+ for (let course = latest.currentCourse; course >= 1; course -= 1) {
155
+ const events = await persistence_1.DialogPersistence.loadCourseEvents(args.dlg.id, course, args.dlg.status);
156
+ for (const event of events) {
157
+ if (event.type === 'tellask_reply_resolution_record' &&
158
+ event.targetCallId.trim() === targetCallId) {
159
+ return undefined;
160
+ }
161
+ }
162
+ }
163
+ return currentAssignmentDirective;
164
+ }
165
+ async function resolveFreshPendingAskBackReplyDirective(args) {
166
+ const prompt = args.prompt;
167
+ if (prompt?.origin !== 'runtime' ||
168
+ prompt.tellaskReplyDirective?.expectedReplyCallName !== 'replyTellaskBack') {
169
+ return undefined;
170
+ }
171
+ if (await hasCurrentCourseHumanPromptRecord({
172
+ dlg: args.dlg,
173
+ msgId: prompt.msgId,
174
+ })) {
175
+ return undefined;
176
+ }
177
+ const rootDialog = args.dlg instanceof dialog_1.RootDialog
178
+ ? args.dlg
179
+ : args.dlg instanceof dialog_1.SubDialog
180
+ ? args.dlg.rootDialog
181
+ : undefined;
182
+ if (!rootDialog) {
183
+ return undefined;
184
+ }
185
+ const requesterDialogId = new dialog_1.DialogID(prompt.tellaskReplyDirective.targetDialogId, rootDialog.id.rootId);
186
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(requesterDialogId, rootDialog.status);
187
+ if (!latest) {
188
+ return undefined;
189
+ }
190
+ const targetCallId = prompt.tellaskReplyDirective.targetCallId.trim();
191
+ let sawAskBackCall = false;
192
+ for (let course = latest.currentCourse; course >= 1; course -= 1) {
193
+ const events = await persistence_1.DialogPersistence.loadCourseEvents(requesterDialogId, course, rootDialog.status);
194
+ for (const event of events) {
195
+ if (event.type === 'tellask_result_record' && event.callId.trim() === targetCallId) {
196
+ return undefined;
197
+ }
198
+ if (event.type === 'tellask_call_record' &&
199
+ event.id.trim() === targetCallId &&
200
+ event.name === 'tellaskBack') {
201
+ sawAskBackCall = true;
202
+ }
203
+ }
204
+ }
205
+ return sawAskBackCall ? prompt.tellaskReplyDirective : undefined;
206
+ }
207
+ function resolveFreshReplyDirective(args) {
208
+ const promptDirective = args.promptDirective;
209
+ const persistedDirective = args.persistedDirective;
210
+ if (!promptDirective) {
211
+ return persistedDirective;
212
+ }
213
+ if (!persistedDirective) {
214
+ return undefined;
215
+ }
216
+ return hasSameReplyDirective(promptDirective, persistedDirective)
217
+ ? promptDirective
218
+ : persistedDirective;
219
+ }
220
+ function resolvePromptPersistedReplyDirective(args) {
221
+ const promptDirective = args.promptDirective;
222
+ const persistedDirective = args.persistedDirective;
223
+ if (!promptDirective || !persistedDirective) {
224
+ return undefined;
225
+ }
226
+ return hasSameReplyDirective(promptDirective, persistedDirective) ? promptDirective : undefined;
227
+ }
85
228
  async function shouldSuppressInterDialogReplyGuidanceForUserInterjection(args) {
86
229
  // WARNING:
87
230
  // This suppression decision is not a cosmetic prompt tweak. It is one leg of the full
@@ -126,13 +269,34 @@ async function shouldSuppressInterDialogReplyGuidanceForUserInterjection(args) {
126
269
  async function resolvePromptReplyGuidance(args) {
127
270
  const prompt = args.prompt;
128
271
  const isQ4HAnswerPrompt = typeof prompt?.q4hAnswerCallId === 'string' && prompt.q4hAnswerCallId.trim() !== '';
272
+ const latest = await persistence_1.DialogPersistence.loadDialogLatest(args.dlg.id, args.dlg.status);
273
+ const persistedCurrentSubdialogAssignmentDirective = await resolveFreshCurrentSubdialogAssignmentDirective({
274
+ dlg: args.dlg,
275
+ prompt,
276
+ });
277
+ const persistedPendingAskBackReplyDirective = await resolveFreshPendingAskBackReplyDirective({
278
+ dlg: args.dlg,
279
+ prompt,
280
+ });
281
+ const persistedPendingCourseStartDirective = prompt !== undefined &&
282
+ latest?.pendingCourseStartPrompt?.msgId === prompt.msgId &&
283
+ latest.pendingCourseStartPrompt.origin === 'runtime'
284
+ ? latest.pendingCourseStartPrompt.tellaskReplyDirective
285
+ : undefined;
286
+ const persistedActiveReplyDirective = persistedCurrentSubdialogAssignmentDirective ??
287
+ persistedPendingAskBackReplyDirective ??
288
+ persistedPendingCourseStartDirective ??
289
+ (await (0, tellask_special_1.loadLatestActiveTellaskReplyDirective)(args.dlg));
129
290
  const suppressInterDialogReplyGuidance = isQ4HAnswerPrompt
130
291
  ? false
131
292
  : await shouldSuppressInterDialogReplyGuidanceForUserInterjection({
132
293
  dlg: args.dlg,
133
294
  prompt,
134
295
  });
135
- const availableReplyDirective = prompt?.tellaskReplyDirective ?? (await (0, tellask_special_1.loadLatestActiveTellaskReplyDirective)(args.dlg));
296
+ const availableReplyDirective = resolveFreshReplyDirective({
297
+ promptDirective: prompt?.tellaskReplyDirective,
298
+ persistedDirective: persistedActiveReplyDirective,
299
+ });
136
300
  const activeReplyDirective = suppressInterDialogReplyGuidance
137
301
  ? undefined
138
302
  : availableReplyDirective;
@@ -153,7 +317,10 @@ async function resolvePromptReplyGuidance(args) {
153
317
  : undefined,
154
318
  isQ4HAnswerPrompt,
155
319
  promptContent,
156
- persistedTellaskReplyDirective: prompt?.tellaskReplyDirective ?? activeReplyDirective,
320
+ persistedTellaskReplyDirective: resolvePromptPersistedReplyDirective({
321
+ promptDirective: prompt?.tellaskReplyDirective,
322
+ persistedDirective: persistedActiveReplyDirective,
323
+ }),
157
324
  suppressInterDialogReplyGuidance,
158
325
  transientGuideContent: suppressInterDialogReplyGuidance && prompt !== undefined
159
326
  ? buildReplyObligationSuppressionGuide({