@epam/ai-dial-skills 1.2.0-dev.99 → 1.2.0-rc.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/components/ChatSkill/ChatSkill.d.ts +3 -2
  2. package/components/ChatSkill/ChatSkill.d.ts.map +1 -1
  3. package/components/FavoriteSkillsPanel/FavoriteSkillsPanel.d.ts.map +1 -1
  4. package/components/SkillArchiveUploadDialog/SkillArchiveUploadDialog.d.ts.map +1 -1
  5. package/components/SkillContentFileTree/SkillContentFileTree.d.ts +11 -0
  6. package/components/SkillContentFileTree/SkillContentFileTree.d.ts.map +1 -0
  7. package/components/SkillDetailsSidePanel/SkillDetailsSidePanel.d.ts +2 -1
  8. package/components/SkillDetailsSidePanel/SkillDetailsSidePanel.d.ts.map +1 -1
  9. package/components/SkillInfoTooltipContent/SkillInfoTooltipContent.d.ts +1 -1
  10. package/components/SkillInfoTooltipContent/SkillInfoTooltipContent.d.ts.map +1 -1
  11. package/components/SkillSelectorField/SkillSelectorField.d.ts +5 -0
  12. package/components/SkillSelectorField/SkillSelectorField.d.ts.map +1 -0
  13. package/constants/public-class-names.d.ts +6 -5
  14. package/constants/public-class-names.d.ts.map +1 -1
  15. package/hooks/useSkillMentions/useSkillMentions.d.ts +59 -0
  16. package/hooks/useSkillMentions/useSkillMentions.d.ts.map +1 -0
  17. package/hooks/useSkillSelectorOverlay/useSkillSelectorOverlay.d.ts +5 -4
  18. package/hooks/useSkillSelectorOverlay/useSkillSelectorOverlay.d.ts.map +1 -1
  19. package/index.css +2 -2
  20. package/index.d.ts +13 -1
  21. package/index.d.ts.map +1 -1
  22. package/index.js +675 -271
  23. package/models/chat-skill-props.d.ts +30 -1
  24. package/models/chat-skill-props.d.ts.map +1 -1
  25. package/models/favorite-skill-item.d.ts +1 -1
  26. package/models/favorite-skill-item.d.ts.map +1 -1
  27. package/models/favorite-skills-panel-props.d.ts +32 -5
  28. package/models/favorite-skills-panel-props.d.ts.map +1 -1
  29. package/models/skill-archive-upload-dialog-props.d.ts +5 -1
  30. package/models/skill-archive-upload-dialog-props.d.ts.map +1 -1
  31. package/models/skill-info-tooltip-content-props.d.ts +19 -0
  32. package/models/skill-info-tooltip-content-props.d.ts.map +1 -1
  33. package/models/skill-mention-anchor.d.ts +12 -0
  34. package/models/skill-mention-anchor.d.ts.map +1 -0
  35. package/models/skill-selector-field-props.d.ts +72 -0
  36. package/models/skill-selector-field-props.d.ts.map +1 -0
  37. package/models/skill-selector-overlay.d.ts +151 -54
  38. package/models/skill-selector-overlay.d.ts.map +1 -1
  39. package/package.json +6 -5
  40. package/test-setup.d.ts +1 -0
  41. package/types/skill-unresolved-reason.d.ts +8 -0
  42. package/types/skill-unresolved-reason.d.ts.map +1 -0
  43. package/utils/catalog-content-dial-files.d.ts +10 -0
  44. package/utils/catalog-content-dial-files.d.ts.map +1 -0
  45. package/utils/skill-mention-matching.d.ts +34 -0
  46. package/utils/skill-mention-matching.d.ts.map +1 -0
  47. package/utils/skill-mention-tracking.d.ts +56 -0
  48. package/utils/skill-mention-tracking.d.ts.map +1 -0
  49. package/utils/skill-url.d.ts +1 -0
  50. package/utils/skill-url.d.ts.map +1 -1
package/index.js CHANGED
@@ -1,370 +1,774 @@
1
- import { DeploymentIcon as e, buildCssVars as t, mergeClasses as n } from "@epam/ai-dial-chat-shared";
2
- import { BASE_ICON_SIZE as r, Button as i, ButtonAppearance as a, ButtonVariant as o, DIAL_ICON_SIZE as s, DIAL_KIT_ICON_STROKE as c, FileDropzone as l, GhostButton as u, Highlight as d, InteractiveTooltip as f, Popup as p, PopupSize as m, ToggleIconButton as h, TooltipPlacement as g } from "@epam/ai-dial-ui-kit";
3
- import { Suspense as _, useCallback as v, useEffect as y, useLayoutEffect as b, useMemo as x, useRef as S, useState as C } from "react";
4
- import { IconBlocks as w, IconEye as T, IconStarFilled as E } from "@tabler/icons-react";
5
- import { Fragment as D, jsx as O, jsxs as k } from "react/jsx-runtime";
6
- import { DetailsPanel as A } from "@epam/ai-dial-catalog";
1
+ import { DeploymentIcon as e, buildCssVars as t, isSkillSelectionUnsupported as n, mergeClasses as r } from "@epam/ai-dial-chat-shared";
2
+ import { BASE_ICON_SIZE as i, Button as a, ButtonAppearance as o, ButtonVariant as s, DIAL_ICON_SIZE as c, DIAL_KIT_ICON_STROKE as l, FileDropzone as u, GhostButton as d, Highlight as f, InteractiveTooltip as p, InteractiveTooltipTrigger as m, Popup as h, PopupSize as g, Select as _, Spinner as v, ToggleIconButton as y, Tooltip as b, TooltipPlacement as x } from "@epam/ai-dial-ui-kit";
3
+ import { Suspense as S, useCallback as C, useEffect as w, useId as T, useLayoutEffect as E, useMemo as D, useRef as O, useState as k } from "react";
4
+ import { IconBlocks as ee, IconEye as A, IconLock as j, IconStarFilled as M, IconTrash as N } from "@tabler/icons-react";
5
+ import { Fragment as P, jsx as F, jsxs as I } from "react/jsx-runtime";
6
+ import { DialFileNodeType as L, DialFoldersTree as R } from "@epam/ai-dial-react-file-manager";
7
+ import { CatalogContentNodeType as te, DetailsPanel as z } from "@epam/ai-dial-catalog";
7
8
  //#region src/constants/public-class-names.ts
8
- var j = {
9
+ var B = {
10
+ selectorField: "dial-skills-selector-field",
9
11
  favoritesPanel: "dial-skills-favorites-panel",
10
12
  chip: "dial-skills-chip"
11
- }, M = ({ description: e, unsupportedMessage: t, viewDetailsLabel: n = "View details", onViewDetails: r }) => t == null ? /* @__PURE__ */ k("div", {
12
- className: "flex flex-col gap-3",
13
- children: [e != null && e !== "" && /* @__PURE__ */ O("p", {
13
+ }, V = /* @__PURE__ */ function(e) {
14
+ return e.Deleted = "deleted", e.NotShared = "not-shared", e;
15
+ }({}), H = ({ description: e, unsupportedMessage: t, unresolvedReason: n, deletedMessage: r, notSharedMessage: i, viewDetailsLabel: u = "View details", onViewDetails: d, viewDetailsTabIndex: f }) => {
16
+ if (n != null) {
17
+ let e = n === V.Deleted, t = e ? N : j, a = e ? r : i;
18
+ return /* @__PURE__ */ I("div", {
19
+ className: "flex flex-row items-center gap-2",
20
+ children: [/* @__PURE__ */ F(t, {
21
+ size: c.MD,
22
+ stroke: l,
23
+ "aria-hidden": !0,
24
+ className: "shrink-0 text-secondary"
25
+ }), /* @__PURE__ */ F("p", {
26
+ className: "dial-tiny-text text-start text-primary",
27
+ children: a
28
+ })]
29
+ });
30
+ }
31
+ return t == null ? /* @__PURE__ */ I("div", {
32
+ className: "flex flex-col gap-3",
33
+ children: [e != null && e !== "" && /* @__PURE__ */ F("p", {
34
+ className: "text-start",
35
+ children: e
36
+ }), /* @__PURE__ */ F(a, {
37
+ variant: s.Primary,
38
+ appearance: o.Link,
39
+ className: "h-[24px] self-start",
40
+ label: u,
41
+ iconBefore: /* @__PURE__ */ F(A, {
42
+ size: c.SM,
43
+ stroke: l,
44
+ "aria-hidden": !0
45
+ }),
46
+ onClick: d,
47
+ tabIndex: f
48
+ })]
49
+ }) : /* @__PURE__ */ F("p", {
14
50
  className: "text-start",
15
- children: e
16
- }), /* @__PURE__ */ O(i, {
17
- variant: o.Primary,
18
- appearance: a.Link,
19
- className: "h-[24px] self-start",
20
- label: n,
21
- iconBefore: /* @__PURE__ */ O(T, {
22
- size: s.SM,
23
- stroke: c,
24
- "aria-hidden": !0
25
- }),
26
- onClick: r
27
- })]
28
- }) : /* @__PURE__ */ O("p", {
29
- className: "text-start",
30
- children: t
31
- }), N = ({ name: e, path: t, description: r, isUnsupported: i = !1, labelClassName: a = "dial-body-paragraph-text", unsupportedLabelClassName: o = "text-error", unsupportedClassName: s = "bg-error", onViewDetails: c, labels: l = {} }) => {
32
- let { viewDetailsLabel: d = "View details", unsupportedTooltipLabel: p = "Selected model does not support skills. Remove the skill or select different model to proceed." } = l, [m, h] = C(0);
33
- return /* @__PURE__ */ O(f, {
51
+ children: t
52
+ });
53
+ }, U = ({ name: e, path: t, description: n, isUnsupported: i = !1, unresolvedReason: a, labelClassName: o = "dial-body-paragraph-text text-accent", unsupportedLabelClassName: s = "text-error", unsupportedClassName: c = "bg-error", detailsTrigger: l = "hover", onViewDetails: u, labels: d = {} }) => {
54
+ let { viewDetailsLabel: f = "View details", unsupportedTooltipLabel: h = "Selected model does not support skills. Remove the skill or select different model to proceed.", deletedTooltipLabel: g = "This skill has been deleted. Its details are no longer available.", notSharedTooltipLabel: _ = "You don't have access to this skill, so its details aren't shown. Ask the chat owner to share it with you." } = d, [v, y] = k(0), b = l === "click", S = () => {
55
+ y((e) => e + 1), u(t);
56
+ }, C = O(null), [w, T] = k(null);
57
+ return E(() => {
58
+ let e = C.current, t = () => T(e?.getBoundingClientRect().width ?? null);
59
+ if (t(), !e || typeof ResizeObserver > "u") return;
60
+ let n = new ResizeObserver(t);
61
+ return n.observe(e), () => n.disconnect();
62
+ }, [o]), /* @__PURE__ */ F(p, {
34
63
  asChild: !0,
35
- placement: g.Top,
36
- contentClassName: "max-w-[550px]",
37
- content: i ? /* @__PURE__ */ O(M, { unsupportedMessage: p }) : /* @__PURE__ */ O(M, {
38
- description: r,
39
- viewDetailsLabel: d,
40
- onViewDetails: () => {
41
- h((e) => e + 1), c(t);
42
- }
64
+ placement: x.Top,
65
+ trigger: b ? m.Click : m.Hover,
66
+ contentClassName: "max-w-[min(550px,calc(100vw-10px))]",
67
+ content: a == null ? i ? /* @__PURE__ */ F(H, { unsupportedMessage: h }) : /* @__PURE__ */ F(H, {
68
+ description: n,
69
+ viewDetailsLabel: f,
70
+ onViewDetails: S
71
+ }) : /* @__PURE__ */ F(H, {
72
+ unresolvedReason: a,
73
+ deletedMessage: g,
74
+ notSharedMessage: _
43
75
  }),
44
- children: /* @__PURE__ */ O("span", {
45
- className: "inline-flex items-center",
46
- children: /* @__PURE__ */ O(u, {
47
- label: `/${e}`,
48
- textClassName: i ? n(a, o) : a,
49
- className: n("h-auto px-2 py-0", i && s, j.chip)
50
- })
76
+ children: /* @__PURE__ */ I("span", {
77
+ tabIndex: 0,
78
+ className: r("relative -me-1 -ms-1 inline cursor-pointer select-text rounded-full pe-1 ps-1", i ? c : "hover:bg-info focus-visible:bg-info active:bg-info", i ? r(o, s) : o, B.chip),
79
+ "aria-label": `/${e}`,
80
+ children: [/* @__PURE__ */ F("span", {
81
+ ref: C,
82
+ "aria-hidden": !0,
83
+ className: "inset-inline-start-0 pointer-events-none absolute top-0 select-none",
84
+ children: "/"
85
+ }), /* @__PURE__ */ F("span", {
86
+ "aria-hidden": !0,
87
+ className: "select-none",
88
+ style: { paddingInlineStart: w ?? void 0 },
89
+ children: e
90
+ })]
51
91
  })
52
- }, m);
53
- }, P = {
54
- row: "_row_1ovug_1",
55
- header: "_header_1ovug_5",
56
- emptyHint: "_emptyHint_1ovug_9",
57
- star: "_star_1ovug_13",
58
- footer: "_footer_1ovug_17",
59
- rowEnter: "_rowEnter_1ovug_25",
60
- rowFadeIn: "_rowFadeIn_1ovug_1",
61
- rowLeaving: "_rowLeaving_1ovug_29",
62
- rowFadeOut: "_rowFadeOut_1ovug_1",
63
- listContent: "_listContent_1ovug_57"
64
- }, F = "px-3 pb-0.5 pt-2", I = 180, L = 288, R = ({ favorites: r, onSelect: i, onToggleFavorite: a, onBrowse: o, onViewDetails: c, searchQuery: l, labels: p = {}, colors: m, nameClassName: g = "dial-small-text", headerClassName: _ = "dial-tiny-lead-semi-text", emptyHintClassName: v = "dial-small-text" }) => {
65
- let { myCollectionLabel: x = "My Collection", emptyHintLabel: w = "Star a skill to pin it here", browseLabel: T = "Browse", removeFromFavoritesLabel: D = "Remove from favorites", viewDetailsLabel: A = "View details", noMatchingSkillsLabel: N = "No matching skills" } = p, R = t({
66
- "--fs-row-hover-bg": m?.rowHoverBackground,
67
- "--fs-header-text": m?.headerText,
68
- "--fs-empty-hint-text": m?.emptyHintText,
69
- "--fs-star-color": m?.starColor,
70
- "--fs-footer-border": m?.footerBorder
71
- }), [z, B] = C(/* @__PURE__ */ new Set()), V = S(/* @__PURE__ */ new Map());
72
- y(() => {
73
- let e = V.current;
92
+ }, v);
93
+ }, W = {
94
+ row: "_row_1v431_1",
95
+ header: "_header_1v431_8",
96
+ emptyHint: "_emptyHint_1v431_12",
97
+ star: "_star_1v431_16",
98
+ footer: "_footer_1v431_20",
99
+ rowEnter: "_rowEnter_1v431_28",
100
+ rowFadeIn: "_rowFadeIn_1v431_1",
101
+ rowLeaving: "_rowLeaving_1v431_32",
102
+ rowFadeOut: "_rowFadeOut_1v431_1",
103
+ listContent: "_listContent_1v431_60"
104
+ }, G = "px-3 pb-0.5 pt-2", ne = 180, re = 288, K = ({ favorites: n, onSelect: i, onToggleFavorite: a, onBrowse: o, onViewDetails: s, className: l, rowClassName: u, searchQuery: m, listboxId: h, activeOptionId: g, isMenu: _ = !1, labels: v = {}, colors: b, nameClassName: x = "dial-small-text", headerClassName: S = "dial-tiny-lead-semi-text", emptyHintClassName: C = "dial-small-text" }) => {
105
+ let { myCollectionLabel: D = "My Collection", emptyHintLabel: ee = "Star a skill to pin it here", browseLabel: A = "Browse", removeFromFavoritesLabel: j = "Remove from favorites", viewDetailsLabel: N = "View details", noMatchingSkillsLabel: P = "No matching skills" } = v, L = t({
106
+ "--fs-row-hover-bg": b?.rowHoverBackground,
107
+ "--fs-header-text": b?.headerText,
108
+ "--fs-empty-hint-text": b?.emptyHintText,
109
+ "--fs-star-color": b?.starColor,
110
+ "--fs-footer-border": b?.footerBorder
111
+ }), [R, te] = k(/* @__PURE__ */ new Set()), z = O(/* @__PURE__ */ new Map());
112
+ w(() => {
113
+ let e = z.current;
74
114
  return () => {
75
115
  e.forEach((e) => clearTimeout(e)), e.clear();
76
116
  };
77
117
  }, []);
78
- let H = l != null, U = l?.toLowerCase() ?? "", W = H ? r.filter((e) => e.name.toLowerCase().includes(U)) : r, G = S(null), [K, q] = C();
79
- b(() => {
80
- G.current && q(Math.min(G.current.scrollHeight, L));
81
- }, [r, l]);
82
- let J = (e, t) => {
118
+ let V = h != null, U = _ && !V, K = V || U ? "none" : void 0, q = "button";
119
+ V ? q = "option" : U && (q = "menuitem");
120
+ let J = T(), Y = m != null, X = m?.toLowerCase() ?? "", Z = Y ? n.filter((e) => e.name.toLowerCase().includes(X)) : n, Q = O(null), [$, ie] = k();
121
+ E(() => {
122
+ Q.current && ie(Math.min(Q.current.scrollHeight, re));
123
+ }, [n, m]);
124
+ let ae = (e, t) => {
83
125
  e.target === e.currentTarget && (e.key === "Enter" || e.key === " ") && (e.preventDefault(), i(t));
84
- }, Y = (e) => {
85
- B((t) => new Set(t).add(e));
126
+ }, oe = (e) => {
127
+ te((t) => new Set(t).add(e));
86
128
  let t = setTimeout(() => {
87
- a(e), B((t) => {
129
+ a?.(e), te((t) => {
88
130
  let n = new Set(t);
89
131
  return n.delete(e), n;
90
- }), V.current.delete(e);
91
- }, I);
92
- V.current.set(e, t);
132
+ }), z.current.delete(e);
133
+ }, ne);
134
+ z.current.set(e, t);
93
135
  };
94
- return /* @__PURE__ */ k("div", {
95
- className: n("flex w-full flex-col desktop:w-[280px]", j.favoritesPanel),
96
- style: R,
136
+ return /* @__PURE__ */ I("div", {
137
+ className: r("flex w-full flex-col desktop:w-[280px]", l, B.favoritesPanel),
138
+ style: L,
97
139
  children: [
98
- /* @__PURE__ */ O("p", {
99
- className: n(_, F, P.header),
100
- children: x
140
+ /* @__PURE__ */ F("p", {
141
+ id: J,
142
+ className: r(S, G, W.header),
143
+ children: D
101
144
  }),
102
- /* @__PURE__ */ O("div", {
103
- className: n("max-h-72 min-h-0 flex-1 overflow-y-auto", P.listContent),
104
- style: { maxHeight: K },
105
- children: /* @__PURE__ */ O("div", {
106
- ref: G,
107
- children: W.length > 0 ? /* @__PURE__ */ O("ul", {
145
+ /* @__PURE__ */ F("div", {
146
+ className: r("max-h-72 min-h-0 flex-1 overflow-y-auto", W.listContent),
147
+ style: { maxHeight: $ },
148
+ children: /* @__PURE__ */ F("div", {
149
+ ref: Q,
150
+ children: Z.length > 0 ? /* @__PURE__ */ F("ul", {
151
+ id: h,
152
+ role: V ? "listbox" : K,
153
+ "aria-labelledby": V ? J : void 0,
108
154
  className: "flex flex-col gap-1 px-1 pb-1",
109
- children: W.map((t) => {
110
- let r = /* @__PURE__ */ k("div", {
111
- role: "button",
155
+ children: Z.map((t) => {
156
+ let n = V ? `${h}-${encodeURIComponent(t.id)}` : void 0, o = V ? -1 : void 0, l = /* @__PURE__ */ I("div", {
157
+ role: q,
158
+ id: n,
159
+ "aria-selected": V ? n === g : void 0,
160
+ "aria-label": t.name,
112
161
  tabIndex: 0,
113
- className: n("flex cursor-pointer items-center gap-2 rounded-lg border border-transparent px-2 py-1.5 transition-colors", P.row),
162
+ className: r("flex cursor-pointer items-center gap-2 rounded-lg border border-transparent px-2 py-1.5 transition-colors", W.row, u),
114
163
  onClick: () => i(t),
115
- onKeyDown: (e) => J(e, t),
164
+ onKeyDown: (e) => ae(e, t),
116
165
  children: [
117
- /* @__PURE__ */ O(e, {
118
- size: s.MD,
166
+ /* @__PURE__ */ F(e, {
167
+ size: c.MD,
119
168
  initialsName: t.name
120
169
  }),
121
- l == null ? /* @__PURE__ */ O("span", {
122
- className: n(g, "min-w-0 flex-1 truncate text-start"),
170
+ m == null ? /* @__PURE__ */ F("span", {
171
+ className: r(x, "min-w-0 flex-1 truncate text-start"),
123
172
  children: t.name
124
- }) : /* @__PURE__ */ O(d, {
173
+ }) : /* @__PURE__ */ F(f, {
125
174
  text: t.name,
126
- query: l,
175
+ query: m,
127
176
  maxLines: 1,
128
- className: n(g, "min-w-0 flex-1 text-start")
177
+ className: r(x, "min-w-0 flex-1 text-start")
129
178
  }),
130
- /* @__PURE__ */ O(h, {
131
- icon: /* @__PURE__ */ O(E, {
132
- size: s.SM,
133
- className: P.star,
179
+ a && /* @__PURE__ */ F(y, {
180
+ icon: /* @__PURE__ */ F(M, {
181
+ size: c.SM,
182
+ className: W.star,
134
183
  "aria-hidden": !0
135
184
  }),
136
- "aria-label": D,
185
+ "aria-label": j,
137
186
  isSelected: !0,
187
+ tabIndex: o,
138
188
  onClick: (e) => {
139
- e.stopPropagation(), Y(t.id);
189
+ e.stopPropagation(), oe(t.id);
140
190
  }
141
191
  })
142
192
  ]
143
193
  });
144
- return /* @__PURE__ */ O("li", {
145
- className: z.has(t.id) ? P.rowLeaving : P.rowEnter,
146
- children: /* @__PURE__ */ O(f, {
194
+ return /* @__PURE__ */ F("li", {
195
+ role: K,
196
+ className: R.has(t.id) ? W.rowLeaving : W.rowEnter,
197
+ children: s ? /* @__PURE__ */ F(p, {
147
198
  asChild: !0,
148
199
  contentClassName: "max-w-[550px]",
149
- content: /* @__PURE__ */ O(M, {
200
+ content: /* @__PURE__ */ F(H, {
150
201
  description: t.description,
151
- viewDetailsLabel: A,
152
- onViewDetails: () => c(t)
202
+ viewDetailsLabel: N,
203
+ onViewDetails: () => s(t),
204
+ viewDetailsTabIndex: o
153
205
  }),
154
- children: r
155
- })
206
+ children: l
207
+ }) : l
156
208
  }, t.id);
157
209
  })
158
- }) : H && U !== "" ? /* @__PURE__ */ O("p", {
210
+ }) : Y && X !== "" ? /* @__PURE__ */ F("p", {
159
211
  role: "status",
160
212
  "aria-live": "polite",
161
- className: n(v, "px-4 py-4 text-start", P.emptyHint),
162
- children: N
163
- }) : /* @__PURE__ */ O("p", {
164
- className: n(v, "px-4 py-4 text-start", P.emptyHint),
165
- children: w
213
+ className: r(C, "px-4 py-4 text-start", W.emptyHint),
214
+ children: P
215
+ }) : /* @__PURE__ */ F("p", {
216
+ className: r(C, "px-4 py-4 text-start", W.emptyHint),
217
+ children: ee
166
218
  })
167
219
  })
168
220
  }),
169
- /* @__PURE__ */ O("div", {
170
- className: n("border-t px-2 py-3", P.footer),
171
- children: /* @__PURE__ */ O(u, {
172
- label: T,
221
+ /* @__PURE__ */ F("div", {
222
+ className: r("border-t px-2 py-3", W.footer),
223
+ children: /* @__PURE__ */ F(d, {
224
+ role: U ? "menuitem" : void 0,
225
+ label: A,
173
226
  className: "w-full justify-center",
174
227
  onClick: o
175
228
  })
176
229
  })
177
230
  ]
178
231
  });
179
- }, z = ".zip,.md", B = ({ isOpen: e, errorText: t, accept: n = z, labels: r, onClose: i, onFilesSelected: a, onFilesRejected: o }) => {
180
- let { dialogTitle: s = "Upload skill", dropZoneLabel: c = "Drag and drop it or click here to upload", dropZoneMobileLabel: u = "Click here to upload", formatsLabel: d = "File formats .zip and SKILL.md", fileInputAriaLabel: f = "Upload a skill ZIP archive or a SKILL.md file", closeAriaLabel: h = "Close" } = r ?? {};
181
- return /* @__PURE__ */ O(p, {
232
+ }, q = ".zip,.md", J = ({ isOpen: e, errorText: t, isUploading: n = !1, accept: r = q, labels: i, onClose: a, onFilesSelected: o, onFilesRejected: s }) => {
233
+ let { dialogTitle: c = "Upload skill", dropZoneLabel: l = "Drag and drop it or click here to upload", dropZoneMobileLabel: d = "Click here to upload", formatsLabel: f = "File formats .zip and SKILL.md", fileInputAriaLabel: p = "Upload a skill ZIP archive or a SKILL.md file", closeAriaLabel: m = "Close", uploadingAriaLabel: _ = "Uploading skill" } = i ?? {};
234
+ return /* @__PURE__ */ F(h, {
182
235
  open: e,
183
- size: m.Sm,
184
- header: s,
185
- closeAriaLabel: h,
186
- onClose: i,
187
- children: /* @__PURE__ */ O("div", {
188
- className: "px-6 py-4",
189
- children: /* @__PURE__ */ O(l, {
190
- label: /* @__PURE__ */ k(D, { children: [/* @__PURE__ */ O("span", {
236
+ size: g.Sm,
237
+ header: c,
238
+ closeAriaLabel: m,
239
+ onClose: a,
240
+ children: /* @__PURE__ */ I("div", {
241
+ className: "flex flex-col gap-4 px-6 py-4",
242
+ children: [/* @__PURE__ */ F(u, {
243
+ label: /* @__PURE__ */ I(P, { children: [/* @__PURE__ */ F("span", {
191
244
  className: "desktop:hidden",
192
- children: u
193
- }), /* @__PURE__ */ O("span", {
245
+ children: d
246
+ }), /* @__PURE__ */ F("span", {
194
247
  className: "hidden desktop:inline",
195
- children: c
248
+ children: l
196
249
  })] }),
197
- description: d,
198
- ariaLabel: f,
199
- accept: n,
200
- errorText: t,
201
- onChange: a,
202
- onReject: o
203
- })
250
+ description: f,
251
+ ariaLabel: p,
252
+ accept: r,
253
+ disabled: n,
254
+ errorText: n ? void 0 : t,
255
+ onChange: o,
256
+ onReject: s
257
+ }), n && /* @__PURE__ */ F(v, { ariaLabel: _ })]
204
258
  })
205
259
  });
206
- }, V = ({ isOpen: e, onClose: t, onSelect: n, title: r, renderContent: i }) => /* @__PURE__ */ O(p, {
260
+ }, Y = ({ isOpen: e, onClose: t, onSelect: n, title: r, renderContent: i }) => /* @__PURE__ */ F(h, {
207
261
  open: e,
208
262
  header: r,
209
- size: m.Lg,
263
+ size: g.Lg,
210
264
  className: "h-[min(90vh,860px)] !max-w-[min(95vw,1200px)] overflow-hidden",
211
265
  onClose: t,
212
- children: /* @__PURE__ */ O("div", {
266
+ children: /* @__PURE__ */ F("div", {
213
267
  className: "h-[min(80vh,840px)] overflow-auto",
214
- children: /* @__PURE__ */ O(_, {
268
+ children: /* @__PURE__ */ F(S, {
215
269
  fallback: null,
216
270
  children: e && i(n, t)
217
271
  })
218
272
  })
219
- }), H = (e) => /* @__PURE__ */ O(A, { ...e }), U = (e) => ({
273
+ }), X = (e, t = null) => e.map((e) => e.type === te.Folder ? {
274
+ path: e.id,
275
+ name: e.name,
276
+ nodeType: L.FOLDER,
277
+ parentPath: t,
278
+ folderId: e.id,
279
+ items: X(e.items, e.id)
280
+ } : {
281
+ path: e.id,
282
+ name: e.name,
283
+ nodeType: L.ITEM,
284
+ parentPath: t,
285
+ folderId: t ?? ""
286
+ }), Z = ({ nodes: e, selectedFileId: t, expandedFolderIds: n, onToggleFolder: r, onSelectFile: i, onClose: a, ariaLabel: o }) => /* @__PURE__ */ F(R, {
287
+ items: D(() => X(e), [e]),
288
+ showFiles: !0,
289
+ areHiddenFilesVisible: !0,
290
+ selectedPath: t,
291
+ expandedPaths: D(() => new Set(n), [n]),
292
+ onExpandedPathsChange: (e) => {
293
+ for (let t of e) n.has(t) || r(t);
294
+ for (let t of n) e.has(t) || r(t);
295
+ },
296
+ onItemClick: (e) => {
297
+ e.nodeType === L.ITEM && i(e.path);
298
+ },
299
+ ariaLabel: o,
300
+ autoFocus: !0,
301
+ onEscape: a
302
+ }), Q = (e) => /* @__PURE__ */ F(z, {
303
+ ...e,
304
+ renderContentFileTree: (e) => /* @__PURE__ */ F(Z, { ...e })
305
+ }), $ = (e) => e == null || /[\s/]/.test(e), ie = (e, t, n) => {
306
+ let r = [], i = 0;
307
+ return t.forEach((t, a) => {
308
+ let o = `/${n(t.url)}`, s = i;
309
+ for (; s <= e.length;) {
310
+ let t = e.indexOf(o, s);
311
+ if (t === -1) return;
312
+ let n = t + o.length;
313
+ if ($(e[n])) {
314
+ r.push({
315
+ skillIndex: a,
316
+ start: t,
317
+ length: o.length
318
+ }), i = n;
319
+ return;
320
+ }
321
+ s = t + 1;
322
+ }
323
+ }), r;
324
+ }, ae = (e, t) => {
325
+ let n = /* @__PURE__ */ new Map();
326
+ t.forEach((e) => {
327
+ e.name !== "" && !n.has(e.name) && n.set(e.name, e.url);
328
+ });
329
+ let r = [...n.keys()].sort((e, t) => t.length - e.length), i = [], a = e.indexOf("/");
330
+ for (; a !== -1;) {
331
+ let t = a === 0 || /\s/.test(e[a - 1]), o = a + 1, s = t ? r.find((t) => e.startsWith(t, o) && $(e[o + t.length])) : void 0, c = s == null ? void 0 : n.get(s);
332
+ s != null && c != null ? (i.push({
333
+ url: c,
334
+ name: s,
335
+ start: a,
336
+ length: s.length + 1
337
+ }), a = e.indexOf("/", o + s.length)) : a = e.indexOf("/", o);
338
+ }
339
+ return i;
340
+ }, oe = (e, t) => {
341
+ let n = Math.min(e.length, t.length), r = 0;
342
+ for (; r < n && e[r] === t[r];) r += 1;
343
+ let i = n - r, a = 0;
344
+ for (; a < i && e[e.length - 1 - a] === t[t.length - 1 - a];) a += 1;
345
+ return {
346
+ start: r,
347
+ deletedLength: e.length - r - a,
348
+ insertedLength: t.length - r - a
349
+ };
350
+ }, se = (e, t) => {
351
+ let n = t.start + t.deletedLength, r = t.insertedLength - t.deletedLength;
352
+ return e.reduce((e, i) => i.start + i.length <= t.start ? (e.push(i), e) : (i.start >= n && e.push({
353
+ ...i,
354
+ start: i.start + r
355
+ }), e), []);
356
+ }, ce = (e, t, n, r, i) => {
357
+ let a = r.length + 1, o = a + +!!i, s = e.map((e) => e.start >= t ? {
358
+ ...e,
359
+ start: e.start + o
360
+ } : e), c = {
361
+ url: n,
362
+ name: r,
363
+ start: t,
364
+ length: a
365
+ };
366
+ return [...s, c].sort((e, t) => e.start - t.start);
367
+ }, le = (e, t) => e.find((e) => e.start + e.length === t), ue = (e, t, n) => {
368
+ let r = t;
369
+ for (; r > 0 && !/\s/.test(e[r - 1]);) r--;
370
+ let i = r;
371
+ for (; i < e.length && !/\s/.test(e[i]);) i++;
372
+ let a = e.slice(r, i);
373
+ if (!(!a.startsWith(n) || a.slice(n.length).includes(n))) return {
374
+ start: r,
375
+ end: i
376
+ };
377
+ }, de = (e, t, n) => {
378
+ if (n === "" || t.insertedLength < n.length) return;
379
+ let r = e.indexOf(n, Math.max(0, t.start - n.length)), i = t.start + t.insertedLength - n.length;
380
+ return r !== -1 && r <= i ? r : void 0;
381
+ }, fe = () => {
382
+ let [e, t] = k(""), [n, r] = k([]), i = O(e);
383
+ i.current = e;
384
+ let a = O(n);
385
+ a.current = n;
386
+ let o = O(null), s = C((e) => {
387
+ let n = oe(i.current, e), a = o.current;
388
+ o.current = null;
389
+ let s = a == null ? void 0 : de(e, n, a.text);
390
+ r((t) => {
391
+ let r = se(t, n);
392
+ if (a == null || s == null) return r;
393
+ let i = a.mentions.map((e) => ({
394
+ ...e,
395
+ start: e.start + s
396
+ })).filter((t) => e.startsWith(`/${t.name}`, t.start) && !r.some((e) => e.start < t.start + t.length && t.start < e.start + e.length));
397
+ return [...r, ...i].sort((e, t) => e.start - t.start);
398
+ }), i.current = e, t(e);
399
+ }, []), c = C((e, n, a) => {
400
+ let o = i.current, s = !/^\s/.test(o.slice(a)), c = `/${n}${s ? " " : ""}`, l = o.slice(0, a) + c + o.slice(a);
401
+ return i.current = l, t(l), r((t) => ce(t, a, e, n, s)), s;
402
+ }, []), l = C((e, n, a) => {
403
+ let o = i.current, s = `/${n}`, c = o.slice(0, a) + s + o.slice(a);
404
+ i.current = c, t(c), r((t) => ce(t, a, e, n, !1));
405
+ }, []), u = C((e) => le(a.current, e), []), d = D(() => {
406
+ if (n.length !== 0) return n.map((e) => ({ url: e.url }));
407
+ }, [n]), f = C((e, t) => {
408
+ o.current = t.length > 0 ? {
409
+ text: e,
410
+ mentions: t
411
+ } : null;
412
+ }, []), p = C(() => {
413
+ t(""), r([]);
414
+ }, []), m = C((e, n, i) => {
415
+ let a = n ?? [], o = ie(e, a, i);
416
+ t(e), r(o.map((e) => {
417
+ let t = a[e.skillIndex];
418
+ return {
419
+ url: t.url,
420
+ name: i(t.url),
421
+ start: e.start,
422
+ length: e.length
423
+ };
424
+ }));
425
+ }, []);
426
+ return D(() => ({
427
+ draft: e,
428
+ anchors: n,
429
+ onDraftChange: s,
430
+ insertMention: c,
431
+ restoreMention: l,
432
+ onBackspaceAtCaret: u,
433
+ orderedSkills: d,
434
+ reset: p,
435
+ seedFromMessage: m,
436
+ expectInsertion: f
437
+ }), [
438
+ f,
439
+ e,
440
+ n,
441
+ s,
442
+ c,
443
+ l,
444
+ u,
445
+ d,
446
+ p,
447
+ m
448
+ ]);
449
+ }, pe = (e) => ({
220
450
  id: e.url,
221
451
  name: e.name,
222
452
  description: e.description
223
- }), W = (e) => {
453
+ }), me = (e) => {
224
454
  let t = e.split("/").filter((e) => e.length > 0);
225
455
  return t[t.length - 1] ?? e;
226
- }, G = ({ isEnabled: e, isSkillsSupported: t, skills: n, sharedWithMe: i, publicSkills: a, favoriteIds: o, onToggleFavorite: s, labels: l, historyChipLabelClassName: u, renderCatalogContent: d, detailsPanelComponent: f }) => {
227
- let { addMenuLabel: p = "Skills", backLabel: m = "Back", catalogModalTitleLabel: h = "Use skill", emptyQueryHintLabel: g = "Type to filter", unsupportedTooltipLabel: y = "Selected model does not support skills. Remove the skill or select different model to proceed.", panelLabels: b } = l ?? {}, S = e && t, [T, E] = C(!1), [D, k] = C(null), [A, j] = C(null), M = x(() => [
228
- ...n,
229
- ...i ?? [],
230
- ...a ?? []
456
+ }, he = (e) => {
457
+ let t = e.split("/").filter((e) => e.length > 0);
458
+ return t[0] !== "skills" || t.length < 3 ? null : t[1];
459
+ }, ge = (e, t) => he(e) === t ? V.Deleted : V.NotShared, _e = "/", ve = ({ isSkillsSupported: e, skills: t, sharedWithMe: n, publicSkills: r, favoriteIds: a, viewerBucket: o, onToggleFavorite: s, labels: c, historyChipLabelClassName: u, activeMentionLabelClassName: d = "text-accent", activeMentionDetailsTrigger: f, historyDetailsTrigger: p, renderCatalogContent: m, detailsPanelComponent: h }) => {
460
+ let { addMenuLabel: g = "Skills", backLabel: _ = "Back", catalogModalTitleLabel: v = "Use skill", emptyQueryHintLabel: y = "Type to filter", deletedTooltipLabel: b, notSharedTooltipLabel: x, unsupportedTooltipLabel: w, panelLabels: T } = c ?? {}, [E, A] = k(!1), [j, M] = k(null), [N, P] = k(0), I = O(null), [L, R] = k(0), [te, z] = k(void 0), B = fe(), V = D(() => [
461
+ ...t,
462
+ ...n ?? [],
463
+ ...r ?? []
231
464
  ], [
465
+ t,
232
466
  n,
233
- i,
234
- a
235
- ]), P = x(() => new Map(M.map((e) => [e.url, e])), [M]), F = x(() => M.filter((e) => o.has(e.url)).map((e) => U(e)), [M, o]), I = x(() => A == null ? null : P.get(A) ?? null, [P, A]), L = I != null && !t, z = v((e) => {
236
- j(e);
237
- }, []), B = v(() => {
238
- j(null);
239
- }, []), H = A, G = x(() => A == null ? void 0 : [{ url: A }], [A]), K = x(() => I == null ? null : /* @__PURE__ */ O(N, {
240
- name: I.name,
241
- path: I.url,
242
- description: I.description,
243
- isUnsupported: L,
244
- onViewDetails: k,
245
- labels: {
246
- viewDetailsLabel: b?.viewDetailsLabel,
247
- unsupportedTooltipLabel: y
248
- }
249
- }), [
250
- I,
251
- L,
467
+ r
468
+ ]), H = D(() => new Map(V.map((e) => [e.url, e])), [V]), W = C((e) => H.get(e)?.name ?? me(e), [H]), G = D(() => V.filter((e) => a.has(e.url)).map((e) => pe(e)), [V, a]), ne = B.anchors.length > 0 && !e, re = D(() => B.anchors.map((t) => ({
469
+ start: t.start,
470
+ length: t.length,
471
+ isUnsupported: !e,
472
+ render: () => /* @__PURE__ */ F(U, {
473
+ name: t.name,
474
+ path: t.url,
475
+ labelClassName: d,
476
+ description: H.get(t.url)?.description,
477
+ isUnsupported: !e,
478
+ detailsTrigger: f,
479
+ onViewDetails: M,
480
+ labels: {
481
+ viewDetailsLabel: T?.viewDetailsLabel,
482
+ unsupportedTooltipLabel: w
483
+ }
484
+ })
485
+ })), [
486
+ B.anchors,
487
+ e,
488
+ H,
489
+ d,
490
+ f,
491
+ T,
492
+ w
493
+ ]), q = C((e, t, n) => {
494
+ let r = B.insertMention(e, t, n);
495
+ R((e) => e + 1), z(n + 1 + t.length + +!!r);
496
+ }, [B]), J = C((e) => {
497
+ let t = ue(B.draft, e, _e);
498
+ return t == null ? e : (B.onDraftChange(B.draft.slice(0, t.start) + B.draft.slice(t.end)), t.start);
499
+ }, [B]), X = C((e) => {
500
+ let t = ue(B.draft, e, _e);
501
+ if (t == null) return;
502
+ let n = B.anchors.find((e) => e.start === t.start && e.start + e.length === t.end);
503
+ return {
504
+ position: t.start,
505
+ text: B.draft.slice(t.start, t.end),
506
+ mentionUrl: n?.url
507
+ };
508
+ }, [B]), Z = C(() => {
509
+ B.reset(), R((e) => e + 1), z(void 0);
510
+ }, [B]), { expectInsertion: Q } = B, $ = C((t) => {
511
+ Q(t, e ? ae(t, V) : []);
512
+ }, [
513
+ Q,
514
+ e,
515
+ V
516
+ ]), oe = C((e, t) => {
517
+ B.seedFromMessage(e, t, W), R((e) => e + 1), z(void 0);
518
+ }, [B, W]), se = C((e, t) => {
519
+ if (t == null || t.length === 0) return null;
520
+ let n = ie(e, t, W), r = [], i = 0;
521
+ return n.forEach((n) => {
522
+ n.start > i && r.push(e.slice(i, n.start));
523
+ let a = t[n.skillIndex], s = H.get(a.url), c = s?.name ?? me(a.url), l = s == null ? ge(a.url, o) : void 0;
524
+ r.push(/* @__PURE__ */ F(U, {
525
+ name: c,
526
+ path: a.url,
527
+ labelClassName: u,
528
+ description: s?.description,
529
+ unresolvedReason: l,
530
+ detailsTrigger: p,
531
+ onViewDetails: M,
532
+ labels: {
533
+ viewDetailsLabel: T?.viewDetailsLabel,
534
+ deletedTooltipLabel: b,
535
+ notSharedTooltipLabel: x
536
+ }
537
+ }, `${a.url}-${n.start}`)), i = n.start + n.length;
538
+ }), i < e.length && r.push(e.slice(i)), r;
539
+ }, [
540
+ W,
541
+ H,
542
+ u,
543
+ p,
544
+ T,
545
+ o,
252
546
  b,
253
- y
254
- ]), q = v((e) => e == null || e.length === 0 ? null : e.map((e) => {
255
- let t = P.get(e.url);
256
- return /* @__PURE__ */ O(N, {
257
- name: t?.name ?? W(e.url),
547
+ x
548
+ ]), ce = C((e) => e == null || e.length === 0 ? null : e.map((e) => {
549
+ let t = H.get(e.url), n = t?.name ?? me(e.url), r = t == null ? ge(e.url, o) : void 0;
550
+ return /* @__PURE__ */ F(U, {
551
+ name: n,
258
552
  path: e.url,
259
553
  labelClassName: u,
260
554
  description: t?.description,
261
- onViewDetails: k,
262
- labels: { viewDetailsLabel: b?.viewDetailsLabel }
555
+ unresolvedReason: r,
556
+ detailsTrigger: p,
557
+ onViewDetails: M,
558
+ labels: {
559
+ viewDetailsLabel: T?.viewDetailsLabel,
560
+ deletedTooltipLabel: b,
561
+ notSharedTooltipLabel: x
562
+ }
263
563
  }, e.url);
264
564
  }), [
265
- P,
565
+ H,
266
566
  u,
267
- b
268
- ]), J = v((e) => /* @__PURE__ */ O(R, {
269
- favorites: F,
270
- onSelect: (t) => {
271
- z(t.id), e();
567
+ p,
568
+ T,
569
+ o,
570
+ b,
571
+ x
572
+ ]), le = C((e, t) => /* @__PURE__ */ F(K, {
573
+ favorites: G,
574
+ isMenu: !0,
575
+ onSelect: (n) => {
576
+ q(n.id, n.name, J(t)), e();
272
577
  },
273
578
  onToggleFavorite: s,
274
579
  onBrowse: () => {
275
- e(), E(!0);
580
+ let n = X(t);
581
+ P(J(t)), I.current = n ?? null, e(), A(!0);
276
582
  },
277
- onViewDetails: (t) => {
278
- e(), k(t.id);
583
+ onViewDetails: (n) => {
584
+ J(t), e(), M(n.id);
279
585
  },
280
- labels: b
586
+ labels: T
281
587
  }), [
282
- F,
283
- z,
588
+ G,
589
+ q,
590
+ J,
591
+ X,
284
592
  s,
285
- b
286
- ]), Y = x(() => S ? {
287
- key: "skills",
288
- title: p,
289
- icon: /* @__PURE__ */ O(w, {
290
- size: r,
291
- "aria-hidden": !0,
292
- stroke: c
293
- }),
294
- renderOverlay: J,
295
- backLabel: m
296
- } : void 0, [
297
- S,
298
- p,
299
- m,
300
- J
301
- ]), X = x(() => S ? {
302
- triggerPrefix: "/",
303
- menuLabel: p,
304
- emptyQueryHint: g,
305
- renderMenu: ({ query: e, close: t }) => /* @__PURE__ */ O(R, {
306
- favorites: F,
307
- searchQuery: e,
308
- onSelect: (e) => {
309
- t({ consumeQuery: !0 }), z(e.id);
310
- },
311
- onToggleFavorite: s,
312
- onBrowse: () => {
313
- t({ consumeQuery: !0 }), E(!0);
314
- },
315
- onViewDetails: (e) => {
316
- t({ consumeQuery: !0 }), k(e.id);
317
- },
318
- labels: b
319
- })
320
- } : void 0, [
321
- S,
322
- p,
323
- g,
324
- F,
325
- z,
326
- s,
327
- b
593
+ T
328
594
  ]);
329
- return e ? {
330
- skillMenuOverlay: Y,
331
- commandMenu: X,
332
- skillCatalogModal: /* @__PURE__ */ O(V, {
333
- isOpen: T,
334
- onClose: () => E(!1),
595
+ return {
596
+ skillMenuOverlay: D(() => e ? {
597
+ key: "skills",
598
+ title: g,
599
+ icon: /* @__PURE__ */ F(ee, {
600
+ size: i,
601
+ "aria-hidden": !0,
602
+ stroke: l
603
+ }),
604
+ renderOverlay: le,
605
+ backLabel: _
606
+ } : void 0, [
607
+ e,
608
+ g,
609
+ _,
610
+ le
611
+ ]),
612
+ commandMenu: D(() => e ? {
613
+ triggerPrefix: _e,
614
+ menuLabel: g,
615
+ emptyQueryHint: y,
616
+ renderMenu: ({ query: e, caretPosition: t, close: n, listboxId: r, activeOptionId: i }) => /* @__PURE__ */ F(K, {
617
+ favorites: G,
618
+ searchQuery: e,
619
+ listboxId: r,
620
+ activeOptionId: i,
621
+ onSelect: (e) => {
622
+ n({ consumeQuery: !0 }), q(e.id, e.name, t);
623
+ },
624
+ onToggleFavorite: s,
625
+ onBrowse: () => {
626
+ let r = `${_e}${e}`, i = B.anchors.find((e) => e.start === t && e.length === r.length);
627
+ n({
628
+ consumeQuery: !0,
629
+ returnFocus: !1
630
+ }), P(t), I.current = {
631
+ position: t,
632
+ text: r,
633
+ mentionUrl: i?.url
634
+ }, A(!0);
635
+ },
636
+ onViewDetails: (e) => {
637
+ n({ consumeQuery: !0 }), M(e.id);
638
+ },
639
+ labels: T
640
+ })
641
+ } : void 0, [
642
+ e,
643
+ g,
644
+ y,
645
+ G,
646
+ q,
647
+ B.anchors,
648
+ s,
649
+ T
650
+ ]),
651
+ skillCatalogModal: /* @__PURE__ */ F(Y, {
652
+ isOpen: E,
653
+ onClose: C(() => {
654
+ A(!1);
655
+ let e = I.current;
656
+ if (I.current = null, e == null) return;
657
+ let { position: t, text: n, mentionUrl: r } = e;
658
+ r == null ? B.onDraftChange(B.draft.slice(0, t) + n + B.draft.slice(t)) : B.restoreMention(r, n.slice(1), t), R((e) => e + 1), z(t + n.length);
659
+ }, [B]),
335
660
  onSelect: (e) => {
336
- z(e), E(!1);
661
+ I.current = null, q(e, W(e), N), A(!1);
337
662
  },
338
- title: h,
339
- renderContent: d
663
+ title: v,
664
+ renderContent: m
340
665
  }),
341
- skillDetailsPanel: /* @__PURE__ */ O(_, {
666
+ skillDetailsPanel: /* @__PURE__ */ F(S, {
342
667
  fallback: null,
343
- children: /* @__PURE__ */ O(f, {
344
- skillId: D,
345
- onClose: () => k(null)
668
+ children: /* @__PURE__ */ F(h, {
669
+ skillId: j,
670
+ onClose: () => M(null)
346
671
  })
347
672
  }),
348
- selectedSkillElement: K,
349
- selectedSkillPath: H,
350
- selectedSkills: G,
351
- isSkillUnsupported: L,
352
- selectSkill: z,
353
- removeSelectedSkill: B,
354
- renderHistorySkills: q
355
- } : {
356
- skillMenuOverlay: void 0,
357
- commandMenu: void 0,
358
- skillCatalogModal: null,
359
- skillDetailsPanel: null,
360
- selectedSkillElement: null,
361
- selectedSkillPath: null,
362
- selectedSkills: void 0,
363
- isSkillUnsupported: !1,
364
- selectSkill: () => void 0,
365
- removeSelectedSkill: () => void 0,
366
- renderHistorySkills: () => null
673
+ message: B.draft,
674
+ messageRevision: L,
675
+ activeMentions: re,
676
+ onDraftChange: B.onDraftChange,
677
+ onBackspaceAtCaret: B.onBackspaceAtCaret,
678
+ caretPositionOverride: te,
679
+ isSkillUnsupported: ne,
680
+ selectedSkills: B.orderedSkills,
681
+ resetSkillMentions: Z,
682
+ seedSkillMentions: oe,
683
+ recognizeMentionsInInsertion: $,
684
+ renderHistorySkillSegments: se,
685
+ renderHistorySkills: ce
686
+ };
687
+ }, ye = {
688
+ background: "_background_1ult0_1",
689
+ border: "_border_1ult0_5",
690
+ value: "_value_1ult0_9",
691
+ clear: "_clear_1ult0_13",
692
+ invalid: "_invalid_1ult0_17"
693
+ }, be = [], xe = "Selected model does not support skills. Select a different model to use a skill.", Se = ({ value: i, onChange: a, displayNames: o, skills: s = be, isSkillsSupported: l, isDisabled: u = !1, error: d, labels: p, className: m, styles: h }) => {
694
+ let [g, v] = k(!1), [y, x] = k(""), S = O(null), C = T(), w = i.some((e) => n(e, l)), D = l && !u, ee = g && D, A = i.length > 0 ? p.unsupportedTooltipLabel : p.unavailableTooltipLabel ?? xe, j = !l && i.length === 0, M = d ?? (j ? A : void 0), N = new Map(i.map((e) => [e, {
695
+ id: e,
696
+ name: o?.[e] || e
697
+ }]));
698
+ s.forEach((e) => N.set(e.id, e));
699
+ let P = [...N.values()].map((t) => ({
700
+ value: t.id,
701
+ label: t.name,
702
+ labelNode: y.trim() ? /* @__PURE__ */ F(f, {
703
+ text: t.name,
704
+ query: y,
705
+ maxLines: 1
706
+ }) : void 0,
707
+ icon: /* @__PURE__ */ F(e, {
708
+ size: c.SM,
709
+ initialsName: t.name
710
+ }),
711
+ disabled: !l
712
+ })), L = {
713
+ ...t({
714
+ "--ssf-text": h?.colors?.text,
715
+ "--ssf-bg": h?.colors?.background,
716
+ "--ssf-border": h?.colors?.border,
717
+ "--ssf-error": h?.colors?.error
718
+ }),
719
+ ...h?.cssVars
367
720
  };
721
+ return E(() => {
722
+ let e = S.current?.querySelector("[role=\"combobox\"]");
723
+ e && (M ? e.setAttribute("aria-describedby", C) : e.removeAttribute("aria-describedby"), d || w ? e.setAttribute("aria-invalid", "true") : e.removeAttribute("aria-invalid"));
724
+ }, [
725
+ M,
726
+ C,
727
+ d,
728
+ u,
729
+ w
730
+ ]), /* @__PURE__ */ I("div", {
731
+ ref: S,
732
+ className: r("min-w-0", m, B.selectorField),
733
+ style: L,
734
+ children: [/* @__PURE__ */ F(b, {
735
+ tooltip: A,
736
+ hideTooltip: l,
737
+ triggerClassName: "block w-full min-w-0",
738
+ children: /* @__PURE__ */ F("div", {
739
+ inert: u ? !0 : void 0,
740
+ children: /* @__PURE__ */ F(_, {
741
+ multiple: !0,
742
+ searchable: !0,
743
+ open: ee,
744
+ onOpenChange: (e) => {
745
+ e && !D || v(e);
746
+ },
747
+ onSearchQueryChange: x,
748
+ value: i,
749
+ onChange: (e) => {
750
+ u || a(Array.isArray(e) ? e : [e]);
751
+ },
752
+ options: P,
753
+ placeholder: p.placeholder,
754
+ labelProps: { label: p.fieldLabel },
755
+ error: d,
756
+ caption: j ? A : void 0,
757
+ searchPlaceholder: p.searchPlaceholder ?? "Search skills",
758
+ emptyStateTitle: y.trim() ? p.noMatchingSkillsLabel ?? "No matching skills" : p.emptyLabel ?? "No skills available",
759
+ disabled: u || j,
760
+ invalid: !!d || w,
761
+ className: "w-full min-w-0",
762
+ fieldClassName: r(D ? "cursor-pointer" : "cursor-not-allowed", "--ssf-bg" in L && ye.background, "--ssf-border" in L && ye.border, "--ssf-text" in L && ye.value, (d || w) && ye.invalid, h?.typography?.fontClassName ?? "dial-small-text", h?.triggerClassName),
763
+ listClassName: "w-[min(var(--reference-width),calc(100vw-2rem))] max-w-full"
764
+ })
765
+ })
766
+ }), M && /* @__PURE__ */ F("span", {
767
+ id: C,
768
+ className: "sr-only",
769
+ children: M
770
+ })]
771
+ });
368
772
  };
369
773
  //#endregion
370
- export { N as ChatSkill, R as FavoriteSkillsPanel, j as SKILLS_CLASS, B as SkillArchiveUploadDialog, V as SkillCatalogModal, H as SkillDetailsSidePanel, M as SkillInfoTooltipContent, U as buildFavoriteSkillItem, G as useSkillSelectorOverlay };
774
+ export { U as ChatSkill, K as FavoriteSkillsPanel, B as SKILLS_CLASS, J as SkillArchiveUploadDialog, Y as SkillCatalogModal, Z as SkillContentFileTree, Q as SkillDetailsSidePanel, H as SkillInfoTooltipContent, Se as SkillSelectorField, V as SkillUnresolvedReason, pe as buildFavoriteSkillItem, oe as diffTextChange, le as findMentionAtCaret, me as getSkillFallbackName, ce as insertAnchor, ie as matchSkillMentions, se as reconcileAnchors, fe as useSkillMentions, ve as useSkillSelectorOverlay };