@supyagent/sdk 0.1.21 → 0.1.22

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/react.d.cts CHANGED
@@ -21,7 +21,7 @@ declare function getProviderLabel(provider: string): string;
21
21
  /**
22
22
  * Determine which formatter to use based on tool name prefix.
23
23
  */
24
- type FormatterType = "email" | "calendar" | "slack" | "github" | "drive" | "search" | "docs" | "sheets" | "slides" | "hubspot" | "linear" | "pipedrive" | "compute" | "resend" | "inbox" | "discord" | "notion" | "twitter" | "telegram" | "stripe" | "jira" | "salesforce" | "brevo" | "calendly" | "twilio" | "linkedin" | "bash" | "image" | "audio" | "video" | "generic";
24
+ type FormatterType = "email" | "calendar" | "slack" | "github" | "drive" | "search" | "docs" | "sheets" | "slides" | "hubspot" | "linear" | "pipedrive" | "compute" | "resend" | "inbox" | "discord" | "notion" | "twitter" | "telegram" | "stripe" | "jira" | "salesforce" | "brevo" | "calendly" | "twilio" | "linkedin" | "bash" | "image" | "audio" | "video" | "whatsapp" | "browser" | "generic";
25
25
  declare function getFormatterType(toolName: string): FormatterType;
26
26
  /**
27
27
  * Resolve a virtual tool name for rendering purposes.
package/dist/react.d.ts CHANGED
@@ -21,7 +21,7 @@ declare function getProviderLabel(provider: string): string;
21
21
  /**
22
22
  * Determine which formatter to use based on tool name prefix.
23
23
  */
24
- type FormatterType = "email" | "calendar" | "slack" | "github" | "drive" | "search" | "docs" | "sheets" | "slides" | "hubspot" | "linear" | "pipedrive" | "compute" | "resend" | "inbox" | "discord" | "notion" | "twitter" | "telegram" | "stripe" | "jira" | "salesforce" | "brevo" | "calendly" | "twilio" | "linkedin" | "bash" | "image" | "audio" | "video" | "generic";
24
+ type FormatterType = "email" | "calendar" | "slack" | "github" | "drive" | "search" | "docs" | "sheets" | "slides" | "hubspot" | "linear" | "pipedrive" | "compute" | "resend" | "inbox" | "discord" | "notion" | "twitter" | "telegram" | "stripe" | "jira" | "salesforce" | "brevo" | "calendly" | "twilio" | "linkedin" | "bash" | "image" | "audio" | "video" | "whatsapp" | "browser" | "generic";
25
25
  declare function getFormatterType(toolName: string): FormatterType;
26
26
  /**
27
27
  * Resolve a virtual tool name for rendering purposes.
package/dist/react.js CHANGED
@@ -45,7 +45,14 @@ var PROVIDER_LABELS = {
45
45
  twilio: "Twilio",
46
46
  image: "Image",
47
47
  audio: "Audio",
48
- video: "Video"
48
+ video: "Video",
49
+ shopify: "Shopify",
50
+ sap: "SAP",
51
+ jobs: "Jobs",
52
+ browser: "Browser",
53
+ files: "Files",
54
+ db: "Database",
55
+ radar: "Radar"
49
56
  };
50
57
  function getProviderLabel(provider) {
51
58
  return PROVIDER_LABELS[provider] || provider.charAt(0).toUpperCase() + provider.slice(1);
@@ -117,6 +124,16 @@ function getFormatterType(toolName) {
117
124
  return "twilio";
118
125
  case "linkedin":
119
126
  return "linkedin";
127
+ case "whatsapp":
128
+ return "whatsapp";
129
+ case "browser":
130
+ return "browser";
131
+ case "db":
132
+ return "compute";
133
+ case "files":
134
+ return "drive";
135
+ case "radar":
136
+ return "search";
120
137
  case "image":
121
138
  return "image";
122
139
  case "tts":
@@ -172,7 +189,8 @@ import {
172
189
  Phone,
173
190
  MessageCircle,
174
191
  UserCircle,
175
- Monitor
192
+ Monitor,
193
+ Globe
176
194
  } from "lucide-react";
177
195
  import { jsx } from "react/jsx-runtime";
178
196
  var ICON_MAP = {
@@ -204,7 +222,9 @@ var ICON_MAP = {
204
222
  microsoft: Monitor,
205
223
  outlook: Mail,
206
224
  onedrive: HardDrive,
207
- telegram: Send
225
+ telegram: Send,
226
+ whatsapp: MessageCircle,
227
+ browser: Globe
208
228
  };
209
229
  function ProviderIcon({ toolName, className = "h-4 w-4" }) {
210
230
  const provider = getProviderFromToolName(toolName);
@@ -622,6 +642,40 @@ function getVideoSummary(data, toolName) {
622
642
  }
623
643
  return { text: isUnderstand ? "Video analysis" : "Video generation" };
624
644
  }
645
+ function getWhatsappSummary(data, toolName) {
646
+ const action = actionFromToolName(toolName);
647
+ if (action === "send") {
648
+ const to = typeof data === "object" && data !== null && "to" in data ? String(data.to) : void 0;
649
+ return { text: to ? `Sent message to ${to}` : "Sent message", badge: { text: "Sent", variant: "success" } };
650
+ }
651
+ const n = countItems(data, "messages");
652
+ if (n > 0) return { text: `${n} messages`, badge: countBadge(n) };
653
+ if (typeof data === "object" && data !== null && "body" in data) {
654
+ const body = String(data.body);
655
+ return { text: body.length > 60 ? body.slice(0, 60) + "..." : body };
656
+ }
657
+ return { text: "WhatsApp result" };
658
+ }
659
+ function getBrowserSummary(data, toolName) {
660
+ if (typeof data === "object" && data !== null) {
661
+ const d = data;
662
+ if (d.url && typeof d.url === "string") {
663
+ try {
664
+ const hostname = new URL(d.url).hostname.replace("www.", "");
665
+ return { text: `Visited ${hostname}` };
666
+ } catch {
667
+ return { text: `Visited ${d.url}` };
668
+ }
669
+ }
670
+ if (d.screenshot_url || d.screenshot) {
671
+ return { text: "Page screenshot captured" };
672
+ }
673
+ if (d.content || d.text || d.markdown) {
674
+ return { text: "Page content extracted" };
675
+ }
676
+ }
677
+ return { text: humanizeToolName(toolName) };
678
+ }
625
679
  function getBashSummary(data) {
626
680
  if (typeof data !== "object" || data === null) return { text: "Command executed" };
627
681
  const d = data;
@@ -664,6 +718,8 @@ var SUMMARY_MAP = {
664
718
  image: getImageSummary,
665
719
  audio: getAudioSummary,
666
720
  video: getVideoSummary,
721
+ whatsapp: getWhatsappSummary,
722
+ browser: getBrowserSummary,
667
723
  bash: getBashSummary,
668
724
  generic: getGenericSummary
669
725
  };
@@ -1370,7 +1426,7 @@ import {
1370
1426
  Building2,
1371
1427
  Mail as Mail3,
1372
1428
  Phone as Phone2,
1373
- Globe,
1429
+ Globe as Globe2,
1374
1430
  Briefcase as Briefcase2,
1375
1431
  DollarSign,
1376
1432
  Calendar as Calendar3
@@ -1474,7 +1530,7 @@ function CompanyCard({ company }) {
1474
1530
  ] }),
1475
1531
  /* @__PURE__ */ jsxs11("div", { className: "flex flex-wrap gap-x-4 gap-y-1 pl-6 text-xs text-muted-foreground", children: [
1476
1532
  domain && /* @__PURE__ */ jsxs11("span", { className: "flex items-center gap-1", children: [
1477
- /* @__PURE__ */ jsx12(Globe, { className: "h-3 w-3" }),
1533
+ /* @__PURE__ */ jsx12(Globe2, { className: "h-3 w-3" }),
1478
1534
  domain
1479
1535
  ] }),
1480
1536
  phone && /* @__PURE__ */ jsxs11("span", { className: "flex items-center gap-1", children: [
@@ -3016,17 +3072,143 @@ function LinkedInFormatter({ data }) {
3016
3072
  return /* @__PURE__ */ jsx28("pre", { className: "rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto", children: JSON.stringify(data, null, 2) });
3017
3073
  }
3018
3074
 
3075
+ // src/ui/formatters/whatsapp.tsx
3076
+ import { MessageCircle as MessageCircle3, User as User7, Clock as Clock10 } from "lucide-react";
3077
+ import { jsx as jsx29, jsxs as jsxs28 } from "react/jsx-runtime";
3078
+ function isWhatsAppMessage(data) {
3079
+ return typeof data === "object" && data !== null && ("body" in data || "text" in data || "from" in data);
3080
+ }
3081
+ function formatTimestamp3(ts) {
3082
+ try {
3083
+ const date = typeof ts === "number" ? new Date(ts > 1e12 ? ts : ts * 1e3) : new Date(ts);
3084
+ const now = /* @__PURE__ */ new Date();
3085
+ const diffMs = now.getTime() - date.getTime();
3086
+ const diffMins = Math.floor(diffMs / 6e4);
3087
+ const diffHours = Math.floor(diffMs / 36e5);
3088
+ const diffDays = Math.floor(diffMs / 864e5);
3089
+ if (diffMins < 1) return "Just now";
3090
+ if (diffMins < 60) return `${diffMins}m ago`;
3091
+ if (diffHours < 24) return `${diffHours}h ago`;
3092
+ if (diffDays < 7) return `${diffDays}d ago`;
3093
+ return date.toLocaleDateString(void 0, { month: "short", day: "numeric" });
3094
+ } catch {
3095
+ return String(ts);
3096
+ }
3097
+ }
3098
+ function MessageCard4({ message }) {
3099
+ const sender = message.profile_name || message.contact_name || message.from;
3100
+ const body = message.body || message.text;
3101
+ return /* @__PURE__ */ jsxs28("div", { className: "rounded-lg border border-border bg-card p-3 space-y-1.5", children: [
3102
+ /* @__PURE__ */ jsxs28("div", { className: "flex items-center gap-2", children: [
3103
+ /* @__PURE__ */ jsx29(MessageCircle3, { className: "h-4 w-4 text-muted-foreground shrink-0" }),
3104
+ sender && /* @__PURE__ */ jsxs28("span", { className: "flex items-center gap-1 text-xs font-medium text-foreground", children: [
3105
+ /* @__PURE__ */ jsx29(User7, { className: "h-3 w-3" }),
3106
+ sender
3107
+ ] }),
3108
+ message.type && message.type !== "text" && /* @__PURE__ */ jsx29("span", { className: "inline-flex rounded-full bg-muted px-2 py-0.5 text-xs text-muted-foreground", children: message.type }),
3109
+ message.status && /* @__PURE__ */ jsx29("span", { className: `inline-flex rounded-full px-2 py-0.5 text-xs ${message.status === "delivered" || message.status === "read" ? "text-green-500 bg-green-500/10" : "text-muted-foreground bg-muted"}`, children: message.status }),
3110
+ message.timestamp && /* @__PURE__ */ jsxs28("span", { className: "flex items-center gap-1 text-xs text-muted-foreground ml-auto", children: [
3111
+ /* @__PURE__ */ jsx29(Clock10, { className: "h-3 w-3" }),
3112
+ formatTimestamp3(message.timestamp)
3113
+ ] })
3114
+ ] }),
3115
+ body && /* @__PURE__ */ jsx29("p", { className: "text-sm text-foreground line-clamp-3", children: body })
3116
+ ] });
3117
+ }
3118
+ function WhatsAppFormatter({ data }) {
3119
+ if (typeof data === "object" && data !== null && "messages" in data) {
3120
+ const msgs = data.messages;
3121
+ if (Array.isArray(msgs)) {
3122
+ return /* @__PURE__ */ jsx29("div", { className: "space-y-2", children: msgs.filter(isWhatsAppMessage).map((m, i) => /* @__PURE__ */ jsx29(MessageCard4, { message: m }, m.id || i)) });
3123
+ }
3124
+ }
3125
+ if (isWhatsAppMessage(data)) return /* @__PURE__ */ jsx29(MessageCard4, { message: data });
3126
+ if (Array.isArray(data)) {
3127
+ const msgs = data.filter(isWhatsAppMessage);
3128
+ if (msgs.length > 0) {
3129
+ return /* @__PURE__ */ jsx29("div", { className: "space-y-2", children: msgs.map((m, i) => /* @__PURE__ */ jsx29(MessageCard4, { message: m }, m.id || i)) });
3130
+ }
3131
+ }
3132
+ return /* @__PURE__ */ jsx29("pre", { className: "rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto", children: JSON.stringify(data, null, 2) });
3133
+ }
3134
+
3135
+ // src/ui/formatters/browser.tsx
3136
+ import { Globe as Globe3, ExternalLink as ExternalLink8, FileText as FileText7, Image as Image2 } from "lucide-react";
3137
+ import { jsx as jsx30, jsxs as jsxs29 } from "react/jsx-runtime";
3138
+ function isBrowserData(data) {
3139
+ if (typeof data !== "object" || data === null) return false;
3140
+ return "url" in data || "content" in data || "text" in data || "markdown" in data || "screenshot_url" in data || "screenshot" in data;
3141
+ }
3142
+ function getDomain2(url) {
3143
+ try {
3144
+ return new URL(url).hostname.replace("www.", "");
3145
+ } catch {
3146
+ return url;
3147
+ }
3148
+ }
3149
+ function BrowserFormatter({ data }) {
3150
+ if (!isBrowserData(data)) {
3151
+ return /* @__PURE__ */ jsx30("pre", { className: "rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto", children: JSON.stringify(data, null, 2) });
3152
+ }
3153
+ const content = data.content || data.text || data.markdown || "";
3154
+ const screenshotUrl = data.screenshot_url || data.screenshot;
3155
+ return /* @__PURE__ */ jsxs29("div", { className: "space-y-2", children: [
3156
+ data.url && /* @__PURE__ */ jsx30("div", { className: "rounded-lg border border-border bg-card overflow-hidden", children: /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-2 px-3 py-2", children: [
3157
+ /* @__PURE__ */ jsx30(Globe3, { className: "h-4 w-4 text-muted-foreground shrink-0" }),
3158
+ /* @__PURE__ */ jsxs29("div", { className: "min-w-0 flex-1", children: [
3159
+ data.title && /* @__PURE__ */ jsx30("p", { className: "text-sm font-medium text-foreground truncate", children: data.title }),
3160
+ /* @__PURE__ */ jsx30("p", { className: "text-xs text-muted-foreground truncate", children: getDomain2(data.url) })
3161
+ ] }),
3162
+ data.status && /* @__PURE__ */ jsx30("span", { className: `inline-flex rounded-full px-2 py-0.5 text-xs ${Number(data.status) >= 200 && Number(data.status) < 300 ? "text-green-500 bg-green-500/10" : Number(data.status) >= 400 ? "text-destructive bg-destructive/10" : "text-muted-foreground bg-muted"}`, children: data.status }),
3163
+ /* @__PURE__ */ jsx30("a", { href: data.url, target: "_blank", rel: "noopener noreferrer", className: "shrink-0 text-muted-foreground hover:text-foreground", children: /* @__PURE__ */ jsx30(ExternalLink8, { className: "h-3.5 w-3.5" }) })
3164
+ ] }) }),
3165
+ screenshotUrl && /* @__PURE__ */ jsxs29("div", { className: "rounded-lg border border-border bg-background overflow-hidden", children: [
3166
+ /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-1.5 px-3 py-1.5 bg-muted border-b border-border", children: [
3167
+ /* @__PURE__ */ jsx30(Image2, { className: "h-3.5 w-3.5 text-muted-foreground" }),
3168
+ /* @__PURE__ */ jsx30("span", { className: "text-xs text-muted-foreground", children: "Screenshot" })
3169
+ ] }),
3170
+ /* @__PURE__ */ jsx30("div", { className: "p-2", children: /* @__PURE__ */ jsx30(
3171
+ "img",
3172
+ {
3173
+ src: screenshotUrl,
3174
+ alt: data.title || "Page screenshot",
3175
+ className: "w-full rounded border border-border"
3176
+ }
3177
+ ) })
3178
+ ] }),
3179
+ content && /* @__PURE__ */ jsxs29("div", { className: "rounded-lg border border-border bg-background overflow-hidden", children: [
3180
+ /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-1.5 px-3 py-1.5 bg-muted border-b border-border", children: [
3181
+ /* @__PURE__ */ jsx30(FileText7, { className: "h-3.5 w-3.5 text-muted-foreground" }),
3182
+ /* @__PURE__ */ jsx30("span", { className: "text-xs text-muted-foreground", children: "Extracted content" })
3183
+ ] }),
3184
+ /* @__PURE__ */ jsx30("pre", { className: "p-3 text-xs text-foreground overflow-x-auto max-h-80 overflow-y-auto font-mono whitespace-pre-wrap", children: content })
3185
+ ] }),
3186
+ data.links && data.links.length > 0 && /* @__PURE__ */ jsxs29("div", { className: "rounded-lg border border-border bg-card p-3 space-y-1", children: [
3187
+ /* @__PURE__ */ jsxs29("p", { className: "text-xs font-medium text-muted-foreground mb-1.5", children: [
3188
+ "Links (",
3189
+ data.links.length,
3190
+ ")"
3191
+ ] }),
3192
+ /* @__PURE__ */ jsx30("div", { className: "space-y-1 max-h-40 overflow-y-auto", children: data.links.slice(0, 20).map((link, i) => /* @__PURE__ */ jsxs29("div", { className: "flex items-center gap-1.5", children: [
3193
+ /* @__PURE__ */ jsx30(ExternalLink8, { className: "h-3 w-3 text-muted-foreground shrink-0" }),
3194
+ link.href ? /* @__PURE__ */ jsx30("a", { href: link.href, target: "_blank", rel: "noopener noreferrer", className: "text-xs text-primary hover:underline truncate", children: link.text || link.href }) : /* @__PURE__ */ jsx30("span", { className: "text-xs text-foreground truncate", children: link.text })
3195
+ ] }, i)) })
3196
+ ] }),
3197
+ !data.url && !content && !screenshotUrl && /* @__PURE__ */ jsx30("pre", { className: "rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto", children: JSON.stringify(data, null, 2) })
3198
+ ] });
3199
+ }
3200
+
3019
3201
  // src/ui/formatters/generic.tsx
3020
- import { jsx as jsx29 } from "react/jsx-runtime";
3202
+ import { jsx as jsx31 } from "react/jsx-runtime";
3021
3203
  function GenericFormatter({ data }) {
3022
3204
  if (data === null || data === void 0) {
3023
- return /* @__PURE__ */ jsx29("p", { className: "text-sm text-muted-foreground italic", children: "No data returned" });
3205
+ return /* @__PURE__ */ jsx31("p", { className: "text-sm text-muted-foreground italic", children: "No data returned" });
3024
3206
  }
3025
- return /* @__PURE__ */ jsx29("pre", { className: "rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto", children: JSON.stringify(data, null, 2) });
3207
+ return /* @__PURE__ */ jsx31("pre", { className: "rounded-lg border border-border bg-background p-3 text-xs text-foreground overflow-x-auto max-h-96 overflow-y-auto", children: JSON.stringify(data, null, 2) });
3026
3208
  }
3027
3209
 
3028
3210
  // src/ui/tool-result.tsx
3029
- import { jsx as jsx30 } from "react/jsx-runtime";
3211
+ import { jsx as jsx32 } from "react/jsx-runtime";
3030
3212
  function extractToolName(part) {
3031
3213
  if (part.type.startsWith("tool-") && part.type !== "tool-invocation") {
3032
3214
  return part.type.slice(5);
@@ -3079,59 +3261,63 @@ function maybeNormalize(toolName, formatterType, data) {
3079
3261
  function renderFormatter(formatterType, data) {
3080
3262
  switch (formatterType) {
3081
3263
  case "email":
3082
- return /* @__PURE__ */ jsx30(EmailFormatter, { data });
3264
+ return /* @__PURE__ */ jsx32(EmailFormatter, { data });
3083
3265
  case "calendar":
3084
- return /* @__PURE__ */ jsx30(CalendarEventFormatter, { data });
3266
+ return /* @__PURE__ */ jsx32(CalendarEventFormatter, { data });
3085
3267
  case "slack":
3086
- return /* @__PURE__ */ jsx30(SlackMessageFormatter, { data });
3268
+ return /* @__PURE__ */ jsx32(SlackMessageFormatter, { data });
3087
3269
  case "github":
3088
- return /* @__PURE__ */ jsx30(GithubFormatter, { data });
3270
+ return /* @__PURE__ */ jsx32(GithubFormatter, { data });
3089
3271
  case "drive":
3090
- return /* @__PURE__ */ jsx30(DriveFileFormatter, { data });
3272
+ return /* @__PURE__ */ jsx32(DriveFileFormatter, { data });
3091
3273
  case "search":
3092
- return /* @__PURE__ */ jsx30(SearchFormatter, { data });
3274
+ return /* @__PURE__ */ jsx32(SearchFormatter, { data });
3093
3275
  case "docs":
3094
- return /* @__PURE__ */ jsx30(DocsFormatter, { data });
3276
+ return /* @__PURE__ */ jsx32(DocsFormatter, { data });
3095
3277
  case "sheets":
3096
- return /* @__PURE__ */ jsx30(SheetsFormatter, { data });
3278
+ return /* @__PURE__ */ jsx32(SheetsFormatter, { data });
3097
3279
  case "slides":
3098
- return /* @__PURE__ */ jsx30(SlidesFormatter, { data });
3280
+ return /* @__PURE__ */ jsx32(SlidesFormatter, { data });
3099
3281
  case "hubspot":
3100
- return /* @__PURE__ */ jsx30(HubspotFormatter, { data });
3282
+ return /* @__PURE__ */ jsx32(HubspotFormatter, { data });
3101
3283
  case "linear":
3102
- return /* @__PURE__ */ jsx30(LinearFormatter, { data });
3284
+ return /* @__PURE__ */ jsx32(LinearFormatter, { data });
3103
3285
  case "pipedrive":
3104
- return /* @__PURE__ */ jsx30(PipedriveFormatter, { data });
3286
+ return /* @__PURE__ */ jsx32(PipedriveFormatter, { data });
3105
3287
  case "compute":
3106
- return /* @__PURE__ */ jsx30(ComputeFormatter, { data });
3288
+ return /* @__PURE__ */ jsx32(ComputeFormatter, { data });
3107
3289
  case "resend":
3108
- return /* @__PURE__ */ jsx30(ResendFormatter, { data });
3290
+ return /* @__PURE__ */ jsx32(ResendFormatter, { data });
3109
3291
  case "inbox":
3110
- return /* @__PURE__ */ jsx30(InboxFormatter, { data });
3292
+ return /* @__PURE__ */ jsx32(InboxFormatter, { data });
3111
3293
  case "discord":
3112
- return /* @__PURE__ */ jsx30(DiscordFormatter, { data });
3294
+ return /* @__PURE__ */ jsx32(DiscordFormatter, { data });
3113
3295
  case "notion":
3114
- return /* @__PURE__ */ jsx30(NotionFormatter, { data });
3296
+ return /* @__PURE__ */ jsx32(NotionFormatter, { data });
3115
3297
  case "twitter":
3116
- return /* @__PURE__ */ jsx30(TwitterFormatter, { data });
3298
+ return /* @__PURE__ */ jsx32(TwitterFormatter, { data });
3117
3299
  case "telegram":
3118
- return /* @__PURE__ */ jsx30(TelegramFormatter, { data });
3300
+ return /* @__PURE__ */ jsx32(TelegramFormatter, { data });
3119
3301
  case "stripe":
3120
- return /* @__PURE__ */ jsx30(StripeFormatter, { data });
3302
+ return /* @__PURE__ */ jsx32(StripeFormatter, { data });
3121
3303
  case "jira":
3122
- return /* @__PURE__ */ jsx30(JiraFormatter, { data });
3304
+ return /* @__PURE__ */ jsx32(JiraFormatter, { data });
3123
3305
  case "salesforce":
3124
- return /* @__PURE__ */ jsx30(SalesforceFormatter, { data });
3306
+ return /* @__PURE__ */ jsx32(SalesforceFormatter, { data });
3125
3307
  case "brevo":
3126
- return /* @__PURE__ */ jsx30(BrevoFormatter, { data });
3308
+ return /* @__PURE__ */ jsx32(BrevoFormatter, { data });
3127
3309
  case "calendly":
3128
- return /* @__PURE__ */ jsx30(CalendlyFormatter, { data });
3310
+ return /* @__PURE__ */ jsx32(CalendlyFormatter, { data });
3129
3311
  case "twilio":
3130
- return /* @__PURE__ */ jsx30(TwilioFormatter, { data });
3312
+ return /* @__PURE__ */ jsx32(TwilioFormatter, { data });
3131
3313
  case "linkedin":
3132
- return /* @__PURE__ */ jsx30(LinkedInFormatter, { data });
3314
+ return /* @__PURE__ */ jsx32(LinkedInFormatter, { data });
3315
+ case "whatsapp":
3316
+ return /* @__PURE__ */ jsx32(WhatsAppFormatter, { data });
3317
+ case "browser":
3318
+ return /* @__PURE__ */ jsx32(BrowserFormatter, { data });
3133
3319
  default:
3134
- return /* @__PURE__ */ jsx30(GenericFormatter, { data });
3320
+ return /* @__PURE__ */ jsx32(GenericFormatter, { data });
3135
3321
  }
3136
3322
  }
3137
3323
  function SupyagentToolResult({ part }) {
@@ -3146,7 +3332,7 @@ function SupyagentToolResult({ part }) {
3146
3332
  const formatterType = getFormatterType(toolName);
3147
3333
  const data = maybeNormalize(toolName, formatterType, result);
3148
3334
  const summary = getSummary(formatterType, data, toolName);
3149
- return /* @__PURE__ */ jsx30(
3335
+ return /* @__PURE__ */ jsx32(
3150
3336
  CollapsibleResult,
3151
3337
  {
3152
3338
  toolName,
@@ -3159,7 +3345,7 @@ function SupyagentToolResult({ part }) {
3159
3345
 
3160
3346
  // src/ui/tool-input.tsx
3161
3347
  import React2 from "react";
3162
- import { jsx as jsx31, jsxs as jsxs28 } from "react/jsx-runtime";
3348
+ import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
3163
3349
  function formatValue(value) {
3164
3350
  if (value === null || value === void 0) {
3165
3351
  return { text: "null", muted: true };
@@ -3193,11 +3379,11 @@ function formatValue(value) {
3193
3379
  }
3194
3380
  function ToolInput({ args }) {
3195
3381
  if (!args || Object.keys(args).length === 0) return null;
3196
- return /* @__PURE__ */ jsx31("div", { className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm", children: Object.entries(args).map(([key, value]) => {
3382
+ return /* @__PURE__ */ jsx33("div", { className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-1 text-sm", children: Object.entries(args).map(([key, value]) => {
3197
3383
  const formatted = formatValue(value);
3198
- return /* @__PURE__ */ jsxs28(React2.Fragment, { children: [
3199
- /* @__PURE__ */ jsx31("span", { className: "text-muted-foreground select-none", children: key }),
3200
- /* @__PURE__ */ jsx31("span", { className: formatted.muted ? "text-muted-foreground" : "text-foreground", children: formatted.text })
3384
+ return /* @__PURE__ */ jsxs30(React2.Fragment, { children: [
3385
+ /* @__PURE__ */ jsx33("span", { className: "text-muted-foreground select-none", children: key }),
3386
+ /* @__PURE__ */ jsx33("span", { className: formatted.muted ? "text-muted-foreground" : "text-foreground", children: formatted.text })
3201
3387
  ] }, key);
3202
3388
  }) });
3203
3389
  }
@@ -3205,7 +3391,7 @@ function ToolInput({ args }) {
3205
3391
  // src/ui/tool-action.tsx
3206
3392
  import { useState as useState2 } from "react";
3207
3393
  import { ChevronDown as ChevronDown2, ChevronRight as ChevronRight2, Check as Check3, AlertCircle, Loader2 } from "lucide-react";
3208
- import { Fragment, jsx as jsx32, jsxs as jsxs29 } from "react/jsx-runtime";
3394
+ import { Fragment, jsx as jsx34, jsxs as jsxs31 } from "react/jsx-runtime";
3209
3395
  var BADGE_STYLES2 = {
3210
3396
  default: "bg-muted text-muted-foreground",
3211
3397
  success: "bg-green-500/10 text-green-500",
@@ -3238,59 +3424,59 @@ function SupyagentToolAction({ part, defaultExpanded = false }) {
3238
3424
  const hasArgs = args && Object.keys(args).length > 0;
3239
3425
  const hasExpandableContent = hasArgs || formatterOutput;
3240
3426
  const canExpand = !isStreaming && hasExpandableContent;
3241
- return /* @__PURE__ */ jsxs29(
3427
+ return /* @__PURE__ */ jsxs31(
3242
3428
  "div",
3243
3429
  {
3244
3430
  className: "rounded-lg border border-border bg-card overflow-hidden",
3245
3431
  "data-state": isDone ? "done" : isError ? "error" : isStreaming ? "streaming" : "pending",
3246
3432
  children: [
3247
- /* @__PURE__ */ jsxs29(
3433
+ /* @__PURE__ */ jsxs31(
3248
3434
  "button",
3249
3435
  {
3250
3436
  type: "button",
3251
3437
  onClick: () => canExpand && setExpanded(!expanded),
3252
3438
  className: `flex items-center gap-2 w-full px-3 py-2 text-left transition-colors ${canExpand ? "hover:bg-muted cursor-pointer" : "cursor-default"}`,
3253
3439
  children: [
3254
- /* @__PURE__ */ jsxs29("div", { className: "relative shrink-0", children: [
3255
- /* @__PURE__ */ jsx32(ProviderIcon, { toolName, className: "h-4 w-4 text-muted-foreground" }),
3256
- isStreaming && /* @__PURE__ */ jsx32(Loader2, { className: "absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin" })
3440
+ /* @__PURE__ */ jsxs31("div", { className: "relative shrink-0", children: [
3441
+ /* @__PURE__ */ jsx34(ProviderIcon, { toolName, className: "h-4 w-4 text-muted-foreground" }),
3442
+ isStreaming && /* @__PURE__ */ jsx34(Loader2, { className: "absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin" })
3257
3443
  ] }),
3258
- /* @__PURE__ */ jsx32("span", { className: "text-xs text-muted-foreground", children: providerLabel }),
3259
- /* @__PURE__ */ jsx32("span", { className: "text-sm text-foreground", children: actionLabel }),
3260
- summary && /* @__PURE__ */ jsxs29(Fragment, { children: [
3261
- /* @__PURE__ */ jsx32("span", { className: "text-muted-foreground text-xs", children: "\xB7" }),
3262
- /* @__PURE__ */ jsx32("span", { className: "text-sm text-muted-foreground flex-1 truncate", children: summary.text })
3444
+ /* @__PURE__ */ jsx34("span", { className: "text-xs text-muted-foreground", children: providerLabel }),
3445
+ /* @__PURE__ */ jsx34("span", { className: "text-sm text-foreground", children: actionLabel }),
3446
+ summary && /* @__PURE__ */ jsxs31(Fragment, { children: [
3447
+ /* @__PURE__ */ jsx34("span", { className: "text-muted-foreground text-xs", children: "\xB7" }),
3448
+ /* @__PURE__ */ jsx34("span", { className: "text-sm text-muted-foreground flex-1 truncate", children: summary.text })
3263
3449
  ] }),
3264
- !summary && /* @__PURE__ */ jsx32("span", { className: "flex-1" }),
3265
- summary?.badge && /* @__PURE__ */ jsx32(
3450
+ !summary && /* @__PURE__ */ jsx34("span", { className: "flex-1" }),
3451
+ summary?.badge && /* @__PURE__ */ jsx34(
3266
3452
  "span",
3267
3453
  {
3268
3454
  className: `inline-flex items-center rounded-full px-2 py-0.5 text-xs font-medium shrink-0 ${BADGE_STYLES2[summary.badge.variant || "default"]}`,
3269
3455
  children: summary.badge.text
3270
3456
  }
3271
3457
  ),
3272
- isDone && /* @__PURE__ */ jsx32(Check3, { className: "h-3.5 w-3.5 text-green-500 shrink-0" }),
3273
- isError && /* @__PURE__ */ jsxs29("span", { className: "inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive shrink-0", children: [
3274
- /* @__PURE__ */ jsx32(AlertCircle, { className: "h-3 w-3" }),
3458
+ isDone && /* @__PURE__ */ jsx34(Check3, { className: "h-3.5 w-3.5 text-green-500 shrink-0" }),
3459
+ isError && /* @__PURE__ */ jsxs31("span", { className: "inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive shrink-0", children: [
3460
+ /* @__PURE__ */ jsx34(AlertCircle, { className: "h-3 w-3" }),
3275
3461
  "Error"
3276
3462
  ] }),
3277
- isStreaming && /* @__PURE__ */ jsx32("span", { className: "inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse shrink-0", children: "Calling..." }),
3278
- canExpand && (expanded ? /* @__PURE__ */ jsx32(ChevronDown2, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }) : /* @__PURE__ */ jsx32(ChevronRight2, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }))
3463
+ isStreaming && /* @__PURE__ */ jsx34("span", { className: "inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse shrink-0", children: "Calling..." }),
3464
+ canExpand && (expanded ? /* @__PURE__ */ jsx34(ChevronDown2, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }) : /* @__PURE__ */ jsx34(ChevronRight2, { className: "h-3.5 w-3.5 text-muted-foreground shrink-0" }))
3279
3465
  ]
3280
3466
  }
3281
3467
  ),
3282
- /* @__PURE__ */ jsx32(
3468
+ /* @__PURE__ */ jsx34(
3283
3469
  "div",
3284
3470
  {
3285
3471
  className: "grid transition-[grid-template-rows] duration-200 ease-out",
3286
3472
  style: { gridTemplateRows: expanded ? "1fr" : "0fr" },
3287
- children: /* @__PURE__ */ jsx32("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsxs29("div", { className: "border-t border-border px-3 py-2 space-y-3", children: [
3288
- args && Object.keys(args).length > 0 && /* @__PURE__ */ jsxs29("div", { children: [
3289
- /* @__PURE__ */ jsx32("p", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5", children: "Input" }),
3290
- /* @__PURE__ */ jsx32(ToolInput, { args })
3473
+ children: /* @__PURE__ */ jsx34("div", { className: "overflow-hidden", children: /* @__PURE__ */ jsxs31("div", { className: "border-t border-border px-3 py-2 space-y-3", children: [
3474
+ args && Object.keys(args).length > 0 && /* @__PURE__ */ jsxs31("div", { children: [
3475
+ /* @__PURE__ */ jsx34("p", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5", children: "Input" }),
3476
+ /* @__PURE__ */ jsx34(ToolInput, { args })
3291
3477
  ] }),
3292
- formatterOutput && /* @__PURE__ */ jsxs29("div", { children: [
3293
- /* @__PURE__ */ jsx32("p", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5", children: "Output" }),
3478
+ formatterOutput && /* @__PURE__ */ jsxs31("div", { children: [
3479
+ /* @__PURE__ */ jsx34("p", { className: "text-[10px] font-medium uppercase tracking-wider text-muted-foreground mb-1.5", children: "Output" }),
3294
3480
  formatterOutput
3295
3481
  ] })
3296
3482
  ] }) })
@@ -3304,7 +3490,7 @@ function SupyagentToolAction({ part, defaultExpanded = false }) {
3304
3490
  // src/ui/tool-call.tsx
3305
3491
  import { useState as useState3 } from "react";
3306
3492
  import { ChevronDown as ChevronDown3, ChevronRight as ChevronRight3, Check as Check4, AlertCircle as AlertCircle2, Loader2 as Loader22 } from "lucide-react";
3307
- import { jsx as jsx33, jsxs as jsxs30 } from "react/jsx-runtime";
3493
+ import { jsx as jsx35, jsxs as jsxs32 } from "react/jsx-runtime";
3308
3494
  function extractToolName2(part) {
3309
3495
  if (part.type.startsWith("tool-") && part.type !== "tool-invocation") {
3310
3496
  return part.type.slice(5);
@@ -3333,39 +3519,39 @@ function SupyagentToolCall({ part }) {
3333
3519
  const isStreaming = state === "input-streaming";
3334
3520
  const isError = state === "output-error";
3335
3521
  const isDone = state === "output-available";
3336
- return /* @__PURE__ */ jsxs30(
3522
+ return /* @__PURE__ */ jsxs32(
3337
3523
  "div",
3338
3524
  {
3339
3525
  className: "rounded-lg border border-border bg-card overflow-hidden",
3340
3526
  "data-state": isDone ? "done" : isError ? "error" : isStreaming ? "streaming" : "pending",
3341
3527
  children: [
3342
- /* @__PURE__ */ jsxs30(
3528
+ /* @__PURE__ */ jsxs32(
3343
3529
  "button",
3344
3530
  {
3345
3531
  type: "button",
3346
3532
  onClick: () => args && setExpanded(!expanded),
3347
3533
  className: "flex items-center gap-2 w-full px-3 py-2 text-left hover:bg-muted transition-colors",
3348
3534
  children: [
3349
- /* @__PURE__ */ jsxs30("div", { className: "relative", children: [
3350
- /* @__PURE__ */ jsx33(ProviderIcon, { toolName, className: "h-4 w-4 text-muted-foreground" }),
3351
- isStreaming && /* @__PURE__ */ jsx33(Loader22, { className: "absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin" })
3535
+ /* @__PURE__ */ jsxs32("div", { className: "relative", children: [
3536
+ /* @__PURE__ */ jsx35(ProviderIcon, { toolName, className: "h-4 w-4 text-muted-foreground" }),
3537
+ isStreaming && /* @__PURE__ */ jsx35(Loader22, { className: "absolute -top-1 -right-1 h-3 w-3 text-primary animate-spin" })
3352
3538
  ] }),
3353
- /* @__PURE__ */ jsx33("span", { className: "text-xs text-muted-foreground", children: providerLabel }),
3354
- /* @__PURE__ */ jsx33("span", { className: "text-sm text-foreground flex-1", children: actionLabel }),
3355
- isDone && /* @__PURE__ */ jsxs30("span", { className: "inline-flex items-center gap-1 rounded-full bg-green-500/10 px-2 py-0.5 text-xs text-green-500", children: [
3356
- /* @__PURE__ */ jsx33(Check4, { className: "h-3 w-3" }),
3539
+ /* @__PURE__ */ jsx35("span", { className: "text-xs text-muted-foreground", children: providerLabel }),
3540
+ /* @__PURE__ */ jsx35("span", { className: "text-sm text-foreground flex-1", children: actionLabel }),
3541
+ isDone && /* @__PURE__ */ jsxs32("span", { className: "inline-flex items-center gap-1 rounded-full bg-green-500/10 px-2 py-0.5 text-xs text-green-500", children: [
3542
+ /* @__PURE__ */ jsx35(Check4, { className: "h-3 w-3" }),
3357
3543
  "Completed"
3358
3544
  ] }),
3359
- isError && /* @__PURE__ */ jsxs30("span", { className: "inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive", children: [
3360
- /* @__PURE__ */ jsx33(AlertCircle2, { className: "h-3 w-3" }),
3545
+ isError && /* @__PURE__ */ jsxs32("span", { className: "inline-flex items-center gap-1 rounded-full bg-destructive/10 px-2 py-0.5 text-xs text-destructive", children: [
3546
+ /* @__PURE__ */ jsx35(AlertCircle2, { className: "h-3 w-3" }),
3361
3547
  "Error"
3362
3548
  ] }),
3363
- isStreaming && /* @__PURE__ */ jsx33("span", { className: "inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse", children: "Calling..." }),
3364
- args && (expanded ? /* @__PURE__ */ jsx33(ChevronDown3, { className: "h-3.5 w-3.5 text-muted-foreground" }) : /* @__PURE__ */ jsx33(ChevronRight3, { className: "h-3.5 w-3.5 text-muted-foreground" }))
3549
+ isStreaming && /* @__PURE__ */ jsx35("span", { className: "inline-flex items-center gap-1 rounded-full bg-primary/10 px-2 py-0.5 text-xs text-primary animate-pulse", children: "Calling..." }),
3550
+ args && (expanded ? /* @__PURE__ */ jsx35(ChevronDown3, { className: "h-3.5 w-3.5 text-muted-foreground" }) : /* @__PURE__ */ jsx35(ChevronRight3, { className: "h-3.5 w-3.5 text-muted-foreground" }))
3365
3551
  ]
3366
3552
  }
3367
3553
  ),
3368
- expanded && args && /* @__PURE__ */ jsx33("div", { className: "border-t border-border px-3 py-2", children: /* @__PURE__ */ jsx33("pre", { className: "text-xs text-muted-foreground overflow-x-auto", children: JSON.stringify(args, null, 2) }) })
3554
+ expanded && args && /* @__PURE__ */ jsx35("div", { className: "border-t border-border px-3 py-2", children: /* @__PURE__ */ jsx35("pre", { className: "text-xs text-muted-foreground overflow-x-auto", children: JSON.stringify(args, null, 2) }) })
3369
3555
  ]
3370
3556
  }
3371
3557
  );