dominds 0.7.6 → 0.8.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 (155) hide show
  1. package/README.md +2 -2
  2. package/README.zh.md +2 -2
  3. package/dist/agent-priming.js +169 -200
  4. package/dist/cli/read.js +2 -7
  5. package/dist/dialog-factory.js +6 -4
  6. package/dist/dialog-instance-registry.js +2 -2
  7. package/dist/dialog.js +99 -91
  8. package/dist/docs/dialog-persistence.md +2 -2
  9. package/dist/docs/dialog-persistence.zh.md +2 -2
  10. package/dist/docs/dialog-system.md +86 -90
  11. package/dist/docs/dialog-system.zh.md +82 -83
  12. package/dist/docs/diligence-push.md +2 -2
  13. package/dist/docs/diligence-push.zh.md +2 -2
  14. package/dist/docs/dominds-agent-priming.md +11 -11
  15. package/dist/docs/dominds-agent-priming.zh.md +9 -9
  16. package/dist/docs/dominds-terminology.md +34 -34
  17. package/dist/docs/fbr-implementation.md +4 -4
  18. package/dist/docs/fbr-implementation.zh.md +4 -4
  19. package/dist/docs/fbr.md +31 -53
  20. package/dist/docs/fbr.zh.md +30 -48
  21. package/dist/docs/mottos.md +2 -3
  22. package/dist/docs/mottos.zh.md +2 -2
  23. package/dist/docs/q4h.md +6 -6
  24. package/dist/docs/q4h.zh.md +6 -6
  25. package/dist/docs/tellask-collab.md +13 -13
  26. package/dist/docs/tellask-collab.zh.md +18 -18
  27. package/dist/llm/driver-entry.js +9 -33
  28. package/dist/llm/driver-v2/core.js +413 -111
  29. package/dist/llm/driver-v2/index.js +5 -0
  30. package/dist/llm/driver-v2/orchestrator.js +4 -3
  31. package/dist/llm/driver-v2/policy.js +17 -23
  32. package/dist/llm/driver-v2/restore-dialog-hierarchy.js +73 -0
  33. package/dist/llm/driver-v2/round.js +18 -7
  34. package/dist/llm/driver-v2/runtime-utils.js +3 -5
  35. package/dist/llm/driver-v2/saying-events.js +4 -42
  36. package/dist/llm/driver-v2/supdialog-response.js +110 -23
  37. package/dist/llm/driver-v2/tellask-bridge.js +560 -458
  38. package/dist/mcp/sdk-client.js +1 -1
  39. package/dist/mcp/server-runtime.js +1 -1
  40. package/dist/mcp/stdio-client.js +6 -6
  41. package/dist/mcp/tool-names.js +1 -1
  42. package/dist/minds/builtin/fuxi/persona.en.md +10 -10
  43. package/dist/minds/builtin/fuxi/persona.zh.md +12 -12
  44. package/dist/minds/builtin/pangu/persona.en.md +7 -7
  45. package/dist/minds/builtin/pangu/persona.zh.md +6 -6
  46. package/dist/minds/minds-i18n.js +2 -2
  47. package/dist/minds/system-prompt-parts.js +15 -12
  48. package/dist/minds/system-prompt.js +58 -56
  49. package/dist/persistence.js +675 -527
  50. package/dist/server/api-routes.js +1 -1
  51. package/dist/server/websocket-handler.js +10 -20
  52. package/dist/server.js +3 -3
  53. package/dist/shared/diligence.js +12 -12
  54. package/dist/shared/i18n/driver-messages.js +28 -118
  55. package/dist/shared/utils/inter-dialog-format.js +53 -53
  56. package/dist/snippets/starting.en.md +1 -1
  57. package/dist/snippets/starting.zh.md +1 -2
  58. package/dist/static/assets/{_baseUniq-2IQvcpiv.js → _baseUniq-D4N_zVXV.js} +2 -2
  59. package/dist/static/assets/{_baseUniq-2IQvcpiv.js.map → _baseUniq-D4N_zVXV.js.map} +1 -1
  60. package/dist/static/assets/{arc-Boi4s2EY.js → arc-7bP9qomB.js} +2 -2
  61. package/dist/static/assets/{arc-Boi4s2EY.js.map → arc-7bP9qomB.js.map} +1 -1
  62. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js → architectureDiagram-VXUJARFQ-DToIiZuZ.js} +6 -6
  63. package/dist/static/assets/{architectureDiagram-VXUJARFQ-CV1IIalQ.js.map → architectureDiagram-VXUJARFQ-DToIiZuZ.js.map} +1 -1
  64. package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js → blockDiagram-VD42YOAC-C-pRNHpf.js} +7 -7
  65. package/dist/static/assets/{blockDiagram-VD42YOAC-C66ZvUb1.js.map → blockDiagram-VD42YOAC-C-pRNHpf.js.map} +1 -1
  66. package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js → c4Diagram-YG6GDRKO-Bnp-nWKO.js} +3 -3
  67. package/dist/static/assets/{c4Diagram-YG6GDRKO-2YQZQ-KQ.js.map → c4Diagram-YG6GDRKO-Bnp-nWKO.js.map} +1 -1
  68. package/dist/static/assets/{channel-DBG_xYT_.js → channel-CTv1SsAF.js} +2 -2
  69. package/dist/static/assets/{channel-DBG_xYT_.js.map → channel-CTv1SsAF.js.map} +1 -1
  70. package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js → chunk-4BX2VUAB-D_OGa3ss.js} +2 -2
  71. package/dist/static/assets/{chunk-4BX2VUAB-D92pQ5qM.js.map → chunk-4BX2VUAB-D_OGa3ss.js.map} +1 -1
  72. package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js → chunk-55IACEB6-I4o4MCuM.js} +2 -2
  73. package/dist/static/assets/{chunk-55IACEB6-T3IKxvjm.js.map → chunk-55IACEB6-I4o4MCuM.js.map} +1 -1
  74. package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js → chunk-B4BG7PRW-Bp-TIXg6.js} +5 -5
  75. package/dist/static/assets/{chunk-B4BG7PRW-SKDCq7xY.js.map → chunk-B4BG7PRW-Bp-TIXg6.js.map} +1 -1
  76. package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js → chunk-DI55MBZ5-Bnph5Hmd.js} +4 -4
  77. package/dist/static/assets/{chunk-DI55MBZ5-CKY9xXzj.js.map → chunk-DI55MBZ5-Bnph5Hmd.js.map} +1 -1
  78. package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js → chunk-FMBD7UC4-q3UyRsNI.js} +2 -2
  79. package/dist/static/assets/{chunk-FMBD7UC4-CzaQthG_.js.map → chunk-FMBD7UC4-q3UyRsNI.js.map} +1 -1
  80. package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js → chunk-QN33PNHL-BxUlvLXP.js} +2 -2
  81. package/dist/static/assets/{chunk-QN33PNHL-8v7ASP75.js.map → chunk-QN33PNHL-BxUlvLXP.js.map} +1 -1
  82. package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js → chunk-QZHKN3VN-DpQR9BVw.js} +2 -2
  83. package/dist/static/assets/{chunk-QZHKN3VN-Cd3_mr-D.js.map → chunk-QZHKN3VN-DpQR9BVw.js.map} +1 -1
  84. package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js → chunk-TZMSLE5B-BX8vrVo0.js} +2 -2
  85. package/dist/static/assets/{chunk-TZMSLE5B-BrTyfkJK.js.map → chunk-TZMSLE5B-BX8vrVo0.js.map} +1 -1
  86. package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js → classDiagram-2ON5EDUG-Ccx5_2Xq.js} +6 -6
  87. package/dist/static/assets/{classDiagram-2ON5EDUG-pLBmQ3Qa.js.map → classDiagram-2ON5EDUG-Ccx5_2Xq.js.map} +1 -1
  88. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js} +6 -6
  89. package/dist/static/assets/{classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js.map → classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js.map} +1 -1
  90. package/dist/static/assets/{clone-rjxmrDHc.js → clone-Cl5zSMrO.js} +2 -2
  91. package/dist/static/assets/{clone-rjxmrDHc.js.map → clone-Cl5zSMrO.js.map} +1 -1
  92. package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js → cose-bilkent-S5V4N54A-B-FUX86B.js} +2 -2
  93. package/dist/static/assets/{cose-bilkent-S5V4N54A-DaW3q2vS.js.map → cose-bilkent-S5V4N54A-B-FUX86B.js.map} +1 -1
  94. package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js → dagre-6UL2VRFP-Bj8vSSpT.js} +7 -7
  95. package/dist/static/assets/{dagre-6UL2VRFP-BT252775.js.map → dagre-6UL2VRFP-Bj8vSSpT.js.map} +1 -1
  96. package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js → diagram-PSM6KHXK-BPcgy7jf.js} +7 -7
  97. package/dist/static/assets/{diagram-PSM6KHXK-Cp0jEYgm.js.map → diagram-PSM6KHXK-BPcgy7jf.js.map} +1 -1
  98. package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js → diagram-QEK2KX5R-DHxd6LWi.js} +6 -6
  99. package/dist/static/assets/{diagram-QEK2KX5R-BYEiCch_.js.map → diagram-QEK2KX5R-DHxd6LWi.js.map} +1 -1
  100. package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js → diagram-S2PKOQOG-C4ynhhLr.js} +6 -6
  101. package/dist/static/assets/{diagram-S2PKOQOG-SNGZ1B53.js.map → diagram-S2PKOQOG-C4ynhhLr.js.map} +1 -1
  102. package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js → erDiagram-Q2GNP2WA-CQ25uxxf.js} +5 -5
  103. package/dist/static/assets/{erDiagram-Q2GNP2WA-CMdkkngT.js.map → erDiagram-Q2GNP2WA-CQ25uxxf.js.map} +1 -1
  104. package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js → flowDiagram-NV44I4VS-ChkkAldk.js} +6 -6
  105. package/dist/static/assets/{flowDiagram-NV44I4VS-k203P84f.js.map → flowDiagram-NV44I4VS-ChkkAldk.js.map} +1 -1
  106. package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js → ganttDiagram-JELNMOA3-CBt_Zorl.js} +3 -3
  107. package/dist/static/assets/{ganttDiagram-JELNMOA3-CgsVe01-.js.map → ganttDiagram-JELNMOA3-CBt_Zorl.js.map} +1 -1
  108. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js → gitGraphDiagram-NY62KEGX-CtBc2dOO.js} +7 -7
  109. package/dist/static/assets/{gitGraphDiagram-NY62KEGX-BGOR_N5w.js.map → gitGraphDiagram-NY62KEGX-CtBc2dOO.js.map} +1 -1
  110. package/dist/static/assets/{graph-DDHIhCSW.js → graph-BGzNnzuI.js} +3 -3
  111. package/dist/static/assets/{graph-DDHIhCSW.js.map → graph-BGzNnzuI.js.map} +1 -1
  112. package/dist/static/assets/{index-CUZD-Ua6.js → index-Vrp1PT3b.js} +654 -355
  113. package/dist/static/assets/index-Vrp1PT3b.js.map +1 -0
  114. package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js → infoDiagram-WHAUD3N6-BYJF-Ol5.js} +5 -5
  115. package/dist/static/assets/{infoDiagram-WHAUD3N6-D0GlWUIm.js.map → infoDiagram-WHAUD3N6-BYJF-Ol5.js.map} +1 -1
  116. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js} +5 -5
  117. package/dist/static/assets/{journeyDiagram-XKPGCS4Q-I0W1fDTZ.js.map → journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js.map} +1 -1
  118. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js → kanban-definition-3W4ZIXB7-DBH-HEwY.js} +3 -3
  119. package/dist/static/assets/{kanban-definition-3W4ZIXB7-BY5xVZyl.js.map → kanban-definition-3W4ZIXB7-DBH-HEwY.js.map} +1 -1
  120. package/dist/static/assets/{layout-C7mFT1m6.js → layout-DdWO-uEo.js} +5 -5
  121. package/dist/static/assets/{layout-C7mFT1m6.js.map → layout-DdWO-uEo.js.map} +1 -1
  122. package/dist/static/assets/{linear-WSX0brRY.js → linear-BY3MovaF.js} +2 -2
  123. package/dist/static/assets/{linear-WSX0brRY.js.map → linear-BY3MovaF.js.map} +1 -1
  124. package/dist/static/assets/{min-DOTQTP4p.js → min-aHCJK1uN.js} +3 -3
  125. package/dist/static/assets/{min-DOTQTP4p.js.map → min-aHCJK1uN.js.map} +1 -1
  126. package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js → mindmap-definition-VGOIOE7T-BjJnBRtB.js} +4 -4
  127. package/dist/static/assets/{mindmap-definition-VGOIOE7T-BWhHo-Hq.js.map → mindmap-definition-VGOIOE7T-BjJnBRtB.js.map} +1 -1
  128. package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js → pieDiagram-ADFJNKIX-xAcmdymv.js} +7 -7
  129. package/dist/static/assets/{pieDiagram-ADFJNKIX-B91oxvos.js.map → pieDiagram-ADFJNKIX-xAcmdymv.js.map} +1 -1
  130. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js → quadrantDiagram-AYHSOK5B-BPbEGCEj.js} +3 -3
  131. package/dist/static/assets/{quadrantDiagram-AYHSOK5B-DqMUyBPr.js.map → quadrantDiagram-AYHSOK5B-BPbEGCEj.js.map} +1 -1
  132. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js → requirementDiagram-UZGBJVZJ--w6UfXy0.js} +4 -4
  133. package/dist/static/assets/{requirementDiagram-UZGBJVZJ-COUayA3m.js.map → requirementDiagram-UZGBJVZJ--w6UfXy0.js.map} +1 -1
  134. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js → sankeyDiagram-TZEHDZUN-B_T6TQwh.js} +2 -2
  135. package/dist/static/assets/{sankeyDiagram-TZEHDZUN-Bp9r8YDi.js.map → sankeyDiagram-TZEHDZUN-B_T6TQwh.js.map} +1 -1
  136. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js → sequenceDiagram-WL72ISMW-DX_oVvqA.js} +4 -4
  137. package/dist/static/assets/{sequenceDiagram-WL72ISMW-CpuTC5cG.js.map → sequenceDiagram-WL72ISMW-DX_oVvqA.js.map} +1 -1
  138. package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js → stateDiagram-FKZM4ZOC-BAybZU8l.js} +9 -9
  139. package/dist/static/assets/{stateDiagram-FKZM4ZOC-Bxoo7e6E.js.map → stateDiagram-FKZM4ZOC-BAybZU8l.js.map} +1 -1
  140. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js} +5 -5
  141. package/dist/static/assets/{stateDiagram-v2-4FDKWEC3-Q-DL7tae.js.map → stateDiagram-v2-4FDKWEC3-BUsvuCdD.js.map} +1 -1
  142. package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js → timeline-definition-IT6M3QCI-DOYN-4XM.js} +3 -3
  143. package/dist/static/assets/{timeline-definition-IT6M3QCI-DuOiHQPk.js.map → timeline-definition-IT6M3QCI-DOYN-4XM.js.map} +1 -1
  144. package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js → treemap-KMMF4GRG-CQXygT0T.js} +4 -4
  145. package/dist/static/assets/{treemap-KMMF4GRG-YbrDC0fO.js.map → treemap-KMMF4GRG-CQXygT0T.js.map} +1 -1
  146. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js → xychartDiagram-PRI3JC2R-ByFAvTeN.js} +3 -3
  147. package/dist/static/assets/{xychartDiagram-PRI3JC2R-DDRlTIfV.js.map → xychartDiagram-PRI3JC2R-ByFAvTeN.js.map} +1 -1
  148. package/dist/static/index.html +1 -1
  149. package/dist/tools/builtins.js +0 -8
  150. package/dist/tools/env.js +1 -1
  151. package/dist/tools/mcp.js +31 -9
  152. package/dist/tools/pending-tellask-reminder.js +14 -17
  153. package/dist/tools/team-mgmt.js +1 -1
  154. package/package.json +1 -1
  155. package/dist/static/assets/index-CUZD-Ua6.js.map +0 -1
@@ -78,7 +78,7 @@ function throwIfAgentPrimingStopped(dlg, abortSignal) {
78
78
  throw new AgentPrimingInterruptedError('user_stop');
79
79
  }
80
80
  async function emitSayingEventsAndPersist(dlg, content) {
81
- const calls = await (0, driver_entry_1.emitSayingEvents)(dlg, content);
81
+ await (0, driver_entry_1.emitSayingEvents)(dlg, content);
82
82
  const genseq = dlg.activeGenSeqOrUndefined;
83
83
  if (dlg.generationStarted &&
84
84
  typeof genseq === 'number' &&
@@ -95,7 +95,47 @@ async function emitSayingEventsAndPersist(dlg, content) {
95
95
  });
96
96
  }
97
97
  }
98
- return calls;
98
+ }
99
+ async function emitSyntheticTellaskCall(dlg, payload) {
100
+ const callId = payload.callId?.trim() ? payload.callId.trim() : `priming-${(0, id_1.generateShortId)()}`;
101
+ switch (payload.callName) {
102
+ case 'tellask':
103
+ case 'tellaskSessionless': {
104
+ const mentionList = (payload.mentionList ?? [])
105
+ .map((value) => value.trim())
106
+ .filter((value) => value !== '');
107
+ if (mentionList.length < 1) {
108
+ throw new Error('emitSyntheticTellaskCall requires mentionList for teammate tellasks');
109
+ }
110
+ await dlg.callingStart({
111
+ callName: payload.callName,
112
+ callId,
113
+ mentionList,
114
+ tellaskContent: payload.tellaskContent,
115
+ });
116
+ return {
117
+ callId,
118
+ callName: payload.callName,
119
+ mentionList,
120
+ tellaskContent: payload.tellaskContent,
121
+ };
122
+ }
123
+ case 'freshBootsReasoning': {
124
+ if (payload.mentionList !== undefined && payload.mentionList.length > 0) {
125
+ throw new Error('emitSyntheticTellaskCall: freshBootsReasoning must not carry mentionList');
126
+ }
127
+ await dlg.callingStart({
128
+ callName: payload.callName,
129
+ callId,
130
+ tellaskContent: payload.tellaskContent,
131
+ });
132
+ return {
133
+ callId,
134
+ callName: payload.callName,
135
+ tellaskContent: payload.tellaskContent,
136
+ };
137
+ }
138
+ }
99
139
  }
100
140
  async function emitUiOnlyMarkdownEventsAndPersist(dlg, content) {
101
141
  const trimmed = content.trim();
@@ -182,7 +222,7 @@ function scheduleAgentPrimingForNewDialog(dlg, options) {
182
222
  })
183
223
  .catch((err) => {
184
224
  if (isAgentPrimingInterruptedError(err)) {
185
- log_1.log.info('Agent Priming interrupted; will retry on next dialog', undefined, {
225
+ log_1.log.debug('Agent Priming interrupted; will retry on next dialog', undefined, {
186
226
  agentId,
187
227
  reason: err.reason,
188
228
  });
@@ -206,7 +246,7 @@ function scheduleAgentPrimingForNewDialog(dlg, options) {
206
246
  .catch((err) => {
207
247
  // Best-effort: avoid unhandled rejections; the dialog itself is already marked interrupted.
208
248
  if (isAgentPrimingInterruptedError(err)) {
209
- log_1.log.info('Agent Priming interrupted; will retry on next dialog', undefined, {
249
+ log_1.log.debug('Agent Priming interrupted; will retry on next dialog', undefined, {
210
250
  agentId,
211
251
  reason: err.reason,
212
252
  });
@@ -222,10 +262,6 @@ function scheduleAgentPrimingForNewDialog(dlg, options) {
222
262
  inflightByAgentId.set(agentId, task);
223
263
  return task.then(() => undefined);
224
264
  }
225
- function prefixTellaskBodyLines(text) {
226
- const lines = text.replace(/\r\n/g, '\n').split('\n');
227
- return lines.map((line) => `!? ${line}`).join('\n');
228
- }
229
265
  function takeFirstNonEmptyLine(text) {
230
266
  const lines = text.replace(/\r\n/g, '\n').split('\n');
231
267
  for (const line of lines) {
@@ -641,7 +677,7 @@ function formatPreludeIntro(language, reused, shellPolicy, shellSpecialistId) {
641
677
  : shellPolicy === 'self_is_specialist'
642
678
  ? [
643
679
  '本次对话主理人属于 `shell_specialists`,将略去 shell 诉请环节。',
644
- '由 Dominds 运行时获取标准环境事实(`uname -a` + rtws git 现状),随后进入 `!?@self` FBR。',
680
+ '由 Dominds 运行时获取标准环境事实(`uname -a` + rtws git 现状),随后进入 `freshBootsReasoning` FBR。',
645
681
  ]
646
682
  : [
647
683
  '本团队未配置 shell 专员。',
@@ -656,7 +692,7 @@ function formatPreludeIntro(language, reused, shellPolicy, shellSpecialistId) {
656
692
  : shellPolicy === 'self_is_specialist'
657
693
  ? [
658
694
  'The dialog owner is a member of `shell_specialists`, so we skip the shell Tellask step.',
659
- 'Dominds runtime collects standard environment facts (`uname -a` + rtws git state), then we enter `!?@self` FBR.',
695
+ 'Dominds runtime collects standard environment facts (`uname -a` + rtws git state), then we enter `freshBootsReasoning` FBR.',
660
696
  ]
661
697
  : [
662
698
  'This team has no configured shell specialist.',
@@ -669,7 +705,7 @@ function formatPreludeIntro(language, reused, shellPolicy, shellSpecialistId) {
669
705
  '## Prelude:智能体启动(复用缓存)',
670
706
  '',
671
707
  '这段序幕用于把“诉请 + 回传 + FBR + 综合提炼”变成体感(引导祂做给自己看)。',
672
- '关键时序:`!?@self` 只表示发起;必须等待 FBR 支线回贴返回后,才在主线做综合决策。',
708
+ '关键时序:`freshBootsReasoning` 只表示发起;必须等待 FBR 支线回贴返回后,才在主线做综合决策。',
673
709
  '本次对话复用了本进程内缓存:未重复执行命令。',
674
710
  '',
675
711
  ...shellPolicyLinesZh,
@@ -679,7 +715,7 @@ function formatPreludeIntro(language, reused, shellPolicy, shellSpecialistId) {
679
715
  '## Prelude:智能体启动',
680
716
  '',
681
717
  '这段序幕用于把“诉请 + 回传 + FBR + 综合提炼”变成体感(引导祂做给自己看)。',
682
- '关键时序:`!?@self` 只表示发起;必须等待 FBR 支线回贴返回后,才在主线做综合决策。',
718
+ '关键时序:`freshBootsReasoning` 只表示发起;必须等待 FBR 支线回贴返回后,才在主线做综合决策。',
683
719
  '',
684
720
  ...shellPolicyLinesZh,
685
721
  '',
@@ -690,7 +726,7 @@ function formatPreludeIntro(language, reused, shellPolicy, shellSpecialistId) {
690
726
  '## Prelude: Agent Priming (Reused)',
691
727
  '',
692
728
  'This prelude makes Tellask + return + FBR + distillation feel real (guiding the agent to show it to itself).',
693
- 'Critical timing: `!?@self` is initiation only; mainline distillation/decision happens only after FBR sideline feedback returns.',
729
+ 'Critical timing: `freshBootsReasoning` is initiation only; mainline distillation/decision happens only after FBR sideline feedback returns.',
694
730
  'This dialog reused the in-process cache (no commands were re-run).',
695
731
  '',
696
732
  ...shellPolicyLinesEn,
@@ -700,7 +736,7 @@ function formatPreludeIntro(language, reused, shellPolicy, shellSpecialistId) {
700
736
  '## Prelude: Agent Priming',
701
737
  '',
702
738
  'This prelude makes Tellask + return + FBR + distillation feel real (guiding the agent to show it to itself).',
703
- 'Critical timing: `!?@self` is initiation only; mainline distillation/decision happens only after FBR sideline feedback returns.',
739
+ 'Critical timing: `freshBootsReasoning` is initiation only; mainline distillation/decision happens only after FBR sideline feedback returns.',
704
740
  '',
705
741
  ...shellPolicyLinesEn,
706
742
  '',
@@ -714,7 +750,7 @@ function formatShellTellaskBody(language, shellSpecialistId) {
714
750
  '',
715
751
  '背景规则:对话主理人不得执行任何 shell 命令;所有 shell 命令必须通过你执行并回传。',
716
752
  '请不要建议我“自己在本地跑一下”。',
717
- '收到回传后,我会基于该环境信息发起一次 `!?@self` 扪心自问(FBR),先等待该次 FBR 的全部支线回贴,再在主线做综合提炼并形成一条可复用的“智能体启动(Agent Priming)”笔记。',
753
+ '收到回传后,我会基于该环境信息发起一次 `freshBootsReasoning` 扪心自问(FBR),先等待该次 FBR 的全部支线回贴,再在主线做综合提炼并形成一条可复用的“智能体启动(Agent Priming)”笔记。',
718
754
  '',
719
755
  '要求:',
720
756
  '- 通过 shell 工具执行:uname -a(只执行这一条)',
@@ -729,7 +765,7 @@ function formatShellTellaskBody(language, shellSpecialistId) {
729
765
  '',
730
766
  'Rule: the dialog owner must not run any shell commands; all shell commands must be executed by you and returned.',
731
767
  'Do not suggest that I “just run it locally”.',
732
- 'After I receive your output, I will initiate `!?@self` Fresh Boots Reasoning (FBR) on this environment, wait for all feedback from that FBR run, then distill a reusable “Agent Priming” note in mainline.',
768
+ 'After I receive your output, I will initiate `freshBootsReasoning` Fresh Boots Reasoning (FBR) on this environment, wait for all feedback from that FBR run, then distill a reusable “Agent Priming” note in mainline.',
733
769
  '',
734
770
  'Requirements:',
735
771
  '- Use shell tools to run exactly: uname -a (and only this command)',
@@ -835,23 +871,13 @@ function formatFbrTellaskBody(language, snapshotText, options) {
835
871
  const effortLineEn = options.fbrEffort >= 1
836
872
  ? 'Conversation setup: you are one awakened “fresh-boots self.” Terminology mapping: in this FBR sideline, you are the tellaskee (the fresh-boots self), and the tellasker is the outer self (current mainline). In this same round, other fresh-boots selves also provide parallel drafts (no stable mapping—do not treat them as fixed identities). The outer self will make unified decisions only after all feedback returns; provide only this one independent draft and do not finalize next-action decisions for the outer self.'
837
873
  : 'Conversation setup: FBR is disabled for this member (no parallel fresh-boots drafts).';
838
- const tellaskBackHintZh = (() => {
839
- return [
840
- '提示:如果你还想知道更多系统细节,可在本 FBR 支线对话中用 `!?@tellasker` 回问诉请者(tellasker,也就是外表自我/当前主线)。',
841
- '(当前这次 FBR 请不要真的发起任何诉请;只需说明你会回问什么。)',
842
- ].join('\n');
843
- })();
844
- const tellaskBackHintEn = (() => {
845
- return [
846
- 'Hint: if you want more system details, ask back in this FBR sideline dialog via `!?@tellasker` (to the tellasker, i.e. the outer-self mainline dialog).',
847
- '(In this FBR run, do not actually emit any tellasks; just state what you would ask back.)',
848
- ].join('\n');
849
- })();
874
+ const missingContextHintZh = '提示:本 FBR 支线禁止任何诉请/函数调用;若信息不足,请直接列出“缺失信息 + 为什么阻塞判断”。';
875
+ const missingContextHintEn = 'Hint: this FBR sideline forbids all tellask/function calls; if context is missing, list the missing facts and why they block reasoning.';
850
876
  if (language === 'zh') {
851
877
  return [
852
878
  effortLineZh,
853
879
  '',
854
- tellaskBackHintZh,
880
+ missingContextHintZh,
855
881
  '',
856
882
  '请基于下面环境信息回答:',
857
883
  '- 在这个环境里要注意些什么?',
@@ -865,7 +891,7 @@ function formatFbrTellaskBody(language, snapshotText, options) {
865
891
  return [
866
892
  effortLineEn,
867
893
  '',
868
- tellaskBackHintEn,
894
+ missingContextHintEn,
869
895
  '',
870
896
  'Based on the environment info below, answer:',
871
897
  '- What should we watch out for in this environment?',
@@ -877,7 +903,7 @@ function formatFbrTellaskBody(language, snapshotText, options) {
877
903
  ].join('\n');
878
904
  }
879
905
  async function generatePrimingNoteViaMainlineAgent(options) {
880
- const { dlg, shellSnapshotText, shellResponseText, vcsRound1Text, vcsRound2Text, fbrResponses, fbrTellaskHead, fbrCallId, assertNotStopped, } = options;
906
+ const { dlg, shellSnapshotText, shellResponseText, vcsRound1Text, vcsRound2Text, fbrResponses, fbrCallId, assertNotStopped, } = options;
881
907
  // Trigger a normal drive and rely on driver.ts context assembly.
882
908
  // Agent Priming must not trigger Diligence Push (“鞭策”); it should be best-effort
883
909
  // one-shot distillation with no keep-going injection.
@@ -928,18 +954,7 @@ async function generatePrimingNoteViaMainlineAgent(options) {
928
954
  ? `${trimmed.slice(0, cap).trimEnd()}\n\n(已截断:仅显示前 ${cap} 字符)`
929
955
  : `${trimmed.slice(0, cap).trimEnd()}\n\n(truncated: first ${cap} chars only)`;
930
956
  const fbrLabel = (() => {
931
- const head = fbrTellaskHead.trim();
932
957
  const callId = fbrCallId.trim();
933
- if (head && callId) {
934
- return language === 'zh'
935
- ? `FBR 草稿 #${i + 1}(tellaskHead: ${head};callId: ${callId})`
936
- : `FBR draft #${i + 1} (tellaskHead: ${head}; callId: ${callId})`;
937
- }
938
- if (head) {
939
- return language === 'zh'
940
- ? `FBR 草稿 #${i + 1}(tellaskHead: ${head})`
941
- : `FBR draft #${i + 1} (tellaskHead: ${head})`;
942
- }
943
958
  if (callId) {
944
959
  return language === 'zh'
945
960
  ? `FBR 草稿 #${i + 1}(callId: ${callId})`
@@ -956,8 +971,8 @@ async function generatePrimingNoteViaMainlineAgent(options) {
956
971
  const internalPrompt = language === 'zh'
957
972
  ? [
958
973
  '你正在进行智能体启动(Agent Priming)的“综合提炼”步骤。',
959
- '你收到本提示时,意味着该次 `!?@self` FBR 的并发回贴已经收齐;本步骤只做综合提炼,不重新发起 FBR。',
960
- '请基于下方提供的环境快照(以及可选的 `!?@self` FBR 草稿),综合提炼出一条可复用的“智能体启动(Agent Priming)笔记”。',
974
+ '你收到本提示时,意味着该次 `freshBootsReasoning` FBR 的并发回贴已经收齐;本步骤只做综合提炼,不重新发起 FBR。',
975
+ '请基于下方提供的环境快照(以及可选的 `freshBootsReasoning` FBR 草稿),综合提炼出一条可复用的“智能体启动(Agent Priming)笔记”。',
961
976
  '',
962
977
  '证据材料(仅供综合提炼;不要逐条复述):',
963
978
  evidenceBlock ? evidenceBlock : '(无)',
@@ -974,8 +989,8 @@ async function generatePrimingNoteViaMainlineAgent(options) {
974
989
  ].join('\n')
975
990
  : [
976
991
  'You are in the Agent Priming distillation step.',
977
- 'Receiving this prompt means feedback from this `!?@self` FBR run has already been collected; this step is distillation only, not another FBR initiation.',
978
- 'Based on the environment snapshot (and optional `!?@self` FBR drafts) below, distill a reusable “Agent Priming note”.',
992
+ 'Receiving this prompt means feedback from this `freshBootsReasoning` FBR run has already been collected; this step is distillation only, not another FBR initiation.',
993
+ 'Based on the environment snapshot (and optional `freshBootsReasoning` FBR drafts) below, distill a reusable “Agent Priming note”.',
979
994
  '',
980
995
  'Evidence (for distillation only; do not repeat draft-by-draft):',
981
996
  evidenceBlock ? evidenceBlock : '(empty)',
@@ -1020,20 +1035,20 @@ function buildCoursePrefixMsgs(entry) {
1020
1035
  const header = (() => {
1021
1036
  if (language === 'zh') {
1022
1037
  if (entry.shellPolicy === 'specialist_only') {
1023
- return '智能体启动(Agent Priming)上下文:本进程在对话创建时已真实跑通一次“诉请(shell 专员)+ 回传 + `!?@self` FBR + 综合提炼”,并遵循“发起 FBR → 等待回贴 → 综合决策”的时序。以下为压缩转录,作为每一程对话的开头上下文注入。';
1038
+ return '智能体启动(Agent Priming)上下文:本进程在对话创建时已真实跑通一次“诉请(shell 专员)+ 回传 + `freshBootsReasoning` FBR + 综合提炼”,并遵循“发起 FBR → 等待回贴 → 综合决策”的时序。以下为压缩转录,作为每一程对话的开头上下文注入。';
1024
1039
  }
1025
1040
  if (entry.shellPolicy === 'no_specialist') {
1026
- return '智能体启动(Agent Priming)上下文:本进程在对话创建时已获取环境快照并完成一次 `!?@self` FBR + 综合提炼(无 shell 专员;不得执行任意 shell 命令),并遵循“发起 FBR → 等待回贴 → 综合决策”的时序。以下为压缩转录,作为每一程对话的开头上下文注入。';
1041
+ return '智能体启动(Agent Priming)上下文:本进程在对话创建时已获取环境快照并完成一次 `freshBootsReasoning` FBR + 综合提炼(无 shell 专员;不得执行任意 shell 命令),并遵循“发起 FBR → 等待回贴 → 综合决策”的时序。以下为压缩转录,作为每一程对话的开头上下文注入。';
1027
1042
  }
1028
- return '智能体启动(Agent Priming)上下文:本进程在对话创建时已获取环境快照并完成一次 `!?@self` FBR + 综合提炼,并遵循“发起 FBR → 等待回贴 → 综合决策”的时序。以下为压缩转录,作为每一程对话的开头上下文注入。';
1043
+ return '智能体启动(Agent Priming)上下文:本进程在对话创建时已获取环境快照并完成一次 `freshBootsReasoning` FBR + 综合提炼,并遵循“发起 FBR → 等待回贴 → 综合决策”的时序。以下为压缩转录,作为每一程对话的开头上下文注入。';
1029
1044
  }
1030
1045
  if (entry.shellPolicy === 'specialist_only') {
1031
- return 'Agent Priming context: this process already ran a real Tellask (shell specialist) + return + `!?@self` FBR + distillation at dialog creation, following the timing contract “initiate FBR -> wait for feedback -> synthesize/decide”. The condensed transcript below is injected at the start of each course.';
1046
+ return 'Agent Priming context: this process already ran a real Tellask (shell specialist) + return + `freshBootsReasoning` FBR + distillation at dialog creation, following the timing contract “initiate FBR -> wait for feedback -> synthesize/decide”. The condensed transcript below is injected at the start of each course.';
1032
1047
  }
1033
1048
  if (entry.shellPolicy === 'no_specialist') {
1034
- return 'Agent Priming context: this process captured an environment snapshot and ran `!?@self` FBR + distillation at dialog creation (no shell specialist; do not run arbitrary shell commands), following the timing contract “initiate FBR -> wait for feedback -> synthesize/decide”. The condensed transcript below is injected at the start of each course.';
1049
+ return 'Agent Priming context: this process captured an environment snapshot and ran `freshBootsReasoning` FBR + distillation at dialog creation (no shell specialist; do not run arbitrary shell commands), following the timing contract “initiate FBR -> wait for feedback -> synthesize/decide”. The condensed transcript below is injected at the start of each course.';
1035
1050
  }
1036
- return 'Agent Priming context: this process captured an environment snapshot and ran `!?@self` FBR + distillation at dialog creation, following the timing contract “initiate FBR -> wait for feedback -> synthesize/decide”. The condensed transcript below is injected at the start of each course.';
1051
+ return 'Agent Priming context: this process captured an environment snapshot and ran `freshBootsReasoning` FBR + distillation at dialog creation, following the timing contract “initiate FBR -> wait for feedback -> synthesize/decide”. The condensed transcript below is injected at the start of each course.';
1037
1052
  })();
1038
1053
  const shellSnapshotLabel = language === 'zh'
1039
1054
  ? 'Shell 环境快照(当前 Dominds 运行时;来自 `uname -a`)'
@@ -1137,23 +1152,19 @@ async function replayAgentPriming(dlg, entry) {
1137
1152
  assertNotStopped();
1138
1153
  // Phase 1: shell ask (and optional prelude intro)
1139
1154
  let shellCallId = null;
1140
- let shellTellaskHead = null;
1155
+ let shellMentionList = null;
1141
1156
  try {
1142
1157
  assertNotStopped();
1143
1158
  await dlg.notifyGeneratingStart();
1144
1159
  await emitUiOnlyMarkdownEventsAndPersist(dlg, formatPreludeIntro(language, true, entry.shellPolicy, entry.shell.kind === 'specialist_tellask' ? entry.shell.specialistId : null));
1145
1160
  if (entry.shell.kind === 'specialist_tellask') {
1146
- const shellCallContent = [
1147
- `!?@${entry.shell.specialistId}`,
1148
- ...prefixTellaskBodyLines(entry.shell.tellaskBody).split('\n'),
1149
- '',
1150
- ].join('\n');
1151
- const shellCalls = await emitSayingEventsAndPersist(dlg, shellCallContent);
1152
- const shellCall = shellCalls.find((c) => c.validation.kind === 'valid');
1153
- if (shellCall) {
1154
- shellCallId = shellCall.callId;
1155
- shellTellaskHead = shellCall.tellaskHead;
1156
- }
1161
+ const shellCall = await emitSyntheticTellaskCall(dlg, {
1162
+ callName: 'tellaskSessionless',
1163
+ mentionList: [`@${entry.shell.specialistId}`],
1164
+ tellaskContent: entry.shell.tellaskBody,
1165
+ });
1166
+ shellCallId = shellCall.callId;
1167
+ shellMentionList = shellCall.mentionList ?? null;
1157
1168
  }
1158
1169
  else {
1159
1170
  await emitSayingEventsAndPersist(dlg, entry.shell.directNoteMarkdown);
@@ -1168,9 +1179,9 @@ async function replayAgentPriming(dlg, entry) {
1168
1179
  }
1169
1180
  }
1170
1181
  // Phase 2: shell response (separate bubble)
1171
- if (entry.shell.kind === 'specialist_tellask' && shellCallId && shellTellaskHead) {
1182
+ if (entry.shell.kind === 'specialist_tellask' && shellCallId && shellMentionList) {
1172
1183
  assertNotStopped();
1173
- await dlg.receiveTeammateResponse(entry.shell.specialistId, shellTellaskHead, 'completed', dlg.id, {
1184
+ await dlg.receiveTeammateResponse(entry.shell.specialistId, 'tellaskSessionless', shellMentionList, entry.shell.tellaskBody, 'completed', dlg.id, {
1174
1185
  response: entry.shell.responseText,
1175
1186
  agentId: entry.shell.specialistId,
1176
1187
  callId: shellCallId,
@@ -1180,23 +1191,19 @@ async function replayAgentPriming(dlg, entry) {
1180
1191
  // Phase 2.5: VCS long-session drill (two rounds)
1181
1192
  if (entry.vcs.kind === 'specialist_session') {
1182
1193
  let round1CallId = null;
1183
- let round1TellaskHead = null;
1194
+ let round1MentionList = null;
1184
1195
  let round2CallId = null;
1185
- let round2TellaskHead = null;
1196
+ let round2MentionList = null;
1186
1197
  try {
1187
1198
  assertNotStopped();
1188
1199
  await dlg.notifyGeneratingStart();
1189
- const round1Content = [
1190
- `!?@${entry.vcs.specialistId} !tellaskSession ${entry.vcs.sessionSlug}`,
1191
- ...prefixTellaskBodyLines(entry.vcs.round1.tellaskBody).split('\n'),
1192
- '',
1193
- ].join('\n');
1194
- const round1Calls = await emitSayingEventsAndPersist(dlg, round1Content);
1195
- const round1 = round1Calls.find((c) => c.validation.kind === 'valid');
1196
- if (round1) {
1197
- round1CallId = round1.callId;
1198
- round1TellaskHead = round1.tellaskHead;
1199
- }
1200
+ const round1 = await emitSyntheticTellaskCall(dlg, {
1201
+ callName: 'tellask',
1202
+ mentionList: [`@${entry.vcs.specialistId}`],
1203
+ tellaskContent: entry.vcs.round1.tellaskBody,
1204
+ });
1205
+ round1CallId = round1.callId;
1206
+ round1MentionList = round1.mentionList ?? null;
1200
1207
  }
1201
1208
  finally {
1202
1209
  try {
@@ -1206,9 +1213,9 @@ async function replayAgentPriming(dlg, entry) {
1206
1213
  // best-effort
1207
1214
  }
1208
1215
  }
1209
- if (round1CallId && round1TellaskHead) {
1216
+ if (round1CallId && round1MentionList) {
1210
1217
  assertNotStopped();
1211
- await dlg.receiveTeammateResponse(entry.vcs.specialistId, round1TellaskHead, 'completed', dlg.id, {
1218
+ await dlg.receiveTeammateResponse(entry.vcs.specialistId, 'tellask', round1MentionList, entry.vcs.round1.tellaskBody, 'completed', dlg.id, {
1212
1219
  response: entry.vcs.round1.responseText,
1213
1220
  agentId: entry.vcs.specialistId,
1214
1221
  callId: round1CallId,
@@ -1218,17 +1225,13 @@ async function replayAgentPriming(dlg, entry) {
1218
1225
  try {
1219
1226
  assertNotStopped();
1220
1227
  await dlg.notifyGeneratingStart();
1221
- const round2Content = [
1222
- `!?@${entry.vcs.specialistId} !tellaskSession ${entry.vcs.sessionSlug}`,
1223
- ...prefixTellaskBodyLines(entry.vcs.round2.tellaskBody).split('\n'),
1224
- '',
1225
- ].join('\n');
1226
- const round2Calls = await emitSayingEventsAndPersist(dlg, round2Content);
1227
- const round2 = round2Calls.find((c) => c.validation.kind === 'valid');
1228
- if (round2) {
1229
- round2CallId = round2.callId;
1230
- round2TellaskHead = round2.tellaskHead;
1231
- }
1228
+ const round2 = await emitSyntheticTellaskCall(dlg, {
1229
+ callName: 'tellask',
1230
+ mentionList: [`@${entry.vcs.specialistId}`],
1231
+ tellaskContent: entry.vcs.round2.tellaskBody,
1232
+ });
1233
+ round2CallId = round2.callId;
1234
+ round2MentionList = round2.mentionList ?? null;
1232
1235
  }
1233
1236
  finally {
1234
1237
  try {
@@ -1238,9 +1241,9 @@ async function replayAgentPriming(dlg, entry) {
1238
1241
  // best-effort
1239
1242
  }
1240
1243
  }
1241
- if (round2CallId && round2TellaskHead) {
1244
+ if (round2CallId && round2MentionList) {
1242
1245
  assertNotStopped();
1243
- await dlg.receiveTeammateResponse(entry.vcs.specialistId, round2TellaskHead, 'completed', dlg.id, {
1246
+ await dlg.receiveTeammateResponse(entry.vcs.specialistId, 'tellask', round2MentionList, entry.vcs.round2.tellaskBody, 'completed', dlg.id, {
1244
1247
  response: entry.vcs.round2.responseText,
1245
1248
  agentId: entry.vcs.specialistId,
1246
1249
  callId: round2CallId,
@@ -1278,24 +1281,17 @@ async function replayAgentPriming(dlg, entry) {
1278
1281
  }
1279
1282
  // Phase 3: FBR ask (call bubble)
1280
1283
  let fbrCallId = null;
1281
- let fbrTellaskHead = null;
1282
1284
  const effort = Math.max(0, Math.floor(entry.fbr.effort));
1283
1285
  if (effort >= 1 && entry.fbr.responses.length > 0) {
1284
1286
  try {
1285
1287
  assertNotStopped();
1286
1288
  await dlg.notifyGeneratingStart();
1287
- const fbrCallBody = [entry.fbr.selfTeaser, '', entry.fbr.tellaskBody].join('\n');
1288
- const fbrCallContent = [
1289
- '!?@self',
1290
- ...prefixTellaskBodyLines(fbrCallBody).split('\n'),
1291
- '',
1292
- ].join('\n');
1293
- const fbrCalls = await emitSayingEventsAndPersist(dlg, fbrCallContent);
1294
- const fbrCall = fbrCalls.find((c) => c.validation.kind === 'valid');
1295
- if (fbrCall) {
1296
- fbrCallId = fbrCall.callId;
1297
- fbrTellaskHead = fbrCall.tellaskHead;
1298
- }
1289
+ const fbrCallBody = [entry.fbr.selfTeaser, '', entry.fbr.tellaskContent].join('\n');
1290
+ const fbrCall = await emitSyntheticTellaskCall(dlg, {
1291
+ callName: 'freshBootsReasoning',
1292
+ tellaskContent: fbrCallBody,
1293
+ });
1294
+ fbrCallId = fbrCall.callId;
1299
1295
  }
1300
1296
  finally {
1301
1297
  try {
@@ -1306,13 +1302,13 @@ async function replayAgentPriming(dlg, entry) {
1306
1302
  }
1307
1303
  }
1308
1304
  // Phase 4: FBR responses (separate bubbles, in stable index order)
1309
- if (fbrCallId && fbrTellaskHead) {
1305
+ if (fbrCallId) {
1310
1306
  const normalized = Math.max(1, effort);
1311
1307
  const responses = entry.fbr.responses.slice(0, normalized);
1312
1308
  for (let i = 0; i < responses.length; i++) {
1313
1309
  assertNotStopped();
1314
1310
  const raw = responses[i] ?? '';
1315
- await dlg.receiveTeammateResponse(entry.fbr.responderAgentId, fbrTellaskHead, 'completed', dlg.id, {
1311
+ await dlg.receiveTeammateResponse(entry.fbr.responderAgentId, 'freshBootsReasoning', undefined, entry.fbr.tellaskContent, 'completed', dlg.id, {
1316
1312
  response: raw,
1317
1313
  agentId: entry.fbr.responderAgentId,
1318
1314
  callId: fbrCallId,
@@ -1342,7 +1338,7 @@ async function replayAgentPriming(dlg, entry) {
1342
1338
  kind: 'interrupted',
1343
1339
  reason: { kind: err.reason },
1344
1340
  };
1345
- log_1.log.info('Agent Priming replay interrupted by stop request', undefined, {
1341
+ log_1.log.debug('Agent Priming replay interrupted by stop request', undefined, {
1346
1342
  dialogId: dlg.id.valueOf(),
1347
1343
  reason: err.reason,
1348
1344
  });
@@ -1430,7 +1426,7 @@ async function runAgentPrimingLive(dlg) {
1430
1426
  ? 'self_is_specialist'
1431
1427
  : 'specialist_only';
1432
1428
  let shellCallId = null;
1433
- let shellTellaskHead = null;
1429
+ let shellMentionList = null;
1434
1430
  let shellTellaskBodyForSubdialog = null;
1435
1431
  // Phase 1: shell ask (and optional prelude intro)
1436
1432
  if (shellPolicy === 'specialist_only' && specialistId !== null) {
@@ -1440,19 +1436,14 @@ async function runAgentPrimingLive(dlg) {
1440
1436
  try {
1441
1437
  await dlg.notifyGeneratingStart();
1442
1438
  await emitUiOnlyMarkdownEventsAndPersist(dlg, formatPreludeIntro(language, false, shellPolicy, specialistId));
1443
- const shellCallSaying = [
1444
- `!?@${specialistId}`,
1445
- ...prefixTellaskBodyLines(shellTellaskBody).split('\n'),
1446
- '',
1447
- ].join('\n');
1448
- const calls = await emitSayingEventsAndPersist(dlg, shellCallSaying);
1449
- const call = calls.find((c) => c.validation.kind === 'valid');
1450
- if (!call) {
1451
- throw new Error('Failed to emit shell specialist tellask call');
1452
- }
1439
+ const call = await emitSyntheticTellaskCall(dlg, {
1440
+ callName: 'tellaskSessionless',
1441
+ mentionList: [`@${specialistId}`],
1442
+ tellaskContent: shellTellaskBody,
1443
+ });
1453
1444
  shellCallId = call.callId;
1454
- shellTellaskHead = call.tellaskHead;
1455
- shellTellaskBodyForSubdialog = call.body;
1445
+ shellMentionList = call.mentionList;
1446
+ shellTellaskBodyForSubdialog = call.tellaskContent;
1456
1447
  }
1457
1448
  finally {
1458
1449
  try {
@@ -1520,23 +1511,15 @@ async function runAgentPrimingLive(dlg) {
1520
1511
  if (shellPolicy === 'specialist_only' &&
1521
1512
  specialistId !== null &&
1522
1513
  shellCallId &&
1523
- shellTellaskHead) {
1514
+ shellMentionList) {
1524
1515
  const ensuredSpecialistId = specialistId;
1525
- if (ensuredSpecialistId === null) {
1526
- throw new Error('Missing shell specialist id');
1527
- }
1528
1516
  const ensuredShellCallId = shellCallId;
1529
- if (!ensuredShellCallId) {
1530
- throw new Error('Missing shell callId');
1531
- }
1532
- const ensuredShellTellaskHead = shellTellaskHead;
1533
- if (!ensuredShellTellaskHead) {
1534
- throw new Error('Missing shell tellaskHead');
1535
- }
1517
+ const ensuredShellMentionList = shellMentionList;
1536
1518
  const tellaskBody = shellTellaskBodyForSubdialog ?? shellTellaskBody;
1537
1519
  assertNotStopped();
1538
1520
  const sub = await dlg.withLock(async () => {
1539
- return await dlg.createSubDialog(ensuredSpecialistId, ensuredShellTellaskHead, tellaskBody, {
1521
+ return await dlg.createSubDialog(ensuredSpecialistId, ensuredShellMentionList, tellaskBody, {
1522
+ callName: 'tellaskSessionless',
1540
1523
  originMemberId: dlg.agentId,
1541
1524
  callerDialogId: dlg.id.selfId,
1542
1525
  callId: ensuredShellCallId,
@@ -1544,10 +1527,11 @@ async function runAgentPrimingLive(dlg) {
1544
1527
  });
1545
1528
  });
1546
1529
  const initPrompt = (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
1530
+ callName: 'tellaskSessionless',
1547
1531
  fromAgentId: dlg.agentId,
1548
1532
  toAgentId: sub.agentId,
1549
- tellaskHead: ensuredShellTellaskHead,
1550
- tellaskBody,
1533
+ mentionList: ensuredShellMentionList,
1534
+ tellaskContent: tellaskBody,
1551
1535
  language,
1552
1536
  collectiveTargets: [ensuredSpecialistId],
1553
1537
  });
@@ -1564,7 +1548,7 @@ async function runAgentPrimingLive(dlg) {
1564
1548
  }
1565
1549
  assertNotStopped();
1566
1550
  await dlg.withLock(async () => {
1567
- await dlg.receiveTeammateResponse(ensuredSpecialistId, ensuredShellTellaskHead, 'completed', sub.id, {
1551
+ await dlg.receiveTeammateResponse(ensuredSpecialistId, 'tellaskSessionless', ensuredShellMentionList, tellaskBody, 'completed', sub.id, {
1568
1552
  response: shellResponseText,
1569
1553
  agentId: ensuredSpecialistId,
1570
1554
  callId: ensuredShellCallId,
@@ -1578,24 +1562,19 @@ async function runAgentPrimingLive(dlg) {
1578
1562
  try {
1579
1563
  vcsRound1Body = formatVcsSessionRound1TellaskBody(language);
1580
1564
  let round1CallId = '';
1581
- let round1TellaskHead = '';
1565
+ let round1MentionList = [];
1582
1566
  let round1TellaskBodyForSubdialog = '';
1583
1567
  await dlg.withLock(async () => {
1584
1568
  try {
1585
1569
  await dlg.notifyGeneratingStart();
1586
- const round1CallSaying = [
1587
- `!?@${ensuredSpecialistId} !tellaskSession ${PRIMING_VCS_SESSION_SLUG}`,
1588
- ...prefixTellaskBodyLines(vcsRound1Body).split('\n'),
1589
- '',
1590
- ].join('\n');
1591
- const calls = await emitSayingEventsAndPersist(dlg, round1CallSaying);
1592
- const call = calls.find((c) => c.validation.kind === 'valid');
1593
- if (!call) {
1594
- throw new Error('Failed to emit VCS session round-1 tellask call');
1595
- }
1570
+ const call = await emitSyntheticTellaskCall(dlg, {
1571
+ callName: 'tellask',
1572
+ mentionList: [`@${ensuredSpecialistId}`],
1573
+ tellaskContent: vcsRound1Body,
1574
+ });
1596
1575
  round1CallId = call.callId;
1597
- round1TellaskHead = call.tellaskHead;
1598
- round1TellaskBodyForSubdialog = call.body;
1576
+ round1MentionList = call.mentionList;
1577
+ round1TellaskBodyForSubdialog = call.tellaskContent;
1599
1578
  }
1600
1579
  finally {
1601
1580
  try {
@@ -1608,11 +1587,12 @@ async function runAgentPrimingLive(dlg) {
1608
1587
  });
1609
1588
  assertNotStopped();
1610
1589
  const round1Sub = await dlg.withLock(async () => {
1611
- return await dlg.createSubDialog(ensuredSpecialistId, round1TellaskHead, round1TellaskBodyForSubdialog || vcsRound1Body, {
1590
+ return await dlg.createSubDialog(ensuredSpecialistId, round1MentionList, round1TellaskBodyForSubdialog || vcsRound1Body, {
1591
+ callName: 'tellask',
1612
1592
  originMemberId: dlg.agentId,
1613
1593
  callerDialogId: dlg.id.selfId,
1614
1594
  callId: round1CallId,
1615
- tellaskSession: PRIMING_VCS_SESSION_SLUG,
1595
+ sessionSlug: PRIMING_VCS_SESSION_SLUG,
1616
1596
  collectiveTargets: [ensuredSpecialistId],
1617
1597
  });
1618
1598
  });
@@ -1623,10 +1603,11 @@ async function runAgentPrimingLive(dlg) {
1623
1603
  await rootDialog.saveSubdialogRegistry();
1624
1604
  }
1625
1605
  const round1Prompt = (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
1606
+ callName: 'tellask',
1626
1607
  fromAgentId: dlg.agentId,
1627
1608
  toAgentId: round1Sub.agentId,
1628
- tellaskHead: round1TellaskHead,
1629
- tellaskBody: round1TellaskBodyForSubdialog || vcsRound1Body,
1609
+ mentionList: round1MentionList,
1610
+ tellaskContent: round1TellaskBodyForSubdialog || vcsRound1Body,
1630
1611
  language,
1631
1612
  collectiveTargets: [ensuredSpecialistId],
1632
1613
  });
@@ -1643,7 +1624,7 @@ async function runAgentPrimingLive(dlg) {
1643
1624
  }
1644
1625
  assertNotStopped();
1645
1626
  await dlg.withLock(async () => {
1646
- await dlg.receiveTeammateResponse(ensuredSpecialistId, round1TellaskHead, 'completed', round1Sub.id, {
1627
+ await dlg.receiveTeammateResponse(ensuredSpecialistId, 'tellask', round1MentionList, round1TellaskBodyForSubdialog || vcsRound1Body, 'completed', round1Sub.id, {
1647
1628
  response: vcsRound1ResponseText,
1648
1629
  agentId: ensuredSpecialistId,
1649
1630
  callId: round1CallId,
@@ -1652,24 +1633,19 @@ async function runAgentPrimingLive(dlg) {
1652
1633
  });
1653
1634
  vcsRound2Body = formatVcsSessionRound2TellaskBody(language, vcsRound1ResponseText);
1654
1635
  let round2CallId = '';
1655
- let round2TellaskHead = '';
1636
+ let round2MentionList = [];
1656
1637
  let round2TellaskBodyForSubdialog = '';
1657
1638
  await dlg.withLock(async () => {
1658
1639
  try {
1659
1640
  await dlg.notifyGeneratingStart();
1660
- const round2CallSaying = [
1661
- `!?@${ensuredSpecialistId} !tellaskSession ${PRIMING_VCS_SESSION_SLUG}`,
1662
- ...prefixTellaskBodyLines(vcsRound2Body).split('\n'),
1663
- '',
1664
- ].join('\n');
1665
- const calls = await emitSayingEventsAndPersist(dlg, round2CallSaying);
1666
- const call = calls.find((c) => c.validation.kind === 'valid');
1667
- if (!call) {
1668
- throw new Error('Failed to emit VCS session round-2 tellask call');
1669
- }
1641
+ const call = await emitSyntheticTellaskCall(dlg, {
1642
+ callName: 'tellask',
1643
+ mentionList: [`@${ensuredSpecialistId}`],
1644
+ tellaskContent: vcsRound2Body,
1645
+ });
1670
1646
  round2CallId = call.callId;
1671
- round2TellaskHead = call.tellaskHead;
1672
- round2TellaskBodyForSubdialog = call.body;
1647
+ round2MentionList = call.mentionList;
1648
+ round2TellaskBodyForSubdialog = call.tellaskContent;
1673
1649
  }
1674
1650
  finally {
1675
1651
  try {
@@ -1681,10 +1657,11 @@ async function runAgentPrimingLive(dlg) {
1681
1657
  }
1682
1658
  });
1683
1659
  const round2Prompt = (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
1660
+ callName: 'tellask',
1684
1661
  fromAgentId: dlg.agentId,
1685
1662
  toAgentId: round1Sub.agentId,
1686
- tellaskHead: round2TellaskHead,
1687
- tellaskBody: round2TellaskBodyForSubdialog || vcsRound2Body,
1663
+ mentionList: round2MentionList,
1664
+ tellaskContent: round2TellaskBodyForSubdialog || vcsRound2Body,
1688
1665
  language,
1689
1666
  collectiveTargets: [ensuredSpecialistId],
1690
1667
  });
@@ -1701,7 +1678,7 @@ async function runAgentPrimingLive(dlg) {
1701
1678
  }
1702
1679
  assertNotStopped();
1703
1680
  await dlg.withLock(async () => {
1704
- await dlg.receiveTeammateResponse(ensuredSpecialistId, round2TellaskHead, 'completed', round1Sub.id, {
1681
+ await dlg.receiveTeammateResponse(ensuredSpecialistId, 'tellask', round2MentionList, round2TellaskBodyForSubdialog || vcsRound2Body, 'completed', round1Sub.id, {
1705
1682
  response: vcsRound2ResponseText,
1706
1683
  agentId: ensuredSpecialistId,
1707
1684
  callId: round2CallId,
@@ -1792,27 +1769,20 @@ async function runAgentPrimingLive(dlg) {
1792
1769
  fbrCallBody = formatFbrTellaskBody(language, fbrSnapshotText.trim() ? fbrSnapshotText : snapshotText, { fbrEffort });
1793
1770
  selfTeaser = formatFbrSelfTeaser(language);
1794
1771
  let fbrCallId = null;
1795
- let fbrTellaskHead = null;
1772
+ let fbrCallName = null;
1796
1773
  // Phase 3: FBR ask (call bubble)
1797
1774
  if (fbrEffort >= 1) {
1798
1775
  assertNotStopped();
1799
1776
  await dlg.withLock(async () => {
1800
1777
  try {
1801
1778
  await dlg.notifyGeneratingStart();
1802
- const fbrSaying = [
1803
- selfTeaser,
1804
- '',
1805
- '!?@self',
1806
- ...prefixTellaskBodyLines(fbrCallBody).split('\n'),
1807
- '',
1808
- ].join('\n');
1809
- const fbrCalls = await emitSayingEventsAndPersist(dlg, fbrSaying);
1810
- const fbrCall = fbrCalls.find((c) => c.validation.kind === 'valid');
1811
- if (!fbrCall) {
1812
- throw new Error('Failed to emit FBR tellask call');
1813
- }
1779
+ await emitUiOnlyMarkdownEventsAndPersist(dlg, selfTeaser);
1780
+ const fbrCall = await emitSyntheticTellaskCall(dlg, {
1781
+ callName: 'freshBootsReasoning',
1782
+ tellaskContent: fbrCallBody,
1783
+ });
1814
1784
  fbrCallId = fbrCall.callId;
1815
- fbrTellaskHead = fbrCall.tellaskHead;
1785
+ fbrCallName = fbrCall.callName;
1816
1786
  }
1817
1787
  finally {
1818
1788
  try {
@@ -1824,11 +1794,11 @@ async function runAgentPrimingLive(dlg) {
1824
1794
  }
1825
1795
  });
1826
1796
  // Phase 4: FBR responses (separate bubbles; order is not meaningful)
1827
- if (!fbrCallId || !fbrTellaskHead) {
1828
- throw new Error('Missing FBR callId/tellaskHead');
1797
+ if (!fbrCallId || fbrCallName !== 'freshBootsReasoning') {
1798
+ throw new Error('Missing FBR callId/callName');
1829
1799
  }
1830
1800
  const ensuredFbrCallId = fbrCallId;
1831
- const ensuredFbrTellaskHead = fbrTellaskHead;
1801
+ const ensuredFbrCallName = fbrCallName;
1832
1802
  const perInstance = Array.from({ length: fbrEffort }, (_, idx) => idx + 1);
1833
1803
  const created = await Promise.all(perInstance.map(async (i) => {
1834
1804
  assertNotStopped();
@@ -1843,7 +1813,8 @@ async function runAgentPrimingLive(dlg) {
1843
1813
  : fbrCallBody;
1844
1814
  assertNotStopped();
1845
1815
  const sub = await dlg.withLock(async () => {
1846
- return await dlg.createSubDialog(dlg.agentId, ensuredFbrTellaskHead, instanceBody, {
1816
+ return await dlg.createSubDialog(dlg.agentId, undefined, instanceBody, {
1817
+ callName: ensuredFbrCallName,
1847
1818
  originMemberId: dlg.agentId,
1848
1819
  callerDialogId: dlg.id.selfId,
1849
1820
  callId: ensuredFbrCallId,
@@ -1851,10 +1822,10 @@ async function runAgentPrimingLive(dlg) {
1851
1822
  });
1852
1823
  });
1853
1824
  const initPrompt = (0, inter_dialog_format_1.formatAssignmentFromSupdialog)({
1825
+ callName: ensuredFbrCallName,
1854
1826
  fromAgentId: dlg.agentId,
1855
1827
  toAgentId: sub.agentId,
1856
- tellaskHead: ensuredFbrTellaskHead,
1857
- tellaskBody: instanceBody,
1828
+ tellaskContent: instanceBody,
1858
1829
  language,
1859
1830
  collectiveTargets: [dlg.agentId],
1860
1831
  });
@@ -1875,7 +1846,7 @@ async function runAgentPrimingLive(dlg) {
1875
1846
  fbrResponsesForCache.push(responseText);
1876
1847
  fbrResponsesForInjection.push({ subdialogId: r.sub.id.selfId, response: responseText });
1877
1848
  await dlg.withLock(async () => {
1878
- await dlg.receiveTeammateResponse(dlg.agentId, ensuredFbrTellaskHead, 'completed', r.sub.id, {
1849
+ await dlg.receiveTeammateResponse(dlg.agentId, ensuredFbrCallName, undefined, fbrCallBody, 'completed', r.sub.id, {
1879
1850
  response: responseText,
1880
1851
  agentId: dlg.agentId,
1881
1852
  callId: ensuredFbrCallId,
@@ -1884,13 +1855,13 @@ async function runAgentPrimingLive(dlg) {
1884
1855
  });
1885
1856
  }
1886
1857
  }
1887
- if (!fbrCallId || !fbrTellaskHead) {
1858
+ if (!fbrCallId || fbrCallName !== 'freshBootsReasoning') {
1888
1859
  if (fbrEffort >= 1) {
1889
- throw new Error('Missing FBR callId/tellaskHead for Agent Priming distillation.');
1860
+ throw new Error('Missing FBR callId/callName for Agent Priming distillation.');
1890
1861
  }
1891
1862
  // FBR disabled (fbr_effort == 0): distill from shell snapshot only.
1892
1863
  fbrCallId = '';
1893
- fbrTellaskHead = '@self';
1864
+ fbrCallName = 'freshBootsReasoning';
1894
1865
  }
1895
1866
  const primingNote = await generatePrimingNoteViaMainlineAgent({
1896
1867
  dlg,
@@ -1899,7 +1870,6 @@ async function runAgentPrimingLive(dlg) {
1899
1870
  vcsRound1Text: vcsEvidenceRound1Text,
1900
1871
  vcsRound2Text: vcsEvidenceRound2Text,
1901
1872
  fbrResponses: fbrResponsesForInjection,
1902
- fbrTellaskHead: fbrTellaskHead,
1903
1873
  fbrCallId: fbrCallId,
1904
1874
  assertNotStopped,
1905
1875
  });
@@ -1949,8 +1919,7 @@ async function runAgentPrimingLive(dlg) {
1949
1919
  inventoryText: vcsInventoryText,
1950
1920
  },
1951
1921
  fbr: {
1952
- tellaskHead: '@self',
1953
- tellaskBody: fbrCallBody,
1922
+ tellaskContent: fbrCallBody,
1954
1923
  selfTeaser,
1955
1924
  responderAgentId: dlg.agentId,
1956
1925
  effort: fbrEffort,
@@ -1969,7 +1938,7 @@ async function runAgentPrimingLive(dlg) {
1969
1938
  kind: 'interrupted',
1970
1939
  reason: { kind: err.reason },
1971
1940
  };
1972
- log_1.log.info('Agent Priming live run interrupted by stop request', undefined, {
1941
+ log_1.log.debug('Agent Priming live run interrupted by stop request', undefined, {
1973
1942
  dialogId: dlg.id.valueOf(),
1974
1943
  reason: err.reason,
1975
1944
  });