@workerdeck/ui 3.2.0 → 3.4.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/build/{SessionPanel-BNNc8grK.d.mts → SessionPanel-DIi4sEgh.d.mts} +5 -2
- package/build/index.d.mts +24 -5
- package/build/index.mjs +297 -62
- package/build/index.mjs.map +1 -1
- package/build/scoped.css +52 -3
- package/build/{use-path-links-C6Fh5zdx.mjs → use-path-links-WCsysQPy.mjs} +337 -83
- package/build/use-path-links-WCsysQPy.mjs.map +1 -0
- package/build/workspace.d.mts +1 -1
- package/build/workspace.mjs +1 -1
- package/package.json +4 -4
- package/src/components/agent/Composer.tsx +29 -6
- package/src/components/agent/EffortSelect.tsx +64 -0
- package/src/components/agent/ModelSelect.tsx +1 -1
- package/src/components/agent/SessionBrowser.tsx +106 -17
- package/src/components/agent/SessionFilters.tsx +2 -2
- package/src/components/agent/SessionGroups.tsx +248 -0
- package/src/components/agent/SessionItem.tsx +3 -1
- package/src/components/agent/SessionPanel.tsx +75 -28
- package/src/components/agent/TranscriptItemView.tsx +20 -2
- package/src/components/agent/composer-commands.ts +24 -0
- package/src/components/terminal/affordances.tsx +29 -1
- package/src/components/terminal/height.ts +12 -2
- package/src/components/terminal/items.tsx +35 -3
- package/src/components/terminal/live-tool.ts +71 -0
- package/src/components/terminal/tool-run.ts +6 -3
- package/src/index.ts +8 -1
- package/src/styles/terminal.css +9 -2
- package/src/styles/theme.css +3 -1
- package/build/use-path-links-C6Fh5zdx.mjs.map +0 -1
|
@@ -5,11 +5,11 @@ import { clsx } from "clsx";
|
|
|
5
5
|
import { extendTailwindMerge } from "tailwind-merge";
|
|
6
6
|
import { Fragment as Fragment$1, jsx, jsxs } from "react/jsx-runtime";
|
|
7
7
|
import { Select } from "@base-ui/react/select";
|
|
8
|
-
import { ArrowDown, ArrowDownCircle, ArrowLeft, ArrowUp, AtSign, Bot, BotOff, Brain, ChartPie, Check, CheckSquare, ChevronDown, ChevronLeft, ChevronRight, ChevronsUpDown, ClipboardList, Clock, Code, Copy, Download, File, FileDiff, FileText, Folder, FolderSearch, FolderTree, Gauge, Globe, Hand, Image, Info, Link2, LoaderCircle, Maximize, Maximize2, MessageCircleQuestion, MessageSquareText, Minus, MoreHorizontal, Paperclip, PencilLine, Plug, Plus, Power, PowerOff, Puzzle, RefreshCw, RotateCcw, RotateCw, Search, ShieldCheck, SlashSquare, SlidersHorizontal, Sparkles, Square, SquarePen, SquareTerminal, Star, Terminal, TriangleAlert, Users, UsersRound, WifiOff, Wrench, X, Zap } from "lucide-react";
|
|
8
|
+
import { ArrowDown, ArrowDownCircle, ArrowDownToLine, ArrowLeft, ArrowUp, AtSign, Bot, BotOff, Brain, ChartPie, Check, CheckSquare, ChevronDown, ChevronLeft, ChevronRight, ChevronsUpDown, ClipboardList, Clock, Code, Copy, Download, File, FileDiff, FileText, Folder, FolderSearch, FolderTree, Gauge, Globe, Hand, Image, Info, Link2, LoaderCircle, Maximize, Maximize2, MessageCircleQuestion, MessageSquareText, Minus, MoreHorizontal, Paperclip, PencilLine, Plug, Plus, Power, PowerOff, Puzzle, RefreshCw, RotateCcw, RotateCw, Search, ShieldCheck, SlashSquare, SlidersHorizontal, Sparkles, Square, SquarePen, SquareTerminal, Star, Terminal, TriangleAlert, Users, UsersRound, WifiOff, Wrench, X, Zap } from "lucide-react";
|
|
9
9
|
import { Menu } from "@base-ui/react/menu";
|
|
10
10
|
import { Dialog } from "@base-ui/react/dialog";
|
|
11
11
|
import { Tooltip } from "@base-ui/react/tooltip";
|
|
12
|
-
import { PRICING_NOTE, PROTOCOL_VERSION, SHELL_INTERACTIVE_NOTE, UNPRICED_WARN_SHARE, canonicalModel, costOf, costOfByModel, errorMessage, isPeerSendTool, mergeUsage, orderUsageWindows, parseTodoWriteInput, parseUserQuestions, peerDeliveredTo, pricingAgeNote, rateFor, resolvePosix, sessionTasks, subagentLabel, taskCountLabel, taskSummary, toolTitle, totalTokens, unknownBasisModels, usageInfos, usageIsStale } from "@workerdeck/protocol";
|
|
12
|
+
import { PRICING_NOTE, PROTOCOL_VERSION, SHELL_INTERACTIVE_NOTE, UNPRICED_WARN_SHARE, canonicalModel, costOf, costOfByModel, errorMessage, isPeerSendTool, mergeUsage, orderUsageWindows, parseTodoWriteInput, parseUserQuestions, peerDeliveredTo, peerShortId, pricingAgeNote, rateFor, resolvePosix, sessionTasks, subagentLabel, taskCountLabel, taskSummary, toolTitle, totalTokens, unknownBasisModels, usageInfos, usageIsStale } from "@workerdeck/protocol";
|
|
13
13
|
import { recapLine, scanPromptTokens, summarizeSince, useAsync, useAttachments, useClaudeSession, useDraft, useHostFileSearch, usePeerSessions, useProfileUsage, useShellTerminal, useToolCallHost } from "@workerdeck/react";
|
|
14
14
|
import { Streamdown, defaultRehypePlugins } from "streamdown";
|
|
15
15
|
import { StickToBottom, useStickToBottomContext } from "use-stick-to-bottom";
|
|
@@ -4588,7 +4588,7 @@ function composerCommandRows(rows) {
|
|
|
4588
4588
|
insertText: `/${row.name} `
|
|
4589
4589
|
});
|
|
4590
4590
|
}
|
|
4591
|
-
function buildClientCommands({ capabilities, hasModels, setModel, setPermissionMode, clearContext, openPanel }) {
|
|
4591
|
+
function buildClientCommands({ capabilities, hasModels, efforts = [], setModel, setEffort, setPermissionMode, clearContext, openPanel }) {
|
|
4592
4592
|
const modes = capabilities.permissionModes;
|
|
4593
4593
|
const built = [];
|
|
4594
4594
|
if (hasModels) built.push({
|
|
@@ -4603,6 +4603,22 @@ function buildClientCommands({ capabilities, hasModels, setModel, setPermissionM
|
|
|
4603
4603
|
return true;
|
|
4604
4604
|
}
|
|
4605
4605
|
});
|
|
4606
|
+
if (efforts.length && setEffort) built.push({
|
|
4607
|
+
name: "effort",
|
|
4608
|
+
description: `Set the reasoning effort (${efforts.join(", ")}, default)`,
|
|
4609
|
+
argumentHint: "<level>",
|
|
4610
|
+
requiresArgs: true,
|
|
4611
|
+
run: (args) => {
|
|
4612
|
+
const wanted = args.split(/\s+/)[0];
|
|
4613
|
+
if (wanted === "default") {
|
|
4614
|
+
setEffort(void 0);
|
|
4615
|
+
return true;
|
|
4616
|
+
}
|
|
4617
|
+
if (!wanted || !efforts.includes(wanted)) return false;
|
|
4618
|
+
setEffort(wanted);
|
|
4619
|
+
return true;
|
|
4620
|
+
}
|
|
4621
|
+
});
|
|
4606
4622
|
if (modes.length > 1) built.push({
|
|
4607
4623
|
name: "permissions",
|
|
4608
4624
|
description: `Set the permission mode (${modes.join(", ")})`,
|
|
@@ -4937,6 +4953,23 @@ function BookmarkAction({ id }) {
|
|
|
4937
4953
|
onPress: () => handle.toggle(id)
|
|
4938
4954
|
});
|
|
4939
4955
|
}
|
|
4956
|
+
const TaskControlContext = createContext(void 0);
|
|
4957
|
+
function TaskControlProvider({ value, children }) {
|
|
4958
|
+
return /* @__PURE__ */ jsx(TaskControlContext.Provider, {
|
|
4959
|
+
value,
|
|
4960
|
+
children
|
|
4961
|
+
});
|
|
4962
|
+
}
|
|
4963
|
+
function BackgroundAction({ toolUseId }) {
|
|
4964
|
+
const handle = useContext(TaskControlContext);
|
|
4965
|
+
if (!handle) return null;
|
|
4966
|
+
return /* @__PURE__ */ jsx(ActionButton, {
|
|
4967
|
+
icon: ArrowDownToLine,
|
|
4968
|
+
word: "background",
|
|
4969
|
+
label: "Move to background (the command keeps running, the agent continues)",
|
|
4970
|
+
onPress: () => handle.background(toolUseId)
|
|
4971
|
+
});
|
|
4972
|
+
}
|
|
4940
4973
|
function OpenSubagentAction({ onOpen, label = "Open sub-agent" }) {
|
|
4941
4974
|
return /* @__PURE__ */ jsx(ActionButton, {
|
|
4942
4975
|
icon: Maximize2,
|
|
@@ -4994,6 +5027,51 @@ function AgentWriteIcon({ granted, className }) {
|
|
|
4994
5027
|
className
|
|
4995
5028
|
});
|
|
4996
5029
|
}
|
|
5030
|
+
const ELAPSED_WIDEST = " ·\xA059m\xA059s";
|
|
5031
|
+
const BACKGROUNDABLE = /* @__PURE__ */ new Set([
|
|
5032
|
+
"Bash",
|
|
5033
|
+
"Task",
|
|
5034
|
+
"Agent"
|
|
5035
|
+
]);
|
|
5036
|
+
function toolBusy(item) {
|
|
5037
|
+
const status = item.status ?? (item.result === void 0 ? "running" : "settled");
|
|
5038
|
+
return status === "running" || status === "pending";
|
|
5039
|
+
}
|
|
5040
|
+
function liveTailLines(item) {
|
|
5041
|
+
if (!item.liveTail || !toolBusy(item)) return [];
|
|
5042
|
+
return item.liveTail.split("\n").slice(-5);
|
|
5043
|
+
}
|
|
5044
|
+
function elapsedLabel(startedAt, now) {
|
|
5045
|
+
if (startedAt === void 0 || now - startedAt < 5e3) return;
|
|
5046
|
+
return formatDuration(Math.floor((now - startedAt) / 1e3) * 1e3).replace(" ", "\xA0");
|
|
5047
|
+
}
|
|
5048
|
+
function runStartedAt(items) {
|
|
5049
|
+
let earliest;
|
|
5050
|
+
for (const item of items) if (toolBusy(item) && item.ts !== void 0 && (earliest === void 0 || item.ts < earliest)) earliest = item.ts;
|
|
5051
|
+
return earliest;
|
|
5052
|
+
}
|
|
5053
|
+
function canBackground(item) {
|
|
5054
|
+
return BACKGROUNDABLE.has(item.name) && item.parentToolUseId == null && toolBusy(item);
|
|
5055
|
+
}
|
|
5056
|
+
function runTailLines(items) {
|
|
5057
|
+
for (let index = items.length - 1; index >= 0; index--) {
|
|
5058
|
+
const lines = liveTailLines(items[index]);
|
|
5059
|
+
if (lines.length > 0) return lines;
|
|
5060
|
+
}
|
|
5061
|
+
return [];
|
|
5062
|
+
}
|
|
5063
|
+
function backgroundableSince(items) {
|
|
5064
|
+
let since;
|
|
5065
|
+
for (let index = items.length - 1; index >= 0; index--) {
|
|
5066
|
+
const item = items[index];
|
|
5067
|
+
if (item.kind === "user" && item.parentToolUseId == null) break;
|
|
5068
|
+
if (item.kind === "tool_call" && canBackground(item)) {
|
|
5069
|
+
const ts = item.ts ?? 0;
|
|
5070
|
+
since = since === void 0 ? ts : Math.min(since, ts);
|
|
5071
|
+
}
|
|
5072
|
+
}
|
|
5073
|
+
return since;
|
|
5074
|
+
}
|
|
4997
5075
|
//#endregion
|
|
4998
5076
|
//#region src/components/terminal/row.tsx
|
|
4999
5077
|
function Row({ glyph, glyphTone, tone, bold, indent, columns, className, children, style, ...props }) {
|
|
@@ -5908,7 +5986,8 @@ function isPeerSend(item) {
|
|
|
5908
5986
|
return item.kind === "tool_call" && isPeerSendTool(item.name);
|
|
5909
5987
|
}
|
|
5910
5988
|
function peerName(origin) {
|
|
5911
|
-
|
|
5989
|
+
if (!origin.name) return peerShortId(origin.sessionId);
|
|
5990
|
+
return origin.hostId ? `${origin.name}@${origin.hostId}` : origin.name;
|
|
5912
5991
|
}
|
|
5913
5992
|
function peerNamesOf(items) {
|
|
5914
5993
|
const names = /* @__PURE__ */ new Map();
|
|
@@ -5929,7 +6008,7 @@ function peerSendTarget(item, names) {
|
|
|
5929
6008
|
const addressed = item.input?.sessionId;
|
|
5930
6009
|
const sessionId = delivered?.sessionId ?? (typeof addressed === "string" ? addressed : void 0);
|
|
5931
6010
|
if (sessionId === void 0) return "peer";
|
|
5932
|
-
return delivered?.name ?? names?.get(sessionId) ?? sessionId
|
|
6011
|
+
return delivered?.name ?? names?.get(sessionId) ?? peerShortId(sessionId);
|
|
5933
6012
|
}
|
|
5934
6013
|
function peerSendText(item) {
|
|
5935
6014
|
const text = item.input?.text;
|
|
@@ -6305,7 +6384,7 @@ function clipToChars(lines, maxChars) {
|
|
|
6305
6384
|
return out;
|
|
6306
6385
|
}
|
|
6307
6386
|
function peerLabel(origin) {
|
|
6308
|
-
const who = origin.name ? `${origin.name} (${origin.sessionId
|
|
6387
|
+
const who = origin.name ? `${origin.name} (${peerShortId(origin.sessionId)})` : peerShortId(origin.sessionId);
|
|
6309
6388
|
return `message from ${origin.engine ? `${origin.engine} session ` : "session "}${who}`;
|
|
6310
6389
|
}
|
|
6311
6390
|
function PeerRow({ glyph, who, body, tone = "peer", clip }) {
|
|
@@ -6431,6 +6510,9 @@ function ToolRow({ item }) {
|
|
|
6431
6510
|
const busy = status === "running" || status === "pending";
|
|
6432
6511
|
const isError = status === "failed" || item.result?.isError === true;
|
|
6433
6512
|
const pulse = usePulse(busy);
|
|
6513
|
+
const now = useTicker(busy && item.ts !== void 0);
|
|
6514
|
+
const elapsed = busy ? elapsedLabel(item.ts, now) : void 0;
|
|
6515
|
+
const tail = liveTailLines(item);
|
|
6434
6516
|
const text = item.result?.text ?? "";
|
|
6435
6517
|
const lines = text.trimEnd().split("\n");
|
|
6436
6518
|
const collapsed = collapsedResult(lines, item.result?.totalChars);
|
|
@@ -6449,10 +6531,14 @@ function ToolRow({ item }) {
|
|
|
6449
6531
|
ref: reveal,
|
|
6450
6532
|
className: open ? "term-open" : void 0,
|
|
6451
6533
|
children: /* @__PURE__ */ jsxs(WithActions, {
|
|
6452
|
-
actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
6453
|
-
|
|
6454
|
-
|
|
6455
|
-
|
|
6534
|
+
actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
6535
|
+
canBackground(item) ? /* @__PURE__ */ jsx(BackgroundAction, { toolUseId: item.id }) : null,
|
|
6536
|
+
/* @__PURE__ */ jsx(BookmarkAction, { id: item.id }),
|
|
6537
|
+
copyable ? /* @__PURE__ */ jsx(CopyAction, {
|
|
6538
|
+
text: copyable,
|
|
6539
|
+
label: "Copy"
|
|
6540
|
+
}) : null
|
|
6541
|
+
] }),
|
|
6456
6542
|
children: [
|
|
6457
6543
|
/* @__PURE__ */ jsx(Pressable, {
|
|
6458
6544
|
onPress: () => setOpen((v) => !v),
|
|
@@ -6477,6 +6563,15 @@ function ToolRow({ item }) {
|
|
|
6477
6563
|
")"
|
|
6478
6564
|
]
|
|
6479
6565
|
}),
|
|
6566
|
+
elapsed ? /* @__PURE__ */ jsxs(Ink, {
|
|
6567
|
+
tone: "faint",
|
|
6568
|
+
children: [
|
|
6569
|
+
" ",
|
|
6570
|
+
"·",
|
|
6571
|
+
"\xA0",
|
|
6572
|
+
elapsed
|
|
6573
|
+
]
|
|
6574
|
+
}) : null,
|
|
6480
6575
|
title && open ? /* @__PURE__ */ jsxs(Ink, {
|
|
6481
6576
|
tone: "faint",
|
|
6482
6577
|
children: [" · ", item.name]
|
|
@@ -6488,6 +6583,7 @@ function ToolRow({ item }) {
|
|
|
6488
6583
|
]
|
|
6489
6584
|
})
|
|
6490
6585
|
}),
|
|
6586
|
+
/* @__PURE__ */ jsx(LiveTail, { lines: tail }),
|
|
6491
6587
|
hostPath !== void 0 ? /* @__PURE__ */ jsx(TerminalHostImage, { path: hostPath }) : null,
|
|
6492
6588
|
item.result?.images?.map((image) => /* @__PURE__ */ jsx(TerminalImage, {
|
|
6493
6589
|
toolUseId: item.id,
|
|
@@ -6632,25 +6728,39 @@ function ToolRunRow({ items }) {
|
|
|
6632
6728
|
});
|
|
6633
6729
|
const failed = runFailed(items);
|
|
6634
6730
|
const pulse = usePulse(busy);
|
|
6731
|
+
const startedAt = runStartedAt(items);
|
|
6732
|
+
const elapsed = elapsedLabel(startedAt, useTicker(startedAt !== void 0));
|
|
6635
6733
|
return /* @__PURE__ */ jsxs("div", {
|
|
6636
6734
|
ref: reveal,
|
|
6637
6735
|
className: open ? "term-open" : void 0,
|
|
6638
|
-
children: [
|
|
6639
|
-
|
|
6640
|
-
|
|
6641
|
-
|
|
6642
|
-
|
|
6643
|
-
|
|
6644
|
-
|
|
6645
|
-
|
|
6646
|
-
|
|
6647
|
-
|
|
6648
|
-
|
|
6649
|
-
|
|
6650
|
-
|
|
6651
|
-
|
|
6652
|
-
|
|
6653
|
-
|
|
6736
|
+
children: [
|
|
6737
|
+
/* @__PURE__ */ jsx(Pressable, {
|
|
6738
|
+
onPress: () => setOpen((v) => !v),
|
|
6739
|
+
expanded: open,
|
|
6740
|
+
children: /* @__PURE__ */ jsxs(Row, {
|
|
6741
|
+
glyph: busy ? pulse : void 0,
|
|
6742
|
+
glyphTone: busy ? "mark" : void 0,
|
|
6743
|
+
tone: failed ? "red" : "dim",
|
|
6744
|
+
children: [busy ? /* @__PURE__ */ jsx("span", {
|
|
6745
|
+
className: "term-shimmer",
|
|
6746
|
+
children: runSummary(items, busy)
|
|
6747
|
+
}) : runSummary(items, busy), elapsed ? /* @__PURE__ */ jsxs(Ink, {
|
|
6748
|
+
tone: "faint",
|
|
6749
|
+
children: [
|
|
6750
|
+
" ",
|
|
6751
|
+
"·",
|
|
6752
|
+
"\xA0",
|
|
6753
|
+
elapsed
|
|
6754
|
+
]
|
|
6755
|
+
}) : null]
|
|
6756
|
+
})
|
|
6757
|
+
}),
|
|
6758
|
+
open ? null : /* @__PURE__ */ jsx(LiveTail, { lines: runTailLines(items) }),
|
|
6759
|
+
open ? /* @__PURE__ */ jsx("div", { children: items.map((item, index) => /* @__PURE__ */ jsxs(Fragment, { children: [index > 0 ? /* @__PURE__ */ jsx(Blank, {}) : null, index < items.length - 1 ? /* @__PURE__ */ jsx(ActionPlacementProvider, {
|
|
6760
|
+
value: "below",
|
|
6761
|
+
children: /* @__PURE__ */ jsx(ToolRow, { item })
|
|
6762
|
+
}) : /* @__PURE__ */ jsx(ToolRow, { item })] }, item.id)) }) : null
|
|
6763
|
+
]
|
|
6654
6764
|
});
|
|
6655
6765
|
}
|
|
6656
6766
|
function RunRow({ items }) {
|
|
@@ -6776,6 +6886,15 @@ function FileRow({ item, href }) {
|
|
|
6776
6886
|
]
|
|
6777
6887
|
});
|
|
6778
6888
|
}
|
|
6889
|
+
function LiveTail({ lines }) {
|
|
6890
|
+
return lines.map((line, index) => /* @__PURE__ */ jsx(Row, {
|
|
6891
|
+
indent: 1,
|
|
6892
|
+
columns: 3,
|
|
6893
|
+
glyph: index === 0 ? "⎿" : void 0,
|
|
6894
|
+
tone: "faint",
|
|
6895
|
+
children: line || " "
|
|
6896
|
+
}, index));
|
|
6897
|
+
}
|
|
6779
6898
|
function useTicker(on) {
|
|
6780
6899
|
const [now, setNow] = useState(() => Date.now());
|
|
6781
6900
|
useEffect(() => {
|
|
@@ -6831,7 +6950,7 @@ function TerminalSurface({ fontSize, lineHeight, bleed, affordances, className,
|
|
|
6831
6950
|
//#region src/components/agent/Composer.tsx
|
|
6832
6951
|
const SHELL_PLACEHOLDER = "Run a command on the host…";
|
|
6833
6952
|
const SHELL_HINT = "$ shell mode · esc to exit";
|
|
6834
|
-
function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message the agent…", commands, skills, clientCommands, onSearchFiles, peers, onShellCommand, attachments, toolbar, layout = "stacked", fontSize, lineHeight, affordances, draft, className, ref }) {
|
|
6953
|
+
function Composer({ onSend, onSendNow, onInterrupt, busy, disabled, placeholder = "Message the agent…", commands, skills, clientCommands, onSearchFiles, peers, onShellCommand, attachments, toolbar, layout = "stacked", fontSize, lineHeight, affordances, draft, className, ref }) {
|
|
6835
6954
|
const inline = layout === "inline";
|
|
6836
6955
|
const terminal = useTranscriptVariant() === "terminal";
|
|
6837
6956
|
const [initialDraft] = useState(() => draft?.initialText ?? "");
|
|
@@ -6910,6 +7029,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
6910
7029
|
value: peer.slug,
|
|
6911
7030
|
label: peer.label,
|
|
6912
7031
|
description: [
|
|
7032
|
+
peer.gateway,
|
|
6913
7033
|
peer.engine,
|
|
6914
7034
|
peer.project,
|
|
6915
7035
|
peer.status
|
|
@@ -6941,7 +7061,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
6941
7061
|
}, [plainText, saveDraft]);
|
|
6942
7062
|
const staged = attachments?.items ?? [];
|
|
6943
7063
|
const canSend = !disabled && (!isEmpty || staged.length > 0) && !attachments?.uploading && !attachments?.hasFailure;
|
|
6944
|
-
const submit = () => {
|
|
7064
|
+
const submit = (now = false) => {
|
|
6945
7065
|
if (!canSend) return;
|
|
6946
7066
|
if (shellMode) {
|
|
6947
7067
|
const command = plainText.trim();
|
|
@@ -6953,7 +7073,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
6953
7073
|
focus();
|
|
6954
7074
|
return;
|
|
6955
7075
|
}
|
|
6956
|
-
onSend(plainText.trim(), attachments?.readyIds ?? []);
|
|
7076
|
+
(now && onSendNow ? onSendNow : onSend)(plainText.trim(), attachments?.readyIds ?? []);
|
|
6957
7077
|
attachments?.clear();
|
|
6958
7078
|
draft?.clear();
|
|
6959
7079
|
clear();
|
|
@@ -7002,6 +7122,11 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
7002
7122
|
setHelpOpen(true);
|
|
7003
7123
|
return;
|
|
7004
7124
|
}
|
|
7125
|
+
if (e.key === "Enter" && e.altKey && onSendNow && canSend) {
|
|
7126
|
+
e.preventDefault();
|
|
7127
|
+
submit(true);
|
|
7128
|
+
return;
|
|
7129
|
+
}
|
|
7005
7130
|
if (helpOpen) setHelpOpen(false);
|
|
7006
7131
|
}
|
|
7007
7132
|
};
|
|
@@ -7065,10 +7190,16 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
7065
7190
|
"data-tone": "blue",
|
|
7066
7191
|
children: "❯"
|
|
7067
7192
|
});
|
|
7193
|
+
const sendNow = onSendNow && canSend && !shellMode ? /* @__PURE__ */ jsx("button", {
|
|
7194
|
+
type: "button",
|
|
7195
|
+
className: "term-press term-link text-label",
|
|
7196
|
+
onClick: () => submit(true),
|
|
7197
|
+
children: "⌥↵ send now - moves the running command to the background"
|
|
7198
|
+
}) : null;
|
|
7068
7199
|
const submitButton = terminal ? /* @__PURE__ */ jsx(GlyphButton, {
|
|
7069
7200
|
label: "Send",
|
|
7070
7201
|
disabled: !canSend,
|
|
7071
|
-
onClick: submit,
|
|
7202
|
+
onClick: () => submit(),
|
|
7072
7203
|
tone: canSend ? "blue" : void 0,
|
|
7073
7204
|
children: "↵"
|
|
7074
7205
|
}) : busy && !canSend ? /* @__PURE__ */ jsx(Button, {
|
|
@@ -7083,7 +7214,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
7083
7214
|
"aria-label": "Send",
|
|
7084
7215
|
className: "rounded-full",
|
|
7085
7216
|
disabled: !canSend,
|
|
7086
|
-
onClick: submit,
|
|
7217
|
+
onClick: () => submit(),
|
|
7087
7218
|
children: /* @__PURE__ */ jsx(ArrowUp, { className: "size-4" })
|
|
7088
7219
|
});
|
|
7089
7220
|
const dropHandlers = {
|
|
@@ -7124,7 +7255,7 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
7124
7255
|
triggers,
|
|
7125
7256
|
markdown: false,
|
|
7126
7257
|
normalizeBullets: false,
|
|
7127
|
-
onSubmit: submit,
|
|
7258
|
+
onSubmit: () => submit(),
|
|
7128
7259
|
disabled,
|
|
7129
7260
|
placeholder: disabled ? "Session ended" : shellMode ? SHELL_PLACEHOLDER : placeholder,
|
|
7130
7261
|
minHeight,
|
|
@@ -7150,6 +7281,13 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
7150
7281
|
children: /* @__PURE__ */ jsxs("div", {
|
|
7151
7282
|
className: "term-composer-body",
|
|
7152
7283
|
children: [
|
|
7284
|
+
sendNow ? /* @__PURE__ */ jsxs("div", {
|
|
7285
|
+
className: "term-row",
|
|
7286
|
+
children: [/* @__PURE__ */ jsx("span", {
|
|
7287
|
+
"aria-hidden": true,
|
|
7288
|
+
className: "term-gutter"
|
|
7289
|
+
}), sendNow]
|
|
7290
|
+
}) : null,
|
|
7153
7291
|
stagedStrip,
|
|
7154
7292
|
/* @__PURE__ */ jsxs("div", {
|
|
7155
7293
|
className: "term-row",
|
|
@@ -7203,6 +7341,10 @@ function Composer({ onSend, onInterrupt, busy, disabled, placeholder = "Message
|
|
|
7203
7341
|
className: cn("px-[var(--wd-composer-padding)] pb-[var(--wd-composer-padding)]", className),
|
|
7204
7342
|
children: [
|
|
7205
7343
|
helpRow,
|
|
7344
|
+
sendNow ? /* @__PURE__ */ jsx("div", {
|
|
7345
|
+
className: "mx-auto mb-1 w-full max-w-[var(--wd-transcript-max-width)] text-text-muted",
|
|
7346
|
+
children: sendNow
|
|
7347
|
+
}) : null,
|
|
7206
7348
|
/* @__PURE__ */ jsxs("div", {
|
|
7207
7349
|
...dropHandlers,
|
|
7208
7350
|
className: cn("mx-auto w-full max-w-[var(--wd-transcript-max-width)] 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", shellMode && "border-[var(--wd-shell-accent)] focus-within:border-[var(--wd-shell-accent)] focus-within:ring-[var(--wd-shell-accent)]/30", disabled && "opacity-60"),
|
|
@@ -8071,6 +8213,50 @@ function ModelSelect({ models, model, onModelChange, variant = "toolbar", disabl
|
|
|
8071
8213
|
});
|
|
8072
8214
|
}
|
|
8073
8215
|
//#endregion
|
|
8216
|
+
//#region src/components/agent/EffortSelect.tsx
|
|
8217
|
+
const DEFAULT_VALUE = "default";
|
|
8218
|
+
function effortChoices(models, model, capabilities) {
|
|
8219
|
+
return matchModel(models, model)?.reasoningEfforts ?? capabilities.reasoningEfforts ?? [];
|
|
8220
|
+
}
|
|
8221
|
+
function EffortSelect({ efforts, effort, onEffortChange, variant = "toolbar", disabled, className }) {
|
|
8222
|
+
const items = [{
|
|
8223
|
+
value: DEFAULT_VALUE,
|
|
8224
|
+
label: "Default"
|
|
8225
|
+
}, ...efforts.map((value) => ({
|
|
8226
|
+
value,
|
|
8227
|
+
label: value
|
|
8228
|
+
}))];
|
|
8229
|
+
return /* @__PURE__ */ jsxs(Select$1, {
|
|
8230
|
+
items,
|
|
8231
|
+
value: effort ?? null,
|
|
8232
|
+
onValueChange: (value) => {
|
|
8233
|
+
if (typeof value !== "string" || value === effort) return;
|
|
8234
|
+
onEffortChange(value === DEFAULT_VALUE ? void 0 : value);
|
|
8235
|
+
},
|
|
8236
|
+
disabled,
|
|
8237
|
+
children: [/* @__PURE__ */ jsx(SelectTrigger, {
|
|
8238
|
+
"aria-label": "Reasoning effort",
|
|
8239
|
+
className: cn(variant === "toolbar" && "h-6 max-w-32 border-transparent bg-transparent text-fg-3 hover:bg-surface-hover", className),
|
|
8240
|
+
children: /* @__PURE__ */ jsxs("span", {
|
|
8241
|
+
className: cn("flex items-center gap-1 truncate", variant === "toolbar" && "font-mono text-label"),
|
|
8242
|
+
children: [/* @__PURE__ */ jsx(Brain, { className: "size-3 shrink-0" }), /* @__PURE__ */ jsx(SelectValue, { placeholder: "effort" })]
|
|
8243
|
+
})
|
|
8244
|
+
}), /* @__PURE__ */ jsx(SelectContent, {
|
|
8245
|
+
className: "min-w-40",
|
|
8246
|
+
children: items.map((item) => /* @__PURE__ */ jsxs(SelectItem, {
|
|
8247
|
+
value: item.value,
|
|
8248
|
+
children: [/* @__PURE__ */ jsx(SelectItemText, { children: /* @__PURE__ */ jsx("span", {
|
|
8249
|
+
className: "font-medium",
|
|
8250
|
+
children: item.label
|
|
8251
|
+
}) }), item.value === DEFAULT_VALUE ? /* @__PURE__ */ jsx("span", {
|
|
8252
|
+
className: "text-label text-fg-4",
|
|
8253
|
+
children: "The model's configured default"
|
|
8254
|
+
}) : null]
|
|
8255
|
+
}, item.value))
|
|
8256
|
+
})]
|
|
8257
|
+
});
|
|
8258
|
+
}
|
|
8259
|
+
//#endregion
|
|
8074
8260
|
//#region src/components/agent/PermissionModeSelect.tsx
|
|
8075
8261
|
const PERMISSION_MODES = [
|
|
8076
8262
|
{
|
|
@@ -10780,10 +10966,16 @@ function toolRowHeight(item, m, extraPx) {
|
|
|
10780
10966
|
const todos = todoPreview(item.name, item.input);
|
|
10781
10967
|
const preview = todos ? todos.summary : toolInputPreview(item.input);
|
|
10782
10968
|
const backend = item.backend && item.backend !== "server" ? ` · ${item.backend}` : "";
|
|
10783
|
-
|
|
10969
|
+
const elapsed = toolBusy(item) && item.ts !== void 0 ? ELAPSED_WIDEST : "";
|
|
10970
|
+
let acc = rowH(`${item.name}(${preview})${backend}${elapsed}`, m, {
|
|
10784
10971
|
gutterCells: 2,
|
|
10785
10972
|
extraPx
|
|
10786
10973
|
});
|
|
10974
|
+
for (const line of liveTailLines(item)) acc = add(acc, rowH(line || " ", m, {
|
|
10975
|
+
indentCells: 3,
|
|
10976
|
+
gutterCells: 3,
|
|
10977
|
+
extraPx
|
|
10978
|
+
}));
|
|
10787
10979
|
const boxes = (item.result?.images?.length ?? 0) + (hostImagePathOf(item) === void 0 ? 0 : 1);
|
|
10788
10980
|
if (boxes > 0) acc = add(acc, {
|
|
10789
10981
|
px: boxes * 12 * m.line,
|
|
@@ -10872,7 +11064,13 @@ function blockHeight(block, m) {
|
|
|
10872
11064
|
const plan = planRun(block.run);
|
|
10873
11065
|
if (plan.kind === "call") return itemHeight(plan.item, m);
|
|
10874
11066
|
const busy = plan.items.some((item) => item.status === "running" || item.status === "pending");
|
|
10875
|
-
|
|
11067
|
+
const elapsed = runStartedAt(plan.items) === void 0 ? "" : ELAPSED_WIDEST;
|
|
11068
|
+
let acc = rowH(runSummary(plan.items, busy) + elapsed, m);
|
|
11069
|
+
for (const line of runTailLines(plan.items)) acc = add(acc, rowH(line || " ", m, {
|
|
11070
|
+
indentCells: 3,
|
|
11071
|
+
gutterCells: 3
|
|
11072
|
+
}));
|
|
11073
|
+
return acc;
|
|
10876
11074
|
}
|
|
10877
11075
|
return itemHeight(block.item, m);
|
|
10878
11076
|
}
|
|
@@ -12179,15 +12377,33 @@ function TranscriptItemView({ item, fileUrl, attachmentUrl, hostImage, terminal
|
|
|
12179
12377
|
function ToolCard({ item, hostImage }) {
|
|
12180
12378
|
const command = item.input?.command;
|
|
12181
12379
|
const copyable = typeof command === "string" ? command : item.result?.text ?? "";
|
|
12182
|
-
return /* @__PURE__ */
|
|
12183
|
-
actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
12184
|
-
|
|
12185
|
-
|
|
12186
|
-
|
|
12187
|
-
|
|
12380
|
+
return /* @__PURE__ */ jsxs(WithActions, {
|
|
12381
|
+
actions: /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
12382
|
+
canBackground(item) ? /* @__PURE__ */ jsx(BackgroundAction, { toolUseId: item.id }) : null,
|
|
12383
|
+
/* @__PURE__ */ jsx(BookmarkAction, { id: item.id }),
|
|
12384
|
+
copyable ? /* @__PURE__ */ jsx(CopyAction, {
|
|
12385
|
+
text: copyable,
|
|
12386
|
+
label: "Copy"
|
|
12387
|
+
}) : null
|
|
12388
|
+
] }),
|
|
12389
|
+
children: [/* @__PURE__ */ jsx(ToolCallCard, {
|
|
12188
12390
|
item,
|
|
12189
12391
|
hostImage
|
|
12190
|
-
})
|
|
12392
|
+
}), toolBusy(item) ? /* @__PURE__ */ jsx(LiveToolStrip, { item }) : null]
|
|
12393
|
+
});
|
|
12394
|
+
}
|
|
12395
|
+
function LiveToolStrip({ item }) {
|
|
12396
|
+
const now = useTicker(item.ts !== void 0);
|
|
12397
|
+
const elapsed = elapsedLabel(item.ts, now);
|
|
12398
|
+
const tail = liveTailLines(item);
|
|
12399
|
+
if (!elapsed && tail.length === 0) return null;
|
|
12400
|
+
return /* @__PURE__ */ jsxs("div", {
|
|
12401
|
+
"data-slot": "tool-live",
|
|
12402
|
+
className: "mt-1 text-label text-fg-4",
|
|
12403
|
+
children: [elapsed ? /* @__PURE__ */ jsxs("div", { children: ["running ", elapsed] }) : null, tail.length > 0 ? /* @__PURE__ */ jsx("pre", {
|
|
12404
|
+
className: "overflow-x-auto font-mono whitespace-pre-wrap text-fg-3",
|
|
12405
|
+
children: tail.join("\n")
|
|
12406
|
+
}) : null]
|
|
12191
12407
|
});
|
|
12192
12408
|
}
|
|
12193
12409
|
function ShellCard({ item }) {
|
|
@@ -13128,7 +13344,7 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13128
13344
|
const controlsExternal = controlsSurface === "external" || controlsInStatus;
|
|
13129
13345
|
const [protocolError, setProtocolError] = useState(void 0);
|
|
13130
13346
|
const [panel, setPanel] = useState();
|
|
13131
|
-
const { state, connection, replaying, protocolMismatch, shell, pricing, models, effectiveModel, handle, send, runShell, approve, deny, interrupt, clearContext, setModel, setPermissionMode, reconnectNow, loadFullResult, loadShellOutput, verifyShell, killShell, setShellAgentWrite } = useClaudeSession(client, sessionId, {
|
|
13347
|
+
const { state, connection, replaying, protocolMismatch, shell, pricing, models, effectiveModel, handle, send, runShell, approve, deny, interrupt, backgroundTask, clearContext, setModel, setEffort, setPermissionMode, reconnectNow, loadFullResult, loadShellOutput, verifyShell, killShell, setShellAgentWrite } = useClaudeSession(client, sessionId, {
|
|
13132
13348
|
onProtocolError: setProtocolError,
|
|
13133
13349
|
cacheTranscript
|
|
13134
13350
|
});
|
|
@@ -13213,19 +13429,29 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13213
13429
|
state.session?.subagents
|
|
13214
13430
|
]);
|
|
13215
13431
|
const hasModels = models.length > 0;
|
|
13432
|
+
const efforts = useMemo(() => effortChoices(models, effectiveModel ?? state.model, capabilities), [
|
|
13433
|
+
models,
|
|
13434
|
+
effectiveModel,
|
|
13435
|
+
state.model,
|
|
13436
|
+
capabilities
|
|
13437
|
+
]);
|
|
13216
13438
|
const clientCommands = useMemo(() => buildClientCommands({
|
|
13217
13439
|
capabilities,
|
|
13218
13440
|
hasModels,
|
|
13441
|
+
efforts,
|
|
13219
13442
|
setModel,
|
|
13443
|
+
setEffort,
|
|
13220
13444
|
setPermissionMode,
|
|
13221
13445
|
clearContext,
|
|
13222
13446
|
openPanel
|
|
13223
13447
|
}), [
|
|
13224
13448
|
capabilities,
|
|
13225
13449
|
hasModels,
|
|
13450
|
+
efforts,
|
|
13226
13451
|
openPanel,
|
|
13227
13452
|
clearContext,
|
|
13228
13453
|
setModel,
|
|
13454
|
+
setEffort,
|
|
13229
13455
|
setPermissionMode
|
|
13230
13456
|
]);
|
|
13231
13457
|
const composerCommands = useMemo(() => composerCommandRows(mergeComposerRows({
|
|
@@ -13250,6 +13476,8 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13250
13476
|
capabilities: state.capabilities,
|
|
13251
13477
|
model: vitalsModel,
|
|
13252
13478
|
models,
|
|
13479
|
+
effort: state.effort,
|
|
13480
|
+
efforts,
|
|
13253
13481
|
permissionMode: state.permissionMode,
|
|
13254
13482
|
permissionModes,
|
|
13255
13483
|
skills: state.skills,
|
|
@@ -13272,16 +13500,19 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13272
13500
|
onControlsRef.current = onControls;
|
|
13273
13501
|
const setters = useRef({
|
|
13274
13502
|
setModel,
|
|
13503
|
+
setEffort,
|
|
13275
13504
|
setPermissionMode,
|
|
13276
13505
|
interrupt
|
|
13277
13506
|
});
|
|
13278
13507
|
setters.current = {
|
|
13279
13508
|
setModel,
|
|
13509
|
+
setEffort,
|
|
13280
13510
|
setPermissionMode,
|
|
13281
13511
|
interrupt
|
|
13282
13512
|
};
|
|
13283
13513
|
const controls = useRef({
|
|
13284
13514
|
setModel: (model) => setters.current.setModel(model),
|
|
13515
|
+
setEffort: (effort) => setters.current.setEffort(effort),
|
|
13285
13516
|
setPermissionMode: (mode) => setters.current.setPermissionMode(mode),
|
|
13286
13517
|
interrupt: () => setters.current.interrupt(),
|
|
13287
13518
|
focusComposer: () => composerRef.current?.focus(),
|
|
@@ -13297,6 +13528,8 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13297
13528
|
has: (id) => bookmarkSet.has(id),
|
|
13298
13529
|
toggle: onToggleBookmark
|
|
13299
13530
|
} : void 0, [bookmarkSet, onToggleBookmark]);
|
|
13531
|
+
const canBackgroundTasks = !readOnly && capabilities.backgroundTasks === true;
|
|
13532
|
+
const taskControl = useMemo(() => canBackgroundTasks ? { background: backgroundTask } : void 0, [canBackgroundTasks, backgroundTask]);
|
|
13300
13533
|
const busy = state.status === "running" || state.status === "awaiting_approval";
|
|
13301
13534
|
const ended = state.status === "failed" || state.status === "closed";
|
|
13302
13535
|
const attachments = useAttachments(client, sessionId, {
|
|
@@ -13325,6 +13558,13 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13325
13558
|
repinTranscript.current?.();
|
|
13326
13559
|
send(text, attachmentIds);
|
|
13327
13560
|
};
|
|
13561
|
+
const foregroundSince = canBackgroundTasks ? backgroundableSince(state.items) : void 0;
|
|
13562
|
+
const tick = useTicker(foregroundSince !== void 0);
|
|
13563
|
+
const runningForeground = foregroundSince !== void 0 && tick - foregroundSince >= 5e3;
|
|
13564
|
+
const handleSendNow = (text, attachmentIds) => {
|
|
13565
|
+
handleSend(text, attachmentIds);
|
|
13566
|
+
backgroundTask();
|
|
13567
|
+
};
|
|
13328
13568
|
const menuShows = {
|
|
13329
13569
|
context: capabilities.contextUsage,
|
|
13330
13570
|
usage: capabilities.rateLimits,
|
|
@@ -13352,20 +13592,30 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13352
13592
|
onOpenChange: (next) => setPanel(next ? target : void 0)
|
|
13353
13593
|
});
|
|
13354
13594
|
const headerTakesActions = typeof header === "function";
|
|
13355
|
-
const sessionControls = /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
13356
|
-
models,
|
|
13357
|
-
|
|
13358
|
-
|
|
13359
|
-
|
|
13360
|
-
|
|
13361
|
-
|
|
13362
|
-
|
|
13363
|
-
|
|
13364
|
-
|
|
13365
|
-
|
|
13366
|
-
|
|
13367
|
-
|
|
13368
|
-
|
|
13595
|
+
const sessionControls = /* @__PURE__ */ jsxs(Fragment$1, { children: [
|
|
13596
|
+
models.length ? /* @__PURE__ */ jsx(ModelSelect, {
|
|
13597
|
+
models,
|
|
13598
|
+
model: effectiveModel,
|
|
13599
|
+
onModelChange: setModel,
|
|
13600
|
+
disabled: ended,
|
|
13601
|
+
className: controlsInStatus ? "h-5" : void 0
|
|
13602
|
+
}) : null,
|
|
13603
|
+
efforts.length && state.effort !== null ? /* @__PURE__ */ jsx(EffortSelect, {
|
|
13604
|
+
efforts,
|
|
13605
|
+
effort: state.effort,
|
|
13606
|
+
onEffortChange: setEffort,
|
|
13607
|
+
disabled: ended,
|
|
13608
|
+
className: controlsInStatus ? "h-5" : void 0
|
|
13609
|
+
}) : null,
|
|
13610
|
+
state.permissionMode ? /* @__PURE__ */ jsx(PermissionModeSelect, {
|
|
13611
|
+
mode: state.permissionMode,
|
|
13612
|
+
onModeChange: setPermissionMode,
|
|
13613
|
+
modes: capabilities.permissionModes,
|
|
13614
|
+
canBypass: state.session?.canBypassPermissions,
|
|
13615
|
+
disabled: ended,
|
|
13616
|
+
className: controlsInStatus ? "h-5" : void 0
|
|
13617
|
+
}) : null
|
|
13618
|
+
] });
|
|
13369
13619
|
const statusBar = statusExternal ? null : /* @__PURE__ */ jsx(StatusBar, {
|
|
13370
13620
|
state,
|
|
13371
13621
|
rateLimits,
|
|
@@ -13460,31 +13710,34 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13460
13710
|
fontSize: cell.fontSize
|
|
13461
13711
|
}, framedShellId) : /* @__PURE__ */ jsx(BookmarkProvider, {
|
|
13462
13712
|
value: bookmarkHandle,
|
|
13463
|
-
children: /* @__PURE__ */ jsx(
|
|
13464
|
-
|
|
13465
|
-
|
|
13466
|
-
|
|
13467
|
-
|
|
13468
|
-
|
|
13469
|
-
|
|
13470
|
-
|
|
13471
|
-
|
|
13472
|
-
|
|
13473
|
-
|
|
13474
|
-
|
|
13475
|
-
|
|
13476
|
-
|
|
13477
|
-
|
|
13478
|
-
|
|
13479
|
-
|
|
13480
|
-
|
|
13481
|
-
|
|
13482
|
-
|
|
13483
|
-
|
|
13484
|
-
|
|
13485
|
-
|
|
13486
|
-
|
|
13487
|
-
|
|
13713
|
+
children: /* @__PURE__ */ jsx(TaskControlProvider, {
|
|
13714
|
+
value: taskControl,
|
|
13715
|
+
children: /* @__PURE__ */ jsx(Transcript, {
|
|
13716
|
+
state,
|
|
13717
|
+
fileUrl: sessionId ? (path) => client.sessionFileUrl(sessionId, path) : void 0,
|
|
13718
|
+
attachmentUrl: sessionId ? (id) => client.attachmentUrl(sessionId, id) : void 0,
|
|
13719
|
+
canBrowseFiles: hostFiles.available,
|
|
13720
|
+
sessionNames: peers.names,
|
|
13721
|
+
hostImage,
|
|
13722
|
+
variant: transcriptVariant,
|
|
13723
|
+
...cell,
|
|
13724
|
+
affordances,
|
|
13725
|
+
stickyPrompt,
|
|
13726
|
+
scrubber,
|
|
13727
|
+
bookmarks,
|
|
13728
|
+
replaying,
|
|
13729
|
+
catchUp: catchUp && newCount > 0 ? {
|
|
13730
|
+
from: catchUp.itemCount,
|
|
13731
|
+
since: catchUp.since
|
|
13732
|
+
} : void 0,
|
|
13733
|
+
reveal: frameReturnReveal ?? reveal,
|
|
13734
|
+
frame: subagentId === void 0 ? void 0 : { parentToolUseId: subagentId },
|
|
13735
|
+
onOpenSubagent: enterSubagent,
|
|
13736
|
+
emptyState,
|
|
13737
|
+
jumpToRecapRef: jumpToRecap,
|
|
13738
|
+
repinRef: repinTranscript
|
|
13739
|
+
}, subagentId ?? "session")
|
|
13740
|
+
})
|
|
13488
13741
|
}),
|
|
13489
13742
|
catchUp && newCount > 0 && !replaying && subagentId === void 0 && framedShellId === void 0 ? /* @__PURE__ */ jsx(CatchUpBanner, {
|
|
13490
13743
|
count: newCount,
|
|
@@ -13505,6 +13758,7 @@ function SessionPanel({ client, sessionId, header, panelSurface = "internal", st
|
|
|
13505
13758
|
readOnly || subagentId !== void 0 || framedShellId !== void 0 ? null : /* @__PURE__ */ jsx(Fragment$1, { children: /* @__PURE__ */ jsx(Composer, {
|
|
13506
13759
|
ref: composerRef,
|
|
13507
13760
|
onSend: handleSend,
|
|
13761
|
+
onSendNow: runningForeground ? handleSendNow : void 0,
|
|
13508
13762
|
onInterrupt: interrupt,
|
|
13509
13763
|
busy,
|
|
13510
13764
|
disabled: ended || !sessionId,
|
|
@@ -13733,6 +13987,6 @@ function resolveAgainstCwd(path, cwd) {
|
|
|
13733
13987
|
return parseFileLink(path, cwd)?.path ?? path;
|
|
13734
13988
|
}
|
|
13735
13989
|
//#endregion
|
|
13736
|
-
export {
|
|
13990
|
+
export { Composer as $, Splitter as $t, PermissionPrompt as A, badgeVariants as An, WithActions as At, EffortSelect as B, mergeComposerRows as Bt, SessionInfoDialog as C, SelectItemText as Cn, previewPatch as Ct, QUESTION_BEHAVIORS as D, Textarea as Dn, Row as Dt, TerminalPermissionPrompt as E, PortalScope as En, Ink as Et, SubagentStrip as F, isMutatingTool as Ft, McpPanel as G, hashtagTrigger as Gt, ModelSelect as H, rankPeerSessions as Ht, PERMISSION_MODES as I, toolIcon as It, HostFilesDialog as J, usePromptAreaState as Jt, McpPanelActions as K, launchTrigger as Kt, PermissionModeSelect as L, TranscriptVariantProvider as Lt, useShellFrame as M, buttonVariants as Mn, PromptTokenText as Mt, ShellTerminal as N, cn as Nn, SessionNamesProvider as Nt, QuestionPrompt as O, Input as On, AgentWriteIcon as Ot, ShellStrip as P, SkillNamesProvider as Pt, contextNote as Q, ProgressRing as Qt, permissionModeChoices as R, useTranscriptVariant as Rt, STATUS_META as S, SelectItem as Sn, TerminalDiff as St, TerminalQuestionPrompt as T, SelectValue as Tn, Blank as Tt, SkillsDialog as U, skillPrompt as Ut, effortChoices as V, rankComposerRows as Vt, McpDialog as W, commandTrigger as Wt, ContextDialog as X, plainTextToSegments as Xt, EntryIcon as Y, PromptArea as Yt, ContextPanel as Z, segmentsToPlainText as Zt, Loader as _, MenuSeparator as _n, ViewableImage as _t, UsageDialog as a, TooltipContent as an, SHELL_KILL_GLYPH as at, ConversationScrollButton as b, Select$1 as bn, useFileLinks as bt, TerminalTranscript as c, DialogBody as cn, shellInfoFailed as ct, Reasoning as d, DialogHeader as dn, shellTitle as dt, CodeBlock as en, TerminalSurface as et, Message as f, DialogRow as fn, ToolTitleProvider as ft, SessionEmptyState as g, MenuItem as gn, ImageViewerProvider as gt, TerminalItemView as h, MenuContent as hn, ImageViewer as ht, SessionPanel as i, Tip as in, SHELL_GLYPH as it, Response as j, Button as jn, useAffordances as jt, parseUserQuestions as k, Badge as kn, CopyAction as kt, Transcript as l, DialogClose as ln, shellInfoLabel as lt, FileCard as m, Menu$1 as mn, TerminalMarkdown as mt, usePathLinks as n, CopyButton as nn, useShellActions as nt, UsageMeters as o, TooltipProvider as on, shellAgentWriteLabel as ot, MessageContent as p, DialogTrigger as pn, useToolTitle as pt, useMcpPanel as q, mentionTrigger as qt, matchPath as r, copyText as rn, SHELL_AGENT_WRITE_NOTE as rt, useMinuteClock as s, Dialog$1 as sn, shellGrantable as st, resolveAgainstCwd as t, Spinner as tn, ShellActionsProvider as tt, ToolCallCard as u, DialogContent as un, shellInfoStatusText as ut, Conversation as v, MenuTrigger as vn, useOpenImage as vt, SessionInfoPanel as w, SelectTrigger as wn, Band as wt, StatusBar as x, SelectContent as xn, parseFileLink as xt, ConversationContent as y, OptionSelect as yn, FileLinkProvider as yt, permissionModeMeta as z, matchClientCommand as zt };
|
|
13737
13991
|
|
|
13738
|
-
//# sourceMappingURL=use-path-links-
|
|
13992
|
+
//# sourceMappingURL=use-path-links-WCsysQPy.mjs.map
|