@ash-cloud/ash-ui 0.2.0 → 0.2.2

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/dist/index.cjs CHANGED
@@ -569,6 +569,61 @@ function LazyMarkdown({ children, fallback, components, className }) {
569
569
  }
570
570
  return /* @__PURE__ */ jsxRuntime.jsx(react.Suspense, { fallback: /* @__PURE__ */ jsxRuntime.jsx("span", { className, children: fallback ?? children }), children: /* @__PURE__ */ jsxRuntime.jsx(ReactMarkdown, { components: markdownComponents, children }) });
571
571
  }
572
+ function Mention({ name, color, url }) {
573
+ return /* @__PURE__ */ jsxRuntime.jsxs(
574
+ "span",
575
+ {
576
+ className: cn(
577
+ "ash-mention",
578
+ "inline-flex items-center",
579
+ "px-1.5 py-0.5 rounded",
580
+ "text-[var(--ash-font-size-sm,12px)]",
581
+ "font-medium"
582
+ ),
583
+ style: {
584
+ backgroundColor: color ? `${color}20` : "var(--ash-mention-bg,rgba(255,255,255,0.1))",
585
+ color: color || "var(--ash-mention-text,inherit)"
586
+ },
587
+ children: [
588
+ url && /* @__PURE__ */ jsxRuntime.jsx(
589
+ "img",
590
+ {
591
+ src: url,
592
+ alt: "",
593
+ className: "w-4 h-4 rounded mr-1 object-cover"
594
+ }
595
+ ),
596
+ "@",
597
+ name
598
+ ]
599
+ }
600
+ );
601
+ }
602
+ function RichContentRenderer({
603
+ content,
604
+ components,
605
+ className
606
+ }) {
607
+ const MentionComponent = components?.mention || Mention;
608
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { className: cn("ash-rich-content", className), children: content.map((segment, index) => {
609
+ if (segment.type === "text") {
610
+ return /* @__PURE__ */ jsxRuntime.jsx(LazyMarkdown, { components, children: segment.content }, index);
611
+ }
612
+ if (segment.type === "mention") {
613
+ return /* @__PURE__ */ jsxRuntime.jsx(
614
+ MentionComponent,
615
+ {
616
+ name: segment.name,
617
+ color: segment.color,
618
+ url: segment.url,
619
+ data: segment.data
620
+ },
621
+ index
622
+ );
623
+ }
624
+ return null;
625
+ }) });
626
+ }
572
627
  var MessageContext = react.createContext(null);
573
628
  function useMessage() {
574
629
  const context = react.useContext(MessageContext);
@@ -681,10 +736,26 @@ function MessageContent({ children, className }) {
681
736
  }
682
737
  function MessageResponse({
683
738
  content,
739
+ richContent,
684
740
  isStreaming,
685
741
  className,
686
742
  components
687
743
  }) {
744
+ if (richContent && richContent.length > 0) {
745
+ return /* @__PURE__ */ jsxRuntime.jsx(
746
+ "div",
747
+ {
748
+ className: cn(
749
+ "ash-message-response",
750
+ "font-[var(--ash-font-size-base,13px)]",
751
+ "leading-relaxed",
752
+ isStreaming && "animate-pulse",
753
+ className
754
+ ),
755
+ children: /* @__PURE__ */ jsxRuntime.jsx(RichContentRenderer, { content: richContent, components })
756
+ }
757
+ );
758
+ }
688
759
  if (!content) return null;
689
760
  return /* @__PURE__ */ jsxRuntime.jsx(
690
761
  "div",
@@ -760,6 +831,7 @@ function MessageTimestamp({ timestamp, className }) {
760
831
  }
761
832
  function StatusIndicator({ status, size = "sm", className }) {
762
833
  const sizeClasses = {
834
+ xs: "w-1.5 h-1.5",
763
835
  sm: "w-2 h-2",
764
836
  md: "w-3 h-3",
765
837
  lg: "w-4 h-4"
@@ -1138,14 +1210,16 @@ function Tool({
1138
1210
  toolInvocation,
1139
1211
  children,
1140
1212
  className,
1141
- defaultExpanded = false
1213
+ defaultExpanded = false,
1214
+ variant = "default"
1142
1215
  }) {
1143
1216
  const [isExpanded, setIsExpanded] = react.useState(defaultExpanded);
1144
1217
  const toggleExpanded = () => setIsExpanded((prev) => !prev);
1145
1218
  const contextValue = {
1146
1219
  toolInvocation,
1147
1220
  isExpanded,
1148
- toggleExpanded
1221
+ toggleExpanded,
1222
+ variant
1149
1223
  };
1150
1224
  const status = toolInvocation.state === "result" ? "success" : "pending";
1151
1225
  const isErrorResult = Boolean(
@@ -1181,25 +1255,28 @@ function ToolHeader({
1181
1255
  icon,
1182
1256
  showToggle = true
1183
1257
  }) {
1184
- const { toolInvocation, isExpanded, toggleExpanded } = useTool();
1258
+ const { toolInvocation, isExpanded, toggleExpanded, variant } = useTool();
1259
+ const isCompact = variant === "compact";
1185
1260
  const status = toolInvocation.state === "result" ? "success" : "pending";
1186
1261
  const formattedName = formatToolName(toolInvocation.toolName);
1187
1262
  const toolIcon = icon;
1263
+ const canToggle = showToggle && !isCompact;
1188
1264
  return /* @__PURE__ */ jsxRuntime.jsxs(
1189
1265
  "button",
1190
1266
  {
1191
- onClick: showToggle ? toggleExpanded : void 0,
1267
+ onClick: canToggle ? toggleExpanded : void 0,
1192
1268
  className: cn(
1193
1269
  "ash-tool-header",
1194
1270
  "w-full flex items-center gap-2",
1195
- "px-3 py-2",
1271
+ isCompact ? "px-2 py-1.5" : "px-3 py-2",
1196
1272
  "text-left",
1197
- showToggle && "cursor-pointer hover:bg-white/[0.03] transition-colors",
1273
+ canToggle && "cursor-pointer hover:bg-white/[0.03] transition-colors",
1274
+ !canToggle && "cursor-default",
1198
1275
  className
1199
1276
  ),
1200
1277
  children: [
1201
- /* @__PURE__ */ jsxRuntime.jsx(StatusIndicator, { status, size: "sm" }),
1202
- toolIcon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[var(--ash-text-muted,rgba(255,255,255,0.5))]", children: toolIcon }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[var(--ash-text-muted,rgba(255,255,255,0.5))]", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { className: "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: [
1278
+ /* @__PURE__ */ jsxRuntime.jsx(StatusIndicator, { status, size: isCompact ? "xs" : "sm" }),
1279
+ toolIcon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[var(--ash-text-muted,rgba(255,255,255,0.5))]", children: toolIcon }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-[var(--ash-text-muted,rgba(255,255,255,0.5))]", children: /* @__PURE__ */ jsxRuntime.jsxs("svg", { className: isCompact ? "w-3 h-3" : "w-4 h-4", fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: [
1203
1280
  /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.065 2.572c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.572 1.065c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.065-2.572c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z" }),
1204
1281
  /* @__PURE__ */ jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M15 12a3 3 0 11-6 0 3 3 0 016 0z" })
1205
1282
  ] }) }),
@@ -1208,7 +1285,7 @@ function ToolHeader({
1208
1285
  {
1209
1286
  className: cn(
1210
1287
  "flex-1 font-medium",
1211
- "text-[var(--ash-font-size-sm,12px)]",
1288
+ isCompact ? "text-[var(--ash-font-size-xs,10px)]" : "text-[var(--ash-font-size-sm,12px)]",
1212
1289
  "text-[var(--ash-text-primary,rgba(255,255,255,0.9))]"
1213
1290
  ),
1214
1291
  children: formattedName
@@ -1218,14 +1295,14 @@ function ToolHeader({
1218
1295
  "span",
1219
1296
  {
1220
1297
  className: cn(
1221
- "text-[var(--ash-font-size-xs,10px)]",
1298
+ isCompact ? "text-[9px]" : "text-[var(--ash-font-size-xs,10px)]",
1222
1299
  "text-[var(--ash-text-muted,rgba(255,255,255,0.5))]",
1223
1300
  "truncate max-w-[200px]"
1224
1301
  ),
1225
1302
  children: Object.keys(toolInvocation.args).length > 0 && `(${Object.keys(toolInvocation.args).join(", ")})`
1226
1303
  }
1227
1304
  ),
1228
- showToggle && /* @__PURE__ */ jsxRuntime.jsx(
1305
+ canToggle && /* @__PURE__ */ jsxRuntime.jsx(
1229
1306
  "svg",
1230
1307
  {
1231
1308
  className: cn(
@@ -1321,24 +1398,28 @@ function ToolOutput({ className, maxHeight = 300 }) {
1321
1398
  function ToolList({
1322
1399
  toolInvocations,
1323
1400
  className,
1324
- defaultExpanded = false
1401
+ defaultExpanded = false,
1402
+ variant = "default"
1325
1403
  }) {
1326
1404
  if (!toolInvocations || toolInvocations.length === 0) {
1327
1405
  return null;
1328
1406
  }
1407
+ const isCompact = variant === "compact";
1329
1408
  return /* @__PURE__ */ jsxRuntime.jsx(
1330
1409
  "div",
1331
1410
  {
1332
1411
  className: cn(
1333
1412
  "ash-tool-list",
1334
- "flex flex-col gap-2",
1413
+ "flex flex-col",
1414
+ isCompact ? "gap-1" : "gap-2",
1335
1415
  className
1336
1416
  ),
1337
1417
  children: toolInvocations.map((inv) => /* @__PURE__ */ jsxRuntime.jsx(
1338
1418
  Tool,
1339
1419
  {
1340
1420
  toolInvocation: inv,
1341
- defaultExpanded
1421
+ defaultExpanded,
1422
+ variant
1342
1423
  },
1343
1424
  inv.toolCallId
1344
1425
  ))
@@ -3536,6 +3617,7 @@ function useAgentChat(options) {
3536
3617
  const eventCountRef = react.useRef(0);
3537
3618
  const sessionIdRef = react.useRef(sessionId);
3538
3619
  const streamingEntriesRef = react.useRef([]);
3620
+ const lastSequenceRef = react.useRef(0);
3539
3621
  react.useEffect(() => {
3540
3622
  sessionIdRef.current = sessionId;
3541
3623
  }, [sessionId]);
@@ -3560,6 +3642,12 @@ function useAgentChat(options) {
3560
3642
  setStreamingEntries([]);
3561
3643
  }, []);
3562
3644
  const processEvent = react.useCallback((event, streamEntries) => {
3645
+ if (event.id) {
3646
+ const seq = parseInt(event.id, 10);
3647
+ if (!isNaN(seq)) {
3648
+ lastSequenceRef.current = seq;
3649
+ }
3650
+ }
3563
3651
  const newEntries = [...streamEntries];
3564
3652
  switch (event.type) {
3565
3653
  case "session_start":
@@ -3896,7 +3984,8 @@ function useAgentChat(options) {
3896
3984
  send,
3897
3985
  stop,
3898
3986
  clear,
3899
- setEntries
3987
+ setEntries,
3988
+ lastSequence: lastSequenceRef.current
3900
3989
  };
3901
3990
  }
3902
3991
  function generateId() {
@@ -4266,6 +4355,7 @@ exports.LoaderIcon = LoaderIcon;
4266
4355
  exports.LoadingDots = LoadingDots;
4267
4356
  exports.LoadingSpinner = LoadingSpinner;
4268
4357
  exports.LogsPanel = LogsPanel;
4358
+ exports.Mention = Mention;
4269
4359
  exports.Message = Message;
4270
4360
  exports.MessageAction = MessageAction;
4271
4361
  exports.MessageActions = MessageActions;
@@ -4283,6 +4373,7 @@ exports.PlugIcon = PlugIcon;
4283
4373
  exports.Reasoning = Reasoning;
4284
4374
  exports.ReasoningContent = ReasoningContent;
4285
4375
  exports.ReasoningTrigger = ReasoningTrigger;
4376
+ exports.RichContentRenderer = RichContentRenderer;
4286
4377
  exports.SearchIcon = SearchIcon;
4287
4378
  exports.SendIcon = SendIcon;
4288
4379
  exports.Shimmer = Shimmer;