Minor Changes
-
41544d8: Fix the Automations page reporting runs that never happened, and add run history and schedule editing.
A scheduler or dispatcher tick that declined to run an automation used to stamp
lastRunwith the current time, so a permanently blocked automation reported a
fresh run every minute while itsnextRunstayed frozen in the past. Skipped
ticks now recordlastCheckinstead, leavelastRunalone, and only rewrite the
resource when the failure state actually changes. The failure reason
(lastError) is surfaced on the row and in the details view instead of being
swallowed behind a bareskippedchip.Schedules are also timezone-aware. Cron expressions used to be read in the
server's zone, so an automation created as "every day at 8am" ran at 8am UTC.
A schedule now stores the IANA zone it was written in, taken from a new
scheduling timezone preference in Account settings and falling back to the
caller's browser zone. Descriptions name their zone ("Every day at 8 AM
(America/New_York)"), and both the agent tools and the schedule editor accept a
timezone. Existing schedules keep their current host-relative meaning until
edited.Also adds:
automation_runshistory for real executions, exposed through a new
list-automation-runsaction and a Past runs section in the details view.- A Details view that shows more than the list row: schedule, next/last run,
last checked, last status, scope, creator and model. - An Edit affordance for changing a scheduled automation's cron expression and
timezone. - A "Manage agent" entry in the sidebar organization switcher.
Run history is bounded and honest about interrupted runs: a row left
running
past the point a run could still be alive is reported asinterruptedrather
than shown as permanently in-flight, and rows are pruned per automation so a
frequent schedule cannot grow the table without limit. Recording a run's
outcome also re-reads the automation first, so a schedule edited while it was
running is no longer reverted by the completion write.Also from review: a completion write no longer recreates an automation deleted
mid-run, a run-history write failure can no longer reclassify a completed
automation as failed, deleting an automation forgets its run history so a new
one reusing the name does not inherit it, an unusableX-User-Timezoneheader
is rejected rather than persisted, and a settings read failure surfaces instead
of silently pinning a schedule to the host zone.Run history never blocks the automation it describes: opening the record,
attaching its thread and closing it out are all non-fatal, so an unwritable
history table costs the record rather than the run. -
8c37661: Add shared settings and activity-notification primitives.
SettingsGroup/SettingsRow(@agent-native/core/client/settings) render
several one-line settings inside a single card instead of one card per
control. Each row keeps its ownid, so existing settings-search hashes
still resolve after a card collapses into a row.resolveActivityRecipientsandnotifyActivity
(@agent-native/core/server) resolve who should receive a collaboration
email — owner, thread participants, mentions, never the actor — filter them
by an app-owned preference key, and report delivery asdelivered,
delivery-failed,no-recipients,email-not-configured, or
notification-errorrather than collapsing them into an empty success. A
batch where every send threw is reported asdelivery-failed, never as a
delivery.runActivityNotification(@agent-native/core/server) runs a notification
without letting it reject the write that caused it. The comment is already
persisted when notification runs, so throwing made the client retry and
duplicate the row; the failure now surfaces asnotification-error.filterRecipientsByResourceAccess(@agent-native/core/sharing) keeps only
the addresses that can open a resource right now. Notification recipients
come from history — stored mentions, past thread authors — and none of that
is an access grant, so mentioning an arbitrary address no longer mails it the
comment body and a revoked collaborator stops receiving the thread.isOrgMember(@agent-native/core/org) is now one exported resolver instead
of two private copies of the same query.- Review threads now send comment, reply, and mention emails from core
(notifyReviewComment), so every app built on the review surface gets them.
ReviewableResourceRegistrationgained an optionalresolveUrlso those
emails can deep-link to the resource instead of the app root.
-
f499dff: Add
@agent-native/core/vitest-config, a base vitest config that caps a suite's
worker pool so concurrent test runs no longer oversubscribe the CPU. Defaults to
25% of cores; override withVITEST_CONCURRENCY. Every template and package
config merges it in.