@epam/ai-dial-chat-hooks 1.2.0-dev.264 → 1.2.0-dev.266

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.
@@ -2,17 +2,16 @@ import { useEffect as e, useMemo as t } from "react";
2
2
  //#region src/conversation/useActiveConversationSync/useActiveConversationSync.ts
3
3
  var n = ({ activeConversationId: n, items: r, refreshConversations: i, markConversationViewed: a, conversationIdsMatch: o, toPanelConversationId: s }) => {
4
4
  let c = t(() => n ? s(n) : void 0, [n, s]);
5
- return e(() => {
5
+ e(() => {
6
6
  c && (r.some((e) => o(e.id, c)) || i());
7
- }, [c, o]), e(() => {
8
- if (!c) return;
9
- let e = r.find((e) => o(e.id, c));
10
- e && a(e.id);
7
+ }, [c, o]);
8
+ let l = c ? r.find((e) => o(e.id, c))?.id : void 0;
9
+ return e(() => {
10
+ c && l && a(l);
11
11
  }, [
12
12
  c,
13
- r,
14
- a,
15
- o
13
+ l,
14
+ a
16
15
  ]), c;
17
16
  };
18
17
  //#endregion
package/conversation.d.ts CHANGED
@@ -886,7 +886,8 @@ export declare interface TranscribeWithDeploymentParams {
886
886
  * 1. If the active conversation is not present in the list, requests a
887
887
  * refresh. The list and refresh callback are intentionally excluded from
888
888
  * the dependency array to avoid a refresh-loop on every list update.
889
- * 2. Marks the active conversation as viewed whenever it or the list changes.
889
+ * 2. Marks the active conversation as viewed when its matching identity becomes
890
+ * available. List refreshes and persistence rollback do not retry the write.
890
891
  */
891
892
  export declare const useActiveConversationSync: ({ activeConversationId, items, refreshConversations, markConversationViewed, conversationIdsMatch, toPanelConversationId, }: UseActiveConversationSyncParams) => string | undefined;
892
893
 
package/index.d.ts CHANGED
@@ -1264,6 +1264,8 @@ export declare const deriveFavoriteItems: (items: readonly CatalogItem[]) => Cat
1264
1264
  * Unsupported constraints remain Custom, with the full source expression.
1265
1265
  * Calendar-month shifts crossing month boundaries or days 29–31 remain
1266
1266
  * Custom because a shifted monthly day is not equivalent around short months.
1267
+ * The one exception is `day: 'last'` one day behind local time, which is
1268
+ * exactly the local 1st.
1267
1269
  */
1268
1270
  export declare const describeScheduledTaskTrigger: (trigger: ScheduleTriggerDto, { timeZone, referenceDate, }?: ScheduledTaskTriggerDescriptionOptions) => ScheduledTaskTriggerDescription;
1269
1271
 
@@ -4619,7 +4621,8 @@ export declare const USAGE_MODEL_LIMITS_I18N_KEYS: {
4619
4621
  * 1. If the active conversation is not present in the list, requests a
4620
4622
  * refresh. The list and refresh callback are intentionally excluded from
4621
4623
  * the dependency array to avoid a refresh-loop on every list update.
4622
- * 2. Marks the active conversation as viewed whenever it or the list changes.
4624
+ * 2. Marks the active conversation as viewed when its matching identity becomes
4625
+ * available. List refreshes and persistence rollback do not retry the write.
4623
4626
  */
4624
4627
  export declare const useActiveConversationSync: ({ activeConversationId, items, refreshConversations, markConversationViewed, conversationIdsMatch, toPanelConversationId, }: UseActiveConversationSyncParams) => string | undefined;
4625
4628
 
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.264",
4
+ "version": "1.2.0-dev.266",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
7
7
  "main": "./index.js",
@@ -111,7 +111,7 @@
111
111
  }
112
112
  },
113
113
  "dependencies": {
114
- "@epam/ai-dial-chat-api-client": "1.2.0-dev.264",
114
+ "@epam/ai-dial-chat-api-client": "1.2.0-dev.266",
115
115
  "dompurify": "3.4.16",
116
116
  "fflate": "^0.8.3",
117
117
  "lru-cache": "^10.4.3",
@@ -120,21 +120,21 @@
120
120
  },
121
121
  "peerDependencies": {
122
122
  "react": "^19.2.8",
123
- "@epam/ai-dial-attachment-canvas": "1.2.0-dev.264",
124
- "@epam/ai-dial-attachment-input": "1.2.0-dev.264",
125
- "@epam/ai-dial-catalog": "1.2.0-dev.264",
126
- "@epam/ai-dial-chat-overlay": "1.2.0-dev.264",
127
- "@epam/ai-dial-chat-shared": "1.2.0-dev.264",
128
- "@epam/ai-dial-mcp-apps": "1.2.0-dev.264",
129
- "@epam/ai-dial-publish-panel": "1.2.0-dev.264",
130
- "@epam/ai-dial-quotations": "1.2.0-dev.264",
123
+ "@epam/ai-dial-attachment-canvas": "1.2.0-dev.266",
124
+ "@epam/ai-dial-attachment-input": "1.2.0-dev.266",
125
+ "@epam/ai-dial-catalog": "1.2.0-dev.266",
126
+ "@epam/ai-dial-chat-overlay": "1.2.0-dev.266",
127
+ "@epam/ai-dial-chat-shared": "1.2.0-dev.266",
128
+ "@epam/ai-dial-mcp-apps": "1.2.0-dev.266",
129
+ "@epam/ai-dial-publish-panel": "1.2.0-dev.266",
130
+ "@epam/ai-dial-quotations": "1.2.0-dev.266",
131
131
  "@epam/ai-dial-react-file-manager": "^0.3.0-dev.22",
132
- "@epam/ai-dial-scheduled-tasks": "1.2.0-dev.264",
133
- "@epam/ai-dial-share": "1.2.0-dev.264",
134
- "@epam/ai-dial-skill-editor": "1.2.0-dev.264",
135
- "@epam/ai-dial-source-panel": "1.2.0-dev.264",
132
+ "@epam/ai-dial-scheduled-tasks": "1.2.0-dev.266",
133
+ "@epam/ai-dial-share": "1.2.0-dev.266",
134
+ "@epam/ai-dial-skill-editor": "1.2.0-dev.266",
135
+ "@epam/ai-dial-source-panel": "1.2.0-dev.266",
136
136
  "@epam/ai-dial-ui-kit": "^0.15.0-dev.36",
137
- "@epam/ai-dial-usage-dashboard": "1.2.0-dev.264",
137
+ "@epam/ai-dial-usage-dashboard": "1.2.0-dev.266",
138
138
  "@modelcontextprotocol/sdk": "^1.29.0",
139
139
  "@epam/pdf-highlighter-kit": "^0.0.19",
140
140
  "@mcp-ui/client": "^7.1.1"
@@ -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,41 +1,42 @@
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(),
@@ -45,19 +46,19 @@ var a = new Set([
45
46
  ...e.skillUrl ? { skillUrl: e.skillUrl } : {},
46
47
  ...n ? { description: n } : {}
47
48
  };
48
- }, u = (e) => ({
49
- ...l(e),
49
+ }, p = (e) => ({
50
+ ...f(e),
50
51
  skillUrl: e.skillUrl || null
51
- }), d = (t) => {
52
+ }), m = (t) => {
52
53
  let n = new Date(t);
53
54
  return `${n.getFullYear()}-${e(n.getMonth() + 1)}-${e(n.getDate())}T${e(n.getHours())}:${e(n.getMinutes())}`;
54
- }, f = (t) => {
55
+ }, h = (t) => {
55
56
  let n = new Date(t);
56
57
  return `${n.getFullYear()}-${e(n.getMonth() + 1)}-${e(n.getDate())}`;
57
- }, p = (t) => {
58
- 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");
59
- if (o.length > 0 || s && c || !i.has("hour") || !i.has("minute")) return { ok: !1 };
60
- 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) {
61
62
  let e = /* @__PURE__ */ new Date();
62
63
  return e.setUTCHours(0, Number(t.minute), 0, 0), {
63
64
  ok: !0,
@@ -65,85 +66,82 @@ var a = new Set([
65
66
  minute: String(e.getMinutes())
66
67
  };
67
68
  }
68
- let l = Number(t.hour), u = Number(t.minute);
69
- if (Number.isNaN(l) || Number.isNaN(u)) return { ok: !1 };
70
- let d = /* @__PURE__ */ new Date();
71
- 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) {
72
73
  let e = Number(t.day_of_week);
73
74
  if (Number.isNaN(e)) return { ok: !1 };
74
- let r = (n(e) - d.getUTCDay() + 7) % 7;
75
- d.setUTCDate(d.getUTCDate() + r);
76
- } else if (c) {
77
- let e = Number(t.day);
78
- if (Number.isNaN(e)) return { ok: !1 };
79
- d.setUTCDate(e);
75
+ let n = (a(e) - p.getUTCDay() + 7) % 7;
76
+ p.setUTCDate(p.getUTCDate() + n);
80
77
  }
81
- return {
78
+ let m = u ? r(String(t.day), n(p)) : void 0;
79
+ return u && !m ? { ok: !1 } : {
82
80
  ok: !0,
83
81
  isHourly: !1,
84
- time: `${e(d.getHours())}:${e(d.getMinutes())}`,
85
- ...s ? { dayOfWeek: String(r(d.getDay())) } : {},
86
- ...c ? { dayOfMonth: String(d.getDate()) } : {}
82
+ time: `${e(p.getHours())}:${e(p.getMinutes())}`,
83
+ ...l ? { dayOfWeek: String(o(p.getDay())) } : {},
84
+ ...m ? { dayOfMonth: m } : {}
87
85
  };
88
- }, m = (e) => {
86
+ }, _ = (e) => {
89
87
  if (!e.model || typeof e.prompt != "string" || !e.prompt.trim() && !e.skillUrl) return {
90
88
  ok: !1,
91
89
  reason: t.MissingRequiredFields
92
90
  };
93
- let { date: n, cron: r } = e.trigger, a = !!n;
94
- if (a === !!r) return {
91
+ let { date: n, cron: r } = e.trigger, i = !!n;
92
+ if (i === !!r) return {
95
93
  ok: !1,
96
94
  reason: t.UnsupportedTriggerType
97
95
  };
98
- let s = {
96
+ let a = {
99
97
  displayName: e.displayName,
100
98
  modelId: e.model,
101
99
  prompt: e.prompt,
102
100
  ...e.skillUrl ? { skillUrl: e.skillUrl } : {},
103
101
  ...e.description ? { description: e.description } : {}
104
102
  };
105
- if (a) return {
103
+ if (i) return {
106
104
  ok: !0,
107
105
  values: {
108
- ...s,
109
- repeat: i.OneTime,
110
- runAt: d(n),
111
- time: o
106
+ ...a,
107
+ repeat: s.OneTime,
108
+ runAt: m(n),
109
+ time: l
112
110
  }
113
111
  };
114
112
  if (!r) return {
115
113
  ok: !1,
116
114
  reason: t.UnsupportedTriggerType
117
115
  };
118
- let c = p(r.fields);
119
- if (!c.ok) return {
116
+ let o = g(r.fields);
117
+ if (!o.ok) return {
120
118
  ok: !1,
121
119
  reason: t.UnsupportedCronShape
122
120
  };
123
- if (c.isHourly) return {
121
+ if (o.isHourly) return {
124
122
  ok: !0,
125
123
  values: {
126
- ...s,
127
- repeat: i.Hourly,
128
- time: o,
129
- minute: c.minute,
130
- ...r.startDate ? { startDate: f(r.startDate) } : {},
131
- ...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) } : {}
132
130
  }
133
131
  };
134
- let l = i.Daily;
135
- 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), {
136
134
  ok: !0,
137
135
  values: {
138
- ...s,
139
- repeat: l,
140
- time: c.time,
141
- ...c.dayOfWeek ? { dayOfWeek: c.dayOfWeek } : {},
142
- ...c.dayOfMonth ? { dayOfMonth: c.dayOfMonth } : {},
143
- ...r.startDate ? { startDate: f(r.startDate) } : {},
144
- ...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) } : {}
145
143
  }
146
144
  };
147
145
  };
148
146
  //#endregion
149
- export { l as mapFormValuesToCreateBody, u as mapFormValuesToUpdateBody, m as mapScheduledTaskDtoToFormValues };
147
+ export { f as mapFormValuesToCreateBody, p as mapFormValuesToUpdateBody, _ as mapScheduledTaskDtoToFormValues };
@@ -25,6 +25,8 @@ export declare const createScheduledTasksApiClient: (client: ScheduledTasksConfi
25
25
  * Unsupported constraints remain Custom, with the full source expression.
26
26
  * Calendar-month shifts crossing month boundaries or days 29–31 remain
27
27
  * Custom because a shifted monthly day is not equivalent around short months.
28
+ * The one exception is `day: 'last'` one day behind local time, which is
29
+ * exactly the local 1st.
28
30
  */
29
31
  export declare const describeScheduledTaskTrigger: (trigger: ScheduleTriggerDto, { timeZone, referenceDate, }?: ScheduledTaskTriggerDescriptionOptions) => ScheduledTaskTriggerDescription;
30
32
 
@@ -0,0 +1,13 @@
1
+ //#region src/shared/cron-day-of-month.ts
2
+ var e = "last", t = 31, n = 864e5, r = (e) => Math.round((Date.UTC(e.getUTCFullYear(), e.getUTCMonth(), e.getUTCDate()) - Date.UTC(e.getFullYear(), e.getMonth(), e.getDate())) / n), i = (n, r) => {
3
+ let i = n + r;
4
+ return i < 1 ? e : i > t ? "1" : String(i);
5
+ }, a = (e, n) => {
6
+ if (e === "last") return n === -1 ? "1" : void 0;
7
+ let r = Number(e);
8
+ if (!/^\d+$/.test(e) || r < 1 || r > t) return;
9
+ let i = r - n;
10
+ return i < 1 ? String(t) : i > t ? "1" : String(i);
11
+ };
12
+ //#endregion
13
+ export { e as CRON_LAST_DAY_OF_MONTH, r as getUtcDayShift, a as toLocalDayOfMonth, i as toUtcCronDayOfMonth };