@agent-native/dispatch 0.38.15 → 0.38.16-nightly-20260927233234
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/create-workspace-resource.d.ts +13 -13
- package/dist/actions/provider-api-register.d.ts +12 -12
- package/dist/components/automation-create-dialog.js +4 -4
- package/dist/components/automation-create-dialog.js.map +1 -1
- package/dist/components/layout/Header.js +1 -1
- package/dist/components/layout/Header.js.map +1 -1
- package/dist/components/layout/Layout.d.ts +7 -0
- package/dist/components/layout/Layout.d.ts.map +1 -1
- package/dist/components/layout/Layout.js +19 -4
- package/dist/components/layout/Layout.js.map +1 -1
- package/dist/components/messaging-setup-panel.d.ts.map +1 -1
- package/dist/components/messaging-setup-panel.js +7 -28
- package/dist/components/messaging-setup-panel.js.map +1 -1
- package/dist/components/transactional-email-send-log.js +1 -1
- package/dist/components/transactional-email-send-log.js.map +1 -1
- package/dist/components/ui/alert-dialog.d.ts +1 -20
- package/dist/components/ui/alert-dialog.d.ts.map +1 -1
- package/dist/components/ui/alert-dialog.js +1 -26
- package/dist/components/ui/alert-dialog.js.map +1 -1
- package/dist/components/ui/button.d.ts +1 -11
- package/dist/components/ui/button.d.ts.map +1 -1
- package/dist/components/ui/button.js +1 -33
- package/dist/components/ui/button.js.map +1 -1
- package/dist/components/ui/carousel.d.ts +2 -2
- package/dist/components/ui/carousel.d.ts.map +1 -1
- package/dist/components/ui/input.d.ts +1 -3
- package/dist/components/ui/input.d.ts.map +1 -1
- package/dist/components/ui/input.js +1 -8
- package/dist/components/ui/input.js.map +1 -1
- package/dist/components/ui/sidebar.d.ts +4 -2
- package/dist/components/ui/sidebar.d.ts.map +1 -1
- package/dist/components/ui/switch.d.ts +1 -4
- package/dist/components/ui/switch.d.ts.map +1 -1
- package/dist/components/ui/switch.js +1 -7
- package/dist/components/ui/switch.js.map +1 -1
- package/dist/components/ui/tabs.d.ts +1 -7
- package/dist/components/ui/tabs.d.ts.map +1 -1
- package/dist/components/ui/tabs.js +1 -12
- package/dist/components/ui/tabs.js.map +1 -1
- package/dist/components/ui/toggle.d.ts +1 -12
- package/dist/components/ui/toggle.d.ts.map +1 -1
- package/dist/components/ui/toggle.js +1 -25
- package/dist/components/ui/toggle.js.map +1 -1
- package/dist/components/usage-alerts-panel.d.ts.map +1 -1
- package/dist/components/usage-alerts-panel.js +1 -1
- package/dist/components/usage-alerts-panel.js.map +1 -1
- package/dist/components/workspace-app-search.d.ts.map +1 -1
- package/dist/components/workspace-app-search.js +1 -1
- package/dist/components/workspace-app-search.js.map +1 -1
- package/dist/routes/pages/automations.d.ts.map +1 -1
- package/dist/routes/pages/automations.js +2 -2
- package/dist/routes/pages/automations.js.map +1 -1
- package/dist/routes/pages/metrics.d.ts.map +1 -1
- package/dist/routes/pages/metrics.js +1 -1
- package/dist/routes/pages/metrics.js.map +1 -1
- package/dist/routes/pages/settings.d.ts +9 -0
- package/dist/routes/pages/settings.d.ts.map +1 -1
- package/dist/routes/pages/settings.js +65 -12
- package/dist/routes/pages/settings.js.map +1 -1
- package/dist/routes/pages/thread-debug.js +1 -1
- package/dist/routes/pages/thread-debug.js.map +1 -1
- package/dist/routes/pages/vault.d.ts.map +1 -1
- package/dist/routes/pages/vault.js +2 -2
- package/dist/routes/pages/vault.js.map +1 -1
- package/dist/server/lib/usage-metrics-store.js +2 -3
- package/dist/server/lib/usage-metrics-store.js.map +1 -1
- package/dist/server/plugins/db.d.ts.map +1 -1
- package/dist/server/plugins/db.js +44 -0
- package/dist/server/plugins/db.js.map +1 -1
- package/package.json +4 -4
- package/src/components/automation-create-dialog.tsx +6 -6
- package/src/components/layout/Header.tsx +2 -2
- package/src/components/layout/Layout.spec.tsx +28 -0
- package/src/components/layout/Layout.tsx +73 -43
- package/src/components/messaging-setup-panel.spec.tsx +5 -1
- package/src/components/messaging-setup-panel.tsx +9 -45
- package/src/components/transactional-email-send-log.tsx +1 -1
- package/src/components/ui/alert-dialog.tsx +1 -139
- package/src/components/ui/button.tsx +1 -56
- package/src/components/ui/input.tsx +1 -22
- package/src/components/ui/switch.tsx +1 -27
- package/src/components/ui/tabs.tsx +1 -53
- package/src/components/ui/toggle.tsx +1 -43
- package/src/components/usage-alerts-panel.tsx +6 -12
- package/src/components/workspace-app-search.tsx +2 -1
- package/src/routes/pages/automations.tsx +4 -2
- package/src/routes/pages/metrics.tsx +2 -1
- package/src/routes/pages/settings.spec.tsx +179 -0
- package/src/routes/pages/settings.tsx +179 -119
- package/src/routes/pages/thread-debug.tsx +1 -1
- package/src/routes/pages/vault.tsx +3 -2
- package/src/server/lib/usage-metrics-store.spec.ts +1 -0
- package/src/server/lib/usage-metrics-store.ts +2 -2
- package/src/server/plugins/db.ts +49 -0
|
@@ -6,6 +6,19 @@ declare const _default: import("@agent-native/core/action").ActionDefinition<{
|
|
|
6
6
|
content: string;
|
|
7
7
|
scope: "all" | "selected";
|
|
8
8
|
}, {
|
|
9
|
+
id: string;
|
|
10
|
+
ownerEmail: string;
|
|
11
|
+
orgId: string | null;
|
|
12
|
+
kind: string;
|
|
13
|
+
name: string;
|
|
14
|
+
description: string | null;
|
|
15
|
+
path: string;
|
|
16
|
+
content: string;
|
|
17
|
+
scope: string;
|
|
18
|
+
createdBy: string;
|
|
19
|
+
createdAt: number;
|
|
20
|
+
updatedAt: number;
|
|
21
|
+
} | {
|
|
9
22
|
id: string;
|
|
10
23
|
ownerEmail: string;
|
|
11
24
|
orgId: string | null;
|
|
@@ -22,19 +35,6 @@ declare const _default: import("@agent-native/core/action").ActionDefinition<{
|
|
|
22
35
|
reviewedAt: number | null;
|
|
23
36
|
createdAt: number;
|
|
24
37
|
updatedAt: number;
|
|
25
|
-
} | {
|
|
26
|
-
id: string;
|
|
27
|
-
ownerEmail: string;
|
|
28
|
-
orgId: string | null;
|
|
29
|
-
kind: string;
|
|
30
|
-
name: string;
|
|
31
|
-
description: string | null;
|
|
32
|
-
path: string;
|
|
33
|
-
content: string;
|
|
34
|
-
scope: string;
|
|
35
|
-
createdBy: string;
|
|
36
|
-
createdAt: number;
|
|
37
|
-
updatedAt: number;
|
|
38
38
|
}>;
|
|
39
39
|
export default _default;
|
|
40
40
|
//# sourceMappingURL=create-workspace-resource.d.ts.map
|
|
@@ -47,10 +47,10 @@ declare const _default: import("node_modules/@agent-native/core/dist").ActionDef
|
|
|
47
47
|
notes?: string | undefined;
|
|
48
48
|
scope?: "org" | "user" | undefined;
|
|
49
49
|
}, {
|
|
50
|
-
id?: undefined;
|
|
51
|
-
provider?: undefined;
|
|
52
50
|
message?: undefined;
|
|
51
|
+
id?: undefined;
|
|
53
52
|
deleted?: undefined;
|
|
53
|
+
found?: undefined;
|
|
54
54
|
providers: {
|
|
55
55
|
id: string;
|
|
56
56
|
label: string;
|
|
@@ -61,45 +61,45 @@ declare const _default: import("node_modules/@agent-native/core/dist").ActionDef
|
|
|
61
61
|
updatedAt: number;
|
|
62
62
|
}[];
|
|
63
63
|
count: number;
|
|
64
|
-
|
|
64
|
+
provider?: undefined;
|
|
65
65
|
registered?: undefined;
|
|
66
66
|
label?: undefined;
|
|
67
67
|
} | {
|
|
68
|
-
id?: undefined;
|
|
69
68
|
message?: undefined;
|
|
70
|
-
|
|
69
|
+
id?: undefined;
|
|
71
70
|
deleted?: undefined;
|
|
71
|
+
count?: undefined;
|
|
72
72
|
providers?: undefined;
|
|
73
73
|
found: boolean;
|
|
74
74
|
provider: import("node_modules/@agent-native/core/dist/provider-api").CustomProviderConfig;
|
|
75
75
|
registered?: undefined;
|
|
76
76
|
label?: undefined;
|
|
77
77
|
} | {
|
|
78
|
-
provider?: undefined;
|
|
79
78
|
message?: undefined;
|
|
80
|
-
count?: undefined;
|
|
81
79
|
deleted?: undefined;
|
|
80
|
+
count?: undefined;
|
|
82
81
|
providers?: undefined;
|
|
82
|
+
provider?: undefined;
|
|
83
83
|
found: boolean;
|
|
84
84
|
id: string;
|
|
85
85
|
registered?: undefined;
|
|
86
86
|
label?: undefined;
|
|
87
87
|
} | {
|
|
88
|
-
provider?: undefined;
|
|
89
88
|
message?: undefined;
|
|
89
|
+
found?: undefined;
|
|
90
90
|
count?: undefined;
|
|
91
91
|
providers?: undefined;
|
|
92
|
-
|
|
92
|
+
provider?: undefined;
|
|
93
93
|
deleted: boolean;
|
|
94
94
|
id: string;
|
|
95
95
|
registered?: undefined;
|
|
96
96
|
label?: undefined;
|
|
97
97
|
} | {
|
|
98
|
-
provider?: undefined;
|
|
99
|
-
count?: undefined;
|
|
100
98
|
deleted?: undefined;
|
|
101
|
-
providers?: undefined;
|
|
102
99
|
found?: undefined;
|
|
100
|
+
count?: undefined;
|
|
101
|
+
providers?: undefined;
|
|
102
|
+
provider?: undefined;
|
|
103
103
|
registered: boolean;
|
|
104
104
|
id: string;
|
|
105
105
|
label: string;
|
|
@@ -67,15 +67,15 @@ function ScheduleFields({ draft, saving, onChange, }) {
|
|
|
67
67
|
const customMinute = Number(draft.time.split(":")[1] ?? 0);
|
|
68
68
|
return (_jsxs("div", { className: "space-y-3 rounded-lg border border-border/70 bg-muted/20 p-3", children: [_jsxs("div", { className: "grid gap-3 sm:grid-cols-[1fr_1fr]", children: [_jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: t("jobs.repeatEvery", { defaultValue: "Repeat every" }) }), _jsx(Input, { type: "number", min: 1, max: 31, value: draft.interval, disabled: saving, onChange: (event) => onChange({
|
|
69
69
|
interval: Math.min(draft.unit === "day" ? 1 : 31, Math.max(1, Number(event.target.value) || 1)),
|
|
70
|
-
}), className: "
|
|
70
|
+
}), className: "bg-background text-sm" })] }), _jsxs("label", { className: "space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: t("jobs.scheduleUnit", { defaultValue: "Unit" }) }), _jsxs(Select, { value: draft.unit, disabled: saving, onValueChange: (value) => onChange({
|
|
71
71
|
unit: value,
|
|
72
72
|
...(value === "day" ? { interval: 1 } : {}),
|
|
73
|
-
}), children: [_jsx(SelectTrigger, { className: "
|
|
73
|
+
}), children: [_jsx(SelectTrigger, { className: "bg-background text-sm", children: _jsx(SelectValue, {}) }), _jsxs(SelectContent, { children: [_jsx(SelectItem, { value: "hour", children: t("jobs.hours", { defaultValue: "hour(s)" }) }), _jsx(SelectItem, { value: "day", children: t("jobs.day", { defaultValue: "day" }) }), _jsx(SelectItem, { value: "week", children: t("jobs.weeks", { defaultValue: "week(s)" }) }), _jsx(SelectItem, { value: "month", children: t("jobs.months", { defaultValue: "month(s)" }) })] })] })] })] }), draft.unit === "hour" ? (_jsxs("label", { className: "block space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: t("jobs.atMinute", { defaultValue: "At minute" }) }), _jsx(Input, { type: "number", min: 0, max: 59, value: customMinute, disabled: saving, onChange: (event) => onChange({
|
|
74
74
|
time: "00:" +
|
|
75
75
|
String(Math.min(59, Math.max(0, Number(event.target.value) || 0))).padStart(2, "0"),
|
|
76
|
-
}), className: "
|
|
76
|
+
}), className: "bg-background text-sm" })] })) : null, draft.unit === "week" ? (_jsxs("label", { className: "block space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: t("jobs.onDay", { defaultValue: "On" }) }), _jsxs(Select, { value: String(draft.weekday), disabled: saving, onValueChange: (value) => onChange({ weekday: Number(value) }), children: [_jsx(SelectTrigger, { className: "bg-background text-sm", children: _jsx(SelectValue, {}) }), _jsx(SelectContent, { children: AUTOMATION_WEEKDAYS.map((day) => (_jsx(SelectItem, { value: String(day.value), children: day.short }, day.value))) })] })] })) : null, draft.unit === "month" ? (_jsxs("label", { className: "block space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: t("jobs.dayOfMonth", { defaultValue: "Day of month" }) }), _jsx(Input, { type: "number", min: 1, max: 31, value: draft.monthDay, disabled: saving, onChange: (event) => onChange({
|
|
77
77
|
monthDay: Math.min(31, Math.max(1, Number(event.target.value) || 1)),
|
|
78
|
-
}), className: "
|
|
78
|
+
}), className: "bg-background text-sm" })] })) : null, draft.unit !== "hour" ? (_jsxs("label", { className: "block space-y-1.5 text-xs text-muted-foreground", children: [_jsx("span", { children: t("jobs.atTime", { defaultValue: "At" }) }), _jsx(Input, { type: "time", value: draft.time, disabled: saving, onChange: (event) => onChange({ time: event.target.value }), className: "bg-background text-sm" })] })) : null] }));
|
|
79
79
|
}
|
|
80
80
|
function ScheduleBuilder({ saving, timezone, onTimezoneChange, onChange, }) {
|
|
81
81
|
const t = useT();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"automation-create-dialog.js","sourceRoot":"","sources":["../../src/components/automation-create-dialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DEFAULT_AUTOMATION_SCHEDULE_DRAFT,\n AUTOMATION_WEEKDAYS,\n automationScheduleToCron,\n formatAutomationTime,\n type AutomationScheduleDraft,\n type AutomationSchedulePreset,\n type AutomationScheduleUnit,\n} from \"@agent-native/core/client/agent-page/automation-schedule\";\nimport {\n TimezoneSelect,\n browserTimezone,\n} from \"@agent-native/core/client/agent-page/timezone-select\";\nimport {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n IconBolt,\n IconCalendarEvent,\n IconClock,\n IconCode,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Input } from \"./ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./ui/tabs\";\nimport { Textarea } from \"./ui/textarea\";\n\ntype TriggerType = \"schedule\" | \"event\" | \"webhook\";\n\ninterface AutomationEvent {\n name: string;\n description?: string;\n}\n\ninterface CreateAutomationInput {\n operation: \"create\";\n name: string;\n scope: \"personal\" | \"organization\";\n triggerType: TriggerType;\n body: string;\n schedule?: string;\n timezone?: string;\n event?: string;\n}\n\ninterface CreateAutomationResult {\n created: true;\n name: string;\n triggerType: TriggerType;\n webhookPath: string | null;\n}\n\nconst PRESETS: {\n value: AutomationSchedulePreset;\n labelKey: string;\n detailKey: string;\n label: string;\n detail: string;\n draft: Partial<AutomationScheduleDraft>;\n}[] = [\n {\n value: \"hourly\",\n labelKey: \"jobs.schedulePreset.hourly\",\n detailKey: \"jobs.schedulePreset.hourlyDetail\",\n label: \"Every hour\",\n detail: \"At the top of the hour\",\n draft: { preset: \"hourly\" },\n },\n {\n value: \"daily-midnight\",\n labelKey: \"jobs.schedulePreset.dailyMidnight\",\n detailKey: \"jobs.schedulePreset.dailyMidnightDetail\",\n label: \"Every day at midnight\",\n detail: \"12:00 AM\",\n draft: { preset: \"daily-midnight\" },\n },\n {\n value: \"daily-noon\",\n labelKey: \"jobs.schedulePreset.dailyNoon\",\n detailKey: \"jobs.schedulePreset.dailyNoonDetail\",\n label: \"Every day at noon\",\n detail: \"12:00 PM\",\n draft: { preset: \"daily-noon\" },\n },\n {\n value: \"weekdays\",\n labelKey: \"jobs.schedulePreset.weekdays\",\n detailKey: \"jobs.schedulePreset.weekdaysDetail\",\n label: \"Every weekday\",\n detail: \"Monday to Friday at 9:00 AM\",\n draft: { preset: \"weekdays\", time: \"09:00\" },\n },\n {\n value: \"weekly\",\n labelKey: \"jobs.schedulePreset.weekly\",\n detailKey: \"jobs.schedulePreset.weeklyDetail\",\n label: \"Every week\",\n detail: \"Sunday at 9:00 AM\",\n draft: { preset: \"weekly\", weekday: 0, time: \"09:00\" },\n },\n];\n\nfunction presetClass(selected: boolean): string {\n return (\n \"rounded-lg border px-3 py-2 text-left transition-colors \" +\n (selected\n ? \"border-primary bg-primary/5 text-foreground\"\n : \"border-border/70 bg-background hover:bg-muted/50\")\n );\n}\n\nfunction scheduleIsValid(value: string): boolean {\n return value.trim().split(/\\s+/).length === 5;\n}\n\nfunction ScheduleFields({\n draft,\n saving,\n onChange,\n}: {\n draft: AutomationScheduleDraft;\n saving: boolean;\n onChange: (patch: Partial<AutomationScheduleDraft>) => void;\n}) {\n const t = useT();\n const customMinute = Number(draft.time.split(\":\")[1] ?? 0);\n return (\n <div className=\"space-y-3 rounded-lg border border-border/70 bg-muted/20 p-3\">\n <div className=\"grid gap-3 sm:grid-cols-[1fr_1fr]\">\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.repeatEvery\", { defaultValue: \"Repeat every\" })}</span>\n <Input\n type=\"number\"\n min={1}\n max={31}\n value={draft.interval}\n disabled={saving}\n onChange={(event) =>\n onChange({\n interval: Math.min(\n draft.unit === \"day\" ? 1 : 31,\n Math.max(1, Number(event.target.value) || 1),\n ),\n })\n }\n className=\"h-9 bg-background text-sm\"\n />\n </label>\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.scheduleUnit\", { defaultValue: \"Unit\" })}</span>\n <Select\n value={draft.unit}\n disabled={saving}\n onValueChange={(value) =>\n onChange({\n unit: value as AutomationScheduleUnit,\n ...(value === \"day\" ? { interval: 1 } : {}),\n })\n }\n >\n <SelectTrigger className=\"h-9 bg-background text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"hour\">\n {t(\"jobs.hours\", { defaultValue: \"hour(s)\" })}\n </SelectItem>\n <SelectItem value=\"day\">\n {t(\"jobs.day\", { defaultValue: \"day\" })}\n </SelectItem>\n <SelectItem value=\"week\">\n {t(\"jobs.weeks\", { defaultValue: \"week(s)\" })}\n </SelectItem>\n <SelectItem value=\"month\">\n {t(\"jobs.months\", { defaultValue: \"month(s)\" })}\n </SelectItem>\n </SelectContent>\n </Select>\n </label>\n </div>\n\n {draft.unit === \"hour\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.atMinute\", { defaultValue: \"At minute\" })}</span>\n <Input\n type=\"number\"\n min={0}\n max={59}\n value={customMinute}\n disabled={saving}\n onChange={(event) =>\n onChange({\n time:\n \"00:\" +\n String(\n Math.min(59, Math.max(0, Number(event.target.value) || 0)),\n ).padStart(2, \"0\"),\n })\n }\n className=\"h-9 bg-background text-sm\"\n />\n </label>\n ) : null}\n\n {draft.unit === \"week\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.onDay\", { defaultValue: \"On\" })}</span>\n <Select\n value={String(draft.weekday)}\n disabled={saving}\n onValueChange={(value) => onChange({ weekday: Number(value) })}\n >\n <SelectTrigger className=\"h-9 bg-background text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {AUTOMATION_WEEKDAYS.map((day) => (\n <SelectItem key={day.value} value={String(day.value)}>\n {day.short}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n ) : null}\n\n {draft.unit === \"month\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.dayOfMonth\", { defaultValue: \"Day of month\" })}</span>\n <Input\n type=\"number\"\n min={1}\n max={31}\n value={draft.monthDay}\n disabled={saving}\n onChange={(event) =>\n onChange({\n monthDay: Math.min(\n 31,\n Math.max(1, Number(event.target.value) || 1),\n ),\n })\n }\n className=\"h-9 bg-background text-sm\"\n />\n </label>\n ) : null}\n\n {draft.unit !== \"hour\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.atTime\", { defaultValue: \"At\" })}</span>\n <Input\n type=\"time\"\n value={draft.time}\n disabled={saving}\n onChange={(event) => onChange({ time: event.target.value })}\n className=\"h-9 bg-background text-sm\"\n />\n </label>\n ) : null}\n </div>\n );\n}\n\nfunction ScheduleBuilder({\n saving,\n timezone,\n onTimezoneChange,\n onChange,\n}: {\n saving: boolean;\n timezone: string;\n onTimezoneChange: (value: string) => void;\n onChange: (value: string) => void;\n}) {\n const t = useT();\n const [draft, setDraft] = useState<AutomationScheduleDraft>(\n DEFAULT_AUTOMATION_SCHEDULE_DRAFT,\n );\n const [advanced, setAdvanced] = useState(false);\n const [advancedValue, setAdvancedValue] = useState(\"0 * * * *\");\n const friendly = automationScheduleToCron(draft);\n const activeSchedule = advanced\n ? advancedValue.trim()\n : (friendly.schedule ?? \"\");\n const valid =\n scheduleIsValid(activeSchedule) && (!friendly.error || advanced);\n\n useEffect(() => {\n onChange(valid ? activeSchedule : \"\");\n }, [activeSchedule, onChange, valid]);\n\n function choosePreset(\n value: AutomationSchedulePreset,\n presetDraft: Partial<AutomationScheduleDraft>,\n ) {\n setDraft((current) => ({ ...current, ...presetDraft, preset: value }));\n setAdvanced(false);\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <div className=\"text-xs font-medium text-foreground\">\n {t(\"jobs.repeat\", { defaultValue: \"Repeat\" })}\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {PRESETS.map((preset) => (\n <button\n key={preset.value}\n type=\"button\"\n aria-pressed={!advanced && draft.preset === preset.value}\n disabled={saving}\n className={presetClass(\n !advanced && draft.preset === preset.value,\n )}\n onClick={() => choosePreset(preset.value, preset.draft)}\n >\n <span className=\"block text-sm font-medium\">\n {t(preset.labelKey, { defaultValue: preset.label })}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {t(preset.detailKey, { defaultValue: preset.detail })}\n </span>\n </button>\n ))}\n <button\n type=\"button\"\n aria-pressed={!advanced && draft.preset === \"custom\"}\n disabled={saving}\n className={presetClass(!advanced && draft.preset === \"custom\")}\n onClick={() =>\n choosePreset(\"custom\", {\n preset: \"custom\",\n unit: draft.unit || \"day\",\n })\n }\n >\n <span className=\"block text-sm font-medium\">\n {t(\"jobs.schedulePreset.custom\", { defaultValue: \"Custom\" })}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {t(\"jobs.schedulePreset.customDetail\", {\n defaultValue: \"Set your own repeat pattern\",\n })}\n </span>\n </button>\n </div>\n </div>\n\n {!advanced && draft.preset === \"custom\" ? (\n <ScheduleFields\n draft={draft}\n saving={saving}\n onChange={(patch) =>\n setDraft((current) => ({ ...current, ...patch }))\n }\n />\n ) : null}\n\n {!advanced && friendly.schedule ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\"jobs.schedulePreview\", {\n defaultValue: \"Runs {{time}}.\",\n time:\n draft.preset === \"hourly\"\n ? t(\"jobs.schedulePreview.hourly\", {\n defaultValue: \"at the start of every hour\",\n })\n : draft.preset === \"daily-midnight\"\n ? t(\"jobs.schedulePreview.dailyMidnight\", {\n defaultValue: \"every day at midnight\",\n })\n : draft.preset === \"daily-noon\"\n ? t(\"jobs.schedulePreview.dailyNoon\", {\n defaultValue: \"every day at noon\",\n })\n : t(\"jobs.schedulePreview.atTime\", {\n defaultValue: \"at {{time}}\",\n time: formatAutomationTime(draft.time),\n }),\n })}\n </p>\n ) : null}\n {!advanced && friendly.error ? (\n <p className=\"text-xs text-destructive\">\n {friendly.error === \"daily-interval\"\n ? t(\"jobs.dailyIntervalAdvanced\", {\n defaultValue:\n \"Every few days needs the Advanced cron editor below.\",\n })\n : t(\"jobs.weeklyIntervalAdvanced\", {\n defaultValue:\n \"Custom weekly intervals beyond one week are available under Advanced.\",\n })}\n </p>\n ) : null}\n\n <div>\n <label className=\"text-xs font-medium text-foreground\">\n {t(\"jobs.timezone\", { defaultValue: \"Timezone\" })}\n </label>\n <div className=\"mt-1\">\n <TimezoneSelect\n value={timezone}\n disabled={saving}\n onChange={onTimezoneChange}\n suggested={[browserTimezone()]}\n />\n </div>\n </div>\n\n <details\n className=\"group rounded-lg border border-border/70 bg-muted/20\"\n open={advanced}\n onToggle={(event) => {\n const next = event.currentTarget.open;\n if (next && !advanced && friendly.schedule) {\n setAdvancedValue(friendly.schedule);\n }\n setAdvanced(next);\n }}\n >\n <summary className=\"flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-xs font-medium text-foreground [&::-webkit-details-marker]:hidden\">\n <IconCode className=\"size-4 text-muted-foreground\" />\n {t(\"jobs.advancedSchedule\", {\n defaultValue: \"Advanced - cron expression\",\n })}\n <span className=\"ms-auto text-muted-foreground group-open:hidden\">\n {t(\"jobs.show\", { defaultValue: \"Show\" })}\n </span>\n <span className=\"ms-auto hidden text-muted-foreground group-open:inline\">\n {t(\"jobs.hide\", { defaultValue: \"Hide\" })}\n </span>\n </summary>\n <div className=\"border-t border-border/60 px-3 pb-3 pt-2.5\">\n <Input\n className=\"font-mono text-sm\"\n value={advancedValue}\n spellCheck={false}\n autoComplete=\"off\"\n disabled={saving}\n onFocus={() => setAdvanced(true)}\n onChange={(event) => {\n setAdvanced(true);\n setAdvancedValue(event.target.value);\n }}\n />\n <p className=\"mt-1 text-[11px] text-muted-foreground\">\n {t(\"jobs.cronFormatHint\", {\n defaultValue: \"minute hour day-of-month month day-of-week\",\n })}\n </p>\n </div>\n </details>\n\n {activeSchedule && !valid ? (\n <p className=\"text-xs text-destructive\">\n {t(\"jobs.cronFieldCount\", {\n defaultValue: \"A cron expression needs exactly 5 fields.\",\n })}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction EventFields({\n open,\n event,\n onChange,\n}: {\n open: boolean;\n event: string;\n onChange: (value: string) => void;\n}) {\n const t = useT();\n const eventsQuery = useActionQuery<AutomationEvent[]>(\n \"list-automation-events\",\n {},\n { enabled: open, staleTime: 60_000 },\n );\n\n return (\n <>\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.startWhen\", { defaultValue: \"Start when\" })}</span>\n <Select value={event} onValueChange={onChange}>\n <SelectTrigger>\n <SelectValue\n placeholder={\n eventsQuery.isLoading\n ? t(\"jobs.loadingEventTypes\", {\n defaultValue: \"Loading event types...\",\n })\n : t(\"jobs.chooseAppEvent\", {\n defaultValue: \"Choose an app event\",\n })\n }\n />\n </SelectTrigger>\n <SelectContent>\n {(eventsQuery.data ?? []).map((item) => (\n <SelectItem key={item.name} value={item.name}>\n {item.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n {eventsQuery.data?.find((item) => item.name === event)?.description ? (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {eventsQuery.data.find((item) => item.name === event)?.description}\n </p>\n ) : null}\n {eventsQuery.error ? (\n <p className=\"mt-2 text-xs text-destructive\">\n {t(\"jobs.loadEventTypesError\", {\n defaultValue: \"Could not load event types.\",\n })}\n </p>\n ) : null}\n </>\n );\n}\n\nexport interface AutomationCreateDialogProps {\n open: boolean;\n initialScope?: \"personal\" | \"organization\";\n onOpenChange: (open: boolean) => void;\n onCreated: (result: CreateAutomationResult) => void;\n}\n\nexport function AutomationCreateDialog({\n open,\n initialScope = \"personal\",\n onOpenChange,\n onCreated,\n}: AutomationCreateDialogProps) {\n const t = useT();\n const [name, setName] = useState(\"\");\n const [scope, setScope] = useState<\"personal\" | \"organization\">(initialScope);\n const [triggerType, setTriggerType] = useState<TriggerType>(\"schedule\");\n const [schedule, setSchedule] = useState(\"0 * * * *\");\n const [timezone, setTimezone] = useState(browserTimezone());\n const [event, setEvent] = useState(\"\");\n const [body, setBody] = useState(\"\");\n const create = useActionMutation<\n CreateAutomationResult,\n CreateAutomationInput\n >(\"manage-automation\", {\n onSuccess: onCreated,\n });\n\n const resetCreate = create.reset;\n\n useEffect(() => {\n if (!open) return;\n setName(\"\");\n setScope(initialScope);\n setTriggerType(\"schedule\");\n setSchedule(\"0 * * * *\");\n setTimezone(browserTimezone());\n setEvent(\"\");\n setBody(\"\");\n resetCreate();\n }, [initialScope, open, resetCreate]);\n\n const canSubmit =\n name.trim().length > 0 &&\n body.trim().length > 0 &&\n (triggerType !== \"event\" || event.length > 0) &&\n (triggerType !== \"schedule\" || scheduleIsValid(schedule));\n\n function submit() {\n if (!canSubmit) return;\n create.mutate({\n operation: \"create\",\n name: name.trim(),\n scope,\n triggerType,\n body: body.trim(),\n ...(triggerType === \"schedule\"\n ? { schedule, timezone }\n : triggerType === \"event\"\n ? { event }\n : {}),\n });\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {t(\"jobs.newAutomation\", { defaultValue: \"New automation\" })}\n </DialogTitle>\n <DialogDescription>\n {t(\"jobs.createAutomationDescription\", {\n defaultValue:\n \"Choose what starts it, then describe the work in plain language.\",\n })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"grid gap-3 sm:grid-cols-[1fr_12rem]\">\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.name\", { defaultValue: \"Name\" })}</span>\n <Input\n value={name}\n disabled={create.isPending}\n placeholder={t(\"jobs.automationNamePlaceholder\", {\n defaultValue: \"morning-digest\",\n })}\n onChange={(event) => setName(event.target.value)}\n />\n </label>\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.scope\", { defaultValue: \"Scope\" })}</span>\n <Select\n value={scope}\n disabled={create.isPending}\n onValueChange={(value) =>\n setScope(value as \"personal\" | \"organization\")\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"personal\">\n {t(\"jobs.personal\", { defaultValue: \"Personal\" })}\n </SelectItem>\n <SelectItem value=\"organization\">\n {t(\"jobs.organization\", { defaultValue: \"Organization\" })}\n </SelectItem>\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <Tabs\n value={triggerType}\n onValueChange={(value) => setTriggerType(value as TriggerType)}\n >\n <TabsList className=\"grid h-auto w-full grid-cols-3\">\n <TabsTrigger value=\"schedule\" className=\"gap-2 py-2 text-xs\">\n <IconClock className=\"size-3.5\" />\n {t(\"jobs.schedule\", { defaultValue: \"Schedule\" })}\n </TabsTrigger>\n <TabsTrigger value=\"webhook\" className=\"gap-2 py-2 text-xs\">\n <IconBolt className=\"size-3.5\" />\n {t(\"jobs.webhook\", { defaultValue: \"Webhook\" })}\n </TabsTrigger>\n <TabsTrigger value=\"event\" className=\"gap-2 py-2 text-xs\">\n <IconCalendarEvent className=\"size-3.5\" />\n {t(\"jobs.appEvent\", { defaultValue: \"App event\" })}\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"schedule\" className=\"mt-3\">\n <ScheduleBuilder\n key={open ? \"schedule-open\" : \"schedule-closed\"}\n saving={create.isPending}\n timezone={timezone}\n onTimezoneChange={setTimezone}\n onChange={setSchedule}\n />\n </TabsContent>\n <TabsContent value=\"webhook\" className=\"mt-3\">\n <div className=\"rounded-lg border border-primary/20 bg-primary/5 p-3\">\n <div className=\"flex items-start gap-2\">\n <IconBolt className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {t(\"jobs.webhookTriggerDescription\", {\n defaultValue: \"Run when a service sends an HTTP POST\",\n })}\n </p>\n <p className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {t(\"jobs.webhookSetupDescription\", {\n defaultValue:\n \"After you save, Dispatch gives you a private URL to paste into GitHub, Stripe, or another webhook provider.\",\n })}\n </p>\n </div>\n </div>\n </div>\n </TabsContent>\n <TabsContent value=\"event\" className=\"mt-3\">\n <EventFields open={open} event={event} onChange={setEvent} />\n </TabsContent>\n </Tabs>\n\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>\n {t(\"jobs.whatShouldItDo\", { defaultValue: \"What should it do?\" })}\n </span>\n <Textarea\n value={body}\n disabled={create.isPending}\n placeholder={t(\"jobs.automationBodyPlaceholder\", {\n defaultValue:\n \"Review new support requests and summarize anything urgent in a shared note.\",\n })}\n rows={5}\n onChange={(event) => setBody(event.target.value)}\n />\n </label>\n\n {create.error ? (\n <p className=\"text-xs text-destructive\">{create.error.message}</p>\n ) : null}\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={create.isPending}\n onClick={() => onOpenChange(false)}\n >\n {t(\"jobs.cancel\", { defaultValue: \"Cancel\" })}\n </Button>\n <Button\n type=\"button\"\n disabled={!canSubmit || create.isPending}\n onClick={submit}\n >\n {create.isPending ? (\n <IconLoader2 className=\"size-4 animate-spin\" />\n ) : null}\n {t(\"jobs.createAutomation\", { defaultValue: \"Create automation\" })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"automation-create-dialog.js","sourceRoot":"","sources":["../../src/components/automation-create-dialog.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n DEFAULT_AUTOMATION_SCHEDULE_DRAFT,\n AUTOMATION_WEEKDAYS,\n automationScheduleToCron,\n formatAutomationTime,\n type AutomationScheduleDraft,\n type AutomationSchedulePreset,\n type AutomationScheduleUnit,\n} from \"@agent-native/core/client/agent-page/automation-schedule\";\nimport {\n TimezoneSelect,\n browserTimezone,\n} from \"@agent-native/core/client/agent-page/timezone-select\";\nimport {\n useActionMutation,\n useActionQuery,\n} from \"@agent-native/core/client/hooks\";\nimport { useT } from \"@agent-native/core/client/i18n\";\nimport {\n IconBolt,\n IconCalendarEvent,\n IconClock,\n IconCode,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport { useEffect, useState } from \"react\";\n\nimport { Button } from \"./ui/button\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"./ui/dialog\";\nimport { Input } from \"./ui/input\";\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from \"./ui/select\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./ui/tabs\";\nimport { Textarea } from \"./ui/textarea\";\n\ntype TriggerType = \"schedule\" | \"event\" | \"webhook\";\n\ninterface AutomationEvent {\n name: string;\n description?: string;\n}\n\ninterface CreateAutomationInput {\n operation: \"create\";\n name: string;\n scope: \"personal\" | \"organization\";\n triggerType: TriggerType;\n body: string;\n schedule?: string;\n timezone?: string;\n event?: string;\n}\n\ninterface CreateAutomationResult {\n created: true;\n name: string;\n triggerType: TriggerType;\n webhookPath: string | null;\n}\n\nconst PRESETS: {\n value: AutomationSchedulePreset;\n labelKey: string;\n detailKey: string;\n label: string;\n detail: string;\n draft: Partial<AutomationScheduleDraft>;\n}[] = [\n {\n value: \"hourly\",\n labelKey: \"jobs.schedulePreset.hourly\",\n detailKey: \"jobs.schedulePreset.hourlyDetail\",\n label: \"Every hour\",\n detail: \"At the top of the hour\",\n draft: { preset: \"hourly\" },\n },\n {\n value: \"daily-midnight\",\n labelKey: \"jobs.schedulePreset.dailyMidnight\",\n detailKey: \"jobs.schedulePreset.dailyMidnightDetail\",\n label: \"Every day at midnight\",\n detail: \"12:00 AM\",\n draft: { preset: \"daily-midnight\" },\n },\n {\n value: \"daily-noon\",\n labelKey: \"jobs.schedulePreset.dailyNoon\",\n detailKey: \"jobs.schedulePreset.dailyNoonDetail\",\n label: \"Every day at noon\",\n detail: \"12:00 PM\",\n draft: { preset: \"daily-noon\" },\n },\n {\n value: \"weekdays\",\n labelKey: \"jobs.schedulePreset.weekdays\",\n detailKey: \"jobs.schedulePreset.weekdaysDetail\",\n label: \"Every weekday\",\n detail: \"Monday to Friday at 9:00 AM\",\n draft: { preset: \"weekdays\", time: \"09:00\" },\n },\n {\n value: \"weekly\",\n labelKey: \"jobs.schedulePreset.weekly\",\n detailKey: \"jobs.schedulePreset.weeklyDetail\",\n label: \"Every week\",\n detail: \"Sunday at 9:00 AM\",\n draft: { preset: \"weekly\", weekday: 0, time: \"09:00\" },\n },\n];\n\nfunction presetClass(selected: boolean): string {\n return (\n \"rounded-lg border px-3 py-2 text-left transition-colors \" +\n (selected\n ? \"border-primary bg-primary/5 text-foreground\"\n : \"border-border/70 bg-background hover:bg-muted/50\")\n );\n}\n\nfunction scheduleIsValid(value: string): boolean {\n return value.trim().split(/\\s+/).length === 5;\n}\n\nfunction ScheduleFields({\n draft,\n saving,\n onChange,\n}: {\n draft: AutomationScheduleDraft;\n saving: boolean;\n onChange: (patch: Partial<AutomationScheduleDraft>) => void;\n}) {\n const t = useT();\n const customMinute = Number(draft.time.split(\":\")[1] ?? 0);\n return (\n <div className=\"space-y-3 rounded-lg border border-border/70 bg-muted/20 p-3\">\n <div className=\"grid gap-3 sm:grid-cols-[1fr_1fr]\">\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.repeatEvery\", { defaultValue: \"Repeat every\" })}</span>\n <Input\n type=\"number\"\n min={1}\n max={31}\n value={draft.interval}\n disabled={saving}\n onChange={(event) =>\n onChange({\n interval: Math.min(\n draft.unit === \"day\" ? 1 : 31,\n Math.max(1, Number(event.target.value) || 1),\n ),\n })\n }\n className=\"bg-background text-sm\"\n />\n </label>\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.scheduleUnit\", { defaultValue: \"Unit\" })}</span>\n <Select\n value={draft.unit}\n disabled={saving}\n onValueChange={(value) =>\n onChange({\n unit: value as AutomationScheduleUnit,\n ...(value === \"day\" ? { interval: 1 } : {}),\n })\n }\n >\n <SelectTrigger className=\"bg-background text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"hour\">\n {t(\"jobs.hours\", { defaultValue: \"hour(s)\" })}\n </SelectItem>\n <SelectItem value=\"day\">\n {t(\"jobs.day\", { defaultValue: \"day\" })}\n </SelectItem>\n <SelectItem value=\"week\">\n {t(\"jobs.weeks\", { defaultValue: \"week(s)\" })}\n </SelectItem>\n <SelectItem value=\"month\">\n {t(\"jobs.months\", { defaultValue: \"month(s)\" })}\n </SelectItem>\n </SelectContent>\n </Select>\n </label>\n </div>\n\n {draft.unit === \"hour\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.atMinute\", { defaultValue: \"At minute\" })}</span>\n <Input\n type=\"number\"\n min={0}\n max={59}\n value={customMinute}\n disabled={saving}\n onChange={(event) =>\n onChange({\n time:\n \"00:\" +\n String(\n Math.min(59, Math.max(0, Number(event.target.value) || 0)),\n ).padStart(2, \"0\"),\n })\n }\n className=\"bg-background text-sm\"\n />\n </label>\n ) : null}\n\n {draft.unit === \"week\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.onDay\", { defaultValue: \"On\" })}</span>\n <Select\n value={String(draft.weekday)}\n disabled={saving}\n onValueChange={(value) => onChange({ weekday: Number(value) })}\n >\n <SelectTrigger className=\"bg-background text-sm\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {AUTOMATION_WEEKDAYS.map((day) => (\n <SelectItem key={day.value} value={String(day.value)}>\n {day.short}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n ) : null}\n\n {draft.unit === \"month\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.dayOfMonth\", { defaultValue: \"Day of month\" })}</span>\n <Input\n type=\"number\"\n min={1}\n max={31}\n value={draft.monthDay}\n disabled={saving}\n onChange={(event) =>\n onChange({\n monthDay: Math.min(\n 31,\n Math.max(1, Number(event.target.value) || 1),\n ),\n })\n }\n className=\"bg-background text-sm\"\n />\n </label>\n ) : null}\n\n {draft.unit !== \"hour\" ? (\n <label className=\"block space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.atTime\", { defaultValue: \"At\" })}</span>\n <Input\n type=\"time\"\n value={draft.time}\n disabled={saving}\n onChange={(event) => onChange({ time: event.target.value })}\n className=\"bg-background text-sm\"\n />\n </label>\n ) : null}\n </div>\n );\n}\n\nfunction ScheduleBuilder({\n saving,\n timezone,\n onTimezoneChange,\n onChange,\n}: {\n saving: boolean;\n timezone: string;\n onTimezoneChange: (value: string) => void;\n onChange: (value: string) => void;\n}) {\n const t = useT();\n const [draft, setDraft] = useState<AutomationScheduleDraft>(\n DEFAULT_AUTOMATION_SCHEDULE_DRAFT,\n );\n const [advanced, setAdvanced] = useState(false);\n const [advancedValue, setAdvancedValue] = useState(\"0 * * * *\");\n const friendly = automationScheduleToCron(draft);\n const activeSchedule = advanced\n ? advancedValue.trim()\n : (friendly.schedule ?? \"\");\n const valid =\n scheduleIsValid(activeSchedule) && (!friendly.error || advanced);\n\n useEffect(() => {\n onChange(valid ? activeSchedule : \"\");\n }, [activeSchedule, onChange, valid]);\n\n function choosePreset(\n value: AutomationSchedulePreset,\n presetDraft: Partial<AutomationScheduleDraft>,\n ) {\n setDraft((current) => ({ ...current, ...presetDraft, preset: value }));\n setAdvanced(false);\n }\n\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-2\">\n <div className=\"text-xs font-medium text-foreground\">\n {t(\"jobs.repeat\", { defaultValue: \"Repeat\" })}\n </div>\n <div className=\"grid gap-2 sm:grid-cols-2\">\n {PRESETS.map((preset) => (\n <button\n key={preset.value}\n type=\"button\"\n aria-pressed={!advanced && draft.preset === preset.value}\n disabled={saving}\n className={presetClass(\n !advanced && draft.preset === preset.value,\n )}\n onClick={() => choosePreset(preset.value, preset.draft)}\n >\n <span className=\"block text-sm font-medium\">\n {t(preset.labelKey, { defaultValue: preset.label })}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {t(preset.detailKey, { defaultValue: preset.detail })}\n </span>\n </button>\n ))}\n <button\n type=\"button\"\n aria-pressed={!advanced && draft.preset === \"custom\"}\n disabled={saving}\n className={presetClass(!advanced && draft.preset === \"custom\")}\n onClick={() =>\n choosePreset(\"custom\", {\n preset: \"custom\",\n unit: draft.unit || \"day\",\n })\n }\n >\n <span className=\"block text-sm font-medium\">\n {t(\"jobs.schedulePreset.custom\", { defaultValue: \"Custom\" })}\n </span>\n <span className=\"mt-0.5 block text-xs text-muted-foreground\">\n {t(\"jobs.schedulePreset.customDetail\", {\n defaultValue: \"Set your own repeat pattern\",\n })}\n </span>\n </button>\n </div>\n </div>\n\n {!advanced && draft.preset === \"custom\" ? (\n <ScheduleFields\n draft={draft}\n saving={saving}\n onChange={(patch) =>\n setDraft((current) => ({ ...current, ...patch }))\n }\n />\n ) : null}\n\n {!advanced && friendly.schedule ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\"jobs.schedulePreview\", {\n defaultValue: \"Runs {{time}}.\",\n time:\n draft.preset === \"hourly\"\n ? t(\"jobs.schedulePreview.hourly\", {\n defaultValue: \"at the start of every hour\",\n })\n : draft.preset === \"daily-midnight\"\n ? t(\"jobs.schedulePreview.dailyMidnight\", {\n defaultValue: \"every day at midnight\",\n })\n : draft.preset === \"daily-noon\"\n ? t(\"jobs.schedulePreview.dailyNoon\", {\n defaultValue: \"every day at noon\",\n })\n : t(\"jobs.schedulePreview.atTime\", {\n defaultValue: \"at {{time}}\",\n time: formatAutomationTime(draft.time),\n }),\n })}\n </p>\n ) : null}\n {!advanced && friendly.error ? (\n <p className=\"text-xs text-destructive\">\n {friendly.error === \"daily-interval\"\n ? t(\"jobs.dailyIntervalAdvanced\", {\n defaultValue:\n \"Every few days needs the Advanced cron editor below.\",\n })\n : t(\"jobs.weeklyIntervalAdvanced\", {\n defaultValue:\n \"Custom weekly intervals beyond one week are available under Advanced.\",\n })}\n </p>\n ) : null}\n\n <div>\n <label className=\"text-xs font-medium text-foreground\">\n {t(\"jobs.timezone\", { defaultValue: \"Timezone\" })}\n </label>\n <div className=\"mt-1\">\n <TimezoneSelect\n value={timezone}\n disabled={saving}\n onChange={onTimezoneChange}\n suggested={[browserTimezone()]}\n />\n </div>\n </div>\n\n <details\n className=\"group rounded-lg border border-border/70 bg-muted/20\"\n open={advanced}\n onToggle={(event) => {\n const next = event.currentTarget.open;\n if (next && !advanced && friendly.schedule) {\n setAdvancedValue(friendly.schedule);\n }\n setAdvanced(next);\n }}\n >\n <summary className=\"flex cursor-pointer list-none items-center gap-2 px-3 py-2.5 text-xs font-medium text-foreground [&::-webkit-details-marker]:hidden\">\n <IconCode className=\"size-4 text-muted-foreground\" />\n {t(\"jobs.advancedSchedule\", {\n defaultValue: \"Advanced - cron expression\",\n })}\n <span className=\"ms-auto text-muted-foreground group-open:hidden\">\n {t(\"jobs.show\", { defaultValue: \"Show\" })}\n </span>\n <span className=\"ms-auto hidden text-muted-foreground group-open:inline\">\n {t(\"jobs.hide\", { defaultValue: \"Hide\" })}\n </span>\n </summary>\n <div className=\"border-t border-border/60 px-3 pb-3 pt-2.5\">\n <Input\n className=\"font-mono text-sm\"\n value={advancedValue}\n spellCheck={false}\n autoComplete=\"off\"\n disabled={saving}\n onFocus={() => setAdvanced(true)}\n onChange={(event) => {\n setAdvanced(true);\n setAdvancedValue(event.target.value);\n }}\n />\n <p className=\"mt-1 text-[11px] text-muted-foreground\">\n {t(\"jobs.cronFormatHint\", {\n defaultValue: \"minute hour day-of-month month day-of-week\",\n })}\n </p>\n </div>\n </details>\n\n {activeSchedule && !valid ? (\n <p className=\"text-xs text-destructive\">\n {t(\"jobs.cronFieldCount\", {\n defaultValue: \"A cron expression needs exactly 5 fields.\",\n })}\n </p>\n ) : null}\n </div>\n );\n}\n\nfunction EventFields({\n open,\n event,\n onChange,\n}: {\n open: boolean;\n event: string;\n onChange: (value: string) => void;\n}) {\n const t = useT();\n const eventsQuery = useActionQuery<AutomationEvent[]>(\n \"list-automation-events\",\n {},\n { enabled: open, staleTime: 60_000 },\n );\n\n return (\n <>\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.startWhen\", { defaultValue: \"Start when\" })}</span>\n <Select value={event} onValueChange={onChange}>\n <SelectTrigger>\n <SelectValue\n placeholder={\n eventsQuery.isLoading\n ? t(\"jobs.loadingEventTypes\", {\n defaultValue: \"Loading event types...\",\n })\n : t(\"jobs.chooseAppEvent\", {\n defaultValue: \"Choose an app event\",\n })\n }\n />\n </SelectTrigger>\n <SelectContent>\n {(eventsQuery.data ?? []).map((item) => (\n <SelectItem key={item.name} value={item.name}>\n {item.name}\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </label>\n {eventsQuery.data?.find((item) => item.name === event)?.description ? (\n <p className=\"mt-2 text-xs text-muted-foreground\">\n {eventsQuery.data.find((item) => item.name === event)?.description}\n </p>\n ) : null}\n {eventsQuery.error ? (\n <p className=\"mt-2 text-xs text-destructive\">\n {t(\"jobs.loadEventTypesError\", {\n defaultValue: \"Could not load event types.\",\n })}\n </p>\n ) : null}\n </>\n );\n}\n\nexport interface AutomationCreateDialogProps {\n open: boolean;\n initialScope?: \"personal\" | \"organization\";\n onOpenChange: (open: boolean) => void;\n onCreated: (result: CreateAutomationResult) => void;\n}\n\nexport function AutomationCreateDialog({\n open,\n initialScope = \"personal\",\n onOpenChange,\n onCreated,\n}: AutomationCreateDialogProps) {\n const t = useT();\n const [name, setName] = useState(\"\");\n const [scope, setScope] = useState<\"personal\" | \"organization\">(initialScope);\n const [triggerType, setTriggerType] = useState<TriggerType>(\"schedule\");\n const [schedule, setSchedule] = useState(\"0 * * * *\");\n const [timezone, setTimezone] = useState(browserTimezone());\n const [event, setEvent] = useState(\"\");\n const [body, setBody] = useState(\"\");\n const create = useActionMutation<\n CreateAutomationResult,\n CreateAutomationInput\n >(\"manage-automation\", {\n onSuccess: onCreated,\n });\n\n const resetCreate = create.reset;\n\n useEffect(() => {\n if (!open) return;\n setName(\"\");\n setScope(initialScope);\n setTriggerType(\"schedule\");\n setSchedule(\"0 * * * *\");\n setTimezone(browserTimezone());\n setEvent(\"\");\n setBody(\"\");\n resetCreate();\n }, [initialScope, open, resetCreate]);\n\n const canSubmit =\n name.trim().length > 0 &&\n body.trim().length > 0 &&\n (triggerType !== \"event\" || event.length > 0) &&\n (triggerType !== \"schedule\" || scheduleIsValid(schedule));\n\n function submit() {\n if (!canSubmit) return;\n create.mutate({\n operation: \"create\",\n name: name.trim(),\n scope,\n triggerType,\n body: body.trim(),\n ...(triggerType === \"schedule\"\n ? { schedule, timezone }\n : triggerType === \"event\"\n ? { event }\n : {}),\n });\n }\n\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent className=\"max-h-[90vh] overflow-y-auto sm:max-w-2xl\">\n <DialogHeader>\n <DialogTitle>\n {t(\"jobs.newAutomation\", { defaultValue: \"New automation\" })}\n </DialogTitle>\n <DialogDescription>\n {t(\"jobs.createAutomationDescription\", {\n defaultValue:\n \"Choose what starts it, then describe the work in plain language.\",\n })}\n </DialogDescription>\n </DialogHeader>\n\n <div className=\"space-y-4\">\n <div className=\"grid gap-3 sm:grid-cols-[1fr_12rem]\">\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.name\", { defaultValue: \"Name\" })}</span>\n <Input\n value={name}\n disabled={create.isPending}\n placeholder={t(\"jobs.automationNamePlaceholder\", {\n defaultValue: \"morning-digest\",\n })}\n onChange={(event) => setName(event.target.value)}\n />\n </label>\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>{t(\"jobs.scope\", { defaultValue: \"Scope\" })}</span>\n <Select\n value={scope}\n disabled={create.isPending}\n onValueChange={(value) =>\n setScope(value as \"personal\" | \"organization\")\n }\n >\n <SelectTrigger>\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"personal\">\n {t(\"jobs.personal\", { defaultValue: \"Personal\" })}\n </SelectItem>\n <SelectItem value=\"organization\">\n {t(\"jobs.organization\", { defaultValue: \"Organization\" })}\n </SelectItem>\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <Tabs\n value={triggerType}\n onValueChange={(value) => setTriggerType(value as TriggerType)}\n >\n <TabsList className=\"grid h-auto w-full grid-cols-3\">\n <TabsTrigger value=\"schedule\" className=\"gap-2 py-2 text-xs\">\n <IconClock className=\"size-3.5\" />\n {t(\"jobs.schedule\", { defaultValue: \"Schedule\" })}\n </TabsTrigger>\n <TabsTrigger value=\"webhook\" className=\"gap-2 py-2 text-xs\">\n <IconBolt className=\"size-3.5\" />\n {t(\"jobs.webhook\", { defaultValue: \"Webhook\" })}\n </TabsTrigger>\n <TabsTrigger value=\"event\" className=\"gap-2 py-2 text-xs\">\n <IconCalendarEvent className=\"size-3.5\" />\n {t(\"jobs.appEvent\", { defaultValue: \"App event\" })}\n </TabsTrigger>\n </TabsList>\n <TabsContent value=\"schedule\" className=\"mt-3\">\n <ScheduleBuilder\n key={open ? \"schedule-open\" : \"schedule-closed\"}\n saving={create.isPending}\n timezone={timezone}\n onTimezoneChange={setTimezone}\n onChange={setSchedule}\n />\n </TabsContent>\n <TabsContent value=\"webhook\" className=\"mt-3\">\n <div className=\"rounded-lg border border-primary/20 bg-primary/5 p-3\">\n <div className=\"flex items-start gap-2\">\n <IconBolt className=\"mt-0.5 size-4 shrink-0 text-primary\" />\n <div>\n <p className=\"text-sm font-medium text-foreground\">\n {t(\"jobs.webhookTriggerDescription\", {\n defaultValue: \"Run when a service sends an HTTP POST\",\n })}\n </p>\n <p className=\"mt-1 text-xs leading-5 text-muted-foreground\">\n {t(\"jobs.webhookSetupDescription\", {\n defaultValue:\n \"After you save, Dispatch gives you a private URL to paste into GitHub, Stripe, or another webhook provider.\",\n })}\n </p>\n </div>\n </div>\n </div>\n </TabsContent>\n <TabsContent value=\"event\" className=\"mt-3\">\n <EventFields open={open} event={event} onChange={setEvent} />\n </TabsContent>\n </Tabs>\n\n <label className=\"space-y-1.5 text-xs text-muted-foreground\">\n <span>\n {t(\"jobs.whatShouldItDo\", { defaultValue: \"What should it do?\" })}\n </span>\n <Textarea\n value={body}\n disabled={create.isPending}\n placeholder={t(\"jobs.automationBodyPlaceholder\", {\n defaultValue:\n \"Review new support requests and summarize anything urgent in a shared note.\",\n })}\n rows={5}\n onChange={(event) => setBody(event.target.value)}\n />\n </label>\n\n {create.error ? (\n <p className=\"text-xs text-destructive\">{create.error.message}</p>\n ) : null}\n </div>\n\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"outline\"\n disabled={create.isPending}\n onClick={() => onOpenChange(false)}\n >\n {t(\"jobs.cancel\", { defaultValue: \"Cancel\" })}\n </Button>\n <Button\n type=\"button\"\n disabled={!canSubmit || create.isPending}\n onClick={submit}\n >\n {create.isPending ? (\n <IconLoader2 className=\"size-4 animate-spin\" />\n ) : null}\n {t(\"jobs.createAutomation\", { defaultValue: \"Create automation\" })}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"]}
|
|
@@ -56,6 +56,6 @@ export function Header({ onOpenMobile, showAgentToggle = true, }) {
|
|
|
56
56
|
}));
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
-
return (_jsxs("header", { className: "flex h-12 shrink-0 items-center gap-3 border-b border-border bg-background px-4 lg:px-6", children: [onOpenMobile ? (_jsx(Button, { variant: "ghost", size: "icon", className: "
|
|
59
|
+
return (_jsxs("header", { className: "flex h-12 shrink-0 items-center gap-3 border-b border-border bg-background px-4 lg:px-6", children: [onOpenMobile ? (_jsx(Button, { variant: "ghost", size: "icon-sm", className: "lg:hidden cursor-pointer", onClick: onOpenMobile, "aria-label": "Open navigation", children: _jsx(IconLayoutSidebar, {}) })) : null, _jsx("div", { className: "flex items-center gap-3 flex-1 min-w-0", children: title ?? (_jsx("h1", { className: "text-lg font-semibold tracking-tight truncate", children: resolveTitle(location.pathname) })) }), _jsxs("div", { className: "flex items-center gap-2 shrink-0", children: [actions, _jsx(RunsTray, { limit: 8, onOpenThread: openRunThread }), showAgentToggle ? (_jsx(AgentToggleButton, { className: "h-8 w-8 rounded-md hover:bg-accent" })) : null] })] }));
|
|
60
60
|
}
|
|
61
61
|
//# sourceMappingURL=Header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,oCAAoC,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAExD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,MAAM,UAAU,GAA2B;IACzC,GAAG,EAAE,UAAU;IACf,WAAW,EAAE,UAAU;IACvB,QAAQ,EAAE,OAAO;IACjB,eAAe,EAAE,cAAc;IAC/B,YAAY,EAAE,WAAW;IACzB,YAAY,EAAE,WAAW;IACzB,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,cAAc;IAC/B,aAAa,EAAE,YAAY;IAC3B,YAAY,EAAE,WAAW;IACzB,cAAc,EAAE,aAAa;IAC7B,QAAQ,EAAE,OAAO;IACjB,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,cAAc;IAC/B,sBAAsB,EAAE,qBAAqB;IAC7C,WAAW,EAAE,UAAU;CACxB,CAAC;AAEF,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACpE,IAAI,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,UAAU,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC;IAC1C,CAAC;IACD,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEtD,IAAI,QAAQ,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,YAAY,CAAC;IAE5D,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,MAAM,CAAC,EACrB,YAAY,EACZ,eAAe,GAAG,IAAI,GAIvB;IACC,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,cAAc,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,SAAS,aAAa,CAAC,QAAgB;QACrC,KAAK,QAAQ,CAAC,OAAO,EAAE;YACrB,KAAK,EAAE;gBACL,cAAc,EAAE;oBACd,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,IAAI,QAAQ,EAAE;oBAC/B,QAAQ;iBACT;aACF;SACF,CAAC,CAAC;QACH,MAAM,CAAC,qBAAqB,CAAC,GAAG,EAAE;YAChC,MAAM,CAAC,aAAa,CAClB,IAAI,WAAW,CAAC,wBAAwB,EAAE;gBACxC,MAAM,EAAE,EAAE,QAAQ,EAAE;aACrB,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,CACL,kBAAQ,SAAS,EAAC,yFAAyF,aACxG,YAAY,CAAC,CAAC,CAAC,CACd,KAAC,MAAM,IACL,OAAO,EAAC,OAAO,EACf,IAAI,EAAC,
|
|
1
|
+
{"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../src/components/layout/Header.tsx"],"names":[],"mappings":"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","sourcesContent":["import { AgentToggleButton } from \"@agent-native/core/client/agent-chat\";\nimport { RunsTray } from \"@agent-native/core/client/progress\";\nimport { IconLayoutSidebar } from \"@tabler/icons-react\";\nimport { useLocation, useNavigate } from \"react-router\";\n\nimport { Button } from \"../ui/button\";\nimport { useHeaderTitle, useHeaderActions } from \"./HeaderActions\";\n\nconst pageTitles: Record<string, string> = {\n \"/\": \"Overview\",\n \"/overview\": \"Overview\",\n \"/vault\": \"Vault\",\n \"/integrations\": \"Integrations\",\n \"/workspace\": \"Resources\",\n \"/messaging\": \"Messaging\",\n \"/agents\": \"Agents\",\n \"/destinations\": \"Destinations\",\n \"/identities\": \"Identities\",\n \"/approvals\": \"Approvals\",\n \"/automations\": \"Automations\",\n \"/audit\": \"Audit\",\n \"/dreams\": \"Dreams\",\n \"/thread-debug\": \"Thread Debug\",\n \"/transactional-email\": \"Transactional email\",\n \"/settings\": \"Settings\",\n};\n\nfunction resolveTitle(pathname: string): string {\n if (pathname === \"/admin\" || pathname === \"/admin/\") return \"Admin\";\n if (pathname.startsWith(\"/admin/\")) {\n const adminPath = pathname.slice(\"/admin\".length);\n return pageTitles[adminPath] ?? \"Admin\";\n }\n if (pageTitles[pathname]) return pageTitles[pathname];\n\n if (pathname.startsWith(\"/extensions\")) return \"Extensions\";\n\n return \"Dispatch\";\n}\n\nexport function Header({\n onOpenMobile,\n showAgentToggle = true,\n}: {\n onOpenMobile?: () => void;\n showAgentToggle?: boolean;\n}) {\n const location = useLocation();\n const navigate = useNavigate();\n const title = useHeaderTitle();\n const actions = useHeaderActions();\n\n function openRunThread(threadId: string) {\n void navigate(\"/chat\", {\n state: {\n dispatchThread: {\n id: `${Date.now()}-${threadId}`,\n threadId,\n },\n },\n });\n window.requestAnimationFrame(() => {\n window.dispatchEvent(\n new CustomEvent(\"agent-chat:open-thread\", {\n detail: { threadId },\n }),\n );\n });\n }\n\n return (\n <header className=\"flex h-12 shrink-0 items-center gap-3 border-b border-border bg-background px-4 lg:px-6\">\n {onOpenMobile ? (\n <Button\n variant=\"ghost\"\n size=\"icon-sm\"\n className=\"lg:hidden cursor-pointer\"\n onClick={onOpenMobile}\n aria-label=\"Open navigation\"\n >\n <IconLayoutSidebar />\n </Button>\n ) : null}\n <div className=\"flex items-center gap-3 flex-1 min-w-0\">\n {title ?? (\n <h1 className=\"text-lg font-semibold tracking-tight truncate\">\n {resolveTitle(location.pathname)}\n </h1>\n )}\n </div>\n <div className=\"flex items-center gap-2 shrink-0\">\n {actions}\n <RunsTray limit={8} onOpenThread={openRunThread} />\n {showAgentToggle ? (\n <AgentToggleButton className=\"h-8 w-8 rounded-md hover:bg-accent\" />\n ) : null}\n </div>\n </header>\n );\n}\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type ChatFirstAppRegistration, type ChatFirstAppLayoutPreference } from "@agent-native/core/client/agent-chat";
|
|
2
2
|
import { type ChatFirstAppItem, type ChatFirstCopy, type ChatFirstPrimaryTab } from "@agent-native/core/client/chat-first";
|
|
3
|
+
import { type FeatureFlagState } from "@agent-native/core/client/feature-flags";
|
|
3
4
|
import { type ComponentType, type ReactNode } from "react";
|
|
4
5
|
export { buildChatFirstEmbedSessionInput } from "../workspace-app-host.js";
|
|
5
6
|
export type DispatchNavSection = "primary" | "operations";
|
|
@@ -53,6 +54,12 @@ export declare const CHAT_FIRST_SURFACE_PANEL_TOGGLE_CLASS_NAME = "absolute righ
|
|
|
53
54
|
export declare function useDispatchExtensions(): DispatchExtensionConfig | undefined;
|
|
54
55
|
export declare function isElectronEmbeddedSearch(search: string): boolean;
|
|
55
56
|
export declare function shouldAutoCollapseDispatchSidebar(pathname: string): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* The redesigned Settings brings its own navigation, header, and agent
|
|
59
|
+
* toggle, so it renders full width. While the flag loads it shows the
|
|
60
|
+
* shell's skeleton, which needs the same frame.
|
|
61
|
+
*/
|
|
62
|
+
export declare function isRedesignedSettingsPath(pathname: string, settingsRedesign: FeatureFlagState): boolean;
|
|
56
63
|
export declare function formatThreadAge(updatedAt: number, now?: number): string;
|
|
57
64
|
export declare function NavContent({ onNavigate, extensions, brandName, brandIcon, chatFirstMode, chatFirstEmbedded, collapsed, collapsible, onCollapsedChange, chatFirstAppLayout, onChatFirstAppLayoutChange, chatFirstApps, chatFirstAppsLoading, chatFirstAppsError, chatFirstActiveAppId, chatFirstActivePrimaryTab, onChatFirstNewChat, onChatFirstAppOpen, onChatFirstAppsRetry, }: DispatchNavContentProps): import("node_modules/@types/react").JSX.Element;
|
|
58
65
|
export declare function renderChatFirstAppSurfaceTab({ registration, embedPath, loading, isMobileSurface, copy, }: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"AAAA,OAAO,EAsBL,KAAK,wBAAwB,EAC7B,KAAK,4BAA4B,EAYlC,MAAM,sCAAsC,CAAC;AAM9C,OAAO,EAaL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EAElB,KAAK,mBAAmB,EACzB,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"Layout.d.ts","sourceRoot":"","sources":["../../../src/components/layout/Layout.tsx"],"names":[],"mappings":"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"}
|
|
@@ -4,12 +4,15 @@ import { appBasePath, appPath } from "@agent-native/core/client/api-path";
|
|
|
4
4
|
import { readClientAppState, writeClientAppState, } from "@agent-native/core/client/application-state";
|
|
5
5
|
import { ChatFirstAgentsPane, ChatFirstAppPane, ChatFirstAppsRail, ChatFirstBrowserPane, ChatFirstChatHistory, ChatFirstPrimaryNavigation, ChatFirstSessionWatchPane, ChatFirstSurfacePanel, ChatFirstSurfaceContent, ChatFirstSurfaceTabs, defaultChatFirstCopy, } from "@agent-native/core/client/chat-first";
|
|
6
6
|
import { writeClipboardText } from "@agent-native/core/client/clipboard";
|
|
7
|
+
import { useFeatureFlagState, } from "@agent-native/core/client/feature-flags";
|
|
7
8
|
import { useActionQuery } from "@agent-native/core/client/hooks";
|
|
8
9
|
import { useT } from "@agent-native/core/client/i18n";
|
|
9
10
|
import { openCommandMenu } from "@agent-native/core/client/navigation";
|
|
10
11
|
import { InvitationBanner, OrgSwitcher } from "@agent-native/core/client/org";
|
|
11
12
|
import { RunsTray } from "@agent-native/core/client/progress";
|
|
13
|
+
import { isSettingsPathname } from "@agent-native/core/client/settings";
|
|
12
14
|
import { AppSidebarFooter, AppSidebarHeader, FeedbackButton, } from "@agent-native/core/client/ui";
|
|
15
|
+
import { SETTINGS_REDESIGN_FLAG } from "@agent-native/core/feature-flags/registry";
|
|
13
16
|
import { ChatHistoryRail, } from "@agent-native/toolkit/chat-history";
|
|
14
17
|
import { IconApps, IconBrandSlack, IconBrandTelegram, IconCopy, IconEye, IconHierarchy2, IconMessageQuestion, IconBroadcast, IconLayoutSidebar, IconLayoutSidebarLeftCollapse, IconLayoutSidebarLeftExpand, IconSettings, IconShield, IconWorld, IconDeviceDesktop, IconPlus, } from "@tabler/icons-react";
|
|
15
18
|
import { createContext, useEffect, useMemo, useRef, useState, useContext, useCallback, } from "react";
|
|
@@ -127,6 +130,15 @@ export function isElectronEmbeddedSearch(search) {
|
|
|
127
130
|
export function shouldAutoCollapseDispatchSidebar(pathname) {
|
|
128
131
|
return localDispatchPath(pathname).startsWith("/apps/");
|
|
129
132
|
}
|
|
133
|
+
/**
|
|
134
|
+
* The redesigned Settings brings its own navigation, header, and agent
|
|
135
|
+
* toggle, so it renders full width. While the flag loads it shows the
|
|
136
|
+
* shell's skeleton, which needs the same frame.
|
|
137
|
+
*/
|
|
138
|
+
export function isRedesignedSettingsPath(pathname, settingsRedesign) {
|
|
139
|
+
return (isSettingsPathname(localDispatchPath(pathname)) &&
|
|
140
|
+
(settingsRedesign.enabled || settingsRedesign.status === "loading"));
|
|
141
|
+
}
|
|
130
142
|
function chatFirstPrimaryTabForPath(pathname) {
|
|
131
143
|
if (pathname === "/chat" || pathname.startsWith("/chat/")) {
|
|
132
144
|
return "new-chat";
|
|
@@ -641,6 +653,7 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
641
653
|
? isElectronEmbeddedSearch(window.location.search)
|
|
642
654
|
: false);
|
|
643
655
|
const isChatRoute = localPathname === "/chat" || localPathname.startsWith("/chat/");
|
|
656
|
+
const isRedesignedSettingsRoute = isRedesignedSettingsPath(location.pathname, useFeatureFlagState(SETTINGS_REDESIGN_FLAG.key));
|
|
644
657
|
const chatFirstSurfaceScope = threadIdFromPath(localPathname) ?? "new";
|
|
645
658
|
const isWorkspaceAppRoute = shouldAutoCollapseDispatchSidebar(location.pathname);
|
|
646
659
|
const workspaceAppId = isWorkspaceAppRoute
|
|
@@ -1257,7 +1270,9 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
1257
1270
|
if (isWorkspaceAppHostRoute) {
|
|
1258
1271
|
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(HeaderActionsProvider, { children: _jsx("div", { "data-dispatch-workspace-app-chrome-less": true, className: "h-screen w-full overflow-hidden bg-background", children: children }) }) }));
|
|
1259
1272
|
}
|
|
1260
|
-
const showAgentControls = !isChatRoute &&
|
|
1273
|
+
const showAgentControls = !isChatRoute &&
|
|
1274
|
+
!isRedesignedSettingsRoute &&
|
|
1275
|
+
!pageOwnsToolbar(localPathname);
|
|
1261
1276
|
function openAskAgentFullscreen() {
|
|
1262
1277
|
focusAgentChat();
|
|
1263
1278
|
navigateWithAgentChatViewTransition(navigate, dispatchNavLinkTarget("/chat"));
|
|
@@ -1284,7 +1299,7 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
1284
1299
|
];
|
|
1285
1300
|
const appContent = (_jsxs("div", { className: "relative flex h-full min-h-0 min-w-0 flex-1 flex-col overflow-hidden", children: [_jsx(InvitationBanner, {}), isChatRoute && chatFirstMode && chatFirstHasActiveChat ? (_jsx(ChatFirstSurfacePanelToggle, { open: chatFirstSurfacePanel.open, onToggle: chatFirstSurfacePanel.toggle, className: CHAT_FIRST_SURFACE_PANEL_TOGGLE_CLASS_NAME })) : null, isChatRoute && chatFirstMode && chatFirstNotice ? (_jsxs("div", { className: "dispatch-chat-first-notice", role: "status", "aria-live": "polite", children: [_jsx("span", { children: chatFirstNotice }), _jsx("button", { type: "button", onClick: () => setChatFirstNotice(null), "aria-label": "Dismiss app notice", children: "Dismiss" })] })) : null, _jsx("main", { className: cn("min-h-0 flex-1", isChatRoute || isWorkspaceAppRoute
|
|
1286
1301
|
? "overflow-hidden"
|
|
1287
|
-
: "overflow-y-auto"), children: showAgentControls ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "pointer-events-none sticky top-0 z-10 flex justify-end px-4 pt-2 lg:px-6", children: [_jsx(Button, { variant: "ghost", size: "icon", className: "pointer-events-auto absolute start-4 top-2
|
|
1302
|
+
: "overflow-y-auto"), children: showAgentControls ? (_jsxs(_Fragment, { children: [_jsxs("div", { className: "pointer-events-none sticky top-0 z-10 flex justify-end px-4 pt-2 lg:px-6", children: [_jsx(Button, { variant: "ghost", size: "icon-sm", className: "pointer-events-auto absolute start-4 top-2 lg:hidden", onClick: () => setMobileOpen(true), "aria-label": "Open navigation", children: _jsx(IconLayoutSidebar, { className: "h-4 w-4" }) }), _jsxs("div", { className: "pointer-events-auto flex items-center gap-1", children: [_jsx(RunsTray, { limit: 8, onOpenThread: openRunThread }), _jsx(AgentToggleButton, { className: "h-8 w-8 rounded-md bg-background/80 hover:bg-accent" })] })] }), _jsxs("div", { className: "mx-auto max-w-7xl space-y-10 px-4 py-6 sm:px-6", children: [localPathname !== "/overview" && (pageTitle || headerActions) ? (_jsxs("div", { className: "flex min-w-0 items-center justify-between gap-3", children: [_jsx("div", { className: "min-w-0 flex-1", children: pageTitle }), headerActions ? (_jsx("div", { className: "flex shrink-0 items-center gap-2", children: headerActions })) : null] })) : null, children] })] })) : (children) })] }));
|
|
1288
1303
|
const chatFirstSurfaceTabsBar = activeChatFirstSurfaceTab?.kind === "app" ? null : (_jsx(ChatFirstSurfaceTabs, { tabs: chatFirstSurfaceTabs.tabs, activeTabId: chatFirstSurfaceTabs.activeTabId, onActivate: activateChatFirstSurfaceTab, onClose: closeChatFirstSurfaceTab, onCloseOthers: (tab) => {
|
|
1289
1304
|
activateChatFirstSurfaceTab(tab);
|
|
1290
1305
|
chatFirstSurfaceTabsStore.closeOthers(tab.id);
|
|
@@ -1305,7 +1320,7 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
1305
1320
|
const content = isChatRoute ? (_jsx("div", { className: cn("agent-layout-main-surface flex h-full min-w-0 flex-1 overflow-hidden", chatFirstMode && "dispatch-chat-first-surface"), children: chatFirstAppTakesMain ? (_jsx("div", { className: "flex min-w-0 flex-1 flex-col overflow-hidden", "data-dispatch-chat-first-main-app": true, children: chatFirstSurfaceContent })) : (_jsxs(_Fragment, { children: [appContent, chatFirstMode &&
|
|
1306
1321
|
chatFirstHasActiveChat &&
|
|
1307
1322
|
chatFirstSurfacePanel.open ? (_jsxs(ChatFirstSurfacePanel, { width: chatFirstSurfaceResize.width, onResizePointerDown: chatFirstSurfaceResize.onPointerDown, copy: chatFirstCopy, children: [chatFirstSurfaceTabsBar, chatFirstSurfaceContent] })) : null] })) })) : workspaceAppRouteActive ? null : isWorkspaceAppRoute ? (appContent) : (_jsx(AgentSidebar, { position: "right", defaultOpen: false, agentPageHref: agentPageHref, chatViewTransition: true, storageKey: "dispatch", openOnChatRunning: chatHomeHandoffActive, onFullscreenRequest: openAskAgentFullscreen, emptyStateText: t("dispatch.sidebar.emptyAgentText"), suggestions: sidebarSuggestions, children: appContent }));
|
|
1308
|
-
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(HeaderActionsProvider, { children: _jsxs("div", { className: "agent-layout-shell flex h-screen w-full overflow-hidden bg-background", children: [_jsx("aside", { "data-collapsed": sidebarCollapsed ? "true" : "false", className: cn("agent-layout-left-drawer hidden shrink-0 flex-col border-e !border-e-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex", sidebarCollapsed ? "w-14" : "w-[260px]"), children: _jsx(NavContent, { extensions: extensions, brandName: brandName, brandIcon: brandIcon, chatFirstMode: chatFirstMode, chatFirstEmbedded: chatFirstEmbedded, collapsed: sidebarCollapsed, chatFirstAppLayout: chatFirstAppLayout, onChatFirstAppLayoutChange: persistChatFirstAppLayout, chatFirstApps: chatFirstAppItems, chatFirstAppsLoading: chatFirstAppsQuery.isLoading, chatFirstAppsError: chatFirstAppsQuery.isError
|
|
1323
|
+
return (_jsx(DispatchExtensionsContext.Provider, { value: extensions, children: _jsx(HeaderActionsProvider, { children: _jsxs("div", { className: "agent-layout-shell flex h-screen w-full overflow-hidden bg-background", children: [isRedesignedSettingsRoute ? null : (_jsx("aside", { "data-collapsed": sidebarCollapsed ? "true" : "false", className: cn("agent-layout-left-drawer hidden shrink-0 flex-col border-e !border-e-sidebar-border bg-sidebar text-sidebar-foreground transition-[width] duration-200 ease-out lg:flex", sidebarCollapsed ? "w-14" : "w-[260px]"), children: _jsx(NavContent, { extensions: extensions, brandName: brandName, brandIcon: brandIcon, chatFirstMode: chatFirstMode, chatFirstEmbedded: chatFirstEmbedded, collapsed: sidebarCollapsed, chatFirstAppLayout: chatFirstAppLayout, onChatFirstAppLayoutChange: persistChatFirstAppLayout, chatFirstApps: chatFirstAppItems, chatFirstAppsLoading: chatFirstAppsQuery.isLoading, chatFirstAppsError: chatFirstAppsQuery.isError
|
|
1309
1324
|
? chatFirstCopy("appsLoadError")
|
|
1310
1325
|
: null, chatFirstActiveAppId: chatFirstActiveAppId, chatFirstActivePrimaryTab: chatFirstActivePrimaryTab, onChatFirstNewChat: () => {
|
|
1311
1326
|
closeChatFirstSessionWatch();
|
|
@@ -1316,7 +1331,7 @@ export function Layout({ children, extensions, agentPageHref, brandName, brandIc
|
|
|
1316
1331
|
return;
|
|
1317
1332
|
setSidebarCollapsed(true);
|
|
1318
1333
|
openChatFirstApp(app);
|
|
1319
|
-
}, onChatFirstAppsRetry: () => void chatFirstAppsQuery.refetch(), collapsible: true, onCollapsedChange: setSidebarCollapsed }) }), _jsx(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: _jsxs(SheetContent, { side: "left", className: "w-72 bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden", children: [_jsx(SheetTitle, { className: "sr-only", children: t("dispatch.nav.navigation") }), _jsx(SheetDescription, { className: "sr-only", children: t("dispatch.nav.navigationDescription") }), _jsx("div", { className: "flex h-full w-full flex-col", children: _jsx(NavContent, { extensions: extensions, brandName: brandName, brandIcon: brandIcon, chatFirstMode: chatFirstMode, chatFirstEmbedded: chatFirstEmbedded, collapsed: false, chatFirstAppLayout: chatFirstAppLayout, onChatFirstAppLayoutChange: persistChatFirstAppLayout, chatFirstApps: chatFirstAppItems, chatFirstAppsLoading: chatFirstAppsQuery.isLoading, chatFirstAppsError: chatFirstAppsQuery.isError
|
|
1334
|
+
}, onChatFirstAppsRetry: () => void chatFirstAppsQuery.refetch(), collapsible: true, onCollapsedChange: setSidebarCollapsed }) })), _jsx(Sheet, { open: mobileOpen, onOpenChange: setMobileOpen, children: _jsxs(SheetContent, { side: "left", className: "w-72 bg-sidebar p-0 text-sidebar-foreground [&>button]:hidden", children: [_jsx(SheetTitle, { className: "sr-only", children: t("dispatch.nav.navigation") }), _jsx(SheetDescription, { className: "sr-only", children: t("dispatch.nav.navigationDescription") }), _jsx("div", { className: "flex h-full w-full flex-col", children: _jsx(NavContent, { extensions: extensions, brandName: brandName, brandIcon: brandIcon, chatFirstMode: chatFirstMode, chatFirstEmbedded: chatFirstEmbedded, collapsed: false, chatFirstAppLayout: chatFirstAppLayout, onChatFirstAppLayoutChange: persistChatFirstAppLayout, chatFirstApps: chatFirstAppItems, chatFirstAppsLoading: chatFirstAppsQuery.isLoading, chatFirstAppsError: chatFirstAppsQuery.isError
|
|
1320
1335
|
? chatFirstCopy("appsLoadError")
|
|
1321
1336
|
: null, chatFirstActiveAppId: chatFirstActiveAppId, chatFirstActivePrimaryTab: chatFirstActivePrimaryTab, onChatFirstNewChat: () => {
|
|
1322
1337
|
closeChatFirstSessionWatch();
|