@burtson-labs/bandit-engine 2.1.1 → 2.1.3

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 (46) hide show
  1. package/CHANGELOG.md +23 -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-5KC42IIR.mjs → chunk-GX4FVZNA.mjs} +15 -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-7QYA3PAF.mjs → chunk-W2D454CZ.mjs} +4578 -4167
  23. package/dist/chunk-W2D454CZ.mjs.map +1 -0
  24. package/dist/index.d.mts +295 -5
  25. package/dist/index.d.ts +295 -5
  26. package/dist/index.js +6595 -3209
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.mjs +1589 -1794
  29. package/dist/index.mjs.map +1 -1
  30. package/dist/modelStore-FIVOSLFY.mjs +9 -0
  31. package/dist/{public-D8UsefSk.d.mts → public-ByjnoHLe.d.mts} +1 -1
  32. package/dist/{public-D8UsefSk.d.ts → public-ByjnoHLe.d.ts} +1 -1
  33. package/dist/public-types.d.mts +1 -1
  34. package/dist/public-types.d.ts +1 -1
  35. package/dist/schedule-confirm-card-N4TKLEHL.mjs +292 -0
  36. package/dist/schedule-confirm-card-N4TKLEHL.mjs.map +1 -0
  37. package/package.json +1 -1
  38. package/dist/aiProviderStore-42S3LW2J.mjs +0 -8
  39. package/dist/chat-GDC4ZVCF.mjs +0 -10
  40. package/dist/chunk-5KC42IIR.mjs.map +0 -1
  41. package/dist/chunk-7QYA3PAF.mjs.map +0 -1
  42. package/dist/chunk-FCQN3LKT.mjs.map +0 -1
  43. package/dist/modelStore-SEC34WRM.mjs +0 -8
  44. /package/dist/{aiProviderStore-42S3LW2J.mjs.map → aiProviderStore-ANPQVHGD.mjs.map} +0 -0
  45. /package/dist/{chat-GDC4ZVCF.mjs.map → chat-W7MDFESE.mjs.map} +0 -0
  46. /package/dist/{modelStore-SEC34WRM.mjs.map → modelStore-FIVOSLFY.mjs.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -2,6 +2,29 @@
2
2
 
3
3
  Notable changes to `@burtson-labs/bandit-engine`. Versions follow semver.
4
4
 
5
+ ## 2.1.3
6
+
7
+ ### Chat
8
+
9
+ - 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").
10
+ - `/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).
11
+
12
+ ### Management
13
+
14
+ - 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.
15
+
16
+ ## 2.1.2
17
+
18
+ ### Chat
19
+
20
+ - `create_file` makes real spreadsheets: `format: "xlsx"` with a structured `spreadsheet` parameter (sheets of typed columns — text, number, integer, currency, percent, date, datetime, boolean, formula — rows as arrays or keyed objects, an optional totals row, frozen styled header, filter). The gateway builds the workbook (ClosedXML) and returns a preview of the first sheet, which the chat shows as a table under the download link, plus any builder warnings.
21
+ - Created files (docx, pptx, pdf, xlsx and the text formats) are saved to the signed-in user's Stash by the gateway. The chat links the lasting Stash share link ("saved to your Stash · Open Stash") instead of the ~1 hour download link, and the tool trail reads "Saved to Stash: name". When the gateway could not save (Stash off, no access, quota), the old temporary-link wording is unchanged.
22
+ - The tool-usage prompt now matches the tool schema on PDF (it said "PDF is NOT a supported format" while the tool offered pdf) and explains the xlsx spec with an example.
23
+ - Meeting notes. A signed-in person can attach a meeting recording (audio or video) or a transcript file (`.vtt`, `.srt`, `.txt`, `.docx`) to the composer, or paste a transcript, and get structured notes in the chat: title, attendees, summary, decisions, action items (owner and due date when stated) and open questions. The notes are filed in Stash as a self-contained HTML page with a share link, and the message's tool trail says what happened ("Transcribed: standup.m4a (12 min)", "Saved to Stash"). Hosts get it through the `ChatProvider` when `gatewayApiUrl` is set and the person is signed in; `ChatInput` takes an `onMeetingNotes` handler for custom shells.
24
+ - Recordings are decoded in the browser, mixed to 16 kHz mono, cut at quiet points into chunks of under a minute and sent through the existing `POST /stt/transcribe` route one at a time (two in flight), so an hour-long meeting never meets the gateway's upload or request limits. Transcribing a recording needs a plan with speech-to-text (`hasSTT`); transcript files and pasted text work on every plan. Recordings up to 60 MB and 30 minutes in this first version; longer meetings should come in as the platform's transcript.
25
+ - Long transcripts are summarized part by part and merged (map-reduce), so they fit any routed model's context. The model is asked for one JSON object; a malformed answer is asked for again once.
26
+ - New exports: `runMeetingNotes`, `generateMeetingNotes`, `parseTranscript`, `transcribeRecording`, `saveToStash`, `createStashShareLink` and their types. New tool-trail kinds `transcribe` and `stash`.
27
+
5
28
  ## 2.1.1
6
29
 
7
30
  ### 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":"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","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":[]}