@mcp-b/react-components 0.20.0 → 0.20.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (156) hide show
  1. package/dist/{AgentChat-CaQaT0LF.d.ts → AgentChat-C-ZyXbJz.d.ts} +3 -0
  2. package/dist/{CodeBlock-Bb-IPBc_.js → CodeBlock-ygtuzqJd.js} +1 -1
  3. package/dist/{FileTree-CUlXfnmc.js → FileTree-CdgfccsM.js} +5 -5
  4. package/dist/{Message-rZEaaD8Q.js → Message-DzuteocT.js} +4 -3
  5. package/dist/{ModelSelector-4GsCWcZV.js → ModelSelector-pecWyOFI.js} +4 -3
  6. package/dist/{ThinkChat-15EhfvYJ.js → ThinkChat-E_HrfH76.js} +15 -6
  7. package/dist/{ThinkChatActivity-CnIJPvV5.d.ts → ThinkChatActivity-CdbL0aoA.d.ts} +1 -1
  8. package/dist/{WorkspaceFileView-CEdArlOT.js → WorkspaceFileView-Bxx4wEzJ.js} +5 -11
  9. package/dist/components/Accordion.js +4 -4
  10. package/dist/components/Activity.js +2 -2
  11. package/dist/components/AgentActivity.js +1 -1
  12. package/dist/components/AgentActivityPreview.js +1 -1
  13. package/dist/components/AgentAttention.js +2 -2
  14. package/dist/components/AgentChat.d.ts +1 -1
  15. package/dist/components/AgentChat.js +8 -6
  16. package/dist/components/AgentConnection.js +2 -2
  17. package/dist/components/AgentMessageParts.js +1 -1
  18. package/dist/components/AgentToolDetail.js +2 -2
  19. package/dist/components/AlertDialog.js +8 -8
  20. package/dist/components/AppTopBar.js +1 -1
  21. package/dist/components/Approval.js +1 -1
  22. package/dist/components/Artifact.js +1 -1
  23. package/dist/components/Autocomplete.js +11 -11
  24. package/dist/components/Avatar.js +6 -6
  25. package/dist/components/BrowserLiveView.js +2 -2
  26. package/dist/components/BrowserReplay.js +4 -7
  27. package/dist/components/BrowserRunPanel.js +2 -2
  28. package/dist/components/Card.js +8 -11
  29. package/dist/components/ChainOfThought.js +2 -2
  30. package/dist/components/ChatGptSignInScreen.js +2 -2
  31. package/dist/components/Checkbox.js +2 -2
  32. package/dist/components/CheckboxGroup.js +7 -7
  33. package/dist/components/Checkpoint.js +1 -1
  34. package/dist/components/CodeBlock.js +1 -1
  35. package/dist/components/CodexModelSelector.js +5 -4
  36. package/dist/components/Collapsible.js +2 -2
  37. package/dist/components/Combobox.js +11 -11
  38. package/dist/components/Commit.js +4 -4
  39. package/dist/components/Context.js +3 -1
  40. package/dist/components/ContextMenu.js +13 -13
  41. package/dist/components/Conversation.js +3 -8
  42. package/dist/components/Dialog.js +6 -6
  43. package/dist/components/EnvironmentVariables.js +3 -3
  44. package/dist/components/Field.js +7 -7
  45. package/dist/components/Fieldset.js +3 -3
  46. package/dist/components/FileTree.js +1 -1
  47. package/dist/components/Form.js +1 -1
  48. package/dist/components/InlineCitation.js +2 -2
  49. package/dist/components/Input.js +1 -1
  50. package/dist/components/Label.js +2 -1
  51. package/dist/components/McpConnectionRequest.js +1 -1
  52. package/dist/components/McpServerPicker.js +3 -3
  53. package/dist/components/MediaPreviewCard.js +5 -4
  54. package/dist/components/Menu.js +17 -17
  55. package/dist/components/Menubar.js +14 -14
  56. package/dist/components/Message.js +1 -1
  57. package/dist/components/MessageScroller.js +1 -1
  58. package/dist/components/Meter.js +5 -5
  59. package/dist/components/ModelSelector.js +1 -1
  60. package/dist/components/NaniteScene.js +2 -1
  61. package/dist/components/NavigationMenu.js +11 -11
  62. package/dist/components/NumberField.js +6 -6
  63. package/dist/components/Plan.js +1 -1
  64. package/dist/components/Popover.js +12 -14
  65. package/dist/components/PreviewCard.js +6 -6
  66. package/dist/components/PricingPage.js +2 -1
  67. package/dist/components/PricingPlanCard.js +1 -1
  68. package/dist/components/Progress.js +4 -4
  69. package/dist/components/PromptInput.js +10 -12
  70. package/dist/components/Queue.js +1 -1
  71. package/dist/components/RadioGroup.js +4 -4
  72. package/dist/components/Reasoning.js +2 -2
  73. package/dist/components/ResizableSidePanel.js +3 -5
  74. package/dist/components/ResponsiveSidebarShell.js +4 -3
  75. package/dist/components/ScrollArea.js +6 -6
  76. package/dist/components/SearchField.js +1 -1
  77. package/dist/components/Select.js +15 -15
  78. package/dist/components/Slider.js +7 -7
  79. package/dist/components/Sources.js +2 -2
  80. package/dist/components/Stepper.js +1 -1
  81. package/dist/components/SubagentRunDetails.js +2 -1
  82. package/dist/components/SubagentRunIndicator.js +1 -1
  83. package/dist/components/SubagentRunSelector.js +1 -1
  84. package/dist/components/Switch.js +3 -3
  85. package/dist/components/Tabs.js +2 -2
  86. package/dist/components/Task.js +2 -2
  87. package/dist/components/Terminal.js +2 -2
  88. package/dist/components/TestResults.js +3 -3
  89. package/dist/components/ThemeModeControl.js +1 -1
  90. package/dist/components/ThinkChat.d.ts +12 -3
  91. package/dist/components/ThinkChat.js +1 -1
  92. package/dist/components/ThinkChatActivity.d.ts +1 -1
  93. package/dist/components/ThinkChatActivity.js +2 -1
  94. package/dist/components/ThinkChatActivitySummary.js +17 -4
  95. package/dist/components/ThinkChatToolPanels.js +10 -5
  96. package/dist/components/ThinkExecutionDetail.js +1 -1
  97. package/dist/components/ThinkExecutionStatus.js +1 -1
  98. package/dist/components/ThinkExecutionWorkbench.js +2 -2
  99. package/dist/components/ThinkFullApp.js +6 -76
  100. package/dist/components/ThinkPendingApproval.js +1 -3
  101. package/dist/components/ThinkRoutine.d.ts +1 -1
  102. package/dist/components/ThinkRoutine.js +2 -1
  103. package/dist/components/ThinkRoutineBrowser.js +9 -9
  104. package/dist/components/ThinkRoutineDetail.js +1 -1
  105. package/dist/components/ThinkRoutineForm.js +1 -1
  106. package/dist/components/ThinkRoutineLibrary.js +1 -1
  107. package/dist/components/ThinkThreadPicker.js +3 -3
  108. package/dist/components/ThinkThreadShell.js +2 -1
  109. package/dist/components/Toast.js +6 -6
  110. package/dist/components/ToggleGroup.js +2 -2
  111. package/dist/components/Tooltip.js +4 -4
  112. package/dist/components/WebPreview.js +1 -1
  113. package/dist/components/WorkspaceBrowser.js +1 -1
  114. package/dist/components/WorkspaceExplorer.js +2 -2
  115. package/dist/components/WorkspaceFileView.js +1 -1
  116. package/dist/components/WorkspaceHeader.js +1 -1
  117. package/dist/components/icons.js +1 -1
  118. package/dist/{copy-button-BtRwhRks.js → copy-button-vo1paUSi.js} +1 -1
  119. package/dist/format-S6uWyoSb.js +38 -0
  120. package/dist/{icons-DKXiSepE.js → icons-DyOM0EJs.js} +2 -1
  121. package/dist/{merge-refs-KlanQB7A.js → merge-refs-DF_7w2x_.js} +1 -1
  122. package/dist/styles/activity-header.css +0 -3
  123. package/dist/styles/activity.css +1 -1
  124. package/dist/styles/agent-attention.css +0 -7
  125. package/dist/styles/agent-connection.css +1 -1
  126. package/dist/styles/app-top-bar.css +2 -5
  127. package/dist/styles/browser-live-view.css +1 -10
  128. package/dist/styles/browser-run-panel.css +2 -11
  129. package/dist/styles/chain-of-thought.css +2 -14
  130. package/dist/styles/checkbox-group.css +0 -6
  131. package/dist/styles/codex-model-selector.css +0 -6
  132. package/dist/styles/commit.css +1 -7
  133. package/dist/styles/environment-variables.css +0 -3
  134. package/dist/styles/file-tree.css +1 -1
  135. package/dist/styles/inline-citation.css +1 -4
  136. package/dist/styles/mcp-server-picker.css +0 -3
  137. package/dist/styles/message.css +0 -6
  138. package/dist/styles/model-selector.css +1 -1
  139. package/dist/styles/prompt-input.css +3 -34
  140. package/dist/styles/queue.css +1 -1
  141. package/dist/styles/recipes.css +2 -2
  142. package/dist/styles/sources.css +1 -4
  143. package/dist/styles/stepper.css +1 -7
  144. package/dist/styles/subagent-run.css +0 -3
  145. package/dist/styles/task.css +1 -1
  146. package/dist/styles/test-results.css +2 -17
  147. package/dist/styles/theme-mode-control.css +1 -1
  148. package/dist/styles/think-execution-status.css +1 -7
  149. package/dist/styles/think-execution-workbench.css +0 -3
  150. package/dist/styles/think-full-app.css +0 -3
  151. package/dist/styles/think-thread-picker.css +2 -14
  152. package/dist/styles/toggle-group.css +1 -1
  153. package/dist/styles/utilities.css +6 -2
  154. package/dist/styles/workspace-explorer.css +1 -1
  155. package/dist/view-transitions-DyUP0lSg.js +77 -0
  156. package/package.json +2 -2
@@ -1,12 +1,13 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
- import { S as FileIcon, X as TerminalIcon, d as ChevronDownIcon } from "../icons-DKXiSepE.js";
2
+ import { S as FileIcon, X as TerminalIcon, d as ChevronDownIcon } from "../icons-DyOM0EJs.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { a as WorkspaceNavigationRestorationBoundary, i as WorkspaceNavigationFocusRestorer, n as WorkspaceNavigationProvider } from "../WorkspaceLink-BYYeTQLf.js";
5
+ import { n as mergeRefs } from "../merge-refs-DF_7w2x_.js";
5
6
  import { AppTopBar } from "./AppTopBar.js";
6
- import { c as resolveThinkApprovalProps, s as useThinkPendingExecutionApprovals, t as ThinkChat } from "../ThinkChat-15EhfvYJ.js";
7
- import { t as mergeRefs } from "../merge-refs-KlanQB7A.js";
7
+ import { c as resolveThinkApprovalProps, s as useThinkPendingExecutionApprovals, t as ThinkChat } from "../ThinkChat-E_HrfH76.js";
8
8
  import { useWorkspace } from "./Workspace.js";
9
9
  import { WorkspaceExplorer } from "./WorkspaceExplorer.js";
10
+ import { n as runViewTransition } from "../view-transitions-DyUP0lSg.js";
10
11
  import { ResizableSidePanel } from "./ResizableSidePanel.js";
11
12
  import { ThinkExecutionWorkbench } from "./ThinkExecutionWorkbench.js";
12
13
  import { ThinkFullAppViewSwitch } from "./ThinkFullAppViewSwitch.js";
@@ -15,77 +16,6 @@ import { ThinkThreadShell } from "./ThinkThreadShell.js";
15
16
  import * as React from "react";
16
17
  import { jsx, jsxs } from "react/jsx-runtime";
17
18
  import { useAgentToolEvents } from "agents/react";
18
- import { flushSync } from "react-dom";
19
- //#region src/components/_internal/view-transitions.ts
20
- let documentScopeSequence = 0;
21
- let restoreActiveDocumentScope = null;
22
- function motionIsReduced() {
23
- if (typeof document === "undefined") return true;
24
- if (document.documentElement.dataset.motion === "reduce") return true;
25
- return window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
26
- }
27
- function isReactTestEnvironment() {
28
- return globalThis.IS_REACT_ACT_ENVIRONMENT;
29
- }
30
- function scopeDocumentTransition(scope) {
31
- if (!(scope instanceof HTMLElement || scope instanceof SVGElement)) return null;
32
- restoreActiveDocumentScope?.();
33
- const rootStyle = document.documentElement.style;
34
- const scopeStyle = scope.style;
35
- const rootValue = rootStyle.getPropertyValue("view-transition-name");
36
- const rootPriority = rootStyle.getPropertyPriority("view-transition-name");
37
- const scopeValue = scopeStyle.getPropertyValue("view-transition-name");
38
- const scopePriority = scopeStyle.getPropertyPriority("view-transition-name");
39
- rootStyle.setProperty("view-transition-name", "none", "important");
40
- scopeStyle.setProperty("view-transition-name", `sigvelo-transition-scope-${++documentScopeSequence}`, "important");
41
- let active = true;
42
- const restore = () => {
43
- if (!active) return;
44
- active = false;
45
- if (rootValue) rootStyle.setProperty("view-transition-name", rootValue, rootPriority);
46
- else rootStyle.removeProperty("view-transition-name");
47
- if (scopeValue) scopeStyle.setProperty("view-transition-name", scopeValue, scopePriority);
48
- else scopeStyle.removeProperty("view-transition-name");
49
- if (restoreActiveDocumentScope === restore) restoreActiveDocumentScope = null;
50
- };
51
- restoreActiveDocumentScope = restore;
52
- return restore;
53
- }
54
- /**
55
- * Runs one synchronous React update inside the narrowest supported native view
56
- * transition. Unsupported and reduced-motion environments commit immediately.
57
- */
58
- function runViewTransition({ scope, update }) {
59
- let committed = false;
60
- const commitOnce = () => {
61
- if (committed) return;
62
- committed = true;
63
- flushSync(update);
64
- };
65
- if (typeof document === "undefined" || motionIsReduced() || isReactTestEnvironment()) {
66
- commitOnce();
67
- return null;
68
- }
69
- const scopedHost = scope;
70
- const documentHost = document;
71
- const useScopedHost = typeof scopedHost?.startViewTransition === "function";
72
- const host = useScopedHost ? scopedHost : typeof documentHost.startViewTransition === "function" ? documentHost : null;
73
- if (!host?.startViewTransition) {
74
- commitOnce();
75
- return null;
76
- }
77
- const restoreDocumentScope = useScopedHost ? null : scopeDocumentTransition(scope);
78
- try {
79
- const transition = host.startViewTransition(commitOnce);
80
- if (restoreDocumentScope) transition.finished.finally(restoreDocumentScope).catch(() => void 0);
81
- return transition;
82
- } catch {
83
- restoreDocumentScope?.();
84
- commitOnce();
85
- return null;
86
- }
87
- }
88
- //#endregion
89
19
  //#region src/components/ThinkFullApp.tsx
90
20
  const workbenchPanelDefaultWidth = 340;
91
21
  const workbenchPanelMinWidth = 300;
@@ -113,7 +43,7 @@ function ThinkFullApp({ agent, appBarActions, appBarLeading, appBarTitle, chat,
113
43
  const appRef = React.useRef(null);
114
44
  const viewScopeRef = React.useRef(null);
115
45
  const workbenchPanelRef = React.useRef(null);
116
- const approvals = useThinkPendingExecutionApprovals(agent.stub, sourceKey, `${chat.messages.length}:${chat.status}`);
46
+ const approvals = useThinkPendingExecutionApprovals(agent.stub, sourceKey, `${chat.messages.length}:${chat.status}`, messages?.approvalsEnabled !== false);
117
47
  const resolvedMessages = React.useMemo(() => {
118
48
  const approvalProps = resolveThinkApprovalProps({
119
49
  thinkStub: messages?.thinkStub,
@@ -231,7 +161,7 @@ function ThinkFullApp({ agent, appBarActions, appBarLeading, appBarTitle, chat,
231
161
  onClick: (event) => sidebarControls.toggleSidebar(event.currentTarget),
232
162
  children: [
233
163
  /* @__PURE__ */ jsx("span", {
234
- className: "think-full-app__thread-trigger-title",
164
+ className: "think-full-app__thread-trigger-title sigvelo-truncate",
235
165
  children: appBarTitle ?? "Threads"
236
166
  }),
237
167
  threadStatusSummary ? /* @__PURE__ */ jsx(ThinkThreadStatusIndicators, { summary: threadStatusSummary }) : null,
@@ -1,3 +1,4 @@
1
+ import { i as titleCase } from "../format-S6uWyoSb.js";
1
2
  import { Approval, ApprovalCount, ApprovalDecision, ApprovalHeader, ApprovalInputPreview, ApprovalPreview, ApprovalPreviewRow, ApprovalQuestion, formatApprovalValue } from "./Approval.js";
2
3
  import "react";
3
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -10,9 +11,6 @@ function getPausedExecution(part) {
10
11
  const output = getToolOutput(part);
11
12
  return output?.status === "paused" && typeof output.executionId === "string" ? output : void 0;
12
13
  }
13
- function titleCase(value) {
14
- return value.split("-").map((word) => `${word.charAt(0).toUpperCase()}${word.slice(1)}`).join(" ");
15
- }
16
14
  /**
17
15
  * Durable Think approval adapter. It renders the complete upstream descriptor
18
16
  * and resolves only through the full Think stub's idempotent execution RPCs.
@@ -31,6 +31,6 @@ interface ThinkRoutineCreateRequest {
31
31
  /** Whole upstream task, including prompt functions and handler tasks. */
32
32
  task: ThinkScheduledTask;
33
33
  }
34
- declare function getThinkRoutineNextRun(routine: ThinkRoutine): string;
34
+ declare function getThinkRoutineNextRun(routine: ThinkRoutine): string | null;
35
35
  //#endregion
36
36
  export { ThinkRoutine, ThinkRoutineCreateRequest, ThinkRoutineOwner, ThinkRoutineRunOf, getThinkRoutineNextRun };
@@ -1,7 +1,8 @@
1
1
  //#region src/components/ThinkRoutine.ts
2
2
  function getThinkRoutineNextRun(routine) {
3
+ if (!routine.schedule) return null;
3
4
  if (!routine.enabled) return "Paused";
4
- return routine.schedule ? formatThinkExecutionDate(routine.schedule.time * 1e3, "Not scheduled") : "Pending reconciliation";
5
+ return formatThinkExecutionDate(routine.schedule.time * 1e3, "Not scheduled");
5
6
  }
6
7
  function formatThinkExecutionDate(value, fallback) {
7
8
  const date = value instanceof Date ? value : new Date(value);
@@ -1,13 +1,14 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
- import { V as PlusIcon } from "../icons-DKXiSepE.js";
2
+ import { V as PlusIcon } from "../icons-DyOM0EJs.js";
3
3
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
4
4
  import { buttonVariants } from "./Button.js";
5
5
  import { Tooltip } from "./Tooltip.js";
6
+ import { t as capitalize } from "../format-S6uWyoSb.js";
6
7
  import { SearchField } from "./SearchField.js";
7
8
  import { ToggleGroup } from "./ToggleGroup.js";
8
9
  import { getThinkRoutineNextRun } from "./ThinkRoutine.js";
9
10
  import * as React from "react";
10
- import { jsx, jsxs } from "react/jsx-runtime";
11
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
11
12
  //#region src/components/ThinkRoutineBrowser.tsx
12
13
  function filterRoutines(routines, filter, query) {
13
14
  const normalizedQuery = query.trim().toLocaleLowerCase();
@@ -51,7 +52,7 @@ function ThinkRoutineBrowser({ className, routines, selectedRoutineId, showOwner
51
52
  ].map((value) => /* @__PURE__ */ jsx(ToggleGroup.Item, {
52
53
  type: "button",
53
54
  value,
54
- children: value.charAt(0).toUpperCase() + value.slice(1)
55
+ children: capitalize(value)
55
56
  }, value))
56
57
  }), createRoutineLink ? /* @__PURE__ */ jsxs(Tooltip.Root, { children: [/* @__PURE__ */ jsx(Tooltip.Trigger, {
57
58
  render: /* @__PURE__ */ jsx(NavigationLink, {
@@ -126,12 +127,11 @@ function ThinkRoutineBrowser({ className, routines, selectedRoutineId, showOwner
126
127
  children: [
127
128
  /* @__PURE__ */ jsx("strong", { children: routine.name }),
128
129
  /* @__PURE__ */ jsx("span", { children: routine.task.schedule }),
129
- /* @__PURE__ */ jsxs("small", { children: [
130
- showOwner ? `${routine.owner.name} · ` : null,
131
- "Next",
132
- " ",
133
- getThinkRoutineNextRun(routine)
134
- ] })
130
+ showOwner || routine.schedule ? /* @__PURE__ */ jsxs("small", { children: [
131
+ showOwner ? routine.owner.name : null,
132
+ showOwner && routine.schedule ? " · " : null,
133
+ routine.schedule ? /* @__PURE__ */ jsxs(Fragment, { children: ["Next ", getThinkRoutineNextRun(routine)] }) : null
134
+ ] }) : null
135
135
  ]
136
136
  })
137
137
  ]
@@ -71,7 +71,7 @@ function ThinkRoutineDetail({ busy = false, className, routine, showOwner = true
71
71
  className: "think-routine-library__facts",
72
72
  children: [
73
73
  /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "Repeats" }), /* @__PURE__ */ jsx("dd", { children: routine.task.schedule })] }),
74
- /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "Next run" }), /* @__PURE__ */ jsx("dd", { children: getThinkRoutineNextRun(routine) })] }),
74
+ routine.schedule ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "Next run" }), /* @__PURE__ */ jsx("dd", { children: getThinkRoutineNextRun(routine) })] }) : null,
75
75
  showOwner ? /* @__PURE__ */ jsxs("div", { children: [/* @__PURE__ */ jsx("dt", { children: "Agent" }), /* @__PURE__ */ jsx("dd", { children: routine.owner.name })] }) : null
76
76
  ]
77
77
  }),
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
- import { K as SpinnerIcon } from "../icons-DKXiSepE.js";
2
+ import { K as SpinnerIcon } from "../icons-DyOM0EJs.js";
3
3
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
4
4
  import { Button, buttonVariants } from "./Button.js";
5
5
  import { Field } from "./Field.js";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
- import { B as PlayIcon, K as SpinnerIcon, Q as WarningIcon, d as ChevronDownIcon, y as EllipsisIcon } from "../icons-DKXiSepE.js";
2
+ import { B as PlayIcon, K as SpinnerIcon, Q as WarningIcon, d as ChevronDownIcon, y as EllipsisIcon } from "../icons-DyOM0EJs.js";
3
3
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
4
4
  import { Button, buttonVariants } from "./Button.js";
5
5
  import { Menu } from "./Menu.js";
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
- import { K as SpinnerIcon, Q as WarningIcon, V as PlusIcon, _ as DotIcon, t as ArchiveIcon } from "../icons-DKXiSepE.js";
2
+ import { K as SpinnerIcon, Q as WarningIcon, V as PlusIcon, _ as DotIcon, t as ArchiveIcon } from "../icons-DyOM0EJs.js";
3
3
  import { t as NavigationLink } from "../navigation-link-Cob7KBlM.js";
4
4
  import { Button, buttonVariants } from "./Button.js";
5
5
  import { SearchField } from "./SearchField.js";
@@ -161,7 +161,7 @@ function ThinkThreadPicker({ threads, renderThreadLink, onCreate, onDelete, clas
161
161
  /* @__PURE__ */ jsxs("header", {
162
162
  className: "think-thread-picker__header",
163
163
  children: [/* @__PURE__ */ jsx("h2", {
164
- className: "think-thread-picker__title",
164
+ className: "think-thread-picker__title sigvelo-truncate",
165
165
  children: title
166
166
  }), /* @__PURE__ */ jsx(ThinkThreadStatusIndicators, { summary: statusSummary })]
167
167
  }),
@@ -210,7 +210,7 @@ function ThinkThreadPicker({ threads, renderThreadLink, onCreate, onDelete, clas
210
210
  }),
211
211
  "data-thread-status": thread.status,
212
212
  children: [/* @__PURE__ */ jsx("span", {
213
- className: "think-thread-picker__thread-title",
213
+ className: "think-thread-picker__thread-title sigvelo-truncate",
214
214
  children: thread.title
215
215
  }), statusLabel ? /* @__PURE__ */ jsx("span", {
216
216
  className: "think-thread-picker__thread-status",
@@ -1,3 +1,4 @@
1
+ import { t as cx } from "../class-names-BiMDVpUo.js";
1
2
  import { ResponsiveSidebarShell } from "./ResponsiveSidebarShell.js";
2
3
  import "react";
3
4
  import { jsx } from "react/jsx-runtime";
@@ -10,7 +11,7 @@ function ThinkThreadShell({ sidebar, sidebarOpen, defaultSidebarOpen, onSidebarO
10
11
  return /* @__PURE__ */ jsx(ResponsiveSidebarShell, {
11
12
  ...props,
12
13
  ref,
13
- className: ["think-thread-shell", className].filter(Boolean).join(" "),
14
+ className: cx("think-thread-shell", className),
14
15
  sidebar,
15
16
  sidebarLabel: "threads",
16
17
  sidebarOpen,
@@ -24,7 +24,7 @@ const ToastProvider = (props) => {
24
24
  * Container for displaying toasts.
25
25
  */
26
26
  function ToastViewport({ className, ref, ...props }) {
27
- const classes = mergeBaseClassName(["toast__viewport"].filter(Boolean).join(" "), className);
27
+ const classes = mergeBaseClassName("toast__viewport", className);
28
28
  return /* @__PURE__ */ jsx(Toast$1.Viewport, {
29
29
  ref,
30
30
  "data-slot": "toast-viewport",
@@ -36,7 +36,7 @@ function ToastViewport({ className, ref, ...props }) {
36
36
  * Individual toast wrapper.
37
37
  */
38
38
  function ToastRoot({ className, ref, ...props }) {
39
- const classes = mergeBaseClassName(["toast"].filter(Boolean).join(" "), className);
39
+ const classes = mergeBaseClassName("toast", className);
40
40
  return /* @__PURE__ */ jsx(Toast$1.Root, {
41
41
  ref,
42
42
  "data-slot": "toast",
@@ -48,7 +48,7 @@ function ToastRoot({ className, ref, ...props }) {
48
48
  * Container for the contents of a toast.
49
49
  */
50
50
  function ToastContent({ className, ref, ...props }) {
51
- const classes = mergeBaseClassName(["toast__content"].filter(Boolean).join(" "), className);
51
+ const classes = mergeBaseClassName("toast__content", className);
52
52
  return /* @__PURE__ */ jsx(Toast$1.Content, {
53
53
  ref,
54
54
  "data-slot": "toast-content",
@@ -60,7 +60,7 @@ function ToastContent({ className, ref, ...props }) {
60
60
  * Title that labels the toast. Renders an `<h2>` element.
61
61
  */
62
62
  function ToastTitle({ className, ref, ...props }) {
63
- const classes = mergeBaseClassName(["toast__title"].filter(Boolean).join(" "), className);
63
+ const classes = mergeBaseClassName("toast__title", className);
64
64
  return /* @__PURE__ */ jsx(Toast$1.Title, {
65
65
  ref,
66
66
  "data-slot": "toast-title",
@@ -72,7 +72,7 @@ function ToastTitle({ className, ref, ...props }) {
72
72
  * Description text for the toast. Renders a `<p>` element.
73
73
  */
74
74
  function ToastDescription({ className, ref, ...props }) {
75
- const classes = mergeBaseClassName(["toast__description"].filter(Boolean).join(" "), className);
75
+ const classes = mergeBaseClassName("toast__description", className);
76
76
  return /* @__PURE__ */ jsx(Toast$1.Description, {
77
77
  ref,
78
78
  "data-slot": "toast-description",
@@ -102,7 +102,7 @@ function ToastAction({ render, className, ref, ...props }) {
102
102
  * Close button that dismisses the toast.
103
103
  */
104
104
  function ToastClose({ className, ref, ...props }) {
105
- const classes = mergeBaseClassName(["toast__close"].filter(Boolean).join(" "), className);
105
+ const classes = mergeBaseClassName("toast__close", className);
106
106
  return /* @__PURE__ */ jsx(Toast$1.Close, {
107
107
  ref,
108
108
  "data-slot": "toast-close",
@@ -1,4 +1,4 @@
1
- import { n as mergeBaseClassName } from "../class-names-BiMDVpUo.js";
1
+ import { n as mergeBaseClassName, t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { toggleVariants } from "./Toggle.js";
3
3
  import * as React from "react";
4
4
  import { jsx } from "react/jsx-runtime";
@@ -44,7 +44,7 @@ function ToggleGroupRoot({ size = "md", spacing = 0, variant = "default", classN
44
44
  ...style,
45
45
  gap
46
46
  };
47
- const classes = mergeBaseClassName(["toggle-group", size !== "md" && `toggle-group--${size}`].filter(Boolean).join(" "), className);
47
+ const classes = mergeBaseClassName(cx("toggle-group", size !== "md" && `toggle-group--${size}`), className);
48
48
  const contextValue = React.useMemo(() => ({
49
49
  variant,
50
50
  size,
@@ -38,7 +38,7 @@ function TooltipTrigger(props) {
38
38
  });
39
39
  }
40
40
  function TooltipPositioner({ className, ref, ...props }) {
41
- const classes = mergeBaseClassName(["tooltip__positioner", "base-ui-positioner"].filter(Boolean).join(" "), className);
41
+ const classes = mergeBaseClassName("tooltip__positioner base-ui-positioner", className);
42
42
  return /* @__PURE__ */ jsx(Tooltip$1.Positioner, {
43
43
  ref,
44
44
  "data-slot": "tooltip-positioner",
@@ -47,7 +47,7 @@ function TooltipPositioner({ className, ref, ...props }) {
47
47
  });
48
48
  }
49
49
  function TooltipPopup({ className, ref, role = "tooltip", ...props }) {
50
- const classes = mergeBaseClassName(["tooltip__popup", "base-ui-popup"].filter(Boolean).join(" "), className);
50
+ const classes = mergeBaseClassName("tooltip__popup base-ui-popup", className);
51
51
  return /* @__PURE__ */ jsx(Tooltip$1.Popup, {
52
52
  ref,
53
53
  role,
@@ -62,7 +62,7 @@ function TooltipPopup({ className, ref, role = "tooltip", ...props }) {
62
62
  * positioner, popup, and this viewport when that behavior is needed.
63
63
  */
64
64
  function TooltipViewport({ className, ref, ...props }) {
65
- const classes = mergeBaseClassName(["tooltip__viewport"].filter(Boolean).join(" "), className);
65
+ const classes = mergeBaseClassName("tooltip__viewport", className);
66
66
  return /* @__PURE__ */ jsx(Tooltip$1.Viewport, {
67
67
  ref,
68
68
  "data-slot": "tooltip-viewport",
@@ -71,7 +71,7 @@ function TooltipViewport({ className, ref, ...props }) {
71
71
  });
72
72
  }
73
73
  function TooltipArrow({ className, ref, ...props }) {
74
- const classes = mergeBaseClassName(["tooltip__arrow"].filter(Boolean).join(" "), className);
74
+ const classes = mergeBaseClassName("tooltip__arrow", className);
75
75
  return /* @__PURE__ */ jsx(Tooltip$1.Arrow, {
76
76
  ref,
77
77
  "data-slot": "tooltip-arrow",
@@ -1,5 +1,5 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
- import { U as RefreshIcon, d as ChevronDownIcon, i as ArrowRightIcon, r as ArrowLeftIcon } from "../icons-DKXiSepE.js";
2
+ import { U as RefreshIcon, d as ChevronDownIcon, i as ArrowRightIcon, r as ArrowLeftIcon } from "../icons-DyOM0EJs.js";
3
3
  import { Button } from "./Button.js";
4
4
  import { Tooltip } from "./Tooltip.js";
5
5
  import { Badge } from "./Badge.js";
@@ -1,4 +1,4 @@
1
- import { i as FileTreeFolder, r as FileTreeFile, t as FileTree } from "../FileTree-CUlXfnmc.js";
1
+ import { i as FileTreeFolder, r as FileTreeFile, t as FileTree } from "../FileTree-CdgfccsM.js";
2
2
  import { SearchField } from "./SearchField.js";
3
3
  import { WorkspaceHeader } from "./WorkspaceHeader.js";
4
4
  import * as React from "react";
@@ -1,9 +1,9 @@
1
1
  import { t as cx } from "../class-names-BiMDVpUo.js";
2
2
  import { a as WorkspaceNavigationRestorationBoundary, n as WorkspaceNavigationProvider, o as useRequiredWorkspaceNavigationRestoration, r as resolveWorkspaceLink, t as WorkspaceFileLink } from "../WorkspaceLink-BYYeTQLf.js";
3
+ import { n as mergeRefs } from "../merge-refs-DF_7w2x_.js";
3
4
  import { inferWorkspaceLanguage, inferWorkspaceMedia, isWorkspaceMarkdownPath, isWorkspaceMediaPath, isWorkspaceSkillPath, parseWorkspaceSkill } from "./WorkspaceFile.js";
4
5
  import { WorkspaceBrowser } from "./WorkspaceBrowser.js";
5
- import { t as WorkspaceFileView } from "../WorkspaceFileView-CEdArlOT.js";
6
- import { t as mergeRefs } from "../merge-refs-KlanQB7A.js";
6
+ import { t as WorkspaceFileView } from "../WorkspaceFileView-Bxx4wEzJ.js";
7
7
  import { useWorkspace, workspaceBinaryFileQueryOptions, workspaceDirectoryQueryOptions, workspaceFileAssetQueryOptions, workspaceFileStatQueryOptions, workspaceInfoQueryOptions, workspaceQueryKey, workspaceTextFileQueryOptions } from "./Workspace.js";
8
8
  import * as React from "react";
9
9
  import { jsx } from "react/jsx-runtime";
@@ -1,2 +1,2 @@
1
- import { t as WorkspaceFileView } from "../WorkspaceFileView-CEdArlOT.js";
1
+ import { t as WorkspaceFileView } from "../WorkspaceFileView-Bxx4wEzJ.js";
2
2
  export { WorkspaceFileView };
@@ -1,4 +1,4 @@
1
- import { U as RefreshIcon } from "../icons-DKXiSepE.js";
1
+ import { U as RefreshIcon } from "../icons-DyOM0EJs.js";
2
2
  import { AppTopBar } from "./AppTopBar.js";
3
3
  import "react";
4
4
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
@@ -1,2 +1,2 @@
1
- import { $ as WrenchIcon, A as McpIcon, B as PlayIcon, C as FolderIcon, D as InfoIcon, E as ImageIcon, F as MoonIcon, G as SidebarIcon, H as QueueIcon, I as MoveToFrontIcon, J as StopIcon, K as SpinnerIcon, L as PaperclipIcon, M as MicrophoneIcon, N as MinusIcon, O as LinkIcon, P as MonitorIcon, Q as WarningIcon, R as PauseIcon, S as FileIcon, T as HashIcon, U as RefreshIcon, V as PlusIcon, W as SearchIcon, X as TerminalIcon, Y as SunIcon, Z as TrashIcon, _ as DotIcon, a as ArrowUpIcon, b as EyeIcon, c as BrainIcon, d as ChevronDownIcon, et as XIcon, f as ChevronLeftIcon, g as DiscordIcon, h as CopyIcon, i as ArrowRightIcon, j as MessageSquareIcon, k as MaximizeIcon, l as CalendarIcon, m as CodeIcon, n as ArrowDownIcon, o as BookmarkIcon, p as ChevronRightIcon, q as SquareIcon, r as ArrowLeftIcon, s as BoxIcon, t as ArchiveIcon, u as CheckIcon, v as DownloadIcon, w as FolderOpenIcon, x as EyeOffIcon, y as EllipsisIcon, z as PencilIcon } from "../icons-DKXiSepE.js";
1
+ import { $ as WrenchIcon, A as McpIcon, B as PlayIcon, C as FolderIcon, D as InfoIcon, E as ImageIcon, F as MoonIcon, G as SidebarIcon, H as QueueIcon, I as MoveToFrontIcon, J as StopIcon, K as SpinnerIcon, L as PaperclipIcon, M as MicrophoneIcon, N as MinusIcon, O as LinkIcon, P as MonitorIcon, Q as WarningIcon, R as PauseIcon, S as FileIcon, T as HashIcon, U as RefreshIcon, V as PlusIcon, W as SearchIcon, X as TerminalIcon, Y as SunIcon, Z as TrashIcon, _ as DotIcon, a as ArrowUpIcon, b as EyeIcon, c as BrainIcon, d as ChevronDownIcon, et as XIcon, f as ChevronLeftIcon, g as DiscordIcon, h as CopyIcon, i as ArrowRightIcon, j as MessageSquareIcon, k as MaximizeIcon, l as CalendarIcon, m as CodeIcon, n as ArrowDownIcon, o as BookmarkIcon, p as ChevronRightIcon, q as SquareIcon, r as ArrowLeftIcon, s as BoxIcon, t as ArchiveIcon, u as CheckIcon, v as DownloadIcon, w as FolderOpenIcon, x as EyeOffIcon, y as EllipsisIcon, z as PencilIcon } from "../icons-DyOM0EJs.js";
2
2
  export { ArchiveIcon, ArrowDownIcon, ArrowLeftIcon, ArrowRightIcon, ArrowUpIcon, BookmarkIcon, BoxIcon, BrainIcon, CalendarIcon, CheckIcon, ChevronDownIcon, ChevronLeftIcon, ChevronRightIcon, CodeIcon, CopyIcon, DiscordIcon, DotIcon, DownloadIcon, EllipsisIcon, EyeIcon, EyeOffIcon, FileIcon, FolderIcon, FolderOpenIcon, HashIcon, ImageIcon, InfoIcon, LinkIcon, MaximizeIcon, McpIcon, MessageSquareIcon, MicrophoneIcon, MinusIcon, MonitorIcon, MoonIcon, MoveToFrontIcon, PaperclipIcon, PauseIcon, PencilIcon, PlayIcon, PlusIcon, QueueIcon, RefreshIcon, SearchIcon, SidebarIcon, SpinnerIcon, SquareIcon, StopIcon, SunIcon, TerminalIcon, TrashIcon, WarningIcon, WrenchIcon, XIcon };
@@ -1,4 +1,4 @@
1
- import { h as CopyIcon, u as CheckIcon } from "./icons-DKXiSepE.js";
1
+ import { h as CopyIcon, u as CheckIcon } from "./icons-DyOM0EJs.js";
2
2
  import { Button } from "./components/Button.js";
3
3
  import { Tooltip } from "./components/Tooltip.js";
4
4
  import * as React from "react";
@@ -0,0 +1,38 @@
1
+ //#region src/components/_internal/format.ts
2
+ /**
3
+ * Small string/number formatting helpers shared across components, so the same
4
+ * one-liners are not re-derived in each file.
5
+ */
6
+ /**
7
+ * Constrains `value` to the inclusive `[min, max]` range.
8
+ */
9
+ function clamp(value, min, max) {
10
+ return Math.min(max, Math.max(min, value));
11
+ }
12
+ /**
13
+ * Uppercases the first character of `value`, leaving the rest untouched.
14
+ */
15
+ function capitalize(value) {
16
+ return value.charAt(0).toUpperCase() + value.slice(1);
17
+ }
18
+ /**
19
+ * Turns a `kebab-case` or `snake_case` identifier into a space-separated,
20
+ * word-capitalized label (e.g. `"service-tier"` → `"Service Tier"`).
21
+ */
22
+ function titleCase(value) {
23
+ return value.split(/[-_]/).filter(Boolean).map((word) => word[0].toUpperCase() + word.slice(1)).join(" ");
24
+ }
25
+ /**
26
+ * Formats a whole number of seconds as a clock string — `m:ss`, widening to
27
+ * `h:mm:ss` once it reaches an hour. Negative and fractional inputs are floored
28
+ * to whole seconds, so callers that need rounding should round before calling.
29
+ */
30
+ function formatClock(totalSeconds) {
31
+ const total = Math.max(0, Math.floor(totalSeconds));
32
+ const hours = Math.floor(total / 3600);
33
+ const minutes = Math.floor(total % 3600 / 60);
34
+ const seconds = String(total % 60).padStart(2, "0");
35
+ return hours > 0 ? `${hours}:${String(minutes).padStart(2, "0")}:${seconds}` : `${minutes}:${seconds}`;
36
+ }
37
+ //#endregion
38
+ export { titleCase as i, clamp as n, formatClock as r, capitalize as t };
@@ -1,3 +1,4 @@
1
+ import { t as cx } from "./class-names-BiMDVpUo.js";
1
2
  import { jsx } from "react/jsx-runtime";
2
3
  import { Archive, ArrowDown, ArrowLeft, ArrowRight, ArrowUp, Bookmark, Box, Brain, CalendarDays, Check, ChevronDown, ChevronLeft, ChevronRight, CircleStop, CodeXml, Copy, CornerDownRight, Dot, Download, Ellipsis, Eye, EyeOff, File, Folder, FolderOpen, Hash, Image, Info, Link2, ListRestart, LoaderCircle, Maximize2, MessageSquare, Mic, Minus, Monitor, Moon, PanelLeft, Paperclip, Pause, Pencil, Play, Plus, RefreshCw, Search, Square, Sun, Terminal, Trash2, TriangleAlert, Wrench, X } from "lucide-react";
3
4
  import { SiDiscord, SiModelcontextprotocol } from "react-icons/si";
@@ -61,7 +62,7 @@ function SpinnerIcon({ className, size = 16, strokeWidth = 1.75, ...props }) {
61
62
  strokeWidth,
62
63
  "aria-hidden": "true",
63
64
  focusable: "false",
64
- className: ["sigvelo-icon--spinner", className].filter(Boolean).join(" "),
65
+ className: cx("sigvelo-icon--spinner", className),
65
66
  ...props
66
67
  });
67
68
  }
@@ -15,4 +15,4 @@ function mergeRefs(...refs) {
15
15
  };
16
16
  }
17
17
  //#endregion
18
- export { mergeRefs as t };
18
+ export { mergeRefs as n, assignRef as t };
@@ -18,9 +18,6 @@
18
18
  min-width: 0;
19
19
  max-width: max-content;
20
20
  color: var(--sigvelo-color-text);
21
- overflow: hidden;
22
- text-overflow: ellipsis;
23
- white-space: nowrap;
24
21
  }
25
22
 
26
23
  .activity__item-icon {
@@ -339,7 +339,7 @@
339
339
 
340
340
  @media (forced-colors: active) {
341
341
  .activity__trigger:focus-visible {
342
- outline: 2px solid Highlight;
342
+ outline: var(--sigvelo-focus-ring-forced);
343
343
  outline-offset: 2px;
344
344
  }
345
345
  }
@@ -60,13 +60,6 @@
60
60
  line-height: 1.35;
61
61
  }
62
62
 
63
- .agent-attention__title,
64
- .agent-attention__description {
65
- overflow: hidden;
66
- text-overflow: ellipsis;
67
- white-space: nowrap;
68
- }
69
-
70
63
  .agent-attention__title {
71
64
  font-size: var(--sigvelo-text-compact);
72
65
  font-weight: var(--sigvelo-font-weight-semibold);
@@ -175,7 +175,7 @@
175
175
  }
176
176
 
177
177
  .agent-connect__target[data-selected="true"] {
178
- outline: 2px solid Highlight;
178
+ outline: var(--sigvelo-focus-ring-forced);
179
179
  outline-offset: -2px;
180
180
  }
181
181
  }
@@ -38,13 +38,10 @@
38
38
  max-inline-size: min(20rem, 45vw);
39
39
  align-self: center;
40
40
  justify-self: center;
41
- overflow: hidden;
42
41
  color: var(--sigvelo-color-text);
43
42
  font-size: var(--sigvelo-density-compact-control-font-size);
44
43
  font-weight: var(--sigvelo-font-weight-semibold);
45
44
  line-height: var(--sigvelo-leading-tight);
46
- text-overflow: ellipsis;
47
- white-space: nowrap;
48
45
  }
49
46
 
50
47
  .app-top-bar__trailing {
@@ -98,13 +95,13 @@
98
95
  }
99
96
 
100
97
  .app-top-bar__button:focus-visible {
101
- outline: 2px solid Highlight;
98
+ outline: var(--sigvelo-focus-ring-forced);
102
99
  outline-offset: 2px;
103
100
  box-shadow: none;
104
101
  }
105
102
 
106
103
  .app-top-bar__button:is([aria-expanded="true"], [data-popup-open], [data-pressed]) {
107
- outline: 2px solid Highlight;
104
+ outline: var(--sigvelo-focus-ring-forced);
108
105
  outline-offset: -2px;
109
106
  }
110
107
  }
@@ -66,9 +66,6 @@
66
66
  font-size: var(--sigvelo-text-xs);
67
67
  color: var(--sigvelo-color-text-muted);
68
68
  max-inline-size: 80%;
69
- overflow: hidden;
70
- text-overflow: ellipsis;
71
- white-space: nowrap;
72
69
  }
73
70
 
74
71
  /* An expired view showing a screenshot fallback keeps the image flush */
@@ -95,7 +92,7 @@
95
92
  }
96
93
 
97
94
  .browser-live-view__state-spinner {
98
- animation: browser-live-view-spin 900ms linear infinite;
95
+ animation: sigvelo-icon-spin 900ms linear infinite;
99
96
  }
100
97
 
101
98
  /* Expand affordance, video-player style: quiet until the box is hovered or
@@ -157,12 +154,6 @@
157
154
  }
158
155
  }
159
156
 
160
- @keyframes browser-live-view-spin {
161
- to {
162
- transform: rotate(360deg);
163
- }
164
- }
165
-
166
157
  @media (prefers-reduced-motion: reduce) {
167
158
  .browser-live-view__badge-dot,
168
159
  .browser-live-view__state-spinner {
@@ -61,12 +61,9 @@
61
61
  }
62
62
 
63
63
  .browser-run-panel__tab-title {
64
- overflow: hidden;
65
64
  max-inline-size: 100%;
66
65
  font-size: var(--sigvelo-text-xs);
67
66
  line-height: var(--sigvelo-leading-tight);
68
- text-overflow: ellipsis;
69
- white-space: nowrap;
70
67
  }
71
68
 
72
69
  .browser-run-panel__address-bar {
@@ -105,13 +102,7 @@
105
102
  }
106
103
 
107
104
  .browser-run-panel__spinner {
108
- animation: browser-run-panel-spin 900ms linear infinite;
109
- }
110
-
111
- @keyframes browser-run-panel-spin {
112
- to {
113
- transform: rotate(360deg);
114
- }
105
+ animation: sigvelo-icon-spin 900ms linear infinite;
115
106
  }
116
107
 
117
108
  @media (prefers-reduced-motion: reduce) {
@@ -126,7 +117,7 @@
126
117
 
127
118
  @media (forced-colors: active) {
128
119
  .browser-run-panel__tab[data-active] {
129
- outline: 2px solid Highlight;
120
+ outline: var(--sigvelo-focus-ring-forced);
130
121
  outline-offset: -2px;
131
122
  }
132
123
  }