@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.
Files changed (84) hide show
  1. package/api-error/api-error.js +7 -4
  2. package/catalog/catalog-derivations.js +1 -1
  3. package/catalog/deployment-id.js +8 -2
  4. package/catalog/map-deployment-limits-to-catalog.js +16 -24
  5. package/catalog/map-deployment-limits-to-input.js +81 -9
  6. package/catalog/map-deployment-to-catalog-item.js +34 -34
  7. package/catalog/map-entity-details-to-catalog.js +237 -192
  8. package/catalog/map-skill-to-catalog-item.js +61 -54
  9. package/catalog/publish.js +4 -4
  10. package/catalog/useCatalogEditNavigation/useCatalogEditNavigation.js +122 -101
  11. package/catalog/useCatalogItemDetails.js +9 -8
  12. package/catalog/usePublishFolders/usePublishFolders.js +1 -1
  13. package/catalog.d.ts +171 -34
  14. package/catalog.js +23 -23
  15. package/conversation/conversation-transfer/export-conversation.js +24 -16
  16. package/conversation/conversation-transfer/import-conversation.js +80 -31
  17. package/conversation/create-chat-stream-api.js +89 -49
  18. package/conversation/get-model-id-from-conversation-id.js +15 -9
  19. package/conversation/message-utils.js +44 -2
  20. package/conversation/stage.js +6 -2
  21. package/conversation/useActiveConversationSync/useActiveConversationSync.js +7 -8
  22. package/conversation/useConversationExport/useConversationExport.js +9 -9
  23. package/conversation/useConversationHandlers/message-utils.js +8 -5
  24. package/conversation/useConversationHandlers/useConversationHandlers.js +181 -167
  25. package/conversation/useConversationImport/useConversationImport.js +123 -121
  26. package/conversation/useConversationPanelItems/useConversationPanelItems.js +49 -31
  27. package/conversation/useConversationStream/frame-scheduler.js +39 -0
  28. package/conversation/useConversationStream/generation-resume.js +122 -64
  29. package/conversation/useConversationStream/useConversationStream.js +298 -118
  30. package/conversation/useMessageSelectionReply/useMessageSelectionReply.js +189 -0
  31. package/conversation-sources/useConversationSources/useConversationSources.js +31 -24
  32. package/conversation-sources.d.ts +1 -1
  33. package/conversation-transfer.d.ts +2 -1
  34. package/conversation.d.ts +218 -22
  35. package/conversation.js +32 -31
  36. package/file-manager-canvas.d.ts +27 -7
  37. package/file-manager.d.ts +87 -32
  38. package/file-manager.js +25 -24
  39. package/files/attachment-canvas.js +67 -44
  40. package/files/dial-file-manager-copy-move.util.js +9 -8
  41. package/files/dial-file-manager-mapping.util.js +2 -1
  42. package/files/dial-file-manager-path.util.js +24 -2
  43. package/files/dial-file-manager.model.js +23 -19
  44. package/files/dial-file-manager.types.js +3 -3
  45. package/files/file-manager-variant.js +1 -1
  46. package/files/resolve-dial-file-api-path.js +11 -12
  47. package/files/useDialFileListing/useDialFileListing.js +140 -127
  48. package/files/useDialFileManager/useDialFileManager.js +139 -135
  49. package/files/useDialFileManagerSections/useDialFileManagerSections.js +155 -0
  50. package/files/useDialFileManagerTabConfig/useDialFileManagerTabConfig.js +20 -15
  51. package/files/useDialFileMutations/useDialFileMutations.js +65 -60
  52. package/files/useDialFileUploadBatch/useDialFileUploadBatch.js +117 -110
  53. package/files/useFileAttachmentPicker/useFileAttachmentPicker.js +28 -23
  54. package/index.d.ts +643 -128
  55. package/index.js +136 -134
  56. package/mcp-apps/useMcpAppTools/useMcpAppTools.js +1 -1
  57. package/oauth/authorize-url.js +3 -3
  58. package/oauth/toolset-id.js +5 -3
  59. package/oauth/useToolsetLogin/useToolsetLogin.js +8 -8
  60. package/oauth.d.ts +34 -2
  61. package/oauth.js +9 -9
  62. package/package.json +19 -23
  63. package/scheduled-task/scheduled-task-description.js +43 -39
  64. package/scheduled-task/scheduled-task-trigger.js +74 -71
  65. package/scheduled-task/use-scheduled-task-runs.js +162 -50
  66. package/scheduled-task/use-scheduled-tasks.js +52 -48
  67. package/scheduled-tasks.d.ts +27 -6
  68. package/scheduled-tasks.js +2 -2
  69. package/shared/application-schema.js +5 -2
  70. package/shared/cron-day-of-month.js +13 -0
  71. package/skill/skill-archive.js +19 -0
  72. package/skill/skill-types.js +8 -7
  73. package/skill/skill.js +52 -29
  74. package/skill/useSkillArchiveImport/useSkillArchiveImport.js +38 -34
  75. package/skill/useSkillEditorLoad.js +65 -59
  76. package/skill/useSkillEditorSubmit.js +105 -93
  77. package/skill/useSkillFileActions.js +70 -58
  78. package/skill-editor.d.ts +62 -13
  79. package/skill-editor.js +9 -9
  80. package/usage/map-user-usage-to-model-limits.js +137 -95
  81. package/usage.d.ts +8 -3
  82. package/usePageFileDrag/usePageFileDrag.js +3 -3
  83. package/utils.d.ts +26 -6
  84. 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.2.0-dev.99",
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.2.0-dev.99",
115
- "dompurify": "3.4.15",
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.2.0-dev.99",
124
- "@epam/ai-dial-attachment-input": "1.2.0-dev.99",
125
- "@epam/ai-dial-builder-form": "1.2.0-dev.99",
126
- "@epam/ai-dial-catalog": "1.2.0-dev.99",
127
- "@epam/ai-dial-chat-overlay": "1.2.0-dev.99",
128
- "@epam/ai-dial-chat-shared": "1.2.0-dev.99",
129
- "@epam/ai-dial-mcp-apps": "1.2.0-dev.99",
130
- "@epam/ai-dial-publish-panel": "1.2.0-dev.99",
131
- "@epam/ai-dial-quotations": "1.2.0-dev.99",
132
- "@epam/ai-dial-react-file-manager": "^0.3.0-dev.4",
133
- "@epam/ai-dial-scheduled-tasks": "1.2.0-dev.99",
134
- "@epam/ai-dial-share": "1.2.0-dev.99",
135
- "@epam/ai-dial-skill-editor": "1.2.0-dev.99",
136
- "@epam/ai-dial-source-panel": "1.2.0-dev.99",
137
- "@epam/ai-dial-ui-kit": "^0.15.0-dev.12",
138
- "@epam/ai-dial-usage-dashboard": "1.2.0-dev.99",
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 e = /* @__PURE__ */ function(e) {
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
- }({}), t = (e, { timeZone: t = "UTC", referenceDate: n = /* @__PURE__ */ new Date() } = {}) => {
5
- let r = (e, t = {}) => ({
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 (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 });
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 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 = {
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(i)) {
26
+ for (let [e, t] of Object.entries(a)) {
26
27
  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");
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 a();
36
+ ].includes(e) && t !== "*" && !(e === "second" && t === "0")) return o();
36
37
  }
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
+ 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 === 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");
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 (!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);
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 g = new Intl.DateTimeFormat("en-GB", {
60
- timeZone: t,
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(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 });
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 { e as ScheduledTaskTriggerDescriptionKind, t as describeScheduledTaskTrigger };
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 { apSchedulerDayToJsDay as n, jsDayToApSchedulerDay as r } from "../shared/cron-weekday.js";
4
- import { ScheduledTaskRepeat as i } from "@epam/ai-dial-scheduled-tasks";
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 a = new Set([
7
+ var c = new Set([
7
8
  "hour",
8
9
  "minute",
9
10
  "day_of_week",
10
11
  "day"
11
- ]), o = "09:00", s = (e) => {
12
- if (e.repeat === i.Hourly) {
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, a] = e.time.split(":"), o = Number(t), s = Number(a), c = /* @__PURE__ */ new Date();
20
- c.setHours(o, s, 0, 0);
21
- let l = e.repeat === i.Weekly && !!e.dayOfWeek, u = e.repeat === i.Monthly && !!e.dayOfMonth;
22
- if (l) {
23
- let t = (n(Number(e.dayOfWeek)) - c.getDay() + 7) % 7;
24
- c.setDate(c.getDate() + t);
25
- } else u && c.setDate(Number(e.dayOfMonth));
26
- let d = {
27
- hour: String(c.getUTCHours()),
28
- minute: String(c.getUTCMinutes())
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 l && (d.day_of_week = String(r(c.getUTCDay()))), u && (d.day = String(c.getUTCDate())), d;
31
- }, c = (e, t) => {
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
- }, l = (e) => {
35
- let t = e.repeat === i.OneTime ? { date: new Date(e.runAt ?? "").toISOString() } : { cron: {
36
- fields: s(e),
37
- ...e.startDate ? { startDate: c(e.startDate, "start") } : {},
38
- ...e.endDate ? { endDate: c(e.endDate, "end") } : {}
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
- }, u = (e) => l(e), d = (t) => {
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
- }, f = (t) => {
55
+ }, h = (t) => {
51
56
  let n = new Date(t);
52
57
  return `${n.getFullYear()}-${e(n.getMonth() + 1)}-${e(n.getDate())}`;
53
- }, p = (t) => {
54
- let i = new Set(Object.entries(t).filter(([, e]) => e != null).map(([e]) => e)), o = [...i].filter((e) => !a.has(e)), s = i.has("day_of_week"), c = i.has("day");
55
- if (o.length > 0 || s && c || !i.has("hour") || !i.has("minute")) return { ok: !1 };
56
- if (t.hour === "*" && /^\d+$/.test(String(t.minute)) && !s && !c) {
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 l = Number(t.hour), u = Number(t.minute);
65
- if (Number.isNaN(l) || Number.isNaN(u)) return { ok: !1 };
66
- let d = /* @__PURE__ */ new Date();
67
- if (d.setUTCHours(l, u, 0, 0), s) {
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 r = (n(e) - d.getUTCDay() + 7) % 7;
71
- d.setUTCDate(d.getUTCDate() + r);
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
- return {
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(d.getHours())}:${e(d.getMinutes())}`,
81
- ...s ? { dayOfWeek: String(r(d.getDay())) } : {},
82
- ...c ? { dayOfMonth: String(d.getDate()) } : {}
82
+ time: `${e(p.getHours())}:${e(p.getMinutes())}`,
83
+ ...l ? { dayOfWeek: String(o(p.getDay())) } : {},
84
+ ...m ? { dayOfMonth: m } : {}
83
85
  };
84
- }, m = (e) => {
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, a = !!n;
90
- if (a === !!r) return {
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 s = {
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 (a) return {
103
+ if (i) return {
101
104
  ok: !0,
102
105
  values: {
103
- ...s,
104
- repeat: i.OneTime,
105
- runAt: d(n),
106
- time: o
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 c = p(r.fields);
114
- if (!c.ok) return {
116
+ let o = g(r.fields);
117
+ if (!o.ok) return {
115
118
  ok: !1,
116
119
  reason: t.UnsupportedCronShape
117
120
  };
118
- if (c.isHourly) return {
121
+ if (o.isHourly) return {
119
122
  ok: !0,
120
123
  values: {
121
- ...s,
122
- repeat: i.Hourly,
123
- time: o,
124
- minute: c.minute,
125
- ...r.startDate ? { startDate: f(r.startDate) } : {},
126
- ...r.endDate ? { endDate: f(r.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 l = i.Daily;
130
- return c.dayOfWeek ? l = i.Weekly : c.dayOfMonth && (l = i.Monthly), {
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
- ...s,
134
- repeat: l,
135
- time: c.time,
136
- ...c.dayOfWeek ? { dayOfWeek: c.dayOfWeek } : {},
137
- ...c.dayOfMonth ? { dayOfMonth: c.dayOfMonth } : {},
138
- ...r.startDate ? { startDate: f(r.startDate) } : {},
139
- ...r.endDate ? { endDate: f(r.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 { l as mapFormValuesToCreateBody, u as mapFormValuesToUpdateBody, m as mapScheduledTaskDtoToFormValues };
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 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);
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 = ++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;
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
- ++S.current, t.abort(), T.current?.abort(), T.current = null;
31
+ ++A.current, t.abort(), N.current?.abort(), N.current = null, L.current?.abort(), L.current = null;
10
32
  };
11
- return !o || !a ? (d(!1), l([]), y(!1), n) : ((async () => {
12
- d(!0);
33
+ return !p || !f ? (y(!1), _([]), D(!1), n) : ((async () => {
34
+ y(!0);
13
35
  try {
14
- let n = await i.listScheduledTaskRuns({
15
- scheduleId: a,
16
- limit: s,
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 (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));
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
- S.current === e && h(t instanceof Error ? t : /* @__PURE__ */ Error("Failed to load scheduled task runs"));
45
+ A.current === e && C(t instanceof Error ? t : /* @__PURE__ */ Error("Failed to load scheduled task runs"));
24
46
  } finally {
25
- S.current === e && d(!1);
47
+ A.current === e && y(!1);
26
48
  }
27
49
  })(), n);
28
50
  }, [
29
- i,
30
- o,
31
- s,
32
- b,
33
- a
51
+ c,
52
+ p,
53
+ m,
54
+ O,
55
+ f
34
56
  ]);
35
- let E = e(() => {
36
- if (!o || !a || !v || u || w.current) return;
37
- w.current = !0;
57
+ let H = e(() => {
58
+ if (!p || !f || !E || v || M.current) return;
59
+ M.current = !0;
38
60
  let e = new AbortController();
39
- T.current = e;
40
- let t = S.current, n = C.current;
61
+ N.current = e;
62
+ let t = A.current, n = j.current;
41
63
  (async () => {
42
- p(!0), _(null);
64
+ x(!0), T(null);
43
65
  try {
44
- let r = await i.listScheduledTaskRuns({
45
- scheduleId: a,
46
- limit: s,
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 (S.current !== t) return;
51
- l((e) => {
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
- }), C.current = n + r.items.length, y(r.next != null || (r.count == null ? r.items.length === s : n + r.items.length < r.count));
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
- S.current === t && _(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more scheduled task runs"));
78
+ A.current === t && T(e instanceof Error ? e : /* @__PURE__ */ Error("Failed to load more scheduled task runs"));
57
79
  } finally {
58
- S.current === t && (p(!1), w.current = !1, T.current = null);
80
+ A.current === t && (x(!1), M.current = !1, N.current = null);
59
81
  }
60
82
  })();
61
83
  }, [
62
- i,
63
- o,
84
+ c,
85
+ p,
86
+ E,
64
87
  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), [])
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 { i as useScheduledTaskRuns };
194
+ export { u as mergeRunsById, f as useScheduledTaskRuns };