@agent-native/core 0.134.0 → 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 +113 -0
- package/corpus/core/docs/content/template-content-developers.mdx +1 -1
- 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-29-meeting-notes-no-longer-transcribe-the-other-side-twice-when.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/hooks/useMeetingTranscription.ts +37 -48
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +331 -36
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +7 -5
- package/corpus/templates/clips/desktop/src/lib/transcription-engine.ts +182 -106
- package/corpus/templates/clips/desktop/src/lib/upload-recovery.ts +129 -0
- package/corpus/templates/clips/desktop/src/overlays/live-transcript.tsx +43 -14
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +3 -3
- package/corpus/templates/clips/desktop/src-tauri/src/echo_guard.rs +443 -0
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -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/src-tauri/src/whisper_speech.rs +125 -16
- 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/.agents/skills/document-editing/references/databases.md +6 -4
- package/corpus/templates/content/actions/_database-membership-lock.ts +25 -0
- package/corpus/templates/content/actions/_database-row-batch.ts +6 -2
- package/corpus/templates/content/actions/_database-source-utils.ts +289 -129
- package/corpus/templates/content/actions/_database-utils.ts +12 -3
- package/corpus/templates/content/actions/add-comment.ts +15 -1
- package/corpus/templates/content/actions/add-content-database-source-field-property.ts +39 -21
- package/corpus/templates/content/actions/attach-content-database-source.ts +4 -1
- package/corpus/templates/content/actions/change-content-database-source-role.ts +3 -5
- package/corpus/templates/content/actions/duplicate-document-property.ts +59 -46
- package/corpus/templates/content/actions/execute-builder-source-execution.ts +77 -71
- package/corpus/templates/content/actions/list-documents.ts +1 -0
- package/corpus/templates/content/actions/materialize-builder-required-fields.ts +7 -0
- package/corpus/templates/content/actions/remove-database-items.ts +183 -0
- package/corpus/templates/content/actions/set-document-property.ts +57 -39
- package/corpus/templates/content/actions/sync-local-folder-source.ts +7 -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/editor/database/DatabaseView.tsx +471 -329
- package/corpus/templates/content/app/components/editor/database/row-access.ts +45 -0
- package/corpus/templates/content/app/components/editor/database/shared.tsx +141 -38
- package/corpus/templates/content/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/content/app/hooks/use-content-database.ts +2 -2
- package/corpus/templates/content/app/hooks/use-content-prefs.ts +55 -0
- package/corpus/templates/content/app/i18n-data.ts +170 -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-07-30-database-rows-can-now-be-removed-without-deleting-their-page.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/parity/eval-scenarios.ts +2 -2
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +4 -5
- 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/api.ts +4 -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/.generated/bridge/editor-chrome.generated.ts +26 -11
- package/corpus/templates/design/actions/take-design-screenshot.ts +7 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +11 -3
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +4 -1
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +54 -17
- package/corpus/templates/design/app/components/design/design-canvas/local-runtime.ts +126 -0
- package/corpus/templates/design/app/components/templates/TemplatePreview.tsx +2 -0
- package/corpus/templates/design/app/pages/Index.tsx +3 -1
- package/corpus/templates/design/app/pages/Present.tsx +2 -1
- package/corpus/templates/design/app/routes/settings.tsx +14 -22
- package/corpus/templates/design/changelog/2026-07-30-a-broken-inline-script-in-a-generated-screen-is-now-caught-o.md +6 -0
- package/corpus/templates/design/changelog/2026-07-30-design-html-is-now-validated-with-a-spec-grade-html-parser-i.md +6 -0
- package/corpus/templates/design/changelog/2026-07-30-designs-now-load-their-tailwind-and-alpine-runtimes-from-the.md +6 -0
- package/corpus/templates/design/changelog/2026-07-30-designs-with-a-broken-alpine-expression-are-now-caught-on-sa.md +6 -0
- package/corpus/templates/design/changelog/2026-07-30-editing-a-design-no-longer-strips-its-styling-the-canvas-kep.md +6 -0
- 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/package.json +4 -0
- package/corpus/templates/design/shared/html-integrity.ts +802 -556
- 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 +2 -2
- 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/docs/content/template-content-developers.mdx +1 -1
- 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/corpus/templates/content/actions/delete-database-items.ts +0 -89
package/corpus/README.md
CHANGED
package/corpus/core/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,118 @@
|
|
|
1
1
|
# @agent-native/core
|
|
2
2
|
|
|
3
|
+
## 0.135.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 41544d8: Fix the Automations page reporting runs that never happened, and add run history and schedule editing.
|
|
8
|
+
|
|
9
|
+
A scheduler or dispatcher tick that declined to run an automation used to stamp
|
|
10
|
+
`lastRun` with the current time, so a permanently blocked automation reported a
|
|
11
|
+
fresh run every minute while its `nextRun` stayed frozen in the past. Skipped
|
|
12
|
+
ticks now record `lastCheck` instead, leave `lastRun` alone, and only rewrite the
|
|
13
|
+
resource when the failure state actually changes. The failure reason
|
|
14
|
+
(`lastError`) is surfaced on the row and in the details view instead of being
|
|
15
|
+
swallowed behind a bare `skipped` chip.
|
|
16
|
+
|
|
17
|
+
Schedules are also timezone-aware. Cron expressions used to be read in the
|
|
18
|
+
server's zone, so an automation created as "every day at 8am" ran at 8am UTC.
|
|
19
|
+
A schedule now stores the IANA zone it was written in, taken from a new
|
|
20
|
+
scheduling timezone preference in Account settings and falling back to the
|
|
21
|
+
caller's browser zone. Descriptions name their zone ("Every day at 8 AM
|
|
22
|
+
(America/New_York)"), and both the agent tools and the schedule editor accept a
|
|
23
|
+
timezone. Existing schedules keep their current host-relative meaning until
|
|
24
|
+
edited.
|
|
25
|
+
|
|
26
|
+
Also adds:
|
|
27
|
+
- `automation_runs` history for real executions, exposed through a new
|
|
28
|
+
`list-automation-runs` action and a Past runs section in the details view.
|
|
29
|
+
- A Details view that shows more than the list row: schedule, next/last run,
|
|
30
|
+
last checked, last status, scope, creator and model.
|
|
31
|
+
- An Edit affordance for changing a scheduled automation's cron expression and
|
|
32
|
+
timezone.
|
|
33
|
+
- A "Manage agent" entry in the sidebar organization switcher.
|
|
34
|
+
|
|
35
|
+
Run history is bounded and honest about interrupted runs: a row left `running`
|
|
36
|
+
past the point a run could still be alive is reported as `interrupted` rather
|
|
37
|
+
than shown as permanently in-flight, and rows are pruned per automation so a
|
|
38
|
+
frequent schedule cannot grow the table without limit. Recording a run's
|
|
39
|
+
outcome also re-reads the automation first, so a schedule edited while it was
|
|
40
|
+
running is no longer reverted by the completion write.
|
|
41
|
+
|
|
42
|
+
Also from review: a completion write no longer recreates an automation deleted
|
|
43
|
+
mid-run, a run-history write failure can no longer reclassify a completed
|
|
44
|
+
automation as failed, deleting an automation forgets its run history so a new
|
|
45
|
+
one reusing the name does not inherit it, an unusable `X-User-Timezone` header
|
|
46
|
+
is rejected rather than persisted, and a settings read failure surfaces instead
|
|
47
|
+
of silently pinning a schedule to the host zone.
|
|
48
|
+
|
|
49
|
+
Run history never blocks the automation it describes: opening the record,
|
|
50
|
+
attaching its thread and closing it out are all non-fatal, so an unwritable
|
|
51
|
+
history table costs the record rather than the run.
|
|
52
|
+
|
|
53
|
+
- 8c37661: Add shared settings and activity-notification primitives.
|
|
54
|
+
- `SettingsGroup` / `SettingsRow` (`@agent-native/core/client/settings`) render
|
|
55
|
+
several one-line settings inside a single card instead of one card per
|
|
56
|
+
control. Each row keeps its own `id`, so existing settings-search hashes
|
|
57
|
+
still resolve after a card collapses into a row.
|
|
58
|
+
- `resolveActivityRecipients` and `notifyActivity`
|
|
59
|
+
(`@agent-native/core/server`) resolve who should receive a collaboration
|
|
60
|
+
email — owner, thread participants, mentions, never the actor — filter them
|
|
61
|
+
by an app-owned preference key, and report delivery as `delivered`,
|
|
62
|
+
`delivery-failed`, `no-recipients`, `email-not-configured`, or
|
|
63
|
+
`notification-error` rather than collapsing them into an empty success. A
|
|
64
|
+
batch where every send threw is reported as `delivery-failed`, never as a
|
|
65
|
+
delivery.
|
|
66
|
+
- `runActivityNotification` (`@agent-native/core/server`) runs a notification
|
|
67
|
+
without letting it reject the write that caused it. The comment is already
|
|
68
|
+
persisted when notification runs, so throwing made the client retry and
|
|
69
|
+
duplicate the row; the failure now surfaces as `notification-error`.
|
|
70
|
+
- `filterRecipientsByResourceAccess` (`@agent-native/core/sharing`) keeps only
|
|
71
|
+
the addresses that can open a resource right now. Notification recipients
|
|
72
|
+
come from history — stored mentions, past thread authors — and none of that
|
|
73
|
+
is an access grant, so mentioning an arbitrary address no longer mails it the
|
|
74
|
+
comment body and a revoked collaborator stops receiving the thread.
|
|
75
|
+
- `isOrgMember` (`@agent-native/core/org`) is now one exported resolver instead
|
|
76
|
+
of two private copies of the same query.
|
|
77
|
+
- Review threads now send comment, reply, and mention emails from core
|
|
78
|
+
(`notifyReviewComment`), so every app built on the review surface gets them.
|
|
79
|
+
`ReviewableResourceRegistration` gained an optional `resolveUrl` so those
|
|
80
|
+
emails can deep-link to the resource instead of the app root.
|
|
81
|
+
|
|
82
|
+
- f499dff: Add `@agent-native/core/vitest-config`, a base vitest config that caps a suite's
|
|
83
|
+
worker pool so concurrent test runs no longer oversubscribe the CPU. Defaults to
|
|
84
|
+
25% of cores; override with `VITEST_CONCURRENCY`. Every template and package
|
|
85
|
+
config merges it in.
|
|
86
|
+
|
|
87
|
+
### Patch Changes
|
|
88
|
+
|
|
89
|
+
- 72d7c5b: Prevent unreadable MCP client configuration files from being overwritten during setup.
|
|
90
|
+
- Updated dependencies [f499dff]
|
|
91
|
+
- @agent-native/recap-cli@0.5.2
|
|
92
|
+
- @agent-native/toolkit@0.12.2
|
|
93
|
+
|
|
94
|
+
## 0.134.2
|
|
95
|
+
|
|
96
|
+
### Patch Changes
|
|
97
|
+
|
|
98
|
+
- 10a204a: Brand transactional auth emails per app. Signup verification and password
|
|
99
|
+
reset emails now send from `<app-slug>@agent-native.com` with reply-to
|
|
100
|
+
agent-native@builder.io and per-app subjects/headings ("Verify your email for
|
|
101
|
+
Agent-Native <App>" / "Reset your Agent-Native <App> password"). The
|
|
102
|
+
verification email body also includes the app's one-line description (competitor
|
|
103
|
+
names reframed as "replacement"); the reset email omits the pitch since it's a
|
|
104
|
+
security email. Unknown apps fall back to the generic "Agent Native" branding.
|
|
105
|
+
|
|
106
|
+
The branded sender and reply-to are applied only when the configured
|
|
107
|
+
EMAIL_FROM is already on agent-native.com, so self-hosted deployments keep
|
|
108
|
+
their own verified sender and support mailbox.
|
|
109
|
+
|
|
110
|
+
## 0.134.1
|
|
111
|
+
|
|
112
|
+
### Patch Changes
|
|
113
|
+
|
|
114
|
+
- 6c165cd: Document the permission-aware Content database membership removal action.
|
|
115
|
+
|
|
3
116
|
## 0.134.0
|
|
4
117
|
|
|
5
118
|
### Minor Changes
|
|
@@ -278,7 +278,7 @@ Every operation is a TypeScript file in `templates/content/actions/`, auto-mount
|
|
|
278
278
|
|
|
279
279
|
**Comments** — `list-comments`, `add-comment`, `update-comment`, `delete-comment`.
|
|
280
280
|
|
|
281
|
-
**Databases, properties & views** — `create-content-database`, `create-inline-content-database`, `get-content-database`, `list-content-databases`, `delete-content-database`, `restore-content-database`, `list-trashed-content-databases`, `add-database-item`, `duplicate-database-item`, `duplicate-database-items`, `
|
|
281
|
+
**Databases, properties & views** — `create-content-database`, `create-inline-content-database`, `get-content-database`, `list-content-databases`, `delete-content-database`, `restore-content-database`, `list-trashed-content-databases`, `add-database-item`, `duplicate-database-item`, `duplicate-database-items`, `remove-database-items`, `move-database-item`, `update-content-database-view`, `get-content-database-personal-view`, `update-content-database-personal-view`, `list-document-properties`, `configure-document-property`, `set-document-property`, `duplicate-document-property`, `delete-document-property`, `reorder-document-property`, `submit-content-database-form`.
|
|
282
282
|
|
|
283
283
|
**External database sources** — `attach-content-database-source`, `disconnect-content-database-source`, `get-content-database-source`, `refresh-content-database-source`, `review-content-database-source-change-set`, `bind-content-database-source-field`, `add-content-database-source-field-property`, `suggest-source-join-key`, `list-notion-database-sources`, `list-builder-cms-models`. Builder's write-back path adds `prepare-builder-source-review`, `preview-builder-source-review`, `prepare-builder-source-execution`, `validate-builder-source-execution`, `execute-builder-source-execution`, `execute-builder-source-batch`, `cancel-prepared-builder-source-update`, `stage-builder-revision`, `stage-builder-source-bulk-update`, `materialize-builder-required-fields`, and `process-builder-body-hydration`.
|
|
284
284
|
|
package/corpus/core/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.135.0",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"default": "./dist/index.js"
|
|
62
62
|
},
|
|
63
63
|
"./vite": "./dist/vite/index.js",
|
|
64
|
+
"./vitest-config": "./dist/vitest-config.js",
|
|
64
65
|
"./server": "./dist/server/index.js",
|
|
65
66
|
"./server/edge": "./dist/server/edge.js",
|
|
66
67
|
"./server/entry-server": "./dist/server/entry-server.js",
|
|
@@ -326,7 +327,7 @@
|
|
|
326
327
|
"build": "tsc && tsc -p tsconfig.cli.json && node scripts/finalize-build.mjs && node scripts/check-dist-imports.mjs",
|
|
327
328
|
"dev": "tsc --watch",
|
|
328
329
|
"typecheck": "tsc --noEmit",
|
|
329
|
-
"test": "vitest --run --dir src
|
|
330
|
+
"test": "vitest --run --dir src",
|
|
330
331
|
"prepack": "tsx ../../scripts/sync-core-first-party-templates.ts && tsx ../../scripts/sync-workspace-core-skills.ts --check && npm run build && cp ../../README.md ./README.md",
|
|
331
332
|
"postpack": "tsx ../../scripts/sync-core-first-party-templates.ts --clean",
|
|
332
333
|
"prepublishOnly": "npm run build"
|
|
@@ -1,11 +1,13 @@
|
|
|
1
1
|
import { getDbExec } from "../db/client.js";
|
|
2
|
-
import { isValidCron, nextOccurrence } from "../jobs/cron.js";
|
|
2
|
+
import { isValidCron, isValidTimezone, nextOccurrence } from "../jobs/cron.js";
|
|
3
3
|
import {
|
|
4
4
|
buildJobResourceContent,
|
|
5
5
|
normalizeJobMcpTools,
|
|
6
6
|
parseJobResource,
|
|
7
7
|
type JobFrontmatter,
|
|
8
8
|
} from "../jobs/frontmatter.js";
|
|
9
|
+
import { deleteAutomationRuns } from "../jobs/run-history.js";
|
|
10
|
+
import { resolveUserSchedulingTimezone } from "../localization/user-timezone.js";
|
|
9
11
|
import {
|
|
10
12
|
organizationIdFromResourceOwner,
|
|
11
13
|
organizationResourceOwner,
|
|
@@ -49,6 +51,7 @@ export interface DefineAutomationInput {
|
|
|
49
51
|
triggerType: "schedule" | "event";
|
|
50
52
|
body: string;
|
|
51
53
|
schedule?: string;
|
|
54
|
+
timezone?: string;
|
|
52
55
|
event?: string;
|
|
53
56
|
condition?: string;
|
|
54
57
|
domain?: string;
|
|
@@ -68,6 +71,7 @@ export interface UpdateAutomationInput {
|
|
|
68
71
|
condition?: string | null;
|
|
69
72
|
delegatedPolicyId?: string | null;
|
|
70
73
|
schedule?: string;
|
|
74
|
+
timezone?: string;
|
|
71
75
|
model?: string | null;
|
|
72
76
|
mcpTools?: unknown;
|
|
73
77
|
}
|
|
@@ -309,9 +313,20 @@ export async function defineAutomation(
|
|
|
309
313
|
throw httpError("event is required for event-triggered automations.", 400);
|
|
310
314
|
}
|
|
311
315
|
|
|
316
|
+
if (input.timezone && !isValidTimezone(input.timezone)) {
|
|
317
|
+
throw httpError(`Unknown timezone "${input.timezone}".`, 400);
|
|
318
|
+
}
|
|
319
|
+
// Resolve now and persist it: a schedule whose zone is implicit means
|
|
320
|
+
// something different the moment it is read on a differently-zoned host.
|
|
321
|
+
const timezone =
|
|
322
|
+
input.triggerType === "schedule"
|
|
323
|
+
? input.timezone || (await resolveUserSchedulingTimezone(actor.userEmail))
|
|
324
|
+
: undefined;
|
|
325
|
+
|
|
312
326
|
const mcpTools = normalizeJobMcpTools(input.mcpTools);
|
|
313
327
|
const meta: JobFrontmatter = {
|
|
314
328
|
schedule: input.triggerType === "schedule" ? schedule : "",
|
|
329
|
+
timezone,
|
|
315
330
|
enabled: true,
|
|
316
331
|
triggerType: input.triggerType,
|
|
317
332
|
event: input.triggerType === "event" ? event : undefined,
|
|
@@ -324,7 +339,7 @@ export async function defineAutomation(
|
|
|
324
339
|
runAs: "creator",
|
|
325
340
|
nextRun:
|
|
326
341
|
input.triggerType === "schedule"
|
|
327
|
-
? nextOccurrence(schedule).toISOString()
|
|
342
|
+
? nextOccurrence(schedule, undefined, timezone).toISOString()
|
|
328
343
|
: undefined,
|
|
329
344
|
model: input.model?.trim() || undefined,
|
|
330
345
|
mcpTools: mcpTools?.length ? mcpTools : undefined,
|
|
@@ -365,7 +380,22 @@ export async function updateAutomation(
|
|
|
365
380
|
throw httpError(`Invalid cron expression "${input.schedule}".`, 400);
|
|
366
381
|
}
|
|
367
382
|
meta.schedule = input.schedule;
|
|
368
|
-
|
|
383
|
+
}
|
|
384
|
+
if (input.timezone !== undefined) {
|
|
385
|
+
if (!isValidTimezone(input.timezone)) {
|
|
386
|
+
throw httpError(`Unknown timezone "${input.timezone}".`, 400);
|
|
387
|
+
}
|
|
388
|
+
if (meta.triggerType !== "schedule") {
|
|
389
|
+
throw httpError("Event automations do not have a timezone.", 400);
|
|
390
|
+
}
|
|
391
|
+
meta.timezone = input.timezone;
|
|
392
|
+
}
|
|
393
|
+
if (input.schedule !== undefined || input.timezone !== undefined) {
|
|
394
|
+
meta.nextRun = nextOccurrence(
|
|
395
|
+
meta.schedule,
|
|
396
|
+
undefined,
|
|
397
|
+
meta.timezone,
|
|
398
|
+
).toISOString();
|
|
369
399
|
}
|
|
370
400
|
if (input.enabled !== undefined) {
|
|
371
401
|
meta.enabled = input.enabled;
|
|
@@ -374,7 +404,11 @@ export async function updateAutomation(
|
|
|
374
404
|
meta.triggerType === "schedule" &&
|
|
375
405
|
isValidCron(meta.schedule)
|
|
376
406
|
) {
|
|
377
|
-
meta.nextRun = nextOccurrence(
|
|
407
|
+
meta.nextRun = nextOccurrence(
|
|
408
|
+
meta.schedule,
|
|
409
|
+
undefined,
|
|
410
|
+
meta.timezone,
|
|
411
|
+
).toISOString();
|
|
378
412
|
}
|
|
379
413
|
}
|
|
380
414
|
if (input.condition !== undefined) {
|
|
@@ -417,6 +451,9 @@ export async function deleteAutomation(
|
|
|
417
451
|
);
|
|
418
452
|
}
|
|
419
453
|
await resourceDelete(definition.resource.id);
|
|
454
|
+
// Names are reusable, so leaving history behind would attach these runs to
|
|
455
|
+
// whatever automation is created under the same name next.
|
|
456
|
+
await deleteAutomationRuns(definition.resource.owner, name);
|
|
420
457
|
}
|
|
421
458
|
|
|
422
459
|
export interface AutomationExecutionIdentity {
|
|
@@ -259,6 +259,24 @@ export function configPathFor(
|
|
|
259
259
|
// JSON client configs (Claude Code, Claude Code CLI, Cowork)
|
|
260
260
|
// ---------------------------------------------------------------------------
|
|
261
261
|
|
|
262
|
+
/**
|
|
263
|
+
* Read an existing MCP config without conflating missing and unreadable files.
|
|
264
|
+
* Only ENOENT means the config is absent; any other read failure must abort
|
|
265
|
+
* before a caller can overwrite existing user configuration.
|
|
266
|
+
*/
|
|
267
|
+
function readExistingConfigFile(file: string): string | undefined {
|
|
268
|
+
try {
|
|
269
|
+
return fs.readFileSync(file, "utf-8");
|
|
270
|
+
} catch (error) {
|
|
271
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return undefined;
|
|
272
|
+
const detail = error instanceof Error ? ` (${error.message})` : "";
|
|
273
|
+
throw new Error(
|
|
274
|
+
`Cannot read MCP config file: ${file}\n` +
|
|
275
|
+
`Check that the file is readable and re-run. The file has not been modified.${detail}`,
|
|
276
|
+
);
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
262
280
|
/**
|
|
263
281
|
* Read and parse a JSON config file.
|
|
264
282
|
*
|
|
@@ -269,13 +287,8 @@ export function configPathFor(
|
|
|
269
287
|
* file with only the new MCP entry (data-loss hazard).
|
|
270
288
|
*/
|
|
271
289
|
function readJsonFile(file: string): Record<string, any> {
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
raw = fs.readFileSync(file, "utf-8");
|
|
275
|
-
} catch {
|
|
276
|
-
// Missing (ENOENT) or unreadable file — treat as empty.
|
|
277
|
-
return {};
|
|
278
|
-
}
|
|
290
|
+
const raw = readExistingConfigFile(file);
|
|
291
|
+
if (raw === undefined) return {};
|
|
279
292
|
if (!raw.trim()) return {};
|
|
280
293
|
try {
|
|
281
294
|
const parsed = JSON.parse(raw);
|
|
@@ -576,12 +589,7 @@ export function writeCodexBlock(
|
|
|
576
589
|
name: string,
|
|
577
590
|
block: string | null,
|
|
578
591
|
): void {
|
|
579
|
-
|
|
580
|
-
try {
|
|
581
|
-
content = fs.readFileSync(file, "utf-8");
|
|
582
|
-
} catch {
|
|
583
|
-
content = "";
|
|
584
|
-
}
|
|
592
|
+
const content = readExistingConfigFile(file) ?? "";
|
|
585
593
|
|
|
586
594
|
const lines = content.split(/\r?\n/);
|
|
587
595
|
const out: string[] = [];
|
|
@@ -616,14 +624,12 @@ export function writeCodexBlock(
|
|
|
616
624
|
}
|
|
617
625
|
|
|
618
626
|
export function codexHasBlock(file: string, name: string): boolean {
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
.some((line) => codexServerNameOfHeader(line) === name)
|
|
624
|
-
|
|
625
|
-
return false;
|
|
626
|
-
}
|
|
627
|
+
const content = readExistingConfigFile(file);
|
|
628
|
+
return (
|
|
629
|
+
content
|
|
630
|
+
?.split(/\r?\n/)
|
|
631
|
+
.some((line) => codexServerNameOfHeader(line) === name) ?? false
|
|
632
|
+
);
|
|
627
633
|
}
|
|
628
634
|
|
|
629
635
|
// ---------------------------------------------------------------------------
|