reasonix 0.46.0 → 0.46.1

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 (147) hide show
  1. package/README.md +3 -0
  2. package/README.zh-CN.md +3 -0
  3. package/dashboard/dist/app.js +76 -6
  4. package/dashboard/dist/app.js.map +1 -1
  5. package/dist/cli/{acp-LGBLHBKY.js → acp-LKJU5DZX.js} +19 -19
  6. package/dist/cli/chat-W7LAWEN6.js +51 -0
  7. package/dist/cli/chunk-2425HK6U.js +0 -0
  8. package/dist/cli/chunk-25T6CVUP.js +0 -0
  9. package/dist/cli/{chunk-5I2C4JEO.js → chunk-2AASOSD5.js} +6 -6
  10. package/dist/cli/{chunk-5I2C4JEO.js.map → chunk-2AASOSD5.js.map} +1 -1
  11. package/dist/cli/chunk-2UQP6H6T.js +0 -0
  12. package/dist/cli/{chunk-HVUZWNSP.js → chunk-3AAG2CUT.js} +2 -2
  13. package/dist/cli/chunk-5QCB62C4.js +0 -0
  14. package/dist/cli/chunk-6OWJV3YW.js +0 -0
  15. package/dist/cli/{chunk-IJ7JA32V.js → chunk-6VANO7KB.js} +44 -8
  16. package/dist/cli/chunk-6VANO7KB.js.map +1 -0
  17. package/dist/cli/{chunk-LIR2HBQH.js → chunk-7LOJS3LV.js} +2 -2
  18. package/dist/cli/{chunk-I4L2GTSE.js → chunk-7SGGXNB2.js} +2 -2
  19. package/dist/cli/{chunk-CBIQWMS6.js → chunk-7YW6TPXK.js} +7 -7
  20. package/dist/cli/{chunk-A3TSSDS2.js → chunk-C72TNHDE.js} +2 -2
  21. package/dist/cli/chunk-CXVWUPA3.js +0 -0
  22. package/dist/cli/{chunk-AVFXO2EZ.js → chunk-DGA5QYFM.js} +107 -4
  23. package/dist/cli/chunk-DGA5QYFM.js.map +1 -0
  24. package/dist/cli/{chunk-JNAQYELD.js → chunk-DHRVZJ2D.js} +2 -2
  25. package/dist/cli/{chunk-5ACMUK4Q.js → chunk-E7TAHQ4A.js} +2 -1
  26. package/dist/cli/{chunk-C53JQES5.js → chunk-EAOL43HB.js} +3 -3
  27. package/dist/cli/chunk-FEZK652I.js +0 -0
  28. package/dist/cli/chunk-HNXDZGC6.js +0 -0
  29. package/dist/cli/{chunk-QJDDIK3Z.js → chunk-IYQ325V7.js} +2 -2
  30. package/dist/cli/chunk-J5XJHLWM.js +0 -0
  31. package/dist/cli/{chunk-4CTDEJUF.js → chunk-JLQDNLZF.js} +2 -2
  32. package/dist/cli/chunk-JMBMLOBP.js +0 -0
  33. package/dist/cli/{chunk-RDRC3XDT.js → chunk-JVFEJAJX.js} +2 -2
  34. package/dist/cli/{chunk-GTZTQNX5.js → chunk-JVQT5IYP.js} +7 -7
  35. package/dist/cli/{chunk-YY227BIQ.js → chunk-K3AIFMI6.js} +2 -2
  36. package/dist/cli/{chunk-ZZYBBX5N.js → chunk-M4E5JK6S.js} +23 -9
  37. package/dist/cli/chunk-M4E5JK6S.js.map +1 -0
  38. package/dist/cli/{chunk-V26WPN3J.js → chunk-MIIZJD5O.js} +28 -1
  39. package/dist/cli/chunk-MIIZJD5O.js.map +1 -0
  40. package/dist/cli/{chunk-4HCP2UQW.js → chunk-NCBP5D6E.js} +2 -2
  41. package/dist/cli/chunk-PLHAZOLZ.js +0 -0
  42. package/dist/cli/{chunk-HKWSPKMU.js → chunk-R2ASNSEO.js} +8 -8
  43. package/dist/cli/chunk-S4XVGLRW.js +0 -0
  44. package/dist/cli/{chunk-W7YGWUWU.js → chunk-SE7C5ZSI.js} +3 -3
  45. package/dist/cli/{chunk-KQU2TYIL.js → chunk-SPXN5JIT.js} +1128 -675
  46. package/dist/cli/chunk-SPXN5JIT.js.map +1 -0
  47. package/dist/cli/chunk-SZ5XES2N.js +0 -0
  48. package/dist/cli/{chunk-WK3UFQY3.js → chunk-TDSBASOF.js} +2 -2
  49. package/dist/cli/chunk-TEUDEGX2.js +0 -0
  50. package/dist/cli/chunk-TUK7OWJA.js +0 -0
  51. package/dist/cli/{chunk-XSU4QVFW.js → chunk-WQ6ZRDQM.js} +12 -3
  52. package/dist/cli/chunk-WQ6ZRDQM.js.map +1 -0
  53. package/dist/cli/{chunk-R3CTO2HM.js → chunk-WRONKNIH.js} +2 -2
  54. package/dist/cli/chunk-X53B3JIX.js +0 -0
  55. package/dist/cli/chunk-XJXDHAES.js +0 -0
  56. package/dist/cli/{chunk-MJ6W5UN3.js → chunk-XPAUNFOL.js} +2 -2
  57. package/dist/cli/chunk-XXC2BYTV.js +0 -0
  58. package/dist/cli/{chunk-NVURFF27.js → chunk-YRLC2EDF.js} +2 -2
  59. package/dist/cli/{chunk-WL6SNQ5T.js → chunk-ZOQHVQON.js} +9 -93
  60. package/dist/cli/chunk-ZOQHVQON.js.map +1 -0
  61. package/dist/cli/chunk-ZZM6QJ4W.js +0 -0
  62. package/dist/cli/{code-DFHSASJ4.js → code-2JIHL5M2.js} +29 -30
  63. package/dist/cli/code-2JIHL5M2.js.map +1 -0
  64. package/dist/cli/{commands-OCU42XG4.js → commands-OPT5AJNH.js} +4 -4
  65. package/dist/cli/{commit-XCQIQCYG.js → commit-KA37H6GM.js} +3 -3
  66. package/dist/cli/{desktop-ZCUG7LMF.js → desktop-5ONTRU3C.js} +20 -20
  67. package/dist/cli/devtools-HW3WDT3Q.js +0 -0
  68. package/dist/cli/{diff-66B2KWOJ.js → diff-SOIA7AKH.js} +8 -8
  69. package/dist/cli/{doctor-Y73CPPRZ.js → doctor-RCUP4XRV.js} +9 -9
  70. package/dist/cli/{events-NGZ2OJYH.js → events-6KHITNX4.js} +3 -3
  71. package/dist/cli/index.js +39 -88
  72. package/dist/cli/index.js.map +1 -1
  73. package/dist/cli/{mcp-MPVGBBJF.js → mcp-JP5OWD6R.js} +2 -2
  74. package/dist/cli/{mcp-browse-4XOTC3FJ.js → mcp-browse-ONCJJPJN.js} +2 -2
  75. package/dist/cli/{mcp-inspect-CEMGKKAH.js → mcp-inspect-TPLHW5JA.js} +4 -4
  76. package/dist/cli/{prompt-2D7ID24X.js → prompt-RJDNCQAP.js} +3 -3
  77. package/dist/cli/{prune-sessions-OJEYYLHY.js → prune-sessions-MKEATRVL.js} +2 -2
  78. package/dist/cli/{replay-AKYQNAQJ.js → replay-4NILJG4U.js} +8 -8
  79. package/dist/cli/{run-5DPQFSP6.js → run-WFGXB4SB.js} +17 -18
  80. package/dist/cli/run-WFGXB4SB.js.map +1 -0
  81. package/dist/cli/{server-TQ2IHYQJ.js → server-5VFQP3PV.js} +13 -13
  82. package/dist/cli/{sessions-KY54NG45.js → sessions-5XDJDALO.js} +28 -14
  83. package/dist/cli/sessions-5XDJDALO.js.map +1 -0
  84. package/dist/cli/{setup-XPIOZWS7.js → setup-F6XSWLRA.js} +7 -7
  85. package/dist/cli/setup-F6XSWLRA.js.map +1 -0
  86. package/dist/cli/{stats-X2VTWKNS.js → stats-ALHBZICE.js} +6 -6
  87. package/dist/cli/update-6ITLPRDV.js +0 -0
  88. package/dist/cli/{version-7O6A5T7Q.js → version-JVRAHBMM.js} +14 -14
  89. package/dist/index.d.ts +23 -13
  90. package/dist/index.js +1112 -1090
  91. package/dist/index.js.map +1 -1
  92. package/package.json +1 -1
  93. package/dist/cli/.-3G6VX5S7.js +0 -327
  94. package/dist/cli/.-6YRPB2C7.js +0 -329
  95. package/dist/cli/.-EYSVINK3.js +0 -317
  96. package/dist/cli/chat-ECK5ZGMV.js +0 -51
  97. package/dist/cli/chunk-AVFXO2EZ.js.map +0 -1
  98. package/dist/cli/chunk-IJ7JA32V.js.map +0 -1
  99. package/dist/cli/chunk-KQU2TYIL.js.map +0 -1
  100. package/dist/cli/chunk-V26WPN3J.js.map +0 -1
  101. package/dist/cli/chunk-WL6SNQ5T.js.map +0 -1
  102. package/dist/cli/chunk-XSU4QVFW.js.map +0 -1
  103. package/dist/cli/chunk-ZZYBBX5N.js.map +0 -1
  104. package/dist/cli/code-DFHSASJ4.js.map +0 -1
  105. package/dist/cli/doctor-Y73CPPRZ.js.map +0 -1
  106. package/dist/cli/prompt-2D7ID24X.js.map +0 -1
  107. package/dist/cli/run-5DPQFSP6.js.map +0 -1
  108. package/dist/cli/sessions-KY54NG45.js.map +0 -1
  109. package/dist/cli/setup-XPIOZWS7.js.map +0 -1
  110. package/dist/cli/stats-X2VTWKNS.js.map +0 -1
  111. /package/dist/cli/{acp-LGBLHBKY.js.map → acp-LKJU5DZX.js.map} +0 -0
  112. /package/dist/cli/{.-3G6VX5S7.js.map → chat-W7LAWEN6.js.map} +0 -0
  113. /package/dist/cli/{chunk-HVUZWNSP.js.map → chunk-3AAG2CUT.js.map} +0 -0
  114. /package/dist/cli/{chunk-LIR2HBQH.js.map → chunk-7LOJS3LV.js.map} +0 -0
  115. /package/dist/cli/{chunk-I4L2GTSE.js.map → chunk-7SGGXNB2.js.map} +0 -0
  116. /package/dist/cli/{chunk-CBIQWMS6.js.map → chunk-7YW6TPXK.js.map} +0 -0
  117. /package/dist/cli/{chunk-A3TSSDS2.js.map → chunk-C72TNHDE.js.map} +0 -0
  118. /package/dist/cli/{chunk-JNAQYELD.js.map → chunk-DHRVZJ2D.js.map} +0 -0
  119. /package/dist/cli/{chunk-5ACMUK4Q.js.map → chunk-E7TAHQ4A.js.map} +0 -0
  120. /package/dist/cli/{chunk-C53JQES5.js.map → chunk-EAOL43HB.js.map} +0 -0
  121. /package/dist/cli/{chunk-QJDDIK3Z.js.map → chunk-IYQ325V7.js.map} +0 -0
  122. /package/dist/cli/{chunk-4CTDEJUF.js.map → chunk-JLQDNLZF.js.map} +0 -0
  123. /package/dist/cli/{chunk-RDRC3XDT.js.map → chunk-JVFEJAJX.js.map} +0 -0
  124. /package/dist/cli/{chunk-GTZTQNX5.js.map → chunk-JVQT5IYP.js.map} +0 -0
  125. /package/dist/cli/{chunk-YY227BIQ.js.map → chunk-K3AIFMI6.js.map} +0 -0
  126. /package/dist/cli/{chunk-4HCP2UQW.js.map → chunk-NCBP5D6E.js.map} +0 -0
  127. /package/dist/cli/{chunk-HKWSPKMU.js.map → chunk-R2ASNSEO.js.map} +0 -0
  128. /package/dist/cli/{chunk-W7YGWUWU.js.map → chunk-SE7C5ZSI.js.map} +0 -0
  129. /package/dist/cli/{chunk-WK3UFQY3.js.map → chunk-TDSBASOF.js.map} +0 -0
  130. /package/dist/cli/{chunk-R3CTO2HM.js.map → chunk-WRONKNIH.js.map} +0 -0
  131. /package/dist/cli/{chunk-MJ6W5UN3.js.map → chunk-XPAUNFOL.js.map} +0 -0
  132. /package/dist/cli/{chunk-NVURFF27.js.map → chunk-YRLC2EDF.js.map} +0 -0
  133. /package/dist/cli/{commands-OCU42XG4.js.map → commands-OPT5AJNH.js.map} +0 -0
  134. /package/dist/cli/{commit-XCQIQCYG.js.map → commit-KA37H6GM.js.map} +0 -0
  135. /package/dist/cli/{desktop-ZCUG7LMF.js.map → desktop-5ONTRU3C.js.map} +0 -0
  136. /package/dist/cli/{diff-66B2KWOJ.js.map → diff-SOIA7AKH.js.map} +0 -0
  137. /package/dist/cli/{.-6YRPB2C7.js.map → doctor-RCUP4XRV.js.map} +0 -0
  138. /package/dist/cli/{events-NGZ2OJYH.js.map → events-6KHITNX4.js.map} +0 -0
  139. /package/dist/cli/{mcp-MPVGBBJF.js.map → mcp-JP5OWD6R.js.map} +0 -0
  140. /package/dist/cli/{mcp-browse-4XOTC3FJ.js.map → mcp-browse-ONCJJPJN.js.map} +0 -0
  141. /package/dist/cli/{mcp-inspect-CEMGKKAH.js.map → mcp-inspect-TPLHW5JA.js.map} +0 -0
  142. /package/dist/cli/{.-EYSVINK3.js.map → prompt-RJDNCQAP.js.map} +0 -0
  143. /package/dist/cli/{prune-sessions-OJEYYLHY.js.map → prune-sessions-MKEATRVL.js.map} +0 -0
  144. /package/dist/cli/{replay-AKYQNAQJ.js.map → replay-4NILJG4U.js.map} +0 -0
  145. /package/dist/cli/{server-TQ2IHYQJ.js.map → server-5VFQP3PV.js.map} +0 -0
  146. /package/dist/cli/{chat-ECK5ZGMV.js.map → stats-ALHBZICE.js.map} +0 -0
  147. /package/dist/cli/{version-7O6A5T7Q.js.map → version-JVRAHBMM.js.map} +0 -0
package/README.md CHANGED
@@ -14,6 +14,8 @@
14
14
  <a href="./docs/ARCHITECTURE.md">Architecture</a>
15
15
  &nbsp;·&nbsp;
16
16
  <a href="./benchmarks/">Benchmarks</a>
17
+ &nbsp;·&nbsp;
18
+ <a href="https://discord.gg/XF78rEME2D">Discord</a>
17
19
  </p>
18
20
 
19
21
  <p align="center">
@@ -25,6 +27,7 @@
25
27
  <a href="https://github.com/esengine/reasonix/stargazers"><img src="https://img.shields.io/github/stars/esengine/reasonix.svg?style=flat-square&color=dbab09&labelColor=161b22&logo=github&logoColor=white" alt="GitHub stars"/></a>
26
28
  <a href="https://github.com/esengine/reasonix/graphs/contributors"><img src="https://img.shields.io/github/contributors/esengine/reasonix.svg?style=flat-square&color=bc8cff&labelColor=161b22&logo=github&logoColor=white" alt="contributors"/></a>
27
29
  <a href="https://github.com/esengine/reasonix/discussions"><img src="https://img.shields.io/github/discussions/esengine/reasonix.svg?style=flat-square&color=58a6ff&labelColor=161b22&logo=github&logoColor=white" alt="Discussions"/></a>
30
+ <a href="https://discord.gg/XF78rEME2D"><img src="https://img.shields.io/badge/discord-join-5865F2.svg?style=flat-square&labelColor=161b22&logo=discord&logoColor=white" alt="Discord"/></a>
28
31
  </p>
29
32
 
30
33
  <p align="center">
package/README.zh-CN.md CHANGED
@@ -14,6 +14,8 @@
14
14
  <a href="./docs/ARCHITECTURE.md">架构文档</a>
15
15
  &nbsp;·&nbsp;
16
16
  <a href="./benchmarks/">基准测试</a>
17
+ &nbsp;·&nbsp;
18
+ <a href="https://discord.gg/XF78rEME2D">Discord</a>
17
19
  </p>
18
20
 
19
21
  <p align="center">
@@ -25,6 +27,7 @@
25
27
  <a href="https://github.com/esengine/reasonix/stargazers"><img src="https://img.shields.io/github/stars/esengine/reasonix.svg?style=flat-square&color=dbab09&labelColor=161b22&logo=github&logoColor=white" alt="GitHub stars"/></a>
26
28
  <a href="https://github.com/esengine/reasonix/graphs/contributors"><img src="https://img.shields.io/github/contributors/esengine/reasonix.svg?style=flat-square&color=bc8cff&labelColor=161b22&logo=github&logoColor=white" alt="contributors"/></a>
27
29
  <a href="https://github.com/esengine/reasonix/discussions"><img src="https://img.shields.io/github/discussions/esengine/reasonix.svg?style=flat-square&color=58a6ff&labelColor=161b22&logo=github&logoColor=white" alt="Discussions"/></a>
30
+ <a href="https://discord.gg/XF78rEME2D"><img src="https://img.shields.io/badge/discord-join-5865F2.svg?style=flat-square&labelColor=161b22&logo=discord&logoColor=white" alt="Discord"/></a>
28
31
  </p>
29
32
 
30
33
  <p align="center">
@@ -25059,12 +25059,22 @@ function CodeViewer(props) {
25059
25059
  </div>
25060
25060
  `;
25061
25061
  }
25062
+ function summarizeTool(activeTool) {
25063
+ if (!activeTool) return null;
25064
+ const name = activeTool.toolName ?? "tool";
25065
+ const args = parseToolArgs(activeTool.args);
25066
+ const path = args?.path ?? args?.file_path ?? args?.filename;
25067
+ if (path) return `${name} \u2192 ${path}`;
25068
+ return name;
25069
+ }
25062
25070
  function ChatPane(props) {
25063
25071
  useLang();
25064
25072
  const [messages, setMessages] = d2([]);
25065
25073
  const [streaming, setStreaming] = d2(null);
25066
25074
  const [activeTool, setActiveTool] = d2(null);
25067
25075
  const [busy, setBusy] = d2(false);
25076
+ const [turnStartedAt, setTurnStartedAt] = d2(null);
25077
+ const [nowTick, setNowTick] = d2(0);
25068
25078
  const [input, setInput] = d2("");
25069
25079
  const [error, setError] = d2(null);
25070
25080
  const [statusLine, setStatusLine] = d2(null);
@@ -25079,6 +25089,7 @@ function ChatPane(props) {
25079
25089
  const [popoverKind, setPopoverKind] = d2(null);
25080
25090
  const [popoverItems, setPopoverItems] = d2([]);
25081
25091
  const [popoverSel, setPopoverSel] = d2(0);
25092
+ const composing = A2(false);
25082
25093
  y2(() => {
25083
25094
  let cancelled = false;
25084
25095
  (async () => {
@@ -25092,6 +25103,29 @@ function ChatPane(props) {
25092
25103
  cancelled = true;
25093
25104
  };
25094
25105
  }, []);
25106
+ y2(() => {
25107
+ if (!busy) return;
25108
+ const id = setInterval(() => setNowTick((n3) => n3 + 1), 500);
25109
+ return () => clearInterval(id);
25110
+ }, [busy]);
25111
+ y2(() => {
25112
+ if (busy) {
25113
+ if (!turnStartedAt) setTurnStartedAt(Date.now());
25114
+ } else {
25115
+ setTurnStartedAt(null);
25116
+ }
25117
+ }, [busy, turnStartedAt]);
25118
+ y2(() => {
25119
+ if (!busy) return;
25120
+ const handler = (e3) => {
25121
+ if (e3.key === "Escape") {
25122
+ e3.preventDefault();
25123
+ api("/abort", { method: "POST" }).catch(() => void 0);
25124
+ }
25125
+ };
25126
+ document.addEventListener("keydown", handler);
25127
+ return () => document.removeEventListener("keydown", handler);
25128
+ }, [busy]);
25095
25129
  y2(() => {
25096
25130
  let cancelled = false;
25097
25131
  (async () => {
@@ -25286,6 +25320,7 @@ function ChatPane(props) {
25286
25320
  (e3) => {
25287
25321
  const v3 = e3.target.value;
25288
25322
  setInput(v3);
25323
+ if (composing.current) return;
25289
25324
  updatePopover(v3);
25290
25325
  },
25291
25326
  [updatePopover]
@@ -25364,8 +25399,19 @@ ${commentRefs}` : commentRefs;
25364
25399
  setError(t4("changes.clearFailed", { error: err.message }));
25365
25400
  }
25366
25401
  }, []);
25402
+ const onCompositionStart = q2(() => {
25403
+ composing.current = true;
25404
+ }, []);
25405
+ const onCompositionEnd = q2(
25406
+ (e3) => {
25407
+ composing.current = false;
25408
+ void updatePopover(e3.target.value);
25409
+ },
25410
+ [updatePopover]
25411
+ );
25367
25412
  const onKeyDown = q2(
25368
25413
  (e3) => {
25414
+ if (composing.current) return;
25369
25415
  if (popoverKind && popoverItems.length > 0) {
25370
25416
  if (e3.key === "ArrowDown") {
25371
25417
  e3.preventDefault();
@@ -25388,11 +25434,6 @@ ${commentRefs}` : commentRefs;
25388
25434
  return;
25389
25435
  }
25390
25436
  }
25391
- if (e3.key === "Escape" && busy) {
25392
- e3.preventDefault();
25393
- abort();
25394
- return;
25395
- }
25396
25437
  if (e3.key === "Enter" && !e3.shiftKey) {
25397
25438
  e3.preventDefault();
25398
25439
  send();
@@ -25476,11 +25517,14 @@ ${commentRefs}` : commentRefs;
25476
25517
  <textarea
25477
25518
  class="input"
25478
25519
  style=${{ width: "100%", resize: "none", minHeight: "36px", fontFamily: "inherit", fontSize: "13px", padding: "8px 10px", lineHeight: "1.4", background: "var(--bg-input)", border: "1px solid var(--bd)", borderRadius: "4px", color: "var(--fg-0)" }}
25479
- placeholder=${props.comments.length > 0 ? "\u603B\u7ED3\u8BC4\u8BBA..." : t4("changes.chatPlaceholder")}
25520
+ placeholder=${busy ? t4("chat.placeholderBusy") : props.comments.length > 0 ? "\u603B\u7ED3\u8BC4\u8BBA..." : t4("changes.chatPlaceholder")}
25480
25521
  value=${input}
25481
25522
  onInput=${onInput}
25482
25523
  onKeyDown=${onKeyDown}
25524
+ onCompositionStart=${onCompositionStart}
25525
+ onCompositionEnd=${onCompositionEnd}
25483
25526
  onBlur=${() => setTimeout(() => setPopoverKind(null), 150)}
25527
+ disabled=${busy}
25484
25528
  rows="2"
25485
25529
  />
25486
25530
  </div>
@@ -25493,6 +25537,32 @@ ${commentRefs}` : commentRefs;
25493
25537
  </div>
25494
25538
  </div>
25495
25539
  </div>
25540
+ ${busy ? (() => {
25541
+ const elapsedMs = turnStartedAt ? Date.now() - turnStartedAt : 0;
25542
+ const elapsed = (elapsedMs / 1e3).toFixed(1);
25543
+ const textLen = streaming?.text?.length ?? 0;
25544
+ const reasoningLen = streaming?.reasoning?.length ?? 0;
25545
+ const toolSummary = summarizeTool(activeTool);
25546
+ const phase = toolSummary ? t4("chat.inflightRunning") : reasoningLen > 0 && textLen === 0 ? t4("chat.inflightThinking") : textLen > 0 ? t4("chat.inflightStreaming") : t4("chat.inflightWaiting");
25547
+ return html6`
25548
+ <div class="chat-inflight">
25549
+ <span class="spinner"></span>
25550
+ <span class="chat-inflight-phase">${phase}</span>
25551
+ <span class="chat-inflight-sep">·</span>
25552
+ <span class="muted">${elapsed}s</span>
25553
+ ${toolSummary ? html6`<span class="chat-inflight-sep">·</span><span class="chat-inflight-tool" title=${toolSummary}>${toolSummary}</span>` : null}
25554
+ ${!toolSummary && (textLen > 0 || reasoningLen > 0) ? html6`
25555
+ <span class="chat-inflight-sep">·</span>
25556
+ <span class="muted">
25557
+ ${reasoningLen > 0 ? t4("chat.inflightReasoning", { count: reasoningLen.toLocaleString() }) : null}
25558
+ ${reasoningLen > 0 && textLen > 0 ? html6`<span> · </span>` : null}
25559
+ ${textLen > 0 ? t4("chat.inflightOut", { count: textLen.toLocaleString() }) : null}
25560
+ </span>
25561
+ ` : null}
25562
+ <button class="chat-inflight-abort" onClick=${abort}>${t4("chat.abortBtn")}</button>
25563
+ </div>
25564
+ `;
25565
+ })() : null}
25496
25566
  <${ChatStatusBar} stats=${stats} model=${model} />
25497
25567
  </div>
25498
25568
  `;