scream-code 0.14.6 → 0.14.7

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.
@@ -4,8 +4,8 @@ import { dirname as __cjsShimDirname } from 'node:path';
4
4
  const __filename = __cjsShimFileURLToPath(import.meta.url);
5
5
  const __dirname = __cjsShimDirname(__filename);
6
6
  import "./suppress-sqlite-warning-C2VB0doZ.mjs";
7
- import { $t as isTodoItemShape, A as renderDiffLinesClustered, An as CLI_COMMAND_NAME, At as ENABLE_TERMINAL_FOCUS_REPORTING, B as BackgroundAgentStatusComponent, Bn as MemoryMemoStore, Bt as TERMINAL_THEME_LIGHT, Cn as loadTuiConfig, Ct as createThemeStyles, D as toggleEmptySessionHint, Dn as getInputHistoryFile, Dt as parseOsc11BackgroundTheme, E as isTurnElapsedEnabled, En as getDataDir, Et as detectTerminalTheme, F as estimateTokens, Fn as fetchCatalog, Ft as OSC11_RESPONSE_PREFIX_NO_ESC, G as getBreathingFrame, Gn as isOrphanedToolCallError, H as AgentGroupComponent, Hn as log, Ht as isStreaming, I as getSharedSpeedTracker, In as saveCatalogCache, It as QUERY_TERMINAL_THEME, J as refineGoal, Jt as printableChar, K as resetBreathingClock, Kn as ErrorCodes, L as SkillActivationComponent, Ln as ScreamHarness, Lt as TERMINAL_FOCUS_IN, M as langFromPath, Mn as CLI_USER_AGENT_PRODUCT, Mt as OSC11_QUERY, N as CachedContainer, Nn as PRODUCT_NAME, Nt as OSC11_RESPONSE, O as ToolCallComponent, On as getLogDir, Ot as DISABLE_TERMINAL_FOCUS_REPORTING, P as ThinkingComponent, Pn as DEFAULT_CATALOG_URL, Pt as OSC11_RESPONSE_PREFIX, Qt as formatErrorMessage, R as ReadGroupComponent, Rt as TERMINAL_FOCUS_OUT, S as getDaemonInstructions, Sn as TuiLikePreferencesSchema, St as createMarkdownTheme, T as isEmptySessionHintDismissed, Tn as detectShellEnvironment, Tt as getColorPalette, U as WelcomeComponent, Un as resolveGlobalLogPath, Ut as FooterComponent, V as AssistantMessageComponent, Vn as flushDiagnosticLogs, Vt as isBusy, W as BREATHE_CYCLE_MS, Wn as isScreamError, Xt as appendStreamingArgsPreview, Yt as STATUS_BULLET, Zt as argsRecord, _ as refreshUpdateCache, _n as isExperimentalFlagEnabled, _t as clearInfoPanelState, an as EMPTY_SESSION_HINT_URL, b as readJsonlFile, bn as PULSE_WAVE_FRAMES, bt as resolveThemeSync, c as hasDispose, cn as SESSION_TIPS, ct as handlePlanCommand, d as formatMemoryMemoForInjection, dn as getCtrlDHint, en as parseStreamingArgs, et as toTerminalHyperlink, fn as getLlmNotSetMessage, g as selectUpdateTarget, gn as sortSlashCommands, gt as supportsBalance, hn as BUILTIN_SLASH_COMMANDS, ht as refreshProviderBalance, i as buildRoleAdditionalText, in as CHARS_PER_TOKEN, j as highlightLines, jn as CLI_UI_MODE, jt as ENABLE_TERMINAL_THEME_REPORTING, k as renderDiffLines, kn as detectInstallSource, kt as DISABLE_TERMINAL_THEME_REPORTING, l as isPlanExpandable, ln as TIP_ROTATION_INTERVAL_MS, mn as buildSkillSlashCommands, n as clearEvalPanelState, nn as stringValue, nt as getModelCycleLevel, on as EXIT_CONFIRM_WINDOW_MS, ot as handleFusionPlanCommand, pn as getNoActiveSessionMessage, q as clearGoalState, qn as SCREAM_ERROR_INFO, r as openUrl, rn as truncateErrorMessage, s as disposeChildren, sn as MAIN_AGENT_ID, t as dispatchInput, tn as serializeToolResultOutput, tt as changeThinkingLevel, u as MoonLoader, un as getCtrlCHint, v as readUpdateCache, vn as setExperimentalFlags, w as UserMessageComponent, wn as saveTuiConfig, wt as contrastTextHex, xn as TuiConfigParseError, xt as createEditorTheme, y as appendJsonlLine, yn as PIXEL_PULSE_FRAMES, z as parseReadGroupOutput, zn as resolveScreamHome, zt as TERMINAL_THEME_DARK } from "./dispatch-DEFMbHSe.mjs";
8
- import { a as setLocale, o as t } from "./text-input-dialog-C7gjr4Gk.mjs";
7
+ import { $t as isTodoItemShape, A as renderDiffLinesClustered, An as CLI_COMMAND_NAME, At as ENABLE_TERMINAL_FOCUS_REPORTING, B as BackgroundAgentStatusComponent, Bn as MemoryMemoStore, Bt as TERMINAL_THEME_LIGHT, Cn as loadTuiConfig, Ct as createThemeStyles, D as toggleEmptySessionHint, Dn as getInputHistoryFile, Dt as parseOsc11BackgroundTheme, E as isTurnElapsedEnabled, En as getDataDir, Et as detectTerminalTheme, F as estimateTokens, Fn as fetchCatalog, Ft as OSC11_RESPONSE_PREFIX_NO_ESC, G as getBreathingFrame, Gn as isOrphanedToolCallError, H as AgentGroupComponent, Hn as log, Ht as isStreaming, I as getSharedSpeedTracker, In as saveCatalogCache, It as QUERY_TERMINAL_THEME, J as refineGoal, Jt as printableChar, K as resetBreathingClock, Kn as ErrorCodes, L as SkillActivationComponent, Ln as ScreamHarness, Lt as TERMINAL_FOCUS_IN, M as langFromPath, Mn as CLI_USER_AGENT_PRODUCT, Mt as OSC11_QUERY, N as CachedContainer, Nn as PRODUCT_NAME, Nt as OSC11_RESPONSE, O as ToolCallComponent, On as getLogDir, Ot as DISABLE_TERMINAL_FOCUS_REPORTING, P as ThinkingComponent, Pn as DEFAULT_CATALOG_URL, Pt as OSC11_RESPONSE_PREFIX, Qt as formatErrorMessage, R as ReadGroupComponent, Rt as TERMINAL_FOCUS_OUT, S as getDaemonInstructions, Sn as TuiLikePreferencesSchema, St as createMarkdownTheme, T as isEmptySessionHintDismissed, Tn as detectShellEnvironment, Tt as getColorPalette, U as WelcomeComponent, Un as resolveGlobalLogPath, Ut as FooterComponent, V as AssistantMessageComponent, Vn as flushDiagnosticLogs, Vt as isBusy, W as BREATHE_CYCLE_MS, Wn as isScreamError, Xt as appendStreamingArgsPreview, Yt as STATUS_BULLET, Zt as argsRecord, _ as refreshUpdateCache, _n as isExperimentalFlagEnabled, _t as clearInfoPanelState, an as EMPTY_SESSION_HINT_URL, b as readJsonlFile, bn as PULSE_WAVE_FRAMES, bt as resolveThemeSync, c as hasDispose, cn as SESSION_TIPS, ct as handlePlanCommand, d as formatMemoryMemoForInjection, dn as getCtrlDHint, en as parseStreamingArgs, et as toTerminalHyperlink, fn as getLlmNotSetMessage, g as selectUpdateTarget, gn as sortSlashCommands, gt as supportsBalance, hn as BUILTIN_SLASH_COMMANDS, ht as refreshProviderBalance, i as buildRoleAdditionalText, in as CHARS_PER_TOKEN, j as highlightLines, jn as CLI_UI_MODE, jt as ENABLE_TERMINAL_THEME_REPORTING, k as renderDiffLines, kn as detectInstallSource, kt as DISABLE_TERMINAL_THEME_REPORTING, l as isPlanExpandable, ln as TIP_ROTATION_INTERVAL_MS, mn as buildSkillSlashCommands, n as clearEvalPanelState, nn as stringValue, nt as getModelCycleLevel, on as EXIT_CONFIRM_WINDOW_MS, ot as handleFusionPlanCommand, pn as getNoActiveSessionMessage, q as clearGoalState, qn as SCREAM_ERROR_INFO, r as openUrl, rn as truncateErrorMessage, s as disposeChildren, sn as MAIN_AGENT_ID, t as dispatchInput, tn as serializeToolResultOutput, tt as changeThinkingLevel, u as MoonLoader, un as getCtrlCHint, v as readUpdateCache, vn as setExperimentalFlags, w as UserMessageComponent, wn as saveTuiConfig, wt as contrastTextHex, xn as TuiConfigParseError, xt as createEditorTheme, y as appendJsonlLine, yn as PIXEL_PULSE_FRAMES, z as parseReadGroupOutput, zn as resolveScreamHome, zt as TERMINAL_THEME_DARK } from "./dispatch-MWaAkj2l.mjs";
8
+ import { a as setLocale, o as t } from "./text-input-dialog-B0yHChBj.mjs";
9
9
  import { createRequire } from "node:module";
10
10
  import { randomUUID } from "node:crypto";
11
11
  import { access, mkdir, mkdtemp, readFile, readdir, realpath, rm, unlink, writeFile } from "node:fs/promises";
@@ -23,14 +23,14 @@ import process$1 from "node:process";
23
23
  import { Command, Option } from "commander";
24
24
  import { createInterface } from "node:readline/promises";
25
25
  import chalk, { chalkStderr } from "chalk";
26
- import { CombinedAutocompleteProvider, Container, Editor, HStack, Input, Key, ProcessTerminal, ScrollView, Spacer, Text, TuiAltScreen, VStack, decodeKittyPrintable, deleteAllKittyImages, fuzzyFilter, fuzzyMatch, getCapabilities, isKeyRelease, matchesKey, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@liutod-scream/pi-tui";
26
+ import { CombinedAutocompleteProvider, Container, Editor, Input, Key, ProcessTerminal, ScrollView, Spacer, Text, TuiAltScreen, VStack, decodeKittyPrintable, deleteAllKittyImages, fuzzyFilter, fuzzyMatch, getCapabilities, isKeyRelease, matchesKey, truncateToWidth, visibleWidth, wrapTextWithAnsi } from "@liutod-scream/pi-tui";
27
27
  import { createInterface as createInterface$1 } from "node:readline";
28
28
  //#region src/cli/build-info.ts
29
29
  function optionalBuildString(value) {
30
30
  return typeof value === "string" && value.length > 0 ? value : void 0;
31
31
  }
32
32
  const SCREAM_BUILD_INFO = {
33
- version: optionalBuildString("0.14.6"),
33
+ version: optionalBuildString("0.14.7"),
34
34
  channel: optionalBuildString(""),
35
35
  commit: optionalBuildString(""),
36
36
  buildTarget: optionalBuildString("darwin-arm64")
@@ -2542,7 +2542,13 @@ var SessionEventHandler = class {
2542
2542
  handleStepRetrying(event) {
2543
2543
  this.host.streamingUI.resetLiveText();
2544
2544
  this.host.streamingUI.resetToolUi();
2545
- this.host.setAppState({ reconnectAttempt: event.nextAttempt });
2545
+ this.host.setAppState({
2546
+ reconnectAttempt: event.nextAttempt,
2547
+ reconnectMaxAttempts: event.maxAttempts,
2548
+ reconnectDelayMs: event.delayMs,
2549
+ reconnectStatusCode: event.statusCode,
2550
+ reconnectErrorName: event.errorName
2551
+ });
2546
2552
  }
2547
2553
  maybeShowDebugTiming(event) {
2548
2554
  if (process.env["SCREAM_CODE_DEBUG"] !== "1") return;
@@ -6154,6 +6160,30 @@ var GutterContainer = class extends Container {
6154
6160
  //#endregion
6155
6161
  //#region src/tui/components/panes/status-bar-pane.ts
6156
6162
  /**
6163
+ * Single-line row: pulse wave immediately followed by its label.
6164
+ *
6165
+ * HStack cannot produce this layout: pi-tui's Text.render pads every line to
6166
+ * the full row width, so each child's intrinsic width equals the full width
6167
+ * and HStack's shrink distribution pushes the label far to the right.
6168
+ * Composing the line manually from the loader's unpadded frame text keeps
6169
+ * the label snug against the wave, and it re-reads the frame on every render
6170
+ * so the wave keeps animating.
6171
+ */
6172
+ var PulseWaveLabelRow = class {
6173
+ wave;
6174
+ label;
6175
+ constructor(wave, label) {
6176
+ this.wave = wave;
6177
+ this.label = label;
6178
+ }
6179
+ render(width) {
6180
+ return [truncateToWidth(` ${this.wave.getFrameText()} ${this.label}`, Math.max(1, width))];
6181
+ }
6182
+ invalidate() {
6183
+ this.wave.invalidate();
6184
+ }
6185
+ };
6186
+ /**
6157
6187
  * A fixed one-line status bar shown directly above the input editor: it
6158
6188
  * displays the current work phase (idle / waiting / thinking / composing /
6159
6189
  * tool) with its spinner, pinned to the bottom of the terminal via the dock
@@ -6179,12 +6209,8 @@ var StatusBarPaneComponent = class extends Container {
6179
6209
  }
6180
6210
  if (options.mode === "waiting" || options.mode === "tool" || options.mode === "composing" || options.mode === "thinking") {
6181
6211
  if (options.pulseWave !== void 0) {
6182
- if (options.label.length > 0) {
6183
- const row = new HStack();
6184
- row.addChild(options.pulseWave);
6185
- row.addChild(new Text(` ${options.label}`, 1, 0));
6186
- this.addChild(row);
6187
- } else this.addChild(options.pulseWave);
6212
+ if (options.label.length > 0) this.addChild(new PulseWaveLabelRow(options.pulseWave, options.label));
6213
+ else this.addChild(options.pulseWave);
6188
6214
  return;
6189
6215
  }
6190
6216
  if (options.spinner !== void 0) {
@@ -6445,6 +6471,14 @@ var PulseWaveLoader = class extends Text {
6445
6471
  intervalId = null;
6446
6472
  ui;
6447
6473
  colorHex;
6474
+ /** Raw frame text without Text's full-width render padding, exposed so
6475
+ * callers can compose the wave inline with trailing content (e.g. the
6476
+ * reconnect label in the status bar). */
6477
+ frameText = "";
6478
+ /** The current frame's cells ("■ ⬝ ⬝"), unpadded. */
6479
+ getFrameText() {
6480
+ return this.frameText;
6481
+ }
6448
6482
  constructor(ui, colorHex) {
6449
6483
  super("", 1, 0);
6450
6484
  this.ui = ui;
@@ -6475,7 +6509,8 @@ var PulseWaveLoader = class extends Text {
6475
6509
  1,
6476
6510
  2
6477
6511
  ].map((idx) => this.renderCell(idx, step.active, step.forward));
6478
- this.setText(cells.join(" "));
6512
+ this.frameText = cells.join(" ");
6513
+ this.setText(this.frameText);
6479
6514
  this.ui.requestRender();
6480
6515
  }
6481
6516
  renderCell(index, active, forward) {
@@ -6499,6 +6534,7 @@ var LifecycleController = class LifecycleController {
6499
6534
  terminalFocusTrackingDispose;
6500
6535
  terminalThemeTrackingDispose;
6501
6536
  lastActivityMode;
6537
+ lastReconnectAttempt = 0;
6502
6538
  /** The active status-bar loader (PulseWaveLoader or MoonLoader). Owned by
6503
6539
  * this controller; stopped before replacement to avoid leaking timers. */
6504
6540
  statusBarLoader;
@@ -6741,8 +6777,11 @@ var LifecycleController = class LifecycleController {
6741
6777
  updateActivityPane() {
6742
6778
  const effectiveMode = this.resolveActivityPaneMode();
6743
6779
  this.syncTerminalProgress(this.shouldShowTerminalProgress(effectiveMode));
6744
- if (effectiveMode === this.lastActivityMode) return;
6780
+ const reconnectAttempt = this.host.state.appState.reconnectAttempt;
6781
+ const reconnectChanged = reconnectAttempt !== this.lastReconnectAttempt;
6782
+ if (effectiveMode === this.lastActivityMode && !reconnectChanged) return;
6745
6783
  this.lastActivityMode = effectiveMode;
6784
+ this.lastReconnectAttempt = reconnectAttempt;
6746
6785
  this.updateStatusBar(effectiveMode);
6747
6786
  const { state } = this.host;
6748
6787
  state.activityContainer.clear();
@@ -6787,7 +6826,7 @@ var LifecycleController = class LifecycleController {
6787
6826
  this.statusBarLoader = loader;
6788
6827
  state.statusBarContainer.addChild(new StatusBarPaneComponent({
6789
6828
  mode,
6790
- label: "",
6829
+ label: this.buildReconnectLabel(state),
6791
6830
  pulseWave: loader
6792
6831
  }));
6793
6832
  }
@@ -6808,6 +6847,25 @@ var LifecycleController = class LifecycleController {
6808
6847
  }
6809
6848
  state.ui.requestRender();
6810
6849
  }
6850
+ /** Builds the reconnect label shown next to the status-bar pulse wave
6851
+ * while a step retry is in flight, e.g. "重连中 3/10 · 限流 · 20s 后重试".
6852
+ * Returns an empty string when no retry is active. Static by design: the
6853
+ * delay shown is the value from the latest retry event, not a ticking
6854
+ * countdown. */
6855
+ buildReconnectLabel(state) {
6856
+ const a = state.appState;
6857
+ if (a.reconnectAttempt <= 0) return "";
6858
+ const reasonKey = a.reconnectStatusCode === 429 ? "status.reason_rate_limit" : a.reconnectStatusCode !== void 0 && a.reconnectStatusCode >= 500 ? "status.reason_server" : (a.reconnectErrorName ?? "").includes("Timeout") ? "status.reason_timeout" : "status.reason_connection";
6859
+ const reason = a.reconnectStatusCode !== void 0 ? `${t(reasonKey)} (${String(a.reconnectStatusCode)})` : a.reconnectErrorName !== void 0 && a.reconnectErrorName.length > 0 ? `${t(reasonKey)} (${a.reconnectErrorName})` : t(reasonKey);
6860
+ const delaySec = Math.max(1, Math.round((a.reconnectDelayMs ?? 0) / 1e3));
6861
+ const label = t("status.reconnecting_detail", {
6862
+ attempt: String(a.reconnectAttempt),
6863
+ max: String(a.reconnectMaxAttempts ?? 0),
6864
+ reason,
6865
+ delay: String(delaySec)
6866
+ });
6867
+ return chalk.hex(state.theme.colors.textDim)(label);
6868
+ }
6811
6869
  /** Force a status-bar refresh even when the mode is unchanged. Used after
6812
6870
  * session switches/clears: the transcript is emptied, so the empty-session
6813
6871
  * hint must (re)appear even though idle -> idle normally short-circuits. */
@@ -12190,7 +12248,7 @@ var ScreamTUI = class {
12190
12248
  const card = new OnboardingCardComponent({
12191
12249
  colors: this.state.theme.colors,
12192
12250
  onConfigure: () => {
12193
- import("./dispatch-Vy7eCkPt.mjs").then(({ handleConnectCommand }) => handleConnectCommand(this, "")).finally(() => {
12251
+ import("./dispatch-CmY89ob7.mjs").then(({ handleConnectCommand }) => handleConnectCommand(this, "")).finally(() => {
12194
12252
  this.restoreEditor();
12195
12253
  });
12196
12254
  },
@@ -3,5 +3,5 @@ import { fileURLToPath as __cjsShimFileURLToPath } from 'node:url';
3
3
  import { dirname as __cjsShimDirname } from 'node:path';
4
4
  const __filename = __cjsShimFileURLToPath(import.meta.url);
5
5
  const __dirname = __cjsShimDirname(__filename);
6
- import { Kt as handleConnectCommand } from "./dispatch-DEFMbHSe.mjs";
6
+ import { Kt as handleConnectCommand } from "./dispatch-MWaAkj2l.mjs";
7
7
  export { handleConnectCommand };
@@ -6,7 +6,7 @@ const __dirname = __cjsShimDirname(__filename);
6
6
  import { i as __require, o as __toESM, r as __exportAll, t as __commonJSMin } from "./chunk-D90kvbyJ.mjs";
7
7
  import { C as join$1, D as resolve$1, E as relative$1, S as isAbsolute$1, T as parse$7, a as isSupportedFile, b as basename$1, i as ingestFile, r as ingestDirectory, t as multiSearch, w as normalize, x as dirname$2, y as KnowledgeStore } from "./src-BH9W5k24.mjs";
8
8
  import { t as require_base64_js } from "./base64-js-DzVmk6Nb.mjs";
9
- import { a as setLocale, i as getLocale, n as assertScreamHostIdentity, o as t, r as createScreamDefaultHeaders, t as TextInputDialogComponent } from "./text-input-dialog-C7gjr4Gk.mjs";
9
+ import { a as setLocale, i as getLocale, n as assertScreamHostIdentity, o as t, r as createScreamDefaultHeaders, t as TextInputDialogComponent } from "./text-input-dialog-B0yHChBj.mjs";
10
10
  import { createRequire } from "node:module";
11
11
  import { createHash, randomBytes, randomInt, randomUUID } from "node:crypto";
12
12
  import * as fs$1 from "node:fs/promises";
@@ -127027,9 +127027,8 @@ function lerpGradient(t) {
127027
127027
  const b = Math.round(b0 + (b1 - b0) * localT);
127028
127028
  return `#${r.toString(16).padStart(2, "0")}${g.toString(16).padStart(2, "0")}${b.toString(16).padStart(2, "0")}`;
127029
127029
  }
127030
- function buildStatusLine(streamingPhase, streamingStartTime, reconnectAttempt) {
127030
+ function buildStatusLine(streamingPhase, streamingStartTime) {
127031
127031
  if (streamingPhase === "idle") return t("status.idle");
127032
- if (reconnectAttempt > 0 && streamingPhase === "waiting") return chalk.hex("#E85454").bold("◎") + " " + chalk.hex("#E85454")(`${t("status.reconnecting")} ${String(reconnectAttempt)}`);
127033
127032
  let label;
127034
127033
  if (streamingPhase === "tool") label = t("status.tool");
127035
127034
  else if (streamingPhase === "waiting") label = t("status.waiting");
@@ -127207,7 +127206,7 @@ var FooterComponent = class {
127207
127206
  let rightText;
127208
127207
  if (this.transientHint) rightText = chalk.hex(colors.warning).bold(this.transientHint);
127209
127208
  else {
127210
- const statusLine = buildStatusLine(state.streamingPhase, state.streamingStartTime, state.reconnectAttempt);
127209
+ const statusLine = buildStatusLine(state.streamingPhase, state.streamingStartTime);
127211
127210
  const ccDot = state.ccConnectActive ? chalk.hex(colors.success)("●") : chalk.hex(colors.textDim)("●");
127212
127211
  const sessionUsage = state.sessionUsage ?? {
127213
127212
  inputOther: 0,
@@ -129526,7 +129525,7 @@ async function guidedGoalSetup(host) {
129526
129525
  host.showNotice(t("goal.storm_breaker"), t("goal.conflict_loop"));
129527
129526
  return;
129528
129527
  }
129529
- const { TextInputDialogComponent } = await import("./text-input-dialog-FGVh3qGR.mjs");
129528
+ const { TextInputDialogComponent } = await import("./text-input-dialog-B9uwX1Uy.mjs");
129530
129529
  const initialDesc = await promptText(host, TextInputDialogComponent, {
129531
129530
  title: t("goal.setup_title_initial"),
129532
129531
  subtitle: t("goal.setup_desc_hint"),
@@ -129547,7 +129546,7 @@ async function guidedGoalSetup(host) {
129547
129546
  await showGoalConfigWizard(host, session, confirmed.trim() || objective, false);
129548
129547
  }
129549
129548
  async function showGoalConfigWizard(host, session, objective, replace) {
129550
- const { TextInputDialogComponent } = await import("./text-input-dialog-FGVh3qGR.mjs");
129549
+ const { TextInputDialogComponent } = await import("./text-input-dialog-B9uwX1Uy.mjs");
129551
129550
  const turnInput = await promptNumber(host, TextInputDialogComponent, {
129552
129551
  title: t("goal.wizard_title", { objective }),
129553
129552
  subtitle: t("goal.budget_turns_hint"),
@@ -131629,7 +131628,7 @@ var TruncatedOutputComponent = class {
131629
131628
  const remaining = contentLines.length - this.maxLines;
131630
131629
  const tail = this.maxLines <= 0 ? [] : contentLines.slice(-this.maxLines);
131631
131630
  const expandHint = this.hintFormatter ? this.hintFormatter(remaining) : t("shell.more_lines", { count: String(remaining) });
131632
- return [chalk.dim(expandHint), ...tail];
131631
+ return [...new Text(chalk.dim(expandHint), 2, 0).render(width), ...tail];
131633
131632
  }
131634
131633
  };
131635
131634
  const renderTruncated = (_toolCall, result, ctx) => {
package/dist/main.mjs CHANGED
@@ -6,7 +6,7 @@ const __dirname = __cjsShimDirname(__filename);
6
6
  import "./suppress-sqlite-warning-C2VB0doZ.mjs";
7
7
  //#region src/main.ts
8
8
  try {
9
- (await import("./app-755L4Xpi.mjs")).main();
9
+ (await import("./app-D_n0flAk.mjs")).main();
10
10
  } catch (error) {
11
11
  process.stderr.write(`${error instanceof Error ? error.stack ?? error.message : String(error)}\n`);
12
12
  process.exit(1);
@@ -126,7 +126,11 @@ const dictionaries = {
126
126
  "status.composing": "输出中",
127
127
  "status.tool": "执行中",
128
128
  "status.waiting": "等待中",
129
- "status.reconnecting": "重连中",
129
+ "status.reconnecting_detail": "重连中 {attempt}/{max} · {reason} · {delay}s 后重试",
130
+ "status.reason_rate_limit": "限流",
131
+ "status.reason_server": "服务器错误",
132
+ "status.reason_timeout": "网络超时",
133
+ "status.reason_connection": "连接问题",
130
134
  "approval.allow_once": "批准一次",
131
135
  "approval.allow_session": "批准(当前会话)",
132
136
  "approval.deny": "拒绝",
@@ -1224,7 +1228,11 @@ const dictionaries = {
1224
1228
  "status.composing": "Writing",
1225
1229
  "status.tool": "Running",
1226
1230
  "status.waiting": "Waiting",
1227
- "status.reconnecting": "Reconnecting",
1231
+ "status.reconnecting_detail": "Reconnecting {attempt}/{max} · {reason} · retry in {delay}s",
1232
+ "status.reason_rate_limit": "rate limited",
1233
+ "status.reason_server": "server error",
1234
+ "status.reason_timeout": "network timeout",
1235
+ "status.reason_connection": "connection issue",
1228
1236
  "approval.allow_once": "Allow Once",
1229
1237
  "approval.allow_session": "Allow Session",
1230
1238
  "approval.deny": "Deny",
@@ -3,5 +3,5 @@ import { fileURLToPath as __cjsShimFileURLToPath } from 'node:url';
3
3
  import { dirname as __cjsShimDirname } from 'node:path';
4
4
  const __filename = __cjsShimFileURLToPath(import.meta.url);
5
5
  const __dirname = __cjsShimDirname(__filename);
6
- import { t as TextInputDialogComponent } from "./text-input-dialog-C7gjr4Gk.mjs";
6
+ import { t as TextInputDialogComponent } from "./text-input-dialog-B0yHChBj.mjs";
7
7
  export { TextInputDialogComponent };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "scream-code",
3
- "version": "0.14.6",
3
+ "version": "0.14.7",
4
4
  "description": "A terminal-native AI agent for builders",
5
5
  "license": "MIT",
6
6
  "author": "ScreamCli",