reasonix 0.51.0 → 0.52.0

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 (143) hide show
  1. package/dashboard/dist/app.css +1 -1
  2. package/dashboard/dist/app.js +3 -3
  3. package/dashboard/dist/app.js.map +1 -1
  4. package/dist/cli/{acp-XEUHGG7X.js → acp-NEUYWGUU.js} +26 -26
  5. package/dist/cli/chat-QA6IVFJD.js +49 -0
  6. package/dist/cli/{chunk-HGK57NBN.js → chunk-2W4F3RIZ.js} +2 -2
  7. package/dist/cli/{chunk-UO6E7FN3.js → chunk-3OXD5CBM.js} +32756 -31192
  8. package/dist/cli/chunk-3OXD5CBM.js.map +1 -0
  9. package/dist/cli/{chunk-UMZ6KHTS.js → chunk-5YLEKX2V.js} +2 -2
  10. package/dist/cli/{chunk-BA5R6BAE.js → chunk-6QBUXA73.js} +2 -2
  11. package/dist/cli/chunk-77JIQ7SL.js +40 -0
  12. package/dist/cli/chunk-77JIQ7SL.js.map +1 -0
  13. package/dist/cli/{chunk-6XWXIVQ3.js → chunk-AMSK3ZLB.js} +2 -2
  14. package/dist/cli/chunk-AMSK3ZLB.js.map +1 -0
  15. package/dist/cli/{chunk-A5PBEIJ7.js → chunk-AOYUW3HR.js} +37 -4
  16. package/dist/cli/chunk-AOYUW3HR.js.map +1 -0
  17. package/dist/cli/{chunk-3YRTIWFX.js → chunk-ARBGTNHM.js} +2 -2
  18. package/dist/cli/{chunk-3BTK5BHI.js → chunk-B4MOGWHW.js} +2 -2
  19. package/dist/cli/{chunk-5AIDYVH2.js → chunk-CFJY64UA.js} +2 -2
  20. package/dist/cli/{chunk-SBHF5NWD.js → chunk-CGVW5W7N.js} +14 -14
  21. package/dist/cli/{chunk-SBHF5NWD.js.map → chunk-CGVW5W7N.js.map} +1 -1
  22. package/dist/cli/{chunk-DVD67FXQ.js → chunk-CLHMV6OL.js} +568 -66
  23. package/dist/cli/chunk-CLHMV6OL.js.map +1 -0
  24. package/dist/cli/{chunk-2WUEAI2I.js → chunk-CPCUMMSR.js} +3 -3
  25. package/dist/cli/{chunk-JHWQDJZA.js → chunk-CTRM32BP.js} +2 -2
  26. package/dist/cli/{chunk-544J4PXD.js → chunk-D6WRFR6V.js} +5 -5
  27. package/dist/cli/{chunk-N4SEBLU4.js → chunk-DLTE4GBY.js} +3 -3
  28. package/dist/cli/{chunk-NRROJXXT.js → chunk-FY5UERSG.js} +9 -9
  29. package/dist/cli/{chunk-C2MRSJTV.js → chunk-GFJJEW3Z.js} +18 -10
  30. package/dist/cli/chunk-GFJJEW3Z.js.map +1 -0
  31. package/dist/cli/{chunk-R6KIHEF3.js → chunk-GNRKXRRE.js} +743 -660
  32. package/dist/cli/chunk-GNRKXRRE.js.map +1 -0
  33. package/dist/cli/{chunk-SXSAWOB7.js → chunk-HI6THNAZ.js} +19 -17
  34. package/dist/cli/chunk-HI6THNAZ.js.map +1 -0
  35. package/dist/cli/{chunk-K4YQFULP.js → chunk-HNZ4727T.js} +15 -15
  36. package/dist/cli/chunk-I3NE5S63.js +54 -0
  37. package/dist/cli/{chunk-EAMXOWUW.js.map → chunk-I3NE5S63.js.map} +1 -1
  38. package/dist/cli/{chunk-FEZK652I.js → chunk-MVLPXZAA.js} +834 -10
  39. package/dist/cli/chunk-MVLPXZAA.js.map +1 -0
  40. package/dist/cli/{chunk-36BM7INR.js → chunk-MW64SQUE.js} +2 -2
  41. package/dist/cli/{chunk-Z3MKG7MQ.js → chunk-OMNRXZNA.js} +2 -2
  42. package/dist/cli/{chunk-7YPMTE3U.js → chunk-RCC73DWQ.js} +5 -9
  43. package/dist/cli/chunk-RCC73DWQ.js.map +1 -0
  44. package/dist/cli/{chunk-2HVTBFCI.js → chunk-RHQOGG43.js} +5 -3
  45. package/dist/cli/chunk-RHQOGG43.js.map +1 -0
  46. package/dist/cli/{chunk-EWVFGYT6.js → chunk-VVPV5HU6.js} +2 -2
  47. package/dist/cli/{chunk-7YB26OQO.js → chunk-WPY7AFS6.js} +2 -2
  48. package/dist/cli/{chunk-BM6BBFAV.js → chunk-XBYHNZ5Z.js} +2 -2
  49. package/dist/cli/{chunk-WPOKBW5E.js → chunk-XNMXVL6C.js} +2 -2
  50. package/dist/cli/{chunk-SVD4UPRQ.js → chunk-XUZHBQSM.js} +2 -2
  51. package/dist/cli/{chunk-Q46B3Z7H.js → chunk-YMYX6QTC.js} +8 -5
  52. package/dist/cli/{chunk-Q46B3Z7H.js.map → chunk-YMYX6QTC.js.map} +1 -1
  53. package/dist/cli/{chunk-K3QJ3GKI.js → chunk-Z663GVUB.js} +3 -3
  54. package/dist/cli/{code-BMXLBC7D.js → code-WN6D4VZO.js} +35 -36
  55. package/dist/cli/{code-BMXLBC7D.js.map → code-WN6D4VZO.js.map} +1 -1
  56. package/dist/cli/{commands-E4RZXMF6.js → commands-DHETOY7O.js} +4 -4
  57. package/dist/cli/{commit-KSRQ64IL.js → commit-BBUYAKZV.js} +3 -3
  58. package/dist/cli/{config-QNDONOTU.js → config-KV7VV5LG.js} +4 -2
  59. package/dist/cli/{desktop-H3ZHIMDA.js → desktop-LJVXWXNF.js} +557 -70
  60. package/dist/cli/desktop-LJVXWXNF.js.map +1 -0
  61. package/dist/cli/diff-2JHMQAHI.js +165 -0
  62. package/dist/cli/{diff-I4PYI43W.js.map → diff-2JHMQAHI.js.map} +1 -1
  63. package/dist/cli/{doctor-Y2E4MY2F.js → doctor-GI5LOEZL.js} +11 -11
  64. package/dist/cli/{events-47HOT7ZA.js → events-LBKMLFM4.js} +5 -5
  65. package/dist/cli/index.js +40 -39
  66. package/dist/cli/index.js.map +1 -1
  67. package/dist/cli/{mcp-76DK63ZB.js → mcp-DKEJK5ND.js} +3 -3
  68. package/dist/cli/{mcp-browse-SDNUGO74.js → mcp-browse-V7KWDY32.js} +15 -15
  69. package/dist/cli/{mcp-browse-SDNUGO74.js.map → mcp-browse-V7KWDY32.js.map} +1 -1
  70. package/dist/cli/{mcp-inspect-BL5DEO5M.js → mcp-inspect-MTABNHVM.js} +5 -5
  71. package/dist/cli/{prompt-JLATI3P7.js → prompt-ATI7DKHF.js} +5 -5
  72. package/dist/cli/{prune-sessions-WHZDFUKD.js → prune-sessions-YQQSZTZS.js} +4 -4
  73. package/dist/cli/{replay-MHXS7C7Z.js → replay-ZJQ4I4CJ.js} +30 -30
  74. package/dist/cli/{replay-MHXS7C7Z.js.map → replay-ZJQ4I4CJ.js.map} +1 -1
  75. package/dist/cli/{run-SXNCPRJE.js → run-HFPRNWJY.js} +22 -22
  76. package/dist/cli/{server-GEHOE6CO.js → server-UHKO2VVM.js} +23 -23
  77. package/dist/cli/{sessions-EPBFYISL.js → sessions-IQEWWUH3.js} +16 -16
  78. package/dist/cli/setup-5BYKCL62.js +502 -0
  79. package/dist/cli/setup-5BYKCL62.js.map +1 -0
  80. package/dist/cli/{stats-4WB4XHBP.js → stats-OFCGOQMZ.js} +6 -6
  81. package/dist/cli/{version-4SP3DLLH.js → version-EODUFAAI.js} +16 -16
  82. package/dist/index.d.ts +12 -1
  83. package/dist/index.js +613 -78
  84. package/dist/index.js.map +1 -1
  85. package/package.json +21 -3
  86. package/dist/cli/chat-NJ2Q5KHG.js +0 -50
  87. package/dist/cli/chunk-2HVTBFCI.js.map +0 -1
  88. package/dist/cli/chunk-5BBC6YMV.js +0 -832
  89. package/dist/cli/chunk-5BBC6YMV.js.map +0 -1
  90. package/dist/cli/chunk-6XWXIVQ3.js.map +0 -1
  91. package/dist/cli/chunk-7YPMTE3U.js.map +0 -1
  92. package/dist/cli/chunk-A5PBEIJ7.js.map +0 -1
  93. package/dist/cli/chunk-C2MRSJTV.js.map +0 -1
  94. package/dist/cli/chunk-DVD67FXQ.js.map +0 -1
  95. package/dist/cli/chunk-EAMXOWUW.js +0 -54
  96. package/dist/cli/chunk-FEZK652I.js.map +0 -1
  97. package/dist/cli/chunk-R6KIHEF3.js.map +0 -1
  98. package/dist/cli/chunk-SXSAWOB7.js.map +0 -1
  99. package/dist/cli/chunk-UO6E7FN3.js.map +0 -1
  100. package/dist/cli/chunk-UPW544V3.js +0 -96
  101. package/dist/cli/chunk-UPW544V3.js.map +0 -1
  102. package/dist/cli/desktop-H3ZHIMDA.js.map +0 -1
  103. package/dist/cli/devtools-HW3WDT3Q.js +0 -91
  104. package/dist/cli/devtools-HW3WDT3Q.js.map +0 -1
  105. package/dist/cli/diff-I4PYI43W.js +0 -165
  106. package/dist/cli/setup-IW2XR5XI.js +0 -593
  107. package/dist/cli/setup-IW2XR5XI.js.map +0 -1
  108. /package/dist/cli/{acp-XEUHGG7X.js.map → acp-NEUYWGUU.js.map} +0 -0
  109. /package/dist/cli/{chat-NJ2Q5KHG.js.map → chat-QA6IVFJD.js.map} +0 -0
  110. /package/dist/cli/{chunk-HGK57NBN.js.map → chunk-2W4F3RIZ.js.map} +0 -0
  111. /package/dist/cli/{chunk-UMZ6KHTS.js.map → chunk-5YLEKX2V.js.map} +0 -0
  112. /package/dist/cli/{chunk-BA5R6BAE.js.map → chunk-6QBUXA73.js.map} +0 -0
  113. /package/dist/cli/{chunk-3YRTIWFX.js.map → chunk-ARBGTNHM.js.map} +0 -0
  114. /package/dist/cli/{chunk-3BTK5BHI.js.map → chunk-B4MOGWHW.js.map} +0 -0
  115. /package/dist/cli/{chunk-5AIDYVH2.js.map → chunk-CFJY64UA.js.map} +0 -0
  116. /package/dist/cli/{chunk-2WUEAI2I.js.map → chunk-CPCUMMSR.js.map} +0 -0
  117. /package/dist/cli/{chunk-JHWQDJZA.js.map → chunk-CTRM32BP.js.map} +0 -0
  118. /package/dist/cli/{chunk-544J4PXD.js.map → chunk-D6WRFR6V.js.map} +0 -0
  119. /package/dist/cli/{chunk-N4SEBLU4.js.map → chunk-DLTE4GBY.js.map} +0 -0
  120. /package/dist/cli/{chunk-NRROJXXT.js.map → chunk-FY5UERSG.js.map} +0 -0
  121. /package/dist/cli/{chunk-K4YQFULP.js.map → chunk-HNZ4727T.js.map} +0 -0
  122. /package/dist/cli/{chunk-36BM7INR.js.map → chunk-MW64SQUE.js.map} +0 -0
  123. /package/dist/cli/{chunk-Z3MKG7MQ.js.map → chunk-OMNRXZNA.js.map} +0 -0
  124. /package/dist/cli/{chunk-EWVFGYT6.js.map → chunk-VVPV5HU6.js.map} +0 -0
  125. /package/dist/cli/{chunk-7YB26OQO.js.map → chunk-WPY7AFS6.js.map} +0 -0
  126. /package/dist/cli/{chunk-BM6BBFAV.js.map → chunk-XBYHNZ5Z.js.map} +0 -0
  127. /package/dist/cli/{chunk-WPOKBW5E.js.map → chunk-XNMXVL6C.js.map} +0 -0
  128. /package/dist/cli/{chunk-SVD4UPRQ.js.map → chunk-XUZHBQSM.js.map} +0 -0
  129. /package/dist/cli/{chunk-K3QJ3GKI.js.map → chunk-Z663GVUB.js.map} +0 -0
  130. /package/dist/cli/{commands-E4RZXMF6.js.map → commands-DHETOY7O.js.map} +0 -0
  131. /package/dist/cli/{commit-KSRQ64IL.js.map → commit-BBUYAKZV.js.map} +0 -0
  132. /package/dist/cli/{config-QNDONOTU.js.map → config-KV7VV5LG.js.map} +0 -0
  133. /package/dist/cli/{doctor-Y2E4MY2F.js.map → doctor-GI5LOEZL.js.map} +0 -0
  134. /package/dist/cli/{events-47HOT7ZA.js.map → events-LBKMLFM4.js.map} +0 -0
  135. /package/dist/cli/{mcp-76DK63ZB.js.map → mcp-DKEJK5ND.js.map} +0 -0
  136. /package/dist/cli/{mcp-inspect-BL5DEO5M.js.map → mcp-inspect-MTABNHVM.js.map} +0 -0
  137. /package/dist/cli/{prompt-JLATI3P7.js.map → prompt-ATI7DKHF.js.map} +0 -0
  138. /package/dist/cli/{prune-sessions-WHZDFUKD.js.map → prune-sessions-YQQSZTZS.js.map} +0 -0
  139. /package/dist/cli/{run-SXNCPRJE.js.map → run-HFPRNWJY.js.map} +0 -0
  140. /package/dist/cli/{server-GEHOE6CO.js.map → server-UHKO2VVM.js.map} +0 -0
  141. /package/dist/cli/{sessions-EPBFYISL.js.map → sessions-IQEWWUH3.js.map} +0 -0
  142. /package/dist/cli/{stats-4WB4XHBP.js.map → stats-OFCGOQMZ.js.map} +0 -0
  143. /package/dist/cli/{version-4SP3DLLH.js.map → version-EODUFAAI.js.map} +0 -0
@@ -1,15 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire as __cr } from 'node:module'; if (typeof globalThis.require === 'undefined') { globalThis.require = __cr(import.meta.url); }
3
3
  import {
4
- formatTokens,
5
- stringWidth
6
- } from "./chunk-UPW544V3.js";
4
+ formatTokens
5
+ } from "./chunk-77JIQ7SL.js";
7
6
  import {
8
7
  loadOverlay
9
8
  } from "./chunk-JMBMLOBP.js";
10
- import {
11
- renderDashboard
12
- } from "./chunk-K3QJ3GKI.js";
13
9
  import {
14
10
  MANUAL_UPDATE_COMMANDS,
15
11
  planUpdate
@@ -36,11 +32,11 @@ import {
36
32
  restoreCheckpoint,
37
33
  savePlanState,
38
34
  suggestSlashCommands
39
- } from "./chunk-3BTK5BHI.js";
35
+ } from "./chunk-B4MOGWHW.js";
40
36
  import {
41
37
  eventLogPath,
42
38
  openEventSink
43
- } from "./chunk-WPOKBW5E.js";
39
+ } from "./chunk-XNMXVL6C.js";
44
40
  import {
45
41
  fetchSmitheryDetail,
46
42
  loadMorePages,
@@ -54,20 +50,20 @@ import {
54
50
  formatQQModeLabel,
55
51
  formatQQSetupPrompt,
56
52
  formatQQSetupWaiting
57
- } from "./chunk-5BBC6YMV.js";
53
+ } from "./chunk-MVLPXZAA.js";
58
54
  import {
59
55
  Eventizer,
60
56
  autoResolveVerdict,
61
57
  registerSkillTools,
62
58
  shouldAutoResolveCheckpoint
63
- } from "./chunk-BM6BBFAV.js";
59
+ } from "./chunk-XBYHNZ5Z.js";
64
60
  import {
65
61
  formatMcpLifecycleEvent,
66
62
  formatMcpSlowToast
67
- } from "./chunk-5AIDYVH2.js";
63
+ } from "./chunk-CFJY64UA.js";
68
64
  import {
69
65
  buildTransportFromSpec
70
- } from "./chunk-SVD4UPRQ.js";
66
+ } from "./chunk-XUZHBQSM.js";
71
67
  import {
72
68
  dumpStartupProfile,
73
69
  markPhase,
@@ -100,15 +96,15 @@ import {
100
96
  toWholeFileEditBlock,
101
97
  walkFilesStream,
102
98
  webFetch
103
- } from "./chunk-K4YQFULP.js";
104
- import {
105
- McpClient
106
- } from "./chunk-7YPMTE3U.js";
99
+ } from "./chunk-HNZ4727T.js";
107
100
  import {
108
101
  openTranscriptFile,
109
102
  recordFromLoopEvent,
110
103
  writeRecord
111
- } from "./chunk-544J4PXD.js";
104
+ } from "./chunk-D6WRFR6V.js";
105
+ import {
106
+ McpClient
107
+ } from "./chunk-RCC73DWQ.js";
112
108
  import {
113
109
  BUILTIN_ALLOWLIST,
114
110
  derivePrefix,
@@ -118,18 +114,7 @@ import {
118
114
  runCommand,
119
115
  stripCompactionMarker,
120
116
  toApprovalPrompt
121
- } from "./chunk-UMZ6KHTS.js";
122
- import {
123
- aggregateUsage,
124
- appendUsage,
125
- defaultUsageLogPath,
126
- readUsageLog
127
- } from "./chunk-3YRTIWFX.js";
128
- import {
129
- DEEPSEEK_CONTEXT_TOKENS,
130
- DEFAULT_CONTEXT_TOKENS,
131
- pricingFor
132
- } from "./chunk-BA5R6BAE.js";
117
+ } from "./chunk-5YLEKX2V.js";
133
118
  import {
134
119
  MemoryStore,
135
120
  PROJECT_MEMORY_FILE,
@@ -138,12 +123,12 @@ import {
138
123
  memoryEnabled,
139
124
  readProjectMemory,
140
125
  resolveProjectMemoryWritePath
141
- } from "./chunk-N4SEBLU4.js";
126
+ } from "./chunk-DLTE4GBY.js";
142
127
  import {
143
128
  KeystrokeProvider,
144
129
  SingleSelect,
145
130
  useKeystroke
146
- } from "./chunk-SBHF5NWD.js";
131
+ } from "./chunk-CGVW5W7N.js";
147
132
  import {
148
133
  COLOR,
149
134
  GLYPH,
@@ -151,31 +136,29 @@ import {
151
136
  ThemeProvider,
152
137
  useColor,
153
138
  useThemeTokens
154
- } from "./chunk-2HVTBFCI.js";
139
+ } from "./chunk-RHQOGG43.js";
155
140
  import {
156
- Box_default,
157
- Static,
158
- Text,
159
- Transform,
160
- render_default,
141
+ An,
142
+ Cv,
143
+ L,
144
+ W,
145
+ Wi,
146
+ Wo,
147
+ bv,
148
+ fc,
161
149
  require_react,
162
- useAnimation,
163
- use_app_default,
164
- use_box_metrics_default,
165
- use_stdin_default,
166
- use_stdout_default
167
- } from "./chunk-UO6E7FN3.js";
150
+ source_default,
151
+ stringWidth,
152
+ vv,
153
+ wv
154
+ } from "./chunk-3OXD5CBM.js";
168
155
  import {
169
156
  runDoctorChecks
170
- } from "./chunk-SXSAWOB7.js";
157
+ } from "./chunk-HI6THNAZ.js";
171
158
  import {
172
159
  countTokensBounded,
173
160
  warmupTokenizer
174
161
  } from "./chunk-BOWSNGQC.js";
175
- import {
176
- DeepSeekClient,
177
- pickPrimaryBalance
178
- } from "./chunk-C2MRSJTV.js";
179
162
  import {
180
163
  HOOK_EVENTS,
181
164
  formatHookOutcomeMessage,
@@ -183,7 +166,7 @@ import {
183
166
  loadHooks,
184
167
  projectSettingsPath,
185
168
  runHooks
186
- } from "./chunk-2WUEAI2I.js";
169
+ } from "./chunk-CPCUMMSR.js";
187
170
  import {
188
171
  deleteSession,
189
172
  detectGitBranch,
@@ -200,7 +183,7 @@ import {
200
183
  sessionPath,
201
184
  sessionsDir,
202
185
  timestampSuffix
203
- } from "./chunk-6XWXIVQ3.js";
186
+ } from "./chunk-AMSK3ZLB.js";
204
187
  import {
205
188
  VERSION,
206
189
  compareVersions,
@@ -208,9 +191,27 @@ import {
208
191
  detectNpmInstallPrefix,
209
192
  getLatestVersion
210
193
  } from "./chunk-XXC2BYTV.js";
194
+ import {
195
+ DeepSeekClient,
196
+ pickPrimaryBalance
197
+ } from "./chunk-GFJJEW3Z.js";
211
198
  import {
212
199
  loadDotenv
213
200
  } from "./chunk-2UQP6H6T.js";
201
+ import {
202
+ renderDashboard
203
+ } from "./chunk-Z663GVUB.js";
204
+ import {
205
+ aggregateUsage,
206
+ appendUsage,
207
+ defaultUsageLogPath,
208
+ readUsageLog
209
+ } from "./chunk-ARBGTNHM.js";
210
+ import {
211
+ DEEPSEEK_CONTEXT_TOKENS,
212
+ DEFAULT_CONTEXT_TOKENS,
213
+ pricingFor
214
+ } from "./chunk-6QBUXA73.js";
214
215
  import {
215
216
  getLanguage,
216
217
  getSupportedLanguages,
@@ -219,10 +220,11 @@ import {
219
220
  setLanguage,
220
221
  t,
221
222
  tObj
222
- } from "./chunk-DVD67FXQ.js";
223
+ } from "./chunk-CLHMV6OL.js";
223
224
  import {
224
225
  CARD,
225
226
  FG,
227
+ MESSAGE_BG,
226
228
  SURFACE,
227
229
  TONE,
228
230
  TONE_ACTIVE,
@@ -281,7 +283,7 @@ import {
281
283
  webSearchEndpoint,
282
284
  webSearchEngine,
283
285
  writeConfig
284
- } from "./chunk-A5PBEIJ7.js";
286
+ } from "./chunk-AOYUW3HR.js";
285
287
  import {
286
288
  __commonJS,
287
289
  __require,
@@ -45769,10 +45771,10 @@ function BootSplash() {
45769
45771
  const waveOffset = frame % 4;
45770
45772
  const wave = WAVE_SOURCE.slice(waveOffset, waveOffset + WAVE_WIDTH);
45771
45773
  const dots = ".".repeat(frame % 4 + 1);
45772
- return /* @__PURE__ */ import_react2.default.createElement(Box_default, { flexDirection: "column", alignItems: "center", marginY: 1 }, /* @__PURE__ */ import_react2.default.createElement(Box_default, { flexDirection: "column", alignItems: "flex-start", marginBottom: 1 }, REASONIX_LOGO.map((line) => /* @__PURE__ */ import_react2.default.createElement(Text, { key: line, color: TONE.brand, bold: true }, line))), /* @__PURE__ */ import_react2.default.createElement(Box_default, { flexDirection: "column", alignItems: "flex-start" }, spout.map((line, i) => (
45774
+ return /* @__PURE__ */ import_react2.default.createElement(W, { flexDirection: "column", alignItems: "center", marginY: 1 }, /* @__PURE__ */ import_react2.default.createElement(W, { flexDirection: "column", alignItems: "flex-start", marginBottom: 1 }, REASONIX_LOGO.map((line) => /* @__PURE__ */ import_react2.default.createElement(L, { key: line, color: TONE.brand, bold: true }, line))), /* @__PURE__ */ import_react2.default.createElement(W, { flexDirection: "column", alignItems: "flex-start" }, spout.map((line, i) => (
45773
45775
  // biome-ignore lint/suspicious/noArrayIndexKey: fixed-length spout column, position is the identity
45774
- /* @__PURE__ */ import_react2.default.createElement(Text, { key: i, color: TONE.accent }, line.length > 0 ? line : " ")
45775
- )), WHALE_LINES.map((line) => /* @__PURE__ */ import_react2.default.createElement(Text, { key: line, color: TONE.brand, bold: true }, line)), /* @__PURE__ */ import_react2.default.createElement(Text, { color: FG.faint }, wave)), /* @__PURE__ */ import_react2.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react2.default.createElement(Text, { color: FG.meta }, `${t("common.loading")}${dots}`)));
45776
+ /* @__PURE__ */ import_react2.default.createElement(L, { key: i, color: TONE.accent }, line.length > 0 ? line : " ")
45777
+ )), WHALE_LINES.map((line) => /* @__PURE__ */ import_react2.default.createElement(L, { key: line, color: TONE.brand, bold: true }, line)), /* @__PURE__ */ import_react2.default.createElement(L, { color: FG.faint }, wave)), /* @__PURE__ */ import_react2.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react2.default.createElement(L, { color: FG.meta }, `${t("common.loading")}${dots}`)));
45776
45778
  }
45777
45779
 
45778
45780
  // src/cli/ui/CheckpointPicker.tsx
@@ -45824,7 +45826,7 @@ function CheckpointPicker({
45824
45826
  pickerPorts
45825
45827
  }) {
45826
45828
  const [focus, setFocus] = (0, import_react4.useState)(0);
45827
- const { stdout } = use_stdout_default();
45829
+ const { stdout } = bv();
45828
45830
  const rows = stdout?.rows ?? 40;
45829
45831
  const visibleCount = Math.max(3, rows - PAGE_MARGIN);
45830
45832
  const snapshot = (0, import_react4.useMemo)(
@@ -45885,7 +45887,7 @@ function CheckpointPicker({
45885
45887
  const end = Math.min(checkpoints.length, start + visibleCount);
45886
45888
  const shown = checkpoints.slice(start, end);
45887
45889
  const hiddenBelow = checkpoints.length - end;
45888
- return /* @__PURE__ */ import_react4.default.createElement(Box_default, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react4.default.createElement(Box_default, null, /* @__PURE__ */ import_react4.default.createElement(Text, { bold: true, color: TONE.brand }, t("checkpointPicker.header")), /* @__PURE__ */ import_react4.default.createElement(Text, { color: FG.meta }, ` \xB7 ${workspace}`)), /* @__PURE__ */ import_react4.default.createElement(Box_default, { height: 1 }), checkpoints.length === 0 ? /* @__PURE__ */ import_react4.default.createElement(Box_default, null, /* @__PURE__ */ import_react4.default.createElement(Text, { color: FG.faint }, t("checkpointPicker.empty"))) : shown.map((c, i) => /* @__PURE__ */ import_react4.default.createElement(CheckpointRow, { key: c.id, info: c, focused: start + i === focus })), hiddenBelow > 0 ? /* @__PURE__ */ import_react4.default.createElement(Box_default, null, /* @__PURE__ */ import_react4.default.createElement(Text, { color: FG.faint }, t("checkpointPicker.more", { hidden: hiddenBelow }))) : null, /* @__PURE__ */ import_react4.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react4.default.createElement(Text, { color: FG.faint }, checkpoints.length === 0 ? t("checkpointPicker.footerEmpty") : t("checkpointPicker.footer"))));
45890
+ return /* @__PURE__ */ import_react4.default.createElement(W, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react4.default.createElement(W, null, /* @__PURE__ */ import_react4.default.createElement(L, { bold: true, color: TONE.brand }, t("checkpointPicker.header")), /* @__PURE__ */ import_react4.default.createElement(L, { color: FG.meta }, ` \xB7 ${workspace}`)), /* @__PURE__ */ import_react4.default.createElement(W, { height: 1 }), checkpoints.length === 0 ? /* @__PURE__ */ import_react4.default.createElement(W, null, /* @__PURE__ */ import_react4.default.createElement(L, { color: FG.faint }, t("checkpointPicker.empty"))) : shown.map((c, i) => /* @__PURE__ */ import_react4.default.createElement(CheckpointRow, { key: c.id, info: c, focused: start + i === focus })), hiddenBelow > 0 ? /* @__PURE__ */ import_react4.default.createElement(W, null, /* @__PURE__ */ import_react4.default.createElement(L, { color: FG.faint }, t("checkpointPicker.more", { hidden: hiddenBelow }))) : null, /* @__PURE__ */ import_react4.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react4.default.createElement(L, { color: FG.faint }, checkpoints.length === 0 ? t("checkpointPicker.footerEmpty") : t("checkpointPicker.footer"))));
45889
45891
  }
45890
45892
  function CheckpointRow({
45891
45893
  info,
@@ -45894,8 +45896,8 @@ function CheckpointRow({
45894
45896
  const tag2 = info.source === "manual" ? "" : ` (${info.source})`;
45895
45897
  const sizeKb = (info.bytes / 1024).toFixed(1);
45896
45898
  const time = fmtAgo(info.createdAt);
45897
- return /* @__PURE__ */ import_react4.default.createElement(Box_default, null, /* @__PURE__ */ import_react4.default.createElement(Text, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react4.default.createElement(Text, { color: FG.meta }, info.id.slice(0, 7).padEnd(8)), /* @__PURE__ */ import_react4.default.createElement(Text, { bold: focused, color: focused ? FG.strong : FG.sub }, info.name), /* @__PURE__ */ import_react4.default.createElement(Text, { color: FG.faint }, tag2), /* @__PURE__ */ import_react4.default.createElement(Box_default, { flexGrow: 1 }), /* @__PURE__ */ import_react4.default.createElement(Text, { color: FG.faint }, `${time.padStart(8)} \xB7 `), /* @__PURE__ */ import_react4.default.createElement(
45898
- Text,
45899
+ return /* @__PURE__ */ import_react4.default.createElement(W, null, /* @__PURE__ */ import_react4.default.createElement(L, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react4.default.createElement(L, { color: FG.meta }, info.id.slice(0, 7).padEnd(8)), /* @__PURE__ */ import_react4.default.createElement(L, { bold: focused, color: focused ? FG.strong : FG.sub }, info.name), /* @__PURE__ */ import_react4.default.createElement(L, { color: FG.faint }, tag2), /* @__PURE__ */ import_react4.default.createElement(W, { flexGrow: 1 }), /* @__PURE__ */ import_react4.default.createElement(L, { color: FG.faint }, `${time.padStart(8)} \xB7 `), /* @__PURE__ */ import_react4.default.createElement(
45900
+ L,
45899
45901
  {
45900
45902
  color: FG.faint
45901
45903
  },
@@ -45908,8 +45910,6 @@ var import_react6 = __toESM(require_react(), 1);
45908
45910
 
45909
45911
  // src/cli/ui/cards/ApprovalCard.tsx
45910
45912
  var import_react5 = __toESM(require_react(), 1);
45911
- var SEPARATOR_PAD = 6;
45912
- var MIN_SEPARATOR = 20;
45913
45913
  var TONE_PALETTE = {
45914
45914
  warn: { color: CARD.warn.color, glyph: "\u26A0" },
45915
45915
  error: { color: CARD.error.color, glyph: "\u2717" },
@@ -45933,10 +45933,20 @@ function ApprovalCard({
45933
45933
  const effectiveFooter = footerHint ?? t("cardLabels.defaultFooter");
45934
45934
  const palette = TONE_PALETTE[tone];
45935
45935
  const headerGlyph = glyph ?? palette.glyph;
45936
- const { stdout } = use_stdout_default();
45937
- const cols = stdout?.columns ?? 80;
45938
- const ruleWidth = Math.max(MIN_SEPARATOR, cols - SEPARATOR_PAD);
45939
- return /* @__PURE__ */ import_react5.default.createElement(Box_default, { flexDirection: "column", marginY: 1, flexShrink: 0 }, /* @__PURE__ */ import_react5.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react5.default.createElement(Text, { bold: true, color: palette.color }, headerGlyph), /* @__PURE__ */ import_react5.default.createElement(Text, { bold: true, color: FG.strong }, title2), metaRight !== void 0 && /* @__PURE__ */ import_react5.default.createElement(Text, { color: metaRightColor ?? FG.faint }, metaRight)), /* @__PURE__ */ import_react5.default.createElement(Box_default, { flexDirection: "column", paddingX: 2, marginTop: 1, flexShrink: 0 }, children), /* @__PURE__ */ import_react5.default.createElement(Box_default, { paddingX: 2, marginTop: 1, flexShrink: 0 }, /* @__PURE__ */ import_react5.default.createElement(Text, { color: FG.faint }, "\u2500".repeat(ruleWidth))), /* @__PURE__ */ import_react5.default.createElement(Box_default, { paddingX: 2, flexShrink: 0 }, /* @__PURE__ */ import_react5.default.createElement(Text, { color: FG.faint }, effectiveFooter)));
45936
+ return /* @__PURE__ */ import_react5.default.createElement(W, { flexDirection: "column", marginY: 1, flexShrink: 0 }, /* @__PURE__ */ import_react5.default.createElement(
45937
+ W,
45938
+ {
45939
+ flexDirection: "column",
45940
+ borderStyle: "round",
45941
+ borderLeft: false,
45942
+ borderRight: false,
45943
+ borderColor: palette.color,
45944
+ paddingX: 1,
45945
+ flexShrink: 0
45946
+ },
45947
+ /* @__PURE__ */ import_react5.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react5.default.createElement(L, { bold: true, color: palette.color }, headerGlyph), /* @__PURE__ */ import_react5.default.createElement(L, { bold: true, color: FG.strong }, title2), metaRight !== void 0 && /* @__PURE__ */ import_react5.default.createElement(L, { color: metaRightColor ?? FG.faint }, metaRight)),
45948
+ /* @__PURE__ */ import_react5.default.createElement(W, { flexDirection: "column", marginTop: 1, flexShrink: 0 }, children)
45949
+ ), /* @__PURE__ */ import_react5.default.createElement(W, { paddingX: 2, marginTop: 1, flexShrink: 0 }, /* @__PURE__ */ import_react5.default.createElement(L, { color: FG.faint }, effectiveFooter)));
45940
45950
  }
45941
45951
 
45942
45952
  // src/cli/ui/ChoiceConfirm.tsx
@@ -46033,14 +46043,14 @@ function AtMentionSuggestions({
46033
46043
  const shown = entries.slice(windowStart, windowStart + ROW_WINDOW);
46034
46044
  const hiddenAbove = windowStart;
46035
46045
  const hiddenBelow = total - windowStart - shown.length;
46036
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, { flexDirection: "column", paddingX: 1, marginTop: 1 }, /* @__PURE__ */ import_react8.default.createElement(HeaderRow, { state: state2, hiddenAbove }), total === 0 ? /* @__PURE__ */ import_react8.default.createElement(EmptyRow, { state: state2, color }) : null, shown.map((entry, i) => /* @__PURE__ */ import_react8.default.createElement(
46046
+ return /* @__PURE__ */ import_react8.default.createElement(W, { flexDirection: "column", paddingX: 1, marginTop: 1 }, /* @__PURE__ */ import_react8.default.createElement(HeaderRow, { state: state2, hiddenAbove }), total === 0 ? /* @__PURE__ */ import_react8.default.createElement(EmptyRow, { state: state2, color }) : null, shown.map((entry, i) => /* @__PURE__ */ import_react8.default.createElement(
46037
46047
  EntryRow,
46038
46048
  {
46039
46049
  key: `${entry.insertPath}:${entry.isDir ? "d" : "f"}`,
46040
46050
  entry,
46041
46051
  isSelected: windowStart + i === selectedIndex
46042
46052
  }
46043
- )), hiddenBelow > 0 ? /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, ` \u2193 ${hiddenBelow} below`) : null, /* @__PURE__ */ import_react8.default.createElement(FooterRow, { isBrowse, hasFolder: shown.some((e) => e.isDir) }));
46053
+ )), hiddenBelow > 0 ? /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, ` \u2193 ${hiddenBelow} below`) : null, /* @__PURE__ */ import_react8.default.createElement(FooterRow, { isBrowse, hasFolder: shown.some((e) => e.isDir) }));
46044
46054
  }
46045
46055
  function HeaderRow({
46046
46056
  state: state2,
@@ -46048,35 +46058,35 @@ function HeaderRow({
46048
46058
  }) {
46049
46059
  const color = useColor();
46050
46060
  const total = state2.entries.length;
46051
- const lead = /* @__PURE__ */ import_react8.default.createElement(Text, { color: color.primary, bold: true }, "@ ");
46061
+ const lead = /* @__PURE__ */ import_react8.default.createElement(L, { color: color.primary, bold: true }, "@ ");
46052
46062
  if (state2.kind === "browse") {
46053
46063
  const where = state2.baseDir === "" ? "/" : `${state2.baseDir}/`;
46054
46064
  const counter = state2.loading ? t("atMentions.loading") : t(total === 1 ? "atMentions.entrySingular" : "atMentions.entryPlural", { count: total });
46055
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, null, lead, /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, `${where} ${counter}`), hiddenAbove > 0 ? /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, ` \u2191 ${hiddenAbove} above`) : null);
46065
+ return /* @__PURE__ */ import_react8.default.createElement(W, null, lead, /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, `${where} ${counter}`), hiddenAbove > 0 ? /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, ` \u2191 ${hiddenAbove} above`) : null);
46056
46066
  }
46057
46067
  const status2 = state2.searching ? `${t("atMentions.searching")} ${state2.scanned} ${t("atMentions.scanned")} \xB7 ${total} ${total === 1 ? t("atMentions.match") : t("atMentions.matches")}` : `${total} ${total === 1 ? t("atMentions.match") : t("atMentions.matches")} ${t("atMentions.forFilter", { filter: state2.filter })}`;
46058
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, null, lead, /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, status2), hiddenAbove > 0 ? /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, ` \u2191 ${hiddenAbove} above`) : null);
46068
+ return /* @__PURE__ */ import_react8.default.createElement(W, null, lead, /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, status2), hiddenAbove > 0 ? /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, ` \u2191 ${hiddenAbove} above`) : null);
46059
46069
  }
46060
46070
  function EmptyRow({ state: state2, color }) {
46061
46071
  if (state2.kind === "browse") {
46062
46072
  if (state2.loading) return null;
46063
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, null, /* @__PURE__ */ import_react8.default.createElement(Text, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react8.default.createElement(Text, null, " "), /* @__PURE__ */ import_react8.default.createElement(Text, { color: color.warn }, t("atMentions.emptyDir")));
46073
+ return /* @__PURE__ */ import_react8.default.createElement(W, null, /* @__PURE__ */ import_react8.default.createElement(L, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react8.default.createElement(L, null, " "), /* @__PURE__ */ import_react8.default.createElement(L, { color: color.warn }, t("atMentions.emptyDir")));
46064
46074
  }
46065
46075
  if (state2.searching) {
46066
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, null, /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, t("atMentions.scanning")));
46076
+ return /* @__PURE__ */ import_react8.default.createElement(W, null, /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, t("atMentions.scanning")));
46067
46077
  }
46068
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, null, /* @__PURE__ */ import_react8.default.createElement(Text, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react8.default.createElement(Text, null, " "), /* @__PURE__ */ import_react8.default.createElement(Text, { color: color.warn }, t("atMentions.noMatch", { filter: state2.filter })));
46078
+ return /* @__PURE__ */ import_react8.default.createElement(W, null, /* @__PURE__ */ import_react8.default.createElement(L, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react8.default.createElement(L, null, " "), /* @__PURE__ */ import_react8.default.createElement(L, { color: color.warn }, t("atMentions.noMatch", { filter: state2.filter })));
46069
46079
  }
46070
46080
  function EntryRow({ entry, isSelected }) {
46071
46081
  const color = useColor();
46072
46082
  const cursor = isSelected ? `${GLYPH.cur} ` : " ";
46073
46083
  const labelColor = entry.isDir ? color.accent : color.primary;
46074
46084
  const labelText = entry.isDir ? `${entry.label}/` : entry.label;
46075
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, { backgroundColor: isSelected ? SURFACE.bgElev : void 0 }, /* @__PURE__ */ import_react8.default.createElement(Text, { color: isSelected ? color.primary : color.info, bold: isSelected }, cursor), /* @__PURE__ */ import_react8.default.createElement(Text, { color: labelColor, bold: isSelected }, labelText.padEnd(20)), entry.dirSuffix ? /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, ` ${entry.dirSuffix}`) : null);
46085
+ return /* @__PURE__ */ import_react8.default.createElement(W, { backgroundColor: isSelected ? SURFACE.bgElev : void 0 }, /* @__PURE__ */ import_react8.default.createElement(L, { color: isSelected ? color.primary : color.info, bold: isSelected }, cursor), /* @__PURE__ */ import_react8.default.createElement(L, { color: labelColor, bold: isSelected }, labelText.padEnd(20)), entry.dirSuffix ? /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, ` ${entry.dirSuffix}`) : null);
46076
46086
  }
46077
46087
  function FooterRow({ isBrowse, hasFolder }) {
46078
46088
  const hintKey = isBrowse && hasFolder ? "atMentions.footerBrowse" : "atMentions.footerInsert";
46079
- return /* @__PURE__ */ import_react8.default.createElement(Box_default, { marginTop: 0 }, /* @__PURE__ */ import_react8.default.createElement(Text, { dimColor: true }, ` ${t(hintKey)}`));
46089
+ return /* @__PURE__ */ import_react8.default.createElement(W, { marginTop: 0 }, /* @__PURE__ */ import_react8.default.createElement(L, { dimColor: true }, ` ${t(hintKey)}`));
46080
46090
  }
46081
46091
 
46082
46092
  // src/cli/ui/PromptInput.tsx
@@ -46518,13 +46528,17 @@ function textToSegments(line, pastes) {
46518
46528
  // src/cli/ui/PromptInput.tsx
46519
46529
  var INLINE_PASTE_THRESHOLD = 200;
46520
46530
  var IME_GUARD_MS = 50;
46521
- var SYSTEM_CURSOR_SYNC_IDLE_MS = 120;
46522
46531
  function hasNonAscii(s) {
46523
46532
  for (let i = 0; i < s.length; i++) {
46524
46533
  if (s.charCodeAt(i) > 127) return true;
46525
46534
  }
46526
46535
  return false;
46527
46536
  }
46537
+ function isPotentialImeCommitInput(s) {
46538
+ if (s.length === 0) return false;
46539
+ if (hasNonAscii(s)) return true;
46540
+ return s.length > 1;
46541
+ }
46528
46542
  function shouldInlinePaste(content) {
46529
46543
  return !content.includes("\n") && content.length <= INLINE_PASTE_THRESHOLD;
46530
46544
  }
@@ -46551,8 +46565,7 @@ function PromptInput({
46551
46565
  }, [cursor, onCursorChange]);
46552
46566
  const pastesRef = (0, import_react9.useRef)(/* @__PURE__ */ new Map());
46553
46567
  const nextPasteIdRef = (0, import_react9.useRef)(0);
46554
- const lastCursorSyncRef = (0, import_react9.useRef)(null);
46555
- const lastNonAsciiInputAtRef = (0, import_react9.useRef)(0);
46568
+ const lastImeCommitInputAtRef = (0, import_react9.useRef)(0);
46556
46569
  const lastLocalValueRef = (0, import_react9.useRef)(value);
46557
46570
  const cursorRef = (0, import_react9.useRef)(cursor);
46558
46571
  cursorRef.current = cursor;
@@ -46586,8 +46599,8 @@ function PromptInput({
46586
46599
  if (ev.input.length > 0) registerPaste(ev.input);
46587
46600
  return;
46588
46601
  }
46589
- if (ev.input.length > 0 && hasNonAscii(ev.input)) {
46590
- lastNonAsciiInputAtRef.current = Date.now();
46602
+ if (isPotentialImeCommitInput(ev.input)) {
46603
+ lastImeCommitInputAtRef.current = Date.now();
46591
46604
  }
46592
46605
  const key = {
46593
46606
  input: ev.input,
@@ -46622,8 +46635,8 @@ function PromptInput({
46622
46635
  setCursor(action.cursor);
46623
46636
  }
46624
46637
  if (action.submit) {
46625
- if (Date.now() - lastNonAsciiInputAtRef.current < IME_GUARD_MS) {
46626
- lastNonAsciiInputAtRef.current = 0;
46638
+ if (Date.now() - lastImeCommitInputAtRef.current < IME_GUARD_MS) {
46639
+ lastImeCommitInputAtRef.current = 0;
46627
46640
  return;
46628
46641
  }
46629
46642
  const raw = action.submitValue ?? lastLocalValueRef.current;
@@ -46638,7 +46651,7 @@ function PromptInput({
46638
46651
  if (action.historyHandoff === "next") onHistoryNext?.();
46639
46652
  if (action.openExternalEditor) onOpenExternalEditor?.();
46640
46653
  }, inputActive);
46641
- const { stdout } = use_stdout_default();
46654
+ const { stdout } = bv();
46642
46655
  const cols = stdout?.columns ?? 80;
46643
46656
  const promptPrefix = "\u203A ";
46644
46657
  const continuationIndent = " ";
@@ -46651,148 +46664,144 @@ function PromptInput({
46651
46664
  const { line: cursorLine, col: cursorCol } = lineAndColumn(value, cursor);
46652
46665
  const renderItems = collapseLinesForDisplay(lines, cursorLine);
46653
46666
  const showHugeBufferHints = lines.length > 20;
46654
- const systemCursorSync = (() => {
46655
- const totalRows = stdout?.rows;
46656
- if (!totalRows || totalRows < 4) return null;
46657
- const linesBelow = Math.max(0, lines.length - 1 - cursorLine);
46658
- const largeHint = showHugeBufferHints ? 1 : 0;
46659
- const frozenHint = inputFrozen || steerBusy ? 2 : 0;
46660
- const modeRow = mode2 || model2 ? 1 : 0;
46661
- const rowsInsideBelow = linesBelow + largeHint + 2 + modeRow + frozenHint;
46662
- const rowsBelow = rowsInsideBelow + rowsAfter;
46663
- const targetRow = Math.max(1, totalRows - rowsBelow);
46664
- const cursorLineText = cursorLine >= 0 && cursorLine < lines.length ? lines[cursorLine] : "";
46665
- const textBeforeCursor = cursorLineText.slice(0, cursorCol);
46666
- const cursorCells = stringCells(textBeforeCursor, pastesRef.current);
46667
- const targetCol = 1 + 1 + 2 + cursorCells;
46668
- return `\x1B[${targetRow};${targetCol}H`;
46667
+ const borderLabel = (() => {
46668
+ const parts = [];
46669
+ if (planMode) parts.push(source_default.hex(TONE.warn)(`[${t("statsPanel.modePlan")}]`));
46670
+ if (isHistoryMode) parts.push(source_default.hex(TONE.accent)("\u2191 history"));
46671
+ if (mode2) parts.push(source_default.hex(TONE.brand)(mode2));
46672
+ if (model2) parts.push(source_default.hex(FG.faint)(model2));
46673
+ return parts.length > 0 ? ` ${parts.join(source_default.hex(FG.faint)(" \xB7 "))} ` : void 0;
46669
46674
  })();
46670
- (0, import_react9.useEffect)(() => {
46671
- if (systemCursorSync === null || lastCursorSyncRef.current === systemCursorSync) return;
46672
- const timer = setTimeout(() => {
46673
- if (lastCursorSyncRef.current === systemCursorSync) return;
46674
- stdout.write(systemCursorSync);
46675
- lastCursorSyncRef.current = systemCursorSync;
46676
- }, SYSTEM_CURSOR_SYNC_IDLE_MS);
46677
- return () => clearTimeout(timer);
46678
- }, [systemCursorSync, stdout]);
46679
- return /* @__PURE__ */ import_react9.default.createElement(Box_default, { flexDirection: "row" }, /* @__PURE__ */ import_react9.default.createElement(Box_default, { width: 1, backgroundColor: TONE.brand }), /* @__PURE__ */ import_react9.default.createElement(Box_default, { flexDirection: "column", flexGrow: 1, paddingX: 1, backgroundColor: SURFACE.bgInput }, /* @__PURE__ */ import_react9.default.createElement(Box_default, { height: 1 }), (() => {
46680
- const rows = [];
46681
- let firstRowEmitted = false;
46682
- for (let renderIdx = 0; renderIdx < renderItems.length; renderIdx++) {
46683
- const item = renderItems[renderIdx];
46684
- if (item.kind === "skip") {
46685
- rows.push(
46686
- /* @__PURE__ */ import_react9.default.createElement(Box_default, { key: `skip-${renderIdx}` }, /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, continuationIndent), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, `[\u2026 ${item.linesHidden} line${item.linesHidden === 1 ? "" : "s"} hidden \u2014 full content kept, submitted on Enter \u2026]`))
46687
- );
46688
- continue;
46689
- }
46690
- const i = item.originalIndex;
46691
- const line = item.line;
46692
- const isCursorLine = i === cursorLine;
46693
- const showPlaceholder = i === 0 && value.length === 0;
46694
- if (showPlaceholder) {
46695
- rows.push(
46696
- /* @__PURE__ */ import_react9.default.createElement(
46697
- PromptLine,
46698
- {
46699
- key: `ln-${i}-text-0`,
46700
- line: "",
46701
- isFirst: true,
46702
- isCursorLine: isCursorLine && inputActive,
46703
- cursorCol: isCursorLine ? cursorCol : null,
46704
- cursorVisible,
46705
- showPlaceholder: true,
46706
- placeholderText: effectivePlaceholder,
46707
- promptPrefix,
46708
- continuationIndent,
46709
- visibleCells,
46710
- accentColor,
46711
- pastes: pastesRef.current,
46712
- disabled: disabled === true,
46713
- steerBusy
46714
- }
46715
- )
46716
- );
46717
- firstRowEmitted = true;
46718
- continue;
46719
- }
46720
- const segs = splitLineByPastes(line);
46721
- for (let segIdx = 0; segIdx < segs.length; segIdx++) {
46722
- const seg = segs[segIdx];
46723
- const isFirst = !firstRowEmitted;
46724
- firstRowEmitted = true;
46725
- if (seg.kind === "paste") {
46726
- const cursorOnIt = isCursorLine && cursorCol >= seg.startOffset && cursorCol <= seg.startOffset + 1;
46675
+ return /* @__PURE__ */ import_react9.default.createElement(
46676
+ W,
46677
+ {
46678
+ flexDirection: "column",
46679
+ paddingX: 1,
46680
+ borderStyle: "round",
46681
+ borderLeft: false,
46682
+ borderRight: false,
46683
+ borderColor: inputActive ? TONE.brand : FG.faint,
46684
+ borderText: borderLabel ? { content: borderLabel, position: "top", align: "end", offset: 2 } : void 0,
46685
+ width: "100%"
46686
+ },
46687
+ /* @__PURE__ */ import_react9.default.createElement(W, { flexDirection: "column", flexGrow: 1 }, (() => {
46688
+ const rows = [];
46689
+ let firstRowEmitted = false;
46690
+ for (let renderIdx = 0; renderIdx < renderItems.length; renderIdx++) {
46691
+ const item = renderItems[renderIdx];
46692
+ if (item.kind === "skip") {
46693
+ rows.push(
46694
+ /* @__PURE__ */ import_react9.default.createElement(W, { key: `skip-${renderIdx}` }, /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, continuationIndent), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, `[\u2026 ${item.linesHidden} line${item.linesHidden === 1 ? "" : "s"} hidden \u2014 full content kept, submitted on Enter \u2026]`))
46695
+ );
46696
+ continue;
46697
+ }
46698
+ const i = item.originalIndex;
46699
+ const line = item.line;
46700
+ const isCursorLine = i === cursorLine;
46701
+ const showPlaceholder = i === 0 && value.length === 0;
46702
+ if (showPlaceholder) {
46727
46703
  rows.push(
46728
46704
  /* @__PURE__ */ import_react9.default.createElement(
46729
- PasteChipRow,
46705
+ PromptLine,
46706
+ {
46707
+ key: `ln-${i}-text-0`,
46708
+ line: "",
46709
+ isFirst: true,
46710
+ isCursorLine: isCursorLine && inputActive,
46711
+ cursorCol: isCursorLine ? cursorCol : null,
46712
+ cursorVisible,
46713
+ showPlaceholder: true,
46714
+ placeholderText: effectivePlaceholder,
46715
+ promptPrefix,
46716
+ continuationIndent,
46717
+ visibleCells,
46718
+ accentColor,
46719
+ pastes: pastesRef.current,
46720
+ disabled: disabled === true,
46721
+ steerBusy
46722
+ }
46723
+ )
46724
+ );
46725
+ firstRowEmitted = true;
46726
+ continue;
46727
+ }
46728
+ const segs = splitLineByPastes(line);
46729
+ for (let segIdx = 0; segIdx < segs.length; segIdx++) {
46730
+ const seg = segs[segIdx];
46731
+ const isFirst = !firstRowEmitted;
46732
+ firstRowEmitted = true;
46733
+ if (seg.kind === "paste") {
46734
+ const cursorOnIt = isCursorLine && cursorCol >= seg.startOffset && cursorCol <= seg.startOffset + 1;
46735
+ rows.push(
46736
+ /* @__PURE__ */ import_react9.default.createElement(
46737
+ PasteChipRow,
46738
+ {
46739
+ key: `ln-${i}-paste-${segIdx}`,
46740
+ entry: pastesRef.current.get(seg.id),
46741
+ pasteId: seg.id,
46742
+ isFirst,
46743
+ active: cursorOnIt && inputActive,
46744
+ visibleCells,
46745
+ accentColor
46746
+ }
46747
+ )
46748
+ );
46749
+ continue;
46750
+ }
46751
+ const segHasCursor = isCursorLine && cursorCol >= seg.startOffset && cursorCol <= seg.startOffset + seg.text.length;
46752
+ rows.push(
46753
+ /* @__PURE__ */ import_react9.default.createElement(
46754
+ PromptLine,
46730
46755
  {
46731
- key: `ln-${i}-paste-${segIdx}`,
46732
- entry: pastesRef.current.get(seg.id),
46733
- pasteId: seg.id,
46756
+ key: `ln-${i}-text-${segIdx}`,
46757
+ line: seg.text,
46734
46758
  isFirst,
46735
- active: cursorOnIt && inputActive,
46759
+ isCursorLine: segHasCursor && inputActive,
46760
+ cursorCol: segHasCursor ? cursorCol - seg.startOffset : null,
46761
+ cursorVisible,
46762
+ showPlaceholder: false,
46763
+ placeholderText: "",
46764
+ promptPrefix,
46765
+ continuationIndent,
46736
46766
  visibleCells,
46737
- accentColor
46767
+ accentColor,
46768
+ pastes: pastesRef.current,
46769
+ disabled: disabled === true,
46770
+ steerBusy
46771
+ }
46772
+ )
46773
+ );
46774
+ }
46775
+ if (segs.length === 0) {
46776
+ const isFirst = !firstRowEmitted;
46777
+ firstRowEmitted = true;
46778
+ rows.push(
46779
+ /* @__PURE__ */ import_react9.default.createElement(
46780
+ PromptLine,
46781
+ {
46782
+ key: `ln-${i}-empty`,
46783
+ line: "",
46784
+ isFirst,
46785
+ isCursorLine: isCursorLine && inputActive,
46786
+ cursorCol: isCursorLine ? 0 : null,
46787
+ cursorVisible,
46788
+ showPlaceholder: false,
46789
+ placeholderText: "",
46790
+ promptPrefix,
46791
+ continuationIndent,
46792
+ visibleCells,
46793
+ accentColor,
46794
+ pastes: pastesRef.current,
46795
+ disabled: disabled === true,
46796
+ steerBusy
46738
46797
  }
46739
46798
  )
46740
46799
  );
46741
- continue;
46742
46800
  }
46743
- const segHasCursor = isCursorLine && cursorCol >= seg.startOffset && cursorCol <= seg.startOffset + seg.text.length;
46744
- rows.push(
46745
- /* @__PURE__ */ import_react9.default.createElement(
46746
- PromptLine,
46747
- {
46748
- key: `ln-${i}-text-${segIdx}`,
46749
- line: seg.text,
46750
- isFirst,
46751
- isCursorLine: segHasCursor && inputActive,
46752
- cursorCol: segHasCursor ? cursorCol - seg.startOffset : null,
46753
- cursorVisible,
46754
- showPlaceholder: false,
46755
- placeholderText: "",
46756
- promptPrefix,
46757
- continuationIndent,
46758
- visibleCells,
46759
- accentColor,
46760
- pastes: pastesRef.current,
46761
- disabled: disabled === true,
46762
- steerBusy
46763
- }
46764
- )
46765
- );
46766
- }
46767
- if (segs.length === 0) {
46768
- const isFirst = !firstRowEmitted;
46769
- firstRowEmitted = true;
46770
- rows.push(
46771
- /* @__PURE__ */ import_react9.default.createElement(
46772
- PromptLine,
46773
- {
46774
- key: `ln-${i}-empty`,
46775
- line: "",
46776
- isFirst,
46777
- isCursorLine: isCursorLine && inputActive,
46778
- cursorCol: isCursorLine ? 0 : null,
46779
- cursorVisible,
46780
- showPlaceholder: false,
46781
- placeholderText: "",
46782
- promptPrefix,
46783
- continuationIndent,
46784
- visibleCells,
46785
- accentColor,
46786
- pastes: pastesRef.current,
46787
- disabled: disabled === true,
46788
- steerBusy
46789
- }
46790
- )
46791
- );
46792
46801
  }
46793
- }
46794
- return rows;
46795
- })(), showHugeBufferHints && inputActive ? /* @__PURE__ */ import_react9.default.createElement(Box_default, null, /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, ` [${lines.length} lines \xB7 PgUp/PgDn jump \xB7 Ctrl+U clear \xB7 Ctrl+W del word]`)) : null, /* @__PURE__ */ import_react9.default.createElement(Box_default, { height: 1 }), mode2 || model2 || isHistoryMode || planMode ? /* @__PURE__ */ import_react9.default.createElement(Box_default, null, isHistoryMode ? /* @__PURE__ */ import_react9.default.createElement(Text, { color: TONE.accent }, " \u2191 history") : null, /* @__PURE__ */ import_react9.default.createElement(Text, { color: TONE.brand }, mode2 || ""), planMode ? /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.body }, " [", t("statsPanel.modePlan"), "]") : null, mode2 && model2 ? /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, " \xB7 ") : null, model2 ? /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, model2) : null) : null, /* @__PURE__ */ import_react9.default.createElement(Box_default, { height: 1 }), inputFrozen ? /* @__PURE__ */ import_react9.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, " esc to stop")) : null, steerBusy ? /* @__PURE__ */ import_react9.default.createElement(Box_default, { marginTop: 1, flexDirection: "row" }, /* @__PURE__ */ import_react9.default.createElement(Text, { color: TONE.accent }, " \u23CE "), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, t("composer.steerHint")), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, " \xB7 "), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, "esc to stop")) : null));
46802
+ return rows;
46803
+ })(), showHugeBufferHints && inputActive ? /* @__PURE__ */ import_react9.default.createElement(W, null, /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, ` [${lines.length} lines \xB7 PgUp/PgDn jump \xB7 Ctrl+U clear \xB7 Ctrl+W del word]`)) : null, inputFrozen ? /* @__PURE__ */ import_react9.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, " esc to stop")) : null, steerBusy ? /* @__PURE__ */ import_react9.default.createElement(W, { marginTop: 1, flexDirection: "row" }, /* @__PURE__ */ import_react9.default.createElement(L, { color: TONE.accent }, " \u23CE "), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, t("composer.steerHint")), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, " \xB7 "), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, "esc to stop")) : null)
46804
+ );
46796
46805
  }
46797
46806
  function splitLineByPastes(line) {
46798
46807
  const out = [];
@@ -46829,9 +46838,9 @@ function PasteChipRow({
46829
46838
  const leadColor = isFirst ? accentColor : FG.faint;
46830
46839
  const labelText = formatChipLabel(entry, pasteId, visibleCells - 6);
46831
46840
  if (active2) {
46832
- return /* @__PURE__ */ import_react9.default.createElement(Box_default, null, /* @__PURE__ */ import_react9.default.createElement(Text, { bold: true, color: leadColor }, lead), /* @__PURE__ */ import_react9.default.createElement(Text, { bold: true, color: accentColor }, "\u25B8 "), /* @__PURE__ */ import_react9.default.createElement(Text, { bold: true, color: "black", backgroundColor: accentColor }, ` ${labelText} `));
46841
+ return /* @__PURE__ */ import_react9.default.createElement(W, null, /* @__PURE__ */ import_react9.default.createElement(L, { bold: true, color: leadColor }, lead), /* @__PURE__ */ import_react9.default.createElement(L, { bold: true, color: accentColor }, "\u25B8 "), /* @__PURE__ */ import_react9.default.createElement(L, { bold: true, color: "black", backgroundColor: accentColor }, ` ${labelText} `));
46833
46842
  }
46834
- return /* @__PURE__ */ import_react9.default.createElement(Box_default, null, /* @__PURE__ */ import_react9.default.createElement(Text, { bold: true, color: leadColor }, lead), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, " "), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.meta }, "\u250C "), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.body, backgroundColor: SURFACE.bgElev }, `${labelText} `), /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.meta }, " \u2510"));
46843
+ return /* @__PURE__ */ import_react9.default.createElement(W, null, /* @__PURE__ */ import_react9.default.createElement(L, { bold: true, color: leadColor }, lead), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, " "), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.meta }, "\u250C "), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.body, backgroundColor: SURFACE.bgElev }, `${labelText} `), /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.meta }, " \u2510"));
46835
46844
  }
46836
46845
  function formatChipLabel(entry, pasteId, budget2) {
46837
46846
  if (!entry) return `\u{1F4CB} paste #${pasteId + 1} \xB7 (missing)`;
@@ -46877,10 +46886,10 @@ function PromptLine({
46877
46886
  }) {
46878
46887
  const promptActive = !disabled || !!steerBusy;
46879
46888
  if (showPlaceholder) {
46880
- return /* @__PURE__ */ import_react9.default.createElement(Box_default, null, /* @__PURE__ */ import_react9.default.createElement(Text, { bold: true, color: accentColor }, promptPrefix), promptActive ? /* @__PURE__ */ import_react9.default.createElement(Text, { color: accentColor }, cursorVisible ? "\u258C" : " ") : null, /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, placeholderText));
46889
+ return /* @__PURE__ */ import_react9.default.createElement(W, null, /* @__PURE__ */ import_react9.default.createElement(L, { bold: true, color: accentColor }, promptPrefix), promptActive ? /* @__PURE__ */ import_react9.default.createElement(L, { color: accentColor }, cursorVisible ? "\u258C" : " ") : null, /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, placeholderText));
46881
46890
  }
46882
46891
  const viewport = buildViewport(line, isCursorLine ? cursorCol : null, visibleCells, pastes);
46883
- return /* @__PURE__ */ import_react9.default.createElement(Box_default, null, isFirst ? /* @__PURE__ */ import_react9.default.createElement(Text, { bold: true, color: accentColor }, promptPrefix) : /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, continuationIndent), viewport.hiddenLeft ? /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, "\u2039") : null, /* @__PURE__ */ import_react9.default.createElement(
46892
+ return /* @__PURE__ */ import_react9.default.createElement(W, null, isFirst ? /* @__PURE__ */ import_react9.default.createElement(L, { bold: true, color: accentColor }, promptPrefix) : /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, continuationIndent), viewport.hiddenLeft ? /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, "\u2039") : null, /* @__PURE__ */ import_react9.default.createElement(
46884
46893
  ViewportContent,
46885
46894
  {
46886
46895
  segments: viewport.segments,
@@ -46888,7 +46897,7 @@ function PromptLine({
46888
46897
  accentColor,
46889
46898
  cursorVisible
46890
46899
  }
46891
- ), viewport.hiddenRight ? /* @__PURE__ */ import_react9.default.createElement(Text, { color: FG.faint }, "\u203A") : null);
46900
+ ), viewport.hiddenRight ? /* @__PURE__ */ import_react9.default.createElement(L, { color: FG.faint }, "\u203A") : null);
46892
46901
  }
46893
46902
  function ViewportContent({
46894
46903
  segments,
@@ -46917,7 +46926,7 @@ function ViewportContent({
46917
46926
  if (seg.kind === "paste") {
46918
46927
  out.push(
46919
46928
  /* @__PURE__ */ import_react9.default.createElement(
46920
- Text,
46929
+ L,
46921
46930
  {
46922
46931
  key: `p-${i}-cursor`,
46923
46932
  color: FG.body,
@@ -46934,26 +46943,26 @@ function ViewportContent({
46934
46943
  const offsetIntoSeg = cursorCell - cells;
46935
46944
  const split = splitTextByCells(seg.text, offsetIntoSeg);
46936
46945
  if (split.before.length > 0) {
46937
- out.push(/* @__PURE__ */ import_react9.default.createElement(Text, { key: `t-${i}-b` }, split.before));
46946
+ out.push(/* @__PURE__ */ import_react9.default.createElement(L, { key: `t-${i}-b` }, split.before));
46938
46947
  }
46939
46948
  if (split.atCursor.length > 0) {
46940
46949
  out.push(
46941
- /* @__PURE__ */ import_react9.default.createElement(Text, { key: `t-${i}-c`, inverse: cursorVisible, color: accentColor }, split.atCursor)
46950
+ /* @__PURE__ */ import_react9.default.createElement(L, { key: `t-${i}-c`, inverse: cursorVisible, color: accentColor }, split.atCursor)
46942
46951
  );
46943
46952
  } else {
46944
46953
  out.push(
46945
- /* @__PURE__ */ import_react9.default.createElement(Text, { key: `t-${i}-c-eol`, color: accentColor }, cursorVisible ? "\u258C" : " ")
46954
+ /* @__PURE__ */ import_react9.default.createElement(L, { key: `t-${i}-c-eol`, color: accentColor }, cursorVisible ? "\u258C" : " ")
46946
46955
  );
46947
46956
  }
46948
46957
  if (split.after.length > 0) {
46949
- out.push(/* @__PURE__ */ import_react9.default.createElement(Text, { key: `t-${i}-a` }, split.after));
46958
+ out.push(/* @__PURE__ */ import_react9.default.createElement(L, { key: `t-${i}-a` }, split.after));
46950
46959
  }
46951
46960
  placed = true;
46952
46961
  cells += segCells;
46953
46962
  }
46954
46963
  if (!placed) {
46955
46964
  out.push(
46956
- /* @__PURE__ */ import_react9.default.createElement(Text, { key: "cursor-eol", color: accentColor }, cursorVisible ? "\u258C" : " ")
46965
+ /* @__PURE__ */ import_react9.default.createElement(L, { key: "cursor-eol", color: accentColor }, cursorVisible ? "\u258C" : " ")
46957
46966
  );
46958
46967
  }
46959
46968
  return /* @__PURE__ */ import_react9.default.createElement(import_react9.default.Fragment, null, out);
@@ -46996,9 +47005,9 @@ function charCellsForText(ch) {
46996
47005
  }
46997
47006
  function renderSegment(seg, key, _inverse) {
46998
47007
  if (seg.kind === "text") {
46999
- return /* @__PURE__ */ import_react9.default.createElement(Text, { key: `s-${key}`, color: FG.body }, seg.text);
47008
+ return /* @__PURE__ */ import_react9.default.createElement(L, { key: `s-${key}`, color: FG.body }, seg.text);
47000
47009
  }
47001
- return /* @__PURE__ */ import_react9.default.createElement(Text, { key: `s-${key}`, backgroundColor: SURFACE.bgElev, color: FG.body }, seg.label);
47010
+ return /* @__PURE__ */ import_react9.default.createElement(L, { key: `s-${key}`, backgroundColor: SURFACE.bgElev, color: FG.body }, seg.label);
47002
47011
  }
47003
47012
  var COLLAPSE_THRESHOLD = 20;
47004
47013
  var COLLAPSE_HEAD_LINES = 3;
@@ -47074,7 +47083,7 @@ var SHORTCUT_GROUPS = [
47074
47083
  ];
47075
47084
  function ShortcutsHelpModal() {
47076
47085
  return /* @__PURE__ */ import_react10.default.createElement(
47077
- Box_default,
47086
+ W,
47078
47087
  {
47079
47088
  flexDirection: "column",
47080
47089
  borderStyle: "round",
@@ -47083,16 +47092,16 @@ function ShortcutsHelpModal() {
47083
47092
  paddingY: 0,
47084
47093
  backgroundColor: SURFACE.bg
47085
47094
  },
47086
- /* @__PURE__ */ import_react10.default.createElement(Box_default, { justifyContent: "center" }, /* @__PURE__ */ import_react10.default.createElement(Text, { bold: true, color: "#649ed2" }, ` ${t("shortcutsHelp.title")} `)),
47095
+ /* @__PURE__ */ import_react10.default.createElement(W, { justifyContent: "center" }, /* @__PURE__ */ import_react10.default.createElement(L, { bold: true, color: "#649ed2" }, ` ${t("shortcutsHelp.title")} `)),
47087
47096
  SHORTCUT_GROUPS.map((group, groupIdx) => /* @__PURE__ */ import_react10.default.createElement(
47088
- Box_default,
47097
+ W,
47089
47098
  {
47090
47099
  key: group.titleKey,
47091
47100
  flexDirection: "column",
47092
47101
  marginBottom: groupIdx < SHORTCUT_GROUPS.length - 1 ? 0 : 0
47093
47102
  },
47094
- /* @__PURE__ */ import_react10.default.createElement(Text, { color: TONE.accent }, ` ${t(group.titleKey)}`),
47095
- group.items.map((item) => /* @__PURE__ */ import_react10.default.createElement(Box_default, { key: item.keys }, /* @__PURE__ */ import_react10.default.createElement(Text, { bold: true, color: "#649ed2" }, ` ${item.keys}`), /* @__PURE__ */ import_react10.default.createElement(Text, { color: FG.faint }, ` ${t(item.descKey)}`)))
47103
+ /* @__PURE__ */ import_react10.default.createElement(L, { color: TONE.accent }, ` ${t(group.titleKey)}`),
47104
+ group.items.map((item) => /* @__PURE__ */ import_react10.default.createElement(W, { key: item.keys }, /* @__PURE__ */ import_react10.default.createElement(L, { bold: true, color: "#649ed2" }, ` ${item.keys}`), /* @__PURE__ */ import_react10.default.createElement(L, { color: FG.faint }, ` ${t(item.descKey)}`)))
47096
47105
  ))
47097
47106
  );
47098
47107
  }
@@ -47108,13 +47117,23 @@ function SlashArgPicker({
47108
47117
  pathCandidates
47109
47118
  }) {
47110
47119
  const color = useColor();
47111
- const headerRow = /* @__PURE__ */ import_react11.default.createElement(Box_default, null, /* @__PURE__ */ import_react11.default.createElement(Text, { color: color.accent, bold: true }, "/ "), /* @__PURE__ */ import_react11.default.createElement(Text, { color: color.accent, bold: true }, `/${spec.cmd}`), spec.argsHint ? /* @__PURE__ */ import_react11.default.createElement(Text, { dimColor: true }, ` ${spec.argsHint}`) : null, /* @__PURE__ */ import_react11.default.createElement(Text, { dimColor: true }, ` ${spec.summary}`));
47120
+ const headerArgsHint = (() => {
47121
+ const argsKey = `slash.${spec.cmd}.argsHint`;
47122
+ const translatedArgs = t(argsKey);
47123
+ return translatedArgs === argsKey ? spec.argsHint ?? "" : translatedArgs;
47124
+ })();
47125
+ const headerSummary = (() => {
47126
+ const descKey = `slash.${spec.cmd}.description`;
47127
+ const translated = t(descKey);
47128
+ return translated === descKey ? spec.summary : translated;
47129
+ })();
47130
+ const headerRow = /* @__PURE__ */ import_react11.default.createElement(W, null, /* @__PURE__ */ import_react11.default.createElement(L, { color: color.accent, bold: true }, "/ "), /* @__PURE__ */ import_react11.default.createElement(L, { color: color.accent, bold: true }, `/${spec.cmd}`), headerArgsHint ? /* @__PURE__ */ import_react11.default.createElement(L, { dimColor: true }, ` ${headerArgsHint}`) : null, /* @__PURE__ */ import_react11.default.createElement(L, { dimColor: true }, ` ${headerSummary}`));
47112
47131
  if (kind === "hint") {
47113
- return /* @__PURE__ */ import_react11.default.createElement(Box_default, { paddingX: 1, marginTop: 1 }, headerRow);
47132
+ return /* @__PURE__ */ import_react11.default.createElement(W, { paddingX: 1, marginTop: 1 }, headerRow);
47114
47133
  }
47115
47134
  if (matches === null) return null;
47116
47135
  if (matches.length === 0) {
47117
- return /* @__PURE__ */ import_react11.default.createElement(Box_default, { flexDirection: "column", paddingX: 1, marginTop: 1 }, headerRow, /* @__PURE__ */ import_react11.default.createElement(Box_default, null, /* @__PURE__ */ import_react11.default.createElement(Text, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react11.default.createElement(Text, { color: color.warn }, t("slashArgPicker.noMatch", { partial })), /* @__PURE__ */ import_react11.default.createElement(Text, { dimColor: true }, t("slashArgPicker.keepTyping"))));
47136
+ return /* @__PURE__ */ import_react11.default.createElement(W, { flexDirection: "column", paddingX: 1, marginTop: 1 }, headerRow, /* @__PURE__ */ import_react11.default.createElement(W, null, /* @__PURE__ */ import_react11.default.createElement(L, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react11.default.createElement(L, { color: color.warn }, t("slashArgPicker.noMatch", { partial })), /* @__PURE__ */ import_react11.default.createElement(L, { dimColor: true }, t("slashArgPicker.keepTyping"))));
47118
47137
  }
47119
47138
  const MAX = 8;
47120
47139
  const total = matches.length;
@@ -47122,11 +47141,11 @@ function SlashArgPicker({
47122
47141
  const shown = matches.slice(windowStart, windowStart + MAX);
47123
47142
  const hiddenAbove = windowStart;
47124
47143
  const hiddenBelow = total - windowStart - shown.length;
47125
- return /* @__PURE__ */ import_react11.default.createElement(Box_default, { flexDirection: "column", paddingX: 1, marginTop: 1 }, headerRow, hiddenAbove > 0 ? /* @__PURE__ */ import_react11.default.createElement(Text, { dimColor: true }, t("slashArgPicker.above", { hidden: hiddenAbove })) : null, shown.map((value, i) => {
47144
+ return /* @__PURE__ */ import_react11.default.createElement(W, { flexDirection: "column", paddingX: 1, marginTop: 1 }, headerRow, hiddenAbove > 0 ? /* @__PURE__ */ import_react11.default.createElement(L, { dimColor: true }, t("slashArgPicker.above", { hidden: hiddenAbove })) : null, shown.map((value, i) => {
47126
47145
  const idx = windowStart + i;
47127
47146
  const isDir = pathCandidates?.[idx]?.isDir ?? false;
47128
47147
  return /* @__PURE__ */ import_react11.default.createElement(ArgRow, { key: value, value, isSelected: idx === selectedIndex, isDir });
47129
- }), hiddenBelow > 0 ? /* @__PURE__ */ import_react11.default.createElement(Text, { dimColor: true }, t("slashArgPicker.below", { hidden: hiddenBelow })) : null, /* @__PURE__ */ import_react11.default.createElement(Box_default, { marginTop: 0 }, /* @__PURE__ */ import_react11.default.createElement(Text, { dimColor: true }, t("slashArgPicker.footer"))));
47148
+ }), hiddenBelow > 0 ? /* @__PURE__ */ import_react11.default.createElement(L, { dimColor: true }, t("slashArgPicker.below", { hidden: hiddenBelow })) : null, /* @__PURE__ */ import_react11.default.createElement(W, { marginTop: 0 }, /* @__PURE__ */ import_react11.default.createElement(L, { dimColor: true }, t("slashArgPicker.footer"))));
47130
47149
  }
47131
47150
  function ArgRow({
47132
47151
  value,
@@ -47134,7 +47153,7 @@ function ArgRow({
47134
47153
  isDir
47135
47154
  }) {
47136
47155
  const color = useColor();
47137
- return /* @__PURE__ */ import_react11.default.createElement(Box_default, { backgroundColor: isSelected ? SURFACE.bgElev : void 0 }, /* @__PURE__ */ import_react11.default.createElement(Text, { color: isSelected ? color.primary : color.info, bold: isSelected }, isSelected ? `${GLYPH.cur} ` : " "), /* @__PURE__ */ import_react11.default.createElement(Text, { color: isSelected ? color.user : color.info, bold: isSelected, dimColor: !isSelected }, value), isDir ? /* @__PURE__ */ import_react11.default.createElement(Text, { dimColor: true }, "/") : null);
47156
+ return /* @__PURE__ */ import_react11.default.createElement(W, { backgroundColor: isSelected ? SURFACE.bgElev : void 0 }, /* @__PURE__ */ import_react11.default.createElement(L, { color: isSelected ? color.primary : color.info, bold: isSelected }, isSelected ? `${GLYPH.cur} ` : " "), /* @__PURE__ */ import_react11.default.createElement(L, { color: isSelected ? color.user : color.info, bold: isSelected, dimColor: !isSelected }, value), isDir ? /* @__PURE__ */ import_react11.default.createElement(L, { dimColor: true }, "/") : null);
47138
47157
  }
47139
47158
 
47140
47159
  // src/cli/ui/SlashSuggestions.tsx
@@ -47154,7 +47173,7 @@ function SlashSuggestions({
47154
47173
  advancedHidden
47155
47174
  }) {
47156
47175
  const color = useColor();
47157
- const { stdout } = use_stdout_default();
47176
+ const { stdout } = bv();
47158
47177
  const cols = stdout?.columns ?? 80;
47159
47178
  const [rememberedWindowStart, setRememberedWindowStart] = import_react12.default.useState(0);
47160
47179
  const maxRows = groupMode ? GROUP_MODE_MAX_ROWS : SEARCH_MODE_MAX_ROWS;
@@ -47171,17 +47190,17 @@ function SlashSuggestions({
47171
47190
  }, [windowStart]);
47172
47191
  if (matches === null) return null;
47173
47192
  if (matches.length === 0) {
47174
- return /* @__PURE__ */ import_react12.default.createElement(Box_default, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ import_react12.default.createElement(Text, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react12.default.createElement(Text, null, " "), /* @__PURE__ */ import_react12.default.createElement(Text, { color: color.warn }, t("slashSuggestions.noMatch")), /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true }, t("slashSuggestions.backspaceHint")));
47193
+ return /* @__PURE__ */ import_react12.default.createElement(W, { paddingX: 1, marginTop: 1 }, /* @__PURE__ */ import_react12.default.createElement(L, { color: color.warn, bold: true }, GLYPH.warn), /* @__PURE__ */ import_react12.default.createElement(L, null, " "), /* @__PURE__ */ import_react12.default.createElement(L, { color: color.warn }, t("slashSuggestions.noMatch")), /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true }, t("slashSuggestions.backspaceHint")));
47175
47194
  }
47176
47195
  const total = matches.length;
47177
47196
  const items = buildVisibleItems(matches, windowStart, maxRows, groupMode);
47178
47197
  const shownCommands = items.filter((item) => item.kind === "command");
47179
47198
  const hiddenAbove = windowStart;
47180
47199
  const hiddenBelow = total - windowStart - shownCommands.length;
47181
- return /* @__PURE__ */ import_react12.default.createElement(Box_default, { flexDirection: "column", paddingX: 1, marginTop: 1, flexShrink: 0, flexWrap: "nowrap" }, /* @__PURE__ */ import_react12.default.createElement(Box_default, null, /* @__PURE__ */ import_react12.default.createElement(Text, { color: color.accent, bold: true }, "/ "), /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true }, t(
47200
+ return /* @__PURE__ */ import_react12.default.createElement(W, { flexDirection: "column", paddingX: 1, marginTop: 1, flexShrink: 0, flexWrap: "nowrap" }, /* @__PURE__ */ import_react12.default.createElement(W, null, /* @__PURE__ */ import_react12.default.createElement(L, { color: color.accent, bold: true }, "/ "), /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true }, t(
47182
47201
  total === 1 ? "slashSuggestions.commandCount" : "slashSuggestions.commandCountPlural",
47183
47202
  { count: total }
47184
- )), hiddenAbove > 0 ? /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true }, t("slashSuggestions.aboveLabel", { count: hiddenAbove })) : null), items.map((item) => {
47203
+ )), hiddenAbove > 0 ? /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true }, t("slashSuggestions.aboveLabel", { count: hiddenAbove })) : null), items.map((item) => {
47185
47204
  if (item.kind === "group") {
47186
47205
  return /* @__PURE__ */ import_react12.default.createElement(GroupHeader, { key: `group:${item.group}:${item.beforeIndex}`, group: item.group });
47187
47206
  }
@@ -47194,7 +47213,7 @@ function SlashSuggestions({
47194
47213
  columns: cols
47195
47214
  }
47196
47215
  );
47197
- }), hiddenBelow > 0 ? /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true }, t("slashSuggestions.belowLabel", { count: hiddenBelow })) : null, groupMode && advancedHidden && advancedHidden > 0 ? /* @__PURE__ */ import_react12.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true }, t("slashSuggestions.advancedHint", { count: advancedHidden }))) : null, /* @__PURE__ */ import_react12.default.createElement(Box_default, { marginTop: 0 }, /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true }, t("slashSuggestions.footerHint"))));
47216
+ }), hiddenBelow > 0 ? /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true }, t("slashSuggestions.belowLabel", { count: hiddenBelow })) : null, groupMode && advancedHidden && advancedHidden > 0 ? /* @__PURE__ */ import_react12.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true }, t("slashSuggestions.advancedHint", { count: advancedHidden }))) : null, /* @__PURE__ */ import_react12.default.createElement(W, { marginTop: 0 }, /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true }, t("slashSuggestions.footerHint"))));
47198
47217
  }
47199
47218
  function computeWindowStart(matches, maxRows, selectedIndex, currentWindowStart, groupMode = false) {
47200
47219
  if (matches.length <= 0) return 0;
@@ -47226,7 +47245,7 @@ function shouldShowGroupHeader(matches, idx) {
47226
47245
  return idx === 0 || matches[idx]?.group !== matches[idx - 1]?.group;
47227
47246
  }
47228
47247
  function GroupHeader({ group }) {
47229
- return /* @__PURE__ */ import_react12.default.createElement(Box_default, { flexShrink: 0, height: 1, flexWrap: "nowrap" }, /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true, wrap: "truncate" }, ` ${groupLabel(group)}`));
47248
+ return /* @__PURE__ */ import_react12.default.createElement(W, { flexShrink: 0, height: 1, flexWrap: "nowrap" }, /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true, wrap: "truncate" }, ` ${groupLabel(group)}`));
47230
47249
  }
47231
47250
  function SuggestionRow({
47232
47251
  spec,
@@ -47244,7 +47263,7 @@ function SuggestionRow({
47244
47263
  const summaryBudget = Math.max(8, columns - reservedCells);
47245
47264
  const summaryText = truncateCells(`${summary}${aliasHint}`, summaryBudget);
47246
47265
  return /* @__PURE__ */ import_react12.default.createElement(
47247
- Box_default,
47266
+ W,
47248
47267
  {
47249
47268
  flexDirection: "row",
47250
47269
  flexWrap: "nowrap",
@@ -47253,11 +47272,11 @@ function SuggestionRow({
47253
47272
  minHeight: 1,
47254
47273
  backgroundColor: isSelected ? SURFACE.bgElev : void 0
47255
47274
  },
47256
- /* @__PURE__ */ import_react12.default.createElement(Text, { color: isSelected ? color.primary : color.info, bold: isSelected, wrap: "truncate" }, isSelected ? `${GLYPH.cur} ` : " "),
47257
- /* @__PURE__ */ import_react12.default.createElement(Text, { color: color.accent, bold: isSelected, wrap: "truncate" }, padOrTrim(name, COMMAND_NAME_CELLS)),
47258
- /* @__PURE__ */ import_react12.default.createElement(Text, { dimColor: true, wrap: "truncate" }, padOrTrim(argsSuffix, ARGS_CELLS)),
47259
- /* @__PURE__ */ import_react12.default.createElement(Text, { wrap: "truncate" }, " "),
47260
- /* @__PURE__ */ import_react12.default.createElement(Text, { color: isSelected ? color.user : color.info, dimColor: !isSelected, wrap: "truncate" }, summaryText)
47275
+ /* @__PURE__ */ import_react12.default.createElement(L, { color: isSelected ? color.primary : color.info, bold: isSelected, wrap: "truncate" }, isSelected ? `${GLYPH.cur} ` : " "),
47276
+ /* @__PURE__ */ import_react12.default.createElement(L, { color: color.accent, bold: isSelected, wrap: "truncate" }, padOrTrim(name, COMMAND_NAME_CELLS)),
47277
+ /* @__PURE__ */ import_react12.default.createElement(L, { dimColor: true, wrap: "truncate" }, padOrTrim(argsSuffix, ARGS_CELLS)),
47278
+ /* @__PURE__ */ import_react12.default.createElement(L, { wrap: "truncate" }, " "),
47279
+ /* @__PURE__ */ import_react12.default.createElement(L, { color: isSelected ? color.user : color.info, dimColor: !isSelected, wrap: "truncate" }, summaryText)
47261
47280
  );
47262
47281
  }
47263
47282
  function padOrTrim(value, cells) {
@@ -47283,20 +47302,9 @@ var import_react13 = __toESM(require_react(), 1);
47283
47302
  function isLegacyWindowsConsole(env = process.env, platform2 = process.platform) {
47284
47303
  return platform2 === "win32" && !env.WT_SESSION && !env.TERM_PROGRAM;
47285
47304
  }
47286
- function prefersReducedTerminalPaint(env = process.env, platform2 = process.platform) {
47287
- return isLegacyWindowsConsole(env, platform2) || Boolean(env.WT_SESSION) || Boolean(env.WSL_DISTRO_NAME) || Boolean(env.WSL_INTEROP);
47288
- }
47289
- function terminalFlushIntervalMs(env = process.env, platform2 = process.platform) {
47290
- const fallback = prefersReducedTerminalPaint(env, platform2) ? 150 : 50;
47291
- const raw = env.REASONIX_FLUSH_MS;
47292
- if (!raw) return fallback;
47293
- const parsed = Number(raw);
47294
- if (!Number.isFinite(parsed) || parsed < 16 || parsed > 1e3) return fallback;
47295
- return Math.round(parsed);
47296
- }
47297
47305
 
47298
47306
  // src/cli/ui/ticker.tsx
47299
- var FAST_TICK_MS = isLegacyWindowsConsole() ? 250 : 120;
47307
+ var FAST_TICK_MS = isLegacyWindowsConsole() ? 120 : 60;
47300
47308
  var SLOW_TICK_MS = 1e3;
47301
47309
  var TickerActiveContext = (0, import_react13.createContext)(true);
47302
47310
  function TickerProvider({ children, disabled }) {
@@ -47307,16 +47315,13 @@ function useTickerActive() {
47307
47315
  }
47308
47316
  function useTick() {
47309
47317
  const isActive = useTickerActive();
47310
- return useAnimation({ interval: FAST_TICK_MS, isActive }).frame;
47318
+ const [, time] = Wi(isActive ? FAST_TICK_MS : null);
47319
+ return isActive ? Math.floor(time / FAST_TICK_MS) : 0;
47311
47320
  }
47312
47321
  function useSlowTick() {
47313
47322
  const isActive = useTickerActive();
47314
- return useAnimation({ interval: SLOW_TICK_MS, isActive }).frame;
47315
- }
47316
- function useElapsedSeconds() {
47317
- const [start] = (0, import_react13.useState)(() => Date.now());
47318
- useSlowTick();
47319
- return Math.floor((Date.now() - start) / 1e3);
47323
+ const [, time] = Wi(isActive ? SLOW_TICK_MS : null);
47324
+ return isActive ? Math.floor(time / SLOW_TICK_MS) : 0;
47320
47325
  }
47321
47326
 
47322
47327
  // src/cli/ui/primitives/Countdown.tsx
@@ -47327,7 +47332,7 @@ function Countdown({
47327
47332
  }) {
47328
47333
  useSlowTick();
47329
47334
  const remainingSec = Math.max(0, Math.ceil((endsAt - Date.now()) / 1e3));
47330
- return /* @__PURE__ */ import_react14.default.createElement(Text, { bold: true, color, backgroundColor }, String(remainingSec));
47335
+ return /* @__PURE__ */ import_react14.default.createElement(L, { bold: true, color, backgroundColor }, String(remainingSec));
47331
47336
  }
47332
47337
 
47333
47338
  // src/cli/ui/state/provider.tsx
@@ -48005,23 +48010,23 @@ var DEFAULT_STATUS_BAR_CONFIG = {
48005
48010
  };
48006
48011
  var BG = SURFACE.bgElev;
48007
48012
  function Pill({ children }) {
48008
- return /* @__PURE__ */ import_react16.default.createElement(Box_default, { flexDirection: "row", flexShrink: 0 }, children);
48013
+ return /* @__PURE__ */ import_react16.default.createElement(W, { flexDirection: "row", flexShrink: 0 }, children);
48009
48014
  }
48010
48015
  function Gap() {
48011
- return /* @__PURE__ */ import_react16.default.createElement(Text, null, " ");
48016
+ return /* @__PURE__ */ import_react16.default.createElement(L, null, " ");
48012
48017
  }
48013
48018
  function StatusRow({
48014
48019
  statusBar = DEFAULT_STATUS_BAR_CONFIG
48015
48020
  }) {
48016
48021
  const status2 = useAgentState((s) => s.status);
48017
48022
  const session = useAgentState((s) => s.session);
48018
- const { stdout } = use_stdout_default();
48023
+ const { stdout } = bv();
48019
48024
  const cols = stdout?.columns ?? 80;
48020
48025
  const hasTurn = status2.cost > 0;
48021
48026
  const hasSession = status2.sessionCost > 0;
48022
48027
  const hasBalance = typeof status2.balance === "number";
48023
48028
  const showWallet = cols >= WALLET_MIN_COLS && (hasSession && statusBar.showSessionCost || hasBalance && statusBar.showBalance);
48024
- return /* @__PURE__ */ import_react16.default.createElement(Box_default, { flexDirection: "row", flexShrink: 0, marginTop: 1 }, /* @__PURE__ */ import_react16.default.createElement(Box_default, { flexDirection: "row", flexWrap: "wrap", flexGrow: 1 }, /* @__PURE__ */ import_react16.default.createElement(Text, null, " "), status2.recording ? /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(RecordingPill, { rec: status2.recording })) : status2.countdownSeconds !== void 0 ? /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(CountdownRow, { mode: status2.mode, secondsLeft: status2.countdownSeconds })) : /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(ModePill, { mode: status2.mode, network: status2.network, detail: status2.networkDetail })), /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.sub }, `${session.id} \xB7 ${session.branch}`)), hasTurn && statusBar.showTurnCost && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(Text, { bold: true, color: TONE.brand }, "\u25B8 "), /* @__PURE__ */ import_react16.default.createElement(Text, { bold: true, color: FG.body }, `${formatCost(status2.cost, status2.costDisplayCurrency ?? status2.balanceCurrency)} ${t("statusBar.turn")}`))), statusBar.showCacheHit && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: TONE.accent }, `${t("statusBar.cache")} ${Math.round(status2.cacheHit * 100)}%`))), statusBar.showCtxUsage && status2.promptTokens !== void 0 && status2.promptTokens > 0 && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(
48029
+ return /* @__PURE__ */ import_react16.default.createElement(W, { flexDirection: "row", flexShrink: 0, marginTop: 1 }, /* @__PURE__ */ import_react16.default.createElement(W, { flexDirection: "row", flexWrap: "wrap", flexGrow: 1 }, /* @__PURE__ */ import_react16.default.createElement(L, null, " "), status2.recording ? /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(RecordingPill, { rec: status2.recording })) : status2.countdownSeconds !== void 0 ? /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(CountdownRow, { mode: status2.mode, secondsLeft: status2.countdownSeconds })) : /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(ModePill, { mode: status2.mode, network: status2.network, detail: status2.networkDetail })), /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.sub }, `${session.id} \xB7 ${session.branch}`)), hasTurn && statusBar.showTurnCost && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(L, { bold: true, color: TONE.brand }, "\u25B8 "), /* @__PURE__ */ import_react16.default.createElement(L, { bold: true, color: FG.body }, `${formatCost(status2.cost, status2.costDisplayCurrency ?? status2.balanceCurrency)} ${t("statusBar.turn")}`))), statusBar.showCacheHit && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: TONE.accent }, `${t("statusBar.cache")} ${Math.round(status2.cacheHit * 100)}%`))), statusBar.showCtxUsage && status2.promptTokens !== void 0 && status2.promptTokens > 0 && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(
48025
48030
  CtxUsagePill,
48026
48031
  {
48027
48032
  tokens: status2.promptTokens,
@@ -48037,7 +48042,7 @@ function StatusRow({
48037
48042
  showSessionCost: statusBar.showSessionCost,
48038
48043
  showBalance: statusBar.showBalance
48039
48044
  }
48040
- )))), /* @__PURE__ */ import_react16.default.createElement(Box_default, { flexDirection: "row", flexShrink: 0 }, statusBar.showVersion && cols >= VERSION_MIN_COLS && /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.faint }, `v${VERSION}`)), statusBar.showFeedbackHint && cols >= FEEDBACK_HINT_MIN_COLS && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.meta }, "\u2691 "), /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.sub }, t("statusBar.shortcutsHint"))))));
48045
+ )))), /* @__PURE__ */ import_react16.default.createElement(W, { flexDirection: "row", flexShrink: 0 }, statusBar.showVersion && cols >= VERSION_MIN_COLS && /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.faint }, `v${VERSION}`)), statusBar.showFeedbackHint && cols >= FEEDBACK_HINT_MIN_COLS && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Gap, null), /* @__PURE__ */ import_react16.default.createElement(Pill, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.meta }, "\u2691 "), /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.sub }, t("statusBar.shortcutsHint"))))));
48041
48046
  }
48042
48047
  function CtxUsagePill({
48043
48048
  tokens,
@@ -48050,13 +48055,13 @@ function CtxUsagePill({
48050
48055
  const showTokens = cols >= CTX_TOKENS_MIN_COLS;
48051
48056
  const showBar = cols >= CTX_BAR_MIN_COLS;
48052
48057
  const filled = Math.round(CTX_BAR_CELLS * ratio);
48053
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.meta, wrap: "truncate" }, `${t("statusBar.ctx")} `), showBar && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color, wrap: "truncate" }, GLYPH.block.repeat(filled)), /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.faint, wrap: "truncate" }, GLYPH.shade1.repeat(CTX_BAR_CELLS - filled)), /* @__PURE__ */ import_react16.default.createElement(Text, { wrap: "truncate" }, " ")), /* @__PURE__ */ import_react16.default.createElement(Text, { color, wrap: "truncate" }, `${pct}%`), showTokens && /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.faint }, ` \xB7 ${formatTokens(tokens)}/${formatTokens(cap)}`));
48058
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.meta, wrap: "truncate" }, `${t("statusBar.ctx")} `), showBar && /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color, wrap: "truncate" }, GLYPH.block.repeat(filled)), /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.faint, wrap: "truncate" }, GLYPH.shade1.repeat(CTX_BAR_CELLS - filled)), /* @__PURE__ */ import_react16.default.createElement(L, { wrap: "truncate" }, " ")), /* @__PURE__ */ import_react16.default.createElement(L, { color, wrap: "truncate" }, `${pct}%`), showTokens && /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.faint }, ` \xB7 ${formatTokens(tokens)}/${formatTokens(cap)}`));
48054
48059
  }
48055
48060
  function McpLoadingPill({
48056
48061
  ready,
48057
48062
  total
48058
48063
  }) {
48059
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: TONE.brand, wrap: "truncate" }, "\u2301 "), /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.body }, `${t("statusBar.mcpLoading")} ${ready}/${total}`));
48064
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: TONE.brand, wrap: "truncate" }, "\u2301 "), /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.body }, `${t("statusBar.mcpLoading")} ${ready}/${total}`));
48060
48065
  }
48061
48066
  function WalletPill({
48062
48067
  sessionCostUsd,
@@ -48067,7 +48072,7 @@ function WalletPill({
48067
48072
  }) {
48068
48073
  const showSpent = showSessionCost && sessionCostUsd > 0;
48069
48074
  const showBalanceLine = showBalanceCfg && typeof balance === "number";
48070
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.meta, wrap: "truncate" }, "\u26C1 "), showSpent && /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.body }, `${formatCost(sessionCostUsd, currency, 2)} ${t("statusBar.spent")}`), showSpent && showBalanceLine && /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.meta, wrap: "truncate" }, " / "), showBalanceLine && /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.faint, wrap: "truncate" }, t("statusBar.left")), showBalanceLine && /* @__PURE__ */ import_react16.default.createElement(Text, { bold: true, color: balanceColor(balance, currency), wrap: "truncate" }, formatBalance(balance, currency, { fractionDigits: 2 })));
48075
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.meta, wrap: "truncate" }, "\u26C1 "), showSpent && /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.body }, `${formatCost(sessionCostUsd, currency, 2)} ${t("statusBar.spent")}`), showSpent && showBalanceLine && /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.meta, wrap: "truncate" }, " / "), showBalanceLine && /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.faint, wrap: "truncate" }, t("statusBar.left")), showBalanceLine && /* @__PURE__ */ import_react16.default.createElement(L, { bold: true, color: balanceColor(balance, currency), wrap: "truncate" }, formatBalance(balance, currency, { fractionDigits: 2 })));
48071
48076
  }
48072
48077
  function ModePill({
48073
48078
  mode: mode2,
@@ -48077,18 +48082,18 @@ function ModePill({
48077
48082
  const modeLabel = `${t("statusBar.editsLabel")}${mode2}`;
48078
48083
  if (network === "online") {
48079
48084
  const pill = modeGlyph(mode2);
48080
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: pill.color, wrap: "truncate" }, pill.glyph), /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.sub, wrap: "truncate" }, ` ${modeLabel}`));
48085
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: pill.color, wrap: "truncate" }, pill.glyph), /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.sub, wrap: "truncate" }, ` ${modeLabel}`));
48081
48086
  }
48082
48087
  const dot = networkDot(network);
48083
48088
  if (network === "slow") {
48084
48089
  const tail = detail ? ` \xB7 ${detail}` : "";
48085
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: dot.color, wrap: "truncate" }, dot.glyph), /* @__PURE__ */ import_react16.default.createElement(Text, { color: dot.color }, ` ${modeLabel} \xB7 ${t("statusBar.slow")}${tail}`));
48090
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: dot.color, wrap: "truncate" }, dot.glyph), /* @__PURE__ */ import_react16.default.createElement(L, { color: dot.color }, ` ${modeLabel} \xB7 ${t("statusBar.slow")}${tail}`));
48086
48091
  }
48087
48092
  if (network === "disconnected") {
48088
48093
  const tail = detail ? ` \xB7 ${detail}` : "";
48089
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: dot.color, wrap: "truncate" }, dot.glyph), /* @__PURE__ */ import_react16.default.createElement(Text, { color: dot.color, wrap: "truncate" }, ` ${t("statusBar.disconnect")}${tail}`));
48094
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: dot.color, wrap: "truncate" }, dot.glyph), /* @__PURE__ */ import_react16.default.createElement(L, { color: dot.color, wrap: "truncate" }, ` ${t("statusBar.disconnect")}${tail}`));
48090
48095
  }
48091
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: dot.color, wrap: "truncate" }, dot.glyph), /* @__PURE__ */ import_react16.default.createElement(Text, { color: dot.color, wrap: "truncate" }, ` ${t("statusBar.reconnecting")}`));
48096
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: dot.color, wrap: "truncate" }, dot.glyph), /* @__PURE__ */ import_react16.default.createElement(L, { color: dot.color, wrap: "truncate" }, ` ${t("statusBar.reconnecting")}`));
48092
48097
  }
48093
48098
  function CountdownRow({
48094
48099
  mode: mode2,
@@ -48096,11 +48101,11 @@ function CountdownRow({
48096
48101
  }) {
48097
48102
  const pill = modeGlyph(mode2);
48098
48103
  const endsAt = Date.now() + secondsLeft * 1e3;
48099
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { color: pill.color, wrap: "truncate" }, pill.glyph), /* @__PURE__ */ import_react16.default.createElement(Text, { color: FG.sub, wrap: "truncate" }, ` ${t("statusBar.editsLabel")}${mode2} \xB7 `), /* @__PURE__ */ import_react16.default.createElement(Text, { color: TONE.warn, wrap: "truncate" }, t("statusBar.approvingIn")), /* @__PURE__ */ import_react16.default.createElement(Countdown, { endsAt }), /* @__PURE__ */ import_react16.default.createElement(Text, { color: TONE.warn, wrap: "truncate" }, t("statusBar.escToInterrupt")));
48104
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { color: pill.color, wrap: "truncate" }, pill.glyph), /* @__PURE__ */ import_react16.default.createElement(L, { color: FG.sub, wrap: "truncate" }, ` ${t("statusBar.editsLabel")}${mode2} \xB7 `), /* @__PURE__ */ import_react16.default.createElement(L, { color: TONE.warn, wrap: "truncate" }, t("statusBar.approvingIn")), /* @__PURE__ */ import_react16.default.createElement(Countdown, { endsAt }), /* @__PURE__ */ import_react16.default.createElement(L, { color: TONE.warn, wrap: "truncate" }, t("statusBar.escToInterrupt")));
48100
48105
  }
48101
48106
  function RecordingPill({ rec }) {
48102
48107
  const sizeMb = (rec.sizeBytes / (1024 * 1024)).toFixed(1);
48103
- return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(Text, { bold: true, color: TONE.err, wrap: "truncate" }, t("statusBar.recordingGlyph")), /* @__PURE__ */ import_react16.default.createElement(Text, { color: TONE.err }, ` ${sizeMb}${t("statusBar.mb")} \xB7 ${rec.events}${t("statusBar.evt")}`));
48108
+ return /* @__PURE__ */ import_react16.default.createElement(import_react16.default.Fragment, null, /* @__PURE__ */ import_react16.default.createElement(L, { bold: true, color: TONE.err, wrap: "truncate" }, t("statusBar.recordingGlyph")), /* @__PURE__ */ import_react16.default.createElement(L, { color: TONE.err }, ` ${sizeMb}${t("statusBar.mb")} \xB7 ${rec.events}${t("statusBar.evt")}`));
48104
48109
  }
48105
48110
  function modeGlyph(mode2) {
48106
48111
  switch (mode2) {
@@ -48221,7 +48226,7 @@ var ComposerArea = import_react17.default.memo(
48221
48226
  slashArgSelected
48222
48227
  }) => {
48223
48228
  useRenderTrace("ComposerArea");
48224
- const inputArea = /* @__PURE__ */ import_react17.default.createElement(Box_default, { flexDirection: "column", flexShrink: 0, flexWrap: "nowrap" }, /* @__PURE__ */ import_react17.default.createElement(Box_default, { flexDirection: "column", flexShrink: 0, flexWrap: "nowrap" }, slashMatches !== null ? /* @__PURE__ */ import_react17.default.createElement(
48229
+ const inputArea = /* @__PURE__ */ import_react17.default.createElement(W, { flexDirection: "column", flexShrink: 0, flexWrap: "nowrap" }, /* @__PURE__ */ import_react17.default.createElement(W, { flexDirection: "column", flexShrink: 0, flexWrap: "nowrap" }, slashMatches !== null ? /* @__PURE__ */ import_react17.default.createElement(
48225
48230
  SlashSuggestions,
48226
48231
  {
48227
48232
  key: `slash-suggestions:${slashGroupMode ? "group" : "search"}`,
@@ -48265,13 +48270,9 @@ ComposerArea.displayName = "ComposerArea";
48265
48270
  function LoopStatusRow({
48266
48271
  loop: loop2
48267
48272
  }) {
48268
- const [, setTick] = import_react17.default.useState(0);
48269
- import_react17.default.useEffect(() => {
48270
- const id = setInterval(() => setTick((t2) => t2 + 1), 1e3);
48271
- return () => clearInterval(id);
48272
- }, []);
48273
+ useSlowTick();
48273
48274
  const nextFireMs = Math.max(0, loop2.nextFireAt - Date.now());
48274
- return /* @__PURE__ */ import_react17.default.createElement(Box_default, null, /* @__PURE__ */ import_react17.default.createElement(Text, { color: "cyan" }, `loop: ${formatLoopStatus(loop2.prompt, nextFireMs, loop2.iter)} \u2014 /loop stop or type to cancel`));
48275
+ return /* @__PURE__ */ import_react17.default.createElement(W, null, /* @__PURE__ */ import_react17.default.createElement(L, { color: "cyan" }, `loop: ${formatLoopStatus(loop2.prompt, nextFireMs, loop2.iter)} \u2014 /loop stop or type to cancel`));
48275
48276
  }
48276
48277
 
48277
48278
  // src/cli/ui/EditConfirm.tsx
@@ -48456,7 +48457,7 @@ function DenyContextInput({
48456
48457
  setValue((v) => v + ev.input);
48457
48458
  }
48458
48459
  });
48459
- return /* @__PURE__ */ import_react18.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react18.default.createElement(Box_default, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ import_react18.default.createElement(Text, { color: FG.sub }, description)), /* @__PURE__ */ import_react18.default.createElement(Box_default, null, /* @__PURE__ */ import_react18.default.createElement(Text, { bold: true, color: TONE.brand }, "\u203A "), /* @__PURE__ */ import_react18.default.createElement(Text, { color: FG.body }, value), /* @__PURE__ */ import_react18.default.createElement(Text, { backgroundColor: TONE.brand, color: "#000" }, " ")));
48460
+ return /* @__PURE__ */ import_react18.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react18.default.createElement(W, { flexDirection: "column", marginBottom: 1 }, /* @__PURE__ */ import_react18.default.createElement(L, { color: FG.sub }, description)), /* @__PURE__ */ import_react18.default.createElement(W, null, /* @__PURE__ */ import_react18.default.createElement(L, { bold: true, color: TONE.brand }, "\u203A "), /* @__PURE__ */ import_react18.default.createElement(L, { color: FG.body }, value), /* @__PURE__ */ import_react18.default.createElement(L, { backgroundColor: TONE.brand, color: "#000" }, " ")));
48460
48461
  }
48461
48462
 
48462
48463
  // src/cli/ui/SplitDiff.tsx
@@ -48516,11 +48517,11 @@ function wrapToCells(s, maxCells) {
48516
48517
 
48517
48518
  // src/cli/ui/SplitDiff.tsx
48518
48519
  function SplitDiff({ rows, totalCols }) {
48519
- const { stdout } = use_stdout_default();
48520
+ const { stdout } = bv();
48520
48521
  const cols = totalCols ?? stdout?.columns ?? 80;
48521
48522
  const innerCols = Math.max(40, cols - 6);
48522
48523
  const halfCols = Math.floor((innerCols - 3) / 2);
48523
- return /* @__PURE__ */ import_react19.default.createElement(Box_default, { flexDirection: "column" }, rows.map((row2, i) => /* @__PURE__ */ import_react19.default.createElement(Box_default, { key: `r-${i}-${row2.left.num ?? "p"}-${row2.right.num ?? "p"}` }, /* @__PURE__ */ import_react19.default.createElement(Cell, { side: row2.left, width: halfCols, which: "left" }), /* @__PURE__ */ import_react19.default.createElement(Text, { color: COLOR.info, dimColor: true }, " \u2502 "), /* @__PURE__ */ import_react19.default.createElement(Cell, { side: row2.right, width: halfCols, which: "right" }))));
48524
+ return /* @__PURE__ */ import_react19.default.createElement(W, { flexDirection: "column" }, rows.map((row2, i) => /* @__PURE__ */ import_react19.default.createElement(W, { key: `r-${i}-${row2.left.num ?? "p"}-${row2.right.num ?? "p"}` }, /* @__PURE__ */ import_react19.default.createElement(Cell, { side: row2.left, width: halfCols, which: "left" }), /* @__PURE__ */ import_react19.default.createElement(L, { color: COLOR.info, dimColor: true }, " \u2502 "), /* @__PURE__ */ import_react19.default.createElement(Cell, { side: row2.right, width: halfCols, which: "right" }))));
48524
48525
  }
48525
48526
  function Cell({
48526
48527
  side,
@@ -48539,22 +48540,22 @@ function Cell({
48539
48540
  const raw = side.text;
48540
48541
  const padded = padToCells(clipToCells(raw, inner), inner);
48541
48542
  if (side.kind === "del") {
48542
- return /* @__PURE__ */ import_react19.default.createElement(Text, { color: "#fbc8c8", backgroundColor: "#2a1212" }, `${numStr} ${sign} ${padded}`);
48543
+ return /* @__PURE__ */ import_react19.default.createElement(L, { color: "#fbc8c8", backgroundColor: "#2a1212" }, `${numStr} ${sign} ${padded}`);
48543
48544
  }
48544
48545
  if (side.kind === "add") {
48545
- return /* @__PURE__ */ import_react19.default.createElement(Text, { color: "#bef0c8", backgroundColor: "#0c2718" }, `${numStr} ${sign} ${padded}`);
48546
+ return /* @__PURE__ */ import_react19.default.createElement(L, { color: "#bef0c8", backgroundColor: "#0c2718" }, `${numStr} ${sign} ${padded}`);
48546
48547
  }
48547
48548
  if (side.kind === "pad") {
48548
- return /* @__PURE__ */ import_react19.default.createElement(Text, { color: COLOR.info, dimColor: true, italic: !!raw }, `${numStr} ${sign} ${padded}`);
48549
+ return /* @__PURE__ */ import_react19.default.createElement(L, { color: COLOR.info, dimColor: true, italic: !!raw }, `${numStr} ${sign} ${padded}`);
48549
48550
  }
48550
- return /* @__PURE__ */ import_react19.default.createElement(Text, { dimColor: true }, `${numStr} ${sign} ${padded}`);
48551
+ return /* @__PURE__ */ import_react19.default.createElement(L, { dimColor: true }, `${numStr} ${sign} ${padded}`);
48551
48552
  }
48552
48553
 
48553
48554
  // src/cli/ui/EditConfirm.tsx
48554
48555
  var MODAL_OVERHEAD_ROWS = 18;
48555
48556
  var MIN_DIFF_ROWS = 8;
48556
48557
  function EditConfirm({ block: block2, onChoose }) {
48557
- const { stdout } = use_stdout_default();
48558
+ const { stdout } = bv();
48558
48559
  const rows = stdout?.rows ?? 40;
48559
48560
  const allocated = Math.max(MODAL_OVERHEAD_ROWS + MIN_DIFF_ROWS, rows - 4);
48560
48561
  const budget2 = Math.max(MIN_DIFF_ROWS, allocated - MODAL_OVERHEAD_ROWS);
@@ -48661,12 +48662,12 @@ function EditConfirm({ block: block2, onChoose }) {
48661
48662
  metaRight: metaParts.join(" \xB7 "),
48662
48663
  footerHint: t("editConfirm.footer")
48663
48664
  },
48664
- hiddenAbove > 0 ? /* @__PURE__ */ import_react20.default.createElement(Text, { dimColor: true }, t(hiddenAbove === 1 ? "editConfirm.linesAbove" : "editConfirm.linesAbovePlural", {
48665
+ hiddenAbove > 0 ? /* @__PURE__ */ import_react20.default.createElement(L, { dimColor: true }, t(hiddenAbove === 1 ? "editConfirm.linesAbove" : "editConfirm.linesAbovePlural", {
48665
48666
  count: hiddenAbove
48666
48667
  })) : null,
48667
48668
  /* @__PURE__ */ import_react20.default.createElement(SplitDiff, { rows: visibleRows }),
48668
- /* @__PURE__ */ import_react20.default.createElement(Box_default, null, /* @__PURE__ */ import_react20.default.createElement(Text, { color: "#fbc8c8", backgroundColor: "#2a1212" }, t("editConfirm.oldLabel")), /* @__PURE__ */ import_react20.default.createElement(Text, null, " "), /* @__PURE__ */ import_react20.default.createElement(Text, { color: "#bef0c8", backgroundColor: "#0c2718" }, t("editConfirm.newLabel")), /* @__PURE__ */ import_react20.default.createElement(Text, { dimColor: true }, t("editConfirm.sideBySide"))),
48669
- hiddenBelow > 0 ? /* @__PURE__ */ import_react20.default.createElement(Text, { dimColor: true }, t(hiddenBelow === 1 ? "editConfirm.linesBelow" : "editConfirm.linesBelowPlural", {
48669
+ /* @__PURE__ */ import_react20.default.createElement(W, null, /* @__PURE__ */ import_react20.default.createElement(L, { color: "#fbc8c8", backgroundColor: "#2a1212" }, t("editConfirm.oldLabel")), /* @__PURE__ */ import_react20.default.createElement(L, null, " "), /* @__PURE__ */ import_react20.default.createElement(L, { color: "#bef0c8", backgroundColor: "#0c2718" }, t("editConfirm.newLabel")), /* @__PURE__ */ import_react20.default.createElement(L, { dimColor: true }, t("editConfirm.sideBySide"))),
48670
+ hiddenBelow > 0 ? /* @__PURE__ */ import_react20.default.createElement(L, { dimColor: true }, t(hiddenBelow === 1 ? "editConfirm.linesBelow" : "editConfirm.linesBelowPlural", {
48670
48671
  count: hiddenBelow
48671
48672
  })) : null
48672
48673
  );
@@ -48681,7 +48682,7 @@ function EditPicker({
48681
48682
  onChoose
48682
48683
  }) {
48683
48684
  const [focus, setFocus] = (0, import_react21.useState)(Math.max(0, entries.length - 1));
48684
- const { stdout } = use_stdout_default();
48685
+ const { stdout } = bv();
48685
48686
  const rows = stdout?.rows ?? 40;
48686
48687
  const visibleCount = Math.max(3, rows - PAGE_MARGIN2);
48687
48688
  const maxFocus = Math.max(0, entries.length - 1);
@@ -48702,14 +48703,14 @@ function EditPicker({
48702
48703
  }
48703
48704
  });
48704
48705
  if (entries.length === 0) {
48705
- return /* @__PURE__ */ import_react21.default.createElement(Box_default, { flexDirection: "column", paddingY: 1, paddingX: 2 }, /* @__PURE__ */ import_react21.default.createElement(Text, { color: TONE.warn }, t("editPicker.empty")), /* @__PURE__ */ import_react21.default.createElement(Text, { color: FG.faint }, t("editPicker.dismiss")));
48706
+ return /* @__PURE__ */ import_react21.default.createElement(W, { flexDirection: "column", paddingY: 1, paddingX: 2 }, /* @__PURE__ */ import_react21.default.createElement(L, { color: TONE.warn }, t("editPicker.empty")), /* @__PURE__ */ import_react21.default.createElement(L, { color: FG.faint }, t("editPicker.dismiss")));
48706
48707
  }
48707
48708
  const start = Math.max(
48708
48709
  0,
48709
48710
  Math.min(focus - Math.floor(visibleCount / 2), entries.length - visibleCount)
48710
48711
  );
48711
48712
  const shown = entries.slice(start, start + visibleCount);
48712
- return /* @__PURE__ */ import_react21.default.createElement(Box_default, { flexDirection: "column", paddingY: 1, paddingX: 2 }, /* @__PURE__ */ import_react21.default.createElement(Text, { bold: true, color: TONE.brand }, t("editPicker.title")), /* @__PURE__ */ import_react21.default.createElement(Text, { color: FG.faint }, t("editPicker.hint")), /* @__PURE__ */ import_react21.default.createElement(Box_default, { flexDirection: "column", marginTop: 1 }, shown.map((entry, i) => {
48713
+ return /* @__PURE__ */ import_react21.default.createElement(W, { flexDirection: "column", paddingY: 1, paddingX: 2 }, /* @__PURE__ */ import_react21.default.createElement(L, { bold: true, color: TONE.brand }, t("editPicker.title")), /* @__PURE__ */ import_react21.default.createElement(L, { color: FG.faint }, t("editPicker.hint")), /* @__PURE__ */ import_react21.default.createElement(W, { flexDirection: "column", marginTop: 1 }, shown.map((entry, i) => {
48713
48714
  const globalIdx = start + i;
48714
48715
  const focused = globalIdx === focus;
48715
48716
  return /* @__PURE__ */ import_react21.default.createElement(Row, { key: entry.cardId, entry, focused });
@@ -48721,7 +48722,7 @@ function Row({ entry, focused }) {
48721
48722
  const numLabel = `#${entry.userTurnIndex + 1}`;
48722
48723
  const bg = focused ? SURFACE.bgElev : void 0;
48723
48724
  const fg = focused ? FG.strong : FG.body;
48724
- return /* @__PURE__ */ import_react21.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react21.default.createElement(Text, { color: focused ? TONE.brand : FG.faint, backgroundColor: bg }, marker), /* @__PURE__ */ import_react21.default.createElement(Text, { color: FG.meta, backgroundColor: bg }, numLabel), /* @__PURE__ */ import_react21.default.createElement(Text, { color: fg, backgroundColor: bg }, preview));
48725
+ return /* @__PURE__ */ import_react21.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react21.default.createElement(L, { color: focused ? TONE.brand : FG.faint, backgroundColor: bg }, marker), /* @__PURE__ */ import_react21.default.createElement(L, { color: FG.meta, backgroundColor: bg }, numLabel), /* @__PURE__ */ import_react21.default.createElement(L, { color: fg, backgroundColor: bg }, preview));
48725
48726
  }
48726
48727
  function oneLinePreview(text2, cells) {
48727
48728
  const firstLine = text2.split(/\n/, 1)[0] ?? "";
@@ -48738,36 +48739,20 @@ function oneLinePreview(text2, cells) {
48738
48739
  }
48739
48740
 
48740
48741
  // src/cli/ui/LiveActivityArea.tsx
48741
- var import_react31 = __toESM(require_react(), 1);
48742
+ var import_react30 = __toESM(require_react(), 1);
48742
48743
 
48743
48744
  // src/cli/ui/layout/LiveRows.tsx
48744
- var import_react27 = __toESM(require_react(), 1);
48745
-
48746
- // src/cli/ui/char-bar.tsx
48747
- var import_react22 = __toESM(require_react(), 1);
48748
- function CharBar({
48749
- pct,
48750
- width = 24,
48751
- color = COLOR.primary,
48752
- emptyColor,
48753
- showLabel = true,
48754
- label
48755
- }) {
48756
- const total = Math.max(4, width);
48757
- const clamped = Math.max(0, Math.min(100, Number.isFinite(pct) ? pct : 0));
48758
- const filled = Math.round(total * clamped / 100);
48759
- return /* @__PURE__ */ import_react22.default.createElement(Box_default, null, /* @__PURE__ */ import_react22.default.createElement(Text, { color }, GLYPH.block.repeat(filled)), /* @__PURE__ */ import_react22.default.createElement(Text, { color: emptyColor ?? COLOR.info, dimColor: true }, GLYPH.shade1.repeat(total - filled)), showLabel ? /* @__PURE__ */ import_react22.default.createElement(Text, { dimColor: true }, ` ${label ?? `${Math.round(clamped)}%`}`) : null);
48760
- }
48745
+ var import_react26 = __toESM(require_react(), 1);
48761
48746
 
48762
48747
  // src/cli/ui/primitives/Card.tsx
48763
- var import_react23 = __toESM(require_react(), 1);
48764
- var ActiveCardContext = import_react23.default.createContext(true);
48748
+ var import_react22 = __toESM(require_react(), 1);
48749
+ var ActiveCardContext = import_react22.default.createContext(true);
48765
48750
  function Card({ children }) {
48766
- return /* @__PURE__ */ import_react23.default.createElement(Box_default, { flexDirection: "column", marginTop: 1, width: "100%" }, children);
48751
+ return /* @__PURE__ */ import_react22.default.createElement(W, { flexDirection: "column", marginTop: 1, width: "100%" }, children);
48767
48752
  }
48768
48753
 
48769
48754
  // src/cli/ui/primitives/CardHeader.tsx
48770
- var import_react24 = __toESM(require_react(), 1);
48755
+ var import_react23 = __toESM(require_react(), 1);
48771
48756
  function CardHeader({
48772
48757
  glyph,
48773
48758
  tone,
@@ -48776,36 +48761,24 @@ function CardHeader({
48776
48761
  meta,
48777
48762
  right
48778
48763
  }) {
48779
- const active2 = (0, import_react24.useContext)(ActiveCardContext);
48764
+ const active2 = (0, import_react23.useContext)(ActiveCardContext);
48780
48765
  const visibleMeta = active2 ? meta : meta?.filter((item) => typeof item !== "string");
48781
- return /* @__PURE__ */ import_react24.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react24.default.createElement(Text, { color: tone }, glyph), /* @__PURE__ */ import_react24.default.createElement(Text, { bold: true, color: tone }, title2), subtitle ? /* @__PURE__ */ import_react24.default.createElement(Text, { color: FG.body }, subtitle) : null, visibleMeta?.map((item, i) => {
48766
+ return /* @__PURE__ */ import_react23.default.createElement(W, { flexDirection: "row", gap: 1 }, typeof glyph === "string" ? /* @__PURE__ */ import_react23.default.createElement(L, { color: tone }, glyph) : glyph, /* @__PURE__ */ import_react23.default.createElement(L, { bold: true, color: tone }, title2), subtitle ? /* @__PURE__ */ import_react23.default.createElement(L, { color: FG.body }, subtitle) : null, visibleMeta?.map((item, i) => {
48782
48767
  const isStr = typeof item === "string";
48783
48768
  const text2 = isStr ? item : item.text;
48784
48769
  const color = isStr ? FG.faint : item.color;
48785
48770
  return (
48786
48771
  // biome-ignore lint/suspicious/noArrayIndexKey: meta items are positional
48787
- /* @__PURE__ */ import_react24.default.createElement(import_react24.default.Fragment, { key: `m-${i}` }, /* @__PURE__ */ import_react24.default.createElement(Text, { color: FG.faint }, "\xB7"), /* @__PURE__ */ import_react24.default.createElement(Text, { color }, text2))
48772
+ /* @__PURE__ */ import_react23.default.createElement(import_react23.default.Fragment, { key: `m-${i}` }, /* @__PURE__ */ import_react23.default.createElement(L, { color: FG.faint }, "\xB7"), /* @__PURE__ */ import_react23.default.createElement(L, { color }, text2))
48788
48773
  );
48789
48774
  }), active2 ? right : null);
48790
48775
  }
48791
48776
 
48792
48777
  // src/cli/ui/primitives/Pill.tsx
48793
- var import_react25 = __toESM(require_react(), 1);
48778
+ var import_react24 = __toESM(require_react(), 1);
48794
48779
  function Pill2({ label, bg, fg, bold = true }) {
48795
- return /* @__PURE__ */ import_react25.default.createElement(Text, { backgroundColor: bg, color: fg, bold }, ` ${label} `);
48796
- }
48797
- var PILL_SECTION = {
48798
- reason: { bg: "#2a1f3d", fg: "#d2a8ff" },
48799
- output: { bg: "#0d1d2e", fg: "#79c0ff" },
48800
- tool: { bg: "#0f2230", fg: "#79c0ff" },
48801
- shell: { bg: "#0f2230", fg: "#79c0ff" },
48802
- task: { bg: "#0d1d2e", fg: "#79c0ff" },
48803
- taskDone: { bg: "#102815", fg: "#7ee787" },
48804
- taskFailed: { bg: "#2c1416", fg: "#ff8b81" },
48805
- plan: { bg: "#2a1f3d", fg: "#d2a8ff" },
48806
- user: { bg: "#1a2433", fg: "#79c0ff" },
48807
- empty: { bg: "#11141a", fg: "#6e7681" }
48808
- };
48780
+ return /* @__PURE__ */ import_react24.default.createElement(L, { backgroundColor: bg, color: fg, bold }, ` ${label} `);
48781
+ }
48809
48782
  var PILL_PATH = { bg: "#11141a", fg: "#8b949e" };
48810
48783
  var PILL_MODEL = {
48811
48784
  flash: { bg: "#11141a", fg: "#79c0ff" },
@@ -48822,40 +48795,92 @@ function modelBadgeFor(model2) {
48822
48795
  return { label: stripped, kind: "unknown" };
48823
48796
  }
48824
48797
 
48825
- // src/cli/ui/primitives/Spinner.tsx
48826
- var import_react26 = __toESM(require_react(), 1);
48827
- var FRAMES = {
48828
- circle: ["\u25D0", "\u25D3", "\u25D1", "\u25D2"],
48829
- braille: ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827"]
48830
- };
48831
- function Spinner({ kind = "circle", color, bold }) {
48832
- const frames = FRAMES[kind];
48833
- const tick = useTick();
48834
- const frame = tick % frames.length;
48835
- return /* @__PURE__ */ import_react26.default.createElement(Text, { bold, color }, frames[frame]);
48836
- }
48798
+ // src/cli/ui/primitives/Pulse.tsx
48799
+ var import_react25 = __toESM(require_react(), 1);
48800
+ var DEFAULT_FRAME_MS = 140;
48801
+ function Pulse({
48802
+ frames,
48803
+ settled,
48804
+ active: active2,
48805
+ color,
48806
+ frameMs = DEFAULT_FRAME_MS
48807
+ }) {
48808
+ const [ref, time] = Wi(active2 ? frameMs : null);
48809
+ const settledGlyph = settled ?? frames[frames.length - 1] ?? "";
48810
+ if (!active2)
48811
+ return /* @__PURE__ */ import_react25.default.createElement(W, { ref }, /* @__PURE__ */ import_react25.default.createElement(L, { color }, settledGlyph));
48812
+ const idx = Math.floor(time / frameMs) % frames.length;
48813
+ return /* @__PURE__ */ import_react25.default.createElement(W, { ref }, /* @__PURE__ */ import_react25.default.createElement(L, { color }, frames[idx] ?? settledGlyph));
48814
+ }
48815
+ var PULSE_DIAMOND = ["\u25C7", "\u25C8", "\u25C6", "\u25C8"];
48816
+ var PULSE_SQUARE = ["\u25A2", "\u25A3", "\u25A4", "\u25A3"];
48817
+ var PULSE_TRIANGLE = ["\u25B7", "\u25B6", "\u25B7", "\u25B6"];
48818
+ var PULSE_CIRCLE = ["\u25CC", "\u25D0", "\u25D1", "\u25D2", "\u25D3", "\u25CF"];
48819
+ var PULSE_HEX = ["\u2B21", "\u2B22", "\u2B21", "\u2B22"];
48837
48820
 
48838
48821
  // src/cli/ui/layout/LiveRows.tsx
48839
- var SPINNER_FRAMES = ["\u280B", "\u2819", "\u2839", "\u2838", "\u283C", "\u2834", "\u2826", "\u2827", "\u2807", "\u280F"];
48822
+ function useLiveOutputTokens() {
48823
+ const chars = useAgentState((s) => {
48824
+ let lastUserIdx = -1;
48825
+ for (let i = s.cards.length - 1; i >= 0; i--) {
48826
+ if (s.cards[i].kind === "user") {
48827
+ lastUserIdx = i;
48828
+ break;
48829
+ }
48830
+ }
48831
+ if (lastUserIdx < 0) return 0;
48832
+ let n = 0;
48833
+ for (let i = lastUserIdx + 1; i < s.cards.length; i++) {
48834
+ const c = s.cards[i];
48835
+ if (c.kind === "reasoning" || c.kind === "streaming") n += c.text.length;
48836
+ }
48837
+ return n;
48838
+ });
48839
+ const startedAt = useAgentState((s) => {
48840
+ let lastUserIdx = -1;
48841
+ for (let i = s.cards.length - 1; i >= 0; i--) {
48842
+ if (s.cards[i].kind === "user") {
48843
+ lastUserIdx = i;
48844
+ break;
48845
+ }
48846
+ }
48847
+ return lastUserIdx >= 0 ? s.cards[lastUserIdx].ts : 0;
48848
+ });
48849
+ useSlowTick();
48850
+ const tokens = Math.ceil(chars / 4);
48851
+ if (tokens < 4 || startedAt === 0) return { tokens, tps: null };
48852
+ const elapsedSec = (Date.now() - startedAt) / 1e3;
48853
+ if (elapsedSec < 0.5) return { tokens, tps: null };
48854
+ return { tokens, tps: Math.round(tokens / elapsedSec) };
48855
+ }
48856
+ function useElapsedSinceKey(key) {
48857
+ const startRef = (0, import_react26.useRef)({ key, at: Date.now() });
48858
+ if (startRef.current.key !== key) startRef.current = { key, at: Date.now() };
48859
+ useSlowTick();
48860
+ return Math.floor((Date.now() - startRef.current.at) / 1e3);
48861
+ }
48862
+ function formatElapsed(secs) {
48863
+ if (secs < 60) return `${secs}s`;
48864
+ const m = Math.floor(secs / 60);
48865
+ const s = secs % 60;
48866
+ return `${m}m${s.toString().padStart(2, "0")}s`;
48867
+ }
48840
48868
  function ThinkingRow({ text: text2 }) {
48841
- const elapsed = useElapsedSeconds();
48842
- const { fg, tone } = useThemeTokens();
48843
- return /* @__PURE__ */ import_react27.default.createElement(Box_default, { marginY: 1, paddingX: 1, gap: 1 }, /* @__PURE__ */ import_react27.default.createElement(Spinner, { kind: "circle", color: TONE.accent }), /* @__PURE__ */ import_react27.default.createElement(Text, { italic: true, color: FG.sub }, text2), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, `${elapsed}s`));
48869
+ const secs = useElapsedSinceKey(text2);
48870
+ const { tokens, tps } = useLiveOutputTokens();
48871
+ const tail = [];
48872
+ if (secs >= 1) tail.push(formatElapsed(secs));
48873
+ if (tokens > 0) tail.push(`\u2193 ${tokens.toLocaleString()} tok`);
48874
+ if (tps !== null) tail.push(`${tps} t/s`);
48875
+ return /* @__PURE__ */ import_react26.default.createElement(W, { marginY: 1, paddingX: 1, gap: 1 }, /* @__PURE__ */ import_react26.default.createElement(Pulse, { active: true, frames: PULSE_CIRCLE, settled: "\u25CF", color: TONE.accent }), /* @__PURE__ */ import_react26.default.createElement(L, { italic: true, color: FG.sub }, text2), tail.length > 0 ? /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, `\xB7 ${tail.join(" \xB7 ")}`) : null);
48844
48876
  }
48845
48877
  function UndoBanner({
48846
48878
  banner
48847
48879
  }) {
48848
- useTick();
48849
- const totalMs = 5e3;
48850
48880
  const paused = banner.pausedRemainingMs !== null;
48851
- const remainingMs = paused ? banner.pausedRemainingMs ?? 0 : Math.max(0, banner.expiresAt - Date.now());
48852
- const remainingSec = Math.ceil(remainingMs / 1e3);
48853
48881
  const ok = banner.results.filter((r) => r.status === "applied" || r.status === "created").length;
48854
48882
  const total = banner.results.length;
48855
- const urgent = !paused && remainingSec <= 1;
48856
- const pct = remainingMs / totalMs * 100;
48857
- const tone = paused ? TONE.warn : urgent ? TONE.err : TONE.accent;
48858
- return /* @__PURE__ */ import_react27.default.createElement(Box_default, { marginY: 1, paddingX: 1 }, /* @__PURE__ */ import_react27.default.createElement(Text, { backgroundColor: TONE.accent, color: "black", bold: true }, ` \u2713 AUTO-APPLIED ${ok}/${total} `), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, " press "), /* @__PURE__ */ import_react27.default.createElement(Text, { backgroundColor: TONE.brand, color: "black", bold: true }, " u "), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, paused ? " to undo \xB7 " : " to undo \xB7 "), /* @__PURE__ */ import_react27.default.createElement(Text, { backgroundColor: paused ? TONE.warn : FG.faint, color: "black", bold: true }, " space "), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, paused ? " to resume " : " to pause "), /* @__PURE__ */ import_react27.default.createElement(CharBar, { pct, width: 20, color: tone, showLabel: false }), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, " "), /* @__PURE__ */ import_react27.default.createElement(Text, { color: tone, bold: urgent || paused }, paused ? `${remainingSec}s \xB7 paused` : `${remainingSec}s`));
48883
+ return /* @__PURE__ */ import_react26.default.createElement(W, { marginY: 1, paddingX: 1 }, /* @__PURE__ */ import_react26.default.createElement(L, { backgroundColor: TONE.accent, color: "black", bold: true }, ` \u2713 AUTO-APPLIED ${ok}/${total} `), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, " press "), /* @__PURE__ */ import_react26.default.createElement(L, { backgroundColor: TONE.brand, color: "black", bold: true }, " u "), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, " to undo \xB7 "), /* @__PURE__ */ import_react26.default.createElement(L, { backgroundColor: paused ? TONE.warn : FG.faint, color: "black", bold: true }, " space "), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, paused ? " to resume" : " to pause"), paused ? /* @__PURE__ */ import_react26.default.createElement(L, { color: TONE.warn, bold: true }, " \xB7 paused") : null);
48859
48884
  }
48860
48885
  function subagentPhaseLabel(phase, iter, elapsedMs) {
48861
48886
  if (phase === "summarising") return "summarising findings\u2026";
@@ -48864,24 +48889,23 @@ function subagentPhaseLabel(phase, iter, elapsedMs) {
48864
48889
  return "working through tools\u2026";
48865
48890
  }
48866
48891
  function SubagentRow({ activity }) {
48867
- useTick();
48868
48892
  const seconds = (activity.elapsedMs / 1e3).toFixed(1);
48869
48893
  const phase = subagentPhaseLabel(activity.phase, activity.iter, activity.elapsedMs);
48870
48894
  const last = activity.lastInner;
48871
48895
  const subtitle = activity.skillName ?? truncate(activity.task, 48);
48872
48896
  const modelBadge = activity.model ? modelBadgeFor(activity.model) : null;
48873
48897
  const streamLine = formatStreamLine(activity);
48874
- return /* @__PURE__ */ import_react27.default.createElement(Card, { tone: CARD.subagent.color }, /* @__PURE__ */ import_react27.default.createElement(
48898
+ return /* @__PURE__ */ import_react26.default.createElement(Card, { tone: CARD.subagent.color }, /* @__PURE__ */ import_react26.default.createElement(
48875
48899
  CardHeader,
48876
48900
  {
48877
- glyph: "\u25CF",
48901
+ glyph: /* @__PURE__ */ import_react26.default.createElement(Pulse, { active: true, frames: PULSE_HEX, settled: "\u232C", color: CARD.subagent.color }),
48878
48902
  tone: CARD.subagent.color,
48879
48903
  title: "subagent",
48880
48904
  subtitle,
48881
48905
  meta: [`iter ${activity.iter}`, `${seconds}s`],
48882
- right: /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, modelBadge ? /* @__PURE__ */ import_react27.default.createElement(Pill2, { label: modelBadge.label, ...PILL_MODEL[modelBadge.kind], bold: false }) : null, /* @__PURE__ */ import_react27.default.createElement(Spinner, { kind: "braille", color: CARD.subagent.color }))
48906
+ right: modelBadge ? /* @__PURE__ */ import_react26.default.createElement(Pill2, { label: modelBadge.label, ...PILL_MODEL[modelBadge.kind], bold: false }) : null
48883
48907
  }
48884
- ), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, "task ", /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.sub }, activity.task)), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, "last ", last ? /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(Text, { color: last.color }, `${last.glyph} `), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.body }, last.label), last.meta ? /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, ` ${last.meta}`) : null) : /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, t("editMode.queuedDots"))), streamLine ? /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, "flow ", /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.sub }, streamLine)) : null, /* @__PURE__ */ import_react27.default.createElement(Text, { color: TONE.brand }, "\u25B6 ", phase));
48908
+ ), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, "task ", /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.sub }, activity.task)), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, "last ", last ? /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(L, { color: last.color }, `${last.glyph} `), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.body }, last.label), last.meta ? /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, ` ${last.meta}`) : null) : /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, t("editMode.queuedDots"))), streamLine ? /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, "flow ", /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.sub }, streamLine)) : null, /* @__PURE__ */ import_react26.default.createElement(L, { color: TONE.brand }, "\u25B6 ", phase));
48885
48909
  }
48886
48910
  function formatBytes(n) {
48887
48911
  if (n < 1024) return `${n} B`;
@@ -48908,39 +48932,31 @@ function SubagentLiveStack({
48908
48932
  activities,
48909
48933
  max = 3
48910
48934
  }) {
48911
- const tick = useTick();
48912
48935
  if (activities.length === 0) return null;
48913
- if (activities.length === 1) return /* @__PURE__ */ import_react27.default.createElement(SubagentRow, { activity: activities[0] });
48936
+ if (activities.length === 1) return /* @__PURE__ */ import_react26.default.createElement(SubagentRow, { activity: activities[0] });
48914
48937
  const visible = activities.slice(0, max);
48915
48938
  const overflow = activities.length - visible.length;
48916
48939
  const summarising = activities.filter((a) => a.phase === "summarising").length;
48917
48940
  const metaParts = [`${activities.length} running`];
48918
48941
  if (summarising > 0) metaParts.push(`${summarising} summarising`);
48919
- return /* @__PURE__ */ import_react27.default.createElement(Card, { tone: CARD.subagent.color }, /* @__PURE__ */ import_react27.default.createElement(
48942
+ return /* @__PURE__ */ import_react26.default.createElement(Card, { tone: CARD.subagent.color }, /* @__PURE__ */ import_react26.default.createElement(
48920
48943
  CardHeader,
48921
48944
  {
48922
- glyph: "\u25CF",
48945
+ glyph: /* @__PURE__ */ import_react26.default.createElement(Pulse, { active: true, frames: PULSE_HEX, settled: "\u232C", color: CARD.subagent.color }),
48923
48946
  tone: CARD.subagent.color,
48924
48947
  title: "subagents",
48925
- subtitle: metaParts.join(" \xB7 "),
48926
- right: /* @__PURE__ */ import_react27.default.createElement(Spinner, { kind: "braille", color: CARD.subagent.color })
48948
+ subtitle: metaParts.join(" \xB7 ")
48927
48949
  }
48928
- ), visible.map((a, i) => /* @__PURE__ */ import_react27.default.createElement(CompactSubagentLine, { key: a.runId, activity: a, tick, index: i })), overflow > 0 ? /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, ` +${overflow} more running\u2026`) : null);
48950
+ ), visible.map((a) => /* @__PURE__ */ import_react26.default.createElement(CompactSubagentLine, { key: a.runId, activity: a })), overflow > 0 ? /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, ` +${overflow} more running\u2026`) : null);
48929
48951
  }
48930
- function CompactSubagentLine({
48931
- activity,
48932
- tick,
48933
- index
48934
- }) {
48952
+ function CompactSubagentLine({ activity }) {
48935
48953
  const summarising = activity.phase === "summarising";
48936
- const spinnerFrame = SPINNER_FRAMES[(tick + index) % SPINNER_FRAMES.length] ?? "\xB7";
48937
- const glyph = summarising ? "\u25B6" : spinnerFrame;
48938
48954
  const glyphColor = summarising ? TONE.brand : CARD.subagent.color;
48939
48955
  const seconds = (activity.elapsedMs / 1e3).toFixed(1).padStart(5);
48940
48956
  const title2 = activity.skillName ?? truncate(activity.task, 28);
48941
48957
  const titlePadded = title2.padEnd(28);
48942
48958
  const last = activity.lastInner;
48943
- return /* @__PURE__ */ import_react27.default.createElement(Box_default, { flexDirection: "row" }, /* @__PURE__ */ import_react27.default.createElement(Text, { color: glyphColor, bold: true }, ` ${glyph} `), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.body }, titlePadded), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, ` iter ${String(activity.iter).padStart(2)} \xB7 ${seconds}s \xB7 `), last ? /* @__PURE__ */ import_react27.default.createElement(import_react27.default.Fragment, null, /* @__PURE__ */ import_react27.default.createElement(Text, { color: last.color }, `${last.glyph} `), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.body }, truncate(last.label, 18)), last.meta ? /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, ` ${last.meta}`) : null) : /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, t("editMode.queuedDots")));
48959
+ return /* @__PURE__ */ import_react26.default.createElement(W, { flexDirection: "row" }, /* @__PURE__ */ import_react26.default.createElement(L, null, " "), /* @__PURE__ */ import_react26.default.createElement(Pulse, { active: true, frames: PULSE_HEX, settled: summarising ? "\u25B6" : "\u232C", color: glyphColor }), /* @__PURE__ */ import_react26.default.createElement(L, null, " "), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.body }, titlePadded), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, ` iter ${String(activity.iter).padStart(2)} \xB7 ${seconds}s \xB7 `), last ? /* @__PURE__ */ import_react26.default.createElement(import_react26.default.Fragment, null, /* @__PURE__ */ import_react26.default.createElement(L, { color: last.color }, `${last.glyph} `), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.body }, truncate(last.label, 18)), last.meta ? /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, ` ${last.meta}`) : null) : /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, t("editMode.queuedDots")));
48944
48960
  }
48945
48961
  function truncate(text2, max) {
48946
48962
  return text2.length > max ? `${text2.slice(0, max)}\u2026` : text2;
@@ -48957,13 +48973,18 @@ function OngoingToolRow({
48957
48973
  progress,
48958
48974
  subagentActivities = []
48959
48975
  }) {
48960
- const tick = useTick();
48961
- const elapsed = useElapsedSeconds();
48962
48976
  const summary = summarizeToolArgs(tool.name, tool.args);
48963
48977
  const argsBytes = tool.args ? tool.args.length : 0;
48978
+ const secs = useElapsedSinceKey(tool.name);
48979
+ const { tokens, tps } = useLiveOutputTokens();
48964
48980
  const subagentBytes = SUBAGENT_WRAPPER_TOOLS.has(tool.name) ? subagentActivities[subagentActivities.length - 1] : void 0;
48965
48981
  const subagentBytesLine = subagentBytes ? formatSubagentBytes(subagentBytes) : null;
48966
- return /* @__PURE__ */ import_react27.default.createElement(Box_default, { marginY: 1, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react27.default.createElement(Box_default, null, /* @__PURE__ */ import_react27.default.createElement(Text, { color: CARD.tool.color, bold: true }, SPINNER_FRAMES[tick % SPINNER_FRAMES.length]), /* @__PURE__ */ import_react27.default.createElement(Text, null, " "), /* @__PURE__ */ import_react27.default.createElement(Text, { color: CARD.tool.color, bold: true }, `\u25A3 ${tool.name}`), /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, ` running \xB7 ${elapsed}s`, argsBytes > 0 ? ` \xB7 args ${formatBytes(argsBytes)}` : "")), subagentBytesLine ? /* @__PURE__ */ import_react27.default.createElement(Box_default, { paddingLeft: 3 }, /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, subagentBytesLine)) : null, progress ? /* @__PURE__ */ import_react27.default.createElement(Box_default, { paddingLeft: 3 }, /* @__PURE__ */ import_react27.default.createElement(Text, { color: TONE.brand }, renderProgressLine(progress))) : null, summary ? /* @__PURE__ */ import_react27.default.createElement(Box_default, { paddingLeft: 3 }, /* @__PURE__ */ import_react27.default.createElement(Text, { color: FG.faint }, summary)) : null);
48982
+ const tailParts = [];
48983
+ if (argsBytes > 0) tailParts.push(`args ${formatBytes(argsBytes)}`);
48984
+ if (secs >= 1) tailParts.push(formatElapsed(secs));
48985
+ if (tokens > 0) tailParts.push(`\u2193 ${tokens.toLocaleString()} tok`);
48986
+ if (tps !== null) tailParts.push(`${tps} t/s`);
48987
+ return /* @__PURE__ */ import_react26.default.createElement(W, { marginY: 1, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react26.default.createElement(W, { gap: 1 }, /* @__PURE__ */ import_react26.default.createElement(Pulse, { active: true, frames: PULSE_SQUARE, settled: "\u25A3", color: CARD.tool.color }), /* @__PURE__ */ import_react26.default.createElement(L, { color: CARD.tool.color, bold: true }, tool.name), /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, "running", tailParts.length > 0 ? ` \xB7 ${tailParts.join(" \xB7 ")}` : "")), subagentBytesLine ? /* @__PURE__ */ import_react26.default.createElement(W, { paddingLeft: 3 }, /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, subagentBytesLine)) : null, progress ? /* @__PURE__ */ import_react26.default.createElement(W, { paddingLeft: 3 }, /* @__PURE__ */ import_react26.default.createElement(L, { color: TONE.brand }, renderProgressLine(progress))) : null, summary ? /* @__PURE__ */ import_react26.default.createElement(W, { paddingLeft: 3 }, /* @__PURE__ */ import_react26.default.createElement(L, { color: FG.faint }, summary)) : null);
48967
48988
  }
48968
48989
  function renderProgressLine(p) {
48969
48990
  const msg = p.message ? ` ${p.message}` : "";
@@ -49019,7 +49040,7 @@ function summarizeToolArgs(name, args) {
49019
49040
  }
49020
49041
 
49021
49042
  // src/cli/ui/layout/ToastRail.tsx
49022
- var import_react28 = __toESM(require_react(), 1);
49043
+ var import_react27 = __toESM(require_react(), 1);
49023
49044
  var TONE_COLOR = {
49024
49045
  ok: TONE.ok,
49025
49046
  info: TONE.brand,
@@ -49041,11 +49062,11 @@ function ToastRail() {
49041
49062
  const toasts = useAgentState((s) => s.toasts);
49042
49063
  const dispatch = useDispatch();
49043
49064
  useSlowTick();
49044
- const { stdout } = use_stdout_default();
49065
+ const { stdout } = bv();
49045
49066
  const cols = stdout?.columns ?? 80;
49046
49067
  const rule = "\u2501".repeat(Math.max(20, cols - 4));
49047
49068
  const now = Date.now();
49048
- (0, import_react28.useEffect)(() => {
49069
+ (0, import_react27.useEffect)(() => {
49049
49070
  const timers = [];
49050
49071
  for (const t2 of toasts) {
49051
49072
  const remaining = Math.max(0, t2.ttlMs - (Date.now() - t2.bornAt));
@@ -49057,20 +49078,20 @@ function ToastRail() {
49057
49078
  }, [toasts, dispatch]);
49058
49079
  const visible = toasts.filter((t2) => now - t2.bornAt < t2.ttlMs);
49059
49080
  if (visible.length === 0) return null;
49060
- return /* @__PURE__ */ import_react28.default.createElement(Box_default, { flexDirection: "column" }, visible.map((t2) => {
49081
+ return /* @__PURE__ */ import_react27.default.createElement(W, { flexDirection: "column" }, visible.map((t2) => {
49061
49082
  const color = TONE_COLOR[t2.tone];
49062
49083
  const glyph = TONE_GLYPH[t2.tone];
49063
49084
  const body = bodyColor(t2, now);
49064
49085
  const remainingSec = Math.max(0, Math.ceil((t2.ttlMs - (now - t2.bornAt)) / 1e3));
49065
- return /* @__PURE__ */ import_react28.default.createElement(Box_default, { key: t2.id, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react28.default.createElement(Text, { color }, rule), /* @__PURE__ */ import_react28.default.createElement(Box_default, { flexDirection: "row" }, /* @__PURE__ */ import_react28.default.createElement(Text, { color }, glyph), /* @__PURE__ */ import_react28.default.createElement(Text, { bold: true, color: body }, ` ${t2.title}`), t2.detail !== void 0 && /* @__PURE__ */ import_react28.default.createElement(Text, { color: FG.sub }, ` \xB7 ${t2.detail}`), /* @__PURE__ */ import_react28.default.createElement(Box_default, { flexGrow: 1 }), /* @__PURE__ */ import_react28.default.createElement(Text, { color: FG.faint }, `${remainingSec}s`)));
49086
+ return /* @__PURE__ */ import_react27.default.createElement(W, { key: t2.id, flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react27.default.createElement(L, { color }, rule), /* @__PURE__ */ import_react27.default.createElement(W, { flexDirection: "row" }, /* @__PURE__ */ import_react27.default.createElement(L, { color }, glyph), /* @__PURE__ */ import_react27.default.createElement(L, { bold: true, color: body }, ` ${t2.title}`), t2.detail !== void 0 && /* @__PURE__ */ import_react27.default.createElement(L, { color: FG.sub }, ` \xB7 ${t2.detail}`), /* @__PURE__ */ import_react27.default.createElement(W, { flexGrow: 1 }), /* @__PURE__ */ import_react27.default.createElement(L, { color: FG.faint }, `${remainingSec}s`)));
49066
49087
  }));
49067
49088
  }
49068
49089
 
49069
49090
  // src/cli/ui/layout/plan-live-row.tsx
49070
- var import_react30 = __toESM(require_react(), 1);
49091
+ var import_react29 = __toESM(require_react(), 1);
49071
49092
 
49072
49093
  // src/cli/ui/cards/PlanCard.tsx
49073
- var import_react29 = __toESM(require_react(), 1);
49094
+ var import_react28 = __toESM(require_react(), 1);
49074
49095
  var STATUS_GLYPH = {
49075
49096
  queued: "\u25CB",
49076
49097
  running: "\u25CF",
@@ -49096,11 +49117,19 @@ function PlanCard({ card }) {
49096
49117
  const hasRunning = card.steps.some((s) => s.status === "running");
49097
49118
  const cardTone = hasRunning ? toneActive.accent : tone.accent;
49098
49119
  const window2 = pickWindow(card.steps);
49099
- return /* @__PURE__ */ import_react29.default.createElement(Card, { tone: cardTone }, /* @__PURE__ */ import_react29.default.createElement(CardHeader, { glyph: "\u25CF", tone: cardTone, title: card.title, meta: [progress] }), window2.hiddenBefore > 0 ? /* @__PURE__ */ import_react29.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react29.default.createElement(Text, { color: tone.ok }, "\u2713"), /* @__PURE__ */ import_react29.default.createElement(Text, { color: fg.faint }, `\u22EF ${window2.hiddenBefore} ${t("cardLabels.done")}`)) : null, window2.steps.map((step) => {
49120
+ return /* @__PURE__ */ import_react28.default.createElement(Card, { tone: cardTone }, /* @__PURE__ */ import_react28.default.createElement(
49121
+ CardHeader,
49122
+ {
49123
+ glyph: hasRunning ? /* @__PURE__ */ import_react28.default.createElement(Pulse, { active: true, frames: PULSE_DIAMOND, settled: "\u25C6", color: cardTone }) : "\u25CF",
49124
+ tone: cardTone,
49125
+ title: card.title,
49126
+ meta: [progress]
49127
+ }
49128
+ ), window2.hiddenBefore > 0 ? /* @__PURE__ */ import_react28.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react28.default.createElement(L, { color: tone.ok }, "\u2713"), /* @__PURE__ */ import_react28.default.createElement(L, { color: fg.faint }, `\u22EF ${window2.hiddenBefore} ${t("cardLabels.done")}`)) : null, window2.steps.map((step) => {
49100
49129
  const isActive = step.status === "running";
49101
49130
  const titleColor = isActive ? fg.strong : fg.sub;
49102
- return /* @__PURE__ */ import_react29.default.createElement(Box_default, { key: step.id, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react29.default.createElement(Text, { color: statusColor[step.status] }, STATUS_GLYPH[step.status]), /* @__PURE__ */ import_react29.default.createElement(Text, { bold: isActive, color: titleColor }, `${step.indexLabel}. ${step.title}`), isActive ? /* @__PURE__ */ import_react29.default.createElement(Text, { color: toneActive.brand }, t("cardLabels.inProgress")) : null);
49103
- }), window2.hiddenAfter > 0 ? /* @__PURE__ */ import_react29.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react29.default.createElement(Text, { color: fg.faint }, "\u25CB"), /* @__PURE__ */ import_react29.default.createElement(Text, { color: fg.faint }, `\u22EF ${window2.hiddenAfter} ${t("cardLabels.upcoming")}`)) : null);
49131
+ return /* @__PURE__ */ import_react28.default.createElement(W, { key: step.id, flexDirection: "row", gap: 1 }, isActive ? /* @__PURE__ */ import_react28.default.createElement(Pulse, { active: true, frames: PULSE_DIAMOND, settled: "\u25C6", color: statusColor[step.status] }) : /* @__PURE__ */ import_react28.default.createElement(L, { color: statusColor[step.status] }, STATUS_GLYPH[step.status]), /* @__PURE__ */ import_react28.default.createElement(L, { bold: isActive, color: titleColor }, `${step.indexLabel}. ${step.title}`), isActive ? /* @__PURE__ */ import_react28.default.createElement(L, { color: toneActive.brand }, t("cardLabels.inProgress")) : null);
49132
+ }), window2.hiddenAfter > 0 ? /* @__PURE__ */ import_react28.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react28.default.createElement(L, { color: fg.faint }, "\u25CB"), /* @__PURE__ */ import_react28.default.createElement(L, { color: fg.faint }, `\u22EF ${window2.hiddenAfter} ${t("cardLabels.upcoming")}`)) : null);
49104
49133
  }
49105
49134
  function pickWindow(steps) {
49106
49135
  if (steps.length <= VISIBLE_WINDOW) {
@@ -49142,11 +49171,11 @@ function PlanLiveRow() {
49142
49171
  return null;
49143
49172
  });
49144
49173
  if (!planCard) return null;
49145
- return /* @__PURE__ */ import_react30.default.createElement(PlanCard, { card: planCard });
49174
+ return /* @__PURE__ */ import_react29.default.createElement(PlanCard, { card: planCard });
49146
49175
  }
49147
49176
 
49148
49177
  // src/cli/ui/LiveActivityArea.tsx
49149
- var LiveActivityArea = import_react31.default.memo(
49178
+ var LiveActivityArea = import_react30.default.memo(
49150
49179
  ({
49151
49180
  noTakeoverOverlay,
49152
49181
  ongoingTool,
@@ -49160,23 +49189,23 @@ var LiveActivityArea = import_react31.default.memo(
49160
49189
  hideUndo
49161
49190
  }) => {
49162
49191
  useRenderTrace("LiveActivityArea");
49163
- return /* @__PURE__ */ import_react31.default.createElement(Box_default, { flexDirection: "column", flexShrink: 0, flexWrap: "nowrap" }, noTakeoverOverlay && ongoingTool ? /* @__PURE__ */ import_react31.default.createElement(
49192
+ return /* @__PURE__ */ import_react30.default.createElement(W, { flexDirection: "column", flexShrink: 0, flexWrap: "nowrap" }, noTakeoverOverlay && ongoingTool ? /* @__PURE__ */ import_react30.default.createElement(
49164
49193
  OngoingToolRow,
49165
49194
  {
49166
49195
  tool: ongoingTool,
49167
49196
  progress: toolProgress,
49168
49197
  subagentActivities
49169
49198
  }
49170
- ) : null, noTakeoverOverlay && subagentActivities.length > 0 ? /* @__PURE__ */ import_react31.default.createElement(SubagentLiveStack, { activities: subagentActivities, max: 3 }) : null, noTakeoverOverlay && !ongoingTool && statusLine ? /* @__PURE__ */ import_react31.default.createElement(ThinkingRow, { text: statusLine }) : null, undoBanner && !hideUndo ? /* @__PURE__ */ import_react31.default.createElement(UndoBanner, { banner: undoBanner }) : null, noTakeoverOverlay && busy && !isStreaming && !ongoingTool && !statusLine ? /* @__PURE__ */ import_react31.default.createElement(ThinkingRow, { text: activityLabel }) : null, noTakeoverOverlay ? /* @__PURE__ */ import_react31.default.createElement(PlanLiveRow, null) : null, /* @__PURE__ */ import_react31.default.createElement(ToastRail, null));
49199
+ ) : null, noTakeoverOverlay && subagentActivities.length > 0 ? /* @__PURE__ */ import_react30.default.createElement(SubagentLiveStack, { activities: subagentActivities, max: 3 }) : null, noTakeoverOverlay && !ongoingTool && statusLine ? /* @__PURE__ */ import_react30.default.createElement(ThinkingRow, { text: statusLine }) : null, undoBanner && !hideUndo ? /* @__PURE__ */ import_react30.default.createElement(UndoBanner, { banner: undoBanner }) : null, noTakeoverOverlay && busy && !isStreaming && !ongoingTool && !statusLine ? /* @__PURE__ */ import_react30.default.createElement(ThinkingRow, { text: activityLabel }) : null, noTakeoverOverlay ? /* @__PURE__ */ import_react30.default.createElement(PlanLiveRow, null) : null, /* @__PURE__ */ import_react30.default.createElement(ToastRail, null));
49171
49200
  }
49172
49201
  );
49173
49202
  LiveActivityArea.displayName = "LiveActivityArea";
49174
49203
 
49175
49204
  // src/cli/ui/McpHub.tsx
49176
- var import_react34 = __toESM(require_react(), 1);
49205
+ var import_react33 = __toESM(require_react(), 1);
49177
49206
 
49178
49207
  // src/cli/ui/McpBrowser.tsx
49179
- var import_react32 = __toESM(require_react(), 1);
49208
+ var import_react31 = __toESM(require_react(), 1);
49180
49209
 
49181
49210
  // src/cli/ui/mcp-disable.ts
49182
49211
  function toggleMcpDisabled(action, name) {
@@ -49415,7 +49444,7 @@ function McpBrowser({
49415
49444
  postInfo,
49416
49445
  applyAppend
49417
49446
  }) {
49418
- const [index, setIndex] = (0, import_react32.useState)(0);
49447
+ const [index, setIndex] = (0, import_react31.useState)(0);
49419
49448
  const max = Math.max(0, servers.length - 1);
49420
49449
  useKeystroke((ev) => {
49421
49450
  if (ev.paste) return;
@@ -49434,13 +49463,13 @@ function McpBrowser({
49434
49463
  onClose();
49435
49464
  }
49436
49465
  });
49437
- return /* @__PURE__ */ import_react32.default.createElement(Box_default, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react32.default.createElement(Box_default, null, /* @__PURE__ */ import_react32.default.createElement(Text, { bold: true, color: COLOR.brand }, t("mcpBrowser.title")), /* @__PURE__ */ import_react32.default.createElement(
49438
- Text,
49466
+ return /* @__PURE__ */ import_react31.default.createElement(W, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react31.default.createElement(W, null, /* @__PURE__ */ import_react31.default.createElement(L, { bold: true, color: COLOR.brand }, t("mcpBrowser.title")), /* @__PURE__ */ import_react31.default.createElement(
49467
+ L,
49439
49468
  {
49440
49469
  dimColor: true
49441
49470
  },
49442
49471
  ` \xB7 ${configPath} \xB7 ${t("mcpBrowser.serverCount", { count: servers.length, s: servers.length === 1 ? "" : "s" })}`
49443
- )), /* @__PURE__ */ import_react32.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, servers.length === 0 ? /* @__PURE__ */ import_react32.default.createElement(Text, { dimColor: true }, t("mcpBrowser.empty")) : servers.map((s, i) => /* @__PURE__ */ import_react32.default.createElement(ServerRow, { key: s.label + s.spec, server: s, active: i === index }))), /* @__PURE__ */ import_react32.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react32.default.createElement(Text, { dimColor: true }, t("mcpBrowser.footer"))));
49472
+ )), /* @__PURE__ */ import_react31.default.createElement(W, { marginTop: 1, flexDirection: "column" }, servers.length === 0 ? /* @__PURE__ */ import_react31.default.createElement(L, { dimColor: true }, t("mcpBrowser.empty")) : servers.map((s, i) => /* @__PURE__ */ import_react31.default.createElement(ServerRow, { key: s.label + s.spec, server: s, active: i === index }))), /* @__PURE__ */ import_react31.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react31.default.createElement(L, { dimColor: true }, t("mcpBrowser.footer"))));
49444
49473
  }
49445
49474
  function ServerRow({ server, active: active2 }) {
49446
49475
  const { label, toolCount, report } = server;
@@ -49449,7 +49478,7 @@ function ServerRow({ server, active: active2 }) {
49449
49478
  const elapsed = report.elapsedMs;
49450
49479
  const health = healthBadge(elapsed);
49451
49480
  const counts = `${toolCount} tools \xB7 ${resourceCount} resources \xB7 ${promptCount} prompts`;
49452
- return /* @__PURE__ */ import_react32.default.createElement(Box_default, { flexDirection: "column", marginBottom: active2 ? 1 : 0 }, /* @__PURE__ */ import_react32.default.createElement(Box_default, null, /* @__PURE__ */ import_react32.default.createElement(Text, { color: active2 ? COLOR.brand : void 0 }, active2 ? "\u25B8 " : " "), /* @__PURE__ */ import_react32.default.createElement(Text, { bold: active2, color: active2 ? "#e6edf3" : void 0 }, label.padEnd(14)), /* @__PURE__ */ import_react32.default.createElement(Text, { color: health.color }, `${health.glyph} ${health.label}`), /* @__PURE__ */ import_react32.default.createElement(Text, { dimColor: true }, ` ${counts}`)), active2 ? /* @__PURE__ */ import_react32.default.createElement(Box_default, null, /* @__PURE__ */ import_react32.default.createElement(Text, { dimColor: true }, ` ${capabilityList(server)}`)) : null);
49481
+ return /* @__PURE__ */ import_react31.default.createElement(W, { flexDirection: "column", marginBottom: active2 ? 1 : 0 }, /* @__PURE__ */ import_react31.default.createElement(W, null, /* @__PURE__ */ import_react31.default.createElement(L, { color: active2 ? COLOR.brand : void 0 }, active2 ? "\u25B8 " : " "), /* @__PURE__ */ import_react31.default.createElement(L, { bold: active2, color: active2 ? "#e6edf3" : void 0 }, label.padEnd(14)), /* @__PURE__ */ import_react31.default.createElement(L, { color: health.color }, `${health.glyph} ${health.label}`), /* @__PURE__ */ import_react31.default.createElement(L, { dimColor: true }, ` ${counts}`)), active2 ? /* @__PURE__ */ import_react31.default.createElement(W, null, /* @__PURE__ */ import_react31.default.createElement(L, { dimColor: true }, ` ${capabilityList(server)}`)) : null);
49453
49482
  }
49454
49483
  function capabilityList(s) {
49455
49484
  const caps = ["tools/list", "tools/call"];
@@ -49459,7 +49488,7 @@ function capabilityList(s) {
49459
49488
  }
49460
49489
 
49461
49490
  // src/cli/ui/McpMarketplace.tsx
49462
- var import_react33 = __toESM(require_react(), 1);
49491
+ var import_react32 = __toESM(require_react(), 1);
49463
49492
  var VISIBLE_ROWS = 10;
49464
49493
  function buildMarketplacePickerSnapshot(args) {
49465
49494
  return {
@@ -49504,7 +49533,7 @@ function isInstalled(installedSpecs, entry) {
49504
49533
  }
49505
49534
  }
49506
49535
  function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49507
- const [state2, setState] = (0, import_react33.useState)({
49536
+ const [state2, setState] = (0, import_react32.useState)({
49508
49537
  handle: null,
49509
49538
  loading: true,
49510
49539
  query: "",
@@ -49512,7 +49541,7 @@ function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49512
49541
  status: t("mcpMarketplace.opening"),
49513
49542
  installedSpecs: readInstalledSpecs()
49514
49543
  });
49515
- (0, import_react33.useEffect)(() => {
49544
+ (0, import_react32.useEffect)(() => {
49516
49545
  let cancelled = false;
49517
49546
  (async () => {
49518
49547
  try {
@@ -49537,12 +49566,12 @@ function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49537
49566
  cancelled = true;
49538
49567
  };
49539
49568
  }, []);
49540
- const filtered = (0, import_react33.useMemo)(() => {
49569
+ const filtered = (0, import_react32.useMemo)(() => {
49541
49570
  if (!state2.handle) return [];
49542
49571
  return rankAndFilter(state2.handle.cache.entries, state2.query);
49543
49572
  }, [state2.handle, state2.query]);
49544
49573
  const selected = filtered[state2.selected];
49545
- const fetchMore = (0, import_react33.useCallback)(async () => {
49574
+ const fetchMore = (0, import_react32.useCallback)(async () => {
49546
49575
  if (!state2.handle || state2.loading) return;
49547
49576
  if (state2.handle.cache.pagination.nextCursor === null) {
49548
49577
  setState((s) => ({ ...s, status: t("mcpMarketplace.allLoaded") }));
@@ -49560,7 +49589,7 @@ function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49560
49589
  setState((s) => ({ ...s, loading: false, status: `error: ${err.message}` }));
49561
49590
  }
49562
49591
  }, [state2.handle, state2.loading]);
49563
- const doUninstall = (0, import_react33.useCallback)(
49592
+ const doUninstall = (0, import_react32.useCallback)(
49564
49593
  async (entry, installed) => {
49565
49594
  const cfg = readConfig();
49566
49595
  const next = (cfg.mcp ?? []).filter((s) => s !== installed);
@@ -49581,7 +49610,7 @@ function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49581
49610
  },
49582
49611
  [postInfo, reloadMcp]
49583
49612
  );
49584
- const doInstall = (0, import_react33.useCallback)(
49613
+ const doInstall = (0, import_react32.useCallback)(
49585
49614
  async (entry) => {
49586
49615
  let install = entry.install;
49587
49616
  if (!install && entry.source === "smithery") {
@@ -49642,7 +49671,7 @@ function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49642
49671
  },
49643
49672
  [postInfo, reloadMcp]
49644
49673
  );
49645
- const installOrToggle = (0, import_react33.useCallback)(
49674
+ const installOrToggle = (0, import_react32.useCallback)(
49646
49675
  async (entry) => {
49647
49676
  const installed = isInstalled(state2.installedSpecs, entry);
49648
49677
  if (installed) await doUninstall(entry, installed);
@@ -49650,7 +49679,7 @@ function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49650
49679
  },
49651
49680
  [state2.installedSpecs, doInstall, doUninstall]
49652
49681
  );
49653
- const pickerSnapshot = (0, import_react33.useMemo)(
49682
+ const pickerSnapshot = (0, import_react32.useMemo)(
49654
49683
  () => buildMarketplacePickerSnapshot({
49655
49684
  filtered,
49656
49685
  installedSpecs: state2.installedSpecs,
@@ -49730,31 +49759,31 @@ function McpMarketplace({ onClose, postInfo, reloadMcp, pickerPorts }) {
49730
49759
  setState((s) => ({ ...s, query: s.query + ev.input, selected: 0 }));
49731
49760
  }
49732
49761
  });
49733
- const overlay = (0, import_react33.useMemo)(() => loadOverlay("zh-CN"), []);
49762
+ const overlay = (0, import_react32.useMemo)(() => loadOverlay("zh-CN"), []);
49734
49763
  const start = Math.max(
49735
49764
  0,
49736
49765
  Math.min(state2.selected - Math.floor(VISIBLE_ROWS / 2), filtered.length - VISIBLE_ROWS)
49737
49766
  );
49738
49767
  const window2 = filtered.slice(Math.max(0, start), Math.max(0, start) + VISIBLE_ROWS);
49739
- return /* @__PURE__ */ import_react33.default.createElement(Box_default, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react33.default.createElement(Box_default, null, /* @__PURE__ */ import_react33.default.createElement(Text, { bold: true, color: COLOR.brand }, "\u25C8 MCP marketplace"), /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, ` \xB7 ${state2.status}`)), /* @__PURE__ */ import_react33.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react33.default.createElement(Text, null, t("mcpMarketplace.filter")), /* @__PURE__ */ import_react33.default.createElement(Text, null, state2.query || t("mcpMarketplace.filterPlaceholder")), /* @__PURE__ */ import_react33.default.createElement(
49740
- Text,
49768
+ return /* @__PURE__ */ import_react32.default.createElement(W, { flexDirection: "column", paddingX: 1 }, /* @__PURE__ */ import_react32.default.createElement(W, null, /* @__PURE__ */ import_react32.default.createElement(L, { bold: true, color: COLOR.brand }, "\u25C8 MCP marketplace"), /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, ` \xB7 ${state2.status}`)), /* @__PURE__ */ import_react32.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react32.default.createElement(L, null, t("mcpMarketplace.filter")), /* @__PURE__ */ import_react32.default.createElement(L, null, state2.query || t("mcpMarketplace.filterPlaceholder")), /* @__PURE__ */ import_react32.default.createElement(
49769
+ L,
49741
49770
  {
49742
49771
  dimColor: true
49743
49772
  },
49744
49773
  ` ${t(filtered.length === 1 ? "mcpMarketplace.matchSingular" : "mcpMarketplace.matchPlural", { n: filtered.length })}`
49745
- )), /* @__PURE__ */ import_react33.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, window2.length === 0 ? /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, state2.loading ? t("mcpMarketplace.loading") : t("mcpMarketplace.noEntries")) : window2.map((e, i) => {
49774
+ )), /* @__PURE__ */ import_react32.default.createElement(W, { marginTop: 1, flexDirection: "column" }, window2.length === 0 ? /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, state2.loading ? t("mcpMarketplace.loading") : t("mcpMarketplace.noEntries")) : window2.map((e, i) => {
49746
49775
  const idx = (start || 0) + i;
49747
49776
  const active2 = idx === state2.selected;
49748
49777
  const tag2 = e.source === "official" ? "[off]" : e.source === "smithery" ? "[smt]" : "[loc]";
49749
49778
  const installedSpec = isInstalled(state2.installedSpecs, e);
49750
49779
  const installedBadge = installedSpec ? " \u2713" : "";
49751
49780
  const pop = e.popularity !== void 0 ? ` \xB7 ${e.popularity.toLocaleString()}` : "";
49752
- return /* @__PURE__ */ import_react33.default.createElement(Box_default, { key: e.name }, /* @__PURE__ */ import_react33.default.createElement(Text, { color: active2 ? COLOR.brand : void 0 }, active2 ? "\u25B8 " : " "), /* @__PURE__ */ import_react33.default.createElement(Text, { bold: active2 }, e.name.padEnd(38).slice(0, 38)), /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, ` ${tag2}${pop}${installedBadge}`));
49753
- })), selected ? /* @__PURE__ */ import_react33.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react33.default.createElement(Text, { bold: true }, overlay?.[selected.name]?.title ?? selected.title, overlay?.[selected.name] ? /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, ` \xB7 ${selected.title}`) : null), /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, overlay?.[selected.name]?.description ?? selected.description?.slice(0, 200) ?? null), selected.install ? /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, t("mcpMarketplace.specLine", {
49781
+ return /* @__PURE__ */ import_react32.default.createElement(W, { key: e.name }, /* @__PURE__ */ import_react32.default.createElement(L, { color: active2 ? COLOR.brand : void 0 }, active2 ? "\u25B8 " : " "), /* @__PURE__ */ import_react32.default.createElement(L, { bold: active2 }, e.name.padEnd(38).slice(0, 38)), /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, ` ${tag2}${pop}${installedBadge}`));
49782
+ })), selected ? /* @__PURE__ */ import_react32.default.createElement(W, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react32.default.createElement(L, { bold: true }, overlay?.[selected.name]?.title ?? selected.title, overlay?.[selected.name] ? /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, ` \xB7 ${selected.title}`) : null), /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, overlay?.[selected.name]?.description ?? selected.description?.slice(0, 200) ?? null), selected.install ? /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, t("mcpMarketplace.specLine", {
49754
49783
  runtime: selected.install.runtime,
49755
49784
  id: selected.install.packageId ?? selected.install.url ?? "\u2014",
49756
49785
  transport: selected.install.transport
49757
- })) : /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, t("mcpMarketplace.smitheryDetail")), selected.install?.requiredEnv?.length ? /* @__PURE__ */ import_react33.default.createElement(Text, { color: "yellow" }, t("mcpMarketplace.needsEnv", { env: selected.install.requiredEnv.join(", ") })) : null) : null, /* @__PURE__ */ import_react33.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react33.default.createElement(Text, { dimColor: true }, t("mcpMarketplace.footerHint"))));
49786
+ })) : /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, t("mcpMarketplace.smitheryDetail")), selected.install?.requiredEnv?.length ? /* @__PURE__ */ import_react32.default.createElement(L, { color: "yellow" }, t("mcpMarketplace.needsEnv", { env: selected.install.requiredEnv.join(", ") })) : null) : null, /* @__PURE__ */ import_react32.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react32.default.createElement(L, { dimColor: true }, t("mcpMarketplace.footerHint"))));
49758
49787
  }
49759
49788
 
49760
49789
  // src/cli/ui/McpHub.tsx
@@ -49768,19 +49797,19 @@ function McpHub({
49768
49797
  reloadMcp,
49769
49798
  pickerPorts
49770
49799
  }) {
49771
- const [tab, setTab] = (0, import_react34.useState)(initialTab);
49800
+ const [tab, setTab] = (0, import_react33.useState)(initialTab);
49772
49801
  useKeystroke((ev) => {
49773
49802
  if (ev.paste) return;
49774
49803
  if (ev.tab) setTab((t2) => t2 === "live" ? "marketplace" : "live");
49775
49804
  });
49776
- return /* @__PURE__ */ import_react34.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react34.default.createElement(Box_default, { paddingX: 1 }, /* @__PURE__ */ import_react34.default.createElement(Text, { bold: true, color: COLOR.brand }, "\u25C8 MCP"), /* @__PURE__ */ import_react34.default.createElement(Text, null, " "), /* @__PURE__ */ import_react34.default.createElement(
49805
+ return /* @__PURE__ */ import_react33.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react33.default.createElement(W, { paddingX: 1 }, /* @__PURE__ */ import_react33.default.createElement(L, { bold: true, color: COLOR.brand }, "\u25C8 MCP"), /* @__PURE__ */ import_react33.default.createElement(L, null, " "), /* @__PURE__ */ import_react33.default.createElement(
49777
49806
  TabPill,
49778
49807
  {
49779
49808
  label: t("handlers.mcp.liveTab"),
49780
49809
  count: liveServers.length,
49781
49810
  active: tab === "live"
49782
49811
  }
49783
- ), /* @__PURE__ */ import_react34.default.createElement(Text, null, " "), /* @__PURE__ */ import_react34.default.createElement(TabPill, { label: t("handlers.mcp.marketplaceTab"), active: tab === "marketplace" }), /* @__PURE__ */ import_react34.default.createElement(Text, { dimColor: true }, ` ${t("handlers.mcp.tabHint")}`)), tab === "live" ? /* @__PURE__ */ import_react34.default.createElement(
49812
+ ), /* @__PURE__ */ import_react33.default.createElement(L, null, " "), /* @__PURE__ */ import_react33.default.createElement(TabPill, { label: t("handlers.mcp.marketplaceTab"), active: tab === "marketplace" }), /* @__PURE__ */ import_react33.default.createElement(L, { dimColor: true }, ` ${t("handlers.mcp.tabHint")}`)), tab === "live" ? /* @__PURE__ */ import_react33.default.createElement(
49784
49813
  McpBrowser,
49785
49814
  {
49786
49815
  servers: liveServers,
@@ -49789,7 +49818,7 @@ function McpHub({
49789
49818
  postInfo,
49790
49819
  applyAppend
49791
49820
  }
49792
- ) : /* @__PURE__ */ import_react34.default.createElement(
49821
+ ) : /* @__PURE__ */ import_react33.default.createElement(
49793
49822
  McpMarketplace,
49794
49823
  {
49795
49824
  onClose,
@@ -49802,13 +49831,13 @@ function McpHub({
49802
49831
  function TabPill({ label, count, active: active2 }) {
49803
49832
  const text2 = count !== void 0 ? `${label} (${count})` : label;
49804
49833
  if (active2) {
49805
- return /* @__PURE__ */ import_react34.default.createElement(Text, { bold: true, color: COLOR.brand }, "[", text2, "]");
49834
+ return /* @__PURE__ */ import_react33.default.createElement(L, { bold: true, color: COLOR.brand }, "[", text2, "]");
49806
49835
  }
49807
- return /* @__PURE__ */ import_react34.default.createElement(Text, { dimColor: true }, ` ${text2} `);
49836
+ return /* @__PURE__ */ import_react33.default.createElement(L, { dimColor: true }, ` ${text2} `);
49808
49837
  }
49809
49838
 
49810
49839
  // src/cli/ui/ModelPicker.tsx
49811
- var import_react35 = __toESM(require_react(), 1);
49840
+ var import_react34 = __toESM(require_react(), 1);
49812
49841
  var PAGE_MARGIN3 = 8;
49813
49842
  function ModelPicker({
49814
49843
  models,
@@ -49827,8 +49856,8 @@ function ModelPicker({
49827
49856
  const modelRows = modelList.map((id) => ({ kind: "model", id }));
49828
49857
  const rows = [...effortRows, ...modelRows];
49829
49858
  const initialIndex = effortRows.length + Math.max(0, modelList.indexOf(current));
49830
- const [focus, setFocus] = (0, import_react35.useState)(initialIndex);
49831
- const { stdout } = use_stdout_default();
49859
+ const [focus, setFocus] = (0, import_react34.useState)(initialIndex);
49860
+ const { stdout } = bv();
49832
49861
  const termRows = stdout?.rows ?? 40;
49833
49862
  const visibleCount = Math.max(6, termRows - PAGE_MARGIN3);
49834
49863
  useKeystroke((ev) => {
@@ -49856,13 +49885,13 @@ function ModelPicker({
49856
49885
  const loading = models === null;
49857
49886
  const empty = models !== null && models.length === 0;
49858
49887
  let lastSection = null;
49859
- return /* @__PURE__ */ import_react35.default.createElement(Box_default, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react35.default.createElement(Box_default, null, /* @__PURE__ */ import_react35.default.createElement(Text, { bold: true, color: TONE.brand }, t("modelPicker.header")), /* @__PURE__ */ import_react35.default.createElement(Text, { color: FG.meta }, loading ? t("modelPicker.loading") : empty ? t("modelPicker.catalogEmpty") : t("modelPicker.modelsAvailable", { count: modelList.length }))), /* @__PURE__ */ import_react35.default.createElement(Box_default, { height: 1 }), hiddenAbove > 0 ? /* @__PURE__ */ import_react35.default.createElement(Box_default, null, /* @__PURE__ */ import_react35.default.createElement(Text, { color: FG.faint }, ` \u2026 ${hiddenAbove}`)) : null, shown.map((row2, i) => {
49888
+ return /* @__PURE__ */ import_react34.default.createElement(W, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react34.default.createElement(W, null, /* @__PURE__ */ import_react34.default.createElement(L, { bold: true, color: TONE.brand }, t("modelPicker.header")), /* @__PURE__ */ import_react34.default.createElement(L, { color: FG.meta }, loading ? t("modelPicker.loading") : empty ? t("modelPicker.catalogEmpty") : t("modelPicker.modelsAvailable", { count: modelList.length }))), /* @__PURE__ */ import_react34.default.createElement(W, { height: 1 }), hiddenAbove > 0 ? /* @__PURE__ */ import_react34.default.createElement(W, null, /* @__PURE__ */ import_react34.default.createElement(L, { color: FG.faint }, ` \u2026 ${hiddenAbove}`)) : null, shown.map((row2, i) => {
49860
49889
  const idx = start + i;
49861
49890
  const focused = idx === focus;
49862
49891
  const showHeader = row2.kind !== lastSection;
49863
49892
  lastSection = row2.kind;
49864
- const header = showHeader ? /* @__PURE__ */ import_react35.default.createElement(Box_default, { key: `hdr-${row2.kind}`, marginTop: idx === 0 ? 0 : 1 }, /* @__PURE__ */ import_react35.default.createElement(Text, { color: FG.meta }, row2.kind === "effort" ? t("modelPicker.effortHeader") : t("modelPicker.modelsHeader"))) : null;
49865
- const body = row2.kind === "effort" ? /* @__PURE__ */ import_react35.default.createElement(
49893
+ const header = showHeader ? /* @__PURE__ */ import_react34.default.createElement(W, { key: `hdr-${row2.kind}`, marginTop: idx === 0 ? 0 : 1 }, /* @__PURE__ */ import_react34.default.createElement(L, { color: FG.meta }, row2.kind === "effort" ? t("modelPicker.effortHeader") : t("modelPicker.modelsHeader"))) : null;
49894
+ const body = row2.kind === "effort" ? /* @__PURE__ */ import_react34.default.createElement(
49866
49895
  EffortRow,
49867
49896
  {
49868
49897
  key: `e-${row2.effort}`,
@@ -49870,7 +49899,7 @@ function ModelPicker({
49870
49899
  focused,
49871
49900
  active: row2.effort === currentEffort
49872
49901
  }
49873
- ) : /* @__PURE__ */ import_react35.default.createElement(
49902
+ ) : /* @__PURE__ */ import_react34.default.createElement(
49874
49903
  ModelRow,
49875
49904
  {
49876
49905
  key: `m-${row2.id}`,
@@ -49879,15 +49908,15 @@ function ModelPicker({
49879
49908
  active: row2.id === current
49880
49909
  }
49881
49910
  );
49882
- return /* @__PURE__ */ import_react35.default.createElement(import_react35.default.Fragment, { key: `row-${idx}` }, header, body);
49883
- }), hiddenBelow > 0 ? /* @__PURE__ */ import_react35.default.createElement(Box_default, null, /* @__PURE__ */ import_react35.default.createElement(Text, { color: FG.faint }, t("cardLabels.more", { count: hiddenBelow }))) : null, /* @__PURE__ */ import_react35.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react35.default.createElement(Text, { color: FG.faint }, t("modelPicker.pickerFooter"))));
49911
+ return /* @__PURE__ */ import_react34.default.createElement(import_react34.default.Fragment, { key: `row-${idx}` }, header, body);
49912
+ }), hiddenBelow > 0 ? /* @__PURE__ */ import_react34.default.createElement(W, null, /* @__PURE__ */ import_react34.default.createElement(L, { color: FG.faint }, t("cardLabels.more", { count: hiddenBelow }))) : null, /* @__PURE__ */ import_react34.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react34.default.createElement(L, { color: FG.faint }, t("modelPicker.pickerFooter"))));
49884
49913
  }
49885
49914
  function EffortRow({
49886
49915
  effort: effort2,
49887
49916
  focused,
49888
49917
  active: active2
49889
49918
  }) {
49890
- return /* @__PURE__ */ import_react35.default.createElement(Box_default, null, /* @__PURE__ */ import_react35.default.createElement(Text, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react35.default.createElement(Text, { bold: focused, color: focused ? FG.strong : FG.sub }, effort2.padEnd(8)), /* @__PURE__ */ import_react35.default.createElement(Text, { color: FG.meta }, t(`modelPicker.effortDesc.${effort2}`)), active2 ? /* @__PURE__ */ import_react35.default.createElement(Text, { color: TONE.brand }, t("modelPicker.currentLabel")) : null);
49919
+ return /* @__PURE__ */ import_react34.default.createElement(W, null, /* @__PURE__ */ import_react34.default.createElement(L, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react34.default.createElement(L, { bold: focused, color: focused ? FG.strong : FG.sub }, effort2.padEnd(8)), /* @__PURE__ */ import_react34.default.createElement(L, { color: FG.meta }, t(`modelPicker.effortDesc.${effort2}`)), active2 ? /* @__PURE__ */ import_react34.default.createElement(L, { color: TONE.brand }, t("modelPicker.currentLabel")) : null);
49891
49920
  }
49892
49921
  function ModelRow({
49893
49922
  id,
@@ -49895,16 +49924,16 @@ function ModelRow({
49895
49924
  active: active2
49896
49925
  }) {
49897
49926
  const badge = modelBadgeFor(id);
49898
- return /* @__PURE__ */ import_react35.default.createElement(Box_default, null, /* @__PURE__ */ import_react35.default.createElement(Text, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react35.default.createElement(Text, { bold: focused, color: focused ? FG.strong : FG.sub }, id.padEnd(24)), /* @__PURE__ */ import_react35.default.createElement(Text, null, " "), /* @__PURE__ */ import_react35.default.createElement(Pill2, { label: badge.label, ...PILL_MODEL[badge.kind], bold: false }), active2 ? /* @__PURE__ */ import_react35.default.createElement(Text, { color: TONE.brand }, t("modelPicker.currentLabel")) : null);
49927
+ return /* @__PURE__ */ import_react34.default.createElement(W, null, /* @__PURE__ */ import_react34.default.createElement(L, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react34.default.createElement(L, { bold: focused, color: focused ? FG.strong : FG.sub }, id.padEnd(24)), /* @__PURE__ */ import_react34.default.createElement(L, null, " "), /* @__PURE__ */ import_react34.default.createElement(Pill2, { label: badge.label, ...PILL_MODEL[badge.kind], bold: false }), active2 ? /* @__PURE__ */ import_react34.default.createElement(L, { color: TONE.brand }, t("modelPicker.currentLabel")) : null);
49899
49928
  }
49900
49929
  var FALLBACK_MODELS = ["deepseek-v4-flash", "deepseek-v4-pro"];
49901
49930
 
49902
49931
  // src/cli/ui/PathConfirm.tsx
49903
- var import_react36 = __toESM(require_react(), 1);
49932
+ var import_react35 = __toESM(require_react(), 1);
49904
49933
  function PathConfirm({ prompt, onChoose }) {
49905
- const [phase, setPhase] = (0, import_react36.useState)("pick");
49934
+ const [phase, setPhase] = (0, import_react35.useState)("pick");
49906
49935
  if (phase === "deny") {
49907
- return /* @__PURE__ */ import_react36.default.createElement(
49936
+ return /* @__PURE__ */ import_react35.default.createElement(
49908
49937
  ApprovalCard,
49909
49938
  {
49910
49939
  tone: "error",
@@ -49913,7 +49942,7 @@ function PathConfirm({ prompt, onChoose }) {
49913
49942
  metaRight: t("pathConfirm.optional"),
49914
49943
  footerHint: t("pathConfirm.denyFooter")
49915
49944
  },
49916
- /* @__PURE__ */ import_react36.default.createElement(
49945
+ /* @__PURE__ */ import_react35.default.createElement(
49917
49946
  DenyContextInput,
49918
49947
  {
49919
49948
  onSubmit: (context2) => onChoose("deny", context2 || void 0),
@@ -49934,7 +49963,7 @@ function PathConfirm({ prompt, onChoose }) {
49934
49963
  if (id === "deny") return t("pathConfirm.actionDeny");
49935
49964
  return fallback;
49936
49965
  };
49937
- return /* @__PURE__ */ import_react36.default.createElement(
49966
+ return /* @__PURE__ */ import_react35.default.createElement(
49938
49967
  ApprovalCard,
49939
49968
  {
49940
49969
  tone: prompt.tone,
@@ -49943,9 +49972,9 @@ function PathConfirm({ prompt, onChoose }) {
49943
49972
  metaRight: t("pathConfirm.awaiting"),
49944
49973
  footerHint: t("pathConfirm.pickFooter")
49945
49974
  },
49946
- /* @__PURE__ */ import_react36.default.createElement(Box_default, { marginBottom: 1 }, /* @__PURE__ */ import_react36.default.createElement(Text, { color: FG.faint }, prompt.preview ?? "")),
49947
- /* @__PURE__ */ import_react36.default.createElement(InfoRows, { path, sandboxRoot: prompt.meta?.sandboxRoot, allowPrefix }),
49948
- /* @__PURE__ */ import_react36.default.createElement(
49975
+ /* @__PURE__ */ import_react35.default.createElement(W, { marginBottom: 1 }, /* @__PURE__ */ import_react35.default.createElement(L, { color: FG.faint }, prompt.preview ?? "")),
49976
+ /* @__PURE__ */ import_react35.default.createElement(InfoRows, { path, sandboxRoot: prompt.meta?.sandboxRoot, allowPrefix }),
49977
+ /* @__PURE__ */ import_react35.default.createElement(
49949
49978
  SingleSelect,
49950
49979
  {
49951
49980
  initialValue: prompt.actions[0]?.id ?? "run_once",
@@ -49984,7 +50013,7 @@ function InfoRows({
49984
50013
  rows.push({ label: t("pathConfirm.allowPrefixLabel"), value: allowPrefix });
49985
50014
  }
49986
50015
  const labelWidth = Math.max(...rows.map((r) => r.label.length));
49987
- return /* @__PURE__ */ import_react36.default.createElement(Box_default, { flexDirection: "column", marginBottom: 1 }, rows.map((r) => /* @__PURE__ */ import_react36.default.createElement(Box_default, { key: r.label, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react36.default.createElement(Text, { color: FG.faint }, r.label.padEnd(labelWidth)), /* @__PURE__ */ import_react36.default.createElement(Text, { color: FG.body }, r.value))));
50016
+ return /* @__PURE__ */ import_react35.default.createElement(W, { flexDirection: "column", marginBottom: 1 }, rows.map((r) => /* @__PURE__ */ import_react35.default.createElement(W, { key: r.label, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react35.default.createElement(L, { color: FG.faint }, r.label.padEnd(labelWidth)), /* @__PURE__ */ import_react35.default.createElement(L, { color: FG.body }, r.value))));
49988
50017
  }
49989
50018
 
49990
50019
  // src/cli/ui/PlanCheckpointConfirm.tsx
@@ -49992,6 +50021,24 @@ var import_react38 = __toESM(require_react(), 1);
49992
50021
 
49993
50022
  // src/cli/ui/PlanStepList.tsx
49994
50023
  var import_react37 = __toESM(require_react(), 1);
50024
+
50025
+ // src/cli/ui/char-bar.tsx
50026
+ var import_react36 = __toESM(require_react(), 1);
50027
+ function CharBar({
50028
+ pct,
50029
+ width = 24,
50030
+ color = COLOR.primary,
50031
+ emptyColor,
50032
+ showLabel = true,
50033
+ label
50034
+ }) {
50035
+ const total = Math.max(4, width);
50036
+ const clamped = Math.max(0, Math.min(100, Number.isFinite(pct) ? pct : 0));
50037
+ const filled = Math.round(total * clamped / 100);
50038
+ return /* @__PURE__ */ import_react36.default.createElement(W, null, /* @__PURE__ */ import_react36.default.createElement(L, { color }, GLYPH.block.repeat(filled)), /* @__PURE__ */ import_react36.default.createElement(L, { color: emptyColor ?? COLOR.info, dimColor: true }, GLYPH.shade1.repeat(total - filled)), showLabel ? /* @__PURE__ */ import_react36.default.createElement(L, { dimColor: true }, ` ${label ?? `${Math.round(clamped)}%`}`) : null);
50039
+ }
50040
+
50041
+ // src/cli/ui/PlanStepList.tsx
49995
50042
  function getStatus(stepId, statuses) {
49996
50043
  if (!statuses) return "pending";
49997
50044
  if (statuses instanceof Map) {
@@ -50018,28 +50065,28 @@ function PlanStepListInner({ steps, statuses, focusStepId }) {
50018
50065
  const doneCount = statusList.filter((s) => s === "done").length;
50019
50066
  const pct = Math.round(doneCount / total * 100);
50020
50067
  const showProgress = doneCount > 0;
50021
- return /* @__PURE__ */ import_react37.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react37.default.createElement(Box_default, null, /* @__PURE__ */ import_react37.default.createElement(Text, { dimColor: true }, showProgress ? t(
50068
+ return /* @__PURE__ */ import_react37.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react37.default.createElement(W, null, /* @__PURE__ */ import_react37.default.createElement(L, { dimColor: true }, showProgress ? t(
50022
50069
  total === 1 ? "planFlow.stepList.counterDoneSingular" : "planFlow.stepList.counterDone",
50023
50070
  { done: doneCount, total, pct }
50024
50071
  ) : t(total === 1 ? "planFlow.stepList.counterSingular" : "planFlow.stepList.counter", {
50025
50072
  total
50026
- }))), /* @__PURE__ */ import_react37.default.createElement(Box_default, { flexDirection: "column" }, steps.map((step, i) => {
50073
+ }))), /* @__PURE__ */ import_react37.default.createElement(W, { flexDirection: "column" }, steps.map((step, i) => {
50027
50074
  const status2 = statusList[i];
50028
50075
  const isLast = i === total - 1;
50029
50076
  const isCur = focusStepId === step.id;
50030
50077
  const sg = statusGlyph(status2, isCur);
50031
50078
  const risk = riskLabel(step.risk);
50032
50079
  const titleDim = status2 === "done" || status2 === "skipped";
50033
- return /* @__PURE__ */ import_react37.default.createElement(Box_default, { key: step.id }, /* @__PURE__ */ import_react37.default.createElement(Text, { color: COLOR.info, dimColor: true }, isLast ? GLYPH.branchEnd : GLYPH.branch), /* @__PURE__ */ import_react37.default.createElement(Text, null, " "), /* @__PURE__ */ import_react37.default.createElement(Text, { color: sg.color, bold: status2 === "running" || isCur }, sg.glyph), /* @__PURE__ */ import_react37.default.createElement(Text, null, " "), /* @__PURE__ */ import_react37.default.createElement(
50034
- Text,
50080
+ return /* @__PURE__ */ import_react37.default.createElement(W, { key: step.id }, /* @__PURE__ */ import_react37.default.createElement(L, { color: COLOR.info, dimColor: true }, isLast ? GLYPH.branchEnd : GLYPH.branch), /* @__PURE__ */ import_react37.default.createElement(L, null, " "), /* @__PURE__ */ import_react37.default.createElement(L, { color: sg.color, bold: status2 === "running" || isCur }, sg.glyph), /* @__PURE__ */ import_react37.default.createElement(L, null, " "), /* @__PURE__ */ import_react37.default.createElement(
50081
+ L,
50035
50082
  {
50036
50083
  dimColor: titleDim,
50037
50084
  bold: isCur || status2 === "running",
50038
50085
  strikethrough: status2 === "done" || status2 === "skipped"
50039
50086
  },
50040
50087
  `${step.id} \xB7 ${step.title}`
50041
- ), risk ? /* @__PURE__ */ import_react37.default.createElement(import_react37.default.Fragment, null, /* @__PURE__ */ import_react37.default.createElement(Text, null, " "), /* @__PURE__ */ import_react37.default.createElement(Text, { color: risk.color }, risk.text)) : null);
50042
- })), showProgress ? /* @__PURE__ */ import_react37.default.createElement(Box_default, null, /* @__PURE__ */ import_react37.default.createElement(Text, null, " "), /* @__PURE__ */ import_react37.default.createElement(CharBar, { pct, width: 24 })) : null);
50088
+ ), risk ? /* @__PURE__ */ import_react37.default.createElement(import_react37.default.Fragment, null, /* @__PURE__ */ import_react37.default.createElement(L, null, " "), /* @__PURE__ */ import_react37.default.createElement(L, { color: risk.color }, risk.text)) : null);
50089
+ })), showProgress ? /* @__PURE__ */ import_react37.default.createElement(W, null, /* @__PURE__ */ import_react37.default.createElement(L, null, " "), /* @__PURE__ */ import_react37.default.createElement(CharBar, { pct, width: 24 })) : null);
50043
50090
  }
50044
50091
  var PlanStepList = import_react37.default.memo(PlanStepListInner);
50045
50092
 
@@ -50058,7 +50105,7 @@ function PlanCheckpointConfirmInner({
50058
50105
  const isLast = total > 0 && completed >= total;
50059
50106
  const statuses = buildStatusMap(steps, completedStepIds, stepId, isLast);
50060
50107
  const subtitle = counter ? `${counter} \xB7 ${label}` : label;
50061
- return /* @__PURE__ */ import_react38.default.createElement(ApprovalCard, { tone: "ok", glyph: "\u26C1", title: t("planFlow.checkpoint.title"), metaRight: subtitle }, steps && steps.length > 0 ? /* @__PURE__ */ import_react38.default.createElement(Box_default, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react38.default.createElement(PlanStepList, { steps, statuses, focusStepId: stepId })) : null, /* @__PURE__ */ import_react38.default.createElement(
50108
+ return /* @__PURE__ */ import_react38.default.createElement(ApprovalCard, { tone: "ok", glyph: "\u26C1", title: t("planFlow.checkpoint.title"), metaRight: subtitle }, steps && steps.length > 0 ? /* @__PURE__ */ import_react38.default.createElement(W, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react38.default.createElement(PlanStepList, { steps, statuses, focusStepId: stepId })) : null, /* @__PURE__ */ import_react38.default.createElement(
50062
50109
  SingleSelect,
50063
50110
  {
50064
50111
  initialValue: "continue",
@@ -52497,28 +52544,28 @@ function MarkdownView({ text: text2 }) {
52497
52544
  function MarkdownLines({
52498
52545
  lines
52499
52546
  }) {
52500
- return /* @__PURE__ */ import_react39.default.createElement(Box_default, { flexDirection: "column" }, lines.map((line, i) => /* @__PURE__ */ import_react39.default.createElement(LineRow, { key: `md-${i}-${line.kind}`, line })));
52547
+ return /* @__PURE__ */ import_react39.default.createElement(W, { flexDirection: "column" }, lines.map((line, i) => /* @__PURE__ */ import_react39.default.createElement(LineRow, { key: `md-${i}-${line.kind}`, line })));
52501
52548
  }
52502
52549
  function LineRow({ line }) {
52503
52550
  switch (line.kind) {
52504
52551
  case "blank":
52505
- return /* @__PURE__ */ import_react39.default.createElement(Text, null, " ");
52552
+ return /* @__PURE__ */ import_react39.default.createElement(L, null, " ");
52506
52553
  case "hr":
52507
- return /* @__PURE__ */ import_react39.default.createElement(Text, { color: FG_FAINT }, "\u2500\u2500\u2500\u2500\u2500\u2500");
52554
+ return /* @__PURE__ */ import_react39.default.createElement(L, { color: FG_FAINT }, "\u2500\u2500\u2500\u2500\u2500\u2500");
52508
52555
  case "heading":
52509
- return /* @__PURE__ */ import_react39.default.createElement(Box_default, null, /* @__PURE__ */ import_react39.default.createElement(Text, { bold: true, color: FG_STRONG }, `${"#".repeat(line.level)} `), /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans, bold: true, strongColor: true }));
52556
+ return /* @__PURE__ */ import_react39.default.createElement(W, null, /* @__PURE__ */ import_react39.default.createElement(L, { bold: true, color: FG_STRONG }, `${"#".repeat(line.level)} `), /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans, bold: true, strongColor: true }));
52510
52557
  case "paragraph":
52511
- return /* @__PURE__ */ import_react39.default.createElement(Box_default, null, /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans }));
52558
+ return /* @__PURE__ */ import_react39.default.createElement(W, null, /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans }));
52512
52559
  case "list": {
52513
52560
  const indent = " ".repeat(line.depth * 2);
52514
52561
  const marker = line.task === "done" ? "\u2713" : line.task === "todo" ? "\u25CB" : line.ordered ? `${line.index}.` : "\xB7";
52515
52562
  const markerColor = line.task === "done" ? TONE_OK : line.task === "todo" ? FG_FAINT : FG_META;
52516
- return /* @__PURE__ */ import_react39.default.createElement(Box_default, null, /* @__PURE__ */ import_react39.default.createElement(Text, { color: markerColor }, `${indent}${marker} `), /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans, dim: line.task === "done", strike: line.task === "done" }));
52563
+ return /* @__PURE__ */ import_react39.default.createElement(W, null, /* @__PURE__ */ import_react39.default.createElement(L, { color: markerColor }, `${indent}${marker} `), /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans, dim: line.task === "done", strike: line.task === "done" }));
52517
52564
  }
52518
52565
  case "code":
52519
52566
  return /* @__PURE__ */ import_react39.default.createElement(CodeBlock, { lang: line.lang, text: line.text });
52520
52567
  case "blockquote":
52521
- return /* @__PURE__ */ import_react39.default.createElement(Box_default, null, /* @__PURE__ */ import_react39.default.createElement(Text, { color: TONE_BRAND }, "\u258E "), /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans, italic: true }));
52568
+ return /* @__PURE__ */ import_react39.default.createElement(W, null, /* @__PURE__ */ import_react39.default.createElement(L, { color: TONE_BRAND }, "\u258E "), /* @__PURE__ */ import_react39.default.createElement(Spans, { spans: line.spans, italic: true }));
52522
52569
  }
52523
52570
  }
52524
52571
  function spanKey(span, i) {
@@ -52526,13 +52573,13 @@ function spanKey(span, i) {
52526
52573
  }
52527
52574
  function CodeBlock({ lang, text: text2 }) {
52528
52575
  const lines = text2.split("\n");
52529
- return /* @__PURE__ */ import_react39.default.createElement(Box_default, { flexDirection: "column" }, lang.length > 0 ? /* @__PURE__ */ import_react39.default.createElement(Text, { color: FG_META }, ` ${lang}`) : null, lines.map((ln, i) => (
52576
+ return /* @__PURE__ */ import_react39.default.createElement(W, { flexDirection: "column" }, lang.length > 0 ? /* @__PURE__ */ import_react39.default.createElement(L, { color: FG_META }, ` ${lang}`) : null, lines.map((ln, i) => (
52530
52577
  // biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional + stable per render
52531
- /* @__PURE__ */ import_react39.default.createElement(Text, { key: `code-${i}`, backgroundColor: SURFACE_ELEV }, ` ${ln} `)
52578
+ /* @__PURE__ */ import_react39.default.createElement(L, { key: `code-${i}`, backgroundColor: SURFACE_ELEV }, ` ${ln} `)
52532
52579
  )));
52533
52580
  }
52534
52581
  function Spans({ spans, bold, italic, dim, strike, strongColor }) {
52535
- if (spans.length === 0) return /* @__PURE__ */ import_react39.default.createElement(Text, null, " ");
52582
+ if (spans.length === 0) return /* @__PURE__ */ import_react39.default.createElement(L, null, " ");
52536
52583
  return /* @__PURE__ */ import_react39.default.createElement(import_react39.default.Fragment, null, spans.map((span, i) => /* @__PURE__ */ import_react39.default.createElement(
52537
52584
  SpanText,
52538
52585
  {
@@ -52555,11 +52602,11 @@ function SpanText({
52555
52602
  strongColor
52556
52603
  }) {
52557
52604
  if (span.code) {
52558
- return /* @__PURE__ */ import_react39.default.createElement(Text, { color: FG_STRONG, backgroundColor: SURFACE_ELEV }, ` ${span.text} `);
52605
+ return /* @__PURE__ */ import_react39.default.createElement(L, { color: FG_STRONG, backgroundColor: SURFACE_ELEV }, ` ${span.text} `);
52559
52606
  }
52560
52607
  const color = span.fileRef ? TONE_BRAND : span.link ? TONE_BRAND : strongColor ? FG_STRONG : FG_BODY;
52561
52608
  const inner = /* @__PURE__ */ import_react39.default.createElement(
52562
- Text,
52609
+ L,
52563
52610
  {
52564
52611
  color,
52565
52612
  bold: !!(span.bold || ambientBold),
@@ -52572,7 +52619,7 @@ function SpanText({
52572
52619
  );
52573
52620
  const target = linkTarget(span);
52574
52621
  if (!target) return inner;
52575
- return /* @__PURE__ */ import_react39.default.createElement(Transform, { transform: (text2) => `\x1B]8;;${target}\x1B\\${text2}\x1B]8;;\x1B\\` }, inner);
52622
+ return /* @__PURE__ */ import_react39.default.createElement(wv, { transform: (text2) => `\x1B]8;;${target}\x1B\\${text2}\x1B]8;;\x1B\\` }, inner);
52576
52623
  }
52577
52624
  function linkTarget(span) {
52578
52625
  if (span.link) return span.link;
@@ -52618,7 +52665,7 @@ var MIN_DETAIL_LINES = 6;
52618
52665
  var EXPANDED_MODAL_OVERHEAD_ROWS = 12;
52619
52666
  var EXPANDED_DETAIL_CHROME_ROWS = 4;
52620
52667
  function PlanConfirmInner({ plan: plan2, steps, summary, onChoose }) {
52621
- const { stdout } = use_stdout_default();
52668
+ const { stdout } = bv();
52622
52669
  const totalRows = stdout?.rows ?? 40;
52623
52670
  const [expanded, setExpanded] = (0, import_react40.useState)(false);
52624
52671
  const [detailOffset, setDetailOffset] = (0, import_react40.useState)(0);
@@ -52687,8 +52734,8 @@ function PlanConfirmInner({ plan: plan2, steps, summary, onChoose }) {
52687
52734
  metaRight: t("planFlow.approveCardMetaRight"),
52688
52735
  metaRightColor: CARD.plan.color
52689
52736
  },
52690
- openQuestions ? /* @__PURE__ */ import_react40.default.createElement(Box_default, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react40.default.createElement(Text, { color: TONE.warn }, bannerBefore ?? "", /* @__PURE__ */ import_react40.default.createElement(Text, { bold: true }, refineLabel), bannerAfter ?? ""), /* @__PURE__ */ import_react40.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react40.default.createElement(Text, { color: TONE.warn, bold: true }, t("planFlow.openQuestionsHeader")), /* @__PURE__ */ import_react40.default.createElement(MarkdownView, { text: openQuestions }))) : null,
52691
- !expanded || plan2.trim().length === 0 ? /* @__PURE__ */ import_react40.default.createElement(Box_default, { marginBottom: 1, flexDirection: "column" }, effectiveSummary ? /* @__PURE__ */ import_react40.default.createElement(Text, { color: FG.body }, effectiveSummary) : /* @__PURE__ */ import_react40.default.createElement(Text, { color: FG.faint }, t("planFlow.noPlanSummary")), !expanded && hasSteps ? /* @__PURE__ */ import_react40.default.createElement(Box_default, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react40.default.createElement(PlanStepList, { steps })) : null, /* @__PURE__ */ import_react40.default.createElement(Text, { color: FG.faint }, expanded ? t("planFlow.detailExpandedHint") : t("planFlow.detailCollapsedHint"))) : null,
52737
+ openQuestions ? /* @__PURE__ */ import_react40.default.createElement(W, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react40.default.createElement(L, { color: TONE.warn }, bannerBefore ?? "", /* @__PURE__ */ import_react40.default.createElement(L, { bold: true }, refineLabel), bannerAfter ?? ""), /* @__PURE__ */ import_react40.default.createElement(W, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react40.default.createElement(L, { color: TONE.warn, bold: true }, t("planFlow.openQuestionsHeader")), /* @__PURE__ */ import_react40.default.createElement(MarkdownView, { text: openQuestions }))) : null,
52738
+ !expanded || plan2.trim().length === 0 ? /* @__PURE__ */ import_react40.default.createElement(W, { marginBottom: 1, flexDirection: "column" }, effectiveSummary ? /* @__PURE__ */ import_react40.default.createElement(L, { color: FG.body }, effectiveSummary) : /* @__PURE__ */ import_react40.default.createElement(L, { color: FG.faint }, t("planFlow.noPlanSummary")), !expanded && hasSteps ? /* @__PURE__ */ import_react40.default.createElement(W, { marginTop: 1, flexDirection: "column" }, /* @__PURE__ */ import_react40.default.createElement(PlanStepList, { steps })) : null, /* @__PURE__ */ import_react40.default.createElement(L, { color: FG.faint }, expanded ? t("planFlow.detailExpandedHint") : t("planFlow.detailCollapsedHint"))) : null,
52692
52739
  expanded && plan2.trim().length > 0 ? /* @__PURE__ */ import_react40.default.createElement(
52693
52740
  PlanDetailWindow,
52694
52741
  {
@@ -52699,7 +52746,7 @@ function PlanConfirmInner({ plan: plan2, steps, summary, onChoose }) {
52699
52746
  total: planLines.length
52700
52747
  }
52701
52748
  ) : null,
52702
- showDetailScrollHint ? /* @__PURE__ */ import_react40.default.createElement(Box_default, { marginBottom: 1 }, /* @__PURE__ */ import_react40.default.createElement(Text, { color: FG.faint }, t("planFlow.detailScrollHint"))) : null,
52749
+ showDetailScrollHint ? /* @__PURE__ */ import_react40.default.createElement(W, { marginBottom: 1 }, /* @__PURE__ */ import_react40.default.createElement(L, { color: FG.faint }, t("planFlow.detailScrollHint"))) : null,
52703
52750
  /* @__PURE__ */ import_react40.default.createElement(
52704
52751
  SingleSelect,
52705
52752
  {
@@ -52741,7 +52788,7 @@ function PlanDetailWindow({
52741
52788
  end,
52742
52789
  total
52743
52790
  }) {
52744
- return /* @__PURE__ */ import_react40.default.createElement(Box_default, { flexDirection: "column" }, overflow ? /* @__PURE__ */ import_react40.default.createElement(Text, { color: FG.faint }, t("planFlow.detailWindow", { start, end, total })) : null, lines.map((line, i) => /* @__PURE__ */ import_react40.default.createElement(Text, { key: `plan-detail-${start + i}`, wrap: "truncate" }, line.length > 0 ? line : " ")));
52791
+ return /* @__PURE__ */ import_react40.default.createElement(W, { flexDirection: "column" }, overflow ? /* @__PURE__ */ import_react40.default.createElement(L, { color: FG.faint }, t("planFlow.detailWindow", { start, end, total })) : null, lines.map((line, i) => /* @__PURE__ */ import_react40.default.createElement(L, { key: `plan-detail-${start + i}`, wrap: "truncate" }, line.length > 0 ? line : " ")));
52745
52792
  }
52746
52793
  function summarizePlan(plan2, summary, steps) {
52747
52794
  const trimmedSummary = summary?.trim();
@@ -52808,9 +52855,9 @@ function PlanRefineInput({ mode: mode2, questions, onSubmit, onCancel }) {
52808
52855
  title: meta.title,
52809
52856
  footerHint: t("planFlow.refineFooter")
52810
52857
  },
52811
- showQuestions ? /* @__PURE__ */ import_react41.default.createElement(Box_default, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react41.default.createElement(Text, { color: TONE.warn, bold: true }, t("planFlow.refineQuestionsHeading")), /* @__PURE__ */ import_react41.default.createElement(MarkdownView, { text: questions })) : null,
52812
- /* @__PURE__ */ import_react41.default.createElement(Box_default, { marginBottom: 1 }, /* @__PURE__ */ import_react41.default.createElement(Text, { color: FG.sub }, meta.hint, value === "" ? meta.blankHint : "")),
52813
- /* @__PURE__ */ import_react41.default.createElement(Box_default, null, /* @__PURE__ */ import_react41.default.createElement(Text, { color: meta.cursorColor, bold: true }, "\u203A "), /* @__PURE__ */ import_react41.default.createElement(Text, null, value), /* @__PURE__ */ import_react41.default.createElement(Text, { color: meta.cursorColor, bold: true }, cursorOn ? "\u258D" : " "))
52858
+ showQuestions ? /* @__PURE__ */ import_react41.default.createElement(W, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react41.default.createElement(L, { color: TONE.warn, bold: true }, t("planFlow.refineQuestionsHeading")), /* @__PURE__ */ import_react41.default.createElement(MarkdownView, { text: questions })) : null,
52859
+ /* @__PURE__ */ import_react41.default.createElement(W, { marginBottom: 1 }, /* @__PURE__ */ import_react41.default.createElement(L, { color: FG.sub }, meta.hint, value === "" ? meta.blankHint : "")),
52860
+ /* @__PURE__ */ import_react41.default.createElement(W, null, /* @__PURE__ */ import_react41.default.createElement(L, { color: meta.cursorColor, bold: true }, "\u203A "), /* @__PURE__ */ import_react41.default.createElement(L, null, value), /* @__PURE__ */ import_react41.default.createElement(L, { color: meta.cursorColor, bold: true }, cursorOn ? "\u258D" : " "))
52814
52861
  );
52815
52862
  }
52816
52863
 
@@ -52863,15 +52910,15 @@ function PlanReviseConfirmInner({
52863
52910
  kept: keptCount
52864
52911
  })
52865
52912
  },
52866
- /* @__PURE__ */ import_react42.default.createElement(Box_default, { marginBottom: 1 }, /* @__PURE__ */ import_react42.default.createElement(Text, null, reason)),
52867
- summary ? /* @__PURE__ */ import_react42.default.createElement(Box_default, { marginBottom: 1 }, /* @__PURE__ */ import_react42.default.createElement(Text, { dimColor: true }, t("planReviseConfirm.updatedSummary", { summary }))) : null,
52868
- /* @__PURE__ */ import_react42.default.createElement(Box_default, { marginBottom: 1, flexDirection: "column" }, rows.map((row2) => {
52913
+ /* @__PURE__ */ import_react42.default.createElement(W, { marginBottom: 1 }, /* @__PURE__ */ import_react42.default.createElement(L, null, reason)),
52914
+ summary ? /* @__PURE__ */ import_react42.default.createElement(W, { marginBottom: 1 }, /* @__PURE__ */ import_react42.default.createElement(L, { dimColor: true }, t("planReviseConfirm.updatedSummary", { summary }))) : null,
52915
+ /* @__PURE__ */ import_react42.default.createElement(W, { marginBottom: 1, flexDirection: "column" }, rows.map((row2) => {
52869
52916
  const risk = riskDots(row2.step.risk);
52870
52917
  const prefix = row2.kind === "removed" ? "\u2212" : row2.kind === "added" ? "+" : " ";
52871
52918
  const prefixColor = row2.kind === "removed" ? "#f87171" : row2.kind === "added" ? "#4ade80" : "#94a3b8";
52872
52919
  const dim = row2.kind === "kept";
52873
52920
  const strike = row2.kind === "removed";
52874
- return /* @__PURE__ */ import_react42.default.createElement(Box_default, { key: `${row2.kind}-${row2.step.id}` }, /* @__PURE__ */ import_react42.default.createElement(Text, { color: prefixColor, bold: true }, `${prefix} `), /* @__PURE__ */ import_react42.default.createElement(Text, { color: risk.color, bold: true, dimColor: dim }, risk.dots), /* @__PURE__ */ import_react42.default.createElement(Text, { dimColor: dim, strikethrough: strike }, ` ${row2.step.id} \xB7 ${row2.step.title}`));
52921
+ return /* @__PURE__ */ import_react42.default.createElement(W, { key: `${row2.kind}-${row2.step.id}` }, /* @__PURE__ */ import_react42.default.createElement(L, { color: prefixColor, bold: true }, `${prefix} `), /* @__PURE__ */ import_react42.default.createElement(L, { color: risk.color, bold: true, dimColor: dim }, risk.dots), /* @__PURE__ */ import_react42.default.createElement(L, { dimColor: dim, strikethrough: strike }, ` ${row2.step.id} \xB7 ${row2.step.title}`));
52875
52922
  })),
52876
52923
  /* @__PURE__ */ import_react42.default.createElement(
52877
52924
  SingleSelect,
@@ -52990,8 +53037,8 @@ function ReviseRow({
52990
53037
  const marker = row2.done ? "[\u2713]" : row2.skipped ? "[s]" : focused ? "[ ]" : "[ ]";
52991
53038
  const markerColor = row2.done ? TONE.ok : row2.skipped ? FG.faint : focused ? TONE.brand : FG.faint;
52992
53039
  const titleColor = row2.done ? FG.sub : row2.skipped ? FG.faint : focused ? FG.strong : FG.sub;
52993
- const focusGlyph = focused ? /* @__PURE__ */ import_react43.default.createElement(Text, { color: TONE.brand }, "\u25B8 ") : /* @__PURE__ */ import_react43.default.createElement(Text, null, " ");
52994
- return /* @__PURE__ */ import_react43.default.createElement(Box_default, null, focusGlyph, /* @__PURE__ */ import_react43.default.createElement(Text, { color: markerColor }, marker), /* @__PURE__ */ import_react43.default.createElement(Text, { color: titleColor, bold: focused, italic: row2.skipped, strikethrough: row2.skipped }, ` ${index + 1}. ${row2.step.title}`), row2.skipped ? /* @__PURE__ */ import_react43.default.createElement(Text, { color: TONE.warn }, " \u2190 skipped") : null);
53040
+ const focusGlyph = focused ? /* @__PURE__ */ import_react43.default.createElement(L, { color: TONE.brand }, "\u25B8 ") : /* @__PURE__ */ import_react43.default.createElement(L, null, " ");
53041
+ return /* @__PURE__ */ import_react43.default.createElement(W, null, focusGlyph, /* @__PURE__ */ import_react43.default.createElement(L, { color: markerColor }, marker), /* @__PURE__ */ import_react43.default.createElement(L, { color: titleColor, bold: focused, italic: row2.skipped, strikethrough: row2.skipped }, ` ${index + 1}. ${row2.step.title}`), row2.skipped ? /* @__PURE__ */ import_react43.default.createElement(L, { color: TONE.warn }, " \u2190 skipped") : null);
52995
53042
  }
52996
53043
 
52997
53044
  // src/cli/ui/SessionPicker.tsx
@@ -53027,7 +53074,7 @@ function SessionPicker({
53027
53074
  onFocusChange?.(focus);
53028
53075
  }, [focus, onFocusChange]);
53029
53076
  const [renaming, setRenaming] = (0, import_react44.useState)(null);
53030
- const { stdout } = use_stdout_default();
53077
+ const { stdout } = bv();
53031
53078
  const rows = stdout?.rows ?? 40;
53032
53079
  const visibleCount = Math.max(3, rows - PAGE_MARGIN4);
53033
53080
  const snapshot = (0, import_react44.useMemo)(
@@ -53158,13 +53205,13 @@ function SessionPicker({
53158
53205
  const end = Math.min(activeSessions.length, start + visibleCount);
53159
53206
  const shown = activeSessions.slice(start, end);
53160
53207
  const hiddenBelow = activeSessions.length - end;
53161
- return /* @__PURE__ */ import_react44.default.createElement(Box_default, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react44.default.createElement(Box_default, null, /* @__PURE__ */ import_react44.default.createElement(Text, { bold: true, color: TONE.brand }, t("sessionPicker.header")), /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.meta }, ` \xB7 ${workspace}`), hasSearch ? /* @__PURE__ */ import_react44.default.createElement(
53162
- Text,
53208
+ return /* @__PURE__ */ import_react44.default.createElement(W, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react44.default.createElement(W, null, /* @__PURE__ */ import_react44.default.createElement(L, { bold: true, color: TONE.brand }, t("sessionPicker.header")), /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.meta }, ` \xB7 ${workspace}`), hasSearch ? /* @__PURE__ */ import_react44.default.createElement(
53209
+ L,
53163
53210
  {
53164
53211
  color: FG.meta
53165
53212
  },
53166
53213
  ` \xB7 /${query} (${activeSessions.length}/${sessions2.length})`
53167
- ) : null), /* @__PURE__ */ import_react44.default.createElement(Box_default, { height: 1 }), sessions2.length === 0 ? /* @__PURE__ */ import_react44.default.createElement(Box_default, null, /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, t("sessionPicker.empty")), /* @__PURE__ */ import_react44.default.createElement(Text, { bold: true, color: TONE.brand }, "\u23CE"), /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, t("sessionPicker.emptyNew"))) : activeSessions.length === 0 ? /* @__PURE__ */ import_react44.default.createElement(Box_default, null, /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, t("sessionPicker.searchEmpty"))) : shown.map((s, i) => /* @__PURE__ */ import_react44.default.createElement(
53214
+ ) : null), /* @__PURE__ */ import_react44.default.createElement(W, { height: 1 }), sessions2.length === 0 ? /* @__PURE__ */ import_react44.default.createElement(W, null, /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, t("sessionPicker.empty")), /* @__PURE__ */ import_react44.default.createElement(L, { bold: true, color: TONE.brand }, "\u23CE"), /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, t("sessionPicker.emptyNew"))) : activeSessions.length === 0 ? /* @__PURE__ */ import_react44.default.createElement(W, null, /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, t("sessionPicker.searchEmpty"))) : shown.map((s, i) => /* @__PURE__ */ import_react44.default.createElement(
53168
53215
  SessionRow,
53169
53216
  {
53170
53217
  key: s.name,
@@ -53172,7 +53219,7 @@ function SessionPicker({
53172
53219
  focused: start + i === focus,
53173
53220
  walletCurrency
53174
53221
  }
53175
- )), hiddenBelow > 0 ? /* @__PURE__ */ import_react44.default.createElement(Box_default, null, /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, t("cardLabels.more", { count: hiddenBelow }))) : null, renaming ? /* @__PURE__ */ import_react44.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, t("sessionPicker.renamePrompt", { from: renaming.from })), /* @__PURE__ */ import_react44.default.createElement(Text, { bold: true, color: TONE.brand }, renaming.buf), /* @__PURE__ */ import_react44.default.createElement(Text, { backgroundColor: TONE.brand, color: "black" }, " ")) : null, searching ? /* @__PURE__ */ import_react44.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, t("sessionPicker.searchPrompt")), /* @__PURE__ */ import_react44.default.createElement(Text, { bold: true, color: TONE.brand }, query), /* @__PURE__ */ import_react44.default.createElement(Text, { backgroundColor: TONE.brand, color: "black" }, " ")) : null, /* @__PURE__ */ import_react44.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, renaming ? t("sessionPicker.renameHint") : searching ? t("sessionPicker.searchHint") : sessions2.length === 0 ? t("sessionPicker.emptyHint") : t("sessionPicker.pickerHint"))));
53222
+ )), hiddenBelow > 0 ? /* @__PURE__ */ import_react44.default.createElement(W, null, /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, t("cardLabels.more", { count: hiddenBelow }))) : null, renaming ? /* @__PURE__ */ import_react44.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, t("sessionPicker.renamePrompt", { from: renaming.from })), /* @__PURE__ */ import_react44.default.createElement(L, { bold: true, color: TONE.brand }, renaming.buf), /* @__PURE__ */ import_react44.default.createElement(L, { backgroundColor: TONE.brand, color: "black" }, " ")) : null, searching ? /* @__PURE__ */ import_react44.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, t("sessionPicker.searchPrompt")), /* @__PURE__ */ import_react44.default.createElement(L, { bold: true, color: TONE.brand }, query), /* @__PURE__ */ import_react44.default.createElement(L, { backgroundColor: TONE.brand, color: "black" }, " ")) : null, /* @__PURE__ */ import_react44.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, renaming ? t("sessionPicker.renameHint") : searching ? t("sessionPicker.searchHint") : sessions2.length === 0 ? t("sessionPicker.emptyHint") : t("sessionPicker.pickerHint"))));
53176
53223
  }
53177
53224
  function SessionRow({
53178
53225
  info,
@@ -53186,7 +53233,7 @@ function SessionRow({
53186
53233
  const currency = walletCurrency ?? info.meta.balanceCurrency;
53187
53234
  const costLabel = info.meta.totalCostUsd !== void 0 ? formatCost(info.meta.totalCostUsd, currency, 2) : "";
53188
53235
  const time = relativeTime2(info.mtime);
53189
- return /* @__PURE__ */ import_react44.default.createElement(Box_default, null, /* @__PURE__ */ import_react44.default.createElement(Text, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react44.default.createElement(Text, { bold: focused, color: focused ? FG.strong : FG.sub }, info.name.padEnd(12)), /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.meta }, ` \xB7 ${branch.padEnd(8)} \xB7 `), /* @__PURE__ */ import_react44.default.createElement(Text, { color: focused ? FG.body : FG.sub }, truncate2(summary, 40)), /* @__PURE__ */ import_react44.default.createElement(Box_default, { flexGrow: 1 }), /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, `${time.padStart(11)} `), /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, t("sessionPicker.turns", { count: turns })), costLabel ? /* @__PURE__ */ import_react44.default.createElement(Text, { color: FG.faint }, ` \xB7 ${costLabel}`) : null);
53236
+ return /* @__PURE__ */ import_react44.default.createElement(W, null, /* @__PURE__ */ import_react44.default.createElement(L, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react44.default.createElement(L, { bold: focused, color: focused ? FG.strong : FG.sub }, info.name.padEnd(12)), /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.meta }, ` \xB7 ${branch.padEnd(8)} \xB7 `), /* @__PURE__ */ import_react44.default.createElement(L, { color: focused ? FG.body : FG.sub }, truncate2(summary, 40)), /* @__PURE__ */ import_react44.default.createElement(W, { flexGrow: 1 }), /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, `${time.padStart(11)} `), /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, t("sessionPicker.turns", { count: turns })), costLabel ? /* @__PURE__ */ import_react44.default.createElement(L, { color: FG.faint }, ` \xB7 ${costLabel}`) : null);
53190
53237
  }
53191
53238
  function truncate2(s, max) {
53192
53239
  if (s.length <= max) return s;
@@ -53249,7 +53296,7 @@ function ShellConfirm({ prompt, onChoose }) {
53249
53296
  metaRight: t("shellConfirm.awaiting"),
53250
53297
  footerHint: t("shellConfirm.pickFooter")
53251
53298
  },
53252
- /* @__PURE__ */ import_react45.default.createElement(Box_default, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react45.default.createElement(Box_default, null, /* @__PURE__ */ import_react45.default.createElement(Text, { bold: true, color: FG.strong }, "$ "), /* @__PURE__ */ import_react45.default.createElement(Text, { bold: true, color: FG.strong }, prompt.subtitle ?? ""))),
53299
+ /* @__PURE__ */ import_react45.default.createElement(W, { marginBottom: 1, flexDirection: "column" }, /* @__PURE__ */ import_react45.default.createElement(W, null, /* @__PURE__ */ import_react45.default.createElement(L, { bold: true, color: FG.strong }, "$ "), /* @__PURE__ */ import_react45.default.createElement(L, { bold: true, color: FG.strong }, prompt.subtitle ?? ""))),
53253
53300
  /* @__PURE__ */ import_react45.default.createElement(InfoRows2, { meta: prompt.meta }),
53254
53301
  /* @__PURE__ */ import_react45.default.createElement(
53255
53302
  SingleSelect,
@@ -53287,7 +53334,7 @@ function InfoRows2({ meta }) {
53287
53334
  value
53288
53335
  }));
53289
53336
  const labelWidth = Math.max(...rows.map((r) => r.label.length));
53290
- return /* @__PURE__ */ import_react45.default.createElement(Box_default, { flexDirection: "column", marginBottom: 1 }, rows.map((r) => /* @__PURE__ */ import_react45.default.createElement(Box_default, { key: r.label, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react45.default.createElement(Text, { color: FG.faint }, r.label.padEnd(labelWidth)), /* @__PURE__ */ import_react45.default.createElement(Text, { color: FG.body }, r.value))));
53337
+ return /* @__PURE__ */ import_react45.default.createElement(W, { flexDirection: "column", marginBottom: 1 }, rows.map((r) => /* @__PURE__ */ import_react45.default.createElement(W, { key: r.label, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react45.default.createElement(L, { color: FG.faint }, r.label.padEnd(labelWidth)), /* @__PURE__ */ import_react45.default.createElement(L, { color: FG.body }, r.value))));
53291
53338
  }
53292
53339
 
53293
53340
  // src/cli/ui/ThemePicker.tsx
@@ -53303,7 +53350,7 @@ function ThemePicker({
53303
53350
  label: value,
53304
53351
  hint: describeTheme(value, currentPreference, activeTheme)
53305
53352
  }));
53306
- return /* @__PURE__ */ import_react46.default.createElement(Box_default, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react46.default.createElement(Text, { bold: true }, t("themePicker.header")), /* @__PURE__ */ import_react46.default.createElement(
53353
+ return /* @__PURE__ */ import_react46.default.createElement(W, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react46.default.createElement(L, { bold: true }, t("themePicker.header")), /* @__PURE__ */ import_react46.default.createElement(
53307
53354
  SingleSelect,
53308
53355
  {
53309
53356
  items,
@@ -53333,8 +53380,8 @@ function WelcomeBanner({
53333
53380
  const tagline = inCodeMode ? t("ui.taglineCode") : t("ui.taglineChat");
53334
53381
  const taglineSub = t("ui.taglineSub");
53335
53382
  const startTextRaw = t("ui.startSessionHint");
53336
- return /* @__PURE__ */ import_react47.default.createElement(Box_default, { flexDirection: "column", alignItems: "center", marginY: 1 }, /* @__PURE__ */ import_react47.default.createElement(
53337
- Box_default,
53383
+ return /* @__PURE__ */ import_react47.default.createElement(W, { flexDirection: "column", alignItems: "center", marginY: 1 }, /* @__PURE__ */ import_react47.default.createElement(
53384
+ W,
53338
53385
  {
53339
53386
  flexDirection: "column",
53340
53387
  alignItems: "center",
@@ -53343,9 +53390,9 @@ function WelcomeBanner({
53343
53390
  paddingX: 4,
53344
53391
  paddingY: 1
53345
53392
  },
53346
- /* @__PURE__ */ import_react47.default.createElement(Box_default, { flexDirection: "row", gap: 2 }, /* @__PURE__ */ import_react47.default.createElement(Text, { color: TONE.brand, bold: true }, "REASONIX"), /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.faint }, "\xD7"), /* @__PURE__ */ import_react47.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react47.default.createElement(Text, null, "\u{1F40B}"), /* @__PURE__ */ import_react47.default.createElement(Text, { color: TONE.accent, bold: true }, "DeepSeek"))),
53347
- /* @__PURE__ */ import_react47.default.createElement(Box_default, { marginTop: 1, flexDirection: "column", alignItems: "center" }, /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.body }, tagline), /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.meta }, taglineSub))
53348
- ), /* @__PURE__ */ import_react47.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.sub }, startTextRaw)), /* @__PURE__ */ import_react47.default.createElement(Box_default, { marginTop: 1, flexDirection: "row", gap: 3 }, HINTS.map((cmd) => /* @__PURE__ */ import_react47.default.createElement(Text, { key: cmd, color: FG.meta }, cmd))), inCodeMode && workspaceRoot ? /* @__PURE__ */ import_react47.default.createElement(Box_default, { marginTop: 1, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react47.default.createElement(Text, { color: TONE.brand }, t("welcomeBanner.workspace")), /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.faint }, "\xB7"), /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.body }, workspaceRoot), /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.faint }, t("welcomeBanner.relaunchHint"))) : null, dashboardUrl ? /* @__PURE__ */ import_react47.default.createElement(Box_default, { marginTop: 1, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react47.default.createElement(Text, { color: TONE.brand, bold: true }, t("welcomeBanner.dashboard")), /* @__PURE__ */ import_react47.default.createElement(Text, { color: FG.faint }, "\xB7"), /* @__PURE__ */ import_react47.default.createElement(Text, { color: TONE.accent }, dashboardUrl)) : null);
53393
+ /* @__PURE__ */ import_react47.default.createElement(W, { flexDirection: "row", gap: 2 }, /* @__PURE__ */ import_react47.default.createElement(L, { color: TONE.brand, bold: true }, "REASONIX"), /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.faint }, "\xD7"), /* @__PURE__ */ import_react47.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react47.default.createElement(L, null, "\u{1F40B}"), /* @__PURE__ */ import_react47.default.createElement(L, { color: TONE.accent, bold: true }, "DeepSeek"))),
53394
+ /* @__PURE__ */ import_react47.default.createElement(W, { marginTop: 1, flexDirection: "column", alignItems: "center" }, /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.body }, tagline), /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.meta }, taglineSub))
53395
+ ), /* @__PURE__ */ import_react47.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.sub }, startTextRaw)), /* @__PURE__ */ import_react47.default.createElement(W, { marginTop: 1, flexDirection: "row", gap: 3 }, HINTS.map((cmd) => /* @__PURE__ */ import_react47.default.createElement(L, { key: cmd, color: FG.meta }, cmd))), inCodeMode && workspaceRoot ? /* @__PURE__ */ import_react47.default.createElement(W, { marginTop: 1, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react47.default.createElement(L, { color: TONE.brand }, t("welcomeBanner.workspace")), /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.faint }, "\xB7"), /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.body }, workspaceRoot), /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.faint }, t("welcomeBanner.relaunchHint"))) : null, dashboardUrl ? /* @__PURE__ */ import_react47.default.createElement(W, { marginTop: 1, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react47.default.createElement(L, { color: TONE.brand, bold: true }, t("welcomeBanner.dashboard")), /* @__PURE__ */ import_react47.default.createElement(L, { color: FG.faint }, "\xB7"), /* @__PURE__ */ import_react47.default.createElement(L, { color: TONE.accent }, dashboardUrl)) : null);
53349
53396
  }
53350
53397
 
53351
53398
  // src/cli/ui/WorkspacePicker.tsx
@@ -53370,7 +53417,7 @@ function WorkspacePicker({
53370
53417
  (0, import_react48.useEffect)(() => {
53371
53418
  setFocus((f) => Math.max(0, Math.min(f, maxFocus)));
53372
53419
  }, [maxFocus]);
53373
- const { stdout } = use_stdout_default();
53420
+ const { stdout } = bv();
53374
53421
  const rows = stdout?.rows ?? 40;
53375
53422
  const visibleCount = Math.max(3, rows - PAGE_MARGIN5);
53376
53423
  useKeystroke((ev) => {
@@ -53427,13 +53474,13 @@ function WorkspacePicker({
53427
53474
  const end = Math.min(activeWorkspaces.length, start + visibleCount);
53428
53475
  const shown = activeWorkspaces.slice(start, end);
53429
53476
  const hiddenBelow = activeWorkspaces.length - end;
53430
- return /* @__PURE__ */ import_react48.default.createElement(Box_default, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react48.default.createElement(Box_default, null, /* @__PURE__ */ import_react48.default.createElement(Text, { bold: true, color: TONE.brand }, t("workspacePicker.header")), /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.meta }, ` \xB7 ${currentWorkspace}`), hasSearch ? /* @__PURE__ */ import_react48.default.createElement(
53431
- Text,
53477
+ return /* @__PURE__ */ import_react48.default.createElement(W, { flexDirection: "column", marginY: 1 }, /* @__PURE__ */ import_react48.default.createElement(W, null, /* @__PURE__ */ import_react48.default.createElement(L, { bold: true, color: TONE.brand }, t("workspacePicker.header")), /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.meta }, ` \xB7 ${currentWorkspace}`), hasSearch ? /* @__PURE__ */ import_react48.default.createElement(
53478
+ L,
53432
53479
  {
53433
53480
  color: FG.meta
53434
53481
  },
53435
53482
  ` \xB7 /${query} (${activeWorkspaces.length}/${workspaces.length})`
53436
- ) : null), /* @__PURE__ */ import_react48.default.createElement(Box_default, { height: 1 }), workspaces.length === 0 ? /* @__PURE__ */ import_react48.default.createElement(Box_default, null, /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.faint }, t("workspacePicker.empty"))) : activeWorkspaces.length === 0 ? /* @__PURE__ */ import_react48.default.createElement(Box_default, null, /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.faint }, t("workspacePicker.searchEmpty"))) : shown.map((w, i) => /* @__PURE__ */ import_react48.default.createElement(WorkspaceRow, { key: w.path, info: w, focused: start + i === focus })), hiddenBelow > 0 ? /* @__PURE__ */ import_react48.default.createElement(Box_default, null, /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.faint }, t("cardLabels.more", { count: hiddenBelow }))) : null, searching ? /* @__PURE__ */ import_react48.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.faint }, t("workspacePicker.searchPrompt")), /* @__PURE__ */ import_react48.default.createElement(Text, { bold: true, color: TONE.brand }, query), /* @__PURE__ */ import_react48.default.createElement(Text, { backgroundColor: TONE.brand, color: "black" }, " ")) : null, /* @__PURE__ */ import_react48.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.faint }, searching ? t("workspacePicker.searchHint") : t("workspacePicker.pickerHint"))));
53483
+ ) : null), /* @__PURE__ */ import_react48.default.createElement(W, { height: 1 }), workspaces.length === 0 ? /* @__PURE__ */ import_react48.default.createElement(W, null, /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.faint }, t("workspacePicker.empty"))) : activeWorkspaces.length === 0 ? /* @__PURE__ */ import_react48.default.createElement(W, null, /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.faint }, t("workspacePicker.searchEmpty"))) : shown.map((w, i) => /* @__PURE__ */ import_react48.default.createElement(WorkspaceRow, { key: w.path, info: w, focused: start + i === focus })), hiddenBelow > 0 ? /* @__PURE__ */ import_react48.default.createElement(W, null, /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.faint }, t("cardLabels.more", { count: hiddenBelow }))) : null, searching ? /* @__PURE__ */ import_react48.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.faint }, t("workspacePicker.searchPrompt")), /* @__PURE__ */ import_react48.default.createElement(L, { bold: true, color: TONE.brand }, query), /* @__PURE__ */ import_react48.default.createElement(L, { backgroundColor: TONE.brand, color: "black" }, " ")) : null, /* @__PURE__ */ import_react48.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.faint }, searching ? t("workspacePicker.searchHint") : t("workspacePicker.pickerHint"))));
53437
53484
  }
53438
53485
  function WorkspaceRow({
53439
53486
  info,
@@ -53446,7 +53493,7 @@ function WorkspaceRow({
53446
53493
  count: info.sessions
53447
53494
  }
53448
53495
  );
53449
- return /* @__PURE__ */ import_react48.default.createElement(Box_default, null, /* @__PURE__ */ import_react48.default.createElement(Text, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react48.default.createElement(Text, { bold: focused, color: focused ? FG.strong : FG.sub }, label.padEnd(16)), /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.meta }, info.current ? ` \xB7 ${t("workspacePicker.current")} \xB7 ` : " \xB7 "), /* @__PURE__ */ import_react48.default.createElement(Text, { color: focused ? FG.body : FG.sub }, info.path), /* @__PURE__ */ import_react48.default.createElement(Box_default, { flexGrow: 1 }), /* @__PURE__ */ import_react48.default.createElement(Text, { color: FG.faint }, meta));
53496
+ return /* @__PURE__ */ import_react48.default.createElement(W, null, /* @__PURE__ */ import_react48.default.createElement(L, { color: focused ? TONE.brand : FG.faint }, focused ? " \u25B8 " : " "), /* @__PURE__ */ import_react48.default.createElement(L, { bold: focused, color: focused ? FG.strong : FG.sub }, label.padEnd(16)), /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.meta }, info.current ? ` \xB7 ${t("workspacePicker.current")} \xB7 ` : " \xB7 "), /* @__PURE__ */ import_react48.default.createElement(L, { color: focused ? FG.body : FG.sub }, info.path), /* @__PURE__ */ import_react48.default.createElement(W, { flexGrow: 1 }), /* @__PURE__ */ import_react48.default.createElement(L, { color: FG.faint }, meta));
53450
53497
  }
53451
53498
  function oneLine2(s) {
53452
53499
  return s.replace(/\s+/g, " ").trim();
@@ -54590,7 +54637,7 @@ function CompactionCard({ card }) {
54590
54637
  title: "compacted history",
54591
54638
  meta: [`${card.summary.length.toLocaleString()} chars \xB7 ${lines.length} lines`]
54592
54639
  }
54593
- ), previewLines.map((line, i) => /* @__PURE__ */ import_react61.default.createElement(Text, { key: `${card.id}:p:${i}`, color: FG.sub }, line || " ")), hiddenCount > 0 ? /* @__PURE__ */ import_react61.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react61.default.createElement(Text, { color: FG.sub, dimColor: true }, "\u2026 ", hiddenCount, " more line", hiddenCount === 1 ? "" : "s", " (full summary in session log)")) : null);
54640
+ ), previewLines.map((line, i) => /* @__PURE__ */ import_react61.default.createElement(L, { key: `${card.id}:p:${i}`, color: FG.sub }, line || " ")), hiddenCount > 0 ? /* @__PURE__ */ import_react61.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react61.default.createElement(L, { color: FG.sub, dimColor: true }, "\u2026 ", hiddenCount, " more line", hiddenCount === 1 ? "" : "s", " (full summary in session log)")) : null);
54594
54641
  }
54595
54642
 
54596
54643
  // src/cli/ui/cards/CtxCard.tsx
@@ -54598,7 +54645,7 @@ var import_react62 = __toESM(require_react(), 1);
54598
54645
  var BAR_CELLS = 32;
54599
54646
  function row(label, tokens, ratio, color) {
54600
54647
  const filled = Math.max(0, Math.min(BAR_CELLS, Math.round(ratio * BAR_CELLS)));
54601
- return /* @__PURE__ */ import_react62.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react62.default.createElement(Text, { color: FG.sub }, label.padEnd(7)), /* @__PURE__ */ import_react62.default.createElement(Text, { color }, "\u2588".repeat(filled)), /* @__PURE__ */ import_react62.default.createElement(Text, { color: FG.faint }, "\u2591".repeat(BAR_CELLS - filled)), /* @__PURE__ */ import_react62.default.createElement(Text, { bold: true, color: FG.body }, tokens.toLocaleString()), /* @__PURE__ */ import_react62.default.createElement(Text, { color: FG.faint }, `\xB7 ${(ratio * 100).toFixed(1)}%`));
54648
+ return /* @__PURE__ */ import_react62.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react62.default.createElement(L, { color: FG.sub }, label.padEnd(7)), /* @__PURE__ */ import_react62.default.createElement(L, { color }, "\u2588".repeat(filled)), /* @__PURE__ */ import_react62.default.createElement(L, { color: FG.faint }, "\u2591".repeat(BAR_CELLS - filled)), /* @__PURE__ */ import_react62.default.createElement(L, { bold: true, color: FG.body }, tokens.toLocaleString()), /* @__PURE__ */ import_react62.default.createElement(L, { color: FG.faint }, `\xB7 ${(ratio * 100).toFixed(1)}%`));
54602
54649
  }
54603
54650
  function CtxCard({ card }) {
54604
54651
  const cap = Math.max(1, card.ctxMax);
@@ -54612,8 +54659,8 @@ function CtxCard({ card }) {
54612
54659
  title: t("cardTitles.context"),
54613
54660
  meta: [`${used.toLocaleString()} / ${cap.toLocaleString()} (${usedPct.toFixed(1)}%)`]
54614
54661
  }
54615
- ), row(t("cardLabels.system"), card.systemTokens, card.systemTokens / cap, TONE.brand), row(t("cardLabels.tools"), card.toolsTokens, card.toolsTokens / cap, TONE.warn), row(t("cardLabels.log"), card.logTokens, card.logTokens / cap, TONE.ok), row(t("cardLabels.input"), card.inputTokens, card.inputTokens / cap, TONE.accent), card.topTools.length > 0 ? /* @__PURE__ */ import_react62.default.createElement(import_react62.default.Fragment, null, /* @__PURE__ */ import_react62.default.createElement(Text, { color: FG.faint }, `${t("cardLabels.topTools")} \xB7 ${card.toolsCount} ${t("cardLabels.tools")} \xB7 ${card.logMessages} ${t("cardLabels.logMsgs")}`), card.topTools.slice(0, 5).map((tool) => /* @__PURE__ */ import_react62.default.createElement(Box_default, { key: `${tool.turn}-${tool.name}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react62.default.createElement(Text, { color: FG.sub }, tool.name), /* @__PURE__ */ import_react62.default.createElement(
54616
- Text,
54662
+ ), row(t("cardLabels.system"), card.systemTokens, card.systemTokens / cap, TONE.brand), row(t("cardLabels.tools"), card.toolsTokens, card.toolsTokens / cap, TONE.warn), row(t("cardLabels.log"), card.logTokens, card.logTokens / cap, TONE.ok), row(t("cardLabels.input"), card.inputTokens, card.inputTokens / cap, TONE.accent), card.topTools.length > 0 ? /* @__PURE__ */ import_react62.default.createElement(import_react62.default.Fragment, null, /* @__PURE__ */ import_react62.default.createElement(L, { color: FG.faint }, `${t("cardLabels.topTools")} \xB7 ${card.toolsCount} ${t("cardLabels.tools")} \xB7 ${card.logMessages} ${t("cardLabels.logMsgs")}`), card.topTools.slice(0, 5).map((tool) => /* @__PURE__ */ import_react62.default.createElement(W, { key: `${tool.turn}-${tool.name}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react62.default.createElement(L, { color: FG.sub }, tool.name), /* @__PURE__ */ import_react62.default.createElement(
54663
+ L,
54617
54664
  {
54618
54665
  color: FG.faint
54619
54666
  },
@@ -54648,7 +54695,7 @@ function DiffCard({ card }) {
54648
54695
  { text: `-${card.stats.del}`, color: TONE.err }
54649
54696
  ]
54650
54697
  }
54651
- ), card.hunks.map((hunk) => /* @__PURE__ */ import_react63.default.createElement(Box_default, { key: `${card.id}:${hunk.header}`, flexDirection: "column" }, /* @__PURE__ */ import_react63.default.createElement(Text, { italic: true, color: FG.faint }, hunk.header), hunk.lines.map((line, li) => /* @__PURE__ */ import_react63.default.createElement(Box_default, { key: `${card.id}:${hunk.header}:${li}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react63.default.createElement(Text, { color: LINE_COLOR[line.kind] }, LINE_GLYPH[line.kind]), /* @__PURE__ */ import_react63.default.createElement(Text, { color: LINE_COLOR[line.kind], dimColor: line.kind === "ctx" }, line.text))))), showFooter && /* @__PURE__ */ import_react63.default.createElement(Box_default, { flexDirection: "row", gap: 2 }, /* @__PURE__ */ import_react63.default.createElement(Text, { bold: true, color: TONE.ok }, t("cardLabels.applyAction")), /* @__PURE__ */ import_react63.default.createElement(Text, { color: FG.sub }, t("cardLabels.skipAction")), /* @__PURE__ */ import_react63.default.createElement(Text, { bold: true, color: TONE.err }, t("cardLabels.rejectAction"))));
54698
+ ), card.hunks.map((hunk) => /* @__PURE__ */ import_react63.default.createElement(W, { key: `${card.id}:${hunk.header}`, flexDirection: "column" }, /* @__PURE__ */ import_react63.default.createElement(L, { italic: true, color: FG.faint }, hunk.header), hunk.lines.map((line, li) => /* @__PURE__ */ import_react63.default.createElement(W, { key: `${card.id}:${hunk.header}:${li}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react63.default.createElement(L, { color: LINE_COLOR[line.kind] }, LINE_GLYPH[line.kind]), /* @__PURE__ */ import_react63.default.createElement(L, { color: LINE_COLOR[line.kind], dimColor: line.kind === "ctx" }, line.text))))), showFooter && /* @__PURE__ */ import_react63.default.createElement(W, { flexDirection: "row", gap: 2 }, /* @__PURE__ */ import_react63.default.createElement(L, { bold: true, color: TONE.ok }, t("cardLabels.applyAction")), /* @__PURE__ */ import_react63.default.createElement(L, { color: FG.sub }, t("cardLabels.skipAction")), /* @__PURE__ */ import_react63.default.createElement(L, { bold: true, color: TONE.err }, t("cardLabels.rejectAction"))));
54652
54699
  }
54653
54700
 
54654
54701
  // src/cli/ui/cards/DoctorCard.tsx
@@ -54688,7 +54735,7 @@ function DoctorCard({ card }) {
54688
54735
  title: t("cardTitles.doctor"),
54689
54736
  meta: [summary]
54690
54737
  }
54691
- ), card.checks.map((c) => /* @__PURE__ */ import_react64.default.createElement(Box_default, { key: c.label, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react64.default.createElement(Text, { color: levelColor[c.level] }, LEVEL_GLYPH[c.level]), /* @__PURE__ */ import_react64.default.createElement(Text, { bold: true, color: fg.body }, c.label.padEnd(labelWidth + 1)), /* @__PURE__ */ import_react64.default.createElement(Text, { color: fg.sub }, c.detail), /* @__PURE__ */ import_react64.default.createElement(Text, { color: levelColor[c.level] }, levelTag(c.level)))));
54738
+ ), card.checks.map((c) => /* @__PURE__ */ import_react64.default.createElement(W, { key: c.label, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react64.default.createElement(L, { color: levelColor[c.level] }, LEVEL_GLYPH[c.level]), /* @__PURE__ */ import_react64.default.createElement(L, { bold: true, color: fg.body }, c.label.padEnd(labelWidth + 1)), /* @__PURE__ */ import_react64.default.createElement(L, { color: fg.sub }, c.detail), /* @__PURE__ */ import_react64.default.createElement(L, { color: levelColor[c.level] }, levelTag(c.level)))));
54692
54739
  }
54693
54740
 
54694
54741
  // src/cli/ui/cards/ErrorCard.tsx
@@ -54710,10 +54757,10 @@ function ErrorCard({ card }) {
54710
54757
  title: card.title || t("cardTitles.error"),
54711
54758
  meta: retryNote ? [retryNote] : void 0
54712
54759
  }
54713
- ), messageLines.map((line, i) => /* @__PURE__ */ import_react65.default.createElement(Text, { key: `${card.id}:msg:${i}`, color: TONE.err }, line || " ")), hasStack ? /* @__PURE__ */ import_react65.default.createElement(Box_default, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ import_react65.default.createElement(Text, { color: FG.meta }, t("cardLabels.stackTrace")), stackHidden > 0 ? /* @__PURE__ */ import_react65.default.createElement(Text, { color: FG.faint }, t(
54760
+ ), messageLines.map((line, i) => /* @__PURE__ */ import_react65.default.createElement(L, { key: `${card.id}:msg:${i}`, color: TONE.err }, line || " ")), hasStack ? /* @__PURE__ */ import_react65.default.createElement(W, { flexDirection: "column", marginTop: 1 }, /* @__PURE__ */ import_react65.default.createElement(L, { color: FG.meta }, t("cardLabels.stackTrace")), stackHidden > 0 ? /* @__PURE__ */ import_react65.default.createElement(L, { color: FG.faint }, t(
54714
54761
  stackHidden === 1 ? "cardLabels.earlierStackLine" : "cardLabels.earlierStackLines",
54715
54762
  { count: stackHidden }
54716
- )) : null, stackVisible.map((line, i) => /* @__PURE__ */ import_react65.default.createElement(Text, { key: `${card.id}:stk:${stackHidden + i}`, color: FG.meta }, line || " "))) : null);
54763
+ )) : null, stackVisible.map((line, i) => /* @__PURE__ */ import_react65.default.createElement(L, { key: `${card.id}:stk:${stackHidden + i}`, color: FG.meta }, line || " "))) : null);
54717
54764
  }
54718
54765
 
54719
54766
  // src/cli/ui/cards/LiveCard.tsx
@@ -54728,7 +54775,7 @@ var TONE_TO_COLOR = {
54728
54775
  ghost: FG.meta
54729
54776
  };
54730
54777
  var VARIANT_GLYPH = {
54731
- thinking: null,
54778
+ thinking: "\u25C6",
54732
54779
  undo: "\u21B6",
54733
54780
  ctxPressure: "\u26A0",
54734
54781
  aborted: "\u2014",
@@ -54736,12 +54783,15 @@ var VARIANT_GLYPH = {
54736
54783
  checkpoint: "\u25CF",
54737
54784
  stepProgress: "\u2713",
54738
54785
  mcpEvent: "\u25CF",
54739
- sessionOp: "\u25CB"
54786
+ sessionOp: "\u25CF"
54740
54787
  };
54788
+ var PULSING_VARIANTS = /* @__PURE__ */ new Set(["thinking", "retry", "sessionOp"]);
54741
54789
  function LiveCard({ card }) {
54742
54790
  const color = TONE_TO_COLOR[card.tone];
54743
- const glyph = VARIANT_GLYPH[card.variant];
54744
- return /* @__PURE__ */ import_react66.default.createElement(Box_default, { paddingLeft: 2, flexDirection: "row", gap: 1 }, card.variant === "thinking" ? /* @__PURE__ */ import_react66.default.createElement(Spinner, { kind: "circle", color, bold: true }) : /* @__PURE__ */ import_react66.default.createElement(Text, { bold: true, color }, glyph), /* @__PURE__ */ import_react66.default.createElement(Text, { color: FG.body }, card.text), card.meta !== void 0 ? /* @__PURE__ */ import_react66.default.createElement(Text, { color: FG.faint }, `\xB7 ${card.meta}`) : null);
54791
+ const isPulsing = PULSING_VARIANTS.has(card.variant);
54792
+ const frames = card.variant === "thinking" ? PULSE_DIAMOND : PULSE_CIRCLE;
54793
+ const settled = VARIANT_GLYPH[card.variant];
54794
+ return /* @__PURE__ */ import_react66.default.createElement(W, { paddingLeft: 2, flexDirection: "row", gap: 1 }, isPulsing ? /* @__PURE__ */ import_react66.default.createElement(Pulse, { active: true, frames, settled, color }) : /* @__PURE__ */ import_react66.default.createElement(L, { bold: true, color }, VARIANT_GLYPH[card.variant]), /* @__PURE__ */ import_react66.default.createElement(L, { color: FG.body }, card.text), card.meta !== void 0 ? /* @__PURE__ */ import_react66.default.createElement(L, { color: FG.faint }, `\xB7 ${card.meta}`) : null);
54745
54795
  }
54746
54796
 
54747
54797
  // src/cli/ui/cards/MemoryCard.tsx
@@ -54792,7 +54842,7 @@ function MemoryCard({ card }) {
54792
54842
  const all = card.entries.filter((e) => e.category === category);
54793
54843
  const shown = all.slice(0, 5);
54794
54844
  const remaining = all.length - shown.length;
54795
- return /* @__PURE__ */ import_react67.default.createElement(Box_default, { key: category, flexDirection: "column" }, /* @__PURE__ */ import_react67.default.createElement(Text, { color: FG.faint }, `${categoryLabel(category)} (${counts[category]})`), shown.map((entry) => /* @__PURE__ */ import_react67.default.createElement(Box_default, { key: `${category}:${entry.summary}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react67.default.createElement(Text, { color: CATEGORY_GLYPH_COLOR[category] }, CATEGORY_GLYPH[category]), /* @__PURE__ */ import_react67.default.createElement(Text, { color: FG.sub }, entry.summary))), remaining > 0 ? /* @__PURE__ */ import_react67.default.createElement(Text, { color: FG.faint }, t("cardLabels.more", { count: remaining })) : null);
54845
+ return /* @__PURE__ */ import_react67.default.createElement(W, { key: category, flexDirection: "column" }, /* @__PURE__ */ import_react67.default.createElement(L, { color: FG.faint }, `${categoryLabel(category)} (${counts[category]})`), shown.map((entry) => /* @__PURE__ */ import_react67.default.createElement(W, { key: `${category}:${entry.summary}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react67.default.createElement(L, { color: CATEGORY_GLYPH_COLOR[category] }, CATEGORY_GLYPH[category]), /* @__PURE__ */ import_react67.default.createElement(L, { color: FG.sub }, entry.summary))), remaining > 0 ? /* @__PURE__ */ import_react67.default.createElement(L, { color: FG.faint }, t("cardLabels.more", { count: remaining })) : null);
54796
54846
  }));
54797
54847
  }
54798
54848
  function countByCategory(entries) {
@@ -54812,9 +54862,7 @@ var import_react71 = __toESM(require_react(), 1);
54812
54862
  // src/cli/ui/primitives/CursorBlock.tsx
54813
54863
  var import_react68 = __toESM(require_react(), 1);
54814
54864
  function CursorBlock() {
54815
- const tick = useTick();
54816
- const on = Math.floor(tick / 4) % 2 === 0;
54817
- return /* @__PURE__ */ import_react68.default.createElement(Text, { inverse: on, color: CARD.streaming.color }, " ");
54865
+ return /* @__PURE__ */ import_react68.default.createElement(L, { inverse: true, color: CARD.streaming.color }, " ");
54818
54866
  }
54819
54867
 
54820
54868
  // src/cli/ui/state/verbose-context.ts
@@ -54893,7 +54941,7 @@ function ReasoningCard({
54893
54941
  card,
54894
54942
  expanded
54895
54943
  }) {
54896
- const { stdout } = use_stdout_default();
54944
+ const { stdout } = bv();
54897
54945
  const cols = stdout?.columns ?? 80;
54898
54946
  const lineCells = Math.max(20, cols - 4);
54899
54947
  const verbose = import_react71.default.useContext(VerboseContext);
@@ -54902,33 +54950,32 @@ function ReasoningCard({
54902
54950
  const isEmpty = !card.streaming && !card.aborted && card.text.length === 0;
54903
54951
  const showBody = expanded && (card.text.length > 0 || card.streaming || isEmpty);
54904
54952
  const tone = card.aborted ? TONE.err : card.streaming ? TONE_ACTIVE.accent : TONE.accent;
54905
- return /* @__PURE__ */ import_react71.default.createElement(Card, { tone }, /* @__PURE__ */ import_react71.default.createElement(ReasoningHeader, { card, isEmpty }), showBody && (isEmpty ? /* @__PURE__ */ import_react71.default.createElement(EmptyHint, null) : card.streaming ? /* @__PURE__ */ import_react71.default.createElement(StreamingPreview, { card, visualLines, lineCells }) : verbose ? /* @__PURE__ */ import_react71.default.createElement(BodyLines, { card, lines: visualLines, lineCells, anchor: true }) : /* @__PURE__ */ import_react71.default.createElement(SettledPreview, { card, visualLines, lineCells })));
54953
+ return /* @__PURE__ */ import_react71.default.createElement(Card, { tone }, /* @__PURE__ */ import_react71.default.createElement(ReasoningHeader, { card, isEmpty, expanded }), showBody && (isEmpty ? /* @__PURE__ */ import_react71.default.createElement(EmptyHint, null) : card.streaming ? /* @__PURE__ */ import_react71.default.createElement(StreamingPreview, { card, visualLines, lineCells }) : verbose ? /* @__PURE__ */ import_react71.default.createElement(BodyLines, { card, lines: visualLines, lineCells, anchor: true }) : /* @__PURE__ */ import_react71.default.createElement(SettledPreview, { card, visualLines, lineCells })));
54906
54954
  }
54907
54955
  function ReasoningHeader({
54908
54956
  card,
54909
- isEmpty
54957
+ isEmpty,
54958
+ expanded
54910
54959
  }) {
54911
54960
  const streamingActive = card.streaming && !card.aborted;
54912
- const headColor = card.aborted ? TONE.err : streamingActive ? TONE_ACTIVE.accent : isEmpty ? FG.faint : TONE.accent;
54913
- const glyph = streamingActive ? "\u25CB" : "\u25CF";
54914
- const title2 = streamingActive ? t("cardTitles.reasoningEllipsis") : card.aborted ? t("cardTitles.reasoningAborted") : t("cardTitles.reasoning");
54915
- const pill = isEmpty ? PILL_SECTION.empty : PILL_SECTION.reason;
54916
- const meta = [];
54961
+ const baseTitle = card.aborted ? t("cardTitles.reasoningAborted") : streamingActive ? t("cardTitles.reasoningEllipsis") : t("cardTitles.reasoning");
54962
+ const metaParts = [];
54917
54963
  const m = headerMeta(card);
54918
- if (m) meta.push(m);
54964
+ if (m) metaParts.push(m);
54919
54965
  const duration = headerDuration(card);
54920
- if (duration) meta.push(duration);
54966
+ if (duration) metaParts.push(duration);
54967
+ const metaTrail2 = metaParts.length > 0 ? ` \xB7 ${metaParts.join(" \xB7 ")}` : "";
54968
+ const collapsedHint = !expanded && card.text.length > 0 ? " (\u2303o to expand)" : "";
54921
54969
  const modelBadge = card.model ? modelBadgeFor(card.model) : null;
54922
- return /* @__PURE__ */ import_react71.default.createElement(
54923
- CardHeader,
54970
+ return /* @__PURE__ */ import_react71.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react71.default.createElement(
54971
+ Pulse,
54924
54972
  {
54925
- glyph,
54926
- tone: headColor,
54927
- title: title2,
54928
- meta: meta.length > 0 ? meta : void 0,
54929
- right: /* @__PURE__ */ import_react71.default.createElement(import_react71.default.Fragment, null, streamingActive ? /* @__PURE__ */ import_react71.default.createElement(Spinner, { kind: "braille", color: TONE_ACTIVE.accent }) : null, modelBadge ? /* @__PURE__ */ import_react71.default.createElement(Pill2, { label: modelBadge.label, ...PILL_MODEL[modelBadge.kind], bold: false }) : null)
54973
+ active: streamingActive,
54974
+ frames: PULSE_DIAMOND,
54975
+ settled: "\u25C6",
54976
+ color: card.aborted ? TONE.err : FG.faint
54930
54977
  }
54931
- );
54978
+ ), /* @__PURE__ */ import_react71.default.createElement(L, { italic: true, dimColor: true, color: card.aborted ? TONE.err : void 0 }, `${baseTitle}${metaTrail2}${collapsedHint}`), modelBadge ? /* @__PURE__ */ import_react71.default.createElement(Pill2, { label: modelBadge.label, ...PILL_MODEL[modelBadge.kind], bold: false }) : null);
54932
54979
  }
54933
54980
  function headerMeta(card) {
54934
54981
  if (card.streaming) {
@@ -54947,7 +54994,7 @@ function headerDuration(card) {
54947
54994
  function StreamingPreview({ card, visualLines, lineCells }) {
54948
54995
  const visible = visualLines.slice(-STREAMING_PREVIEW_LINES);
54949
54996
  const hasOverflow = visualLines.length > visible.length;
54950
- return /* @__PURE__ */ import_react71.default.createElement(import_react71.default.Fragment, null, hasOverflow ? /* @__PURE__ */ import_react71.default.createElement(Text, { color: FG.faint }, "\u22EE") : null, /* @__PURE__ */ import_react71.default.createElement(
54997
+ return /* @__PURE__ */ import_react71.default.createElement(import_react71.default.Fragment, null, hasOverflow ? /* @__PURE__ */ import_react71.default.createElement(L, { color: FG.faint }, "\u22EE") : null, /* @__PURE__ */ import_react71.default.createElement(
54951
54998
  BodyLines,
54952
54999
  {
54953
55000
  card,
@@ -54982,7 +55029,7 @@ function SettledPreview({ card, visualLines, lineCells }) {
54982
55029
  ));
54983
55030
  }
54984
55031
  function EmptyHint() {
54985
- return /* @__PURE__ */ import_react71.default.createElement(Text, { italic: true, color: FG.faint }, "no thinking \u2014 direct answer");
55032
+ return /* @__PURE__ */ import_react71.default.createElement(L, { italic: true, color: FG.faint }, "no thinking \u2014 direct answer");
54986
55033
  }
54987
55034
  function BodyLines({
54988
55035
  card,
@@ -54997,17 +55044,17 @@ function BodyLines({
54997
55044
  return /* @__PURE__ */ import_react71.default.createElement(import_react71.default.Fragment, null, lines.map((line, i) => {
54998
55045
  const isLast = i === lines.length - 1;
54999
55046
  const isFirst = i === 0;
55000
- return /* @__PURE__ */ import_react71.default.createElement(Box_default, { key: `${card.id}:b:${indexOffset + i}`, flexDirection: "row", gap: 1 }, anchor ? /* @__PURE__ */ import_react71.default.createElement(Text, { color: tone }, isFirst ? "\u21B3" : " ") : null, /* @__PURE__ */ import_react71.default.createElement(Text, { italic: true, color: FG.meta }, clipToCells(line, innerCells)), isLast && cursorOnLast && /* @__PURE__ */ import_react71.default.createElement(CursorBlock, null));
55047
+ return /* @__PURE__ */ import_react71.default.createElement(W, { key: `${card.id}:b:${indexOffset + i}`, flexDirection: "row", gap: 1 }, anchor ? /* @__PURE__ */ import_react71.default.createElement(L, { color: tone }, isFirst ? "\u21B3" : " ") : null, /* @__PURE__ */ import_react71.default.createElement(L, { italic: true, color: FG.meta }, clipToCells(line, innerCells)), isLast && cursorOnLast && /* @__PURE__ */ import_react71.default.createElement(CursorBlock, null));
55001
55048
  }));
55002
55049
  }
55003
55050
  function MidElisionHint({ droppedLines }) {
55004
- return /* @__PURE__ */ import_react71.default.createElement(Text, { color: FG.faint }, `\u22EF ${droppedLines} line${droppedLines === 1 ? "" : "s"} elided`);
55051
+ return /* @__PURE__ */ import_react71.default.createElement(L, { color: FG.faint }, `\u22EF ${droppedLines} line${droppedLines === 1 ? "" : "s"} elided`);
55005
55052
  }
55006
55053
  function ScrollPastHint({ card }) {
55007
55054
  const parts = [];
55008
55055
  if (card.paragraphs > 0) parts.push(`${card.paragraphs} \xB6`);
55009
55056
  if (card.tokens > 0) parts.push(`~${card.tokens.toLocaleString()} tok`);
55010
- return /* @__PURE__ */ import_react71.default.createElement(Text, { color: FG.faint }, `\u22EF ${parts.join(" + ")} scrolled past \xB7 /reasoning last`);
55057
+ return /* @__PURE__ */ import_react71.default.createElement(L, { color: FG.faint }, `\u22EF ${parts.join(" + ")} scrolled past \xB7 /reasoning last`);
55011
55058
  }
55012
55059
 
55013
55060
  // src/cli/ui/cards/SearchCard.tsx
@@ -55029,7 +55076,7 @@ function SearchCard({ card }) {
55029
55076
  subtitle: `"${card.query}"`,
55030
55077
  meta: [stats3, elapsed]
55031
55078
  }
55032
- ), grouped.map(([file, hits]) => /* @__PURE__ */ import_react72.default.createElement(Box_default, { key: file, flexDirection: "column" }, /* @__PURE__ */ import_react72.default.createElement(Text, { bold: true, color: FG.strong }, file), hits.map((h, i) => /* @__PURE__ */ import_react72.default.createElement(Box_default, { key: `${file}:${h.line}:${i}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react72.default.createElement(Text, { color: FG.faint }, `${h.line.toString().padStart(4)} \u2502`), /* @__PURE__ */ import_react72.default.createElement(HighlightedLine, { text: h.preview, start: h.matchStart, end: h.matchEnd }))))), card.hits.length > 10 ? /* @__PURE__ */ import_react72.default.createElement(Text, { color: FG.faint }, t(
55079
+ ), grouped.map(([file, hits]) => /* @__PURE__ */ import_react72.default.createElement(W, { key: file, flexDirection: "column" }, /* @__PURE__ */ import_react72.default.createElement(L, { bold: true, color: FG.strong }, file), hits.map((h, i) => /* @__PURE__ */ import_react72.default.createElement(W, { key: `${file}:${h.line}:${i}`, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react72.default.createElement(L, { color: FG.faint }, `${h.line.toString().padStart(4)} \u2502`), /* @__PURE__ */ import_react72.default.createElement(HighlightedLine, { text: h.preview, start: h.matchStart, end: h.matchEnd }))))), card.hits.length > 10 ? /* @__PURE__ */ import_react72.default.createElement(L, { color: FG.faint }, t(
55033
55080
  card.hits.length - 10 === 1 ? "cardLabels.moreHitSingular" : "cardLabels.moreHitsPlural",
55034
55081
  { count: card.hits.length - 10 }
55035
55082
  )) : null);
@@ -55040,9 +55087,9 @@ function HighlightedLine({
55040
55087
  end
55041
55088
  }) {
55042
55089
  if (start < 0 || end <= start || end > text2.length) {
55043
- return /* @__PURE__ */ import_react72.default.createElement(Text, { color: FG.sub }, text2);
55090
+ return /* @__PURE__ */ import_react72.default.createElement(L, { color: FG.sub }, text2);
55044
55091
  }
55045
- return /* @__PURE__ */ import_react72.default.createElement(import_react72.default.Fragment, null, /* @__PURE__ */ import_react72.default.createElement(Text, { color: FG.sub }, text2.slice(0, start)), /* @__PURE__ */ import_react72.default.createElement(Text, { bold: true, inverse: true }, text2.slice(start, end)), /* @__PURE__ */ import_react72.default.createElement(Text, { color: FG.sub }, text2.slice(end)));
55092
+ return /* @__PURE__ */ import_react72.default.createElement(import_react72.default.Fragment, null, /* @__PURE__ */ import_react72.default.createElement(L, { color: FG.sub }, text2.slice(0, start)), /* @__PURE__ */ import_react72.default.createElement(L, { bold: true, inverse: true }, text2.slice(start, end)), /* @__PURE__ */ import_react72.default.createElement(L, { color: FG.sub }, text2.slice(end)));
55046
55093
  }
55047
55094
  function groupByFile(hits) {
55048
55095
  const map = /* @__PURE__ */ new Map();
@@ -55069,13 +55116,13 @@ var MarkdownWidthCtx = import_react74.default.createContext(void 0);
55069
55116
  function useWidth() {
55070
55117
  const ctx = import_react74.default.useContext(MarkdownWidthCtx);
55071
55118
  if (ctx !== void 0) return ctx;
55072
- return (use_stdout_default()?.stdout?.columns ?? process.stdout.columns ?? 80) - BODY_LEFT_CELLS;
55119
+ return (bv()?.stdout?.columns ?? process.stdout.columns ?? 80) - BODY_LEFT_CELLS;
55073
55120
  }
55074
55121
  marked.setOptions({ gfm: true, breaks: false });
55075
55122
  function Markdown({ text: text2, width }) {
55076
55123
  const tokens = import_react74.default.useMemo(() => marked.lexer(text2), [text2]);
55077
55124
  const ctxWidth = width !== void 0 ? Math.max(1, width) : void 0;
55078
- return /* @__PURE__ */ import_react74.default.createElement(MarkdownWidthCtx.Provider, { value: ctxWidth }, /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column", gap: 1 }, tokens.map((token, i) => /* @__PURE__ */ import_react74.default.createElement(BlockToken, { key: `${i}-${token.type}`, token }))));
55125
+ return /* @__PURE__ */ import_react74.default.createElement(MarkdownWidthCtx.Provider, { value: ctxWidth }, /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column", gap: 1 }, tokens.map((token, i) => /* @__PURE__ */ import_react74.default.createElement(BlockToken, { key: `${i}-${token.type}`, token }))));
55079
55126
  }
55080
55127
  function BlockToken({ token }) {
55081
55128
  switch (token.type) {
@@ -55094,21 +55141,21 @@ function BlockToken({ token }) {
55094
55141
  case "table":
55095
55142
  return /* @__PURE__ */ import_react74.default.createElement(Table, { token });
55096
55143
  case "html":
55097
- return /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.body }, token.text);
55144
+ return /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.body }, token.text);
55098
55145
  case "space":
55099
55146
  return null;
55100
55147
  default:
55101
- return /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.body }, token.raw ?? "");
55148
+ return /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.body }, token.raw ?? "");
55102
55149
  }
55103
55150
  }
55104
55151
  function Heading({ token }) {
55105
- return /* @__PURE__ */ import_react74.default.createElement(Box_default, null, /* @__PURE__ */ import_react74.default.createElement(Text, { bold: true, color: FG.strong, backgroundColor: SURFACE.bgElev }, ` ${plainText(token.tokens)} `));
55152
+ return /* @__PURE__ */ import_react74.default.createElement(W, null, /* @__PURE__ */ import_react74.default.createElement(L, { bold: true, color: FG.strong, backgroundColor: SURFACE.bgElev }, ` ${plainText(token.tokens)} `));
55106
55153
  }
55107
55154
  function Paragraph({ token }) {
55108
- return /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.body }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens ?? [] }));
55155
+ return /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.body }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens ?? [] }));
55109
55156
  }
55110
55157
  function List({ token, depth }) {
55111
- return /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column" }, token.items.map((item, i) => /* @__PURE__ */ import_react74.default.createElement(
55158
+ return /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column" }, token.items.map((item, i) => /* @__PURE__ */ import_react74.default.createElement(
55112
55159
  ListItem,
55113
55160
  {
55114
55161
  key: `${i}-${item.text.slice(0, 24)}`,
@@ -55129,12 +55176,12 @@ function ListItem({
55129
55176
  const markerColor = item.task ? item.checked ? TONE.ok : FG.faint : FG.meta;
55130
55177
  const dim = item.task && item.checked === true;
55131
55178
  const indent = " ".repeat(depth + 1);
55132
- return /* @__PURE__ */ import_react74.default.createElement(Box_default, null, /* @__PURE__ */ import_react74.default.createElement(Text, { color: markerColor }, `${indent}${marker} `), /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column" }, item.tokens.map((tok, i) => {
55179
+ return /* @__PURE__ */ import_react74.default.createElement(W, null, /* @__PURE__ */ import_react74.default.createElement(L, { color: markerColor }, `${indent}${marker} `), /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column" }, item.tokens.map((tok, i) => {
55133
55180
  if (tok.type === "text") {
55134
55181
  const inner = tok.tokens;
55135
55182
  return (
55136
55183
  // biome-ignore lint/suspicious/noArrayIndexKey: list-item children are positional and stable per render
55137
- /* @__PURE__ */ import_react74.default.createElement(Text, { key: `t-${i}`, color: dim ? FG.faint : FG.body, strikethrough: dim }, inner ? /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: inner }) : tok.text)
55184
+ /* @__PURE__ */ import_react74.default.createElement(L, { key: `t-${i}`, color: dim ? FG.faint : FG.body, strikethrough: dim }, inner ? /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: inner }) : tok.text)
55138
55185
  );
55139
55186
  }
55140
55187
  if (tok.type === "list") {
@@ -55149,9 +55196,9 @@ function CodeBlock2({ token }) {
55149
55196
  () => highlightCode(decodeHtmlEntities(token.text), lang).split("\n"),
55150
55197
  [token.text, lang]
55151
55198
  );
55152
- return /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column" }, lang ? /* @__PURE__ */ import_react74.default.createElement(Box_default, null, /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.meta }, ` ${lang}`)) : null, /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column" }, lines.map((line, i) => (
55199
+ return /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column" }, lang ? /* @__PURE__ */ import_react74.default.createElement(W, null, /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.meta }, ` ${lang}`)) : null, /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column" }, lines.map((line, i) => (
55153
55200
  // biome-ignore lint/suspicious/noArrayIndexKey: code lines are positional and stable per render
55154
- /* @__PURE__ */ import_react74.default.createElement(Text, { key: `code-${i}`, backgroundColor: SURFACE.bgElev }, ` ${line} `)
55201
+ /* @__PURE__ */ import_react74.default.createElement(L, { key: `code-${i}`, backgroundColor: SURFACE.bgElev }, ` ${line} `)
55155
55202
  ))));
55156
55203
  }
55157
55204
  function highlightCode(source, lang) {
@@ -55164,12 +55211,12 @@ function highlightCode(source, lang) {
55164
55211
  }
55165
55212
  }
55166
55213
  function Blockquote({ token }) {
55167
- return /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column" }, (token.tokens ?? []).map((child, i) => /* @__PURE__ */ import_react74.default.createElement(Box_default, { key: `${i}-${child.type}`, flexDirection: "row" }, /* @__PURE__ */ import_react74.default.createElement(Text, { color: TONE.brand }, " \u258E "), /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column", flexGrow: 1 }, child.type === "paragraph" ? /* @__PURE__ */ import_react74.default.createElement(Text, { italic: true, color: FG.sub }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: child.tokens ?? [] })) : /* @__PURE__ */ import_react74.default.createElement(BlockToken, { token: child })))));
55214
+ return /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column" }, (token.tokens ?? []).map((child, i) => /* @__PURE__ */ import_react74.default.createElement(W, { key: `${i}-${child.type}`, flexDirection: "row" }, /* @__PURE__ */ import_react74.default.createElement(L, { color: TONE.brand }, " \u258E "), /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column", flexGrow: 1 }, child.type === "paragraph" ? /* @__PURE__ */ import_react74.default.createElement(L, { italic: true, color: FG.sub }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: child.tokens ?? [] })) : /* @__PURE__ */ import_react74.default.createElement(BlockToken, { token: child })))));
55168
55215
  }
55169
55216
  function HorizontalRule() {
55170
55217
  const width = useWidth();
55171
55218
  const rule = "\u2500".repeat(Math.max(width, 1));
55172
- return /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.faint }, ` ${rule}`);
55219
+ return /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.faint }, ` ${rule}`);
55173
55220
  }
55174
55221
  function tableLayout(headerCells, bodyCells, availableWidth) {
55175
55222
  const colCount = headerCells.length;
@@ -55225,14 +55272,14 @@ function ColumnarTable({
55225
55272
  gap
55226
55273
  }) {
55227
55274
  const ruleRow = widths.map((w) => "\u2500".repeat(w)).join(gap);
55228
- return /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column" }, /* @__PURE__ */ import_react74.default.createElement(Box_default, null, /* @__PURE__ */ import_react74.default.createElement(Text, null, " "), headerCells.map((cell, i) => (
55275
+ return /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column" }, /* @__PURE__ */ import_react74.default.createElement(W, null, /* @__PURE__ */ import_react74.default.createElement(L, null, " "), headerCells.map((cell, i) => (
55229
55276
  // biome-ignore lint/suspicious/noArrayIndexKey: header cells positional
55230
- /* @__PURE__ */ import_react74.default.createElement(import_react74.default.Fragment, { key: `h-${i}` }, /* @__PURE__ */ import_react74.default.createElement(Text, { bold: true, color: FG.sub }, padToCells(cell, widths[i])), i < colCount - 1 ? /* @__PURE__ */ import_react74.default.createElement(Text, null, gap) : null)
55231
- ))), /* @__PURE__ */ import_react74.default.createElement(Box_default, null, /* @__PURE__ */ import_react74.default.createElement(Text, null, " "), /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.faint }, ruleRow)), bodyCells.map((row2, ri) => (
55277
+ /* @__PURE__ */ import_react74.default.createElement(import_react74.default.Fragment, { key: `h-${i}` }, /* @__PURE__ */ import_react74.default.createElement(L, { bold: true, color: FG.sub }, padToCells(cell, widths[i])), i < colCount - 1 ? /* @__PURE__ */ import_react74.default.createElement(L, null, gap) : null)
55278
+ ))), /* @__PURE__ */ import_react74.default.createElement(W, null, /* @__PURE__ */ import_react74.default.createElement(L, null, " "), /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.faint }, ruleRow)), bodyCells.map((row2, ri) => (
55232
55279
  // biome-ignore lint/suspicious/noArrayIndexKey: body rows positional
55233
- /* @__PURE__ */ import_react74.default.createElement(Box_default, { key: `tr-${ri}` }, /* @__PURE__ */ import_react74.default.createElement(Text, null, " "), row2.map((cell, i) => (
55280
+ /* @__PURE__ */ import_react74.default.createElement(W, { key: `tr-${ri}` }, /* @__PURE__ */ import_react74.default.createElement(L, null, " "), row2.map((cell, i) => (
55234
55281
  // biome-ignore lint/suspicious/noArrayIndexKey: cells positional
55235
- /* @__PURE__ */ import_react74.default.createElement(import_react74.default.Fragment, { key: `c-${ri}-${i}` }, /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.body }, padToCells(cell ?? "", widths[i])), i < colCount - 1 ? /* @__PURE__ */ import_react74.default.createElement(Text, null, gap) : null)
55282
+ /* @__PURE__ */ import_react74.default.createElement(import_react74.default.Fragment, { key: `c-${ri}-${i}` }, /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.body }, padToCells(cell ?? "", widths[i])), i < colCount - 1 ? /* @__PURE__ */ import_react74.default.createElement(L, null, gap) : null)
55236
55283
  )))
55237
55284
  )));
55238
55285
  }
@@ -55242,14 +55289,14 @@ function FallbackTable({
55242
55289
  labelPad,
55243
55290
  valueCells
55244
55291
  }) {
55245
- return /* @__PURE__ */ import_react74.default.createElement(Box_default, { flexDirection: "column" }, bodyCells.map((row2, ri) => (
55292
+ return /* @__PURE__ */ import_react74.default.createElement(W, { flexDirection: "column" }, bodyCells.map((row2, ri) => (
55246
55293
  // biome-ignore lint/suspicious/noArrayIndexKey: body rows positional
55247
- /* @__PURE__ */ import_react74.default.createElement(Box_default, { key: `fr-${ri}`, flexDirection: "column" }, ri > 0 ? /* @__PURE__ */ import_react74.default.createElement(Text, null, " ") : null, headerCells.map((h, ci) => {
55294
+ /* @__PURE__ */ import_react74.default.createElement(W, { key: `fr-${ri}`, flexDirection: "column" }, ri > 0 ? /* @__PURE__ */ import_react74.default.createElement(L, null, " ") : null, headerCells.map((h, ci) => {
55248
55295
  const label = `${padToCells(h, labelPad - 2)}: `;
55249
55296
  const lines = wrapToCells(row2[ci] ?? "", valueCells);
55250
55297
  return lines.map((line, li) => (
55251
55298
  // biome-ignore lint/suspicious/noArrayIndexKey: fallback table lines are positional
55252
- /* @__PURE__ */ import_react74.default.createElement(Box_default, { key: `fc-${ri}-${ci}-${li}` }, li === 0 ? /* @__PURE__ */ import_react74.default.createElement(Text, { bold: true, color: FG.sub }, label) : /* @__PURE__ */ import_react74.default.createElement(Text, null, padToCells("", labelPad)), /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.body }, line))
55299
+ /* @__PURE__ */ import_react74.default.createElement(W, { key: `fc-${ri}-${ci}-${li}` }, li === 0 ? /* @__PURE__ */ import_react74.default.createElement(L, { bold: true, color: FG.sub }, label) : /* @__PURE__ */ import_react74.default.createElement(L, null, padToCells("", labelPad)), /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.body }, line))
55253
55300
  ));
55254
55301
  }))
55255
55302
  )));
@@ -55266,10 +55313,10 @@ function looksLikeFileRef(path, hasLine) {
55266
55313
  return ext.length >= 2;
55267
55314
  }
55268
55315
  function osc8(children, target, color) {
55269
- return /* @__PURE__ */ import_react74.default.createElement(Transform, { transform: (text2) => `\x1B]8;;${target}\x1B\\${text2}\x1B]8;;\x1B\\` }, /* @__PURE__ */ import_react74.default.createElement(Text, { color, underline: true }, children));
55316
+ return /* @__PURE__ */ import_react74.default.createElement(wv, { transform: (text2) => `\x1B]8;;${target}\x1B\\${text2}\x1B]8;;\x1B\\` }, /* @__PURE__ */ import_react74.default.createElement(L, { color, underline: true }, children));
55270
55317
  }
55271
55318
  function renderInlineText(raw) {
55272
- if (!raw) return /* @__PURE__ */ import_react74.default.createElement(Text, null, raw);
55319
+ if (!raw) return /* @__PURE__ */ import_react74.default.createElement(L, null, raw);
55273
55320
  const out = [];
55274
55321
  let cursor = 0;
55275
55322
  const hits = [];
@@ -55280,7 +55327,7 @@ function renderInlineText(raw) {
55280
55327
  hits.push({
55281
55328
  start,
55282
55329
  end,
55283
- node: /* @__PURE__ */ import_react74.default.createElement(Text, { color: TONE.warn, underline: true }, `@${path}`)
55330
+ node: /* @__PURE__ */ import_react74.default.createElement(L, { color: TONE.warn, underline: true }, `@${path}`)
55284
55331
  });
55285
55332
  }
55286
55333
  for (const m of raw.matchAll(FILE_REF_RE2)) {
@@ -55297,12 +55344,12 @@ function renderInlineText(raw) {
55297
55344
  let key = 0;
55298
55345
  for (const h of hits) {
55299
55346
  if (h.start > cursor) {
55300
- out.push(/* @__PURE__ */ import_react74.default.createElement(Text, { key: `t-${key++}` }, raw.slice(cursor, h.start)));
55347
+ out.push(/* @__PURE__ */ import_react74.default.createElement(L, { key: `t-${key++}` }, raw.slice(cursor, h.start)));
55301
55348
  }
55302
55349
  out.push(/* @__PURE__ */ import_react74.default.createElement(import_react74.default.Fragment, { key: `r-${key++}` }, h.node));
55303
55350
  cursor = h.end;
55304
55351
  }
55305
- if (cursor < raw.length) out.push(/* @__PURE__ */ import_react74.default.createElement(Text, { key: `t-${key++}` }, raw.slice(cursor)));
55352
+ if (cursor < raw.length) out.push(/* @__PURE__ */ import_react74.default.createElement(L, { key: `t-${key++}` }, raw.slice(cursor)));
55306
55353
  return /* @__PURE__ */ import_react74.default.createElement(import_react74.default.Fragment, null, out);
55307
55354
  }
55308
55355
  function InlineToken({ token }) {
@@ -55312,29 +55359,29 @@ function InlineToken({ token }) {
55312
55359
  return t2.tokens ? /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: t2.tokens }) : renderInlineText(t2.text);
55313
55360
  }
55314
55361
  case "strong":
55315
- return /* @__PURE__ */ import_react74.default.createElement(Text, { bold: true, color: FG.strong }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens }));
55362
+ return /* @__PURE__ */ import_react74.default.createElement(L, { bold: true, color: FG.strong }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens }));
55316
55363
  case "em":
55317
- return /* @__PURE__ */ import_react74.default.createElement(Text, { italic: true }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens }));
55364
+ return /* @__PURE__ */ import_react74.default.createElement(L, { italic: true }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens }));
55318
55365
  case "codespan":
55319
- return /* @__PURE__ */ import_react74.default.createElement(Text, { color: FG.strong, backgroundColor: SURFACE.bgElev }, ` ${decodeHtmlEntities(token.text)} `);
55366
+ return /* @__PURE__ */ import_react74.default.createElement(L, { color: FG.strong, backgroundColor: SURFACE.bgElev }, ` ${decodeHtmlEntities(token.text)} `);
55320
55367
  case "del":
55321
- return /* @__PURE__ */ import_react74.default.createElement(Text, { color: TONE.err, strikethrough: true }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens }));
55368
+ return /* @__PURE__ */ import_react74.default.createElement(L, { color: TONE.err, strikethrough: true }, /* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: token.tokens }));
55322
55369
  case "link": {
55323
55370
  const l = token;
55324
55371
  return osc8(/* @__PURE__ */ import_react74.default.createElement(Inline, { tokens: l.tokens }), l.href, TONE.brand);
55325
55372
  }
55326
55373
  case "image": {
55327
55374
  const im = token;
55328
- return /* @__PURE__ */ import_react74.default.createElement(Text, { color: TONE.brand }, `[image: ${im.text || im.href}]`);
55375
+ return /* @__PURE__ */ import_react74.default.createElement(L, { color: TONE.brand }, `[image: ${im.text || im.href}]`);
55329
55376
  }
55330
55377
  case "br":
55331
- return /* @__PURE__ */ import_react74.default.createElement(Text, null, "\n");
55378
+ return /* @__PURE__ */ import_react74.default.createElement(L, null, "\n");
55332
55379
  case "escape":
55333
- return /* @__PURE__ */ import_react74.default.createElement(Text, null, token.text);
55380
+ return /* @__PURE__ */ import_react74.default.createElement(L, null, token.text);
55334
55381
  case "html":
55335
- return /* @__PURE__ */ import_react74.default.createElement(Text, null, token.text);
55382
+ return /* @__PURE__ */ import_react74.default.createElement(L, null, token.text);
55336
55383
  default:
55337
- return /* @__PURE__ */ import_react74.default.createElement(Text, null, token.raw ?? "");
55384
+ return /* @__PURE__ */ import_react74.default.createElement(L, null, token.raw ?? "");
55338
55385
  }
55339
55386
  }
55340
55387
  function plainText(tokens) {
@@ -55415,10 +55462,9 @@ function useLiveTokenRate(card, enabled2) {
55415
55462
  }
55416
55463
  var PILL_RATE = { bg: "#11141a", fg: "#8b949e" };
55417
55464
  function StreamingCard({ card }) {
55418
- const { stdout } = use_stdout_default();
55465
+ const { stdout } = bv();
55419
55466
  const cols = stdout?.columns ?? 80;
55420
55467
  const expanded = (0, import_react75.useContext)(LiveExpandContext);
55421
- useSlowTick();
55422
55468
  const liveRate = useLiveTokenRate(card, !card.done && !card.aborted);
55423
55469
  const lineCells = Math.max(20, cols - 4);
55424
55470
  const visualLines = useIncrementalWrap(card.text, lineCells);
@@ -55442,7 +55488,7 @@ function StreamingCard({ card }) {
55442
55488
  const droppedAbove = Math.max(0, visualLines.length - visible.length);
55443
55489
  const aborted = !!card.aborted;
55444
55490
  const headColor = aborted ? TONE.err : TONE_ACTIVE.brand;
55445
- const glyph = aborted ? "\u2298" : "\u25CF";
55491
+ const glyph = aborted ? "\u2298" : /* @__PURE__ */ import_react75.default.createElement(Pulse, { active: true, frames: PULSE_CIRCLE, settled: "\u25CF", color: headColor });
55446
55492
  const headLabel = aborted ? t("cardLabels.aborted") : t("cardLabels.writing");
55447
55493
  const liveRatePill = !aborted && liveRate.tokens >= MIN_TOKENS_FOR_RATE && liveRate.tps !== null ? /* @__PURE__ */ import_react75.default.createElement(Pill2, { label: `${liveRate.tps} t/s`, ...PILL_RATE, bold: false }) : null;
55448
55494
  const expandPill = !aborted ? /* @__PURE__ */ import_react75.default.createElement(Pill2, { label: expanded ? "expanded \u2303o" : "preview \u2303o", ...PILL_RATE, bold: false }) : null;
@@ -55452,11 +55498,11 @@ function StreamingCard({ card }) {
55452
55498
  glyph,
55453
55499
  tone: headColor,
55454
55500
  title: headLabel,
55455
- right: /* @__PURE__ */ import_react75.default.createElement(import_react75.default.Fragment, null, liveRatePill, expandPill, aborted ? null : /* @__PURE__ */ import_react75.default.createElement(Spinner, { kind: "braille", color: TONE_ACTIVE.brand }), modelPill)
55501
+ right: /* @__PURE__ */ import_react75.default.createElement(import_react75.default.Fragment, null, liveRatePill, expandPill, modelPill)
55456
55502
  }
55457
- ), expanded && droppedAbove > 0 ? /* @__PURE__ */ import_react75.default.createElement(Text, { color: FG.faint }, t(droppedAbove === 1 ? "cardLabels.earlierLine" : "cardLabels.earlierLines", {
55503
+ ), expanded && droppedAbove > 0 ? /* @__PURE__ */ import_react75.default.createElement(L, { color: FG.faint }, t(droppedAbove === 1 ? "cardLabels.earlierLine" : "cardLabels.earlierLines", {
55458
55504
  count: droppedAbove
55459
- })) : null, visible.map((line, i) => /* @__PURE__ */ import_react75.default.createElement(Box_default, { key: `${card.id}:${visualLines.length - visible.length + i}`, flexDirection: "row" }, /* @__PURE__ */ import_react75.default.createElement(Text, { color: aborted ? FG.meta : FG.body }, clipToCells(line, lineCells)))), aborted ? /* @__PURE__ */ import_react75.default.createElement(Text, { color: FG.faint }, t("cardLabels.truncatedByEsc")) : null);
55505
+ })) : null, visible.map((line, i) => /* @__PURE__ */ import_react75.default.createElement(W, { key: `${card.id}:${visualLines.length - visible.length + i}`, flexDirection: "row" }, /* @__PURE__ */ import_react75.default.createElement(L, { color: aborted ? FG.meta : FG.body }, clipToCells(line, lineCells)))), aborted ? /* @__PURE__ */ import_react75.default.createElement(L, { color: FG.faint }, t("cardLabels.truncatedByEsc")) : null);
55460
55506
  }
55461
55507
 
55462
55508
  // src/cli/ui/cards/SubAgentCard.tsx
@@ -55477,13 +55523,13 @@ function SubAgentCard({ card }) {
55477
55523
  return /* @__PURE__ */ import_react76.default.createElement(Card, { tone: headColor }, /* @__PURE__ */ import_react76.default.createElement(
55478
55524
  CardHeader,
55479
55525
  {
55480
- glyph: headGlyph,
55526
+ glyph: isRunning ? /* @__PURE__ */ import_react76.default.createElement(Pulse, { active: true, frames: PULSE_HEX, settled: "\u232C", color: headColor }) : headGlyph,
55481
55527
  tone: headColor,
55482
55528
  title: t("cardTitles.subagent"),
55483
55529
  subtitle: card.task,
55484
55530
  meta: headerMeta2
55485
55531
  }
55486
- ), card.name ? /* @__PURE__ */ import_react76.default.createElement(Text, { color: fg.faint }, `${t("cardLabels.agent")} \xB7 ${card.name}`) : null, card.tools && card.tools.length > 0 && /* @__PURE__ */ import_react76.default.createElement(Text, { color: fg.faint }, `${t("cardLabels.tools")} \xB7 ${card.tools.join(", ")}`), card.children.map((child) => /* @__PURE__ */ import_react76.default.createElement(Box_default, { key: child.id, flexDirection: "row", gap: 1 }, inLive ? null : /* @__PURE__ */ import_react76.default.createElement(Text, { color: tone.violet }, "\u23BF"), /* @__PURE__ */ import_react76.default.createElement(ChildRow, { card: child }))));
55532
+ ), card.name ? /* @__PURE__ */ import_react76.default.createElement(L, { color: fg.faint }, `${t("cardLabels.agent")} \xB7 ${card.name}`) : null, card.tools && card.tools.length > 0 && /* @__PURE__ */ import_react76.default.createElement(L, { color: fg.faint }, `${t("cardLabels.tools")} \xB7 ${card.tools.join(", ")}`), card.children.map((child) => /* @__PURE__ */ import_react76.default.createElement(W, { key: child.id, flexDirection: "row", gap: 1 }, inLive ? null : /* @__PURE__ */ import_react76.default.createElement(L, { color: tone.violet }, "\u23BF"), /* @__PURE__ */ import_react76.default.createElement(ChildRow, { card: child }))));
55487
55533
  }
55488
55534
  function isChildDone(card) {
55489
55535
  switch (card.kind) {
@@ -55500,23 +55546,25 @@ function ChildRow({ card }) {
55500
55546
  const { fg, tone } = useThemeTokens();
55501
55547
  const v = childVisual(card, tone.ok, tone.err, fg.faint);
55502
55548
  const isDone = isChildDone(card);
55503
- return /* @__PURE__ */ import_react76.default.createElement(import_react76.default.Fragment, null, v.statusGlyph, /* @__PURE__ */ import_react76.default.createElement(Text, { color: v.kindColor }, v.kindGlyph), /* @__PURE__ */ import_react76.default.createElement(Text, { dimColor: isDone, color: fg.body }, v.text));
55549
+ return /* @__PURE__ */ import_react76.default.createElement(import_react76.default.Fragment, null, v.statusGlyph, /* @__PURE__ */ import_react76.default.createElement(L, { color: v.kindColor }, v.kindGlyph), /* @__PURE__ */ import_react76.default.createElement(L, { dimColor: isDone, color: fg.body }, v.text));
55504
55550
  }
55505
- function runningGlyph(color) {
55506
- return /* @__PURE__ */ import_react76.default.createElement(Spinner, { kind: "circle", color });
55551
+ function runningGlyph(color, kind) {
55552
+ const frames = kind === "tool" ? PULSE_SQUARE : kind === "streaming" ? PULSE_CIRCLE : PULSE_DIAMOND;
55553
+ const settled = kind === "tool" ? "\u25A3" : kind === "streaming" ? "\u25CF" : "\u25C6";
55554
+ return /* @__PURE__ */ import_react76.default.createElement(Pulse, { active: true, frames, settled, color });
55507
55555
  }
55508
55556
  function doneGlyph(color) {
55509
- return /* @__PURE__ */ import_react76.default.createElement(Text, { color }, "\u2713");
55557
+ return /* @__PURE__ */ import_react76.default.createElement(L, { color }, "\u2713");
55510
55558
  }
55511
55559
  function failedGlyph(color) {
55512
- return /* @__PURE__ */ import_react76.default.createElement(Text, { color }, "\u2717");
55560
+ return /* @__PURE__ */ import_react76.default.createElement(L, { color }, "\u2717");
55513
55561
  }
55514
55562
  function childVisual(card, doneColor, failedColor, fallbackColor) {
55515
55563
  switch (card.kind) {
55516
55564
  case "reasoning": {
55517
55565
  const done = !card.streaming;
55518
55566
  return {
55519
- statusGlyph: done ? doneGlyph(doneColor) : runningGlyph(CARD.reasoning.color),
55567
+ statusGlyph: done ? doneGlyph(doneColor) : runningGlyph(CARD.reasoning.color, "reasoning"),
55520
55568
  kindGlyph: "\u25CF",
55521
55569
  kindColor: CARD.reasoning.color,
55522
55570
  text: t("cardLabels.reasoningLabel", { count: card.paragraphs })
@@ -55525,7 +55573,7 @@ function childVisual(card, doneColor, failedColor, fallbackColor) {
55525
55573
  case "tool": {
55526
55574
  const elapsed = card.elapsedMs > 0 ? ` \xB7 ${(card.elapsedMs / 1e3).toFixed(2)}s` : "";
55527
55575
  return {
55528
- statusGlyph: card.done ? doneGlyph(doneColor) : runningGlyph(CARD.tool.color),
55576
+ statusGlyph: card.done ? doneGlyph(doneColor) : runningGlyph(CARD.tool.color, "tool"),
55529
55577
  kindGlyph: "\u25CF",
55530
55578
  kindColor: CARD.tool.color,
55531
55579
  text: `${card.name}${elapsed}`
@@ -55533,7 +55581,7 @@ function childVisual(card, doneColor, failedColor, fallbackColor) {
55533
55581
  }
55534
55582
  case "streaming":
55535
55583
  return {
55536
- statusGlyph: card.done ? doneGlyph(doneColor) : runningGlyph(CARD.streaming.color),
55584
+ statusGlyph: card.done ? doneGlyph(doneColor) : runningGlyph(CARD.streaming.color, "streaming"),
55537
55585
  kindGlyph: "\u25CF",
55538
55586
  kindColor: CARD.streaming.color,
55539
55587
  text: card.done ? t("cardLabels.response") : t("cardLabels.writing")
@@ -55554,7 +55602,7 @@ function childVisual(card, doneColor, failedColor, fallbackColor) {
55554
55602
  };
55555
55603
  default:
55556
55604
  return {
55557
- statusGlyph: /* @__PURE__ */ import_react76.default.createElement(Text, { color: fallbackColor }, "\xB7"),
55605
+ statusGlyph: /* @__PURE__ */ import_react76.default.createElement(L, { color: fallbackColor }, "\xB7"),
55558
55606
  kindGlyph: "\xB7",
55559
55607
  kindColor: fallbackColor,
55560
55608
  text: card.kind
@@ -55592,13 +55640,13 @@ function TaskCard({ card }) {
55592
55640
  return /* @__PURE__ */ import_react77.default.createElement(Card, { tone: taskColor[card.status] }, /* @__PURE__ */ import_react77.default.createElement(
55593
55641
  CardHeader,
55594
55642
  {
55595
- glyph: TASK_GLYPH[card.status],
55643
+ glyph: card.status === "running" ? /* @__PURE__ */ import_react77.default.createElement(Pulse, { active: true, frames: PULSE_TRIANGLE, settled: "\u25B6", color: taskColor[card.status] }) : TASK_GLYPH[card.status],
55596
55644
  tone: taskColor[card.status],
55597
55645
  title: t("cardTitles.task"),
55598
55646
  subtitle: `${card.index} / ${card.total} ${card.title}`,
55599
55647
  meta: [elapsed, card.status]
55600
55648
  }
55601
- ), card.steps.map((step) => /* @__PURE__ */ import_react77.default.createElement(Box_default, { key: step.id, flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react77.default.createElement(Text, { color: stepColor[step.status] }, STEP_GLYPH[step.status]), /* @__PURE__ */ import_react77.default.createElement(Text, { bold: true, color: fg.body }, (step.toolName ?? t("cardLabels.stepLabel")).padEnd(7)), /* @__PURE__ */ import_react77.default.createElement(Pill2, { label: step.title, ...PILL_PATH, bold: false }), step.detail ? /* @__PURE__ */ import_react77.default.createElement(Text, { color: fg.faint }, step.detail) : null, step.elapsedMs !== void 0 ? /* @__PURE__ */ import_react77.default.createElement(Text, { color: fg.faint }, `${(step.elapsedMs / 1e3).toFixed(2)}s`) : null)));
55649
+ ), card.steps.map((step) => /* @__PURE__ */ import_react77.default.createElement(W, { key: step.id, flexDirection: "row", gap: 1 }, step.status === "running" ? /* @__PURE__ */ import_react77.default.createElement(Pulse, { active: true, frames: PULSE_TRIANGLE, settled: "\u25B6", color: stepColor[step.status] }) : /* @__PURE__ */ import_react77.default.createElement(L, { color: stepColor[step.status] }, STEP_GLYPH[step.status]), /* @__PURE__ */ import_react77.default.createElement(L, { bold: true, color: fg.body }, (step.toolName ?? t("cardLabels.stepLabel")).padEnd(7)), /* @__PURE__ */ import_react77.default.createElement(Pill2, { label: step.title, ...PILL_PATH, bold: false }), step.detail ? /* @__PURE__ */ import_react77.default.createElement(L, { color: fg.faint }, step.detail) : null, step.elapsedMs !== void 0 ? /* @__PURE__ */ import_react77.default.createElement(L, { color: fg.faint }, `${(step.elapsedMs / 1e3).toFixed(2)}s`) : null)));
55602
55650
  }
55603
55651
 
55604
55652
  // src/cli/ui/cards/TipCard.tsx
@@ -55609,7 +55657,7 @@ function TipCard({ card }) {
55609
55657
  (max, sec) => sec.rows.reduce((m, r) => Math.max(m, stringWidth(r.key)), max),
55610
55658
  0
55611
55659
  );
55612
- return /* @__PURE__ */ import_react78.default.createElement(Box_default, { flexDirection: "column", paddingLeft: 2, marginY: 1 }, /* @__PURE__ */ import_react78.default.createElement(Box_default, { flexDirection: "row", justifyContent: "space-between" }, /* @__PURE__ */ import_react78.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react78.default.createElement(Text, { color: TONE.accent, bold: true }, "\u24D8"), /* @__PURE__ */ import_react78.default.createElement(Text, { color: FG.body, bold: true }, card.topic)), card.oneTime ? /* @__PURE__ */ import_react78.default.createElement(Text, { color: FG.faint }, t("ui.tipShownOnce")) : null), card.sections.map((section, i) => /* @__PURE__ */ import_react78.default.createElement(Box_default, { key: section.title ?? `section-${i}`, flexDirection: "column", marginTop: 1 }, section.title ? /* @__PURE__ */ import_react78.default.createElement(Box_default, { marginBottom: 0 }, /* @__PURE__ */ import_react78.default.createElement(Text, { color: FG.sub }, section.title)) : null, section.rows.map((row2) => /* @__PURE__ */ import_react78.default.createElement(
55660
+ return /* @__PURE__ */ import_react78.default.createElement(W, { flexDirection: "column", paddingLeft: 2, marginY: 1 }, /* @__PURE__ */ import_react78.default.createElement(W, { flexDirection: "row", justifyContent: "space-between" }, /* @__PURE__ */ import_react78.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react78.default.createElement(L, { color: TONE.accent, bold: true }, "\u24D8"), /* @__PURE__ */ import_react78.default.createElement(L, { color: FG.body, bold: true }, card.topic)), card.oneTime ? /* @__PURE__ */ import_react78.default.createElement(L, { color: FG.faint }, t("ui.tipShownOnce")) : null), card.sections.map((section, i) => /* @__PURE__ */ import_react78.default.createElement(W, { key: section.title ?? `section-${i}`, flexDirection: "column", marginTop: 1 }, section.title ? /* @__PURE__ */ import_react78.default.createElement(W, { marginBottom: 0 }, /* @__PURE__ */ import_react78.default.createElement(L, { color: FG.sub }, section.title)) : null, section.rows.map((row2) => /* @__PURE__ */ import_react78.default.createElement(
55613
55661
  TipRowRender,
55614
55662
  {
55615
55663
  key: row2.key,
@@ -55617,7 +55665,7 @@ function TipCard({ card }) {
55617
55665
  keyWidth,
55618
55666
  indent: section.title ? 2 : 0
55619
55667
  }
55620
- )))), card.footer ? /* @__PURE__ */ import_react78.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react78.default.createElement(Text, { color: FG.faint }, card.footer)) : null);
55668
+ )))), card.footer ? /* @__PURE__ */ import_react78.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react78.default.createElement(L, { color: FG.faint }, card.footer)) : null);
55621
55669
  }
55622
55670
  function TipRowRender({
55623
55671
  row: row2,
@@ -55626,7 +55674,7 @@ function TipRowRender({
55626
55674
  }) {
55627
55675
  const pad = " ".repeat(Math.max(0, keyWidth - stringWidth(row2.key) + KEY_GUTTER));
55628
55676
  const lead = indent > 0 ? " ".repeat(indent) : "";
55629
- return /* @__PURE__ */ import_react78.default.createElement(Box_default, { flexDirection: "row" }, lead ? /* @__PURE__ */ import_react78.default.createElement(Text, null, lead) : null, /* @__PURE__ */ import_react78.default.createElement(Text, { color: TONE.accent }, row2.key), /* @__PURE__ */ import_react78.default.createElement(Text, null, pad), /* @__PURE__ */ import_react78.default.createElement(Text, { color: FG.body }, row2.text));
55677
+ return /* @__PURE__ */ import_react78.default.createElement(W, { flexDirection: "row" }, lead ? /* @__PURE__ */ import_react78.default.createElement(L, null, lead) : null, /* @__PURE__ */ import_react78.default.createElement(L, { color: TONE.accent }, row2.key), /* @__PURE__ */ import_react78.default.createElement(L, null, pad), /* @__PURE__ */ import_react78.default.createElement(L, { color: FG.body }, row2.text));
55630
55678
  }
55631
55679
 
55632
55680
  // src/cli/ui/cards/ToolCard.tsx
@@ -55660,7 +55708,7 @@ function tailLinesFor(name) {
55660
55708
  return /(?:^|_)(read|search|list|tree|get|status|diff|fetch|grep)(_|$)/.test(lower) || lower === "job_output" ? READ_TAIL : OTHER_TAIL;
55661
55709
  }
55662
55710
  function ToolCard({ card }) {
55663
- const { stdout } = use_stdout_default();
55711
+ const { stdout } = bv();
55664
55712
  const cols = stdout?.columns ?? 80;
55665
55713
  const lineCells = Math.max(20, cols - 4);
55666
55714
  const argsLabel = formatArgsSummary(card.args);
@@ -55691,25 +55739,25 @@ function ToolCard({ card }) {
55691
55739
  meta.push({ text: t("cardLabels.rejected"), color: TONE.err });
55692
55740
  }
55693
55741
  for (const part of metaTrail(card)) meta.push(part);
55742
+ const headerGlyph = status2 === "running" ? /* @__PURE__ */ import_react80.default.createElement(Pulse, { active: true, frames: PULSE_SQUARE, settled: "\u25A3", color: headColor }) : statusGlyph2(status2);
55694
55743
  return /* @__PURE__ */ import_react80.default.createElement(Card, { tone: headColor }, /* @__PURE__ */ import_react80.default.createElement(
55695
55744
  CardHeader,
55696
55745
  {
55697
- glyph: statusGlyph2(status2),
55746
+ glyph: headerGlyph,
55698
55747
  tone: headColor,
55699
55748
  title: card.name,
55700
55749
  subtitle: argsLabel || void 0,
55701
- meta: meta.length > 0 ? meta : void 0,
55702
- right: status2 === "running" ? /* @__PURE__ */ import_react80.default.createElement(Spinner, { kind: "braille", color: TONE_ACTIVE.brand, bold: true }) : void 0
55750
+ meta: meta.length > 0 ? meta : void 0
55703
55751
  }
55704
55752
  ), showBody && (subagentMarkdown !== null ? /* @__PURE__ */ import_react80.default.createElement(Markdown, { text: subagentMarkdown, width: lineCells }) : /* @__PURE__ */ import_react80.default.createElement(import_react80.default.Fragment, null, preview.rows.map(
55705
- (row2, i) => row2.kind === "hidden" ? /* @__PURE__ */ import_react80.default.createElement(Text, { key: `${card.id}:hidden:${i}`, color: FG.faint }, t(
55753
+ (row2, i) => row2.kind === "hidden" ? /* @__PURE__ */ import_react80.default.createElement(L, { key: `${card.id}:hidden:${i}`, color: FG.faint }, t(
55706
55754
  hiddenRowLabelKey({
55707
55755
  count: row2.count,
55708
55756
  includeShortcut: i === firstHiddenRow
55709
55757
  }),
55710
55758
  { count: row2.count }
55711
55759
  )) : /* @__PURE__ */ import_react80.default.createElement(
55712
- Text,
55760
+ L,
55713
55761
  {
55714
55762
  key: `${card.id}:line:${row2.index}`,
55715
55763
  color: errColor,
@@ -55828,7 +55876,7 @@ function compactNum(n) {
55828
55876
  function bar(ratio, color) {
55829
55877
  const filled = Math.max(0, Math.min(BAR_CELLS2, Math.round(ratio * BAR_CELLS2)));
55830
55878
  const empty = BAR_CELLS2 - filled;
55831
- return /* @__PURE__ */ import_react81.default.createElement(import_react81.default.Fragment, null, /* @__PURE__ */ import_react81.default.createElement(Text, { color }, "\u2588".repeat(filled)), /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.faint }, "\u2591".repeat(empty)));
55879
+ return /* @__PURE__ */ import_react81.default.createElement(import_react81.default.Fragment, null, /* @__PURE__ */ import_react81.default.createElement(L, { color }, "\u2588".repeat(filled)), /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.faint }, "\u2591".repeat(empty)));
55832
55880
  }
55833
55881
  function UsageCard({ card }) {
55834
55882
  const costDisplayCurrency = useAgentState((s) => s.status.costDisplayCurrency);
@@ -55843,14 +55891,14 @@ function UsageCard({ card }) {
55843
55891
  formatCost(card.cost, costCur)
55844
55892
  ];
55845
55893
  if (card.elapsedMs !== void 0) headerMeta2.push(`${(card.elapsedMs / 1e3).toFixed(1)}s`);
55846
- return /* @__PURE__ */ import_react81.default.createElement(Card, { tone: FG.meta }, /* @__PURE__ */ import_react81.default.createElement(CardHeader, { glyph: "\u03A3", tone: FG.meta, title: t("cardTitles.usage"), meta: headerMeta2 }), /* @__PURE__ */ import_react81.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.sub }, t("cardLabels.prompt")), bar(promptRatio, TONE.brand), /* @__PURE__ */ import_react81.default.createElement(Text, { bold: true, color: FG.body }, card.tokens.prompt.toLocaleString()), /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.faint }, `/ 1M \xB7 ${(promptRatio * 100).toFixed(1)}%`)), /* @__PURE__ */ import_react81.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.sub }, t("cardLabels.reason")), bar(reasonRatio, TONE.accent), /* @__PURE__ */ import_react81.default.createElement(Text, { bold: true, color: FG.body }, card.tokens.reason.toLocaleString())), /* @__PURE__ */ import_react81.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.sub }, t("cardLabels.output")), bar(outputRatio, TONE.brand), /* @__PURE__ */ import_react81.default.createElement(Text, { bold: true, color: FG.body }, card.tokens.output.toLocaleString())), /* @__PURE__ */ import_react81.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.sub }, t("cardLabels.cache"), " "), bar(card.cacheHit, TONE.ok), /* @__PURE__ */ import_react81.default.createElement(Text, { bold: true, color: TONE.ok }, `${(card.cacheHit * 100).toFixed(1)}%`)), /* @__PURE__ */ import_react81.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.faint }, t("cardLabels.session")), /* @__PURE__ */ import_react81.default.createElement(Text, { bold: true, color: FG.body }, `\u25CF ${formatCost(card.sessionCost, costCur, 3)}`), card.balance !== void 0 ? /* @__PURE__ */ import_react81.default.createElement(import_react81.default.Fragment, null, /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.faint }, `\xB7 ${t("cardLabels.balance")}`), /* @__PURE__ */ import_react81.default.createElement(Text, { bold: true, color: TONE.brand }, formatBalance(card.balance, card.balanceCurrency))) : null));
55894
+ return /* @__PURE__ */ import_react81.default.createElement(Card, { tone: FG.meta }, /* @__PURE__ */ import_react81.default.createElement(CardHeader, { glyph: "\u03A3", tone: FG.meta, title: t("cardTitles.usage"), meta: headerMeta2 }), /* @__PURE__ */ import_react81.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.sub }, t("cardLabels.prompt")), bar(promptRatio, TONE.brand), /* @__PURE__ */ import_react81.default.createElement(L, { bold: true, color: FG.body }, card.tokens.prompt.toLocaleString()), /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.faint }, `/ 1M \xB7 ${(promptRatio * 100).toFixed(1)}%`)), /* @__PURE__ */ import_react81.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.sub }, t("cardLabels.reason")), bar(reasonRatio, TONE.accent), /* @__PURE__ */ import_react81.default.createElement(L, { bold: true, color: FG.body }, card.tokens.reason.toLocaleString())), /* @__PURE__ */ import_react81.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.sub }, t("cardLabels.output")), bar(outputRatio, TONE.brand), /* @__PURE__ */ import_react81.default.createElement(L, { bold: true, color: FG.body }, card.tokens.output.toLocaleString())), /* @__PURE__ */ import_react81.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.sub }, t("cardLabels.cache"), " "), bar(card.cacheHit, TONE.ok), /* @__PURE__ */ import_react81.default.createElement(L, { bold: true, color: TONE.ok }, `${(card.cacheHit * 100).toFixed(1)}%`)), /* @__PURE__ */ import_react81.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.faint }, t("cardLabels.session")), /* @__PURE__ */ import_react81.default.createElement(L, { bold: true, color: FG.body }, `\u25CF ${formatCost(card.sessionCost, costCur, 3)}`), card.balance !== void 0 ? /* @__PURE__ */ import_react81.default.createElement(import_react81.default.Fragment, null, /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.faint }, `\xB7 ${t("cardLabels.balance")}`), /* @__PURE__ */ import_react81.default.createElement(L, { bold: true, color: TONE.brand }, formatBalance(card.balance, card.balanceCurrency))) : null));
55847
55895
  }
55848
55896
  function CompactUsageRow({
55849
55897
  card,
55850
55898
  displayCurrency
55851
55899
  }) {
55852
55900
  const elapsed = card.elapsedMs !== void 0 ? ` \xB7 ${(card.elapsedMs / 1e3).toFixed(1)}s` : "";
55853
- return /* @__PURE__ */ import_react81.default.createElement(Box_default, { flexDirection: "row", gap: 1, marginTop: 1 }, /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.meta }, "\u03A3"), /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.faint }, `${t("cardLabels.turn")} ${card.turn}`), /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.meta }, `\xB7 ${compactNum(card.tokens.prompt)} ${t("cardLabels.prompt")} \xB7 ${compactNum(card.tokens.output)} ${t("cardLabels.output")}`), /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.faint }, `\xB7 ${t("cardLabels.cache")}`), /* @__PURE__ */ import_react81.default.createElement(Text, { color: TONE.ok }, `${(card.cacheHit * 100).toFixed(0)}%`), /* @__PURE__ */ import_react81.default.createElement(Text, { color: FG.faint }, `\xB7 ${formatCost(card.cost, displayCurrency)}${elapsed}`), card.balance !== void 0 ? /* @__PURE__ */ import_react81.default.createElement(Text, { color: TONE.brand }, `\xB7 ${formatBalance(card.balance, card.balanceCurrency)}`) : null);
55901
+ return /* @__PURE__ */ import_react81.default.createElement(W, { flexDirection: "row", gap: 1, marginTop: 1 }, /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.meta }, "\u03A3"), /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.faint }, `${t("cardLabels.turn")} ${card.turn}`), /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.meta }, `\xB7 ${compactNum(card.tokens.prompt)} ${t("cardLabels.prompt")} \xB7 ${compactNum(card.tokens.output)} ${t("cardLabels.output")}`), /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.faint }, `\xB7 ${t("cardLabels.cache")}`), /* @__PURE__ */ import_react81.default.createElement(L, { color: TONE.ok }, `${(card.cacheHit * 100).toFixed(0)}%`), /* @__PURE__ */ import_react81.default.createElement(L, { color: FG.faint }, `\xB7 ${formatCost(card.cost, displayCurrency)}${elapsed}`), card.balance !== void 0 ? /* @__PURE__ */ import_react81.default.createElement(L, { color: TONE.brand }, `\xB7 ${formatBalance(card.balance, card.balanceCurrency)}`) : null);
55854
55902
  }
55855
55903
 
55856
55904
  // src/cli/ui/cards/UserCard.tsx
@@ -55871,7 +55919,7 @@ function formatRelativeTime(ts, now = Date.now()) {
55871
55919
 
55872
55920
  // src/cli/ui/cards/UserCard.tsx
55873
55921
  function UserCard({ card }) {
55874
- return /* @__PURE__ */ import_react82.default.createElement(Box_default, { flexDirection: "row" }, /* @__PURE__ */ import_react82.default.createElement(Box_default, { width: 1, backgroundColor: CARD.user.color, flexShrink: 0 }), /* @__PURE__ */ import_react82.default.createElement(Box_default, { flexDirection: "column", flexGrow: 1, paddingLeft: 1, backgroundColor: SURFACE.bgInput }, /* @__PURE__ */ import_react82.default.createElement(
55922
+ return /* @__PURE__ */ import_react82.default.createElement(W, { flexDirection: "column", width: "100%", paddingX: 1, backgroundColor: MESSAGE_BG.user }, /* @__PURE__ */ import_react82.default.createElement(
55875
55923
  CardHeader,
55876
55924
  {
55877
55925
  glyph: CARD.user.glyph,
@@ -55879,7 +55927,7 @@ function UserCard({ card }) {
55879
55927
  title: t("cardTitles.you"),
55880
55928
  meta: [formatRelativeTime(card.ts)]
55881
55929
  }
55882
- ), /* @__PURE__ */ import_react82.default.createElement(Box_default, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react82.default.createElement(Text, { color: FG.sub }, "\u21B3"), /* @__PURE__ */ import_react82.default.createElement(Text, null, card.text))));
55930
+ ), /* @__PURE__ */ import_react82.default.createElement(W, { flexDirection: "row", gap: 1 }, /* @__PURE__ */ import_react82.default.createElement(L, { color: FG.sub }, "\u21B3"), /* @__PURE__ */ import_react82.default.createElement(L, null, card.text)));
55883
55931
  }
55884
55932
 
55885
55933
  // src/cli/ui/cards/WarnCard.tsx
@@ -55894,14 +55942,14 @@ function WarnCard({ card }) {
55894
55942
  title: card.title,
55895
55943
  meta: card.detail ? [card.detail] : void 0
55896
55944
  }
55897
- ), messageLines.map((line, i) => /* @__PURE__ */ import_react83.default.createElement(Text, { key: `${card.id}:${i}`, color: FG.body }, line || " ")));
55945
+ ), messageLines.map((line, i) => /* @__PURE__ */ import_react83.default.createElement(L, { key: `${card.id}:${i}`, color: FG.body }, line || " ")));
55898
55946
  }
55899
55947
 
55900
55948
  // src/cli/ui/cards/CardRenderer.tsx
55901
55949
  var CardRenderer = import_react84.default.memo(function CardRenderer2({
55902
55950
  card
55903
55951
  }) {
55904
- return /* @__PURE__ */ import_react84.default.createElement(Box_default, { flexDirection: "column" }, renderCard(card));
55952
+ return /* @__PURE__ */ import_react84.default.createElement(W, { flexDirection: "column" }, renderCard(card));
55905
55953
  });
55906
55954
  function renderCard(card) {
55907
55955
  switch (card.kind) {
@@ -55946,7 +55994,7 @@ function renderCard(card) {
55946
55994
  }
55947
55995
  }
55948
55996
  function FallbackCard({ card }) {
55949
- return /* @__PURE__ */ import_react84.default.createElement(Box_default, { flexDirection: "row" }, /* @__PURE__ */ import_react84.default.createElement(Text, { color: FG.faint }, ` \xB7 ${card.kind} card \xB7 not yet migrated`));
55997
+ return /* @__PURE__ */ import_react84.default.createElement(W, { flexDirection: "row" }, /* @__PURE__ */ import_react84.default.createElement(L, { color: FG.faint }, ` \xB7 ${card.kind} card \xB7 not yet migrated`));
55950
55998
  }
55951
55999
 
55952
56000
  // src/cli/ui/state/chat-scroll-provider.tsx
@@ -56143,8 +56191,8 @@ function CardStream({
56143
56191
  const { setMaxScroll, setCardHeight, pruneCardHeights } = useChatScrollActions();
56144
56192
  const outerRef = (0, import_react86.useRef)(null);
56145
56193
  const innerRef = (0, import_react86.useRef)(null);
56146
- const outer = use_box_metrics_default(outerRef);
56147
- const inner = use_box_metrics_default(innerRef);
56194
+ const outer = Cv(outerRef);
56195
+ const inner = Cv(innerRef);
56148
56196
  const maxScroll = Math.max(0, inner.height - outer.height);
56149
56197
  (0, import_react86.useEffect)(() => {
56150
56198
  setMaxScroll(maxScroll);
@@ -56160,8 +56208,8 @@ function CardStream({
56160
56208
  () => computeCardStreamItems(visible, cardHeights, scrollRows, outer.height),
56161
56209
  [visible, cardHeights, scrollRows, outer.height]
56162
56210
  );
56163
- return /* @__PURE__ */ import_react86.default.createElement(import_react86.default.Fragment, null, /* @__PURE__ */ import_react86.default.createElement(Box_default, { height: 1, flexShrink: 0 }, scrollRows > 0 ? /* @__PURE__ */ import_react86.default.createElement(ScrollIndicator, { scrollRows, maxScroll }) : null), /* @__PURE__ */ import_react86.default.createElement(Box_default, { ref: outerRef, flexDirection: "column", flexGrow: 1, overflow: "hidden" }, /* @__PURE__ */ import_react86.default.createElement(Box_default, { ref: innerRef, flexDirection: "column", marginTop: -scrollRows, flexShrink: 0 }, items.map(
56164
- (item) => item.kind === "spacer" ? /* @__PURE__ */ import_react86.default.createElement(Box_default, { key: item.key, height: item.rows, flexShrink: 0 }) : /* @__PURE__ */ import_react86.default.createElement(MeasuredCard, { key: item.card.id, card: item.card, report: setCardHeight })
56211
+ return /* @__PURE__ */ import_react86.default.createElement(import_react86.default.Fragment, null, /* @__PURE__ */ import_react86.default.createElement(W, { height: 1, flexShrink: 0 }, scrollRows > 0 ? /* @__PURE__ */ import_react86.default.createElement(ScrollIndicator, { scrollRows, maxScroll }) : null), /* @__PURE__ */ import_react86.default.createElement(W, { ref: outerRef, flexDirection: "column", flexGrow: 1, overflow: "hidden" }, /* @__PURE__ */ import_react86.default.createElement(W, { ref: innerRef, flexDirection: "column", marginTop: -scrollRows, flexShrink: 0 }, items.map(
56212
+ (item) => item.kind === "spacer" ? /* @__PURE__ */ import_react86.default.createElement(W, { key: item.key, height: item.rows, flexShrink: 0 }) : /* @__PURE__ */ import_react86.default.createElement(MeasuredCard, { key: item.card.id, card: item.card, report: setCardHeight })
56165
56213
  ))));
56166
56214
  }
56167
56215
  function MeasuredCard({
@@ -56169,7 +56217,7 @@ function MeasuredCard({
56169
56217
  report
56170
56218
  }) {
56171
56219
  const ref = (0, import_react86.useRef)(null);
56172
- const metrics = use_box_metrics_default(ref);
56220
+ const metrics = Cv(ref);
56173
56221
  const lastReportedRef = (0, import_react86.useRef)(0);
56174
56222
  const settled = isFullySettled(card);
56175
56223
  (0, import_react86.useEffect)(() => {
@@ -56179,7 +56227,7 @@ function MeasuredCard({
56179
56227
  lastReportedRef.current = rows;
56180
56228
  report(card.id, rows);
56181
56229
  }, [card.id, metrics.height, report, settled]);
56182
- return /* @__PURE__ */ import_react86.default.createElement(Box_default, { ref, flexDirection: "column", flexShrink: 0 }, /* @__PURE__ */ import_react86.default.createElement(CardRenderer, { card }));
56230
+ return /* @__PURE__ */ import_react86.default.createElement(W, { ref, flexDirection: "column", flexShrink: 0 }, /* @__PURE__ */ import_react86.default.createElement(CardRenderer, { card }));
56183
56231
  }
56184
56232
  function ScrollIndicator({
56185
56233
  scrollRows,
@@ -56197,10 +56245,10 @@ function ScrollIndicator({
56197
56245
  const above = scrollRows === 1 ? t("cardStream.scrollAbove", { scroll: scrollRows, max: maxScroll }) : t("cardStream.scrollAbovePlural", { scroll: scrollRows, max: maxScroll });
56198
56246
  const more = remaining > 0 ? t("cardStream.scrollMore", { remaining }) : "";
56199
56247
  const text2 = `${above}${more}${t("cardStream.scrollPgUp")}${t("cardStream.scrollCopy")}`;
56200
- const { stdout } = use_stdout_default();
56248
+ const { stdout } = bv();
56201
56249
  const cols = stdout?.columns ?? 80;
56202
56250
  const pad = Math.max(0, cols - stringWidth(text2));
56203
- return /* @__PURE__ */ import_react86.default.createElement(Text, { color: hot ? TONE.accent : FG.faint, backgroundColor: SURFACE.bgElev }, text2 + " ".repeat(pad));
56251
+ return /* @__PURE__ */ import_react86.default.createElement(L, { color: hot ? TONE.accent : FG.faint, backgroundColor: SURFACE.bgElev }, text2 + " ".repeat(pad));
56204
56252
  }
56205
56253
  function isFullySettled(card) {
56206
56254
  switch (card.kind) {
@@ -56234,7 +56282,7 @@ function StaticCardStreamInner({
56234
56282
  [visibleCards]
56235
56283
  );
56236
56284
  const visibleDynamic = suppressLive && hasUnsettledDynamic && dynamicItems.length > 0 ? dynamicItems.slice(0, -1) : dynamicItems;
56237
- return /* @__PURE__ */ import_react87.default.createElement(import_react87.default.Fragment, null, /* @__PURE__ */ import_react87.default.createElement(Static, { items: staticItems }, (card) => /* @__PURE__ */ import_react87.default.createElement(Box_default, { key: card.id, flexDirection: "column", flexShrink: 0 }, /* @__PURE__ */ import_react87.default.createElement(CardRenderer, { card }))), /* @__PURE__ */ import_react87.default.createElement(Box_default, { flexDirection: "column", flexShrink: 0 }, visibleDynamic.map((card) => /* @__PURE__ */ import_react87.default.createElement(Box_default, { key: card.id, flexDirection: "column", flexShrink: 0 }, /* @__PURE__ */ import_react87.default.createElement(CardRenderer, { card })))));
56285
+ return /* @__PURE__ */ import_react87.default.createElement(import_react87.default.Fragment, null, /* @__PURE__ */ import_react87.default.createElement(vv, { items: staticItems }, (card) => /* @__PURE__ */ import_react87.default.createElement(W, { key: card.id, flexDirection: "column", flexShrink: 0 }, /* @__PURE__ */ import_react87.default.createElement(CardRenderer, { card }))), /* @__PURE__ */ import_react87.default.createElement(W, { flexDirection: "column", flexShrink: 0 }, visibleDynamic.map((card) => /* @__PURE__ */ import_react87.default.createElement(W, { key: card.id, flexDirection: "column", flexShrink: 0 }, /* @__PURE__ */ import_react87.default.createElement(CardRenderer, { card })))));
56238
56286
  }
56239
56287
  function useProgressiveBacklog(cards) {
56240
56288
  const backlogRef = (0, import_react87.useRef)(null);
@@ -56905,6 +56953,24 @@ var dashboard = (args, _loop, ctx) => {
56905
56953
  };
56906
56954
  var handlers3 = { dashboard };
56907
56955
 
56956
+ // src/cli/ui/undo-context.ts
56957
+ function codeUndoInfo(result) {
56958
+ return typeof result === "string" ? result : result.info;
56959
+ }
56960
+ function formatUndoContextMessage(event) {
56961
+ const paths = event.paths.length === 1 ? event.paths[0] : event.paths.join(", ");
56962
+ return [
56963
+ "[Reasonix local state update: undo]",
56964
+ `The user ran /undo and reverted edit batch #${event.batchId} (${event.source}).`,
56965
+ `Reverted path(s): ${paths}.`,
56966
+ "Treat earlier messages or tool results that described those edits as stale. Re-read the files before relying on their current contents."
56967
+ ].join("\n");
56968
+ }
56969
+ function codeUndoContextMessage(result) {
56970
+ if (typeof result === "string" || !result.contextEvent) return void 0;
56971
+ return formatUndoContextMessage(result.contextEvent);
56972
+ }
56973
+
56908
56974
  // src/cli/ui/slash/helpers.ts
56909
56975
  import { spawnSync } from "child_process";
56910
56976
  function resolveMemoryTarget(store, raw) {
@@ -56982,11 +57048,16 @@ function gitTail(res) {
56982
57048
  }
56983
57049
 
56984
57050
  // src/cli/ui/slash/handlers/edits.ts
56985
- var undo = (args, _loop, ctx) => {
57051
+ var undo = (args, loop2, ctx) => {
56986
57052
  if (!ctx.codeUndo) {
56987
57053
  return { info: t("handlers.edits.undoCodeOnly") };
56988
57054
  }
56989
- return { info: ctx.codeUndo(args) };
57055
+ const result = ctx.codeUndo(args);
57056
+ const contextMessage = codeUndoContextMessage(result);
57057
+ if (contextMessage) {
57058
+ loop2.appendAndPersist({ role: "system", content: contextMessage });
57059
+ }
57060
+ return { info: codeUndoInfo(result) };
56990
57061
  };
56991
57062
  var history = (_args, _loop, ctx) => {
56992
57063
  if (!ctx.codeHistory) {
@@ -59477,12 +59548,14 @@ function useEditHistory(codeMode) {
59477
59548
  }, []);
59478
59549
  const codeUndo = (0, import_react90.useCallback)(
59479
59550
  (args = []) => {
59480
- if (!codeMode) return "not in code mode";
59551
+ if (!codeMode) return { info: "not in code mode" };
59481
59552
  const root = codeMode.rootDir;
59482
59553
  const revert = (entry2, paths) => {
59483
59554
  const subset = entry2.snapshots.filter((s) => paths.includes(s.path));
59484
59555
  if (subset.length === 0) {
59485
- return `batch #${entry2.id}: nothing to undo (already restored or path not in batch)`;
59556
+ return {
59557
+ info: `batch #${entry2.id}: nothing to undo (already restored or path not in batch)`
59558
+ };
59486
59559
  }
59487
59560
  const results = restoreSnapshots(subset, root);
59488
59561
  for (const s of subset) entry2.undoneFiles.add(s.path);
@@ -59497,7 +59570,11 @@ function useEditHistory(codeMode) {
59497
59570
  const when = new Date(entry2.at).toISOString().replace("T", " ").slice(11, 19);
59498
59571
  const scope = subset.length === 1 ? subset[0].path : `${subset.length} file(s)`;
59499
59572
  const header = `\u25B8 undo: reverted ${scope} from batch #${entry2.id} (${when})`;
59500
- return [header, ...formatUndoRows(results)].join("\n");
59573
+ const revertedPaths = results.filter((r) => r.status === "applied" || r.status === "created").map((r) => r.path);
59574
+ return {
59575
+ info: [header, ...formatUndoRows(results)].join("\n"),
59576
+ contextEvent: revertedPaths.length > 0 ? { batchId: entry2.id, source: entry2.source, paths: revertedPaths } : void 0
59577
+ };
59501
59578
  };
59502
59579
  const idArg = args[0];
59503
59580
  const pathArg = args[1];
@@ -59508,26 +59585,30 @@ function useEditHistory(codeMode) {
59508
59585
  const remaining = e.snapshots.map((s) => s.path).filter((p) => !e.undoneFiles.has(p));
59509
59586
  return revert(e, remaining);
59510
59587
  }
59511
- return "nothing to undo \u2014 every batch in the session history is already undone";
59588
+ return { info: "nothing to undo \u2014 every batch in the session history is already undone" };
59512
59589
  }
59513
59590
  const id = Number.parseInt(idArg, 10);
59514
59591
  if (!Number.isFinite(id)) {
59515
- return "usage: /undo [id] [path] (omit id for newest; id from /history; path from /show <id>)";
59592
+ return {
59593
+ info: "usage: /undo [id] [path] (omit id for newest; id from /history; path from /show <id>)"
59594
+ };
59516
59595
  }
59517
59596
  const entry = editHistory.current.find((e) => e.id === id);
59518
- if (!entry) return `no edit #${id} \u2014 run /history to see valid ids`;
59597
+ if (!entry) return { info: `no edit #${id} \u2014 run /history to see valid ids` };
59519
59598
  if (!pathArg) {
59520
59599
  const remaining = entry.snapshots.map((s) => s.path).filter((p) => !entry.undoneFiles.has(p));
59521
- if (remaining.length === 0) return `batch #${id} is already fully undone`;
59600
+ if (remaining.length === 0) return { info: `batch #${id} is already fully undone` };
59522
59601
  return revert(entry, remaining);
59523
59602
  }
59524
59603
  const snap = entry.snapshots.find((s) => s.path === pathArg);
59525
59604
  if (!snap) {
59526
59605
  const files = [...new Set(entry.blocks.map((b) => b.path))];
59527
- return `batch #${id} doesn't include "${pathArg}" \u2014 files in this batch: ${files.join(", ")}`;
59606
+ return {
59607
+ info: `batch #${id} doesn't include "${pathArg}" \u2014 files in this batch: ${files.join(", ")}`
59608
+ };
59528
59609
  }
59529
59610
  if (entry.undoneFiles.has(pathArg)) {
59530
- return `${pathArg} in batch #${id} is already undone`;
59611
+ return { info: `${pathArg} in batch #${id} is already undone` };
59531
59612
  }
59532
59613
  return revert(entry, [pathArg]);
59533
59614
  },
@@ -59874,7 +59955,6 @@ function isBusyPromptCommand(text2) {
59874
59955
  }
59875
59956
  var persistentDashboardHandle = null;
59876
59957
  var persistentEventSubscribers = /* @__PURE__ */ new Set();
59877
- var FLUSH_INTERVAL_MS = terminalFlushIntervalMs();
59878
59958
  function completedCountIncludingStep(completedStepIds, stepId, total) {
59879
59959
  const completed = completedStepIds.size + (completedStepIds.has(stepId) ? 0 : 1);
59880
59960
  return total > 0 ? Math.min(completed, total) : completed;
@@ -60031,7 +60111,7 @@ function AppInner({
60031
60111
  setStatusLine,
60032
60112
  clear: clearToolProgressDisplay
60033
60113
  } = useToolProgressDisplay(progressSink);
60034
- const { stdout } = use_stdout_default();
60114
+ const { stdout } = bv();
60035
60115
  const walletCurrencyRef = (0, import_react93.useRef)(void 0);
60036
60116
  const { activities: subagentActivities, sinkRef: subagentSinkRef } = useSubagent({
60037
60117
  session,
@@ -60126,7 +60206,7 @@ function AppInner({
60126
60206
  isHistoryMode
60127
60207
  } = useInputRecall(setInput);
60128
60208
  const chatScroll = useChatScrollActions();
60129
- const { setRawMode, isRawModeSupported } = use_stdin_default();
60209
+ const { setRawMode, isRawModeSupported } = An();
60130
60210
  const handleOpenExternalEditor = (0, import_react93.useCallback)(async () => {
60131
60211
  if (!isRawModeSupported) {
60132
60212
  log.pushWarning(t("composer.editorFailed"), t("composer.editorNoRawMode"));
@@ -60891,7 +60971,9 @@ ${t("mcpLifecycle.failedSetupHint")}`
60891
60971
  }
60892
60972
  if (codeMode && input.length === 0 && (chKey === "u" || chKey === "U") && !pendingShell && !pendingPath && !pendingPlan && !pendingReviseEditor && !pendingSessionsPicker && !pendingCheckpointPicker && !pendingMcpHub && !stagedInput && !pendingEditReview && !walkthroughActive && !pendingChoice && !stagedChoiceCustom && !pendingRevision && undoBanner) {
60893
60973
  const out = codeUndo([]);
60894
- log.pushInfo(out);
60974
+ const contextMessage = codeUndoContextMessage(out);
60975
+ if (contextMessage) loop2.appendAndPersist({ role: "system", content: contextMessage });
60976
+ log.pushInfo(codeUndoInfo(out));
60895
60977
  return;
60896
60978
  }
60897
60979
  if (codeMode && input.length === 0 && chKey === " " && undoBanner && !pendingShell && !pendingPath && !pendingPlan && !pendingReviseEditor && !pendingSessionsPicker && !pendingCheckpointPicker && !pendingMcpHub && !stagedInput && !pendingEditReview && !walkthroughActive && !pendingChoice && !stagedChoiceCustom && !pendingRevision) {
@@ -61300,8 +61382,8 @@ ${t("mcpLifecycle.failedSetupHint")}`
61300
61382
  return persistentDashboardHandle.url;
61301
61383
  }
61302
61384
  const startup = (async () => {
61303
- const { startDashboardServer } = await import("./server-GEHOE6CO.js");
61304
- const { saveDashboardPort } = await import("./config-QNDONOTU.js");
61385
+ const { startDashboardServer } = await import("./server-UHKO2VVM.js");
61386
+ const { saveDashboardPort } = await import("./config-KV7VV5LG.js");
61305
61387
  const tryStart = (port) => startDashboardServer(buildCtx(), {
61306
61388
  port,
61307
61389
  host: dashboardHost,
@@ -61888,7 +61970,6 @@ ${answer}`, "brand");
61888
61970
  reasoningBuf.current = "";
61889
61971
  toolCallBuildBuf.current = null;
61890
61972
  };
61891
- const timer = setInterval(flush, FLUSH_INTERVAL_MS);
61892
61973
  let modelInput = text2;
61893
61974
  if (codeMode) {
61894
61975
  const expanded = expandAtMentions(text2, currentRootDir);
@@ -61959,6 +62040,7 @@ ${answer}`, "brand");
61959
62040
  } else if (ev.role === "assistant_delta") {
61960
62041
  if (ev.content) contentBuf.current += ev.content;
61961
62042
  if (ev.reasoningDelta) reasoningBuf.current += ev.reasoningDelta;
62043
+ flush();
61962
62044
  } else if (ev.role === "tool_call_delta") {
61963
62045
  if (ev.toolName) {
61964
62046
  toolCallBuildBuf.current = {
@@ -61967,6 +62049,7 @@ ${answer}`, "brand");
61967
62049
  index: ev.toolCallIndex,
61968
62050
  readyCount: ev.toolCallReadyCount
61969
62051
  };
62052
+ flush();
61970
62053
  }
61971
62054
  } else if (ev.role === "assistant_final") {
61972
62055
  lastAssistantText = ev.content || streamRef.text;
@@ -62086,7 +62169,7 @@ ${answer}`, "brand");
62086
62169
  }
62087
62170
  qq.maybeSendFinalReply(lastAssistantText);
62088
62171
  } finally {
62089
- clearInterval(timer);
62172
+ flush();
62090
62173
  if (abortedThisTurn.current) {
62091
62174
  translator.abort();
62092
62175
  }
@@ -62701,7 +62784,7 @@ ${answer}`, "brand");
62701
62784
  );
62702
62785
  const tickerSuspended = modalOpen || !busy && !isStreaming;
62703
62786
  if (!bootReady) return /* @__PURE__ */ import_react93.default.createElement(BootSplash, null);
62704
- return /* @__PURE__ */ import_react93.default.createElement(import_react93.default.Fragment, null, /* @__PURE__ */ import_react93.default.createElement(TickerProvider, { disabled: tickerSuspended }, /* @__PURE__ */ import_react93.default.createElement(InflightProvider, { inflight: loop2.inflight }, /* @__PURE__ */ import_react93.default.createElement(Box_default, { flexDirection: "row" }, /* @__PURE__ */ import_react93.default.createElement(Box_default, { flexDirection: "column", flexGrow: 1 }, /* @__PURE__ */ import_react93.default.createElement(Box_default, { flexDirection: "column", flexGrow: 1 }, /* @__PURE__ */ import_react93.default.createElement(LiveExpandContext.Provider, { value: liveExpand }, /* @__PURE__ */ import_react93.default.createElement(VerboseContext.Provider, { value: verboseMode }, historyScrollMode === "app" ? /* @__PURE__ */ import_react93.default.createElement(CardStream, { suppressLive: modalOpen }) : /* @__PURE__ */ import_react93.default.createElement(StaticCardStream, { suppressLive: modalOpen }))), !hasConversation && !busy && !isStreaming && slashMatches === null ? /* @__PURE__ */ import_react93.default.createElement(Box_default, { flexGrow: 1, justifyContent: "center" }, /* @__PURE__ */ import_react93.default.createElement(
62787
+ return /* @__PURE__ */ import_react93.default.createElement(import_react93.default.Fragment, null, /* @__PURE__ */ import_react93.default.createElement(TickerProvider, { disabled: tickerSuspended }, /* @__PURE__ */ import_react93.default.createElement(InflightProvider, { inflight: loop2.inflight }, /* @__PURE__ */ import_react93.default.createElement(W, { flexDirection: "row" }, /* @__PURE__ */ import_react93.default.createElement(W, { flexDirection: "column", flexGrow: 1 }, /* @__PURE__ */ import_react93.default.createElement(W, { flexDirection: "column", flexGrow: 1 }, /* @__PURE__ */ import_react93.default.createElement(LiveExpandContext.Provider, { value: liveExpand }, /* @__PURE__ */ import_react93.default.createElement(VerboseContext.Provider, { value: verboseMode }, historyScrollMode === "app" ? /* @__PURE__ */ import_react93.default.createElement(CardStream, { suppressLive: modalOpen }) : /* @__PURE__ */ import_react93.default.createElement(StaticCardStream, { suppressLive: modalOpen }))), !hasConversation && !busy && !isStreaming && slashMatches === null ? /* @__PURE__ */ import_react93.default.createElement(W, { flexGrow: 1, justifyContent: "center" }, /* @__PURE__ */ import_react93.default.createElement(
62705
62788
  WelcomeBanner,
62706
62789
  {
62707
62790
  inCodeMode: !!codeMode,
@@ -63127,18 +63210,18 @@ function MaskedInput({
63127
63210
  });
63128
63211
  if (value.length === 0) {
63129
63212
  if (placeholder.length === 0) {
63130
- return /* @__PURE__ */ import_react94.default.createElement(Text, { inverse: true }, " ");
63213
+ return /* @__PURE__ */ import_react94.default.createElement(L, { inverse: true }, " ");
63131
63214
  }
63132
- return /* @__PURE__ */ import_react94.default.createElement(import_react94.default.Fragment, null, /* @__PURE__ */ import_react94.default.createElement(Text, { inverse: true }, placeholder[0]), /* @__PURE__ */ import_react94.default.createElement(Text, { color: FG.faint }, placeholder.slice(1)));
63215
+ return /* @__PURE__ */ import_react94.default.createElement(import_react94.default.Fragment, null, /* @__PURE__ */ import_react94.default.createElement(L, { inverse: true }, placeholder[0]), /* @__PURE__ */ import_react94.default.createElement(L, { color: FG.faint }, placeholder.slice(1)));
63133
63216
  }
63134
- return /* @__PURE__ */ import_react94.default.createElement(import_react94.default.Fragment, null, /* @__PURE__ */ import_react94.default.createElement(Text, null, mask.repeat(value.length)), /* @__PURE__ */ import_react94.default.createElement(Text, { inverse: true }, " "));
63217
+ return /* @__PURE__ */ import_react94.default.createElement(import_react94.default.Fragment, null, /* @__PURE__ */ import_react94.default.createElement(L, null, mask.repeat(value.length)), /* @__PURE__ */ import_react94.default.createElement(L, { inverse: true }, " "));
63135
63218
  }
63136
63219
 
63137
63220
  // src/cli/ui/Setup.tsx
63138
63221
  function Setup({ onReady }) {
63139
63222
  const [value, setValue] = (0, import_react95.useState)("");
63140
63223
  const [error, setError] = (0, import_react95.useState)(null);
63141
- const { exit: exit2 } = use_app_default();
63224
+ const { exit: exit2 } = fc();
63142
63225
  const handleSubmit = (raw) => {
63143
63226
  const trimmed = raw.trim();
63144
63227
  if (trimmed === "/exit" || trimmed === "/quit") {
@@ -63158,7 +63241,7 @@ function Setup({ onReady }) {
63158
63241
  }
63159
63242
  onReady(trimmed);
63160
63243
  };
63161
- return /* @__PURE__ */ import_react95.default.createElement(Box_default, { flexDirection: "column", paddingX: 1, marginY: 1 }, /* @__PURE__ */ import_react95.default.createElement(Box_default, null, /* @__PURE__ */ import_react95.default.createElement(Text, { bold: true, color: GRADIENT[0] }, GLYPH.brand), /* @__PURE__ */ import_react95.default.createElement(Text, null, " "), /* @__PURE__ */ import_react95.default.createElement(Text, { bold: true }, t("wizard.welcomeTitle"))), /* @__PURE__ */ import_react95.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(Text, { color: COLOR.info }, t("wizard.apiKeyPrompt"))), /* @__PURE__ */ import_react95.default.createElement(Box_default, null, /* @__PURE__ */ import_react95.default.createElement(Text, { dimColor: true }, ` ${t("wizard.apiKeyGetOne")}`)), /* @__PURE__ */ import_react95.default.createElement(Box_default, null, /* @__PURE__ */ import_react95.default.createElement(Text, { dimColor: true }, t("wizard.apiKeySavedLocally", { path: defaultConfigPath() }))), /* @__PURE__ */ import_react95.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(Text, { bold: true, color: COLOR.brand }, GLYPH.bar), /* @__PURE__ */ import_react95.default.createElement(Text, { bold: true, color: COLOR.primary }, " \u203A "), /* @__PURE__ */ import_react95.default.createElement(
63244
+ return /* @__PURE__ */ import_react95.default.createElement(W, { flexDirection: "column", paddingX: 1, marginY: 1 }, /* @__PURE__ */ import_react95.default.createElement(W, null, /* @__PURE__ */ import_react95.default.createElement(L, { bold: true, color: GRADIENT[0] }, GLYPH.brand), /* @__PURE__ */ import_react95.default.createElement(L, null, " "), /* @__PURE__ */ import_react95.default.createElement(L, { bold: true }, t("wizard.welcomeTitle"))), /* @__PURE__ */ import_react95.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(L, { color: COLOR.info }, t("wizard.apiKeyPrompt"))), /* @__PURE__ */ import_react95.default.createElement(W, null, /* @__PURE__ */ import_react95.default.createElement(L, { dimColor: true }, ` ${t("wizard.apiKeyGetOne")}`)), /* @__PURE__ */ import_react95.default.createElement(W, null, /* @__PURE__ */ import_react95.default.createElement(L, { dimColor: true }, t("wizard.apiKeySavedLocally", { path: defaultConfigPath() }))), /* @__PURE__ */ import_react95.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(L, { bold: true, color: COLOR.brand }, GLYPH.bar), /* @__PURE__ */ import_react95.default.createElement(L, { bold: true, color: COLOR.primary }, " \u203A "), /* @__PURE__ */ import_react95.default.createElement(
63162
63245
  MaskedInput,
63163
63246
  {
63164
63247
  value,
@@ -63167,7 +63250,7 @@ function Setup({ onReady }) {
63167
63250
  mask: "\u2022",
63168
63251
  placeholder: t("wizard.apiKeyPlaceholder")
63169
63252
  }
63170
- )), error ? /* @__PURE__ */ import_react95.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(Text, { color: COLOR.err, bold: true }, GLYPH.err), /* @__PURE__ */ import_react95.default.createElement(Text, { color: COLOR.err }, ` ${error}`)) : value ? /* @__PURE__ */ import_react95.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(Text, { dimColor: true }, t("wizard.apiKeyPreview", { redacted: redactKey(value) }))) : null, /* @__PURE__ */ import_react95.default.createElement(Box_default, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(Text, { dimColor: true }, t("wizard.exitHint"))));
63253
+ )), error ? /* @__PURE__ */ import_react95.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(L, { color: COLOR.err, bold: true }, GLYPH.err), /* @__PURE__ */ import_react95.default.createElement(L, { color: COLOR.err }, ` ${error}`)) : value ? /* @__PURE__ */ import_react95.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(L, { dimColor: true }, t("wizard.apiKeyPreview", { redacted: redactKey(value) }))) : null, /* @__PURE__ */ import_react95.default.createElement(W, { marginTop: 1 }, /* @__PURE__ */ import_react95.default.createElement(L, { dimColor: true }, t("wizard.exitHint"))));
63171
63254
  }
63172
63255
 
63173
63256
  // src/cli/ui/drain-tty.ts
@@ -63470,7 +63553,7 @@ async function chatCommand(opts) {
63470
63553
  process.exit(143);
63471
63554
  });
63472
63555
  }
63473
- const { waitUntilExit } = render_default(
63556
+ const { waitUntilExit } = Wo(
63474
63557
  /* @__PURE__ */ import_react96.default.createElement(
63475
63558
  Root,
63476
63559
  {
@@ -63491,7 +63574,7 @@ async function chatCommand(opts) {
63491
63574
  qqErrorRef
63492
63575
  }
63493
63576
  ),
63494
- { exitOnCtrlC: true }
63577
+ { exitOnCtrlC: true, incrementalRendering: true }
63495
63578
  );
63496
63579
  try {
63497
63580
  await waitUntilExit();
@@ -63506,4 +63589,4 @@ async function chatCommand(opts) {
63506
63589
  export {
63507
63590
  chatCommand
63508
63591
  };
63509
- //# sourceMappingURL=chunk-R6KIHEF3.js.map
63592
+ //# sourceMappingURL=chunk-GNRKXRRE.js.map