@agent-native/core 0.136.3 → 0.136.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/dist/client/agent-page/AgentJobsTab.js +19 -4
  2. package/dist/client/agent-page/use-jobs.d.ts +10 -0
  3. package/dist/client/agent-page/use-jobs.js +21 -0
  4. package/dist/collab/awareness.d.ts +2 -2
  5. package/dist/jobs/actions/run-automation-now.d.ts +6 -0
  6. package/dist/jobs/actions/run-automation-now.js +22 -0
  7. package/dist/jobs/background-automation-runner.d.ts +2 -0
  8. package/dist/jobs/background-automation-runner.js +22 -16
  9. package/dist/jobs/run-history.d.ts +17 -3
  10. package/dist/jobs/run-history.js +73 -7
  11. package/dist/jobs/run-now.d.ts +20 -0
  12. package/dist/jobs/run-now.js +99 -0
  13. package/dist/jobs/scheduler.d.ts +15 -0
  14. package/dist/jobs/scheduler.js +76 -12
  15. package/dist/localization/default-messages.d.ts +3 -0
  16. package/dist/localization/default-messages.js +3 -0
  17. package/dist/mcp/screen-memory-stdio.d.ts +7 -7
  18. package/dist/notifications/routes.d.ts +3 -3
  19. package/dist/observability/routes.d.ts +3 -3
  20. package/dist/provider-api/actions/custom-provider-registration.d.ts +12 -12
  21. package/dist/provider-api/actions/provider-api.d.ts +4 -4
  22. package/dist/provider-api/corpus-jobs.d.ts +2 -2
  23. package/dist/resources/handlers.d.ts +1 -1
  24. package/dist/secrets/routes.d.ts +3 -3
  25. package/dist/server/action-discovery.js +4 -0
  26. package/dist/server/agent-chat-plugin.js +135 -68
  27. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  28. package/dist/server/email-actions.d.ts +6 -3
  29. package/dist/server/email-actions.js +17 -83
  30. package/dist/server/email-markdown.d.ts +4 -0
  31. package/dist/server/email-markdown.js +174 -0
  32. package/dist/server/transcribe-voice.d.ts +1 -1
  33. package/dist/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -0
  34. package/dist/triggers/actions.d.ts +1 -1
  35. package/dist/triggers/actions.js +27 -5
  36. package/package.json +1 -1
  37. package/src/templates/workspace-core/.agents/skills/automations/SKILL.md +1 -0
@@ -2,6 +2,7 @@ import { resourceGetByPath, resourceListAllOwners, resourcePutIfCurrent, } from
2
2
  import { backgroundRunCutOffReason, isBackgroundAutomationRunActive, resolveBackgroundAutomationIdentity, runBackgroundAutomation, } from "./background-automation-runner.js";
3
3
  import { nextOccurrence, isValidCron, describeCron, effectiveTimezone, } from "./cron.js";
4
4
  import { buildJobResourceContent, parseJobResource, } from "./frontmatter.js";
5
+ import { claimAutomationRun, finishAutomationRun, getAutomationRun, } from "./run-history.js";
5
6
  // ─── Frontmatter parsing ────────────────────────────────────────────────────
6
7
  export { classifyJobFrontmatter, classifyJobResource, normalizeJobMcpTools, parseJobResource, } from "./frontmatter.js";
7
8
  export function parseJobFrontmatter(content) {
@@ -128,7 +129,7 @@ export async function processRecurringJobs(deps) {
128
129
  }
129
130
  }
130
131
  export const jobRunCutOffReason = backgroundRunCutOffReason;
131
- async function executeJob(resource, meta, body, deps, now) {
132
+ async function executeJob(resource, meta, body, deps, now, options = {}) {
132
133
  const jobName = resource.path.replace(/^jobs\//, "").replace(/\.md$/, "");
133
134
  const jobContext = {
134
135
  name: jobName,
@@ -156,17 +157,36 @@ async function executeJob(resource, meta, body, deps, now) {
156
157
  meta.lastError = identity.reason;
157
158
  if (!alreadyRecorded)
158
159
  await updateResource(resource, meta, body);
159
- return;
160
+ if (options.historyId) {
161
+ await finishAutomationRun(options.historyId, "error", `Automation did not run: ${identity.reason}. No delivery was confirmed.`);
162
+ }
163
+ return { status: "skipped", error: identity.reason };
160
164
  }
161
165
  const jobUserEmail = identity.identity.userEmail;
162
166
  const jobOrgId = identity.identity.orgId;
167
+ // Manual runs use the same resource row as scheduled runs for concurrency
168
+ // protection. The check is paired with the conditional write below: two
169
+ // requests that read the same idle snapshot cannot both claim it.
170
+ if (options.manual && isBackgroundAutomationRunActive(meta, now)) {
171
+ const error = "The automation is already running.";
172
+ if (options.historyId) {
173
+ await finishAutomationRun(options.historyId, "error", `${error} No delivery was confirmed.`);
174
+ }
175
+ return { status: "skipped", error };
176
+ }
163
177
  // Mark as running
164
178
  meta.lastRun = now.toISOString();
165
179
  meta.lastStatus = "running";
166
180
  meta.lastError = undefined;
167
181
  if (!(await updateResource(resource, meta, body))) {
168
182
  console.log(`[recurring-jobs] "${resource.path}" changed before it could start; dropping this tick.`);
169
- return;
183
+ if (options.historyId) {
184
+ await finishAutomationRun(options.historyId, "error", "The automation changed before the run could start. No delivery was confirmed.");
185
+ }
186
+ return {
187
+ status: "error",
188
+ error: "The automation changed before the run could start.",
189
+ };
170
190
  }
171
191
  const requestContext = meta.originScopeId && meta.deliveryPlatform && meta.deliveryDestination
172
192
  ? {
@@ -193,33 +213,74 @@ async function executeJob(resource, meta, body, deps, now) {
193
213
  }
194
214
  : undefined;
195
215
  try {
196
- await runBackgroundAutomation({
216
+ const result = await runBackgroundAutomation({
197
217
  automation: jobContext,
198
218
  ownerEmail: jobUserEmail,
199
219
  orgId: jobOrgId,
200
- prompt: `[Recurring Job: ${jobName}]\nSchedule: ${describeCron(meta.schedule, effectiveTimezone(meta.timezone))}\n\nExecute the following job instructions:\n\n${body}`,
201
- threadTitle: `Job: ${jobName} ${now.toLocaleDateString()}`,
202
- runIdPrefix: `job-${jobName}`,
203
- usageLabel: `recurring-job:${jobName}`,
220
+ prompt: options.manual
221
+ ? `[Manual Automation Run: ${jobName}]\nThis run was explicitly started by the automation owner. Execute the following instructions now:\n\n${body}`
222
+ : `[Recurring Job: ${jobName}]\nSchedule: ${describeCron(meta.schedule, effectiveTimezone(meta.timezone))}\n\nExecute the following job instructions:\n\n${body}`,
223
+ threadTitle: `${options.manual ? "Automation" : "Job"}: ${jobName} — ${now.toLocaleDateString()}`,
224
+ runIdPrefix: `${options.manual ? "manual" : "job"}-${jobName}`,
225
+ usageLabel: `${options.manual ? "manual-automation" : "recurring-job"}:${jobName}`,
204
226
  requestContext,
227
+ ...(options.historyId ? { historyId: options.historyId } : {}),
228
+ actionCaller: "automation",
205
229
  }, deps);
206
230
  await recordExecutionOutcome(resource, {
207
231
  lastRun: meta.lastRun,
208
232
  lastStatus: "success",
209
233
  lastError: undefined,
234
+ advanceSchedule: options.advanceSchedule,
210
235
  });
211
236
  console.log(`[recurring-jobs] Job "${jobName}" completed.`);
237
+ return { status: "success", runId: result.runId };
212
238
  }
213
239
  catch (err) {
214
240
  const lastError = err instanceof Error ? err.message.slice(0, 200) : "Unknown error";
241
+ const reportedError = `${lastError}. No delivery was confirmed.`;
215
242
  await recordExecutionOutcome(resource, {
216
243
  lastRun: meta.lastRun,
217
244
  lastStatus: "error",
218
- lastError,
245
+ lastError: reportedError,
246
+ advanceSchedule: options.advanceSchedule,
219
247
  });
220
- console.error(`[recurring-jobs] Job "${jobName}" failed:`, lastError);
248
+ console.error(`[recurring-jobs] Job "${jobName}" failed:`, reportedError);
249
+ return { status: "error", error: reportedError };
221
250
  }
222
251
  }
252
+ /** Execute one stored automation without changing its scheduled next run. */
253
+ export async function runJobNow(owner, name, deps, options = {}) {
254
+ const path = `jobs/${name}.md`;
255
+ const resource = await resourceGetByPath(owner, path);
256
+ if (!resource)
257
+ throw new Error(`Automation "${name}" not found.`);
258
+ const { meta, body } = parseJobFrontmatter(resource.content);
259
+ if (!body.trim())
260
+ throw new Error(`Automation "${name}" has no instructions.`);
261
+ return executeJob(resource, meta, body, deps, new Date(), {
262
+ advanceSchedule: false,
263
+ historyId: options.historyId,
264
+ manual: true,
265
+ });
266
+ }
267
+ /** Process a durable run-now history row exactly once in the background worker. */
268
+ export async function runQueuedAutomation(historyId, deps) {
269
+ const queued = await getAutomationRun(historyId);
270
+ if (!queued)
271
+ throw new Error(`Automation run "${historyId}" not found.`);
272
+ if (!(await claimAutomationRun(historyId))) {
273
+ return { skipped: true };
274
+ }
275
+ const result = await runJobNow(queued.owner, queued.automation, deps, {
276
+ historyId,
277
+ });
278
+ return {
279
+ skipped: false,
280
+ ...(result.runId ? { runId: result.runId } : {}),
281
+ ...(result.error ? { error: result.error } : {}),
282
+ };
283
+ }
223
284
  async function updateResource(resource, meta, body) {
224
285
  const content = buildJobContent(meta, body);
225
286
  const written = await resourcePutIfCurrent({
@@ -256,8 +317,11 @@ async function recordExecutionOutcome(resource, outcome) {
256
317
  return;
257
318
  }
258
319
  const current = parseJobResource(latest.content);
259
- const meta = { ...current.meta, ...outcome };
260
- if (meta.schedule && isValidCron(meta.schedule)) {
320
+ const { advanceSchedule, ...execution } = outcome;
321
+ const meta = { ...current.meta, ...execution };
322
+ if (advanceSchedule !== false &&
323
+ meta.schedule &&
324
+ isValidCron(meta.schedule)) {
261
325
  // Measured from completion so a long run cannot immediately re-fire.
262
326
  meta.nextRun = nextOccurrence(meta.schedule, new Date(), meta.timezone).toISOString();
263
327
  }
@@ -562,6 +562,9 @@ declare const messages: {
562
562
  eventTrigger: string;
563
563
  deleteAutomationTitle: string;
564
564
  deleteAutomationDescription: string;
565
+ runNow: string;
566
+ runNowTitle: string;
567
+ runNowDescription: string;
565
568
  automationDetails: string;
566
569
  automationEventDetails: string;
567
570
  condition: string;
@@ -567,6 +567,9 @@ const messages = {
567
567
  eventTrigger: "Event-triggered",
568
568
  deleteAutomationTitle: "Delete automation?",
569
569
  deleteAutomationDescription: "This permanently removes the automation and cannot be undone.",
570
+ runNow: "Run now",
571
+ runNowTitle: "Run automation now?",
572
+ runNowDescription: "This runs the automation's real actions immediately. It may send messages or change data, and it will not change the next scheduled run.",
570
573
  automationDetails: "Automation details",
571
574
  automationEventDetails: "Runs when {{event}}.",
572
575
  condition: "Condition",
@@ -137,13 +137,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
137
137
  inputSchema: {
138
138
  type: string;
139
139
  properties: {
140
+ count?: undefined;
140
141
  query?: undefined;
141
142
  minutes?: undefined;
142
143
  limit?: undefined;
143
144
  clientHint?: undefined;
144
145
  timestamp?: undefined;
145
146
  chapterId?: undefined;
146
- count?: undefined;
147
147
  startAt?: undefined;
148
148
  endAt?: undefined;
149
149
  reason?: undefined;
@@ -159,6 +159,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
159
159
  inputSchema: {
160
160
  type: string;
161
161
  properties: {
162
+ count?: undefined;
162
163
  query: {
163
164
  type: string;
164
165
  description: string;
@@ -174,7 +175,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
174
175
  clientHint?: undefined;
175
176
  timestamp?: undefined;
176
177
  chapterId?: undefined;
177
- count?: undefined;
178
178
  startAt?: undefined;
179
179
  endAt?: undefined;
180
180
  reason?: undefined;
@@ -190,6 +190,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
190
190
  inputSchema: {
191
191
  type: string;
192
192
  properties: {
193
+ count?: undefined;
193
194
  minutes: {
194
195
  type: string;
195
196
  description: string;
@@ -199,7 +200,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
199
200
  clientHint?: undefined;
200
201
  timestamp?: undefined;
201
202
  chapterId?: undefined;
202
- count?: undefined;
203
203
  startAt?: undefined;
204
204
  endAt?: undefined;
205
205
  reason?: undefined;
@@ -216,6 +216,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
216
216
  type: string;
217
217
  required: string[];
218
218
  properties: {
219
+ count?: undefined;
219
220
  query: {
220
221
  type: string;
221
222
  description: string;
@@ -234,7 +235,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
234
235
  };
235
236
  timestamp?: undefined;
236
237
  chapterId?: undefined;
237
- count?: undefined;
238
238
  startAt?: undefined;
239
239
  endAt?: undefined;
240
240
  reason?: undefined;
@@ -250,6 +250,7 @@ export declare function screenMemoryMcpToolDefinitions(): ({
250
250
  type: string;
251
251
  required: string[];
252
252
  properties: {
253
+ count?: undefined;
253
254
  query?: undefined;
254
255
  minutes?: undefined;
255
256
  limit?: undefined;
@@ -263,7 +264,6 @@ export declare function screenMemoryMcpToolDefinitions(): ({
263
264
  description: string;
264
265
  };
265
266
  chapterId?: undefined;
266
- count?: undefined;
267
267
  startAt?: undefined;
268
268
  endAt?: undefined;
269
269
  includeMicrophone?: undefined;
@@ -314,13 +314,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
314
314
  type: string;
315
315
  required: string[];
316
316
  properties: {
317
+ count?: undefined;
317
318
  query?: undefined;
318
319
  minutes?: undefined;
319
320
  limit?: undefined;
320
321
  clientHint?: undefined;
321
322
  timestamp?: undefined;
322
323
  chapterId?: undefined;
323
- count?: undefined;
324
324
  startAt: {
325
325
  type: string;
326
326
  description: string;
@@ -349,13 +349,13 @@ export declare function screenMemoryMcpToolDefinitions(): ({
349
349
  type: string;
350
350
  required: string[];
351
351
  properties: {
352
+ count?: undefined;
352
353
  query?: undefined;
353
354
  minutes?: undefined;
354
355
  limit?: undefined;
355
356
  clientHint?: undefined;
356
357
  timestamp?: undefined;
357
358
  chapterId?: undefined;
358
- count?: undefined;
359
359
  startAt?: undefined;
360
360
  endAt?: undefined;
361
361
  reason?: undefined;
@@ -13,13 +13,13 @@
13
13
  export declare function createNotificationsHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<"" | import("./types.js").Notification[] | {
14
14
  count: number;
15
15
  updated?: undefined;
16
- error?: undefined;
17
16
  ok?: undefined;
17
+ error?: undefined;
18
18
  } | {
19
19
  count?: undefined;
20
20
  updated: number;
21
- error?: undefined;
22
21
  ok?: undefined;
22
+ error?: undefined;
23
23
  } | {
24
24
  count?: undefined;
25
25
  updated?: undefined;
@@ -28,7 +28,7 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
28
28
  } | {
29
29
  count?: undefined;
30
30
  updated?: undefined;
31
- error?: undefined;
32
31
  ok: boolean;
32
+ error?: undefined;
33
33
  }>>;
34
34
  //# sourceMappingURL=routes.d.ts.map
@@ -41,16 +41,16 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
41
41
  thumbsUpRate: number;
42
42
  avgEvalScore: number;
43
43
  } | {
44
- error?: undefined;
45
44
  summary: import("./types.js").TraceSummary;
46
45
  spans: import("./types.js").TraceSpan[];
47
46
  id?: undefined;
47
+ error?: undefined;
48
48
  ok?: undefined;
49
49
  } | {
50
- error?: undefined;
51
50
  summary?: undefined;
52
51
  spans?: undefined;
53
52
  id: string;
53
+ error?: undefined;
54
54
  ok?: undefined;
55
55
  } | {
56
56
  summary?: undefined;
@@ -59,10 +59,10 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
59
59
  error: any;
60
60
  ok?: undefined;
61
61
  } | {
62
- error?: undefined;
63
62
  summary?: undefined;
64
63
  spans?: undefined;
65
64
  id?: undefined;
65
+ error?: undefined;
66
66
  ok: boolean;
67
67
  }>>;
68
68
  //# sourceMappingURL=routes.d.ts.map
@@ -75,10 +75,8 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
75
75
  user: "user";
76
76
  }>>;
77
77
  }, z.core.$strip>>, {
78
- message?: undefined;
79
- id?: undefined;
80
- found?: undefined;
81
78
  deleted?: undefined;
79
+ found?: undefined;
82
80
  providers: {
83
81
  id: string;
84
82
  label: string;
@@ -91,42 +89,44 @@ export declare function createCustomProviderRegistrationAction<TSchema extends Z
91
89
  count: number;
92
90
  provider?: undefined;
93
91
  registered?: undefined;
92
+ id?: undefined;
94
93
  label?: undefined;
95
- } | {
96
94
  message?: undefined;
97
- id?: undefined;
95
+ } | {
98
96
  deleted?: undefined;
99
- providers?: undefined;
100
97
  count?: undefined;
98
+ providers?: undefined;
101
99
  found: boolean;
102
100
  provider: import("../custom-registry.js").CustomProviderConfig;
103
101
  registered?: undefined;
102
+ id?: undefined;
104
103
  label?: undefined;
105
- } | {
106
104
  message?: undefined;
105
+ } | {
107
106
  deleted?: undefined;
108
- providers?: undefined;
109
107
  count?: undefined;
108
+ providers?: undefined;
110
109
  provider?: undefined;
111
110
  found: boolean;
112
111
  id: string;
113
112
  registered?: undefined;
114
113
  label?: undefined;
115
- } | {
116
114
  message?: undefined;
115
+ } | {
116
+ count?: undefined;
117
117
  found?: undefined;
118
118
  providers?: undefined;
119
- count?: undefined;
120
119
  provider?: undefined;
121
120
  deleted: boolean;
122
121
  id: string;
123
122
  registered?: undefined;
124
123
  label?: undefined;
124
+ message?: undefined;
125
125
  } | {
126
- found?: undefined;
127
126
  deleted?: undefined;
128
- providers?: undefined;
129
127
  count?: undefined;
128
+ found?: undefined;
129
+ providers?: undefined;
130
130
  provider?: undefined;
131
131
  registered: boolean;
132
132
  id: string;
@@ -329,9 +329,9 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
329
329
  label?: undefined;
330
330
  message?: undefined;
331
331
  } | {
332
- count?: undefined;
333
332
  id?: undefined;
334
333
  deleted?: undefined;
334
+ count?: undefined;
335
335
  providers?: undefined;
336
336
  found: boolean;
337
337
  provider: import("../custom-registry.js").CustomProviderConfig;
@@ -339,9 +339,9 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
339
339
  label?: undefined;
340
340
  message?: undefined;
341
341
  } | {
342
- count?: undefined;
343
342
  provider?: undefined;
344
343
  deleted?: undefined;
344
+ count?: undefined;
345
345
  providers?: undefined;
346
346
  found: boolean;
347
347
  id: string;
@@ -349,9 +349,9 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
349
349
  label?: undefined;
350
350
  message?: undefined;
351
351
  } | {
352
- count?: undefined;
353
352
  provider?: undefined;
354
353
  found?: undefined;
354
+ count?: undefined;
355
355
  providers?: undefined;
356
356
  deleted: boolean;
357
357
  id: string;
@@ -359,10 +359,10 @@ export declare function createProviderApiActions(runtime: Pick<ProviderApiRuntim
359
359
  label?: undefined;
360
360
  message?: undefined;
361
361
  } | {
362
- count?: undefined;
363
362
  provider?: undefined;
364
363
  deleted?: undefined;
365
364
  found?: undefined;
365
+ count?: undefined;
366
366
  providers?: undefined;
367
367
  registered: boolean;
368
368
  id: string;
@@ -73,6 +73,7 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
73
73
  offset?: unknown;
74
74
  limit?: unknown;
75
75
  }, {
76
+ deleted?: undefined;
76
77
  jobs: {
77
78
  id: string;
78
79
  name: string;
@@ -83,7 +84,6 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
83
84
  updatedAt: string;
84
85
  }[];
85
86
  total: number;
86
- deleted?: undefined;
87
87
  jobId?: undefined;
88
88
  } | {
89
89
  jobs?: undefined;
@@ -91,9 +91,9 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
91
91
  deleted: boolean;
92
92
  jobId: string;
93
93
  } | {
94
+ deleted?: undefined;
94
95
  jobs?: undefined;
95
96
  total?: undefined;
96
- deleted?: undefined;
97
97
  jobId?: undefined;
98
98
  hits: Record<string, unknown>[];
99
99
  offset: number;
@@ -48,8 +48,8 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
48
48
  }>;
49
49
  /** DELETE /_agent-native/resources/:id — delete a resource */
50
50
  export declare function handleDeleteResource(event: any): Promise<{
51
- error: string;
52
51
  ok?: undefined;
52
+ error: string;
53
53
  } | {
54
54
  error?: undefined;
55
55
  ok: boolean;
@@ -34,16 +34,16 @@ export declare function createListSecretsHandler(): import("h3").EventHandlerWit
34
34
  /** POST /_agent-native/secrets/:key — write a secret. */
35
35
  export declare function createWriteSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
36
36
  error: string;
37
- status?: undefined;
38
37
  ok?: undefined;
38
+ status?: undefined;
39
39
  } | {
40
40
  error?: undefined;
41
41
  ok: boolean;
42
42
  status: string;
43
43
  } | {
44
+ ok?: undefined;
44
45
  error: string;
45
46
  removed?: undefined;
46
- ok?: undefined;
47
47
  } | {
48
48
  error?: undefined;
49
49
  ok: boolean;
@@ -54,9 +54,9 @@ export declare function createWriteSecretHandler(): import("h3").EventHandlerWit
54
54
  * current stored value without changing anything. Useful for the "Test" button.
55
55
  */
56
56
  export declare function createTestSecretHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<{
57
+ ok?: undefined;
57
58
  error: string;
58
59
  note?: undefined;
59
- ok?: undefined;
60
60
  } | {
61
61
  error?: undefined;
62
62
  ok: boolean;
@@ -540,6 +540,10 @@ export async function mergeCoreSharingActions(registry) {
540
540
  "manage-recurring-job",
541
541
  () => import("../jobs/actions/manage-recurring-job.js"),
542
542
  ],
543
+ [
544
+ "run-automation-now",
545
+ () => import("../jobs/actions/run-automation-now.js"),
546
+ ],
543
547
  [
544
548
  "list-automation-runs",
545
549
  () => import("../jobs/actions/list-automation-runs.js"),