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
@@ -1,4 +1,4 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dagre-6UL2VRFP-BT252775.js","assets/graph-DDHIhCSW.js","assets/_baseUniq-2IQvcpiv.js","assets/layout-C7mFT1m6.js","assets/min-DOTQTP4p.js","assets/clone-rjxmrDHc.js","assets/cose-bilkent-S5V4N54A-DaW3q2vS.js","assets/cytoscape.esm-Bm8DJGmZ.js","assets/c4Diagram-YG6GDRKO-2YQZQ-KQ.js","assets/chunk-TZMSLE5B-BrTyfkJK.js","assets/flowDiagram-NV44I4VS-k203P84f.js","assets/chunk-FMBD7UC4-CzaQthG_.js","assets/chunk-55IACEB6-T3IKxvjm.js","assets/chunk-QN33PNHL-8v7ASP75.js","assets/channel-DBG_xYT_.js","assets/erDiagram-Q2GNP2WA-CMdkkngT.js","assets/gitGraphDiagram-NY62KEGX-BGOR_N5w.js","assets/chunk-4BX2VUAB-D92pQ5qM.js","assets/chunk-QZHKN3VN-Cd3_mr-D.js","assets/treemap-KMMF4GRG-YbrDC0fO.js","assets/ganttDiagram-JELNMOA3-CgsVe01-.js","assets/linear-WSX0brRY.js","assets/init-ZxktEp_H.js","assets/defaultLocale-DVr69WTU.js","assets/infoDiagram-WHAUD3N6-D0GlWUIm.js","assets/pieDiagram-ADFJNKIX-B91oxvos.js","assets/arc-Boi4s2EY.js","assets/ordinal-CxptdPJm.js","assets/quadrantDiagram-AYHSOK5B-DqMUyBPr.js","assets/xychartDiagram-PRI3JC2R-DDRlTIfV.js","assets/requirementDiagram-UZGBJVZJ-COUayA3m.js","assets/sequenceDiagram-WL72ISMW-CpuTC5cG.js","assets/classDiagram-2ON5EDUG-pLBmQ3Qa.js","assets/chunk-B4BG7PRW-SKDCq7xY.js","assets/classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js","assets/stateDiagram-FKZM4ZOC-Bxoo7e6E.js","assets/chunk-DI55MBZ5-CKY9xXzj.js","assets/stateDiagram-v2-4FDKWEC3-Q-DL7tae.js","assets/journeyDiagram-XKPGCS4Q-I0W1fDTZ.js","assets/timeline-definition-IT6M3QCI-DuOiHQPk.js","assets/mindmap-definition-VGOIOE7T-BWhHo-Hq.js","assets/kanban-definition-3W4ZIXB7-BY5xVZyl.js","assets/sankeyDiagram-TZEHDZUN-Bp9r8YDi.js","assets/diagram-S2PKOQOG-SNGZ1B53.js","assets/diagram-QEK2KX5R-BYEiCch_.js","assets/blockDiagram-VD42YOAC-C66ZvUb1.js","assets/architectureDiagram-VXUJARFQ-CV1IIalQ.js","assets/diagram-PSM6KHXK-Cp0jEYgm.js"])))=>i.map(i=>d[i]);
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/dagre-6UL2VRFP-Bj8vSSpT.js","assets/graph-BGzNnzuI.js","assets/_baseUniq-D4N_zVXV.js","assets/layout-DdWO-uEo.js","assets/min-aHCJK1uN.js","assets/clone-Cl5zSMrO.js","assets/cose-bilkent-S5V4N54A-B-FUX86B.js","assets/cytoscape.esm-Bm8DJGmZ.js","assets/c4Diagram-YG6GDRKO-Bnp-nWKO.js","assets/chunk-TZMSLE5B-BX8vrVo0.js","assets/flowDiagram-NV44I4VS-ChkkAldk.js","assets/chunk-FMBD7UC4-q3UyRsNI.js","assets/chunk-55IACEB6-I4o4MCuM.js","assets/chunk-QN33PNHL-BxUlvLXP.js","assets/channel-CTv1SsAF.js","assets/erDiagram-Q2GNP2WA-CQ25uxxf.js","assets/gitGraphDiagram-NY62KEGX-CtBc2dOO.js","assets/chunk-4BX2VUAB-D_OGa3ss.js","assets/chunk-QZHKN3VN-DpQR9BVw.js","assets/treemap-KMMF4GRG-CQXygT0T.js","assets/ganttDiagram-JELNMOA3-CBt_Zorl.js","assets/linear-BY3MovaF.js","assets/init-ZxktEp_H.js","assets/defaultLocale-DVr69WTU.js","assets/infoDiagram-WHAUD3N6-BYJF-Ol5.js","assets/pieDiagram-ADFJNKIX-xAcmdymv.js","assets/arc-7bP9qomB.js","assets/ordinal-CxptdPJm.js","assets/quadrantDiagram-AYHSOK5B-BPbEGCEj.js","assets/xychartDiagram-PRI3JC2R-ByFAvTeN.js","assets/requirementDiagram-UZGBJVZJ--w6UfXy0.js","assets/sequenceDiagram-WL72ISMW-DX_oVvqA.js","assets/classDiagram-2ON5EDUG-Ccx5_2Xq.js","assets/chunk-B4BG7PRW-Bp-TIXg6.js","assets/classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js","assets/stateDiagram-FKZM4ZOC-BAybZU8l.js","assets/chunk-DI55MBZ5-Bnph5Hmd.js","assets/stateDiagram-v2-4FDKWEC3-BUsvuCdD.js","assets/journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js","assets/timeline-definition-IT6M3QCI-DOYN-4XM.js","assets/mindmap-definition-VGOIOE7T-BjJnBRtB.js","assets/kanban-definition-3W4ZIXB7-DBH-HEwY.js","assets/sankeyDiagram-TZEHDZUN-B_T6TQwh.js","assets/diagram-S2PKOQOG-C4ynhhLr.js","assets/diagram-QEK2KX5R-DHxd6LWi.js","assets/blockDiagram-VD42YOAC-C-pRNHpf.js","assets/architectureDiagram-VXUJARFQ-DToIiZuZ.js","assets/diagram-PSM6KHXK-BPcgy7jf.js"])))=>i.map(i=>d[i]);
2
2
  var __defProp = Object.defineProperty;
3
3
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
4
4
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
@@ -149,6 +149,8 @@ function getUiStrings(language) {
149
149
  q4hGoToCallSiteTitle: "定位到提问点",
150
150
  q4hOpenInNewTabTitle: "新标签打开",
151
151
  q4hCopyLinkTitle: "复制链接",
152
+ teammateAssignmentBubbleTitle: "定位到任务安排气泡",
153
+ teammateRequesterCallSiteTitle: "在新标签打开诉请发起点",
152
154
  keepGoingTabTitle: "鞭策",
153
155
  keepGoingWorkspaceNote: "注意:修改鞭策语会影响整个 rtws(运行时工作区)!",
154
156
  keepGoingToggleAriaLabel: "启用鞭策(取消勾选=禁用)",
@@ -425,6 +427,8 @@ function getUiStrings(language) {
425
427
  q4hGoToCallSiteTitle: "Go to call site",
426
428
  q4hOpenInNewTabTitle: "Open in new tab",
427
429
  q4hCopyLinkTitle: "Copy link",
430
+ teammateAssignmentBubbleTitle: "Go to assignment bubble",
431
+ teammateRequesterCallSiteTitle: "Open requester call site in new tab",
428
432
  keepGoingTabTitle: "Diligence Push",
429
433
  keepGoingWorkspaceNote: "Note: editing the Diligence Push prompt affects the entire rtws (runtime workspace)!",
430
434
  keepGoingToggleAriaLabel: "Enable Diligence Push (uncheck to disable)",
@@ -1646,21 +1650,21 @@ const DILIGENCE_FALLBACK_TEXT = {
1646
1650
  zh: [
1647
1651
  "你扪心自问(做一次 FBR),差遣牒已经包含足够明确的目标定义了吗?",
1648
1652
  "",
1649
- "如果没有,`!?@human` 诉请人类给出足够清晰的目标。",
1653
+ "如果没有,使用 `askHuman` 请求人类给出足够清晰的目标。",
1650
1654
  "",
1651
1655
  "如果目标已经清晰定义,那么你已经完成了所有目标吗?",
1652
1656
  "",
1653
- "如果已经完成,`!?@human` 诉请人类验收。",
1657
+ "如果已经完成,使用 `askHuman` 请求人类验收。",
1654
1658
  "",
1655
- "如果尚未完成,优先直接确定并执行下一步最优行动项(调用工具或诉请队友)。仅当“下一步不清晰/难以决策”时,才发起一次 `!?@self` 扪心自问(FBR);收齐该次回贴后,立即把结论落地为可执行动作并开始执行,不要只汇报决定。",
1659
+ "如果尚未完成,优先直接确定并执行下一步最优行动项(调用工具或诉请队友)。仅当“下一步不清晰/难以决策”时,才发起一次 freshBootsReasoning 扪心自问(FBR);收齐该次回贴后,立即把结论落地为可执行动作并开始执行,不要只汇报决定。",
1656
1660
  "",
1657
- "当你确信自己不该或者不能自主继续工作时,立即 `!?@human` 诉请人类确认相关问题或者指出工作方向。",
1661
+ "当你确信自己不该或者不能自主继续工作时,立即使用 `askHuman` 请求人类确认相关问题或者指出工作方向。",
1658
1662
  "",
1659
1663
  "---",
1660
1664
  "",
1661
1665
  "**注意**:",
1662
1666
  "",
1663
- "扪心自问时,自诉请正文需要包含对当前状况的完整事实性总结(但不要包含差遣牒已有内容);`!?@self` 发起后不要立即下最终行动决策,先等回贴再综合。综合完成后必须立刻执行已确定行动(工具调用/诉请队友),避免停留在“仅汇报决定”的状态。",
1667
+ "扪心自问时,自诉请正文需要包含对当前状况的完整事实性总结(但不要包含差遣牒已有内容);发起 freshBootsReasoning 后不要立即下最终行动决策,先等回贴再综合。综合完成后必须立刻执行已确定行动(工具调用/诉请队友),避免停留在“仅汇报决定”的状态。",
1664
1668
  "",
1665
1669
  "队友如果回复 “将要/可以” 做 XXX 的,你要审视祂所说是否符合整体/分项任务目标,是否值得继续:",
1666
1670
  "- 如果祂建议的事情可做可不做,那么就可以忽略,不以琐碎小事安排工作。",
@@ -1668,26 +1672,26 @@ const DILIGENCE_FALLBACK_TEXT = {
1668
1672
  "",
1669
1673
  "系统会把“尚未收到反馈、仍在执行中的诉请”自动展示为提醒项;请以提醒项作为是否仍在执行中的唯一判断依据。",
1670
1674
  "",
1671
- "凡是不在提醒项里的历史诉请,都不要继续等待(通常代表已回贴或已结束当前轮次)。若该工作线仍需推进,必须立即使用同一个 `!tellaskSession <slug>` 再次诉请对应队友,明确要求继续执行下一步。"
1675
+ "凡是不在提醒项里的历史诉请,都不要继续等待(通常代表已回贴或已结束当前轮次)。若该工作线仍需推进,必须立即使用同一个 `sessionSlug` 再次调用 `tellask` 诉请对应队友,明确要求继续执行下一步。"
1672
1676
  ].join("\n"),
1673
1677
  en: [
1674
1678
  "Do a self-check (run one FBR): does the Taskdoc already contain a sufficiently clear goal definition?",
1675
1679
  "",
1676
- "If not, use `!?@human` to ask for a sufficiently clear goal.",
1680
+ "If not, use `askHuman` to request a sufficiently clear goal.",
1677
1681
  "",
1678
1682
  "If the goal is already clearly defined, ask: have you completed all goals?",
1679
1683
  "",
1680
- "If yes, use `!?@human` to request acceptance.",
1684
+ "If yes, use `askHuman` to request acceptance.",
1681
1685
  "",
1682
- "If not complete, first determine and execute the best next action (tool call or teammate tellask). Use `!?@self` FBR only when the next move is unclear or hard to decide; after feedback from that FBR run is collected, immediately turn the conclusion into executable action and start execution. Do not stop at reporting a decision.",
1686
+ "If not complete, first determine and execute the best next action (tool call or teammate tellask). Use freshBootsReasoning for FBR only when the next move is unclear or hard to decide; after feedback from that FBR run is collected, immediately turn the conclusion into executable action and start execution. Do not stop at reporting a decision.",
1683
1687
  "",
1684
- "When you are convinced you should not or cannot continue autonomously, immediately use `!?@human` to confirm the relevant issue or provide direction.",
1688
+ "When you are convinced you should not or cannot continue autonomously, immediately use `askHuman` to confirm the relevant issue or provide direction.",
1685
1689
  "",
1686
1690
  "---",
1687
1691
  "",
1688
1692
  "**Notes**:",
1689
1693
  "",
1690
- "When running FBR, the self-tellask body must include a complete factual summary of the current situation (but do not repeat information already present in the Taskdoc). After `!?@self`, do not finalize the next action immediately; wait for feedback first, then synthesize. Once synthesized, immediately execute the chosen action (tool call / teammate tellask), and avoid staying in a “decision report only” state.",
1694
+ "When running FBR, the FBR body must include a complete factual summary of the current situation (but do not repeat information already present in the Taskdoc). After initiating a freshBootsReasoning, do not finalize the next action immediately; wait for feedback first, then synthesize. Once synthesized, immediately execute the chosen action (tool call / teammate tellask), and avoid staying in a “decision report only” state.",
1691
1695
  "",
1692
1696
  "If a teammate replies that they “will/can do X”, examine whether it aligns with the overall/sub-task goals and is worth continuing:",
1693
1697
  "- If it is optional and low impact, ignore it instead of assigning trivial work.",
@@ -1695,7 +1699,7 @@ const DILIGENCE_FALLBACK_TEXT = {
1695
1699
  "",
1696
1700
  "The system automatically surfaces still-running tellasks (those without feedback yet) as reminder items; treat reminders as the single source of truth for whether a tellask is still in progress.",
1697
1701
  "",
1698
- "For any historical tellask not listed in reminders, do not keep waiting (it usually means the previous round already replied or ended). If that workstream should continue, immediately re-tellask the same teammate with the same `!tellaskSession <slug>` and explicitly ask for the next step."
1702
+ "For any historical tellask not listed in reminders, do not keep waiting (it usually means the previous round already replied or ended). If that workstream should continue, immediately call `tellask` for the same teammate with the same `sessionSlug` and explicitly ask for the next step."
1699
1703
  ].join("\n")
1700
1704
  };
1701
1705
  function escapeHtml$2(text2) {
@@ -1862,8 +1866,8 @@ class ArchivedDialogList extends HTMLElement {
1862
1866
  }
1863
1867
  getDialogDisplayCallsign(dialog) {
1864
1868
  const assignment = dialog.assignmentFromSup;
1865
- if (assignment && typeof assignment.tellaskHead === "string") {
1866
- if (/^\s*@self\b/.test(assignment.tellaskHead)) return "@self";
1869
+ if (assignment?.callName === "freshBootsReasoning") {
1870
+ return "FBR";
1867
1871
  }
1868
1872
  return `@${dialog.agentId}`;
1869
1873
  }
@@ -2210,7 +2214,7 @@ class ArchivedDialogList extends HTMLElement {
2210
2214
  const t2 = getUiStrings(this.props.uiLanguage);
2211
2215
  const isSelected = this.isSelectedDialog(dialog, this.selectionState);
2212
2216
  const updatedAt = dialog.lastModified || "";
2213
- const tellaskSessionMark = dialog.tellaskSession ?? "";
2217
+ const sessionSlugMark = dialog.sessionSlug ?? "";
2214
2218
  const callsign = this.getDialogDisplayCallsign(dialog);
2215
2219
  return `
2216
2220
  <div
@@ -2232,7 +2236,7 @@ class ArchivedDialogList extends HTMLElement {
2232
2236
  </div>
2233
2237
  <div class="dialog-row dialog-submeta">
2234
2238
  <span class="dialog-meta-right">
2235
- <span class="dialog-topic">${tellaskSessionMark}</span>
2239
+ <span class="dialog-topic">${sessionSlugMark}</span>
2236
2240
  </span>
2237
2241
  </div>
2238
2242
  </div>
@@ -2375,7 +2379,7 @@ class ArchivedDialogList extends HTMLElement {
2375
2379
  agentName: "",
2376
2380
  taskDocPath: dialog.taskDocPath,
2377
2381
  supdialogId: dialog.supdialogId,
2378
- tellaskSession: dialog.tellaskSession,
2382
+ sessionSlug: dialog.sessionSlug,
2379
2383
  assignmentFromSup: dialog.assignmentFromSup
2380
2384
  };
2381
2385
  this.props.onSelect(dialogInfo);
@@ -3243,40 +3247,6 @@ _CreateDialogFlowController.AGENT_PRIMING_MODE_STORAGE_KEY = "agent-priming-mode
3243
3247
  _CreateDialogFlowController.AGENT_PRIMING_MODE_SHADOW_STORAGE_KEY = "agent-priming-mode-shadow-v1";
3244
3248
  let CreateDialogFlowController = _CreateDialogFlowController;
3245
3249
  const mannedToolIcon = "data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3csvg%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20x='0px'%20y='0px'%20viewBox='0%200%20122.88%20120.92'%20style='enable-background:new%200%200%20122.88%20120.92'%20xml:space='preserve'%3e%3cstyle%20type='text/css'%3e.st0{fill-rule:evenodd;clip-rule:evenodd;}%3c/style%3e%3cg%20transform='scale(0.8)%20translate(15,%2015)'%3e%3cpath%20class='st0'%20d='M117.32,101.23c0.8-2.32,1.23-4.81,1.23-7.39c0-6.28-2.55-11.97-6.67-16.09c-4.12-4.12-9.81-6.66-16.09-6.66%20c-6.28,0-11.97,2.55-16.09,6.66c-4.12,4.12-6.66,9.81-6.66,16.09c0,6.28,2.55,11.97,6.66,16.09c4.12,4.12,9.81,6.66,16.09,6.66%20c5.75,0,11-2.13,15.01-5.65C113.74,108.36,116.05,104.93,117.32,101.23L117.32,101.23z%20M86.36,96.38%20c-2.05,0.37-4.05,1.07-5.14,3.79c-0.71,1.76-0.54,3.89,0.35,5.82c2.42-7.38,10.92-3.02,5.45,3.34c4,0.2,6.53-2.6,6.93-6.37%20c0.19-1.78,0.34-2.74,0.73-3.51c0.21-0.42,0.5-0.78,0.89-1.2c1.31-1.44,2.77-2.7,4.2-4.19c2.69-2.81,8.42-0.22,10.61-5.72%20c0.71-1.76,0.54-3.89-0.35-5.82c-2.42,7.38-10.92,3.02-5.45-3.34c-4-0.2-6.53,2.6-6.93,6.37c-0.17,1.66,0.12,3.07-1.72,4.96%20c-1.29,1.29-2.66,2.61-3.99,3.87c-0.52,0.51-0.9,0.81-1.35,1.03c-0.8,0.4-1.78,0.52-4.22,0.95L86.36,96.38L86.36,96.38z%20M86.25,23.86l-0.03,0.09c-6.47-1.21-15.81-1.84-25.66-1.72c-9.96,0.11-20.49,0.98-29.17,2.76l-0.01-0.04%20C23.81-10.65,96.24-5.56,86.25,23.86L86.25,23.86z%20M44.15,62.42c-4.4,3.08-8.99,4.22-13.47,5.05l6.41,18.16h32.89%20c-0.82,2.59-1.27,5.35-1.27,8.21c0,7.48,3.03,14.25,7.93,19.15c4.9,4.9,11.67,7.93,19.15,7.93c7.48,0,14.25-3.03,19.15-7.93%20c5.15-5.15,7.93-11.84,7.93-19.15c0-7.48-3.03-14.25-7.93-19.15c-4.9-4.9-11.67-7.93-19.15-7.93c-2.32,0-4.57,0.29-6.72,0.84%20c-3.97-0.4-8.09-0.72-11.02-2.24c-1.34-0.83-2.51-1.99-3.59-3.46l-0.19-3c1.04-0.85,2.04-1.85,2.89-2.96%20c1.93-2.41,2.67-4.89,3.59-8.04c0.19-0.67,0.37-1.33,0.59-2c1.82-0.19,3.41-2.22,4.37-4.74c0.52-1.41,0.93-3,1.04-4.41%20c0.15-1.48,0-2.85-0.52-3.78c-0.41-0.74-1.04-1.22-1.89-1.3c-0.06-0.74,0.27-2.31,0.72-3.98c-6.13-1.1-15.03-1.67-24.5-1.56%20c-9.72,0.11-19.99,0.95-28.4,2.69l0.82,3.93c-0.63,1.04-0.78,2.67-0.59,4.41c0.19,1.7,0.7,3.48,1.45,4.97%20c0.96,1.89,2.33,3.22,3.93,3.22c0.15,0.44,0.33,0.93,0.48,1.41c1.3,3.82,2.26,6.71,4.59,9.45c0.67,0.82,1.41,1.56,2.19,2.22%20l-0.19,3.37C44.63,62,44.39,62.21,44.15,62.42L44.15,62.42z%20M71.94,60.07c-4.18,2.79-6.73,4.32-12.14,4.19%20c-5.26-0.08-8.01-1.86-12.22-4.52C47.26,77.31,72.37,78.36,71.94,60.07L71.94,60.07z%20M78.21,47.33c0.22-0.78,0.48-1.59,0.78-2.56%20c0.11-0.41,0.52-0.7,0.93-0.63c1.22,0.22,2.45-1.56,3.3-3.71c0.48-1.3,0.85-2.7,0.96-3.96c0.11-1.19,0-2.22-0.33-2.85%20c-0.33-0.61-1.25-0.26-1.93-0.85c-3.51,9.31-34.11,13.52-46.63,0.7c-0.44,0.7-0.52,1.96-0.37,3.37c0.19,1.48,0.63,3.11,1.3,4.41%20c0.78,1.52,1.78,2.56,2.78,2.3c0.41-0.11,0.85,0.11,1,0.52c0.3,0.82,0.48,1.45,0.7,2.07C47.18,65.2,71.84,66.69,78.21,47.33%20L78.21,47.33z%20M28.14,91.38c1.45,0,2.63,1.18,2.63,2.63c0,1.45-1.18,2.63-2.63,2.63c-1.45,0-2.63-1.18-2.63-2.63%20C25.52,92.56,26.69,91.38,28.14,91.38L28.14,91.38z%20M23.25,68.84C14.98,70.72,7.71,74.8,3.63,92.75L0,106.64h19.67V89.45%20c0-2.11,1.72-3.83,3.83-3.83h4.09C27.42,78.97,24.1,71.99,23.25,68.84L23.25,68.84z'/%3e%3c/g%3e%3c/svg%3e";
3246
- function parseTeammateCallError(result) {
3247
- const trimmed = result.trim();
3248
- if (trimmed === "") return null;
3249
- const firstNewline = trimmed.indexOf("\n");
3250
- const firstLine = (firstNewline >= 0 ? trimmed.slice(0, firstNewline) : trimmed).trim();
3251
- const rest = firstNewline >= 0 ? trimmed.slice(firstNewline + 1).trim() : "";
3252
- if (firstLine === "ERR_UNKNOWN_CALL") return { code: "ERR_UNKNOWN_CALL" };
3253
- if (firstLine === "ERR_TOOL_EXECUTION") {
3254
- return rest ? { code: "ERR_TOOL_EXECUTION", detail: rest } : { code: "ERR_TOOL_EXECUTION" };
3255
- }
3256
- return null;
3257
- }
3258
- function formatTeammateCallErrorInline(options) {
3259
- if (options.parsed.code === "ERR_UNKNOWN_CALL") {
3260
- if (options.language === "zh") {
3261
- return `未知诉请:@${options.responderId}
3262
- 标题:${options.tellaskHead}`;
3263
- }
3264
- return `Unknown call: @${options.responderId}
3265
- Head: ${options.tellaskHead}`;
3266
- }
3267
- if (options.language === "zh") {
3268
- const detail2 = options.parsed.detail ? `
3269
- 详情:
3270
- ${options.parsed.detail}` : "";
3271
- return `执行 @${options.responderId} 出错
3272
- 标题:${options.tellaskHead}${detail2}`;
3273
- }
3274
- const detail = options.parsed.detail ? `
3275
- Detail:
3276
- ${options.parsed.detail}` : "";
3277
- return `Error executing @${options.responderId}
3278
- Head: ${options.tellaskHead}${detail}`;
3279
- }
3280
3250
  const {
3281
3251
  entries,
3282
3252
  setPrototypeOf,
@@ -96489,12 +96459,12 @@ var registerDefaultLayoutLoaders = /* @__PURE__ */ __name(() => {
96489
96459
  registerLayoutLoaders([
96490
96460
  {
96491
96461
  name: "dagre",
96492
- loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-6UL2VRFP-BT252775.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0), "loader")
96462
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./dagre-6UL2VRFP-Bj8vSSpT.js"), true ? __vite__mapDeps([0,1,2,3,4,5]) : void 0), "loader")
96493
96463
  },
96494
96464
  ...[
96495
96465
  {
96496
96466
  name: "cose-bilkent",
96497
- loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-DaW3q2vS.js"), true ? __vite__mapDeps([6,7]) : void 0), "loader")
96467
+ loader: /* @__PURE__ */ __name(async () => await __vitePreload(() => import("./cose-bilkent-S5V4N54A-B-FUX86B.js"), true ? __vite__mapDeps([6,7]) : void 0), "loader")
96498
96468
  }
96499
96469
  ]
96500
96470
  ]);
@@ -96934,7 +96904,7 @@ var detector = /* @__PURE__ */ __name((txt) => {
96934
96904
  }, "detector");
96935
96905
  var loader = /* @__PURE__ */ __name(async () => {
96936
96906
  const { diagram: diagram2 } = await __vitePreload(async () => {
96937
- const { diagram: diagram22 } = await import("./c4Diagram-YG6GDRKO-2YQZQ-KQ.js");
96907
+ const { diagram: diagram22 } = await import("./c4Diagram-YG6GDRKO-Bnp-nWKO.js");
96938
96908
  return { diagram: diagram22 };
96939
96909
  }, true ? __vite__mapDeps([8,9]) : void 0);
96940
96910
  return { id, diagram: diagram2 };
@@ -96954,7 +96924,7 @@ var detector2 = /* @__PURE__ */ __name((txt, config2) => {
96954
96924
  }, "detector");
96955
96925
  var loader2 = /* @__PURE__ */ __name(async () => {
96956
96926
  const { diagram: diagram2 } = await __vitePreload(async () => {
96957
- const { diagram: diagram22 } = await import("./flowDiagram-NV44I4VS-k203P84f.js");
96927
+ const { diagram: diagram22 } = await import("./flowDiagram-NV44I4VS-ChkkAldk.js");
96958
96928
  return { diagram: diagram22 };
96959
96929
  }, true ? __vite__mapDeps([10,11,12,13,14]) : void 0);
96960
96930
  return { id: id2, diagram: diagram2 };
@@ -96980,7 +96950,7 @@ var detector3 = /* @__PURE__ */ __name((txt, config2) => {
96980
96950
  }, "detector");
96981
96951
  var loader3 = /* @__PURE__ */ __name(async () => {
96982
96952
  const { diagram: diagram2 } = await __vitePreload(async () => {
96983
- const { diagram: diagram22 } = await import("./flowDiagram-NV44I4VS-k203P84f.js");
96953
+ const { diagram: diagram22 } = await import("./flowDiagram-NV44I4VS-ChkkAldk.js");
96984
96954
  return { diagram: diagram22 };
96985
96955
  }, true ? __vite__mapDeps([10,11,12,13,14]) : void 0);
96986
96956
  return { id: id3, diagram: diagram2 };
@@ -96997,7 +96967,7 @@ var detector4 = /* @__PURE__ */ __name((txt) => {
96997
96967
  }, "detector");
96998
96968
  var loader4 = /* @__PURE__ */ __name(async () => {
96999
96969
  const { diagram: diagram2 } = await __vitePreload(async () => {
97000
- const { diagram: diagram22 } = await import("./erDiagram-Q2GNP2WA-CMdkkngT.js");
96970
+ const { diagram: diagram22 } = await import("./erDiagram-Q2GNP2WA-CQ25uxxf.js");
97001
96971
  return { diagram: diagram22 };
97002
96972
  }, true ? __vite__mapDeps([15,12,13,14]) : void 0);
97003
96973
  return { id: id4, diagram: diagram2 };
@@ -97014,7 +96984,7 @@ var detector5 = /* @__PURE__ */ __name((txt) => {
97014
96984
  }, "detector");
97015
96985
  var loader5 = /* @__PURE__ */ __name(async () => {
97016
96986
  const { diagram: diagram2 } = await __vitePreload(async () => {
97017
- const { diagram: diagram22 } = await import("./gitGraphDiagram-NY62KEGX-BGOR_N5w.js");
96987
+ const { diagram: diagram22 } = await import("./gitGraphDiagram-NY62KEGX-CtBc2dOO.js");
97018
96988
  return { diagram: diagram22 };
97019
96989
  }, true ? __vite__mapDeps([16,17,18,19,4,2]) : void 0);
97020
96990
  return { id: id5, diagram: diagram2 };
@@ -97031,7 +97001,7 @@ var detector6 = /* @__PURE__ */ __name((txt) => {
97031
97001
  }, "detector");
97032
97002
  var loader6 = /* @__PURE__ */ __name(async () => {
97033
97003
  const { diagram: diagram2 } = await __vitePreload(async () => {
97034
- const { diagram: diagram22 } = await import("./ganttDiagram-JELNMOA3-CgsVe01-.js");
97004
+ const { diagram: diagram22 } = await import("./ganttDiagram-JELNMOA3-CBt_Zorl.js");
97035
97005
  return { diagram: diagram22 };
97036
97006
  }, true ? __vite__mapDeps([20,21,22,23]) : void 0);
97037
97007
  return { id: id6, diagram: diagram2 };
@@ -97048,7 +97018,7 @@ var detector7 = /* @__PURE__ */ __name((txt) => {
97048
97018
  }, "detector");
97049
97019
  var loader7 = /* @__PURE__ */ __name(async () => {
97050
97020
  const { diagram: diagram2 } = await __vitePreload(async () => {
97051
- const { diagram: diagram22 } = await import("./infoDiagram-WHAUD3N6-D0GlWUIm.js");
97021
+ const { diagram: diagram22 } = await import("./infoDiagram-WHAUD3N6-BYJF-Ol5.js");
97052
97022
  return { diagram: diagram22 };
97053
97023
  }, true ? __vite__mapDeps([24,19,4,2]) : void 0);
97054
97024
  return { id: id7, diagram: diagram2 };
@@ -97064,7 +97034,7 @@ var detector8 = /* @__PURE__ */ __name((txt) => {
97064
97034
  }, "detector");
97065
97035
  var loader8 = /* @__PURE__ */ __name(async () => {
97066
97036
  const { diagram: diagram2 } = await __vitePreload(async () => {
97067
- const { diagram: diagram22 } = await import("./pieDiagram-ADFJNKIX-B91oxvos.js");
97037
+ const { diagram: diagram22 } = await import("./pieDiagram-ADFJNKIX-xAcmdymv.js");
97068
97038
  return { diagram: diagram22 };
97069
97039
  }, true ? __vite__mapDeps([25,17,19,4,2,26,27,22]) : void 0);
97070
97040
  return { id: id8, diagram: diagram2 };
@@ -97080,7 +97050,7 @@ var detector9 = /* @__PURE__ */ __name((txt) => {
97080
97050
  }, "detector");
97081
97051
  var loader9 = /* @__PURE__ */ __name(async () => {
97082
97052
  const { diagram: diagram2 } = await __vitePreload(async () => {
97083
- const { diagram: diagram22 } = await import("./quadrantDiagram-AYHSOK5B-DqMUyBPr.js");
97053
+ const { diagram: diagram22 } = await import("./quadrantDiagram-AYHSOK5B-BPbEGCEj.js");
97084
97054
  return { diagram: diagram22 };
97085
97055
  }, true ? __vite__mapDeps([28,21,22,23]) : void 0);
97086
97056
  return { id: id9, diagram: diagram2 };
@@ -97097,7 +97067,7 @@ var detector10 = /* @__PURE__ */ __name((txt) => {
97097
97067
  }, "detector");
97098
97068
  var loader10 = /* @__PURE__ */ __name(async () => {
97099
97069
  const { diagram: diagram2 } = await __vitePreload(async () => {
97100
- const { diagram: diagram22 } = await import("./xychartDiagram-PRI3JC2R-DDRlTIfV.js");
97070
+ const { diagram: diagram22 } = await import("./xychartDiagram-PRI3JC2R-ByFAvTeN.js");
97101
97071
  return { diagram: diagram22 };
97102
97072
  }, true ? __vite__mapDeps([29,22,27,21,23]) : void 0);
97103
97073
  return { id: id10, diagram: diagram2 };
@@ -97114,7 +97084,7 @@ var detector11 = /* @__PURE__ */ __name((txt) => {
97114
97084
  }, "detector");
97115
97085
  var loader11 = /* @__PURE__ */ __name(async () => {
97116
97086
  const { diagram: diagram2 } = await __vitePreload(async () => {
97117
- const { diagram: diagram22 } = await import("./requirementDiagram-UZGBJVZJ-COUayA3m.js");
97087
+ const { diagram: diagram22 } = await import("./requirementDiagram-UZGBJVZJ--w6UfXy0.js");
97118
97088
  return { diagram: diagram22 };
97119
97089
  }, true ? __vite__mapDeps([30,12,13]) : void 0);
97120
97090
  return { id: id11, diagram: diagram2 };
@@ -97131,7 +97101,7 @@ var detector12 = /* @__PURE__ */ __name((txt) => {
97131
97101
  }, "detector");
97132
97102
  var loader12 = /* @__PURE__ */ __name(async () => {
97133
97103
  const { diagram: diagram2 } = await __vitePreload(async () => {
97134
- const { diagram: diagram22 } = await import("./sequenceDiagram-WL72ISMW-CpuTC5cG.js");
97104
+ const { diagram: diagram22 } = await import("./sequenceDiagram-WL72ISMW-DX_oVvqA.js");
97135
97105
  return { diagram: diagram22 };
97136
97106
  }, true ? __vite__mapDeps([31,9,18]) : void 0);
97137
97107
  return { id: id12, diagram: diagram2 };
@@ -97151,7 +97121,7 @@ var detector13 = /* @__PURE__ */ __name((txt, config2) => {
97151
97121
  }, "detector");
97152
97122
  var loader13 = /* @__PURE__ */ __name(async () => {
97153
97123
  const { diagram: diagram2 } = await __vitePreload(async () => {
97154
- const { diagram: diagram22 } = await import("./classDiagram-2ON5EDUG-pLBmQ3Qa.js");
97124
+ const { diagram: diagram22 } = await import("./classDiagram-2ON5EDUG-Ccx5_2Xq.js");
97155
97125
  return { diagram: diagram22 };
97156
97126
  }, true ? __vite__mapDeps([32,33,11,12,13]) : void 0);
97157
97127
  return { id: id13, diagram: diagram2 };
@@ -97171,7 +97141,7 @@ var detector14 = /* @__PURE__ */ __name((txt, config2) => {
97171
97141
  }, "detector");
97172
97142
  var loader14 = /* @__PURE__ */ __name(async () => {
97173
97143
  const { diagram: diagram2 } = await __vitePreload(async () => {
97174
- const { diagram: diagram22 } = await import("./classDiagram-v2-WZHVMYZB-pLBmQ3Qa.js");
97144
+ const { diagram: diagram22 } = await import("./classDiagram-v2-WZHVMYZB-Ccx5_2Xq.js");
97175
97145
  return { diagram: diagram22 };
97176
97146
  }, true ? __vite__mapDeps([34,33,11,12,13]) : void 0);
97177
97147
  return { id: id14, diagram: diagram2 };
@@ -97191,7 +97161,7 @@ var detector15 = /* @__PURE__ */ __name((txt, config2) => {
97191
97161
  }, "detector");
97192
97162
  var loader15 = /* @__PURE__ */ __name(async () => {
97193
97163
  const { diagram: diagram2 } = await __vitePreload(async () => {
97194
- const { diagram: diagram22 } = await import("./stateDiagram-FKZM4ZOC-Bxoo7e6E.js");
97164
+ const { diagram: diagram22 } = await import("./stateDiagram-FKZM4ZOC-BAybZU8l.js");
97195
97165
  return { diagram: diagram22 };
97196
97166
  }, true ? __vite__mapDeps([35,36,12,13,1,2,3,4]) : void 0);
97197
97167
  return { id: id15, diagram: diagram2 };
@@ -97214,7 +97184,7 @@ var detector16 = /* @__PURE__ */ __name((txt, config2) => {
97214
97184
  }, "detector");
97215
97185
  var loader16 = /* @__PURE__ */ __name(async () => {
97216
97186
  const { diagram: diagram2 } = await __vitePreload(async () => {
97217
- const { diagram: diagram22 } = await import("./stateDiagram-v2-4FDKWEC3-Q-DL7tae.js");
97187
+ const { diagram: diagram22 } = await import("./stateDiagram-v2-4FDKWEC3-BUsvuCdD.js");
97218
97188
  return { diagram: diagram22 };
97219
97189
  }, true ? __vite__mapDeps([37,36,12,13]) : void 0);
97220
97190
  return { id: id16, diagram: diagram2 };
@@ -97231,7 +97201,7 @@ var detector17 = /* @__PURE__ */ __name((txt) => {
97231
97201
  }, "detector");
97232
97202
  var loader17 = /* @__PURE__ */ __name(async () => {
97233
97203
  const { diagram: diagram2 } = await __vitePreload(async () => {
97234
- const { diagram: diagram22 } = await import("./journeyDiagram-XKPGCS4Q-I0W1fDTZ.js");
97204
+ const { diagram: diagram22 } = await import("./journeyDiagram-XKPGCS4Q-Cl2p8ZBw.js");
97235
97205
  return { diagram: diagram22 };
97236
97206
  }, true ? __vite__mapDeps([38,9,11,26]) : void 0);
97237
97207
  return { id: id17, diagram: diagram2 };
@@ -97301,7 +97271,7 @@ var detector18 = /* @__PURE__ */ __name((txt, config2 = {}) => {
97301
97271
  }, "detector");
97302
97272
  var loader18 = /* @__PURE__ */ __name(async () => {
97303
97273
  const { diagram: diagram2 } = await __vitePreload(async () => {
97304
- const { diagram: diagram22 } = await import("./flowDiagram-NV44I4VS-k203P84f.js");
97274
+ const { diagram: diagram22 } = await import("./flowDiagram-NV44I4VS-ChkkAldk.js");
97305
97275
  return { diagram: diagram22 };
97306
97276
  }, true ? __vite__mapDeps([10,11,12,13,14]) : void 0);
97307
97277
  return { id: id18, diagram: diagram2 };
@@ -97318,7 +97288,7 @@ var detector19 = /* @__PURE__ */ __name((txt) => {
97318
97288
  }, "detector");
97319
97289
  var loader19 = /* @__PURE__ */ __name(async () => {
97320
97290
  const { diagram: diagram2 } = await __vitePreload(async () => {
97321
- const { diagram: diagram22 } = await import("./timeline-definition-IT6M3QCI-DuOiHQPk.js");
97291
+ const { diagram: diagram22 } = await import("./timeline-definition-IT6M3QCI-DOYN-4XM.js");
97322
97292
  return { diagram: diagram22 };
97323
97293
  }, true ? __vite__mapDeps([39,26]) : void 0);
97324
97294
  return { id: id19, diagram: diagram2 };
@@ -97335,7 +97305,7 @@ var detector20 = /* @__PURE__ */ __name((txt) => {
97335
97305
  }, "detector");
97336
97306
  var loader20 = /* @__PURE__ */ __name(async () => {
97337
97307
  const { diagram: diagram2 } = await __vitePreload(async () => {
97338
- const { diagram: diagram22 } = await import("./mindmap-definition-VGOIOE7T-BWhHo-Hq.js");
97308
+ const { diagram: diagram22 } = await import("./mindmap-definition-VGOIOE7T-BjJnBRtB.js");
97339
97309
  return { diagram: diagram22 };
97340
97310
  }, true ? __vite__mapDeps([40,12,13]) : void 0);
97341
97311
  return { id: id20, diagram: diagram2 };
@@ -97352,7 +97322,7 @@ var detector21 = /* @__PURE__ */ __name((txt) => {
97352
97322
  }, "detector");
97353
97323
  var loader21 = /* @__PURE__ */ __name(async () => {
97354
97324
  const { diagram: diagram2 } = await __vitePreload(async () => {
97355
- const { diagram: diagram22 } = await import("./kanban-definition-3W4ZIXB7-BY5xVZyl.js");
97325
+ const { diagram: diagram22 } = await import("./kanban-definition-3W4ZIXB7-DBH-HEwY.js");
97356
97326
  return { diagram: diagram22 };
97357
97327
  }, true ? __vite__mapDeps([41,11]) : void 0);
97358
97328
  return { id: id21, diagram: diagram2 };
@@ -97369,7 +97339,7 @@ var detector22 = /* @__PURE__ */ __name((txt) => {
97369
97339
  }, "detector");
97370
97340
  var loader22 = /* @__PURE__ */ __name(async () => {
97371
97341
  const { diagram: diagram2 } = await __vitePreload(async () => {
97372
- const { diagram: diagram22 } = await import("./sankeyDiagram-TZEHDZUN-Bp9r8YDi.js");
97342
+ const { diagram: diagram22 } = await import("./sankeyDiagram-TZEHDZUN-B_T6TQwh.js");
97373
97343
  return { diagram: diagram22 };
97374
97344
  }, true ? __vite__mapDeps([42,27,22]) : void 0);
97375
97345
  return { id: id22, diagram: diagram2 };
@@ -97386,7 +97356,7 @@ var detector23 = /* @__PURE__ */ __name((txt) => {
97386
97356
  }, "detector");
97387
97357
  var loader23 = /* @__PURE__ */ __name(async () => {
97388
97358
  const { diagram: diagram2 } = await __vitePreload(async () => {
97389
- const { diagram: diagram22 } = await import("./diagram-S2PKOQOG-SNGZ1B53.js");
97359
+ const { diagram: diagram22 } = await import("./diagram-S2PKOQOG-C4ynhhLr.js");
97390
97360
  return { diagram: diagram22 };
97391
97361
  }, true ? __vite__mapDeps([43,17,19,4,2]) : void 0);
97392
97362
  return { id: id23, diagram: diagram2 };
@@ -97402,7 +97372,7 @@ var detector24 = /* @__PURE__ */ __name((txt) => {
97402
97372
  }, "detector");
97403
97373
  var loader24 = /* @__PURE__ */ __name(async () => {
97404
97374
  const { diagram: diagram2 } = await __vitePreload(async () => {
97405
- const { diagram: diagram22 } = await import("./diagram-QEK2KX5R-BYEiCch_.js");
97375
+ const { diagram: diagram22 } = await import("./diagram-QEK2KX5R-DHxd6LWi.js");
97406
97376
  return { diagram: diagram22 };
97407
97377
  }, true ? __vite__mapDeps([44,17,19,4,2]) : void 0);
97408
97378
  return { id: id24, diagram: diagram2 };
@@ -97418,7 +97388,7 @@ var detector25 = /* @__PURE__ */ __name((txt) => {
97418
97388
  }, "detector");
97419
97389
  var loader25 = /* @__PURE__ */ __name(async () => {
97420
97390
  const { diagram: diagram2 } = await __vitePreload(async () => {
97421
- const { diagram: diagram22 } = await import("./blockDiagram-VD42YOAC-C66ZvUb1.js");
97391
+ const { diagram: diagram22 } = await import("./blockDiagram-VD42YOAC-C-pRNHpf.js");
97422
97392
  return { diagram: diagram22 };
97423
97393
  }, true ? __vite__mapDeps([45,11,5,1,2,14]) : void 0);
97424
97394
  return { id: id25, diagram: diagram2 };
@@ -97435,7 +97405,7 @@ var detector26 = /* @__PURE__ */ __name((txt) => {
97435
97405
  }, "detector");
97436
97406
  var loader26 = /* @__PURE__ */ __name(async () => {
97437
97407
  const { diagram: diagram2 } = await __vitePreload(async () => {
97438
- const { diagram: diagram22 } = await import("./architectureDiagram-VXUJARFQ-CV1IIalQ.js");
97408
+ const { diagram: diagram22 } = await import("./architectureDiagram-VXUJARFQ-DToIiZuZ.js");
97439
97409
  return { diagram: diagram22 };
97440
97410
  }, true ? __vite__mapDeps([46,17,19,4,2,7]) : void 0);
97441
97411
  return { id: id26, diagram: diagram2 };
@@ -97452,7 +97422,7 @@ var detector27 = /* @__PURE__ */ __name((txt) => {
97452
97422
  }, "detector");
97453
97423
  var loader27 = /* @__PURE__ */ __name(async () => {
97454
97424
  const { diagram: diagram2 } = await __vitePreload(async () => {
97455
- const { diagram: diagram22 } = await import("./diagram-PSM6KHXK-Cp0jEYgm.js");
97425
+ const { diagram: diagram22 } = await import("./diagram-PSM6KHXK-BPcgy7jf.js");
97456
97426
  return { diagram: diagram22 };
97457
97427
  }, true ? __vite__mapDeps([47,13,17,19,4,2,23,27,22]) : void 0);
97458
97428
  return { id: id27, diagram: diagram2 };
@@ -98494,8 +98464,11 @@ class DomindsDialogContainer extends HTMLElement {
98494
98464
  this.autoScrollResizeObservedEl = null;
98495
98465
  this.teammateCallingSectionBySeq = /* @__PURE__ */ new Map();
98496
98466
  this.callingSectionByCallId = /* @__PURE__ */ new Map();
98467
+ this.pendingCallTimingById = /* @__PURE__ */ new Map();
98468
+ this.callTimingTicker = null;
98497
98469
  this.webSearchSectionByItemId = /* @__PURE__ */ new Map();
98498
98470
  this.webSearchSectionBySeq = /* @__PURE__ */ new Map();
98471
+ this.pendingTeammateCallAnchorByGenseq = /* @__PURE__ */ new Map();
98499
98472
  this.pendingScrollRequest = null;
98500
98473
  this.highlightSeq = 0;
98501
98474
  this.pendingHighlight = null;
@@ -98662,6 +98635,52 @@ class DomindsDialogContainer extends HTMLElement {
98662
98635
  sr.addEventListener("click", async (e2) => {
98663
98636
  const target = e2.target;
98664
98637
  if (!target) return;
98638
+ const assignmentBtn = target.closest(
98639
+ ".bubble-anchor-assignment-btn"
98640
+ );
98641
+ if (assignmentBtn) {
98642
+ e2.preventDefault();
98643
+ e2.stopPropagation();
98644
+ const bubble = assignmentBtn.closest(".generation-bubble");
98645
+ if (!bubble) return;
98646
+ const assignmentCourseRaw = Number.parseInt(
98647
+ bubble.getAttribute("data-assignment-course") ?? "",
98648
+ 10
98649
+ );
98650
+ const assignmentGenseqRaw = Number.parseInt(
98651
+ bubble.getAttribute("data-assignment-genseq") ?? "",
98652
+ 10
98653
+ );
98654
+ if (!Number.isFinite(assignmentCourseRaw) || assignmentCourseRaw <= 0) return;
98655
+ if (!Number.isFinite(assignmentGenseqRaw) || assignmentGenseqRaw <= 0) return;
98656
+ this.navigateToGenerationBubbleInApp(
98657
+ Math.floor(assignmentCourseRaw),
98658
+ Math.floor(assignmentGenseqRaw)
98659
+ );
98660
+ return;
98661
+ }
98662
+ const requesterCallsiteBtn = target.closest(
98663
+ ".bubble-anchor-caller-callsite-btn"
98664
+ );
98665
+ if (requesterCallsiteBtn) {
98666
+ e2.preventDefault();
98667
+ e2.stopPropagation();
98668
+ const bubble = requesterCallsiteBtn.closest(".generation-bubble");
98669
+ if (!bubble) return;
98670
+ const callId = (bubble.getAttribute("data-call-id") ?? "").trim();
98671
+ const callerDialogId = (bubble.getAttribute("data-caller-dialog-id") ?? "").trim();
98672
+ const callerCourseRaw = Number.parseInt(
98673
+ bubble.getAttribute("data-caller-course") ?? "",
98674
+ 10
98675
+ );
98676
+ if (callId === "" || callerDialogId === "") return;
98677
+ if (!Number.isFinite(callerCourseRaw) || callerCourseRaw <= 0) return;
98678
+ this.openCallSiteDeepLinkInNewTab(callId, {
98679
+ selfId: callerDialogId,
98680
+ course: Math.floor(callerCourseRaw)
98681
+ });
98682
+ return;
98683
+ }
98665
98684
  const shareBtn = target.closest(".bubble-share-link-btn");
98666
98685
  if (shareBtn) {
98667
98686
  e2.preventDefault();
@@ -98717,6 +98736,16 @@ class DomindsDialogContainer extends HTMLElement {
98717
98736
  this.addEventListener("scroll-to-call-id", this.onScrollToCallId);
98718
98737
  this.addEventListener("scroll-to-genseq", this.onScrollToGenSeq);
98719
98738
  }
98739
+ buildCallIdSelector(callId) {
98740
+ const escaped = CSS.escape(callId);
98741
+ return `.calling-section[data-call-id="${escaped}"], .generation-bubble[data-call-id="${escaped}"]`;
98742
+ }
98743
+ findCallSiteTargetByCallId(messages, callId) {
98744
+ const selector2 = this.buildCallIdSelector(callId);
98745
+ const matches = Array.from(messages.querySelectorAll(selector2));
98746
+ if (matches.length < 1) return null;
98747
+ return matches[matches.length - 1] ?? null;
98748
+ }
98720
98749
  maybeApplyPendingScrollRequest() {
98721
98750
  const req = this.pendingScrollRequest;
98722
98751
  if (!req) return;
@@ -98734,9 +98763,7 @@ class DomindsDialogContainer extends HTMLElement {
98734
98763
  }
98735
98764
  let target = null;
98736
98765
  if (req.kind === "by_call_id") {
98737
- const selector22 = `.calling-section[data-call-id="${CSS.escape(req.callId)}"]`;
98738
- const found = messages.querySelector(selector22);
98739
- target = found instanceof HTMLElement ? found : null;
98766
+ target = this.findCallSiteTargetByCallId(messages, req.callId);
98740
98767
  } else if (req.kind === "by_genseq") {
98741
98768
  const found = messages.querySelector(`.generation-bubble[data-seq="${String(req.genseq)}"]`);
98742
98769
  target = found instanceof HTMLElement ? found : null;
@@ -98766,7 +98793,7 @@ class DomindsDialogContainer extends HTMLElement {
98766
98793
  target.scrollIntoView({ behavior: "smooth", block: "center" });
98767
98794
  let selector2 = null;
98768
98795
  if (req.kind === "by_call_id") {
98769
- selector2 = `.calling-section[data-call-id="${CSS.escape(req.callId)}"]`;
98796
+ selector2 = this.buildCallIdSelector(req.callId);
98770
98797
  } else if (req.kind === "by_genseq") {
98771
98798
  selector2 = `.generation-bubble[data-seq="${String(req.genseq)}"]`;
98772
98799
  } else {
@@ -98916,8 +98943,11 @@ class DomindsDialogContainer extends HTMLElement {
98916
98943
  this.currentCourse = course;
98917
98944
  this.activeGenSeq = void 0;
98918
98945
  this.callingSectionByCallId.clear();
98946
+ this.pendingCallTimingById.clear();
98947
+ this.stopCallTimingTicker();
98919
98948
  this.webSearchSectionByItemId.clear();
98920
98949
  this.webSearchSectionBySeq.clear();
98950
+ this.pendingTeammateCallAnchorByGenseq.clear();
98921
98951
  const messages = this.shadowRoot?.querySelector(".messages");
98922
98952
  if (messages) {
98923
98953
  messages.innerHTML = "";
@@ -98936,8 +98966,11 @@ class DomindsDialogContainer extends HTMLElement {
98936
98966
  this.currentCourse = void 0;
98937
98967
  this.activeGenSeq = void 0;
98938
98968
  this.callingSectionByCallId.clear();
98969
+ this.pendingCallTimingById.clear();
98970
+ this.stopCallTimingTicker();
98939
98971
  this.webSearchSectionByItemId.clear();
98940
98972
  this.webSearchSectionBySeq.clear();
98973
+ this.pendingTeammateCallAnchorByGenseq.clear();
98941
98974
  const messages = this.shadowRoot?.querySelector(".messages");
98942
98975
  if (messages) {
98943
98976
  messages.innerHTML = "";
@@ -99097,30 +99130,10 @@ class DomindsDialogContainer extends HTMLElement {
99097
99130
  case "markdown_finish_evt":
99098
99131
  this.handleMarkdownFinish(event.genseq);
99099
99132
  break;
99100
- // === TELLASK CALL BLOCK EVENTS (streaming mode - `!?@...` blocks) ===
99101
- // Renamed from call_* to teammate_call_* for terminology clarity
99102
- // callId is now set at finish event (not start) - content-hash based
99133
+ // === TELLASK CALL EVENTS (function-tool channel) ===
99103
99134
  case "teammate_call_start_evt":
99104
99135
  this.handleToolCallStart(event);
99105
99136
  break;
99106
- case "teammate_call_headline_chunk_evt":
99107
- this.handleToolCallHeadlineChunk(event.genseq, event.chunk);
99108
- break;
99109
- case "teammate_call_headline_finish_evt":
99110
- this.handleToolCallHeadlineFinish(event.genseq);
99111
- break;
99112
- case "teammate_call_body_start_evt":
99113
- this.handleToolCallBodyStart(event.genseq);
99114
- break;
99115
- case "teammate_call_body_chunk_evt":
99116
- this.handleToolCallBodyChunk(event.genseq, event.chunk);
99117
- break;
99118
- case "teammate_call_body_finish_evt":
99119
- this.handleToolCallBodyFinish(event.genseq);
99120
- break;
99121
- case "teammate_call_finish_evt":
99122
- this.handleToolCallFinish(event);
99123
- break;
99124
99137
  // === FUNCTION CALLS (non-streaming mode - direct tool execution) ===
99125
99138
  case "func_call_requested_evt": {
99126
99139
  const ev = event;
@@ -99143,10 +99156,13 @@ class DomindsDialogContainer extends HTMLElement {
99143
99156
  }
99144
99157
  this.handleFuncResult(event);
99145
99158
  break;
99146
- // Teammate-call inline results (attach inline)
99159
+ // Teammate-call lifecycle updates (call site timing + status)
99147
99160
  case "teammate_call_response_evt":
99148
99161
  this.handleToolCallResponse(event);
99149
99162
  break;
99163
+ case "teammate_call_anchor_evt":
99164
+ this.handleTeammateCallAnchor(event);
99165
+ break;
99150
99166
  // Teammate responses (separate bubble)
99151
99167
  case "teammate_response_evt":
99152
99168
  this.handleTeammateResponse(event);
@@ -99192,6 +99208,12 @@ class DomindsDialogContainer extends HTMLElement {
99192
99208
  }
99193
99209
  // === GENERATING EVENTS (Frontend Bubble Management) ===
99194
99210
  handleGeneratingStart(seq2, timestamp2) {
99211
+ const applyPendingCallAnchor = (bubble2) => {
99212
+ const pendingAnchor = this.pendingTeammateCallAnchorByGenseq.get(seq2);
99213
+ if (!pendingAnchor) return;
99214
+ this.applyTeammateCallAnchorToBubble(bubble2, pendingAnchor);
99215
+ this.pendingTeammateCallAnchorByGenseq.delete(seq2);
99216
+ };
99195
99217
  const existingBubble = this.generationBubble;
99196
99218
  if (existingBubble) {
99197
99219
  const existingSeq = existingBubble.getAttribute("data-seq");
@@ -99200,6 +99222,7 @@ class DomindsDialogContainer extends HTMLElement {
99200
99222
  existingBubble.setAttribute("data-finalized", "false");
99201
99223
  this.setBubbleTimestamp(existingBubble, timestamp2);
99202
99224
  this.activeGenSeq = seq2;
99225
+ applyPendingCallAnchor(existingBubble);
99203
99226
  this.startAutoScrollObservation(existingBubble);
99204
99227
  this.scrollToBottom();
99205
99228
  return;
@@ -99216,6 +99239,7 @@ class DomindsDialogContainer extends HTMLElement {
99216
99239
  const container = this.shadowRoot?.querySelector(".messages");
99217
99240
  const bubble = this.createGenerationBubble(timestamp2);
99218
99241
  bubble.setAttribute("data-seq", String(seq2));
99242
+ applyPendingCallAnchor(bubble);
99219
99243
  bubble.classList.add("generating");
99220
99244
  if (container) {
99221
99245
  container.appendChild(bubble);
@@ -99225,8 +99249,15 @@ class DomindsDialogContainer extends HTMLElement {
99225
99249
  this.scrollToBottom();
99226
99250
  }
99227
99251
  ensureGenerationBubbleForSeq(seq2, timestamp2) {
99252
+ const applyPendingCallAnchor = (bubble) => {
99253
+ const pendingAnchor = this.pendingTeammateCallAnchorByGenseq.get(seq2);
99254
+ if (!pendingAnchor) return;
99255
+ this.applyTeammateCallAnchorToBubble(bubble, pendingAnchor);
99256
+ this.pendingTeammateCallAnchorByGenseq.delete(seq2);
99257
+ };
99228
99258
  const currentBubble = this.generationBubble;
99229
99259
  if (currentBubble && currentBubble.getAttribute("data-seq") === String(seq2)) {
99260
+ applyPendingCallAnchor(currentBubble);
99230
99261
  this.startAutoScrollObservation(currentBubble);
99231
99262
  return currentBubble;
99232
99263
  }
@@ -99235,6 +99266,7 @@ class DomindsDialogContainer extends HTMLElement {
99235
99266
  if (existing) {
99236
99267
  this.generationBubble = existing;
99237
99268
  this.activeGenSeq = seq2;
99269
+ applyPendingCallAnchor(existing);
99238
99270
  this.startAutoScrollObservation(existing);
99239
99271
  return existing;
99240
99272
  }
@@ -99474,7 +99506,7 @@ class DomindsDialogContainer extends HTMLElement {
99474
99506
  }
99475
99507
  detailsEl.textContent = lines.join("\n");
99476
99508
  }
99477
- // === TELLASK CALL EVENTS (Streaming mode - `!?@...` blocks) ===
99509
+ // === TELLASK CALL EVENTS (function-call mode) ===
99478
99510
  // callId is set at finish event (not start) - content-hash based
99479
99511
  findInFlightToolCallingSectionForGenseq(genseq) {
99480
99512
  const sr = this.shadowRoot;
@@ -99511,116 +99543,190 @@ class DomindsDialogContainer extends HTMLElement {
99511
99543
  }
99512
99544
  return void 0;
99513
99545
  }
99514
- handleToolCallStart(event) {
99515
- const firstMention = event.validation.kind === "valid" ? event.validation.firstMention : "malformed";
99516
- const genseq = event.genseq;
99517
- const bubble = this.ensureGenerationBubbleForSeq(genseq, event.timestamp);
99518
- if (!bubble) {
99519
- console.warn("[TeammateCallStart] No generation bubble, skipping");
99520
- return;
99521
- }
99522
- const body = bubble.querySelector(".bubble-body");
99523
- const callingSection = this.createCallingSection(firstMention);
99524
- callingSection.setAttribute("data-validation-kind", event.validation.kind);
99525
- if (event.validation.kind === "malformed") {
99526
- callingSection.setAttribute("data-malformed-reason", event.validation.reason);
99527
- callingSection.classList.add("malformed");
99546
+ parseEventTimestampMs(rawTimestamp) {
99547
+ if (typeof rawTimestamp !== "string" || rawTimestamp.trim() === "") return null;
99548
+ const ts = Date.parse(rawTimestamp);
99549
+ return Number.isFinite(ts) ? ts : null;
99550
+ }
99551
+ formatAbsoluteTime(ms) {
99552
+ const d2 = new Date(ms);
99553
+ const y3 = d2.getFullYear();
99554
+ const m2 = String(d2.getMonth() + 1).padStart(2, "0");
99555
+ const day = String(d2.getDate()).padStart(2, "0");
99556
+ const hh = String(d2.getHours()).padStart(2, "0");
99557
+ const mm = String(d2.getMinutes()).padStart(2, "0");
99558
+ const ss = String(d2.getSeconds()).padStart(2, "0");
99559
+ return `${y3}-${m2}-${day} ${hh}:${mm}:${ss}`;
99560
+ }
99561
+ formatDuration(ms) {
99562
+ const totalSeconds = Math.max(0, Math.floor(ms / 1e3));
99563
+ const days = Math.floor(totalSeconds / 86400);
99564
+ const hours = Math.floor(totalSeconds % 86400 / 3600);
99565
+ const minutes = Math.floor(totalSeconds % 3600 / 60);
99566
+ const seconds = totalSeconds % 60;
99567
+ if (this.uiLanguage === "zh") {
99568
+ const parts2 = [];
99569
+ if (days > 0) parts2.push(`${days}天`);
99570
+ if (hours > 0) parts2.push(`${hours}小时`);
99571
+ if (minutes > 0) parts2.push(`${minutes}分`);
99572
+ parts2.push(`${seconds}秒`);
99573
+ return parts2.join("");
99574
+ }
99575
+ const parts = [];
99576
+ if (days > 0) parts.push(`${days}d`);
99577
+ if (hours > 0) parts.push(`${hours}h`);
99578
+ if (minutes > 0) parts.push(`${minutes}m`);
99579
+ parts.push(`${seconds}s`);
99580
+ return parts.join(" ");
99581
+ }
99582
+ normalizeMentionToken(raw) {
99583
+ const trimmed = raw.trim();
99584
+ if (trimmed === "") return "";
99585
+ return trimmed.startsWith("@") ? trimmed : `@${trimmed}`;
99586
+ }
99587
+ extractMentionListFromHeadline(headline) {
99588
+ const re2 = /@([A-Za-z0-9_.-]+)/g;
99589
+ const seen2 = /* @__PURE__ */ new Set();
99590
+ const out = [];
99591
+ for (const match2 of headline.matchAll(re2)) {
99592
+ const id28 = (match2[1] ?? "").trim();
99593
+ if (id28 === "") continue;
99594
+ const mention = `@${id28}`;
99595
+ if (seen2.has(mention)) continue;
99596
+ seen2.add(mention);
99597
+ out.push(mention);
99528
99598
  }
99529
- callingSection.setAttribute("data-genseq", String(genseq));
99530
- (body || bubble).appendChild(callingSection);
99531
- this.callingSection = callingSection;
99532
- this.teammateCallingSectionBySeq.set(genseq, callingSection);
99533
- this.scrollToBottom();
99599
+ return out;
99534
99600
  }
99535
- handleToolCallHeadlineChunk(genseq, chunk) {
99536
- const callingSection = this.getActiveToolCallingSection(genseq);
99537
- if (!callingSection) {
99538
- this.handleProtocolError(
99539
- `teammate_call_headline_chunk_evt received without calling section ${JSON.stringify({
99540
- genseq,
99541
- course: this.currentCourse
99542
- })}`
99543
- );
99601
+ renderMentionList(section, mentions) {
99602
+ const mentionEl = section.querySelector(".calling-headline");
99603
+ if (!mentionEl) return;
99604
+ const normalized = mentions.map((item) => this.normalizeMentionToken(item)).filter((item) => item !== "");
99605
+ const unique = Array.from(new Set(normalized));
99606
+ const joined = unique.length > 0 ? unique.join(", ") : this.uiLanguage === "zh" ? "(无)" : "(none)";
99607
+ mentionEl.textContent = this.uiLanguage === "zh" ? `诉请对象: ${joined}` : `Mentions: ${joined}`;
99608
+ }
99609
+ renderCallTiming(section, state2, startedAtMs, endedAtMs) {
99610
+ const timingEl = section.querySelector(".calling-timing");
99611
+ if (!timingEl) return;
99612
+ const startText = this.formatAbsoluteTime(startedAtMs);
99613
+ if (state2 === "pending") {
99614
+ const elapsed = this.formatDuration(Date.now() - startedAtMs);
99615
+ timingEl.textContent = this.uiLanguage === "zh" ? `开始: ${startText} · 已用时: ${elapsed}` : `Started: ${startText} · Elapsed: ${elapsed}`;
99544
99616
  return;
99545
99617
  }
99546
- const headlineEl = callingSection.querySelector(".calling-headline");
99547
- if (headlineEl) headlineEl.textContent += chunk;
99548
- this.scrollToBottom();
99618
+ const finishedAt = endedAtMs ?? Date.now();
99619
+ const endText = this.formatAbsoluteTime(finishedAt);
99620
+ const total = this.formatDuration(finishedAt - startedAtMs);
99621
+ const statusMark = state2 === "failed" ? this.uiLanguage === "zh" ? "失败" : "failed" : "";
99622
+ timingEl.textContent = this.uiLanguage === "zh" ? `${statusMark ? `状态: ${statusMark} · ` : ""}结束: ${endText} · 总用时: ${total}` : `${statusMark ? `Status: ${statusMark} · ` : ""}Ended: ${endText} · Total: ${total}`;
99549
99623
  }
99550
- handleToolCallHeadlineFinish(genseq) {
99551
- const callingSection = this.getActiveToolCallingSection(genseq);
99552
- if (!callingSection) {
99553
- this.handleProtocolError(
99554
- `teammate_call_headline_finish_evt received without calling section ${JSON.stringify({
99555
- genseq,
99556
- course: this.currentCourse
99557
- })}`
99558
- );
99624
+ refreshPendingCallTimingDisplay() {
99625
+ if (this.pendingCallTimingById.size === 0) {
99626
+ this.stopCallTimingTicker();
99559
99627
  return;
99560
99628
  }
99561
- const headlineEl = callingSection.querySelector(".calling-headline");
99562
- if (headlineEl) headlineEl.classList.add("completed");
99563
- }
99564
- handleToolCallBodyStart(genseq) {
99565
- const callingSection = this.getActiveToolCallingSection(genseq);
99566
- if (!callingSection) {
99567
- console.warn("teammate_call_body_start_evt received without calling section", {
99568
- genseq,
99569
- course: this.currentCourse
99570
- });
99571
- return;
99629
+ for (const [callId, entry] of this.pendingCallTimingById.entries()) {
99630
+ if (!entry.section.isConnected) {
99631
+ this.pendingCallTimingById.delete(callId);
99632
+ continue;
99633
+ }
99634
+ this.renderCallTiming(entry.section, "pending", entry.startedAtMs);
99635
+ }
99636
+ if (this.pendingCallTimingById.size === 0) {
99637
+ this.stopCallTimingTicker();
99638
+ }
99639
+ }
99640
+ ensureCallTimingTicker() {
99641
+ if (this.callTimingTicker !== null) return;
99642
+ this.callTimingTicker = window.setInterval(() => {
99643
+ this.refreshPendingCallTimingDisplay();
99644
+ }, 1e3);
99645
+ }
99646
+ stopCallTimingTicker() {
99647
+ if (this.callTimingTicker === null) return;
99648
+ window.clearInterval(this.callTimingTicker);
99649
+ this.callTimingTicker = null;
99650
+ }
99651
+ markCallSitePending(callId, section, startedAtMs) {
99652
+ section.classList.remove("completed");
99653
+ section.classList.remove("failed");
99654
+ section.classList.add("pending");
99655
+ this.pendingCallTimingById.set(callId, { section, startedAtMs });
99656
+ this.renderCallTiming(section, "pending", startedAtMs);
99657
+ this.ensureCallTimingTicker();
99658
+ }
99659
+ markCallSiteSettled(callId, status, endedAtMs) {
99660
+ const section = this.callingSectionByCallId.get(callId);
99661
+ if (!section) return;
99662
+ const startedRaw = section.getAttribute("data-call-start-ms");
99663
+ const startedAtMsParsed = startedRaw ? Number.parseInt(startedRaw, 10) : Number.NaN;
99664
+ const startedAtMs = Number.isFinite(startedAtMsParsed) ? startedAtMsParsed : endedAtMs;
99665
+ section.classList.remove("pending");
99666
+ section.classList.add("completed");
99667
+ section.classList.toggle("failed", status === "failed");
99668
+ this.pendingCallTimingById.delete(callId);
99669
+ this.renderCallTiming(section, status, startedAtMs, endedAtMs);
99670
+ if (this.pendingCallTimingById.size === 0) {
99671
+ this.stopCallTimingTicker();
99572
99672
  }
99573
- this.scrollToBottom();
99574
99673
  }
99575
- handleToolCallBodyChunk(genseq, chunk) {
99576
- const callingSection = this.getActiveToolCallingSection(genseq);
99577
- if (!callingSection) {
99578
- console.warn("teammate_call_body_chunk_evt received without calling section", {
99579
- genseq,
99580
- course: this.currentCourse
99581
- });
99674
+ handleToolCallStart(event) {
99675
+ const genseq = event.genseq;
99676
+ const mentionList = (() => {
99677
+ switch (event.callName) {
99678
+ case "tellask":
99679
+ case "tellaskSessionless":
99680
+ return event.mentionList;
99681
+ case "tellaskBack":
99682
+ case "askHuman":
99683
+ case "freshBootsReasoning":
99684
+ return [];
99685
+ }
99686
+ })();
99687
+ const firstMention = (() => {
99688
+ if (mentionList.length > 0) {
99689
+ const primaryMention = mentionList[0] ?? "@unknown";
99690
+ return primaryMention.startsWith("@") ? primaryMention.slice(1) : primaryMention;
99691
+ }
99692
+ switch (event.callName) {
99693
+ case "tellaskBack":
99694
+ return "tellaskBack";
99695
+ case "askHuman":
99696
+ return "askHuman";
99697
+ case "freshBootsReasoning":
99698
+ return "freshBootsReasoning";
99699
+ case "tellask":
99700
+ case "tellaskSessionless":
99701
+ return "unknown";
99702
+ }
99703
+ })();
99704
+ const bubble = this.ensureGenerationBubbleForSeq(genseq, event.timestamp);
99705
+ if (!bubble) {
99706
+ console.warn("[TeammateCallStart] No generation bubble, skipping");
99582
99707
  return;
99583
99708
  }
99584
- const bodyEl = callingSection.querySelector(".calling-body");
99585
- if (bodyEl) bodyEl.textContent += chunk;
99586
- this.scrollToBottom();
99587
- }
99588
- handleToolCallBodyFinish(genseq) {
99589
- const callingSection = this.getActiveToolCallingSection(genseq);
99590
- if (!callingSection) {
99591
- console.warn("teammate_call_body_finish_evt received without calling section", {
99592
- genseq,
99593
- course: this.currentCourse
99594
- });
99595
- return;
99709
+ const body = bubble.querySelector(".bubble-body");
99710
+ const callingSection = this.createCallingSection(event.callName, firstMention);
99711
+ const startedAtMs = this.parseEventTimestampMs(event.timestamp) ?? Date.now();
99712
+ callingSection.setAttribute("data-call-start-ms", String(startedAtMs));
99713
+ callingSection.setAttribute("data-call-id", event.callId);
99714
+ if (mentionList.length > 0) {
99715
+ this.renderMentionList(callingSection, mentionList);
99596
99716
  }
99597
99717
  const bodyEl = callingSection.querySelector(".calling-body");
99598
- if (bodyEl) bodyEl.classList.add("completed");
99599
- }
99600
- handleToolCallFinish(event) {
99601
- const currentSection = this.getActiveToolCallingSection(event.genseq);
99602
- if (!currentSection) {
99603
- this.handleProtocolError(
99604
- `teammate_call_finish_evt received without calling section ${JSON.stringify({
99605
- genseq: event.genseq,
99606
- course: this.currentCourse,
99607
- callId: event.callId
99608
- })}`
99609
- );
99610
- return;
99611
- }
99612
- const callId = String(event.callId || "").trim();
99613
- if (!callId) {
99614
- this.handleProtocolError(
99615
- `teammate_call_finish_evt missing callId ${JSON.stringify({ genseq: event.genseq })}`
99616
- );
99617
- return;
99718
+ if (bodyEl) {
99719
+ bodyEl.textContent = event.tellaskContent;
99720
+ bodyEl.classList.add("completed");
99618
99721
  }
99619
- currentSection.setAttribute("data-call-id", callId);
99620
- this.callingSectionByCallId.set(callId, currentSection);
99621
- currentSection.classList.add("completed");
99722
+ this.renderCallTiming(callingSection, "pending", startedAtMs);
99723
+ callingSection.setAttribute("data-genseq", String(genseq));
99724
+ (body || bubble).appendChild(callingSection);
99622
99725
  this.callingSection = void 0;
99623
- this.teammateCallingSectionBySeq.set(event.genseq, currentSection);
99726
+ this.teammateCallingSectionBySeq.set(genseq, callingSection);
99727
+ this.callingSectionByCallId.set(event.callId, callingSection);
99728
+ this.markCallSitePending(event.callId, callingSection, startedAtMs);
99729
+ this.scrollToBottom();
99624
99730
  }
99625
99731
  // === FUNCTION RESULTS ===
99626
99732
  handleFuncResult(event) {
@@ -99719,25 +99825,11 @@ ${event.content}`;
99719
99825
  this.scrollToBottom();
99720
99826
  }
99721
99827
  }
99722
- // === TEXTER TOOL RESPONSE HANDLER ===
99723
- // Handles responses for tellask call bubbles - displays result INLINE in same bubble
99724
- // Renamed from handleTellaskResponse to handleToolCallResponse
99828
+ // === TELLASK CALL RESULT HANDLER ===
99829
+ // Final response body is shown in a separate teammate bubble.
99830
+ // Call site only tracks lifecycle status/timing.
99725
99831
  //
99726
99832
  // Call Type Distinction:
99727
- // - Tellask Call (inline bubble): !?@<mention-id>
99728
- // - Result displays INLINE in same bubble via attachResultInline()
99729
- // - Uses callId for correlation (callingSectionByCallId map)
99730
- // - Uses this handler (handleToolCallResponse)
99731
- //
99732
- // - Teammate Tellask: !?@agentName (e.g., !?@coder, !?@tester)
99733
- // - Result displays in SEPARATE bubble (subdialog response)
99734
- // - Uses calleeDialogId for correlation
99735
- // - Uses handleTeammateResponse() instead
99736
- //
99737
- // - Supdialog Call: subdialog responding to @parentAgentId from within
99738
- // - Result displays INLINE in parent's bubble
99739
- // - Uses callId for correlation
99740
- // - Uses this handler (handleToolCallResponse)
99741
99833
  handleToolCallResponse(event) {
99742
99834
  if (typeof this.currentCourse === "number" && event.course !== this.currentCourse) {
99743
99835
  this.handleProtocolError(
@@ -99751,10 +99843,12 @@ ${event.content}`;
99751
99843
  }
99752
99844
  const callId = String(event.callId || "").trim();
99753
99845
  if (!callId) {
99846
+ const mentionListForLog = event.callName === "tellask" || event.callName === "tellaskSessionless" ? event.mentionList : void 0;
99754
99847
  this.handleProtocolError(
99755
99848
  `teammate_call_response_evt missing callId ${JSON.stringify({
99756
99849
  responderId: event.responderId,
99757
- tellaskHead: event.tellaskHead,
99850
+ mentionList: mentionListForLog,
99851
+ tellaskContent: event.tellaskContent,
99758
99852
  calling_genseq: event.calling_genseq
99759
99853
  })}`
99760
99854
  );
@@ -99763,7 +99857,7 @@ ${event.content}`;
99763
99857
  const callingSection = this.callingSectionByCallId.get(callId);
99764
99858
  if (!callingSection) {
99765
99859
  this.handleProtocolError(
99766
- `teammate_call_response_evt received before teammate_call_finish_evt ${JSON.stringify({
99860
+ `teammate_call_response_evt received before teammate_call_start_evt ${JSON.stringify({
99767
99861
  callId,
99768
99862
  course: event.course,
99769
99863
  calling_genseq: event.calling_genseq,
@@ -99772,73 +99866,117 @@ ${event.content}`;
99772
99866
  );
99773
99867
  return;
99774
99868
  }
99775
- const display = this.formatTeammateCallResultForSection(callingSection, event);
99776
- this.attachResultInline(callingSection, display, event.status);
99869
+ const endedAtMs = this.parseEventTimestampMs(event.timestamp) ?? Date.now();
99870
+ this.markCallSiteSettled(callId, event.status, endedAtMs);
99777
99871
  if (event.status === "failed") {
99778
99872
  const host = this.getRootNode()?.host;
99779
99873
  const t2 = getUiStrings(this.uiLanguage);
99780
99874
  host?.dispatchEvent(
99781
99875
  new CustomEvent("ui-toast", {
99782
- detail: { message: String(display || t2.teammateCallFailedToast), kind: "error" },
99876
+ detail: {
99877
+ message: String(event.result || t2.teammateCallFailedToast),
99878
+ kind: "error"
99879
+ },
99783
99880
  bubbles: true,
99784
99881
  composed: true
99785
99882
  })
99786
99883
  );
99787
99884
  }
99788
99885
  }
99789
- resolveBubbleLanguageForSection(section) {
99790
- const bubble = section.closest(".generation-bubble");
99791
- if (bubble instanceof HTMLElement) {
99792
- const raw = bubble.getAttribute("data-user-language-code");
99793
- if (typeof raw === "string") {
99794
- const parsed = normalizeLanguageCode(raw);
99795
- if (parsed) return parsed;
99796
- }
99886
+ parseOptionalPositiveInt(value) {
99887
+ if (typeof value !== "number") {
99888
+ return void 0;
99797
99889
  }
99798
- return null;
99890
+ if (!Number.isFinite(value) || value <= 0) {
99891
+ return void 0;
99892
+ }
99893
+ return Math.floor(value);
99894
+ }
99895
+ applyTeammateCallAnchorToBubble(bubble, anchor2) {
99896
+ bubble.setAttribute("data-call-id", anchor2.callId);
99897
+ bubble.setAttribute("data-teammate-call-anchor-role", anchor2.anchorRole);
99898
+ const assignmentCourse = typeof anchor2.assignmentCourse === "number" && Number.isFinite(anchor2.assignmentCourse) ? Math.floor(anchor2.assignmentCourse) : void 0;
99899
+ const assignmentGenseq = typeof anchor2.assignmentGenseq === "number" && Number.isFinite(anchor2.assignmentGenseq) ? Math.floor(anchor2.assignmentGenseq) : void 0;
99900
+ if (assignmentCourse !== void 0) {
99901
+ bubble.setAttribute("data-assignment-course", String(assignmentCourse));
99902
+ } else {
99903
+ bubble.removeAttribute("data-assignment-course");
99904
+ }
99905
+ if (assignmentGenseq !== void 0) {
99906
+ bubble.setAttribute("data-assignment-genseq", String(assignmentGenseq));
99907
+ } else {
99908
+ bubble.removeAttribute("data-assignment-genseq");
99909
+ }
99910
+ const callerDialogId = typeof anchor2.callerDialogId === "string" ? anchor2.callerDialogId.trim() : "";
99911
+ if (callerDialogId !== "") {
99912
+ bubble.setAttribute("data-caller-dialog-id", callerDialogId);
99913
+ } else {
99914
+ bubble.removeAttribute("data-caller-dialog-id");
99915
+ }
99916
+ const callerCourse = typeof anchor2.callerCourse === "number" && Number.isFinite(anchor2.callerCourse) ? Math.floor(anchor2.callerCourse) : void 0;
99917
+ if (callerCourse !== void 0) {
99918
+ bubble.setAttribute("data-caller-course", String(callerCourse));
99919
+ } else {
99920
+ bubble.removeAttribute("data-caller-course");
99921
+ }
99922
+ this.upsertGenerationBubbleAnchorActions(bubble);
99799
99923
  }
99800
- formatTeammateCallResultForSection(section, event) {
99801
- const rawResult = String(event.result || "");
99802
- if (event.status !== "failed") return rawResult;
99803
- const parsed = parseTeammateCallError(rawResult);
99804
- if (!parsed) return rawResult;
99805
- const bubbleLanguage = this.resolveBubbleLanguageForSection(section);
99806
- if (!bubbleLanguage) {
99924
+ handleTeammateCallAnchor(event) {
99925
+ const rawCallId = typeof event.callId === "string" ? event.callId.trim() : "";
99926
+ if (rawCallId === "") {
99927
+ this.handleProtocolError("teammate_call_anchor_evt missing callId");
99928
+ return;
99929
+ }
99930
+ if (!Number.isFinite(event.genseq) || event.genseq <= 0) {
99807
99931
  this.handleProtocolError(
99808
- `teammate_call_response_evt missing bubble language ${JSON.stringify({
99809
- callId: event.callId,
99810
- course: event.course,
99811
- calling_genseq: event.calling_genseq
99932
+ `teammate_call_anchor_evt invalid genseq ${JSON.stringify({
99933
+ genseq: event.genseq,
99934
+ callId: rawCallId
99812
99935
  })}`
99813
99936
  );
99814
- return rawResult;
99937
+ return;
99815
99938
  }
99816
- return formatTeammateCallErrorInline({
99817
- language: bubbleLanguage,
99818
- responderId: String(event.responderId || ""),
99819
- tellaskHead: String(event.tellaskHead || ""),
99820
- parsed
99821
- });
99822
- }
99823
- // Attach result inline to calling section (TEXTER teammate-call blocks only)
99824
- attachResultInline(section, result, status) {
99825
- section.classList.toggle("failed", status === "failed");
99826
- const resultEl = section.querySelector(".calling-result");
99827
- if (resultEl) {
99828
- const raw = String(result || "");
99829
- resultEl.innerHTML = renderDomindsMarkdown(raw);
99830
- resultEl.setAttribute("data-raw-md", raw);
99831
- resultEl.classList.toggle("failed", status === "failed");
99832
- resultEl.style.display = "block";
99939
+ const rawAnchorRole = typeof event.anchorRole === "string" ? event.anchorRole.trim() : "";
99940
+ if (rawAnchorRole !== "assignment" && rawAnchorRole !== "response") {
99941
+ this.handleProtocolError(
99942
+ `teammate_call_anchor_evt invalid anchorRole ${JSON.stringify({
99943
+ anchorRole: rawAnchorRole,
99944
+ callId: rawCallId,
99945
+ genseq: event.genseq
99946
+ })}`
99947
+ );
99948
+ return;
99833
99949
  }
99834
- this.scrollToBottom();
99950
+ const assignmentCourse = this.parseOptionalPositiveInt(event.assignmentCourse);
99951
+ const assignmentGenseq = this.parseOptionalPositiveInt(event.assignmentGenseq);
99952
+ const callerCourse = this.parseOptionalPositiveInt(event.callerCourse);
99953
+ const callerDialogId = typeof event.callerDialogId === "string" ? event.callerDialogId.trim() : void 0;
99954
+ const anchorMeta = {
99955
+ callId: rawCallId,
99956
+ anchorRole: rawAnchorRole,
99957
+ assignmentCourse,
99958
+ assignmentGenseq,
99959
+ callerDialogId,
99960
+ callerCourse
99961
+ };
99962
+ const genseq = Math.floor(event.genseq);
99963
+ const messages = this.shadowRoot?.querySelector(".messages");
99964
+ const bubble = messages ? messages.querySelector(
99965
+ `.generation-bubble[data-seq="${String(genseq)}"]`
99966
+ ) : null;
99967
+ if (bubble) {
99968
+ this.applyTeammateCallAnchorToBubble(bubble, anchorMeta);
99969
+ this.pendingTeammateCallAnchorByGenseq.delete(genseq);
99970
+ return;
99971
+ }
99972
+ this.pendingTeammateCallAnchorByGenseq.set(genseq, anchorMeta);
99835
99973
  }
99836
99974
  // === TEAMMATE RESPONSE HANDLER ===
99837
99975
  // Handles responses for @agentName calls - displays result in SEPARATE bubble
99838
99976
  // Now includes full response and agentId from subdialog completion
99839
99977
  //
99840
99978
  // Call Type Distinction:
99841
- // - Teammate Tellask: !?@agentName (e.g., !?@coder, !?@tester)
99979
+ // - Teammate tellask function calls (tellask/tellaskSessionless)
99842
99980
  // - Result displays in SEPARATE bubble (subdialog or supdialog response)
99843
99981
  // - Uses calleeDialogId for correlation (event.calleeDialogId)
99844
99982
  // - Uses this handler (handleTeammateResponse)
@@ -99848,6 +99986,11 @@ ${event.content}`;
99848
99986
  // - Uses callId for correlation
99849
99987
  // - Uses handleToolCallResponse() instead
99850
99988
  handleTeammateResponse(event) {
99989
+ const normalizedCallId = String(event.callId || "").trim();
99990
+ if (normalizedCallId !== "") {
99991
+ const endedAtMs = this.parseEventTimestampMs(event.timestamp) ?? Date.now();
99992
+ this.markCallSiteSettled(normalizedCallId, event.status, endedAtMs);
99993
+ }
99851
99994
  if (!event.calleeDialogId) {
99852
99995
  console.error("handleTeammateResponse: Missing calleeDialogId", {
99853
99996
  responderId: event.responderId,
@@ -99871,7 +100014,8 @@ ${event.content}`;
99871
100014
  event.calling_genseq,
99872
100015
  event.callId,
99873
100016
  event.originMemberId,
99874
- event.tellaskHead
100017
+ event.callName,
100018
+ typeof event.calleeCourse === "number" && Number.isFinite(event.calleeCourse) ? Math.floor(event.calleeCourse) : void 0
99875
100019
  );
99876
100020
  const container = this.shadowRoot?.querySelector(".messages");
99877
100021
  if (container) {
@@ -99906,7 +100050,7 @@ ${event.content}`;
99906
100050
  }
99907
100051
  // Create teammate bubble for subagent responses
99908
100052
  // calleeDialogId: ID of the callee dialog (subdialog OR supdialog)
99909
- createTeammateBubble(calleeDialogId, agentId, responseNarr, callSiteId, callId, originMemberId, tellaskHead) {
100053
+ createTeammateBubble(calleeDialogId, agentId, responseNarr, callSiteId, callId, originMemberId, callName, calleeCourse) {
99910
100054
  const t2 = getUiStrings(this.uiLanguage);
99911
100055
  const el = document.createElement("div");
99912
100056
  el.className = "message teammate";
@@ -99917,9 +100061,9 @@ ${event.content}`;
99917
100061
  if (callId) {
99918
100062
  el.setAttribute("data-call-id", callId);
99919
100063
  }
99920
- const isFbrSelfTellask = typeof tellaskHead === "string" && /^\s*@self\b/.test(tellaskHead);
99921
- const callsign = isFbrSelfTellask ? "@self" : agentId ? `@${agentId}` : "Teammate";
99922
- const responseIndicator = isFbrSelfTellask ? " · FBR" : this.getTeammateResponseIndicator(agentId, originMemberId);
100064
+ const isFbr = callName === "freshBootsReasoning";
100065
+ const callsign = isFbr ? "FBR" : agentId ? `@${agentId}` : "Teammate";
100066
+ const responseIndicator = isFbr ? " · FBR" : this.getTeammateResponseIndicator(agentId, originMemberId);
99923
100067
  el.innerHTML = `
99924
100068
  <div class="bubble-content">
99925
100069
  <div class="bubble-header">
@@ -99983,7 +100127,10 @@ ${event.content}`;
99983
100127
  externalBtn.addEventListener("click", (e2) => {
99984
100128
  e2.preventDefault();
99985
100129
  e2.stopPropagation();
99986
- this.openCallSiteDeepLinkInNewTab(callId);
100130
+ this.openCallSiteDeepLinkInNewTab(callId, {
100131
+ selfId: calleeDialogId,
100132
+ course: calleeCourse
100133
+ });
99987
100134
  });
99988
100135
  }
99989
100136
  const shareBtn = el.querySelector("button.callsite-icon-btn.share");
@@ -99991,7 +100138,10 @@ ${event.content}`;
99991
100138
  shareBtn.addEventListener("click", (e2) => {
99992
100139
  e2.preventDefault();
99993
100140
  e2.stopPropagation();
99994
- void this.copyCallSiteDeepLinkToClipboard(callId);
100141
+ void this.copyCallSiteDeepLinkToClipboard(callId, {
100142
+ selfId: calleeDialogId,
100143
+ course: calleeCourse
100144
+ });
99995
100145
  });
99996
100146
  }
99997
100147
  return el;
@@ -100006,10 +100156,43 @@ ${event.content}`;
100006
100156
  return;
100007
100157
  }
100008
100158
  }
100009
- openCallSiteDeepLinkInNewTab(callId) {
100159
+ navigateToGenerationBubbleInApp(course, genseq) {
100160
+ if (!Number.isFinite(course) || course <= 0) return;
100161
+ if (!Number.isFinite(genseq) || genseq <= 0) return;
100162
+ const normalizedCourse = Math.floor(course);
100163
+ const normalizedGenseq = Math.floor(genseq);
100010
100164
  const dialog = this.currentDialog;
100011
- const course = this.currentCourse;
100012
- if (!dialog || typeof course !== "number") return;
100165
+ if (!dialog) return;
100166
+ if (this.currentCourse === normalizedCourse) {
100167
+ this.pendingScrollRequest = {
100168
+ kind: "by_genseq",
100169
+ course: normalizedCourse,
100170
+ genseq: normalizedGenseq
100171
+ };
100172
+ this.maybeApplyPendingScrollRequest();
100173
+ return;
100174
+ }
100175
+ this.dispatchEvent(
100176
+ new CustomEvent("navigate-genseq", {
100177
+ detail: {
100178
+ rootId: dialog.rootId,
100179
+ selfId: dialog.selfId,
100180
+ course: normalizedCourse,
100181
+ genseq: normalizedGenseq
100182
+ },
100183
+ bubbles: true,
100184
+ composed: true
100185
+ })
100186
+ );
100187
+ }
100188
+ openCallSiteDeepLinkInNewTab(callId, target) {
100189
+ const dialog = this.currentDialog;
100190
+ if (!dialog) return;
100191
+ const selfId = typeof target?.selfId === "string" ? target.selfId.trim() : "";
100192
+ const resolvedSelfId = selfId !== "" ? selfId : dialog.selfId;
100193
+ const course = target?.course;
100194
+ const resolvedCourse = typeof course === "number" && Number.isFinite(course) ? course : this.currentCourse;
100195
+ if (typeof resolvedCourse !== "number" || !Number.isFinite(resolvedCourse)) return;
100013
100196
  const url = new URL(window.location.href);
100014
100197
  url.searchParams.delete("rootId");
100015
100198
  url.searchParams.delete("selfId");
@@ -100020,17 +100203,21 @@ ${event.content}`;
100020
100203
  url.hash = "";
100021
100204
  url.pathname = `/dl/callsite`;
100022
100205
  url.searchParams.set("rootId", dialog.rootId);
100023
- url.searchParams.set("selfId", dialog.selfId);
100024
- url.searchParams.set("course", String(Math.floor(course)));
100206
+ url.searchParams.set("selfId", resolvedSelfId);
100207
+ url.searchParams.set("course", String(Math.floor(resolvedCourse)));
100025
100208
  url.searchParams.set("callId", callId);
100026
100209
  const urlStr = url.toString();
100027
100210
  const w2 = window.open(urlStr, "_blank", "noopener,noreferrer");
100028
100211
  if (w2) w2.opener = null;
100029
100212
  }
100030
- async copyCallSiteDeepLinkToClipboard(callId) {
100213
+ async copyCallSiteDeepLinkToClipboard(callId, target) {
100031
100214
  const dialog = this.currentDialog;
100032
- const course = this.currentCourse;
100033
- if (!dialog || typeof course !== "number") return;
100215
+ if (!dialog) return;
100216
+ const selfId = typeof target?.selfId === "string" ? target.selfId.trim() : "";
100217
+ const resolvedSelfId = selfId !== "" ? selfId : dialog.selfId;
100218
+ const course = target?.course;
100219
+ const resolvedCourse = typeof course === "number" && Number.isFinite(course) ? course : this.currentCourse;
100220
+ if (typeof resolvedCourse !== "number" || !Number.isFinite(resolvedCourse)) return;
100034
100221
  const url = new URL(window.location.href);
100035
100222
  url.searchParams.delete("rootId");
100036
100223
  url.searchParams.delete("selfId");
@@ -100041,8 +100228,8 @@ ${event.content}`;
100041
100228
  url.hash = "";
100042
100229
  url.pathname = `/dl/callsite`;
100043
100230
  url.searchParams.set("rootId", dialog.rootId);
100044
- url.searchParams.set("selfId", dialog.selfId);
100045
- url.searchParams.set("course", String(Math.floor(course)));
100231
+ url.searchParams.set("selfId", resolvedSelfId);
100232
+ url.searchParams.set("course", String(Math.floor(resolvedCourse)));
100046
100233
  url.searchParams.set("callId", callId);
100047
100234
  await this.copyLinkToClipboardWithToast(url.toString());
100048
100235
  }
@@ -100112,17 +100299,11 @@ ${event.content}`;
100112
100299
  );
100113
100300
  }
100114
100301
  formatAgentLabel(agentId) {
100115
- if (agentId === "human" || agentId === "@human") {
100116
- return "Human";
100117
- }
100118
100302
  return agentId.startsWith("@") ? agentId : `@${agentId}`;
100119
100303
  }
100120
100304
  formatCallerLabel(assignment) {
100121
100305
  const originMemberId = assignment.originMemberId;
100122
100306
  if (originMemberId && originMemberId.trim() !== "") {
100123
- if (originMemberId === "human") {
100124
- return "Human";
100125
- }
100126
100307
  return this.formatAgentLabel(originMemberId);
100127
100308
  }
100128
100309
  return "Assistant";
@@ -100133,13 +100314,78 @@ ${event.content}`;
100133
100314
  return "Response";
100134
100315
  }
100135
100316
  let caller = this.formatAgentLabel(dialog.agentId);
100136
- if (originMemberId === "human") {
100137
- caller = "Human";
100138
- } else if (originMemberId && originMemberId.trim() !== "") {
100317
+ if (originMemberId && originMemberId.trim() !== "") {
100139
100318
  caller = this.formatAgentLabel(originMemberId);
100140
100319
  }
100141
100320
  return ` → ${caller}`;
100142
100321
  }
100322
+ upsertGenerationBubbleAnchorActions(bubble) {
100323
+ const headerRight = bubble.querySelector(".bubble-header-right");
100324
+ if (!headerRight) {
100325
+ return;
100326
+ }
100327
+ const existingActions = headerRight.querySelector(
100328
+ ".bubble-anchor-actions"
100329
+ );
100330
+ const anchorRole = bubble.getAttribute("data-teammate-call-anchor-role");
100331
+ if (anchorRole !== "response") {
100332
+ existingActions?.remove();
100333
+ return;
100334
+ }
100335
+ const callId = (bubble.getAttribute("data-call-id") ?? "").trim();
100336
+ const assignmentCourseRaw = Number.parseInt(
100337
+ bubble.getAttribute("data-assignment-course") ?? "",
100338
+ 10
100339
+ );
100340
+ const assignmentGenseqRaw = Number.parseInt(
100341
+ bubble.getAttribute("data-assignment-genseq") ?? "",
100342
+ 10
100343
+ );
100344
+ const callerDialogId = (bubble.getAttribute("data-caller-dialog-id") ?? "").trim();
100345
+ const callerCourseRaw = Number.parseInt(bubble.getAttribute("data-caller-course") ?? "", 10);
100346
+ const hasAssignmentRef = Number.isFinite(assignmentCourseRaw) && assignmentCourseRaw > 0 && Number.isFinite(assignmentGenseqRaw) && assignmentGenseqRaw > 0;
100347
+ const hasCallerRef = callId !== "" && callerDialogId !== "" && Number.isFinite(callerCourseRaw) && callerCourseRaw > 0;
100348
+ if (!hasAssignmentRef || !hasCallerRef) {
100349
+ this.handleProtocolError(
100350
+ `response anchor bubble missing link refs ${JSON.stringify({
100351
+ callId,
100352
+ assignmentCourse: bubble.getAttribute("data-assignment-course"),
100353
+ assignmentGenseq: bubble.getAttribute("data-assignment-genseq"),
100354
+ callerDialogId,
100355
+ callerCourse: bubble.getAttribute("data-caller-course")
100356
+ })}`
100357
+ );
100358
+ existingActions?.remove();
100359
+ return;
100360
+ }
100361
+ const t2 = getUiStrings(this.uiLanguage);
100362
+ const actions = existingActions ?? document.createElement("div");
100363
+ actions.className = "bubble-anchor-actions";
100364
+ actions.innerHTML = `
100365
+ <button type="button" class="bubble-anchor-assignment-btn" aria-label="${this.escapeHtml(t2.teammateAssignmentBubbleTitle)}" title="${this.escapeHtml(t2.teammateAssignmentBubbleTitle)}">
100366
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
100367
+ <circle cx="12" cy="12" r="3"></circle>
100368
+ <path d="M12 2v3"></path>
100369
+ <path d="M12 19v3"></path>
100370
+ <path d="M2 12h3"></path>
100371
+ <path d="M19 12h3"></path>
100372
+ </svg>
100373
+ </button>
100374
+ <button type="button" class="bubble-anchor-caller-callsite-btn" aria-label="${this.escapeHtml(t2.teammateRequesterCallSiteTitle)}" title="${this.escapeHtml(t2.teammateRequesterCallSiteTitle)}">
100375
+ <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
100376
+ <path d="M14 3h7v7"></path>
100377
+ <path d="M10 14L21 3"></path>
100378
+ <path d="M21 14v7H3V3h7"></path>
100379
+ </svg>
100380
+ </button>
100381
+ `;
100382
+ const shareBtn = headerRight.querySelector(".bubble-share-link-btn");
100383
+ if (shareBtn) {
100384
+ headerRight.insertBefore(actions, shareBtn);
100385
+ } else {
100386
+ headerRight.appendChild(actions);
100387
+ }
100388
+ }
100143
100389
  buildGenerationBubbleHeaderHtml(timestamp2) {
100144
100390
  const t2 = getUiStrings(this.uiLanguage);
100145
100391
  const authorLabel = this.getAuthorLabel("assistant");
@@ -100154,6 +100400,7 @@ ${event.content}`;
100154
100400
  </div>
100155
100401
  </div>
100156
100402
  <div class="bubble-header-right">
100403
+ <div class="bubble-anchor-actions"></div>
100157
100404
  <button type="button" class="bubble-share-link-btn" aria-label="${this.escapeHtml(t2.q4hCopyLinkTitle)}" title="${this.escapeHtml(t2.q4hCopyLinkTitle)}">
100158
100405
  <svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
100159
100406
  <path d="M10 13a5 5 0 0 1 0-7l1-1a5 5 0 0 1 7 7l-1 1"></path>
@@ -100253,21 +100500,24 @@ ${event.content}`;
100253
100500
  return new DomindsMarkdownSection();
100254
100501
  }
100255
100502
  // Create calling section (inside markdown section) - streaming mode for tellask call blocks
100256
- createCallingSection(firstMention) {
100257
- const isFbrSelf = firstMention.trim() === "self";
100503
+ createCallingSection(callName, firstMention) {
100504
+ const isFbr = callName === "freshBootsReasoning";
100258
100505
  const el = document.createElement("div");
100259
- el.className = isFbrSelf ? "calling-section fbr" : "calling-section";
100506
+ el.className = isFbr ? "calling-section fbr" : "calling-section";
100260
100507
  el.setAttribute("data-first-mention", firstMention);
100508
+ el.setAttribute("data-call-name", callName);
100261
100509
  el.innerHTML = `
100262
100510
  <div class="calling-header">
100263
- ${isFbrSelf ? `<span class="calling-icon fbr-icon" aria-hidden="true">✨</span>` : `<span class="calling-icon tool-icon">
100511
+ ${isFbr ? `<span class="calling-icon fbr-icon" aria-hidden="true">✨</span>` : `<span class="calling-icon tool-icon">
100264
100512
  <img src="${mannedToolIcon}" class="calling-img" alt="calling">
100265
100513
  </span>`}
100266
- <span class="calling-headline"></span>
100514
+ <div class="calling-meta">
100515
+ <span class="calling-headline"></span>
100516
+ <span class="calling-timing"></span>
100517
+ </div>
100267
100518
  </div>
100268
100519
  <div class="calling-content">
100269
100520
  <div class="calling-body"></div>
100270
- <div class="calling-result" style="display:none"></div>
100271
100521
  </div>
100272
100522
  `;
100273
100523
  return el;
@@ -100717,6 +100967,16 @@ ${event.content}`;
100717
100967
  flex-shrink: 0;
100718
100968
  }
100719
100969
 
100970
+ .bubble-anchor-actions {
100971
+ display: inline-flex;
100972
+ align-items: center;
100973
+ gap: 6px;
100974
+ }
100975
+
100976
+ .bubble-anchor-actions:empty {
100977
+ display: none;
100978
+ }
100979
+
100720
100980
  .bubble-share-link-btn {
100721
100981
  width: 22px;
100722
100982
  height: 22px;
@@ -100742,6 +101002,35 @@ ${event.content}`;
100742
101002
  outline: 2px solid color-mix(in srgb, var(--dominds-primary, #007acc) 55%, transparent);
100743
101003
  outline-offset: 2px;
100744
101004
  }
101005
+
101006
+ .bubble-anchor-assignment-btn,
101007
+ .bubble-anchor-caller-callsite-btn {
101008
+ width: 22px;
101009
+ height: 22px;
101010
+ padding: 0;
101011
+ display: inline-flex;
101012
+ align-items: center;
101013
+ justify-content: center;
101014
+ border-radius: 6px;
101015
+ border: 1px solid transparent;
101016
+ background: transparent;
101017
+ color: var(--dominds-muted, var(--color-fg-tertiary, #64748b));
101018
+ cursor: pointer;
101019
+ transition: all 0.15s ease;
101020
+ }
101021
+
101022
+ .bubble-anchor-assignment-btn:hover,
101023
+ .bubble-anchor-caller-callsite-btn:hover {
101024
+ background: var(--dominds-hover, var(--color-bg-tertiary, #e2e8f0));
101025
+ border-color: var(--dominds-border, var(--color-border-primary, #e2e8f0));
101026
+ color: var(--dominds-fg, var(--color-fg-primary, #333));
101027
+ }
101028
+
101029
+ .bubble-anchor-assignment-btn:focus-visible,
101030
+ .bubble-anchor-caller-callsite-btn:focus-visible {
101031
+ outline: 2px solid color-mix(in srgb, var(--dominds-primary, #007acc) 55%, transparent);
101032
+ outline-offset: 2px;
101033
+ }
100745
101034
 
100746
101035
  .bubble-author {
100747
101036
  font-weight: 600;
@@ -100965,23 +101254,19 @@ ${event.content}`;
100965
101254
  font-size: 85%;
100966
101255
  }
100967
101256
 
100968
- .markdown-content table,
100969
- .calling-result table {
101257
+ .markdown-content table {
100970
101258
  border-collapse: collapse;
100971
101259
  width: 100%;
100972
101260
  margin-bottom: 0.75em;
100973
101261
  }
100974
101262
 
100975
101263
  .markdown-content th,
100976
- .markdown-content td,
100977
- .calling-result th,
100978
- .calling-result td {
101264
+ .markdown-content td {
100979
101265
  border: 1px solid var(--dominds-border, var(--color-border-primary, #e2e8f0));
100980
101266
  padding: 6px 13px;
100981
101267
  }
100982
101268
 
100983
- .markdown-content tr:nth-child(2n),
100984
- .calling-result tr:nth-child(2n) {
101269
+ .markdown-content tr:nth-child(2n) {
100985
101270
  background-color: var(--dominds-hover, var(--color-bg-tertiary, #f1f5f9));
100986
101271
  }
100987
101272
 
@@ -101035,11 +101320,18 @@ ${event.content}`;
101035
101320
 
101036
101321
  .calling-header {
101037
101322
  display: flex;
101038
- align-items: center;
101323
+ align-items: flex-start;
101039
101324
  gap: 8px;
101040
101325
  margin-bottom: 8px;
101041
101326
  }
101042
101327
 
101328
+ .calling-meta {
101329
+ display: flex;
101330
+ flex-direction: column;
101331
+ gap: 3px;
101332
+ min-width: 0;
101333
+ }
101334
+
101043
101335
  .calling-icon {
101044
101336
  display: flex;
101045
101337
  align-items: center;
@@ -101076,12 +101368,22 @@ ${event.content}`;
101076
101368
  font-weight: 600;
101077
101369
  color: var(--color-info, #06b6d4);
101078
101370
  font-size: 12px;
101371
+ white-space: nowrap;
101372
+ overflow: hidden;
101373
+ text-overflow: ellipsis;
101079
101374
  }
101080
101375
 
101081
101376
  .calling-section.fbr .calling-headline {
101082
101377
  color: var(--dominds-primary, var(--color-accent-primary, #007acc));
101083
101378
  }
101084
101379
 
101380
+ .calling-timing {
101381
+ color: var(--dominds-muted, var(--color-fg-tertiary, #64748b));
101382
+ font-size: 11px;
101383
+ line-height: 1.35;
101384
+ white-space: pre-wrap;
101385
+ }
101386
+
101085
101387
  .subdialog-arrow {
101086
101388
  color: var(--color-info, #06b6d4);
101087
101389
  font-size: 12px;
@@ -101101,38 +101403,18 @@ ${event.content}`;
101101
101403
  line-height: 1.35;
101102
101404
  }
101103
101405
 
101104
- .calling-result {
101105
- margin-top: 8px;
101106
- padding: 8px;
101107
- border-radius: 6px;
101108
- font-size: 12px;
101109
- white-space: normal;
101110
- background: var(--color-bg-secondary, #ffffff);
101111
- border: 1px solid var(--dominds-border, var(--color-border-primary, #e2e8f0));
101112
- color: var(--dominds-fg, var(--color-fg-secondary, #475569));
101113
- }
101114
-
101115
- .calling-result.failed {
101116
- border-color: var(--color-danger, #ef4444);
101117
- color: var(--color-danger, #ef4444);
101118
- }
101119
-
101120
101406
  .calling-section.failed {
101121
101407
  border-left-color: var(--color-danger, #ef4444);
101122
101408
  background: rgba(239, 68, 68, 0.08);
101123
101409
  }
101410
+
101411
+ .calling-section.pending {
101412
+ opacity: 1;
101413
+ }
101124
101414
 
101125
101415
  .calling-section.completed {
101126
101416
  opacity: 0.9;
101127
101417
  }
101128
-
101129
- .calling-headline.completed {
101130
- opacity: 0.8;
101131
- }
101132
-
101133
- .calling-body.completed {
101134
- opacity: 0.8;
101135
- }
101136
101418
 
101137
101419
  /* Function call section styles (nested inside markdown) - non-streaming mode */
101138
101420
  .func-call-section {
@@ -101960,8 +102242,7 @@ const _DomindsQ4HInput = class _DomindsQ4HInput extends HTMLElement {
101960
102242
  questionId,
101961
102243
  dialogId: question2.dialogContext.selfId,
101962
102244
  rootId: question2.dialogContext.rootId,
101963
- tellaskHead: question2.tellaskHead,
101964
- bodyContent: question2.bodyContent
102245
+ tellaskContent: question2.tellaskContent
101965
102246
  },
101966
102247
  bubbles: true,
101967
102248
  composed: true
@@ -103001,8 +103282,7 @@ class DomindsQ4HPanel extends HTMLElement {
103001
103282
  questionId: this.selectedQuestionId,
103002
103283
  dialogId: dialogContext.selfId,
103003
103284
  rootId: dialogContext.rootId,
103004
- tellaskHead: question2.tellaskHead,
103005
- bodyContent: question2.bodyContent
103285
+ tellaskContent: question2.tellaskContent
103006
103286
  },
103007
103287
  bubbles: true,
103008
103288
  composed: true
@@ -103581,9 +103861,9 @@ class DomindsQ4HPanel extends HTMLElement {
103581
103861
  </div>
103582
103862
  <div class="q4h-question-body">
103583
103863
  <div class="q4h-tellask">
103584
- <div class="q4h-tellask-headline">${renderDomindsMarkdown(question2.tellaskHead, {})}</div>
103864
+ <div class="q4h-tellask-headline">Q4H</div>
103585
103865
  <hr class="q4h-tellask-sep" />
103586
- <div class="q4h-tellask-body">${renderDomindsMarkdown(question2.bodyContent, {})}</div>
103866
+ <div class="q4h-tellask-body">${renderDomindsMarkdown(question2.tellaskContent, {})}</div>
103587
103867
  </div>
103588
103868
  </div>
103589
103869
  </div>
@@ -105340,8 +105620,8 @@ class DoneDialogList extends HTMLElement {
105340
105620
  }
105341
105621
  getDialogDisplayCallsign(dialog) {
105342
105622
  const assignment = dialog.assignmentFromSup;
105343
- if (assignment && typeof assignment.tellaskHead === "string") {
105344
- if (/^\s*@self\b/.test(assignment.tellaskHead)) return "@self";
105623
+ if (assignment?.callName === "freshBootsReasoning") {
105624
+ return "FBR";
105345
105625
  }
105346
105626
  return `@${dialog.agentId}`;
105347
105627
  }
@@ -105703,7 +105983,7 @@ class DoneDialogList extends HTMLElement {
105703
105983
  const t2 = getUiStrings(this.props.uiLanguage);
105704
105984
  const isSelected = this.isSelectedDialog(dialog, this.selectionState);
105705
105985
  const updatedAt = dialog.lastModified || "";
105706
- const tellaskSessionMark = dialog.tellaskSession ?? "";
105986
+ const sessionSlugMark = dialog.sessionSlug ?? "";
105707
105987
  const callsign = this.getDialogDisplayCallsign(dialog);
105708
105988
  return `
105709
105989
  <div
@@ -105725,7 +106005,7 @@ class DoneDialogList extends HTMLElement {
105725
106005
  </div>
105726
106006
  <div class="dialog-row dialog-submeta">
105727
106007
  <span class="dialog-meta-right">
105728
- <span class="dialog-topic">${tellaskSessionMark}</span>
106008
+ <span class="dialog-topic">${sessionSlugMark}</span>
105729
106009
  </span>
105730
106010
  </div>
105731
106011
  </div>
@@ -105868,7 +106148,7 @@ class DoneDialogList extends HTMLElement {
105868
106148
  agentName: "",
105869
106149
  taskDocPath: dialog.taskDocPath,
105870
106150
  supdialogId: dialog.supdialogId,
105871
- tellaskSession: dialog.tellaskSession,
106151
+ sessionSlug: dialog.sessionSlug,
105872
106152
  assignmentFromSup: dialog.assignmentFromSup
105873
106153
  };
105874
106154
  this.props.onSelect(dialogInfo);
@@ -106343,8 +106623,8 @@ class RunningDialogList extends HTMLElement {
106343
106623
  }
106344
106624
  getDialogDisplayCallsign(dialog) {
106345
106625
  const assignment = dialog.assignmentFromSup;
106346
- if (assignment && typeof assignment.tellaskHead === "string") {
106347
- if (/^\s*@self\b/.test(assignment.tellaskHead)) return "@self";
106626
+ if (assignment?.callName === "freshBootsReasoning") {
106627
+ return "FBR";
106348
106628
  }
106349
106629
  return `@${dialog.agentId}`;
106350
106630
  }
@@ -106757,7 +107037,7 @@ class RunningDialogList extends HTMLElement {
106757
107037
  const dialogId = kind === "sub" ? dialog.selfId ?? "" : dialog.selfId ? dialog.selfId : dialog.rootId;
106758
107038
  const rowClass = kind === "sub" ? "dialog-item sub-dialog" : "dialog-item root-dialog";
106759
107039
  const updatedAt = dialog.lastModified || "";
106760
- const tellaskSessionMark = dialog.tellaskSession ?? "";
107040
+ const sessionSlugMark = dialog.sessionSlug ?? "";
106761
107041
  if (kind === "sub") {
106762
107042
  const callsign = this.getDialogDisplayCallsign(dialog);
106763
107043
  return `
@@ -106781,7 +107061,7 @@ class RunningDialogList extends HTMLElement {
106781
107061
  </div>
106782
107062
  <div class="dialog-row dialog-submeta">
106783
107063
  <span class="dialog-meta-right">
106784
- <span class="dialog-topic">${tellaskSessionMark}</span>
107064
+ <span class="dialog-topic">${sessionSlugMark}</span>
106785
107065
  </span>
106786
107066
  </div>
106787
107067
  </div>
@@ -106942,7 +107222,7 @@ class RunningDialogList extends HTMLElement {
106942
107222
  agentName: "",
106943
107223
  taskDocPath: dialog.taskDocPath,
106944
107224
  supdialogId: dialog.supdialogId,
106945
- tellaskSession: dialog.tellaskSession,
107225
+ sessionSlug: dialog.sessionSlug,
106946
107226
  assignmentFromSup: dialog.assignmentFromSup
106947
107227
  };
106948
107228
  this.props.onSelect(dialogInfo);
@@ -111144,6 +111424,25 @@ ${content}`;
111144
111424
  }, 100);
111145
111425
  }
111146
111426
  });
111427
+ this.shadowRoot.addEventListener("navigate-genseq", (event) => {
111428
+ const ce2 = event;
111429
+ const detail = ce2.detail && typeof ce2.detail === "object" ? ce2.detail : null;
111430
+ if (!detail) return;
111431
+ const rootId = typeof detail["rootId"] === "string" ? detail["rootId"] : "";
111432
+ const selfId = typeof detail["selfId"] === "string" ? detail["selfId"] : "";
111433
+ const course = typeof detail["course"] === "number" ? detail["course"] : Number.NaN;
111434
+ const genseq = typeof detail["genseq"] === "number" ? detail["genseq"] : Number.NaN;
111435
+ if (!rootId || !selfId) return;
111436
+ if (!Number.isFinite(course) || !Number.isFinite(genseq)) return;
111437
+ this.pendingDeepLink = {
111438
+ kind: "genseq",
111439
+ rootId: rootId.trim(),
111440
+ selfId: selfId.trim(),
111441
+ course: Math.floor(course),
111442
+ genseq: Math.floor(genseq)
111443
+ };
111444
+ void this.applyPendingDeepLink();
111445
+ });
111147
111446
  this.shadowRoot.addEventListener("navigate-callsite", (event) => {
111148
111447
  const ce2 = event;
111149
111448
  const detail = ce2.detail && typeof ce2.detail === "object" ? ce2.detail : null;
@@ -112518,7 +112817,7 @@ ${content}`;
112518
112817
  lastModified: subdialog.lastModified,
112519
112818
  runState: effectiveRunState,
112520
112819
  supdialogId: subdialog.supdialogId ?? rootId,
112521
- tellaskSession: subdialog.tellaskSession,
112820
+ sessionSlug: subdialog.sessionSlug,
112522
112821
  assignmentFromSup: subdialog.assignmentFromSup
112523
112822
  });
112524
112823
  }
@@ -112759,8 +113058,8 @@ ${content}`;
112759
113058
  const dialogTitle = this.shadowRoot?.querySelector("#current-dialog-title");
112760
113059
  if (dialogTitle) {
112761
113060
  let titleText = "";
112762
- const isFbrSelfTellask = normalizedDialog.assignmentFromSup !== void 0 && /^\s*@self\b/.test(normalizedDialog.assignmentFromSup.tellaskHead);
112763
- const callsign = isFbrSelfTellask ? "@self" : `@${normalizedDialog.agentId}`;
113061
+ const isFbrSideline = normalizedDialog.assignmentFromSup?.callName === "freshBootsReasoning";
113062
+ const callsign = isFbrSideline ? "FBR" : `@${normalizedDialog.agentId}`;
112764
113063
  titleText = `${callsign} (${normalizedDialog.selfId})`;
112765
113064
  titleText += ` • ${normalizedDialog.taskDocPath}`;
112766
113065
  dialogTitle.textContent = titleText;
@@ -113410,7 +113709,7 @@ ${content}`;
113410
113709
  if (!isForCurrentDialog) {
113411
113710
  return true;
113412
113711
  }
113413
- this.currentDialog = {
113712
+ const nextDialog = {
113414
113713
  selfId: readyMsg.dialog.selfId,
113415
113714
  rootId: readyMsg.dialog.rootId,
113416
113715
  agentId: readyMsg.agentId,
@@ -113418,9 +113717,10 @@ ${content}`;
113418
113717
  // agentId serves as the name for display
113419
113718
  taskDocPath: readyMsg.taskDocPath,
113420
113719
  supdialogId: readyMsg.supdialogId,
113421
- tellaskSession: readyMsg.tellaskSession,
113720
+ sessionSlug: readyMsg.sessionSlug,
113422
113721
  assignmentFromSup: readyMsg.assignmentFromSup
113423
113722
  };
113723
+ this.currentDialog = nextDialog;
113424
113724
  this.applyDiligenceState(nextDiligenceState);
113425
113725
  this.diligenceRtwsDirty = false;
113426
113726
  this.updateBottomPanelFooterUi();
@@ -113429,7 +113729,7 @@ ${content}`;
113429
113729
  dialogContainer.updateDialogContext(this.currentDialog);
113430
113730
  }
113431
113731
  if (this.q4hInput && typeof this.q4hInput.setDialog === "function") {
113432
- this.q4hInput.setDialog(this.currentDialog);
113732
+ this.q4hInput.setDialog(nextDialog);
113433
113733
  }
113434
113734
  const docsPanel = this.shadowRoot?.querySelector("#docs-panel");
113435
113735
  if (docsPanel instanceof HTMLElement) {
@@ -113594,7 +113894,7 @@ ${content}`;
113594
113894
  lastModified: node2.lastModified,
113595
113895
  runState: effectiveRunState,
113596
113896
  supdialogId: node2.supdialogId,
113597
- tellaskSession: node2.tellaskSession,
113897
+ sessionSlug: node2.sessionSlug,
113598
113898
  assignmentFromSup: node2.assignmentFromSup
113599
113899
  };
113600
113900
  let replaced = false;
@@ -114041,8 +114341,7 @@ ${t2.commandLabel}: ${commandStr}`;
114041
114341
  for (const question2 of context.questions) {
114042
114342
  q4hQuestions.push({
114043
114343
  id: question2.id,
114044
- tellaskHead: question2.tellaskHead,
114045
- bodyContent: question2.bodyContent,
114344
+ tellaskContent: question2.tellaskContent,
114046
114345
  askedAt: question2.askedAt,
114047
114346
  dialogContext: context
114048
114347
  });
@@ -115993,4 +116292,4 @@ export {
115993
116292
  clear$2 as y,
115994
116293
  defaultConfig2 as z
115995
116294
  };
115996
- //# sourceMappingURL=index-CUZD-Ua6.js.map
116295
+ //# sourceMappingURL=index-Vrp1PT3b.js.map