@epam/ai-dial-chat-hooks 1.2.0-dev.85 → 1.2.0-dev.89

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.
@@ -1,121 +1,125 @@
1
1
  import { useCallback as e, useEffect as t, useLayoutEffect as n, useRef as r, useState as i } from "react";
2
2
  //#region src/conversation/useConversationScroll/useConversationScroll.ts
3
3
  var a = 80, o = 1, s = ({ messages: s, isAssistantTyping: c, conversationId: l }) => {
4
- let [u, d] = i(!1), f = r(null), p = r(null), m = r(null), h = r(!1), g = r(!1), _ = r(null), v = r(/* @__PURE__ */ new Map()), y = e((e, t) => {
5
- t ? v.current.set(e, t) : v.current.delete(e);
6
- }, []), b = r(null), x = e((e) => {
7
- b.current = e;
8
- }, []), S = e((e, t) => {
4
+ let [u, d] = i(!1), f = r(null), p = r(null), m = r(null), h = r(!1), g = r(!1), _ = r(null), v = r(!0), y = r(/* @__PURE__ */ new Map()), b = e((e, t) => {
5
+ t ? y.current.set(e, t) : y.current.delete(e);
6
+ }, []), x = r(null), S = e((e) => {
7
+ x.current = e;
8
+ }, []), C = e((e, t) => {
9
9
  let n = f.current;
10
10
  n && n.scrollTo({
11
11
  top: e,
12
12
  behavior: t ? "instant" : "smooth"
13
13
  });
14
- }, []), C = e(() => {
15
- m.current && (m.current.style.height = "0px"), h.current = !1, g.current = !1, _.current = null;
16
14
  }, []), w = e(() => {
15
+ m.current && (m.current.style.height = "0px"), h.current = !1, g.current = !1, _.current = null;
16
+ }, []), T = e(() => {
17
17
  let e = f.current, t = p.current;
18
18
  if (!e || !t) return null;
19
19
  let n = e.getBoundingClientRect(), r = t.getBoundingClientRect();
20
20
  return e.scrollTop + (r.bottom - n.top) - e.clientHeight;
21
- }, []), T = e((e = !1) => {
22
- let t = w();
23
- t != null && S(Math.max(t, 0), e);
24
- }, [S, w]), E = e(() => {
21
+ }, []), E = e((e = !1) => {
22
+ let t = T();
23
+ t != null && C(Math.max(t, 0), e);
24
+ }, [C, T]), D = e(() => {
25
25
  let e = f.current, t = p.current;
26
26
  if (!e || !t) return null;
27
27
  let n = e.getBoundingClientRect();
28
28
  return t.getBoundingClientRect().bottom - n.top - e.clientHeight;
29
- }, []), D = e(() => {
29
+ }, []), O = e(() => {
30
30
  if (!g.current) return;
31
- let e = E();
32
- e == null || e < -1 || C();
33
- }, [C, E]), O = e((e) => {
34
- let t = f.current, n = v.current.get(e);
31
+ let e = D();
32
+ e == null || e < -1 || w();
33
+ }, [w, D]), k = e((e) => {
34
+ let t = f.current, n = y.current.get(e);
35
35
  if (!t || !n) return null;
36
36
  let r = t.getBoundingClientRect(), i = n.getBoundingClientRect(), a = t.scrollTop + (i.top - r.top);
37
37
  return Math.max(a, 0);
38
- }, []), k = e((e, t = !1) => {
39
- let n = O(e);
40
- n != null && S(n, t);
41
- }, [O, S]), A = e(() => {
42
- let e = w();
38
+ }, []), A = e((e, t = !1) => {
39
+ let n = k(e);
40
+ n != null && C(n, t);
41
+ }, [k, C]), j = e(() => {
42
+ let e = T();
43
43
  return e == null ? null : Math.max(e, 0);
44
- }, [w]), j = e(() => {
44
+ }, [T]), M = e(() => {
45
45
  if (!h.current) return null;
46
- let e = _.current, t = A();
46
+ let e = _.current, t = j();
47
47
  return e == null || t == null ? null : Math.max(e, t);
48
- }, [A]), M = e(() => {
49
- let e = f.current, t = j();
48
+ }, [j]), N = e(() => {
49
+ let e = f.current, t = M();
50
50
  !e || t == null || e.scrollTop > t + o && (e.scrollTop = t);
51
- }, [j]), N = e((e) => {
52
- let t = m.current, n = A();
51
+ }, [M]), P = e((e) => {
52
+ let t = m.current, n = j();
53
53
  if (!t || n == null) return;
54
54
  let r = Math.max(e - n, 0);
55
55
  t.style.height = `${r}px`, h.current = r > 0, g.current = !1, _.current = r > 0 ? e : null;
56
- }, [A]), P = e((e) => {
57
- let t = O(e);
58
- t != null && (N(t), k(e, !1));
56
+ }, [j]), F = e((e) => {
57
+ let t = k(e);
58
+ t != null && (P(t), A(e, !1));
59
59
  }, [
60
- N,
61
- O,
62
- k
63
- ]), F = e(() => {
64
- let e = E();
65
- e != null && d(e >= a);
66
- }, [E]), I = r(s.length), L = r(null);
60
+ P,
61
+ k,
62
+ A
63
+ ]), I = e(() => {
64
+ let e = D();
65
+ if (e == null) return;
66
+ let t = e < a;
67
+ v.current = t, d(!t);
68
+ }, [D]), L = r(s.length), R = r(null);
67
69
  n(() => {
68
- let e = s.length !== I.current, t = l !== L.current, n = () => {
69
- I.current = s.length, L.current = l;
70
+ let e = s.length !== L.current, t = l !== R.current, n = () => {
71
+ L.current = s.length, R.current = l;
70
72
  };
71
- t && C();
72
- let r = b.current;
73
- if (r != null && v.current.has(r)) {
74
- b.current = null, P(r), n();
73
+ t && w();
74
+ let r = x.current;
75
+ if (r != null && y.current.has(r)) {
76
+ x.current = null, F(r), n();
75
77
  return;
76
78
  }
77
- c || ((e || t) && T(!1), n());
79
+ c || ((e || t) && E(!1), n());
78
80
  }, [
79
81
  s,
80
82
  c,
81
83
  l,
82
- T,
83
- P,
84
- C
84
+ E,
85
+ F,
86
+ w
85
87
  ]), n(() => {
86
- !c && h.current && (g.current = !0, D());
87
- }, [c, D]);
88
- let R = e(() => {
89
- M(), D(), F();
88
+ !c && h.current && (g.current = !0, O());
89
+ }, [c, O]);
90
+ let z = e(() => {
91
+ N(), O(), I();
90
92
  }, [
91
- M,
92
- D,
93
- F
93
+ N,
94
+ O,
95
+ I
94
96
  ]);
95
97
  return t(() => {
96
98
  let e = f.current;
97
- if (e) return e.addEventListener("scroll", R, { passive: !0 }), () => e.removeEventListener("scroll", R);
98
- }, [R]), t(() => {
99
+ if (e) return e.addEventListener("scroll", z, { passive: !0 }), () => e.removeEventListener("scroll", z);
100
+ }, [z]), t(() => {
99
101
  let e = p.current;
100
102
  if (!e) return;
101
103
  let t = new ResizeObserver(() => {
102
- M(), D(), F();
104
+ let e = v.current && !h.current;
105
+ N(), e && E(!0), O(), I();
103
106
  });
104
107
  return t.observe(e), () => t.disconnect();
105
108
  }, [
106
- M,
107
- D,
108
- F
109
+ N,
110
+ O,
111
+ I,
112
+ E
109
113
  ]), {
110
114
  containerRef: f,
111
115
  contentRef: p,
112
116
  spacerRef: m,
113
- setMessageRef: y,
117
+ setMessageRef: b,
114
118
  isScrollButtonVisible: u,
115
119
  scrollToBottom: e(() => {
116
- T(!1);
117
- }, [T]),
118
- armAnchor: x
120
+ E(!1);
121
+ }, [E]),
122
+ armAnchor: S
119
123
  };
120
124
  };
121
125
  //#endregion
package/file-manager.d.ts CHANGED
@@ -27,11 +27,13 @@ import { FileManagerColumnKey } from '@epam/ai-dial-react-file-manager';
27
27
  import { FileManagerSelectableNode } from '@epam/ai-dial-chat-shared';
28
28
  import { FileMetadataResponseDto } from '@epam/ai-dial-chat-api-client';
29
29
  import { FilesApi } from '@epam/ai-dial-chat-api-client';
30
+ import { FileTreeOptions } from '@epam/ai-dial-react-file-manager';
30
31
  import { FileUploadBatchState } from '@epam/ai-dial-chat-shared';
31
32
  import { FileUploadEntry } from '@epam/ai-dial-chat-shared';
32
33
  import { FileUploadResponseDto } from '@epam/ai-dial-chat-api-client';
33
34
  import { FileUploadStatus } from '@epam/ai-dial-chat-shared';
34
35
  import { FileUploadValidationResult } from '@epam/ai-dial-chat-shared';
36
+ import { FilterChipItem } from '@epam/ai-dial-ui-kit';
35
37
  import { getParentFolderPath } from '@epam/ai-dial-chat-shared';
36
38
  import { ListFilesItemDto } from '@epam/ai-dial-chat-api-client';
37
39
  import { ListFilesResponseDto } from '@epam/ai-dial-chat-api-client';
@@ -45,8 +47,6 @@ import { RenameFilesResponseDto } from '@epam/ai-dial-chat-api-client';
45
47
  import { RenameItemDto } from '@epam/ai-dial-chat-api-client';
46
48
  import { RevokeAccessItemDto } from '@epam/ai-dial-chat-api-client';
47
49
  import { RevokeAccessResponseDto } from '@epam/ai-dial-chat-api-client';
48
- import { TabModel } from '@epam/ai-dial-ui-kit';
49
- import { ToolbarOptions } from '@epam/ai-dial-react-file-manager';
50
50
  import { UploadArchiveResponseDto } from '@epam/ai-dial-chat-api-client';
51
51
  import { useGridEditingScroll } from '@epam/ai-dial-chat-shared';
52
52
  import { UseGridEditingScrollOptions } from '@epam/ai-dial-chat-shared';
@@ -941,11 +941,11 @@ export declare interface UseDialFileManagerResult {
941
941
  * current one becomes excluded. A `fileManagerTabs` of `undefined` means no
942
942
  * restriction — every tab in `allTabs` stays enabled and no reset ever fires.
943
943
  */
944
- export declare const useDialFileManagerTabConfig: (activeTab: DialFileManagerTabs, onTabChange: (tab: DialFileManagerTabs) => void, allTabs: TabModel[] | undefined, fileManagerTabs: string[] | undefined) => UseDialFileManagerTabConfigResult;
944
+ export declare const useDialFileManagerTabConfig: (activeTab: DialFileManagerTabs, onTabChange: (tab: DialFileManagerTabs) => void, allTabs: FilterChipItem<DialFileManagerTabs>[] | undefined, fileManagerTabs: string[] | undefined) => UseDialFileManagerTabConfigResult;
945
945
 
946
946
  /** Values returned by `useDialFileManagerTabConfig`. */
947
947
  export declare interface UseDialFileManagerTabConfigResult {
948
- tabs: ToolbarOptions['tabs'];
948
+ tabs: FileTreeOptions['tabs'];
949
949
  }
950
950
 
951
951
  /**
@@ -1150,7 +1150,7 @@ export declare interface UseFileAttachmentPickerResult {
1150
1150
  /** Active tab. */
1151
1151
  activeTab: DialFileManagerTabs;
1152
1152
  /** Tab list filtered to `allowedTabs`; forward to `FileManagerAttachModal`'s `tabs` prop. */
1153
- tabs: ToolbarOptions['tabs'];
1153
+ tabs: FileTreeOptions['tabs'];
1154
1154
  /** Switches the active tab and clears the current selection. */
1155
1155
  onTabChange: (tab: DialFileManagerTabs) => void;
1156
1156
  /** Currently selected paths. */
@@ -6,11 +6,7 @@ var i = [
6
6
  r.Shared,
7
7
  r.Organization
8
8
  ], a = (a, o, s, c) => {
9
- let l = e((e) => c == null || c.includes(e), [c]), u = n(() => s?.filter((e) => l(e.id)).flatMap(({ id: e, label: t, disabled: n }) => typeof t == "string" ? [{
10
- id: e,
11
- label: t,
12
- disabled: n
13
- }] : []), [s, l]);
9
+ let l = e((e) => c == null || c.includes(e), [c]), u = n(() => s?.filter((e) => l(e.value)), [s, l]);
14
10
  return t(() => {
15
11
  l(a) || o(i.find((e) => l(e)) ?? r.MyFiles);
16
12
  }, [
package/index.d.ts CHANGED
@@ -66,11 +66,13 @@ import { FileManagerColumnKey } from '@epam/ai-dial-react-file-manager';
66
66
  import { FileManagerSelectableNode } from '@epam/ai-dial-chat-shared';
67
67
  import { FileMetadataResponseDto } from '@epam/ai-dial-chat-api-client';
68
68
  import { FilesApi } from '@epam/ai-dial-chat-api-client';
69
+ import { FileTreeOptions } from '@epam/ai-dial-react-file-manager';
69
70
  import { FileUploadBatchState } from '@epam/ai-dial-chat-shared';
70
71
  import { FileUploadEntry } from '@epam/ai-dial-chat-shared';
71
72
  import { FileUploadResponseDto } from '@epam/ai-dial-chat-api-client';
72
73
  import { FileUploadStatus } from '@epam/ai-dial-chat-shared';
73
74
  import { FileUploadValidationResult } from '@epam/ai-dial-chat-shared';
75
+ import { FilterChipItem } from '@epam/ai-dial-ui-kit';
74
76
  import { FilterTab } from '@epam/ai-dial-chat-shared';
75
77
  import { getParentFolderPath } from '@epam/ai-dial-chat-shared';
76
78
  import type { GroupedAttachmentItem } from '@epam/ai-dial-chat-shared';
@@ -138,8 +140,6 @@ import { Stage } from '@epam/ai-dial-chat-shared';
138
140
  import { StarterOption } from '@epam/ai-dial-chat-shared';
139
141
  import { StatusMessage } from '@epam/ai-dial-chat-shared';
140
142
  import { StreamChunk } from '@epam/ai-dial-chat-shared';
141
- import { TabModel } from '@epam/ai-dial-ui-kit';
142
- import { ToolbarOptions } from '@epam/ai-dial-react-file-manager';
143
143
  import { ToolMenuItem } from '@epam/ai-dial-chat-shared';
144
144
  import { ToolsetLoginBodyDto } from '@epam/ai-dial-chat-api-client';
145
145
  import { ToolsetLogoutBodyDto } from '@epam/ai-dial-chat-api-client';
@@ -3465,6 +3465,12 @@ export declare interface SkillEditorSubmitClient {
3465
3465
  export declare interface SkillEditorSubmitMessages {
3466
3466
  /** Shown when a required field is empty. */
3467
3467
  required: string;
3468
+ /**
3469
+ * Shown when the Instructions value opens with its own YAML frontmatter
3470
+ * block — pasting a whole `SKILL.md` in there would otherwise produce a
3471
+ * manifest with two frontmatter blocks.
3472
+ */
3473
+ instructionsFrontmatter: string;
3468
3474
  /** Shown when the normalized skill name fails DIAL's naming rules. */
3469
3475
  nameInvalid: string;
3470
3476
  /** Shown when the skill name already exists (409), or defensively on an unreachable create-mode 412. */
@@ -3671,6 +3677,28 @@ export declare const splitFileNameExtension: (fileName: string) => {
3671
3677
  extension: string;
3672
3678
  };
3673
3679
 
3680
+ /**
3681
+ * Answers one question: would appending this text after the fence that
3682
+ * `buildSkillManifest` writes produce a *second* frontmatter block?
3683
+ *
3684
+ * That happens when the text's first non-blank line is a bare `---` and some
3685
+ * later line is a bare `---` too — the exact shape of a `SKILL.md` pasted
3686
+ * wholesale into the editor's Instructions field.
3687
+ *
3688
+ * Detection is deliberately structural rather than YAML-based: a pasted block
3689
+ * whose fenced content fails to parse corrupts the stored manifest
3690
+ * identically (and renders as a setext `h2` in the Catalog's Details tab just
3691
+ * the same), so requiring parseable YAML here would let the worst cases
3692
+ * through. Keeping `parseYaml` out also makes this cheap enough to run on
3693
+ * every keystroke.
3694
+ *
3695
+ * A single unclosed fence returns `false`: with no closing fence there is no
3696
+ * second block, matching `FRONTMATTER_PATTERN`'s own requirement. A `---`
3697
+ * appearing later in the body (a horizontal rule, a setext underline) is
3698
+ * likewise not a frontmatter block.
3699
+ */
3700
+ export declare const startsWithFrontmatterBlock: (text: string) => boolean;
3701
+
3674
3702
  /** Options accepted by {@link ConversationStreamTransport.streamCompletion}. */
3675
3703
  export declare interface StreamCompletionOptions {
3676
3704
  onChunk: (chunk: StreamChunk) => void;
@@ -5000,11 +5028,11 @@ export declare interface UseDialFileManagerResult {
5000
5028
  * current one becomes excluded. A `fileManagerTabs` of `undefined` means no
5001
5029
  * restriction — every tab in `allTabs` stays enabled and no reset ever fires.
5002
5030
  */
5003
- export declare const useDialFileManagerTabConfig: (activeTab: DialFileManagerTabs, onTabChange: (tab: DialFileManagerTabs) => void, allTabs: TabModel[] | undefined, fileManagerTabs: string[] | undefined) => UseDialFileManagerTabConfigResult;
5031
+ export declare const useDialFileManagerTabConfig: (activeTab: DialFileManagerTabs, onTabChange: (tab: DialFileManagerTabs) => void, allTabs: FilterChipItem<DialFileManagerTabs>[] | undefined, fileManagerTabs: string[] | undefined) => UseDialFileManagerTabConfigResult;
5004
5032
 
5005
5033
  /** Values returned by `useDialFileManagerTabConfig`. */
5006
5034
  export declare interface UseDialFileManagerTabConfigResult {
5007
- tabs: ToolbarOptions['tabs'];
5035
+ tabs: FileTreeOptions['tabs'];
5008
5036
  }
5009
5037
 
5010
5038
  /**
@@ -5234,7 +5262,7 @@ export declare interface UseFileAttachmentPickerResult {
5234
5262
  /** Active tab. */
5235
5263
  activeTab: DialFileManagerTabs;
5236
5264
  /** Tab list filtered to `allowedTabs`; forward to `FileManagerAttachModal`'s `tabs` prop. */
5237
- tabs: ToolbarOptions['tabs'];
5265
+ tabs: FileTreeOptions['tabs'];
5238
5266
  /** Switches the active tab and clears the current selection. */
5239
5267
  onTabChange: (tab: DialFileManagerTabs) => void;
5240
5268
  /** Currently selected paths. */
@@ -5767,6 +5795,12 @@ export declare interface UseSkillEditorSubmitResult {
5767
5795
  clearConflict: () => void;
5768
5796
  /** Validates and submits the given form values. */
5769
5797
  handleSubmit: (values: SkillEditorValues) => Promise<void>;
5798
+ /**
5799
+ * Re-runs the Instructions frontmatter check against the editor's current
5800
+ * values, so a pasted `SKILL.md` is flagged as the text lands rather than
5801
+ * only on submit. Pass as the editor's `onValuesChange`.
5802
+ */
5803
+ handleValuesChange: (values: SkillEditorValues) => void;
5770
5804
  }
5771
5805
 
5772
5806
  /**
package/index.js CHANGED
@@ -23,119 +23,119 @@ import { mapDeploymentDetailsDtoToEntityDetails as Q, mapEntityDetailsToCatalogD
23
23
  import { mapDeploymentToCatalogItem as te, mapDeploymentToolsetCredentials as ne, mapToolsetToCatalogItem as re, resolveDeploymentFolder as ie } from "./catalog/map-deployment-to-catalog-item.js";
24
24
  import { PromptSource as ae, parsePromptResourceUrl as oe } from "./prompt/prompt-resource.js";
25
25
  import { buildPromptOverview as se, isOrganisationPromptItem as ce, mapPromptToCatalogItem as le } from "./catalog/map-prompt-to-catalog-item.js";
26
- import { SKILL_FILE_UPLOAD_MAX_BYTES as ue, SKILL_MANIFEST_FILE as de, SKILL_UPLOAD_MAX_FILES as fe, SKILL_UPLOAD_MAX_TOTAL_BYTES as pe, buildSkillFilesPayload as me, buildSkillManifest as he, buildSkillManifestForSubmit as ge, buildSkillManifestFromFrontmatter as _e, isValidSkillRelativePath as ve, nameFromPath as ye, normalizeSkillName as be, parseSkillManifest as xe, skillFileBytesToBlob as Se, unpackSkillArchive as Ce } from "./skill/skill.js";
27
- import { PUBLIC_SKILL_BUCKET as we, SKILL_LISTING_MAX_PAGES as Te, SKILL_LISTING_PAGE_SIZE as Ee, SKILL_MANIFEST_MAX_BYTES as De, SkillSource as Oe, parseSkillResourceUrl as ke } from "./skill/skill-types.js";
28
- import { buildSkillContentTree as Ae, buildSkillOverview as je, mapSkillToCatalogItem as Me, readSkillFileBytes as Ne, readSkillFilePreviewBytes as Pe, readSkillManifest as Fe, resolveSkillFileDownloadPath as Ie, resolveSkillManifestFileId as Le } from "./catalog/map-skill-to-catalog-item.js";
29
- import { McpResourceKind as Re, buildApplicationMcpUrl as ze, buildConnectApi as Be, buildToolsetMcpUrl as Ve, resolveMcpResourceKind as He } from "./catalog/mcp-endpoint-url.js";
30
- import { getPublicCatalogEntityFolderPath as Ue, isPublicCatalogEntityId as We, mapPublishConversationResultDto as Ge, mapPublishHistoryEntryDto as Ke, toPublishEntityType as qe } from "./catalog/publish.js";
31
- import { deriveAvailableTabIds as Je, deriveFavoriteItems as Ye, filterCatalogItemsBySelector as Xe, filterHiddenOwnedItems as Ze, reconcileFilterTopics as Qe } from "./catalog/catalog-derivations.js";
32
- import { CatalogPrimaryActionType as $e, resolveCatalogPrimaryAction as et } from "./catalog/catalog-primary-action.js";
33
- import { useCatalogEditNavigation as tt } from "./catalog/useCatalogEditNavigation/useCatalogEditNavigation.js";
34
- import { parseSkillManifestDocument as nt } from "./skill/skill-manifest.js";
35
- import { useSkillItemDetails as rt } from "./catalog/useSkillItemDetails.js";
36
- import { useCatalogItemDetails as it } from "./catalog/useCatalogItemDetails.js";
37
- import { OAuthResourceKind as at, TOOLSET_REDIRECT_STATE_KEY as ot, ToolsetAuthStatus as st, ToolsetAuthTypes as ct, ToolsetCredentialsLevel as lt, ToolsetOAuthCallbackQuery as ut, ToolsetOAuthChannelControlType as dt, ToolsetOAuthFailureReason as ft, ToolsetOAuthInitiationResultType as pt, ToolsetOAuthResultType as mt, WithLogin as ht } from "./oauth/types.js";
38
- import { emitToolsetLoginSuccess as gt, subscribeToolsetLoginSuccess as _t } from "./shared/toolset-login-events.js";
39
- import { getToolsetOAuthChannelName as vt, waitForToolsetOAuthResult as yt } from "./oauth/handshake.js";
40
- import { buildToolsetAuthorizeUrl as bt, getToolsetRedirectUri as xt } from "./oauth/authorize-url.js";
41
- import { initiateOAuthLogin as St, navigateToolsetOAuthPopup as Ct, openToolsetOAuthPopup as wt } from "./oauth/popup.js";
42
- import { ToolsetLoginOutcomeType as Tt, useToolsetLogin as Et } from "./oauth/useToolsetLogin/useToolsetLogin.js";
43
- import { useCatalogToolsetCredentials as Dt } from "./catalog/useCatalogToolsetCredentials/useCatalogToolsetCredentials.js";
44
- import { useApplicationCredentials as Ot } from "./catalog/useApplicationCredentials/useApplicationCredentials.js";
45
- import { useSkillDetailsPanelData as kt } from "./catalog/useSkillDetailsPanelData/useSkillDetailsPanelData.js";
46
- import { FavoriteEntityType as At, useFavoriteEntitiesState as jt } from "./catalog/useFavoriteEntitiesState/useFavoriteEntitiesState.js";
47
- import { usePublishFolders as Mt } from "./catalog/usePublishFolders/usePublishFolders.js";
48
- import { buildAnnouncementSignature as Nt, hasAnnouncementContent as Pt, hasStructuredAnnouncement as Ft, sanitizeAnnouncementHtml as It, sanitizeAnnouncementMessageHtml as Lt } from "./conversation/announcement-message.js";
49
- import { DEFAULT_GENERATION_CONFLICT_MESSAGE as Rt, GenerationConflictError as zt, createChatStreamApi as Bt } from "./conversation/create-chat-stream-api.js";
50
- import { shouldWatchForDisplayNameUpdate as Vt } from "./conversation/display-name-watch.js";
51
- import { formatAppVersion as Ht, sanitizeFooterHtml as Ut } from "./conversation/footer-message.js";
52
- import { getModelIdFromConversationId as Wt } from "./conversation/get-model-id-from-conversation-id.js";
53
- import { getTimeOfDayGreeting as Gt } from "./conversation/greeting.js";
54
- import { createDeploymentChangedMessage as Kt } from "./conversation/message-factory.js";
55
- import { getLastDeploymentId as qt, getLastUserMessageToolConfiguration as Jt, isMessageStreaming as Yt, messageHasStages as Xt, normalizeResponseFormat as Zt } from "./conversation/message-utils.js";
56
- import { toOverlayMessages as Qt } from "./conversation/overlay-messages.js";
57
- import { getQuickAppConversationStarters as $t } from "./conversation/quick-app-conversation-starters.js";
58
- import { mapStages as en, toStage as tn } from "./conversation/stage.js";
59
- import { getStarterPopulateText as nn, getStartersFromSchema as rn } from "./conversation/starter-option.js";
60
- import { useOAuthCallbackCompletion as an } from "./oauth/useOAuthCallbackCompletion/useOAuthCallbackCompletion.js";
61
- import { buildPromptExportEnvelope as on, buildPromptExportFileName as sn, serializePromptExport as cn } from "./prompt/export-prompt.js";
62
- import { PROMPT_CONTENT_MAX_LENGTH as ln, PROMPT_COUNTER_ANNOUNCE_THRESHOLD as un, PROMPT_DESCRIPTION_MAX_LENGTH as dn, PROMPT_NAME_MAX_LENGTH as fn, PromptFieldError as pn, buildPromptPath as mn, getRemainingCharacters as hn, validatePromptContent as gn, validatePromptDescription as _n, validatePromptName as vn } from "./prompt/prompt.js";
63
- import { usePromptsState as yn } from "./prompt/usePromptsState/usePromptsState.js";
64
- import { UnsupportedTriggerReason as bn } from "./scheduled-task/scheduled-task-mapping.js";
65
- import { apSchedulerDayToJsDay as xn, jsDayToApSchedulerDay as Sn } from "./shared/cron-weekday.js";
66
- import { mapFormValuesToCreateBody as Cn, mapFormValuesToUpdateBody as wn, mapScheduledTaskDtoToFormValues as Tn } from "./scheduled-task/scheduled-task-trigger.js";
67
- import { validateSkillFileBatch as En } from "./skill/skill-file-batch-validation.js";
68
- import { skillFileToAttachment as Dn } from "./skill/skill-file-preview.js";
69
- import { SkillEditorLoadState as On, useSkillEditorLoad as kn } from "./skill/useSkillEditorLoad.js";
70
- import { useSkillEditorSubmit as An } from "./skill/useSkillEditorSubmit.js";
71
- import { useSkillFileActions as jn } from "./skill/useSkillFileActions.js";
72
- import { SkillPreviewErrorKind as Mn, useSkillFilePreview as Nn } from "./skill/useSkillFilePreview.js";
73
- import { useSkillsState as Pn } from "./skill/useSkillsState/useSkillsState.js";
74
- import { SkillArchiveImportErrorKind as Fn, SkillArchiveImportStatus as In, SkillArchiveSelectionRejectionReason as Ln, classifySkillArchiveImportError as Rn, useSkillArchiveImport as zn } from "./skill/useSkillArchiveImport/useSkillArchiveImport.js";
75
- import { RecipientsCountStatus as Bn, useShareRecipientsCount as Vn } from "./useShareRecipientsCount/useShareRecipientsCount.js";
76
- import { deriveConversationRowActionState as Hn } from "./conversation/deriveConversationRowActionState/deriveConversationRowActionState.js";
77
- import { useActiveConversationSync as Un } from "./conversation/useActiveConversationSync/useActiveConversationSync.js";
78
- import { useAsyncConfirmDialog as Wn } from "./conversation/useAsyncConfirmDialog/useAsyncConfirmDialog.js";
79
- import { useConversationLookupMaps as Gn } from "./conversation/useConversationLookupMaps/useConversationLookupMaps.js";
80
- import { getConversationSource as Kn, useConversationPanelItems as qn } from "./conversation/useConversationPanelItems/useConversationPanelItems.js";
81
- import { useImportFilePicker as Jn } from "./conversation/useImportFilePicker/useImportFilePicker.js";
82
- import { sanitizeFileName as Yn, splitFileNameExtension as Xn, trimFileNameToByteLimit as Zn } from "./files/file-name.js";
83
- import { useAttachmentUpload as Qn } from "./conversation/useAttachmentUpload/useAttachmentUpload.js";
84
- import { AudioTranscriptionError as $n, AudioTranscriptionErrorReason as er } from "./conversation/useTranscribeAudio/audio-transcription-error.js";
85
- import { useTranscribeAudio as tr } from "./conversation/useTranscribeAudio/useTranscribeAudio.js";
86
- import { DEFAULT_MAX_ARCHIVE_BYTES as nr, useConversationExport as rr } from "./conversation/useConversationExport/useConversationExport.js";
87
- import { attachmentToDto as ir, attachmentsToDtos as ar } from "./conversation/useConversationHandlers/attachment-to-dto.js";
88
- import { createMessagePair as or } from "./conversation/useConversationHandlers/message-factory.js";
89
- import { hasActiveToolConfig as sr, isAnswerIncomplete as cr, isMessageChanged as lr, shouldRerunGenerationOnEdit as ur } from "./conversation/useConversationHandlers/message-utils.js";
90
- import { getStarterConversationText as dr, getStarterDisplayText as fr, getStarterSubmitText as pr } from "./conversation/useConversationHandlers/starter-option.js";
91
- import { getConversationPath as mr } from "./conversation/useConversationStream/conversation-path.js";
92
- import { useConversationHandlers as hr } from "./conversation/useConversationHandlers/useConversationHandlers.js";
93
- import { useConversationImport as gr } from "./conversation/useConversationImport/useConversationImport.js";
94
- import { useConversationScroll as _r } from "./conversation/useConversationScroll/useConversationScroll.js";
95
- import { applyChunkToMessages as vr, mergeStages as yr } from "./conversation/useConversationStream/apply-chunk.js";
96
- import { isAwaitingGenerationResume as br } from "./conversation/useConversationStream/generation-resume.js";
97
- import { useConversationStream as xr } from "./conversation/useConversationStream/useConversationStream.js";
98
- import { useConversationSources as Sr } from "./conversation-sources/useConversationSources/useConversationSources.js";
99
- import { DialFilesApiUploadMode as Cr } from "./files/dial-files-api.js";
100
- import { FileManagerNotificationReason as wr, FileNameValidationErrorReason as Tr, FileOperationKind as Er } from "./files/dial-file-manager.types.js";
101
- import { COLUMNS_WITHOUT_AUTHOR as Dr, COLUMNS_WITH_AUTHOR as Or, CORE_PERMISSION_MAP as kr, DATE_OPTIONS as Ar, PATH_SEPARATOR_REGEXP as jr, RESERVED_MARKER_NAME as Mr, UPLOAD_CONCURRENCY as Nr } from "./files/dial-file-manager.model.js";
102
- import { DialFileManagerActionProfile as Pr, DialFileManagerVariant as Fr, deriveActionProfile as Ir } from "./files/file-manager-variant.js";
103
- import { buildSharedItemVirtualPath as Lr, dialCorePathToRelative as Rr, findDialFileByPath as zr, findFolderByVirtualPath as Br, formatOperationFolderName as Vr, getVirtualPathName as Hr, hasDialFileWritePermission as Ur, hasForbiddenNameSymbols as Wr, isCopyMoveDuplicateAllowed as Gr, isShareActionsAllowed as Kr, normalizeVirtualPath as qr, parseNewFolderVirtualPath as Jr, resolveOwnerCoords as Yr } from "./files/dial-file-manager-path.util.js";
104
- import { getParentFolderPath as Xr, resolveDialFileApiPath as Zr, virtualPathToApiPath as Qr } from "./files/resolve-dial-file-api-path.js";
105
- import { prepareCopyItems as $r, prepareMoveRenameItems as ei } from "./files/dial-file-manager-copy-move.util.js";
106
- import { buildFromCache as ti, fetchByTab as ni, fetchForSearch as ri, findFirstSuccessfulCopyMoveItem as ii, mapCorePermissions as ai, mapFileMetadataToDialFile as oi, mapSearchItem as si, mergeCreatedFolderIntoCache as ci, updateEntry as li } from "./files/dial-file-manager-mapping.util.js";
107
- import { createFilesApiClient as ui } from "./files/create-files-api.js";
108
- import { createUploadFileWithProgress as di } from "./files/create-upload-file-with-progress.js";
109
- import { openAnnotationAttachment as fi } from "./files/annotation.js";
110
- import { annotationToOoxmlCanvasContent as pi, annotationToPdfCanvasContent as mi, clearAttachmentCache as hi, hasAttachmentTextSource as gi, referenceAttachmentToPdfCanvasContent as _i, resolveCodeCanvasContent as vi, resolveGroupedVisualizerCanvasContent as yi, resolveHtmlCanvasContent as bi, resolveImageCanvasContent as xi, resolveJsonCanvasContent as Si, resolveMarkdownCanvasContent as Ci, resolveOoxmlCanvasContent as wi, resolvePdfCanvasContent as Ti, resolveTextCanvasContent as Ei, resolveVisualizerCanvasContent as Di } from "./files/attachment-canvas.js";
111
- import { getUrlFileName as Oi, isExternalSourcePreviewable as ki, resolveExternalSourceContentType as Ai } from "./files/source-content.js";
112
- import { annotationToDisplayAttachment as ji, attachmentDtoToDisplayAttachment as Mi, attachmentDtosToDisplayAttachments as Ni } from "./files/attachment-dto-to-display.js";
113
- import { dialFileToAttachment as Pi, dialFilesToAttachments as Fi, dialFolderPathToAttachment as Ii } from "./files/dial-file-to-attachment.js";
114
- import { DownloadDestinationType as Li } from "./files/download-destination.js";
115
- import { prepareDownloadDestination as Ri } from "./files/prepare-download-destination.js";
116
- import { useDialFileListing as zi } from "./files/useDialFileListing/useDialFileListing.js";
117
- import { useDialFileMetadata as Bi } from "./files/useDialFileMetadata/useDialFileMetadata.js";
118
- import { useDialFileMutations as Vi } from "./files/useDialFileMutations/useDialFileMutations.js";
119
- import { useDialFileSharing as Hi } from "./files/useDialFileSharing/useDialFileSharing.js";
120
- import { useDialFileUploadBatch as Ui } from "./files/useDialFileUploadBatch/useDialFileUploadBatch.js";
121
- import { useDialFileManager as Wi } from "./files/useDialFileManager/useDialFileManager.js";
122
- import { useDialFileManagerTabConfig as Gi } from "./files/useDialFileManagerTabConfig/useDialFileManagerTabConfig.js";
123
- import { useFileAttachmentPicker as Ki } from "./files/useFileAttachmentPicker/useFileAttachmentPicker.js";
124
- import { isCustomAppSchema as qi, isQuickAppSchema as Ji } from "./shared/application-schema.js";
125
- import { getBrowserTimezone as Yi } from "./shared/browser-timezone.js";
126
- import { isValidAbsoluteUrl as Xi, isValidFeaturesData as Zi, parseFeaturesData as Qi } from "./shared/custom-apps.js";
127
- import { buildExternalServiceScopeId as $i, getExternalServiceFallbackName as ea, parseExternalServiceUrl as ta } from "./shared/external-services.js";
128
- import { useChatSettingsFormConfig as na } from "./useChatSettingsFormConfig/useChatSettingsFormConfig.js";
129
- import { usePageFileDrag as ra } from "./usePageFileDrag/usePageFileDrag.js";
130
- import { useViewportWidth as ia } from "./useViewportWidth/useViewportWidth.js";
131
- import { usePanelMaxWidth as aa } from "./usePanelMaxWidth/usePanelMaxWidth.js";
132
- import { useShareLink as oa } from "./useShareLink/useShareLink.js";
133
- import { useToolsMenu as sa } from "./useToolsMenu/useToolsMenu.js";
134
- import { useUsageData as ca } from "./usage/useUsageData/useUsageData.js";
135
- import { McpAppResourceFetchError as la, createMcpAppsApiClient as ua } from "./mcp-apps/mcp-apps-api-client.js";
136
- import { useMcpAppTools as da } from "./mcp-apps/useMcpAppTools/useMcpAppTools.js";
137
- import { useMcpAppHostContext as fa } from "./mcp-apps/useMcpAppHostContext/useMcpAppHostContext.js";
138
- import { useMcpAppHostAdapter as pa } from "./mcp-apps/useMcpAppHostAdapter/useMcpAppHostAdapter.js";
139
- import { useOpenMcpAppCanvas as ma } from "./mcp-apps/useOpenMcpAppCanvas/useOpenMcpAppCanvas.js";
140
- import { useGridEditingScroll as ha } from "@epam/ai-dial-chat-shared";
141
- export { x as AttachmentValidationErrorReason, $n as AudioTranscriptionError, er as AudioTranscriptionErrorReason, R as AuthenticationType, Dr as COLUMNS_WITHOUT_AUTHOR, Or as COLUMNS_WITH_AUTHOR, kr as CORE_PERMISSION_MAP, $e as CatalogPrimaryActionType, T as ConversationExportMode, E as ConversationTransferErrorCode, D as ConversationTransferWarningCode, Ar as DATE_OPTIONS, Rt as DEFAULT_GENERATION_CONFLICT_MESSAGE, nr as DEFAULT_MAX_ARCHIVE_BYTES, Pr as DialFileManagerActionProfile, Fr as DialFileManagerVariant, Cr as DialFilesApiUploadMode, Li as DownloadDestinationType, k as EXPORT_APP_NAME, O as ExportFileNameKind, At as FavoriteEntityType, wr as FileManagerNotificationReason, Tr as FileNameValidationErrorReason, Er as FileOperationKind, zt as GenerationConflictError, la as McpAppResourceFetchError, Re as McpResourceKind, at as OAuthResourceKind, jr as PATH_SEPARATOR_REGEXP, ln as PROMPT_CONTENT_MAX_LENGTH, un as PROMPT_COUNTER_ANNOUNCE_THRESHOLD, dn as PROMPT_DESCRIPTION_MAX_LENGTH, fn as PROMPT_NAME_MAX_LENGTH, we as PUBLIC_SKILL_BUCKET, pn as PromptFieldError, ae as PromptSource, Mr as RESERVED_MARKER_NAME, Bn as RecipientsCountStatus, ue as SKILL_FILE_UPLOAD_MAX_BYTES, Te as SKILL_LISTING_MAX_PAGES, Ee as SKILL_LISTING_PAGE_SIZE, de as SKILL_MANIFEST_FILE, De as SKILL_MANIFEST_MAX_BYTES, fe as SKILL_UPLOAD_MAX_FILES, pe as SKILL_UPLOAD_MAX_TOTAL_BYTES, Fn as SkillArchiveImportErrorKind, In as SkillArchiveImportStatus, Ln as SkillArchiveSelectionRejectionReason, On as SkillEditorLoadState, Mn as SkillPreviewErrorKind, Oe as SkillSource, ot as TOOLSET_REDIRECT_STATE_KEY, st as ToolsetAuthStatus, ct as ToolsetAuthTypes, lt as ToolsetCredentialsLevel, Tt as ToolsetLoginOutcomeType, ut as ToolsetOAuthCallbackQuery, dt as ToolsetOAuthChannelControlType, ft as ToolsetOAuthFailureReason, pt as ToolsetOAuthInitiationResultType, mt as ToolsetOAuthResultType, Nr as UPLOAD_CONCURRENCY, bn as UnsupportedTriggerReason, ht as WithLogin, ji as annotationToDisplayAttachment, pi as annotationToOoxmlCanvasContent, mi as annotationToPdfCanvasContent, xn as apSchedulerDayToJsDay, W as appendLocaleCode, vr as applyChunkToMessages, Mi as attachmentDtoToDisplayAttachment, Ni as attachmentDtosToDisplayAttachments, ir as attachmentToDto, ar as attachmentsToDtos, G as buildAdditionalLocaleOptions, Nt as buildAnnouncementSignature, ze as buildApplicationMcpUrl, N as buildChatCompletionsUrl, Be as buildConnectApi, P as buildDeploymentConnectApi, $i as buildExternalServiceScopeId, ti as buildFromCache, on as buildPromptExportEnvelope, sn as buildPromptExportFileName, se as buildPromptOverview, mn as buildPromptPath, F as buildResponsesUrl, Lr as buildSharedItemVirtualPath, Ae as buildSkillContentTree, me as buildSkillFilesPayload, he as buildSkillManifest, ge as buildSkillManifestForSubmit, _e as buildSkillManifestFromFrontmatter, je as buildSkillOverview, bt as buildToolsetAuthorizeUrl, Ve as buildToolsetMcpUrl, Rn as classifySkillArchiveImportError, hi as clearAttachmentCache, K as composeLocalePayload, Bt as createChatStreamApi, i as createCsrfMiddleware, Kt as createDeploymentChangedMessage, ui as createFilesApiClient, ua as createMcpAppsApiClient, or as createMessagePair, j as createPublishApiClient, a as createUnauthorizedMiddleware, di as createUploadFileWithProgress, V as decodeToolsetId, q as decomposeLocalizedFields, Ir as deriveActionProfile, Je as deriveAvailableTabIds, Hn as deriveConversationRowActionState, Ye as deriveFavoriteItems, Rr as dialCorePathToRelative, Pi as dialFileToAttachment, Fi as dialFilesToAttachments, Ii as dialFolderPathToAttachment, m as downloadAttachment, gt as emitToolsetLoginSuccess, I as encodeDeploymentId, H as encodeToolsetId, ni as fetchByTab, ri as fetchForSearch, Xe as filterCatalogItemsBySelector, Ze as filterHiddenOwnedItems, L as findDeploymentByIdOrReference, zr as findDialFileByPath, ii as findFirstSuccessfulCopyMoveItem, Br as findFolderByVirtualPath, Ht as formatAppVersion, X as formatCalendarDate, C as formatDateYM, w as formatDateYMD, Vr as formatOperationFolderName, A as formatQuotedNameList, e as getApiErrorDetails, t as getApiErrorMessage, n as getApiErrorStatus, Yi as getBrowserTimezone, mr as getConversationPath, Kn as getConversationSource, ea as getExternalServiceFallbackName, qt as getLastDeploymentId, Jt as getLastUserMessageToolConfiguration, Wt as getModelIdFromConversationId, Xr as getParentFolderPath, Ue as getPublicCatalogEntityFolderPath, $t as getQuickAppConversationStarters, hn as getRemainingCharacters, dr as getStarterConversationText, fr as getStarterDisplayText, nn as getStarterPopulateText, pr as getStarterSubmitText, rn as getStartersFromSchema, Gt as getTimeOfDayGreeting, vt as getToolsetOAuthChannelName, xt as getToolsetRedirectUri, Oi as getUrlFileName, Hr as getVirtualPathName, sr as hasActiveToolConfig, Pt as hasAnnouncementContent, gi as hasAttachmentTextSource, Ur as hasDialFileWritePermission, Wr as hasForbiddenNameSymbols, Ft as hasStructuredAnnouncement, o as includesIgnoreCase, St as initiateOAuthLogin, cr as isAnswerIncomplete, br as isAwaitingGenerationResume, r as isConversationNotFoundError, Gr as isCopyMoveDuplicateAllowed, qi as isCustomAppSchema, _ as isDialFileAcceptType, d as isDialFileId, h as isDownloadableAttachment, ki as isExternalSourcePreviewable, lr as isMessageChanged, Yt as isMessageStreaming, ce as isOrganisationPromptItem, We as isPublicCatalogEntityId, U as isPublicToolsetId, Ji as isQuickAppSchema, Kr as isShareActionsAllowed, Xi as isValidAbsoluteUrl, Zi as isValidFeaturesData, ve as isValidSkillRelativePath, Sn as jsDayToApSchedulerDay, ai as mapCorePermissions, Q as mapDeploymentDetailsDtoToEntityDetails, z as mapDeploymentLimitsDtoToCatalogLimits, B as mapDeploymentLimitsToInput, te as mapDeploymentToCatalogItem, ne as mapDeploymentToolsetCredentials, $ as mapEntityDetailsToCatalogDetails, oi as mapFileMetadataToDialFile, Cn as mapFormValuesToCreateBody, wn as mapFormValuesToUpdateBody, le as mapPromptToCatalogItem, Ge as mapPublishConversationResultDto, Ke as mapPublishHistoryEntryDto, Tn as mapScheduledTaskDtoToFormValues, si as mapSearchItem, Me as mapSkillToCatalogItem, en as mapStages, ee as mapToolsetCredentials, re as mapToolsetToCatalogItem, ci as mergeCreatedFolderIntoCache, yr as mergeStages, Xt as messageHasStages, v as mimeTypesToAttachmentExtensionLabels, y as mimeTypesToDialFileAcceptTypes, b as mimeTypesToFileAccept, ye as nameFromPath, Ct as navigateToolsetOAuthPopup, Zt as normalizeResponseFormat, be as normalizeSkillName, qr as normalizeVirtualPath, fi as openAnnotationAttachment, wt as openToolsetOAuthPopup, Z as padTwoDigits, ta as parseExternalServiceUrl, Qi as parseFeaturesData, Jr as parseNewFolderVirtualPath, oe as parsePromptResourceUrl, xe as parseSkillManifest, nt as parseSkillManifestDocument, ke as parseSkillResourceUrl, $r as prepareCopyItems, Ri as prepareDownloadDestination, ei as prepareMoveRenameItems, Ne as readSkillFileBytes, Pe as readSkillFilePreviewBytes, Fe as readSkillManifest, Qe as reconcileFilterTopics, _i as referenceAttachmentToPdfCanvasContent, et as resolveCatalogPrimaryAction, vi as resolveCodeCanvasContent, ie as resolveDeploymentFolder, Zr as resolveDialFileApiPath, f as resolveDialFileBucketAndPath, Ai as resolveExternalSourceContentType, yi as resolveGroupedVisualizerCanvasContent, bi as resolveHtmlCanvasContent, xi as resolveImageCanvasContent, Si as resolveJsonCanvasContent, J as resolveLocalizedText, Ci as resolveMarkdownCanvasContent, He as resolveMcpResourceKind, wi as resolveOoxmlCanvasContent, Yr as resolveOwnerCoords, Ti as resolvePdfCanvasContent, p as resolveRelativeDialFilePath, Ie as resolveSkillFileDownloadPath, Le as resolveSkillManifestFileId, Ei as resolveTextCanvasContent, Di as resolveVisualizerCanvasContent, s as safeDecodeURI, c as safeDecodeURIComponent, It as sanitizeAnnouncementHtml, Lt as sanitizeAnnouncementMessageHtml, Yn as sanitizeFileName, Ut as sanitizeFooterHtml, cn as serializePromptExport, ur as shouldRerunGenerationOnEdit, Vt as shouldWatchForDisplayNameUpdate, Se as skillFileBytesToBlob, Dn as skillFileToAttachment, Xn as splitFileNameExtension, l as stripSurroundingSlashes, u as stripTrailingSlashes, _t as subscribeToolsetLoginSuccess, Y as toBaseLocale, Qt as toOverlayMessages, qe as toPublishEntityType, M as toPublishRuleDto, tn as toStage, Zn as trimFileNameToByteLimit, Ce as unpackSkillArchive, li as updateEntry, Un as useActiveConversationSync, Ot as useApplicationCredentials, Wn as useAsyncConfirmDialog, g as useAttachmentAction, Qn as useAttachmentUpload, S as useAttachmentValidation, tt as useCatalogEditNavigation, it as useCatalogItemDetails, Dt as useCatalogToolsetCredentials, na as useChatSettingsFormConfig, rr as useConversationExport, hr as useConversationHandlers, gr as useConversationImport, Gn as useConversationLookupMaps, qn as useConversationPanelItems, _r as useConversationScroll, Sr as useConversationSources, xr as useConversationStream, zi as useDialFileListing, Wi as useDialFileManager, Gi as useDialFileManagerTabConfig, Bi as useDialFileMetadata, Vi as useDialFileMutations, Hi as useDialFileSharing, Ui as useDialFileUploadBatch, jt as useFavoriteEntitiesState, Ki as useFileAttachmentPicker, ha as useGridEditingScroll, Jn as useImportFilePicker, pa as useMcpAppHostAdapter, fa as useMcpAppHostContext, da as useMcpAppTools, an as useOAuthCallbackCompletion, ma as useOpenMcpAppCanvas, ra as usePageFileDrag, aa as usePanelMaxWidth, yn as usePromptsState, Mt as usePublishFolders, oa as useShareLink, Vn as useShareRecipientsCount, zn as useSkillArchiveImport, kt as useSkillDetailsPanelData, kn as useSkillEditorLoad, An as useSkillEditorSubmit, jn as useSkillFileActions, Nn as useSkillFilePreview, rt as useSkillItemDetails, Pn as useSkillsState, sa as useToolsMenu, Et as useToolsetLogin, tr as useTranscribeAudio, ca as useUsageData, ia as useViewportWidth, gn as validatePromptContent, _n as validatePromptDescription, vn as validatePromptName, En as validateSkillFileBatch, Qr as virtualPathToApiPath, yt as waitForToolsetOAuthResult };
26
+ import { SKILL_FILE_UPLOAD_MAX_BYTES as ue, SKILL_MANIFEST_FILE as de, SKILL_UPLOAD_MAX_FILES as fe, SKILL_UPLOAD_MAX_TOTAL_BYTES as pe, buildSkillFilesPayload as me, buildSkillManifest as he, buildSkillManifestForSubmit as ge, buildSkillManifestFromFrontmatter as _e, isValidSkillRelativePath as ve, nameFromPath as ye, normalizeSkillName as be, parseSkillManifest as xe, skillFileBytesToBlob as Se, startsWithFrontmatterBlock as Ce, unpackSkillArchive as we } from "./skill/skill.js";
27
+ import { PUBLIC_SKILL_BUCKET as Te, SKILL_LISTING_MAX_PAGES as Ee, SKILL_LISTING_PAGE_SIZE as De, SKILL_MANIFEST_MAX_BYTES as Oe, SkillSource as ke, parseSkillResourceUrl as Ae } from "./skill/skill-types.js";
28
+ import { buildSkillContentTree as je, buildSkillOverview as Me, mapSkillToCatalogItem as Ne, readSkillFileBytes as Pe, readSkillFilePreviewBytes as Fe, readSkillManifest as Ie, resolveSkillFileDownloadPath as Le, resolveSkillManifestFileId as Re } from "./catalog/map-skill-to-catalog-item.js";
29
+ import { McpResourceKind as ze, buildApplicationMcpUrl as Be, buildConnectApi as Ve, buildToolsetMcpUrl as He, resolveMcpResourceKind as Ue } from "./catalog/mcp-endpoint-url.js";
30
+ import { getPublicCatalogEntityFolderPath as We, isPublicCatalogEntityId as Ge, mapPublishConversationResultDto as Ke, mapPublishHistoryEntryDto as qe, toPublishEntityType as Je } from "./catalog/publish.js";
31
+ import { deriveAvailableTabIds as Ye, deriveFavoriteItems as Xe, filterCatalogItemsBySelector as Ze, filterHiddenOwnedItems as Qe, reconcileFilterTopics as $e } from "./catalog/catalog-derivations.js";
32
+ import { CatalogPrimaryActionType as et, resolveCatalogPrimaryAction as tt } from "./catalog/catalog-primary-action.js";
33
+ import { useCatalogEditNavigation as nt } from "./catalog/useCatalogEditNavigation/useCatalogEditNavigation.js";
34
+ import { parseSkillManifestDocument as rt } from "./skill/skill-manifest.js";
35
+ import { useSkillItemDetails as it } from "./catalog/useSkillItemDetails.js";
36
+ import { useCatalogItemDetails as at } from "./catalog/useCatalogItemDetails.js";
37
+ import { OAuthResourceKind as ot, TOOLSET_REDIRECT_STATE_KEY as st, ToolsetAuthStatus as ct, ToolsetAuthTypes as lt, ToolsetCredentialsLevel as ut, ToolsetOAuthCallbackQuery as dt, ToolsetOAuthChannelControlType as ft, ToolsetOAuthFailureReason as pt, ToolsetOAuthInitiationResultType as mt, ToolsetOAuthResultType as ht, WithLogin as gt } from "./oauth/types.js";
38
+ import { emitToolsetLoginSuccess as _t, subscribeToolsetLoginSuccess as vt } from "./shared/toolset-login-events.js";
39
+ import { getToolsetOAuthChannelName as yt, waitForToolsetOAuthResult as bt } from "./oauth/handshake.js";
40
+ import { buildToolsetAuthorizeUrl as xt, getToolsetRedirectUri as St } from "./oauth/authorize-url.js";
41
+ import { initiateOAuthLogin as Ct, navigateToolsetOAuthPopup as wt, openToolsetOAuthPopup as Tt } from "./oauth/popup.js";
42
+ import { ToolsetLoginOutcomeType as Et, useToolsetLogin as Dt } from "./oauth/useToolsetLogin/useToolsetLogin.js";
43
+ import { useCatalogToolsetCredentials as Ot } from "./catalog/useCatalogToolsetCredentials/useCatalogToolsetCredentials.js";
44
+ import { useApplicationCredentials as kt } from "./catalog/useApplicationCredentials/useApplicationCredentials.js";
45
+ import { useSkillDetailsPanelData as At } from "./catalog/useSkillDetailsPanelData/useSkillDetailsPanelData.js";
46
+ import { FavoriteEntityType as jt, useFavoriteEntitiesState as Mt } from "./catalog/useFavoriteEntitiesState/useFavoriteEntitiesState.js";
47
+ import { usePublishFolders as Nt } from "./catalog/usePublishFolders/usePublishFolders.js";
48
+ import { buildAnnouncementSignature as Pt, hasAnnouncementContent as Ft, hasStructuredAnnouncement as It, sanitizeAnnouncementHtml as Lt, sanitizeAnnouncementMessageHtml as Rt } from "./conversation/announcement-message.js";
49
+ import { DEFAULT_GENERATION_CONFLICT_MESSAGE as zt, GenerationConflictError as Bt, createChatStreamApi as Vt } from "./conversation/create-chat-stream-api.js";
50
+ import { shouldWatchForDisplayNameUpdate as Ht } from "./conversation/display-name-watch.js";
51
+ import { formatAppVersion as Ut, sanitizeFooterHtml as Wt } from "./conversation/footer-message.js";
52
+ import { getModelIdFromConversationId as Gt } from "./conversation/get-model-id-from-conversation-id.js";
53
+ import { getTimeOfDayGreeting as Kt } from "./conversation/greeting.js";
54
+ import { createDeploymentChangedMessage as qt } from "./conversation/message-factory.js";
55
+ import { getLastDeploymentId as Jt, getLastUserMessageToolConfiguration as Yt, isMessageStreaming as Xt, messageHasStages as Zt, normalizeResponseFormat as Qt } from "./conversation/message-utils.js";
56
+ import { toOverlayMessages as $t } from "./conversation/overlay-messages.js";
57
+ import { getQuickAppConversationStarters as en } from "./conversation/quick-app-conversation-starters.js";
58
+ import { mapStages as tn, toStage as nn } from "./conversation/stage.js";
59
+ import { getStarterPopulateText as rn, getStartersFromSchema as an } from "./conversation/starter-option.js";
60
+ import { useOAuthCallbackCompletion as on } from "./oauth/useOAuthCallbackCompletion/useOAuthCallbackCompletion.js";
61
+ import { buildPromptExportEnvelope as sn, buildPromptExportFileName as cn, serializePromptExport as ln } from "./prompt/export-prompt.js";
62
+ import { PROMPT_CONTENT_MAX_LENGTH as un, PROMPT_COUNTER_ANNOUNCE_THRESHOLD as dn, PROMPT_DESCRIPTION_MAX_LENGTH as fn, PROMPT_NAME_MAX_LENGTH as pn, PromptFieldError as mn, buildPromptPath as hn, getRemainingCharacters as gn, validatePromptContent as _n, validatePromptDescription as vn, validatePromptName as yn } from "./prompt/prompt.js";
63
+ import { usePromptsState as bn } from "./prompt/usePromptsState/usePromptsState.js";
64
+ import { UnsupportedTriggerReason as xn } from "./scheduled-task/scheduled-task-mapping.js";
65
+ import { apSchedulerDayToJsDay as Sn, jsDayToApSchedulerDay as Cn } from "./shared/cron-weekday.js";
66
+ import { mapFormValuesToCreateBody as wn, mapFormValuesToUpdateBody as Tn, mapScheduledTaskDtoToFormValues as En } from "./scheduled-task/scheduled-task-trigger.js";
67
+ import { validateSkillFileBatch as Dn } from "./skill/skill-file-batch-validation.js";
68
+ import { skillFileToAttachment as On } from "./skill/skill-file-preview.js";
69
+ import { SkillEditorLoadState as kn, useSkillEditorLoad as An } from "./skill/useSkillEditorLoad.js";
70
+ import { useSkillEditorSubmit as jn } from "./skill/useSkillEditorSubmit.js";
71
+ import { useSkillFileActions as Mn } from "./skill/useSkillFileActions.js";
72
+ import { SkillPreviewErrorKind as Nn, useSkillFilePreview as Pn } from "./skill/useSkillFilePreview.js";
73
+ import { useSkillsState as Fn } from "./skill/useSkillsState/useSkillsState.js";
74
+ import { SkillArchiveImportErrorKind as In, SkillArchiveImportStatus as Ln, SkillArchiveSelectionRejectionReason as Rn, classifySkillArchiveImportError as zn, useSkillArchiveImport as Bn } from "./skill/useSkillArchiveImport/useSkillArchiveImport.js";
75
+ import { RecipientsCountStatus as Vn, useShareRecipientsCount as Hn } from "./useShareRecipientsCount/useShareRecipientsCount.js";
76
+ import { deriveConversationRowActionState as Un } from "./conversation/deriveConversationRowActionState/deriveConversationRowActionState.js";
77
+ import { useActiveConversationSync as Wn } from "./conversation/useActiveConversationSync/useActiveConversationSync.js";
78
+ import { useAsyncConfirmDialog as Gn } from "./conversation/useAsyncConfirmDialog/useAsyncConfirmDialog.js";
79
+ import { useConversationLookupMaps as Kn } from "./conversation/useConversationLookupMaps/useConversationLookupMaps.js";
80
+ import { getConversationSource as qn, useConversationPanelItems as Jn } from "./conversation/useConversationPanelItems/useConversationPanelItems.js";
81
+ import { useImportFilePicker as Yn } from "./conversation/useImportFilePicker/useImportFilePicker.js";
82
+ import { sanitizeFileName as Xn, splitFileNameExtension as Zn, trimFileNameToByteLimit as Qn } from "./files/file-name.js";
83
+ import { useAttachmentUpload as $n } from "./conversation/useAttachmentUpload/useAttachmentUpload.js";
84
+ import { AudioTranscriptionError as er, AudioTranscriptionErrorReason as tr } from "./conversation/useTranscribeAudio/audio-transcription-error.js";
85
+ import { useTranscribeAudio as nr } from "./conversation/useTranscribeAudio/useTranscribeAudio.js";
86
+ import { DEFAULT_MAX_ARCHIVE_BYTES as rr, useConversationExport as ir } from "./conversation/useConversationExport/useConversationExport.js";
87
+ import { attachmentToDto as ar, attachmentsToDtos as or } from "./conversation/useConversationHandlers/attachment-to-dto.js";
88
+ import { createMessagePair as sr } from "./conversation/useConversationHandlers/message-factory.js";
89
+ import { hasActiveToolConfig as cr, isAnswerIncomplete as lr, isMessageChanged as ur, shouldRerunGenerationOnEdit as dr } from "./conversation/useConversationHandlers/message-utils.js";
90
+ import { getStarterConversationText as fr, getStarterDisplayText as pr, getStarterSubmitText as mr } from "./conversation/useConversationHandlers/starter-option.js";
91
+ import { getConversationPath as hr } from "./conversation/useConversationStream/conversation-path.js";
92
+ import { useConversationHandlers as gr } from "./conversation/useConversationHandlers/useConversationHandlers.js";
93
+ import { useConversationImport as _r } from "./conversation/useConversationImport/useConversationImport.js";
94
+ import { useConversationScroll as vr } from "./conversation/useConversationScroll/useConversationScroll.js";
95
+ import { applyChunkToMessages as yr, mergeStages as br } from "./conversation/useConversationStream/apply-chunk.js";
96
+ import { isAwaitingGenerationResume as xr } from "./conversation/useConversationStream/generation-resume.js";
97
+ import { useConversationStream as Sr } from "./conversation/useConversationStream/useConversationStream.js";
98
+ import { useConversationSources as Cr } from "./conversation-sources/useConversationSources/useConversationSources.js";
99
+ import { DialFilesApiUploadMode as wr } from "./files/dial-files-api.js";
100
+ import { FileManagerNotificationReason as Tr, FileNameValidationErrorReason as Er, FileOperationKind as Dr } from "./files/dial-file-manager.types.js";
101
+ import { COLUMNS_WITHOUT_AUTHOR as Or, COLUMNS_WITH_AUTHOR as kr, CORE_PERMISSION_MAP as Ar, DATE_OPTIONS as jr, PATH_SEPARATOR_REGEXP as Mr, RESERVED_MARKER_NAME as Nr, UPLOAD_CONCURRENCY as Pr } from "./files/dial-file-manager.model.js";
102
+ import { DialFileManagerActionProfile as Fr, DialFileManagerVariant as Ir, deriveActionProfile as Lr } from "./files/file-manager-variant.js";
103
+ import { buildSharedItemVirtualPath as Rr, dialCorePathToRelative as zr, findDialFileByPath as Br, findFolderByVirtualPath as Vr, formatOperationFolderName as Hr, getVirtualPathName as Ur, hasDialFileWritePermission as Wr, hasForbiddenNameSymbols as Gr, isCopyMoveDuplicateAllowed as Kr, isShareActionsAllowed as qr, normalizeVirtualPath as Jr, parseNewFolderVirtualPath as Yr, resolveOwnerCoords as Xr } from "./files/dial-file-manager-path.util.js";
104
+ import { getParentFolderPath as Zr, resolveDialFileApiPath as Qr, virtualPathToApiPath as $r } from "./files/resolve-dial-file-api-path.js";
105
+ import { prepareCopyItems as ei, prepareMoveRenameItems as ti } from "./files/dial-file-manager-copy-move.util.js";
106
+ import { buildFromCache as ni, fetchByTab as ri, fetchForSearch as ii, findFirstSuccessfulCopyMoveItem as ai, mapCorePermissions as oi, mapFileMetadataToDialFile as si, mapSearchItem as ci, mergeCreatedFolderIntoCache as li, updateEntry as ui } from "./files/dial-file-manager-mapping.util.js";
107
+ import { createFilesApiClient as di } from "./files/create-files-api.js";
108
+ import { createUploadFileWithProgress as fi } from "./files/create-upload-file-with-progress.js";
109
+ import { openAnnotationAttachment as pi } from "./files/annotation.js";
110
+ import { annotationToOoxmlCanvasContent as mi, annotationToPdfCanvasContent as hi, clearAttachmentCache as gi, hasAttachmentTextSource as _i, referenceAttachmentToPdfCanvasContent as vi, resolveCodeCanvasContent as yi, resolveGroupedVisualizerCanvasContent as bi, resolveHtmlCanvasContent as xi, resolveImageCanvasContent as Si, resolveJsonCanvasContent as Ci, resolveMarkdownCanvasContent as wi, resolveOoxmlCanvasContent as Ti, resolvePdfCanvasContent as Ei, resolveTextCanvasContent as Di, resolveVisualizerCanvasContent as Oi } from "./files/attachment-canvas.js";
111
+ import { getUrlFileName as ki, isExternalSourcePreviewable as Ai, resolveExternalSourceContentType as ji } from "./files/source-content.js";
112
+ import { annotationToDisplayAttachment as Mi, attachmentDtoToDisplayAttachment as Ni, attachmentDtosToDisplayAttachments as Pi } from "./files/attachment-dto-to-display.js";
113
+ import { dialFileToAttachment as Fi, dialFilesToAttachments as Ii, dialFolderPathToAttachment as Li } from "./files/dial-file-to-attachment.js";
114
+ import { DownloadDestinationType as Ri } from "./files/download-destination.js";
115
+ import { prepareDownloadDestination as zi } from "./files/prepare-download-destination.js";
116
+ import { useDialFileListing as Bi } from "./files/useDialFileListing/useDialFileListing.js";
117
+ import { useDialFileMetadata as Vi } from "./files/useDialFileMetadata/useDialFileMetadata.js";
118
+ import { useDialFileMutations as Hi } from "./files/useDialFileMutations/useDialFileMutations.js";
119
+ import { useDialFileSharing as Ui } from "./files/useDialFileSharing/useDialFileSharing.js";
120
+ import { useDialFileUploadBatch as Wi } from "./files/useDialFileUploadBatch/useDialFileUploadBatch.js";
121
+ import { useDialFileManager as Gi } from "./files/useDialFileManager/useDialFileManager.js";
122
+ import { useDialFileManagerTabConfig as Ki } from "./files/useDialFileManagerTabConfig/useDialFileManagerTabConfig.js";
123
+ import { useFileAttachmentPicker as qi } from "./files/useFileAttachmentPicker/useFileAttachmentPicker.js";
124
+ import { isCustomAppSchema as Ji, isQuickAppSchema as Yi } from "./shared/application-schema.js";
125
+ import { getBrowserTimezone as Xi } from "./shared/browser-timezone.js";
126
+ import { isValidAbsoluteUrl as Zi, isValidFeaturesData as Qi, parseFeaturesData as $i } from "./shared/custom-apps.js";
127
+ import { buildExternalServiceScopeId as ea, getExternalServiceFallbackName as ta, parseExternalServiceUrl as na } from "./shared/external-services.js";
128
+ import { useChatSettingsFormConfig as ra } from "./useChatSettingsFormConfig/useChatSettingsFormConfig.js";
129
+ import { usePageFileDrag as ia } from "./usePageFileDrag/usePageFileDrag.js";
130
+ import { useViewportWidth as aa } from "./useViewportWidth/useViewportWidth.js";
131
+ import { usePanelMaxWidth as oa } from "./usePanelMaxWidth/usePanelMaxWidth.js";
132
+ import { useShareLink as sa } from "./useShareLink/useShareLink.js";
133
+ import { useToolsMenu as ca } from "./useToolsMenu/useToolsMenu.js";
134
+ import { useUsageData as la } from "./usage/useUsageData/useUsageData.js";
135
+ import { McpAppResourceFetchError as ua, createMcpAppsApiClient as da } from "./mcp-apps/mcp-apps-api-client.js";
136
+ import { useMcpAppTools as fa } from "./mcp-apps/useMcpAppTools/useMcpAppTools.js";
137
+ import { useMcpAppHostContext as pa } from "./mcp-apps/useMcpAppHostContext/useMcpAppHostContext.js";
138
+ import { useMcpAppHostAdapter as ma } from "./mcp-apps/useMcpAppHostAdapter/useMcpAppHostAdapter.js";
139
+ import { useOpenMcpAppCanvas as ha } from "./mcp-apps/useOpenMcpAppCanvas/useOpenMcpAppCanvas.js";
140
+ import { useGridEditingScroll as ga } from "@epam/ai-dial-chat-shared";
141
+ export { x as AttachmentValidationErrorReason, er as AudioTranscriptionError, tr as AudioTranscriptionErrorReason, R as AuthenticationType, Or as COLUMNS_WITHOUT_AUTHOR, kr as COLUMNS_WITH_AUTHOR, Ar as CORE_PERMISSION_MAP, et as CatalogPrimaryActionType, T as ConversationExportMode, E as ConversationTransferErrorCode, D as ConversationTransferWarningCode, jr as DATE_OPTIONS, zt as DEFAULT_GENERATION_CONFLICT_MESSAGE, rr as DEFAULT_MAX_ARCHIVE_BYTES, Fr as DialFileManagerActionProfile, Ir as DialFileManagerVariant, wr as DialFilesApiUploadMode, Ri as DownloadDestinationType, k as EXPORT_APP_NAME, O as ExportFileNameKind, jt as FavoriteEntityType, Tr as FileManagerNotificationReason, Er as FileNameValidationErrorReason, Dr as FileOperationKind, Bt as GenerationConflictError, ua as McpAppResourceFetchError, ze as McpResourceKind, ot as OAuthResourceKind, Mr as PATH_SEPARATOR_REGEXP, un as PROMPT_CONTENT_MAX_LENGTH, dn as PROMPT_COUNTER_ANNOUNCE_THRESHOLD, fn as PROMPT_DESCRIPTION_MAX_LENGTH, pn as PROMPT_NAME_MAX_LENGTH, Te as PUBLIC_SKILL_BUCKET, mn as PromptFieldError, ae as PromptSource, Nr as RESERVED_MARKER_NAME, Vn as RecipientsCountStatus, ue as SKILL_FILE_UPLOAD_MAX_BYTES, Ee as SKILL_LISTING_MAX_PAGES, De as SKILL_LISTING_PAGE_SIZE, de as SKILL_MANIFEST_FILE, Oe as SKILL_MANIFEST_MAX_BYTES, fe as SKILL_UPLOAD_MAX_FILES, pe as SKILL_UPLOAD_MAX_TOTAL_BYTES, In as SkillArchiveImportErrorKind, Ln as SkillArchiveImportStatus, Rn as SkillArchiveSelectionRejectionReason, kn as SkillEditorLoadState, Nn as SkillPreviewErrorKind, ke as SkillSource, st as TOOLSET_REDIRECT_STATE_KEY, ct as ToolsetAuthStatus, lt as ToolsetAuthTypes, ut as ToolsetCredentialsLevel, Et as ToolsetLoginOutcomeType, dt as ToolsetOAuthCallbackQuery, ft as ToolsetOAuthChannelControlType, pt as ToolsetOAuthFailureReason, mt as ToolsetOAuthInitiationResultType, ht as ToolsetOAuthResultType, Pr as UPLOAD_CONCURRENCY, xn as UnsupportedTriggerReason, gt as WithLogin, Mi as annotationToDisplayAttachment, mi as annotationToOoxmlCanvasContent, hi as annotationToPdfCanvasContent, Sn as apSchedulerDayToJsDay, W as appendLocaleCode, yr as applyChunkToMessages, Ni as attachmentDtoToDisplayAttachment, Pi as attachmentDtosToDisplayAttachments, ar as attachmentToDto, or as attachmentsToDtos, G as buildAdditionalLocaleOptions, Pt as buildAnnouncementSignature, Be as buildApplicationMcpUrl, N as buildChatCompletionsUrl, Ve as buildConnectApi, P as buildDeploymentConnectApi, ea as buildExternalServiceScopeId, ni as buildFromCache, sn as buildPromptExportEnvelope, cn as buildPromptExportFileName, se as buildPromptOverview, hn as buildPromptPath, F as buildResponsesUrl, Rr as buildSharedItemVirtualPath, je as buildSkillContentTree, me as buildSkillFilesPayload, he as buildSkillManifest, ge as buildSkillManifestForSubmit, _e as buildSkillManifestFromFrontmatter, Me as buildSkillOverview, xt as buildToolsetAuthorizeUrl, He as buildToolsetMcpUrl, zn as classifySkillArchiveImportError, gi as clearAttachmentCache, K as composeLocalePayload, Vt as createChatStreamApi, i as createCsrfMiddleware, qt as createDeploymentChangedMessage, di as createFilesApiClient, da as createMcpAppsApiClient, sr as createMessagePair, j as createPublishApiClient, a as createUnauthorizedMiddleware, fi as createUploadFileWithProgress, V as decodeToolsetId, q as decomposeLocalizedFields, Lr as deriveActionProfile, Ye as deriveAvailableTabIds, Un as deriveConversationRowActionState, Xe as deriveFavoriteItems, zr as dialCorePathToRelative, Fi as dialFileToAttachment, Ii as dialFilesToAttachments, Li as dialFolderPathToAttachment, m as downloadAttachment, _t as emitToolsetLoginSuccess, I as encodeDeploymentId, H as encodeToolsetId, ri as fetchByTab, ii as fetchForSearch, Ze as filterCatalogItemsBySelector, Qe as filterHiddenOwnedItems, L as findDeploymentByIdOrReference, Br as findDialFileByPath, ai as findFirstSuccessfulCopyMoveItem, Vr as findFolderByVirtualPath, Ut as formatAppVersion, X as formatCalendarDate, C as formatDateYM, w as formatDateYMD, Hr as formatOperationFolderName, A as formatQuotedNameList, e as getApiErrorDetails, t as getApiErrorMessage, n as getApiErrorStatus, Xi as getBrowserTimezone, hr as getConversationPath, qn as getConversationSource, ta as getExternalServiceFallbackName, Jt as getLastDeploymentId, Yt as getLastUserMessageToolConfiguration, Gt as getModelIdFromConversationId, Zr as getParentFolderPath, We as getPublicCatalogEntityFolderPath, en as getQuickAppConversationStarters, gn as getRemainingCharacters, fr as getStarterConversationText, pr as getStarterDisplayText, rn as getStarterPopulateText, mr as getStarterSubmitText, an as getStartersFromSchema, Kt as getTimeOfDayGreeting, yt as getToolsetOAuthChannelName, St as getToolsetRedirectUri, ki as getUrlFileName, Ur as getVirtualPathName, cr as hasActiveToolConfig, Ft as hasAnnouncementContent, _i as hasAttachmentTextSource, Wr as hasDialFileWritePermission, Gr as hasForbiddenNameSymbols, It as hasStructuredAnnouncement, o as includesIgnoreCase, Ct as initiateOAuthLogin, lr as isAnswerIncomplete, xr as isAwaitingGenerationResume, r as isConversationNotFoundError, Kr as isCopyMoveDuplicateAllowed, Ji as isCustomAppSchema, _ as isDialFileAcceptType, d as isDialFileId, h as isDownloadableAttachment, Ai as isExternalSourcePreviewable, ur as isMessageChanged, Xt as isMessageStreaming, ce as isOrganisationPromptItem, Ge as isPublicCatalogEntityId, U as isPublicToolsetId, Yi as isQuickAppSchema, qr as isShareActionsAllowed, Zi as isValidAbsoluteUrl, Qi as isValidFeaturesData, ve as isValidSkillRelativePath, Cn as jsDayToApSchedulerDay, oi as mapCorePermissions, Q as mapDeploymentDetailsDtoToEntityDetails, z as mapDeploymentLimitsDtoToCatalogLimits, B as mapDeploymentLimitsToInput, te as mapDeploymentToCatalogItem, ne as mapDeploymentToolsetCredentials, $ as mapEntityDetailsToCatalogDetails, si as mapFileMetadataToDialFile, wn as mapFormValuesToCreateBody, Tn as mapFormValuesToUpdateBody, le as mapPromptToCatalogItem, Ke as mapPublishConversationResultDto, qe as mapPublishHistoryEntryDto, En as mapScheduledTaskDtoToFormValues, ci as mapSearchItem, Ne as mapSkillToCatalogItem, tn as mapStages, ee as mapToolsetCredentials, re as mapToolsetToCatalogItem, li as mergeCreatedFolderIntoCache, br as mergeStages, Zt as messageHasStages, v as mimeTypesToAttachmentExtensionLabels, y as mimeTypesToDialFileAcceptTypes, b as mimeTypesToFileAccept, ye as nameFromPath, wt as navigateToolsetOAuthPopup, Qt as normalizeResponseFormat, be as normalizeSkillName, Jr as normalizeVirtualPath, pi as openAnnotationAttachment, Tt as openToolsetOAuthPopup, Z as padTwoDigits, na as parseExternalServiceUrl, $i as parseFeaturesData, Yr as parseNewFolderVirtualPath, oe as parsePromptResourceUrl, xe as parseSkillManifest, rt as parseSkillManifestDocument, Ae as parseSkillResourceUrl, ei as prepareCopyItems, zi as prepareDownloadDestination, ti as prepareMoveRenameItems, Pe as readSkillFileBytes, Fe as readSkillFilePreviewBytes, Ie as readSkillManifest, $e as reconcileFilterTopics, vi as referenceAttachmentToPdfCanvasContent, tt as resolveCatalogPrimaryAction, yi as resolveCodeCanvasContent, ie as resolveDeploymentFolder, Qr as resolveDialFileApiPath, f as resolveDialFileBucketAndPath, ji as resolveExternalSourceContentType, bi as resolveGroupedVisualizerCanvasContent, xi as resolveHtmlCanvasContent, Si as resolveImageCanvasContent, Ci as resolveJsonCanvasContent, J as resolveLocalizedText, wi as resolveMarkdownCanvasContent, Ue as resolveMcpResourceKind, Ti as resolveOoxmlCanvasContent, Xr as resolveOwnerCoords, Ei as resolvePdfCanvasContent, p as resolveRelativeDialFilePath, Le as resolveSkillFileDownloadPath, Re as resolveSkillManifestFileId, Di as resolveTextCanvasContent, Oi as resolveVisualizerCanvasContent, s as safeDecodeURI, c as safeDecodeURIComponent, Lt as sanitizeAnnouncementHtml, Rt as sanitizeAnnouncementMessageHtml, Xn as sanitizeFileName, Wt as sanitizeFooterHtml, ln as serializePromptExport, dr as shouldRerunGenerationOnEdit, Ht as shouldWatchForDisplayNameUpdate, Se as skillFileBytesToBlob, On as skillFileToAttachment, Zn as splitFileNameExtension, Ce as startsWithFrontmatterBlock, l as stripSurroundingSlashes, u as stripTrailingSlashes, vt as subscribeToolsetLoginSuccess, Y as toBaseLocale, $t as toOverlayMessages, Je as toPublishEntityType, M as toPublishRuleDto, nn as toStage, Qn as trimFileNameToByteLimit, we as unpackSkillArchive, ui as updateEntry, Wn as useActiveConversationSync, kt as useApplicationCredentials, Gn as useAsyncConfirmDialog, g as useAttachmentAction, $n as useAttachmentUpload, S as useAttachmentValidation, nt as useCatalogEditNavigation, at as useCatalogItemDetails, Ot as useCatalogToolsetCredentials, ra as useChatSettingsFormConfig, ir as useConversationExport, gr as useConversationHandlers, _r as useConversationImport, Kn as useConversationLookupMaps, Jn as useConversationPanelItems, vr as useConversationScroll, Cr as useConversationSources, Sr as useConversationStream, Bi as useDialFileListing, Gi as useDialFileManager, Ki as useDialFileManagerTabConfig, Vi as useDialFileMetadata, Hi as useDialFileMutations, Ui as useDialFileSharing, Wi as useDialFileUploadBatch, Mt as useFavoriteEntitiesState, qi as useFileAttachmentPicker, ga as useGridEditingScroll, Yn as useImportFilePicker, ma as useMcpAppHostAdapter, pa as useMcpAppHostContext, fa as useMcpAppTools, on as useOAuthCallbackCompletion, ha as useOpenMcpAppCanvas, ia as usePageFileDrag, oa as usePanelMaxWidth, bn as usePromptsState, Nt as usePublishFolders, sa as useShareLink, Hn as useShareRecipientsCount, Bn as useSkillArchiveImport, At as useSkillDetailsPanelData, An as useSkillEditorLoad, jn as useSkillEditorSubmit, Mn as useSkillFileActions, Pn as useSkillFilePreview, it as useSkillItemDetails, Fn as useSkillsState, ca as useToolsMenu, Dt as useToolsetLogin, nr as useTranscribeAudio, la as useUsageData, aa as useViewportWidth, _n as validatePromptContent, vn as validatePromptDescription, yn as validatePromptName, Dn as validateSkillFileBatch, $r as virtualPathToApiPath, bt as waitForToolsetOAuthResult };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@epam/ai-dial-chat-hooks",
3
3
  "description": "Framework-level React hooks extracted from AI DIAL Chat for building custom chat interfaces",
4
- "version": "1.2.0-dev.85",
4
+ "version": "1.2.0-dev.89",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "./index.js",
@@ -106,7 +106,7 @@
106
106
  }
107
107
  },
108
108
  "dependencies": {
109
- "@epam/ai-dial-chat-api-client": "1.2.0-dev.85",
109
+ "@epam/ai-dial-chat-api-client": "1.2.0-dev.89",
110
110
  "dompurify": "3.4.15",
111
111
  "fflate": "^0.8.3",
112
112
  "lru-cache": "^10.4.3",
@@ -115,21 +115,21 @@
115
115
  },
116
116
  "peerDependencies": {
117
117
  "react": "^19.2.8",
118
- "@epam/ai-dial-attachment-canvas": "1.2.0-dev.85",
119
- "@epam/ai-dial-attachment-input": "1.2.0-dev.85",
120
- "@epam/ai-dial-builder-form": "1.2.0-dev.85",
121
- "@epam/ai-dial-catalog": "1.2.0-dev.85",
122
- "@epam/ai-dial-chat-overlay": "1.2.0-dev.85",
123
- "@epam/ai-dial-chat-shared": "1.2.0-dev.85",
124
- "@epam/ai-dial-mcp-apps": "1.2.0-dev.85",
125
- "@epam/ai-dial-publish-panel": "1.2.0-dev.85",
126
- "@epam/ai-dial-quotations": "1.2.0-dev.85",
127
- "@epam/ai-dial-react-file-manager": "^0.3.0-dev.2",
128
- "@epam/ai-dial-scheduled-tasks": "1.2.0-dev.85",
129
- "@epam/ai-dial-share": "1.2.0-dev.85",
130
- "@epam/ai-dial-skill-editor": "1.2.0-dev.85",
131
- "@epam/ai-dial-source-panel": "1.2.0-dev.85",
132
- "@epam/ai-dial-ui-kit": "^0.15.0-dev.9",
118
+ "@epam/ai-dial-attachment-canvas": "1.2.0-dev.89",
119
+ "@epam/ai-dial-attachment-input": "1.2.0-dev.89",
120
+ "@epam/ai-dial-builder-form": "1.2.0-dev.89",
121
+ "@epam/ai-dial-catalog": "1.2.0-dev.89",
122
+ "@epam/ai-dial-chat-overlay": "1.2.0-dev.89",
123
+ "@epam/ai-dial-chat-shared": "1.2.0-dev.89",
124
+ "@epam/ai-dial-mcp-apps": "1.2.0-dev.89",
125
+ "@epam/ai-dial-publish-panel": "1.2.0-dev.89",
126
+ "@epam/ai-dial-quotations": "1.2.0-dev.89",
127
+ "@epam/ai-dial-react-file-manager": "^0.3.0-dev.4",
128
+ "@epam/ai-dial-scheduled-tasks": "1.2.0-dev.89",
129
+ "@epam/ai-dial-share": "1.2.0-dev.89",
130
+ "@epam/ai-dial-skill-editor": "1.2.0-dev.89",
131
+ "@epam/ai-dial-source-panel": "1.2.0-dev.89",
132
+ "@epam/ai-dial-ui-kit": "^0.15.0-dev.12",
133
133
  "@modelcontextprotocol/sdk": "^1.29.0",
134
134
  "@epam/pdf-highlighter-kit": "^0.0.19",
135
135
  "@mcp-ui/client": "^7.1.1"
package/skill/skill.js CHANGED
@@ -13,7 +13,10 @@ var i = "SKILL.md", a = 1048576, o = 16777216, s = 100, c = new Set([".dial-reso
13
13
  ...e,
14
14
  name: t,
15
15
  description: n
16
- }).trimEnd()}\n---\n\n${i}`, g = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/, _ = (e) => {
16
+ }).trimEnd()}\n---\n\n${i}`, g = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/, _ = /^---[ \t]*$/, v = (e) => {
17
+ let t = e.replace(/^\uFEFF/, "").replace(/\r\n/g, "\n").split("\n"), n = t.findIndex((e) => e.trim() !== "");
18
+ return n === -1 || !_.test(t[n]) ? !1 : t.some((e, t) => t > n && _.test(e));
19
+ }, y = (e) => {
17
20
  let t = g.exec(e);
18
21
  if (!t) throw Error("SKILL.md is missing its YAML frontmatter block");
19
22
  let [, r, i] = t;
@@ -21,7 +24,7 @@ var i = "SKILL.md", a = 1048576, o = 16777216, s = 100, c = new Set([".dial-reso
21
24
  frontmatter: n(r) ?? {},
22
25
  instructions: i.replace(/^\r?\n/, "")
23
26
  };
24
- }, v = (e) => {
27
+ }, b = (e) => {
25
28
  let n = t(e), r = n[i];
26
29
  if (r == null) throw Error(`Skill archive is missing a root ${i} file`);
27
30
  let a = /* @__PURE__ */ new Map();
@@ -30,19 +33,19 @@ var i = "SKILL.md", a = 1048576, o = 16777216, s = 100, c = new Set([".dial-reso
30
33
  manifestText: new TextDecoder().decode(r),
31
34
  files: a
32
35
  };
33
- }, y = (e) => {
36
+ }, x = (e) => {
34
37
  let t = e.lastIndexOf("/");
35
38
  return t === -1 ? e : e.slice(t + 1);
36
- }, b = (e) => new Blob([new Uint8Array(e)]), x = (e, t, n, r) => Object.keys(e).length > 0 ? h(e, t, n, r) : m({
39
+ }, S = (e) => new Blob([new Uint8Array(e)]), C = (e, t, n, r) => Object.keys(e).length > 0 ? h(e, t, n, r) : m({
37
40
  name: t,
38
41
  description: n,
39
42
  instructions: r
40
- }), S = (t, n) => {
43
+ }), w = (t, n) => {
41
44
  let r = t.filter((t) => t.kind === e.File);
42
45
  return {
43
46
  filePaths: r.map((e) => e.path),
44
- files: r.map((e) => b(n.get(e.path)?.bytes ?? new Uint8Array()))
47
+ files: r.map((e) => S(n.get(e.path)?.bytes ?? new Uint8Array()))
45
48
  };
46
49
  };
47
50
  //#endregion
48
- export { a as SKILL_FILE_UPLOAD_MAX_BYTES, i as SKILL_MANIFEST_FILE, s as SKILL_UPLOAD_MAX_FILES, o as SKILL_UPLOAD_MAX_TOTAL_BYTES, S as buildSkillFilesPayload, m as buildSkillManifest, x as buildSkillManifestForSubmit, h as buildSkillManifestFromFrontmatter, f as isValidSkillRelativePath, y as nameFromPath, p as normalizeSkillName, _ as parseSkillManifest, b as skillFileBytesToBlob, v as unpackSkillArchive };
51
+ export { a as SKILL_FILE_UPLOAD_MAX_BYTES, i as SKILL_MANIFEST_FILE, s as SKILL_UPLOAD_MAX_FILES, o as SKILL_UPLOAD_MAX_TOTAL_BYTES, w as buildSkillFilesPayload, m as buildSkillManifest, C as buildSkillManifestForSubmit, h as buildSkillManifestFromFrontmatter, f as isValidSkillRelativePath, x as nameFromPath, p as normalizeSkillName, y as parseSkillManifest, S as skillFileBytesToBlob, v as startsWithFrontmatterBlock, b as unpackSkillArchive };
@@ -1,135 +1,147 @@
1
1
  import { getApiErrorDetails as e, getApiErrorStatus as t } from "../api-error/api-error.js";
2
- import { buildSkillFilesPayload as n, buildSkillManifestForSubmit as r, isValidSkillRelativePath as i, normalizeSkillName as a } from "./skill.js";
3
- import { useCallback as o, useRef as s, useState as c } from "react";
4
- import { NotificationVariant as l } from "@epam/ai-dial-ui-kit";
2
+ import { buildSkillFilesPayload as n, buildSkillManifestForSubmit as r, isValidSkillRelativePath as i, normalizeSkillName as a, startsWithFrontmatterBlock as o } from "./skill.js";
3
+ import { useCallback as s, useRef as c, useState as l } from "react";
4
+ import { NotificationVariant as u } from "@epam/ai-dial-ui-kit";
5
5
  //#region src/skill/useSkillEditorSubmit.ts
6
- var u = (e, t) => JSON.stringify({
6
+ var d = (e, t) => JSON.stringify({
7
7
  values: e,
8
8
  files: [...t].sort((e, t) => e.path.localeCompare(t.path))
9
- }), d = ({ bucket: d, isEditMode: f, files: p, filesContentRef: m, frontmatterRef: h, loadedPathRef: g, etagRef: _, returnUrl: v, refetchSkills: y, client: b, messages: x, onNavigate: S, onNotify: C }) => {
10
- let [w, T] = c({}), [E, D] = c(), [O, k] = c(), [A, j] = c("idle"), M = s(null), N = o(async (n) => {
9
+ }), f = ({ bucket: f, isEditMode: p, files: m, filesContentRef: h, frontmatterRef: g, loadedPathRef: _, etagRef: v, returnUrl: y, refetchSkills: b, client: x, messages: S, onNavigate: C, onNotify: w }) => {
10
+ let [T, E] = l({}), [D, O] = l(), [k, A] = l(), [j, M] = l("idle"), N = c(null), P = s(async (n) => {
11
11
  switch (t(n)) {
12
12
  case 409:
13
- T({ name: x.nameConflict });
13
+ E({ name: S.nameConflict });
14
14
  return;
15
15
  case 412:
16
- T({ name: x.nameConflict });
16
+ E({ name: S.nameConflict });
17
17
  return;
18
18
  case 413:
19
- D(x.archiveTooLarge);
19
+ O(S.archiveTooLarge);
20
20
  return;
21
21
  case 503:
22
- D(x.serviceUnavailable);
22
+ O(S.serviceUnavailable);
23
23
  return;
24
24
  case 400: {
25
25
  let { message: t } = await e(n);
26
- D(t ?? x.pathInvalid);
26
+ O(t ?? S.pathInvalid);
27
27
  return;
28
28
  }
29
29
  default: {
30
30
  let { traceId: t } = await e(n);
31
- D(x.saveError), C({
32
- variant: l.Error,
33
- message: x.saveError,
31
+ O(S.saveError), w({
32
+ variant: u.Error,
33
+ message: S.saveError,
34
34
  requestId: t
35
35
  });
36
36
  }
37
37
  }
38
- }, [x, C]), P = o(async (e) => {
38
+ }, [S, w]), F = s(async (e) => {
39
39
  let t = a(e.name);
40
40
  if (!t || !i(t)) {
41
- T({ name: x.nameInvalid });
41
+ E({ name: S.nameInvalid });
42
42
  return;
43
43
  }
44
- let o = u(e, p), s = M.current, c = s != null && s.fingerprint === o, f = t, g, _, w;
45
- c ? {skillManifest: g, filePaths: _, files: w} = s : (g = r(h.current, t, e.description, e.instructions), {filePaths: _, files: w} = n(p, m.current)), j("submitting"), M.current = {
44
+ let o = d(e, m), s = N.current, c = s != null && s.fingerprint === o, l = t, p, _, v;
45
+ c ? {skillManifest: p, filePaths: _, files: v} = s : (p = r(g.current, t, e.description, e.instructions), {filePaths: _, files: v} = n(m, h.current)), M("submitting"), N.current = {
46
46
  fingerprint: o,
47
- bucket: d,
48
- path: f,
49
- skillManifest: g,
47
+ bucket: f,
48
+ path: l,
49
+ skillManifest: p,
50
50
  filePaths: _,
51
- files: w
51
+ files: v
52
52
  };
53
53
  try {
54
- await b.createSkill(d, f, g, _, w), await y(), j("success"), C({
55
- variant: l.Success,
56
- title: x.saveSuccessTitle,
57
- message: x.createSuccess(t)
58
- }), S(v);
54
+ await x.createSkill(f, l, p, _, v), await b(), M("success"), w({
55
+ variant: u.Success,
56
+ title: S.saveSuccessTitle,
57
+ message: S.createSuccess(t)
58
+ }), C(y);
59
59
  } catch (e) {
60
- j("failure"), await N(e);
60
+ M("failure"), await P(e);
61
61
  }
62
62
  }, [
63
- d,
64
- p,
63
+ f,
65
64
  m,
66
65
  h,
66
+ g,
67
+ S,
67
68
  x,
68
- b,
69
+ w,
69
70
  C,
70
- S,
71
- v,
72
71
  y,
73
- N
74
- ]), F = o(async (e) => {
75
- let i = g.current, a = _.current;
72
+ b,
73
+ P
74
+ ]), I = s(async (e) => {
75
+ let i = _.current, a = v.current;
76
76
  if (!i || !a) {
77
- D(x.saveError);
77
+ O(S.saveError);
78
78
  return;
79
79
  }
80
- let o = r(h.current, e.name, e.description, e.instructions), { filePaths: s, files: c } = n(p, m.current);
81
- j("submitting");
80
+ let o = r(g.current, e.name, e.description, e.instructions), { filePaths: s, files: c } = n(m, h.current);
81
+ M("submitting");
82
82
  try {
83
- _.current = (await b.updateSkill(d, i, o, s, c, a)).etag ?? a, await y(), j("success"), C({
84
- variant: l.Success,
85
- title: x.updateSuccessTitle,
86
- message: x.updateSuccess(e.name)
87
- }), S(v);
83
+ v.current = (await x.updateSkill(f, i, o, s, c, a)).etag ?? a, await b(), M("success"), w({
84
+ variant: u.Success,
85
+ title: S.updateSuccessTitle,
86
+ message: S.updateSuccess(e.name)
87
+ }), C(y);
88
88
  } catch (e) {
89
- if (j("failure"), t(e) === 412) {
90
- k({ message: x.conflictMessage });
89
+ if (M("failure"), t(e) === 412) {
90
+ A({ message: S.conflictMessage });
91
91
  return;
92
92
  }
93
- await N(e);
93
+ await P(e);
94
94
  }
95
95
  }, [
96
- d,
97
- p,
96
+ f,
98
97
  m,
99
98
  h,
100
99
  g,
101
100
  _,
101
+ v,
102
+ S,
102
103
  x,
103
- b,
104
+ w,
104
105
  C,
105
- S,
106
- v,
107
106
  y,
108
- N
109
- ]);
107
+ b,
108
+ P
109
+ ]), L = s((e) => {
110
+ let t = o(e.instructions);
111
+ E((e) => {
112
+ if (t === (e.instructions === S.instructionsFrontmatter)) return e;
113
+ if (t) return {
114
+ ...e,
115
+ instructions: S.instructionsFrontmatter
116
+ };
117
+ let n = { ...e };
118
+ return delete n.instructions, n;
119
+ });
120
+ }, [S]);
110
121
  return {
111
- phase: A,
112
- errors: w,
113
- submitError: E,
114
- conflict: O,
115
- clearConflict: () => k(void 0),
116
- handleSubmit: o(async (e) => {
117
- if (A === "submitting" || !d) return;
122
+ phase: j,
123
+ errors: T,
124
+ submitError: D,
125
+ conflict: k,
126
+ clearConflict: () => A(void 0),
127
+ handleSubmit: s(async (e) => {
128
+ if (j === "submitting" || !f) return;
118
129
  let t = {};
119
- if (e.name.trim() || (t.name = x.required), e.description.trim() || (t.description = x.required), e.instructions.trim() || (t.instructions = x.required), Object.keys(t).length > 0) {
120
- T(t);
130
+ if (e.name.trim() || (t.name = S.required), e.description.trim() || (t.description = S.required), e.instructions.trim() ? o(e.instructions) && (t.instructions = S.instructionsFrontmatter) : t.instructions = S.required, Object.keys(t).length > 0) {
131
+ E(t);
121
132
  return;
122
133
  }
123
- T({}), D(void 0), k(void 0), f ? await F(e) : await P(e);
134
+ E({}), O(void 0), A(void 0), p ? await I(e) : await F(e);
124
135
  }, [
125
- A,
126
- d,
127
- x,
136
+ j,
128
137
  f,
129
- F,
130
- P
131
- ])
138
+ S,
139
+ p,
140
+ I,
141
+ F
142
+ ]),
143
+ handleValuesChange: L
132
144
  };
133
145
  };
134
146
  //#endregion
135
- export { d as useSkillEditorSubmit };
147
+ export { f as useSkillEditorSubmit };
package/skill-editor.d.ts CHANGED
@@ -192,6 +192,12 @@ export declare interface SkillEditorSubmitClient {
192
192
  export declare interface SkillEditorSubmitMessages {
193
193
  /** Shown when a required field is empty. */
194
194
  required: string;
195
+ /**
196
+ * Shown when the Instructions value opens with its own YAML frontmatter
197
+ * block — pasting a whole `SKILL.md` in there would otherwise produce a
198
+ * manifest with two frontmatter blocks.
199
+ */
200
+ instructionsFrontmatter: string;
195
201
  /** Shown when the normalized skill name fails DIAL's naming rules. */
196
202
  nameInvalid: string;
197
203
  /** Shown when the skill name already exists (409), or defensively on an unreachable create-mode 412. */
@@ -357,6 +363,28 @@ export declare interface SkillManifestValues {
357
363
  instructions: string;
358
364
  }
359
365
 
366
+ /**
367
+ * Answers one question: would appending this text after the fence that
368
+ * `buildSkillManifest` writes produce a *second* frontmatter block?
369
+ *
370
+ * That happens when the text's first non-blank line is a bare `---` and some
371
+ * later line is a bare `---` too — the exact shape of a `SKILL.md` pasted
372
+ * wholesale into the editor's Instructions field.
373
+ *
374
+ * Detection is deliberately structural rather than YAML-based: a pasted block
375
+ * whose fenced content fails to parse corrupts the stored manifest
376
+ * identically (and renders as a setext `h2` in the Catalog's Details tab just
377
+ * the same), so requiring parseable YAML here would let the worst cases
378
+ * through. Keeping `parseYaml` out also makes this cheap enough to run on
379
+ * every keystroke.
380
+ *
381
+ * A single unclosed fence returns `false`: with no closing fence there is no
382
+ * second block, matching `FRONTMATTER_PATTERN`'s own requirement. A `---`
383
+ * appearing later in the body (a horizontal rule, a setext underline) is
384
+ * likewise not a frontmatter block.
385
+ */
386
+ export declare const startsWithFrontmatterBlock: (text: string) => boolean;
387
+
360
388
  declare type SubmitPhase = 'idle' | 'submitting' | 'success' | 'failure';
361
389
 
362
390
  /** A skill archive unpacked into its manifest text and a relative-path → bytes map of every other entry. */
@@ -514,6 +542,12 @@ export declare interface UseSkillEditorSubmitResult {
514
542
  clearConflict: () => void;
515
543
  /** Validates and submits the given form values. */
516
544
  handleSubmit: (values: SkillEditorValues) => Promise<void>;
545
+ /**
546
+ * Re-runs the Instructions frontmatter check against the editor's current
547
+ * values, so a pasted `SKILL.md` is flagged as the text lands rather than
548
+ * only on submit. Pass as the editor's `onValuesChange`.
549
+ */
550
+ handleValuesChange: (values: SkillEditorValues) => void;
517
551
  }
518
552
 
519
553
  /**
package/skill-editor.js CHANGED
@@ -1,9 +1,9 @@
1
- import { SKILL_FILE_UPLOAD_MAX_BYTES as e, SKILL_MANIFEST_FILE as t, SKILL_UPLOAD_MAX_FILES as n, SKILL_UPLOAD_MAX_TOTAL_BYTES as r, buildSkillFilesPayload as i, buildSkillManifest as a, buildSkillManifestForSubmit as o, buildSkillManifestFromFrontmatter as s, isValidSkillRelativePath as c, nameFromPath as l, normalizeSkillName as u, parseSkillManifest as d, skillFileBytesToBlob as f, unpackSkillArchive as p } from "./skill/skill.js";
2
- import { parseSkillManifestDocument as m } from "./skill/skill-manifest.js";
3
- import { validateSkillFileBatch as h } from "./skill/skill-file-batch-validation.js";
4
- import { skillFileToAttachment as g } from "./skill/skill-file-preview.js";
5
- import { SkillEditorLoadState as _, useSkillEditorLoad as v } from "./skill/useSkillEditorLoad.js";
6
- import { useSkillEditorSubmit as y } from "./skill/useSkillEditorSubmit.js";
7
- import { useSkillFileActions as b } from "./skill/useSkillFileActions.js";
8
- import { SkillArchiveImportErrorKind as x, SkillArchiveImportStatus as S, SkillArchiveSelectionRejectionReason as C, classifySkillArchiveImportError as w, useSkillArchiveImport as T } from "./skill/useSkillArchiveImport/useSkillArchiveImport.js";
9
- export { e as SKILL_FILE_UPLOAD_MAX_BYTES, t as SKILL_MANIFEST_FILE, n as SKILL_UPLOAD_MAX_FILES, r as SKILL_UPLOAD_MAX_TOTAL_BYTES, x as SkillArchiveImportErrorKind, S as SkillArchiveImportStatus, C as SkillArchiveSelectionRejectionReason, _ as SkillEditorLoadState, i as buildSkillFilesPayload, a as buildSkillManifest, o as buildSkillManifestForSubmit, s as buildSkillManifestFromFrontmatter, w as classifySkillArchiveImportError, c as isValidSkillRelativePath, l as nameFromPath, u as normalizeSkillName, d as parseSkillManifest, m as parseSkillManifestDocument, f as skillFileBytesToBlob, g as skillFileToAttachment, p as unpackSkillArchive, T as useSkillArchiveImport, v as useSkillEditorLoad, y as useSkillEditorSubmit, b as useSkillFileActions, h as validateSkillFileBatch };
1
+ import { SKILL_FILE_UPLOAD_MAX_BYTES as e, SKILL_MANIFEST_FILE as t, SKILL_UPLOAD_MAX_FILES as n, SKILL_UPLOAD_MAX_TOTAL_BYTES as r, buildSkillFilesPayload as i, buildSkillManifest as a, buildSkillManifestForSubmit as o, buildSkillManifestFromFrontmatter as s, isValidSkillRelativePath as c, nameFromPath as l, normalizeSkillName as u, parseSkillManifest as d, skillFileBytesToBlob as f, startsWithFrontmatterBlock as p, unpackSkillArchive as m } from "./skill/skill.js";
2
+ import { parseSkillManifestDocument as h } from "./skill/skill-manifest.js";
3
+ import { validateSkillFileBatch as g } from "./skill/skill-file-batch-validation.js";
4
+ import { skillFileToAttachment as _ } from "./skill/skill-file-preview.js";
5
+ import { SkillEditorLoadState as v, useSkillEditorLoad as y } from "./skill/useSkillEditorLoad.js";
6
+ import { useSkillEditorSubmit as b } from "./skill/useSkillEditorSubmit.js";
7
+ import { useSkillFileActions as x } from "./skill/useSkillFileActions.js";
8
+ import { SkillArchiveImportErrorKind as S, SkillArchiveImportStatus as C, SkillArchiveSelectionRejectionReason as w, classifySkillArchiveImportError as T, useSkillArchiveImport as E } from "./skill/useSkillArchiveImport/useSkillArchiveImport.js";
9
+ export { e as SKILL_FILE_UPLOAD_MAX_BYTES, t as SKILL_MANIFEST_FILE, n as SKILL_UPLOAD_MAX_FILES, r as SKILL_UPLOAD_MAX_TOTAL_BYTES, S as SkillArchiveImportErrorKind, C as SkillArchiveImportStatus, w as SkillArchiveSelectionRejectionReason, v as SkillEditorLoadState, i as buildSkillFilesPayload, a as buildSkillManifest, o as buildSkillManifestForSubmit, s as buildSkillManifestFromFrontmatter, T as classifySkillArchiveImportError, c as isValidSkillRelativePath, l as nameFromPath, u as normalizeSkillName, d as parseSkillManifest, h as parseSkillManifestDocument, f as skillFileBytesToBlob, _ as skillFileToAttachment, p as startsWithFrontmatterBlock, m as unpackSkillArchive, E as useSkillArchiveImport, y as useSkillEditorLoad, b as useSkillEditorSubmit, x as useSkillFileActions, g as validateSkillFileBatch };