langchain_agentx_stream_ui 0.7.9 → 0.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -25,7 +25,7 @@ import {
25
25
  useSessionStoreApi,
26
26
  useSessionViewOptions,
27
27
  useToolDisplayOptions
28
- } from "./chunk-RWKNI52H.js";
28
+ } from "./chunk-XEIQBTD2.js";
29
29
  import {
30
30
  classifyToolResultSoftKind,
31
31
  createDefaultToolRegistry,
@@ -2212,4 +2212,4 @@ export {
2212
2212
  createActiveSessionBridge,
2213
2213
  MultiAgentSession
2214
2214
  };
2215
- //# sourceMappingURL=chunk-AMUGAG7U.js.map
2215
+ //# sourceMappingURL=chunk-MI4NGIDF.js.map
@@ -51,6 +51,7 @@ function createEmptyTree() {
51
51
  customMessage: null
52
52
  },
53
53
  modelRetry: null,
54
+ compactProgress: null,
54
55
  parallelAgentTextGateCallIds: null,
55
56
  deferredMainText: ""
56
57
  };
@@ -88,6 +89,7 @@ var DEFAULT_EVENT_TIERS = {
88
89
  "assistant-turn-superseded": "main",
89
90
  /** D-CMP-EVT-11:主可见(非仅 debug);淡提示 Conversation compacted */
90
91
  "compact-boundary": "collapsed",
92
+ "compact-progress": "debug",
91
93
  "task-started": "debug",
92
94
  "task-progress": "debug",
93
95
  "task-notification-enqueued": "debug",
@@ -540,6 +542,48 @@ function formatModelRetryCategoryLabel(category) {
540
542
  }
541
543
  }
542
544
 
545
+ // src/types/compactProgress.ts
546
+ function normalizePercent(value) {
547
+ const n = typeof value === "number" ? value : Number(value);
548
+ if (!Number.isFinite(n)) return 0;
549
+ return Math.max(0, Math.min(100, Math.round(n)));
550
+ }
551
+ function optionalInt(value) {
552
+ if (value == null) return null;
553
+ const n = typeof value === "number" ? value : Number(value);
554
+ return Number.isFinite(n) ? Math.floor(n) : null;
555
+ }
556
+ function defaultPrecompactDetail(stage, detail) {
557
+ if (detail) return detail;
558
+ const normalized = stage.trim().toLowerCase();
559
+ if (normalized === "precompact" || normalized === "pre_compact" || normalized === "hooks") {
560
+ return "Running PreCompact hooks\u2026";
561
+ }
562
+ return null;
563
+ }
564
+ function parseCompactProgressEventData(data, timestampMs) {
565
+ const phaseRaw = data.phase;
566
+ const phase = typeof phaseRaw === "string" && phaseRaw.trim() ? phaseRaw.trim().toLowerCase() : "tick";
567
+ const stage = typeof data.stage === "string" ? data.stage : String(data.stage ?? "");
568
+ const percent = normalizePercent(data.percent);
569
+ const detailRaw = data.detail;
570
+ const detail = typeof detailRaw === "string" && detailRaw.trim() ? detailRaw.trim() : null;
571
+ return {
572
+ phase,
573
+ percent,
574
+ stage,
575
+ stageIndex: optionalInt(data.stage_index),
576
+ totalStages: optionalInt(data.total_stages),
577
+ detail: defaultPrecompactDetail(stage, detail),
578
+ updatedAt: timestampMs
579
+ };
580
+ }
581
+ function formatCompactProgressBar(percent, barWidth = 40) {
582
+ const filled = Math.round(barWidth * percent / 100);
583
+ const safeFilled = Math.max(0, Math.min(barWidth, filled));
584
+ return `${"\u25B0".repeat(safeFilled)}${"\u25B1".repeat(barWidth - safeFilled)}`;
585
+ }
586
+
543
587
  // src/core/taskNotification.ts
544
588
  function trimStr(value) {
545
589
  return typeof value === "string" ? value.trim() : "";
@@ -677,11 +721,16 @@ function cloneTree(tree) {
677
721
  waitingForFinalResponseAfterTasks: tree.waitingForFinalResponseAfterTasks,
678
722
  taskStartTime: tree.taskStartTime,
679
723
  hookProgress: { ...tree.hookProgress },
680
- modelRetry: tree.modelRetry ? { ...tree.modelRetry } : null
724
+ modelRetry: tree.modelRetry ? { ...tree.modelRetry } : null,
725
+ compactProgress: tree.compactProgress ? { ...tree.compactProgress } : null
681
726
  };
682
727
  }
728
+ function clearCompactProgress(tree) {
729
+ tree.compactProgress = null;
730
+ }
683
731
  function clearModelRetry(tree) {
684
732
  tree.modelRetry = null;
733
+ clearCompactProgress(tree);
685
734
  }
686
735
  function buildClassifyContext(tree) {
687
736
  let streamingToolNodeId;
@@ -1009,6 +1058,16 @@ function handleApiRetry(tree, event) {
1009
1058
  tree.modelRetry = modelRetry;
1010
1059
  }
1011
1060
  }
1061
+ function handleCompactProgress(tree, event) {
1062
+ const data = event.data;
1063
+ const parsed = parseCompactProgressEventData(data, eventTimeToMs(event.timestamp));
1064
+ if (!parsed) return;
1065
+ if (parsed.phase === "end") {
1066
+ clearCompactProgress(tree);
1067
+ return;
1068
+ }
1069
+ tree.compactProgress = parsed;
1070
+ }
1012
1071
  function handleHookProgress(tree, event) {
1013
1072
  const data = event.data;
1014
1073
  const modelRetry = parseModelRetryHookData(data, eventTimeToMs(event.timestamp));
@@ -1644,6 +1703,9 @@ function handleDebug(tree, event, eventIndex, parentNodeId, collectDebug) {
1644
1703
  case "api-retry":
1645
1704
  handleApiRetry(tree, event);
1646
1705
  break;
1706
+ case "compact-progress":
1707
+ handleCompactProgress(tree, event);
1708
+ break;
1647
1709
  case "hook-progress":
1648
1710
  handleHookProgress(tree, event);
1649
1711
  break;
@@ -1836,6 +1898,7 @@ function applyClassified(tree, classified, eventIndex, options) {
1836
1898
  handleTaskNotification(tree, event);
1837
1899
  break;
1838
1900
  case "compact-boundary":
1901
+ clearCompactProgress(tree);
1839
1902
  pushSystemSummarySource(tree, event, eventIndex);
1840
1903
  if (options?.collectDebug === true) {
1841
1904
  tree.debugEvents.push({
@@ -4707,6 +4770,22 @@ function ModelRetryBlock({ state, verbose = false }) {
4707
4770
  ] });
4708
4771
  }
4709
4772
 
4773
+ // src/view/CompactProgressBlock.tsx
4774
+ import { jsx as jsx6, jsxs as jsxs4 } from "react/jsx-runtime";
4775
+ function CompactProgressBlock({ state }) {
4776
+ const bar = formatCompactProgressBar(state.percent);
4777
+ return /* @__PURE__ */ jsxs4("div", { className: "lax-compact-progress", "data-testid": "lax-compact-progress", children: [
4778
+ /* @__PURE__ */ jsx6("div", { className: "lax-compact-progress__title", "data-testid": "lax-compact-progress-title", children: "\u273D Compacting conversation\u2026" }),
4779
+ /* @__PURE__ */ jsxs4("div", { className: "lax-compact-progress__bar-line", "data-testid": "lax-compact-progress-bar", children: [
4780
+ bar,
4781
+ " ",
4782
+ state.percent,
4783
+ "%"
4784
+ ] }),
4785
+ state.detail ? /* @__PURE__ */ jsx6("div", { className: "lax-compact-progress__detail", "data-testid": "lax-compact-progress-detail", children: state.detail }) : null
4786
+ ] });
4787
+ }
4788
+
4710
4789
  // src/view/spinner/constants.ts
4711
4790
  var _BASE_FRAMES = ["\xB7", "\u2722", "*", "\u2736", "\u273B", "\u273D"];
4712
4791
  var SPINNER_FRAMES = [..._BASE_FRAMES, ..._BASE_FRAMES.slice().reverse()];
@@ -4937,7 +5016,7 @@ function getSpinnerFrameIndex(timeMs, reducedMotion = false) {
4937
5016
  import { useRef as useRef5 } from "react";
4938
5017
 
4939
5018
  // src/view/spinner/SpinnerGlimmerVerb.tsx
4940
- import { jsxs as jsxs4 } from "react/jsx-runtime";
5019
+ import { jsxs as jsxs5 } from "react/jsx-runtime";
4941
5020
  function SpinnerGlimmerVerb({
4942
5021
  verb,
4943
5022
  mode,
@@ -4963,7 +5042,7 @@ function SpinnerGlimmerVerb({
4963
5042
  ["--lax-spinner-flash-opacity"]: String(flashOpacity)
4964
5043
  }
4965
5044
  };
4966
- return /* @__PURE__ */ jsxs4("span", { className: classes.join(" "), style, children: [
5045
+ return /* @__PURE__ */ jsxs5("span", { className: classes.join(" "), style, children: [
4967
5046
  verb,
4968
5047
  "\u2026"
4969
5048
  ] });
@@ -5112,7 +5191,7 @@ function useStalledSpinnerIntensity(time, currentResponseLength, hasActiveTools
5112
5191
  }
5113
5192
 
5114
5193
  // src/view/spinner/SpinnerAnimationRow.tsx
5115
- import { jsx as jsx6, jsxs as jsxs5 } from "react/jsx-runtime";
5194
+ import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
5116
5195
  function SpinnerAnimationRow({
5117
5196
  mode,
5118
5197
  verb,
@@ -5170,9 +5249,9 @@ function SpinnerAnimationRow({
5170
5249
  className: thinkingStatus === "thinking" ? "lax-spinner-status-part--thinking" : void 0
5171
5250
  });
5172
5251
  }
5173
- return /* @__PURE__ */ jsxs5("div", { className: "lax-spinner", "data-testid": "lax-spinner", children: [
5174
- /* @__PURE__ */ jsx6("span", { className: "lax-spinner-frame", "data-testid": "lax-spinner-frame", children: frame }),
5175
- /* @__PURE__ */ jsx6(
5252
+ return /* @__PURE__ */ jsxs6("div", { className: "lax-spinner", "data-testid": "lax-spinner", children: [
5253
+ /* @__PURE__ */ jsx7("span", { className: "lax-spinner-frame", "data-testid": "lax-spinner-frame", children: frame }),
5254
+ /* @__PURE__ */ jsx7(
5176
5255
  SpinnerGlimmerVerb,
5177
5256
  {
5178
5257
  verb,
@@ -5182,9 +5261,9 @@ function SpinnerAnimationRow({
5182
5261
  flashOpacity
5183
5262
  }
5184
5263
  ),
5185
- statusParts.length > 0 && /* @__PURE__ */ jsxs5("span", { className: "lax-spinner-status", children: [
5264
+ statusParts.length > 0 && /* @__PURE__ */ jsxs6("span", { className: "lax-spinner-status", children: [
5186
5265
  " (",
5187
- statusParts.map((part, i) => /* @__PURE__ */ jsxs5(
5266
+ statusParts.map((part, i) => /* @__PURE__ */ jsxs6(
5188
5267
  "span",
5189
5268
  {
5190
5269
  className: `lax-spinner-status-part${part.className ? ` ${part.className}` : ""}`,
@@ -5225,11 +5304,11 @@ function shouldShowNextTaskLine(showTaskList, tasks, sessionStatus) {
5225
5304
  }
5226
5305
 
5227
5306
  // src/view/Spinner.tsx
5228
- import { jsx as jsx7, jsxs as jsxs6 } from "react/jsx-runtime";
5307
+ import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
5229
5308
  function MessageResponse({ children }) {
5230
- return /* @__PURE__ */ jsxs6("div", { className: "lax-message-response", children: [
5231
- /* @__PURE__ */ jsx7("span", { className: "lax-message-response__marker", children: "\u23BF " }),
5232
- /* @__PURE__ */ jsx7("span", { className: "lax-message-response__content", children })
5309
+ return /* @__PURE__ */ jsxs7("div", { className: "lax-message-response", children: [
5310
+ /* @__PURE__ */ jsx8("span", { className: "lax-message-response__marker", children: "\u23BF " }),
5311
+ /* @__PURE__ */ jsx8("span", { className: "lax-message-response__content", children })
5233
5312
  ] });
5234
5313
  }
5235
5314
  function shouldShowSpinnerTaskList(taskPhase, tasks, hasEverShownTaskList, contentCharCount = 0) {
@@ -5270,6 +5349,10 @@ function Spinner({
5270
5349
  (callback) => store.subscribe(callback),
5271
5350
  () => store.getState().tree.modelRetry
5272
5351
  );
5352
+ const compactProgress = useSyncExternalStore(
5353
+ (callback) => store.subscribe(callback),
5354
+ () => store.getState().tree.compactProgress
5355
+ );
5273
5356
  const taskListRevision = useSyncExternalStore(
5274
5357
  (callback) => store.subscribe(callback),
5275
5358
  () => {
@@ -5352,9 +5435,10 @@ function Spinner({
5352
5435
  } else if (typeof thinkingStatus === "number") {
5353
5436
  thinkingText = `thought for ${Math.max(1, Math.round(thinkingStatus / 1e3))}s`;
5354
5437
  }
5355
- return /* @__PURE__ */ jsxs6("div", { className: "lax-spinner-container", "data-testid": "lax-spinner-container", children: [
5356
- modelRetry ? /* @__PURE__ */ jsx7(ModelRetryBlock, { state: modelRetry, verbose }) : null,
5357
- /* @__PURE__ */ jsx7(
5438
+ return /* @__PURE__ */ jsxs7("div", { className: "lax-spinner-container", "data-testid": "lax-spinner-container", children: [
5439
+ modelRetry ? /* @__PURE__ */ jsx8(ModelRetryBlock, { state: modelRetry, verbose }) : null,
5440
+ compactProgress ? /* @__PURE__ */ jsx8(CompactProgressBlock, { state: compactProgress }) : null,
5441
+ /* @__PURE__ */ jsx8(
5358
5442
  SpinnerAnimationRow,
5359
5443
  {
5360
5444
  mode: effectiveMode,
@@ -5369,19 +5453,19 @@ function Spinner({
5369
5453
  timing
5370
5454
  }
5371
5455
  ),
5372
- showTaskList && /* @__PURE__ */ jsx7(MessageResponse, { children: /* @__PURE__ */ jsx7(TaskList, { tasks, isStandalone: false }) }),
5373
- nextTask && /* @__PURE__ */ jsx7(MessageResponse, { children: /* @__PURE__ */ jsx7("span", { className: "lax-spinner-next-line", children: formatNextTaskLineText(nextTask) }) })
5456
+ showTaskList && /* @__PURE__ */ jsx8(MessageResponse, { children: /* @__PURE__ */ jsx8(TaskList, { tasks, isStandalone: false }) }),
5457
+ nextTask && /* @__PURE__ */ jsx8(MessageResponse, { children: /* @__PURE__ */ jsx8("span", { className: "lax-spinner-next-line", children: formatNextTaskLineText(nextTask) }) })
5374
5458
  ] });
5375
5459
  }
5376
5460
 
5377
5461
  // src/view/TaskListFooter.tsx
5378
5462
  import { useMemo as useMemo6, useState as useState8 } from "react";
5379
5463
  import { useSyncExternalStore as useSyncExternalStore2 } from "react";
5380
- import { jsx as jsx8, jsxs as jsxs7 } from "react/jsx-runtime";
5464
+ import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
5381
5465
  function MessageResponse2({ children }) {
5382
- return /* @__PURE__ */ jsxs7("div", { className: "lax-message-response", children: [
5383
- /* @__PURE__ */ jsx8("span", { className: "lax-message-response__marker", children: "\u23BF " }),
5384
- /* @__PURE__ */ jsx8("span", { className: "lax-message-response__content", children })
5466
+ return /* @__PURE__ */ jsxs8("div", { className: "lax-message-response", children: [
5467
+ /* @__PURE__ */ jsx9("span", { className: "lax-message-response__marker", children: "\u23BF " }),
5468
+ /* @__PURE__ */ jsx9("span", { className: "lax-message-response__content", children })
5385
5469
  ] });
5386
5470
  }
5387
5471
  function formatTaskFooterLabel(tasks) {
@@ -5440,8 +5524,8 @@ function TaskListFooter() {
5440
5524
  return null;
5441
5525
  }
5442
5526
  const label = formatTaskFooterLabel(tasks);
5443
- return /* @__PURE__ */ jsxs7("div", { className: "lax-task-list-footer", "data-testid": "lax-task-list-footer", children: [
5444
- /* @__PURE__ */ jsxs7(
5527
+ return /* @__PURE__ */ jsxs8("div", { className: "lax-task-list-footer", "data-testid": "lax-task-list-footer", children: [
5528
+ /* @__PURE__ */ jsxs8(
5445
5529
  "button",
5446
5530
  {
5447
5531
  type: "button",
@@ -5451,17 +5535,17 @@ function TaskListFooter() {
5451
5535
  onClick: () => setExpanded((v) => !v),
5452
5536
  children: [
5453
5537
  label,
5454
- /* @__PURE__ */ jsx8("span", { className: "lax-task-list-footer__hint", children: expanded ? " \xB7 \u2191 to hide" : " \xB7 \u2193 to view" })
5538
+ /* @__PURE__ */ jsx9("span", { className: "lax-task-list-footer__hint", children: expanded ? " \xB7 \u2191 to hide" : " \xB7 \u2193 to view" })
5455
5539
  ]
5456
5540
  }
5457
5541
  ),
5458
- expanded && /* @__PURE__ */ jsx8(MessageResponse2, { children: /* @__PURE__ */ jsx8(TaskList, { tasks }) })
5542
+ expanded && /* @__PURE__ */ jsx9(MessageResponse2, { children: /* @__PURE__ */ jsx9(TaskList, { tasks }) })
5459
5543
  ] });
5460
5544
  }
5461
5545
 
5462
5546
  // src/view/GroupedToolCallRow.tsx
5463
5547
  import { useCallback, useState as useState9 } from "react";
5464
- import { jsx as jsx9, jsxs as jsxs8 } from "react/jsx-runtime";
5548
+ import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
5465
5549
  var INITIALIZING = "Initializing\u2026";
5466
5550
  function readGroupMeta(payload) {
5467
5551
  const raw = payload.groupMeta;
@@ -5528,22 +5612,22 @@ function GroupedSubline({
5528
5612
  const toggleExpanded = useCallback(() => {
5529
5613
  setExpanded((prev) => !prev);
5530
5614
  }, []);
5531
- return /* @__PURE__ */ jsxs8(
5615
+ return /* @__PURE__ */ jsxs9(
5532
5616
  "div",
5533
5617
  {
5534
5618
  className: "lax-tool-group__item lax-tool-group__subline-block",
5535
5619
  "data-group-index": index + 1,
5536
5620
  "data-tool-call-id": callId,
5537
5621
  children: [
5538
- /* @__PURE__ */ jsxs8("div", { className: "lax-tool-group__subline", children: [
5539
- /* @__PURE__ */ jsx9("span", { className: "lax-tool-group__tree", "aria-hidden": true, children: treeChar }),
5540
- /* @__PURE__ */ jsxs8("span", { className: "lax-tool-group__subline-flow", children: [
5541
- /* @__PURE__ */ jsx9("span", { className: "lax-tool-group__subline-title", children: subTitle }),
5542
- status ? /* @__PURE__ */ jsxs8("span", { className: "lax-tool-group__subline-status", children: [
5622
+ /* @__PURE__ */ jsxs9("div", { className: "lax-tool-group__subline", children: [
5623
+ /* @__PURE__ */ jsx10("span", { className: "lax-tool-group__tree", "aria-hidden": true, children: treeChar }),
5624
+ /* @__PURE__ */ jsxs9("span", { className: "lax-tool-group__subline-flow", children: [
5625
+ /* @__PURE__ */ jsx10("span", { className: "lax-tool-group__subline-title", children: subTitle }),
5626
+ status ? /* @__PURE__ */ jsxs9("span", { className: "lax-tool-group__subline-status", children: [
5543
5627
  " \xB7 ",
5544
5628
  status
5545
5629
  ] }) : null,
5546
- canExpand ? /* @__PURE__ */ jsx9(
5630
+ canExpand ? /* @__PURE__ */ jsx10(
5547
5631
  "button",
5548
5632
  {
5549
5633
  type: "button",
@@ -5555,7 +5639,7 @@ function GroupedSubline({
5555
5639
  ) : null
5556
5640
  ] })
5557
5641
  ] }),
5558
- canExpand && expanded ? /* @__PURE__ */ jsx9("div", { className: "lax-tool-group__transcript-panel", "data-testid": "lax-grouped-transcript", children: hasTranscriptLane ? /* @__PURE__ */ jsx9(SubagentTranscriptBlock, { entries: transcript, dataSource: "transcript-lane" }) : /* @__PURE__ */ jsx9(AgentProgressLines, { entries: progress, mode: "full" }) }) : null
5642
+ canExpand && expanded ? /* @__PURE__ */ jsx10("div", { className: "lax-tool-group__transcript-panel", "data-testid": "lax-grouped-transcript", children: hasTranscriptLane ? /* @__PURE__ */ jsx10(SubagentTranscriptBlock, { entries: transcript, dataSource: "transcript-lane" }) : /* @__PURE__ */ jsx10(AgentProgressLines, { entries: progress, mode: "full" }) }) : null
5559
5643
  ]
5560
5644
  }
5561
5645
  );
@@ -5569,8 +5653,8 @@ function GroupedToolCallRow({ payload }) {
5569
5653
  const anyPending = Array.isArray(payload.pendingCallIds) && payload.pendingCallIds.length > 0;
5570
5654
  const anyError = Array.isArray(payload.erroredCallIds) && payload.erroredCallIds.length > 0;
5571
5655
  const enableTranscript = toolUses.length >= 2;
5572
- return /* @__PURE__ */ jsxs8("div", { className: "lax-tool-group", "data-tool-name": toolName, "data-kind": "grouped_tool_use", children: [
5573
- /* @__PURE__ */ jsxs8(
5656
+ return /* @__PURE__ */ jsxs9("div", { className: "lax-tool-group", "data-tool-name": toolName, "data-kind": "grouped_tool_use", children: [
5657
+ /* @__PURE__ */ jsxs9(
5574
5658
  "div",
5575
5659
  {
5576
5660
  className: [
@@ -5579,16 +5663,16 @@ function GroupedToolCallRow({ payload }) {
5579
5663
  anyError ? "lax-tool-group__header--error" : ""
5580
5664
  ].filter(Boolean).join(" "),
5581
5665
  children: [
5582
- anyPending && /* @__PURE__ */ jsx9("span", { className: "lax-tool-group__dot", "aria-hidden": true, children: "\u25CF" }),
5583
- /* @__PURE__ */ jsx9("span", { className: "lax-tool-group__label", children: title })
5666
+ anyPending && /* @__PURE__ */ jsx10("span", { className: "lax-tool-group__dot", "aria-hidden": true, children: "\u25CF" }),
5667
+ /* @__PURE__ */ jsx10("span", { className: "lax-tool-group__label", children: title })
5584
5668
  ]
5585
5669
  }
5586
5670
  ),
5587
- /* @__PURE__ */ jsx9("div", { className: "lax-tool-group__items", children: toolUses.map((entry, index) => {
5671
+ /* @__PURE__ */ jsx10("div", { className: "lax-tool-group__items", children: toolUses.map((entry, index) => {
5588
5672
  const callId = String(entry.tool_call_id ?? "");
5589
5673
  const isLast = index === toolUses.length - 1;
5590
5674
  const treeChar = isLast ? "\u2514\u2500" : "\u251C\u2500";
5591
- return /* @__PURE__ */ jsx9(
5675
+ return /* @__PURE__ */ jsx10(
5592
5676
  GroupedSubline,
5593
5677
  {
5594
5678
  callId,
@@ -5606,7 +5690,7 @@ function GroupedToolCallRow({ payload }) {
5606
5690
  }
5607
5691
 
5608
5692
  // src/view/nodes/ThinkingSummaryNode.tsx
5609
- import { jsx as jsx10, jsxs as jsxs9 } from "react/jsx-runtime";
5693
+ import { jsx as jsx11, jsxs as jsxs10 } from "react/jsx-runtime";
5610
5694
  function formatThoughtDuration(seconds) {
5611
5695
  const rounded = Math.max(1, Math.round(seconds));
5612
5696
  return `${rounded}s`;
@@ -5631,29 +5715,29 @@ function ThinkingSummary({ node }) {
5631
5715
  const viewOptions = useSessionViewOptions();
5632
5716
  const showToolDetail = shouldShowReasoningInTimeline(viewOptions);
5633
5717
  const toolText = showToolDetail ? formatToolCounts(node) : null;
5634
- return /* @__PURE__ */ jsxs9(
5718
+ return /* @__PURE__ */ jsxs10(
5635
5719
  "div",
5636
5720
  {
5637
5721
  className: "lax-thought-summary",
5638
5722
  "data-kind": "thinking_summary",
5639
5723
  "data-round-id": node.roundId,
5640
5724
  children: [
5641
- /* @__PURE__ */ jsxs9("span", { className: "lax-thought-summary__text", children: [
5725
+ /* @__PURE__ */ jsxs10("span", { className: "lax-thought-summary__text", children: [
5642
5726
  "Thought for ",
5643
5727
  formatThoughtDuration(node.elapsedSeconds)
5644
5728
  ] }),
5645
- toolText ? /* @__PURE__ */ jsxs9("span", { className: "lax-thought-summary__tools", children: [
5729
+ toolText ? /* @__PURE__ */ jsxs10("span", { className: "lax-thought-summary__tools", children: [
5646
5730
  " \xB7 ",
5647
5731
  toolText
5648
5732
  ] }) : null,
5649
- !showToolDetail ? /* @__PURE__ */ jsx10("span", { className: "lax-thought-summary__hint", children: " (ctrl+o to expand)" }) : null
5733
+ !showToolDetail ? /* @__PURE__ */ jsx11("span", { className: "lax-thought-summary__hint", children: " (ctrl+o to expand)" }) : null
5650
5734
  ]
5651
5735
  }
5652
5736
  );
5653
5737
  }
5654
5738
 
5655
5739
  // src/view/projectedTimelineRender.tsx
5656
- import { jsx as jsx11 } from "react/jsx-runtime";
5740
+ import { jsx as jsx12 } from "react/jsx-runtime";
5657
5741
  function zeroToolCounts2() {
5658
5742
  return {
5659
5743
  searchCount: 0,
@@ -5681,39 +5765,39 @@ function ThinkingSummaryWrapper({ entry }) {
5681
5765
  isExpanded: Boolean(payload.isExpanded ?? false),
5682
5766
  startedAt: Number(payload.startedAt ?? Date.now())
5683
5767
  };
5684
- return /* @__PURE__ */ jsx11("div", { className: "lax-timeline__item", "data-kind": "thinking_summary", children: /* @__PURE__ */ jsx11(ThinkingSummary, { node }) });
5768
+ return /* @__PURE__ */ jsx12("div", { className: "lax-timeline__item", "data-kind": "thinking_summary", children: /* @__PURE__ */ jsx12(ThinkingSummary, { node }) });
5685
5769
  }
5686
5770
  function renderProjectedTimelineItem(item, registry) {
5687
5771
  const { key, entry } = item;
5688
5772
  if (entry.kind === "thinking_summary") {
5689
- return /* @__PURE__ */ jsx11(ThinkingSummaryWrapper, { entry }, key);
5773
+ return /* @__PURE__ */ jsx12(ThinkingSummaryWrapper, { entry }, key);
5690
5774
  }
5691
5775
  if (entry.kind === "collapsed_explore") {
5692
- return /* @__PURE__ */ jsx11("div", { className: "lax-timeline__item", "data-kind": "collapsed_explore", children: /* @__PURE__ */ jsx11(CollapsedExploreNode, { entry, registry }) }, key);
5776
+ return /* @__PURE__ */ jsx12("div", { className: "lax-timeline__item", "data-kind": "collapsed_explore", children: /* @__PURE__ */ jsx12(CollapsedExploreNode, { entry, registry }) }, key);
5693
5777
  }
5694
5778
  if (entry.kind === "grouped_tool_use") {
5695
- return /* @__PURE__ */ jsx11("div", { className: "lax-timeline__item", "data-kind": "grouped_tool_use", children: /* @__PURE__ */ jsx11(GroupedToolCallRow, { payload: entry.payload }) }, key);
5779
+ return /* @__PURE__ */ jsx12("div", { className: "lax-timeline__item", "data-kind": "grouped_tool_use", children: /* @__PURE__ */ jsx12(GroupedToolCallRow, { payload: entry.payload }) }, key);
5696
5780
  }
5697
5781
  if (entry.kind === "system_summary") {
5698
5782
  const summary = String(entry.payload.summaryText ?? entry.payload.summary_text ?? "");
5699
- return /* @__PURE__ */ jsx11("div", { className: "lax-timeline__item", "data-kind": "system_summary", children: /* @__PURE__ */ jsx11(SystemSummaryNode, { summaryText: summary }) }, key);
5783
+ return /* @__PURE__ */ jsx12("div", { className: "lax-timeline__item", "data-kind": "system_summary", children: /* @__PURE__ */ jsx12(SystemSummaryNode, { summaryText: summary }) }, key);
5700
5784
  }
5701
5785
  const nodeId = entry.sourceNodeIds[0];
5702
5786
  if (!nodeId) return null;
5703
- return /* @__PURE__ */ jsx11(TimelineItem, { nodeId, registry }, key);
5787
+ return /* @__PURE__ */ jsx12(TimelineItem, { nodeId, registry }, key);
5704
5788
  }
5705
5789
 
5706
5790
  // src/view/TimelineEntries.tsx
5707
- import { Fragment as Fragment2, jsx as jsx12 } from "react/jsx-runtime";
5791
+ import { Fragment as Fragment2, jsx as jsx13 } from "react/jsx-runtime";
5708
5792
  function TimelineEntries({ registry }) {
5709
5793
  const projectedItems = useProjectedTimeline();
5710
- return /* @__PURE__ */ jsx12(Fragment2, { children: projectedItems.map((item) => renderProjectedTimelineItem(item, registry)) });
5794
+ return /* @__PURE__ */ jsx13(Fragment2, { children: projectedItems.map((item) => renderProjectedTimelineItem(item, registry)) });
5711
5795
  }
5712
5796
 
5713
5797
  // src/view/Timeline.tsx
5714
5798
  import { useStore as useStore6 } from "zustand";
5715
5799
  import { useShallow as useShallow5 } from "zustand/shallow";
5716
- import { jsx as jsx13, jsxs as jsxs10 } from "react/jsx-runtime";
5800
+ import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
5717
5801
  function useContentCharCount() {
5718
5802
  const store = useSessionStoreApi();
5719
5803
  return useStore6(
@@ -5735,9 +5819,9 @@ function Timeline({ showTaskListFooter = true }) {
5735
5819
  const { verbose } = useSessionViewOptions();
5736
5820
  const { startedAt } = useStore6(store, (s) => s.tree.meta);
5737
5821
  const contentCharCount = useContentCharCount();
5738
- return /* @__PURE__ */ jsxs10("div", { className: "lax-timeline", "data-testid": "lax-timeline", children: [
5739
- /* @__PURE__ */ jsx13(TimelineEntries, { registry }),
5740
- /* @__PURE__ */ jsx13(
5822
+ return /* @__PURE__ */ jsxs11("div", { className: "lax-timeline", "data-testid": "lax-timeline", children: [
5823
+ /* @__PURE__ */ jsx14(TimelineEntries, { registry }),
5824
+ /* @__PURE__ */ jsx14(
5741
5825
  Spinner,
5742
5826
  {
5743
5827
  startedAt,
@@ -5745,7 +5829,7 @@ function Timeline({ showTaskListFooter = true }) {
5745
5829
  verbose
5746
5830
  }
5747
5831
  ),
5748
- showTaskListFooter ? /* @__PURE__ */ jsx13(TaskListFooter, {}) : null
5832
+ showTaskListFooter ? /* @__PURE__ */ jsx14(TaskListFooter, {}) : null
5749
5833
  ] });
5750
5834
  }
5751
5835
 
@@ -5798,7 +5882,7 @@ function estimateProjectedEntrySize(entry, fallback = DEFAULT_ESTIMATE_SIZE) {
5798
5882
  import { useRef as useRef7 } from "react";
5799
5883
  import { useVirtualizer } from "@tanstack/react-virtual";
5800
5884
  import { useStore as useStore7 } from "zustand";
5801
- import { jsx as jsx14, jsxs as jsxs11 } from "react/jsx-runtime";
5885
+ import { jsx as jsx15, jsxs as jsxs12 } from "react/jsx-runtime";
5802
5886
  var DEFAULT_VIRTUALIZE_THRESHOLD = 500;
5803
5887
  function useContentCharCount2() {
5804
5888
  const store = useSessionStoreApi();
@@ -5832,14 +5916,14 @@ function VirtualTimeline({
5832
5916
  },
5833
5917
  overscan: 5
5834
5918
  });
5835
- return /* @__PURE__ */ jsxs11(
5919
+ return /* @__PURE__ */ jsxs12(
5836
5920
  "div",
5837
5921
  {
5838
5922
  ref: parentRef,
5839
5923
  className: "lax-virtual-timeline",
5840
5924
  "data-testid": "lax-virtual-timeline",
5841
5925
  children: [
5842
- /* @__PURE__ */ jsx14(
5926
+ /* @__PURE__ */ jsx15(
5843
5927
  "div",
5844
5928
  {
5845
5929
  className: "lax-virtual-timeline__inner",
@@ -5851,7 +5935,7 @@ function VirtualTimeline({
5851
5935
  children: virtualizer.getVirtualItems().map((virtualRow) => {
5852
5936
  const item = items[virtualRow.index];
5853
5937
  if (!item) return null;
5854
- return /* @__PURE__ */ jsx14(
5938
+ return /* @__PURE__ */ jsx15(
5855
5939
  "div",
5856
5940
  {
5857
5941
  className: "lax-virtual-timeline__item lax-timeline__item",
@@ -5872,7 +5956,7 @@ function VirtualTimeline({
5872
5956
  })
5873
5957
  }
5874
5958
  ),
5875
- /* @__PURE__ */ jsx14(
5959
+ /* @__PURE__ */ jsx15(
5876
5960
  Spinner,
5877
5961
  {
5878
5962
  startedAt,
@@ -5880,14 +5964,14 @@ function VirtualTimeline({
5880
5964
  verbose
5881
5965
  }
5882
5966
  ),
5883
- showTaskListFooter ? /* @__PURE__ */ jsx14(TaskListFooter, {}) : null
5967
+ showTaskListFooter ? /* @__PURE__ */ jsx15(TaskListFooter, {}) : null
5884
5968
  ]
5885
5969
  }
5886
5970
  );
5887
5971
  }
5888
5972
 
5889
5973
  // src/view/SessionTimeline.tsx
5890
- import { jsx as jsx15 } from "react/jsx-runtime";
5974
+ import { jsx as jsx16 } from "react/jsx-runtime";
5891
5975
  function SessionTimeline({
5892
5976
  virtualized = false,
5893
5977
  virtualizeThreshold = DEFAULT_VIRTUALIZE_THRESHOLD,
@@ -5896,12 +5980,12 @@ function SessionTimeline({
5896
5980
  }) {
5897
5981
  const ids = useTimeline();
5898
5982
  if (groupParallelTools) {
5899
- return /* @__PURE__ */ jsx15(Timeline, { showTaskListFooter });
5983
+ return /* @__PURE__ */ jsx16(Timeline, { showTaskListFooter });
5900
5984
  }
5901
5985
  if (virtualized && ids.length > virtualizeThreshold) {
5902
- return /* @__PURE__ */ jsx15(VirtualTimeline, { showTaskListFooter });
5986
+ return /* @__PURE__ */ jsx16(VirtualTimeline, { showTaskListFooter });
5903
5987
  }
5904
- return /* @__PURE__ */ jsx15(Timeline, { showTaskListFooter });
5988
+ return /* @__PURE__ */ jsx16(Timeline, { showTaskListFooter });
5905
5989
  }
5906
5990
 
5907
5991
  export {
@@ -5997,4 +6081,4 @@ export {
5997
6081
  VirtualTimeline,
5998
6082
  SessionTimeline
5999
6083
  };
6000
- //# sourceMappingURL=chunk-RWKNI52H.js.map
6084
+ //# sourceMappingURL=chunk-XEIQBTD2.js.map