@agent-native/core 0.134.1 → 0.135.0
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/corpus/README.md +3 -3
- package/corpus/core/CHANGELOG.md +107 -0
- package/corpus/core/package.json +3 -2
- package/corpus/core/src/automations/service.ts +41 -4
- package/corpus/core/src/cli/mcp-config-writers.ts +27 -21
- package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +187 -85
- package/corpus/core/src/client/agent-page/AutomationDetailsDialog.tsx +208 -0
- package/corpus/core/src/client/agent-page/AutomationScheduleDialog.tsx +180 -0
- package/corpus/core/src/client/agent-page/TimezoneSelect.tsx +241 -0
- package/corpus/core/src/client/agent-page/use-jobs.ts +50 -10
- package/corpus/core/src/client/org/OrgSwitcher.tsx +26 -0
- package/corpus/core/src/client/settings/AccountSettingsCard.tsx +35 -31
- package/corpus/core/src/client/settings/SchedulingTimezoneField.tsx +71 -0
- package/corpus/core/src/client/settings/SettingsRow.tsx +113 -0
- package/corpus/core/src/client/settings/agent-settings-search.ts +2 -1
- package/corpus/core/src/client/settings/index.ts +6 -0
- package/corpus/core/src/integrations/identity.ts +2 -12
- package/corpus/core/src/jobs/actions/list-automation-runs.ts +33 -0
- package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +27 -6
- package/corpus/core/src/jobs/actions/manage-recurring-job.ts +41 -9
- package/corpus/core/src/jobs/background-automation-runner.ts +88 -0
- package/corpus/core/src/jobs/cron.ts +52 -6
- package/corpus/core/src/jobs/frontmatter.ts +20 -0
- package/corpus/core/src/jobs/run-history.ts +242 -0
- package/corpus/core/src/jobs/scheduler.ts +73 -18
- package/corpus/core/src/jobs/tools.ts +54 -6
- package/corpus/core/src/localization/actions/get-localization-preference.ts +2 -2
- package/corpus/core/src/localization/actions/set-localization-preference.ts +49 -11
- package/corpus/core/src/localization/default-messages.ts +27 -0
- package/corpus/core/src/localization/shared.ts +39 -6
- package/corpus/core/src/localization/user-timezone.ts +36 -0
- package/corpus/core/src/org/app-roles-handlers.ts +1 -9
- package/corpus/core/src/org/index.ts +2 -0
- package/corpus/core/src/org/membership.ts +18 -0
- package/corpus/core/src/review/actions/create-review-comment.ts +4 -1
- package/corpus/core/src/review/actions/reply-review-comment.ts +4 -1
- package/corpus/core/src/review/index.ts +5 -0
- package/corpus/core/src/review/notifications.ts +163 -0
- package/corpus/core/src/review/types.ts +7 -0
- package/corpus/core/src/server/action-discovery.ts +4 -0
- package/corpus/core/src/server/activity-notifications.ts +174 -0
- package/corpus/core/src/server/app-name.ts +31 -0
- package/corpus/core/src/server/better-auth-instance.ts +4 -4
- package/corpus/core/src/server/email-templates.ts +70 -14
- package/corpus/core/src/server/email.ts +66 -3
- package/corpus/core/src/server/index.ts +10 -0
- package/corpus/core/src/sharing/index.ts +5 -0
- package/corpus/core/src/sharing/recipients.ts +67 -0
- package/corpus/core/src/triggers/actions/list-automations.ts +27 -8
- package/corpus/core/src/triggers/actions/manage-automation.ts +17 -6
- package/corpus/core/src/triggers/actions.ts +16 -4
- package/corpus/core/src/triggers/dispatcher.ts +44 -30
- package/corpus/core/src/triggers/routes.ts +19 -6
- package/corpus/core/src/vitest-config.ts +68 -0
- package/corpus/core/vitest.config.ts +5 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +37 -53
- package/corpus/templates/analytics/changelog/2026-08-01-new-error-alerts-now-reach-you-by-email-and-a-scheduled-dash.md +6 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +43 -0
- package/corpus/templates/analytics/server/lib/error-capture.ts +5 -1
- package/corpus/templates/analytics/vitest.config.ts +16 -12
- package/corpus/templates/assets/actions/refresh-generation-run.ts +3 -0
- package/corpus/templates/assets/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/assets/app/hooks/use-assets-prefs.ts +55 -0
- package/corpus/templates/assets/app/i18n-data.ts +30 -0
- package/corpus/templates/assets/app/routes/settings.tsx +58 -55
- package/corpus/templates/assets/changelog/2026-08-01-get-an-email-when-a-generation-you-started-finishes-or-fails.md +6 -0
- package/corpus/templates/assets/server/lib/generation-run-notifications.ts +89 -0
- package/corpus/templates/assets/server/lib/video-runs.ts +8 -1
- package/corpus/templates/assets/server/routes/_agent-native/assets/user-prefs.get.ts +17 -0
- package/corpus/templates/assets/server/routes/_agent-native/assets/user-prefs.put.ts +36 -0
- package/corpus/templates/assets/shared/assets-user-prefs.ts +10 -0
- package/corpus/templates/assets/vitest.config.ts +16 -12
- package/corpus/templates/brain/app/routes/settings.tsx +15 -15
- package/corpus/templates/brain/vitest.config.ts +16 -12
- package/corpus/templates/calendar/app/pages/Settings.tsx +32 -40
- package/corpus/templates/calendar/changelog/2026-08-01-language-and-appearance-now-sit-together-in-one-preferences-.md +6 -0
- package/corpus/templates/calendar/vitest.config.ts +16 -12
- package/corpus/templates/chat/app/routes/settings.tsx +14 -22
- package/corpus/templates/chat/vitest.config.ts +9 -0
- package/corpus/templates/clips/.agents/skills/video-editing/SKILL.md +31 -0
- package/corpus/templates/clips/AGENTS.md +1 -0
- package/corpus/templates/clips/actions/add-comment.ts +12 -1
- package/corpus/templates/clips/actions/create-meeting.ts +2 -2
- package/corpus/templates/clips/actions/create-recording.ts +2 -2
- package/corpus/templates/clips/actions/finalize-recording.ts +42 -6
- package/corpus/templates/clips/actions/generate-filmstrip.ts +154 -0
- package/corpus/templates/clips/actions/get-recording-player-data.ts +6 -0
- package/corpus/templates/clips/actions/import-loom-recording.ts +2 -2
- package/corpus/templates/clips/actions/lib/ensure-recording-filmstrip.ts +258 -0
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +11 -3
- package/corpus/templates/clips/actions/react-to-comment.ts +13 -0
- package/corpus/templates/clips/actions/react-to-recording.ts +10 -1
- package/corpus/templates/clips/actions/reply-to-comment.ts +12 -1
- package/corpus/templates/clips/actions/stitch-recordings.ts +2 -2
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +152 -23
- package/corpus/templates/clips/app/components/editor/waveform.tsx +237 -75
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +23 -1
- package/corpus/templates/clips/app/components/settings/ai-setup-section.tsx +441 -0
- package/corpus/templates/clips/app/components/settings/slack-section.tsx +329 -0
- package/corpus/templates/clips/app/components/settings/types.ts +14 -0
- package/corpus/templates/clips/app/components/settings/video-storage-section.tsx +443 -0
- package/corpus/templates/clips/app/hooks/use-secret-status.ts +69 -0
- package/corpus/templates/clips/app/i18n/en-US.ts +9 -1
- package/corpus/templates/clips/app/lib/video-filmstrip.ts +262 -0
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +165 -1351
- package/corpus/templates/clips/changelog/2026-07-27-saved-clips-now-resume-from-the-last-uploaded-byte-after-an-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-31-editor-timeline-now-shows-video-frames-behind-the-waveform-g.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-31-email-notifications-now-go-out-when-someone-comments-on-or-r.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-31-you-can-now-set-a-default-visibility-for-new-recordings-in-s.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-01-email-notifications-for-comments-and-reactions-now-actually-.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-03-the-desktop-app-now-opens-directly-beneath-its-tray-icon-on-.md +6 -0
- package/corpus/templates/clips/chrome-extension/package.json +1 -0
- package/corpus/templates/clips/chrome-extension/vitest.config.ts +9 -0
- package/corpus/templates/clips/desktop/package.json +1 -0
- package/corpus/templates/clips/desktop/src/app.tsx +17 -1
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +331 -36
- package/corpus/templates/clips/desktop/src/lib/upload-recovery.ts +129 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +815 -15
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +61 -11
- package/corpus/templates/clips/desktop/vitest.config.ts +9 -0
- package/corpus/templates/clips/server/db/schema.ts +17 -0
- package/corpus/templates/clips/server/jobs/media-verification.ts +4 -0
- package/corpus/templates/clips/server/lib/activity-notifications.ts +185 -0
- package/corpus/templates/clips/server/lib/recording-media-cleanup.ts +2 -0
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +46 -9
- package/corpus/templates/clips/server/lib/recordings.ts +24 -0
- package/corpus/templates/clips/server/lib/resumable-session.ts +10 -4
- package/corpus/templates/clips/server/lib/transactional-email-templates.ts +109 -0
- package/corpus/templates/clips/server/lib/upload-interruption.ts +8 -0
- package/corpus/templates/clips/server/lib/upload-lease.ts +50 -4
- package/corpus/templates/clips/server/lib/video-filmstrip-sprite.ts +207 -0
- package/corpus/templates/clips/server/lib/video-remux.ts +13 -4
- package/corpus/templates/clips/server/plugins/db.ts +16 -0
- package/corpus/templates/clips/server/routes/api/_agent-native-background/post-finalize-worker.post.ts +4 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +123 -36
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +159 -29
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/interrupt.post.ts +197 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/reset-chunks.post.ts +193 -39
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/resume.get.ts +191 -12
- package/corpus/templates/clips/shared/clips-ai-prefs.ts +6 -0
- package/corpus/templates/clips/shared/feature-flags.ts +12 -0
- package/corpus/templates/clips/shared/recording-core.ts +4 -0
- package/corpus/templates/clips/vitest.config.ts +23 -19
- package/corpus/templates/content/actions/add-comment.ts +15 -1
- package/corpus/templates/content/actions/list-documents.ts +1 -0
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +5 -2
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +50 -1
- package/corpus/templates/content/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/content/app/hooks/use-content-prefs.ts +55 -0
- package/corpus/templates/content/app/i18n-data.ts +40 -0
- package/corpus/templates/content/app/routes/_app.settings.tsx +47 -18
- package/corpus/templates/content/changelog/2026-07-30-breadcrumb-menus-now-hide-internal-system-pages.md +6 -0
- package/corpus/templates/content/changelog/2026-08-01-get-an-email-when-someone-comments-on-replies-in-or-mentions.md +6 -0
- package/corpus/templates/content/server/lib/comment-notifications.ts +146 -0
- package/corpus/templates/content/server/routes/_agent-native/content/user-prefs.get.ts +17 -0
- package/corpus/templates/content/server/routes/_agent-native/content/user-prefs.put.ts +36 -0
- package/corpus/templates/content/shared/content-user-prefs.ts +11 -0
- package/corpus/templates/content/vitest.config.ts +20 -16
- package/corpus/templates/crm/app/routes/settings.tsx +14 -22
- package/corpus/templates/crm/vitest.config.ts +8 -4
- package/corpus/templates/design/app/routes/settings.tsx +14 -22
- package/corpus/templates/design/changelog/2026-08-01-review-comments-replies-and-mentions-now-send-an-email-to-th.md +6 -0
- package/corpus/templates/design/vitest.config.ts +18 -12
- package/corpus/templates/dispatch/app/routes/settings.tsx +26 -40
- package/corpus/templates/dispatch/vitest.config.ts +11 -7
- package/corpus/templates/factory/app/routes/settings.tsx +14 -22
- package/corpus/templates/factory/vitest.config.ts +9 -0
- package/corpus/templates/forms/app/routes/_app.settings.tsx +14 -22
- package/corpus/templates/forms/vitest.config.ts +27 -23
- package/corpus/templates/macros/app/routes/settings.tsx +14 -22
- package/corpus/templates/macros/vitest.config.ts +16 -12
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +14 -16
- package/corpus/templates/mail/vitest.config.ts +16 -12
- package/corpus/templates/plan/app/routes/settings.tsx +30 -44
- package/corpus/templates/plan/vitest.config.ts +24 -20
- package/corpus/templates/slides/actions/add-slide-comment.ts +12 -1
- package/corpus/templates/slides/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/slides/app/hooks/use-slides-prefs.ts +55 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +4 -0
- package/corpus/templates/slides/app/routes/settings.tsx +45 -22
- package/corpus/templates/slides/changelog/2026-08-01-get-an-email-when-someone-comments-on-or-replies-in-your-dec.md +6 -0
- package/corpus/templates/slides/server/lib/comment-notifications.ts +182 -0
- package/corpus/templates/slides/server/routes/_agent-native/slides/user-prefs.get.ts +16 -0
- package/corpus/templates/slides/server/routes/_agent-native/slides/user-prefs.put.ts +36 -0
- package/corpus/templates/slides/shared/slides-user-prefs.ts +11 -0
- package/corpus/templates/slides/vitest.config.ts +17 -13
- package/corpus/templates/tasks/app/components/layout/Sidebar.tsx +2 -0
- package/corpus/templates/tasks/app/routes/settings.tsx +14 -22
- package/corpus/templates/tasks/vitest.config.ts +17 -13
- package/corpus/toolkit/CHANGELOG.md +9 -0
- package/corpus/toolkit/package.json +1 -1
- package/corpus/toolkit/vitest.config.ts +3 -0
- package/dist/automations/service.d.ts +2 -0
- package/dist/automations/service.d.ts.map +1 -1
- package/dist/automations/service.js +29 -4
- package/dist/automations/service.js.map +1 -1
- package/dist/cli/mcp-config-writers.d.ts.map +1 -1
- package/dist/cli/mcp-config-writers.js +24 -23
- package/dist/cli/mcp-config-writers.js.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.js +86 -29
- package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
- package/dist/client/agent-page/AutomationDetailsDialog.d.ts +21 -0
- package/dist/client/agent-page/AutomationDetailsDialog.d.ts.map +1 -0
- package/dist/client/agent-page/AutomationDetailsDialog.js +33 -0
- package/dist/client/agent-page/AutomationDetailsDialog.js.map +1 -0
- package/dist/client/agent-page/AutomationScheduleDialog.d.ts +15 -0
- package/dist/client/agent-page/AutomationScheduleDialog.d.ts.map +1 -0
- package/dist/client/agent-page/AutomationScheduleDialog.js +46 -0
- package/dist/client/agent-page/AutomationScheduleDialog.js.map +1 -0
- package/dist/client/agent-page/TimezoneSelect.d.ts +17 -0
- package/dist/client/agent-page/TimezoneSelect.d.ts.map +1 -0
- package/dist/client/agent-page/TimezoneSelect.js +107 -0
- package/dist/client/agent-page/TimezoneSelect.js.map +1 -0
- package/dist/client/agent-page/use-jobs.d.ts +20 -7
- package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
- package/dist/client/agent-page/use-jobs.js +24 -4
- package/dist/client/agent-page/use-jobs.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +8 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +8 -2
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/settings/AccountSettingsCard.d.ts.map +1 -1
- package/dist/client/settings/AccountSettingsCard.js +10 -9
- package/dist/client/settings/AccountSettingsCard.js.map +1 -1
- package/dist/client/settings/SchedulingTimezoneField.d.ts +10 -0
- package/dist/client/settings/SchedulingTimezoneField.d.ts.map +1 -0
- package/dist/client/settings/SchedulingTimezoneField.js +30 -0
- package/dist/client/settings/SchedulingTimezoneField.js.map +1 -0
- package/dist/client/settings/SettingsRow.d.ts +36 -0
- package/dist/client/settings/SettingsRow.d.ts.map +1 -0
- package/dist/client/settings/SettingsRow.js +15 -0
- package/dist/client/settings/SettingsRow.js.map +1 -0
- package/dist/client/settings/agent-settings-search.d.ts.map +1 -1
- package/dist/client/settings/agent-settings-search.js +1 -1
- package/dist/client/settings/agent-settings-search.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -0
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -0
- package/dist/client/settings/index.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/integrations/identity.d.ts.map +1 -1
- package/dist/integrations/identity.js +2 -11
- package/dist/integrations/identity.js.map +1 -1
- package/dist/jobs/actions/list-automation-runs.d.ts +8 -0
- package/dist/jobs/actions/list-automation-runs.d.ts.map +1 -0
- package/dist/jobs/actions/list-automation-runs.js +29 -0
- package/dist/jobs/actions/list-automation-runs.js.map +1 -0
- package/dist/jobs/actions/list-recurring-jobs.d.ts +2 -0
- package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
- package/dist/jobs/actions/list-recurring-jobs.js +20 -7
- package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
- package/dist/jobs/actions/manage-recurring-job.d.ts +2 -0
- package/dist/jobs/actions/manage-recurring-job.js +30 -9
- package/dist/jobs/actions/manage-recurring-job.js.map +1 -1
- package/dist/jobs/background-automation-runner.d.ts.map +1 -1
- package/dist/jobs/background-automation-runner.js +60 -0
- package/dist/jobs/background-automation-runner.js.map +1 -1
- package/dist/jobs/cron.d.ts +16 -2
- package/dist/jobs/cron.d.ts.map +1 -1
- package/dist/jobs/cron.js +43 -6
- package/dist/jobs/cron.js.map +1 -1
- package/dist/jobs/frontmatter.d.ts +12 -0
- package/dist/jobs/frontmatter.d.ts.map +1 -1
- package/dist/jobs/frontmatter.js +8 -0
- package/dist/jobs/frontmatter.js.map +1 -1
- package/dist/jobs/run-history.d.ts +56 -0
- package/dist/jobs/run-history.d.ts.map +1 -0
- package/dist/jobs/run-history.js +169 -0
- package/dist/jobs/run-history.js.map +1 -0
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +51 -18
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +37 -6
- package/dist/jobs/tools.js.map +1 -1
- package/dist/localization/actions/get-localization-preference.d.ts +1 -2
- package/dist/localization/actions/get-localization-preference.d.ts.map +1 -1
- package/dist/localization/actions/get-localization-preference.js.map +1 -1
- package/dist/localization/actions/set-localization-preference.d.ts +3 -3
- package/dist/localization/actions/set-localization-preference.d.ts.map +1 -1
- package/dist/localization/actions/set-localization-preference.js +33 -8
- package/dist/localization/actions/set-localization-preference.js.map +1 -1
- package/dist/localization/default-messages.d.ts +25 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +25 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/localization/shared.d.ts +16 -1
- package/dist/localization/shared.d.ts.map +1 -1
- package/dist/localization/shared.js +22 -4
- package/dist/localization/shared.js.map +1 -1
- package/dist/localization/user-timezone.d.ts +11 -0
- package/dist/localization/user-timezone.d.ts.map +1 -0
- package/dist/localization/user-timezone.js +31 -0
- package/dist/localization/user-timezone.js.map +1 -0
- package/dist/notifications/routes.d.ts +1 -1
- package/dist/observability/routes.d.ts +1 -1
- package/dist/org/app-roles-handlers.d.ts.map +1 -1
- package/dist/org/app-roles-handlers.js +1 -8
- package/dist/org/app-roles-handlers.js.map +1 -1
- package/dist/org/index.d.ts +1 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +1 -0
- package/dist/org/index.js.map +1 -1
- package/dist/org/membership.d.ts +6 -0
- package/dist/org/membership.d.ts.map +1 -0
- package/dist/org/membership.js +16 -0
- package/dist/org/membership.js.map +1 -0
- package/dist/provider-api/actions/custom-provider-registration.d.ts +10 -10
- package/dist/provider-api/actions/provider-api.d.ts +8 -8
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/review/actions/create-review-comment.d.ts +32 -1
- package/dist/review/actions/create-review-comment.d.ts.map +1 -1
- package/dist/review/actions/create-review-comment.js +3 -1
- package/dist/review/actions/create-review-comment.js.map +1 -1
- package/dist/review/actions/reply-review-comment.d.ts +32 -1
- package/dist/review/actions/reply-review-comment.d.ts.map +1 -1
- package/dist/review/actions/reply-review-comment.js +3 -1
- package/dist/review/actions/reply-review-comment.js.map +1 -1
- package/dist/review/index.d.ts +1 -0
- package/dist/review/index.d.ts.map +1 -1
- package/dist/review/index.js +1 -0
- package/dist/review/index.js.map +1 -1
- package/dist/review/notifications.d.ts +24 -0
- package/dist/review/notifications.d.ts.map +1 -0
- package/dist/review/notifications.js +123 -0
- package/dist/review/notifications.js.map +1 -0
- package/dist/review/types.d.ts +5 -0
- package/dist/review/types.d.ts.map +1 -1
- package/dist/review/types.js.map +1 -1
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +4 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/activity-notifications.d.ts +61 -0
- package/dist/server/activity-notifications.d.ts.map +1 -0
- package/dist/server/activity-notifications.js +103 -0
- package/dist/server/activity-notifications.js.map +1 -0
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/app-name.d.ts +18 -0
- package/dist/server/app-name.d.ts.map +1 -1
- package/dist/server/app-name.js +31 -0
- package/dist/server/app-name.js.map +1 -1
- package/dist/server/better-auth-instance.js +4 -4
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/email-templates.d.ts +12 -0
- package/dist/server/email-templates.d.ts.map +1 -1
- package/dist/server/email-templates.js +57 -14
- package/dist/server/email-templates.js.map +1 -1
- package/dist/server/email.d.ts +12 -0
- package/dist/server/email.d.ts.map +1 -1
- package/dist/server/email.js +52 -5
- package/dist/server/email.js.map +1 -1
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/sharing/index.d.ts +1 -0
- package/dist/sharing/index.d.ts.map +1 -1
- package/dist/sharing/index.js +1 -0
- package/dist/sharing/index.js.map +1 -1
- package/dist/sharing/recipients.d.ts +31 -0
- package/dist/sharing/recipients.d.ts.map +1 -0
- package/dist/sharing/recipients.js +40 -0
- package/dist/sharing/recipients.js.map +1 -0
- package/dist/templates/chat/app/routes/settings.tsx +14 -22
- package/dist/templates/chat/vitest.config.ts +9 -0
- package/dist/triggers/actions/list-automations.d.ts +2 -0
- package/dist/triggers/actions/list-automations.d.ts.map +1 -1
- package/dist/triggers/actions/list-automations.js +19 -8
- package/dist/triggers/actions/list-automations.js.map +1 -1
- package/dist/triggers/actions/manage-automation.d.ts +6 -0
- package/dist/triggers/actions/manage-automation.js +12 -6
- package/dist/triggers/actions/manage-automation.js.map +1 -1
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +15 -4
- package/dist/triggers/actions.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +19 -17
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/triggers/routes.d.ts.map +1 -1
- package/dist/triggers/routes.js +6 -6
- package/dist/triggers/routes.js.map +1 -1
- package/dist/vitest-config.d.ts +10 -0
- package/dist/vitest-config.d.ts.map +1 -0
- package/dist/vitest-config.js +55 -0
- package/dist/vitest-config.js.map +1 -0
- package/package.json +5 -4
- package/src/automations/service.ts +41 -4
- package/src/cli/mcp-config-writers.ts +27 -21
- package/src/client/agent-page/AgentJobsTab.tsx +187 -85
- package/src/client/agent-page/AutomationDetailsDialog.tsx +208 -0
- package/src/client/agent-page/AutomationScheduleDialog.tsx +180 -0
- package/src/client/agent-page/TimezoneSelect.tsx +241 -0
- package/src/client/agent-page/use-jobs.ts +50 -10
- package/src/client/org/OrgSwitcher.tsx +26 -0
- package/src/client/settings/AccountSettingsCard.tsx +35 -31
- package/src/client/settings/SchedulingTimezoneField.tsx +71 -0
- package/src/client/settings/SettingsRow.tsx +113 -0
- package/src/client/settings/agent-settings-search.ts +2 -1
- package/src/client/settings/index.ts +6 -0
- package/src/integrations/identity.ts +2 -12
- package/src/jobs/actions/list-automation-runs.ts +33 -0
- package/src/jobs/actions/list-recurring-jobs.ts +27 -6
- package/src/jobs/actions/manage-recurring-job.ts +41 -9
- package/src/jobs/background-automation-runner.ts +88 -0
- package/src/jobs/cron.ts +52 -6
- package/src/jobs/frontmatter.ts +20 -0
- package/src/jobs/run-history.ts +242 -0
- package/src/jobs/scheduler.ts +73 -18
- package/src/jobs/tools.ts +54 -6
- package/src/localization/actions/get-localization-preference.ts +2 -2
- package/src/localization/actions/set-localization-preference.ts +49 -11
- package/src/localization/default-messages.ts +27 -0
- package/src/localization/shared.ts +39 -6
- package/src/localization/user-timezone.ts +36 -0
- package/src/org/app-roles-handlers.ts +1 -9
- package/src/org/index.ts +2 -0
- package/src/org/membership.ts +18 -0
- package/src/review/actions/create-review-comment.ts +4 -1
- package/src/review/actions/reply-review-comment.ts +4 -1
- package/src/review/index.ts +5 -0
- package/src/review/notifications.ts +163 -0
- package/src/review/types.ts +7 -0
- package/src/server/action-discovery.ts +4 -0
- package/src/server/activity-notifications.ts +174 -0
- package/src/server/app-name.ts +31 -0
- package/src/server/better-auth-instance.ts +4 -4
- package/src/server/email-templates.ts +70 -14
- package/src/server/email.ts +66 -3
- package/src/server/index.ts +10 -0
- package/src/sharing/index.ts +5 -0
- package/src/sharing/recipients.ts +67 -0
- package/src/templates/chat/app/routes/settings.tsx +14 -22
- package/src/templates/chat/vitest.config.ts +9 -0
- package/src/triggers/actions/list-automations.ts +27 -8
- package/src/triggers/actions/manage-automation.ts +17 -6
- package/src/triggers/actions.ts +16 -4
- package/src/triggers/dispatcher.ts +44 -30
- package/src/triggers/routes.ts +19 -6
- package/src/vitest-config.ts +68 -0
package/dist/jobs/tools.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { getDbExec } from "../db/client.js";
|
|
2
|
+
import { resolveUserSchedulingTimezone } from "../localization/user-timezone.js";
|
|
2
3
|
import { resourcePut, resourceGetByPath, resourceList, resourceDelete, organizationIdFromResourceOwner, sharedResourceOwner, SHARED_OWNER, } from "../resources/store.js";
|
|
3
4
|
import { getRequestUserEmail, getRequestOrgId, getIntegrationRequestContext, } from "../server/request-context.js";
|
|
4
|
-
import { isValidCron, nextOccurrence, describeCron } from "./cron.js";
|
|
5
|
+
import { isValidCron, nextOccurrence, describeCron, effectiveTimezone, isValidTimezone, } from "./cron.js";
|
|
5
6
|
import { classifyJobResource } from "./frontmatter.js";
|
|
6
7
|
import { parseJobFrontmatter, buildJobContent, normalizeJobMcpTools, } from "./scheduler.js";
|
|
7
8
|
function getOwner() {
|
|
@@ -70,6 +71,7 @@ export async function authorizeJobMutation(resourceOwner, meta) {
|
|
|
70
71
|
}
|
|
71
72
|
async function runCreate(args) {
|
|
72
73
|
const { name, schedule, instructions, scope, runAs, model } = args;
|
|
74
|
+
const requestedTimezone = args.timezone;
|
|
73
75
|
if (!name || !schedule || !instructions) {
|
|
74
76
|
return JSON.stringify({
|
|
75
77
|
error: "name, schedule, and instructions are required",
|
|
@@ -90,12 +92,22 @@ async function runCreate(args) {
|
|
|
90
92
|
const owner = scope === "personal" ? getOwner() : getSharedOwner();
|
|
91
93
|
const path = `jobs/${name}.md`;
|
|
92
94
|
const now = new Date();
|
|
93
|
-
|
|
95
|
+
// A cron time with no zone silently means the host's zone, which is how an
|
|
96
|
+
// "8am" job ends up firing at 4am for the person who asked for it.
|
|
97
|
+
if (requestedTimezone && !isValidTimezone(requestedTimezone)) {
|
|
98
|
+
return JSON.stringify({
|
|
99
|
+
error: `Unknown timezone: "${requestedTimezone}". Use an IANA zone such as America/New_York.`,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
const timezone = requestedTimezone ||
|
|
103
|
+
(await resolveUserSchedulingTimezone(getRequestUserEmail()));
|
|
104
|
+
const next = nextOccurrence(schedule, now, timezone);
|
|
94
105
|
const integration = getIntegrationRequestContext();
|
|
95
106
|
const channelId = integration?.incoming.platformContext.channelId;
|
|
96
107
|
const threadRef = integration?.incoming.threadRef;
|
|
97
108
|
const meta = {
|
|
98
109
|
schedule,
|
|
110
|
+
timezone,
|
|
99
111
|
enabled: true,
|
|
100
112
|
createdBy: getOwner(),
|
|
101
113
|
orgId: getRequestOrgId() || undefined,
|
|
@@ -124,7 +136,8 @@ async function runCreate(args) {
|
|
|
124
136
|
name,
|
|
125
137
|
path,
|
|
126
138
|
schedule,
|
|
127
|
-
|
|
139
|
+
timezone,
|
|
140
|
+
scheduleDescription: describeCron(schedule, timezone),
|
|
128
141
|
nextRun: next.toISOString(),
|
|
129
142
|
scope: scope || "shared",
|
|
130
143
|
...(mcpTools?.length ? { mcpTools } : {}),
|
|
@@ -156,7 +169,10 @@ async function runList(args) {
|
|
|
156
169
|
path: r.path,
|
|
157
170
|
scope: r.owner === sharedOwner ? "shared" : "personal",
|
|
158
171
|
schedule: meta.schedule,
|
|
159
|
-
|
|
172
|
+
timezone: effectiveTimezone(meta.timezone),
|
|
173
|
+
scheduleDescription: meta.schedule
|
|
174
|
+
? describeCron(meta.schedule, effectiveTimezone(meta.timezone))
|
|
175
|
+
: "",
|
|
160
176
|
enabled: meta.enabled,
|
|
161
177
|
lastRun: meta.lastRun || null,
|
|
162
178
|
lastStatus: meta.lastStatus || null,
|
|
@@ -208,7 +224,17 @@ async function runUpdate(args) {
|
|
|
208
224
|
});
|
|
209
225
|
}
|
|
210
226
|
meta.schedule = schedule;
|
|
211
|
-
|
|
227
|
+
}
|
|
228
|
+
if (args.timezone !== undefined) {
|
|
229
|
+
if (!isValidTimezone(args.timezone)) {
|
|
230
|
+
return JSON.stringify({
|
|
231
|
+
error: `Unknown timezone: "${args.timezone}".`,
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
meta.timezone = args.timezone;
|
|
235
|
+
}
|
|
236
|
+
if (schedule || args.timezone !== undefined) {
|
|
237
|
+
meta.nextRun = nextOccurrence(meta.schedule, undefined, meta.timezone).toISOString();
|
|
212
238
|
}
|
|
213
239
|
if (enabled !== undefined) {
|
|
214
240
|
// Accept both the schema's string enum ("true"/"false") and a real boolean
|
|
@@ -240,7 +266,8 @@ async function runUpdate(args) {
|
|
|
240
266
|
updated: true,
|
|
241
267
|
name,
|
|
242
268
|
schedule: meta.schedule,
|
|
243
|
-
|
|
269
|
+
timezone: effectiveTimezone(meta.timezone),
|
|
270
|
+
scheduleDescription: describeCron(meta.schedule, effectiveTimezone(meta.timezone)),
|
|
244
271
|
enabled: meta.enabled,
|
|
245
272
|
nextRun: meta.nextRun,
|
|
246
273
|
mcpTools: meta.mcpTools || [],
|
|
@@ -299,6 +326,10 @@ For jobs that use a connected MCP, pass the exact tool names in mcpTools. This b
|
|
|
299
326
|
type: "string",
|
|
300
327
|
description: "Job name (hyphen-case, e.g. 'daily-scorecard-check'). Required for create and update.",
|
|
301
328
|
},
|
|
329
|
+
timezone: {
|
|
330
|
+
type: "string",
|
|
331
|
+
description: "IANA timezone the schedule's clock time is read in, e.g. 'America/New_York'. Optional; defaults to the user's saved scheduling timezone, then the caller's browser zone. Always pass this when the user names a time of day, so '8am' means 8am where they are rather than on the server.",
|
|
332
|
+
},
|
|
302
333
|
schedule: {
|
|
303
334
|
type: "string",
|
|
304
335
|
description: "Cron expression (5 fields: minute hour day-of-month month day-of-week). Required for create, optional for update.",
|
package/dist/jobs/tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/jobs/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"../agent/production-agent.js\";\nimport { getDbExec } from \"../db/client.js\";\nimport {\n resourcePut,\n resourceGetByPath,\n resourceList,\n resourceDelete,\n organizationIdFromResourceOwner,\n sharedResourceOwner,\n SHARED_OWNER,\n} from \"../resources/store.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n getIntegrationRequestContext,\n} from \"../server/request-context.js\";\nimport { isValidCron, nextOccurrence, describeCron } from \"./cron.js\";\nimport { classifyJobResource } from \"./frontmatter.js\";\nimport {\n parseJobFrontmatter,\n buildJobContent,\n normalizeJobMcpTools,\n type JobFrontmatter,\n} from \"./scheduler.js\";\n\nfunction getOwner(): string {\n const email = getRequestUserEmail();\n if (!email) throw new Error(\"no authenticated user\");\n return email;\n}\n\nfunction getSharedOwner(): string {\n return sharedResourceOwner(getRequestOrgId());\n}\n\n/**\n * Determine if the current request's user is an org owner/admin in the\n * given org. Used to allow privileged users to update or delete shared\n * jobs created by other org members. Returns false when there is no org,\n * no user, no membership, or any error querying — fail closed.\n */\nasync function isCurrentUserOrgAdmin(\n orgId: string | undefined,\n): Promise<boolean> {\n if (!orgId) return false;\n const email = getRequestUserEmail();\n if (!email) return false;\n try {\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [orgId, email.toLowerCase()],\n });\n if (rows.length === 0) return false;\n const role = String((rows[0] as any).role ?? \"\").toLowerCase();\n return role === \"owner\" || role === \"admin\";\n } catch {\n return false;\n }\n}\n\n/**\n * Authorise a mutation (update / delete) against a job resource. When the\n * job is in the SHARED scope the caller must either be the original\n * `createdBy` user or an org owner/admin — otherwise any user could rewrite\n * another user's shared job and have it run as that user on the next cron\n * tick (the privilege-escalation chain documented in audit\n * `/tmp/security-audit/12-mcp-a2a-agent.md`, finding #3).\n *\n * Returns null when the mutation is allowed, or an error string suitable\n * for returning to the caller when not.\n */\nexport async function authorizeJobMutation(\n resourceOwner: string,\n meta: JobFrontmatter,\n): Promise<string | null> {\n const resourceOrgId = organizationIdFromResourceOwner(resourceOwner);\n if (resourceOwner !== SHARED_OWNER && !resourceOrgId) {\n // Personal-scope job — owner is the request's user. resourceGetByPath is\n // already scoped to the caller, so we know meta.createdBy must match.\n return null;\n }\n const caller = getOwner();\n const createdBy = meta.createdBy?.toLowerCase();\n if (createdBy && createdBy === caller.toLowerCase()) return null;\n\n // Allow org owners/admins to manage shared jobs created by other members.\n const isAdmin = await isCurrentUserOrgAdmin(\n resourceOrgId ?? meta.orgId ?? getRequestOrgId() ?? undefined,\n );\n if (isAdmin) return null;\n\n return \"Only the job's creator (or an org admin) can update or delete it.\";\n}\n\nasync function runCreate(args: Record<string, any>): Promise<string> {\n const { name, schedule, instructions, scope, runAs, model } = args;\n\n if (!name || !schedule || !instructions) {\n return JSON.stringify({\n error: \"name, schedule, and instructions are required\",\n });\n }\n\n if (!isValidCron(schedule)) {\n return JSON.stringify({\n error: `Invalid cron expression: \"${schedule}\". Use 5 fields: minute hour day-of-month month day-of-week.`,\n });\n }\n\n let mcpTools: string[] | undefined;\n try {\n mcpTools = normalizeJobMcpTools(args.mcpTools);\n } catch (err) {\n return JSON.stringify({ error: (err as Error).message });\n }\n\n const owner = scope === \"personal\" ? getOwner() : getSharedOwner();\n const path = `jobs/${name}.md`;\n const now = new Date();\n const next = nextOccurrence(schedule, now);\n const integration = getIntegrationRequestContext();\n const channelId = integration?.incoming.platformContext.channelId;\n const threadRef = integration?.incoming.threadRef;\n\n const meta: JobFrontmatter = {\n schedule,\n enabled: true,\n createdBy: getOwner(),\n orgId: getRequestOrgId() || undefined,\n runAs: runAs === \"shared\" ? \"shared\" : \"creator\",\n nextRun: next.toISOString(),\n ...(integration?.scopeId ? { originScopeId: integration.scopeId } : {}),\n ...(integration?.incoming.platform\n ? { deliveryPlatform: integration.incoming.platform }\n : {}),\n ...(typeof channelId === \"string\"\n ? { deliveryDestination: channelId }\n : {}),\n ...(typeof threadRef === \"string\" ? { deliveryThreadRef: threadRef } : {}),\n ...(integration?.incoming.tenantId\n ? { deliveryTenantId: integration.incoming.tenantId }\n : {}),\n ...(typeof model === \"string\" && model.trim()\n ? { model: model.trim() }\n : {}),\n ...(mcpTools?.length ? { mcpTools } : {}),\n };\n\n const content = buildJobContent(meta, instructions);\n await resourcePut(owner, path, content);\n\n return JSON.stringify({\n created: true,\n name,\n path,\n schedule,\n scheduleDescription: describeCron(schedule),\n nextRun: next.toISOString(),\n scope: scope || \"shared\",\n ...(mcpTools?.length ? { mcpTools } : {}),\n });\n}\n\nasync function runList(args: Record<string, any>): Promise<string> {\n const owner = getOwner();\n const sharedOwner = getSharedOwner();\n // Fetch only current user's and shared jobs (not other users')\n const [personal, shared] = await Promise.all([\n resourceList(owner, \"jobs/\"),\n resourceList(sharedOwner, \"jobs/\"),\n ]);\n let resources = [...personal, ...shared];\n if (args.scope === \"personal\") resources = personal;\n else if (args.scope === \"shared\") resources = shared;\n const metas = resources.filter(\n (r) => r.path.endsWith(\".md\") && !r.path.endsWith(\".keep\"),\n );\n const jobs = await Promise.all(\n metas.map(async (r) => {\n const full = await resourceGetByPath(r.owner, r.path);\n if (!full) return null;\n if (classifyJobResource(full.content).kind === \"automation\") return null;\n const { meta } = parseJobFrontmatter(full.content);\n return {\n name: r.path.replace(/^jobs\\//, \"\").replace(/\\.md$/, \"\"),\n path: r.path,\n scope: r.owner === sharedOwner ? \"shared\" : \"personal\",\n schedule: meta.schedule,\n scheduleDescription: meta.schedule ? describeCron(meta.schedule) : \"\",\n enabled: meta.enabled,\n lastRun: meta.lastRun || null,\n lastStatus: meta.lastStatus || null,\n lastError: meta.lastError || null,\n nextRun: meta.nextRun || null,\n originScopeId: meta.originScopeId || null,\n deliveryPlatform: meta.deliveryPlatform || null,\n deliveryDestination: meta.deliveryDestination || null,\n model: meta.model || null,\n mcpTools: meta.mcpTools || [],\n };\n }),\n );\n const scheduledJobs = jobs.filter((job) => job !== null);\n\n if (scheduledJobs.length === 0) {\n return \"No recurring jobs configured. Use manage-jobs with action 'create' to create one.\";\n }\n\n return JSON.stringify(scheduledJobs, null, 2);\n}\n\nasync function runUpdate(args: Record<string, any>): Promise<string> {\n const { name, schedule, instructions, enabled, scope, runAs, model } = args;\n const path = `jobs/${name}.md`;\n\n // Try to find the resource\n let resource = await resourceGetByPath(getSharedOwner(), path);\n if (!resource && scope !== \"shared\") {\n resource = await resourceGetByPath(getOwner(), path);\n }\n\n if (!resource) {\n return JSON.stringify({ error: `Job \"${name}\" not found` });\n }\n\n const { meta, body } = parseJobFrontmatter(resource.content);\n if (classifyJobResource(resource.content).kind === \"automation\") {\n return JSON.stringify({\n error: `\"${name}\" is an automation. Use manage-automations to update it.`,\n });\n }\n\n // Reject when the caller doesn't own the shared job and isn't an org\n // admin. Without this check, any user could rewrite a shared job whose\n // `createdBy` is alice@…, and the next cron tick would run the\n // attacker's instructions as alice (creator-runAs schedules in\n // jobs/scheduler.ts line 273-278).\n const denied = await authorizeJobMutation(resource.owner, meta);\n if (denied) {\n return JSON.stringify({ error: denied });\n }\n\n if (schedule) {\n if (!isValidCron(schedule)) {\n return JSON.stringify({\n error: `Invalid cron expression: \"${schedule}\"`,\n });\n }\n meta.schedule = schedule;\n meta.nextRun = nextOccurrence(schedule).toISOString();\n }\n\n if (enabled !== undefined) {\n // Accept both the schema's string enum (\"true\"/\"false\") and a real boolean\n // from non-LLM callers. `enabled === \"true\"` alone treats a boolean `true`\n // as false — silently *disabling* a job the caller meant to enable.\n meta.enabled = enabled === true || enabled === \"true\";\n }\n\n if (runAs === \"creator\" || runAs === \"shared\") {\n meta.runAs = runAs;\n }\n if (typeof model === \"string\" && model.trim()) meta.model = model.trim();\n\n if (args.mcpTools !== undefined) {\n try {\n const mcpTools = normalizeJobMcpTools(args.mcpTools) ?? [];\n if (mcpTools.length) meta.mcpTools = mcpTools;\n else delete meta.mcpTools;\n } catch (err) {\n return JSON.stringify({ error: (err as Error).message });\n }\n }\n\n const newBody = instructions || body;\n const content = buildJobContent(meta, newBody);\n await resourcePut(resource.owner, resource.path, content);\n\n return JSON.stringify({\n updated: true,\n name,\n schedule: meta.schedule,\n scheduleDescription: describeCron(meta.schedule),\n enabled: meta.enabled,\n nextRun: meta.nextRun,\n mcpTools: meta.mcpTools || [],\n });\n}\n\nasync function runDelete(args: Record<string, any>): Promise<string> {\n const { name, scope } = args;\n const path = `jobs/${name}.md`;\n\n let resource = await resourceGetByPath(getSharedOwner(), path);\n if (!resource && scope !== \"shared\") {\n resource = await resourceGetByPath(getOwner(), path);\n }\n\n if (!resource) {\n return JSON.stringify({ error: `Job \"${name}\" not found` });\n }\n\n // Same access check as runUpdate — only the creator or an org admin can\n // remove a shared job. Otherwise any user could break another tenant's\n // recurring schedule.\n const { meta } = parseJobFrontmatter(resource.content);\n if (classifyJobResource(resource.content).kind === \"automation\") {\n return JSON.stringify({\n error: `\"${name}\" is an automation. Use manage-automations to delete it.`,\n });\n }\n const denied = await authorizeJobMutation(resource.owner, meta);\n if (denied) {\n return JSON.stringify({ error: denied });\n }\n\n await resourceDelete(resource.id);\n return JSON.stringify({ deleted: true, name });\n}\n\nexport function createJobTools(): Record<string, ActionEntry> {\n return {\n \"manage-jobs\": {\n tool: {\n description: `Manage recurring jobs that run on a cron schedule.\n\nActions:\n- \"create\": Create a new recurring job. Requires name, schedule, and instructions.\n- \"list\": List all recurring jobs and their status (schedule, enabled, last run, next run).\n- \"update\": Update a job's schedule, instructions, or enabled state. Requires name.\n- \"delete\": Delete a recurring job. Requires name. Always confirm with the user first.\n\nCron format is 5 fields: minute hour day-of-month month day-of-week. Common patterns: '0 9 * * *' (daily 9am), '0 9 * * 1-5' (weekdays 9am), '0 * * * *' (every hour), '0 9 * * 1' (Mondays 9am), '*/30 * * * *' (every 30 min).\n\nFor jobs that use a connected MCP, pass the exact tool names in mcpTools. This binds only those tools to the background run; OAuth credentials remain in the connector and are resolved for the job's user/org context.`,\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n description: \"The action to perform.\",\n enum: [\"create\", \"list\", \"update\", \"delete\"],\n },\n name: {\n type: \"string\",\n description:\n \"Job name (hyphen-case, e.g. 'daily-scorecard-check'). Required for create and update.\",\n },\n schedule: {\n type: \"string\",\n description:\n \"Cron expression (5 fields: minute hour day-of-month month day-of-week). Required for create, optional for update.\",\n },\n instructions: {\n type: \"string\",\n description:\n \"What the agent should do when this job runs. Be specific — include which actions to call and what to do with the results. Required for create, optional for update.\",\n },\n enabled: {\n type: \"string\",\n description:\n \"Enable or disable a job: 'true' or 'false'. Only used with update.\",\n enum: [\"true\", \"false\"],\n },\n scope: {\n type: \"string\",\n description:\n \"For create: personal or shared (default: shared). For list: personal, shared, or all (default: all). For update: which scope to search (default: all).\",\n enum: [\"personal\", \"shared\", \"all\"],\n },\n runAs: {\n type: \"string\",\n description:\n \"Who shared jobs execute as: creator or shared. Default: creator. Used with create and update.\",\n enum: [\"creator\", \"shared\"],\n },\n model: {\n type: \"string\",\n description:\n \"Optional model id for this routine. The channel/app/engine default is used when omitted.\",\n },\n mcpTools: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n 'Optional explicit MCP capabilities for this job. Use the connected tool names exactly as advertised, for example [\"mcp__meeting-notes__list_meetings\", \"mcp__meeting-notes__get_transcript\"]. The job runs only with these tools; credentials remain in the connector.',\n },\n },\n required: [\"action\"],\n },\n },\n planMode: {\n effect: (args) => (args.action === \"list\" ? \"read\" : \"write\"),\n allowedValues: { action: [\"list\"] },\n description: \"Plan mode allows listing recurring jobs.\",\n },\n run: async (args) => {\n switch (args.action) {\n case \"create\":\n return runCreate(args);\n case \"list\":\n return runList(args);\n case \"update\":\n return runUpdate(args);\n case \"delete\":\n return runDelete(args);\n default:\n return JSON.stringify({\n error: `Unknown action \"${args.action}\". Use \"create\", \"list\", or \"update\".`,\n });\n }\n },\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/jobs/tools.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ActionEntry } from \"../agent/production-agent.js\";\nimport { getDbExec } from \"../db/client.js\";\nimport { resolveUserSchedulingTimezone } from \"../localization/user-timezone.js\";\nimport {\n resourcePut,\n resourceGetByPath,\n resourceList,\n resourceDelete,\n organizationIdFromResourceOwner,\n sharedResourceOwner,\n SHARED_OWNER,\n} from \"../resources/store.js\";\nimport {\n getRequestUserEmail,\n getRequestOrgId,\n getIntegrationRequestContext,\n} from \"../server/request-context.js\";\nimport {\n isValidCron,\n nextOccurrence,\n describeCron,\n effectiveTimezone,\n isValidTimezone,\n} from \"./cron.js\";\nimport { classifyJobResource } from \"./frontmatter.js\";\nimport {\n parseJobFrontmatter,\n buildJobContent,\n normalizeJobMcpTools,\n type JobFrontmatter,\n} from \"./scheduler.js\";\n\nfunction getOwner(): string {\n const email = getRequestUserEmail();\n if (!email) throw new Error(\"no authenticated user\");\n return email;\n}\n\nfunction getSharedOwner(): string {\n return sharedResourceOwner(getRequestOrgId());\n}\n\n/**\n * Determine if the current request's user is an org owner/admin in the\n * given org. Used to allow privileged users to update or delete shared\n * jobs created by other org members. Returns false when there is no org,\n * no user, no membership, or any error querying — fail closed.\n */\nasync function isCurrentUserOrgAdmin(\n orgId: string | undefined,\n): Promise<boolean> {\n if (!orgId) return false;\n const email = getRequestUserEmail();\n if (!email) return false;\n try {\n const client = getDbExec();\n const { rows } = await client.execute({\n sql: `SELECT role FROM org_members WHERE org_id = ? AND LOWER(email) = ? LIMIT 1`,\n args: [orgId, email.toLowerCase()],\n });\n if (rows.length === 0) return false;\n const role = String((rows[0] as any).role ?? \"\").toLowerCase();\n return role === \"owner\" || role === \"admin\";\n } catch {\n return false;\n }\n}\n\n/**\n * Authorise a mutation (update / delete) against a job resource. When the\n * job is in the SHARED scope the caller must either be the original\n * `createdBy` user or an org owner/admin — otherwise any user could rewrite\n * another user's shared job and have it run as that user on the next cron\n * tick (the privilege-escalation chain documented in audit\n * `/tmp/security-audit/12-mcp-a2a-agent.md`, finding #3).\n *\n * Returns null when the mutation is allowed, or an error string suitable\n * for returning to the caller when not.\n */\nexport async function authorizeJobMutation(\n resourceOwner: string,\n meta: JobFrontmatter,\n): Promise<string | null> {\n const resourceOrgId = organizationIdFromResourceOwner(resourceOwner);\n if (resourceOwner !== SHARED_OWNER && !resourceOrgId) {\n // Personal-scope job — owner is the request's user. resourceGetByPath is\n // already scoped to the caller, so we know meta.createdBy must match.\n return null;\n }\n const caller = getOwner();\n const createdBy = meta.createdBy?.toLowerCase();\n if (createdBy && createdBy === caller.toLowerCase()) return null;\n\n // Allow org owners/admins to manage shared jobs created by other members.\n const isAdmin = await isCurrentUserOrgAdmin(\n resourceOrgId ?? meta.orgId ?? getRequestOrgId() ?? undefined,\n );\n if (isAdmin) return null;\n\n return \"Only the job's creator (or an org admin) can update or delete it.\";\n}\n\nasync function runCreate(args: Record<string, any>): Promise<string> {\n const { name, schedule, instructions, scope, runAs, model } = args;\n const requestedTimezone = args.timezone;\n\n if (!name || !schedule || !instructions) {\n return JSON.stringify({\n error: \"name, schedule, and instructions are required\",\n });\n }\n\n if (!isValidCron(schedule)) {\n return JSON.stringify({\n error: `Invalid cron expression: \"${schedule}\". Use 5 fields: minute hour day-of-month month day-of-week.`,\n });\n }\n\n let mcpTools: string[] | undefined;\n try {\n mcpTools = normalizeJobMcpTools(args.mcpTools);\n } catch (err) {\n return JSON.stringify({ error: (err as Error).message });\n }\n\n const owner = scope === \"personal\" ? getOwner() : getSharedOwner();\n const path = `jobs/${name}.md`;\n const now = new Date();\n // A cron time with no zone silently means the host's zone, which is how an\n // \"8am\" job ends up firing at 4am for the person who asked for it.\n if (requestedTimezone && !isValidTimezone(requestedTimezone)) {\n return JSON.stringify({\n error: `Unknown timezone: \"${requestedTimezone}\". Use an IANA zone such as America/New_York.`,\n });\n }\n const timezone =\n requestedTimezone ||\n (await resolveUserSchedulingTimezone(getRequestUserEmail()));\n const next = nextOccurrence(schedule, now, timezone);\n const integration = getIntegrationRequestContext();\n const channelId = integration?.incoming.platformContext.channelId;\n const threadRef = integration?.incoming.threadRef;\n\n const meta: JobFrontmatter = {\n schedule,\n timezone,\n enabled: true,\n createdBy: getOwner(),\n orgId: getRequestOrgId() || undefined,\n runAs: runAs === \"shared\" ? \"shared\" : \"creator\",\n nextRun: next.toISOString(),\n ...(integration?.scopeId ? { originScopeId: integration.scopeId } : {}),\n ...(integration?.incoming.platform\n ? { deliveryPlatform: integration.incoming.platform }\n : {}),\n ...(typeof channelId === \"string\"\n ? { deliveryDestination: channelId }\n : {}),\n ...(typeof threadRef === \"string\" ? { deliveryThreadRef: threadRef } : {}),\n ...(integration?.incoming.tenantId\n ? { deliveryTenantId: integration.incoming.tenantId }\n : {}),\n ...(typeof model === \"string\" && model.trim()\n ? { model: model.trim() }\n : {}),\n ...(mcpTools?.length ? { mcpTools } : {}),\n };\n\n const content = buildJobContent(meta, instructions);\n await resourcePut(owner, path, content);\n\n return JSON.stringify({\n created: true,\n name,\n path,\n schedule,\n timezone,\n scheduleDescription: describeCron(schedule, timezone),\n nextRun: next.toISOString(),\n scope: scope || \"shared\",\n ...(mcpTools?.length ? { mcpTools } : {}),\n });\n}\n\nasync function runList(args: Record<string, any>): Promise<string> {\n const owner = getOwner();\n const sharedOwner = getSharedOwner();\n // Fetch only current user's and shared jobs (not other users')\n const [personal, shared] = await Promise.all([\n resourceList(owner, \"jobs/\"),\n resourceList(sharedOwner, \"jobs/\"),\n ]);\n let resources = [...personal, ...shared];\n if (args.scope === \"personal\") resources = personal;\n else if (args.scope === \"shared\") resources = shared;\n const metas = resources.filter(\n (r) => r.path.endsWith(\".md\") && !r.path.endsWith(\".keep\"),\n );\n const jobs = await Promise.all(\n metas.map(async (r) => {\n const full = await resourceGetByPath(r.owner, r.path);\n if (!full) return null;\n if (classifyJobResource(full.content).kind === \"automation\") return null;\n const { meta } = parseJobFrontmatter(full.content);\n return {\n name: r.path.replace(/^jobs\\//, \"\").replace(/\\.md$/, \"\"),\n path: r.path,\n scope: r.owner === sharedOwner ? \"shared\" : \"personal\",\n schedule: meta.schedule,\n timezone: effectiveTimezone(meta.timezone),\n scheduleDescription: meta.schedule\n ? describeCron(meta.schedule, effectiveTimezone(meta.timezone))\n : \"\",\n enabled: meta.enabled,\n lastRun: meta.lastRun || null,\n lastStatus: meta.lastStatus || null,\n lastError: meta.lastError || null,\n nextRun: meta.nextRun || null,\n originScopeId: meta.originScopeId || null,\n deliveryPlatform: meta.deliveryPlatform || null,\n deliveryDestination: meta.deliveryDestination || null,\n model: meta.model || null,\n mcpTools: meta.mcpTools || [],\n };\n }),\n );\n const scheduledJobs = jobs.filter((job) => job !== null);\n\n if (scheduledJobs.length === 0) {\n return \"No recurring jobs configured. Use manage-jobs with action 'create' to create one.\";\n }\n\n return JSON.stringify(scheduledJobs, null, 2);\n}\n\nasync function runUpdate(args: Record<string, any>): Promise<string> {\n const { name, schedule, instructions, enabled, scope, runAs, model } = args;\n const path = `jobs/${name}.md`;\n\n // Try to find the resource\n let resource = await resourceGetByPath(getSharedOwner(), path);\n if (!resource && scope !== \"shared\") {\n resource = await resourceGetByPath(getOwner(), path);\n }\n\n if (!resource) {\n return JSON.stringify({ error: `Job \"${name}\" not found` });\n }\n\n const { meta, body } = parseJobFrontmatter(resource.content);\n if (classifyJobResource(resource.content).kind === \"automation\") {\n return JSON.stringify({\n error: `\"${name}\" is an automation. Use manage-automations to update it.`,\n });\n }\n\n // Reject when the caller doesn't own the shared job and isn't an org\n // admin. Without this check, any user could rewrite a shared job whose\n // `createdBy` is alice@…, and the next cron tick would run the\n // attacker's instructions as alice (creator-runAs schedules in\n // jobs/scheduler.ts line 273-278).\n const denied = await authorizeJobMutation(resource.owner, meta);\n if (denied) {\n return JSON.stringify({ error: denied });\n }\n\n if (schedule) {\n if (!isValidCron(schedule)) {\n return JSON.stringify({\n error: `Invalid cron expression: \"${schedule}\"`,\n });\n }\n meta.schedule = schedule;\n }\n\n if (args.timezone !== undefined) {\n if (!isValidTimezone(args.timezone)) {\n return JSON.stringify({\n error: `Unknown timezone: \"${args.timezone}\".`,\n });\n }\n meta.timezone = args.timezone;\n }\n\n if (schedule || args.timezone !== undefined) {\n meta.nextRun = nextOccurrence(\n meta.schedule,\n undefined,\n meta.timezone,\n ).toISOString();\n }\n\n if (enabled !== undefined) {\n // Accept both the schema's string enum (\"true\"/\"false\") and a real boolean\n // from non-LLM callers. `enabled === \"true\"` alone treats a boolean `true`\n // as false — silently *disabling* a job the caller meant to enable.\n meta.enabled = enabled === true || enabled === \"true\";\n }\n\n if (runAs === \"creator\" || runAs === \"shared\") {\n meta.runAs = runAs;\n }\n if (typeof model === \"string\" && model.trim()) meta.model = model.trim();\n\n if (args.mcpTools !== undefined) {\n try {\n const mcpTools = normalizeJobMcpTools(args.mcpTools) ?? [];\n if (mcpTools.length) meta.mcpTools = mcpTools;\n else delete meta.mcpTools;\n } catch (err) {\n return JSON.stringify({ error: (err as Error).message });\n }\n }\n\n const newBody = instructions || body;\n const content = buildJobContent(meta, newBody);\n await resourcePut(resource.owner, resource.path, content);\n\n return JSON.stringify({\n updated: true,\n name,\n schedule: meta.schedule,\n timezone: effectiveTimezone(meta.timezone),\n scheduleDescription: describeCron(\n meta.schedule,\n effectiveTimezone(meta.timezone),\n ),\n enabled: meta.enabled,\n nextRun: meta.nextRun,\n mcpTools: meta.mcpTools || [],\n });\n}\n\nasync function runDelete(args: Record<string, any>): Promise<string> {\n const { name, scope } = args;\n const path = `jobs/${name}.md`;\n\n let resource = await resourceGetByPath(getSharedOwner(), path);\n if (!resource && scope !== \"shared\") {\n resource = await resourceGetByPath(getOwner(), path);\n }\n\n if (!resource) {\n return JSON.stringify({ error: `Job \"${name}\" not found` });\n }\n\n // Same access check as runUpdate — only the creator or an org admin can\n // remove a shared job. Otherwise any user could break another tenant's\n // recurring schedule.\n const { meta } = parseJobFrontmatter(resource.content);\n if (classifyJobResource(resource.content).kind === \"automation\") {\n return JSON.stringify({\n error: `\"${name}\" is an automation. Use manage-automations to delete it.`,\n });\n }\n const denied = await authorizeJobMutation(resource.owner, meta);\n if (denied) {\n return JSON.stringify({ error: denied });\n }\n\n await resourceDelete(resource.id);\n return JSON.stringify({ deleted: true, name });\n}\n\nexport function createJobTools(): Record<string, ActionEntry> {\n return {\n \"manage-jobs\": {\n tool: {\n description: `Manage recurring jobs that run on a cron schedule.\n\nActions:\n- \"create\": Create a new recurring job. Requires name, schedule, and instructions.\n- \"list\": List all recurring jobs and their status (schedule, enabled, last run, next run).\n- \"update\": Update a job's schedule, instructions, or enabled state. Requires name.\n- \"delete\": Delete a recurring job. Requires name. Always confirm with the user first.\n\nCron format is 5 fields: minute hour day-of-month month day-of-week. Common patterns: '0 9 * * *' (daily 9am), '0 9 * * 1-5' (weekdays 9am), '0 * * * *' (every hour), '0 9 * * 1' (Mondays 9am), '*/30 * * * *' (every 30 min).\n\nFor jobs that use a connected MCP, pass the exact tool names in mcpTools. This binds only those tools to the background run; OAuth credentials remain in the connector and are resolved for the job's user/org context.`,\n parameters: {\n type: \"object\",\n properties: {\n action: {\n type: \"string\",\n description: \"The action to perform.\",\n enum: [\"create\", \"list\", \"update\", \"delete\"],\n },\n name: {\n type: \"string\",\n description:\n \"Job name (hyphen-case, e.g. 'daily-scorecard-check'). Required for create and update.\",\n },\n timezone: {\n type: \"string\",\n description:\n \"IANA timezone the schedule's clock time is read in, e.g. 'America/New_York'. Optional; defaults to the user's saved scheduling timezone, then the caller's browser zone. Always pass this when the user names a time of day, so '8am' means 8am where they are rather than on the server.\",\n },\n schedule: {\n type: \"string\",\n description:\n \"Cron expression (5 fields: minute hour day-of-month month day-of-week). Required for create, optional for update.\",\n },\n instructions: {\n type: \"string\",\n description:\n \"What the agent should do when this job runs. Be specific — include which actions to call and what to do with the results. Required for create, optional for update.\",\n },\n enabled: {\n type: \"string\",\n description:\n \"Enable or disable a job: 'true' or 'false'. Only used with update.\",\n enum: [\"true\", \"false\"],\n },\n scope: {\n type: \"string\",\n description:\n \"For create: personal or shared (default: shared). For list: personal, shared, or all (default: all). For update: which scope to search (default: all).\",\n enum: [\"personal\", \"shared\", \"all\"],\n },\n runAs: {\n type: \"string\",\n description:\n \"Who shared jobs execute as: creator or shared. Default: creator. Used with create and update.\",\n enum: [\"creator\", \"shared\"],\n },\n model: {\n type: \"string\",\n description:\n \"Optional model id for this routine. The channel/app/engine default is used when omitted.\",\n },\n mcpTools: {\n type: \"array\",\n items: { type: \"string\" },\n description:\n 'Optional explicit MCP capabilities for this job. Use the connected tool names exactly as advertised, for example [\"mcp__meeting-notes__list_meetings\", \"mcp__meeting-notes__get_transcript\"]. The job runs only with these tools; credentials remain in the connector.',\n },\n },\n required: [\"action\"],\n },\n },\n planMode: {\n effect: (args) => (args.action === \"list\" ? \"read\" : \"write\"),\n allowedValues: { action: [\"list\"] },\n description: \"Plan mode allows listing recurring jobs.\",\n },\n run: async (args) => {\n switch (args.action) {\n case \"create\":\n return runCreate(args);\n case \"list\":\n return runList(args);\n case \"update\":\n return runUpdate(args);\n case \"delete\":\n return runDelete(args);\n default:\n return JSON.stringify({\n error: `Unknown action \"${args.action}\". Use \"create\", \"list\", or \"update\".`,\n });\n }\n },\n },\n };\n}\n"]}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
declare const _default: import("../../action.js").ActionDefinition<Record<string, never>, LocalizationPreference>;
|
|
1
|
+
declare const _default: import("../../action.js").ActionDefinition<Record<string, never>, Required<import("../shared.js").LocalizationPreference>>;
|
|
3
2
|
export default _default;
|
|
4
3
|
//# sourceMappingURL=get-localization-preference.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-localization-preference.d.ts","sourceRoot":"","sources":["../../../src/localization/actions/get-localization-preference.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"get-localization-preference.d.ts","sourceRoot":"","sources":["../../../src/localization/actions/get-localization-preference.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-localization-preference.js","sourceRoot":"","sources":["../../../src/localization/actions/get-localization-preference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EACL,wBAAwB,EACxB,+BAA+B,GAEhC,MAAM,cAAc,CAAC;AAEtB,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,kIAAkI;IACpI,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"get-localization-preference.js","sourceRoot":"","sources":["../../../src/localization/actions/get-localization-preference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EACL,wBAAwB,EACxB,+BAA+B,GAEhC,MAAM,cAAc,CAAC;AAEtB,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,kIAAkI;IACpI,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;IACpB,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;IACvB,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAA2C,EAAE;QACjE,IAAI,CAAC,GAAG,EAAE,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,GAAG,CAAC,SAAS,EACb,wBAAwB,CACzB,CAAC;QACF,OAAO,+BAA+B,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { defineAction } from \"../../action.js\";\nimport { getUserSetting } from \"../../settings/user-settings.js\";\nimport {\n LOCALIZATION_SETTING_KEY,\n normalizeLocalizationPreference,\n type ResolvedLocalizationPreference,\n} from \"../shared.js\";\n\nexport default defineAction({\n description:\n \"Get the current user's interface language preference. Returns { locale }, where locale is 'system' or a supported BCP-47 locale.\",\n schema: z.object({}),\n http: { method: \"GET\" },\n run: async (_args, ctx): Promise<ResolvedLocalizationPreference> => {\n if (!ctx?.userEmail) throw new Error(\"Not authenticated.\");\n const stored = await getUserSetting(\n ctx.userEmail,\n LOCALIZATION_SETTING_KEY,\n );\n return normalizeLocalizationPreference(stored);\n },\n});\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type LocalizationPreference } from "../shared.js";
|
|
2
1
|
declare const _default: import("../../action.js").ActionDefinition<{
|
|
3
|
-
locale
|
|
4
|
-
|
|
2
|
+
locale?: string;
|
|
3
|
+
timezone?: string;
|
|
4
|
+
}, Required<import("../shared.js").LocalizationPreference>>;
|
|
5
5
|
export default _default;
|
|
6
6
|
//# sourceMappingURL=set-localization-preference.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-localization-preference.d.ts","sourceRoot":"","sources":["../../../src/localization/actions/set-localization-preference.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"set-localization-preference.d.ts","sourceRoot":"","sources":["../../../src/localization/actions/set-localization-preference.ts"],"names":[],"mappings":""}
|
|
@@ -1,22 +1,47 @@
|
|
|
1
1
|
import { z } from "zod";
|
|
2
2
|
import { defineAction } from "../../action.js";
|
|
3
|
-
import { putUserSetting } from "../../settings/user-settings.js";
|
|
4
|
-
import { LOCALIZATION_SETTING_KEY, SUPPORTED_LOCALES, normalizeLocalePreference, } from "../shared.js";
|
|
3
|
+
import { getUserSetting, putUserSetting, } from "../../settings/user-settings.js";
|
|
4
|
+
import { LOCALIZATION_SETTING_KEY, SUPPORTED_LOCALES, normalizeLocalePreference, normalizeLocalizationPreference, normalizeTimezonePreference, } from "../shared.js";
|
|
5
5
|
export default defineAction({
|
|
6
|
-
description: "Set the current user's interface language
|
|
6
|
+
description: "Set the current user's interface language and scheduling timezone. Locale is 'system' or a supported BCP-47 locale; timezone is 'system' or an IANA zone such as America/New_York.",
|
|
7
7
|
schema: z.object({
|
|
8
8
|
locale: z
|
|
9
9
|
.string()
|
|
10
|
-
.describe("Language preference: 'system' or a supported BCP-47 locale.")
|
|
10
|
+
.describe("Language preference: 'system' or a supported BCP-47 locale.")
|
|
11
|
+
.optional(),
|
|
12
|
+
timezone: z
|
|
13
|
+
.string()
|
|
14
|
+
.describe("Scheduling timezone: 'system' or an IANA zone name.")
|
|
15
|
+
.optional(),
|
|
11
16
|
}),
|
|
12
17
|
run: async (args, ctx) => {
|
|
13
18
|
if (!ctx?.userEmail)
|
|
14
19
|
throw new Error("Not authenticated.");
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
20
|
+
// Each field is optional, so merge onto what is stored instead of
|
|
21
|
+
// writing a partial record that silently resets the other one.
|
|
22
|
+
const current = normalizeLocalizationPreference(await getUserSetting(ctx.userEmail, LOCALIZATION_SETTING_KEY));
|
|
23
|
+
let locale = current.locale;
|
|
24
|
+
if (args.locale !== undefined) {
|
|
25
|
+
const parsed = normalizeLocalePreference(args.locale);
|
|
26
|
+
if (!parsed) {
|
|
27
|
+
throw new Error(`Unsupported locale. Use system, ${SUPPORTED_LOCALES.join(", ")}.`);
|
|
28
|
+
}
|
|
29
|
+
locale = parsed;
|
|
30
|
+
}
|
|
31
|
+
let timezone = current.timezone;
|
|
32
|
+
if (args.timezone !== undefined) {
|
|
33
|
+
const parsed = normalizeTimezonePreference(args.timezone);
|
|
34
|
+
// Normalizing an unusable zone to "system" would quietly schedule the
|
|
35
|
+
// user in the host zone, which is the failure this field exists to fix.
|
|
36
|
+
if (parsed === "system" && args.timezone.trim() !== "system") {
|
|
37
|
+
throw new Error(`Unknown timezone "${args.timezone}". Use system or an IANA zone such as America/New_York.`);
|
|
38
|
+
}
|
|
39
|
+
timezone = parsed;
|
|
18
40
|
}
|
|
19
|
-
const value = {
|
|
41
|
+
const value = {
|
|
42
|
+
locale,
|
|
43
|
+
timezone,
|
|
44
|
+
};
|
|
20
45
|
await putUserSetting(ctx.userEmail, LOCALIZATION_SETTING_KEY, value);
|
|
21
46
|
return value;
|
|
22
47
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"set-localization-preference.js","sourceRoot":"","sources":["../../../src/localization/actions/set-localization-preference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,
|
|
1
|
+
{"version":3,"file":"set-localization-preference.js","sourceRoot":"","sources":["../../../src/localization/actions/set-localization-preference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EACL,cAAc,EACd,cAAc,GACf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,wBAAwB,EACxB,iBAAiB,EACjB,yBAAyB,EACzB,+BAA+B,EAC/B,2BAA2B,GAE5B,MAAM,cAAc,CAAC;AAEtB,eAAe,YAAY,CAAC;IAC1B,WAAW,EACT,oLAAoL;IACtL,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CAAC,6DAA6D,CAAC;aACvE,QAAQ,EAAE;QACb,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,CAAC,qDAAqD,CAAC;aAC/D,QAAQ,EAAE;KACd,CAAC;IACF,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAA2C,EAAE;QAChE,IAAI,CAAC,GAAG,EAAE,SAAS;YAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;QAE3D,kEAAkE;QAClE,+DAA+D;QAC/D,MAAM,OAAO,GAAG,+BAA+B,CAC7C,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,wBAAwB,CAAC,CAC9D,CAAC;QAEF,IAAI,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,yBAAyB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACtD,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,IAAI,KAAK,CACb,mCAAmC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACnE,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,MAAM,CAAC;QAClB,CAAC;QAED,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;QAChC,IAAI,IAAI,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,MAAM,GAAG,2BAA2B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC1D,sEAAsE;YACtE,wEAAwE;YACxE,IAAI,MAAM,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,QAAQ,EAAE,CAAC;gBAC7D,MAAM,IAAI,KAAK,CACb,qBAAqB,IAAI,CAAC,QAAQ,yDAAyD,CAC5F,CAAC;YACJ,CAAC;YACD,QAAQ,GAAG,MAAM,CAAC;QACpB,CAAC;QAED,MAAM,KAAK,GAA6D;YACtE,MAAM;YACN,QAAQ;SACT,CAAC;QACF,MAAM,cAAc,CAAC,GAAG,CAAC,SAAS,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { defineAction } from \"../../action.js\";\nimport {\n getUserSetting,\n putUserSetting,\n} from \"../../settings/user-settings.js\";\nimport {\n LOCALIZATION_SETTING_KEY,\n SUPPORTED_LOCALES,\n normalizeLocalePreference,\n normalizeLocalizationPreference,\n normalizeTimezonePreference,\n type ResolvedLocalizationPreference,\n} from \"../shared.js\";\n\nexport default defineAction({\n description:\n \"Set the current user's interface language and scheduling timezone. Locale is 'system' or a supported BCP-47 locale; timezone is 'system' or an IANA zone such as America/New_York.\",\n schema: z.object({\n locale: z\n .string()\n .describe(\"Language preference: 'system' or a supported BCP-47 locale.\")\n .optional(),\n timezone: z\n .string()\n .describe(\"Scheduling timezone: 'system' or an IANA zone name.\")\n .optional(),\n }),\n run: async (args, ctx): Promise<ResolvedLocalizationPreference> => {\n if (!ctx?.userEmail) throw new Error(\"Not authenticated.\");\n\n // Each field is optional, so merge onto what is stored instead of\n // writing a partial record that silently resets the other one.\n const current = normalizeLocalizationPreference(\n await getUserSetting(ctx.userEmail, LOCALIZATION_SETTING_KEY),\n );\n\n let locale = current.locale;\n if (args.locale !== undefined) {\n const parsed = normalizeLocalePreference(args.locale);\n if (!parsed) {\n throw new Error(\n `Unsupported locale. Use system, ${SUPPORTED_LOCALES.join(\", \")}.`,\n );\n }\n locale = parsed;\n }\n\n let timezone = current.timezone;\n if (args.timezone !== undefined) {\n const parsed = normalizeTimezonePreference(args.timezone);\n // Normalizing an unusable zone to \"system\" would quietly schedule the\n // user in the host zone, which is the failure this field exists to fix.\n if (parsed === \"system\" && args.timezone.trim() !== \"system\") {\n throw new Error(\n `Unknown timezone \"${args.timezone}\". Use system or an IANA zone such as America/New_York.`,\n );\n }\n timezone = parsed;\n }\n\n const value: ResolvedLocalizationPreference & Record<string, unknown> = {\n locale,\n timezone,\n };\n await putUserSetting(ctx.userEmail, LOCALIZATION_SETTING_KEY, value);\n return value;\n },\n});\n"]}
|
|
@@ -48,6 +48,10 @@ declare const messages: {
|
|
|
48
48
|
profileSaved: string;
|
|
49
49
|
profileSaveError: string;
|
|
50
50
|
profileMenuItem: string;
|
|
51
|
+
manageAgentMenuItem: string;
|
|
52
|
+
timezoneLabel: string;
|
|
53
|
+
timezoneSystem: string;
|
|
54
|
+
timezoneHint: string;
|
|
51
55
|
};
|
|
52
56
|
secrets: {
|
|
53
57
|
scopeLabel: string;
|
|
@@ -505,6 +509,7 @@ declare const messages: {
|
|
|
505
509
|
systemOrdered: string;
|
|
506
510
|
};
|
|
507
511
|
jobs: {
|
|
512
|
+
timezone: string;
|
|
508
513
|
pageTitle: string;
|
|
509
514
|
pageDescription: string;
|
|
510
515
|
personalDescription: string;
|
|
@@ -519,6 +524,26 @@ declare const messages: {
|
|
|
519
524
|
paused: string;
|
|
520
525
|
nextRun: string;
|
|
521
526
|
lastRun: string;
|
|
527
|
+
lastChecked: string;
|
|
528
|
+
lastStatus: string;
|
|
529
|
+
neverRan: string;
|
|
530
|
+
notSet: string;
|
|
531
|
+
status: string;
|
|
532
|
+
trigger: string;
|
|
533
|
+
scope: string;
|
|
534
|
+
createdBy: string;
|
|
535
|
+
model: string;
|
|
536
|
+
blockedTitle: string;
|
|
537
|
+
pastRuns: string;
|
|
538
|
+
runsLoadError: string;
|
|
539
|
+
noRuns: string;
|
|
540
|
+
edit: string;
|
|
541
|
+
editScheduleTitle: string;
|
|
542
|
+
editScheduleDescription: string;
|
|
543
|
+
cronExpression: string;
|
|
544
|
+
cronFormatHint: string;
|
|
545
|
+
cronFieldCount: string;
|
|
546
|
+
saveSchedule: string;
|
|
522
547
|
details: string;
|
|
523
548
|
pause: string;
|
|
524
549
|
resume: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-messages.d.ts","sourceRoot":"","sources":["../../src/localization/default-messages.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"default-messages.d.ts","sourceRoot":"","sources":["../../src/localization/default-messages.ts"],"names":[],"mappings":"AAKA,QAAA,MAAM,QAAQ;IACZ,aAAa;QACX,QAAQ;;IAEV,IAAI;QACF,aAAa;QACb,mBAAmB;QACnB,KAAK;QACL,KAAK;QACL,eAAe;QACf,aAAa;QACb,SAAS;QACT,eAAe;QACf,UAAU;QACV,gBAAgB;;IAElB,QAAQ;QACN,KAAK;QACL,SAAS;QACT,WAAW;QACX,aAAa;QACb,mBAAmB;QAEnB,aAAa;QACb,UAAU;QACV,gBAAgB;QAEhB,iBAAiB;QACjB,cAAc;QACd,oBAAoB;QACpB,gBAAgB;QAChB,oBAAoB;QACpB,QAAQ;QACR,mBAAmB;QACnB,yBAAyB;QAEzB,kBAAkB;QAClB,YAAY;QACZ,kBAAkB;QAClB,cAAc;QACd,gBAAgB;QAChB,mBAAmB;QACnB,iBAAiB;QACjB,gBAAgB;QAChB,kBAAkB;QAClB,gBAAgB;QAChB,sBAAsB;QACtB,sBAAsB;QAEtB,WAAW;QACX,aAAa;QACb,YAAY;QACZ,gBAAgB;QAChB,eAAe;QACf,mBAAmB;QACnB,aAAa;QACb,cAAc;QACd,YAAY;;IAEd,OAAO;QACL,UAAU;QACV,aAAa;QACb,cAAc;QACd,wBAAwB;QAExB,yBAAyB;;IAG3B,cAAc;QACZ,QAAQ;QACR,eAAe;QACf,UAAU;YACR,SAAS;YACT,eAAe;YACf,eAAe;;QAEjB,KAAK;YACH,KAAK;YACL,WAAW;;QAEb,YAAY;YACV,KAAK;YACL,WAAW;;QAGb,MAAM;YACJ,KAAK;YACL,WAAW;;QAGb,MAAM;YACJ,KAAK;YACL,WAAW;;QAEb,MAAM;YACJ,KAAK;YACL,WAAW;;QAGb,SAAS;YACP,KAAK;YACL,WAAW;;QAGb,YAAY;YACV,KAAK;YACL,WAAW;;;IAGf,YAAY;QACV,KAAK;QACL,WAAW;QACX,WAAW;QACX,YAAY;QACZ,aAAa;QACb,kBAAkB;QAClB,kBAAkB;QAClB,WAAW;QACX,kBAAkB;QAClB,uBAAuB;QACvB,6BAA6B;QAE7B,aAAa;QACb,gBAAgB;QAChB,cAAc;QACd,oBAAoB;QAEpB,OAAO;QACP,SAAS;QACT,UAAU;QACV,UAAU;QACV,SAAS;QACT,WAAW;QACX,WAAW;QACX,eAAe;QACf,iBAAiB;QAEjB,gBAAgB;QAChB,SAAS;QACT,MAAM;QACN,SAAS;QACT,GAAG;QACH,QAAQ;QACR,QAAQ;QACR,gBAAgB;QAChB,cAAc;QACd,gBAAgB;QAChB,qBAAqB;QACrB,uBAAuB;QACvB,iBAAiB;QACjB,WAAW;QACX,kBAAkB;QAElB,yBAAyB;;IAG3B,QAAQ;QACN,GAAG;YACD,IAAI;YACJ,QAAQ;YACR,IAAI;YACJ,OAAO;YACP,KAAK;YACL,YAAY;YACZ,MAAM;YACN,SAAS;YACT,SAAS;YACT,YAAY;YACZ,UAAU;YACV,SAAS;YACT,WAAW;YACX,QAAQ;YACR,KAAK;YACL,MAAM;YACN,WAAW;YACX,QAAQ;YACR,IAAI;YACJ,UAAU;YACV,UAAU;YACV,qBAAqB;;QAEvB,OAAO;YACL,qBAAqB;YACrB,qBAAqB;YACrB,uBAAuB;YACvB,MAAM;YACN,KAAK;YACL,OAAO;YACP,eAAe;YACf,UAAU;YACV,YAAY;YACZ,WAAW;YACX,SAAS;YACT,cAAc;YAEd,kBAAkB;YAClB,oBAAoB;YACpB,kBAAkB;;QAEpB,KAAK;YACH,eAAe;YAEf,4BAA4B;YAE5B,eAAe;YACf,aAAa;YACb,SAAS;YACT,oBAAoB;YACpB,cAAc;YACd,WAAW;YACX,YAAY;YACZ,WAAW;YACX,SAAS;YACT,SAAS;YACT,iBAAiB;YACjB,kBAAkB;YAClB,IAAI;YACJ,IAAI;YACJ,UAAU;YACV,cAAc;YACd,WAAW;YACX,sBAAsB;YAEtB,eAAe;YACf,eAAe;YACf,qBAAqB;YACrB,gCAAgC;YAEhC,gBAAgB;YAChB,gBAAgB;YAChB,oBAAoB;YACpB,uBAAuB;YAEvB,YAAY;YACZ,uBAAuB;YAEvB,UAAU;YACV,MAAM;YACN,iBAAiB;YAEjB,uBAAuB;YAEvB,iBAAiB;YACjB,cAAc;YACd,gBAAgB;YAChB,IAAI;YACJ,MAAM;YACN,MAAM;YACN,WAAW;YACX,mBAAmB;YACnB,gBAAgB;YAChB,kBAAkB;YAClB,sBAAsB;YACtB,4BAA4B;YAE5B,cAAc;YAEd,kBAAkB;YAClB,uBAAuB;YACvB,gBAAgB;YAChB,eAAe;YACf,eAAe;YACf,0BAA0B;YAE1B,WAAW;YACX,QAAQ;YACR,iBAAiB;YACjB,iBAAiB;YAEjB,MAAM;YACN,iBAAiB;YACjB,UAAU;YACV,aAAa;YACb,OAAO;YACP,yBAAyB;YAEzB,iBAAiB;YAEjB,gBAAgB;YAChB,eAAe;YACf,YAAY;YACZ,gBAAgB;YAChB,iBAAiB;YACjB,4BAA4B;YAE5B,OAAO;YACP,YAAY;YACZ,OAAO;YACP,YAAY;YACZ,gBAAgB;YAChB,OAAO;YACP,kBAAkB;YAClB,iBAAiB;YACjB,yBAAyB;YAEzB,qBAAqB;YAErB,QAAQ;YACR,WAAW;YACX,iBAAiB;YACjB,WAAW;YACX,IAAI;YACJ,sBAAsB;YACtB,aAAa;YACb,cAAc;YACd,eAAe;YACf,MAAM;YACN,MAAM;YACN,MAAM;YACN,QAAQ;YACR,YAAY;YACZ,YAAY;YACZ,gBAAgB;YAEhB,eAAe;YACf,aAAa;YACb,cAAc;YACd,yBAAyB;YACzB,sBAAsB;YACtB,yBAAyB;YACzB,uBAAuB;YACvB,oBAAoB;YACpB,mBAAmB;YACnB,uBAAuB;YACvB,gBAAgB;YAChB,sBAAsB;YAEtB,qBAAqB;YACrB,kBAAkB;YAClB,iBAAiB;YACjB,qBAAqB;YACrB,gBAAgB;YAChB,iBAAiB;YACjB,sBAAsB;YACtB,kBAAkB;YAClB,kBAAkB;YAClB,oBAAoB;YACpB,gBAAgB;YAChB,mBAAmB;YACnB,kBAAkB;YAClB,mBAAmB;YACnB,yBAAyB;YACzB,uBAAuB;YACvB,yBAAyB;YACzB,6BAA6B;YAC7B,uBAAuB;YACvB,sBAAsB;YACtB,sBAAsB;YACtB,0BAA0B;YAC1B,qBAAqB;YACrB,0BAA0B;YAC1B,4BAA4B;YAC5B,iBAAiB;YACjB,4BAA4B;YAC5B,kBAAkB;YAClB,qBAAqB;YACrB,mBAAmB;YACnB,kBAAkB;YAClB,yBAAyB;YACzB,oBAAoB;YACpB,uBAAuB;YACvB,2BAA2B;YAC3B,iCAAiC;YAEjC,sBAAsB;YACtB,8BAA8B;YAC9B,mBAAmB;YACnB,yBAAyB;YAEzB,qBAAqB;YAErB,uBAAuB;YAEvB,wBAAwB;YACxB,oBAAoB;YACpB,+BAA+B;YAE/B,oBAAoB;;;IAGxB,UAAU;QACR,OAAO;YACL,KAAK;YACL,WAAW;YACX,KAAK;YACL,SAAS;;QAEX,UAAU;QACV,qBAAqB;QACrB,0BAA0B;QAE1B,eAAe;QACf,QAAQ;QACR,IAAI;QACJ,eAAe;QACf,GAAG;QACH,aAAa;QACb,SAAS;QACT,OAAO;QACP,WAAW;QACX,YAAY;QACZ,eAAe;QACf,aAAa;QACb,SAAS;QACT,QAAQ;QACR,QAAQ;QACR,QAAQ;QACR,cAAc;QACd,UAAU;QACV,QAAQ;QACR,cAAc;QACd,YAAY;QACZ,SAAS;QACT,kBAAkB;QAClB,6BAA6B;QAE7B,WAAW;QACX,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,mBAAmB;QACnB,SAAS;QACT,gBAAgB;QAEhB,gBAAgB;QAChB,iBAAiB;QACjB,mBAAmB;QACnB,UAAU;QACV,qBAAqB;QACrB,oBAAoB;QACpB,cAAc;YACZ,MAAM;YACN,KAAK;YACL,KAAK;YACL,OAAO;;QAET,SAAS;YACP,gBAAgB;YAChB,WAAW;YACX,iBAAiB;YAEjB,UAAU;YACV,gBAAgB;YAEhB,cAAc;YACd,YAAY;YACZ,kBAAkB;YAClB,KAAK;YACL,aAAa;YACb,kBAAkB;YAClB,QAAQ;YACR,QAAQ;YACR,GAAG;YACH,aAAa;YACb,QAAQ;gBACN,UAAU;gBACV,iBAAiB;gBACjB,sBAAsB;gBAEtB,QAAQ;gBACR,YAAY;gBACZ,SAAS;oBACP,EAAE;oBACF,EAAE;oBACF,EAAE;oBACF,EAAE;oBACF,EAAE;oBACF,EAAE;oBACF,EAAE;oBACF,EAAE;oBACF,EAAE;;gBAEJ,YAAY;gBACZ,kBAAkB;oBAChB,OAAO;oBACP,QAAQ;oBACR,IAAI;;gBAEN,UAAU;gBACV,kBAAkB;gBAElB,iBAAiB;oBACf,KAAK;oBACL,KAAK;oBACL,KAAK;oBACL,IAAI;oBACJ,KAAK;oBACL,KAAK;oBACL,GAAG;oBACH,MAAM;oBACN,IAAI;oBACJ,OAAO;;;YAGX,MAAM;gBACJ,UAAU;gBACV,SAAS;gBACT,QAAQ;gBACR,OAAO;gBACP,KAAK;gBACL,MAAM;;YAER,MAAM;gBACJ,WAAW;gBAEX,cAAc;gBACd,aAAa;gBACb,mBAAmB;gBACnB,kBAAkB;gBAElB,gBAAgB;gBAChB,WAAW;;;;IAIjB,WAAW;QACT,UAAU;YACR,aAAa;YACb,aAAa;YACb,QAAQ;YACR,uBAAuB;YACvB,YAAY;YACZ,gBAAgB;YAChB,YAAY;YACZ,QAAQ;YACR,MAAM;YACN,QAAQ;YACR,KAAK;YACL,YAAY;YACZ,cAAc;;QAEhB,UAAU;YACR,QAAQ;YACR,SAAS;YACT,IAAI;;QAEN,MAAM;QACN,YAAY;QACZ,IAAI;QACJ,eAAe;QACf,UAAU;QACV,cAAc;QACd,KAAK;QACL,iBAAiB;QAEjB,cAAc;QACd,wBAAwB;QAExB,IAAI;QACJ,OAAO;QACP,cAAc;QACd,kBAAkB;QAClB,SAAS;QACT,UAAU;QACV,qBAAqB;QAErB,YAAY;QACZ,YAAY;QACZ,kBAAkB;QAClB,wBAAwB;QAExB,aAAa;;IAEf,IAAI;QACF,QAAQ;QACR,SAAS;QACT,eAAe;QAEf,mBAAmB;QAEnB,uBAAuB;QAEvB,sBAAsB;QACtB,OAAO;QACP,SAAS;QACT,sBAAsB;QACtB,4BAA4B;QAE5B,kBAAkB;QAElB,OAAO;QACP,MAAM;QACN,OAAO;QACP,OAAO;QACP,WAAW;QACX,UAAU;QACV,QAAQ;QACR,MAAM;QACN,MAAM;QACN,OAAO;QACP,KAAK;QACL,SAAS;QACT,KAAK;QACL,YAAY;QACZ,QAAQ;QACR,aAAa;QACb,MAAM;QAEN,IAAI;QACJ,iBAAiB;QACjB,uBAAuB;QAEvB,cAAc;QACd,cAAc;QACd,cAAc;QACd,YAAY;QACZ,OAAO;QACP,KAAK;QACL,MAAM;QACN,MAAM;QACN,WAAW;QACX,qBAAqB;QACrB,2BAA2B;QAC3B,sBAAsB;QACtB,aAAa;QACb,gBAAgB;QAChB,MAAM;QACN,YAAY;QACZ,QAAQ;QACR,sBAAsB;QACtB,gBAAgB;QAChB,YAAY;QACZ,qBAAqB;QACrB,2BAA2B;QAE3B,iBAAiB;QACjB,sBAAsB;QACtB,SAAS;QACT,QAAQ;QACR,YAAY;QACZ,eAAe;QAEf,eAAe;;IAEjB,KAAK;QACH,iBAAiB;QACjB,aAAa;QACb,KAAK;QACL,KAAK;QACL,YAAY;QACZ,IAAI;QACJ,MAAM;QACN,KAAK;QACL,IAAI;QACJ,aAAa;QACb,SAAS;QACT,gBAAgB;QAChB,YAAY;QACZ,gBAAgB;QAChB,SAAS;QACT,MAAM;QACN,QAAQ;QACR,QAAQ;QACR,SAAS;QACT,IAAI;QACJ,IAAI;QACJ,OAAO;QACP,kBAAkB;QAClB,YAAY;QACZ,uBAAuB;QACvB,MAAM;QACN,iBAAiB;QACjB,MAAM;QACN,iBAAiB;QACjB,MAAM;QACN,iBAAiB;QACjB,KAAK;QACL,gBAAgB;;IAElB,QAAQ;QACN,IAAI;QACJ,SAAS;QACT,aAAa;QACb,eAAe;QACf,aAAa;QACb,eAAe;QACf,UAAU;QACV,YAAY;QACZ,aAAa;QACb,cAAc;QACd,oBAAoB;QACpB,iBAAiB;QACjB,mBAAmB;QACnB,gBAAgB;QAChB,gBAAgB;QAEhB,IAAI;QACJ,OAAO;QACP,OAAO;QACP,aAAa;QACb,UAAU;QACV,YAAY;QACZ,aAAa;QACb,cAAc;QACd,eAAe;QACf,cAAc;QACd,eAAe;QACf,YAAY;QACZ,aAAa;QACb,WAAW;QACX,YAAY;;IAEd,YAAY;QACV,cAAc;QAEd,cAAc;QACd,WAAW;QACX,KAAK;QACL,mBAAmB;QAEnB,QAAQ;QAER,YAAY;QACZ,kBAAkB;QAElB,iBAAiB;QACjB,uBAAuB;QAEvB,eAAe;QACf,eAAe;QACf,mBAAmB;QACnB,yBAAyB;QAEzB,aAAa;QACb,aAAa;QACb,KAAK;;IAEP,UAAU;QACR,YAAY;QACZ,kBAAkB;QAElB,cAAc;QACd,iBAAiB;QACjB,KAAK;QACL,WAAW;QACX,UAAU;QACV,YAAY;QACZ,iBAAiB;QACjB,gBAAgB;QAChB,eAAe;QACf,sBAAsB;QACtB,kBAAkB;QAClB,UAAU;QACV,gBAAgB;QAChB,kBAAkB;QAClB,SAAS;QACT,UAAU;QACV,cAAc;QACd,YAAY;QACZ,oBAAoB;QAEpB,cAAc;QACd,cAAc;QACd,qBAAqB;QAErB,2BAA2B;QAC3B,MAAM;QACN,MAAM;QACN,QAAQ;QACR,MAAM;QACN,QAAQ;QACR,YAAY;QACZ,oBAAoB;QACpB,oBAAoB;QACpB,oBAAoB;QACpB,6BAA6B;QAE7B,gBAAgB;QAChB,0BAA0B;QAC1B,mCAAmC;QAEnC,0CAA0C;QAE1C,uBAAuB;QACvB,wBAAwB;QACxB,yBAAyB;QACzB,4BAA4B;QAE5B,SAAS;QACT,OAAO;QACP,kBAAkB;QAClB,cAAc;QACd,oBAAoB;QACpB,yBAAyB;QAEzB,iBAAiB;QACjB,sBAAsB;QAEtB,aAAa;QACb,IAAI;QACJ,aAAa;QACb,MAAM;QACN,IAAI;QACJ,MAAM;QACN,WAAW;QACX,SAAS;QACT,aAAa;QAEb,mBAAmB;QACnB,qBAAqB;QAErB,SAAS;QACT,gBAAgB;QAChB,YAAY;QACZ,YAAY;QACZ,YAAY;QACZ,SAAS;QACT,gBAAgB;QAChB,oBAAoB;QACpB,gBAAgB;QAChB,gBAAgB;QAChB,KAAK;;IAEP,GAAG;QACD,WAAW;QACX,iBAAiB;QAEjB,cAAc;QACd,iBAAiB;QACjB,QAAQ;QACR,YAAY;QACZ,mBAAmB;QAEnB,eAAe;QACf,gBAAgB;QAChB,YAAY;QACZ,kBAAkB;QAClB,OAAO;QACP,kBAAkB;QAClB,SAAS;QACT,MAAM;QACN,cAAc;QACd,gBAAgB;QAChB,uBAAuB;QACvB,kBAAkB;QAClB,MAAM;QACN,QAAQ;QACR,IAAI;QACJ,kBAAkB;QAClB,wBAAwB;QAExB,oBAAoB;QAEpB,+BAA+B;QAE/B,aAAa;QAEb,cAAc;QAEd,IAAI;QACJ,cAAc;QACd,GAAG;QACH,KAAK;QACL,KAAK;QACL,MAAM;QACN,OAAO;QACP,aAAa;QACb,OAAO;QACP,IAAI;QACJ,MAAM;QACN,OAAO;QACP,SAAS;QACT,eAAe;QACf,iBAAiB;QACjB,UAAU;QACV,UAAU;QACV,YAAY;QACZ,MAAM;QACN,MAAM;QACN,IAAI;QACJ,OAAO;QACP,UAAU;QACV,SAAS;QACT,oBAAoB;QAEpB,sBAAsB;QACtB,2BAA2B;QAC3B,mBAAmB;QACnB,gBAAgB;;IAElB,YAAY;QACV,UAAU;QACV,cAAc;QACd,mBAAmB;QAEnB,aAAa;QAEb,MAAM;QACN,OAAO;QACP,QAAQ;QACR,YAAY;QACZ,IAAI;QACJ,mBAAmB;QACnB,sBAAsB;QAEtB,OAAO;QACP,KAAK;QACL,kBAAkB;QAClB,uBAAuB;QACvB,eAAe;QACf,OAAO;QACP,IAAI;QACJ,aAAa;QACb,eAAe;QAEf,kBAAkB;QAClB,gBAAgB;QAChB,2BAA2B;QAC3B,cAAc;QACd,kBAAkB;QAElB,eAAe;;IAGjB,eAAe;QACb,SAAS;QACT,eAAe;QACf,KAAK;QACL,WAAW;QACX,iBAAiB;QACjB,UAAU;QACV,SAAS;QACT,SAAS;QACT,SAAS;QACT,OAAO;QACP,gBAAgB;QAChB,WAAW;QACX,iBAAiB;QACjB,6BAA6B;QAE7B,iBAAiB;QACjB,kBAAkB;QAClB,WAAW;QACX,cAAc;QACd,uBAAuB;QAEvB,qBAAqB;QAErB,iBAAiB;QAEjB,WAAW;QAEX,QAAQ;QACR,YAAY;QACZ,kBAAkB;QAClB,UAAU;QACV,GAAG;QACH,gBAAgB;QAChB,OAAO;QACP,qBAAqB;QACrB,cAAc;QACd,sBAAsB;QACtB,kBAAkB;QAClB,aAAa;QACb,SAAS;QACT,IAAI;QACJ,kBAAkB;QAClB,oBAAoB;QACpB,MAAM;QACN,SAAS;QACT,OAAO;YACL,QAAQ;gBACN,WAAW;gBACX,OAAO;;YAGT,MAAM;gBACJ,WAAW;gBACX,OAAO;;YAET,MAAM;gBACJ,WAAW;gBACX,OAAO;gBACP,SAAS;;YAGX,OAAO;gBACL,WAAW;gBACX,OAAO;gBAEP,SAAS;;YAGX,OAAO;gBACL,WAAW;gBACX,OAAO;;YAET,MAAM;gBACJ,WAAW;gBACX,OAAO;;YAET,QAAQ;gBACN,WAAW;gBACX,OAAO;;YAET,IAAI;gBACF,WAAW;gBACX,OAAO;;YAET,MAAM;gBACJ,WAAW;gBACX,OAAO;;YAET,SAAS;gBACP,WAAW;gBACX,OAAO;gBAEP,SAAS;;YAGX,UAAU;gBACR,WAAW;gBACX,OAAO;gBAEP,SAAS;;YAGX,MAAM;gBACJ,WAAW;gBAEX,OAAO;gBACP,SAAS;;YAGX,KAAK;gBACH,WAAW;gBAEX,OAAO;gBACP,SAAS;;YAGX,KAAK;gBACH,WAAW;gBACX,OAAO;gBAEP,SAAS;;YAGX,MAAM;gBACJ,WAAW;gBAEX,OAAO;gBACP,SAAS;;YAGX,MAAM;gBACJ,WAAW;gBAEX,OAAO;gBAEP,SAAS;;YAGX,KAAK;gBACH,WAAW;gBAEX,OAAO;gBACP,SAAS;;YAGX,KAAK;gBACH,WAAW;gBAEX,OAAO;gBACP,SAAS;;YAGX,OAAO;gBACL,WAAW;gBACX,OAAO;gBACP,SAAS;;YAGX,QAAQ;gBACN,WAAW;gBACX,OAAO;gBAEP,SAAS;;YAGX,MAAM;gBACJ,WAAW;gBACX,OAAO;gBACP,SAAS;;YAGX,OAAO;gBACL,WAAW;gBACX,OAAO;gBACP,SAAS;;YAGX,MAAM;gBACJ,WAAW;gBACX,OAAO;gBACP,SAAS;;YAGX,GAAG;gBACD,WAAW;gBACX,OAAO;gBACP,SAAS;;YAGX,OAAO;gBACL,WAAW;gBACX,OAAO;gBACP,SAAS;;YAGX,MAAM;gBACJ,WAAW;gBACX,OAAO;gBACP,SAAS;;;QAIb,IAAI;YACF,IAAI;YACJ,OAAO;YACP,KAAK;;QAEP,MAAM;YACJ,IAAI;YACJ,aAAa;YACb,gBAAgB;YAChB,QAAQ;YACR,aAAa;YACb,UAAU;;;IAGd,aAAa;QACX,MAAM;QACN,eAAe;QACf,OAAO;QACP,aAAa;QACb,SAAS;QACT,SAAS;QACT,UAAU;QACV,WAAW;QACX,QAAQ;QACR,YAAY;QACZ,GAAG;QACH,KAAK;QACL,QAAQ;QACR,IAAI;QACJ,KAAK;QACL,IAAI;QACJ,WAAW;QACX,UAAU;QACV,KAAK;QACL,IAAI;QACJ,IAAI;QACJ,MAAM;QACN,MAAM;QACN,UAAU;QACV,QAAQ;QACR,gBAAgB;QAChB,QAAQ;QACR,aAAa;QACb,KAAK;QACL,WAAW;QACX,QAAQ;QACR,QAAQ;QACR,OAAO;QACP,iBAAiB;QACjB,OAAO;QACP,KAAK;QACL,OAAO;QACP,OAAO;QACP,MAAM;QACN,KAAK;QACL,aAAa;QACb,UAAU;QACV,WAAW;QACX,YAAY;QACZ,UAAU;;IAEZ,KAAK;QACH,YAAY;QACZ,cAAc;QACd,aAAa;QACb,eAAe;QAEf,WAAW;QACX,MAAM;;CAET,CAAC;eAEa,QAAQ"}
|
|
@@ -53,6 +53,10 @@ const messages = {
|
|
|
53
53
|
profileSaved: "Profile updated",
|
|
54
54
|
profileSaveError: "Could not update profile",
|
|
55
55
|
profileMenuItem: "Profile",
|
|
56
|
+
manageAgentMenuItem: "Manage agent",
|
|
57
|
+
timezoneLabel: "Timezone",
|
|
58
|
+
timezoneSystem: "Follow this browser ({{zone}})",
|
|
59
|
+
timezoneHint: "Used for timestamps and scheduled automations.",
|
|
56
60
|
},
|
|
57
61
|
secrets: {
|
|
58
62
|
scopeLabel: "Scope",
|
|
@@ -510,6 +514,7 @@ const messages = {
|
|
|
510
514
|
systemOrdered: "System · ordered, not evictable",
|
|
511
515
|
},
|
|
512
516
|
jobs: {
|
|
517
|
+
timezone: "Timezone",
|
|
513
518
|
pageTitle: "Automations",
|
|
514
519
|
pageDescription: "Manage agent tasks that run on a schedule or in response to events.",
|
|
515
520
|
personalDescription: "Scheduled and event-triggered automations that run for you.",
|
|
@@ -524,6 +529,26 @@ const messages = {
|
|
|
524
529
|
paused: "Paused",
|
|
525
530
|
nextRun: "Next run",
|
|
526
531
|
lastRun: "Last run",
|
|
532
|
+
lastChecked: "Last checked",
|
|
533
|
+
lastStatus: "Last status",
|
|
534
|
+
neverRan: "Never",
|
|
535
|
+
notSet: "—",
|
|
536
|
+
status: "Status",
|
|
537
|
+
trigger: "Trigger",
|
|
538
|
+
scope: "Scope",
|
|
539
|
+
createdBy: "Created by",
|
|
540
|
+
model: "Model",
|
|
541
|
+
blockedTitle: "This automation is not running",
|
|
542
|
+
pastRuns: "Past runs",
|
|
543
|
+
runsLoadError: "Could not load run history.",
|
|
544
|
+
noRuns: "This automation has not executed yet. Only real executions are recorded here.",
|
|
545
|
+
edit: "Edit",
|
|
546
|
+
editScheduleTitle: "Edit schedule — {{name}}",
|
|
547
|
+
editScheduleDescription: "The clock time below is read in the timezone you pick, so 8:00 means 8:00 there.",
|
|
548
|
+
cronExpression: "Cron expression",
|
|
549
|
+
cronFormatHint: "minute hour day-of-month month day-of-week",
|
|
550
|
+
cronFieldCount: "A cron expression needs exactly 5 fields.",
|
|
551
|
+
saveSchedule: "Save schedule",
|
|
527
552
|
details: "Details",
|
|
528
553
|
pause: "Pause",
|
|
529
554
|
resume: "Resume",
|