@epam/ai-dial-chat-hooks 1.2.0-dev.14 → 1.2.0-dev.142
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 +5 -4
- package/attachment/useAttachmentValidation/useAttachmentValidation.js +26 -19
- package/attachments.d.ts +10 -4
- package/catalog/map-deployment-to-catalog-item.js +2 -2
- package/catalog/map-skill-to-catalog-item.js +30 -27
- package/catalog/publish.js +2 -1
- package/catalog/useApplicationCredentials/useApplicationCredentials.js +39 -0
- package/catalog/useSkillDetailsPanelData/useSkillDetailsPanelData.js +39 -39
- package/catalog/useSkillItemDetails.js +17 -13
- package/catalog.d.ts +42 -5
- package/catalog.js +6 -5
- package/conversation/conversation-transfer/queue.js +8 -5
- package/conversation/create-chat-stream-api.js +30 -21
- package/conversation/stage.js +23 -0
- package/conversation/useAttachmentUpload/useAttachmentUpload.js +12 -5
- package/conversation/useConversationImport/useConversationImport.js +1 -1
- package/conversation/useConversationScroll/useConversationScroll.js +68 -64
- package/conversation/useConversationStream/apply-chunk.js +1 -1
- package/conversation/useConversationStream/generation-resume.js +75 -63
- package/conversation/useConversationStream/useConversationStream.js +145 -102
- package/conversation-overlay.d.ts +7 -0
- package/conversation-overlay.js +2 -0
- package/conversation-sources/useConversationSources/useConversationSources.js +31 -24
- package/conversation-sources.d.ts +1 -1
- package/conversation.d.ts +140 -8
- package/conversation.js +31 -30
- package/file-manager-canvas.d.ts +398 -0
- package/file-manager-canvas.js +2 -0
- package/file-manager.d.ts +71 -330
- package/file-manager.js +15 -15
- package/files/attachment-canvas.js +51 -13
- package/files/attachment-types.js +14 -13
- package/files/useDialFileManagerTabConfig/useDialFileManagerTabConfig.js +1 -5
- package/files/useFileAttachmentPicker/useFileAttachmentPicker.js +43 -0
- package/index.d.ts +750 -35
- package/index.js +123 -111
- package/mcp-apps/useMcpAppHostAdapter/useMcpAppHostAdapter.js +7 -5
- package/mcp-apps/useMcpAppHostContext/useMcpAppHostContext.js +1 -1
- package/mcp-apps/useMcpAppTools/useMcpAppTools.js +1 -1
- package/mcp-apps/useOpenMcpAppCanvas/useOpenMcpAppCanvas.js +25 -23
- package/mcp-apps.d.ts +8 -6
- package/package.json +37 -18
- package/scheduled-task/scheduled-task-description.js +77 -0
- package/scheduled-task/scheduled-task-preparation.js +24 -0
- package/scheduled-task/scheduled-task-trigger.js +7 -2
- package/scheduled-task/scheduled-tasks-api-client.js +19 -0
- package/scheduled-task/use-scheduled-task-runs.js +82 -0
- package/scheduled-task/use-scheduled-tasks.js +93 -0
- package/scheduled-tasks.d.ts +180 -3
- package/scheduled-tasks.js +7 -2
- package/skill/skill.js +10 -7
- package/skill/useSkillArchiveImport/useSkillArchiveImport.js +75 -0
- package/skill/useSkillEditorLoad.js +29 -28
- package/skill/useSkillEditorSubmit.js +92 -75
- package/skill-editor.d.ts +107 -0
- package/skill-editor.js +9 -8
- package/usage/map-usage-data-to-dashboard.js +66 -0
- package/usage/map-user-usage-to-model-limits.js +160 -0
- package/usage.d.ts +120 -0
- package/usage.js +3 -0
- package/utils.d.ts +3 -1
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.
|
|
4
|
+
"version": "1.2.0-dev.142",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"main": "./index.js",
|
|
@@ -29,6 +29,11 @@
|
|
|
29
29
|
"import": "./conversation.js",
|
|
30
30
|
"default": "./conversation.js"
|
|
31
31
|
},
|
|
32
|
+
"./conversation-overlay": {
|
|
33
|
+
"types": "./conversation-overlay.d.ts",
|
|
34
|
+
"import": "./conversation-overlay.js",
|
|
35
|
+
"default": "./conversation-overlay.js"
|
|
36
|
+
},
|
|
32
37
|
"./conversation-transfer": {
|
|
33
38
|
"types": "./conversation-transfer.d.ts",
|
|
34
39
|
"import": "./conversation-transfer.js",
|
|
@@ -44,6 +49,11 @@
|
|
|
44
49
|
"import": "./file-manager.js",
|
|
45
50
|
"default": "./file-manager.js"
|
|
46
51
|
},
|
|
52
|
+
"./file-manager-canvas": {
|
|
53
|
+
"types": "./file-manager-canvas.d.ts",
|
|
54
|
+
"import": "./file-manager-canvas.js",
|
|
55
|
+
"default": "./file-manager-canvas.js"
|
|
56
|
+
},
|
|
47
57
|
"./source-content": {
|
|
48
58
|
"types": "./source-content.d.ts",
|
|
49
59
|
"import": "./source-content.js",
|
|
@@ -89,6 +99,11 @@
|
|
|
89
99
|
"import": "./utils.js",
|
|
90
100
|
"default": "./utils.js"
|
|
91
101
|
},
|
|
102
|
+
"./usage": {
|
|
103
|
+
"types": "./usage.d.ts",
|
|
104
|
+
"import": "./usage.js",
|
|
105
|
+
"default": "./usage.js"
|
|
106
|
+
},
|
|
92
107
|
"./mcp-apps": {
|
|
93
108
|
"types": "./mcp-apps.d.ts",
|
|
94
109
|
"import": "./mcp-apps.js",
|
|
@@ -96,7 +111,7 @@
|
|
|
96
111
|
}
|
|
97
112
|
},
|
|
98
113
|
"dependencies": {
|
|
99
|
-
"@epam/ai-dial-chat-api-client": "1.2.0-dev.
|
|
114
|
+
"@epam/ai-dial-chat-api-client": "1.2.0-dev.142",
|
|
100
115
|
"dompurify": "3.4.15",
|
|
101
116
|
"fflate": "^0.8.3",
|
|
102
117
|
"lru-cache": "^10.4.3",
|
|
@@ -105,21 +120,22 @@
|
|
|
105
120
|
},
|
|
106
121
|
"peerDependencies": {
|
|
107
122
|
"react": "^19.2.8",
|
|
108
|
-
"@epam/ai-dial-attachment-canvas": "1.2.0-dev.
|
|
109
|
-
"@epam/ai-dial-attachment-input": "1.2.0-dev.
|
|
110
|
-
"@epam/ai-dial-builder-form": "1.2.0-dev.
|
|
111
|
-
"@epam/ai-dial-catalog": "1.2.0-dev.
|
|
112
|
-
"@epam/ai-dial-chat-overlay": "1.2.0-dev.
|
|
113
|
-
"@epam/ai-dial-chat-shared": "1.2.0-dev.
|
|
114
|
-
"@epam/ai-dial-mcp-apps": "1.2.0-dev.
|
|
115
|
-
"@epam/ai-dial-publish-panel": "1.2.0-dev.
|
|
116
|
-
"@epam/ai-dial-quotations": "1.2.0-dev.
|
|
117
|
-
"@epam/ai-dial-react-file-manager": "^0.
|
|
118
|
-
"@epam/ai-dial-scheduled-tasks": "1.2.0-dev.
|
|
119
|
-
"@epam/ai-dial-share": "1.2.0-dev.
|
|
120
|
-
"@epam/ai-dial-skill-editor": "1.2.0-dev.
|
|
121
|
-
"@epam/ai-dial-source-panel": "1.2.0-dev.
|
|
122
|
-
"@epam/ai-dial-ui-kit": "^0.
|
|
123
|
+
"@epam/ai-dial-attachment-canvas": "1.2.0-dev.142",
|
|
124
|
+
"@epam/ai-dial-attachment-input": "1.2.0-dev.142",
|
|
125
|
+
"@epam/ai-dial-builder-form": "1.2.0-dev.142",
|
|
126
|
+
"@epam/ai-dial-catalog": "1.2.0-dev.142",
|
|
127
|
+
"@epam/ai-dial-chat-overlay": "1.2.0-dev.142",
|
|
128
|
+
"@epam/ai-dial-chat-shared": "1.2.0-dev.142",
|
|
129
|
+
"@epam/ai-dial-mcp-apps": "1.2.0-dev.142",
|
|
130
|
+
"@epam/ai-dial-publish-panel": "1.2.0-dev.142",
|
|
131
|
+
"@epam/ai-dial-quotations": "1.2.0-dev.142",
|
|
132
|
+
"@epam/ai-dial-react-file-manager": "^0.3.0-dev.4",
|
|
133
|
+
"@epam/ai-dial-scheduled-tasks": "1.2.0-dev.142",
|
|
134
|
+
"@epam/ai-dial-share": "1.2.0-dev.142",
|
|
135
|
+
"@epam/ai-dial-skill-editor": "1.2.0-dev.142",
|
|
136
|
+
"@epam/ai-dial-source-panel": "1.2.0-dev.142",
|
|
137
|
+
"@epam/ai-dial-ui-kit": "^0.15.0-dev.18",
|
|
138
|
+
"@epam/ai-dial-usage-dashboard": "1.2.0-dev.142",
|
|
123
139
|
"@modelcontextprotocol/sdk": "^1.29.0",
|
|
124
140
|
"@epam/pdf-highlighter-kit": "^0.0.19",
|
|
125
141
|
"@mcp-ui/client": "^7.1.1"
|
|
@@ -170,6 +186,9 @@
|
|
|
170
186
|
"@epam/ai-dial-ui-kit": {
|
|
171
187
|
"optional": true
|
|
172
188
|
},
|
|
189
|
+
"@epam/ai-dial-usage-dashboard": {
|
|
190
|
+
"optional": true
|
|
191
|
+
},
|
|
173
192
|
"@mcp-ui/client": {
|
|
174
193
|
"optional": true
|
|
175
194
|
},
|
|
@@ -182,7 +201,7 @@
|
|
|
182
201
|
},
|
|
183
202
|
"sideEffects": [
|
|
184
203
|
"./oauth.js",
|
|
185
|
-
"./file-manager.js",
|
|
204
|
+
"./file-manager-canvas.js",
|
|
186
205
|
"./shared/toolset-login-events.js",
|
|
187
206
|
"./files/attachment-canvas.js"
|
|
188
207
|
],
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
//#region src/scheduled-task/scheduled-task-description.ts
|
|
2
|
+
var e = /* @__PURE__ */ function(e) {
|
|
3
|
+
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
|
+
}({}), t = (e, { timeZone: t = "UTC", referenceDate: n = /* @__PURE__ */ new Date() } = {}) => {
|
|
5
|
+
let r = (e, t = {}) => ({
|
|
6
|
+
kind: e,
|
|
7
|
+
sourceTimezone: "utc",
|
|
8
|
+
...t
|
|
9
|
+
});
|
|
10
|
+
if (e.date && e.cron) return r("invalid");
|
|
11
|
+
if (e.date) {
|
|
12
|
+
let t = new Date(e.date);
|
|
13
|
+
return Number.isNaN(t.getTime()) ? r("invalid") : r("oneTime", { date: t });
|
|
14
|
+
}
|
|
15
|
+
let i = e.cron?.fields;
|
|
16
|
+
if (!i || Object.keys(i).length === 0) return r("invalid");
|
|
17
|
+
let a = () => r("custom", { expression: JSON.stringify(i) }), o = {
|
|
18
|
+
hour: [0, 23],
|
|
19
|
+
minute: [0, 59],
|
|
20
|
+
day: [1, 31],
|
|
21
|
+
day_of_week: [0, 6],
|
|
22
|
+
month: [1, 12],
|
|
23
|
+
second: [0, 59]
|
|
24
|
+
};
|
|
25
|
+
for (let [e, t] of Object.entries(i)) {
|
|
26
|
+
if (t == null) continue;
|
|
27
|
+
if (!t.trim()) return r("invalid");
|
|
28
|
+
let n = o[e];
|
|
29
|
+
if (n && /^-?\d+$/.test(t) && (Number(t) < n[0] || Number(t) > n[1])) return r("invalid");
|
|
30
|
+
if (e === "second" && t !== "0" || ![
|
|
31
|
+
"hour",
|
|
32
|
+
"minute",
|
|
33
|
+
"day",
|
|
34
|
+
"day_of_week"
|
|
35
|
+
].includes(e) && t !== "*" && !(e === "second" && t === "0")) return a();
|
|
36
|
+
}
|
|
37
|
+
let s = i.hour, c = i.minute, l = i.day === "*" ? void 0 : i.day, u = i.day_of_week === "*" ? void 0 : i.day_of_week, d = u ? [
|
|
38
|
+
"monday",
|
|
39
|
+
"tuesday",
|
|
40
|
+
"wednesday",
|
|
41
|
+
"thursday",
|
|
42
|
+
"friday",
|
|
43
|
+
"saturday",
|
|
44
|
+
"sunday"
|
|
45
|
+
].findIndex((e) => e === u.toLowerCase() || e.slice(0, 3) === u.toLowerCase()) : -1, f = d >= 0 ? String(d) : u;
|
|
46
|
+
if (l && f || l && !/^\d+$/.test(l) || f && !/^\d+$/.test(f)) return a();
|
|
47
|
+
let p = s == null || s === "*", m = c?.match(/^\*\/(\d+)$/);
|
|
48
|
+
if (p && m && !l && !f) {
|
|
49
|
+
let e = Number(m[1]);
|
|
50
|
+
return e > 0 && e <= 59 ? r("everyNMinutes", { intervalMinutes: e }) : r("invalid");
|
|
51
|
+
}
|
|
52
|
+
if (!c || !/^\d+$/.test(c) || !p && !/^\d+$/.test(s) || p && (l || f)) return a();
|
|
53
|
+
let h = new Date(n);
|
|
54
|
+
if (Number.isNaN(h.getTime())) return r("invalid");
|
|
55
|
+
if (h.setUTCHours(p ? 0 : Number(s), Number(c), 0, 0), f) {
|
|
56
|
+
let e = (Number(f) + 1) % 7;
|
|
57
|
+
h.setUTCDate(h.getUTCDate() + (e - h.getUTCDay() + 7) % 7);
|
|
58
|
+
}
|
|
59
|
+
let g = new Intl.DateTimeFormat("en-GB", {
|
|
60
|
+
timeZone: t,
|
|
61
|
+
hourCycle: "h23",
|
|
62
|
+
year: "numeric",
|
|
63
|
+
month: "2-digit",
|
|
64
|
+
day: "2-digit",
|
|
65
|
+
hour: "2-digit",
|
|
66
|
+
minute: "2-digit"
|
|
67
|
+
}).formatToParts(h), _ = (e) => g.find((t) => t.type === e)?.value ?? "", v = new Date(Date.UTC(Number(_("year")), Number(_("month")) - 1, Number(_("day")))), y = Date.UTC(h.getUTCFullYear(), h.getUTCMonth(), h.getUTCDate()), b = Math.round((v.getTime() - y) / 864e5), x = _("hour") + ":" + _("minute");
|
|
68
|
+
return p ? r("hourly", { time: _("minute") }) : f ? r("weekly", {
|
|
69
|
+
time: x,
|
|
70
|
+
dayOfWeek: String((Number(f) + b + 7) % 7)
|
|
71
|
+
}) : l ? b === 0 || Number(l) <= 28 && Number(l) + b >= 1 && Number(l) + b <= 28 ? r("monthly", {
|
|
72
|
+
time: x,
|
|
73
|
+
dayOfMonth: String(Number(l) + b)
|
|
74
|
+
}) : a() : r("daily", { time: x });
|
|
75
|
+
};
|
|
76
|
+
//#endregion
|
|
77
|
+
export { e as ScheduledTaskTriggerDescriptionKind, t as describeScheduledTaskTrigger };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { mapFormValuesToCreateBody as e, mapFormValuesToUpdateBody as t } from "./scheduled-task-trigger.js";
|
|
2
|
+
import { validateScheduledTaskFormValues as n } from "@epam/ai-dial-scheduled-tasks/validation";
|
|
3
|
+
//#region src/scheduled-task/scheduled-task-preparation.ts
|
|
4
|
+
var r = (t, r) => {
|
|
5
|
+
let i = n(t, r);
|
|
6
|
+
return Object.keys(i).length > 0 ? {
|
|
7
|
+
ok: !1,
|
|
8
|
+
errors: i
|
|
9
|
+
} : {
|
|
10
|
+
ok: !0,
|
|
11
|
+
body: e(t)
|
|
12
|
+
};
|
|
13
|
+
}, i = (e, r) => {
|
|
14
|
+
let i = n(e, r);
|
|
15
|
+
return Object.keys(i).length > 0 ? {
|
|
16
|
+
ok: !1,
|
|
17
|
+
errors: i
|
|
18
|
+
} : {
|
|
19
|
+
ok: !0,
|
|
20
|
+
body: t(e)
|
|
21
|
+
};
|
|
22
|
+
};
|
|
23
|
+
//#endregion
|
|
24
|
+
export { r as prepareScheduledTaskCreateBody, i as prepareScheduledTaskUpdateBody };
|
|
@@ -42,9 +42,13 @@ var a = new Set([
|
|
|
42
42
|
trigger: t,
|
|
43
43
|
model: e.modelId,
|
|
44
44
|
prompt: e.prompt.trim(),
|
|
45
|
+
...e.skillUrl ? { skillUrl: e.skillUrl } : {},
|
|
45
46
|
...n ? { description: n } : {}
|
|
46
47
|
};
|
|
47
|
-
}, u = (e) =>
|
|
48
|
+
}, u = (e) => ({
|
|
49
|
+
...l(e),
|
|
50
|
+
skillUrl: e.skillUrl || null
|
|
51
|
+
}), d = (t) => {
|
|
48
52
|
let n = new Date(t);
|
|
49
53
|
return `${n.getFullYear()}-${e(n.getMonth() + 1)}-${e(n.getDate())}T${e(n.getHours())}:${e(n.getMinutes())}`;
|
|
50
54
|
}, f = (t) => {
|
|
@@ -82,7 +86,7 @@ var a = new Set([
|
|
|
82
86
|
...c ? { dayOfMonth: String(d.getDate()) } : {}
|
|
83
87
|
};
|
|
84
88
|
}, m = (e) => {
|
|
85
|
-
if (!e.model || !e.prompt) return {
|
|
89
|
+
if (!e.model || typeof e.prompt != "string" || !e.prompt.trim() && !e.skillUrl) return {
|
|
86
90
|
ok: !1,
|
|
87
91
|
reason: t.MissingRequiredFields
|
|
88
92
|
};
|
|
@@ -95,6 +99,7 @@ var a = new Set([
|
|
|
95
99
|
displayName: e.displayName,
|
|
96
100
|
modelId: e.model,
|
|
97
101
|
prompt: e.prompt,
|
|
102
|
+
...e.skillUrl ? { skillUrl: e.skillUrl } : {},
|
|
98
103
|
...e.description ? { description: e.description } : {}
|
|
99
104
|
};
|
|
100
105
|
if (a) return {
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//#region src/scheduled-task/scheduled-tasks-api-client.ts
|
|
2
|
+
var e = (e) => {
|
|
3
|
+
if (!Array.isArray(e.items)) throw TypeError("Scheduled tasks API returned a malformed page response");
|
|
4
|
+
return e;
|
|
5
|
+
}, t = (t) => ({
|
|
6
|
+
listScheduledTasks: async ({ signal: n, ...r } = {}) => e(await t.listScheduledTasks(r, n ? { signal: n } : void 0)),
|
|
7
|
+
listScheduledTaskRuns: async ({ signal: n, ...r }) => e(await t.listScheduledTaskRuns(r, n ? { signal: n } : void 0)),
|
|
8
|
+
createScheduledTask: (e) => t.createScheduledTask({ createScheduledTaskBodyDto: e }),
|
|
9
|
+
getScheduledTask: (e) => t.getScheduledTask({ scheduleId: e }),
|
|
10
|
+
updateScheduledTask: (e, n) => t.updateScheduledTask({
|
|
11
|
+
scheduleId: e,
|
|
12
|
+
updateScheduledTaskBodyDto: n
|
|
13
|
+
}),
|
|
14
|
+
pauseScheduledTask: (e) => t.pauseScheduledTask({ scheduleId: e }),
|
|
15
|
+
resumeScheduledTask: (e) => t.resumeScheduledTask({ scheduleId: e }),
|
|
16
|
+
deleteScheduledTask: (e) => t.deleteScheduledTask({ scheduleId: e })
|
|
17
|
+
});
|
|
18
|
+
//#endregion
|
|
19
|
+
export { t as createScheduledTasksApiClient };
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
|
|
2
|
+
//#region src/scheduled-task/use-scheduled-task-runs.ts
|
|
3
|
+
var i = (i, { scheduleId: a, enabled: o = !0, pageSize: s = 10 }) => {
|
|
4
|
+
let [c, l] = r([]), [u, d] = r(o), [f, p] = r(!1), [m, h] = r(null), [g, _] = r(null), [v, y] = r(!1), [b, x] = r(0), S = n(0), C = n(0), w = n(!1), T = n(null);
|
|
5
|
+
t(() => {
|
|
6
|
+
let e = ++S.current, t = new AbortController();
|
|
7
|
+
T.current?.abort(), T.current = null, w.current = !1, p(!1), h(null), _(null), l([]), y(!1), C.current = 0;
|
|
8
|
+
let n = () => {
|
|
9
|
+
++S.current, t.abort(), T.current?.abort(), T.current = null;
|
|
10
|
+
};
|
|
11
|
+
return !o || !a ? (d(!1), l([]), y(!1), n) : ((async () => {
|
|
12
|
+
d(!0);
|
|
13
|
+
try {
|
|
14
|
+
let n = await i.listScheduledTaskRuns({
|
|
15
|
+
scheduleId: a,
|
|
16
|
+
limit: s,
|
|
17
|
+
offset: 0,
|
|
18
|
+
signal: t.signal
|
|
19
|
+
});
|
|
20
|
+
if (S.current !== e) return;
|
|
21
|
+
l(n.items), C.current = n.items.length, y(n.next != null || (n.count == null ? n.items.length === s : n.items.length < n.count));
|
|
22
|
+
} catch (t) {
|
|
23
|
+
S.current === e && h(t instanceof Error ? t : /* @__PURE__ */ Error("Failed to load scheduled task runs"));
|
|
24
|
+
} finally {
|
|
25
|
+
S.current === e && d(!1);
|
|
26
|
+
}
|
|
27
|
+
})(), n);
|
|
28
|
+
}, [
|
|
29
|
+
i,
|
|
30
|
+
o,
|
|
31
|
+
s,
|
|
32
|
+
b,
|
|
33
|
+
a
|
|
34
|
+
]);
|
|
35
|
+
let E = e(() => {
|
|
36
|
+
if (!o || !a || !v || u || w.current) return;
|
|
37
|
+
w.current = !0;
|
|
38
|
+
let e = new AbortController();
|
|
39
|
+
T.current = e;
|
|
40
|
+
let t = S.current, n = C.current;
|
|
41
|
+
(async () => {
|
|
42
|
+
p(!0), _(null);
|
|
43
|
+
try {
|
|
44
|
+
let r = await i.listScheduledTaskRuns({
|
|
45
|
+
scheduleId: a,
|
|
46
|
+
limit: s,
|
|
47
|
+
offset: n,
|
|
48
|
+
signal: e.signal
|
|
49
|
+
});
|
|
50
|
+
if (S.current !== t) return;
|
|
51
|
+
l((e) => {
|
|
52
|
+
let t = new Set(e.map(({ id: e }) => e));
|
|
53
|
+
return [...e, ...r.items.filter(({ id: e }) => t.has(e) ? !1 : (t.add(e), !0))];
|
|
54
|
+
}), C.current = n + r.items.length, y(r.next != null || (r.count == null ? r.items.length === s : n + r.items.length < r.count));
|
|
55
|
+
} catch (e) {
|
|
56
|
+
S.current === t && _(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more scheduled task runs"));
|
|
57
|
+
} finally {
|
|
58
|
+
S.current === t && (p(!1), w.current = !1, T.current = null);
|
|
59
|
+
}
|
|
60
|
+
})();
|
|
61
|
+
}, [
|
|
62
|
+
i,
|
|
63
|
+
o,
|
|
64
|
+
v,
|
|
65
|
+
u,
|
|
66
|
+
s,
|
|
67
|
+
a
|
|
68
|
+
]);
|
|
69
|
+
return {
|
|
70
|
+
items: c,
|
|
71
|
+
isLoading: u,
|
|
72
|
+
isLoadingMore: f,
|
|
73
|
+
initialError: m,
|
|
74
|
+
loadMoreError: g,
|
|
75
|
+
hasMore: v,
|
|
76
|
+
loadMore: E,
|
|
77
|
+
retryLoadMore: E,
|
|
78
|
+
refetch: e(() => x((e) => e + 1), [])
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
//#endregion
|
|
82
|
+
export { i as useScheduledTaskRuns };
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { useCallback as e, useEffect as t, useRef as n, useState as r } from "react";
|
|
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 [u, d] = r([]), [f, p] = r(c), [m, h] = r(l), [g, _] = r(a), [v, y] = r(!1), [b, x] = r(null), [S, C] = r(null), [w, T] = r(!1), [E, D] = r(0), O = n(0), k = n(0), A = n(!1), j = n(null), [M, N] = r(c);
|
|
5
|
+
t(() => {
|
|
6
|
+
let e = setTimeout(() => N(f), s);
|
|
7
|
+
return () => clearTimeout(e);
|
|
8
|
+
}, [s, f]), t(() => {
|
|
9
|
+
let e = ++O.current, t = new AbortController();
|
|
10
|
+
j.current?.abort(), j.current = null, A.current = !1, y(!1), x(null), C(null), d([]), T(!1), k.current = 0;
|
|
11
|
+
let n = () => {
|
|
12
|
+
++O.current, t.abort(), j.current?.abort(), j.current = null;
|
|
13
|
+
};
|
|
14
|
+
return a ? ((async () => {
|
|
15
|
+
_(!0);
|
|
16
|
+
try {
|
|
17
|
+
let n = await i.listScheduledTasks({
|
|
18
|
+
limit: o,
|
|
19
|
+
offset: 0,
|
|
20
|
+
search: M,
|
|
21
|
+
sort: m,
|
|
22
|
+
signal: t.signal
|
|
23
|
+
});
|
|
24
|
+
if (O.current !== e) return;
|
|
25
|
+
d(n.items), k.current = n.items.length, T(n.next != null);
|
|
26
|
+
} catch (t) {
|
|
27
|
+
O.current === e && x(t instanceof Error ? t : /* @__PURE__ */ Error("Failed to load scheduled tasks"));
|
|
28
|
+
} finally {
|
|
29
|
+
O.current === e && _(!1);
|
|
30
|
+
}
|
|
31
|
+
})(), n) : (_(!1), d([]), T(!1), n);
|
|
32
|
+
}, [
|
|
33
|
+
i,
|
|
34
|
+
M,
|
|
35
|
+
a,
|
|
36
|
+
o,
|
|
37
|
+
E,
|
|
38
|
+
m
|
|
39
|
+
]);
|
|
40
|
+
let P = e(() => {
|
|
41
|
+
if (!a || !w || g || A.current) return;
|
|
42
|
+
A.current = !0;
|
|
43
|
+
let e = new AbortController();
|
|
44
|
+
j.current = e;
|
|
45
|
+
let t = O.current, n = k.current;
|
|
46
|
+
(async () => {
|
|
47
|
+
y(!0), C(null);
|
|
48
|
+
try {
|
|
49
|
+
let r = await i.listScheduledTasks({
|
|
50
|
+
limit: o,
|
|
51
|
+
offset: n,
|
|
52
|
+
signal: e.signal,
|
|
53
|
+
search: M,
|
|
54
|
+
sort: m
|
|
55
|
+
});
|
|
56
|
+
if (O.current !== t) return;
|
|
57
|
+
d((e) => {
|
|
58
|
+
let t = new Set(e.map(({ id: e }) => e));
|
|
59
|
+
return [...e, ...r.items.filter(({ id: e }) => t.has(e) ? !1 : (t.add(e), !0))];
|
|
60
|
+
}), k.current = n + r.items.length, T(r.next != null);
|
|
61
|
+
} catch (e) {
|
|
62
|
+
O.current === t && C(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more scheduled tasks"));
|
|
63
|
+
} finally {
|
|
64
|
+
O.current === t && (y(!1), A.current = !1, j.current = null);
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
}, [
|
|
68
|
+
i,
|
|
69
|
+
M,
|
|
70
|
+
a,
|
|
71
|
+
w,
|
|
72
|
+
g,
|
|
73
|
+
o,
|
|
74
|
+
m
|
|
75
|
+
]);
|
|
76
|
+
return {
|
|
77
|
+
items: u,
|
|
78
|
+
searchQuery: f,
|
|
79
|
+
setSearchQuery: p,
|
|
80
|
+
sortKey: m,
|
|
81
|
+
setSortKey: h,
|
|
82
|
+
isLoading: g,
|
|
83
|
+
isLoadingMore: v,
|
|
84
|
+
initialError: b,
|
|
85
|
+
loadMoreError: S,
|
|
86
|
+
hasMore: w,
|
|
87
|
+
loadMore: P,
|
|
88
|
+
retryLoadMore: P,
|
|
89
|
+
refetch: e(() => D((e) => e + 1), [])
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
//#endregion
|
|
93
|
+
export { i as useScheduledTasks };
|
package/scheduled-tasks.d.ts
CHANGED
|
@@ -1,8 +1,33 @@
|
|
|
1
|
+
import { CreatedScheduledTaskDto } from '@epam/ai-dial-chat-api-client';
|
|
1
2
|
import { CreateScheduledTaskBodyDto } from '@epam/ai-dial-chat-api-client';
|
|
3
|
+
import { Dispatch } from 'react';
|
|
4
|
+
import { ListScheduledTaskRunsResponseDto } from '@epam/ai-dial-chat-api-client';
|
|
5
|
+
import { ListScheduledTasksResponseDto } from '@epam/ai-dial-chat-api-client';
|
|
6
|
+
import { ListScheduledTasksSortEnum } from '@epam/ai-dial-chat-api-client';
|
|
2
7
|
import { ScheduledTaskCreateFormValues } from '@epam/ai-dial-scheduled-tasks';
|
|
3
8
|
import { ScheduledTaskDto } from '@epam/ai-dial-chat-api-client';
|
|
9
|
+
import { ScheduledTaskRunDto } from '@epam/ai-dial-chat-api-client';
|
|
10
|
+
import { ScheduledTaskValidationErrors } from '../../libs/scheduled-tasks/validation';
|
|
11
|
+
import { ScheduledTaskValidationOptions } from '../../libs/scheduled-tasks/validation';
|
|
12
|
+
import { ScheduleTriggerDto } from '@epam/ai-dial-chat-api-client';
|
|
13
|
+
import { SetStateAction } from 'react';
|
|
14
|
+
import { UpdatedScheduledTaskDto } from '@epam/ai-dial-chat-api-client';
|
|
4
15
|
import { UpdateScheduledTaskBodyDto } from '@epam/ai-dial-chat-api-client';
|
|
5
16
|
|
|
17
|
+
/**
|
|
18
|
+
* Composes scheduler operations over an already configured generated client.
|
|
19
|
+
* Authentication, base URL, CSRF, and retries remain host responsibilities.
|
|
20
|
+
*/
|
|
21
|
+
export declare const createScheduledTasksApiClient: (client: ScheduledTasksConfiguredClient) => ScheduledTasksApiClient;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Describes the complete trigger without requiring unrelated task metadata.
|
|
25
|
+
* Unsupported constraints remain Custom, with the full source expression.
|
|
26
|
+
* Calendar-month shifts crossing month boundaries or days 29–31 remain
|
|
27
|
+
* Custom because a shifted monthly day is not equivalent around short months.
|
|
28
|
+
*/
|
|
29
|
+
export declare const describeScheduledTaskTrigger: (trigger: ScheduleTriggerDto, { timeZone, referenceDate, }?: ScheduledTaskTriggerDescriptionOptions) => ScheduledTaskTriggerDescription;
|
|
30
|
+
|
|
6
31
|
/**
|
|
7
32
|
* Maps validated create-form values to the `POST /api/v1/scheduled-tasks`
|
|
8
33
|
* request body, building `trigger.date` for a one-shot schedule or
|
|
@@ -13,9 +38,8 @@ import { UpdateScheduledTaskBodyDto } from '@epam/ai-dial-chat-api-client';
|
|
|
13
38
|
export declare const mapFormValuesToCreateBody: (values: ScheduledTaskCreateFormValues) => CreateScheduledTaskBodyDto;
|
|
14
39
|
|
|
15
40
|
/**
|
|
16
|
-
* Maps validated edit
|
|
17
|
-
*
|
|
18
|
-
* `CreateScheduledTaskBodyDto`, so this reuses the same trigger-building logic.
|
|
41
|
+
* Maps a complete, validated edit draft to an update body. An unset skill
|
|
42
|
+
* emits null to remove the saved reference; hydrate from detail before editing.
|
|
19
43
|
*/
|
|
20
44
|
export declare const mapFormValuesToUpdateBody: (values: ScheduledTaskCreateFormValues) => UpdateScheduledTaskBodyDto;
|
|
21
45
|
|
|
@@ -29,6 +53,15 @@ export declare const mapFormValuesToUpdateBody: (values: ScheduledTaskCreateForm
|
|
|
29
53
|
*/
|
|
30
54
|
export declare const mapScheduledTaskDtoToFormValues: (dto: ScheduledTaskDto) => ScheduledTaskDtoMappingResult;
|
|
31
55
|
|
|
56
|
+
/**
|
|
57
|
+
* Validates form values before creating a request body. Hosts translate the
|
|
58
|
+
* returned field codes and must not issue a write when `ok` is false.
|
|
59
|
+
*/
|
|
60
|
+
export declare const prepareScheduledTaskCreateBody: (values: ScheduledTaskCreateFormValues, options: ScheduledTaskValidationOptions) => ScheduledTaskPreparationResult<CreateScheduledTaskBodyDto>;
|
|
61
|
+
|
|
62
|
+
/** Validates form values before preparing an update request body. */
|
|
63
|
+
export declare const prepareScheduledTaskUpdateBody: (values: ScheduledTaskCreateFormValues, options: ScheduledTaskValidationOptions) => ScheduledTaskPreparationResult<UpdateScheduledTaskBodyDto>;
|
|
64
|
+
|
|
32
65
|
/** Result of mapping a scheduled task DTO back to editable form values. */
|
|
33
66
|
export declare type ScheduledTaskDtoMappingResult = {
|
|
34
67
|
ok: true;
|
|
@@ -38,6 +71,106 @@ export declare type ScheduledTaskDtoMappingResult = {
|
|
|
38
71
|
reason: UnsupportedTriggerReason;
|
|
39
72
|
};
|
|
40
73
|
|
|
74
|
+
/** A checked request preparation result that never serializes invalid values. */
|
|
75
|
+
export declare type ScheduledTaskPreparationResult<TBody> = {
|
|
76
|
+
ok: true;
|
|
77
|
+
body: TBody;
|
|
78
|
+
} | {
|
|
79
|
+
ok: false;
|
|
80
|
+
errors: ScheduledTaskValidationErrors;
|
|
81
|
+
};
|
|
82
|
+
|
|
83
|
+
export declare interface ScheduledTaskRunsListRequest {
|
|
84
|
+
scheduleId: string;
|
|
85
|
+
limit?: number;
|
|
86
|
+
offset?: number;
|
|
87
|
+
signal?: AbortSignal;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
export declare interface ScheduledTasksApiClient {
|
|
91
|
+
listScheduledTasks: (request?: ScheduledTasksListRequest) => Promise<ListScheduledTasksResponseDto>;
|
|
92
|
+
listScheduledTaskRuns: (request: ScheduledTaskRunsListRequest) => Promise<ListScheduledTaskRunsResponseDto>;
|
|
93
|
+
createScheduledTask: (body: CreateScheduledTaskBodyDto) => Promise<CreatedScheduledTaskDto>;
|
|
94
|
+
getScheduledTask: (scheduleId: string) => Promise<ScheduledTaskDto>;
|
|
95
|
+
updateScheduledTask: (scheduleId: string, body: UpdateScheduledTaskBodyDto) => Promise<UpdatedScheduledTaskDto>;
|
|
96
|
+
pauseScheduledTask: (scheduleId: string) => Promise<ScheduledTaskDto>;
|
|
97
|
+
resumeScheduledTask: (scheduleId: string) => Promise<ScheduledTaskDto>;
|
|
98
|
+
deleteScheduledTask: (scheduleId: string) => Promise<void>;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/** Narrow configured generated-client surface required by scheduler hooks. */
|
|
102
|
+
export declare interface ScheduledTasksConfiguredClient {
|
|
103
|
+
listScheduledTasks: (request: {
|
|
104
|
+
limit?: number;
|
|
105
|
+
offset?: number;
|
|
106
|
+
search?: string;
|
|
107
|
+
sort?: ListScheduledTasksSortEnum;
|
|
108
|
+
}, options?: RequestInit) => Promise<ListScheduledTasksResponseDto>;
|
|
109
|
+
listScheduledTaskRuns: (request: {
|
|
110
|
+
scheduleId: string;
|
|
111
|
+
limit?: number;
|
|
112
|
+
offset?: number;
|
|
113
|
+
}, options?: RequestInit) => Promise<ListScheduledTaskRunsResponseDto>;
|
|
114
|
+
createScheduledTask: (request: {
|
|
115
|
+
createScheduledTaskBodyDto: CreateScheduledTaskBodyDto;
|
|
116
|
+
}) => Promise<CreatedScheduledTaskDto>;
|
|
117
|
+
getScheduledTask: (request: {
|
|
118
|
+
scheduleId: string;
|
|
119
|
+
}) => Promise<ScheduledTaskDto>;
|
|
120
|
+
updateScheduledTask: (request: {
|
|
121
|
+
scheduleId: string;
|
|
122
|
+
updateScheduledTaskBodyDto: UpdateScheduledTaskBodyDto;
|
|
123
|
+
}) => Promise<UpdatedScheduledTaskDto>;
|
|
124
|
+
pauseScheduledTask: (request: {
|
|
125
|
+
scheduleId: string;
|
|
126
|
+
}) => Promise<ScheduledTaskDto>;
|
|
127
|
+
resumeScheduledTask: (request: {
|
|
128
|
+
scheduleId: string;
|
|
129
|
+
}) => Promise<ScheduledTaskDto>;
|
|
130
|
+
deleteScheduledTask: (request: {
|
|
131
|
+
scheduleId: string;
|
|
132
|
+
}) => Promise<void>;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
/** App-agnostic request options accepted by the scheduler facade. */
|
|
136
|
+
export declare interface ScheduledTasksListRequest {
|
|
137
|
+
limit?: number;
|
|
138
|
+
offset?: number;
|
|
139
|
+
search?: string;
|
|
140
|
+
sort?: ListScheduledTasksSortEnum;
|
|
141
|
+
signal?: AbortSignal;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
export declare interface ScheduledTaskTriggerDescription {
|
|
145
|
+
kind: ScheduledTaskTriggerDescriptionKind;
|
|
146
|
+
time?: string;
|
|
147
|
+
dayOfWeek?: string;
|
|
148
|
+
dayOfMonth?: string;
|
|
149
|
+
intervalMinutes?: number;
|
|
150
|
+
date?: Date;
|
|
151
|
+
expression?: string;
|
|
152
|
+
sourceTimezone: 'utc';
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** Display categories are independent of task editability. */
|
|
156
|
+
export declare enum ScheduledTaskTriggerDescriptionKind {
|
|
157
|
+
OneTime = "oneTime",
|
|
158
|
+
Hourly = "hourly",
|
|
159
|
+
EveryNMinutes = "everyNMinutes",
|
|
160
|
+
Daily = "daily",
|
|
161
|
+
Weekly = "weekly",
|
|
162
|
+
Monthly = "monthly",
|
|
163
|
+
Custom = "custom",
|
|
164
|
+
Invalid = "invalid"
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
export declare interface ScheduledTaskTriggerDescriptionOptions {
|
|
168
|
+
/** Display timezone; defaults to UTC for backwards compatibility. */
|
|
169
|
+
timeZone?: string;
|
|
170
|
+
/** Date whose timezone offset is used. Defaults to now (the existing UTC-storage policy). */
|
|
171
|
+
referenceDate?: Date;
|
|
172
|
+
}
|
|
173
|
+
|
|
41
174
|
/** Why a scheduled task DTO could not be mapped back to editable form values. */
|
|
42
175
|
export declare enum UnsupportedTriggerReason {
|
|
43
176
|
/** `trigger.cron.fields` uses a shape (extra keys, or both `day_of_week` and `day`) the editor's schedule controls cannot represent. */
|
|
@@ -48,4 +181,48 @@ export declare enum UnsupportedTriggerReason {
|
|
|
48
181
|
MissingRequiredFields = "missingRequiredFields"
|
|
49
182
|
}
|
|
50
183
|
|
|
184
|
+
/** Shared, cancellation-safe pagination for one schedule's run history. */
|
|
185
|
+
export declare const useScheduledTaskRuns: (client: ScheduledTasksApiClient, { scheduleId, enabled, pageSize }: UseScheduledTaskRunsOptions) => {
|
|
186
|
+
items: ScheduledTaskRunDto[];
|
|
187
|
+
isLoading: boolean;
|
|
188
|
+
isLoadingMore: boolean;
|
|
189
|
+
initialError: Error | null;
|
|
190
|
+
loadMoreError: Error | null;
|
|
191
|
+
hasMore: boolean;
|
|
192
|
+
loadMore: () => void;
|
|
193
|
+
retryLoadMore: () => void;
|
|
194
|
+
refetch: () => void;
|
|
195
|
+
};
|
|
196
|
+
|
|
197
|
+
export declare interface UseScheduledTaskRunsOptions {
|
|
198
|
+
scheduleId: string;
|
|
199
|
+
enabled?: boolean;
|
|
200
|
+
pageSize?: number;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/** Shared scheduler-list lifecycle with generation-scoped stale-response guards. */
|
|
204
|
+
export declare const useScheduledTasks: (client: ScheduledTasksApiClient, { enabled, pageSize, debounceMs, initialSearch, initialSort, }?: UseScheduledTasksOptions) => {
|
|
205
|
+
items: ScheduledTaskDto[];
|
|
206
|
+
searchQuery: string;
|
|
207
|
+
setSearchQuery: Dispatch<SetStateAction<string>>;
|
|
208
|
+
sortKey: "firstToRun" | "lastToRun" | "newest" | "nameAZ";
|
|
209
|
+
setSortKey: Dispatch<SetStateAction<"firstToRun" | "lastToRun" | "newest" | "nameAZ">>;
|
|
210
|
+
isLoading: boolean;
|
|
211
|
+
isLoadingMore: boolean;
|
|
212
|
+
initialError: Error | null;
|
|
213
|
+
loadMoreError: Error | null;
|
|
214
|
+
hasMore: boolean;
|
|
215
|
+
loadMore: () => void;
|
|
216
|
+
retryLoadMore: () => void;
|
|
217
|
+
refetch: () => void;
|
|
218
|
+
};
|
|
219
|
+
|
|
220
|
+
export declare interface UseScheduledTasksOptions {
|
|
221
|
+
enabled?: boolean;
|
|
222
|
+
pageSize?: number;
|
|
223
|
+
debounceMs?: number;
|
|
224
|
+
initialSearch?: string;
|
|
225
|
+
initialSort?: ListScheduledTasksSortEnum;
|
|
226
|
+
}
|
|
227
|
+
|
|
51
228
|
export { }
|
package/scheduled-tasks.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
import { UnsupportedTriggerReason as e } from "./scheduled-task/scheduled-task-mapping.js";
|
|
2
|
-
import {
|
|
3
|
-
|
|
2
|
+
import { ScheduledTaskTriggerDescriptionKind as t, describeScheduledTaskTrigger as n } from "./scheduled-task/scheduled-task-description.js";
|
|
3
|
+
import { mapFormValuesToCreateBody as r, mapFormValuesToUpdateBody as i, mapScheduledTaskDtoToFormValues as a } from "./scheduled-task/scheduled-task-trigger.js";
|
|
4
|
+
import { prepareScheduledTaskCreateBody as o, prepareScheduledTaskUpdateBody as s } from "./scheduled-task/scheduled-task-preparation.js";
|
|
5
|
+
import { createScheduledTasksApiClient as c } from "./scheduled-task/scheduled-tasks-api-client.js";
|
|
6
|
+
import { useScheduledTasks as l } from "./scheduled-task/use-scheduled-tasks.js";
|
|
7
|
+
import { useScheduledTaskRuns as u } 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, o as prepareScheduledTaskCreateBody, s as prepareScheduledTaskUpdateBody, u as useScheduledTaskRuns, l as useScheduledTasks };
|