dominds 1.11.1 → 1.11.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 (162) hide show
  1. package/dist/dialog-fork.js +2 -0
  2. package/dist/llm/kernel-driver/drive.js +38 -14
  3. package/dist/llm/kernel-driver/reply-guidance.js +13 -45
  4. package/dist/minds/system-prompt.js +3 -2
  5. package/dist/persistence.d.ts +2 -0
  6. package/dist/persistence.js +65 -0
  7. package/dist/priming.js +29 -0
  8. package/dist/runtime/inter-dialog-format.js +6 -8
  9. package/dist/runtime/reply-prompt-copy.d.ts +23 -0
  10. package/dist/runtime/reply-prompt-copy.js +82 -0
  11. package/dist/shared/utils/fbr.js +12 -8
  12. package/dist/shared/utils/inter-dialog-format.js +6 -4
  13. package/dist/tools/prompts/control/en/principles.md +1 -0
  14. package/dist/tools/prompts/control/en/tools.md +1 -0
  15. package/dist/tools/prompts/control/zh/principles.md +1 -0
  16. package/dist/tools/prompts/control/zh/tools.md +1 -0
  17. package/package.json +1 -1
  18. package/webapp/dist/assets/{_basePickBy-D8rqmgKo.js → _basePickBy-VvT_9kRm.js} +3 -3
  19. package/webapp/dist/assets/_basePickBy-VvT_9kRm.js.map +1 -0
  20. package/webapp/dist/assets/{_baseUniq-COclbJXV.js → _baseUniq-D9_-G6c9.js} +2 -2
  21. package/webapp/dist/assets/_baseUniq-D9_-G6c9.js.map +1 -0
  22. package/webapp/dist/assets/{arc-DbbMl69y.js → arc-BbofkRAx.js} +2 -2
  23. package/webapp/dist/assets/arc-BbofkRAx.js.map +1 -0
  24. package/webapp/dist/assets/{architectureDiagram-VXUJARFQ-Dh53pEmZ.js → architectureDiagram-2XIMDMQ5-Dn2yTFsM.js} +26 -8
  25. package/webapp/dist/assets/architectureDiagram-2XIMDMQ5-Dn2yTFsM.js.map +1 -0
  26. package/webapp/dist/assets/{blockDiagram-VD42YOAC-CU-pddsC.js → blockDiagram-WCTKOSBZ-BT13QjyS.js} +187 -170
  27. package/webapp/dist/assets/blockDiagram-WCTKOSBZ-BT13QjyS.js.map +1 -0
  28. package/webapp/dist/assets/{c4Diagram-YG6GDRKO-Cej7nk9x.js → c4Diagram-IC4MRINW-CDSHxATH.js} +4 -4
  29. package/webapp/dist/assets/c4Diagram-IC4MRINW-CDSHxATH.js.map +1 -0
  30. package/webapp/dist/assets/{channel-B7AvvURv.js → channel-frrfgRkc.js} +2 -2
  31. package/webapp/dist/assets/channel-frrfgRkc.js.map +1 -0
  32. package/webapp/dist/assets/{chunk-4BX2VUAB-B4LdZ0DB.js → chunk-4BX2VUAB-DfC5GXR7.js} +2 -2
  33. package/webapp/dist/assets/chunk-4BX2VUAB-DfC5GXR7.js.map +1 -0
  34. package/webapp/dist/assets/{chunk-55IACEB6-D05HthQ0.js → chunk-55IACEB6-DSJQfcDq.js} +2 -2
  35. package/webapp/dist/assets/chunk-55IACEB6-DSJQfcDq.js.map +1 -0
  36. package/webapp/dist/assets/{chunk-FMBD7UC4-drgtBbi-.js → chunk-FMBD7UC4-BWQBo1hf.js} +2 -2
  37. package/webapp/dist/assets/chunk-FMBD7UC4-BWQBo1hf.js.map +1 -0
  38. package/webapp/dist/assets/{chunk-TZMSLE5B-DQVYQMsw.js → chunk-JSJVCQXG-BzT1-gT-.js} +14 -6
  39. package/webapp/dist/assets/chunk-JSJVCQXG-BzT1-gT-.js.map +1 -0
  40. package/webapp/dist/assets/{chunk-QN33PNHL-DSh_12Lw.js → chunk-KX2RTZJC-Bn-AG8vE.js} +2 -2
  41. package/webapp/dist/assets/chunk-KX2RTZJC-Bn-AG8vE.js.map +1 -0
  42. package/webapp/dist/assets/{chunk-DI55MBZ5-CPYgS4kO.js → chunk-NQ4KR5QH-yj2oxjjl.js} +9 -7
  43. package/webapp/dist/assets/chunk-NQ4KR5QH-yj2oxjjl.js.map +1 -0
  44. package/webapp/dist/assets/{chunk-QZHKN3VN-Bwh2xJ3V.js → chunk-QZHKN3VN-CEKD-_TP.js} +2 -2
  45. package/webapp/dist/assets/chunk-QZHKN3VN-CEKD-_TP.js.map +1 -0
  46. package/webapp/dist/assets/{chunk-B4BG7PRW-Buh3-d6X.js → chunk-WL4C6EOR-Dp55vgWB.js} +171 -121
  47. package/webapp/dist/assets/chunk-WL4C6EOR-Dp55vgWB.js.map +1 -0
  48. package/webapp/dist/assets/{classDiagram-2ON5EDUG-B9z4_ohM.js → classDiagram-VBA2DB6C-D4N8D7Nj.js} +7 -6
  49. package/webapp/dist/assets/classDiagram-VBA2DB6C-D4N8D7Nj.js.map +1 -0
  50. package/webapp/dist/assets/{classDiagram-v2-WZHVMYZB-B9z4_ohM.js → classDiagram-v2-RAHNMMFH-D4N8D7Nj.js} +7 -6
  51. package/webapp/dist/assets/classDiagram-v2-RAHNMMFH-D4N8D7Nj.js.map +1 -0
  52. package/webapp/dist/assets/{clone-DsfnBpBy.js → clone-DQAXOciv.js} +2 -2
  53. package/webapp/dist/assets/clone-DQAXOciv.js.map +1 -0
  54. package/webapp/dist/assets/{cose-bilkent-S5V4N54A-RAHzgbSY.js → cose-bilkent-S5V4N54A-Dn19M4ir.js} +2 -2
  55. package/webapp/dist/assets/cose-bilkent-S5V4N54A-Dn19M4ir.js.map +1 -0
  56. package/webapp/dist/assets/cytoscape.esm-Bm8DJGmZ.js.map +1 -1
  57. package/webapp/dist/assets/{dagre-6UL2VRFP-BCxvui8W.js → dagre-KLK3FWXG-C92c6zqC.js} +7 -7
  58. package/webapp/dist/assets/dagre-KLK3FWXG-C92c6zqC.js.map +1 -0
  59. package/webapp/dist/assets/defaultLocale-B2RvLBDe.js.map +1 -1
  60. package/webapp/dist/assets/{diagram-PSM6KHXK-DaelxE18.js → diagram-E7M64L7V-Cjyz7QMT.js} +10 -10
  61. package/webapp/dist/assets/diagram-E7M64L7V-Cjyz7QMT.js.map +1 -0
  62. package/webapp/dist/assets/{diagram-QEK2KX5R-B3XqKCIU.js → diagram-IFDJBPK2-D8dhOH6X.js} +9 -8
  63. package/webapp/dist/assets/diagram-IFDJBPK2-D8dhOH6X.js.map +1 -0
  64. package/webapp/dist/assets/{diagram-S2PKOQOG-JjcVaWC4.js → diagram-P4PSJMXO-DWPLWoKQ.js} +8 -8
  65. package/webapp/dist/assets/diagram-P4PSJMXO-DWPLWoKQ.js.map +1 -0
  66. package/webapp/dist/assets/{erDiagram-Q2GNP2WA-Ck_xGzhS.js → erDiagram-INFDFZHY-Liu3Eiqm.js} +96 -75
  67. package/webapp/dist/assets/erDiagram-INFDFZHY-Liu3Eiqm.js.map +1 -0
  68. package/webapp/dist/assets/{flowDiagram-NV44I4VS-Dc3QeBR_.js → flowDiagram-PKNHOUZH-BcJzc7PE.js} +98 -81
  69. package/webapp/dist/assets/flowDiagram-PKNHOUZH-BcJzc7PE.js.map +1 -0
  70. package/webapp/dist/assets/{ganttDiagram-JELNMOA3-Dj9J02pB.js → ganttDiagram-A5KZAMGK-Dj17R6YC.js} +28 -3
  71. package/webapp/dist/assets/ganttDiagram-A5KZAMGK-Dj17R6YC.js.map +1 -0
  72. package/webapp/dist/assets/{gitGraphDiagram-V2S2FVAM-BSOUPRX2.js → gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js} +38 -46
  73. package/webapp/dist/assets/gitGraphDiagram-K3NZZRJ6-BAmgWHuB.js.map +1 -0
  74. package/webapp/dist/assets/graph-G5shJbct.js +782 -0
  75. package/webapp/dist/assets/graph-G5shJbct.js.map +1 -0
  76. package/webapp/dist/assets/{index--j4I1bH4.js → index-BEmR85VP.js} +1042 -1046
  77. package/webapp/dist/assets/{index--j4I1bH4.js.map → index-BEmR85VP.js.map} +1 -1
  78. package/webapp/dist/assets/{index-xvYYeHuy.css → index-YaxF76or.css} +1 -1
  79. package/webapp/dist/assets/{infoDiagram-HS3SLOUP-Qju54e_w.js → infoDiagram-LFFYTUFH-B55ho_w2.js} +7 -7
  80. package/webapp/dist/assets/infoDiagram-LFFYTUFH-B55ho_w2.js.map +1 -0
  81. package/webapp/dist/assets/init-ZxktEp_H.js.map +1 -1
  82. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-D0bkA7bh.js +966 -0
  83. package/webapp/dist/assets/ishikawaDiagram-PHBUUO56-D0bkA7bh.js.map +1 -0
  84. package/webapp/dist/assets/{journeyDiagram-XKPGCS4Q-DfAvzghf.js → journeyDiagram-4ABVD52K-COLepLN1.js} +5 -5
  85. package/webapp/dist/assets/journeyDiagram-4ABVD52K-COLepLN1.js.map +1 -0
  86. package/webapp/dist/assets/{kanban-definition-3W4ZIXB7-Df3u58UV.js → kanban-definition-K7BYSVSG-Cj4QwKRR.js} +5 -3
  87. package/webapp/dist/assets/kanban-definition-K7BYSVSG-Cj4QwKRR.js.map +1 -0
  88. package/webapp/dist/assets/{layout--dFmSw0H.js → layout-eWbM7aoc.js} +5 -5
  89. package/webapp/dist/assets/layout-eWbM7aoc.js.map +1 -0
  90. package/webapp/dist/assets/{linear-DI_19HgO.js → linear-D4qe60-s.js} +2 -2
  91. package/webapp/dist/assets/linear-D4qe60-s.js.map +1 -0
  92. package/webapp/dist/assets/{mindmap-definition-VGOIOE7T-BW926RvN.js → mindmap-definition-YRQLILUH-ICouzfF0.js} +7 -5
  93. package/webapp/dist/assets/mindmap-definition-YRQLILUH-ICouzfF0.js.map +1 -0
  94. package/webapp/dist/assets/ordinal-CxptdPJm.js.map +1 -1
  95. package/webapp/dist/assets/{pieDiagram-ADFJNKIX-qW-3IHqX.js → pieDiagram-SKSYHLDU-D4ZVmXtl.js} +8 -8
  96. package/webapp/dist/assets/pieDiagram-SKSYHLDU-D4ZVmXtl.js.map +1 -0
  97. package/webapp/dist/assets/{quadrantDiagram-AYHSOK5B-DoRb8nkA.js → quadrantDiagram-337W2JSQ-1ymuNQzm.js} +3 -3
  98. package/webapp/dist/assets/quadrantDiagram-337W2JSQ-1ymuNQzm.js.map +1 -0
  99. package/webapp/dist/assets/{requirementDiagram-UZGBJVZJ-tvnT5JGH.js → requirementDiagram-Z7DCOOCP-CTK5MmAU.js} +16 -6
  100. package/webapp/dist/assets/requirementDiagram-Z7DCOOCP-CTK5MmAU.js.map +1 -0
  101. package/webapp/dist/assets/{sankeyDiagram-TZEHDZUN-DMeDfRx_.js → sankeyDiagram-WA2Y5GQK-BYqSklsK.js} +2 -2
  102. package/webapp/dist/assets/sankeyDiagram-WA2Y5GQK-BYqSklsK.js.map +1 -0
  103. package/webapp/dist/assets/{sequenceDiagram-WL72ISMW-gNUPaT0r.js → sequenceDiagram-2WXFIKYE-BrXIJ8YR.js} +601 -201
  104. package/webapp/dist/assets/sequenceDiagram-2WXFIKYE-BrXIJ8YR.js.map +1 -0
  105. package/webapp/dist/assets/{stateDiagram-FKZM4ZOC-B4YpOvwB.js → stateDiagram-RAJIS63D-BO202mAM.js} +9 -9
  106. package/webapp/dist/assets/stateDiagram-RAJIS63D-BO202mAM.js.map +1 -0
  107. package/webapp/dist/assets/{stateDiagram-v2-4FDKWEC3-CI-aopDc.js → stateDiagram-v2-FVOUBMTO-hN3JtobY.js} +5 -5
  108. package/webapp/dist/assets/stateDiagram-v2-FVOUBMTO-hN3JtobY.js.map +1 -0
  109. package/webapp/dist/assets/{timeline-definition-IT6M3QCI-BgC6f78J.js → timeline-definition-YZTLITO2-BmxM2CZh.js} +3 -3
  110. package/webapp/dist/assets/timeline-definition-YZTLITO2-BmxM2CZh.js.map +1 -0
  111. package/webapp/dist/assets/{treemap-GDKQZRPO-54AYOMTA.js → treemap-KZPCXAKY-Btqy2bjG.js} +37 -24
  112. package/webapp/dist/assets/treemap-KZPCXAKY-Btqy2bjG.js.map +1 -0
  113. package/webapp/dist/assets/vennDiagram-LZ73GAT5-C5MQpm3y.js +2487 -0
  114. package/webapp/dist/assets/vennDiagram-LZ73GAT5-C5MQpm3y.js.map +1 -0
  115. package/webapp/dist/assets/{xychartDiagram-PRI3JC2R-qhDksKU4.js → xychartDiagram-JWTSCODW-DppnWtyj.js} +4 -4
  116. package/webapp/dist/assets/xychartDiagram-JWTSCODW-DppnWtyj.js.map +1 -0
  117. package/webapp/dist/index.html +2 -2
  118. package/webapp/dist/assets/_basePickBy-D8rqmgKo.js.map +0 -1
  119. package/webapp/dist/assets/_baseUniq-COclbJXV.js.map +0 -1
  120. package/webapp/dist/assets/arc-DbbMl69y.js.map +0 -1
  121. package/webapp/dist/assets/architectureDiagram-VXUJARFQ-Dh53pEmZ.js.map +0 -1
  122. package/webapp/dist/assets/blockDiagram-VD42YOAC-CU-pddsC.js.map +0 -1
  123. package/webapp/dist/assets/c4Diagram-YG6GDRKO-Cej7nk9x.js.map +0 -1
  124. package/webapp/dist/assets/channel-B7AvvURv.js.map +0 -1
  125. package/webapp/dist/assets/chunk-4BX2VUAB-B4LdZ0DB.js.map +0 -1
  126. package/webapp/dist/assets/chunk-55IACEB6-D05HthQ0.js.map +0 -1
  127. package/webapp/dist/assets/chunk-B4BG7PRW-Buh3-d6X.js.map +0 -1
  128. package/webapp/dist/assets/chunk-DI55MBZ5-CPYgS4kO.js.map +0 -1
  129. package/webapp/dist/assets/chunk-FMBD7UC4-drgtBbi-.js.map +0 -1
  130. package/webapp/dist/assets/chunk-QN33PNHL-DSh_12Lw.js.map +0 -1
  131. package/webapp/dist/assets/chunk-QZHKN3VN-Bwh2xJ3V.js.map +0 -1
  132. package/webapp/dist/assets/chunk-TZMSLE5B-DQVYQMsw.js.map +0 -1
  133. package/webapp/dist/assets/classDiagram-2ON5EDUG-B9z4_ohM.js.map +0 -1
  134. package/webapp/dist/assets/classDiagram-v2-WZHVMYZB-B9z4_ohM.js.map +0 -1
  135. package/webapp/dist/assets/clone-DsfnBpBy.js.map +0 -1
  136. package/webapp/dist/assets/cose-bilkent-S5V4N54A-RAHzgbSY.js.map +0 -1
  137. package/webapp/dist/assets/dagre-6UL2VRFP-BCxvui8W.js.map +0 -1
  138. package/webapp/dist/assets/diagram-PSM6KHXK-DaelxE18.js.map +0 -1
  139. package/webapp/dist/assets/diagram-QEK2KX5R-B3XqKCIU.js.map +0 -1
  140. package/webapp/dist/assets/diagram-S2PKOQOG-JjcVaWC4.js.map +0 -1
  141. package/webapp/dist/assets/erDiagram-Q2GNP2WA-Ck_xGzhS.js.map +0 -1
  142. package/webapp/dist/assets/flowDiagram-NV44I4VS-Dc3QeBR_.js.map +0 -1
  143. package/webapp/dist/assets/ganttDiagram-JELNMOA3-Dj9J02pB.js.map +0 -1
  144. package/webapp/dist/assets/gitGraphDiagram-V2S2FVAM-BSOUPRX2.js.map +0 -1
  145. package/webapp/dist/assets/graph-DorGFfiD.js +0 -425
  146. package/webapp/dist/assets/graph-DorGFfiD.js.map +0 -1
  147. package/webapp/dist/assets/infoDiagram-HS3SLOUP-Qju54e_w.js.map +0 -1
  148. package/webapp/dist/assets/journeyDiagram-XKPGCS4Q-DfAvzghf.js.map +0 -1
  149. package/webapp/dist/assets/kanban-definition-3W4ZIXB7-Df3u58UV.js.map +0 -1
  150. package/webapp/dist/assets/layout--dFmSw0H.js.map +0 -1
  151. package/webapp/dist/assets/linear-DI_19HgO.js.map +0 -1
  152. package/webapp/dist/assets/mindmap-definition-VGOIOE7T-BW926RvN.js.map +0 -1
  153. package/webapp/dist/assets/pieDiagram-ADFJNKIX-qW-3IHqX.js.map +0 -1
  154. package/webapp/dist/assets/quadrantDiagram-AYHSOK5B-DoRb8nkA.js.map +0 -1
  155. package/webapp/dist/assets/requirementDiagram-UZGBJVZJ-tvnT5JGH.js.map +0 -1
  156. package/webapp/dist/assets/sankeyDiagram-TZEHDZUN-DMeDfRx_.js.map +0 -1
  157. package/webapp/dist/assets/sequenceDiagram-WL72ISMW-gNUPaT0r.js.map +0 -1
  158. package/webapp/dist/assets/stateDiagram-FKZM4ZOC-B4YpOvwB.js.map +0 -1
  159. package/webapp/dist/assets/stateDiagram-v2-4FDKWEC3-CI-aopDc.js.map +0 -1
  160. package/webapp/dist/assets/timeline-definition-IT6M3QCI-BgC6f78J.js.map +0 -1
  161. package/webapp/dist/assets/treemap-GDKQZRPO-54AYOMTA.js.map +0 -1
  162. package/webapp/dist/assets/xychartDiagram-PRI3JC2R-qhDksKU4.js.map +0 -1
@@ -97,6 +97,7 @@ function isPersistedMessageRecord(record) {
97
97
  case 'agent_thought_record':
98
98
  case 'agent_words_record':
99
99
  case 'ui_only_markdown_record':
100
+ case 'runtime_guide_record':
100
101
  case 'human_text_record':
101
102
  case 'func_call_record':
102
103
  case 'tellask_special_call_record':
@@ -172,6 +173,7 @@ function rewriteRecordForFork(record, newRootId) {
172
173
  case 'agent_thought_record':
173
174
  case 'agent_words_record':
174
175
  case 'ui_only_markdown_record':
176
+ case 'runtime_guide_record':
175
177
  case 'func_call_record':
176
178
  case 'tellask_special_call_record':
177
179
  case 'web_search_call_record':
@@ -12,6 +12,7 @@ const log_1 = require("../../log");
12
12
  const load_1 = require("../../minds/load");
13
13
  const persistence_1 = require("../../persistence");
14
14
  const driver_messages_1 = require("../../runtime/driver-messages");
15
+ const reply_prompt_copy_1 = require("../../runtime/reply-prompt-copy");
15
16
  const work_language_1 = require("../../runtime/work-language");
16
17
  const tool_1 = require("../../tool");
17
18
  const taskdoc_1 = require("../../utils/taskdoc");
@@ -1368,6 +1369,19 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1368
1369
  if (replyGuidance.promptContent === undefined) {
1369
1370
  throw new Error(`kernel-driver reply guidance invariant violation: missing prompt content for dialog=${dlg.id.valueOf()} msgId=${currentPrompt.msgId}`);
1370
1371
  }
1372
+ const renderPromptAsRuntimeGuideBubble = origin === 'runtime' &&
1373
+ (0, reply_prompt_copy_1.isStandaloneRuntimeGuidePromptContent)(replyGuidance.promptContent);
1374
+ if (currentRuntimeGuideMsg) {
1375
+ await dlg.addChatMessages(currentRuntimeGuideMsg);
1376
+ await persistence_1.DialogPersistence.persistRuntimeGuide(dlg, currentRuntimeGuideMsg.content, dlg.activeGenSeq);
1377
+ (0, evt_registry_1.postDialogEvent)(dlg, {
1378
+ type: 'runtime_guide_evt',
1379
+ course: dlg.currentCourse,
1380
+ genseq: dlg.activeGenSeq,
1381
+ content: currentRuntimeGuideMsg.content,
1382
+ });
1383
+ currentRuntimeGuideMsg = undefined;
1384
+ }
1371
1385
  await dlg.addChatMessages({
1372
1386
  type: 'prompting_msg',
1373
1387
  role: 'user',
@@ -1377,20 +1391,30 @@ async function driveDialogStreamCore(dlg, callbacks, humanPrompt, driveOptions)
1377
1391
  content: replyGuidance.promptContent,
1378
1392
  });
1379
1393
  await dlg.persistUserMessage(replyGuidance.promptContent, currentPrompt.msgId, 'markdown', origin, persistedUserLanguageCode, q4hAnswerCallIds, replyGuidance.persistedTellaskReplyDirective);
1380
- // Emit the live user-side boundary event for UI generation bubbles.
1381
- // Without this, realtime turns can miss user content + divider (<hr/>),
1382
- // while replay (from persisted human_text_record) still looks correct.
1383
- (0, evt_registry_1.postDialogEvent)(dlg, {
1384
- type: 'end_of_user_saying_evt',
1385
- course: dlg.currentCourse,
1386
- genseq: dlg.activeGenSeq,
1387
- msgId: currentPrompt.msgId,
1388
- content: replyGuidance.promptContent,
1389
- grammar: 'markdown',
1390
- origin,
1391
- userLanguageCode: persistedUserLanguageCode,
1392
- q4hAnswerCallIds,
1393
- });
1394
+ if (renderPromptAsRuntimeGuideBubble) {
1395
+ (0, evt_registry_1.postDialogEvent)(dlg, {
1396
+ type: 'runtime_guide_evt',
1397
+ course: dlg.currentCourse,
1398
+ genseq: dlg.activeGenSeq,
1399
+ content: replyGuidance.promptContent,
1400
+ });
1401
+ }
1402
+ else {
1403
+ // Emit the live user-side boundary event for UI generation bubbles.
1404
+ // Without this, realtime turns can miss user content + divider (<hr/>),
1405
+ // while replay (from persisted human_text_record) still looks correct.
1406
+ (0, evt_registry_1.postDialogEvent)(dlg, {
1407
+ type: 'end_of_user_saying_evt',
1408
+ course: dlg.currentCourse,
1409
+ genseq: dlg.activeGenSeq,
1410
+ msgId: currentPrompt.msgId,
1411
+ content: replyGuidance.promptContent,
1412
+ grammar: 'markdown',
1413
+ origin,
1414
+ userLanguageCode: persistedUserLanguageCode,
1415
+ q4hAnswerCallIds,
1416
+ });
1417
+ }
1394
1418
  if (currentPromptFromFbrState && currentFbrState) {
1395
1419
  await persistDialogFbrState(dlg, (0, fbr_1.markFbrPromptDelivered)(currentFbrState));
1396
1420
  }
@@ -4,23 +4,22 @@ exports.resolvePromptReplyGuidance = resolvePromptReplyGuidance;
4
4
  exports.buildReplyObligationSuppressionGuide = buildReplyObligationSuppressionGuide;
5
5
  exports.buildReplyObligationReassertionPrompt = buildReplyObligationReassertionPrompt;
6
6
  const dialog_1 = require("../../dialog");
7
+ const reply_prompt_copy_1 = require("../../runtime/reply-prompt-copy");
7
8
  const work_language_1 = require("../../runtime/work-language");
8
9
  const tellask_special_1 = require("./tellask-special");
9
10
  const REPLY_TOOL_REMINDER_PREFIX_EN = '[Dominds replyTellask required]';
10
11
  const REPLY_TOOL_REMINDER_PREFIX_ZH = '[Dominds 必须调用回复工具]';
11
- const REPLY_REASSERTION_PREFIX_EN = '[Dominds long-line reminder]';
12
- const REPLY_REASSERTION_PREFIX_ZH = '[Dominds 长线提醒]';
13
12
  function buildPromptContentWithExactReplyToolName(args) {
14
13
  const isFbrSubdialog = args.dlg instanceof dialog_1.SubDialog && args.dlg.assignmentFromSup.callName === 'freshBootsReasoning';
15
14
  const noActivePrefix = args.language === 'zh'
16
15
  ? '[Dominds 当前无跨对话回复义务]'
17
16
  : '[Dominds no active inter-dialog reply]';
18
- const activePrefix = args.language === 'zh' ? '[Dominds 当前回复工具]' : '[Dominds active reply tool]';
17
+ const activePrefix = args.language === 'zh' ? reply_prompt_copy_1.ACTIVE_REPLY_TOOL_PREFIX_ZH : reply_prompt_copy_1.ACTIVE_REPLY_TOOL_PREFIX_EN;
19
18
  const reminderPrefixes = [
20
19
  REPLY_TOOL_REMINDER_PREFIX_EN,
21
20
  REPLY_TOOL_REMINDER_PREFIX_ZH,
22
- REPLY_REASSERTION_PREFIX_EN,
23
- REPLY_REASSERTION_PREFIX_ZH,
21
+ reply_prompt_copy_1.REPLY_REASSERTION_PREFIX_EN,
22
+ reply_prompt_copy_1.REPLY_REASSERTION_PREFIX_ZH,
24
23
  ];
25
24
  const directive = args.activeReplyDirective;
26
25
  if (!directive) {
@@ -53,17 +52,10 @@ function buildPromptContentWithExactReplyToolName(args) {
53
52
  if (reminderPrefixes.some((prefix) => args.prompt.content.startsWith(prefix))) {
54
53
  return args.prompt.content;
55
54
  }
56
- const note = args.language === 'zh'
57
- ? [
58
- activePrefix,
59
- `当前这轮若完成交付,精确应调用 \`${toolName}\`。`,
60
- '不要自己判断该选哪个 `reply*`;以上述函数名为准。',
61
- ].join('\n')
62
- : [
63
- activePrefix,
64
- `If this round is ready for final delivery, the exact reply tool is \`${toolName}\`.`,
65
- 'Do not decide among `reply*` variants by yourself; follow that exact function name.',
66
- ].join('\n');
55
+ const note = (0, reply_prompt_copy_1.buildActiveReplyToolNote)({
56
+ language: args.language,
57
+ toolName,
58
+ });
67
59
  return `${note}\n\n${args.prompt.content}`;
68
60
  }
69
61
  async function shouldSuppressInterDialogReplyGuidanceForUserInterjection(args) {
@@ -115,35 +107,11 @@ async function resolvePromptReplyGuidance(args) {
115
107
  };
116
108
  }
117
109
  function buildReplyObligationSuppressionGuide(args) {
118
- if (args.language === 'zh') {
119
- return [
120
- '[Dominds 先接住这轮]',
121
- '先把用户刚插进来的这轮正常接住,按眼前的话题继续回答。',
122
- '原来那条长线先放一放,别急着顺着它往下收口。',
123
- '等相关支线结果回来后,运行时会再提醒你把那条线接回去。',
124
- ].join('\n');
125
- }
126
- return [
127
- '[Dominds handle this interjection first]',
128
- "First, handle the user's interjection normally and keep answering the topic in front of you.",
129
- 'Set the earlier long-line thread aside for now; do not rush to close it yet.',
130
- 'When the related sideline result comes back, runtime will remind you to pick that thread up again.',
131
- ].join('\n');
110
+ return (0, reply_prompt_copy_1.buildReplyObligationSuppressionGuideText)(args.language);
132
111
  }
133
112
  function buildReplyObligationReassertionPrompt(args) {
134
- const toolName = args.directive.expectedReplyCallName;
135
- if (args.language === 'zh') {
136
- return [
137
- REPLY_REASSERTION_PREFIX_ZH,
138
- '刚才为了接住用户插话,先把那条长线放在一边了。',
139
- '现在把它重新记回心里,后续继续推进时别把它丢了。',
140
- `等走到需要收口的时候,按 \`${toolName}\` 来处理就行;这条提醒不是在催你立刻回复。`,
141
- ].join('\n');
142
- }
143
- return [
144
- REPLY_REASSERTION_PREFIX_EN,
145
- 'The user interjection was handled first, so that longer thread was set aside for a moment.',
146
- 'Bring it back into mind now and do not lose it as you continue.',
147
- `When the time comes to close that thread, use \`${toolName}\`; this reminder is not telling you to reply immediately.`,
148
- ].join('\n');
113
+ return (0, reply_prompt_copy_1.buildReplyObligationReassertionText)({
114
+ language: args.language,
115
+ toolName: args.directive.expectedReplyCallName,
116
+ });
149
117
  }
@@ -4,6 +4,7 @@ exports.formatTeamIntro = formatTeamIntro;
4
4
  exports.formatMcpToolsetRuntimeNote = formatMcpToolsetRuntimeNote;
5
5
  exports.buildSystemPrompt = buildSystemPrompt;
6
6
  const inter_dialog_format_1 = require("../runtime/inter-dialog-format");
7
+ const reply_prompt_copy_1 = require("../runtime/reply-prompt-copy");
7
8
  function formatTeamIntro(team, selfAgentId, language) {
8
9
  const callSignLabel = language === 'zh' ? '呼号' : 'Call Sign';
9
10
  const selfSuffix = language === 'zh' ? '(本人)' : ' (self)';
@@ -167,7 +168,7 @@ function buildTellaskReplyMarkerScopePolicy(language, dialogScope) {
167
168
  '- 若你在正文中给下游写“回贴格式”,必须写明“Dominds 自动注入标记,禁止手写”;不得要求下游手写任何标记。',
168
169
  '- `tellaskBack` 只允许用于回问/澄清/阻塞说明;禁止用 `tellaskBack` 发送最终结果。',
169
170
  '- 当前支线未完成/不确定/阻塞/需要澄清时:必须调用 `tellaskBack({ tellaskContent: "..." })`,不得发普通文本中间汇报。',
170
- '- 当前支线已完成并能给出最终交付时:只服从运行时程序化给出的当前指令。若运行时点名了精确 reply 函数,就调用那个函数;不要自行改选其他 `reply*` 变体,也不要再走 `tellaskBack`。',
171
+ `- ${(0, reply_prompt_copy_1.buildSidelineCompletionRule)('zh')}`,
171
172
  `- 仅当运行时当前明确点名了某个精确 reply 函数,且你通过那个函数回复时,运行时才会把该回复投递给上游并标注 ${runtimeMarkers.finalCompleted}。`,
172
173
  '- 若运行时当前明确提示“没有待完成的跨对话回复义务”,说明这轮不是待你收口的跨对话回复义务;不要重复调用 `reply*`。',
173
174
  ],
@@ -176,7 +177,7 @@ function buildTellaskReplyMarkerScopePolicy(language, dialogScope) {
176
177
  '- If you define a reply format for downstream, you must state “Dominds auto-injects markers; do not hand-write them”; do not require downstream to hand-write any marker.',
177
178
  '- `tellaskBack` is allowed only for ask-back / clarification / blocked-state reporting; do not use `tellaskBack` to send final results.',
178
179
  '- If the current sideline is unfinished, uncertain, blocked, or needs clarification: you must call `tellaskBack({ tellaskContent: "..." })` instead of posting a plain-text progress update.',
179
- '- If the current sideline is complete and can deliver the final result: follow only the current programmatic runtime instruction. If runtime names an exact reply function, call that function; do not switch among `reply*` variants yourself, and do not use `tellaskBack` for final delivery.',
180
+ `- ${(0, reply_prompt_copy_1.buildSidelineCompletionRule)('en')}`,
180
181
  `- Runtime marks ${runtimeMarkers.finalCompleted} and delivers upstream only when runtime currently names an exact reply function and you reply through that named function.`,
181
182
  '- If runtime currently tells you there is no active inter-dialog reply obligation, then this turn is not awaiting another inter-dialog closure from you; do not call `reply*` again.',
182
183
  ],
@@ -171,6 +171,7 @@ export declare class DiskFileDialogStore extends DialogStore {
171
171
  */
172
172
  persistAgentMessage(dialog: Dialog, content: string, genseq: number, type: 'thinking_msg' | 'saying_msg', provider_data?: ProviderData, reasoning?: ReasoningPayload): Promise<void>;
173
173
  persistUiOnlyMarkdown(dialog: Dialog, content: string, genseq: number): Promise<void>;
174
+ persistRuntimeGuide(dialog: Dialog, content: string, genseq: number): Promise<void>;
174
175
  /**
175
176
  * Persist a function call to storage
176
177
  */
@@ -373,6 +374,7 @@ export declare class DialogPersistence {
373
374
  * Append event to course JSONL file (append-only pattern)
374
375
  */
375
376
  static appendEvent(dialogId: DialogID, course: number, event: PersistedDialogRecord, status?: 'running' | 'completed' | 'archived'): Promise<void>;
377
+ static persistRuntimeGuide(dialog: Dialog, content: string, genseq: number): Promise<void>;
376
378
  /**
377
379
  * Capture the current byte offset of a course JSONL file.
378
380
  * Used as rollback checkpoint before a streaming LLM attempt.
@@ -50,6 +50,7 @@ const dialog_1 = require("./dialog");
50
50
  const evt_registry_1 = require("./evt-registry");
51
51
  const log_1 = require("./log");
52
52
  const async_fifo_mutex_1 = require("./runtime/async-fifo-mutex");
53
+ const reply_prompt_copy_1 = require("./runtime/reply-prompt-copy");
53
54
  const work_language_1 = require("./runtime/work-language");
54
55
  const registry_1 = require("./tools/registry");
55
56
  function getErrorCode(error) {
@@ -1719,6 +1720,16 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
1719
1720
  };
1720
1721
  await this.appendEvent(dialog, course, ev);
1721
1722
  }
1723
+ async persistRuntimeGuide(dialog, content, genseq) {
1724
+ const course = dialog.activeGenCourseOrUndefined ?? dialog.currentCourse;
1725
+ const ev = {
1726
+ ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
1727
+ type: 'runtime_guide_record',
1728
+ genseq,
1729
+ content: content || '',
1730
+ };
1731
+ await this.appendEvent(dialog, course, ev);
1732
+ }
1722
1733
  /**
1723
1734
  * Persist a function call to storage
1724
1735
  */
@@ -2024,6 +2035,23 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2024
2035
  const grammar = 'markdown';
2025
2036
  const origin = event.origin === 'diligence_push' || event.origin === 'runtime' ? event.origin : 'user';
2026
2037
  const userLanguageCode = event.userLanguageCode;
2038
+ const renderAsStandaloneRuntimeGuide = origin === 'runtime' && (0, reply_prompt_copy_1.isStandaloneRuntimeGuidePromptContent)(content);
2039
+ if (renderAsStandaloneRuntimeGuide) {
2040
+ if (ws.readyState === 1) {
2041
+ const runtimeGuideEvt = {
2042
+ type: 'runtime_guide_evt',
2043
+ course,
2044
+ genseq,
2045
+ content,
2046
+ };
2047
+ ws.send(JSON.stringify({
2048
+ ...runtimeGuideEvt,
2049
+ dialog: { selfId: dialog.id.selfId, rootId: dialog.id.rootId },
2050
+ timestamp: event.ts,
2051
+ }));
2052
+ }
2053
+ break;
2054
+ }
2027
2055
  if (content) {
2028
2056
  if (ws.readyState === 1) {
2029
2057
  ws.send(JSON.stringify({
@@ -2209,6 +2237,25 @@ class DiskFileDialogStore extends dialog_1.DialogStore {
2209
2237
  }
2210
2238
  break;
2211
2239
  }
2240
+ case 'runtime_guide_record': {
2241
+ const content = event.content || '';
2242
+ if (!content.trim())
2243
+ break;
2244
+ if (ws.readyState === 1) {
2245
+ const runtimeGuideEvt = {
2246
+ type: 'runtime_guide_evt',
2247
+ course,
2248
+ genseq: event.genseq,
2249
+ content,
2250
+ };
2251
+ ws.send(JSON.stringify({
2252
+ ...runtimeGuideEvt,
2253
+ dialog: { selfId: dialog.id.selfId, rootId: dialog.id.rootId },
2254
+ timestamp: event.ts,
2255
+ }));
2256
+ }
2257
+ break;
2258
+ }
2212
2259
  case 'ui_only_markdown_record': {
2213
2260
  const content = event.content || '';
2214
2261
  if (!content.trim())
@@ -3249,6 +3296,16 @@ class DialogPersistence {
3249
3296
  release();
3250
3297
  }
3251
3298
  }
3299
+ static async persistRuntimeGuide(dialog, content, genseq) {
3300
+ const course = dialog.activeGenCourseOrUndefined ?? dialog.currentCourse;
3301
+ const ev = {
3302
+ ts: (0, time_1.formatUnifiedTimestamp)(new Date()),
3303
+ type: 'runtime_guide_record',
3304
+ genseq,
3305
+ content,
3306
+ };
3307
+ await this.appendEvent(dialog.id, course, ev, dialog.status);
3308
+ }
3252
3309
  /**
3253
3310
  * Capture the current byte offset of a course JSONL file.
3254
3311
  * Used as rollback checkpoint before a streaming LLM attempt.
@@ -4915,6 +4972,14 @@ class DialogPersistence {
4915
4972
  });
4916
4973
  break;
4917
4974
  }
4975
+ case 'runtime_guide_record': {
4976
+ messages.push({
4977
+ type: 'transient_guide_msg',
4978
+ role: 'assistant',
4979
+ content: event.content,
4980
+ });
4981
+ break;
4982
+ }
4918
4983
  case 'human_text_record': {
4919
4984
  // Convert human text to prompting message
4920
4985
  messages.push({
package/dist/priming.js CHANGED
@@ -223,6 +223,7 @@ function isPrimingRecordType(raw) {
223
223
  return (raw === 'agent_thought_record' ||
224
224
  raw === 'agent_words_record' ||
225
225
  raw === 'ui_only_markdown_record' ||
226
+ raw === 'runtime_guide_record' ||
226
227
  raw === 'func_call_record' ||
227
228
  raw === 'tellask_special_call_record' ||
228
229
  raw === 'web_search_call_record' ||
@@ -243,6 +244,7 @@ function getRecordMarkdownTextField(type) {
243
244
  case 'agent_thought_record':
244
245
  case 'agent_words_record':
245
246
  case 'ui_only_markdown_record':
247
+ case 'runtime_guide_record':
246
248
  case 'human_text_record':
247
249
  case 'func_result_record':
248
250
  case 'tellask_special_call_record':
@@ -620,6 +622,18 @@ function normalizePrimingRecordFromJson(raw) {
620
622
  const { ts: _unusedTs, ...withoutTs } = record;
621
623
  return withoutTs;
622
624
  }
625
+ case 'runtime_guide_record': {
626
+ const record = {
627
+ ts: '',
628
+ type,
629
+ genseq: expectIntegerField(raw, 'genseq', context),
630
+ content: expectStringField(raw, 'content', context, true),
631
+ };
632
+ if (sourceTag)
633
+ record.sourceTag = sourceTag;
634
+ const { ts: _unusedTs, ...withoutTs } = record;
635
+ return withoutTs;
636
+ }
623
637
  case 'func_call_record': {
624
638
  const argumentsRaw = raw['arguments'];
625
639
  if (!isRecord(argumentsRaw)) {
@@ -1562,6 +1576,7 @@ function remapRecordGenseq(record, mapGenseq) {
1562
1576
  case 'agent_thought_record':
1563
1577
  case 'agent_words_record':
1564
1578
  case 'ui_only_markdown_record':
1579
+ case 'runtime_guide_record':
1565
1580
  case 'func_call_record':
1566
1581
  case 'tellask_special_call_record':
1567
1582
  case 'web_search_call_record':
@@ -1629,6 +1644,7 @@ function addPrimingSourceTag(record) {
1629
1644
  case 'agent_thought_record':
1630
1645
  case 'agent_words_record':
1631
1646
  case 'ui_only_markdown_record':
1647
+ case 'runtime_guide_record':
1632
1648
  case 'func_call_record':
1633
1649
  case 'tellask_special_call_record':
1634
1650
  case 'web_search_call_record':
@@ -1655,6 +1671,7 @@ function withTimestamp(record, ts) {
1655
1671
  case 'agent_thought_record':
1656
1672
  case 'agent_words_record':
1657
1673
  case 'ui_only_markdown_record':
1674
+ case 'runtime_guide_record':
1658
1675
  case 'func_call_record':
1659
1676
  case 'tellask_special_call_record':
1660
1677
  case 'web_search_call_record':
@@ -1701,6 +1718,12 @@ function primingRecordToChatMessage(record) {
1701
1718
  genseq: record.genseq,
1702
1719
  content: record.content,
1703
1720
  };
1721
+ case 'runtime_guide_record':
1722
+ return {
1723
+ type: 'transient_guide_msg',
1724
+ role: 'assistant',
1725
+ content: record.content,
1726
+ };
1704
1727
  case 'human_text_record':
1705
1728
  return {
1706
1729
  type: 'prompting_msg',
@@ -1926,6 +1949,11 @@ function formatScriptMarkdown(args) {
1926
1949
  blockBody = record.content;
1927
1950
  break;
1928
1951
  }
1952
+ case 'runtime_guide_record': {
1953
+ blockMeta['genseq'] = record.genseq;
1954
+ blockBody = record.content;
1955
+ break;
1956
+ }
1929
1957
  case 'web_search_call_record': {
1930
1958
  blockMeta['genseq'] = record.genseq;
1931
1959
  blockMeta['phase'] = record.phase;
@@ -2161,6 +2189,7 @@ function stripTimestampFromRecord(event) {
2161
2189
  case 'agent_thought_record':
2162
2190
  case 'agent_words_record':
2163
2191
  case 'ui_only_markdown_record':
2192
+ case 'runtime_guide_record':
2164
2193
  case 'func_call_record':
2165
2194
  case 'tellask_special_call_record':
2166
2195
  case 'web_search_call_record':
@@ -23,6 +23,7 @@ exports.formatTellaskReplacementNoticeContent = formatTellaskReplacementNoticeCo
23
23
  exports.formatTellaskCarryoverResultContent = formatTellaskCarryoverResultContent;
24
24
  const driver_messages_1 = require("./driver-messages");
25
25
  const markdown_format_1 = require("./markdown-format");
26
+ const reply_prompt_copy_1 = require("./reply-prompt-copy");
26
27
  function getRuntimeTransferMarkers(language) {
27
28
  if (language === 'zh') {
28
29
  return {
@@ -79,14 +80,11 @@ function buildSubdialogRoleHeader(input) {
79
80
  }
80
81
  const requesterId = requireNonEmpty(input.fromAgentId, 'fromAgentId');
81
82
  const expectedReplyTool = getExpectedReplyToolName(input.callName);
82
- if (!expectedReplyTool) {
83
- return input.language === 'zh'
84
- ? `你是当前被诉请者对话(tellaskee dialog)的主理人;诉请者对话(tellasker dialog)为 @${requesterId}(当前发起本次诉请)。只有在需要回问上游时才调用 \`tellaskBack\`。`
85
- : `You are the responder (tellaskee dialog) for this dialog; the tellasker dialog is @${requesterId} (the current caller). Call \`tellaskBack\` only when you need to ask back upstream.`;
86
- }
87
- return input.language === 'zh'
88
- ? `你是当前被诉请者对话(tellaskee dialog)的主理人;诉请者对话(tellasker dialog)为 @${requesterId}(当前发起本次诉请)。本轮精确完成回复函数名是 \`${expectedReplyTool}\`;不要自行改选其他 \`reply*\` 变体。完成任务时必须调用 \`${expectedReplyTool}\`;只有在需要回问上游时才调用 \`tellaskBack\`。`
89
- : `You are the responder (tellaskee dialog) for this dialog; the tellasker dialog is @${requesterId} (the current caller). The exact completion reply function for this round is \`${expectedReplyTool}\`; do not switch to another \`reply*\` variant by yourself. When the task is complete, you must call \`${expectedReplyTool}\`; call \`tellaskBack\` only when you need to ask back upstream.`;
83
+ return (0, reply_prompt_copy_1.buildSubdialogRoleHeaderCopy)({
84
+ language: input.language,
85
+ requesterId,
86
+ expectedReplyTool,
87
+ });
90
88
  }
91
89
  function requireMentionLine(mentionList) {
92
90
  const mentionLine = mentionList
@@ -0,0 +1,23 @@
1
+ import type { LanguageCode } from '@longrun-ai/kernel/types/language';
2
+ export declare const ACTIVE_REPLY_TOOL_PREFIX_EN = "[Dominds active reply tool]";
3
+ export declare const ACTIVE_REPLY_TOOL_PREFIX_ZH = "[Dominds \u5F53\u524D\u56DE\u590D\u5DE5\u5177]";
4
+ export declare const REPLY_REASSERTION_PREFIX_EN = "[Dominds long-line reminder]";
5
+ export declare const REPLY_REASSERTION_PREFIX_ZH = "[Dominds \u957F\u7EBF\u63D0\u9192]";
6
+ export declare const REPLY_SUPPRESSION_PREFIX_EN = "[Dominds handle this interjection first]";
7
+ export declare const REPLY_SUPPRESSION_PREFIX_ZH = "[Dominds \u5148\u63A5\u4F4F\u8FD9\u8F6E]";
8
+ export declare function buildActiveReplyToolNote(args: {
9
+ language: LanguageCode;
10
+ toolName: 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack';
11
+ }): string;
12
+ export declare function buildSidelineCompletionRule(language: LanguageCode): string;
13
+ export declare function buildSubdialogRoleHeaderCopy(args: {
14
+ language: LanguageCode;
15
+ requesterId: string;
16
+ expectedReplyTool?: 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack' | undefined;
17
+ }): string;
18
+ export declare function buildReplyObligationSuppressionGuideText(language: LanguageCode): string;
19
+ export declare function buildReplyObligationReassertionText(args: {
20
+ language: LanguageCode;
21
+ toolName: 'replyTellask' | 'replyTellaskSessionless' | 'replyTellaskBack';
22
+ }): string;
23
+ export declare function isStandaloneRuntimeGuidePromptContent(content: string): boolean;
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REPLY_SUPPRESSION_PREFIX_ZH = exports.REPLY_SUPPRESSION_PREFIX_EN = exports.REPLY_REASSERTION_PREFIX_ZH = exports.REPLY_REASSERTION_PREFIX_EN = exports.ACTIVE_REPLY_TOOL_PREFIX_ZH = exports.ACTIVE_REPLY_TOOL_PREFIX_EN = void 0;
4
+ exports.buildActiveReplyToolNote = buildActiveReplyToolNote;
5
+ exports.buildSidelineCompletionRule = buildSidelineCompletionRule;
6
+ exports.buildSubdialogRoleHeaderCopy = buildSubdialogRoleHeaderCopy;
7
+ exports.buildReplyObligationSuppressionGuideText = buildReplyObligationSuppressionGuideText;
8
+ exports.buildReplyObligationReassertionText = buildReplyObligationReassertionText;
9
+ exports.isStandaloneRuntimeGuidePromptContent = isStandaloneRuntimeGuidePromptContent;
10
+ exports.ACTIVE_REPLY_TOOL_PREFIX_EN = '[Dominds active reply tool]';
11
+ exports.ACTIVE_REPLY_TOOL_PREFIX_ZH = '[Dominds 当前回复工具]';
12
+ exports.REPLY_REASSERTION_PREFIX_EN = '[Dominds long-line reminder]';
13
+ exports.REPLY_REASSERTION_PREFIX_ZH = '[Dominds 长线提醒]';
14
+ exports.REPLY_SUPPRESSION_PREFIX_EN = '[Dominds handle this interjection first]';
15
+ exports.REPLY_SUPPRESSION_PREFIX_ZH = '[Dominds 先接住这轮]';
16
+ function buildActiveReplyToolNote(args) {
17
+ if (args.language === 'zh') {
18
+ return [
19
+ exports.ACTIVE_REPLY_TOOL_PREFIX_ZH,
20
+ '先专注处理眼前这轮任务,不要被 `reply*` 选择分心。',
21
+ `若这轮最终需要对上游完成交付,精确调用 \`${args.toolName}\`;不要改选其他 \`reply*\`,也不要提前收口。`,
22
+ ].join('\n');
23
+ }
24
+ return [
25
+ exports.ACTIVE_REPLY_TOOL_PREFIX_EN,
26
+ 'Stay focused on the task in front of you for this turn; do not get distracted by choosing among `reply*` variants.',
27
+ `If this turn truly reaches final delivery back upstream, call \`${args.toolName}\` exactly; do not switch to another \`reply*\` variant or close early.`,
28
+ ].join('\n');
29
+ }
30
+ function buildSidelineCompletionRule(language) {
31
+ return language === 'zh'
32
+ ? '当前支线已完成并能给出最终交付时:先专注把当前任务做对;若运行时点名了精确 reply 函数,就只在最终交付收口时调用那个函数,不要改选其他 `reply*`,也不要再走 `tellaskBack`。'
33
+ : 'If the current sideline is complete and can deliver the final result: stay focused on finishing the actual task first; if runtime names an exact reply function, call that function only at final upstream delivery, do not switch among `reply*` variants, and do not use `tellaskBack` for final delivery.';
34
+ }
35
+ function buildSubdialogRoleHeaderCopy(args) {
36
+ if (args.expectedReplyTool === undefined) {
37
+ return args.language === 'zh'
38
+ ? `你是当前被诉请者对话(tellaskee dialog)的主理人;诉请者对话(tellasker dialog)为 @${args.requesterId}(当前发起本次诉请)。只有在需要回问上游时才调用 \`tellaskBack\`。`
39
+ : `You are the responder (tellaskee dialog) for this dialog; the tellasker dialog is @${args.requesterId} (the current caller). Call \`tellaskBack\` only when you need to ask back upstream.`;
40
+ }
41
+ return args.language === 'zh'
42
+ ? `你是当前被诉请者对话(tellaskee dialog)的主理人;诉请者对话(tellasker dialog)为 @${args.requesterId}(当前发起本次诉请)。先把当前任务做对;若本轮最终需要对上游完成交付,必须精确调用 \`${args.expectedReplyTool}\` 收口,不要改选其他 \`reply*\`。只有在需要回问上游时才调用 \`tellaskBack\`。`
43
+ : `You are the responder (tellaskee dialog) for this dialog; the tellasker dialog is @${args.requesterId} (the current caller). First, do the current task correctly; if this round ultimately needs final delivery back upstream, you must close with \`${args.expectedReplyTool}\` exactly and must not switch to another \`reply*\` variant. Call \`tellaskBack\` only when you need to ask back upstream.`;
44
+ }
45
+ function buildReplyObligationSuppressionGuideText(language) {
46
+ if (language === 'zh') {
47
+ return [
48
+ exports.REPLY_SUPPRESSION_PREFIX_ZH,
49
+ '先把用户刚插进来的这轮正常接住,按眼前的话题继续回答。',
50
+ '原来那条长线先放一放,别急着顺着它往下收口。',
51
+ '等相关支线结果回来后,运行时会再提醒你把那条线接回去。',
52
+ ].join('\n');
53
+ }
54
+ return [
55
+ exports.REPLY_SUPPRESSION_PREFIX_EN,
56
+ "First, handle the user's interjection normally and keep answering the topic in front of you.",
57
+ 'Set the earlier long-line thread aside for now; do not rush to close it yet.',
58
+ 'When the related sideline result comes back, runtime will remind you to pick that thread up again.',
59
+ ].join('\n');
60
+ }
61
+ function buildReplyObligationReassertionText(args) {
62
+ if (args.language === 'zh') {
63
+ return [
64
+ exports.REPLY_REASSERTION_PREFIX_ZH,
65
+ '刚才那轮用户插话已经先接住了,现在继续原来那条长线任务本身。',
66
+ '继续做该做的事,别只盯着 `reply*` 工具名。',
67
+ `真走到需要对上游完成交付的时候,再精确调用 \`${args.toolName}\`;这条提醒不是在催你立刻收口。`,
68
+ ].join('\n');
69
+ }
70
+ return [
71
+ exports.REPLY_REASSERTION_PREFIX_EN,
72
+ 'The user interjection has already been handled first; now continue the original longer-running task itself.',
73
+ 'Keep doing the actual work instead of fixating on the `reply*` tool name.',
74
+ `Only when that work truly reaches final delivery upstream should you call \`${args.toolName}\`; this reminder is not asking you to close immediately.`,
75
+ ].join('\n');
76
+ }
77
+ function isStandaloneRuntimeGuidePromptContent(content) {
78
+ return (content.startsWith(exports.REPLY_REASSERTION_PREFIX_ZH) ||
79
+ content.startsWith(exports.REPLY_REASSERTION_PREFIX_EN) ||
80
+ content.startsWith(exports.REPLY_SUPPRESSION_PREFIX_ZH) ||
81
+ content.startsWith(exports.REPLY_SUPPRESSION_PREFIX_EN));
82
+ }
@@ -15,20 +15,24 @@ function appendDistinctPerspectiveFbrBody(input) {
15
15
  if (input.language === 'zh') {
16
16
  return [
17
17
  iteration === 1
18
- ? `【第 ${iteration}/${total} 轮 FBR】请开启首轮独立推理角度。`
19
- : `【第 ${iteration}/${total} 轮 FBR】请切换到与前 ${iteration - 1} 轮不同的推理角度。`,
18
+ ? `【第 ${iteration}/${total} 轮 FBR 发散】请开启首轮独立推理角度。`
19
+ : `【第 ${iteration}/${total} 轮 FBR 发散】请切换到与前 ${iteration - 1} 轮不同的推理角度。`,
20
+ '这一阶段要对反直觉、离谱、少数派、最后可能被淘汰的想法保持开放,把它们先当作待检验候选,而不是急着压成共识。',
20
21
  isFinalRound
21
- ? '最后一轮也不能复述前文结论,必须补充新的切入点与新增证据。'
22
- : '要求:不复述上一轮已结论文本,补充本轮独立切入点与未覆盖证据。',
22
+ ? '最后一轮发散也不能复述前文结论;必须继续补充新的切入点、额外证据或新的解释路径。'
23
+ : '要求:不复述前几轮已结论文本;补充本轮独立切入点、未覆盖证据或新的解释路径。',
24
+ '此时不要急于收敛或下最终结论。',
23
25
  ].join('\n');
24
26
  }
25
27
  return [
26
28
  iteration === 1
27
- ? `[FBR round ${iteration}/${total}] start with a first independent reasoning angle.`
28
- : `[FBR round ${iteration}/${total}] switch to an angle different from the previous ${iteration - 1} rounds.`,
29
+ ? `[FBR divergence round ${iteration}/${total}] start with a first independent reasoning angle.`
30
+ : `[FBR divergence round ${iteration}/${total}] switch to an angle different from the previous ${iteration - 1} rounds.`,
31
+ 'In this phase, stay open to counterintuitive, wild, minority, or eventually-discarded ideas; treat them as candidates to test instead of forcing early consensus.',
29
32
  isFinalRound
30
- ? 'The final round must also avoid repeating prior-round conclusions and provide new angles and additional evidence.'
31
- : 'Requirement: do not repeat prior-round conclusion text; add a distinct independent approach and missing evidence.',
33
+ ? 'The final divergence round must still avoid repeating prior-round conclusions and add new angles, extra evidence, or alternative explanations.'
34
+ : 'Requirement: do not repeat prior-round conclusion text; add a distinct approach, missing evidence, or a genuinely new explanatory path.',
35
+ 'Do not converge or produce a final conclusion yet.',
32
36
  ].join('\n');
33
37
  })();
34
38
  if (iteration <= 1) {
@@ -111,9 +111,10 @@ function formatAssignmentFromSupdialog(input) {
111
111
  '# 扪心自问(FBR)自诉请',
112
112
  '',
113
113
  '- 约束:这是一个扪心自问(self tellask)支线对话;请独立推理与总结。',
114
- '- 系统规则:本支线对话为函数禁用模式,不允许任何函数调用(包括 `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`)。',
114
+ '- 系统规则:当前仍处于 FBR 的无工具阶段;这一阶段不允许任何函数调用。',
115
+ '- 后续只有在完成既定的发散轮与收敛轮之后,运行时才会开放两个“结论函数”供你正式收口。',
115
116
  '- 协议:回贴标记由 Dominds 运行时自动注入,禁止手写。',
116
- '- 系统提示:不要受诉请正文中的定调、分析方向或维度清单约束;请聚焦总体目标,自由发挥并开辟新的分析切入角度。',
117
+ '- 系统提示:不要受诉请正文中的定调、分析方向或维度清单约束;请聚焦总体目标,自由发挥并开辟新的分析切入角度,对离谱想法保持开放,但不要过早收敛。',
117
118
  '',
118
119
  '---',
119
120
  ].join('\n')
@@ -121,9 +122,10 @@ function formatAssignmentFromSupdialog(input) {
121
122
  '# Fresh Boots Reasoning (FBR) request',
122
123
  '',
123
124
  '- Constraint: this is a self-tellask FBR sideline dialog; reason independently and produce conclusions.',
124
- '- System rule: this sideline runs with function-calls disabled; do not emit any function call (including `tellaskBack` / `tellask` / `tellaskSessionless` / `askHuman`).',
125
+ '- System rule: this FBR stage is still tool-less; do not emit any function call in this stage.',
126
+ '- Only after the planned divergence and convergence rounds are complete will runtime expose the two conclusion functions for formal closure.',
125
127
  '- Protocol: reply markers are auto-injected by Dominds runtime; do not hand-write markers.',
126
- '- System prompt: do not be constrained by framing, analysis directions, or dimension checklists embedded in the tellask body; stay focused on the overall objective and open new analytical entry points freely.',
128
+ '- System prompt: do not be constrained by framing, analysis directions, or dimension checklists embedded in the tellask body; stay focused on the overall objective, open new analytical entry points freely, stay open to wild ideas, and do not converge too early.',
127
129
  '',
128
130
  '---',
129
131
  ].join('\n');
@@ -82,6 +82,7 @@ Taskdoc is a **task contract** defining goals, constraints, and progress.
82
82
 
83
83
  ### Low-Burden Rule
84
84
 
85
+ - Focus on doing the current task correctly first; use `reply*` only when final upstream delivery is actually ready
85
86
  - Do not memorize reply variants by yourself; follow the current assignment header and the function currently exposed by runtime
86
87
  - `reply*` tool descriptions are intentionally minimal and spec-like; use this manual's principles / scenarios for situational guidance
87
88
  - If runtime exposes only one `reply*`, that is the only correct completion path for the current state