@workerdeck/ui 0.13.0 → 0.15.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.
- package/README.md +19 -0
- package/build/{SessionPanel-CKQa4i0Y.mjs → SessionPanel-DI1NO4l8.mjs} +118 -61
- package/build/SessionPanel-DI1NO4l8.mjs.map +1 -0
- package/build/{SessionPanel-CZMA44NM.d.mts → SessionPanel-J2U8v88q.d.mts} +57 -8
- package/build/index.d.mts +54 -2
- package/build/index.mjs +79 -24
- package/build/index.mjs.map +1 -1
- package/build/workspace.d.mts +5 -1
- package/build/workspace.mjs +5 -2
- package/build/workspace.mjs.map +1 -1
- package/package.json +4 -4
- package/src/components/agent/Composer.tsx +108 -41
- package/src/components/agent/Message.tsx +4 -1
- package/src/components/agent/SessionBrowser.tsx +35 -25
- package/src/components/agent/SessionPanel.tsx +88 -35
- package/src/components/agent/SessionWorkspace.tsx +7 -0
- package/src/components/agent/StatusBar.tsx +50 -11
- package/src/components/agent/transcript-variant.tsx +14 -0
- package/src/components/ui/Badge.tsx +6 -1
- package/src/components/ui/Empty.tsx +56 -0
- package/src/components/ui/Splitter.tsx +14 -0
- package/src/index.ts +2 -0
- package/src/styles/theme.css +32 -0
- package/build/SessionPanel-CKQa4i0Y.mjs.map +0 -1
package/README.md
CHANGED
|
@@ -150,3 +150,22 @@ lose by forgetting a second mount isn't one.
|
|
|
150
150
|
`2h 10m`) with no React in the graph — for a host that renders session readings outside
|
|
151
151
|
React, like an extension host drawing them into a window status bar, and wants them spelled
|
|
152
152
|
exactly as the panel spells them.
|
|
153
|
+
|
|
154
|
+
## Rules you cannot infer from the types
|
|
155
|
+
|
|
156
|
+
- **Remount `SessionPanel` by key when the session id changes**, and never let its position in the
|
|
157
|
+
tree change otherwise: a remount drops the WebSocket attach and the whole transcript. That is why
|
|
158
|
+
the workspace keeps the panel's child index across the editor appearing and disappearing.
|
|
159
|
+
- **The panel owns the session's one attach.** External chrome reads live values through
|
|
160
|
+
`onVitals` and changes them through `onControls`; opening a second attach to render a status bar
|
|
161
|
+
means the tool bridge may ask the wrong client.
|
|
162
|
+
- **`transcriptVariant` and `transcriptDensity` ride context, not props.** A row component composed
|
|
163
|
+
by hand still gets the right treatment; restyling `data-slot`s from outside is not the seam.
|
|
164
|
+
- **`statusSurface: 'external'` takes the `⋯` menu's only home with it.** Combining it with
|
|
165
|
+
`panelSurface: 'internal'` needs a *function* `header` to receive the menu, or those panels
|
|
166
|
+
become unreachable.
|
|
167
|
+
- **Keep `monaco-editor` unreachable from `src/index.ts`.** Tree-shaking does not cover it: Vite
|
|
168
|
+
resolves Monaco's worker `new URL(...)`s while *transforming* the module, before shaking, and
|
|
169
|
+
emits megabytes of worker assets it never retracts. That is what the `/workspace` entry point is
|
|
170
|
+
for, and why Vite hosts need `optimizeDeps: { exclude: ['monaco-editor'] }`.
|
|
171
|
+
|
|
@@ -102,7 +102,7 @@ function Badge({ className, variant = "neutral", mono, dot, children, ...props }
|
|
|
102
102
|
...props,
|
|
103
103
|
children: [dot ? /* @__PURE__ */ jsx("span", {
|
|
104
104
|
"aria-hidden": true,
|
|
105
|
-
className: "size-1.5 rounded-full bg-current"
|
|
105
|
+
className: "size-1.5 shrink-0 self-center rounded-full bg-current"
|
|
106
106
|
}) : null, children]
|
|
107
107
|
});
|
|
108
108
|
}
|
|
@@ -401,7 +401,7 @@ function CodeBlock({ code, label, copyable = true, variant = "panel", className
|
|
|
401
401
|
* Keyboard-operable and announced as a separator, because a pane you can only
|
|
402
402
|
* size by dragging is a pane some people cannot size.
|
|
403
403
|
*/
|
|
404
|
-
function Splitter({ orientation, value, onValueChange, min, max, step = 16, inverted, "aria-label": label, className }) {
|
|
404
|
+
function Splitter({ orientation, value, onValueChange, min, max, step = 16, defaultValue, inverted, "aria-label": label, className }) {
|
|
405
405
|
const drag = useRef(null);
|
|
406
406
|
const vertical = orientation === "vertical";
|
|
407
407
|
const clamp = useCallback((next) => Math.min(max, Math.max(min, next)), [min, max]);
|
|
@@ -425,6 +425,9 @@ function Splitter({ orientation, value, onValueChange, min, max, step = 16, inve
|
|
|
425
425
|
drag.current = null;
|
|
426
426
|
if (event.currentTarget.hasPointerCapture(event.pointerId)) event.currentTarget.releasePointerCapture(event.pointerId);
|
|
427
427
|
};
|
|
428
|
+
const onDoubleClick = () => {
|
|
429
|
+
if (defaultValue !== void 0) onValueChange(clamp(defaultValue));
|
|
430
|
+
};
|
|
428
431
|
const onKeyDown = (event) => {
|
|
429
432
|
const grow = vertical ? "ArrowRight" : "ArrowDown";
|
|
430
433
|
const shrink = vertical ? "ArrowLeft" : "ArrowUp";
|
|
@@ -449,6 +452,7 @@ function Splitter({ orientation, value, onValueChange, min, max, step = 16, inve
|
|
|
449
452
|
onPointerMove,
|
|
450
453
|
onPointerUp: endDrag,
|
|
451
454
|
onPointerCancel: endDrag,
|
|
455
|
+
onDoubleClick,
|
|
452
456
|
onKeyDown,
|
|
453
457
|
className: cn("group relative shrink-0 touch-none bg-border transition-colors", "hover:bg-border-strong focus-visible:bg-accent focus-visible:outline-none", vertical ? "w-px cursor-col-resize" : "h-px cursor-row-resize", className),
|
|
454
458
|
children: /* @__PURE__ */ jsx("span", {
|
|
@@ -4530,7 +4534,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
4530
4534
|
e.target.value = "";
|
|
4531
4535
|
}
|
|
4532
4536
|
}) : null;
|
|
4533
|
-
const attach = !!attachments && !attachments.disabled ? /* @__PURE__ */ jsxs(Fragment$1, { children: [fileField,
|
|
4537
|
+
const attach = !!attachments && !attachments.disabled ? /* @__PURE__ */ jsxs(Fragment$1, { children: [fileField, lines ? /* @__PURE__ */ jsx(GlyphButton, {
|
|
4534
4538
|
label: "Attach files",
|
|
4535
4539
|
disabled,
|
|
4536
4540
|
onClick: () => fileInput.current?.click(),
|
|
@@ -4544,7 +4548,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
4544
4548
|
children: /* @__PURE__ */ jsx(Paperclip, { className: "size-4" })
|
|
4545
4549
|
})] }) : null;
|
|
4546
4550
|
const interrupting = busy && !canSend;
|
|
4547
|
-
const submitButton =
|
|
4551
|
+
const submitButton = lines ? /* @__PURE__ */ jsx(GlyphButton, {
|
|
4548
4552
|
label: interrupting ? "Interrupt" : "Send",
|
|
4549
4553
|
disabled: !interrupting && !canSend,
|
|
4550
4554
|
onClick: interrupting ? onInterrupt : submit,
|
|
@@ -4565,24 +4569,81 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
4565
4569
|
onClick: submit,
|
|
4566
4570
|
children: /* @__PURE__ */ jsx(ArrowUp, { className: "size-4" })
|
|
4567
4571
|
});
|
|
4572
|
+
const dropHandlers = {
|
|
4573
|
+
onDragOver: (e) => {
|
|
4574
|
+
if (attachments && !attachments.disabled) {
|
|
4575
|
+
e.preventDefault();
|
|
4576
|
+
setDragging(true);
|
|
4577
|
+
}
|
|
4578
|
+
},
|
|
4579
|
+
onDragLeave: () => setDragging(false),
|
|
4580
|
+
onDrop: (e) => {
|
|
4581
|
+
if (!attachments || attachments.disabled) return;
|
|
4582
|
+
e.preventDefault();
|
|
4583
|
+
setDragging(false);
|
|
4584
|
+
pick(e.dataTransfer.files);
|
|
4585
|
+
}
|
|
4586
|
+
};
|
|
4587
|
+
const errorRow = attachments?.error ? /* @__PURE__ */ jsxs("div", {
|
|
4588
|
+
className: cn("mx-auto mt-1 flex w-full max-w-[var(--wd-content-max-w,48rem)] items-center gap-2 text-label text-danger", lines && "px-2"),
|
|
4589
|
+
children: [
|
|
4590
|
+
/* @__PURE__ */ jsx(TriangleAlert, { className: "size-3 shrink-0" }),
|
|
4591
|
+
/* @__PURE__ */ jsx("span", {
|
|
4592
|
+
className: "min-w-0 flex-1",
|
|
4593
|
+
children: attachments.error
|
|
4594
|
+
}),
|
|
4595
|
+
/* @__PURE__ */ jsx("button", {
|
|
4596
|
+
type: "button",
|
|
4597
|
+
onClick: attachments.dismissError,
|
|
4598
|
+
"aria-label": "Dismiss",
|
|
4599
|
+
className: "shrink-0 opacity-70 hover:opacity-100",
|
|
4600
|
+
children: /* @__PURE__ */ jsx(X, { className: "size-3" })
|
|
4601
|
+
})
|
|
4602
|
+
]
|
|
4603
|
+
}) : null;
|
|
4604
|
+
if (lines) return /* @__PURE__ */ jsxs("div", {
|
|
4605
|
+
"data-slot": "composer",
|
|
4606
|
+
className: cn("shrink-0", className),
|
|
4607
|
+
children: [/* @__PURE__ */ jsx("div", {
|
|
4608
|
+
...dropHandlers,
|
|
4609
|
+
className: cn("flex min-h-[38px] flex-col justify-center", "border-t border-border bg-bg transition-colors", "focus-within:border-t-accent", dragging && "border-t-accent", disabled && "opacity-60"),
|
|
4610
|
+
children: /* @__PURE__ */ jsxs("div", {
|
|
4611
|
+
className: "mx-auto w-full max-w-[var(--wd-content-max-w,48rem)] px-2 py-1",
|
|
4612
|
+
children: [
|
|
4613
|
+
staged.length > 0 && attachments ? /* @__PURE__ */ jsx(AttachmentStrip, { attachments }) : null,
|
|
4614
|
+
/* @__PURE__ */ jsxs("div", {
|
|
4615
|
+
className: "flex items-end gap-1",
|
|
4616
|
+
children: [
|
|
4617
|
+
attach,
|
|
4618
|
+
/* @__PURE__ */ jsx(PromptArea, {
|
|
4619
|
+
...bind,
|
|
4620
|
+
triggers,
|
|
4621
|
+
onSubmit: submit,
|
|
4622
|
+
disabled,
|
|
4623
|
+
placeholder: disabled ? "Session ended" : placeholder,
|
|
4624
|
+
minHeight: 20,
|
|
4625
|
+
maxHeight: 192,
|
|
4626
|
+
"aria-label": "Message the agent",
|
|
4627
|
+
className: "min-w-0 flex-1 py-0.5 text-body-sm text-text",
|
|
4628
|
+
onImagePaste: (file) => attachments?.add([file])
|
|
4629
|
+
}),
|
|
4630
|
+
submitButton
|
|
4631
|
+
]
|
|
4632
|
+
}),
|
|
4633
|
+
toolbar ? /* @__PURE__ */ jsx("div", {
|
|
4634
|
+
className: "flex min-w-0 items-center gap-1 pt-1",
|
|
4635
|
+
children: toolbar
|
|
4636
|
+
}) : null
|
|
4637
|
+
]
|
|
4638
|
+
})
|
|
4639
|
+
}), errorRow]
|
|
4640
|
+
});
|
|
4568
4641
|
return /* @__PURE__ */ jsxs("div", {
|
|
4569
4642
|
"data-slot": "composer",
|
|
4570
4643
|
className: cn("px-3 pb-3", className),
|
|
4571
4644
|
children: [/* @__PURE__ */ jsxs("div", {
|
|
4572
|
-
|
|
4573
|
-
|
|
4574
|
-
e.preventDefault();
|
|
4575
|
-
setDragging(true);
|
|
4576
|
-
}
|
|
4577
|
-
},
|
|
4578
|
-
onDragLeave: () => setDragging(false),
|
|
4579
|
-
onDrop: (e) => {
|
|
4580
|
-
if (!attachments || attachments.disabled) return;
|
|
4581
|
-
e.preventDefault();
|
|
4582
|
-
setDragging(false);
|
|
4583
|
-
pick(e.dataTransfer.files);
|
|
4584
|
-
},
|
|
4585
|
-
className: cn("mx-auto w-full max-w-[var(--wd-content-max-w,48rem)] overflow-hidden border border-border bg-bg", "transition-colors", lines ? "rounded-sm focus-within:border-accent" : cn("rounded-lg shadow-(--shadow-xs)", "focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/30"), dragging && (lines ? "border-accent" : "border-ring ring-2 ring-ring/30"), disabled && "opacity-60"),
|
|
4645
|
+
...dropHandlers,
|
|
4646
|
+
className: cn("mx-auto w-full max-w-[var(--wd-content-max-w,48rem)] overflow-hidden border border-border bg-bg", "transition-colors rounded-lg shadow-(--shadow-xs)", "focus-within:border-ring focus-within:ring-2 focus-within:ring-ring/30", dragging && "border-ring ring-2 ring-ring/30", disabled && "opacity-60"),
|
|
4586
4647
|
children: [staged.length > 0 && attachments ? /* @__PURE__ */ jsx(AttachmentStrip, { attachments }) : null, inline ? /* @__PURE__ */ jsxs("div", {
|
|
4587
4648
|
className: "flex items-end gap-1 p-1",
|
|
4588
4649
|
children: [
|
|
@@ -4619,23 +4680,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
4619
4680
|
children: [attach, toolbar]
|
|
4620
4681
|
}), submitButton]
|
|
4621
4682
|
})] })]
|
|
4622
|
-
}),
|
|
4623
|
-
className: "mx-auto mt-1 flex w-full max-w-[var(--wd-content-max-w,48rem)] items-center gap-2 text-label text-danger",
|
|
4624
|
-
children: [
|
|
4625
|
-
/* @__PURE__ */ jsx(TriangleAlert, { className: "size-3 shrink-0" }),
|
|
4626
|
-
/* @__PURE__ */ jsx("span", {
|
|
4627
|
-
className: "min-w-0 flex-1",
|
|
4628
|
-
children: attachments.error
|
|
4629
|
-
}),
|
|
4630
|
-
/* @__PURE__ */ jsx("button", {
|
|
4631
|
-
type: "button",
|
|
4632
|
-
onClick: attachments.dismissError,
|
|
4633
|
-
"aria-label": "Dismiss",
|
|
4634
|
-
className: "shrink-0 opacity-70 hover:opacity-100",
|
|
4635
|
-
children: /* @__PURE__ */ jsx(X, { className: "size-3" })
|
|
4636
|
-
})
|
|
4637
|
-
]
|
|
4638
|
-
}) : null]
|
|
4683
|
+
}), errorRow]
|
|
4639
4684
|
});
|
|
4640
4685
|
}
|
|
4641
4686
|
/**
|
|
@@ -6680,14 +6725,17 @@ function RateLimitMeter({ label, info, now }) {
|
|
|
6680
6725
|
]
|
|
6681
6726
|
}),
|
|
6682
6727
|
children: /* @__PURE__ */ jsxs("span", {
|
|
6683
|
-
className: cn("
|
|
6728
|
+
className: cn("cursor-default font-mono text-label whitespace-nowrap", info.status === "rejected" ? "text-danger" : utilizationColor(pct ?? 0)),
|
|
6684
6729
|
children: [
|
|
6685
|
-
/* @__PURE__ */ jsx(ProgressRing, {
|
|
6730
|
+
/* @__PURE__ */ jsx(ProgressRing, {
|
|
6731
|
+
value: pct ?? 0,
|
|
6732
|
+
className: "mr-1 inline-block align-middle"
|
|
6733
|
+
}),
|
|
6686
6734
|
label,
|
|
6687
6735
|
pct !== void 0 ? ` ${pct.toFixed(0)}%` : "",
|
|
6688
6736
|
resetsAtMs !== void 0 ? /* @__PURE__ */ jsxs("span", {
|
|
6689
6737
|
className: "text-fg-4",
|
|
6690
|
-
children: ["· ", formatCountdown(resetsAtMs, now)]
|
|
6738
|
+
children: [" · ", formatCountdown(resetsAtMs, now)]
|
|
6691
6739
|
}) : null
|
|
6692
6740
|
]
|
|
6693
6741
|
})
|
|
@@ -6701,11 +6749,11 @@ function Slot({ onClick, hint, children }) {
|
|
|
6701
6749
|
type: "button",
|
|
6702
6750
|
onClick,
|
|
6703
6751
|
"aria-label": hint,
|
|
6704
|
-
className: "rounded-md
|
|
6752
|
+
className: "rounded-md py-0.5 leading-4 transition-colors outline-none hover:bg-surface-hover focus-visible:bg-surface-hover",
|
|
6705
6753
|
children
|
|
6706
6754
|
});
|
|
6707
6755
|
}
|
|
6708
|
-
function StatusBar({ state, connected, connection, onOpenStatus, onOpenContext, onOpenUsage, actions, placement = "top", className }) {
|
|
6756
|
+
function StatusBar({ state, connected, connection, onOpenStatus, onOpenContext, onOpenUsage, controls, actions, placement = "top", className }) {
|
|
6709
6757
|
const meta = STATUS_META[state.status];
|
|
6710
6758
|
const now = useNow();
|
|
6711
6759
|
const session = state.rateLimits?.five_hour;
|
|
@@ -6713,7 +6761,7 @@ function StatusBar({ state, connected, connection, onOpenStatus, onOpenContext,
|
|
|
6713
6761
|
const link = connection ?? (connected === false ? "reconnecting" : "live");
|
|
6714
6762
|
return /* @__PURE__ */ jsxs("div", {
|
|
6715
6763
|
"data-slot": "status-bar",
|
|
6716
|
-
className: cn("flex items-
|
|
6764
|
+
className: cn("flex h-[38px] items-baseline gap-2 border-border bg-surface p-1.5", placement === "bottom" ? "border-t" : "border-b", className),
|
|
6717
6765
|
children: [
|
|
6718
6766
|
/* @__PURE__ */ jsx(Slot, {
|
|
6719
6767
|
onClick: onOpenStatus,
|
|
@@ -6721,11 +6769,13 @@ function StatusBar({ state, connected, connection, onOpenStatus, onOpenContext,
|
|
|
6721
6769
|
children: link === "live" ? /* @__PURE__ */ jsxs(Badge, {
|
|
6722
6770
|
variant: meta.variant,
|
|
6723
6771
|
dot: !meta.busy,
|
|
6724
|
-
|
|
6772
|
+
className: "items-baseline",
|
|
6773
|
+
children: [meta.busy ? /* @__PURE__ */ jsx(Spinner, { className: "size-3 self-center text-current" }) : null, meta.label]
|
|
6725
6774
|
}) : /* @__PURE__ */ jsxs(Badge, {
|
|
6726
6775
|
variant: link === "offline" ? "danger" : "warning",
|
|
6727
6776
|
dot: false,
|
|
6728
|
-
|
|
6777
|
+
className: "items-baseline",
|
|
6778
|
+
children: [link === "offline" ? /* @__PURE__ */ jsx(WifiOff, { className: "size-3 self-center text-current" }) : /* @__PURE__ */ jsx(RefreshCw, { className: "size-3 animate-spin self-center text-current" }), link === "offline" ? "Offline" : "Reconnecting…"]
|
|
6729
6779
|
})
|
|
6730
6780
|
}),
|
|
6731
6781
|
state.capabilities.contextUsage && state.contextUsage ? /* @__PURE__ */ jsx(Slot, {
|
|
@@ -6737,7 +6787,7 @@ function StatusBar({ state, connected, connection, onOpenStatus, onOpenContext,
|
|
|
6737
6787
|
onClick: onOpenUsage,
|
|
6738
6788
|
hint: "Plan usage",
|
|
6739
6789
|
children: /* @__PURE__ */ jsxs("span", {
|
|
6740
|
-
className: "inline-flex items-
|
|
6790
|
+
className: "inline-flex items-baseline gap-2",
|
|
6741
6791
|
children: [session ? /* @__PURE__ */ jsx(RateLimitMeter, {
|
|
6742
6792
|
label: "Session",
|
|
6743
6793
|
info: session,
|
|
@@ -6749,6 +6799,7 @@ function StatusBar({ state, connected, connection, onOpenStatus, onOpenContext,
|
|
|
6749
6799
|
}) : null]
|
|
6750
6800
|
})
|
|
6751
6801
|
}) : null,
|
|
6802
|
+
controls,
|
|
6752
6803
|
/* @__PURE__ */ jsx("span", { className: "flex-1" }),
|
|
6753
6804
|
/* @__PURE__ */ jsx("span", {
|
|
6754
6805
|
className: "font-mono text-label text-fg-3",
|
|
@@ -7017,7 +7068,7 @@ function Message({ from, className, children, ...props }) {
|
|
|
7017
7068
|
className: cn("flex w-full", lines ? cn("flex-row gap-2", from === "user" && "-mx-1 rounded-sm bg-surface px-1") : "flex-col items-start gap-1", className),
|
|
7018
7069
|
...props,
|
|
7019
7070
|
children: lines ? /* @__PURE__ */ jsxs(Fragment$1, { children: [/* @__PURE__ */ jsx(LineGlyph, {
|
|
7020
|
-
className: from === "user" ? "text-
|
|
7071
|
+
className: from === "user" ? "text-accent" : "text-fg-3",
|
|
7021
7072
|
children: from === "user" ? "❯" : "●"
|
|
7022
7073
|
}), /* @__PURE__ */ jsx("div", {
|
|
7023
7074
|
className: "flex min-w-0 flex-1 flex-col gap-1",
|
|
@@ -8052,10 +8103,11 @@ const INTERACTIVE = [
|
|
|
8052
8103
|
* the engine name — an absent capability hides the control instead of offering
|
|
8053
8104
|
* one that can only fail.
|
|
8054
8105
|
*/
|
|
8055
|
-
function SessionPanel({ client, sessionId, header, panelSurface = "internal", statusSurface = "internal", statusPlacement = "top", onOpenPanel, onVitals, transcriptVariant = "cards", transcriptDensity = "comfortable", controlsSurface = "internal", onControls, focusComposerOnClick = false, unseen, readOnly = false, className }) {
|
|
8106
|
+
function SessionPanel({ client, sessionId, header, panelSurface = "internal", statusSurface = "internal", statusPlacement = "top", onOpenPanel, onVitals, transcriptVariant = "cards", transcriptDensity = "comfortable", transcriptFont = "sans", controlsSurface = "internal", onControls, focusComposerOnClick = false, unseen, readOnly = false, toolHost, className }) {
|
|
8056
8107
|
const external = panelSurface === "external";
|
|
8057
8108
|
const statusExternal = statusSurface === "external";
|
|
8058
|
-
const
|
|
8109
|
+
const controlsInStatus = controlsSurface === "status" && !statusExternal;
|
|
8110
|
+
const controlsExternal = controlsSurface === "external" || controlsInStatus;
|
|
8059
8111
|
const [protocolError, setProtocolError] = useState(void 0);
|
|
8060
8112
|
const [panel, setPanel] = useState();
|
|
8061
8113
|
const { state, connection, protocolMismatch, models, effectiveModel, handle, send, approve, deny, interrupt, setModel, setPermissionMode, reconnectNow } = useClaudeSession(client, sessionId, { onProtocolError: setProtocolError });
|
|
@@ -8078,7 +8130,7 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
8078
8130
|
document.addEventListener("visibilitychange", onVisible);
|
|
8079
8131
|
return () => document.removeEventListener("visibilitychange", onVisible);
|
|
8080
8132
|
}, [reconnectNow]);
|
|
8081
|
-
useToolCallHost(handle);
|
|
8133
|
+
useToolCallHost(handle, toolHost === false ? { enabled: false } : toolHost);
|
|
8082
8134
|
const capabilities = state.capabilities;
|
|
8083
8135
|
const onVitalsRef = useRef(onVitals);
|
|
8084
8136
|
onVitalsRef.current = onVitals;
|
|
@@ -8204,10 +8256,25 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
8204
8256
|
] })] });
|
|
8205
8257
|
const menu = external ? null : actionsMenu;
|
|
8206
8258
|
const headerTakesActions = typeof header === "function";
|
|
8259
|
+
const sessionControls = /* @__PURE__ */ jsxs(Fragment$1, { children: [models.length ? /* @__PURE__ */ jsx(ModelSelect, {
|
|
8260
|
+
models,
|
|
8261
|
+
model: effectiveModel,
|
|
8262
|
+
onModelChange: setModel,
|
|
8263
|
+
disabled: ended,
|
|
8264
|
+
className: controlsInStatus ? "h-5" : void 0
|
|
8265
|
+
}) : null, state.permissionMode ? /* @__PURE__ */ jsx(PermissionModeSelect, {
|
|
8266
|
+
mode: state.permissionMode,
|
|
8267
|
+
onModeChange: setPermissionMode,
|
|
8268
|
+
modes: capabilities.permissionModes,
|
|
8269
|
+
canBypass: state.session?.canBypassPermissions,
|
|
8270
|
+
disabled: ended,
|
|
8271
|
+
className: controlsInStatus ? "h-5" : void 0
|
|
8272
|
+
}) : null] });
|
|
8207
8273
|
const statusBar = statusExternal ? null : /* @__PURE__ */ jsx(StatusBar, {
|
|
8208
8274
|
state,
|
|
8209
8275
|
connection,
|
|
8210
8276
|
placement: statusPlacement,
|
|
8277
|
+
controls: controlsInStatus && !readOnly ? sessionControls : void 0,
|
|
8211
8278
|
onOpenStatus: external && !onOpenPanel ? void 0 : () => openPanel("info"),
|
|
8212
8279
|
onOpenContext: external && !onOpenPanel ? void 0 : () => openPanel("context"),
|
|
8213
8280
|
onOpenUsage: external && !onOpenPanel ? void 0 : () => openPanel("usage"),
|
|
@@ -8225,6 +8292,7 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
8225
8292
|
value: transcriptDensity,
|
|
8226
8293
|
children: /* @__PURE__ */ jsxs("div", {
|
|
8227
8294
|
"data-slot": "session-panel",
|
|
8295
|
+
"data-agent-font": transcriptFont,
|
|
8228
8296
|
onClick: handleClick,
|
|
8229
8297
|
className: cn("flex h-full min-h-0 flex-col overflow-hidden bg-bg", className),
|
|
8230
8298
|
children: [
|
|
@@ -8323,18 +8391,7 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
8323
8391
|
limit: 8
|
|
8324
8392
|
}) : void 0,
|
|
8325
8393
|
layout: controlsExternal ? "inline" : "stacked",
|
|
8326
|
-
toolbar: controlsExternal ? void 0 :
|
|
8327
|
-
models,
|
|
8328
|
-
model: effectiveModel,
|
|
8329
|
-
onModelChange: setModel,
|
|
8330
|
-
disabled: ended
|
|
8331
|
-
}) : null, state.permissionMode ? /* @__PURE__ */ jsx(PermissionModeSelect, {
|
|
8332
|
-
mode: state.permissionMode,
|
|
8333
|
-
onModeChange: setPermissionMode,
|
|
8334
|
-
modes: capabilities.permissionModes,
|
|
8335
|
-
canBypass: state.session?.canBypassPermissions,
|
|
8336
|
-
disabled: ended
|
|
8337
|
-
}) : null] })
|
|
8394
|
+
toolbar: controlsExternal ? void 0 : sessionControls
|
|
8338
8395
|
}),
|
|
8339
8396
|
statusPlacement === "bottom" ? statusBar : null,
|
|
8340
8397
|
!external ? /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
@@ -8474,4 +8531,4 @@ function Notice({ level, onDismiss, children }) {
|
|
|
8474
8531
|
//#endregion
|
|
8475
8532
|
export { Tip as $, SkillsDialog as A, commandTrigger as B, isMutatingTool as C, Button as Ct, permissionModeChoices as D, PermissionModeSelect as E, skillPrompt as F, plainTextToSegments as G, mentionTrigger as H, TranscriptDensityProvider as I, Splitter as J, segmentsToPlainText as K, TranscriptVariantProvider as L, HostFilesDialog as M, ContextDialog as N, permissionModeMeta as O, Composer as P, copyText as Q, useTranscriptDensity as R, Response as S, badgeVariants as St, PERMISSION_MODES as T, cn as Tt, usePromptAreaState as U, hashtagTrigger as V, PromptArea as W, Spinner as X, CodeBlock as Y, CopyButton as Z, SessionInfoDialog as _, SelectItemText as _t, SessionEmptyState as a, DialogContent as at, parseUserQuestions as b, Input as bt, Message as c, DialogTrigger as ct, FileCard as d, MenuItem as dt, TooltipContent as et, Conversation as f, MenuSeparator as ft, STATUS_META as g, SelectItem as gt, StatusBar as h, SelectContent as ht, ToolCallCard as i, DialogClose as it, McpDialog as j, ModelSelect as k, MessageContent as l, Menu$1 as lt, ConversationScrollButton as m, Select$1 as mt, UsageDialog as n, Dialog$1 as nt, Reasoning as o, DialogHeader as ot, ConversationContent as p, MenuTrigger as pt, ProgressRing as q, Transcript as r, DialogBody as rt, PromptTokenText as s, DialogRow as st, SessionPanel as t, TooltipProvider as tt, Loader as u, MenuContent as ut, QUESTION_BEHAVIORS as v, SelectTrigger as vt, toolIcon as w, buttonVariants as wt, PermissionPrompt as x, Badge as xt, QuestionPrompt as y, SelectValue as yt, useTranscriptVariant as z };
|
|
8476
8533
|
|
|
8477
|
-
//# sourceMappingURL=SessionPanel-
|
|
8534
|
+
//# sourceMappingURL=SessionPanel-DI1NO4l8.mjs.map
|