@burtson-labs/bandit-engine 2.1.2 → 2.1.4

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 (42) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/SchedulesTab-YZG3P2GW.mjs +544 -0
  3. package/dist/SchedulesTab-YZG3P2GW.mjs.map +1 -0
  4. package/dist/aiProviderStore-ANPQVHGD.mjs +9 -0
  5. package/dist/chat-W7MDFESE.mjs +15 -0
  6. package/dist/chunk-4LLCLYLH.mjs +13 -0
  7. package/dist/chunk-4LLCLYLH.mjs.map +1 -0
  8. package/dist/chunk-62H3OLTV.mjs +582 -0
  9. package/dist/chunk-62H3OLTV.mjs.map +1 -0
  10. package/dist/{chunk-FCQN3LKT.mjs → chunk-6CSFKF34.mjs} +9 -16
  11. package/dist/chunk-6CSFKF34.mjs.map +1 -0
  12. package/dist/chunk-DH5A2HT2.mjs +289 -0
  13. package/dist/chunk-DH5A2HT2.mjs.map +1 -0
  14. package/dist/{chunk-3UABXOPF.mjs → chunk-GX4FVZNA.mjs} +9 -225
  15. package/dist/chunk-GX4FVZNA.mjs.map +1 -0
  16. package/dist/chunk-LMAQWR7Z.mjs +388 -0
  17. package/dist/chunk-LMAQWR7Z.mjs.map +1 -0
  18. package/dist/chunk-PSI7RQ54.mjs +1315 -0
  19. package/dist/chunk-PSI7RQ54.mjs.map +1 -0
  20. package/dist/chunk-S3DWWUBD.mjs +224 -0
  21. package/dist/chunk-S3DWWUBD.mjs.map +1 -0
  22. package/dist/{chunk-WX2HUL3Y.mjs → chunk-W2D454CZ.mjs} +2638 -4183
  23. package/dist/chunk-W2D454CZ.mjs.map +1 -0
  24. package/dist/index.d.mts +2 -2
  25. package/dist/index.d.ts +2 -2
  26. package/dist/index.js +4308 -2813
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1598 -1630
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/modelStore-FIVOSLFY.mjs +9 -0
  31. package/dist/schedule-confirm-card-N4TKLEHL.mjs +292 -0
  32. package/dist/schedule-confirm-card-N4TKLEHL.mjs.map +1 -0
  33. package/package.json +1 -1
  34. package/dist/aiProviderStore-OLMQHX7E.mjs +0 -8
  35. package/dist/chat-7K5TKTRM.mjs +0 -10
  36. package/dist/chunk-3UABXOPF.mjs.map +0 -1
  37. package/dist/chunk-FCQN3LKT.mjs.map +0 -1
  38. package/dist/chunk-WX2HUL3Y.mjs.map +0 -1
  39. package/dist/modelStore-SEC34WRM.mjs +0 -8
  40. /package/dist/{aiProviderStore-OLMQHX7E.mjs.map → aiProviderStore-ANPQVHGD.mjs.map} +0 -0
  41. /package/dist/{chat-7K5TKTRM.mjs.map → chat-W7MDFESE.mjs.map} +0 -0
  42. /package/dist/{modelStore-SEC34WRM.mjs.map → modelStore-FIVOSLFY.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  Notable changes to `@burtson-labs/bandit-engine`. Versions follow semver.
4
4
 
5
+ ## 2.1.4
6
+
7
+ ### Management
8
+
9
+ - A Bandit Crew section under MCP tools: create, list and remove the named Bandits (AI teammates) your account or workspace runs in Slack.
10
+
11
+ ## 2.1.3
12
+
13
+ ### Chat
14
+
15
+ - Scheduled tasks. The model can set up a recurring prompt with the new `create_schedule` tool ("every weekday at 8:00, summarise AI news and email me"). It never creates one silently: a confirmation card shows the name, timing, time zone, prompt and delivery, the person can correct any of it, and the gateway's preview shows the next run before they press Create. The tool call appears on the tool trail ("Scheduled: Morning AI brief" or "Schedule not created").
16
+ - `/chat?conversation=<id>` opens that conversation, fetching it from the gateway when this device has not synced it (the "Open in Bandit" link in a scheduled run's email).
17
+
18
+ ### Management
19
+
20
+ - A Schedules section for every signed-in person: list with pause, resume, run now, edit and delete, a form for new schedules with the gateway's preview of the next run, the plan's active-schedule cap, and recent results with a link into the saved conversation. Loaded with its first visit; the chat drawer gets a shortcut to it.
21
+
5
22
  ## 2.1.2
6
23
 
7
24
  ### Chat
@@ -0,0 +1,544 @@
1
+ import {
2
+ ManagementEmptyState
3
+ } from "./chunk-DH5A2HT2.mjs";
4
+ import {
5
+ Edit,
6
+ Plus,
7
+ Refresh,
8
+ StreamingMarkdown_default,
9
+ Trash
10
+ } from "./chunk-PSI7RQ54.mjs";
11
+ import {
12
+ browserTimeZone,
13
+ createSchedule,
14
+ deleteSchedule,
15
+ describeSchedule,
16
+ formatInZone,
17
+ getScheduleRun,
18
+ listRecentScheduleRuns,
19
+ listSchedules,
20
+ pauseSchedule,
21
+ previewSchedule,
22
+ resumeSchedule,
23
+ runScheduleNow,
24
+ updateSchedule
25
+ } from "./chunk-LMAQWR7Z.mjs";
26
+ import "./chunk-4LLCLYLH.mjs";
27
+ import "./chunk-S3DWWUBD.mjs";
28
+ import "./chunk-NI7BKLC7.mjs";
29
+
30
+ // src/management/components/SchedulesTab.tsx
31
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
32
+ import {
33
+ Alert,
34
+ Box,
35
+ Button,
36
+ Chip,
37
+ CircularProgress,
38
+ Collapse,
39
+ FormControlLabel,
40
+ IconButton,
41
+ Link,
42
+ MenuItem,
43
+ Paper,
44
+ Skeleton,
45
+ Stack,
46
+ Switch,
47
+ TextField,
48
+ Tooltip,
49
+ Typography
50
+ } from "@mui/material";
51
+ import { jsx, jsxs } from "react/jsx-runtime";
52
+ var PRESETS = [
53
+ { value: "daily", label: "Every day" },
54
+ { value: "weekdays", label: "Weekdays" },
55
+ { value: "weekly", label: "Weekly" },
56
+ { value: "custom", label: "Custom (cron)" }
57
+ ];
58
+ var WEEKDAYS = ["monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"];
59
+ var emptyForm = (timeZone, model) => ({
60
+ name: "",
61
+ prompt: "",
62
+ preset: "weekdays",
63
+ time: "08:00",
64
+ timeZone,
65
+ model,
66
+ webSearch: true,
67
+ deliverEmail: true
68
+ });
69
+ var fromSchedule = (s) => ({
70
+ name: s.name,
71
+ prompt: s.prompt,
72
+ preset: s.preset,
73
+ time: s.time ?? void 0,
74
+ weekday: s.weekday === null || s.weekday === void 0 ? void 0 : WEEKDAYS[(s.weekday + 6) % 7],
75
+ cron: s.preset === "custom" ? s.cron : void 0,
76
+ timeZone: s.timeZone,
77
+ model: s.model,
78
+ webSearch: s.webSearch,
79
+ deliverEmail: s.deliverEmail
80
+ });
81
+ var errorText = (e, fallback) => e instanceof Error && e.message ? e.message : fallback;
82
+ var statusLabel = (run) => run.status === "succeeded" ? "Done" : run.status === "failed" ? "Failed" : run.status === "skipped" ? "Skipped" : "Running";
83
+ var statusColor = (status) => status === "succeeded" ? "success" : status === "failed" ? "error" : status === "skipped" ? "warning" : "default";
84
+ var SchedulesTab = ({ showSnackbar, chatPath = "/chat" }) => {
85
+ const [schedules, setSchedules] = useState([]);
86
+ const [limits, setLimits] = useState(null);
87
+ const [runs, setRuns] = useState([]);
88
+ const [loading, setLoading] = useState(true);
89
+ const [loadError, setLoadError] = useState(null);
90
+ const [busy, setBusy] = useState({});
91
+ const [form, setForm] = useState(null);
92
+ const [editingId, setEditingId] = useState(null);
93
+ const [formError, setFormError] = useState(null);
94
+ const [saving, setSaving] = useState(false);
95
+ const [preview, setPreview] = useState(null);
96
+ const [previewError, setPreviewError] = useState(null);
97
+ const [openRun, setOpenRun] = useState(null);
98
+ const pollTimer = useRef(null);
99
+ const formRef = useRef(null);
100
+ const notify = useCallback(
101
+ (message, severity = "success") => showSnackbar?.(message, severity),
102
+ [showSnackbar]
103
+ );
104
+ const refresh = useCallback(async (quiet = false) => {
105
+ if (!quiet) setLoading(true);
106
+ try {
107
+ const [list, recent] = await Promise.all([listSchedules(), listRecentScheduleRuns(20)]);
108
+ setSchedules(list.schedules);
109
+ setLimits(list.limits);
110
+ setRuns(recent);
111
+ setLoadError(null);
112
+ } catch (e) {
113
+ setLoadError(errorText(e, "Couldn't load your schedules. The gateway didn't respond."));
114
+ } finally {
115
+ setLoading(false);
116
+ }
117
+ }, []);
118
+ useEffect(() => {
119
+ void refresh();
120
+ return () => {
121
+ if (pollTimer.current) clearTimeout(pollTimer.current);
122
+ };
123
+ }, [refresh]);
124
+ useEffect(() => {
125
+ try {
126
+ const id = new URLSearchParams(window.location.search).get("run");
127
+ if (!id) return;
128
+ getScheduleRun(id).then((run) => {
129
+ setRuns((prev) => prev.some((r) => r.id === run.id) ? prev : [run, ...prev]);
130
+ setOpenRun(run.id);
131
+ }).catch(() => void 0);
132
+ } catch {
133
+ }
134
+ }, []);
135
+ const anyRunning = useMemo(
136
+ () => schedules.some((s) => s.runRequested) || runs.some((r) => r.status === "running"),
137
+ [schedules, runs]
138
+ );
139
+ useEffect(() => {
140
+ if (!anyRunning) return;
141
+ pollTimer.current = setTimeout(() => void refresh(true), 5e3);
142
+ return () => {
143
+ if (pollTimer.current) clearTimeout(pollTimer.current);
144
+ };
145
+ }, [anyRunning, schedules, runs, refresh]);
146
+ const timing = form ? { preset: form.preset, time: form.time, weekday: form.weekday, cron: form.cron, timeZone: form.timeZone } : null;
147
+ const timingKey = timing ? JSON.stringify(timing) : "";
148
+ useEffect(() => {
149
+ if (!timing) return;
150
+ if (timing.preset === "custom" ? !timing.cron : !timing.time) return;
151
+ let cancelled = false;
152
+ const handle = setTimeout(() => {
153
+ previewSchedule(timing).then((p) => {
154
+ if (cancelled) return;
155
+ setPreviewError(null);
156
+ setPreview(`${p.description}${p.next[0] ? ` \xB7 next run ${formatInZone(p.next[0], p.timeZone)}` : ""}`);
157
+ }).catch((e) => {
158
+ if (cancelled) return;
159
+ setPreview(null);
160
+ setPreviewError(errorText(e, "This schedule is not valid."));
161
+ });
162
+ }, 250);
163
+ return () => {
164
+ cancelled = true;
165
+ clearTimeout(handle);
166
+ };
167
+ }, [timingKey]);
168
+ const withBusy = async (id, work, failure) => {
169
+ setBusy((b) => ({ ...b, [id]: true }));
170
+ try {
171
+ await work();
172
+ } catch (e) {
173
+ notify(errorText(e, failure), "error");
174
+ } finally {
175
+ setBusy((b) => ({ ...b, [id]: false }));
176
+ }
177
+ };
178
+ const openNew = () => {
179
+ setEditingId(null);
180
+ setForm(emptyForm(browserTimeZone(), limits?.defaultModel));
181
+ setFormError(null);
182
+ setPreview(null);
183
+ setPreviewError(null);
184
+ requestAnimationFrame(() => formRef.current?.scrollIntoView?.({ behavior: "smooth", block: "nearest" }));
185
+ };
186
+ const openEdit = (s) => {
187
+ setEditingId(s.id);
188
+ setForm(fromSchedule(s));
189
+ setFormError(null);
190
+ setPreview(null);
191
+ setPreviewError(null);
192
+ requestAnimationFrame(() => formRef.current?.scrollIntoView?.({ behavior: "smooth", block: "nearest" }));
193
+ };
194
+ const closeForm = () => {
195
+ setForm(null);
196
+ setEditingId(null);
197
+ setFormError(null);
198
+ };
199
+ const submitForm = async () => {
200
+ if (!form) return;
201
+ setSaving(true);
202
+ setFormError(null);
203
+ const payload = {
204
+ ...form,
205
+ name: form.name.trim(),
206
+ prompt: form.prompt.trim(),
207
+ time: form.preset === "custom" ? void 0 : form.time,
208
+ weekday: form.preset === "weekly" ? form.weekday : void 0,
209
+ cron: form.preset === "custom" ? form.cron?.trim() : void 0
210
+ };
211
+ try {
212
+ if (editingId) {
213
+ const updated = await updateSchedule(editingId, payload);
214
+ setSchedules((prev) => prev.map((s) => s.id === updated.id ? updated : s));
215
+ notify("Schedule updated.");
216
+ } else {
217
+ const created = await createSchedule(payload);
218
+ setSchedules((prev) => [created, ...prev]);
219
+ setLimits((l) => l ? { ...l, active: l.active + (created.status === "active" ? 1 : 0) } : l);
220
+ notify("Schedule created.");
221
+ }
222
+ closeForm();
223
+ } catch (e) {
224
+ setFormError(errorText(e, "The schedule could not be saved."));
225
+ } finally {
226
+ setSaving(false);
227
+ }
228
+ };
229
+ const togglePause = (s) => withBusy(
230
+ s.id,
231
+ async () => {
232
+ const next = s.status === "active" ? await pauseSchedule(s.id) : await resumeSchedule(s.id);
233
+ setSchedules((prev) => prev.map((x) => x.id === next.id ? next : x));
234
+ setLimits((l) => l ? { ...l, active: l.active + (next.status === "active" ? 1 : -1) } : l);
235
+ notify(next.status === "active" ? "Schedule resumed." : "Schedule paused.");
236
+ },
237
+ "The schedule could not be changed."
238
+ );
239
+ const runNow = (s) => withBusy(
240
+ s.id,
241
+ async () => {
242
+ await runScheduleNow(s.id);
243
+ setSchedules((prev) => prev.map((x) => x.id === s.id ? { ...x, runRequested: true } : x));
244
+ notify("Queued. The result appears below in a minute or two.");
245
+ },
246
+ "The run could not be started."
247
+ );
248
+ const remove = (s) => withBusy(
249
+ s.id,
250
+ async () => {
251
+ await deleteSchedule(s.id);
252
+ setSchedules((prev) => prev.filter((x) => x.id !== s.id));
253
+ setRuns((prev) => prev.filter((r) => r.scheduleId !== s.id));
254
+ setLimits((l) => l ? { ...l, active: l.active - (s.status === "active" ? 1 : 0) } : l);
255
+ if (editingId === s.id) closeForm();
256
+ notify("Schedule deleted.");
257
+ },
258
+ "The schedule could not be deleted."
259
+ );
260
+ const atCap = limits ? limits.active >= limits.max : false;
261
+ const fieldSx = { "& .MuiOutlinedInput-root": { borderRadius: 2 } };
262
+ const formValid = !!form && form.name.trim().length > 0 && form.prompt.trim().length > 0 && (form.preset === "custom" ? Boolean(form.cron?.trim()) : Boolean(form.time)) && (form.preset !== "weekly" || Boolean(form.weekday)) && !previewError;
263
+ return /* @__PURE__ */ jsxs(Stack, { spacing: 3, children: [
264
+ loadError && /* @__PURE__ */ jsx(
265
+ Alert,
266
+ {
267
+ severity: "error",
268
+ action: /* @__PURE__ */ jsx(Button, { color: "inherit", size: "small", onClick: () => void refresh(), children: "Retry" }),
269
+ children: loadError
270
+ }
271
+ ),
272
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 2, flexWrap: "wrap" }, children: [
273
+ /* @__PURE__ */ jsxs(Box, { children: [
274
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", sx: { fontWeight: 600 }, children: "Your schedules" }),
275
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: limits ? `${limits.active} of ${limits.max} active on the ${limits.plan.replace("_", " ")} plan \xB7 at most one run per ${limits.minIntervalMinutes >= 60 ? `${Math.round(limits.minIntervalMinutes / 60)} hour${limits.minIntervalMinutes >= 120 ? "s" : ""}` : `${limits.minIntervalMinutes} minutes`}` : "Prompts Bandit runs for you, with results in chat and by email." })
276
+ ] }),
277
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
278
+ /* @__PURE__ */ jsx(Tooltip, { title: "Refresh", children: /* @__PURE__ */ jsx(IconButton, { "aria-label": "Refresh schedules", onClick: () => void refresh(), size: "small", children: /* @__PURE__ */ jsx(Refresh, { fontSize: "small" }) }) }),
279
+ /* @__PURE__ */ jsx(
280
+ Button,
281
+ {
282
+ variant: "contained",
283
+ size: "small",
284
+ startIcon: /* @__PURE__ */ jsx(Plus, {}),
285
+ onClick: openNew,
286
+ disabled: loading || !!loadError || atCap && !editingId,
287
+ sx: { textTransform: "none", borderRadius: 999 },
288
+ children: "New schedule"
289
+ }
290
+ )
291
+ ] })
292
+ ] }),
293
+ atCap && limits && !form && /* @__PURE__ */ jsx(Alert, { severity: "info", children: limits.max === 0 ? "Scheduled tasks are not included in your plan." : `Your plan allows ${limits.max} active schedule${limits.max === 1 ? "" : "s"}. Pause or delete one to add another.` }),
294
+ limits && !limits.emailAvailable && /* @__PURE__ */ jsx(Alert, { severity: "warning", children: "Email delivery is not available for this account right now; results still appear in your chat history." }),
295
+ /* @__PURE__ */ jsx("div", { ref: formRef, children: /* @__PURE__ */ jsx(Collapse, { in: !!form, unmountOnExit: true, children: form && /* @__PURE__ */ jsxs(Paper, { variant: "outlined", sx: { p: 2, borderRadius: 3 }, "data-testid": "schedule-form", children: [
296
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", sx: { mb: 1.5 }, children: editingId ? "Edit schedule" : "New schedule" }),
297
+ /* @__PURE__ */ jsxs(Stack, { spacing: 1.5, children: [
298
+ /* @__PURE__ */ jsx(
299
+ TextField,
300
+ {
301
+ label: "Name",
302
+ size: "small",
303
+ value: form.name,
304
+ onChange: (e) => setForm({ ...form, name: e.target.value }),
305
+ inputProps: { maxLength: 120, "aria-label": "Schedule name" },
306
+ sx: fieldSx
307
+ }
308
+ ),
309
+ /* @__PURE__ */ jsx(
310
+ TextField,
311
+ {
312
+ label: "What Bandit should do",
313
+ size: "small",
314
+ multiline: true,
315
+ minRows: 3,
316
+ maxRows: 10,
317
+ value: form.prompt,
318
+ onChange: (e) => setForm({ ...form, prompt: e.target.value }),
319
+ helperText: `Self-contained: the run has no chat context. ${form.prompt.length}/${limits?.maxPromptChars ?? 4e3}`,
320
+ inputProps: { maxLength: limits?.maxPromptChars ?? 4e3, "aria-label": "Prompt to run" },
321
+ sx: fieldSx
322
+ }
323
+ ),
324
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "grid", gap: 1.5, gridTemplateColumns: { xs: "1fr", sm: "1fr 1fr 1fr 1fr" } }, children: [
325
+ /* @__PURE__ */ jsx(
326
+ TextField,
327
+ {
328
+ select: true,
329
+ label: "Repeat",
330
+ size: "small",
331
+ value: form.preset,
332
+ onChange: (e) => setForm({ ...form, preset: e.target.value }),
333
+ sx: fieldSx,
334
+ children: PRESETS.map((p) => /* @__PURE__ */ jsx(MenuItem, { value: p.value, children: p.label }, p.value))
335
+ }
336
+ ),
337
+ form.preset === "weekly" && /* @__PURE__ */ jsx(
338
+ TextField,
339
+ {
340
+ select: true,
341
+ label: "Day",
342
+ size: "small",
343
+ value: form.weekday ?? "",
344
+ onChange: (e) => setForm({ ...form, weekday: e.target.value }),
345
+ sx: fieldSx,
346
+ children: WEEKDAYS.map((d) => /* @__PURE__ */ jsx(MenuItem, { value: d, children: d.charAt(0).toUpperCase() + d.slice(1) }, d))
347
+ }
348
+ ),
349
+ form.preset === "custom" ? /* @__PURE__ */ jsx(
350
+ TextField,
351
+ {
352
+ label: "Cron",
353
+ size: "small",
354
+ value: form.cron ?? "",
355
+ placeholder: "0 8 * * 1-5",
356
+ onChange: (e) => setForm({ ...form, cron: e.target.value }),
357
+ inputProps: { "aria-label": "Cron expression" },
358
+ sx: fieldSx
359
+ }
360
+ ) : /* @__PURE__ */ jsx(
361
+ TextField,
362
+ {
363
+ label: "Time",
364
+ type: "time",
365
+ size: "small",
366
+ value: form.time ?? "",
367
+ onChange: (e) => setForm({ ...form, time: e.target.value }),
368
+ inputProps: { step: 300, "aria-label": "Time of day" },
369
+ InputLabelProps: { shrink: true },
370
+ sx: fieldSx
371
+ }
372
+ ),
373
+ /* @__PURE__ */ jsx(
374
+ TextField,
375
+ {
376
+ label: "Time zone",
377
+ size: "small",
378
+ value: form.timeZone,
379
+ onChange: (e) => setForm({ ...form, timeZone: e.target.value }),
380
+ inputProps: { "aria-label": "Time zone" },
381
+ sx: fieldSx
382
+ }
383
+ ),
384
+ /* @__PURE__ */ jsx(
385
+ TextField,
386
+ {
387
+ select: true,
388
+ label: "Model",
389
+ size: "small",
390
+ value: form.model ?? limits?.defaultModel ?? "",
391
+ onChange: (e) => setForm({ ...form, model: e.target.value }),
392
+ sx: fieldSx,
393
+ children: (limits?.models ?? [form.model ?? ""]).map((m) => /* @__PURE__ */ jsx(MenuItem, { value: m, children: m }, m))
394
+ }
395
+ )
396
+ ] }),
397
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", flexWrap: "wrap", gap: 1 }, children: [
398
+ /* @__PURE__ */ jsx(
399
+ FormControlLabel,
400
+ {
401
+ control: /* @__PURE__ */ jsx(
402
+ Switch,
403
+ {
404
+ size: "small",
405
+ checked: form.webSearch !== false,
406
+ onChange: (e) => setForm({ ...form, webSearch: e.target.checked })
407
+ }
408
+ ),
409
+ label: /* @__PURE__ */ jsx(Typography, { variant: "body2", children: "Search the web" })
410
+ }
411
+ ),
412
+ /* @__PURE__ */ jsx(
413
+ FormControlLabel,
414
+ {
415
+ control: /* @__PURE__ */ jsx(
416
+ Switch,
417
+ {
418
+ size: "small",
419
+ checked: form.deliverEmail !== false,
420
+ disabled: limits ? !limits.emailAvailable : false,
421
+ onChange: (e) => setForm({ ...form, deliverEmail: e.target.checked })
422
+ }
423
+ ),
424
+ label: /* @__PURE__ */ jsxs(Typography, { variant: "body2", children: [
425
+ "Email me the result",
426
+ limits?.email ? ` (${limits.email})` : ""
427
+ ] })
428
+ }
429
+ )
430
+ ] }),
431
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", color: previewError ? "error" : "text.secondary", role: "status", children: previewError ?? preview ?? describeSchedule(form) }),
432
+ formError && /* @__PURE__ */ jsx(Alert, { severity: "error", children: formError }),
433
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, justifyContent: "flex-end", children: [
434
+ /* @__PURE__ */ jsx(Button, { onClick: closeForm, color: "inherit", size: "small", disabled: saving, sx: { textTransform: "none" }, children: "Cancel" }),
435
+ /* @__PURE__ */ jsx(
436
+ Button,
437
+ {
438
+ onClick: () => void submitForm(),
439
+ variant: "contained",
440
+ size: "small",
441
+ disabled: !formValid || saving,
442
+ startIcon: saving ? /* @__PURE__ */ jsx(CircularProgress, { size: 14, color: "inherit" }) : void 0,
443
+ sx: { textTransform: "none", borderRadius: 999 },
444
+ children: editingId ? "Save changes" : "Create schedule"
445
+ }
446
+ )
447
+ ] })
448
+ ] })
449
+ ] }) }) }),
450
+ loading ? /* @__PURE__ */ jsxs(Stack, { spacing: 1, children: [
451
+ /* @__PURE__ */ jsx(Skeleton, { variant: "rounded", height: 72 }),
452
+ /* @__PURE__ */ jsx(Skeleton, { variant: "rounded", height: 72 })
453
+ ] }) : schedules.length === 0 ? !loadError && /* @__PURE__ */ jsx(
454
+ ManagementEmptyState,
455
+ {
456
+ title: "No schedules yet",
457
+ description: 'Ask Bandit in chat ("every weekday at 8, summarise AI news and email me") or create one here.',
458
+ action: /* @__PURE__ */ jsx(Button, { variant: "outlined", size: "small", onClick: openNew, disabled: atCap, sx: { textTransform: "none" }, children: "New schedule" })
459
+ }
460
+ ) : /* @__PURE__ */ jsx(Stack, { spacing: 1, "data-testid": "schedule-list", children: schedules.map((s) => {
461
+ const isBusy = Boolean(busy[s.id]);
462
+ return /* @__PURE__ */ jsx(Paper, { variant: "outlined", sx: { p: 1.75, borderRadius: 3 }, children: /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", gap: 1.5, alignItems: "flex-start", flexWrap: "wrap" }, children: [
463
+ /* @__PURE__ */ jsxs(Box, { sx: { flex: 1, minWidth: 220 }, children: [
464
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, flexWrap: "wrap" }, children: [
465
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", sx: { fontWeight: 600 }, children: s.name }),
466
+ /* @__PURE__ */ jsx(
467
+ Chip,
468
+ {
469
+ size: "small",
470
+ label: s.status === "active" ? "Active" : s.pausedReason === "failures" ? "Paused after failures" : "Paused",
471
+ color: s.status === "active" ? "success" : s.pausedReason === "failures" ? "warning" : "default",
472
+ variant: "outlined",
473
+ sx: { height: 20, fontSize: "0.7rem" }
474
+ }
475
+ ),
476
+ s.runRequested && /* @__PURE__ */ jsx(Chip, { size: "small", label: "Running\u2026", sx: { height: 20, fontSize: "0.7rem" } }),
477
+ s.webSearch && /* @__PURE__ */ jsx(Chip, { size: "small", label: "Web search", variant: "outlined", sx: { height: 20, fontSize: "0.7rem" } }),
478
+ s.deliverEmail && /* @__PURE__ */ jsx(Chip, { size: "small", label: "Email", variant: "outlined", sx: { height: 20, fontSize: "0.7rem" } })
479
+ ] }),
480
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", sx: { mt: 0.25 }, children: [
481
+ s.description,
482
+ s.status === "active" && s.nextRunAt ? ` \xB7 next ${formatInZone(s.nextRunAt, s.timeZone)}` : "",
483
+ s.lastRunAt ? ` \xB7 last run ${statusLabel({ status: s.lastRunStatus ?? "succeeded" }).toLowerCase()} ${formatInZone(s.lastRunAt, s.timeZone)}` : ""
484
+ ] }),
485
+ /* @__PURE__ */ jsx(
486
+ Typography,
487
+ {
488
+ variant: "body2",
489
+ sx: {
490
+ mt: 0.5,
491
+ color: "text.primary",
492
+ overflow: "hidden",
493
+ textOverflow: "ellipsis",
494
+ display: "-webkit-box",
495
+ WebkitLineClamp: 2,
496
+ WebkitBoxOrient: "vertical"
497
+ },
498
+ children: s.prompt
499
+ }
500
+ ),
501
+ s.lastError && s.lastRunStatus !== "succeeded" && /* @__PURE__ */ jsx(Typography, { variant: "caption", color: "error", children: s.lastError })
502
+ ] }),
503
+ /* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 0.5, alignItems: "center", children: [
504
+ /* @__PURE__ */ jsx(Button, { size: "small", onClick: () => void runNow(s), disabled: isBusy || s.runRequested, sx: { textTransform: "none" }, children: "Run now" }),
505
+ /* @__PURE__ */ jsx(Button, { size: "small", onClick: () => void togglePause(s), disabled: isBusy, sx: { textTransform: "none" }, children: s.status === "active" ? "Pause" : "Resume" }),
506
+ /* @__PURE__ */ jsx(Tooltip, { title: "Edit", children: /* @__PURE__ */ jsx(IconButton, { size: "small", "aria-label": `Edit ${s.name}`, onClick: () => openEdit(s), disabled: isBusy, children: /* @__PURE__ */ jsx(Edit, { fontSize: "small" }) }) }),
507
+ /* @__PURE__ */ jsx(Tooltip, { title: "Delete", children: /* @__PURE__ */ jsx(IconButton, { size: "small", "aria-label": `Delete ${s.name}`, onClick: () => void remove(s), disabled: isBusy, children: /* @__PURE__ */ jsx(Trash, { fontSize: "small" }) }) })
508
+ ] })
509
+ ] }) }, s.id);
510
+ }) }),
511
+ /* @__PURE__ */ jsxs(Box, { children: [
512
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle1", sx: { fontWeight: 600, mb: 1 }, children: "Recent results" }),
513
+ runs.length === 0 ? /* @__PURE__ */ jsx(Typography, { variant: "body2", color: "text.secondary", children: "Results appear here after the first run, and in your chat history." }) : /* @__PURE__ */ jsx(Stack, { spacing: 1, "data-testid": "schedule-runs", children: runs.map((run) => {
514
+ const schedule = schedules.find((s) => s.id === run.scheduleId);
515
+ const zone = schedule?.timeZone ?? browserTimeZone();
516
+ const expanded = openRun === run.id;
517
+ return /* @__PURE__ */ jsxs(Paper, { variant: "outlined", sx: { p: 1.5, borderRadius: 3 }, children: [
518
+ /* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 1, flexWrap: "wrap" }, children: [
519
+ /* @__PURE__ */ jsx(Chip, { size: "small", label: statusLabel(run), color: statusColor(run.status), variant: "outlined", sx: { height: 20, fontSize: "0.7rem" } }),
520
+ /* @__PURE__ */ jsx(Typography, { variant: "body2", sx: { fontWeight: 600 }, children: run.scheduleName }),
521
+ /* @__PURE__ */ jsxs(Typography, { variant: "body2", color: "text.secondary", children: [
522
+ formatInZone(run.startedAt, zone),
523
+ run.trigger === "manual" ? " \xB7 run now" : "",
524
+ run.searches.length ? ` \xB7 ${run.searches.length} search${run.searches.length === 1 ? "" : "es"}` : "",
525
+ run.emailSent ? " \xB7 emailed" : ""
526
+ ] }),
527
+ /* @__PURE__ */ jsx(Box, { sx: { flex: 1 } }),
528
+ run.conversationId && /* @__PURE__ */ jsx(Link, { href: `${chatPath}?conversation=${encodeURIComponent(run.conversationId)}`, variant: "body2", underline: "hover", children: "Open in chat" }),
529
+ (run.result || run.error) && /* @__PURE__ */ jsx(Button, { size: "small", onClick: () => setOpenRun(expanded ? null : run.id), sx: { textTransform: "none" }, children: expanded ? "Hide" : "Show" })
530
+ ] }),
531
+ /* @__PURE__ */ jsx(Collapse, { in: expanded, unmountOnExit: true, children: /* @__PURE__ */ jsxs(Box, { sx: { mt: 1.5, pt: 1.5, borderTop: 1, borderColor: "divider" }, children: [
532
+ run.error && /* @__PURE__ */ jsx(Alert, { severity: run.status === "skipped" ? "warning" : "error", sx: { mb: run.result ? 1.5 : 0 }, children: run.error }),
533
+ run.result && /* @__PURE__ */ jsx(StreamingMarkdown_default, { content: run.result })
534
+ ] }) })
535
+ ] }, run.id);
536
+ }) })
537
+ ] })
538
+ ] });
539
+ };
540
+ var SchedulesTab_default = SchedulesTab;
541
+ export {
542
+ SchedulesTab_default as default
543
+ };
544
+ //# sourceMappingURL=SchedulesTab-YZG3P2GW.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/management/components/SchedulesTab.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAMA,SAAS,aAAa,WAAW,SAAS,QAAQ,gBAAgB;AAClE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAiTK,cAUJ,YAVI;AAxRZ,IAAM,UAA2D;AAAA,EAC/D,EAAE,OAAO,SAAS,OAAO,YAAY;AAAA,EACrC,EAAE,OAAO,YAAY,OAAO,WAAW;AAAA,EACvC,EAAE,OAAO,UAAU,OAAO,SAAS;AAAA,EACnC,EAAE,OAAO,UAAU,OAAO,gBAAgB;AAC5C;AAEA,IAAM,WAAW,CAAC,UAAU,WAAW,aAAa,YAAY,UAAU,YAAY,QAAQ;AAE9F,IAAM,YAAY,CAAC,UAAkB,WAAyC;AAAA,EAC5E,MAAM;AAAA,EACN,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,cAAc;AAChB;AAEA,IAAM,eAAe,CAAC,OAAsC;AAAA,EAC1D,MAAM,EAAE;AAAA,EACR,QAAQ,EAAE;AAAA,EACV,QAAQ,EAAE;AAAA,EACV,MAAM,EAAE,QAAQ;AAAA,EAChB,SAAS,EAAE,YAAY,QAAQ,EAAE,YAAY,SAAY,SAAY,UAAU,EAAE,UAAU,KAAK,CAAC;AAAA,EACjG,MAAM,EAAE,WAAW,WAAW,EAAE,OAAO;AAAA,EACvC,UAAU,EAAE;AAAA,EACZ,OAAO,EAAE;AAAA,EACT,WAAW,EAAE;AAAA,EACb,cAAc,EAAE;AAClB;AAEA,IAAM,YAAY,CAAC,GAAY,aAA8B,aAAa,SAAS,EAAE,UAAU,EAAE,UAAU;AAE3G,IAAM,cAAc,CAAC,QACnB,IAAI,WAAW,cACX,SACA,IAAI,WAAW,WACb,WACA,IAAI,WAAW,YACb,YACA;AAEV,IAAM,cAAc,CAAC,WACnB,WAAW,cAAc,YAAY,WAAW,WAAW,UAAU,WAAW,YAAY,YAAY;AAc1G,IAAM,eAAe,CAAC,EAAE,cAAc,WAAW,QAAQ,MAAyB;AAChF,QAAM,CAAC,WAAW,YAAY,IAAI,SAAqB,CAAC,CAAC;AACzD,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAgC,IAAI;AAChE,QAAM,CAAC,MAAM,OAAO,IAAI,SAAwB,CAAC,CAAC;AAClD,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,IAAI;AAC3C,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAkC,CAAC,CAAC;AAC5D,QAAM,CAAC,MAAM,OAAO,IAAI,SAAqC,IAAI;AACjE,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,CAAC,WAAW,YAAY,IAAI,SAAwB,IAAI;AAC9D,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,CAAC,cAAc,eAAe,IAAI,SAAwB,IAAI;AACpE,QAAM,CAAC,SAAS,UAAU,IAAI,SAAwB,IAAI;AAC1D,QAAM,YAAY,OAA6C,IAAI;AACnE,QAAM,UAAU,OAA8B,IAAI;AAElD,QAAM,SAAS;AAAA,IACb,CAAC,SAAiB,WAAgC,cAAc,eAAe,SAAS,QAAQ;AAAA,IAChG,CAAC,YAAY;AAAA,EACf;AAEA,QAAM,UAAU,YAAY,OAAO,QAAQ,UAAU;AACnD,QAAI,CAAC,MAAO,YAAW,IAAI;AAC3B,QAAI;AACF,YAAM,CAAC,MAAM,MAAM,IAAI,MAAM,QAAQ,IAAI,CAAC,cAAc,GAAG,uBAAuB,EAAE,CAAC,CAAC;AACtF,mBAAa,KAAK,SAAS;AAC3B,gBAAU,KAAK,MAAM;AACrB,cAAQ,MAAM;AACd,mBAAa,IAAI;AAAA,IACnB,SAAS,GAAG;AACV,mBAAa,UAAU,GAAG,2DAA2D,CAAC;AAAA,IACxF,UAAE;AACA,iBAAW,KAAK;AAAA,IAClB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,SAAK,QAAQ;AACb,WAAO,MAAM;AACX,UAAI,UAAU,QAAS,cAAa,UAAU,OAAO;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,OAAO,CAAC;AAGZ,YAAU,MAAM;AACd,QAAI;AACF,YAAM,KAAK,IAAI,gBAAgB,OAAO,SAAS,MAAM,EAAE,IAAI,KAAK;AAChE,UAAI,CAAC,GAAI;AACT,qBAAe,EAAE,EACd,KAAK,CAAC,QAAQ;AACb,gBAAQ,CAAC,SAAU,KAAK,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,IAAI,OAAO,CAAC,KAAK,GAAG,IAAI,CAAE;AAC7E,mBAAW,IAAI,EAAE;AAAA,MACnB,CAAC,EACA,MAAM,MAAM,MAAS;AAAA,IAC1B,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAAC,CAAC;AAGL,QAAM,aAAa;AAAA,IACjB,MAAM,UAAU,KAAK,CAAC,MAAM,EAAE,YAAY,KAAK,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,SAAS;AAAA,IACtF,CAAC,WAAW,IAAI;AAAA,EAClB;AACA,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AACjB,cAAU,UAAU,WAAW,MAAM,KAAK,QAAQ,IAAI,GAAG,GAAI;AAC7D,WAAO,MAAM;AACX,UAAI,UAAU,QAAS,cAAa,UAAU,OAAO;AAAA,IACvD;AAAA,EACF,GAAG,CAAC,YAAY,WAAW,MAAM,OAAO,CAAC;AAGzC,QAAM,SAAS,OACX,EAAE,QAAQ,KAAK,QAAQ,MAAM,KAAK,MAAM,SAAS,KAAK,SAAS,MAAM,KAAK,MAAM,UAAU,KAAK,SAAS,IACxG;AACJ,QAAM,YAAY,SAAS,KAAK,UAAU,MAAM,IAAI;AACpD,YAAU,MAAM;AACd,QAAI,CAAC,OAAQ;AACb,QAAI,OAAO,WAAW,WAAW,CAAC,OAAO,OAAO,CAAC,OAAO,KAAM;AAC9D,QAAI,YAAY;AAChB,UAAM,SAAS,WAAW,MAAM;AAC9B,sBAAgB,MAAM,EACnB,KAAK,CAAC,MAAM;AACX,YAAI,UAAW;AACf,wBAAgB,IAAI;AACpB,mBAAW,GAAG,EAAE,WAAW,GAAG,EAAE,KAAK,CAAC,IAAI,kBAAe,aAAa,EAAE,KAAK,CAAC,GAAG,EAAE,QAAQ,CAAC,KAAK,EAAE,EAAE;AAAA,MACvG,CAAC,EACA,MAAM,CAAC,MAAe;AACrB,YAAI,UAAW;AACf,mBAAW,IAAI;AACf,wBAAgB,UAAU,GAAG,6BAA6B,CAAC;AAAA,MAC7D,CAAC;AAAA,IACL,GAAG,GAAG;AACN,WAAO,MAAM;AACX,kBAAY;AACZ,mBAAa,MAAM;AAAA,IACrB;AAAA,EAEF,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,WAAW,OAAO,IAAY,MAA2B,YAAoB;AACjF,YAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,KAAK,EAAE;AACrC,QAAI;AACF,YAAM,KAAK;AAAA,IACb,SAAS,GAAG;AACV,aAAO,UAAU,GAAG,OAAO,GAAG,OAAO;AAAA,IACvC,UAAE;AACA,cAAQ,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,MAAM,EAAE;AAAA,IACxC;AAAA,EACF;AAEA,QAAM,UAAU,MAAM;AACpB,iBAAa,IAAI;AACjB,YAAQ,UAAU,gBAAgB,GAAG,QAAQ,YAAY,CAAC;AAC1D,iBAAa,IAAI;AACjB,eAAW,IAAI;AACf,oBAAgB,IAAI;AACpB,0BAAsB,MAAM,QAAQ,SAAS,iBAAiB,EAAE,UAAU,UAAU,OAAO,UAAU,CAAC,CAAC;AAAA,EACzG;AAEA,QAAM,WAAW,CAAC,MAAgB;AAChC,iBAAa,EAAE,EAAE;AACjB,YAAQ,aAAa,CAAC,CAAC;AACvB,iBAAa,IAAI;AACjB,eAAW,IAAI;AACf,oBAAgB,IAAI;AACpB,0BAAsB,MAAM,QAAQ,SAAS,iBAAiB,EAAE,UAAU,UAAU,OAAO,UAAU,CAAC,CAAC;AAAA,EACzG;AAEA,QAAM,YAAY,MAAM;AACtB,YAAQ,IAAI;AACZ,iBAAa,IAAI;AACjB,iBAAa,IAAI;AAAA,EACnB;AAEA,QAAM,aAAa,YAAY;AAC7B,QAAI,CAAC,KAAM;AACX,cAAU,IAAI;AACd,iBAAa,IAAI;AACjB,UAAM,UAA+B;AAAA,MACnC,GAAG;AAAA,MACH,MAAM,KAAK,KAAK,KAAK;AAAA,MACrB,QAAQ,KAAK,OAAO,KAAK;AAAA,MACzB,MAAM,KAAK,WAAW,WAAW,SAAY,KAAK;AAAA,MAClD,SAAS,KAAK,WAAW,WAAW,KAAK,UAAU;AAAA,MACnD,MAAM,KAAK,WAAW,WAAW,KAAK,MAAM,KAAK,IAAI;AAAA,IACvD;AACA,QAAI;AACF,UAAI,WAAW;AACb,cAAM,UAAU,MAAM,eAAe,WAAW,OAAO;AACvD,qBAAa,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,QAAQ,KAAK,UAAU,CAAE,CAAC;AAC3E,eAAO,mBAAmB;AAAA,MAC5B,OAAO;AACL,cAAM,UAAU,MAAM,eAAe,OAAO;AAC5C,qBAAa,CAAC,SAAS,CAAC,SAAS,GAAG,IAAI,CAAC;AACzC,kBAAU,CAAC,MAAO,IAAI,EAAE,GAAG,GAAG,QAAQ,EAAE,UAAU,QAAQ,WAAW,WAAW,IAAI,GAAG,IAAI,CAAE;AAC7F,eAAO,mBAAmB;AAAA,MAC5B;AACA,gBAAU;AAAA,IACZ,SAAS,GAAG;AACV,mBAAa,UAAU,GAAG,kCAAkC,CAAC;AAAA,IAC/D,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAEA,QAAM,cAAc,CAAC,MACnB;AAAA,IACE,EAAE;AAAA,IACF,YAAY;AACV,YAAM,OAAO,EAAE,WAAW,WAAW,MAAM,cAAc,EAAE,EAAE,IAAI,MAAM,eAAe,EAAE,EAAE;AAC1F,mBAAa,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,KAAK,KAAK,OAAO,CAAE,CAAC;AACrE,gBAAU,CAAC,MAAO,IAAI,EAAE,GAAG,GAAG,QAAQ,EAAE,UAAU,KAAK,WAAW,WAAW,IAAI,IAAI,IAAI,CAAE;AAC3F,aAAO,KAAK,WAAW,WAAW,sBAAsB,kBAAkB;AAAA,IAC5E;AAAA,IACA;AAAA,EACF;AAEF,QAAM,SAAS,CAAC,MACd;AAAA,IACE,EAAE;AAAA,IACF,YAAY;AACV,YAAM,eAAe,EAAE,EAAE;AACzB,mBAAa,CAAC,SAAS,KAAK,IAAI,CAAC,MAAO,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,GAAG,cAAc,KAAK,IAAI,CAAE,CAAC;AAC1F,aAAO,sDAAsD;AAAA,IAC/D;AAAA,IACA;AAAA,EACF;AAEF,QAAM,SAAS,CAAC,MACd;AAAA,IACE,EAAE;AAAA,IACF,YAAY;AACV,YAAM,eAAe,EAAE,EAAE;AACzB,mBAAa,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;AACxD,cAAQ,CAAC,SAAS,KAAK,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,EAAE,CAAC;AAC3D,gBAAU,CAAC,MAAO,IAAI,EAAE,GAAG,GAAG,QAAQ,EAAE,UAAU,EAAE,WAAW,WAAW,IAAI,GAAG,IAAI,CAAE;AACvF,UAAI,cAAc,EAAE,GAAI,WAAU;AAClC,aAAO,mBAAmB;AAAA,IAC5B;AAAA,IACA;AAAA,EACF;AAEF,QAAM,QAAQ,SAAS,OAAO,UAAU,OAAO,MAAM;AACrD,QAAM,UAAU,EAAE,4BAA4B,EAAE,cAAc,EAAE,EAAE;AAClE,QAAM,YACJ,CAAC,CAAC,QACF,KAAK,KAAK,KAAK,EAAE,SAAS,KAC1B,KAAK,OAAO,KAAK,EAAE,SAAS,MAC3B,KAAK,WAAW,WAAW,QAAQ,KAAK,MAAM,KAAK,CAAC,IAAI,QAAQ,KAAK,IAAI,OACzE,KAAK,WAAW,YAAY,QAAQ,KAAK,OAAO,MACjD,CAAC;AAEH,SACE,qBAAC,SAAM,SAAS,GACb;AAAA,iBACC;AAAA,MAAC;AAAA;AAAA,QACC,UAAS;AAAA,QACT,QACE,oBAAC,UAAO,OAAM,WAAU,MAAK,SAAQ,SAAS,MAAM,KAAK,QAAQ,GAAG,mBAEpE;AAAA,QAGD;AAAA;AAAA,IACH;AAAA,IAGF,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,gBAAgB,iBAAiB,KAAK,GAAG,UAAU,OAAO,GAC1G;AAAA,2BAAC,OACC;AAAA,4BAAC,cAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,IAAI,GAAG,4BAEzD;AAAA,QACA,oBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAC/B,mBACG,GAAG,OAAO,MAAM,OAAO,OAAO,GAAG,kBAAkB,OAAO,KAAK,QAAQ,KAAK,GAAG,CAAC,kCAA+B,OAAO,sBAAsB,KAAK,GAAG,KAAK,MAAM,OAAO,qBAAqB,EAAE,CAAC,QAAQ,OAAO,sBAAsB,MAAM,MAAM,EAAE,KAAK,GAAG,OAAO,kBAAkB,UAAU,KAC5R,mEACN;AAAA,SACF;AAAA,MACA,qBAAC,SAAM,WAAU,OAAM,SAAS,GAC9B;AAAA,4BAAC,WAAQ,OAAM,WACb,8BAAC,cAAW,cAAW,qBAAoB,SAAS,MAAM,KAAK,QAAQ,GAAG,MAAK,SAC7E,8BAAC,WAAY,UAAS,SAAQ,GAChC,GACF;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,WAAW,oBAAC,QAAQ;AAAA,YACpB,SAAS;AAAA,YACT,UAAU,WAAW,CAAC,CAAC,aAAc,SAAS,CAAC;AAAA,YAC/C,IAAI,EAAE,eAAe,QAAQ,cAAc,IAAI;AAAA,YAChD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,OACF;AAAA,IAEC,SAAS,UAAU,CAAC,QACnB,oBAAC,SAAM,UAAS,QACb,iBAAO,QAAQ,IACZ,mDACA,oBAAoB,OAAO,GAAG,mBAAmB,OAAO,QAAQ,IAAI,KAAK,GAAG,yCAClF;AAAA,IAGD,UAAU,CAAC,OAAO,kBACjB,oBAAC,SAAM,UAAS,WAAU,oHAE1B;AAAA,IAGF,oBAAC,SAAI,KAAK,SACR,8BAAC,YAAS,IAAI,CAAC,CAAC,MAAM,eAAa,MAChC,kBACC,qBAAC,SAAM,SAAQ,YAAW,IAAI,EAAE,GAAG,GAAG,cAAc,EAAE,GAAG,eAAY,iBACnE;AAAA,0BAAC,cAAW,SAAQ,aAAY,IAAI,EAAE,IAAI,IAAI,GAC3C,sBAAY,kBAAkB,gBACjC;AAAA,MACA,qBAAC,SAAM,SAAS,KACd;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,YAC1D,YAAY,EAAE,WAAW,KAAK,cAAc,gBAAgB;AAAA,YAC5D,IAAI;AAAA;AAAA,QACN;AAAA,QACA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,MAAK;AAAA,YACL,WAAS;AAAA,YACT,SAAS;AAAA,YACT,SAAS;AAAA,YACT,OAAO,KAAK;AAAA,YACZ,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,OAAO,MAAM,CAAC;AAAA,YAC5D,YAAY,gDAAgD,KAAK,OAAO,MAAM,IAAI,QAAQ,kBAAkB,GAAI;AAAA,YAChH,YAAY,EAAE,WAAW,QAAQ,kBAAkB,KAAM,cAAc,gBAAgB;AAAA,YACvF,IAAI;AAAA;AAAA,QACN;AAAA,QACA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,KAAK,qBAAqB,EAAE,IAAI,OAAO,IAAI,kBAAkB,EAAE,GAC9F;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,QAAM;AAAA,cACN,OAAM;AAAA,cACN,MAAK;AAAA,cACL,OAAO,KAAK;AAAA,cACZ,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,QAAQ,EAAE,OAAO,MAAwB,CAAC;AAAA,cAC9E,IAAI;AAAA,cAEH,kBAAQ,IAAI,CAAC,MACZ,oBAAC,YAAuB,OAAO,EAAE,OAC9B,YAAE,SADU,EAAE,KAEjB,CACD;AAAA;AAAA,UACH;AAAA,UACC,KAAK,WAAW,YACf;AAAA,YAAC;AAAA;AAAA,cACC,QAAM;AAAA,cACN,OAAM;AAAA,cACN,MAAK;AAAA,cACL,OAAO,KAAK,WAAW;AAAA,cACvB,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,SAAS,EAAE,OAAO,MAAM,CAAC;AAAA,cAC7D,IAAI;AAAA,cAEH,mBAAS,IAAI,CAAC,MACb,oBAAC,YAAiB,OAAO,GACtB,YAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,KADzB,CAEf,CACD;AAAA;AAAA,UACH;AAAA,UAED,KAAK,WAAW,WACf;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,MAAK;AAAA,cACL,OAAO,KAAK,QAAQ;AAAA,cACpB,aAAY;AAAA,cACZ,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,cAC1D,YAAY,EAAE,cAAc,kBAAkB;AAAA,cAC9C,IAAI;AAAA;AAAA,UACN,IAEA;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,MAAK;AAAA,cACL,MAAK;AAAA,cACL,OAAO,KAAK,QAAQ;AAAA,cACpB,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,MAAM,EAAE,OAAO,MAAM,CAAC;AAAA,cAC1D,YAAY,EAAE,MAAM,KAAK,cAAc,cAAc;AAAA,cACrD,iBAAiB,EAAE,QAAQ,KAAK;AAAA,cAChC,IAAI;AAAA;AAAA,UACN;AAAA,UAEF;AAAA,YAAC;AAAA;AAAA,cACC,OAAM;AAAA,cACN,MAAK;AAAA,cACL,OAAO,KAAK;AAAA,cACZ,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,UAAU,EAAE,OAAO,MAAM,CAAC;AAAA,cAC9D,YAAY,EAAE,cAAc,YAAY;AAAA,cACxC,IAAI;AAAA;AAAA,UACN;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,QAAM;AAAA,cACN,OAAM;AAAA,cACN,MAAK;AAAA,cACL,OAAO,KAAK,SAAS,QAAQ,gBAAgB;AAAA,cAC7C,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,OAAO,EAAE,OAAO,MAAM,CAAC;AAAA,cAC3D,IAAI;AAAA,cAEF,mBAAQ,UAAU,CAAC,KAAK,SAAS,EAAE,GAAG,IAAI,CAAC,MAC3C,oBAAC,YAAiB,OAAO,GACtB,eADY,CAEf,CACD;AAAA;AAAA,UACH;AAAA,WACF;AAAA,QACA,qBAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,UAAU,QAAQ,KAAK,EAAE,GACnD;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,SACE;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,KAAK,cAAc;AAAA,kBAC5B,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,WAAW,EAAE,OAAO,QAAQ,CAAC;AAAA;AAAA,cACnE;AAAA,cAEF,OAAO,oBAAC,cAAW,SAAQ,SAAQ,4BAAc;AAAA;AAAA,UACnD;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SACE;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAK;AAAA,kBACL,SAAS,KAAK,iBAAiB;AAAA,kBAC/B,UAAU,SAAS,CAAC,OAAO,iBAAiB;AAAA,kBAC5C,UAAU,CAAC,MAAM,QAAQ,EAAE,GAAG,MAAM,cAAc,EAAE,OAAO,QAAQ,CAAC;AAAA;AAAA,cACtE;AAAA,cAEF,OACE,qBAAC,cAAW,SAAQ,SAAQ;AAAA;AAAA,gBACN,QAAQ,QAAQ,KAAK,OAAO,KAAK,MAAM;AAAA,iBAC7D;AAAA;AAAA,UAEJ;AAAA,WACF;AAAA,QACA,oBAAC,cAAW,SAAQ,SAAQ,OAAO,eAAe,UAAU,kBAAkB,MAAK,UAChF,0BAAgB,WAAW,iBAAiB,IAAI,GACnD;AAAA,QACC,aAAa,oBAAC,SAAM,UAAS,SAAS,qBAAU;AAAA,QACjD,qBAAC,SAAM,WAAU,OAAM,SAAS,GAAG,gBAAe,YAChD;AAAA,8BAAC,UAAO,SAAS,WAAW,OAAM,WAAU,MAAK,SAAQ,UAAU,QAAQ,IAAI,EAAE,eAAe,OAAO,GAAG,oBAE1G;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS,MAAM,KAAK,WAAW;AAAA,cAC/B,SAAQ;AAAA,cACR,MAAK;AAAA,cACL,UAAU,CAAC,aAAa;AAAA,cACxB,WAAW,SAAS,oBAAC,oBAAiB,MAAM,IAAI,OAAM,WAAU,IAAK;AAAA,cACrE,IAAI,EAAE,eAAe,QAAQ,cAAc,IAAI;AAAA,cAE9C,sBAAY,iBAAiB;AAAA;AAAA,UAChC;AAAA,WACF;AAAA,SACF;AAAA,OACF,GAEJ,GACF;AAAA,IAEC,UACC,qBAAC,SAAM,SAAS,GACd;AAAA,0BAAC,YAAS,SAAQ,WAAU,QAAQ,IAAI;AAAA,MACxC,oBAAC,YAAS,SAAQ,WAAU,QAAQ,IAAI;AAAA,OAC1C,IACE,UAAU,WAAW,IACvB,CAAC,aACC;AAAA,MAAC;AAAA;AAAA,QACC,OAAM;AAAA,QACN,aAAY;AAAA,QACZ,QACE,oBAAC,UAAO,SAAQ,YAAW,MAAK,SAAQ,SAAS,SAAS,UAAU,OAAO,IAAI,EAAE,eAAe,OAAO,GAAG,0BAE1G;AAAA;AAAA,IAEJ,IAGF,oBAAC,SAAM,SAAS,GAAG,eAAY,iBAC5B,oBAAU,IAAI,CAAC,MAAM;AACpB,YAAM,SAAS,QAAQ,KAAK,EAAE,EAAE,CAAC;AACjC,aACE,oBAAC,SAAiB,SAAQ,YAAW,IAAI,EAAE,GAAG,MAAM,cAAc,EAAE,GAClE,+BAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,KAAK,KAAK,YAAY,cAAc,UAAU,OAAO,GAC/E;AAAA,6BAAC,OAAI,IAAI,EAAE,MAAM,GAAG,UAAU,IAAI,GAChC;AAAA,+BAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,UAAU,OAAO,GACzE;AAAA,gCAAC,cAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,IAAI,GACnD,YAAE,MACL;AAAA,YACA;AAAA,cAAC;AAAA;AAAA,gBACC,MAAK;AAAA,gBACL,OAAO,EAAE,WAAW,WAAW,WAAW,EAAE,iBAAiB,aAAa,0BAA0B;AAAA,gBACpG,OAAO,EAAE,WAAW,WAAW,YAAY,EAAE,iBAAiB,aAAa,YAAY;AAAA,gBACvF,SAAQ;AAAA,gBACR,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS;AAAA;AAAA,YACvC;AAAA,YACC,EAAE,gBAAgB,oBAAC,QAAK,MAAK,SAAQ,OAAM,iBAAW,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS,GAAG;AAAA,YAC9F,EAAE,aAAa,oBAAC,QAAK,MAAK,SAAQ,OAAM,cAAa,SAAQ,YAAW,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS,GAAG;AAAA,YAChH,EAAE,gBAAgB,oBAAC,QAAK,MAAK,SAAQ,OAAM,SAAQ,SAAQ,YAAW,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS,GAAG;AAAA,aACjH;AAAA,UACA,qBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAAiB,IAAI,EAAE,IAAI,KAAK,GAC/D;AAAA,cAAE;AAAA,YACF,EAAE,WAAW,YAAY,EAAE,YAAY,cAAW,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK;AAAA,YAC5F,EAAE,YAAY,kBAAe,YAAY,EAAE,QAAQ,EAAE,iBAAiB,YAAY,CAAC,EAAE,YAAY,CAAC,IAAI,aAAa,EAAE,WAAW,EAAE,QAAQ,CAAC,KAAK;AAAA,aACnJ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAQ;AAAA,cACR,IAAI;AAAA,gBACF,IAAI;AAAA,gBACJ,OAAO;AAAA,gBACP,UAAU;AAAA,gBACV,cAAc;AAAA,gBACd,SAAS;AAAA,gBACT,iBAAiB;AAAA,gBACjB,iBAAiB;AAAA,cACnB;AAAA,cAEC,YAAE;AAAA;AAAA,UACL;AAAA,UACC,EAAE,aAAa,EAAE,kBAAkB,eAClC,oBAAC,cAAW,SAAQ,WAAU,OAAM,SACjC,YAAE,WACL;AAAA,WAEJ;AAAA,QACA,qBAAC,SAAM,WAAU,OAAM,SAAS,KAAK,YAAW,UAC9C;AAAA,8BAAC,UAAO,MAAK,SAAQ,SAAS,MAAM,KAAK,OAAO,CAAC,GAAG,UAAU,UAAU,EAAE,cAAc,IAAI,EAAE,eAAe,OAAO,GAAG,qBAEvH;AAAA,UACA,oBAAC,UAAO,MAAK,SAAQ,SAAS,MAAM,KAAK,YAAY,CAAC,GAAG,UAAU,QAAQ,IAAI,EAAE,eAAe,OAAO,GACpG,YAAE,WAAW,WAAW,UAAU,UACrC;AAAA,UACA,oBAAC,WAAQ,OAAM,QACb,8BAAC,cAAW,MAAK,SAAQ,cAAY,QAAQ,EAAE,IAAI,IAAI,SAAS,MAAM,SAAS,CAAC,GAAG,UAAU,QAC3F,8BAAC,QAAS,UAAS,SAAQ,GAC7B,GACF;AAAA,UACA,oBAAC,WAAQ,OAAM,UACb,8BAAC,cAAW,MAAK,SAAQ,cAAY,UAAU,EAAE,IAAI,IAAI,SAAS,MAAM,KAAK,OAAO,CAAC,GAAG,UAAU,QAChG,8BAAC,SAAW,UAAS,SAAQ,GAC/B,GACF;AAAA,WACF;AAAA,SACF,KA7DU,EAAE,EA8Dd;AAAA,IAEJ,CAAC,GACH;AAAA,IAGF,qBAAC,OACC;AAAA,0BAAC,cAAW,SAAQ,aAAY,IAAI,EAAE,YAAY,KAAK,IAAI,EAAE,GAAG,4BAEhE;AAAA,MACC,KAAK,WAAW,IACf,oBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAAiB,gFAEnD,IAEA,oBAAC,SAAM,SAAS,GAAG,eAAY,iBAC5B,eAAK,IAAI,CAAC,QAAQ;AACjB,cAAM,WAAW,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,IAAI,UAAU;AAC9D,cAAM,OAAO,UAAU,YAAY,gBAAgB;AACnD,cAAM,WAAW,YAAY,IAAI;AACjC,eACE,qBAAC,SAAmB,SAAQ,YAAW,IAAI,EAAE,GAAG,KAAK,cAAc,EAAE,GACnE;AAAA,+BAAC,OAAI,IAAI,EAAE,SAAS,QAAQ,YAAY,UAAU,KAAK,GAAG,UAAU,OAAO,GACzE;AAAA,gCAAC,QAAK,MAAK,SAAQ,OAAO,YAAY,GAAG,GAAG,OAAO,YAAY,IAAI,MAAM,GAAG,SAAQ,YAAW,IAAI,EAAE,QAAQ,IAAI,UAAU,SAAS,GAAG;AAAA,YACvI,oBAAC,cAAW,SAAQ,SAAQ,IAAI,EAAE,YAAY,IAAI,GAC/C,cAAI,cACP;AAAA,YACA,qBAAC,cAAW,SAAQ,SAAQ,OAAM,kBAC/B;AAAA,2BAAa,IAAI,WAAW,IAAI;AAAA,cAChC,IAAI,YAAY,WAAW,kBAAe;AAAA,cAC1C,IAAI,SAAS,SAAS,SAAM,IAAI,SAAS,MAAM,UAAU,IAAI,SAAS,WAAW,IAAI,KAAK,IAAI,KAAK;AAAA,cACnG,IAAI,YAAY,kBAAe;AAAA,eAClC;AAAA,YACA,oBAAC,OAAI,IAAI,EAAE,MAAM,EAAE,GAAG;AAAA,YACrB,IAAI,kBACH,oBAAC,QAAK,MAAM,GAAG,QAAQ,iBAAiB,mBAAmB,IAAI,cAAc,CAAC,IAAI,SAAQ,SAAQ,WAAU,SAAQ,0BAEpH;AAAA,aAEA,IAAI,UAAU,IAAI,UAClB,oBAAC,UAAO,MAAK,SAAQ,SAAS,MAAM,WAAW,WAAW,OAAO,IAAI,EAAE,GAAG,IAAI,EAAE,eAAe,OAAO,GACnG,qBAAW,SAAS,QACvB;AAAA,aAEJ;AAAA,UACA,oBAAC,YAAS,IAAI,UAAU,eAAa,MACnC,+BAAC,OAAI,IAAI,EAAE,IAAI,KAAK,IAAI,KAAK,WAAW,GAAG,aAAa,UAAU,GAC/D;AAAA,gBAAI,SACH,oBAAC,SAAM,UAAU,IAAI,WAAW,YAAY,YAAY,SAAS,IAAI,EAAE,IAAI,IAAI,SAAS,MAAM,EAAE,GAC7F,cAAI,OACP;AAAA,YAED,IAAI,UAAU,oBAAC,6BAAkB,SAAS,IAAI,QAAQ;AAAA,aACzD,GACF;AAAA,aAjCU,IAAI,EAkChB;AAAA,MAEJ,CAAC,GACH;AAAA,OAEJ;AAAA,KACF;AAEJ;AAEA,IAAO,uBAAQ;","names":[]}
@@ -0,0 +1,9 @@
1
+ import {
2
+ useAIProviderStore
3
+ } from "./chunk-GX4FVZNA.mjs";
4
+ import "./chunk-S3DWWUBD.mjs";
5
+ import "./chunk-NI7BKLC7.mjs";
6
+ export {
7
+ useAIProviderStore
8
+ };
9
+ //# sourceMappingURL=aiProviderStore-ANPQVHGD.mjs.map
@@ -0,0 +1,15 @@
1
+ import {
2
+ chat_default
3
+ } from "./chunk-W2D454CZ.mjs";
4
+ import "./chunk-6CSFKF34.mjs";
5
+ import "./chunk-GX4FVZNA.mjs";
6
+ import "./chunk-62H3OLTV.mjs";
7
+ import "./chunk-PSI7RQ54.mjs";
8
+ import "./chunk-LMAQWR7Z.mjs";
9
+ import "./chunk-4LLCLYLH.mjs";
10
+ import "./chunk-S3DWWUBD.mjs";
11
+ import "./chunk-NI7BKLC7.mjs";
12
+ export {
13
+ chat_default as default
14
+ };
15
+ //# sourceMappingURL=chat-W7MDFESE.mjs.map
@@ -0,0 +1,13 @@
1
+ // src/store/packageSettingsStore.ts
2
+ import { create } from "zustand";
3
+ var usePackageSettingsStore = create((set, get) => ({
4
+ settings: null,
5
+ setSettings: (settings) => set({ settings }),
6
+ getSettings: () => get().settings,
7
+ resetSettings: () => set({ settings: null })
8
+ }));
9
+
10
+ export {
11
+ usePackageSettingsStore
12
+ };
13
+ //# sourceMappingURL=chunk-4LLCLYLH.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/store/packageSettingsStore.ts"],"mappings":";AAMA,SAAS,cAAc;AAuEhB,IAAM,0BAA0B,OAA6B,CAAC,KAAK,SAAS;AAAA,EACjF,UAAU;AAAA,EACV,aAAa,CAAC,aAAa,IAAI,EAAE,SAAS,CAAC;AAAA,EAC3C,aAAa,MAAM,IAAI,EAAE;AAAA,EACzB,eAAe,MAAM,IAAI,EAAE,UAAU,KAAK,CAAC;AAC7C,EAAE;","names":[]}