@xpert-ai/chatkit-ui 0.3.12 → 0.3.14

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 (337) hide show
  1. package/dist/app/assets/{_baseUniq-IKp1Qtyx.js → _baseUniq-DN7U2Vwz.js} +1 -1
  2. package/dist/app/assets/{abap-C7CFWD5V.js → abap-CfmrZkTc.js} +1 -1
  3. package/dist/app/assets/{abnf-DMBTOEVk.js → abnf-Bw291hxX.js} +1 -1
  4. package/dist/app/assets/{actionscript-BcEvaXWq.js → actionscript-CWDe_ef1.js} +1 -1
  5. package/dist/app/assets/{ada-CjD42KJL.js → ada-C0d9duWb.js} +1 -1
  6. package/dist/app/assets/{agda-Bcj2WXF1.js → agda-exZUjj9O.js} +1 -1
  7. package/dist/app/assets/{al-CMk7bc_L.js → al-B5qtQv7q.js} +1 -1
  8. package/dist/app/assets/{antlr4-mV0cIoyX.js → antlr4-BJmUfb2m.js} +1 -1
  9. package/dist/app/assets/{apacheconf-DN4T9Q-R.js → apacheconf-DulsAdC6.js} +1 -1
  10. package/dist/app/assets/{apex-3WQ3SwvB.js → apex-HXl-N7PT.js} +1 -1
  11. package/dist/app/assets/{apl-kyDsC9Hx.js → apl-CVSWi-_l.js} +1 -1
  12. package/dist/app/assets/{applescript-Bs98Sq0b.js → applescript-BSLfPuyN.js} +1 -1
  13. package/dist/app/assets/{aql-BAbWlxCN.js → aql-B4eku8M8.js} +1 -1
  14. package/dist/app/assets/{arc-EIoofq4L.js → arc-lR4coLR7.js} +1 -1
  15. package/dist/app/assets/{architectureDiagram-Q4EWVU46-DtyblCvt.js → architectureDiagram-Q4EWVU46-BjCbdxqW.js} +1 -1
  16. package/dist/app/assets/{arduino-DrkFmhPG.js → arduino-BqxagEIz.js} +1 -1
  17. package/dist/app/assets/{arff-COd-UaSA.js → arff-DTiB1hQ2.js} +1 -1
  18. package/dist/app/assets/{asciidoc-D0TlSE1p.js → asciidoc-B32rNoj2.js} +1 -1
  19. package/dist/app/assets/{asm6502-DBgU992u.js → asm6502-DMwUl645.js} +1 -1
  20. package/dist/app/assets/{asmatmel-DoAdyDdX.js → asmatmel-0eqMlNdR.js} +1 -1
  21. package/dist/app/assets/{aspnet-DbKj2Y0x.js → aspnet-BdeQ5UsH.js} +1 -1
  22. package/dist/app/assets/{autohotkey-BKpl02dF.js → autohotkey-CCB3UMT9.js} +1 -1
  23. package/dist/app/assets/{autoit-nvDMUiIR.js → autoit-BOwLxRnm.js} +1 -1
  24. package/dist/app/assets/{avisynth-zdcS6mIk.js → avisynth-Bj6TRnGp.js} +1 -1
  25. package/dist/app/assets/{avro-idl-Bz9IAA6X.js → avro-idl-Bv76GoO9.js} +1 -1
  26. package/dist/app/assets/{bash-Bzch0sET.js → bash-C0E5FYLo.js} +1 -1
  27. package/dist/app/assets/{basic-u-yPBVQX.js → basic-DEsDv0vi.js} +1 -1
  28. package/dist/app/assets/{batch-Due3vTON.js → batch-ddehyzNW.js} +1 -1
  29. package/dist/app/assets/{bbcode-B7eqvAzk.js → bbcode-Bxx0da3q.js} +1 -1
  30. package/dist/app/assets/{bicep-BfgsVHBJ.js → bicep-DXDKYRDE.js} +1 -1
  31. package/dist/app/assets/{birb-BSK9o8wp.js → birb-B66i9ZlU.js} +1 -1
  32. package/dist/app/assets/{bison-DzmILaWc.js → bison-DTMiiS4R.js} +1 -1
  33. package/dist/app/assets/{blockDiagram-DXYQGD6D-4q0Z69yb.js → blockDiagram-DXYQGD6D-vtXXtZfo.js} +1 -1
  34. package/dist/app/assets/{bnf-CTxrvOa_.js → bnf-CEThILY1.js} +1 -1
  35. package/dist/app/assets/{brainfuck-B2x0y1yE.js → brainfuck-CRkrIiCu.js} +1 -1
  36. package/dist/app/assets/{brightscript-B1YuuA1a.js → brightscript-QCIOW6AL.js} +1 -1
  37. package/dist/app/assets/{bro-qJvkUxuW.js → bro-XxT-MRgH.js} +1 -1
  38. package/dist/app/assets/{bsl-D717dB3Z.js → bsl-CdT9uApG.js} +1 -1
  39. package/dist/app/assets/{c-eAvYogDo.js → c-B_jLD9e6.js} +1 -1
  40. package/dist/app/assets/{c4Diagram-AHTNJAMY-8Ls7e8MM.js → c4Diagram-AHTNJAMY-CMiEYCuz.js} +1 -1
  41. package/dist/app/assets/{cfscript-Po8jLzf2.js → cfscript-BNP9qp1d.js} +1 -1
  42. package/dist/app/assets/{chaiscript-DQ0kVVD1.js → chaiscript-hY5dXimd.js} +1 -1
  43. package/dist/app/assets/channel-BYM_b8-I.js +1 -0
  44. package/dist/app/assets/{chunk-4BX2VUAB-aVXDopSe.js → chunk-4BX2VUAB-DQeJei8f.js} +1 -1
  45. package/dist/app/assets/{chunk-4TB4RGXK-B4i0WSGT.js → chunk-4TB4RGXK-Da8afgYe.js} +1 -1
  46. package/dist/app/assets/{chunk-55IACEB6-CDWG5f9m.js → chunk-55IACEB6-Rj5sJFuS.js} +1 -1
  47. package/dist/app/assets/{chunk-EDXVE4YY-DhPmwrgR.js → chunk-EDXVE4YY-BZgPfOdH.js} +1 -1
  48. package/dist/app/assets/{chunk-FMBD7UC4-Bst2lua5.js → chunk-FMBD7UC4-COTyIgdO.js} +1 -1
  49. package/dist/app/assets/{chunk-OYMX7WX6-B3OQzz_w.js → chunk-OYMX7WX6-D1rMsd_2.js} +1 -1
  50. package/dist/app/assets/{chunk-QZHKN3VN-rnQWX_CM.js → chunk-QZHKN3VN-CKmb12Vi.js} +1 -1
  51. package/dist/app/assets/{chunk-YZCP3GAM-0SoL9M8l.js → chunk-YZCP3GAM-B_xsfjgK.js} +1 -1
  52. package/dist/app/assets/{cil-DWCFx6mz.js → cil-PyZct0u9.js} +1 -1
  53. package/dist/app/assets/classDiagram-6PBFFD2Q-CwWPzWA1.js +1 -0
  54. package/dist/app/assets/classDiagram-v2-HSJHXN6E-CwWPzWA1.js +1 -0
  55. package/dist/app/assets/{clike-B6raVGdU.js → clike-147braYa.js} +1 -1
  56. package/dist/app/assets/{clojure-DKI51Ecz.js → clojure-B5zM8dk0.js} +1 -1
  57. package/dist/app/assets/clone-B8RPLWzD.js +1 -0
  58. package/dist/app/assets/{cmake-CwwQf097.js → cmake-DVmCR8-e.js} +1 -1
  59. package/dist/app/assets/{cobol-BixlHzvP.js → cobol-B9UHQ5TC.js} +1 -1
  60. package/dist/app/assets/{coffeescript-DzMKx8Wm.js → coffeescript-ChBqV0ML.js} +1 -1
  61. package/dist/app/assets/{concurnas-CeI1_l2A.js → concurnas-C31Dgpte.js} +1 -1
  62. package/dist/app/assets/{coq-Rlyk5JPF.js → coq-BMyK4-On.js} +1 -1
  63. package/dist/app/assets/{core-CKaxhIxn.js → core-2oVERtGy.js} +1 -1
  64. package/dist/app/assets/{cose-bilkent-S5V4N54A-BEbmBjkM.js → cose-bilkent-S5V4N54A-BzOeQJvC.js} +1 -1
  65. package/dist/app/assets/{cpp-D6N2YRS8.js → cpp-BbP21HXf.js} +1 -1
  66. package/dist/app/assets/{crystal-Bp-ZOMp9.js → crystal-_Cl2beGm.js} +1 -1
  67. package/dist/app/assets/{csharp-73XQRtra.js → csharp-BTTJy4CY.js} +1 -1
  68. package/dist/app/assets/{cshtml-_Kw38cMM.js → cshtml-DfHhKfEB.js} +1 -1
  69. package/dist/app/assets/{csp-CWKQ7qNy.js → csp-SVWtS9kS.js} +1 -1
  70. package/dist/app/assets/{css-CSf4crh0.js → css-B6m9dOOV.js} +1 -1
  71. package/dist/app/assets/{css-extras-BPFlTbKM.js → css-extras-LK4o0hc9.js} +1 -1
  72. package/dist/app/assets/{csv-NdIdVmit.js → csv-CoTfO3DU.js} +1 -1
  73. package/dist/app/assets/{cypher-DrG3lvrT.js → cypher-DX_ZpMzL.js} +1 -1
  74. package/dist/app/assets/{d-Byk2LV83.js → d-E9Iec9kX.js} +1 -1
  75. package/dist/app/assets/{dagre-KV5264BT-DONbK4nc.js → dagre-KV5264BT-CrgALnug.js} +1 -1
  76. package/dist/app/assets/{dart-DAvsdDA3.js → dart-D63EyPv_.js} +1 -1
  77. package/dist/app/assets/{dataweave-C5T6xtfv.js → dataweave-CBz506IK.js} +1 -1
  78. package/dist/app/assets/{dax-DoH9pkog.js → dax-wIXLPtir.js} +1 -1
  79. package/dist/app/assets/{dhall-DJpQKYes.js → dhall-kEUn6fOU.js} +1 -1
  80. package/dist/app/assets/{diagram-5BDNPKRD-cVSMcLwH.js → diagram-5BDNPKRD-B4x7n2He.js} +1 -1
  81. package/dist/app/assets/{diagram-G4DWMVQ6-B5QE6o4T.js → diagram-G4DWMVQ6-DJN3PzdQ.js} +1 -1
  82. package/dist/app/assets/{diagram-MMDJMWI5-DIWNtwBR.js → diagram-MMDJMWI5-EFZZ4e7c.js} +1 -1
  83. package/dist/app/assets/{diagram-TYMM5635-rMAqc1qj.js → diagram-TYMM5635-BxRlCQ_r.js} +1 -1
  84. package/dist/app/assets/{diff-DvrdG0n8.js → diff-DC7NxMGB.js} +1 -1
  85. package/dist/app/assets/{django-DEQbld8i.js → django-D-8jYa2a.js} +1 -1
  86. package/dist/app/assets/{dns-zone-file-BADAi43M.js → dns-zone-file-C6hvPP_3.js} +1 -1
  87. package/dist/app/assets/{docker-BbNeQOxZ.js → docker-B-znhIuW.js} +1 -1
  88. package/dist/app/assets/{dot-Bmy4l5j8.js → dot-DAf-TSqK.js} +1 -1
  89. package/dist/app/assets/{ebnf-B0QE6nnN.js → ebnf-D-vmW4_0.js} +1 -1
  90. package/dist/app/assets/{editorconfig-Bg3JR5OT.js → editorconfig-DWNNwgLN.js} +1 -1
  91. package/dist/app/assets/{eiffel-CYMSvYtO.js → eiffel-BH0EK-0w.js} +1 -1
  92. package/dist/app/assets/{ejs-CP1oTchE.js → ejs-BHVpNUPK.js} +1 -1
  93. package/dist/app/assets/{elixir-Di3D46jy.js → elixir-CSqzxagz.js} +1 -1
  94. package/dist/app/assets/{elm-DS1CidFy.js → elm-DRfM8-kg.js} +1 -1
  95. package/dist/app/assets/{erDiagram-SMLLAGMA-DmA9X2aB.js → erDiagram-SMLLAGMA-zeJNpJxa.js} +1 -1
  96. package/dist/app/assets/{erb-MTRWz0CC.js → erb-CNmIpOgi.js} +1 -1
  97. package/dist/app/assets/{erlang-C0EhPwsW.js → erlang-BDZ2hYY3.js} +1 -1
  98. package/dist/app/assets/{etlua-DrTwkJv_.js → etlua-C4HN13b2.js} +1 -1
  99. package/dist/app/assets/{excel-formula-BUY1j-dw.js → excel-formula-Yx0G471H.js} +1 -1
  100. package/dist/app/assets/{factor-BawUE8xG.js → factor-CDg-yp2G.js} +1 -1
  101. package/dist/app/assets/{false-BoDMLPv-.js → false-DN2H4sAD.js} +1 -1
  102. package/dist/app/assets/{firestore-security-rules-CWXxe34f.js → firestore-security-rules-CQ-TIWUF.js} +1 -1
  103. package/dist/app/assets/{flow-l-oHCDfx.js → flow-BXnYlVyC.js} +1 -1
  104. package/dist/app/assets/{flowDiagram-DWJPFMVM-Bf7CgR6O.js → flowDiagram-DWJPFMVM-DPw-bB22.js} +1 -1
  105. package/dist/app/assets/{fortran-DbfhBm3h.js → fortran-DnQotiqX.js} +1 -1
  106. package/dist/app/assets/{fsharp-C_xG7_2F.js → fsharp-BJKYVmKn.js} +1 -1
  107. package/dist/app/assets/{ftl-BOmP6dqU.js → ftl-BFC3zO20.js} +1 -1
  108. package/dist/app/assets/{ganttDiagram-T4ZO3ILL-Bg6Tdt0n.js → ganttDiagram-T4ZO3ILL-CM9Ugpiy.js} +1 -1
  109. package/dist/app/assets/{gap-CHKm_uiw.js → gap-CrgrAbSP.js} +1 -1
  110. package/dist/app/assets/{gcode-vLqAglHa.js → gcode-CnYu5Ex7.js} +1 -1
  111. package/dist/app/assets/{gdscript-vbRU5enn.js → gdscript-cRbhv87p.js} +1 -1
  112. package/dist/app/assets/{gedcom-D0cr82OU.js → gedcom-D_sy6Ots.js} +1 -1
  113. package/dist/app/assets/{gherkin-CdrJEioP.js → gherkin-CFywV355.js} +1 -1
  114. package/dist/app/assets/{git-BpYfHv6w.js → git-Bf2bz3Wy.js} +1 -1
  115. package/dist/app/assets/{gitGraphDiagram-UUTBAWPF-DpeozhsT.js → gitGraphDiagram-UUTBAWPF-BmVPKqch.js} +1 -1
  116. package/dist/app/assets/{glsl-C1mqMYtZ.js → glsl-0-0tN7ae.js} +1 -1
  117. package/dist/app/assets/{gml-MmP8j1JT.js → gml-CF4VMKyW.js} +1 -1
  118. package/dist/app/assets/{gn-vbr8Ezf8.js → gn-Dwh3RmHT.js} +1 -1
  119. package/dist/app/assets/{go-D6TPbDdE.js → go-CTuQ3ELr.js} +1 -1
  120. package/dist/app/assets/{go-module-DfKcZOwK.js → go-module-MkAn_pzN.js} +1 -1
  121. package/dist/app/assets/{graph-CUTA2u9Q.js → graph-CpjKr_Ss.js} +1 -1
  122. package/dist/app/assets/{graphql-mqzCl3PN.js → graphql-BGqt50Z0.js} +1 -1
  123. package/dist/app/assets/{groovy-ClYqnFm5.js → groovy-DNLFkeUu.js} +1 -1
  124. package/dist/app/assets/{haml-BxHbXcYR.js → haml-DteW0kdw.js} +1 -1
  125. package/dist/app/assets/{handlebars-v6nReoI-.js → handlebars-Cq0q7SZx.js} +1 -1
  126. package/dist/app/assets/{haskell-DzKP2Bsc.js → haskell-yRp-22Bm.js} +1 -1
  127. package/dist/app/assets/{haxe-DevMcR_Z.js → haxe-B2gRWeQu.js} +1 -1
  128. package/dist/app/assets/{hcl-C5Bj9s3r.js → hcl-DbtimhMF.js} +1 -1
  129. package/dist/app/assets/{hlsl-FNmun_i2.js → hlsl-CNF6I53_.js} +1 -1
  130. package/dist/app/assets/{hoon-Cn8qSAYQ.js → hoon-CzaGoRKh.js} +1 -1
  131. package/dist/app/assets/{hpkp-x-6CfFYy.js → hpkp-CN0wAndN.js} +1 -1
  132. package/dist/app/assets/{hsts-DTMvA9jI.js → hsts-DappYgs2.js} +1 -1
  133. package/dist/app/assets/{http-repyLWTd.js → http-BY6617iq.js} +1 -1
  134. package/dist/app/assets/{ichigojam-DVrOBI5W.js → ichigojam-FmzUOqyg.js} +1 -1
  135. package/dist/app/assets/{icon-CFEy7hhK.js → icon-t_33X7na.js} +1 -1
  136. package/dist/app/assets/{icu-message-format-Bs8z8Pa8.js → icu-message-format-DCHJfKU4.js} +1 -1
  137. package/dist/app/assets/{idris-B4dKajLi.js → idris-BHrSgjd1.js} +1 -1
  138. package/dist/app/assets/{iecst-C8tB6F6o.js → iecst-Edt5q5x5.js} +1 -1
  139. package/dist/app/assets/{ignore-BSV7EeW4.js → ignore-QHm1VEId.js} +1 -1
  140. package/dist/app/assets/index-B25mng8X.js +754 -0
  141. package/dist/app/assets/index-CYj11nKH.css +1 -0
  142. package/dist/app/assets/{infoDiagram-42DDH7IO-C3qc42CB.js → infoDiagram-42DDH7IO-CWVsOkhG.js} +1 -1
  143. package/dist/app/assets/{inform7-DrAKK55g.js → inform7-DQOtMPhH.js} +1 -1
  144. package/dist/app/assets/{ini-u8YQIiOq.js → ini-Cbu7YzI1.js} +1 -1
  145. package/dist/app/assets/{io-BF3U_13f.js → io-e0l8cV23.js} +1 -1
  146. package/dist/app/assets/{ishikawaDiagram-UXIWVN3A-DZFv5qUJ.js → ishikawaDiagram-UXIWVN3A-DM9lBm40.js} +1 -1
  147. package/dist/app/assets/{j-CCimMXhx.js → j-DcCjctA4.js} +1 -1
  148. package/dist/app/assets/{java-DO5fViyr.js → java-D6wSCcUS.js} +1 -1
  149. package/dist/app/assets/{javadoc-DDpss0Lm.js → javadoc-Nw5FrRpH.js} +1 -1
  150. package/dist/app/assets/{javadoclike-DU0tWt01.js → javadoclike-BtzPHbb7.js} +1 -1
  151. package/dist/app/assets/{javascript-DdjszwTa.js → javascript-C-05XZq6.js} +1 -1
  152. package/dist/app/assets/{javastacktrace-6TqNjdk7.js → javastacktrace-CIS-g4Df.js} +1 -1
  153. package/dist/app/assets/{jexl-D8MtdYvR.js → jexl-CSFXxxQr.js} +1 -1
  154. package/dist/app/assets/{jolie-CocTJfsD.js → jolie-B_pXK5DU.js} +1 -1
  155. package/dist/app/assets/{journeyDiagram-VCZTEJTY-BJFWqXvt.js → journeyDiagram-VCZTEJTY-B7-JXvaL.js} +1 -1
  156. package/dist/app/assets/{jq-BLep2RPL.js → jq-J-I2FM7i.js} +1 -1
  157. package/dist/app/assets/{js-extras-DQHOpmR6.js → js-extras-Dx_8EXzo.js} +1 -1
  158. package/dist/app/assets/{js-templates-C8bgfiAI.js → js-templates-D05g6Rqs.js} +1 -1
  159. package/dist/app/assets/{jsdoc-CTXb0QBN.js → jsdoc-DPSggCzu.js} +1 -1
  160. package/dist/app/assets/{json-MXhid-40.js → json-eebW4acE.js} +1 -1
  161. package/dist/app/assets/{json5-BBNk0TrK.js → json5-D6OcVhOH.js} +1 -1
  162. package/dist/app/assets/{jsonp-B8GEZBkI.js → jsonp-OpiKfVjM.js} +1 -1
  163. package/dist/app/assets/{jsstacktrace-pvIKS4Zv.js → jsstacktrace-BmUz1bEc.js} +1 -1
  164. package/dist/app/assets/{jsx-BR_PTydE.js → jsx-rqpNmzfs.js} +1 -1
  165. package/dist/app/assets/{julia-Cm4xtp32.js → julia-DwJZus4k.js} +1 -1
  166. package/dist/app/assets/{kanban-definition-6JOO6SKY-BG9atDzG.js → kanban-definition-6JOO6SKY-BfzqKcr7.js} +1 -1
  167. package/dist/app/assets/{keepalived-DS091xJp.js → keepalived-DpBbx4Cw.js} +1 -1
  168. package/dist/app/assets/{keyman-Cq3rg_OW.js → keyman-7jQL65gp.js} +1 -1
  169. package/dist/app/assets/{kotlin-Dj8rHKDk.js → kotlin-BqCPARVL.js} +1 -1
  170. package/dist/app/assets/{kumir-CnspAIaB.js → kumir-BypHMU6_.js} +1 -1
  171. package/dist/app/assets/{kusto-B_M8_-iN.js → kusto-LmNXDd9d.js} +1 -1
  172. package/dist/app/assets/{latex-h_1mu4rU.js → latex-CAoYss1M.js} +1 -1
  173. package/dist/app/assets/{latte-DRruVMVR.js → latte-CSVfbiOL.js} +1 -1
  174. package/dist/app/assets/{layout-C4Y-_UhZ.js → layout-Bb4TjfVy.js} +1 -1
  175. package/dist/app/assets/{less-BkBKGybJ.js → less-DrZAGdRl.js} +1 -1
  176. package/dist/app/assets/{lilypond-tpptDbXf.js → lilypond-C4k3pwiB.js} +1 -1
  177. package/dist/app/assets/{linear-LRhlJwR0.js → linear-BRU8--MT.js} +1 -1
  178. package/dist/app/assets/{liquid-BYEdjQlm.js → liquid-CELaXiSm.js} +1 -1
  179. package/dist/app/assets/{lisp-UYdnBUFJ.js → lisp-CKGtAI1M.js} +1 -1
  180. package/dist/app/assets/{livescript-C9yax0KM.js → livescript-B9iEhd-x.js} +1 -1
  181. package/dist/app/assets/{llvm-2LUJOlxq.js → llvm-wn6tpbZs.js} +1 -1
  182. package/dist/app/assets/{log-DKjvz3ho.js → log-BA-GGyoJ.js} +1 -1
  183. package/dist/app/assets/{lolcode-CLsVUU7R.js → lolcode-C3Utlc1p.js} +1 -1
  184. package/dist/app/assets/{lua-G_BZKE8Q.js → lua-BGTOn4rS.js} +1 -1
  185. package/dist/app/assets/{magma-lCuEwSEu.js → magma-DH54NGN3.js} +1 -1
  186. package/dist/app/assets/{makefile-CuurcFXN.js → makefile-Dev3s5gm.js} +1 -1
  187. package/dist/app/assets/{markdown-D8twlx64.js → markdown-DySjwUhR.js} +1 -1
  188. package/dist/app/assets/{markup-CPx0l2_m.js → markup-Cne6yiR5.js} +1 -1
  189. package/dist/app/assets/{markup-templating-1SLH6Zrr.js → markup-templating-D9qZqcoX.js} +1 -1
  190. package/dist/app/assets/{matlab-DiXiMdVf.js → matlab-DdzC7h-S.js} +1 -1
  191. package/dist/app/assets/{maxscript-CR5B3kzO.js → maxscript-DJU9yVir.js} +1 -1
  192. package/dist/app/assets/{mel-4XG8ApRx.js → mel-DBa5zGRt.js} +1 -1
  193. package/dist/app/assets/{mermaid-Dg_Z96Py.js → mermaid-CKtJNvBf.js} +1 -1
  194. package/dist/app/assets/{min-ZF6tgODw.js → min-DXoQC-9u.js} +1 -1
  195. package/dist/app/assets/{mindmap-definition-QFDTVHPH-XatWoYUC.js → mindmap-definition-QFDTVHPH-BY329Pxo.js} +1 -1
  196. package/dist/app/assets/{mizar-D7LfXPjH.js → mizar-CCmgax7Y.js} +1 -1
  197. package/dist/app/assets/{mongodb-BT27iI7P.js → mongodb-CpxP716G.js} +1 -1
  198. package/dist/app/assets/{monkey-CHo4ln4E.js → monkey-uyoynnP1.js} +1 -1
  199. package/dist/app/assets/{moonscript-yAsABvFl.js → moonscript-Cq-OMQ_B.js} +1 -1
  200. package/dist/app/assets/{n1ql-CVjJ8k0G.js → n1ql-BXgBZBbD.js} +1 -1
  201. package/dist/app/assets/{n4js-BpnXK7uO.js → n4js-DfV0N-rV.js} +1 -1
  202. package/dist/app/assets/{nand2tetris-hdl-DZIcttnF.js → nand2tetris-hdl-CwrCPiLw.js} +1 -1
  203. package/dist/app/assets/{naniscript-BjdWmpbq.js → naniscript-BYOyd8_0.js} +1 -1
  204. package/dist/app/assets/{nasm-tTGUS43W.js → nasm-1sS4mbu2.js} +1 -1
  205. package/dist/app/assets/{neon-Cm0NipU3.js → neon-C5lJqHYa.js} +1 -1
  206. package/dist/app/assets/{nevod-CAvas20G.js → nevod-CDy3ZJI6.js} +1 -1
  207. package/dist/app/assets/{nginx-BG78NxdZ.js → nginx-D0pZQ1Gx.js} +1 -1
  208. package/dist/app/assets/{nim-vMSiqOYt.js → nim-B-QSri62.js} +1 -1
  209. package/dist/app/assets/{nix-PeXWRdgp.js → nix-BFZ3DzZz.js} +1 -1
  210. package/dist/app/assets/{nsis-Bx4jjgkI.js → nsis-DUp3RL6V.js} +1 -1
  211. package/dist/app/assets/{objectivec-Xc1Oxea3.js → objectivec-BXYeLA3z.js} +1 -1
  212. package/dist/app/assets/{ocaml-CETJbxfK.js → ocaml-N7C8ZUgL.js} +1 -1
  213. package/dist/app/assets/{opencl-C8i9C44z.js → opencl-C1hdWG9E.js} +1 -1
  214. package/dist/app/assets/{openqasm-qSsT45fS.js → openqasm-tVhrcf0N.js} +1 -1
  215. package/dist/app/assets/{oz-w99JsW87.js → oz-DbHRYHpi.js} +1 -1
  216. package/dist/app/assets/{parigp-DvkJkH_x.js → parigp-D235NbbM.js} +1 -1
  217. package/dist/app/assets/{parser-B1HImE8Y.js → parser-CQnel-2z.js} +1 -1
  218. package/dist/app/assets/{pascal-DQaovYcp.js → pascal-DgFGAGP1.js} +1 -1
  219. package/dist/app/assets/{pascaligo-DbdIyNdD.js → pascaligo-B0jmRm5x.js} +1 -1
  220. package/dist/app/assets/{pcaxis-8ssDIrdH.js → pcaxis-CQNhbPNS.js} +1 -1
  221. package/dist/app/assets/{peoplecode-BiV5Zxb2.js → peoplecode-eZLUWdcF.js} +1 -1
  222. package/dist/app/assets/{perl-CPu8mq3o.js → perl-CiaddnhV.js} +1 -1
  223. package/dist/app/assets/{php-BDLnoxLe.js → php-B-tFsK7f.js} +1 -1
  224. package/dist/app/assets/{php-extras-BlCs6h78.js → php-extras-e6eZZ7Na.js} +1 -1
  225. package/dist/app/assets/{phpdoc-oTKbX7Rh.js → phpdoc-3KxouLRA.js} +1 -1
  226. package/dist/app/assets/{pieDiagram-DEJITSTG-CkgOwggS.js → pieDiagram-DEJITSTG-DfAj9P4h.js} +1 -1
  227. package/dist/app/assets/{plsql-BYXZUF33.js → plsql-aOKfDsoP.js} +1 -1
  228. package/dist/app/assets/{powerquery-VGGq_Y-K.js → powerquery-Bt6p3LDv.js} +1 -1
  229. package/dist/app/assets/{powershell-RNtOnmCz.js → powershell-DmKC1AtN.js} +1 -1
  230. package/dist/app/assets/{processing-C83CF7Om.js → processing-BspG6atJ.js} +1 -1
  231. package/dist/app/assets/{prolog-MO4dJhtY.js → prolog-8OHnLA4S.js} +1 -1
  232. package/dist/app/assets/{promql-CzEJXg3T.js → promql-WoICd-lG.js} +1 -1
  233. package/dist/app/assets/{properties-BXiHyIGq.js → properties-CT9ysoga.js} +1 -1
  234. package/dist/app/assets/{protobuf-DzIsCptu.js → protobuf-DbbkrfXt.js} +1 -1
  235. package/dist/app/assets/{psl-gO8eBzTG.js → psl-D9uQzlIv.js} +1 -1
  236. package/dist/app/assets/{pug-DROaMmxc.js → pug-C1Sr-_yU.js} +1 -1
  237. package/dist/app/assets/{puppet-CkdEKP68.js → puppet-DHnN0rw0.js} +1 -1
  238. package/dist/app/assets/{pure-B4T0aVQv.js → pure-k9o45cow.js} +1 -1
  239. package/dist/app/assets/{purebasic-DhErIpnU.js → purebasic-CX4szve_.js} +1 -1
  240. package/dist/app/assets/{purescript-BpSYig0_.js → purescript-DtyuJSvo.js} +1 -1
  241. package/dist/app/assets/{q-BP_ajmdt.js → q-CquTY3do.js} +1 -1
  242. package/dist/app/assets/{qml-VWVXkJA9.js → qml-B2WEaROU.js} +1 -1
  243. package/dist/app/assets/{qore-CVNz07Jd.js → qore-BaWLl36W.js} +1 -1
  244. package/dist/app/assets/{qsharp-DYrITprs.js → qsharp-BaHlKQ4H.js} +1 -1
  245. package/dist/app/assets/{quadrantDiagram-34T5L4WZ-VnllqPYP.js → quadrantDiagram-34T5L4WZ-De73cCE8.js} +1 -1
  246. package/dist/app/assets/{r-lkMqhKIi.js → r-DYriivXA.js} +1 -1
  247. package/dist/app/assets/{racket-GNxLzSm4.js → racket-CpHgRVRU.js} +1 -1
  248. package/dist/app/assets/{reason-pr_OxQol.js → reason-BukTB_kL.js} +1 -1
  249. package/dist/app/assets/{regex-DuA5bt82.js → regex-DpWjc0Hv.js} +1 -1
  250. package/dist/app/assets/{rego-ChVBSuCN.js → rego-CLsvZiLZ.js} +1 -1
  251. package/dist/app/assets/{renpy-B-T9UWLB.js → renpy-CPUiZJXX.js} +1 -1
  252. package/dist/app/assets/{requirementDiagram-MS252O5E-nOZVjPtN.js → requirementDiagram-MS252O5E-D3E3vDMy.js} +1 -1
  253. package/dist/app/assets/{rest-CG4X-WbZ.js → rest-D0Bwam59.js} +1 -1
  254. package/dist/app/assets/{rip-B6LzWfep.js → rip-DRm4vanm.js} +1 -1
  255. package/dist/app/assets/{roboconf-ySeTNbLp.js → roboconf-DHDu2gUA.js} +1 -1
  256. package/dist/app/assets/{robotframework-kIOhzxiU.js → robotframework-DicywtSw.js} +1 -1
  257. package/dist/app/assets/{ruby-BM8sekCP.js → ruby-D9n15-XE.js} +1 -1
  258. package/dist/app/assets/{rust-BOWARmu4.js → rust-Dt3bCCBI.js} +1 -1
  259. package/dist/app/assets/{sankeyDiagram-XADWPNL6-D5SMgLO7.js → sankeyDiagram-XADWPNL6-BV0dJiuD.js} +1 -1
  260. package/dist/app/assets/{sas-C95QHnSk.js → sas-BpsC5kMD.js} +1 -1
  261. package/dist/app/assets/{sass-CcV7wTsX.js → sass-CT-j7yH3.js} +1 -1
  262. package/dist/app/assets/{scala-B-FlSrSn.js → scala-D5-0kvxt.js} +1 -1
  263. package/dist/app/assets/{scheme-DAA64CUS.js → scheme-BAZoRTMC.js} +1 -1
  264. package/dist/app/assets/{scss-B383C8dD.js → scss-Bb3FF0LI.js} +1 -1
  265. package/dist/app/assets/{sequenceDiagram-FGHM5R23-BAq3WCJj.js → sequenceDiagram-FGHM5R23-3tyYo99u.js} +1 -1
  266. package/dist/app/assets/{shell-session-65a-LoVJ.js → shell-session-B7Emf3NW.js} +1 -1
  267. package/dist/app/assets/{smali-kRxBivzr.js → smali-B5spmGvV.js} +1 -1
  268. package/dist/app/assets/{smalltalk-BeQVL5pW.js → smalltalk-D3JbgB6K.js} +1 -1
  269. package/dist/app/assets/{smarty-Ch5TbbQQ.js → smarty-C9YGEmsd.js} +1 -1
  270. package/dist/app/assets/{sml-BB_7RVyU.js → sml-BxaohhYY.js} +1 -1
  271. package/dist/app/assets/{solidity-D7wGcxQr.js → solidity-BrUJKjQw.js} +1 -1
  272. package/dist/app/assets/{solution-file-Db21ESd-.js → solution-file-C7eMymBf.js} +1 -1
  273. package/dist/app/assets/{soy-B0_l5rJw.js → soy-BiN49MCy.js} +1 -1
  274. package/dist/app/assets/{sparql-JpwPPAJG.js → sparql-tZI5hOUa.js} +1 -1
  275. package/dist/app/assets/{splunk-spl-_c2dI16C.js → splunk-spl-B2LG24WR.js} +1 -1
  276. package/dist/app/assets/{sqf-AGX-5SQA.js → sqf-D39dGOsm.js} +1 -1
  277. package/dist/app/assets/{sql-DQV539be.js → sql-Bf5b0eBp.js} +1 -1
  278. package/dist/app/assets/{squirrel-FmrsBrtP.js → squirrel-oMS_qmht.js} +1 -1
  279. package/dist/app/assets/{stan-DG1wBDVn.js → stan-DCacwMcL.js} +1 -1
  280. package/dist/app/assets/{stateDiagram-FHFEXIEX-CBG1b62a.js → stateDiagram-FHFEXIEX-bCUjpdIF.js} +1 -1
  281. package/dist/app/assets/stateDiagram-v2-QKLJ7IA2-jjpXEsTl.js +1 -0
  282. package/dist/app/assets/{stylus-FxxnGpKJ.js → stylus-CRGeO3WE.js} +1 -1
  283. package/dist/app/assets/{swift-OjEf0t2u.js → swift-BbDOsDL3.js} +1 -1
  284. package/dist/app/assets/{systemd-CXdOpEaM.js → systemd-tzWhSmEO.js} +1 -1
  285. package/dist/app/assets/{t4-cs-BWNYdlda.js → t4-cs-OEUJv71g.js} +1 -1
  286. package/dist/app/assets/{t4-templating-Biohaix7.js → t4-templating-DwkD4CD2.js} +1 -1
  287. package/dist/app/assets/{t4-vb-DNFGD3d_.js → t4-vb-BpBzKO9q.js} +1 -1
  288. package/dist/app/assets/{tap-Dg18e05M.js → tap-DCDrRqf8.js} +1 -1
  289. package/dist/app/assets/{tcl-Btqn2UMc.js → tcl-BsMdDEdZ.js} +1 -1
  290. package/dist/app/assets/{textile-BxdpzGb-.js → textile-CuccM9uC.js} +1 -1
  291. package/dist/app/assets/{timeline-definition-GMOUNBTQ-BtjV1Syb.js → timeline-definition-GMOUNBTQ-C-w2F5Or.js} +1 -1
  292. package/dist/app/assets/{toml-D3WkKMhp.js → toml-DS1V4-5r.js} +1 -1
  293. package/dist/app/assets/{tremor-ix0_xPIS.js → tremor-BsV3JlTK.js} +1 -1
  294. package/dist/app/assets/{tt2-DYiEf69I.js → tt2-CsX9KNZF.js} +1 -1
  295. package/dist/app/assets/{turtle-D79kYTiV.js → turtle-BdBdOvle.js} +1 -1
  296. package/dist/app/assets/{twig-C2lO0FQ6.js → twig-CFTxgyFh.js} +1 -1
  297. package/dist/app/assets/{typescript-BWbs3zZK.js → typescript-CP-0S4VB.js} +1 -1
  298. package/dist/app/assets/{typoscript-CXO8uHo_.js → typoscript-sdz_0j3U.js} +1 -1
  299. package/dist/app/assets/{unrealscript-B4IFw4Fc.js → unrealscript-ITVDTz_r.js} +1 -1
  300. package/dist/app/assets/{uorazor-Ow8B2gZE.js → uorazor-Bk5cDC7V.js} +1 -1
  301. package/dist/app/assets/{uri-CjdCf_n6.js → uri-B4zzsc9t.js} +1 -1
  302. package/dist/app/assets/{v-Djh7PWAw.js → v-_ZLRiU4I.js} +1 -1
  303. package/dist/app/assets/{vala-hMKcKqAv.js → vala-DewPeyKY.js} +1 -1
  304. package/dist/app/assets/{vbnet-CBKK7AZw.js → vbnet-CnidJofE.js} +1 -1
  305. package/dist/app/assets/{velocity-DBPvifAA.js → velocity-BIto2PyM.js} +1 -1
  306. package/dist/app/assets/{vennDiagram-DHZGUBPP-D-sPxJCn.js → vennDiagram-DHZGUBPP-BiNaKYx5.js} +1 -1
  307. package/dist/app/assets/{verilog-B06XleW6.js → verilog-Cvnp7XFu.js} +1 -1
  308. package/dist/app/assets/{vhdl-z0adhEhq.js → vhdl-BxpSxJwd.js} +1 -1
  309. package/dist/app/assets/{vim-DgXoWMAS.js → vim-Cb-kHdfC.js} +1 -1
  310. package/dist/app/assets/{visual-basic-C17Ibazf.js → visual-basic-ouzXfRru.js} +1 -1
  311. package/dist/app/assets/{wardley-RL74JXVD-DSMlPQeI.js → wardley-RL74JXVD-EvMjMAiC.js} +1 -1
  312. package/dist/app/assets/{wardleyDiagram-NUSXRM2D-DfRjSWRr.js → wardleyDiagram-NUSXRM2D-BCn9Ja7r.js} +1 -1
  313. package/dist/app/assets/{warpscript-BIetGxT8.js → warpscript-C1EpA-EM.js} +1 -1
  314. package/dist/app/assets/{wasm-DDD0BDOW.js → wasm-B_LySlXP.js} +1 -1
  315. package/dist/app/assets/{web-idl-CIMai9Vx.js → web-idl-BB9NLYCy.js} +1 -1
  316. package/dist/app/assets/{wiki-CVWHKZwQ.js → wiki-D_jE3n0M.js} +1 -1
  317. package/dist/app/assets/{wolfram-BvGOmO4s.js → wolfram-BbhyYenT.js} +1 -1
  318. package/dist/app/assets/{wren-CbF6O884.js → wren-CdD9yanb.js} +1 -1
  319. package/dist/app/assets/{xeora-B1ekyGx3.js → xeora-CGIw1yLs.js} +1 -1
  320. package/dist/app/assets/{xml-doc-B4Y4OcvH.js → xml-doc-Ddm2H-gK.js} +1 -1
  321. package/dist/app/assets/{xojo-8yNuRPIu.js → xojo-BJAMTi-d.js} +1 -1
  322. package/dist/app/assets/{xquery-18e5foCa.js → xquery-DtxeJSqz.js} +1 -1
  323. package/dist/app/assets/{xychartDiagram-5P7HB3ND-CC5MceuR.js → xychartDiagram-5P7HB3ND-tzUn3HbQ.js} +1 -1
  324. package/dist/app/assets/{yaml-CBHqwYPN.js → yaml-Y_Pa3exj.js} +1 -1
  325. package/dist/app/assets/{yang-Cr3tggHy.js → yang-D4TnI_4D.js} +1 -1
  326. package/dist/app/assets/{zig-CAn9IEzi.js → zig-Dn_ZOetC.js} +1 -1
  327. package/dist/app/index.html +2 -2
  328. package/dist/index.cjs +961 -5
  329. package/dist/index.js +972 -9
  330. package/package.json +3 -3
  331. package/dist/app/assets/channel-776uJRzf.js +0 -1
  332. package/dist/app/assets/classDiagram-6PBFFD2Q-CuMmt2wK.js +0 -1
  333. package/dist/app/assets/classDiagram-v2-HSJHXN6E-CuMmt2wK.js +0 -1
  334. package/dist/app/assets/clone-BHKv9dxg.js +0 -1
  335. package/dist/app/assets/index-COsBUIAY.js +0 -754
  336. package/dist/app/assets/index-aAZDJmqe.css +0 -1
  337. package/dist/app/assets/stateDiagram-v2-QKLJ7IA2-Duz6pBEy.js +0 -1
package/dist/index.js CHANGED
@@ -2,12 +2,18 @@
2
2
  import * as React48 from "react";
3
3
  import {
4
4
  ArrowDown as ArrowDown2,
5
+ ChevronDown as ChevronDown5,
5
6
  FileText as FileText5,
6
7
  ImageIcon,
8
+ Loader2 as Loader28,
7
9
  Minus,
10
+ Pause,
8
11
  Pencil as Pencil4,
12
+ Play,
9
13
  Quote,
10
14
  Settings as Settings2,
15
+ Target as Target2,
16
+ Trash2 as Trash23,
11
17
  X as X6
12
18
  } from "lucide-react";
13
19
 
@@ -174,6 +180,9 @@ function readContentAgentKey(content) {
174
180
  if (!content || typeof content === "string") return void 0;
175
181
  return typeof content.agentKey === "string" && content.agentKey.trim() ? content.agentKey.trim() : void 0;
176
182
  }
183
+ function isMiddlewareAgentRunInfo(info) {
184
+ return info?.nodeType?.trim().toLowerCase() === "middleware";
185
+ }
177
186
 
178
187
  // src/lib/api-config.ts
179
188
  function hasConfiguredValue(value) {
@@ -1052,6 +1061,117 @@ function resolveUsedContextSize(options) {
1052
1061
  return normalizeContextUsageNumber(options.fallbackUsedTokens) ?? 0;
1053
1062
  }
1054
1063
 
1064
+ // src/lib/thread-goals.ts
1065
+ function normalizeGoalObjective(value) {
1066
+ return value.trim();
1067
+ }
1068
+ function parseGoalCommand(args) {
1069
+ const text = args.trim();
1070
+ if (!text) {
1071
+ return { type: "show" };
1072
+ }
1073
+ const lower = text.toLowerCase();
1074
+ if (lower === "pause") {
1075
+ return { type: "pause" };
1076
+ }
1077
+ if (lower === "resume") {
1078
+ return { type: "resume" };
1079
+ }
1080
+ if (lower === "clear") {
1081
+ return { type: "clear" };
1082
+ }
1083
+ if (lower.startsWith("edit ")) {
1084
+ return {
1085
+ type: "edit",
1086
+ objective: normalizeGoalObjective(text.slice(5))
1087
+ };
1088
+ }
1089
+ return {
1090
+ type: "set",
1091
+ objective: normalizeGoalObjective(text)
1092
+ };
1093
+ }
1094
+ async function loadThreadGoal({
1095
+ goal,
1096
+ threadId,
1097
+ signal
1098
+ }) {
1099
+ return goal.getGoal({ threadId, signal });
1100
+ }
1101
+ async function executeThreadGoalCommand({
1102
+ goal,
1103
+ threadId,
1104
+ assistantId,
1105
+ command,
1106
+ runtimeCapabilities,
1107
+ signal
1108
+ }) {
1109
+ const normalizedThreadId = threadId?.trim() || null;
1110
+ if (command.type === "show") {
1111
+ if (!normalizedThreadId) {
1112
+ throw new Error("Thread is required to show the current goal.");
1113
+ }
1114
+ return {
1115
+ threadId: normalizedThreadId,
1116
+ goal: await goal.getGoal({ threadId: normalizedThreadId, signal })
1117
+ };
1118
+ }
1119
+ if (command.type === "clear") {
1120
+ if (!normalizedThreadId) {
1121
+ throw new Error("Thread is required to clear the current goal.");
1122
+ }
1123
+ return {
1124
+ threadId: normalizedThreadId,
1125
+ goal: await goal.clearGoal({ threadId: normalizedThreadId, signal })
1126
+ };
1127
+ }
1128
+ if (command.type === "pause" || command.type === "resume") {
1129
+ if (!normalizedThreadId) {
1130
+ throw new Error("Thread is required to update the current goal.");
1131
+ }
1132
+ return {
1133
+ threadId: normalizedThreadId,
1134
+ goal: await goal.updateGoal({
1135
+ threadId: normalizedThreadId,
1136
+ status: command.type === "pause" ? "paused" : "active",
1137
+ signal
1138
+ })
1139
+ };
1140
+ }
1141
+ const objective = command.objective.trim();
1142
+ if (!objective) {
1143
+ throw new Error("Goal objective is required.");
1144
+ }
1145
+ if (command.type === "edit") {
1146
+ if (!normalizedThreadId) {
1147
+ const result2 = await goal.setGoal({
1148
+ threadId: null,
1149
+ assistantId,
1150
+ objective,
1151
+ runtimeCapabilities,
1152
+ signal
1153
+ });
1154
+ return result2;
1155
+ }
1156
+ return {
1157
+ threadId: normalizedThreadId,
1158
+ goal: await goal.updateGoal({
1159
+ threadId: normalizedThreadId,
1160
+ objective,
1161
+ signal
1162
+ })
1163
+ };
1164
+ }
1165
+ const result = await goal.setGoal({
1166
+ threadId: normalizedThreadId,
1167
+ assistantId,
1168
+ objective,
1169
+ runtimeCapabilities,
1170
+ signal
1171
+ });
1172
+ return result;
1173
+ }
1174
+
1055
1175
  // src/lib/follow-ups.ts
1056
1176
  function getComposerFollowUpShortcutLabels(queueShortcutLabel) {
1057
1177
  return {
@@ -1100,6 +1220,7 @@ import {
1100
1220
  Search,
1101
1221
  SlidersHorizontal,
1102
1222
  Sparkles,
1223
+ Target,
1103
1224
  X
1104
1225
  } from "lucide-react";
1105
1226
 
@@ -1289,6 +1410,8 @@ var en_US_default = {
1289
1410
  referencedContentOnly: "Referenced content",
1290
1411
  youLabel: "You",
1291
1412
  scrollToBottom: "Scroll to bottom",
1413
+ loadMoreMessages: "Load more",
1414
+ loadingMoreMessages: "Loading...",
1292
1415
  retryUpload: "Retry upload",
1293
1416
  dropFilesTitle: "Drop files to upload",
1294
1417
  dropFilesHint: "They will be attached to your next message.",
@@ -1336,6 +1459,27 @@ var en_US_default = {
1336
1459
  label: "Context window",
1337
1460
  full: "{{usedPercent}}% used ({{remainingPercent}}% left)",
1338
1461
  tokensUsed: "{{used}} / {{max}} tokens used"
1462
+ },
1463
+ goal: {
1464
+ label: "Goal",
1465
+ unavailable: "Goal controls are not available for this client.",
1466
+ startThreadRequired: "Start a conversation before changing the goal.",
1467
+ elapsed: "{{elapsed}} elapsed",
1468
+ edit: "Edit goal",
1469
+ pause: "Pause goal",
1470
+ resume: "Resume goal",
1471
+ clear: "Clear goal",
1472
+ hide: "Hide goal",
1473
+ expandObjective: "Show full goal",
1474
+ collapseObjective: "Hide full goal",
1475
+ status: {
1476
+ active: "active",
1477
+ paused: "paused",
1478
+ blocked: "blocked",
1479
+ usage_limited: "usage limited",
1480
+ budget_limited: "budget limited",
1481
+ complete: "complete"
1482
+ }
1339
1483
  }
1340
1484
  },
1341
1485
  history: {
@@ -1567,6 +1711,22 @@ var en_US_default = {
1567
1711
  }
1568
1712
  }
1569
1713
  },
1714
+ middlewareEvent: {
1715
+ title: {
1716
+ default: "Middleware",
1717
+ ModelFallbackMiddleware: "Model fallback",
1718
+ ModelRetryMiddleware: "Model retry"
1719
+ },
1720
+ phase: {
1721
+ fallback_started: "Trying fallback model {{attempt}}/{{total}}",
1722
+ fallback_succeeded: "Fallback model succeeded {{attempt}}/{{total}}",
1723
+ fallback_failed: "Fallback model failed {{attempt}}/{{total}}",
1724
+ retry_scheduled: "Scheduling model retry {{attempt}}/{{total}}",
1725
+ retry_started: "Retrying model call {{attempt}}/{{total}}",
1726
+ retry_succeeded: "Model retry succeeded {{attempt}}/{{total}}",
1727
+ retry_failed: "Model retry failed {{attempt}}/{{total}}"
1728
+ }
1729
+ },
1570
1730
  toolGroup: {
1571
1731
  status: {
1572
1732
  running: "Processing",
@@ -1646,6 +1806,8 @@ var zh_CN_default = {
1646
1806
  referencedContentOnly: "\u5DF2\u5F15\u7528\u5185\u5BB9",
1647
1807
  youLabel: "\u4F60",
1648
1808
  scrollToBottom: "\u56DE\u5230\u5E95\u90E8",
1809
+ loadMoreMessages: "\u52A0\u8F7D\u66F4\u591A",
1810
+ loadingMoreMessages: "\u6B63\u5728\u52A0\u8F7D...",
1649
1811
  retryUpload: "\u91CD\u65B0\u4E0A\u4F20",
1650
1812
  dropFilesTitle: "\u677E\u624B\u4E0A\u4F20\u6587\u4EF6",
1651
1813
  dropFilesHint: "\u6587\u4EF6\u4F1A\u9644\u52A0\u5230\u4F60\u7684\u4E0B\u4E00\u6761\u6D88\u606F\u3002",
@@ -1693,6 +1855,27 @@ var zh_CN_default = {
1693
1855
  label: "\u4E0A\u4E0B\u6587\u7A97\u53E3",
1694
1856
  full: "\u5DF2\u4F7F\u7528 {{usedPercent}}%\uFF08\u5269\u4F59 {{remainingPercent}}%\uFF09",
1695
1857
  tokensUsed: "\u5DF2\u4F7F\u7528 {{used}} / {{max}} tokens"
1858
+ },
1859
+ goal: {
1860
+ label: "\u76EE\u6807",
1861
+ unavailable: "\u5F53\u524D\u5BA2\u6237\u7AEF\u4E0D\u652F\u6301\u76EE\u6807\u63A7\u5236\u3002",
1862
+ startThreadRequired: "\u8BF7\u5148\u5F00\u59CB\u4E00\u4E2A\u4F1A\u8BDD\u518D\u4FEE\u6539\u76EE\u6807\u3002",
1863
+ elapsed: "\u5DF2\u8FD0\u884C {{elapsed}}",
1864
+ edit: "\u7F16\u8F91\u76EE\u6807",
1865
+ pause: "\u6682\u505C\u76EE\u6807",
1866
+ resume: "\u6062\u590D\u76EE\u6807",
1867
+ clear: "\u6E05\u9664\u76EE\u6807",
1868
+ hide: "\u9690\u85CF\u76EE\u6807",
1869
+ expandObjective: "\u663E\u793A\u5B8C\u6574\u76EE\u6807",
1870
+ collapseObjective: "\u9690\u85CF\u5B8C\u6574\u76EE\u6807",
1871
+ status: {
1872
+ active: "\u8FD0\u884C\u4E2D",
1873
+ paused: "\u5DF2\u6682\u505C",
1874
+ blocked: "\u5DF2\u963B\u585E",
1875
+ usage_limited: "\u7528\u91CF\u53D7\u9650",
1876
+ budget_limited: "\u9884\u7B97\u8017\u5C3D",
1877
+ complete: "\u5DF2\u5B8C\u6210"
1878
+ }
1696
1879
  }
1697
1880
  },
1698
1881
  history: {
@@ -1924,6 +2107,22 @@ var zh_CN_default = {
1924
2107
  }
1925
2108
  }
1926
2109
  },
2110
+ middlewareEvent: {
2111
+ title: {
2112
+ default: "\u4E2D\u95F4\u4EF6",
2113
+ ModelFallbackMiddleware: "\u6A21\u578B\u56DE\u9000",
2114
+ ModelRetryMiddleware: "\u6A21\u578B\u91CD\u8BD5"
2115
+ },
2116
+ phase: {
2117
+ fallback_started: "\u6B63\u5728\u5C1D\u8BD5\u5907\u7528\u6A21\u578B {{attempt}}/{{total}}",
2118
+ fallback_succeeded: "\u5907\u7528\u6A21\u578B\u8C03\u7528\u6210\u529F {{attempt}}/{{total}}",
2119
+ fallback_failed: "\u5907\u7528\u6A21\u578B\u8C03\u7528\u5931\u8D25 {{attempt}}/{{total}}",
2120
+ retry_scheduled: "\u51C6\u5907\u91CD\u8BD5\u6A21\u578B\u8C03\u7528 {{attempt}}/{{total}}",
2121
+ retry_started: "\u6B63\u5728\u91CD\u8BD5\u6A21\u578B\u8C03\u7528 {{attempt}}/{{total}}",
2122
+ retry_succeeded: "\u6A21\u578B\u91CD\u8BD5\u6210\u529F {{attempt}}/{{total}}",
2123
+ retry_failed: "\u6A21\u578B\u91CD\u8BD5\u5931\u8D25 {{attempt}}/{{total}}"
2124
+ }
2125
+ },
1927
2126
  toolGroup: {
1928
2127
  status: {
1929
2128
  running: "\u6B63\u5728\u5904\u7406",
@@ -2965,6 +3164,9 @@ function ComposerMenu({
2965
3164
  selectedTool,
2966
3165
  planModeEnabled = false,
2967
3166
  onPlanModeChange,
3167
+ goalCommandAvailable = false,
3168
+ goalPanelOpen = false,
3169
+ onGoalPanelOpenChange,
2968
3170
  runtimeCapabilities,
2969
3171
  selectedRuntimeCapabilities,
2970
3172
  onRuntimeCapabilityToggle,
@@ -2999,6 +3201,9 @@ function ComposerMenu({
2999
3201
  const handlePlanModeToggle = () => {
3000
3202
  onPlanModeChange?.(!planModeEnabled);
3001
3203
  };
3204
+ const handleGoalCommandClick = () => {
3205
+ onGoalPanelOpenChange?.(!goalPanelOpen);
3206
+ };
3002
3207
  const handleOpenChange = (nextOpen) => {
3003
3208
  if (nextOpen) {
3004
3209
  const boundary = triggerRef.current?.closest("[data-chatkit-root]") ?? void 0;
@@ -3296,6 +3501,45 @@ function ComposerMenu({
3296
3501
  ]
3297
3502
  }
3298
3503
  ),
3504
+ goalCommandAvailable && /* @__PURE__ */ jsxs4(
3505
+ DropdownMenuItem,
3506
+ {
3507
+ role: "switch",
3508
+ "aria-checked": goalPanelOpen,
3509
+ onSelect: (event) => {
3510
+ event.preventDefault();
3511
+ handleGoalCommandClick();
3512
+ },
3513
+ className: cn(
3514
+ "gap-3 px-3 py-2",
3515
+ menuItemRoundedClass,
3516
+ goalPanelOpen && "bg-muted"
3517
+ ),
3518
+ children: [
3519
+ /* @__PURE__ */ jsx11("span", { className: "flex h-6 w-6 items-center justify-center text-muted-foreground", children: /* @__PURE__ */ jsx11(Target, { size: 16 }) }),
3520
+ /* @__PURE__ */ jsx11("span", { className: "min-w-0 flex-1 text-left", children: t("chat.goal.label") }),
3521
+ /* @__PURE__ */ jsx11(
3522
+ "span",
3523
+ {
3524
+ className: cn(
3525
+ "relative inline-flex h-6 w-10 shrink-0 items-center rounded-full transition-colors",
3526
+ goalPanelOpen ? "bg-primary" : "bg-muted-foreground/20"
3527
+ ),
3528
+ "aria-hidden": "true",
3529
+ children: /* @__PURE__ */ jsx11(
3530
+ "span",
3531
+ {
3532
+ className: cn(
3533
+ "inline-block h-5 w-5 rounded-full bg-background shadow-sm transition-transform",
3534
+ goalPanelOpen ? "translate-x-[18px]" : "translate-x-0.5"
3535
+ )
3536
+ }
3537
+ )
3538
+ }
3539
+ )
3540
+ ]
3541
+ }
3542
+ ),
3299
3543
  hasRuntimeCapabilities && /* @__PURE__ */ jsxs4(Fragment, { children: [
3300
3544
  /* @__PURE__ */ jsx11(DropdownMenuSeparator, {}),
3301
3545
  skills.length > 0 && /* @__PURE__ */ jsxs4(
@@ -3400,6 +3644,40 @@ function ComposerMenu({
3400
3644
  /* @__PURE__ */ jsx11("span", { children: t("composer.planModeActive") })
3401
3645
  ]
3402
3646
  }
3647
+ ),
3648
+ goalCommandAvailable && goalPanelOpen && /* @__PURE__ */ jsxs4(
3649
+ "button",
3650
+ {
3651
+ type: "button",
3652
+ "aria-label": t("chat.goal.hide"),
3653
+ disabled,
3654
+ onClick: () => onGoalPanelOpenChange?.(false),
3655
+ className: cn(
3656
+ "group inline-flex h-8 shrink-0 items-center gap-1.5 border border-primary/30 bg-primary/10 px-2 text-xs font-medium text-primary transition-all duration-200 hover:bg-primary/15",
3657
+ roundedClass
3658
+ ),
3659
+ children: [
3660
+ /* @__PURE__ */ jsxs4("span", { className: "relative inline-flex h-4 w-4 items-center justify-center", children: [
3661
+ /* @__PURE__ */ jsx11(
3662
+ Target,
3663
+ {
3664
+ "data-slot": "goal-indicator-icon",
3665
+ size: 14,
3666
+ className: "absolute transition-all duration-150 group-hover:scale-75 group-hover:opacity-0"
3667
+ }
3668
+ ),
3669
+ /* @__PURE__ */ jsx11(
3670
+ X,
3671
+ {
3672
+ "data-slot": "goal-remove-icon",
3673
+ size: 14,
3674
+ className: "absolute scale-75 opacity-0 transition-all duration-150 group-hover:scale-100 group-hover:opacity-100"
3675
+ }
3676
+ )
3677
+ ] }),
3678
+ /* @__PURE__ */ jsx11("span", { children: t("chat.goal.label") })
3679
+ ]
3680
+ }
3403
3681
  )
3404
3682
  ] });
3405
3683
  }
@@ -6766,6 +7044,9 @@ function parseSlashCommandInvocation(value) {
6766
7044
  };
6767
7045
  }
6768
7046
  function shouldSubmitRawSlashInvocation(command) {
7047
+ if (command.name === "goal" && command.source === "runtime") {
7048
+ return false;
7049
+ }
6769
7050
  return command.action.type === "insert_invocation";
6770
7051
  }
6771
7052
  function resolvePromptWorkflowText(value, language) {
@@ -6803,6 +7084,14 @@ function createSlashCommandExecutionEffect(command, args, language) {
6803
7084
  ...command.kind === "prompt_workflow" ? { kind: command.kind } : {},
6804
7085
  ...workflow ? { workflow } : {}
6805
7086
  };
7087
+ if (command.name === "goal" && command.source === "runtime") {
7088
+ return {
7089
+ type: "goal",
7090
+ args: args.trim(),
7091
+ commandSource,
7092
+ runtimeCapabilities: getActionRuntimeCapabilities(action) ?? void 0
7093
+ };
7094
+ }
6806
7095
  if (command.source === "builtin" && action.type === "client_action") {
6807
7096
  if (command.name === "plan") {
6808
7097
  if (args.trim()) {
@@ -7164,7 +7453,9 @@ function useSlashCommands({
7164
7453
  setComposerText,
7165
7454
  focusComposerAt,
7166
7455
  setPlanModeEnabled,
7456
+ setGoalPanelOpen,
7167
7457
  onPetCommand,
7458
+ onGoalCommand,
7168
7459
  addRunRuntimeCapabilities,
7169
7460
  setRunRuntimeCapabilities,
7170
7461
  insertComposerCapabilityToken,
@@ -7356,6 +7647,17 @@ function useSlashCommands({
7356
7647
  submitPrompt(effect);
7357
7648
  return true;
7358
7649
  }
7650
+ if (effect.type === "goal") {
7651
+ void onGoalCommand?.({
7652
+ args: effect.args,
7653
+ commandSource: effect.commandSource,
7654
+ runtimeCapabilities: effect.runtimeCapabilities
7655
+ });
7656
+ setComposerText("", 0);
7657
+ setPalette(null);
7658
+ focusComposerAt(0);
7659
+ return true;
7660
+ }
7359
7661
  if (effect.type === "client_action") {
7360
7662
  if (parentMessenger) {
7361
7663
  void parentMessenger.sendCommand("onWidgetAction", {
@@ -7384,6 +7686,7 @@ function useSlashCommands({
7384
7686
  i18n2.language,
7385
7687
  parentMessenger,
7386
7688
  onPetCommand,
7689
+ onGoalCommand,
7387
7690
  selectCapabilityById,
7388
7691
  setComposerText,
7389
7692
  setPalette,
@@ -7409,12 +7712,23 @@ function useSlashCommands({
7409
7712
  toggleCapabilityGroup(option.capabilityType);
7410
7713
  return;
7411
7714
  }
7715
+ if (option.command.name === "goal" && option.command.source === "runtime") {
7716
+ setGoalPanelOpen((open) => !open);
7717
+ setComposerText("", 0);
7718
+ setPalette(null);
7719
+ focusComposerAt(0);
7720
+ return;
7721
+ }
7412
7722
  executeSlashCommand(option.command, "");
7413
7723
  },
7414
7724
  [
7415
7725
  executeSlashCommand,
7726
+ focusComposerAt,
7416
7727
  insertComposerCapabilityToken,
7417
7728
  palette,
7729
+ setGoalPanelOpen,
7730
+ setComposerText,
7731
+ setPalette,
7418
7732
  toggleCapabilityGroup
7419
7733
  ]
7420
7734
  );
@@ -7579,6 +7893,9 @@ function findFallbackRunByAgentKey(runs, agentKey, rootExecutionId) {
7579
7893
  }
7580
7894
  function getEntryRunTarget(entry, runs, rootExecutionId) {
7581
7895
  const item = entry.item;
7896
+ if (typeof item !== "string" && isAgentEventContent(item) && item.event === "middleware_event") {
7897
+ return null;
7898
+ }
7582
7899
  const executionId = readContentExecutionId(item);
7583
7900
  const parentExecutionId = readContentParentExecutionId(item);
7584
7901
  const agentKey = readContentAgentKey(item);
@@ -7653,7 +7970,9 @@ function refreshAgentNodeOrder(node) {
7653
7970
  }
7654
7971
  function buildAssistantRenderTree(message) {
7655
7972
  const rootExecutionId = message.executionId;
7656
- const runs = message.agentRuns ?? [];
7973
+ const runs = (message.agentRuns ?? []).filter(
7974
+ (run) => !isMiddlewareAgentRunInfo(run)
7975
+ );
7657
7976
  const entries = normalizeAssistantEntries(message);
7658
7977
  const nodes = /* @__PURE__ */ new Map();
7659
7978
  const rootEntries = [];
@@ -8947,7 +9266,7 @@ import {
8947
9266
  Wrench,
8948
9267
  XCircle
8949
9268
  } from "lucide-react";
8950
- import { jsx as jsx33, jsxs as jsxs21 } from "react/jsx-runtime";
9269
+ import { Fragment as Fragment6, jsx as jsx33, jsxs as jsxs21 } from "react/jsx-runtime";
8951
9270
  function safeJson2(value) {
8952
9271
  try {
8953
9272
  return JSON.stringify(value, null, 2);
@@ -8958,6 +9277,87 @@ function safeJson2(value) {
8958
9277
  function formatDisplayValue2(value) {
8959
9278
  return typeof value === "string" ? value : safeJson2(value);
8960
9279
  }
9280
+ function getAgentEventData(content) {
9281
+ return content.data && typeof content.data === "object" ? content.data : {};
9282
+ }
9283
+ function readTrimmedString(value) {
9284
+ if (typeof value !== "string") return null;
9285
+ const trimmed = value.trim();
9286
+ return trimmed ? trimmed : null;
9287
+ }
9288
+ function readDisplayToken(value) {
9289
+ if (typeof value === "number" && Number.isFinite(value)) {
9290
+ return String(value);
9291
+ }
9292
+ return readTrimmedString(value);
9293
+ }
9294
+ function getMiddlewareEventDetailData(data) {
9295
+ return data.data && typeof data.data === "object" && !Array.isArray(data.data) ? data.data : {};
9296
+ }
9297
+ function isMiddlewareEventContent(content) {
9298
+ return content.event === "middleware_event";
9299
+ }
9300
+ function getMiddlewareEventIcon(status) {
9301
+ const normalized = normalizeRunStatus(status);
9302
+ if (normalized === "running") {
9303
+ return { icon: Loader24, spin: true };
9304
+ }
9305
+ if (isFailedRunStatus(status)) {
9306
+ return { icon: XCircle, spin: false };
9307
+ }
9308
+ return { icon: CheckCircle22, spin: false };
9309
+ }
9310
+ function MiddlewareEventRow({ content }) {
9311
+ const { t } = useChatkitTranslation();
9312
+ const eventData = getAgentEventData(content);
9313
+ const detailData = getMiddlewareEventDetailData(eventData);
9314
+ const middlewareName = readTrimmedString(eventData.middlewareName);
9315
+ const phase = readTrimmedString(eventData.phase);
9316
+ const fallbackTitle = readTrimmedString(content.title) || middlewareName || t("message.middlewareEvent.title.default");
9317
+ const label = middlewareName ? t(`message.middlewareEvent.title.${middlewareName}`, {
9318
+ defaultValue: fallbackTitle
9319
+ }) : fallbackTitle;
9320
+ const fallbackMessage = readTrimmedString(content.message) || phase || null;
9321
+ const attempt = readDisplayToken(detailData.attempt) ?? readDisplayToken(eventData.attempt);
9322
+ const total2 = readDisplayToken(detailData.totalAttempts) ?? readDisplayToken(detailData.total) ?? readDisplayToken(eventData.totalAttempts) ?? readDisplayToken(eventData.total);
9323
+ const detail = phase && attempt && total2 ? t(`message.middlewareEvent.phase.${phase}`, {
9324
+ attempt,
9325
+ total: total2,
9326
+ defaultValue: fallbackMessage ?? phase
9327
+ }) : fallbackMessage;
9328
+ const isError = content.error !== void 0 || isFailedRunStatus(content.status);
9329
+ const isRunning = isRunningRunStatus(content.status);
9330
+ const statusIcon = getMiddlewareEventIcon(content.status);
9331
+ const StatusIcon = statusIcon.icon;
9332
+ return /* @__PURE__ */ jsxs21(
9333
+ "div",
9334
+ {
9335
+ "data-testid": "middleware-event-row",
9336
+ className: cn(
9337
+ "my-1 inline-flex max-w-full items-center gap-1.5 rounded-full border px-2 py-1 text-[11px] leading-4",
9338
+ isError ? "border-destructive/20 bg-destructive/5 text-destructive" : isRunning ? "border-border/60 bg-muted/20 text-muted-foreground" : "border-emerald-500/20 bg-emerald-500/5 text-muted-foreground"
9339
+ ),
9340
+ children: [
9341
+ /* @__PURE__ */ jsx33(
9342
+ StatusIcon,
9343
+ {
9344
+ className: cn(
9345
+ "h-3.5 w-3.5 shrink-0",
9346
+ isRunning && "text-blue-700",
9347
+ !isRunning && !isError && "text-emerald-600",
9348
+ statusIcon.spin && "animate-spin"
9349
+ )
9350
+ }
9351
+ ),
9352
+ /* @__PURE__ */ jsx33("span", { className: "min-w-0 truncate font-medium", children: label }),
9353
+ detail ? /* @__PURE__ */ jsxs21(Fragment6, { children: [
9354
+ /* @__PURE__ */ jsx33("span", { className: "text-muted-foreground/50", children: "\xB7" }),
9355
+ /* @__PURE__ */ jsx33("span", { className: "min-w-0 truncate", children: detail })
9356
+ ] }) : null
9357
+ ]
9358
+ }
9359
+ );
9360
+ }
8961
9361
  function formatStepDuration(durationMs) {
8962
9362
  if (durationMs < 1e3) {
8963
9363
  return `${durationMs}ms`;
@@ -9053,6 +9453,9 @@ function getAgentNodeUnits(node) {
9053
9453
  ].sort((a, b) => a.order - b.order);
9054
9454
  }
9055
9455
  function AgentEventRow({ content }) {
9456
+ if (isMiddlewareEventContent(content)) {
9457
+ return /* @__PURE__ */ jsx33(MiddlewareEventRow, { content });
9458
+ }
9056
9459
  const label = content.title?.trim() || content.message?.trim() || content.event?.trim() || "Event";
9057
9460
  const detail = content.title?.trim() && content.message?.trim() ? content.message.trim() : null;
9058
9461
  const isError = content.error !== void 0 || isFailedRunStatus(content.status);
@@ -9929,7 +10332,7 @@ function SandboxShellToolCallCard({ data }) {
9929
10332
  "div",
9930
10333
  {
9931
10334
  className: cn(
9932
- "group/shell-copy relative min-h-0 flex-1",
10335
+ "group/shell-copy relative min-h-0 flex-1 overflow-auto",
9933
10336
  SANDBOX_SHELL_SECTION_GAP_CLASS
9934
10337
  ),
9935
10338
  children: [
@@ -9937,7 +10340,7 @@ function SandboxShellToolCallCard({ data }) {
9937
10340
  "pre",
9938
10341
  {
9939
10342
  className: cn(
9940
- "min-h-0 overflow-auto whitespace-pre pr-8 font-mono text-muted-foreground/85 in-data-[density=compact]:pr-6 in-data-[density=spacious]:pr-10",
10343
+ "min-h-0 whitespace-pre pr-8 font-mono text-muted-foreground/85 in-data-[density=compact]:pr-6 in-data-[density=spacious]:pr-10",
9941
10344
  SANDBOX_SHELL_TEXT_CLASS
9942
10345
  ),
9943
10346
  "data-slot": "sandbox-shell-output",
@@ -13271,6 +13674,127 @@ async function persistConversationRuntimeCapabilities({
13271
13674
  };
13272
13675
  }
13273
13676
 
13677
+ // src/lib/xpert-thread-goal-adapter.ts
13678
+ var SDK_GOAL_METHOD_ERROR = "Current Xpert SDK client does not expose conversation goal methods. Provide options.goal to use a custom goal adapter.";
13679
+ function requireBoundGoalMethod(owner, method) {
13680
+ if (!owner || !method) {
13681
+ throw new Error(SDK_GOAL_METHOD_ERROR);
13682
+ }
13683
+ return method.bind(owner);
13684
+ }
13685
+ function supportsXpertThreadGoalAdapter(client) {
13686
+ const conversations = client.conversations;
13687
+ return Boolean(
13688
+ conversations?.search && conversations.create && conversations.getGoal && conversations.setGoal && conversations.updateGoal && conversations.clearGoal
13689
+ );
13690
+ }
13691
+ async function findConversation(client, threadId) {
13692
+ return findConversationByThreadIdWithRetry(
13693
+ client,
13694
+ threadId
13695
+ );
13696
+ }
13697
+ async function requireConversation(client, threadId) {
13698
+ const conversation = await findConversation(client, threadId);
13699
+ if (!conversation?.id) {
13700
+ throw new Error("Conversation not found for this thread.");
13701
+ }
13702
+ return conversation;
13703
+ }
13704
+ function createXpertThreadGoalAdapter(client) {
13705
+ return {
13706
+ async getGoal({ threadId, signal }) {
13707
+ const conversation = await findConversation(client, threadId);
13708
+ if (!conversation?.id) {
13709
+ return null;
13710
+ }
13711
+ const getGoal = requireBoundGoalMethod(
13712
+ client.conversations,
13713
+ client.conversations.getGoal
13714
+ );
13715
+ return getGoal(conversation.id, { signal });
13716
+ },
13717
+ async setGoal({
13718
+ threadId,
13719
+ assistantId,
13720
+ objective,
13721
+ runtimeCapabilities,
13722
+ signal
13723
+ }) {
13724
+ const normalizedObjective = objective.trim();
13725
+ if (!normalizedObjective) {
13726
+ throw new Error("Goal objective is required.");
13727
+ }
13728
+ const setGoal = requireBoundGoalMethod(
13729
+ client.conversations,
13730
+ client.conversations.setGoal
13731
+ );
13732
+ const normalizedThreadId = threadId?.trim() || null;
13733
+ if (normalizedThreadId) {
13734
+ const conversation2 = await requireConversation(
13735
+ client,
13736
+ normalizedThreadId
13737
+ );
13738
+ const goal2 = await setGoal(
13739
+ conversation2.id,
13740
+ { objective: normalizedObjective },
13741
+ { signal }
13742
+ );
13743
+ return { threadId: normalizedThreadId, goal: goal2 };
13744
+ }
13745
+ const createConversation = requireBoundGoalMethod(
13746
+ client.conversations,
13747
+ client.conversations?.create
13748
+ );
13749
+ const conversation = await createConversation({
13750
+ xpertId: assistantId,
13751
+ ...runtimeCapabilities ? {
13752
+ options: {
13753
+ runtimeCapabilities
13754
+ }
13755
+ } : {}
13756
+ });
13757
+ const conversationId = conversation.id?.trim();
13758
+ if (!conversationId) {
13759
+ throw new Error("Created conversation is missing id.");
13760
+ }
13761
+ const createdThreadId = conversation.threadId?.trim();
13762
+ if (!createdThreadId) {
13763
+ throw new Error("Created conversation is missing threadId.");
13764
+ }
13765
+ const goal = await setGoal(
13766
+ conversationId,
13767
+ { objective: normalizedObjective },
13768
+ { signal }
13769
+ );
13770
+ return { threadId: createdThreadId, goal };
13771
+ },
13772
+ async updateGoal({ threadId, objective, status, signal }) {
13773
+ const conversation = await requireConversation(client, threadId);
13774
+ const updateGoal = requireBoundGoalMethod(
13775
+ client.conversations,
13776
+ client.conversations.updateGoal
13777
+ );
13778
+ return updateGoal(
13779
+ conversation.id,
13780
+ {
13781
+ ...objective !== void 0 ? { objective } : {},
13782
+ ...status ? { status } : {}
13783
+ },
13784
+ { signal }
13785
+ );
13786
+ },
13787
+ async clearGoal({ threadId, signal }) {
13788
+ const conversation = await requireConversation(client, threadId);
13789
+ const clearGoal = requireBoundGoalMethod(
13790
+ client.conversations,
13791
+ client.conversations.clearGoal
13792
+ );
13793
+ return clearGoal(conversation.id, { signal });
13794
+ }
13795
+ };
13796
+ }
13797
+
13274
13798
  // src/lib/composer-parts.ts
13275
13799
  var COMPOSER_CAPABILITY_TOKEN_LENGTH = 1;
13276
13800
  var COMPOSER_CAPABILITY_TOKEN = "\uFFFC";
@@ -13589,10 +14113,25 @@ function findDomPointForComposerOffset(root, offset) {
13589
14113
  }
13590
14114
 
13591
14115
  // src/components/chat.tsx
13592
- import { Fragment as Fragment8, jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
14116
+ import { Fragment as Fragment9, jsx as jsx53, jsxs as jsxs36 } from "react/jsx-runtime";
13593
14117
  var defaultApiUrl2 = import.meta.env.VITE_XPERTAI_API_URL;
13594
14118
  var COMPOSER_INPUT_MAX_HEIGHT = 128;
13595
14119
  var LONG_TEXT_REFERENCE_THRESHOLD = 5e3;
14120
+ var GOAL_RUN_INPUT = "Continue working toward the active goal.";
14121
+ function hasRuntimeGoalCommand(runtimeCapabilities) {
14122
+ return runtimeCapabilities?.commands?.some((command) => command.name === "goal") ?? false;
14123
+ }
14124
+ function isGoalAdapter(value) {
14125
+ return Boolean(value) && typeof value === "object" && typeof value.getGoal === "function" && typeof value.setGoal === "function" && typeof value.updateGoal === "function" && typeof value.clearGoal === "function";
14126
+ }
14127
+ function formatGoalElapsed(seconds) {
14128
+ if (seconds < 60) {
14129
+ return `${seconds}s`;
14130
+ }
14131
+ const minutes = Math.floor(seconds / 60);
14132
+ const remainingSeconds = seconds % 60;
14133
+ return remainingSeconds ? `${minutes}m ${remainingSeconds}s` : `${minutes}m`;
14134
+ }
13596
14135
  function getSlashPaletteEmptyLabelKey(palette, runtimeCapabilitiesReady) {
13597
14136
  if (!palette.capabilityTypes || palette.capabilityTypes.length !== 1) {
13598
14137
  return "composer.capabilities.emptySearch";
@@ -13802,6 +14341,12 @@ function Chat({
13802
14341
  const [historyError, setHistoryError] = React48.useState(null);
13803
14342
  const [assistantName, setAssistantName] = React48.useState(null);
13804
14343
  const [assistantAvatar, setAssistantAvatar] = React48.useState(null);
14344
+ const [threadGoal, setThreadGoal] = React48.useState(null);
14345
+ const [goalError, setGoalError] = React48.useState(null);
14346
+ const [isGoalLoading, setIsGoalLoading] = React48.useState(false);
14347
+ const [isGoalPanelOpen, setIsGoalPanelOpen] = React48.useState(false);
14348
+ const [isGoalObjectiveExpanded, setIsGoalObjectiveExpanded] = React48.useState(false);
14349
+ const [goalElapsedStartedAt, setGoalElapsedStartedAt] = React48.useState(null);
13805
14350
  const LOADING_DOTS_MIN_DURATION = 800;
13806
14351
  const STREAMING_STATUS_REFRESH_MS = 250;
13807
14352
  const [showLoadingDots, setShowLoadingDots] = React48.useState(false);
@@ -13853,6 +14398,21 @@ function Chat({
13853
14398
  }, STREAMING_STATUS_REFRESH_MS);
13854
14399
  return () => window.clearInterval(timer);
13855
14400
  }, [stream.isLoading]);
14401
+ React48.useEffect(() => {
14402
+ if (threadGoal?.status === "active" && stream.isLoading) {
14403
+ setGoalElapsedStartedAt(Date.now());
14404
+ return;
14405
+ }
14406
+ setGoalElapsedStartedAt(null);
14407
+ }, [
14408
+ stream.isLoading,
14409
+ threadGoal?.elapsedSeconds,
14410
+ threadGoal?.id,
14411
+ threadGoal?.status
14412
+ ]);
14413
+ React48.useEffect(() => {
14414
+ setIsGoalObjectiveExpanded(false);
14415
+ }, [threadGoal?.id]);
13856
14416
  const [composerParts, setComposerParts] = React48.useState([]);
13857
14417
  const [renderedComposerParts, setRenderedComposerParts] = React48.useState([]);
13858
14418
  const [composerDomVersion, setComposerDomVersion] = React48.useState(0);
@@ -13900,6 +14460,7 @@ function Chat({
13900
14460
  const forceFollowRef = React48.useRef(false);
13901
14461
  const previousMessageCountRef = React48.useRef(0);
13902
14462
  const previousScrollTopRef = React48.useRef(0);
14463
+ const isPrependingHistoryMessagesRef = React48.useRef(false);
13903
14464
  const autoScrollFrameRef = React48.useRef(null);
13904
14465
  const isPointerDownRef = React48.useRef(false);
13905
14466
  const lastTouchYRef = React48.useRef(null);
@@ -13958,13 +14519,20 @@ function Chat({
13958
14519
  () => stream.messages ?? [],
13959
14520
  [stream.messages]
13960
14521
  );
14522
+ const historyMessagePagination = stream.historyMessagePagination;
14523
+ const isLoadingMoreMessages = Boolean(
14524
+ historyMessagePagination?.isLoadingMore
14525
+ );
14526
+ const canLoadMoreMessages = Boolean(historyMessagePagination?.hasMore);
13961
14527
  const draft = React48.useMemo(
13962
14528
  () => getComposerPlainText(composerParts),
13963
14529
  [composerParts]
13964
14530
  );
13965
14531
  const trimmedDraft = draft.trim();
13966
14532
  const hasReferences = references.length > 0;
13967
- const isComposerStacked = planModeEnabled || Boolean(selectedTool);
14533
+ const hasCompletedGoal = threadGoal?.status === "complete";
14534
+ const isGoalModeOpen = isGoalPanelOpen;
14535
+ const isComposerStacked = planModeEnabled || isGoalModeOpen || Boolean(selectedTool);
13968
14536
  const isComposerInputEmpty = getComposerEditingLength(composerParts) === 0;
13969
14537
  const composerInputRoundedClass = getComposerInputRoundedClass(theme.radius, {
13970
14538
  isEmpty: isComposerInputEmpty,
@@ -13985,6 +14553,18 @@ function Chat({
13985
14553
  () => getRuntimeCapabilityOptions(runtimeCapabilities),
13986
14554
  [runtimeCapabilities]
13987
14555
  );
14556
+ const goalCommandAvailable = hasRuntimeGoalCommand(runtimeCapabilities);
14557
+ const goalAdapter = React48.useMemo(
14558
+ () => {
14559
+ if (isGoalAdapter(options?.goal)) {
14560
+ return options.goal;
14561
+ }
14562
+ return supportsXpertThreadGoalAdapter(stream.client) ? createXpertThreadGoalAdapter(stream.client) : null;
14563
+ },
14564
+ [options?.goal, stream.client]
14565
+ );
14566
+ const showGoalStatus = goalCommandAvailable && !hasCompletedGoal && (Boolean(goalError) || threadGoal?.status === "active" && stream.isLoading);
14567
+ const displayedGoalElapsedSeconds = threadGoal ? (threadGoal.elapsedSeconds ?? 0) + (goalElapsedStartedAt ? Math.max(0, Math.floor((streamingNow - goalElapsedStartedAt) / 1e3)) : 0) : 0;
13988
14568
  const effectiveSessionRuntimeCapabilities = React48.useMemo(
13989
14569
  () => runtimeCapabilitiesReady && runtimeCapabilities ? mergeRuntimeCapabilitiesSelections(
13990
14570
  runtimeCapabilities,
@@ -14322,6 +14902,10 @@ function Chat({
14322
14902
  React48.useEffect(() => {
14323
14903
  const messageCountChanged = messages.length !== previousMessageCountRef.current;
14324
14904
  previousMessageCountRef.current = messages.length;
14905
+ if (isPrependingHistoryMessagesRef.current) {
14906
+ setHasUpdatesBelow(false);
14907
+ return;
14908
+ }
14325
14909
  if (!shouldAutoScrollRef.current) {
14326
14910
  if (messageCountChanged || stream.isLoading) {
14327
14911
  setHasUpdatesBelow(true);
@@ -14534,6 +15118,49 @@ function Chat({
14534
15118
  stream.client,
14535
15119
  stream.threadId
14536
15120
  ]);
15121
+ React48.useEffect(() => {
15122
+ setThreadGoal(stream.threadGoal);
15123
+ }, [stream.threadGoal]);
15124
+ React48.useEffect(() => {
15125
+ const threadId = stream.threadId?.trim();
15126
+ if (!threadId || !goalCommandAvailable) {
15127
+ setThreadGoal(null);
15128
+ setGoalError(null);
15129
+ setIsGoalLoading(false);
15130
+ setIsGoalPanelOpen(false);
15131
+ return;
15132
+ }
15133
+ if (!goalAdapter) {
15134
+ setThreadGoal(null);
15135
+ setGoalError(null);
15136
+ setIsGoalLoading(false);
15137
+ setIsGoalPanelOpen(false);
15138
+ return;
15139
+ }
15140
+ const controller = new AbortController();
15141
+ setIsGoalLoading(true);
15142
+ setGoalError(null);
15143
+ void loadThreadGoal({
15144
+ goal: goalAdapter,
15145
+ threadId,
15146
+ signal: controller.signal
15147
+ }).then((goal) => {
15148
+ if (!controller.signal.aborted) {
15149
+ setThreadGoal(goal);
15150
+ }
15151
+ }).catch((error) => {
15152
+ if (controller.signal.aborted) {
15153
+ return;
15154
+ }
15155
+ setGoalError(error instanceof Error ? error.message : String(error));
15156
+ setThreadGoal(null);
15157
+ }).finally(() => {
15158
+ if (!controller.signal.aborted) {
15159
+ setIsGoalLoading(false);
15160
+ }
15161
+ });
15162
+ return () => controller.abort();
15163
+ }, [goalAdapter, goalCommandAvailable, stream.threadId]);
14537
15164
  const uploadedFiles = attachmentState.uploadedFiles;
14538
15165
  const handleSessionRuntimeCapabilityToggle = React48.useCallback(
14539
15166
  (type, id, selected) => {
@@ -14745,6 +15372,124 @@ function Chat({
14745
15372
  t
14746
15373
  ]
14747
15374
  );
15375
+ const handleGoalCommand = React48.useCallback(
15376
+ async ({
15377
+ args,
15378
+ commandSource,
15379
+ runtimeCapabilities: commandRuntimeCapabilities,
15380
+ visibleInput
15381
+ }) => {
15382
+ const command = parseGoalCommand(args);
15383
+ const threadId = stream.threadId?.trim();
15384
+ setGoalError(null);
15385
+ if (!threadId) {
15386
+ if (command.type === "show") {
15387
+ setThreadGoal(null);
15388
+ setIsGoalLoading(false);
15389
+ return;
15390
+ }
15391
+ if (command.type !== "set" && command.type !== "edit") {
15392
+ setGoalError(t("chat.goal.startThreadRequired"));
15393
+ return;
15394
+ }
15395
+ }
15396
+ if (!goalAdapter) {
15397
+ setGoalError(t("chat.goal.unavailable"));
15398
+ return;
15399
+ }
15400
+ setIsGoalLoading(true);
15401
+ try {
15402
+ const result = await executeThreadGoalCommand({
15403
+ goal: goalAdapter,
15404
+ threadId,
15405
+ assistantId: stream.assistantId,
15406
+ command,
15407
+ runtimeCapabilities: commandRuntimeCapabilities
15408
+ });
15409
+ if (!threadId && result.threadId) {
15410
+ stream.reset(result.threadId, []);
15411
+ void refreshThreads();
15412
+ }
15413
+ const startsGoalRun = result.goal?.status === "active" && (command.type === "set" || command.type === "edit" || command.type === "resume");
15414
+ setThreadGoal(command.type === "clear" ? null : result.goal);
15415
+ if (command.type === "clear" || startsGoalRun) {
15416
+ setIsGoalPanelOpen(false);
15417
+ }
15418
+ if (startsGoalRun) {
15419
+ const goalRunThreadId = result.threadId ?? threadId;
15420
+ const runtimeCapabilitiesForGoalRun = runtimeCapabilities && runtimeCapabilitiesReady ? createRuntimeCapabilitiesForSubmit({
15421
+ capabilities: runtimeCapabilities,
15422
+ available: effectiveSessionRuntimeCapabilities,
15423
+ recommended: commandRuntimeCapabilities
15424
+ }) : commandRuntimeCapabilities ?? null;
15425
+ const inputPayload = {
15426
+ input: GOAL_RUN_INPUT,
15427
+ commandSource,
15428
+ goalRun: true,
15429
+ ...runtimeCapabilitiesForGoalRun ? { runtimeCapabilities: runtimeCapabilitiesForGoalRun } : {}
15430
+ };
15431
+ const requestOptions = buildInjectedRequestOptions({
15432
+ defaults: options?.request,
15433
+ humanInput: inputPayload
15434
+ });
15435
+ const visibleGoalMessage = visibleInput ? {
15436
+ id: createMessageId(),
15437
+ type: "human",
15438
+ content: visibleInput,
15439
+ submittedInput: visibleInput
15440
+ } : null;
15441
+ void stream.submit(
15442
+ {
15443
+ input: inputPayload,
15444
+ ...requestOptions.state ? { state: requestOptions.state } : {}
15445
+ },
15446
+ {
15447
+ ...goalRunThreadId && !threadId ? {
15448
+ threadId: goalRunThreadId,
15449
+ joinExistingThread: true
15450
+ } : {},
15451
+ ...requestOptions.context ? { context: requestOptions.context } : {},
15452
+ ...requestOptions.config ? { config: requestOptions.config } : {},
15453
+ ...visibleGoalMessage ? {
15454
+ preserveOptimisticMessages: true,
15455
+ optimisticValues: (prev) => {
15456
+ const prevMessages = prev?.messages ?? [];
15457
+ return {
15458
+ ...prev,
15459
+ messages: [...prevMessages, visibleGoalMessage]
15460
+ };
15461
+ }
15462
+ } : {}
15463
+ }
15464
+ ).catch((error) => {
15465
+ setGoalError(
15466
+ error instanceof Error ? error.message : String(error)
15467
+ );
15468
+ });
15469
+ }
15470
+ } catch (error) {
15471
+ setGoalError(error instanceof Error ? error.message : String(error));
15472
+ } finally {
15473
+ setIsGoalLoading(false);
15474
+ }
15475
+ },
15476
+ [
15477
+ effectiveSessionRuntimeCapabilities,
15478
+ goalAdapter,
15479
+ options?.request,
15480
+ refreshThreads,
15481
+ runtimeCapabilities,
15482
+ runtimeCapabilitiesReady,
15483
+ stream,
15484
+ t
15485
+ ]
15486
+ );
15487
+ const handleGoalPanelOpenChange = React48.useCallback(
15488
+ (open) => {
15489
+ setIsGoalPanelOpen(open);
15490
+ },
15491
+ []
15492
+ );
14748
15493
  const addRunRuntimeCapabilities = React48.useCallback(
14749
15494
  (selection) => {
14750
15495
  setRunRuntimeCapabilities(
@@ -14807,7 +15552,9 @@ function Chat({
14807
15552
  setComposerText,
14808
15553
  focusComposerAt,
14809
15554
  setPlanModeEnabled,
15555
+ setGoalPanelOpen: setIsGoalPanelOpen,
14810
15556
  onPetCommand: handlePetCommand,
15557
+ onGoalCommand: handleGoalCommand,
14811
15558
  addRunRuntimeCapabilities,
14812
15559
  setRunRuntimeCapabilities,
14813
15560
  insertComposerCapabilityToken,
@@ -14864,11 +15611,42 @@ function Chat({
14864
15611
  container.scrollTop += optionRect.bottom - containerRect.bottom;
14865
15612
  }
14866
15613
  }, [runtimeCapabilityPalette, slashPaletteOptions.length]);
15614
+ const submitGoalModeDraft = React48.useCallback(() => {
15615
+ const objective = getComposerPlainText(composerPartsRef.current).trim();
15616
+ if (!isGoalModeOpen || !goalCommandAvailable || !objective) {
15617
+ return false;
15618
+ }
15619
+ setComposerText("", 0);
15620
+ setRuntimeCapabilityPalette(null);
15621
+ focusComposerAt(0);
15622
+ void handleGoalCommand({
15623
+ args: objective,
15624
+ commandSource: {
15625
+ type: "slash_command",
15626
+ name: "goal",
15627
+ source: "runtime",
15628
+ executionType: "insert_invocation"
15629
+ },
15630
+ runtimeCapabilities: runRuntimeCapabilities,
15631
+ visibleInput: objective
15632
+ });
15633
+ return true;
15634
+ }, [
15635
+ focusComposerAt,
15636
+ goalCommandAvailable,
15637
+ handleGoalCommand,
15638
+ isGoalModeOpen,
15639
+ runRuntimeCapabilities,
15640
+ setComposerText
15641
+ ]);
14867
15642
  const handleSubmit = (event) => {
14868
15643
  event.preventDefault();
14869
15644
  if (executeSlashCommandFromDraft()) {
14870
15645
  return;
14871
15646
  }
15647
+ if (submitGoalModeDraft()) {
15648
+ return;
15649
+ }
14872
15650
  submitDraft();
14873
15651
  };
14874
15652
  const handleEditPendingFollowUp = React48.useCallback(
@@ -15033,6 +15811,9 @@ function Chat({
15033
15811
  if (executeSlashCommandFromDraft()) {
15034
15812
  return;
15035
15813
  }
15814
+ if (submitGoalModeDraft()) {
15815
+ return;
15816
+ }
15036
15817
  submitDraft(
15037
15818
  getBusyComposerShortcutFollowUpMode(event.metaKey || event.ctrlKey)
15038
15819
  );
@@ -15041,6 +15822,9 @@ function Chat({
15041
15822
  if (executeSlashCommandFromDraft()) {
15042
15823
  return;
15043
15824
  }
15825
+ if (submitGoalModeDraft()) {
15826
+ return;
15827
+ }
15044
15828
  submitDraft();
15045
15829
  };
15046
15830
  const handleComposerPaste = React48.useCallback(
@@ -15221,6 +16005,40 @@ function Chat({
15221
16005
  },
15222
16006
  [missingConfig, missingConfigShortMessage, stream, t]
15223
16007
  );
16008
+ const handleLoadMoreMessages = React48.useCallback(async () => {
16009
+ if (!canLoadMoreMessages || isLoadingMoreMessages) {
16010
+ return;
16011
+ }
16012
+ const viewport = viewportRef.current;
16013
+ const previousScrollHeight = viewport?.scrollHeight ?? 0;
16014
+ const previousScrollTop = viewport?.scrollTop ?? 0;
16015
+ isPrependingHistoryMessagesRef.current = true;
16016
+ shouldAutoScrollRef.current = false;
16017
+ forceFollowRef.current = false;
16018
+ setHasUpdatesBelow(false);
16019
+ setHistoryError(null);
16020
+ const restoreScrollPosition = () => {
16021
+ requestAnimationFrame(() => {
16022
+ const nextViewport = viewportRef.current;
16023
+ if (nextViewport) {
16024
+ const nextScrollTop = nextViewport.scrollHeight - previousScrollHeight + previousScrollTop;
16025
+ nextViewport.scrollTop = Math.max(0, nextScrollTop);
16026
+ previousScrollTopRef.current = nextViewport.scrollTop;
16027
+ }
16028
+ isPrependingHistoryMessagesRef.current = false;
16029
+ });
16030
+ };
16031
+ try {
16032
+ await stream.loadMoreConversationMessages();
16033
+ restoreScrollPosition();
16034
+ } catch (err) {
16035
+ isPrependingHistoryMessagesRef.current = false;
16036
+ console.warn("Failed to load more thread messages", err);
16037
+ setHistoryError(
16038
+ err instanceof Error ? err.message : t("chat.errors.loadMessages")
16039
+ );
16040
+ }
16041
+ }, [canLoadMoreMessages, isLoadingMoreMessages, stream, t]);
15224
16042
  const handleNewThread = async () => {
15225
16043
  if (missingConfig || isHistoryLoading) return;
15226
16044
  setHistoryError(null);
@@ -15410,7 +16228,7 @@ function Chat({
15410
16228
  ) }) }),
15411
16229
  /* @__PURE__ */ jsx53(TooltipContent, { side: "bottom", children: t("settings.open") })
15412
16230
  ] }),
15413
- history?.enabled !== false && /* @__PURE__ */ jsxs36(Fragment8, { children: [
16231
+ history?.enabled !== false && /* @__PURE__ */ jsxs36(Fragment9, { children: [
15414
16232
  /* @__PURE__ */ jsxs36(Tooltip, { children: [
15415
16233
  /* @__PURE__ */ jsx53(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx53("span", { className: "inline-flex h-8 w-8", children: /* @__PURE__ */ jsx53(
15416
16234
  "button",
@@ -15450,13 +16268,29 @@ function Chat({
15450
16268
  historyError && /* @__PURE__ */ jsx53("div", { className: "mb-4 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900", children: historyError }),
15451
16269
  showMissingConfig && /* @__PURE__ */ jsx53("div", { className: "mb-4 rounded-lg border border-amber-200 bg-amber-50 px-3 py-2 text-sm text-amber-900", children: missingConfigDetailMessage }),
15452
16270
  isHistoryLoading && /* @__PURE__ */ jsx53("div", { className: "mb-4 rounded-lg border border-muted px-3 py-2 text-sm text-muted-foreground", children: t("chat.loadingThread") }),
15453
- messages.length === 0 ? /* @__PURE__ */ jsx53(
16271
+ messages.length === 0 && !canLoadMoreMessages ? /* @__PURE__ */ jsx53(
15454
16272
  StartScreen,
15455
16273
  {
15456
16274
  startScreen,
15457
16275
  onPromptClick: handlePromptClick
15458
16276
  }
15459
16277
  ) : /* @__PURE__ */ jsxs36("div", { className: "space-y-4", children: [
16278
+ canLoadMoreMessages && /* @__PURE__ */ jsxs36("div", { className: "flex items-center gap-3 py-1", children: [
16279
+ /* @__PURE__ */ jsx53("div", { className: "h-px min-w-8 flex-1 bg-border" }),
16280
+ /* @__PURE__ */ jsx53(
16281
+ Button,
16282
+ {
16283
+ type: "button",
16284
+ variant: "ghost",
16285
+ size: "sm",
16286
+ onClick: handleLoadMoreMessages,
16287
+ disabled: isLoadingMoreMessages,
16288
+ className: "h-7 px-2 text-xs font-medium text-muted-foreground hover:text-foreground",
16289
+ children: isLoadingMoreMessages ? t("chat.loadingMoreMessages") : t("chat.loadMoreMessages")
16290
+ }
16291
+ ),
16292
+ /* @__PURE__ */ jsx53("div", { className: "h-px min-w-8 flex-1 bg-border" })
16293
+ ] }),
15460
16294
  messages.map((message, index) => {
15461
16295
  const messageType = String(message.type);
15462
16296
  const isAssistantMessage = messageType === "assistant" || messageType === "ai";
@@ -15539,7 +16373,7 @@ function Chat({
15539
16373
  organizationId: stream.organizationId,
15540
16374
  apiUrl: stream.apiUrl
15541
16375
  }
15542
- ) : /* @__PURE__ */ jsxs36(Fragment8, { children: [
16376
+ ) : /* @__PURE__ */ jsxs36(Fragment9, { children: [
15543
16377
  message.type === "human" && humanRuntimeCapabilityOptions.length > 0 && /* @__PURE__ */ jsx53("div", { className: "mb-2 flex flex-wrap gap-1.5", children: humanRuntimeCapabilityOptions.map((option) => /* @__PURE__ */ jsxs36(
15544
16378
  "span",
15545
16379
  {
@@ -15733,6 +16567,132 @@ function Chat({
15733
16567
  `${option.type}:${option.id}`
15734
16568
  ))
15735
16569
  ] }),
16570
+ showGoalStatus && /* @__PURE__ */ jsxs36(
16571
+ "div",
16572
+ {
16573
+ className: cn(
16574
+ "mb-2 flex min-h-10 gap-2 rounded-md border border-border bg-background px-2.5 py-2 text-xs text-foreground shadow-sm",
16575
+ isGoalObjectiveExpanded ? "items-start" : "items-center"
16576
+ ),
16577
+ children: [
16578
+ /* @__PURE__ */ jsx53(
16579
+ Target2,
16580
+ {
16581
+ className: cn(
16582
+ "size-4 shrink-0 text-muted-foreground",
16583
+ isGoalObjectiveExpanded && "mt-1"
16584
+ )
16585
+ }
16586
+ ),
16587
+ /* @__PURE__ */ jsxs36("div", { className: "min-w-0 flex-1", children: [
16588
+ /* @__PURE__ */ jsxs36("div", { className: "flex min-w-0 items-center gap-2", children: [
16589
+ /* @__PURE__ */ jsx53("span", { className: "font-medium", children: t("chat.goal.label") }),
16590
+ threadGoal && /* @__PURE__ */ jsx53("span", { className: "shrink-0 rounded-md bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground", children: t(`chat.goal.status.${threadGoal.status}`) }),
16591
+ isGoalLoading && /* @__PURE__ */ jsx53(Loader28, { className: "size-3 animate-spin text-muted-foreground" })
16592
+ ] }),
16593
+ /* @__PURE__ */ jsx53(
16594
+ "div",
16595
+ {
16596
+ className: cn(
16597
+ "mt-0.5 text-muted-foreground",
16598
+ threadGoal?.objective && !goalError && isGoalObjectiveExpanded ? "whitespace-pre-wrap break-words" : "truncate"
16599
+ ),
16600
+ children: goalError || threadGoal?.objective
16601
+ }
16602
+ ),
16603
+ threadGoal && /* @__PURE__ */ jsx53("div", { className: "mt-1 flex flex-wrap gap-x-3 gap-y-1 text-[11px] text-muted-foreground", children: /* @__PURE__ */ jsx53("span", { children: t("chat.goal.elapsed", {
16604
+ elapsed: formatGoalElapsed(displayedGoalElapsedSeconds)
16605
+ }) }) })
16606
+ ] }),
16607
+ threadGoal && /* @__PURE__ */ jsxs36("div", { className: "flex shrink-0 items-center gap-1", children: [
16608
+ /* @__PURE__ */ jsxs36(Tooltip, { children: [
16609
+ /* @__PURE__ */ jsx53(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx53(
16610
+ Button,
16611
+ {
16612
+ type: "button",
16613
+ variant: "ghost",
16614
+ size: "icon-xs",
16615
+ disabled: isGoalLoading,
16616
+ onClick: () => {
16617
+ const prefix = "/goal edit ";
16618
+ setComposerText(`${prefix}${threadGoal.objective}`);
16619
+ },
16620
+ children: /* @__PURE__ */ jsx53(Pencil4, { className: "size-3" })
16621
+ }
16622
+ ) }),
16623
+ /* @__PURE__ */ jsx53(TooltipContent, { children: t("chat.goal.edit") })
16624
+ ] }),
16625
+ /* @__PURE__ */ jsxs36(Tooltip, { children: [
16626
+ /* @__PURE__ */ jsx53(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx53(
16627
+ Button,
16628
+ {
16629
+ type: "button",
16630
+ variant: "ghost",
16631
+ size: "icon-xs",
16632
+ disabled: isGoalLoading,
16633
+ onClick: () => void handleGoalCommand({
16634
+ args: threadGoal.status === "paused" ? "resume" : "pause",
16635
+ commandSource: {
16636
+ type: "slash_command",
16637
+ name: "goal",
16638
+ source: "runtime",
16639
+ executionType: "insert_invocation"
16640
+ }
16641
+ }),
16642
+ children: threadGoal.status === "paused" ? /* @__PURE__ */ jsx53(Play, { className: "size-3" }) : /* @__PURE__ */ jsx53(Pause, { className: "size-3" })
16643
+ }
16644
+ ) }),
16645
+ /* @__PURE__ */ jsx53(TooltipContent, { children: threadGoal.status === "paused" ? t("chat.goal.resume") : t("chat.goal.pause") })
16646
+ ] }),
16647
+ /* @__PURE__ */ jsxs36(Tooltip, { children: [
16648
+ /* @__PURE__ */ jsx53(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx53(
16649
+ Button,
16650
+ {
16651
+ type: "button",
16652
+ variant: "ghost",
16653
+ size: "icon-xs",
16654
+ disabled: isGoalLoading,
16655
+ onClick: () => void handleGoalCommand({
16656
+ args: "clear",
16657
+ commandSource: {
16658
+ type: "slash_command",
16659
+ name: "goal",
16660
+ source: "runtime",
16661
+ executionType: "insert_invocation"
16662
+ }
16663
+ }),
16664
+ children: /* @__PURE__ */ jsx53(Trash23, { className: "size-3" })
16665
+ }
16666
+ ) }),
16667
+ /* @__PURE__ */ jsx53(TooltipContent, { children: t("chat.goal.clear") })
16668
+ ] }),
16669
+ threadGoal.objective && !goalError && /* @__PURE__ */ jsxs36(Tooltip, { children: [
16670
+ /* @__PURE__ */ jsx53(TooltipTrigger, { asChild: true, children: /* @__PURE__ */ jsx53(
16671
+ Button,
16672
+ {
16673
+ type: "button",
16674
+ variant: "ghost",
16675
+ size: "icon-xs",
16676
+ "aria-expanded": isGoalObjectiveExpanded,
16677
+ "aria-label": isGoalObjectiveExpanded ? t("chat.goal.collapseObjective") : t("chat.goal.expandObjective"),
16678
+ onClick: () => setIsGoalObjectiveExpanded((expanded) => !expanded),
16679
+ children: /* @__PURE__ */ jsx53(
16680
+ ChevronDown5,
16681
+ {
16682
+ className: cn(
16683
+ "size-3 transition-transform",
16684
+ isGoalObjectiveExpanded && "rotate-180"
16685
+ )
16686
+ }
16687
+ )
16688
+ }
16689
+ ) }),
16690
+ /* @__PURE__ */ jsx53(TooltipContent, { children: isGoalObjectiveExpanded ? t("chat.goal.collapseObjective") : t("chat.goal.expandObjective") })
16691
+ ] })
16692
+ ] })
16693
+ ]
16694
+ }
16695
+ ),
15736
16696
  /* @__PURE__ */ jsx53(
15737
16697
  PendingRuntimeServices,
15738
16698
  {
@@ -15874,6 +16834,9 @@ function Chat({
15874
16834
  selectedTool,
15875
16835
  planModeEnabled,
15876
16836
  onPlanModeChange: setPlanModeEnabled,
16837
+ goalCommandAvailable,
16838
+ goalPanelOpen: isGoalModeOpen,
16839
+ onGoalPanelOpenChange: handleGoalPanelOpenChange,
15877
16840
  runtimeCapabilities: runtimeCapabilitiesReady ? runtimeCapabilities : null,
15878
16841
  selectedRuntimeCapabilities: effectiveSessionRuntimeCapabilities,
15879
16842
  onRuntimeCapabilityToggle: handleSessionRuntimeCapabilityToggle,