@dataverse-kit/agent-kit 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -36,12 +36,14 @@ __export(src_exports, {
36
36
  AgentAppShell: () => AgentAppShell,
37
37
  AgentAvatar: () => AgentAvatar,
38
38
  AgentKitHostProvider: () => AgentKitHostProvider,
39
+ AgentLauncher: () => AgentLauncher,
39
40
  AgentOpsPanel: () => AgentOpsPanel,
40
41
  AgentPicker: () => AgentPicker,
41
42
  AgentStatusBadge: () => AgentStatusBadge,
42
43
  AnswerWithCitations: () => AnswerWithCitations,
43
44
  AppRail: () => AppRail,
44
45
  ApprovalCard: () => ApprovalCard,
46
+ AssistantPanel: () => AssistantPanel,
45
47
  AvailabilityBanner: () => AvailabilityBanner,
46
48
  CitationChip: () => CitationChip,
47
49
  CitationList: () => CitationList,
@@ -53,6 +55,7 @@ __export(src_exports, {
53
55
  DEFAULT_GROUP_WINDOW_MS: () => DEFAULT_GROUP_WINDOW_MS,
54
56
  DayDivider: () => DayDivider,
55
57
  EmptyConversation: () => EmptyConversation,
58
+ FeedbackPanel: () => FeedbackPanel,
56
59
  GlobalSearchBar: () => GlobalSearchBar,
57
60
  GroundingPanel: () => GroundingPanel,
58
61
  LiveAnnouncer: () => LiveAnnouncer,
@@ -114,6 +117,7 @@ __export(src_exports, {
114
117
  splitTextByCitations: () => splitTextByCitations,
115
118
  useConversation: () => useConversation,
116
119
  useFocusRestore: () => useFocusRestore,
120
+ useReturnFocus: () => useReturnFocus,
117
121
  useRovingTabindex: () => useRovingTabindex,
118
122
  useStickyScroll: () => useStickyScroll,
119
123
  useVisuallyHiddenStyles: () => useVisuallyHiddenStyles
@@ -121,7 +125,7 @@ __export(src_exports, {
121
125
  module.exports = __toCommonJS(src_exports);
122
126
 
123
127
  // src/conversation/MessageList.tsx
124
- var React10 = __toESM(require("react"), 1);
128
+ var React11 = __toESM(require("react"), 1);
125
129
  var import_react_components10 = require("@fluentui/react-components");
126
130
  var import_react_icons3 = require("@fluentui/react-icons");
127
131
 
@@ -707,12 +711,40 @@ function useRovingTabindex(options) {
707
711
  return { activeIndex, setActiveIndex, getItemProps };
708
712
  }
709
713
 
710
- // src/hooks/useStickyScroll.ts
714
+ // src/a11y/useReturnFocus.ts
711
715
  var React4 = __toESM(require("react"), 1);
716
+ function useReturnFocus({ open, containerRef, manageInitialFocus = true }) {
717
+ const openerRef = React4.useRef(null);
718
+ const wasOpen = React4.useRef(open);
719
+ React4.useEffect(() => {
720
+ const container = containerRef.current;
721
+ const doc = container?.ownerDocument ?? (typeof document !== "undefined" ? document : void 0);
722
+ if (!doc) return;
723
+ if (open && !wasOpen.current) {
724
+ const active = doc.activeElement;
725
+ openerRef.current = active instanceof HTMLElement && active !== doc.body ? active : null;
726
+ if (manageInitialFocus && container) {
727
+ const first = container.querySelector(
728
+ 'a[href],button:not([disabled]),input:not([disabled]),textarea:not([disabled]),select:not([disabled]),[tabindex]:not([tabindex="-1"])'
729
+ );
730
+ (first ?? container).focus();
731
+ }
732
+ }
733
+ if (!open && wasOpen.current) {
734
+ const opener = openerRef.current;
735
+ if (opener && opener.isConnected) opener.focus();
736
+ openerRef.current = null;
737
+ }
738
+ wasOpen.current = open;
739
+ }, [open, containerRef, manageInitialFocus]);
740
+ }
741
+
742
+ // src/hooks/useStickyScroll.ts
743
+ var React5 = __toESM(require("react"), 1);
712
744
  function useStickyScroll(ref, messageCount) {
713
- const wasPinnedRef = React4.useRef(true);
714
- const [isPinned, setIsPinned] = React4.useState(true);
715
- const onScroll = React4.useCallback(() => {
745
+ const wasPinnedRef = React5.useRef(true);
746
+ const [isPinned, setIsPinned] = React5.useState(true);
747
+ const onScroll = React5.useCallback(() => {
716
748
  const el = ref.current;
717
749
  if (!el) return;
718
750
  const pinned = shouldStickToBottom({
@@ -723,14 +755,14 @@ function useStickyScroll(ref, messageCount) {
723
755
  wasPinnedRef.current = pinned;
724
756
  setIsPinned(pinned);
725
757
  }, [ref]);
726
- const scrollToBottom = React4.useCallback(() => {
758
+ const scrollToBottom = React5.useCallback(() => {
727
759
  const el = ref.current;
728
760
  if (!el) return;
729
761
  el.scrollTo({ top: el.scrollHeight, behavior: "auto" });
730
762
  wasPinnedRef.current = true;
731
763
  setIsPinned(true);
732
764
  }, [ref]);
733
- React4.useEffect(() => {
765
+ React5.useEffect(() => {
734
766
  if (!wasPinnedRef.current) return;
735
767
  const el = ref.current;
736
768
  if (!el) return;
@@ -740,30 +772,30 @@ function useStickyScroll(ref, messageCount) {
740
772
  }
741
773
 
742
774
  // src/hooks/useConversation.ts
743
- var React5 = __toESM(require("react"), 1);
775
+ var React6 = __toESM(require("react"), 1);
744
776
  var fallbackId = 0;
745
777
  function useConversation(options) {
746
778
  const { service, seed, grounding, conversationId, createId } = options;
747
- const [state, setState] = React5.useState(() => initialConversation(seed));
748
- const [announcement, setAnnouncement] = React5.useState(NO_ANNOUNCEMENT);
749
- const abortRef = React5.useRef(null);
750
- const stateRef = React5.useRef(state);
779
+ const [state, setState] = React6.useState(() => initialConversation(seed));
780
+ const [announcement, setAnnouncement] = React6.useState(NO_ANNOUNCEMENT);
781
+ const abortRef = React6.useRef(null);
782
+ const stateRef = React6.useRef(state);
751
783
  stateRef.current = state;
752
- const nextId = React5.useCallback(
784
+ const nextId = React6.useCallback(
753
785
  () => createId?.() ?? `m${++fallbackId}-${Date.now().toString(36)}`,
754
786
  [createId]
755
787
  );
756
- const commit = React5.useCallback((next) => {
788
+ const commit = React6.useCallback((next) => {
757
789
  const previous = stateRef.current;
758
790
  stateRef.current = next;
759
791
  setState(next);
760
792
  const derived = deriveAnnouncement(next, previous);
761
793
  if (derived.polite || derived.assertive) setAnnouncement(derived);
762
794
  }, []);
763
- const cancel = React5.useCallback(() => {
795
+ const cancel = React6.useCallback(() => {
764
796
  abortRef.current?.abort();
765
797
  }, []);
766
- const send = React5.useCallback(
798
+ const send = React6.useCallback(
767
799
  async (text, attachments) => {
768
800
  if (!text.trim()) return;
769
801
  abortRef.current?.abort();
@@ -800,13 +832,13 @@ function useConversation(options) {
800
832
  },
801
833
  [service, grounding, conversationId, nextId, commit]
802
834
  );
803
- React5.useEffect(() => () => abortRef.current?.abort(), []);
835
+ React6.useEffect(() => () => abortRef.current?.abort(), []);
804
836
  const busy = state.status === "connecting" || state.status === "streaming";
805
837
  return { state, announcement, busy, send, cancel };
806
838
  }
807
839
 
808
840
  // src/conversation/MessageBubble.tsx
809
- var React9 = __toESM(require("react"), 1);
841
+ var React10 = __toESM(require("react"), 1);
810
842
  var import_react_components7 = require("@fluentui/react-components");
811
843
 
812
844
  // src/conversation/StreamingText.tsx
@@ -883,7 +915,7 @@ function ActionToolbar({ actions, label, className }) {
883
915
  }
884
916
 
885
917
  // src/internal/CardSurface.tsx
886
- var React6 = __toESM(require("react"), 1);
918
+ var React7 = __toESM(require("react"), 1);
887
919
  var import_react_components4 = require("@fluentui/react-components");
888
920
  var import_jsx_runtime4 = require("react/jsx-runtime");
889
921
  var useStyles3 = (0, import_react_components4.makeStyles)({
@@ -899,7 +931,7 @@ var useStyles3 = (0, import_react_components4.makeStyles)({
899
931
  },
900
932
  attention: { borderLeft: `3px solid ${import_react_components4.tokens.colorBrandStroke1}` }
901
933
  });
902
- var CardSurface = React6.forwardRef(
934
+ var CardSurface = React7.forwardRef(
903
935
  function CardSurface2({ emphasis = "none", className, children, ...rest }, ref) {
904
936
  const styles = useStyles3();
905
937
  return /* @__PURE__ */ (0, import_jsx_runtime4.jsx)(
@@ -915,7 +947,7 @@ var CardSurface = React6.forwardRef(
915
947
  );
916
948
 
917
949
  // src/internal/ConfirmInline.tsx
918
- var React7 = __toESM(require("react"), 1);
950
+ var React8 = __toESM(require("react"), 1);
919
951
  var import_react_components5 = require("@fluentui/react-components");
920
952
  var import_jsx_runtime5 = require("react/jsx-runtime");
921
953
  var useStyles4 = (0, import_react_components5.makeStyles)({
@@ -926,11 +958,11 @@ var FOCUSABLE = 'a[href],button:not([disabled]),input:not([disabled]),textarea:n
926
958
  function ConfirmInline(props) {
927
959
  const { open, title, body, confirmLabel = "Confirm", cancelLabel = "Cancel", destructive, onConfirm, onCancel } = props;
928
960
  const styles = useStyles4();
929
- const ref = React7.useRef(null);
930
- const returnTo = React7.useRef(null);
931
- const titleId = React7.useId();
932
- const bodyId = React7.useId();
933
- React7.useEffect(() => {
961
+ const ref = React8.useRef(null);
962
+ const returnTo = React8.useRef(null);
963
+ const titleId = React8.useId();
964
+ const bodyId = React8.useId();
965
+ React8.useEffect(() => {
934
966
  if (!open) return;
935
967
  returnTo.current = document.activeElement ?? null;
936
968
  const first = ref.current?.querySelector(FOCUSABLE);
@@ -985,7 +1017,7 @@ function ConfirmInline(props) {
985
1017
  }
986
1018
 
987
1019
  // src/internal/Disclosure.tsx
988
- var React8 = __toESM(require("react"), 1);
1020
+ var React9 = __toESM(require("react"), 1);
989
1021
  var import_react_components6 = require("@fluentui/react-components");
990
1022
  var import_react_icons = require("@fluentui/react-icons");
991
1023
  var import_jsx_runtime6 = require("react/jsx-runtime");
@@ -1013,7 +1045,7 @@ function Disclosure({
1013
1045
  className
1014
1046
  }) {
1015
1047
  const styles = useStyles5();
1016
- const [open, setOpen] = React8.useState(defaultOpen);
1048
+ const [open, setOpen] = React9.useState(defaultOpen);
1017
1049
  const panelId = `${id}-panel`;
1018
1050
  return /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)("div", { className, children: [
1019
1051
  /* @__PURE__ */ (0, import_jsx_runtime6.jsxs)(
@@ -1110,7 +1142,7 @@ function MessageBubble(props) {
1110
1142
  const { message, author, isRunStart = true, locale, ...actionHandlers } = props;
1111
1143
  const styles = useStyles6();
1112
1144
  const hidden = useVisuallyHiddenStyles();
1113
- const [revealed, setRevealed] = React9.useState(false);
1145
+ const [revealed, setRevealed] = React10.useState(false);
1114
1146
  const own = message.role === "user";
1115
1147
  const name = author?.displayName ?? (own ? "You" : message.provider ?? "Assistant");
1116
1148
  const time = new Intl.DateTimeFormat(locale, { timeStyle: "short" }).format(new Date(message.createdAt));
@@ -1248,21 +1280,21 @@ function MessageList(props) {
1248
1280
  ...actionHandlers
1249
1281
  } = props;
1250
1282
  const styles = useStyles9();
1251
- const scrollerRef = React10.useRef(null);
1283
+ const scrollerRef = React11.useRef(null);
1252
1284
  const { onScroll, scrollToBottom, isPinned } = useStickyScroll(scrollerRef, messages.length);
1253
- const byId = React10.useMemo(
1285
+ const byId = React11.useMemo(
1254
1286
  () => new Map((participants ?? []).map((p) => [p.id, p])),
1255
1287
  [participants]
1256
1288
  );
1257
- const runStarts = React10.useMemo(() => {
1289
+ const runStarts = React11.useMemo(() => {
1258
1290
  const groups = groupMessages(messages, { windowMs: groupWindowMs, timeZone });
1259
1291
  return new Set(groups.map((g) => g.messageIds[0]));
1260
1292
  }, [messages, groupWindowMs, timeZone]);
1261
- const buckets = React10.useMemo(
1293
+ const buckets = React11.useMemo(
1262
1294
  () => bucketByDay(messages, { timeZone, now }),
1263
1295
  [messages, timeZone, now]
1264
1296
  );
1265
- const dividerBefore = React10.useMemo(() => {
1297
+ const dividerBefore = React11.useMemo(() => {
1266
1298
  const map = /* @__PURE__ */ new Map();
1267
1299
  for (const bucket of buckets) map.set(bucket.messageIds[0], bucket.label);
1268
1300
  return map;
@@ -1279,7 +1311,7 @@ function MessageList(props) {
1279
1311
  "aria-label": "Conversation",
1280
1312
  tabIndex: 0,
1281
1313
  children: [
1282
- messages.length === 0 ? emptyState ?? null : messages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(React10.Fragment, { children: [
1314
+ messages.length === 0 ? emptyState ?? null : messages.map((message) => /* @__PURE__ */ (0, import_jsx_runtime11.jsxs)(React11.Fragment, { children: [
1283
1315
  dividerBefore.has(message.id) ? /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(DayDivider, { label: dividerBefore.get(message.id), locale }) : null,
1284
1316
  /* @__PURE__ */ (0, import_jsx_runtime11.jsx)(
1285
1317
  MessageBubble,
@@ -1311,20 +1343,77 @@ function MessageList(props) {
1311
1343
  }
1312
1344
 
1313
1345
  // src/conversation/Composer.tsx
1314
- var React11 = __toESM(require("react"), 1);
1346
+ var React12 = __toESM(require("react"), 1);
1315
1347
  var import_react_components11 = require("@fluentui/react-components");
1316
1348
  var import_react_icons4 = require("@fluentui/react-icons");
1317
1349
  var import_jsx_runtime12 = require("react/jsx-runtime");
1350
+ var MAX_ROWS = 6;
1318
1351
  var useStyles10 = (0, import_react_components11.makeStyles)({
1319
- root: {
1320
- display: "flex",
1321
- gap: import_react_components11.tokens.spacingHorizontalS,
1322
- alignItems: "flex-end",
1352
+ wrapper: {
1323
1353
  padding: import_react_components11.tokens.spacingVerticalS,
1324
1354
  borderTop: `1px solid ${import_react_components11.tokens.colorNeutralStroke2}`
1325
1355
  },
1326
- input: { flex: 1 },
1327
- hint: { fontSize: import_react_components11.tokens.fontSizeBase100, color: import_react_components11.tokens.colorNeutralForeground3 }
1356
+ // The Teams send box: ONE rounded container holding the field and the affordances.
1357
+ box: {
1358
+ display: "flex",
1359
+ alignItems: "flex-end",
1360
+ gap: import_react_components11.tokens.spacingHorizontalXXS,
1361
+ paddingLeft: import_react_components11.tokens.spacingHorizontalS,
1362
+ paddingRight: import_react_components11.tokens.spacingHorizontalXXS,
1363
+ paddingTop: import_react_components11.tokens.spacingVerticalXXS,
1364
+ paddingBottom: import_react_components11.tokens.spacingVerticalXXS,
1365
+ borderRadius: import_react_components11.tokens.borderRadiusXLarge,
1366
+ border: `1px solid ${import_react_components11.tokens.colorNeutralStroke1}`,
1367
+ backgroundColor: import_react_components11.tokens.colorNeutralBackground1,
1368
+ // ★ The ring moves to the CONTAINER because the field's own indicator is suppressed below.
1369
+ // It is an `outline`, not a box-shadow, so forced-colors still paints it (a11y rule 5).
1370
+ ":focus-within": {
1371
+ border: `1px solid ${import_react_components11.tokens.colorCompoundBrandStroke}`,
1372
+ outline: `2px solid ${import_react_components11.tokens.colorCompoundBrandStroke}`,
1373
+ outlineOffset: "-1px"
1374
+ }
1375
+ },
1376
+ boxDisabled: {
1377
+ backgroundColor: import_react_components11.tokens.colorNeutralBackgroundDisabled,
1378
+ border: `1px solid ${import_react_components11.tokens.colorNeutralStrokeDisabled}`
1379
+ },
1380
+ // Fluent's Textarea has no transparent appearance, so its chrome is removed here and the
1381
+ // container above supplies it. `::after` is Fluent's focus underline.
1382
+ field: {
1383
+ flexGrow: 1,
1384
+ minWidth: 0,
1385
+ backgroundColor: "transparent",
1386
+ border: "none",
1387
+ borderRadius: 0,
1388
+ "::after": { display: "none" }
1389
+ },
1390
+ fieldInner: {
1391
+ backgroundColor: "transparent",
1392
+ // ★ Fluent's Textarea ships `min-height: 52px` (measured). The affordance buttons are 32px,
1393
+ // so the default left the placeholder on one line and the icons on another — the single
1394
+ // visible difference from the Teams reference. Matching the button height puts them on
1395
+ // one baseline; growth past one row is then driven by `rows`, up to maxHeight.
1396
+ minHeight: "32px",
1397
+ maxHeight: "160px",
1398
+ paddingLeft: 0,
1399
+ paddingRight: 0
1400
+ },
1401
+ actions: {
1402
+ display: "flex",
1403
+ alignItems: "center",
1404
+ gap: import_react_components11.tokens.spacingHorizontalXXS
1405
+ // ★ No extra bottom padding: `alignItems: flex-end` on the box already pins this row to the
1406
+ // field's last line, and padding on top of it pushed the send glyph visibly below the
1407
+ // baseline on a single-row box (measured against the Teams reference).
1408
+ },
1409
+ divider: {
1410
+ width: "1px",
1411
+ alignSelf: "center",
1412
+ height: "20px",
1413
+ marginLeft: import_react_components11.tokens.spacingHorizontalXXS,
1414
+ marginRight: import_react_components11.tokens.spacingHorizontalXXS,
1415
+ backgroundColor: import_react_components11.tokens.colorNeutralStroke2
1416
+ }
1328
1417
  });
1329
1418
  function Composer(props) {
1330
1419
  const {
@@ -1340,7 +1429,8 @@ function Composer(props) {
1340
1429
  toolbar
1341
1430
  } = props;
1342
1431
  const styles = useStyles10();
1343
- const hintId = React11.useId();
1432
+ const vh = useVisuallyHiddenStyles();
1433
+ const hintId = React12.useId();
1344
1434
  const submit = () => {
1345
1435
  const text = value.trim();
1346
1436
  if (!text || busy || disabled) return;
@@ -1354,35 +1444,41 @@ function Composer(props) {
1354
1444
  submit();
1355
1445
  };
1356
1446
  const hint = sendOn === "enter" ? "Press Enter to send, Shift plus Enter for a new line." : "Press Control or Command plus Enter to send.";
1357
- return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: styles.root, children: [
1358
- /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: styles.input, children: [
1447
+ const rows = Math.min(MAX_ROWS, Math.max(1, value.split("\n").length));
1448
+ return /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: styles.wrapper, children: [
1449
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: (0, import_react_components11.mergeClasses)(styles.box, disabled && styles.boxDisabled), children: [
1359
1450
  /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1360
1451
  import_react_components11.Textarea,
1361
1452
  {
1453
+ className: styles.field,
1362
1454
  value,
1363
1455
  onChange: (_, data) => onChange(data.value),
1364
1456
  onKeyDown,
1365
1457
  placeholder,
1366
1458
  disabled,
1367
1459
  maxLength,
1368
- resize: "vertical",
1460
+ resize: "none",
1461
+ appearance: "outline",
1369
1462
  "aria-label": placeholder,
1370
1463
  "aria-describedby": hintId,
1371
- textarea: { "aria-multiline": true }
1464
+ textarea: { "aria-multiline": true, rows, className: styles.fieldInner }
1372
1465
  }
1373
1466
  ),
1374
- /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { id: hintId, className: styles.hint, children: hint })
1467
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsxs)("div", { className: styles.actions, children: [
1468
+ toolbar,
1469
+ toolbar ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { className: styles.divider, "aria-hidden": "true" }) : null,
1470
+ busy && onStop ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_components11.Tooltip, { content: "Stop generating", relationship: "label", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_components11.Button, { appearance: "subtle", icon: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_icons4.StopRegular, {}), onClick: onStop }) }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_components11.Tooltip, { content: "Send", relationship: "label", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1471
+ import_react_components11.Button,
1472
+ {
1473
+ appearance: "subtle",
1474
+ icon: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_icons4.SendRegular, {}),
1475
+ onClick: submit,
1476
+ disabled: !value.trim() || busy || disabled
1477
+ }
1478
+ ) })
1479
+ ] })
1375
1480
  ] }),
1376
- toolbar,
1377
- busy && onStop ? /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_components11.Tooltip, { content: "Stop generating", relationship: "label", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_components11.Button, { appearance: "secondary", icon: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_icons4.StopRegular, {}), onClick: onStop }) }) : /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_components11.Tooltip, { content: "Send", relationship: "label", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(
1378
- import_react_components11.Button,
1379
- {
1380
- appearance: "primary",
1381
- icon: /* @__PURE__ */ (0, import_jsx_runtime12.jsx)(import_react_icons4.SendRegular, {}),
1382
- onClick: submit,
1383
- disabled: !value.trim() || busy || disabled
1384
- }
1385
- ) })
1481
+ /* @__PURE__ */ (0, import_jsx_runtime12.jsx)("span", { id: hintId, className: vh.root, children: hint })
1386
1482
  ] });
1387
1483
  }
1388
1484
 
@@ -1391,19 +1487,34 @@ var import_react_components12 = require("@fluentui/react-components");
1391
1487
  var import_jsx_runtime13 = require("react/jsx-runtime");
1392
1488
  var useStyles11 = (0, import_react_components12.makeStyles)({
1393
1489
  root: { display: "flex", flexWrap: "wrap", gap: import_react_components12.tokens.spacingHorizontalXS, padding: import_react_components12.tokens.spacingVerticalXS },
1490
+ // ★ The heading is `width: 100%`, so it takes the PARENT's text-align while the chips take the
1491
+ // flex row's justification. That split is why the label could look centred while the chips
1492
+ // stayed left-packed — the two are aligned by different mechanisms and must both be set.
1493
+ center: { justifyContent: "center" },
1494
+ headingCenter: { textAlign: "center" },
1394
1495
  heading: { width: "100%", fontSize: import_react_components12.tokens.fontSizeBase200, color: import_react_components12.tokens.colorNeutralForeground3 }
1395
1496
  });
1396
1497
  function SuggestedPrompts({
1397
1498
  prompts,
1398
1499
  onPick,
1399
- heading = "Suggested follow-ups"
1500
+ heading = "Suggested follow-ups",
1501
+ align = "start"
1400
1502
  }) {
1401
1503
  const styles = useStyles11();
1402
1504
  if (prompts.length === 0) return null;
1403
- return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)("div", { className: styles.root, role: "group", "aria-label": heading, children: [
1404
- /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: styles.heading, children: heading }),
1405
- prompts.map((prompt) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_components12.Button, { size: "small", appearance: "outline", onClick: () => onPick(prompt), children: prompt }, prompt))
1406
- ] });
1505
+ const centered = align === "center";
1506
+ return /* @__PURE__ */ (0, import_jsx_runtime13.jsxs)(
1507
+ "div",
1508
+ {
1509
+ className: (0, import_react_components12.mergeClasses)(styles.root, centered && styles.center),
1510
+ role: "group",
1511
+ "aria-label": heading,
1512
+ children: [
1513
+ /* @__PURE__ */ (0, import_jsx_runtime13.jsx)("span", { className: (0, import_react_components12.mergeClasses)(styles.heading, centered && styles.headingCenter), children: heading }),
1514
+ prompts.map((prompt) => /* @__PURE__ */ (0, import_jsx_runtime13.jsx)(import_react_components12.Button, { size: "small", appearance: "outline", onClick: () => onPick(prompt), children: prompt }, prompt))
1515
+ ]
1516
+ }
1517
+ );
1407
1518
  }
1408
1519
 
1409
1520
  // src/conversation/EmptyConversation.tsx
@@ -1432,7 +1543,7 @@ function EmptyConversation({
1432
1543
  return /* @__PURE__ */ (0, import_jsx_runtime14.jsxs)("div", { className: styles.root, children: [
1433
1544
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_components13.Text, { as: "h2", size: 500, weight: "semibold", children: title }),
1434
1545
  /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(import_react_components13.Text, { children: description }),
1435
- onPick && prompts.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SuggestedPrompts, { prompts, onPick, heading: "Try one of these" }) : null
1546
+ onPick && prompts.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(SuggestedPrompts, { prompts, onPick, heading: "Try one of these", align: "center" }) : null
1436
1547
  ] });
1437
1548
  }
1438
1549
 
@@ -1569,14 +1680,14 @@ function UsageMeter({
1569
1680
  }
1570
1681
 
1571
1682
  // src/ops/ThrottleNotice.tsx
1572
- var React12 = __toESM(require("react"), 1);
1683
+ var React13 = __toESM(require("react"), 1);
1573
1684
  var import_react_components18 = require("@fluentui/react-components");
1574
1685
  var import_jsx_runtime19 = require("react/jsx-runtime");
1575
1686
  function ThrottleNotice({ failure, onRetry, now = Date.now }) {
1576
1687
  const retryAfterMs = failure?.retryAfterMs;
1577
1688
  const eligible = Boolean(failure?.recoverable && retryAfterMs && retryAfterMs > 0);
1578
- const [remaining, setRemaining] = React12.useState(retryAfterMs ?? 0);
1579
- React12.useEffect(() => {
1689
+ const [remaining, setRemaining] = React13.useState(retryAfterMs ?? 0);
1690
+ React13.useEffect(() => {
1580
1691
  if (!eligible) return;
1581
1692
  const deadline = now() + (retryAfterMs ?? 0);
1582
1693
  setRemaining(retryAfterMs ?? 0);
@@ -1635,7 +1746,7 @@ function AgentPicker({
1635
1746
  }
1636
1747
 
1637
1748
  // src/ops/RunTimeline.tsx
1638
- var React13 = __toESM(require("react"), 1);
1749
+ var React14 = __toESM(require("react"), 1);
1639
1750
  var import_react_components21 = require("@fluentui/react-components");
1640
1751
  var import_jsx_runtime22 = require("react/jsx-runtime");
1641
1752
  var useStyles14 = (0, import_react_components21.makeStyles)({
@@ -1655,7 +1766,7 @@ var TOOL_STATUS = {
1655
1766
  };
1656
1767
  function RunTimeline({ message, defaultOpen = false }) {
1657
1768
  const styles = useStyles14();
1658
- const id = React13.useId();
1769
+ const id = React14.useId();
1659
1770
  const calls = message.toolCalls ?? [];
1660
1771
  const sources = message.sources ?? [];
1661
1772
  const hasAnything = calls.length > 0 || sources.length > 0 || message.usage || message.failure;
@@ -1763,18 +1874,388 @@ function AgentOpsPanel(props) {
1763
1874
  ] });
1764
1875
  }
1765
1876
 
1766
- // src/shell/AgentAppShell.tsx
1767
- var React14 = __toESM(require("react"), 1);
1877
+ // src/support/AgentLauncher.tsx
1768
1878
  var import_react_components24 = require("@fluentui/react-components");
1769
- var import_react_icons6 = require("@fluentui/react-icons");
1770
- var import_v9 = require("@dataverse-kit/surface-kit/v9");
1771
1879
  var import_jsx_runtime25 = require("react/jsx-runtime");
1772
1880
  var useStyles17 = (0, import_react_components24.makeStyles)({
1881
+ root: {
1882
+ position: "absolute",
1883
+ top: "30%",
1884
+ display: "flex",
1885
+ flexDirection: "column",
1886
+ zIndex: 100
1887
+ },
1888
+ right: { right: 0, alignItems: "flex-end" },
1889
+ left: { left: 0, alignItems: "flex-start" },
1890
+ hidden: { display: "none" },
1891
+ pill: {
1892
+ display: "flex",
1893
+ alignItems: "center",
1894
+ gap: import_react_components24.tokens.spacingHorizontalS,
1895
+ border: "none",
1896
+ cursor: "pointer",
1897
+ padding: `${import_react_components24.tokens.spacingVerticalM} ${import_react_components24.tokens.spacingHorizontalM}`,
1898
+ color: import_react_components24.tokens.colorNeutralForegroundOnBrand,
1899
+ fontFamily: import_react_components24.tokens.fontFamilyBase,
1900
+ fontSize: import_react_components24.tokens.fontSizeBase300,
1901
+ // ★ Collapsed shows the icon only; the LABEL IS STILL IN THE DOM (see below), so the
1902
+ // expand-on-hover is purely visual and the button is named for AT at every width.
1903
+ maxWidth: "44px",
1904
+ overflow: "hidden",
1905
+ whiteSpace: "nowrap",
1906
+ transitionProperty: "max-width",
1907
+ transitionDuration: import_react_components24.tokens.durationNormal,
1908
+ ":hover": { maxWidth: "260px" },
1909
+ ":hover .fui-launcher-label": { opacity: 1 },
1910
+ ":focus-within .fui-launcher-label": { opacity: 1 },
1911
+ // ★ :focus-within as well as :hover — a keyboard user must get the same reveal, and this is
1912
+ // the affordance the M365 reference only shows on pointer hover.
1913
+ ":focus-within": { maxWidth: "260px" },
1914
+ ":focus-visible": { outline: `2px solid ${import_react_components24.tokens.colorStrokeFocus2}`, outlineOffset: "-2px" }
1915
+ },
1916
+ primary: { backgroundColor: import_react_components24.tokens.colorBrandBackground, ":hover": { backgroundColor: import_react_components24.tokens.colorBrandBackgroundHover, maxWidth: "260px" } },
1917
+ secondary: { backgroundColor: import_react_components24.tokens.colorBrandBackgroundStatic, ":hover": { backgroundColor: import_react_components24.tokens.colorBrandBackgroundStatic, maxWidth: "260px" } },
1918
+ firstRight: { borderTopLeftRadius: import_react_components24.tokens.borderRadiusXLarge },
1919
+ lastRight: { borderBottomLeftRadius: import_react_components24.tokens.borderRadiusXLarge },
1920
+ firstLeft: { borderTopRightRadius: import_react_components24.tokens.borderRadiusXLarge },
1921
+ lastLeft: { borderBottomRightRadius: import_react_components24.tokens.borderRadiusXLarge },
1922
+ // ★★ flexShrink BELONGS ON THE ICON, NOT THE TEXT. With it on the text, a collapsed 44px pill
1923
+ // (20px of content box after padding) gave the unshrinkable label the whole width and squeezed
1924
+ // the icon to ZERO — so the collapsed rail showed two clipped letters instead of a glyph.
1925
+ // MEASURED on Chromatic build 18: svgWidth 0, reported as "the content is off screen".
1926
+ icon: { flexShrink: 0, display: "flex", fontSize: "20px", lineHeight: 1 },
1927
+ // ★ The label FADES rather than relying on the clip. `overflow: hidden` cuts at the PADDING box,
1928
+ // so a 44px pill still showed ~4px of the first letter beside the icon. Opacity keeps the label
1929
+ // in the accessible name (see the class docstring) while hiding it from sight.
1930
+ text: {
1931
+ flexShrink: 1,
1932
+ minWidth: 0,
1933
+ opacity: 0,
1934
+ transitionProperty: "opacity",
1935
+ transitionDuration: import_react_components24.tokens.durationNormal,
1936
+ "@media (prefers-reduced-motion: reduce)": { transitionDuration: "1ms" }
1937
+ }
1938
+ });
1939
+ function AgentLauncher({
1940
+ items,
1941
+ onSelect,
1942
+ side = "right",
1943
+ label = "Assistant",
1944
+ hidden = false
1945
+ }) {
1946
+ const styles = useStyles17();
1947
+ if (items.length === 0) return null;
1948
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1949
+ "div",
1950
+ {
1951
+ className: (0, import_react_components24.mergeClasses)(styles.root, side === "right" ? styles.right : styles.left, hidden && styles.hidden),
1952
+ role: "group",
1953
+ "aria-label": label,
1954
+ children: items.map((item, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(
1955
+ "button",
1956
+ {
1957
+ type: "button",
1958
+ onClick: () => onSelect(item.id),
1959
+ className: (0, import_react_components24.mergeClasses)(
1960
+ styles.pill,
1961
+ i === 0 ? styles.primary : styles.secondary,
1962
+ i === 0 && (side === "right" ? styles.firstRight : styles.firstLeft),
1963
+ i === items.length - 1 && (side === "right" ? styles.lastRight : styles.lastLeft)
1964
+ ),
1965
+ children: [
1966
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: styles.icon, "aria-hidden": "true", children: item.icon }),
1967
+ /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: (0, import_react_components24.mergeClasses)(styles.text, "fui-launcher-label"), children: item.label }),
1968
+ item.badgeCount ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_components24.Badge, { appearance: "filled", color: "danger", children: item.badgeCount }) : null
1969
+ ]
1970
+ },
1971
+ item.id
1972
+ ))
1973
+ }
1974
+ );
1975
+ }
1976
+
1977
+ // src/support/AssistantPanel.tsx
1978
+ var React15 = __toESM(require("react"), 1);
1979
+ var import_react_components25 = require("@fluentui/react-components");
1980
+ var import_react_icons6 = require("@fluentui/react-icons");
1981
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1982
+ var useStyles18 = (0, import_react_components25.makeStyles)({
1983
+ root: {
1984
+ display: "flex",
1985
+ flexDirection: "column",
1986
+ height: "100%",
1987
+ minWidth: "320px",
1988
+ backgroundColor: import_react_components25.tokens.colorNeutralBackground1,
1989
+ borderLeft: `1px solid ${import_react_components25.tokens.colorNeutralStroke2}`,
1990
+ // ★ transform, not width/left — those two lay out on every frame and a transcript is an
1991
+ // expensive subtree to reflow 60 times a second.
1992
+ transform: "translateX(0)",
1993
+ transitionProperty: "transform",
1994
+ transitionDuration: import_react_components25.tokens.durationGentle,
1995
+ transitionTimingFunction: import_react_components25.tokens.curveDecelerateMid,
1996
+ // ★★ prefers-reduced-motion is honoured, and it is not decoration: a full-height panel
1997
+ // sliding across the viewport is exactly the vestibular trigger the setting exists for.
1998
+ "@media (prefers-reduced-motion: reduce)": { transitionDuration: "1ms" }
1999
+ },
2000
+ closed: {
2001
+ transform: "translateX(100%)",
2002
+ // ★ Hidden from AT as well as sight. A translated-off panel is still in the a11y tree and
2003
+ // still tabbable, so a keyboard user would tab into a drawer they cannot see.
2004
+ visibility: "hidden"
2005
+ },
2006
+ header: { display: "flex", alignItems: "center", gap: import_react_components25.tokens.spacingHorizontalS, padding: import_react_components25.tokens.spacingVerticalS },
2007
+ tabstrip: { display: "flex", gap: import_react_components25.tokens.spacingHorizontalXXS, flexGrow: 1 },
2008
+ tab: {
2009
+ display: "flex",
2010
+ alignItems: "center",
2011
+ gap: import_react_components25.tokens.spacingHorizontalXS,
2012
+ border: "none",
2013
+ background: "none",
2014
+ cursor: "pointer",
2015
+ padding: `${import_react_components25.tokens.spacingVerticalXS} ${import_react_components25.tokens.spacingHorizontalS}`,
2016
+ color: import_react_components25.tokens.colorNeutralForeground2,
2017
+ fontFamily: import_react_components25.tokens.fontFamilyBase,
2018
+ borderBottom: `2px solid transparent`,
2019
+ ":focus-visible": { outline: `2px solid ${import_react_components25.tokens.colorStrokeFocus2}`, outlineOffset: "-2px" }
2020
+ },
2021
+ tabSelected: { color: import_react_components25.tokens.colorNeutralForeground1, borderBottom: `2px solid ${import_react_components25.tokens.colorCompoundBrandStroke}` },
2022
+ title: { padding: `0 ${import_react_components25.tokens.spacingHorizontalM} ${import_react_components25.tokens.spacingVerticalS}` },
2023
+ status: {
2024
+ padding: `${import_react_components25.tokens.spacingVerticalXS} ${import_react_components25.tokens.spacingHorizontalM}`,
2025
+ color: import_react_components25.tokens.colorNeutralForeground3,
2026
+ fontSize: import_react_components25.tokens.fontSizeBase200
2027
+ },
2028
+ body: { flexGrow: 1, minHeight: 0, display: "flex", flexDirection: "column" },
2029
+ footer: {
2030
+ display: "flex",
2031
+ alignItems: "center",
2032
+ justifyContent: "space-between",
2033
+ padding: import_react_components25.tokens.spacingVerticalXS,
2034
+ borderTop: `1px solid ${import_react_components25.tokens.colorNeutralStroke2}`
2035
+ }
2036
+ });
2037
+ function AssistantPanel(props) {
2038
+ const {
2039
+ title,
2040
+ tabs,
2041
+ activeTabId,
2042
+ onTabChange,
2043
+ onClose,
2044
+ enabled,
2045
+ onEnabledChange,
2046
+ status,
2047
+ onDownloadTranscript,
2048
+ muted,
2049
+ onMutedChange,
2050
+ children,
2051
+ open = true,
2052
+ onDismiss
2053
+ } = props;
2054
+ const styles = useStyles18();
2055
+ const baseId = React15.useId();
2056
+ const rootRef = React15.useRef(null);
2057
+ useReturnFocus({ open, containerRef: rootRef });
2058
+ const selectedIndex = Math.max(0, tabs.findIndex((t) => t.id === activeTabId));
2059
+ const roving = useRovingTabindex({
2060
+ itemCount: tabs.length,
2061
+ orientation: "horizontal",
2062
+ // ★ MANUAL ACTIVATION: arrows move focus, Enter/Space selects. That is what the kit's
2063
+ // useRovingTabindex does everywhere, and it is the APG pattern for tabs whose panel is not
2064
+ // free to render. Do not special-case it here; consistency is worth more than the one
2065
+ // keystroke, and a divergent strip is the kind of thing nobody notices until it is shipped.
2066
+ onActivate: (i) => tabs[i] && onTabChange(tabs[i].id)
2067
+ });
2068
+ const { setActiveIndex } = roving;
2069
+ React15.useEffect(() => {
2070
+ setActiveIndex(selectedIndex);
2071
+ }, [selectedIndex, setActiveIndex]);
2072
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2073
+ "section",
2074
+ {
2075
+ ref: rootRef,
2076
+ className: (0, import_react_components25.mergeClasses)(styles.root, !open && styles.closed),
2077
+ "aria-label": title,
2078
+ "aria-hidden": !open || void 0,
2079
+ tabIndex: -1,
2080
+ onKeyDown: (e) => {
2081
+ if (e.key !== "Escape" || !onDismiss) return;
2082
+ e.stopPropagation();
2083
+ onDismiss();
2084
+ },
2085
+ children: [
2086
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: styles.header, children: [
2087
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: styles.tabstrip, role: "tablist", "aria-label": `${title} views`, children: tabs.map((tab, i) => {
2088
+ const item = roving.getItemProps(i);
2089
+ const selected = tab.id === activeTabId;
2090
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(
2091
+ "button",
2092
+ {
2093
+ type: "button",
2094
+ role: "tab",
2095
+ id: `${baseId}-tab-${tab.id}`,
2096
+ "aria-selected": selected,
2097
+ "aria-controls": `${baseId}-panel`,
2098
+ className: (0, import_react_components25.mergeClasses)(styles.tab, selected && styles.tabSelected),
2099
+ ...item,
2100
+ onClick: () => {
2101
+ roving.setActiveIndex(i);
2102
+ onTabChange(tab.id);
2103
+ },
2104
+ children: [
2105
+ tab.icon,
2106
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { children: tab.label })
2107
+ ]
2108
+ },
2109
+ tab.id
2110
+ );
2111
+ }) }),
2112
+ onEnabledChange ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Switch, { checked: enabled ?? true, onChange: (_, d) => onEnabledChange(d.checked), label: enabled ?? true ? "On" : "Off" }) : null,
2113
+ onClose ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Tooltip, { content: "Close", relationship: "label", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Button, { appearance: "subtle", icon: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_icons6.DismissRegular, {}), onClick: onClose }) }) : null
2114
+ ] }),
2115
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Text, { as: "h2", size: 600, weight: "semibold", className: styles.title, children: title }),
2116
+ /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: styles.body, id: `${baseId}-panel`, role: "tabpanel", "aria-labelledby": `${baseId}-tab-${activeTabId}`, children: [
2117
+ status ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: styles.status, children: status }) : null,
2118
+ children
2119
+ ] }),
2120
+ onDownloadTranscript || onMutedChange ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("div", { className: styles.footer, children: [
2121
+ onDownloadTranscript ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Tooltip, { content: "Download transcript", relationship: "label", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Button, { appearance: "subtle", icon: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_icons6.ArrowDownloadRegular, {}), onClick: onDownloadTranscript }) }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {}),
2122
+ onMutedChange ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Tooltip, { content: muted ? "Unmute" : "Mute", relationship: "label", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
2123
+ import_react_components25.Button,
2124
+ {
2125
+ appearance: "subtle",
2126
+ "aria-pressed": !!muted,
2127
+ icon: muted ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_icons6.SpeakerMuteRegular, {}) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_icons6.Speaker2Regular, {}),
2128
+ onClick: () => onMutedChange(!muted)
2129
+ }
2130
+ ) }) : /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", {})
2131
+ ] }) : null
2132
+ ]
2133
+ }
2134
+ );
2135
+ }
2136
+
2137
+ // src/support/FeedbackPanel.tsx
2138
+ var React16 = __toESM(require("react"), 1);
2139
+ var import_react_components26 = require("@fluentui/react-components");
2140
+ var import_react_icons7 = require("@fluentui/react-icons");
2141
+ var import_jsx_runtime27 = require("react/jsx-runtime");
2142
+ var STARS = [1, 2, 3, 4, 5];
2143
+ var useStyles19 = (0, import_react_components26.makeStyles)({
2144
+ root: { display: "flex", flexDirection: "column", gap: import_react_components26.tokens.spacingVerticalM, padding: import_react_components26.tokens.spacingVerticalL, maxWidth: "680px" },
2145
+ field: { display: "flex", flexDirection: "column", gap: import_react_components26.tokens.spacingVerticalXS },
2146
+ stars: { display: "flex", gap: import_react_components26.tokens.spacingHorizontalXS },
2147
+ star: {
2148
+ border: "none",
2149
+ background: "none",
2150
+ cursor: "pointer",
2151
+ padding: import_react_components26.tokens.spacingVerticalXXS,
2152
+ color: import_react_components26.tokens.colorNeutralForeground2,
2153
+ fontSize: "26px",
2154
+ lineHeight: 1,
2155
+ ":focus-visible": { outline: `2px solid ${import_react_components26.tokens.colorStrokeFocus2}`, outlineOffset: "2px" }
2156
+ },
2157
+ starOn: { color: import_react_components26.tokens.colorCompoundBrandForeground1 },
2158
+ footer: { display: "flex", justifyContent: "flex-end", gap: import_react_components26.tokens.spacingHorizontalS },
2159
+ note: { color: import_react_components26.tokens.colorNeutralForeground3, fontSize: import_react_components26.tokens.fontSizeBase200 }
2160
+ });
2161
+ function FeedbackPanel(props) {
2162
+ const {
2163
+ value,
2164
+ onChange,
2165
+ onSubmit,
2166
+ onCancel,
2167
+ heading = "Send feedback",
2168
+ ratingLabel = "Rate your experience",
2169
+ attachments,
2170
+ privacyNote,
2171
+ busy = false
2172
+ } = props;
2173
+ const styles = useStyles19();
2174
+ const baseId = React16.useId();
2175
+ const roving = useRovingTabindex({
2176
+ itemCount: STARS.length,
2177
+ orientation: "horizontal",
2178
+ onActivate: (i) => onChange({ ...value, rating: i + 1 })
2179
+ });
2180
+ const canSubmit = value.rating > 0 && value.mayContact !== void 0 && !busy;
2181
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: styles.root, children: [
2182
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Text, { as: "h2", size: 600, weight: "semibold", children: heading }),
2183
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: styles.field, children: [
2184
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Text, { id: `${baseId}-rating`, children: ratingLabel }),
2185
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: styles.stars, role: "radiogroup", "aria-labelledby": `${baseId}-rating`, children: STARS.map((n, i) => {
2186
+ const item = roving.getItemProps(i);
2187
+ const on = value.rating >= n;
2188
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2189
+ "button",
2190
+ {
2191
+ type: "button",
2192
+ role: "radio",
2193
+ "aria-checked": value.rating === n,
2194
+ "aria-label": `${n} of 5`,
2195
+ className: (0, import_react_components26.mergeClasses)(styles.star, on && styles.starOn),
2196
+ ...item,
2197
+ onClick: () => {
2198
+ roving.setActiveIndex(i);
2199
+ onChange({ ...value, rating: n });
2200
+ },
2201
+ children: on ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_icons7.StarFilled, {}) : /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_icons7.StarRegular, {})
2202
+ },
2203
+ n
2204
+ );
2205
+ }) })
2206
+ ] }),
2207
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: styles.field, children: [
2208
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Text, { id: `${baseId}-detail`, children: "Explain in more detail" }),
2209
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
2210
+ import_react_components26.Textarea,
2211
+ {
2212
+ "aria-labelledby": `${baseId}-detail`,
2213
+ placeholder: "Do not include any private or sensitive information.",
2214
+ value: value.comment,
2215
+ onChange: (_, d) => onChange({ ...value, comment: d.value }),
2216
+ resize: "vertical"
2217
+ }
2218
+ )
2219
+ ] }),
2220
+ attachments ? /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: styles.field, children: [
2221
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Text, { children: "Add more details" }),
2222
+ attachments
2223
+ ] }) : null,
2224
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: styles.field, children: [
2225
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Text, { id: `${baseId}-consent`, children: "May we contact you about your feedback?" }),
2226
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)(
2227
+ import_react_components26.RadioGroup,
2228
+ {
2229
+ "aria-labelledby": `${baseId}-consent`,
2230
+ value: value.mayContact === void 0 ? "" : value.mayContact ? "yes" : "no",
2231
+ onChange: (_, d) => onChange({ ...value, mayContact: d.value === "yes" }),
2232
+ children: [
2233
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Radio, { value: "yes", label: "Yes, you may contact me" }),
2234
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Radio, { value: "no", label: "No, don't contact me" })
2235
+ ]
2236
+ }
2237
+ )
2238
+ ] }),
2239
+ privacyNote ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("div", { className: styles.note, children: privacyNote }) : null,
2240
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsxs)("div", { className: styles.footer, children: [
2241
+ onCancel ? /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Button, { appearance: "secondary", onClick: onCancel, children: "Cancel" }) : null,
2242
+ /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(import_react_components26.Button, { appearance: "primary", disabled: !canSubmit, onClick: () => onSubmit(value), children: "Submit" })
2243
+ ] })
2244
+ ] });
2245
+ }
2246
+
2247
+ // src/shell/AgentAppShell.tsx
2248
+ var React17 = __toESM(require("react"), 1);
2249
+ var import_react_components27 = require("@fluentui/react-components");
2250
+ var import_react_icons8 = require("@fluentui/react-icons");
2251
+ var import_v9 = require("@dataverse-kit/surface-kit/v9");
2252
+ var import_jsx_runtime28 = require("react/jsx-runtime");
2253
+ var useStyles20 = (0, import_react_components27.makeStyles)({
1773
2254
  root: {
1774
2255
  display: "flex",
1775
2256
  height: "100%",
1776
2257
  minHeight: 0,
1777
- backgroundColor: import_react_components24.tokens.colorNeutralBackground2,
2258
+ backgroundColor: import_react_components27.tokens.colorNeutralBackground2,
1778
2259
  position: "relative",
1779
2260
  overflow: "hidden"
1780
2261
  },
@@ -1782,8 +2263,8 @@ var useStyles17 = (0, import_react_components24.makeStyles)({
1782
2263
  display: "flex",
1783
2264
  flexDirection: "column",
1784
2265
  minHeight: 0,
1785
- backgroundColor: import_react_components24.tokens.colorNeutralBackground1,
1786
- borderRight: `1px solid ${import_react_components24.tokens.colorNeutralStroke2}`
2266
+ backgroundColor: import_react_components27.tokens.colorNeutralBackground1,
2267
+ borderRight: `1px solid ${import_react_components27.tokens.colorNeutralStroke2}`
1787
2268
  },
1788
2269
  // Below `md` the list overlays the conversation instead of shrinking it to nothing.
1789
2270
  sidebarOverlay: {
@@ -1792,12 +2273,12 @@ var useStyles17 = (0, import_react_components24.makeStyles)({
1792
2273
  bottom: 0,
1793
2274
  left: 0,
1794
2275
  zIndex: 2,
1795
- boxShadow: import_react_components24.tokens.shadow16
2276
+ boxShadow: import_react_components27.tokens.shadow16
1796
2277
  },
1797
- scrim: { position: "absolute", inset: "0", zIndex: 1, backgroundColor: import_react_components24.tokens.colorBackgroundOverlay },
2278
+ scrim: { position: "absolute", inset: "0", zIndex: 1, backgroundColor: import_react_components27.tokens.colorBackgroundOverlay },
1798
2279
  main: { flex: 1, display: "flex", flexDirection: "column", minWidth: 0, minHeight: 0 },
1799
2280
  body: { flex: 1, minHeight: 0, display: "flex", flexDirection: "column" },
1800
- toggle: { position: "absolute", top: import_react_components24.tokens.spacingVerticalS, left: import_react_components24.tokens.spacingHorizontalS, zIndex: 3 }
2281
+ toggle: { position: "absolute", top: import_react_components27.tokens.spacingVerticalS, left: import_react_components27.tokens.spacingHorizontalS, zIndex: 3 }
1801
2282
  });
1802
2283
  function AgentAppShell(props) {
1803
2284
  const {
@@ -1811,7 +2292,7 @@ function AgentAppShell(props) {
1811
2292
  onSidebarOpenChange,
1812
2293
  label = "Agent workspace"
1813
2294
  } = props;
1814
- const styles = useStyles17();
2295
+ const styles = useStyles20();
1815
2296
  const [containerRef, measuredWidth] = (0, import_v9.useContainerWidth)();
1816
2297
  const width = props.containerWidth ?? (measuredWidth > 0 ? measuredWidth : void 0);
1817
2298
  const effective = width ?? import_v9.BREAKPOINTS.xl;
@@ -1819,17 +2300,17 @@ function AgentAppShell(props) {
1819
2300
  const railVisible = effective >= import_v9.BREAKPOINTS.sm;
1820
2301
  const sidebarInline = effective >= import_v9.BREAKPOINTS.md;
1821
2302
  const rightPaneVisible = effective >= import_v9.BREAKPOINTS.lg;
1822
- const [uncontrolledOpen, setUncontrolledOpen] = React14.useState(false);
2303
+ const [uncontrolledOpen, setUncontrolledOpen] = React17.useState(false);
1823
2304
  const overlayOpen = sidebarOpen ?? uncontrolledOpen;
1824
2305
  const setOverlayOpen = (open) => {
1825
2306
  onSidebarOpenChange?.(open);
1826
2307
  if (sidebarOpen === void 0) setUncontrolledOpen(open);
1827
2308
  };
1828
- return /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { ref: containerRef, className: styles.root, "data-breakpoint": breakpoint, "aria-label": label, children: [
2309
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { ref: containerRef, className: styles.root, "data-breakpoint": breakpoint, "aria-label": label, children: [
1829
2310
  rail && railVisible ? rail : null,
1830
- sidebar && sidebarInline ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: styles.sidebar, style: { width: sidebarWidth }, children: sidebar }) : null,
1831
- sidebar && !sidebarInline && overlayOpen ? /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)(import_jsx_runtime25.Fragment, { children: [
1832
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
2311
+ sidebar && sidebarInline ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: styles.sidebar, style: { width: sidebarWidth }, children: sidebar }) : null,
2312
+ sidebar && !sidebarInline && overlayOpen ? /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(import_jsx_runtime28.Fragment, { children: [
2313
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1833
2314
  "div",
1834
2315
  {
1835
2316
  className: styles.scrim,
@@ -1837,49 +2318,49 @@ function AgentAppShell(props) {
1837
2318
  "aria-hidden": "true"
1838
2319
  }
1839
2320
  ),
1840
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: `${styles.sidebar} ${styles.sidebarOverlay}`, style: { width: sidebarWidth }, children: sidebar })
2321
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: `${styles.sidebar} ${styles.sidebarOverlay}`, style: { width: sidebarWidth }, children: sidebar })
1841
2322
  ] }) : null,
1842
- /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("div", { className: styles.main, children: [
1843
- sidebar && !sidebarInline ? /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
1844
- import_react_components24.Button,
2323
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: styles.main, children: [
2324
+ sidebar && !sidebarInline ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
2325
+ import_react_components27.Button,
1845
2326
  {
1846
2327
  className: styles.toggle,
1847
2328
  size: "small",
1848
2329
  appearance: "subtle",
1849
- icon: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(import_react_icons6.NavigationRegular, {}),
2330
+ icon: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(import_react_icons8.NavigationRegular, {}),
1850
2331
  "aria-label": overlayOpen ? "Hide conversations" : "Show conversations",
1851
2332
  "aria-expanded": overlayOpen,
1852
2333
  onClick: () => setOverlayOpen(!overlayOpen)
1853
2334
  }
1854
2335
  ) : null,
1855
2336
  header,
1856
- /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("div", { className: styles.body, children })
2337
+ /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("div", { className: styles.body, children })
1857
2338
  ] }),
1858
2339
  rightPaneVisible ? rightPane : null
1859
2340
  ] });
1860
2341
  }
1861
2342
 
1862
2343
  // src/shell/AppRail.tsx
1863
- var import_react_components25 = require("@fluentui/react-components");
1864
- var import_react_icons7 = require("@fluentui/react-icons");
1865
- var import_jsx_runtime26 = require("react/jsx-runtime");
1866
- var useStyles18 = (0, import_react_components25.makeStyles)({
2344
+ var import_react_components28 = require("@fluentui/react-components");
2345
+ var import_react_icons9 = require("@fluentui/react-icons");
2346
+ var import_jsx_runtime29 = require("react/jsx-runtime");
2347
+ var useStyles21 = (0, import_react_components28.makeStyles)({
1867
2348
  root: {
1868
2349
  display: "flex",
1869
2350
  flexDirection: "column",
1870
2351
  alignItems: "center",
1871
- gap: import_react_components25.tokens.spacingVerticalXS,
1872
- padding: import_react_components25.tokens.spacingVerticalS,
1873
- backgroundColor: import_react_components25.tokens.colorNeutralBackground3,
1874
- borderRight: `1px solid ${import_react_components25.tokens.colorNeutralStroke2}`,
2352
+ gap: import_react_components28.tokens.spacingVerticalXS,
2353
+ padding: import_react_components28.tokens.spacingVerticalS,
2354
+ backgroundColor: import_react_components28.tokens.colorNeutralBackground3,
2355
+ borderRight: `1px solid ${import_react_components28.tokens.colorNeutralStroke2}`,
1875
2356
  minHeight: 0
1876
2357
  },
1877
2358
  spacer: { flex: 1 },
1878
2359
  button: {
1879
2360
  position: "relative",
1880
- ":focus-visible": { outline: `2px solid ${import_react_components25.tokens.colorStrokeFocus2}`, outlineOffset: "1px" }
2361
+ ":focus-visible": { outline: `2px solid ${import_react_components28.tokens.colorStrokeFocus2}`, outlineOffset: "1px" }
1881
2362
  },
1882
- selected: { backgroundColor: import_react_components25.tokens.colorNeutralBackground1Selected },
2363
+ selected: { backgroundColor: import_react_components28.tokens.colorNeutralBackground1Selected },
1883
2364
  badge: {
1884
2365
  position: "absolute",
1885
2366
  top: "2px",
@@ -1887,58 +2368,58 @@ var useStyles18 = (0, import_react_components25.makeStyles)({
1887
2368
  minWidth: "16px",
1888
2369
  height: "16px",
1889
2370
  padding: "0 3px",
1890
- borderRadius: import_react_components25.tokens.borderRadiusCircular,
1891
- backgroundColor: import_react_components25.tokens.colorPaletteRedBackground3,
1892
- color: import_react_components25.tokens.colorNeutralForegroundOnBrand,
2371
+ borderRadius: import_react_components28.tokens.borderRadiusCircular,
2372
+ backgroundColor: import_react_components28.tokens.colorPaletteRedBackground3,
2373
+ color: import_react_components28.tokens.colorNeutralForegroundOnBrand,
1893
2374
  fontSize: "10px",
1894
2375
  lineHeight: "16px"
1895
2376
  }
1896
2377
  });
1897
2378
  function AppRail(props) {
1898
2379
  const { items, selectedId, onSelect, maxVisible = 6, label = "Apps", footer } = props;
1899
- const styles = useStyles18();
2380
+ const styles = useStyles21();
1900
2381
  const visible = items.slice(0, maxVisible);
1901
2382
  const overflow = items.slice(maxVisible);
1902
- return /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)("nav", { className: styles.root, "aria-label": label, children: [
1903
- visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.Tooltip, { content: item.label, relationship: "label", positioning: "after", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1904
- import_react_components25.Button,
2383
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)("nav", { className: styles.root, "aria-label": label, children: [
2384
+ visible.map((item) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_components28.Tooltip, { content: item.label, relationship: "label", positioning: "after", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2385
+ import_react_components28.Button,
1905
2386
  {
1906
2387
  appearance: "subtle",
1907
2388
  icon: item.icon,
1908
- className: (0, import_react_components25.mergeClasses)(styles.button, item.id === selectedId && styles.selected),
2389
+ className: (0, import_react_components28.mergeClasses)(styles.button, item.id === selectedId && styles.selected),
1909
2390
  "aria-pressed": item.id === selectedId,
1910
2391
  "aria-label": item.badgeCount ? `${item.label}, ${item.badgeCount} unread` : item.label,
1911
2392
  onClick: () => onSelect(item.id),
1912
- children: item.badgeCount ? /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: styles.badge, "aria-hidden": "true", children: item.badgeCount }) : null
2393
+ children: item.badgeCount ? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("span", { className: styles.badge, "aria-hidden": "true", children: item.badgeCount }) : null
1913
2394
  }
1914
2395
  ) }, item.id)),
1915
- overflow.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime26.jsxs)(import_react_components25.Menu, { children: [
1916
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.MenuTrigger, { disableButtonEnhancement: true, children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
1917
- import_react_components25.Button,
2396
+ overflow.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(import_react_components28.Menu, { children: [
2397
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_components28.MenuTrigger, { disableButtonEnhancement: true, children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2398
+ import_react_components28.Button,
1918
2399
  {
1919
2400
  appearance: "subtle",
1920
- icon: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_icons7.MoreHorizontalRegular, {}),
2401
+ icon: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_icons9.MoreHorizontalRegular, {}),
1921
2402
  className: styles.button,
1922
2403
  "aria-label": `More apps, ${overflow.length} hidden`
1923
2404
  }
1924
2405
  ) }),
1925
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.MenuPopover, { children: /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.MenuList, { children: overflow.map((item) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(import_react_components25.MenuItem, { icon: item.icon, onClick: () => onSelect(item.id), children: item.label }, item.id)) }) })
2406
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_components28.MenuPopover, { children: /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_components28.MenuList, { children: overflow.map((item) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_components28.MenuItem, { icon: item.icon, onClick: () => onSelect(item.id), children: item.label }, item.id)) }) })
1926
2407
  ] }) : null,
1927
- /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("div", { className: styles.spacer }),
2408
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: styles.spacer }),
1928
2409
  footer
1929
2410
  ] });
1930
2411
  }
1931
2412
 
1932
2413
  // src/shell/ConversationList.tsx
1933
- var React15 = __toESM(require("react"), 1);
1934
- var import_react_components28 = require("@fluentui/react-components");
2414
+ var React18 = __toESM(require("react"), 1);
2415
+ var import_react_components31 = require("@fluentui/react-components");
1935
2416
 
1936
2417
  // src/shell/ConversationListItem.tsx
1937
- var import_react_components27 = require("@fluentui/react-components");
2418
+ var import_react_components30 = require("@fluentui/react-components");
1938
2419
 
1939
2420
  // src/shell/AgentAvatar.tsx
1940
- var import_react_components26 = require("@fluentui/react-components");
1941
- var import_jsx_runtime27 = require("react/jsx-runtime");
2421
+ var import_react_components29 = require("@fluentui/react-components");
2422
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1942
2423
  var STATUS = {
1943
2424
  available: "available",
1944
2425
  busy: "busy",
@@ -1949,8 +2430,8 @@ var STATUS = {
1949
2430
  };
1950
2431
  function AgentAvatar({ participant, presence, size = 32, name }) {
1951
2432
  const displayName = name ?? participant?.displayName ?? "Unknown";
1952
- return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(
1953
- import_react_components26.Avatar,
2433
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2434
+ import_react_components29.Avatar,
1954
2435
  {
1955
2436
  name: displayName,
1956
2437
  initials: participant?.initials,
@@ -1963,49 +2444,49 @@ function AgentAvatar({ participant, presence, size = 32, name }) {
1963
2444
  }
1964
2445
 
1965
2446
  // src/shell/ConversationListItem.tsx
1966
- var import_jsx_runtime28 = require("react/jsx-runtime");
1967
- var useStyles19 = (0, import_react_components27.makeStyles)({
2447
+ var import_jsx_runtime31 = require("react/jsx-runtime");
2448
+ var useStyles22 = (0, import_react_components30.makeStyles)({
1968
2449
  row: {
1969
2450
  display: "flex",
1970
- gap: import_react_components27.tokens.spacingHorizontalS,
2451
+ gap: import_react_components30.tokens.spacingHorizontalS,
1971
2452
  alignItems: "center",
1972
- padding: `${import_react_components27.tokens.spacingVerticalS} ${import_react_components27.tokens.spacingHorizontalS}`,
1973
- borderRadius: import_react_components27.tokens.borderRadiusMedium,
2453
+ padding: `${import_react_components30.tokens.spacingVerticalS} ${import_react_components30.tokens.spacingHorizontalS}`,
2454
+ borderRadius: import_react_components30.tokens.borderRadiusMedium,
1974
2455
  cursor: "pointer",
1975
- ":hover": { backgroundColor: import_react_components27.tokens.colorNeutralBackground1Hover }
2456
+ ":hover": { backgroundColor: import_react_components30.tokens.colorNeutralBackground1Hover }
1976
2457
  },
1977
2458
  // ★ The ACTIVE row (aria-activedescendant target) gets a visible focus indicator, because
1978
2459
  // real DOM focus stays on the listbox — without this the keyboard user sees nothing move.
1979
- active: { outline: `2px solid ${import_react_components27.tokens.colorStrokeFocus2}`, outlineOffset: "-2px" },
1980
- selected: { backgroundColor: import_react_components27.tokens.colorNeutralBackground1Selected },
2460
+ active: { outline: `2px solid ${import_react_components30.tokens.colorStrokeFocus2}`, outlineOffset: "-2px" },
2461
+ selected: { backgroundColor: import_react_components30.tokens.colorNeutralBackground1Selected },
1981
2462
  body: { flex: 1, minWidth: 0 },
1982
2463
  title: {
1983
2464
  display: "block",
1984
- fontSize: import_react_components27.tokens.fontSizeBase300,
1985
- fontWeight: import_react_components27.tokens.fontWeightSemibold,
2465
+ fontSize: import_react_components30.tokens.fontSizeBase300,
2466
+ fontWeight: import_react_components30.tokens.fontWeightSemibold,
1986
2467
  overflow: "hidden",
1987
2468
  textOverflow: "ellipsis",
1988
2469
  whiteSpace: "nowrap"
1989
2470
  },
1990
- muted: { fontWeight: import_react_components27.tokens.fontWeightRegular, color: import_react_components27.tokens.colorNeutralForeground3 },
2471
+ muted: { fontWeight: import_react_components30.tokens.fontWeightRegular, color: import_react_components30.tokens.colorNeutralForeground3 },
1991
2472
  preview: {
1992
2473
  display: "block",
1993
- fontSize: import_react_components27.tokens.fontSizeBase200,
1994
- color: import_react_components27.tokens.colorNeutralForeground3,
2474
+ fontSize: import_react_components30.tokens.fontSizeBase200,
2475
+ color: import_react_components30.tokens.colorNeutralForeground3,
1995
2476
  overflow: "hidden",
1996
2477
  textOverflow: "ellipsis",
1997
2478
  whiteSpace: "nowrap"
1998
2479
  },
1999
2480
  meta: { display: "flex", flexDirection: "column", alignItems: "flex-end", gap: "2px" },
2000
- time: { fontSize: import_react_components27.tokens.fontSizeBase100, color: import_react_components27.tokens.colorNeutralForeground3 },
2481
+ time: { fontSize: import_react_components30.tokens.fontSizeBase100, color: import_react_components30.tokens.colorNeutralForeground3 },
2001
2482
  unread: {
2002
2483
  minWidth: "18px",
2003
2484
  height: "18px",
2004
- padding: `0 ${import_react_components27.tokens.spacingHorizontalXXS}`,
2005
- borderRadius: import_react_components27.tokens.borderRadiusCircular,
2006
- backgroundColor: import_react_components27.tokens.colorBrandBackground,
2007
- color: import_react_components27.tokens.colorNeutralForegroundOnBrand,
2008
- fontSize: import_react_components27.tokens.fontSizeBase100,
2485
+ padding: `0 ${import_react_components30.tokens.spacingHorizontalXXS}`,
2486
+ borderRadius: import_react_components30.tokens.borderRadiusCircular,
2487
+ backgroundColor: import_react_components30.tokens.colorBrandBackground,
2488
+ color: import_react_components30.tokens.colorNeutralForegroundOnBrand,
2489
+ fontSize: import_react_components30.tokens.fontSizeBase100,
2009
2490
  lineHeight: "18px",
2010
2491
  textAlign: "center"
2011
2492
  }
@@ -2024,27 +2505,27 @@ function conversationAccessibleName(summary, locale) {
2024
2505
  }
2025
2506
  function ConversationListItem(props) {
2026
2507
  const { summary, selected, active, id, locale, onSelect } = props;
2027
- const styles = useStyles19();
2508
+ const styles = useStyles22();
2028
2509
  const time = summary.timestamp ? new Intl.DateTimeFormat(locale, { timeStyle: "short" }).format(new Date(summary.timestamp)) : void 0;
2029
- return /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)(
2510
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)(
2030
2511
  "div",
2031
2512
  {
2032
2513
  id,
2033
2514
  role: "option",
2034
2515
  "aria-selected": selected,
2035
2516
  "aria-label": conversationAccessibleName(summary, locale),
2036
- className: (0, import_react_components27.mergeClasses)(styles.row, selected && styles.selected, active && styles.active),
2517
+ className: (0, import_react_components30.mergeClasses)(styles.row, selected && styles.selected, active && styles.active),
2037
2518
  onClick: () => onSelect(summary.id),
2038
2519
  "data-conversation-option": true,
2039
2520
  children: [
2040
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(AgentAvatar, { participant: summary.participant, presence: summary.presence, size: 32 }),
2041
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: styles.body, "aria-hidden": "true", children: [
2042
- /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: (0, import_react_components27.mergeClasses)(styles.title, summary.muted && styles.muted), children: summary.title }),
2043
- summary.preview ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: styles.preview, children: summary.preview }) : null
2521
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(AgentAvatar, { participant: summary.participant, presence: summary.presence, size: 32 }),
2522
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: styles.body, "aria-hidden": "true", children: [
2523
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: (0, import_react_components30.mergeClasses)(styles.title, summary.muted && styles.muted), children: summary.title }),
2524
+ summary.preview ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: styles.preview, children: summary.preview }) : null
2044
2525
  ] }),
2045
- /* @__PURE__ */ (0, import_jsx_runtime28.jsxs)("div", { className: styles.meta, "aria-hidden": "true", children: [
2046
- time ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: styles.time, children: time }) : null,
2047
- !summary.muted && summary.unreadCount ? /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { className: styles.unread, children: summary.unreadCount }) : null
2526
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: styles.meta, "aria-hidden": "true", children: [
2527
+ time ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: styles.time, children: time }) : null,
2528
+ !summary.muted && summary.unreadCount ? /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("span", { className: styles.unread, children: summary.unreadCount }) : null
2048
2529
  ] })
2049
2530
  ]
2050
2531
  }
@@ -2052,27 +2533,27 @@ function ConversationListItem(props) {
2052
2533
  }
2053
2534
 
2054
2535
  // src/shell/ConversationList.tsx
2055
- var import_jsx_runtime29 = require("react/jsx-runtime");
2056
- var useStyles20 = (0, import_react_components28.makeStyles)({
2536
+ var import_jsx_runtime32 = require("react/jsx-runtime");
2537
+ var useStyles23 = (0, import_react_components31.makeStyles)({
2057
2538
  root: {
2058
2539
  display: "flex",
2059
2540
  flexDirection: "column",
2060
2541
  gap: "2px",
2061
- padding: import_react_components28.tokens.spacingHorizontalXS,
2542
+ padding: import_react_components31.tokens.spacingHorizontalXS,
2062
2543
  overflowY: "auto",
2063
2544
  minHeight: 0,
2064
- ":focus-visible": { outline: `2px solid ${import_react_components28.tokens.colorStrokeFocus2}`, outlineOffset: "-2px" }
2545
+ ":focus-visible": { outline: `2px solid ${import_react_components31.tokens.colorStrokeFocus2}`, outlineOffset: "-2px" }
2065
2546
  },
2066
- empty: { padding: import_react_components28.tokens.spacingVerticalM, color: import_react_components28.tokens.colorNeutralForeground3 }
2547
+ empty: { padding: import_react_components31.tokens.spacingVerticalM, color: import_react_components31.tokens.colorNeutralForeground3 }
2067
2548
  });
2068
2549
  function ConversationList(props) {
2069
2550
  const { items, selectedId, onSelect, label = "Conversations", locale, empty } = props;
2070
- const styles = useStyles20();
2071
- const listRef = React15.useRef(null);
2072
- const idBase = React15.useId();
2551
+ const styles = useStyles23();
2552
+ const listRef = React18.useRef(null);
2553
+ const idBase = React18.useId();
2073
2554
  const selectedIndex = Math.max(0, items.findIndex((i) => i.id === selectedId));
2074
- const [active, setActive] = React15.useState(selectedIndex);
2075
- React15.useEffect(() => {
2555
+ const [active, setActive] = React18.useState(selectedIndex);
2556
+ React18.useEffect(() => {
2076
2557
  setActive((current) => {
2077
2558
  if (items.length === 0) return 0;
2078
2559
  if (selectedIndex >= 0 && items[selectedIndex]) return selectedIndex;
@@ -2080,7 +2561,7 @@ function ConversationList(props) {
2080
2561
  });
2081
2562
  }, [selectedIndex, items]);
2082
2563
  const optionId = (index) => `${idBase}-opt-${index}`;
2083
- React15.useEffect(() => {
2564
+ React18.useEffect(() => {
2084
2565
  const el = listRef.current?.ownerDocument.getElementById(optionId(active));
2085
2566
  el?.scrollIntoView?.({ block: "nearest" });
2086
2567
  }, [active, idBase]);
@@ -2103,9 +2584,9 @@ function ConversationList(props) {
2103
2584
  setActive(next);
2104
2585
  };
2105
2586
  if (items.length === 0) {
2106
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: styles.root, children: empty ?? /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(import_react_components28.Text, { className: styles.empty, size: 200, children: "No conversations yet." }) });
2587
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)("div", { className: styles.root, children: empty ?? /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(import_react_components31.Text, { className: styles.empty, size: 200, children: "No conversations yet." }) });
2107
2588
  }
2108
- return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2589
+ return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2109
2590
  "div",
2110
2591
  {
2111
2592
  ref: listRef,
@@ -2115,7 +2596,7 @@ function ConversationList(props) {
2115
2596
  tabIndex: 0,
2116
2597
  "aria-activedescendant": optionId(active),
2117
2598
  onKeyDown,
2118
- children: items.map((summary, index) => /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
2599
+ children: items.map((summary, index) => /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2119
2600
  ConversationListItem,
2120
2601
  {
2121
2602
  id: optionId(index),
@@ -2132,24 +2613,24 @@ function ConversationList(props) {
2132
2613
  }
2133
2614
 
2134
2615
  // src/shell/ConversationHeader.tsx
2135
- var import_react_components29 = require("@fluentui/react-components");
2136
- var import_react_icons8 = require("@fluentui/react-icons");
2137
- var import_jsx_runtime30 = require("react/jsx-runtime");
2138
- var useStyles21 = (0, import_react_components29.makeStyles)({
2616
+ var import_react_components32 = require("@fluentui/react-components");
2617
+ var import_react_icons10 = require("@fluentui/react-icons");
2618
+ var import_jsx_runtime33 = require("react/jsx-runtime");
2619
+ var useStyles24 = (0, import_react_components32.makeStyles)({
2139
2620
  root: {
2140
2621
  display: "flex",
2141
2622
  flexDirection: "column",
2142
- gap: import_react_components29.tokens.spacingVerticalXS,
2143
- padding: `${import_react_components29.tokens.spacingVerticalS} ${import_react_components29.tokens.spacingHorizontalM} 0`,
2144
- borderBottom: `1px solid ${import_react_components29.tokens.colorNeutralStroke2}`,
2145
- backgroundColor: import_react_components29.tokens.colorNeutralBackground1
2623
+ gap: import_react_components32.tokens.spacingVerticalXS,
2624
+ padding: `${import_react_components32.tokens.spacingVerticalS} ${import_react_components32.tokens.spacingHorizontalM} 0`,
2625
+ borderBottom: `1px solid ${import_react_components32.tokens.colorNeutralStroke2}`,
2626
+ backgroundColor: import_react_components32.tokens.colorNeutralBackground1
2146
2627
  },
2147
- top: { display: "flex", alignItems: "center", gap: import_react_components29.tokens.spacingHorizontalS },
2148
- identity: { display: "flex", alignItems: "center", gap: import_react_components29.tokens.spacingHorizontalS, minWidth: 0 },
2628
+ top: { display: "flex", alignItems: "center", gap: import_react_components32.tokens.spacingHorizontalS },
2629
+ identity: { display: "flex", alignItems: "center", gap: import_react_components32.tokens.spacingHorizontalS, minWidth: 0 },
2149
2630
  titles: { display: "flex", flexDirection: "column", minWidth: 0 },
2150
- subtitle: { color: import_react_components29.tokens.colorNeutralForeground3, fontSize: import_react_components29.tokens.fontSizeBase200 },
2631
+ subtitle: { color: import_react_components32.tokens.colorNeutralForeground3, fontSize: import_react_components32.tokens.fontSizeBase200 },
2151
2632
  spacer: { flex: 1 },
2152
- tabRow: { display: "flex", alignItems: "flex-end", gap: import_react_components29.tokens.spacingHorizontalS }
2633
+ tabRow: { display: "flex", alignItems: "flex-end", gap: import_react_components32.tokens.spacingHorizontalS }
2153
2634
  });
2154
2635
  function ConversationHeader(props) {
2155
2636
  const {
@@ -2163,22 +2644,22 @@ function ConversationHeader(props) {
2163
2644
  actions,
2164
2645
  trailing
2165
2646
  } = props;
2166
- const styles = useStyles21();
2647
+ const styles = useStyles24();
2167
2648
  const inline = (actions ?? []).slice(0, 2);
2168
2649
  const overflow = (actions ?? []).slice(2);
2169
- return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("header", { className: styles.root, children: [
2170
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: styles.top, children: [
2171
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: styles.identity, children: [
2172
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(AgentAvatar, { participant, presence, size: 32, name: title }),
2173
- /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: styles.titles, children: [
2174
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react_components29.Text, { weight: "semibold", truncate: true, wrap: false, children: title }),
2175
- subtitle ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { className: styles.subtitle, children: subtitle }) : null
2650
+ return /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("header", { className: styles.root, children: [
2651
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: styles.top, children: [
2652
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: styles.identity, children: [
2653
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(AgentAvatar, { participant, presence, size: 32, name: title }),
2654
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)("div", { className: styles.titles, children: [
2655
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_components32.Text, { weight: "semibold", truncate: true, wrap: false, children: title }),
2656
+ subtitle ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: styles.subtitle, children: subtitle }) : null
2176
2657
  ] })
2177
2658
  ] }),
2178
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: styles.spacer }),
2659
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: styles.spacer }),
2179
2660
  trailing,
2180
- inline.map((action) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2181
- import_react_components29.Button,
2661
+ inline.map((action) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2662
+ import_react_components32.Button,
2182
2663
  {
2183
2664
  appearance: "subtle",
2184
2665
  size: "small",
@@ -2188,80 +2669,80 @@ function ConversationHeader(props) {
2188
2669
  },
2189
2670
  action.key
2190
2671
  )),
2191
- overflow.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)(import_react_components29.Menu, { children: [
2192
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react_components29.MenuTrigger, { disableButtonEnhancement: true, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2193
- import_react_components29.Button,
2672
+ overflow.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime33.jsxs)(import_react_components32.Menu, { children: [
2673
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_components32.MenuTrigger, { disableButtonEnhancement: true, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2674
+ import_react_components32.Button,
2194
2675
  {
2195
2676
  appearance: "subtle",
2196
2677
  size: "small",
2197
- icon: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react_icons8.MoreHorizontalRegular, {}),
2678
+ icon: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_icons10.MoreHorizontalRegular, {}),
2198
2679
  "aria-label": `More actions, ${overflow.length} available`
2199
2680
  }
2200
2681
  ) }),
2201
- /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react_components29.MenuPopover, { children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react_components29.MenuList, { children: overflow.map((action) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react_components29.MenuItem, { icon: action.icon, onClick: action.onClick, children: action.label }, action.key)) }) })
2682
+ /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_components32.MenuPopover, { children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_components32.MenuList, { children: overflow.map((action) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_components32.MenuItem, { icon: action.icon, onClick: action.onClick, children: action.label }, action.key)) }) })
2202
2683
  ] }) : null
2203
2684
  ] }),
2204
- tabs && tabs.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: styles.tabRow, children: /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(
2205
- import_react_components29.TabList,
2685
+ tabs && tabs.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("div", { className: styles.tabRow, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(
2686
+ import_react_components32.TabList,
2206
2687
  {
2207
2688
  selectedValue: selectedTabId,
2208
2689
  onTabSelect: (_, data) => onTabSelect?.(data.value),
2209
2690
  size: "small",
2210
- children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(import_react_components29.Tab, { value: tab.id, children: tab.label }, tab.id))
2691
+ children: tabs.map((tab) => /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_components32.Tab, { value: tab.id, children: tab.label }, tab.id))
2211
2692
  }
2212
2693
  ) }) : null
2213
2694
  ] });
2214
2695
  }
2215
2696
 
2216
2697
  // src/shell/RightPane.tsx
2217
- var React16 = __toESM(require("react"), 1);
2218
- var import_react_components30 = require("@fluentui/react-components");
2219
- var import_react_icons9 = require("@fluentui/react-icons");
2220
- var import_jsx_runtime31 = require("react/jsx-runtime");
2221
- var useStyles22 = (0, import_react_components30.makeStyles)({
2698
+ var React19 = __toESM(require("react"), 1);
2699
+ var import_react_components33 = require("@fluentui/react-components");
2700
+ var import_react_icons11 = require("@fluentui/react-icons");
2701
+ var import_jsx_runtime34 = require("react/jsx-runtime");
2702
+ var useStyles25 = (0, import_react_components33.makeStyles)({
2222
2703
  root: {
2223
2704
  display: "flex",
2224
2705
  flexDirection: "column",
2225
- borderLeft: `1px solid ${import_react_components30.tokens.colorNeutralStroke2}`,
2226
- backgroundColor: import_react_components30.tokens.colorNeutralBackground1,
2706
+ borderLeft: `1px solid ${import_react_components33.tokens.colorNeutralStroke2}`,
2707
+ backgroundColor: import_react_components33.tokens.colorNeutralBackground1,
2227
2708
  minHeight: 0
2228
2709
  },
2229
2710
  head: {
2230
2711
  display: "flex",
2231
2712
  alignItems: "center",
2232
2713
  justifyContent: "space-between",
2233
- gap: import_react_components30.tokens.spacingHorizontalS,
2234
- padding: import_react_components30.tokens.spacingVerticalS,
2235
- borderBottom: `1px solid ${import_react_components30.tokens.colorNeutralStroke2}`
2714
+ gap: import_react_components33.tokens.spacingHorizontalS,
2715
+ padding: import_react_components33.tokens.spacingVerticalS,
2716
+ borderBottom: `1px solid ${import_react_components33.tokens.colorNeutralStroke2}`
2236
2717
  },
2237
- body: { flex: 1, overflowY: "auto", padding: import_react_components30.tokens.spacingVerticalM }
2718
+ body: { flex: 1, overflowY: "auto", padding: import_react_components33.tokens.spacingVerticalM }
2238
2719
  });
2239
2720
  function RightPane({ open, title, onClose, children, width = 320 }) {
2240
- const styles = useStyles22();
2241
- const labelId = React16.useId();
2721
+ const styles = useStyles25();
2722
+ const labelId = React19.useId();
2242
2723
  if (!open) return null;
2243
- return /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("aside", { className: styles.root, style: { width }, "aria-labelledby": labelId, children: [
2244
- /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: styles.head, children: [
2245
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_react_components30.Text, { id: labelId, weight: "semibold", children: title }),
2246
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
2247
- import_react_components30.Button,
2724
+ return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("aside", { className: styles.root, style: { width }, "aria-labelledby": labelId, children: [
2725
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: styles.head, children: [
2726
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_react_components33.Text, { id: labelId, weight: "semibold", children: title }),
2727
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(
2728
+ import_react_components33.Button,
2248
2729
  {
2249
2730
  appearance: "subtle",
2250
2731
  size: "small",
2251
- icon: /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(import_react_icons9.DismissRegular, {}),
2732
+ icon: /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_react_icons11.DismissRegular, {}),
2252
2733
  onClick: onClose,
2253
2734
  "aria-label": `Close ${title}`
2254
2735
  }
2255
2736
  )
2256
2737
  ] }),
2257
- /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: styles.body, children })
2738
+ /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("div", { className: styles.body, children })
2258
2739
  ] });
2259
2740
  }
2260
2741
 
2261
2742
  // src/shell/GlobalSearchBar.tsx
2262
- var import_react_components31 = require("@fluentui/react-components");
2263
- var import_jsx_runtime32 = require("react/jsx-runtime");
2264
- var useStyles23 = (0, import_react_components31.makeStyles)({
2743
+ var import_react_components34 = require("@fluentui/react-components");
2744
+ var import_jsx_runtime35 = require("react/jsx-runtime");
2745
+ var useStyles26 = (0, import_react_components34.makeStyles)({
2265
2746
  root: { width: "100%", maxWidth: "640px" }
2266
2747
  });
2267
2748
  function GlobalSearchBar({
@@ -2270,9 +2751,9 @@ function GlobalSearchBar({
2270
2751
  onSubmit,
2271
2752
  placeholder = "Search conversations"
2272
2753
  }) {
2273
- const styles = useStyles23();
2274
- return /* @__PURE__ */ (0, import_jsx_runtime32.jsx)(
2275
- import_react_components31.SearchBox,
2754
+ const styles = useStyles26();
2755
+ return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2756
+ import_react_components34.SearchBox,
2276
2757
  {
2277
2758
  className: styles.root,
2278
2759
  value,
@@ -2287,86 +2768,86 @@ function GlobalSearchBar({
2287
2768
  }
2288
2769
 
2289
2770
  // src/grounding/CitationChip.tsx
2290
- var import_react_components32 = require("@fluentui/react-components");
2291
- var import_jsx_runtime33 = require("react/jsx-runtime");
2292
- var useStyles24 = (0, import_react_components32.makeStyles)({
2771
+ var import_react_components35 = require("@fluentui/react-components");
2772
+ var import_jsx_runtime36 = require("react/jsx-runtime");
2773
+ var useStyles27 = (0, import_react_components35.makeStyles)({
2293
2774
  chip: {
2294
2775
  display: "inline-flex",
2295
2776
  alignItems: "center",
2296
2777
  justifyContent: "center",
2297
2778
  minWidth: "18px",
2298
2779
  height: "18px",
2299
- padding: `0 ${import_react_components32.tokens.spacingHorizontalXXS}`,
2780
+ padding: `0 ${import_react_components35.tokens.spacingHorizontalXXS}`,
2300
2781
  marginLeft: "2px",
2301
2782
  verticalAlign: "super",
2302
- fontSize: import_react_components32.tokens.fontSizeBase100,
2783
+ fontSize: import_react_components35.tokens.fontSizeBase100,
2303
2784
  lineHeight: "18px",
2304
- borderRadius: import_react_components32.tokens.borderRadiusSmall,
2305
- border: `1px solid ${import_react_components32.tokens.colorNeutralStroke2}`,
2306
- backgroundColor: import_react_components32.tokens.colorNeutralBackground3,
2307
- color: import_react_components32.tokens.colorNeutralForeground2,
2785
+ borderRadius: import_react_components35.tokens.borderRadiusSmall,
2786
+ border: `1px solid ${import_react_components35.tokens.colorNeutralStroke2}`,
2787
+ backgroundColor: import_react_components35.tokens.colorNeutralBackground3,
2788
+ color: import_react_components35.tokens.colorNeutralForeground2,
2308
2789
  cursor: "pointer",
2309
- ":hover": { backgroundColor: import_react_components32.tokens.colorNeutralBackground3Hover },
2310
- ":focus-visible": { outline: `2px solid ${import_react_components32.tokens.colorStrokeFocus2}`, outlineOffset: "1px" }
2790
+ ":hover": { backgroundColor: import_react_components35.tokens.colorNeutralBackground3Hover },
2791
+ ":focus-visible": { outline: `2px solid ${import_react_components35.tokens.colorStrokeFocus2}`, outlineOffset: "1px" }
2311
2792
  },
2312
2793
  inert: { cursor: "default" }
2313
2794
  });
2314
2795
  function CitationChip({ marker, source, onOpen }) {
2315
- const styles = useStyles24();
2796
+ const styles = useStyles27();
2316
2797
  const label = source ? `Source ${marker}: ${source.title}` : `Source ${marker}`;
2317
2798
  if (!source || !onOpen) {
2318
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("span", { className: `${styles.chip} ${styles.inert}`, "aria-label": label, children: marker });
2799
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: `${styles.chip} ${styles.inert}`, "aria-label": label, children: marker });
2319
2800
  }
2320
- return /* @__PURE__ */ (0, import_jsx_runtime33.jsx)(import_react_components32.Tooltip, { content: source.title, relationship: "description", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime33.jsx)("button", { type: "button", className: styles.chip, "aria-label": label, onClick: () => onOpen(source), children: marker }) });
2801
+ return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(import_react_components35.Tooltip, { content: source.title, relationship: "description", withArrow: true, children: /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("button", { type: "button", className: styles.chip, "aria-label": label, onClick: () => onOpen(source), children: marker }) });
2321
2802
  }
2322
2803
 
2323
2804
  // src/grounding/CitationList.tsx
2324
- var React17 = __toESM(require("react"), 1);
2325
- var import_react_components34 = require("@fluentui/react-components");
2805
+ var React20 = __toESM(require("react"), 1);
2806
+ var import_react_components37 = require("@fluentui/react-components");
2326
2807
 
2327
2808
  // src/grounding/SourceCard.tsx
2328
- var import_react_components33 = require("@fluentui/react-components");
2329
- var import_react_icons10 = require("@fluentui/react-icons");
2330
- var import_jsx_runtime34 = require("react/jsx-runtime");
2809
+ var import_react_components36 = require("@fluentui/react-components");
2810
+ var import_react_icons12 = require("@fluentui/react-icons");
2811
+ var import_jsx_runtime37 = require("react/jsx-runtime");
2331
2812
  var ICONS = {
2332
- dataverse: import_react_icons10.DatabaseRegular,
2333
- document: import_react_icons10.DocumentRegular,
2334
- web: import_react_icons10.GlobeRegular,
2335
- knowledge: import_react_icons10.BookRegular,
2336
- other: import_react_icons10.DocumentBulletListRegular
2813
+ dataverse: import_react_icons12.DatabaseRegular,
2814
+ document: import_react_icons12.DocumentRegular,
2815
+ web: import_react_icons12.GlobeRegular,
2816
+ knowledge: import_react_icons12.BookRegular,
2817
+ other: import_react_icons12.DocumentBulletListRegular
2337
2818
  };
2338
- var useStyles25 = (0, import_react_components33.makeStyles)({
2339
- root: { gap: import_react_components33.tokens.spacingVerticalXXS },
2340
- head: { display: "flex", alignItems: "center", gap: import_react_components33.tokens.spacingHorizontalXS },
2341
- marker: { color: import_react_components33.tokens.colorNeutralForeground3, fontSize: import_react_components33.tokens.fontSizeBase200 },
2342
- snippet: { color: import_react_components33.tokens.colorNeutralForeground2, fontSize: import_react_components33.tokens.fontSizeBase200 },
2343
- meta: { display: "flex", alignItems: "center", gap: import_react_components33.tokens.spacingHorizontalS, marginTop: import_react_components33.tokens.spacingVerticalXXS }
2819
+ var useStyles28 = (0, import_react_components36.makeStyles)({
2820
+ root: { gap: import_react_components36.tokens.spacingVerticalXXS },
2821
+ head: { display: "flex", alignItems: "center", gap: import_react_components36.tokens.spacingHorizontalXS },
2822
+ marker: { color: import_react_components36.tokens.colorNeutralForeground3, fontSize: import_react_components36.tokens.fontSizeBase200 },
2823
+ snippet: { color: import_react_components36.tokens.colorNeutralForeground2, fontSize: import_react_components36.tokens.fontSizeBase200 },
2824
+ meta: { display: "flex", alignItems: "center", gap: import_react_components36.tokens.spacingHorizontalS, marginTop: import_react_components36.tokens.spacingVerticalXXS }
2344
2825
  });
2345
2826
  function SourceCard({ source, marker, onOpen, showSnippet = true }) {
2346
- const styles = useStyles25();
2827
+ const styles = useStyles28();
2347
2828
  const Icon = ICONS[source.kind] ?? ICONS.other;
2348
- return /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)(CardSurface, { className: styles.root, children: [
2349
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: styles.head, children: [
2350
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(Icon, { "aria-hidden": "true" }),
2351
- marker ? /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("span", { className: styles.marker, children: [
2829
+ return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(CardSurface, { className: styles.root, children: [
2830
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: styles.head, children: [
2831
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(Icon, { "aria-hidden": "true" }),
2832
+ marker ? /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("span", { className: styles.marker, children: [
2352
2833
  "[",
2353
2834
  marker,
2354
2835
  "]"
2355
2836
  ] }) : null,
2356
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_react_components33.Text, { weight: "semibold", children: source.title })
2837
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_react_components36.Text, { weight: "semibold", children: source.title })
2357
2838
  ] }),
2358
- showSnippet && source.snippet ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: styles.snippet, children: source.snippet }) : null,
2359
- /* @__PURE__ */ (0, import_jsx_runtime34.jsxs)("div", { className: styles.meta, children: [
2360
- onOpen && (source.recordId || source.url) ? /* @__PURE__ */ (0, import_jsx_runtime34.jsx)(import_react_components33.Button, { size: "small", appearance: "subtle", onClick: () => onOpen(source), children: source.recordId ? "Open record" : "Open" }) : null,
2361
- /* @__PURE__ */ (0, import_jsx_runtime34.jsx)("span", { className: styles.snippet, children: source.score === void 0 ? "Relevance not reported" : `Relevance ${Math.round(source.score * 100)}%` })
2839
+ showSnippet && source.snippet ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: styles.snippet, children: source.snippet }) : null,
2840
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)("div", { className: styles.meta, children: [
2841
+ onOpen && (source.recordId || source.url) ? /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_react_components36.Button, { size: "small", appearance: "subtle", onClick: () => onOpen(source), children: source.recordId ? "Open record" : "Open" }) : null,
2842
+ /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("span", { className: styles.snippet, children: source.score === void 0 ? "Relevance not reported" : `Relevance ${Math.round(source.score * 100)}%` })
2362
2843
  ] })
2363
2844
  ] });
2364
2845
  }
2365
2846
 
2366
2847
  // src/grounding/CitationList.tsx
2367
- var import_jsx_runtime35 = require("react/jsx-runtime");
2368
- var useStyles26 = (0, import_react_components34.makeStyles)({
2369
- list: { display: "flex", flexDirection: "column", gap: import_react_components34.tokens.spacingVerticalXS, listStyle: "none", margin: 0, padding: 0 }
2848
+ var import_jsx_runtime38 = require("react/jsx-runtime");
2849
+ var useStyles29 = (0, import_react_components37.makeStyles)({
2850
+ list: { display: "flex", flexDirection: "column", gap: import_react_components37.tokens.spacingVerticalXS, listStyle: "none", margin: 0, padding: 0 }
2370
2851
  });
2371
2852
  function CitationList({
2372
2853
  text,
@@ -2374,38 +2855,38 @@ function CitationList({
2374
2855
  onOpenSource,
2375
2856
  defaultOpen = false
2376
2857
  }) {
2377
- const styles = useStyles26();
2378
- const id = React17.useId();
2379
- const { used, citations } = React17.useMemo(() => renumberCitations(text, sources), [text, sources]);
2858
+ const styles = useStyles29();
2859
+ const id = React20.useId();
2860
+ const { used, citations } = React20.useMemo(() => renumberCitations(text, sources), [text, sources]);
2380
2861
  if (used.length === 0) return null;
2381
2862
  const markerFor = (sourceId) => citations.find((c) => c.sourceId === sourceId)?.marker;
2382
- return /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(
2863
+ return /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(
2383
2864
  Disclosure,
2384
2865
  {
2385
2866
  id,
2386
2867
  defaultOpen,
2387
2868
  summary: `${used.length} source${used.length === 1 ? "" : "s"}`,
2388
- children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("ul", { className: styles.list, children: used.map((source) => /* @__PURE__ */ (0, import_jsx_runtime35.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime35.jsx)(SourceCard, { source, marker: markerFor(source.id), onOpen: onOpenSource }) }, source.id)) })
2869
+ children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("ul", { className: styles.list, children: used.map((source) => /* @__PURE__ */ (0, import_jsx_runtime38.jsx)("li", { children: /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(SourceCard, { source, marker: markerFor(source.id), onOpen: onOpenSource }) }, source.id)) })
2389
2870
  }
2390
2871
  );
2391
2872
  }
2392
2873
 
2393
2874
  // src/grounding/AnswerWithCitations.tsx
2394
- var React18 = __toESM(require("react"), 1);
2395
- var import_react_components35 = require("@fluentui/react-components");
2396
- var import_jsx_runtime36 = require("react/jsx-runtime");
2397
- var useStyles27 = (0, import_react_components35.makeStyles)({ root: { whiteSpace: "pre-wrap", wordBreak: "break-word" } });
2875
+ var React21 = __toESM(require("react"), 1);
2876
+ var import_react_components38 = require("@fluentui/react-components");
2877
+ var import_jsx_runtime39 = require("react/jsx-runtime");
2878
+ var useStyles30 = (0, import_react_components38.makeStyles)({ root: { whiteSpace: "pre-wrap", wordBreak: "break-word" } });
2398
2879
  function AnswerWithCitations({
2399
2880
  text,
2400
2881
  citations = [],
2401
2882
  sources = [],
2402
2883
  onOpenSource
2403
2884
  }) {
2404
- const styles = useStyles27();
2405
- const segments = React18.useMemo(() => splitTextByCitations(text, citations), [text, citations]);
2406
- const byId = React18.useMemo(() => new Map(sources.map((s) => [s.id, s])), [sources]);
2407
- return /* @__PURE__ */ (0, import_jsx_runtime36.jsx)("span", { className: styles.root, children: segments.map(
2408
- (segment, i) => segment.kind === "text" ? /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(React18.Fragment, { children: segment.text }, i) : /* @__PURE__ */ (0, import_jsx_runtime36.jsx)(
2885
+ const styles = useStyles30();
2886
+ const segments = React21.useMemo(() => splitTextByCitations(text, citations), [text, citations]);
2887
+ const byId = React21.useMemo(() => new Map(sources.map((s) => [s.id, s])), [sources]);
2888
+ return /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: styles.root, children: segments.map(
2889
+ (segment, i) => segment.kind === "text" ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(React21.Fragment, { children: segment.text }, i) : /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(
2409
2890
  CitationChip,
2410
2891
  {
2411
2892
  marker: segment.marker ?? "",
@@ -2418,20 +2899,20 @@ function AnswerWithCitations({
2418
2899
  }
2419
2900
 
2420
2901
  // src/grounding/GroundingPanel.tsx
2421
- var React19 = __toESM(require("react"), 1);
2422
- var import_react_components36 = require("@fluentui/react-components");
2423
- var import_jsx_runtime37 = require("react/jsx-runtime");
2424
- var useStyles28 = (0, import_react_components36.makeStyles)({
2902
+ var React22 = __toESM(require("react"), 1);
2903
+ var import_react_components39 = require("@fluentui/react-components");
2904
+ var import_jsx_runtime40 = require("react/jsx-runtime");
2905
+ var useStyles31 = (0, import_react_components39.makeStyles)({
2425
2906
  grid: {
2426
2907
  display: "grid",
2427
2908
  gridTemplateColumns: "minmax(96px, max-content) 1fr",
2428
- gap: `${import_react_components36.tokens.spacingVerticalXXS} ${import_react_components36.tokens.spacingHorizontalM}`,
2909
+ gap: `${import_react_components39.tokens.spacingVerticalXXS} ${import_react_components39.tokens.spacingHorizontalM}`,
2429
2910
  margin: 0,
2430
- fontSize: import_react_components36.tokens.fontSizeBase200
2911
+ fontSize: import_react_components39.tokens.fontSizeBase200
2431
2912
  },
2432
- key: { color: import_react_components36.tokens.colorNeutralForeground3, margin: 0 },
2433
- value: { margin: 0, wordBreak: "break-word", fontFamily: import_react_components36.tokens.fontFamilyMonospace },
2434
- empty: { fontSize: import_react_components36.tokens.fontSizeBase200, color: import_react_components36.tokens.colorNeutralForeground3 }
2913
+ key: { color: import_react_components39.tokens.colorNeutralForeground3, margin: 0 },
2914
+ value: { margin: 0, wordBreak: "break-word", fontFamily: import_react_components39.tokens.fontFamilyMonospace },
2915
+ empty: { fontSize: import_react_components39.tokens.fontSizeBase200, color: import_react_components39.tokens.colorNeutralForeground3 }
2435
2916
  });
2436
2917
  function render(value) {
2437
2918
  if (value === null || value === void 0) return "\u2014";
@@ -2443,45 +2924,45 @@ function GroundingPanel({
2443
2924
  title = "What this answer used",
2444
2925
  defaultOpen = false
2445
2926
  }) {
2446
- const styles = useStyles28();
2447
- const id = React19.useId();
2927
+ const styles = useStyles31();
2928
+ const id = React22.useId();
2448
2929
  const entries = Object.entries(grounding ?? {});
2449
2930
  if (entries.length === 0) return null;
2450
- return /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(Disclosure, { id, defaultOpen, summary: title, children: [
2451
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("dl", { className: styles.grid, children: entries.map(([key, value]) => /* @__PURE__ */ (0, import_jsx_runtime37.jsxs)(React19.Fragment, { children: [
2452
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("dt", { className: styles.key, children: key }),
2453
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)("dd", { className: styles.value, children: render(value) })
2931
+ return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(Disclosure, { id, defaultOpen, summary: title, children: [
2932
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("dl", { className: styles.grid, children: entries.map(([key, value]) => /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(React22.Fragment, { children: [
2933
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("dt", { className: styles.key, children: key }),
2934
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("dd", { className: styles.value, children: render(value) })
2454
2935
  ] }, key)) }),
2455
- /* @__PURE__ */ (0, import_jsx_runtime37.jsx)(import_react_components36.Text, { as: "p", className: styles.empty, children: "These facts were supplied by the app, not produced by the model." })
2936
+ /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_react_components39.Text, { as: "p", className: styles.empty, children: "These facts were supplied by the app, not produced by the model." })
2456
2937
  ] });
2457
2938
  }
2458
2939
 
2459
2940
  // src/grounding/ProviderAttribution.tsx
2460
- var import_react_components37 = require("@fluentui/react-components");
2461
- var import_react_icons11 = require("@fluentui/react-icons");
2462
- var import_jsx_runtime38 = require("react/jsx-runtime");
2463
- var useStyles29 = (0, import_react_components37.makeStyles)({
2941
+ var import_react_components40 = require("@fluentui/react-components");
2942
+ var import_react_icons13 = require("@fluentui/react-icons");
2943
+ var import_jsx_runtime41 = require("react/jsx-runtime");
2944
+ var useStyles32 = (0, import_react_components40.makeStyles)({
2464
2945
  root: {
2465
2946
  display: "flex",
2466
2947
  alignItems: "center",
2467
- gap: import_react_components37.tokens.spacingHorizontalXXS,
2468
- fontSize: import_react_components37.tokens.fontSizeBase100,
2469
- color: import_react_components37.tokens.colorNeutralForeground3
2948
+ gap: import_react_components40.tokens.spacingHorizontalXXS,
2949
+ fontSize: import_react_components40.tokens.fontSizeBase100,
2950
+ color: import_react_components40.tokens.colorNeutralForeground3
2470
2951
  },
2471
- guarded: { color: import_react_components37.tokens.colorPaletteDarkOrangeForeground1 }
2952
+ guarded: { color: import_react_components40.tokens.colorPaletteDarkOrangeForeground1 }
2472
2953
  });
2473
2954
  function ProviderAttribution({ provider, model, guarded }) {
2474
- const styles = useStyles29();
2955
+ const styles = useStyles32();
2475
2956
  if (!provider && !model && !guarded) return null;
2476
2957
  const who = [provider, model].filter(Boolean).join(" \xB7 ");
2477
2958
  if (guarded) {
2478
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("span", { className: `${styles.root} ${styles.guarded}`, children: [
2479
- /* @__PURE__ */ (0, import_jsx_runtime38.jsx)(import_react_icons11.ShieldErrorRegular, { "aria-hidden": "true" }),
2959
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("span", { className: `${styles.root} ${styles.guarded}`, children: [
2960
+ /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_react_icons13.ShieldErrorRegular, { "aria-hidden": "true" }),
2480
2961
  "Withheld and replaced with safe text",
2481
2962
  who ? ` \u2014 not ${who}'s words` : ""
2482
2963
  ] });
2483
2964
  }
2484
- return /* @__PURE__ */ (0, import_jsx_runtime38.jsxs)("span", { className: styles.root, children: [
2965
+ return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("span", { className: styles.root, children: [
2485
2966
  "Answered by ",
2486
2967
  who || "the agent"
2487
2968
  ] });
@@ -2491,57 +2972,57 @@ function messageAttribution(message) {
2491
2972
  }
2492
2973
 
2493
2974
  // src/actions/ActionCard.tsx
2494
- var React20 = __toESM(require("react"), 1);
2495
- var import_react_components38 = require("@fluentui/react-components");
2496
- var import_jsx_runtime39 = require("react/jsx-runtime");
2497
- var useStyles30 = (0, import_react_components38.makeStyles)({
2498
- head: { display: "flex", alignItems: "center", gap: import_react_components38.tokens.spacingHorizontalXS },
2499
- description: { color: import_react_components38.tokens.colorNeutralForeground2, fontSize: import_react_components38.tokens.fontSizeBase200 },
2500
- footer: { display: "flex", gap: import_react_components38.tokens.spacingHorizontalS, justifyContent: "flex-end", marginTop: import_react_components38.tokens.spacingVerticalXS }
2975
+ var React23 = __toESM(require("react"), 1);
2976
+ var import_react_components41 = require("@fluentui/react-components");
2977
+ var import_jsx_runtime42 = require("react/jsx-runtime");
2978
+ var useStyles33 = (0, import_react_components41.makeStyles)({
2979
+ head: { display: "flex", alignItems: "center", gap: import_react_components41.tokens.spacingHorizontalXS },
2980
+ description: { color: import_react_components41.tokens.colorNeutralForeground2, fontSize: import_react_components41.tokens.fontSizeBase200 },
2981
+ footer: { display: "flex", gap: import_react_components41.tokens.spacingHorizontalS, justifyContent: "flex-end", marginTop: import_react_components41.tokens.spacingVerticalXS }
2501
2982
  });
2502
2983
  function ActionCard({ title, description, icon, pending, children, footer }) {
2503
- const styles = useStyles30();
2504
- return /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)(CardSurface, { emphasis: pending ? "attention" : "none", children: [
2505
- /* @__PURE__ */ (0, import_jsx_runtime39.jsxs)("div", { className: styles.head, children: [
2506
- icon ? React20.cloneElement(icon, { "aria-hidden": "true" }) : null,
2507
- /* @__PURE__ */ (0, import_jsx_runtime39.jsx)(import_react_components38.Text, { weight: "semibold", children: title })
2984
+ const styles = useStyles33();
2985
+ return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(CardSurface, { emphasis: pending ? "attention" : "none", children: [
2986
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("div", { className: styles.head, children: [
2987
+ icon ? React23.cloneElement(icon, { "aria-hidden": "true" }) : null,
2988
+ /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_components41.Text, { weight: "semibold", children: title })
2508
2989
  ] }),
2509
- description ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("span", { className: styles.description, children: description }) : null,
2990
+ description ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("span", { className: styles.description, children: description }) : null,
2510
2991
  children,
2511
- footer ? /* @__PURE__ */ (0, import_jsx_runtime39.jsx)("div", { className: styles.footer, children: footer }) : null
2992
+ footer ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)("div", { className: styles.footer, children: footer }) : null
2512
2993
  ] });
2513
2994
  }
2514
2995
 
2515
2996
  // src/actions/ApprovalCard.tsx
2516
- var React22 = __toESM(require("react"), 1);
2517
- var import_react_components41 = require("@fluentui/react-components");
2518
- var import_react_icons12 = require("@fluentui/react-icons");
2997
+ var React25 = __toESM(require("react"), 1);
2998
+ var import_react_components44 = require("@fluentui/react-components");
2999
+ var import_react_icons14 = require("@fluentui/react-icons");
2519
3000
 
2520
3001
  // src/actions/ParameterReview.tsx
2521
- var React21 = __toESM(require("react"), 1);
2522
- var import_react_components39 = require("@fluentui/react-components");
2523
- var import_jsx_runtime40 = require("react/jsx-runtime");
2524
- var useStyles31 = (0, import_react_components39.makeStyles)({
3002
+ var React24 = __toESM(require("react"), 1);
3003
+ var import_react_components42 = require("@fluentui/react-components");
3004
+ var import_jsx_runtime43 = require("react/jsx-runtime");
3005
+ var useStyles34 = (0, import_react_components42.makeStyles)({
2525
3006
  grid: {
2526
3007
  display: "grid",
2527
3008
  gridTemplateColumns: "minmax(110px, max-content) 1fr",
2528
- gap: `${import_react_components39.tokens.spacingVerticalXS} ${import_react_components39.tokens.spacingHorizontalM}`,
3009
+ gap: `${import_react_components42.tokens.spacingVerticalXS} ${import_react_components42.tokens.spacingHorizontalM}`,
2529
3010
  alignItems: "center",
2530
3011
  margin: 0
2531
3012
  },
2532
- key: { margin: 0, color: import_react_components39.tokens.colorNeutralForeground2, fontSize: import_react_components39.tokens.fontSizeBase200 },
3013
+ key: { margin: 0, color: import_react_components42.tokens.colorNeutralForeground2, fontSize: import_react_components42.tokens.fontSizeBase200 },
2533
3014
  value: { margin: 0 },
2534
3015
  raw: {
2535
3016
  whiteSpace: "pre-wrap",
2536
3017
  wordBreak: "break-all",
2537
- fontFamily: import_react_components39.tokens.fontFamilyMonospace,
2538
- fontSize: import_react_components39.tokens.fontSizeBase200,
2539
- color: import_react_components39.tokens.colorNeutralForeground2
3018
+ fontFamily: import_react_components42.tokens.fontFamilyMonospace,
3019
+ fontSize: import_react_components42.tokens.fontSizeBase200,
3020
+ color: import_react_components42.tokens.colorNeutralForeground2
2540
3021
  }
2541
3022
  });
2542
3023
  function ParameterReview({ argumentsJson, readOnly = true, onChange }) {
2543
- const styles = useStyles31();
2544
- const parsed = React21.useMemo(() => {
3024
+ const styles = useStyles34();
3025
+ const parsed = React24.useMemo(() => {
2545
3026
  try {
2546
3027
  const value = JSON.parse(argumentsJson);
2547
3028
  return value && typeof value === "object" && !Array.isArray(value) ? value : null;
@@ -2550,19 +3031,19 @@ function ParameterReview({ argumentsJson, readOnly = true, onChange }) {
2550
3031
  }
2551
3032
  }, [argumentsJson]);
2552
3033
  if (!parsed) {
2553
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)("div", { children: [
2554
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(import_react_components39.Text, { size: 200, children: "Arguments (unparsed)" }),
2555
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("pre", { className: styles.raw, children: argumentsJson || "(empty)" })
3034
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("div", { children: [
3035
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_components42.Text, { size: 200, children: "Arguments (unparsed)" }),
3036
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("pre", { className: styles.raw, children: argumentsJson || "(empty)" })
2556
3037
  ] });
2557
3038
  }
2558
3039
  const set = (key, next) => {
2559
3040
  if (!onChange) return;
2560
3041
  onChange(JSON.stringify({ ...parsed, [key]: next }));
2561
3042
  };
2562
- return /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("dl", { className: styles.grid, children: Object.entries(parsed).map(([key, value]) => /* @__PURE__ */ (0, import_jsx_runtime40.jsxs)(React21.Fragment, { children: [
2563
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("dt", { className: styles.key, children: key }),
2564
- /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("dd", { className: styles.value, children: readOnly ? /* @__PURE__ */ (0, import_jsx_runtime40.jsx)("span", { className: styles.raw, children: typeof value === "string" ? value : JSON.stringify(value) }) : /* @__PURE__ */ (0, import_jsx_runtime40.jsx)(
2565
- import_react_components39.Input,
3043
+ return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dl", { className: styles.grid, children: Object.entries(parsed).map(([key, value]) => /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(React24.Fragment, { children: [
3044
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dt", { className: styles.key, children: key }),
3045
+ /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("dd", { className: styles.value, children: readOnly ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { className: styles.raw, children: typeof value === "string" ? value : JSON.stringify(value) }) : /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(
3046
+ import_react_components42.Input,
2566
3047
  {
2567
3048
  size: "small",
2568
3049
  "aria-label": key,
@@ -2574,32 +3055,32 @@ function ParameterReview({ argumentsJson, readOnly = true, onChange }) {
2574
3055
  }
2575
3056
 
2576
3057
  // src/actions/ActionResult.tsx
2577
- var import_react_components40 = require("@fluentui/react-components");
2578
- var import_jsx_runtime41 = require("react/jsx-runtime");
3058
+ var import_react_components43 = require("@fluentui/react-components");
3059
+ var import_jsx_runtime44 = require("react/jsx-runtime");
2579
3060
  var INTENT2 = { succeeded: "success", failed: "error", denied: "warning" };
2580
3061
  var TITLE = { succeeded: "Done", failed: "Failed", denied: "Not approved" };
2581
- var useStyles32 = (0, import_react_components40.makeStyles)({
2582
- id: { display: "block", marginTop: import_react_components40.tokens.spacingVerticalXXS, fontSize: import_react_components40.tokens.fontSizeBase100, color: import_react_components40.tokens.colorNeutralForeground3, fontFamily: import_react_components40.tokens.fontFamilyMonospace }
3062
+ var useStyles35 = (0, import_react_components43.makeStyles)({
3063
+ id: { display: "block", marginTop: import_react_components43.tokens.spacingVerticalXXS, fontSize: import_react_components43.tokens.fontSizeBase100, color: import_react_components43.tokens.colorNeutralForeground3, fontFamily: import_react_components43.tokens.fontFamilyMonospace }
2583
3064
  });
2584
3065
  function ActionResult({ status, message, correlationId, onRetry }) {
2585
- const styles = useStyles32();
2586
- return /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_react_components40.MessageBar, { intent: INTENT2[status], children: [
2587
- /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)(import_react_components40.MessageBarBody, { children: [
2588
- /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_react_components40.MessageBarTitle, { children: TITLE[status] }),
3066
+ const styles = useStyles35();
3067
+ return /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_react_components43.MessageBar, { intent: INTENT2[status], children: [
3068
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)(import_react_components43.MessageBarBody, { children: [
3069
+ /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_react_components43.MessageBarTitle, { children: TITLE[status] }),
2589
3070
  message,
2590
- correlationId ? /* @__PURE__ */ (0, import_jsx_runtime41.jsxs)("span", { className: styles.id, children: [
3071
+ correlationId ? /* @__PURE__ */ (0, import_jsx_runtime44.jsxs)("span", { className: styles.id, children: [
2591
3072
  "Correlation id: ",
2592
3073
  correlationId
2593
3074
  ] }) : null
2594
3075
  ] }),
2595
- status === "failed" && onRetry ? /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_react_components40.MessageBarActions, { children: /* @__PURE__ */ (0, import_jsx_runtime41.jsx)(import_react_components40.Button, { size: "small", onClick: onRetry, children: "Try again" }) }) : null
3076
+ status === "failed" && onRetry ? /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_react_components43.MessageBarActions, { children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_react_components43.Button, { size: "small", onClick: onRetry, children: "Try again" }) }) : null
2596
3077
  ] });
2597
3078
  }
2598
3079
 
2599
3080
  // src/actions/ApprovalCard.tsx
2600
- var import_jsx_runtime42 = require("react/jsx-runtime");
2601
- var useStyles33 = (0, import_react_components41.makeStyles)({
2602
- busy: { display: "flex", alignItems: "center", gap: import_react_components41.tokens.spacingHorizontalXS, fontSize: import_react_components41.tokens.fontSizeBase200 }
3081
+ var import_jsx_runtime45 = require("react/jsx-runtime");
3082
+ var useStyles36 = (0, import_react_components44.makeStyles)({
3083
+ busy: { display: "flex", alignItems: "center", gap: import_react_components44.tokens.spacingHorizontalXS, fontSize: import_react_components44.tokens.fontSizeBase200 }
2603
3084
  });
2604
3085
  function ApprovalCard({
2605
3086
  toolCall,
@@ -2608,15 +3089,15 @@ function ApprovalCard({
2608
3089
  allowEdit = false,
2609
3090
  busy = false
2610
3091
  }) {
2611
- const styles = useStyles33();
2612
- const [args, setArgs] = React22.useState(toolCall.argumentsJson);
2613
- const [editing, setEditing] = React22.useState(false);
2614
- const [decided, setDecided] = React22.useState(false);
3092
+ const styles = useStyles36();
3093
+ const [args, setArgs] = React25.useState(toolCall.argumentsJson);
3094
+ const [editing, setEditing] = React25.useState(false);
3095
+ const [decided, setDecided] = React25.useState(false);
2615
3096
  const settled = toolCall.status === "succeeded" || toolCall.status === "failed" || toolCall.status === "denied";
2616
3097
  if (settled) {
2617
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(ActionCard, { title: toolCall.name, description: "Tool call", children: [
2618
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(ParameterReview, { argumentsJson: toolCall.argumentsJson }),
2619
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3098
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(ActionCard, { title: toolCall.name, description: "Tool call", children: [
3099
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(ParameterReview, { argumentsJson: toolCall.argumentsJson }),
3100
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
2620
3101
  ActionResult,
2621
3102
  {
2622
3103
  status: toolCall.status === "succeeded" ? "succeeded" : toolCall.status === "denied" ? "denied" : "failed",
@@ -2637,29 +3118,29 @@ function ApprovalCard({
2637
3118
  setDecided(true);
2638
3119
  onDeny(toolCall);
2639
3120
  };
2640
- return /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(
3121
+ return /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(
2641
3122
  ActionCard,
2642
3123
  {
2643
3124
  title: toolCall.name,
2644
3125
  description: "The agent is asking to run this. Check the details before approving.",
2645
3126
  pending: !locked,
2646
- footer: locked ? /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)("span", { className: styles.busy, children: [
2647
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_components41.Spinner, { size: "tiny" }),
3127
+ footer: locked ? /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)("span", { className: styles.busy, children: [
3128
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_components44.Spinner, { size: "tiny" }),
2648
3129
  " Submitting\u2026"
2649
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime42.jsxs)(import_jsx_runtime42.Fragment, { children: [
2650
- allowEdit ? /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_components41.Button, { size: "small", icon: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_icons12.EditRegular, {}), onClick: () => setEditing((v) => !v), children: editing ? "Done editing" : "Edit" }) : null,
2651
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_components41.Button, { size: "small", icon: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_icons12.DismissRegular, {}), onClick: deny, disabled: locked, children: "Deny" }),
2652
- /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_components41.Button, { size: "small", appearance: "primary", icon: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(import_react_icons12.CheckmarkRegular, {}), onClick: approve, disabled: locked, children: "Approve" })
3130
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime45.jsxs)(import_jsx_runtime45.Fragment, { children: [
3131
+ allowEdit ? /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_components44.Button, { size: "small", icon: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_icons14.EditRegular, {}), onClick: () => setEditing((v) => !v), children: editing ? "Done editing" : "Edit" }) : null,
3132
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_components44.Button, { size: "small", icon: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_icons14.DismissRegular, {}), onClick: deny, disabled: locked, children: "Deny" }),
3133
+ /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_components44.Button, { size: "small", appearance: "primary", icon: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(import_react_icons14.CheckmarkRegular, {}), onClick: approve, disabled: locked, children: "Approve" })
2653
3134
  ] }),
2654
- children: /* @__PURE__ */ (0, import_jsx_runtime42.jsx)(ParameterReview, { argumentsJson: args, readOnly: !editing, onChange: setArgs })
3135
+ children: /* @__PURE__ */ (0, import_jsx_runtime45.jsx)(ParameterReview, { argumentsJson: args, readOnly: !editing, onChange: setArgs })
2655
3136
  }
2656
3137
  );
2657
3138
  }
2658
3139
 
2659
3140
  // src/actions/ToolCallCard.tsx
2660
- var React23 = __toESM(require("react"), 1);
2661
- var import_react_components42 = require("@fluentui/react-components");
2662
- var import_jsx_runtime43 = require("react/jsx-runtime");
3141
+ var React26 = __toESM(require("react"), 1);
3142
+ var import_react_components45 = require("@fluentui/react-components");
3143
+ var import_jsx_runtime46 = require("react/jsx-runtime");
2663
3144
  var LABEL = {
2664
3145
  proposed: "Proposed",
2665
3146
  running: "Running",
@@ -2674,42 +3155,42 @@ var COLOUR = {
2674
3155
  failed: "danger",
2675
3156
  denied: "warning"
2676
3157
  };
2677
- var useStyles34 = (0, import_react_components42.makeStyles)({
2678
- head: { display: "flex", alignItems: "center", gap: import_react_components42.tokens.spacingHorizontalXS },
2679
- name: { fontFamily: import_react_components42.tokens.fontFamilyMonospace, fontSize: import_react_components42.tokens.fontSizeBase200 },
3158
+ var useStyles37 = (0, import_react_components45.makeStyles)({
3159
+ head: { display: "flex", alignItems: "center", gap: import_react_components45.tokens.spacingHorizontalXS },
3160
+ name: { fontFamily: import_react_components45.tokens.fontFamilyMonospace, fontSize: import_react_components45.tokens.fontSizeBase200 },
2680
3161
  result: {
2681
3162
  whiteSpace: "pre-wrap",
2682
3163
  wordBreak: "break-all",
2683
- fontFamily: import_react_components42.tokens.fontFamilyMonospace,
2684
- fontSize: import_react_components42.tokens.fontSizeBase200,
2685
- marginTop: import_react_components42.tokens.spacingVerticalXS
3164
+ fontFamily: import_react_components45.tokens.fontFamilyMonospace,
3165
+ fontSize: import_react_components45.tokens.fontSizeBase200,
3166
+ marginTop: import_react_components45.tokens.spacingVerticalXS
2686
3167
  }
2687
3168
  });
2688
3169
  function ToolCallCard({ toolCall, defaultExpanded = false }) {
2689
- const styles = useStyles34();
2690
- const id = React23.useId();
2691
- return /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(CardSurface, { children: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)(
3170
+ const styles = useStyles37();
3171
+ const id = React26.useId();
3172
+ return /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(CardSurface, { children: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)(
2692
3173
  Disclosure,
2693
3174
  {
2694
3175
  id,
2695
3176
  defaultOpen: defaultExpanded,
2696
- summary: /* @__PURE__ */ (0, import_jsx_runtime43.jsxs)("span", { className: styles.head, children: [
2697
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("span", { className: styles.name, children: toolCall.name }),
2698
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_components42.Badge, { appearance: "tint", color: COLOUR[toolCall.status], children: LABEL[toolCall.status] }),
2699
- toolCall.status === "running" ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(import_react_components42.Spinner, { size: "extra-tiny" }) : null
3177
+ summary: /* @__PURE__ */ (0, import_jsx_runtime46.jsxs)("span", { className: styles.head, children: [
3178
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("span", { className: styles.name, children: toolCall.name }),
3179
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_react_components45.Badge, { appearance: "tint", color: COLOUR[toolCall.status], children: LABEL[toolCall.status] }),
3180
+ toolCall.status === "running" ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(import_react_components45.Spinner, { size: "extra-tiny" }) : null
2700
3181
  ] }),
2701
3182
  children: [
2702
- /* @__PURE__ */ (0, import_jsx_runtime43.jsx)(ParameterReview, { argumentsJson: toolCall.argumentsJson }),
2703
- toolCall.resultText ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: styles.result, children: toolCall.resultText }) : null,
2704
- toolCall.failure ? /* @__PURE__ */ (0, import_jsx_runtime43.jsx)("div", { className: styles.result, children: toolCall.failure.message }) : null
3183
+ /* @__PURE__ */ (0, import_jsx_runtime46.jsx)(ParameterReview, { argumentsJson: toolCall.argumentsJson }),
3184
+ toolCall.resultText ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: styles.result, children: toolCall.resultText }) : null,
3185
+ toolCall.failure ? /* @__PURE__ */ (0, import_jsx_runtime46.jsx)("div", { className: styles.result, children: toolCall.failure.message }) : null
2705
3186
  ]
2706
3187
  }
2707
3188
  ) });
2708
3189
  }
2709
3190
 
2710
3191
  // src/host/AgentKitHostProvider.tsx
2711
- var React24 = __toESM(require("react"), 1);
2712
- var import_react_components43 = require("@fluentui/react-components");
3192
+ var React27 = __toESM(require("react"), 1);
3193
+ var import_react_components46 = require("@fluentui/react-components");
2713
3194
 
2714
3195
  // src/theme/index.ts
2715
3196
  var import_fluent_theme = require("@dataverse-kit/fluent-theme");
@@ -2741,17 +3222,17 @@ function resolveHostTheme(input = {}) {
2741
3222
  var nextAgentIdPrefix = createIdPrefixCounter("dvkak");
2742
3223
 
2743
3224
  // src/host/AgentKitHostProvider.tsx
2744
- var import_jsx_runtime44 = require("react/jsx-runtime");
3225
+ var import_jsx_runtime47 = require("react/jsx-runtime");
2745
3226
  function AgentKitHostProvider(props) {
2746
3227
  const { children, theme, hostTheme, isDarkTheme, targetDocument, className, style } = props;
2747
- const [generated] = React24.useState(nextAgentIdPrefix);
3228
+ const [generated] = React27.useState(nextAgentIdPrefix);
2748
3229
  const idPrefix = props.idPrefix ?? generated;
2749
- const resolved = React24.useMemo(
3230
+ const resolved = React27.useMemo(
2750
3231
  () => resolveHostTheme({ theme, hostTheme, isDarkTheme }),
2751
3232
  [theme, hostTheme, isDarkTheme]
2752
3233
  );
2753
- return /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(import_react_components43.IdPrefixProvider, { value: idPrefix, children: /* @__PURE__ */ (0, import_jsx_runtime44.jsx)(
2754
- import_react_components43.FluentProvider,
3234
+ return /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(import_react_components46.IdPrefixProvider, { value: idPrefix, children: /* @__PURE__ */ (0, import_jsx_runtime47.jsx)(
3235
+ import_react_components46.FluentProvider,
2755
3236
  {
2756
3237
  theme: resolved,
2757
3238
  targetDocument,
@@ -3060,12 +3541,14 @@ function createAgentService(config = { provider: "none" }) {
3060
3541
  AgentAppShell,
3061
3542
  AgentAvatar,
3062
3543
  AgentKitHostProvider,
3544
+ AgentLauncher,
3063
3545
  AgentOpsPanel,
3064
3546
  AgentPicker,
3065
3547
  AgentStatusBadge,
3066
3548
  AnswerWithCitations,
3067
3549
  AppRail,
3068
3550
  ApprovalCard,
3551
+ AssistantPanel,
3069
3552
  AvailabilityBanner,
3070
3553
  CitationChip,
3071
3554
  CitationList,
@@ -3077,6 +3560,7 @@ function createAgentService(config = { provider: "none" }) {
3077
3560
  DEFAULT_GROUP_WINDOW_MS,
3078
3561
  DayDivider,
3079
3562
  EmptyConversation,
3563
+ FeedbackPanel,
3080
3564
  GlobalSearchBar,
3081
3565
  GroundingPanel,
3082
3566
  LiveAnnouncer,
@@ -3138,6 +3622,7 @@ function createAgentService(config = { provider: "none" }) {
3138
3622
  splitTextByCitations,
3139
3623
  useConversation,
3140
3624
  useFocusRestore,
3625
+ useReturnFocus,
3141
3626
  useRovingTabindex,
3142
3627
  useStickyScroll,
3143
3628
  useVisuallyHiddenStyles