@epam/ai-dial-chat-hooks 1.2.0-dev.99 → 1.3.0-dev.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api-error/api-error.js +7 -4
- package/catalog/catalog-derivations.js +1 -1
- package/catalog/deployment-id.js +8 -2
- package/catalog/map-deployment-limits-to-catalog.js +16 -24
- package/catalog/map-deployment-limits-to-input.js +81 -9
- package/catalog/map-deployment-to-catalog-item.js +34 -34
- package/catalog/map-entity-details-to-catalog.js +237 -192
- package/catalog/map-skill-to-catalog-item.js +61 -54
- package/catalog/publish.js +4 -4
- package/catalog/useCatalogEditNavigation/useCatalogEditNavigation.js +122 -101
- package/catalog/useCatalogItemDetails.js +9 -8
- package/catalog/usePublishFolders/usePublishFolders.js +1 -1
- package/catalog.d.ts +171 -34
- package/catalog.js +23 -23
- package/conversation/conversation-transfer/export-conversation.js +24 -16
- package/conversation/conversation-transfer/import-conversation.js +80 -31
- package/conversation/create-chat-stream-api.js +89 -49
- package/conversation/get-model-id-from-conversation-id.js +15 -9
- package/conversation/message-utils.js +44 -2
- package/conversation/stage.js +6 -2
- package/conversation/useActiveConversationSync/useActiveConversationSync.js +7 -8
- package/conversation/useConversationExport/useConversationExport.js +9 -9
- package/conversation/useConversationHandlers/message-utils.js +8 -5
- package/conversation/useConversationHandlers/useConversationHandlers.js +181 -167
- package/conversation/useConversationImport/useConversationImport.js +123 -121
- package/conversation/useConversationPanelItems/useConversationPanelItems.js +49 -31
- package/conversation/useConversationStream/frame-scheduler.js +39 -0
- package/conversation/useConversationStream/generation-resume.js +122 -64
- package/conversation/useConversationStream/useConversationStream.js +298 -118
- package/conversation/useMessageSelectionReply/useMessageSelectionReply.js +189 -0
- package/conversation-sources/useConversationSources/useConversationSources.js +31 -24
- package/conversation-sources.d.ts +1 -1
- package/conversation-transfer.d.ts +2 -1
- package/conversation.d.ts +218 -22
- package/conversation.js +32 -31
- package/file-manager-canvas.d.ts +27 -7
- package/file-manager.d.ts +87 -32
- package/file-manager.js +25 -24
- package/files/attachment-canvas.js +67 -44
- package/files/dial-file-manager-copy-move.util.js +9 -8
- package/files/dial-file-manager-mapping.util.js +2 -1
- package/files/dial-file-manager-path.util.js +24 -2
- package/files/dial-file-manager.model.js +23 -19
- package/files/dial-file-manager.types.js +3 -3
- package/files/file-manager-variant.js +1 -1
- package/files/resolve-dial-file-api-path.js +11 -12
- package/files/useDialFileListing/useDialFileListing.js +140 -127
- package/files/useDialFileManager/useDialFileManager.js +139 -135
- package/files/useDialFileManagerSections/useDialFileManagerSections.js +155 -0
- package/files/useDialFileManagerTabConfig/useDialFileManagerTabConfig.js +20 -15
- package/files/useDialFileMutations/useDialFileMutations.js +65 -60
- package/files/useDialFileUploadBatch/useDialFileUploadBatch.js +117 -110
- package/files/useFileAttachmentPicker/useFileAttachmentPicker.js +28 -23
- package/index.d.ts +643 -128
- package/index.js +136 -134
- package/mcp-apps/useMcpAppTools/useMcpAppTools.js +1 -1
- package/oauth/authorize-url.js +3 -3
- package/oauth/toolset-id.js +5 -3
- package/oauth/useToolsetLogin/useToolsetLogin.js +8 -8
- package/oauth.d.ts +34 -2
- package/oauth.js +9 -9
- package/package.json +19 -23
- package/scheduled-task/scheduled-task-description.js +43 -39
- package/scheduled-task/scheduled-task-trigger.js +74 -71
- package/scheduled-task/use-scheduled-task-runs.js +162 -50
- package/scheduled-task/use-scheduled-tasks.js +52 -48
- package/scheduled-tasks.d.ts +27 -6
- package/scheduled-tasks.js +2 -2
- package/shared/application-schema.js +5 -2
- package/shared/cron-day-of-month.js +13 -0
- package/skill/skill-archive.js +19 -0
- package/skill/skill-types.js +8 -7
- package/skill/skill.js +52 -29
- package/skill/useSkillArchiveImport/useSkillArchiveImport.js +38 -34
- package/skill/useSkillEditorLoad.js +65 -59
- package/skill/useSkillEditorSubmit.js +105 -93
- package/skill/useSkillFileActions.js +70 -58
- package/skill-editor.d.ts +62 -13
- package/skill-editor.js +9 -9
- package/usage/map-user-usage-to-model-limits.js +137 -95
- package/usage.d.ts +8 -3
- package/usePageFileDrag/usePageFileDrag.js +3 -3
- package/utils.d.ts +26 -6
- package/utils.js +10 -10
|
@@ -1,92 +1,96 @@
|
|
|
1
1
|
import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
|
|
2
2
|
//#region src/scheduled-task/use-scheduled-tasks.ts
|
|
3
|
-
var i = (i, { enabled: a = !0, pageSize: o = 20, debounceMs: s = 300, initialSearch: c = "", initialSort: l = "first_to_run" } = {}) => {
|
|
4
|
-
let [
|
|
3
|
+
var i = (i, { enabled: a = !0, pageSize: o = 20, debounceMs: s = 300, initialSearch: c = "", initialSort: l = "first_to_run", model: u } = {}) => {
|
|
4
|
+
let [d, f] = r([]), [p, m] = r(c), [h, g] = r(l), [_, v] = r(a), [y, b] = r(!1), [x, S] = r(null), [C, w] = r(null), [T, E] = r(!1), [D, O] = r(0), k = n(0), A = n(0), j = n(!1), M = n(null), [N, P] = r(c);
|
|
5
5
|
t(() => {
|
|
6
|
-
let e = setTimeout(() =>
|
|
6
|
+
let e = setTimeout(() => P(p), s);
|
|
7
7
|
return () => clearTimeout(e);
|
|
8
|
-
}, [s,
|
|
9
|
-
let e = ++
|
|
10
|
-
|
|
8
|
+
}, [s, p]), t(() => {
|
|
9
|
+
let e = ++k.current, t = new AbortController();
|
|
10
|
+
M.current?.abort(), M.current = null, j.current = !1, b(!1), S(null), w(null), f([]), E(!1), A.current = 0;
|
|
11
11
|
let n = () => {
|
|
12
|
-
++
|
|
12
|
+
++k.current, t.abort(), M.current?.abort(), M.current = null;
|
|
13
13
|
};
|
|
14
14
|
return a ? ((async () => {
|
|
15
|
-
|
|
15
|
+
v(!0);
|
|
16
16
|
try {
|
|
17
17
|
let n = await i.listScheduledTasks({
|
|
18
18
|
limit: o,
|
|
19
19
|
offset: 0,
|
|
20
|
-
search:
|
|
21
|
-
sort:
|
|
20
|
+
search: N,
|
|
21
|
+
sort: h,
|
|
22
|
+
model: u,
|
|
22
23
|
signal: t.signal
|
|
23
24
|
});
|
|
24
|
-
if (
|
|
25
|
-
|
|
25
|
+
if (k.current !== e) return;
|
|
26
|
+
f(n.items), A.current = n.items.length, E(n.next != null);
|
|
26
27
|
} catch (t) {
|
|
27
|
-
|
|
28
|
+
k.current === e && S(t instanceof Error ? t : /* @__PURE__ */ Error("Failed to load scheduled tasks"));
|
|
28
29
|
} finally {
|
|
29
|
-
|
|
30
|
+
k.current === e && v(!1);
|
|
30
31
|
}
|
|
31
|
-
})(), n) : (
|
|
32
|
+
})(), n) : (v(!1), f([]), E(!1), n);
|
|
32
33
|
}, [
|
|
33
34
|
i,
|
|
34
|
-
|
|
35
|
+
N,
|
|
35
36
|
a,
|
|
37
|
+
u,
|
|
36
38
|
o,
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
D,
|
|
40
|
+
h
|
|
39
41
|
]);
|
|
40
|
-
let
|
|
41
|
-
if (!a || !
|
|
42
|
-
|
|
42
|
+
let F = e(() => {
|
|
43
|
+
if (!a || !T || _ || j.current) return;
|
|
44
|
+
j.current = !0;
|
|
43
45
|
let e = new AbortController();
|
|
44
|
-
|
|
45
|
-
let t =
|
|
46
|
+
M.current = e;
|
|
47
|
+
let t = k.current, n = A.current;
|
|
46
48
|
(async () => {
|
|
47
|
-
|
|
49
|
+
b(!0), w(null);
|
|
48
50
|
try {
|
|
49
51
|
let r = await i.listScheduledTasks({
|
|
50
52
|
limit: o,
|
|
51
53
|
offset: n,
|
|
52
54
|
signal: e.signal,
|
|
53
|
-
search:
|
|
54
|
-
sort:
|
|
55
|
+
search: N,
|
|
56
|
+
sort: h,
|
|
57
|
+
model: u
|
|
55
58
|
});
|
|
56
|
-
if (
|
|
57
|
-
|
|
59
|
+
if (k.current !== t) return;
|
|
60
|
+
f((e) => {
|
|
58
61
|
let t = new Set(e.map(({ id: e }) => e));
|
|
59
62
|
return [...e, ...r.items.filter(({ id: e }) => t.has(e) ? !1 : (t.add(e), !0))];
|
|
60
|
-
}),
|
|
63
|
+
}), A.current = n + r.items.length, E(r.next != null);
|
|
61
64
|
} catch (e) {
|
|
62
|
-
|
|
65
|
+
k.current === t && w(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more scheduled tasks"));
|
|
63
66
|
} finally {
|
|
64
|
-
|
|
67
|
+
k.current === t && (b(!1), j.current = !1, M.current = null);
|
|
65
68
|
}
|
|
66
69
|
})();
|
|
67
70
|
}, [
|
|
68
71
|
i,
|
|
69
|
-
|
|
72
|
+
N,
|
|
70
73
|
a,
|
|
71
|
-
|
|
72
|
-
|
|
74
|
+
T,
|
|
75
|
+
_,
|
|
76
|
+
u,
|
|
73
77
|
o,
|
|
74
|
-
|
|
78
|
+
h
|
|
75
79
|
]);
|
|
76
80
|
return {
|
|
77
|
-
items:
|
|
78
|
-
searchQuery:
|
|
79
|
-
setSearchQuery:
|
|
80
|
-
sortKey:
|
|
81
|
-
setSortKey:
|
|
82
|
-
isLoading:
|
|
83
|
-
isLoadingMore:
|
|
84
|
-
initialError:
|
|
85
|
-
loadMoreError:
|
|
86
|
-
hasMore:
|
|
87
|
-
loadMore:
|
|
88
|
-
retryLoadMore:
|
|
89
|
-
refetch: e(() =>
|
|
81
|
+
items: d,
|
|
82
|
+
searchQuery: p,
|
|
83
|
+
setSearchQuery: m,
|
|
84
|
+
sortKey: h,
|
|
85
|
+
setSortKey: g,
|
|
86
|
+
isLoading: _,
|
|
87
|
+
isLoadingMore: y,
|
|
88
|
+
initialError: x,
|
|
89
|
+
loadMoreError: C,
|
|
90
|
+
hasMore: T,
|
|
91
|
+
loadMore: F,
|
|
92
|
+
retryLoadMore: F,
|
|
93
|
+
refetch: e(() => O((e) => e + 1), [])
|
|
90
94
|
};
|
|
91
95
|
};
|
|
92
96
|
//#endregion
|
package/scheduled-tasks.d.ts
CHANGED
|
@@ -25,6 +25,8 @@ export declare const createScheduledTasksApiClient: (client: ScheduledTasksConfi
|
|
|
25
25
|
* Unsupported constraints remain Custom, with the full source expression.
|
|
26
26
|
* Calendar-month shifts crossing month boundaries or days 29–31 remain
|
|
27
27
|
* Custom because a shifted monthly day is not equivalent around short months.
|
|
28
|
+
* The one exception is `day: 'last'` one day behind local time, which is
|
|
29
|
+
* exactly the local 1st.
|
|
28
30
|
*/
|
|
29
31
|
export declare const describeScheduledTaskTrigger: (trigger: ScheduleTriggerDto, { timeZone, referenceDate, }?: ScheduledTaskTriggerDescriptionOptions) => ScheduledTaskTriggerDescription;
|
|
30
32
|
|
|
@@ -38,9 +40,8 @@ export declare const describeScheduledTaskTrigger: (trigger: ScheduleTriggerDto,
|
|
|
38
40
|
export declare const mapFormValuesToCreateBody: (values: ScheduledTaskCreateFormValues) => CreateScheduledTaskBodyDto;
|
|
39
41
|
|
|
40
42
|
/**
|
|
41
|
-
* Maps validated edit
|
|
42
|
-
*
|
|
43
|
-
* `CreateScheduledTaskBodyDto`, so this reuses the same trigger-building logic.
|
|
43
|
+
* Maps a complete, validated edit draft to an update body. An unset skill
|
|
44
|
+
* emits null to remove the saved reference; hydrate from detail before editing.
|
|
44
45
|
*/
|
|
45
46
|
export declare const mapFormValuesToUpdateBody: (values: ScheduledTaskCreateFormValues) => UpdateScheduledTaskBodyDto;
|
|
46
47
|
|
|
@@ -54,6 +55,15 @@ export declare const mapFormValuesToUpdateBody: (values: ScheduledTaskCreateForm
|
|
|
54
55
|
*/
|
|
55
56
|
export declare const mapScheduledTaskDtoToFormValues: (dto: ScheduledTaskDto) => ScheduledTaskDtoMappingResult;
|
|
56
57
|
|
|
58
|
+
/**
|
|
59
|
+
* Merges a freshly-fetched page 0 into the currently-loaded run list: an
|
|
60
|
+
* already-known id is replaced in place at its existing array position, an
|
|
61
|
+
* unseen id is prepended (upstream order is `created_at desc`, so it is the
|
|
62
|
+
* newest), and an id absent from `incoming` is left untouched — a background
|
|
63
|
+
* refresh never removes a loaded run.
|
|
64
|
+
*/
|
|
65
|
+
export declare const mergeRunsById: (current: ScheduledTaskRunDto[], incoming: ScheduledTaskRunDto[]) => ScheduledTaskRunDto[];
|
|
66
|
+
|
|
57
67
|
/**
|
|
58
68
|
* Validates form values before creating a request body. Hosts translate the
|
|
59
69
|
* returned field codes and must not issue a write when `ok` is false.
|
|
@@ -106,6 +116,7 @@ export declare interface ScheduledTasksConfiguredClient {
|
|
|
106
116
|
offset?: number;
|
|
107
117
|
search?: string;
|
|
108
118
|
sort?: ListScheduledTasksSortEnum;
|
|
119
|
+
model?: string;
|
|
109
120
|
}, options?: RequestInit) => Promise<ListScheduledTasksResponseDto>;
|
|
110
121
|
listScheduledTaskRuns: (request: {
|
|
111
122
|
scheduleId: string;
|
|
@@ -139,6 +150,8 @@ export declare interface ScheduledTasksListRequest {
|
|
|
139
150
|
offset?: number;
|
|
140
151
|
search?: string;
|
|
141
152
|
sort?: ListScheduledTasksSortEnum;
|
|
153
|
+
/** Only tasks that run against this model/application id, exactly as stored. */
|
|
154
|
+
model?: string;
|
|
142
155
|
signal?: AbortSignal;
|
|
143
156
|
}
|
|
144
157
|
|
|
@@ -182,8 +195,8 @@ export declare enum UnsupportedTriggerReason {
|
|
|
182
195
|
MissingRequiredFields = "missingRequiredFields"
|
|
183
196
|
}
|
|
184
197
|
|
|
185
|
-
/** Shared, cancellation-safe pagination for one schedule's run history. */
|
|
186
|
-
export declare const useScheduledTaskRuns: (client: ScheduledTasksApiClient, { scheduleId, enabled, pageSize }: UseScheduledTaskRunsOptions) => {
|
|
198
|
+
/** Shared, cancellation-safe pagination and background refresh for one schedule's run history. */
|
|
199
|
+
export declare const useScheduledTaskRuns: (client: ScheduledTasksApiClient, { scheduleId, enabled, pageSize, nextRunTime, }: UseScheduledTaskRunsOptions) => {
|
|
187
200
|
items: ScheduledTaskRunDto[];
|
|
188
201
|
isLoading: boolean;
|
|
189
202
|
isLoadingMore: boolean;
|
|
@@ -199,10 +212,16 @@ export declare interface UseScheduledTaskRunsOptions {
|
|
|
199
212
|
scheduleId: string;
|
|
200
213
|
enabled?: boolean;
|
|
201
214
|
pageSize?: number;
|
|
215
|
+
/**
|
|
216
|
+
* The task's next scheduled run time (ISO string), when known. Drives the
|
|
217
|
+
* one-shot background refresh described on {@link useScheduledTaskRuns}.
|
|
218
|
+
* The caller already holds the task DTO — this hook never fetches it.
|
|
219
|
+
*/
|
|
220
|
+
nextRunTime?: string | null;
|
|
202
221
|
}
|
|
203
222
|
|
|
204
223
|
/** Shared scheduler-list lifecycle with generation-scoped stale-response guards. */
|
|
205
|
-
export declare const useScheduledTasks: (client: ScheduledTasksApiClient, { enabled, pageSize, debounceMs, initialSearch, initialSort, }?: UseScheduledTasksOptions) => {
|
|
224
|
+
export declare const useScheduledTasks: (client: ScheduledTasksApiClient, { enabled, pageSize, debounceMs, initialSearch, initialSort, model, }?: UseScheduledTasksOptions) => {
|
|
206
225
|
items: ScheduledTaskDto[];
|
|
207
226
|
searchQuery: string;
|
|
208
227
|
setSearchQuery: Dispatch<SetStateAction<string>>;
|
|
@@ -224,6 +243,8 @@ export declare interface UseScheduledTasksOptions {
|
|
|
224
243
|
debounceMs?: number;
|
|
225
244
|
initialSearch?: string;
|
|
226
245
|
initialSort?: ListScheduledTasksSortEnum;
|
|
246
|
+
/** Restricts the list to tasks of one model/application; changing it reloads from the first page. */
|
|
247
|
+
model?: string;
|
|
227
248
|
}
|
|
228
249
|
|
|
229
250
|
export { }
|
package/scheduled-tasks.js
CHANGED
|
@@ -4,5 +4,5 @@ import { mapFormValuesToCreateBody as r, mapFormValuesToUpdateBody as i, mapSche
|
|
|
4
4
|
import { prepareScheduledTaskCreateBody as o, prepareScheduledTaskUpdateBody as s } from "./scheduled-task/scheduled-task-preparation.js";
|
|
5
5
|
import { createScheduledTasksApiClient as c } from "./scheduled-task/scheduled-tasks-api-client.js";
|
|
6
6
|
import { useScheduledTasks as l } from "./scheduled-task/use-scheduled-tasks.js";
|
|
7
|
-
import {
|
|
8
|
-
export { t as ScheduledTaskTriggerDescriptionKind, e as UnsupportedTriggerReason, c as createScheduledTasksApiClient, n as describeScheduledTaskTrigger, r as mapFormValuesToCreateBody, i as mapFormValuesToUpdateBody, a as mapScheduledTaskDtoToFormValues, o as prepareScheduledTaskCreateBody, s as prepareScheduledTaskUpdateBody,
|
|
7
|
+
import { mergeRunsById as u, useScheduledTaskRuns as d } from "./scheduled-task/use-scheduled-task-runs.js";
|
|
8
|
+
export { t as ScheduledTaskTriggerDescriptionKind, e as UnsupportedTriggerReason, c as createScheduledTasksApiClient, n as describeScheduledTaskTrigger, r as mapFormValuesToCreateBody, i as mapFormValuesToUpdateBody, a as mapScheduledTaskDtoToFormValues, u as mergeRunsById, o as prepareScheduledTaskCreateBody, s as prepareScheduledTaskUpdateBody, d as useScheduledTaskRuns, l as useScheduledTasks };
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
//#region src/shared/application-schema.ts
|
|
2
|
-
var e = "custom_app", t = (t) => !!t && t.id === e, n = (e) => !!e && (!!e.id?.endsWith("quickapps2") || e.displayName === "Quick app 2.0")
|
|
2
|
+
var e = "custom_app", t = (t) => !!t && t.id === e, n = (e) => !!e && (!!e.id?.endsWith("quickapps2") || e.displayName === "Quick app 2.0"), r = (e) => {
|
|
3
|
+
let n = /* @__PURE__ */ new Set();
|
|
4
|
+
return e.filter((e) => !e.id || t(e) || n.has(e.id) ? !1 : (n.add(e.id), !0));
|
|
5
|
+
};
|
|
3
6
|
//#endregion
|
|
4
|
-
export { t as isCustomAppSchema, n as isQuickAppSchema };
|
|
7
|
+
export { r as getRunnerSchemas, t as isCustomAppSchema, n as isQuickAppSchema };
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region src/shared/cron-day-of-month.ts
|
|
2
|
+
var e = "last", t = 31, n = 864e5, r = (e) => Math.round((Date.UTC(e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate()) - Date.UTC(e.getFullYear(), e.getMonth(), e.getDate())) / n), i = (n, r) => {
|
|
3
|
+
let i = n + r;
|
|
4
|
+
return i < 1 ? e : i > t ? "1" : String(i);
|
|
5
|
+
}, a = (e, n) => {
|
|
6
|
+
if (e === "last") return n === -1 ? "1" : void 0;
|
|
7
|
+
let r = Number(e);
|
|
8
|
+
if (!/^\d+$/.test(e) || r < 1 || r > t) return;
|
|
9
|
+
let i = r - n;
|
|
10
|
+
return i < 1 ? String(t) : i > t ? "1" : String(i);
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { e as CRON_LAST_DAY_OF_MONTH, r as getUtcDayShift, a as toLocalDayOfMonth, i as toUtcCronDayOfMonth };
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { SKILL_FOLDER_MARKER as e, nameFromPath as t } from "./skill.js";
|
|
2
|
+
import { inferMimeTypeFromPath as n } from "@epam/ai-dial-chat-shared";
|
|
3
|
+
import { unzipSync as r } from "fflate";
|
|
4
|
+
//#region src/skill/skill-archive.ts
|
|
5
|
+
var i = "__MACOSX/", a = ".DS_Store", o = (n) => n.endsWith("/") || n.startsWith(i) || t(n) === a || t(n) === e, s = (e) => new Promise((t, n) => {
|
|
6
|
+
let r = new FileReader();
|
|
7
|
+
r.onload = () => t(new Uint8Array(r.result)), r.onerror = () => n(r.error), r.readAsArrayBuffer(e);
|
|
8
|
+
}), c = async (e) => {
|
|
9
|
+
let i = r(await s(e));
|
|
10
|
+
return Object.entries(i).flatMap(([e, r]) => {
|
|
11
|
+
let i = e.replace(/\\/g, "/");
|
|
12
|
+
return o(i) ? [] : [{
|
|
13
|
+
path: i,
|
|
14
|
+
file: new File([r], t(i), { type: n(i) ?? "" })
|
|
15
|
+
}];
|
|
16
|
+
});
|
|
17
|
+
};
|
|
18
|
+
//#endregion
|
|
19
|
+
export { c as extractSkillArchive };
|
package/skill/skill-types.js
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
|
+
import { PUBLIC_BUCKET as e } from "@epam/ai-dial-chat-shared";
|
|
1
2
|
//#region src/skill/skill-types.ts
|
|
2
|
-
var
|
|
3
|
+
var t = /* @__PURE__ */ function(e) {
|
|
3
4
|
return e.Personal = "personal", e.SharedWithMe = "sharedWithMe", e.Public = "public", e;
|
|
4
|
-
}({}),
|
|
5
|
-
if (!e.startsWith(
|
|
6
|
-
let t = e.slice(7),
|
|
7
|
-
if (
|
|
8
|
-
let i = t.slice(0,
|
|
5
|
+
}({}), n = e, r = "skills/", i = 256 * 1024, a = 1e3, o = 10, s = (e) => {
|
|
6
|
+
if (!e.startsWith(r)) return null;
|
|
7
|
+
let t = e.slice(7), n = t.indexOf("/");
|
|
8
|
+
if (n <= 0) return null;
|
|
9
|
+
let i = t.slice(0, n), a = t.slice(n + 1);
|
|
9
10
|
return i === "" || a === "" ? null : {
|
|
10
11
|
bucket: i,
|
|
11
12
|
path: a
|
|
12
13
|
};
|
|
13
14
|
};
|
|
14
15
|
//#endregion
|
|
15
|
-
export {
|
|
16
|
+
export { n as PUBLIC_SKILL_BUCKET, o as SKILL_LISTING_MAX_PAGES, a as SKILL_LISTING_PAGE_SIZE, i as SKILL_MANIFEST_MAX_BYTES, t as SkillSource, s as parseSkillResourceUrl };
|
package/skill/skill.js
CHANGED
|
@@ -1,51 +1,74 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { ENTITY_DESCRIPTION_MAX_LENGTH as e, ENTITY_INSTRUCTIONS_MAX_LENGTH as t, ENTITY_NAME_MAX_LENGTH as n, HIDDEN_FILE as r, exceedsMaxLength as i } from "@epam/ai-dial-chat-shared";
|
|
2
|
+
import { SkillFileNodeKind as a } from "@epam/ai-dial-skill-editor";
|
|
3
|
+
import { unzipSync as o } from "fflate";
|
|
4
|
+
import { parse as s, stringify as c } from "yaml";
|
|
4
5
|
//#region src/skill/skill.ts
|
|
5
|
-
var
|
|
6
|
-
|
|
6
|
+
var l = "SKILL.md", u = 1048576, d = 16777216, f = 100, p = r, m = `/${p}`, h = (e) => e.endsWith(m) && e.length > m.length, g = (e) => e.slice(0, -m.length), _ = new Set([
|
|
7
|
+
".dial-resource",
|
|
8
|
+
".dial-folder",
|
|
9
|
+
p
|
|
10
|
+
]), v = new Set(["files", "v"]), y = /^[a-zA-Z]:/, b = /[\x00-\x1f]/, x = (e) => {
|
|
11
|
+
if (e === "" || e.startsWith("/") || y.test(e) || e.includes("\\") || b.test(e)) return !1;
|
|
7
12
|
let t = e.split("/");
|
|
8
|
-
return !(t.some((e) => e === "" || e === "." || e === "..") || t.some((e) =>
|
|
9
|
-
},
|
|
13
|
+
return !(t.some((e) => e === "" || e === "." || e === "..") || t.some((e) => _.has(e)) || v.has(t[0]));
|
|
14
|
+
}, S = (e) => e.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-/, "").replace(/-$/, ""), C = {
|
|
15
|
+
name: n,
|
|
16
|
+
description: e,
|
|
17
|
+
instructions: t
|
|
18
|
+
}, w = (e) => {
|
|
19
|
+
let t = {};
|
|
20
|
+
for (let n of Object.keys(C)) {
|
|
21
|
+
let r = C[n];
|
|
22
|
+
i(e[n].trim(), r) && (t[n] = r);
|
|
23
|
+
}
|
|
24
|
+
return t;
|
|
25
|
+
}, T = ({ name: e, description: t, instructions: n }) => `---\n${c({
|
|
10
26
|
name: e,
|
|
11
27
|
description: t
|
|
12
|
-
}).trimEnd()}\n---\n\n${n}`,
|
|
28
|
+
}).trimEnd()}\n---\n\n${n}`, E = (e, t, n, r) => `---\n${c({
|
|
13
29
|
...e,
|
|
14
30
|
name: t,
|
|
15
31
|
description: n
|
|
16
|
-
}).trimEnd()}\n---\n\n${
|
|
32
|
+
}).trimEnd()}\n---\n\n${r}`, D = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/, O = /^---[ \t]*$/, k = (e) => {
|
|
17
33
|
let t = e.replace(/^\uFEFF/, "").replace(/\r\n/g, "\n").split("\n"), n = t.findIndex((e) => e.trim() !== "");
|
|
18
|
-
return n === -1 || !
|
|
19
|
-
},
|
|
20
|
-
let t =
|
|
34
|
+
return n === -1 || !O.test(t[n]) ? !1 : t.some((e, t) => t > n && O.test(e));
|
|
35
|
+
}, A = (e) => {
|
|
36
|
+
let t = D.exec(e);
|
|
21
37
|
if (!t) throw Error("SKILL.md is missing its YAML frontmatter block");
|
|
22
|
-
let [,
|
|
38
|
+
let [, n, r] = t;
|
|
23
39
|
return {
|
|
24
|
-
frontmatter: n
|
|
25
|
-
instructions:
|
|
40
|
+
frontmatter: s(n) ?? {},
|
|
41
|
+
instructions: r.replace(/^\r?\n/, "")
|
|
26
42
|
};
|
|
27
|
-
},
|
|
28
|
-
let
|
|
29
|
-
if (
|
|
30
|
-
let
|
|
31
|
-
for (let [e,
|
|
43
|
+
}, j = (e) => {
|
|
44
|
+
let t = o(e), n = t[l];
|
|
45
|
+
if (n == null) throw Error(`Skill archive is missing a root ${l} file`);
|
|
46
|
+
let r = /* @__PURE__ */ new Map(), i = [];
|
|
47
|
+
for (let [e, n] of Object.entries(t)) if (!(e === "SKILL.md" || e.endsWith("/"))) {
|
|
48
|
+
if (h(e)) {
|
|
49
|
+
i.push(g(e));
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
e !== p && r.set(e, n);
|
|
53
|
+
}
|
|
32
54
|
return {
|
|
33
|
-
manifestText: new TextDecoder().decode(
|
|
34
|
-
files:
|
|
55
|
+
manifestText: new TextDecoder().decode(n),
|
|
56
|
+
files: r,
|
|
57
|
+
folders: i
|
|
35
58
|
};
|
|
36
|
-
},
|
|
59
|
+
}, M = (e) => {
|
|
37
60
|
let t = e.lastIndexOf("/");
|
|
38
61
|
return t === -1 ? e : e.slice(t + 1);
|
|
39
|
-
},
|
|
62
|
+
}, N = (e) => new Blob([new Uint8Array(e)]), P = (e, t, n, r) => Object.keys(e).length > 0 ? E(e, t, n, r) : T({
|
|
40
63
|
name: t,
|
|
41
64
|
description: n,
|
|
42
65
|
instructions: r
|
|
43
|
-
}),
|
|
44
|
-
let r =
|
|
66
|
+
}), F = (e, t) => {
|
|
67
|
+
let n = e.filter((e) => e.kind === a.File), r = e.filter((t) => t.kind === a.Folder && !e.some((e) => e.path.startsWith(`${t.path}/`))).map((e) => `${e.path}${m}`);
|
|
45
68
|
return {
|
|
46
|
-
filePaths:
|
|
47
|
-
files:
|
|
69
|
+
filePaths: [...n.map((e) => e.path), ...r],
|
|
70
|
+
files: [...n.map((e) => N(t.get(e.path)?.bytes ?? new Uint8Array())), ...r.map(() => new Blob([]))]
|
|
48
71
|
};
|
|
49
72
|
};
|
|
50
73
|
//#endregion
|
|
51
|
-
export {
|
|
74
|
+
export { u as SKILL_FILE_UPLOAD_MAX_BYTES, p as SKILL_FOLDER_MARKER, l as SKILL_MANIFEST_FILE, C as SKILL_TEXT_FIELD_MAX_LENGTHS, f as SKILL_UPLOAD_MAX_FILES, d as SKILL_UPLOAD_MAX_TOTAL_BYTES, F as buildSkillFilesPayload, T as buildSkillManifest, P as buildSkillManifestForSubmit, E as buildSkillManifestFromFrontmatter, w as getSkillFieldLengthViolations, h as isSkillFolderMarkerPath, x as isValidSkillRelativePath, M as nameFromPath, S as normalizeSkillName, A as parseSkillManifest, N as skillFileBytesToBlob, g as skillFolderMarkerParent, k as startsWithFrontmatterBlock, j as unpackSkillArchive };
|
|
@@ -19,56 +19,60 @@ var a = "SKILL.md", o = /* @__PURE__ */ function(e) {
|
|
|
19
19
|
default: return "generic";
|
|
20
20
|
}
|
|
21
21
|
}, u = (e, t) => e.toLowerCase().endsWith(".md") && e !== t, d = ({ importArchive: o, onImported: s, onError: c, manifestFileName: d = a }) => {
|
|
22
|
-
let [f, p] = i(!1), [m, h] = i("idle"), [g, _] = i(void 0), [v, y] = i(void 0), b = r(
|
|
23
|
-
n(() => (
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
let
|
|
27
|
-
|
|
22
|
+
let [f, p] = i(!1), [m, h] = i("idle"), [g, _] = i(void 0), [v, y] = i(void 0), b = r(null);
|
|
23
|
+
n(() => () => {
|
|
24
|
+
b.current?.abort(), b.current = null;
|
|
25
|
+
}, []);
|
|
26
|
+
let x = t(async (t) => {
|
|
27
|
+
let n = new AbortController();
|
|
28
|
+
b.current = n;
|
|
29
|
+
let { signal: r } = n;
|
|
30
|
+
h("uploading"), y(void 0);
|
|
28
31
|
try {
|
|
29
|
-
let e = await o(t);
|
|
30
|
-
if (
|
|
31
|
-
h("success");
|
|
32
|
+
let e = await o(t, r);
|
|
33
|
+
if (r.aborted || (await s(e), r.aborted)) return;
|
|
34
|
+
h("success"), p(!1);
|
|
32
35
|
} catch (t) {
|
|
33
|
-
if (
|
|
36
|
+
if (r.aborted) return;
|
|
34
37
|
let n = l(e(t));
|
|
35
38
|
h("error"), y(n), c(t, n);
|
|
36
39
|
} finally {
|
|
37
|
-
b.current =
|
|
40
|
+
b.current === n && (b.current = null);
|
|
38
41
|
}
|
|
39
42
|
}, [
|
|
40
43
|
o,
|
|
41
44
|
s,
|
|
42
45
|
c
|
|
43
|
-
]),
|
|
44
|
-
b.current || (_(void 0), p(!0));
|
|
46
|
+
]), S = t(() => {
|
|
47
|
+
b.current || (_(void 0), y(void 0), h("idle"), p(!0));
|
|
48
|
+
}, []), C = t(() => {
|
|
49
|
+
b.current && (b.current.abort(), b.current = null, h("idle")), p(!1), _(void 0);
|
|
45
50
|
}, []), w = t(() => {
|
|
46
|
-
|
|
47
|
-
}, []), T = t(() => {
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
b.current || (h("error"), y(void 0), _("unsupportedFilename"));
|
|
52
|
+
}, []), T = t((e) => {
|
|
53
|
+
let t = e[0];
|
|
54
|
+
if (!(!t || b.current)) {
|
|
55
|
+
if (u(t.name, d)) {
|
|
56
|
+
w();
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
_(void 0), x(t);
|
|
60
|
+
}
|
|
61
|
+
}, [
|
|
62
|
+
d,
|
|
63
|
+
w,
|
|
64
|
+
x
|
|
65
|
+
]);
|
|
50
66
|
return {
|
|
51
67
|
isDialogOpen: f,
|
|
52
68
|
status: m,
|
|
69
|
+
isUploading: m === "uploading",
|
|
53
70
|
selectionRejectionReason: g,
|
|
54
71
|
errorKind: v,
|
|
55
|
-
openDialog:
|
|
56
|
-
closeDialog:
|
|
57
|
-
handleFilesSelected:
|
|
58
|
-
|
|
59
|
-
if (!(!t || b.current)) {
|
|
60
|
-
if (u(t.name, d)) {
|
|
61
|
-
T();
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
_(void 0), p(!1), S(t);
|
|
65
|
-
}
|
|
66
|
-
}, [
|
|
67
|
-
d,
|
|
68
|
-
T,
|
|
69
|
-
S
|
|
70
|
-
]),
|
|
71
|
-
handleFilesRejected: T
|
|
72
|
+
openDialog: S,
|
|
73
|
+
closeDialog: C,
|
|
74
|
+
handleFilesSelected: T,
|
|
75
|
+
handleFilesRejected: w
|
|
72
76
|
};
|
|
73
77
|
};
|
|
74
78
|
//#endregion
|