@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
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.
|
|
4
|
+
"version": "1.3.0-dev.5",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./index.js",
|
|
@@ -111,8 +111,8 @@
|
|
|
111
111
|
}
|
|
112
112
|
},
|
|
113
113
|
"dependencies": {
|
|
114
|
-
"@epam/ai-dial-chat-api-client": "1.
|
|
115
|
-
"dompurify": "3.4.
|
|
114
|
+
"@epam/ai-dial-chat-api-client": "1.3.0-dev.5",
|
|
115
|
+
"dompurify": "3.4.16",
|
|
116
116
|
"fflate": "^0.8.3",
|
|
117
117
|
"lru-cache": "^10.4.3",
|
|
118
118
|
"mime-types": "^3.0.2",
|
|
@@ -120,23 +120,22 @@
|
|
|
120
120
|
},
|
|
121
121
|
"peerDependencies": {
|
|
122
122
|
"react": "^19.2.8",
|
|
123
|
-
"@epam/ai-dial-attachment-canvas": "1.
|
|
124
|
-
"@epam/ai-dial-attachment-input": "1.
|
|
125
|
-
"@epam/ai-dial-
|
|
126
|
-
"@epam/ai-dial-
|
|
127
|
-
"@epam/ai-dial-chat-
|
|
128
|
-
"@epam/ai-dial-
|
|
129
|
-
"@epam/ai-dial-
|
|
130
|
-
"@epam/ai-dial-
|
|
131
|
-
"@epam/ai-dial-
|
|
132
|
-
"@epam/ai-dial-
|
|
133
|
-
"@epam/ai-dial-
|
|
134
|
-
"@epam/ai-dial-
|
|
135
|
-
"@epam/ai-dial-
|
|
136
|
-
"@epam/ai-dial-
|
|
137
|
-
"@epam/ai-dial-
|
|
138
|
-
"@
|
|
139
|
-
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
123
|
+
"@epam/ai-dial-attachment-canvas": "1.3.0-dev.5",
|
|
124
|
+
"@epam/ai-dial-attachment-input": "1.3.0-dev.5",
|
|
125
|
+
"@epam/ai-dial-catalog": "1.3.0-dev.5",
|
|
126
|
+
"@epam/ai-dial-chat-overlay": "1.3.0-dev.5",
|
|
127
|
+
"@epam/ai-dial-chat-shared": "1.3.0-dev.5",
|
|
128
|
+
"@epam/ai-dial-mcp-apps": "1.3.0-dev.5",
|
|
129
|
+
"@epam/ai-dial-publish-panel": "1.3.0-dev.5",
|
|
130
|
+
"@epam/ai-dial-quotations": "1.3.0-dev.5",
|
|
131
|
+
"@epam/ai-dial-react-file-manager": "^0.3.0",
|
|
132
|
+
"@epam/ai-dial-scheduled-tasks": "1.3.0-dev.5",
|
|
133
|
+
"@epam/ai-dial-share": "1.3.0-dev.5",
|
|
134
|
+
"@epam/ai-dial-skill-editor": "1.3.0-dev.5",
|
|
135
|
+
"@epam/ai-dial-source-panel": "1.3.0-dev.5",
|
|
136
|
+
"@epam/ai-dial-ui-kit": "^0.15.0",
|
|
137
|
+
"@epam/ai-dial-usage-dashboard": "1.3.0-dev.5",
|
|
138
|
+
"@modelcontextprotocol/sdk": "^1.32.1",
|
|
140
139
|
"@epam/pdf-highlighter-kit": "^0.0.19",
|
|
141
140
|
"@mcp-ui/client": "^7.1.1"
|
|
142
141
|
},
|
|
@@ -147,9 +146,6 @@
|
|
|
147
146
|
"@epam/ai-dial-attachment-input": {
|
|
148
147
|
"optional": true
|
|
149
148
|
},
|
|
150
|
-
"@epam/ai-dial-builder-form": {
|
|
151
|
-
"optional": true
|
|
152
|
-
},
|
|
153
149
|
"@epam/ai-dial-catalog": {
|
|
154
150
|
"optional": true
|
|
155
151
|
},
|
|
@@ -1,20 +1,21 @@
|
|
|
1
|
+
import { CRON_LAST_DAY_OF_MONTH as e } from "../shared/cron-day-of-month.js";
|
|
1
2
|
//#region src/scheduled-task/scheduled-task-description.ts
|
|
2
|
-
var
|
|
3
|
+
var t = /* @__PURE__ */ function(e) {
|
|
3
4
|
return e.OneTime = "oneTime", e.Hourly = "hourly", e.EveryNMinutes = "everyNMinutes", e.Daily = "daily", e.Weekly = "weekly", e.Monthly = "monthly", e.Custom = "custom", e.Invalid = "invalid", e;
|
|
4
|
-
}({}),
|
|
5
|
-
let
|
|
5
|
+
}({}), n = (t, { timeZone: n = "UTC", referenceDate: r = /* @__PURE__ */ new Date() } = {}) => {
|
|
6
|
+
let i = (e, t = {}) => ({
|
|
6
7
|
kind: e,
|
|
7
8
|
sourceTimezone: "utc",
|
|
8
9
|
...t
|
|
9
10
|
});
|
|
10
|
-
if (
|
|
11
|
-
if (
|
|
12
|
-
let
|
|
13
|
-
return Number.isNaN(
|
|
11
|
+
if (t.date && t.cron) return i("invalid");
|
|
12
|
+
if (t.date) {
|
|
13
|
+
let e = new Date(t.date);
|
|
14
|
+
return Number.isNaN(e.getTime()) ? i("invalid") : i("oneTime", { date: e });
|
|
14
15
|
}
|
|
15
|
-
let
|
|
16
|
-
if (!
|
|
17
|
-
let
|
|
16
|
+
let a = t.cron?.fields;
|
|
17
|
+
if (!a || Object.keys(a).length === 0) return i("invalid");
|
|
18
|
+
let o = () => i("custom", { expression: JSON.stringify(a) }), s = {
|
|
18
19
|
hour: [0, 23],
|
|
19
20
|
minute: [0, 59],
|
|
20
21
|
day: [1, 31],
|
|
@@ -22,19 +23,19 @@ var e = /* @__PURE__ */ function(e) {
|
|
|
22
23
|
month: [1, 12],
|
|
23
24
|
second: [0, 59]
|
|
24
25
|
};
|
|
25
|
-
for (let [e, t] of Object.entries(
|
|
26
|
+
for (let [e, t] of Object.entries(a)) {
|
|
26
27
|
if (t == null) continue;
|
|
27
|
-
if (!t.trim()) return
|
|
28
|
-
let n =
|
|
29
|
-
if (n && /^-?\d+$/.test(t) && (Number(t) < n[0] || Number(t) > n[1])) return
|
|
28
|
+
if (!t.trim()) return i("invalid");
|
|
29
|
+
let n = s[e];
|
|
30
|
+
if (n && /^-?\d+$/.test(t) && (Number(t) < n[0] || Number(t) > n[1])) return i("invalid");
|
|
30
31
|
if (e === "second" && t !== "0" || ![
|
|
31
32
|
"hour",
|
|
32
33
|
"minute",
|
|
33
34
|
"day",
|
|
34
35
|
"day_of_week"
|
|
35
|
-
].includes(e) && t !== "*" && !(e === "second" && t === "0")) return
|
|
36
|
+
].includes(e) && t !== "*" && !(e === "second" && t === "0")) return o();
|
|
36
37
|
}
|
|
37
|
-
let
|
|
38
|
+
let c = a.hour, l = a.minute, u = a.day === "*" ? void 0 : a.day, d = u === e, f = a.day_of_week === "*" ? void 0 : a.day_of_week, p = f ? [
|
|
38
39
|
"monday",
|
|
39
40
|
"tuesday",
|
|
40
41
|
"wednesday",
|
|
@@ -42,36 +43,39 @@ var e = /* @__PURE__ */ function(e) {
|
|
|
42
43
|
"friday",
|
|
43
44
|
"saturday",
|
|
44
45
|
"sunday"
|
|
45
|
-
].findIndex((e) => e ===
|
|
46
|
-
if (
|
|
47
|
-
let
|
|
48
|
-
if (
|
|
49
|
-
let e = Number(
|
|
50
|
-
return e > 0 && e <= 59 ?
|
|
46
|
+
].findIndex((e) => e === f.toLowerCase() || e.slice(0, 3) === f.toLowerCase()) : -1, m = p >= 0 ? String(p) : f;
|
|
47
|
+
if (u && m || u && !d && !/^\d+$/.test(u) || m && !/^\d+$/.test(m)) return o();
|
|
48
|
+
let h = c == null || c === "*", g = l?.match(/^\*\/(\d+)$/);
|
|
49
|
+
if (h && g && !u && !m) {
|
|
50
|
+
let e = Number(g[1]);
|
|
51
|
+
return e > 0 && e <= 59 ? i("everyNMinutes", { intervalMinutes: e }) : i("invalid");
|
|
51
52
|
}
|
|
52
|
-
if (!
|
|
53
|
-
let
|
|
54
|
-
if (Number.isNaN(
|
|
55
|
-
if (
|
|
56
|
-
let e = (Number(
|
|
57
|
-
|
|
53
|
+
if (!l || !/^\d+$/.test(l) || !h && !/^\d+$/.test(c) || h && (u || m)) return o();
|
|
54
|
+
let _ = new Date(r);
|
|
55
|
+
if (Number.isNaN(_.getTime())) return i("invalid");
|
|
56
|
+
if (_.setUTCHours(h ? 0 : Number(c), Number(l), 0, 0), m) {
|
|
57
|
+
let e = (Number(m) + 1) % 7;
|
|
58
|
+
_.setUTCDate(_.getUTCDate() + (e - _.getUTCDay() + 7) % 7);
|
|
58
59
|
}
|
|
59
|
-
let
|
|
60
|
-
timeZone:
|
|
60
|
+
let v = new Intl.DateTimeFormat("en-GB", {
|
|
61
|
+
timeZone: n,
|
|
61
62
|
hourCycle: "h23",
|
|
62
63
|
year: "numeric",
|
|
63
64
|
month: "2-digit",
|
|
64
65
|
day: "2-digit",
|
|
65
66
|
hour: "2-digit",
|
|
66
67
|
minute: "2-digit"
|
|
67
|
-
}).formatToParts(
|
|
68
|
-
return
|
|
69
|
-
time:
|
|
70
|
-
dayOfWeek: String((Number(
|
|
71
|
-
}) :
|
|
72
|
-
time:
|
|
73
|
-
dayOfMonth:
|
|
74
|
-
}) :
|
|
68
|
+
}).formatToParts(_), y = (e) => v.find((t) => t.type === e)?.value ?? "", b = new Date(Date.UTC(Number(y("year")), Number(y("month")) - 1, Number(y("day")))), x = Date.UTC(_.getUTCFullYear(), _.getUTCMonth(), _.getUTCDate()), S = Math.round((b.getTime() - x) / 864e5), C = y("hour") + ":" + y("minute");
|
|
69
|
+
return h ? i("hourly", { time: y("minute") }) : m ? i("weekly", {
|
|
70
|
+
time: C,
|
|
71
|
+
dayOfWeek: String((Number(m) + S + 7) % 7)
|
|
72
|
+
}) : d ? S === 1 ? i("monthly", {
|
|
73
|
+
time: C,
|
|
74
|
+
dayOfMonth: "1"
|
|
75
|
+
}) : o() : u ? S === 0 || Number(u) <= 28 && Number(u) + S >= 1 && Number(u) + S <= 28 ? i("monthly", {
|
|
76
|
+
time: C,
|
|
77
|
+
dayOfMonth: String(Number(u) + S)
|
|
78
|
+
}) : o() : i("daily", { time: C });
|
|
75
79
|
};
|
|
76
80
|
//#endregion
|
|
77
|
-
export {
|
|
81
|
+
export { t as ScheduledTaskTriggerDescriptionKind, n as describeScheduledTaskTrigger };
|
|
@@ -1,59 +1,64 @@
|
|
|
1
1
|
import { padTwoDigits as e } from "../shared/formatting.js";
|
|
2
2
|
import { UnsupportedTriggerReason as t } from "./scheduled-task-mapping.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { getUtcDayShift as n, toLocalDayOfMonth as r, toUtcCronDayOfMonth as i } from "../shared/cron-day-of-month.js";
|
|
4
|
+
import { apSchedulerDayToJsDay as a, jsDayToApSchedulerDay as o } from "../shared/cron-weekday.js";
|
|
5
|
+
import { ScheduledTaskRepeat as s } from "@epam/ai-dial-scheduled-tasks";
|
|
5
6
|
//#region src/scheduled-task/scheduled-task-trigger.ts
|
|
6
|
-
var
|
|
7
|
+
var c = new Set([
|
|
7
8
|
"hour",
|
|
8
9
|
"minute",
|
|
9
10
|
"day_of_week",
|
|
10
11
|
"day"
|
|
11
|
-
]),
|
|
12
|
-
if (e.repeat ===
|
|
12
|
+
]), l = "09:00", u = (e) => {
|
|
13
|
+
if (e.repeat === s.Hourly) {
|
|
13
14
|
let t = /* @__PURE__ */ new Date();
|
|
14
15
|
return t.setHours(0, Number(e.minute), 0, 0), {
|
|
15
16
|
hour: "*",
|
|
16
17
|
minute: String(t.getUTCMinutes())
|
|
17
18
|
};
|
|
18
19
|
}
|
|
19
|
-
let [t,
|
|
20
|
-
|
|
21
|
-
let
|
|
22
|
-
if (
|
|
23
|
-
let t = (
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
let
|
|
27
|
-
hour: String(
|
|
28
|
-
minute: String(
|
|
20
|
+
let [t, r] = e.time.split(":"), c = Number(t), l = Number(r), u = /* @__PURE__ */ new Date();
|
|
21
|
+
u.setHours(c, l, 0, 0);
|
|
22
|
+
let d = e.repeat === s.Weekly && !!e.dayOfWeek, f = e.repeat === s.Monthly && !!e.dayOfMonth;
|
|
23
|
+
if (d) {
|
|
24
|
+
let t = (a(Number(e.dayOfWeek)) - u.getDay() + 7) % 7;
|
|
25
|
+
u.setDate(u.getDate() + t);
|
|
26
|
+
}
|
|
27
|
+
let p = {
|
|
28
|
+
hour: String(u.getUTCHours()),
|
|
29
|
+
minute: String(u.getUTCMinutes())
|
|
29
30
|
};
|
|
30
|
-
return
|
|
31
|
-
},
|
|
31
|
+
return d && (p.day_of_week = String(o(u.getUTCDay()))), f && (p.day = i(Number(e.dayOfMonth), n(u))), p;
|
|
32
|
+
}, d = (e, t) => {
|
|
32
33
|
let [n, r, i] = e.split("-").map(Number), a = new Date(n, r - 1, i);
|
|
33
34
|
return t === "start" ? a.setHours(0, 0, 0, 0) : a.setHours(23, 59, 59, 999), a.toISOString();
|
|
34
|
-
},
|
|
35
|
-
let t = e.repeat ===
|
|
36
|
-
fields:
|
|
37
|
-
...e.startDate ? { startDate:
|
|
38
|
-
...e.endDate ? { endDate:
|
|
35
|
+
}, f = (e) => {
|
|
36
|
+
let t = e.repeat === s.OneTime ? { date: new Date(e.runAt ?? "").toISOString() } : { cron: {
|
|
37
|
+
fields: u(e),
|
|
38
|
+
...e.startDate ? { startDate: d(e.startDate, "start") } : {},
|
|
39
|
+
...e.endDate ? { endDate: d(e.endDate, "end") } : {}
|
|
39
40
|
} }, n = e.description?.trim();
|
|
40
41
|
return {
|
|
41
42
|
displayName: e.displayName.trim(),
|
|
42
43
|
trigger: t,
|
|
43
44
|
model: e.modelId,
|
|
44
45
|
prompt: e.prompt.trim(),
|
|
46
|
+
...e.skillUrls?.length ? { skillUrls: [...new Set(e.skillUrls)] } : {},
|
|
45
47
|
...n ? { description: n } : {}
|
|
46
48
|
};
|
|
47
|
-
},
|
|
49
|
+
}, p = (e) => ({
|
|
50
|
+
...f(e),
|
|
51
|
+
skillUrls: [...new Set(e.skillUrls ?? [])]
|
|
52
|
+
}), m = (t) => {
|
|
48
53
|
let n = new Date(t);
|
|
49
54
|
return `${n.getFullYear()}-${e(n.getMonth() + 1)}-${e(n.getDate())}T${e(n.getHours())}:${e(n.getMinutes())}`;
|
|
50
|
-
},
|
|
55
|
+
}, h = (t) => {
|
|
51
56
|
let n = new Date(t);
|
|
52
57
|
return `${n.getFullYear()}-${e(n.getMonth() + 1)}-${e(n.getDate())}`;
|
|
53
|
-
},
|
|
54
|
-
let i = new Set(Object.entries(t).filter(([, e]) => e != null).map(([e]) => e)),
|
|
55
|
-
if (
|
|
56
|
-
if (t.hour === "*" && /^\d+$/.test(String(t.minute)) && !
|
|
58
|
+
}, g = (t) => {
|
|
59
|
+
let i = new Set(Object.entries(t).filter(([, e]) => e != null).map(([e]) => e)), s = [...i].filter((e) => !c.has(e)), l = i.has("day_of_week"), u = i.has("day");
|
|
60
|
+
if (s.length > 0 || l && u || !i.has("hour") || !i.has("minute")) return { ok: !1 };
|
|
61
|
+
if (t.hour === "*" && /^\d+$/.test(String(t.minute)) && !l && !u) {
|
|
57
62
|
let e = /* @__PURE__ */ new Date();
|
|
58
63
|
return e.setUTCHours(0, Number(t.minute), 0, 0), {
|
|
59
64
|
ok: !0,
|
|
@@ -61,84 +66,82 @@ var a = new Set([
|
|
|
61
66
|
minute: String(e.getMinutes())
|
|
62
67
|
};
|
|
63
68
|
}
|
|
64
|
-
let
|
|
65
|
-
if (Number.isNaN(
|
|
66
|
-
let
|
|
67
|
-
if (
|
|
69
|
+
let d = Number(t.hour), f = Number(t.minute);
|
|
70
|
+
if (Number.isNaN(d) || Number.isNaN(f)) return { ok: !1 };
|
|
71
|
+
let p = /* @__PURE__ */ new Date();
|
|
72
|
+
if (p.setUTCHours(d, f, 0, 0), l) {
|
|
68
73
|
let e = Number(t.day_of_week);
|
|
69
74
|
if (Number.isNaN(e)) return { ok: !1 };
|
|
70
|
-
let
|
|
71
|
-
|
|
72
|
-
} else if (c) {
|
|
73
|
-
let e = Number(t.day);
|
|
74
|
-
if (Number.isNaN(e)) return { ok: !1 };
|
|
75
|
-
d.setUTCDate(e);
|
|
75
|
+
let n = (a(e) - p.getUTCDay() + 7) % 7;
|
|
76
|
+
p.setUTCDate(p.getUTCDate() + n);
|
|
76
77
|
}
|
|
77
|
-
|
|
78
|
+
let m = u ? r(String(t.day), n(p)) : void 0;
|
|
79
|
+
return u && !m ? { ok: !1 } : {
|
|
78
80
|
ok: !0,
|
|
79
81
|
isHourly: !1,
|
|
80
|
-
time: `${e(
|
|
81
|
-
...
|
|
82
|
-
...
|
|
82
|
+
time: `${e(p.getHours())}:${e(p.getMinutes())}`,
|
|
83
|
+
...l ? { dayOfWeek: String(o(p.getDay())) } : {},
|
|
84
|
+
...m ? { dayOfMonth: m } : {}
|
|
83
85
|
};
|
|
84
|
-
},
|
|
85
|
-
if (!e.model || !e.prompt) return {
|
|
86
|
+
}, _ = (e) => {
|
|
87
|
+
if (!e.model || typeof e.prompt != "string" || !e.prompt.trim() && !e.skillUrls?.length) return {
|
|
86
88
|
ok: !1,
|
|
87
89
|
reason: t.MissingRequiredFields
|
|
88
90
|
};
|
|
89
|
-
let { date: n, cron: r } = e.trigger,
|
|
90
|
-
if (
|
|
91
|
+
let { date: n, cron: r } = e.trigger, i = !!n;
|
|
92
|
+
if (i === !!r) return {
|
|
91
93
|
ok: !1,
|
|
92
94
|
reason: t.UnsupportedTriggerType
|
|
93
95
|
};
|
|
94
|
-
let
|
|
96
|
+
let a = {
|
|
95
97
|
displayName: e.displayName,
|
|
96
98
|
modelId: e.model,
|
|
97
99
|
prompt: e.prompt,
|
|
100
|
+
skillUrls: [...new Set(e.skillUrls ?? [])],
|
|
98
101
|
...e.description ? { description: e.description } : {}
|
|
99
102
|
};
|
|
100
|
-
if (
|
|
103
|
+
if (i) return {
|
|
101
104
|
ok: !0,
|
|
102
105
|
values: {
|
|
103
|
-
...
|
|
104
|
-
repeat:
|
|
105
|
-
runAt:
|
|
106
|
-
time:
|
|
106
|
+
...a,
|
|
107
|
+
repeat: s.OneTime,
|
|
108
|
+
runAt: m(n),
|
|
109
|
+
time: l
|
|
107
110
|
}
|
|
108
111
|
};
|
|
109
112
|
if (!r) return {
|
|
110
113
|
ok: !1,
|
|
111
114
|
reason: t.UnsupportedTriggerType
|
|
112
115
|
};
|
|
113
|
-
let
|
|
114
|
-
if (!
|
|
116
|
+
let o = g(r.fields);
|
|
117
|
+
if (!o.ok) return {
|
|
115
118
|
ok: !1,
|
|
116
119
|
reason: t.UnsupportedCronShape
|
|
117
120
|
};
|
|
118
|
-
if (
|
|
121
|
+
if (o.isHourly) return {
|
|
119
122
|
ok: !0,
|
|
120
123
|
values: {
|
|
121
|
-
...
|
|
122
|
-
repeat:
|
|
123
|
-
time:
|
|
124
|
-
minute:
|
|
125
|
-
...r.startDate ? { startDate:
|
|
126
|
-
...r.endDate ? { endDate:
|
|
124
|
+
...a,
|
|
125
|
+
repeat: s.Hourly,
|
|
126
|
+
time: l,
|
|
127
|
+
minute: o.minute,
|
|
128
|
+
...r.startDate ? { startDate: h(r.startDate) } : {},
|
|
129
|
+
...r.endDate ? { endDate: h(r.endDate) } : {}
|
|
127
130
|
}
|
|
128
131
|
};
|
|
129
|
-
let
|
|
130
|
-
return
|
|
132
|
+
let c = s.Daily;
|
|
133
|
+
return o.dayOfWeek ? c = s.Weekly : o.dayOfMonth && (c = s.Monthly), {
|
|
131
134
|
ok: !0,
|
|
132
135
|
values: {
|
|
133
|
-
...
|
|
134
|
-
repeat:
|
|
135
|
-
time:
|
|
136
|
-
...
|
|
137
|
-
...
|
|
138
|
-
...r.startDate ? { startDate:
|
|
139
|
-
...r.endDate ? { endDate:
|
|
136
|
+
...a,
|
|
137
|
+
repeat: c,
|
|
138
|
+
time: o.time,
|
|
139
|
+
...o.dayOfWeek ? { dayOfWeek: o.dayOfWeek } : {},
|
|
140
|
+
...o.dayOfMonth ? { dayOfMonth: o.dayOfMonth } : {},
|
|
141
|
+
...r.startDate ? { startDate: h(r.startDate) } : {},
|
|
142
|
+
...r.endDate ? { endDate: h(r.endDate) } : {}
|
|
140
143
|
}
|
|
141
144
|
};
|
|
142
145
|
};
|
|
143
146
|
//#endregion
|
|
144
|
-
export {
|
|
147
|
+
export { f as mapFormValuesToCreateBody, p as mapFormValuesToUpdateBody, _ as mapScheduledTaskDtoToFormValues };
|
|
@@ -1,82 +1,194 @@
|
|
|
1
1
|
import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
|
|
2
|
+
import { ScheduledTaskRunDtoStatusEnum as i } from "@epam/ai-dial-chat-api-client";
|
|
2
3
|
//#region src/scheduled-task/use-scheduled-task-runs.ts
|
|
3
|
-
var
|
|
4
|
-
|
|
4
|
+
var a = 15e3, o = 20, s = 5e3, c = 2147483647, l = (e, t) => {
|
|
5
|
+
if (e <= c) {
|
|
6
|
+
let n = setTimeout(t, Math.max(e, 0));
|
|
7
|
+
return () => clearTimeout(n);
|
|
8
|
+
}
|
|
9
|
+
let n, r = setTimeout(() => {
|
|
10
|
+
n = l(e - c, t);
|
|
11
|
+
}, c);
|
|
12
|
+
return n = () => clearTimeout(r), () => n();
|
|
13
|
+
}, u = (e, t) => {
|
|
14
|
+
let n = new Map(t.map((e) => [e.id, e])), r = new Set(e.map((e) => e.id)), i = e.map((e) => n.get(e.id) ?? e);
|
|
15
|
+
return [...t.filter((e) => !r.has(e.id)), ...i];
|
|
16
|
+
}, d = (e, t) => {
|
|
17
|
+
if (e.length !== t.length) return !0;
|
|
18
|
+
let n = new Map(e.map((e) => [e.id, e]));
|
|
19
|
+
return t.some((e) => {
|
|
20
|
+
let t = n.get(e.id);
|
|
21
|
+
return !t || JSON.stringify(t) !== JSON.stringify(e);
|
|
22
|
+
});
|
|
23
|
+
}, f = (c, { scheduleId: f, enabled: p = !0, pageSize: m = 10, nextRunTime: h }) => {
|
|
24
|
+
let [g, _] = r([]), [v, y] = r(p), [b, x] = r(!1), [S, C] = r(null), [w, T] = r(null), [E, D] = r(!1), [O, k] = r(0), A = n(0), j = n(0), M = n(!1), N = n(null), P = n(g), F = n(v), I = n(b), L = n(null), R = n(0), z = n(null), B = n(!1);
|
|
25
|
+
P.current = g, F.current = v, I.current = b;
|
|
26
|
+
let V = g.some((e) => e.status === i.InProgress);
|
|
5
27
|
t(() => {
|
|
6
|
-
let e = ++
|
|
7
|
-
|
|
28
|
+
let e = ++A.current, t = new AbortController();
|
|
29
|
+
N.current?.abort(), N.current = null, L.current?.abort(), L.current = null, M.current = !1, R.current = 0, z.current = null, B.current = !1, x(!1), C(null), T(null), _([]), D(!1), j.current = 0;
|
|
8
30
|
let n = () => {
|
|
9
|
-
++
|
|
31
|
+
++A.current, t.abort(), N.current?.abort(), N.current = null, L.current?.abort(), L.current = null;
|
|
10
32
|
};
|
|
11
|
-
return !
|
|
12
|
-
|
|
33
|
+
return !p || !f ? (y(!1), _([]), D(!1), n) : ((async () => {
|
|
34
|
+
y(!0);
|
|
13
35
|
try {
|
|
14
|
-
let n = await
|
|
15
|
-
scheduleId:
|
|
16
|
-
limit:
|
|
36
|
+
let n = await c.listScheduledTaskRuns({
|
|
37
|
+
scheduleId: f,
|
|
38
|
+
limit: m,
|
|
17
39
|
offset: 0,
|
|
18
40
|
signal: t.signal
|
|
19
41
|
});
|
|
20
|
-
if (
|
|
21
|
-
|
|
42
|
+
if (A.current !== e) return;
|
|
43
|
+
_(n.items), j.current = n.items.length, D(n.next != null || (n.count == null ? n.items.length === m : n.items.length < n.count));
|
|
22
44
|
} catch (t) {
|
|
23
|
-
|
|
45
|
+
A.current === e && C(t instanceof Error ? t : /* @__PURE__ */ Error("Failed to load scheduled task runs"));
|
|
24
46
|
} finally {
|
|
25
|
-
|
|
47
|
+
A.current === e && y(!1);
|
|
26
48
|
}
|
|
27
49
|
})(), n);
|
|
28
50
|
}, [
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
51
|
+
c,
|
|
52
|
+
p,
|
|
53
|
+
m,
|
|
54
|
+
O,
|
|
55
|
+
f
|
|
34
56
|
]);
|
|
35
|
-
let
|
|
36
|
-
if (!
|
|
37
|
-
|
|
57
|
+
let H = e(() => {
|
|
58
|
+
if (!p || !f || !E || v || M.current) return;
|
|
59
|
+
M.current = !0;
|
|
38
60
|
let e = new AbortController();
|
|
39
|
-
|
|
40
|
-
let t =
|
|
61
|
+
N.current = e;
|
|
62
|
+
let t = A.current, n = j.current;
|
|
41
63
|
(async () => {
|
|
42
|
-
|
|
64
|
+
x(!0), T(null);
|
|
43
65
|
try {
|
|
44
|
-
let r = await
|
|
45
|
-
scheduleId:
|
|
46
|
-
limit:
|
|
66
|
+
let r = await c.listScheduledTaskRuns({
|
|
67
|
+
scheduleId: f,
|
|
68
|
+
limit: m,
|
|
47
69
|
offset: n,
|
|
48
70
|
signal: e.signal
|
|
49
71
|
});
|
|
50
|
-
if (
|
|
51
|
-
|
|
72
|
+
if (A.current !== t) return;
|
|
73
|
+
_((e) => {
|
|
52
74
|
let t = new Set(e.map(({ id: e }) => e));
|
|
53
75
|
return [...e, ...r.items.filter(({ id: e }) => t.has(e) ? !1 : (t.add(e), !0))];
|
|
54
|
-
}),
|
|
76
|
+
}), j.current = n + r.items.length, D(r.next != null || (r.count == null ? r.items.length === m : n + r.items.length < r.count));
|
|
55
77
|
} catch (e) {
|
|
56
|
-
|
|
78
|
+
A.current === t && T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more scheduled task runs"));
|
|
57
79
|
} finally {
|
|
58
|
-
|
|
80
|
+
A.current === t && (x(!1), M.current = !1, N.current = null);
|
|
59
81
|
}
|
|
60
82
|
})();
|
|
61
83
|
}, [
|
|
62
|
-
|
|
63
|
-
|
|
84
|
+
c,
|
|
85
|
+
p,
|
|
86
|
+
E,
|
|
64
87
|
v,
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
88
|
+
m,
|
|
89
|
+
f
|
|
90
|
+
]), U = e(async () => {
|
|
91
|
+
if (F.current || I.current) return "skipped";
|
|
92
|
+
let e = A.current, t = new AbortController();
|
|
93
|
+
L.current?.abort(), L.current = t;
|
|
94
|
+
try {
|
|
95
|
+
let n = await c.listScheduledTaskRuns({
|
|
96
|
+
scheduleId: f,
|
|
97
|
+
limit: m,
|
|
98
|
+
offset: 0,
|
|
99
|
+
signal: t.signal
|
|
100
|
+
});
|
|
101
|
+
if (A.current !== e || F.current || I.current) return "skipped";
|
|
102
|
+
let r = P.current, i = u(r, n.items), a = d(r, i);
|
|
103
|
+
return a && (P.current = i, _(i)), a ? "changed" : "unchanged";
|
|
104
|
+
} catch {
|
|
105
|
+
return "error";
|
|
106
|
+
} finally {
|
|
107
|
+
L.current === t && (L.current = null);
|
|
108
|
+
}
|
|
109
|
+
}, [
|
|
110
|
+
c,
|
|
111
|
+
f,
|
|
112
|
+
m
|
|
113
|
+
]), W = e(() => {
|
|
114
|
+
if (document.visibilityState !== "visible") {
|
|
115
|
+
B.current = !0;
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
U();
|
|
119
|
+
}, [U]);
|
|
120
|
+
return t(() => {
|
|
121
|
+
if (!p || !f || !V) return;
|
|
122
|
+
R.current = 0;
|
|
123
|
+
let e = setInterval(() => {
|
|
124
|
+
if (document.visibilityState !== "visible") {
|
|
125
|
+
B.current = !0;
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
(async () => {
|
|
129
|
+
let t = await U();
|
|
130
|
+
if (t === "changed") {
|
|
131
|
+
R.current = 0;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
(t === "unchanged" || t === "error") && (R.current += 1, R.current >= o && e !== null && (clearInterval(e), e = null));
|
|
135
|
+
})();
|
|
136
|
+
}, a);
|
|
137
|
+
return () => {
|
|
138
|
+
e !== null && clearInterval(e);
|
|
139
|
+
};
|
|
140
|
+
}, [
|
|
141
|
+
p,
|
|
142
|
+
f,
|
|
143
|
+
V,
|
|
144
|
+
U
|
|
145
|
+
]), t(() => {
|
|
146
|
+
if (!p || !f || !h) return;
|
|
147
|
+
let e = new Date(h).getTime();
|
|
148
|
+
if (!(Number.isNaN(e) || e <= Date.now())) return l(e - Date.now() + s, () => {
|
|
149
|
+
z.current = h, W();
|
|
150
|
+
});
|
|
151
|
+
}, [
|
|
152
|
+
p,
|
|
153
|
+
f,
|
|
154
|
+
h,
|
|
155
|
+
W
|
|
156
|
+
]), t(() => {
|
|
157
|
+
if (!p || !f) return;
|
|
158
|
+
let e = () => {
|
|
159
|
+
document.visibilityState !== "visible" || !B.current || (async () => {
|
|
160
|
+
await U() !== "skipped" && (B.current = !1);
|
|
161
|
+
})();
|
|
162
|
+
};
|
|
163
|
+
return document.addEventListener("visibilitychange", e), () => {
|
|
164
|
+
document.removeEventListener("visibilitychange", e);
|
|
165
|
+
};
|
|
166
|
+
}, [
|
|
167
|
+
p,
|
|
168
|
+
f,
|
|
169
|
+
U
|
|
170
|
+
]), t(() => {
|
|
171
|
+
if (!p || !f || !h || v || b) return;
|
|
172
|
+
let e = new Date(h).getTime();
|
|
173
|
+
Number.isNaN(e) || e > Date.now() || z.current !== h && (z.current = h, W());
|
|
174
|
+
}, [
|
|
175
|
+
p,
|
|
176
|
+
f,
|
|
177
|
+
h,
|
|
178
|
+
v,
|
|
179
|
+
b,
|
|
180
|
+
W
|
|
181
|
+
]), {
|
|
182
|
+
items: g,
|
|
183
|
+
isLoading: v,
|
|
184
|
+
isLoadingMore: b,
|
|
185
|
+
initialError: S,
|
|
186
|
+
loadMoreError: w,
|
|
187
|
+
hasMore: E,
|
|
188
|
+
loadMore: H,
|
|
189
|
+
retryLoadMore: H,
|
|
190
|
+
refetch: e(() => k((e) => e + 1), [])
|
|
79
191
|
};
|
|
80
192
|
};
|
|
81
193
|
//#endregion
|
|
82
|
-
export {
|
|
194
|
+
export { u as mergeRunsById, f as useScheduledTaskRuns };
|