@webless/agent 0.9.2 → 0.9.3

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
@@ -150,6 +150,7 @@ type AgentTranscriptProps = {
150
150
  activities?: readonly AgentTranscriptActivity[];
151
151
  theme?: Partial<AgentRailTheme>;
152
152
  colorScheme?: AgentColorScheme;
153
+ linkBaseUrl?: string;
153
154
  agentLabel?: string;
154
155
  visitorLabel?: string;
155
156
  label?: string;
@@ -158,6 +159,6 @@ type AgentTranscriptProps = {
158
159
  formatTimestamp?: (createdAt: number) => string;
159
160
  };
160
161
  /** Renders a stored snapshot; never creates a session or exposes chat actions. */
161
- declare function AgentTranscript({ messages, activities, theme, colorScheme, agentLabel, visitorLabel, label, formatTimestamp, showInitialTimestamp, }: AgentTranscriptProps): react.JSX.Element;
162
+ declare function AgentTranscript({ messages, activities, theme, colorScheme, linkBaseUrl, agentLabel, visitorLabel, label, formatTimestamp, showInitialTimestamp, }: AgentTranscriptProps): react.JSX.Element;
162
163
 
163
164
  export { AGENT_ANSWER_FEEDBACK_EVENT_TYPE, AgentColorScheme, AgentInputResponse, AgentMessageFeedback, AgentPlacementConfig, AgentRail, AgentRailPhase, type AgentRailProps, AgentRailState, AgentRailTheme, AgentToolUiSurface, AgentTranscript, type AgentTranscriptActivity, type AgentTranscriptProps, AgentWidget, type AgentWidgetProps, ConversationMessage, FollowUpSuggestion, MessageActions, ResolvedVisitorToolResultPresentation, ToolStep, type UseAgentChatOptions, VisitorToolResultRegistry, buildAgentAnswerFeedbackEvent, createIdleSuggestions, findPrecedingVisitorText, hasVisitorMessages, isAgentBusy, sendAgentAnswerFeedback, useAgentChat };
package/dist/react.d.ts CHANGED
@@ -150,6 +150,7 @@ type AgentTranscriptProps = {
150
150
  activities?: readonly AgentTranscriptActivity[];
151
151
  theme?: Partial<AgentRailTheme>;
152
152
  colorScheme?: AgentColorScheme;
153
+ linkBaseUrl?: string;
153
154
  agentLabel?: string;
154
155
  visitorLabel?: string;
155
156
  label?: string;
@@ -158,6 +159,6 @@ type AgentTranscriptProps = {
158
159
  formatTimestamp?: (createdAt: number) => string;
159
160
  };
160
161
  /** Renders a stored snapshot; never creates a session or exposes chat actions. */
161
- declare function AgentTranscript({ messages, activities, theme, colorScheme, agentLabel, visitorLabel, label, formatTimestamp, showInitialTimestamp, }: AgentTranscriptProps): react.JSX.Element;
162
+ declare function AgentTranscript({ messages, activities, theme, colorScheme, linkBaseUrl, agentLabel, visitorLabel, label, formatTimestamp, showInitialTimestamp, }: AgentTranscriptProps): react.JSX.Element;
162
163
 
163
164
  export { AGENT_ANSWER_FEEDBACK_EVENT_TYPE, AgentColorScheme, AgentInputResponse, AgentMessageFeedback, AgentPlacementConfig, AgentRail, AgentRailPhase, type AgentRailProps, AgentRailState, AgentRailTheme, AgentToolUiSurface, AgentTranscript, type AgentTranscriptActivity, type AgentTranscriptProps, AgentWidget, type AgentWidgetProps, ConversationMessage, FollowUpSuggestion, MessageActions, ResolvedVisitorToolResultPresentation, ToolStep, type UseAgentChatOptions, VisitorToolResultRegistry, buildAgentAnswerFeedbackEvent, createIdleSuggestions, findPrecedingVisitorText, hasVisitorMessages, isAgentBusy, sendAgentAnswerFeedback, useAgentChat };
package/dist/react.js CHANGED
@@ -27,7 +27,7 @@ import {
27
27
  sendAgentAnswerFeedback,
28
28
  useAgentChat,
29
29
  useAgentColorScheme
30
- } from "./chunk-3E632FNE.js";
30
+ } from "./chunk-JIM5AOVC.js";
31
31
 
32
32
  // src/react/components/AgentTranscript/AgentTranscript.tsx
33
33
  import { Fragment as Fragment2 } from "react";
@@ -123,6 +123,7 @@ function AgentTranscript({
123
123
  activities = [],
124
124
  theme,
125
125
  colorScheme,
126
+ linkBaseUrl,
126
127
  agentLabel = "Agent",
127
128
  visitorLabel = "Visitor",
128
129
  label = "Conversation transcript",
@@ -162,6 +163,7 @@ function AgentTranscript({
162
163
  MessageBubble,
163
164
  {
164
165
  message: entry.role === "agent" ? { ...entry, streaming: false } : entry,
166
+ linkBaseUrl,
165
167
  bookingReadOnly: true,
166
168
  bookingDisabled: true
167
169
  }
package/dist/react.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/components/AgentTranscript/AgentTranscript.tsx","../src/react/components/AgentTranscript/TranscriptActivity.tsx","../src/react/components/AgentTranscript/group-activities.ts"],"sourcesContent":["import { Fragment } from \"react\";\nimport type {\n ConversationMessage,\n AgentColorScheme,\n AgentRailTheme,\n} from \"../../types/conversation\";\nimport { useAgentColorScheme } from \"../../hooks/useAgentColorScheme\";\nimport { agentThemeStyle } from \"../../lib/agent-theme\";\nimport { VisitorToolResultView } from \"../VisitorToolResultView/VisitorToolResultView\";\nimport { MessageBubble } from \"../MessageBubble/MessageBubble\";\nimport {\n TranscriptActivity,\n type AgentTranscriptActivity,\n} from \"./TranscriptActivity\";\nimport { groupTranscriptActivities } from \"./group-activities\";\nimport \"./AgentTranscript.css\";\n\nexport type { AgentTranscriptActivity } from \"./TranscriptActivity\";\n\nexport type AgentTranscriptProps = {\n messages: readonly ConversationMessage[];\n activities?: readonly AgentTranscriptActivity[];\n theme?: Partial<AgentRailTheme>;\n colorScheme?: AgentColorScheme;\n agentLabel?: string;\n visitorLabel?: string;\n label?: string;\n /** Hide the opening marker when the host already shows the conversation date. */\n showInitialTimestamp?: boolean;\n formatTimestamp?: (createdAt: number) => string;\n};\n\nconst timestampFormat = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"UTC\",\n});\nfunction defaultTimestamp(createdAt: number) {\n return `${timestampFormat.format(createdAt)} UTC`;\n}\n\n/** Renders a stored snapshot; never creates a session or exposes chat actions. */\nexport function AgentTranscript({\n messages,\n activities = [],\n theme,\n colorScheme,\n agentLabel = \"Agent\",\n visitorLabel = \"Visitor\",\n label = \"Conversation transcript\",\n formatTimestamp = defaultTimestamp,\n showInitialTimestamp = true,\n}: AgentTranscriptProps) {\n const scheme = useAgentColorScheme(colorScheme);\n const entries = [\n ...messages.map((message) => ({ kind: \"message\" as const, ...message })),\n ...groupTranscriptActivities(activities).map((activity) => ({\n kind: \"activity\" as const,\n ...activity,\n })),\n ].sort((left, right) => left.createdAt - right.createdAt);\n return (\n <ol\n className=\"webless-agent-root agent-transcript not-typeset\"\n data-not-typeset=\"\"\n data-color-scheme={scheme}\n aria-label={label}\n style={agentThemeStyle(theme, scheme)}\n >\n {entries.map((entry, index) => {\n const date = new Date(entry.createdAt);\n const previous = entries[index - 1];\n const validTimestamp = Number.isFinite(date.getTime());\n const showTimestamp =\n validTimestamp &&\n (previous\n ? entry.createdAt - previous.createdAt >= 5 * 60 * 1000 ||\n date.toISOString().slice(0, 10) !==\n new Date(previous.createdAt).toJSON()?.slice(0, 10)\n : showInitialTimestamp);\n return (\n <Fragment key={`${entry.kind}:${entry.id}`}>\n {showTimestamp ? (\n <li className=\"agent-transcript__time-marker\">\n <time dateTime={date.toISOString()}>\n {formatTimestamp(entry.createdAt)}\n </time>\n </li>\n ) : null}\n {entry.kind === \"activity\" ? (\n <TranscriptActivity activity={entry} />\n ) : (\n <li\n className={`agent-transcript__message agent-transcript__message--${entry.role}`}\n >\n <div className=\"agent-transcript__meta\">\n <span>\n {entry.role === \"visitor\" ? visitorLabel : agentLabel}\n </span>\n </div>\n <MessageBubble\n message={\n entry.role === \"agent\"\n ? { ...entry, streaming: false }\n : entry\n }\n bookingReadOnly\n bookingDisabled\n />\n </li>\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n","import type { ResolvedVisitorToolResultPresentation } from \"../../lib/tool-result\";\nimport { VisitorToolResultView } from \"../VisitorToolResultView/VisitorToolResultView\";\nimport { SearchReferences } from \"../SearchReferences/SearchReferences\";\nimport { BookingCard } from \"../BookingCard/BookingCard\";\n\nexport type AgentTranscriptActivity = {\n id: string;\n createdAt: number;\n callId: string;\n category: \"tool\" | \"specialist\";\n label: string;\n status: \"started\" | \"completed\" | \"failed\" | \"rejected\";\n result?: ResolvedVisitorToolResultPresentation;\n};\n\nconst statusLabels = {\n started: \"No result recorded\",\n completed: \"\",\n failed: \"Failed\",\n rejected: \"Rejected\",\n};\n\nfunction RecordedResult({\n result,\n}: {\n result: ResolvedVisitorToolResultPresentation;\n}) {\n if (result.kind === \"search\") return <SearchReferences results={[result]} />;\n if (result.kind === \"booking\") {\n const card = result.card;\n if (card.type === \"booking_offer\")\n return <BookingCard readOnly offer={card} />;\n if (card.type === \"booking_confirmed\")\n return (\n <p>Booking confirmed{card.startTime ? ` · ${card.startTime}` : \"\"}</p>\n );\n if (card.type === \"booking_canceled\") return <p>Booking canceled</p>;\n return <p>Information requested</p>;\n }\n return <VisitorToolResultView disabled result={result} />;\n}\n\nexport function TranscriptActivity({\n activity,\n}: {\n activity: AgentTranscriptActivity;\n}) {\n const result =\n activity.result?.kind === \"hidden\" ? undefined : activity.result;\n const heading = (\n <>\n <span>\n {activity.category === \"specialist\"\n ? `Specialist · ${activity.label}`\n : activity.label}\n </span>\n {activity.status !== \"completed\" ? (\n <span className=\"agent-transcript__activity-status\">\n {statusLabels[activity.status]}\n </span>\n ) : null}\n </>\n );\n return (\n <li className=\"agent-transcript__activity\" data-status={activity.status}>\n {result ? (\n <details>\n <summary className=\"agent-transcript__activity-heading\">\n {heading}\n </summary>\n <div className=\"agent-transcript__activity-result\">\n <RecordedResult result={result} />\n </div>\n </details>\n ) : (\n <div className=\"agent-transcript__activity-heading\">{heading}</div>\n )}\n </li>\n );\n}\n","import type { AgentTranscriptActivity } from \"./TranscriptActivity\";\n\n/** A paginated snapshot may deliver a call and its result on different pages. */\nexport function groupTranscriptActivities(\n activities: readonly AgentTranscriptActivity[],\n) {\n const calls = new Map<\n string,\n {\n latest: AgentTranscriptActivity;\n id: string;\n startedAt: number;\n label: string;\n }\n >();\n for (const activity of activities) {\n const key = `${activity.category}:${activity.callId}`;\n const previous = calls.get(key);\n if (!previous) {\n calls.set(key, {\n latest: activity,\n id: activity.id,\n startedAt: activity.createdAt,\n label: activity.label,\n });\n continue;\n }\n const previousHasResult = previous.latest.status !== \"started\";\n const nextHasResult = activity.status !== \"started\";\n const useNext =\n (nextHasResult && !previousHasResult) ||\n (nextHasResult === previousHasResult &&\n activity.createdAt >= previous.latest.createdAt);\n const latest = useNext ? activity : previous.latest;\n calls.set(key, {\n latest,\n id: previous.id,\n startedAt: Math.min(previous.startedAt, activity.createdAt),\n label:\n activity.createdAt < previous.startedAt\n ? activity.label\n : previous.label,\n });\n }\n return [...calls.values()].map(({ latest, id, startedAt, label }) => ({\n ...latest,\n id,\n label,\n createdAt: startedAt,\n }));\n}\n"],"mappings":"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","names":["Fragment","jsx","jsxs","Fragment"]}
1
+ {"version":3,"sources":["../src/react/components/AgentTranscript/AgentTranscript.tsx","../src/react/components/AgentTranscript/TranscriptActivity.tsx","../src/react/components/AgentTranscript/group-activities.ts"],"sourcesContent":["import { Fragment } from \"react\";\nimport type {\n ConversationMessage,\n AgentColorScheme,\n AgentRailTheme,\n} from \"../../types/conversation\";\nimport { useAgentColorScheme } from \"../../hooks/useAgentColorScheme\";\nimport { agentThemeStyle } from \"../../lib/agent-theme\";\nimport { VisitorToolResultView } from \"../VisitorToolResultView/VisitorToolResultView\";\nimport { MessageBubble } from \"../MessageBubble/MessageBubble\";\nimport {\n TranscriptActivity,\n type AgentTranscriptActivity,\n} from \"./TranscriptActivity\";\nimport { groupTranscriptActivities } from \"./group-activities\";\nimport \"./AgentTranscript.css\";\n\nexport type { AgentTranscriptActivity } from \"./TranscriptActivity\";\n\nexport type AgentTranscriptProps = {\n messages: readonly ConversationMessage[];\n activities?: readonly AgentTranscriptActivity[];\n theme?: Partial<AgentRailTheme>;\n colorScheme?: AgentColorScheme;\n linkBaseUrl?: string;\n agentLabel?: string;\n visitorLabel?: string;\n label?: string;\n /** Hide the opening marker when the host already shows the conversation date. */\n showInitialTimestamp?: boolean;\n formatTimestamp?: (createdAt: number) => string;\n};\n\nconst timestampFormat = new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n timeZone: \"UTC\",\n});\nfunction defaultTimestamp(createdAt: number) {\n return `${timestampFormat.format(createdAt)} UTC`;\n}\n\n/** Renders a stored snapshot; never creates a session or exposes chat actions. */\nexport function AgentTranscript({\n messages,\n activities = [],\n theme,\n colorScheme,\n linkBaseUrl,\n agentLabel = \"Agent\",\n visitorLabel = \"Visitor\",\n label = \"Conversation transcript\",\n formatTimestamp = defaultTimestamp,\n showInitialTimestamp = true,\n}: AgentTranscriptProps) {\n const scheme = useAgentColorScheme(colorScheme);\n const entries = [\n ...messages.map((message) => ({ kind: \"message\" as const, ...message })),\n ...groupTranscriptActivities(activities).map((activity) => ({\n kind: \"activity\" as const,\n ...activity,\n })),\n ].sort((left, right) => left.createdAt - right.createdAt);\n return (\n <ol\n className=\"webless-agent-root agent-transcript not-typeset\"\n data-not-typeset=\"\"\n data-color-scheme={scheme}\n aria-label={label}\n style={agentThemeStyle(theme, scheme)}\n >\n {entries.map((entry, index) => {\n const date = new Date(entry.createdAt);\n const previous = entries[index - 1];\n const validTimestamp = Number.isFinite(date.getTime());\n const showTimestamp =\n validTimestamp &&\n (previous\n ? entry.createdAt - previous.createdAt >= 5 * 60 * 1000 ||\n date.toISOString().slice(0, 10) !==\n new Date(previous.createdAt).toJSON()?.slice(0, 10)\n : showInitialTimestamp);\n return (\n <Fragment key={`${entry.kind}:${entry.id}`}>\n {showTimestamp ? (\n <li className=\"agent-transcript__time-marker\">\n <time dateTime={date.toISOString()}>\n {formatTimestamp(entry.createdAt)}\n </time>\n </li>\n ) : null}\n {entry.kind === \"activity\" ? (\n <TranscriptActivity activity={entry} />\n ) : (\n <li\n className={`agent-transcript__message agent-transcript__message--${entry.role}`}\n >\n <div className=\"agent-transcript__meta\">\n <span>\n {entry.role === \"visitor\" ? visitorLabel : agentLabel}\n </span>\n </div>\n <MessageBubble\n message={\n entry.role === \"agent\"\n ? { ...entry, streaming: false }\n : entry\n }\n linkBaseUrl={linkBaseUrl}\n bookingReadOnly\n bookingDisabled\n />\n </li>\n )}\n </Fragment>\n );\n })}\n </ol>\n );\n}\n","import type { ResolvedVisitorToolResultPresentation } from \"../../lib/tool-result\";\nimport { VisitorToolResultView } from \"../VisitorToolResultView/VisitorToolResultView\";\nimport { SearchReferences } from \"../SearchReferences/SearchReferences\";\nimport { BookingCard } from \"../BookingCard/BookingCard\";\n\nexport type AgentTranscriptActivity = {\n id: string;\n createdAt: number;\n callId: string;\n category: \"tool\" | \"specialist\";\n label: string;\n status: \"started\" | \"completed\" | \"failed\" | \"rejected\";\n result?: ResolvedVisitorToolResultPresentation;\n};\n\nconst statusLabels = {\n started: \"No result recorded\",\n completed: \"\",\n failed: \"Failed\",\n rejected: \"Rejected\",\n};\n\nfunction RecordedResult({\n result,\n}: {\n result: ResolvedVisitorToolResultPresentation;\n}) {\n if (result.kind === \"search\") return <SearchReferences results={[result]} />;\n if (result.kind === \"booking\") {\n const card = result.card;\n if (card.type === \"booking_offer\")\n return <BookingCard readOnly offer={card} />;\n if (card.type === \"booking_confirmed\")\n return (\n <p>Booking confirmed{card.startTime ? ` · ${card.startTime}` : \"\"}</p>\n );\n if (card.type === \"booking_canceled\") return <p>Booking canceled</p>;\n return <p>Information requested</p>;\n }\n return <VisitorToolResultView disabled result={result} />;\n}\n\nexport function TranscriptActivity({\n activity,\n}: {\n activity: AgentTranscriptActivity;\n}) {\n const result =\n activity.result?.kind === \"hidden\" ? undefined : activity.result;\n const heading = (\n <>\n <span>\n {activity.category === \"specialist\"\n ? `Specialist · ${activity.label}`\n : activity.label}\n </span>\n {activity.status !== \"completed\" ? (\n <span className=\"agent-transcript__activity-status\">\n {statusLabels[activity.status]}\n </span>\n ) : null}\n </>\n );\n return (\n <li className=\"agent-transcript__activity\" data-status={activity.status}>\n {result ? (\n <details>\n <summary className=\"agent-transcript__activity-heading\">\n {heading}\n </summary>\n <div className=\"agent-transcript__activity-result\">\n <RecordedResult result={result} />\n </div>\n </details>\n ) : (\n <div className=\"agent-transcript__activity-heading\">{heading}</div>\n )}\n </li>\n );\n}\n","import type { AgentTranscriptActivity } from \"./TranscriptActivity\";\n\n/** A paginated snapshot may deliver a call and its result on different pages. */\nexport function groupTranscriptActivities(\n activities: readonly AgentTranscriptActivity[],\n) {\n const calls = new Map<\n string,\n {\n latest: AgentTranscriptActivity;\n id: string;\n startedAt: number;\n label: string;\n }\n >();\n for (const activity of activities) {\n const key = `${activity.category}:${activity.callId}`;\n const previous = calls.get(key);\n if (!previous) {\n calls.set(key, {\n latest: activity,\n id: activity.id,\n startedAt: activity.createdAt,\n label: activity.label,\n });\n continue;\n }\n const previousHasResult = previous.latest.status !== \"started\";\n const nextHasResult = activity.status !== \"started\";\n const useNext =\n (nextHasResult && !previousHasResult) ||\n (nextHasResult === previousHasResult &&\n activity.createdAt >= previous.latest.createdAt);\n const latest = useNext ? activity : previous.latest;\n calls.set(key, {\n latest,\n id: previous.id,\n startedAt: Math.min(previous.startedAt, activity.createdAt),\n label:\n activity.createdAt < previous.startedAt\n ? activity.label\n : previous.label,\n });\n }\n return [...calls.values()].map(({ latest, id, startedAt, label }) => ({\n ...latest,\n id,\n label,\n createdAt: startedAt,\n }));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,SAAS,YAAAA,iBAAgB;;;AC2Bc,SAuBnC,UAvBmC,KAO/B,YAP+B;AAZvC,IAAM,eAAe;AAAA,EACnB,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,UAAU;AACZ;AAEA,SAAS,eAAe;AAAA,EACtB;AACF,GAEG;AACD,MAAI,OAAO,SAAS,SAAU,QAAO,oBAAC,oBAAiB,SAAS,CAAC,MAAM,GAAG;AAC1E,MAAI,OAAO,SAAS,WAAW;AAC7B,UAAM,OAAO,OAAO;AACpB,QAAI,KAAK,SAAS;AAChB,aAAO,oBAAC,eAAY,UAAQ,MAAC,OAAO,MAAM;AAC5C,QAAI,KAAK,SAAS;AAChB,aACE,qBAAC,OAAE;AAAA;AAAA,QAAkB,KAAK,YAAY,SAAM,KAAK,SAAS,KAAK;AAAA,SAAG;AAEtE,QAAI,KAAK,SAAS,mBAAoB,QAAO,oBAAC,OAAE,8BAAgB;AAChE,WAAO,oBAAC,OAAE,mCAAqB;AAAA,EACjC;AACA,SAAO,oBAAC,yBAAsB,UAAQ,MAAC,QAAgB;AACzD;AAEO,SAAS,mBAAmB;AAAA,EACjC;AACF,GAEG;AACD,QAAM,SACJ,SAAS,QAAQ,SAAS,WAAW,SAAY,SAAS;AAC5D,QAAM,UACJ,iCACE;AAAA,wBAAC,UACE,mBAAS,aAAa,eACnB,mBAAgB,SAAS,KAAK,KAC9B,SAAS,OACf;AAAA,IACC,SAAS,WAAW,cACnB,oBAAC,UAAK,WAAU,qCACb,uBAAa,SAAS,MAAM,GAC/B,IACE;AAAA,KACN;AAEF,SACE,oBAAC,QAAG,WAAU,8BAA6B,eAAa,SAAS,QAC9D,mBACC,qBAAC,aACC;AAAA,wBAAC,aAAQ,WAAU,sCAChB,mBACH;AAAA,IACA,oBAAC,SAAI,WAAU,qCACb,8BAAC,kBAAe,QAAgB,GAClC;AAAA,KACF,IAEA,oBAAC,SAAI,WAAU,sCAAsC,mBAAQ,GAEjE;AAEJ;;;AC5EO,SAAS,0BACd,YACA;AACA,QAAM,QAAQ,oBAAI,IAQhB;AACF,aAAW,YAAY,YAAY;AACjC,UAAM,MAAM,GAAG,SAAS,QAAQ,IAAI,SAAS,MAAM;AACnD,UAAM,WAAW,MAAM,IAAI,GAAG;AAC9B,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,KAAK;AAAA,QACb,QAAQ;AAAA,QACR,IAAI,SAAS;AAAA,QACb,WAAW,SAAS;AAAA,QACpB,OAAO,SAAS;AAAA,MAClB,CAAC;AACD;AAAA,IACF;AACA,UAAM,oBAAoB,SAAS,OAAO,WAAW;AACrD,UAAM,gBAAgB,SAAS,WAAW;AAC1C,UAAM,UACH,iBAAiB,CAAC,qBAClB,kBAAkB,qBACjB,SAAS,aAAa,SAAS,OAAO;AAC1C,UAAM,SAAS,UAAU,WAAW,SAAS;AAC7C,UAAM,IAAI,KAAK;AAAA,MACb;AAAA,MACA,IAAI,SAAS;AAAA,MACb,WAAW,KAAK,IAAI,SAAS,WAAW,SAAS,SAAS;AAAA,MAC1D,OACE,SAAS,YAAY,SAAS,YAC1B,SAAS,QACT,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AACA,SAAO,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,QAAQ,IAAI,WAAW,MAAM,OAAO;AAAA,IACpE,GAAG;AAAA,IACH;AAAA,IACA;AAAA,IACA,WAAW;AAAA,EACb,EAAE;AACJ;;;AFsCgB,gBAAAC,MAQF,QAAAC,aARE;AAvDhB,IAAM,kBAAkB,IAAI,KAAK,eAAe,SAAS;AAAA,EACvD,OAAO;AAAA,EACP,KAAK;AAAA,EACL,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,UAAU;AACZ,CAAC;AACD,SAAS,iBAAiB,WAAmB;AAC3C,SAAO,GAAG,gBAAgB,OAAO,SAAS,CAAC;AAC7C;AAGO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,aAAa,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAa;AAAA,EACb,eAAe;AAAA,EACf,QAAQ;AAAA,EACR,kBAAkB;AAAA,EAClB,uBAAuB;AACzB,GAAyB;AACvB,QAAM,SAAS,oBAAoB,WAAW;AAC9C,QAAM,UAAU;AAAA,IACd,GAAG,SAAS,IAAI,CAAC,aAAa,EAAE,MAAM,WAAoB,GAAG,QAAQ,EAAE;AAAA,IACvE,GAAG,0BAA0B,UAAU,EAAE,IAAI,CAAC,cAAc;AAAA,MAC1D,MAAM;AAAA,MACN,GAAG;AAAA,IACL,EAAE;AAAA,EACJ,EAAE,KAAK,CAAC,MAAM,UAAU,KAAK,YAAY,MAAM,SAAS;AACxD,SACE,gBAAAD;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,oBAAiB;AAAA,MACjB,qBAAmB;AAAA,MACnB,cAAY;AAAA,MACZ,OAAO,gBAAgB,OAAO,MAAM;AAAA,MAEnC,kBAAQ,IAAI,CAAC,OAAO,UAAU;AAC7B,cAAM,OAAO,IAAI,KAAK,MAAM,SAAS;AACrC,cAAM,WAAW,QAAQ,QAAQ,CAAC;AAClC,cAAM,iBAAiB,OAAO,SAAS,KAAK,QAAQ,CAAC;AACrD,cAAM,gBACJ,mBACC,WACG,MAAM,YAAY,SAAS,aAAa,IAAI,KAAK,OACjD,KAAK,YAAY,EAAE,MAAM,GAAG,EAAE,MAC5B,IAAI,KAAK,SAAS,SAAS,EAAE,OAAO,GAAG,MAAM,GAAG,EAAE,IACpD;AACN,eACE,gBAAAC,MAACC,WAAA,EACE;AAAA,0BACC,gBAAAF,KAAC,QAAG,WAAU,iCACZ,0BAAAA,KAAC,UAAK,UAAU,KAAK,YAAY,GAC9B,0BAAgB,MAAM,SAAS,GAClC,GACF,IACE;AAAA,UACH,MAAM,SAAS,aACd,gBAAAA,KAAC,sBAAmB,UAAU,OAAO,IAErC,gBAAAC;AAAA,YAAC;AAAA;AAAA,cACC,WAAW,wDAAwD,MAAM,IAAI;AAAA,cAE7E;AAAA,gCAAAD,KAAC,SAAI,WAAU,0BACb,0BAAAA,KAAC,UACE,gBAAM,SAAS,YAAY,eAAe,YAC7C,GACF;AAAA,gBACA,gBAAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,SACE,MAAM,SAAS,UACX,EAAE,GAAG,OAAO,WAAW,MAAM,IAC7B;AAAA,oBAEN;AAAA,oBACA,iBAAe;AAAA,oBACf,iBAAe;AAAA;AAAA,gBACjB;AAAA;AAAA;AAAA,UACF;AAAA,aA7BW,GAAG,MAAM,IAAI,IAAI,MAAM,EAAE,EA+BxC;AAAA,MAEJ,CAAC;AAAA;AAAA,EACH;AAEJ;","names":["Fragment","jsx","jsxs","Fragment"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@webless/agent",
3
- "version": "0.9.2",
3
+ "version": "0.9.3",
4
4
  "description": "Webless Agent SDK — Eve runtime client, React UI, and embed bundle.",
5
5
  "type": "module",
6
6
  "license": "MIT",