@agent-native/core 0.146.3 → 0.146.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 (206) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +13 -10
  3. package/corpus/templates/analytics/.agents/skills/self-modifying-code/SKILL.md +7 -3
  4. package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  5. package/corpus/templates/analytics/actions/compose-dashboard.ts +53 -6
  6. package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +8 -2
  7. package/corpus/templates/analytics/actions/migrate-first-party-analytics-to-bigquery.ts +3 -1
  8. package/corpus/templates/analytics/actions/mutate-dashboard.ts +48 -9
  9. package/corpus/templates/analytics/actions/update-dashboard.ts +80 -6
  10. package/corpus/templates/analytics/changelog/2026-08-07-dashboard-creation-and-edits-now-save-faster-with-reliable-s.md +6 -0
  11. package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +19 -19
  12. package/corpus/templates/analytics/server/jobs/analytics-bigquery-backfill.ts +21 -2
  13. package/corpus/templates/analytics/server/lib/bigquery.ts +59 -24
  14. package/corpus/templates/analytics/server/lib/canonical-first-party-dashboard-repair.ts +44 -8
  15. package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +3 -5
  16. package/corpus/templates/analytics/server/lib/first-party-analytics-backend.ts +33 -69
  17. package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +90 -24
  18. package/corpus/templates/analytics/server/lib/real-data-actions.ts +1 -1
  19. package/corpus/templates/analytics/server/plugins/agent-chat.ts +17 -2
  20. package/corpus/templates/analytics/shared/dashboard-report-timeouts.ts +2 -0
  21. package/corpus/templates/assets/.agents/skills/self-modifying-code/SKILL.md +7 -3
  22. package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  23. package/corpus/templates/assets/netlify.toml +1 -1
  24. package/corpus/templates/assets/package.json +1 -0
  25. package/corpus/templates/assets/scripts/migrate-production.ts +24 -0
  26. package/corpus/templates/assets/server/plugins/db.ts +1 -1
  27. package/corpus/templates/assets/tsconfig.json +1 -0
  28. package/corpus/templates/brain/.agents/skills/self-modifying-code/SKILL.md +7 -3
  29. package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  30. package/corpus/templates/brain/netlify.toml +1 -1
  31. package/corpus/templates/brain/package.json +2 -0
  32. package/corpus/templates/brain/scripts/migrate-production.ts +24 -0
  33. package/corpus/templates/brain/server/plugins/db.ts +1 -1
  34. package/corpus/templates/brain/tsconfig.json +1 -0
  35. package/corpus/templates/calendar/.agents/skills/self-modifying-code/SKILL.md +7 -3
  36. package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  37. package/corpus/templates/calendar/netlify.toml +1 -1
  38. package/corpus/templates/calendar/package.json +1 -0
  39. package/corpus/templates/calendar/scripts/migrate-production.ts +24 -0
  40. package/corpus/templates/calendar/server/plugins/db.ts +1 -1
  41. package/corpus/templates/calendar/tsconfig.json +1 -0
  42. package/corpus/templates/chat/.agents/skills/self-modifying-code/SKILL.md +7 -3
  43. package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  44. package/corpus/templates/chat/netlify.toml +1 -1
  45. package/corpus/templates/chat/package.json +1 -0
  46. package/corpus/templates/chat/scripts/migrate-production.ts +31 -0
  47. package/corpus/templates/chat/tsconfig.json +1 -0
  48. package/corpus/templates/clips/.agents/skills/self-modifying-code/SKILL.md +7 -3
  49. package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  50. package/corpus/templates/clips/netlify.toml +1 -1
  51. package/corpus/templates/clips/package.json +1 -0
  52. package/corpus/templates/clips/scripts/migrate-production.ts +24 -0
  53. package/corpus/templates/clips/server/plugins/db.ts +1 -1
  54. package/corpus/templates/clips/tsconfig.json +1 -0
  55. package/corpus/templates/content/.agents/skills/self-modifying-code/SKILL.md +7 -3
  56. package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  57. package/corpus/templates/content/netlify.toml +1 -1
  58. package/corpus/templates/content/package.json +2 -0
  59. package/corpus/templates/content/scripts/migrate-production.ts +28 -0
  60. package/corpus/templates/content/server/plugins/db.ts +2 -2
  61. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  62. package/corpus/templates/crm/netlify.toml +1 -1
  63. package/corpus/templates/crm/package.json +2 -0
  64. package/corpus/templates/crm/scripts/migrate-production.ts +24 -0
  65. package/corpus/templates/crm/server/plugins/db.ts +1 -1
  66. package/corpus/templates/crm/tsconfig.json +1 -0
  67. package/corpus/templates/design/.agents/skills/self-modifying-code/SKILL.md +7 -3
  68. package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  69. package/corpus/templates/design/netlify.toml +1 -1
  70. package/corpus/templates/design/package.json +1 -0
  71. package/corpus/templates/design/scripts/migrate-production.ts +24 -0
  72. package/corpus/templates/design/server/plugins/db.ts +1 -1
  73. package/corpus/templates/design/tsconfig.json +1 -0
  74. package/corpus/templates/dispatch/.agents/skills/self-modifying-code/SKILL.md +7 -3
  75. package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  76. package/corpus/templates/dispatch/netlify.toml +1 -1
  77. package/corpus/templates/dispatch/package.json +1 -0
  78. package/corpus/templates/dispatch/scripts/migrate-production.ts +23 -0
  79. package/corpus/templates/dispatch/tsconfig.json +1 -0
  80. package/corpus/templates/factory/.agents/skills/self-modifying-code/SKILL.md +7 -3
  81. package/corpus/templates/factory/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  82. package/corpus/templates/factory/netlify.toml +1 -1
  83. package/corpus/templates/factory/package.json +1 -0
  84. package/corpus/templates/factory/scripts/migrate-production.ts +31 -0
  85. package/corpus/templates/factory/server/plugins/factory-scheduler-job.ts +2 -0
  86. package/corpus/templates/factory/tsconfig.json +1 -0
  87. package/corpus/templates/forms/.agents/skills/self-modifying-code/SKILL.md +7 -3
  88. package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  89. package/corpus/templates/forms/netlify.toml +1 -1
  90. package/corpus/templates/forms/package.json +2 -0
  91. package/corpus/templates/forms/scripts/migrate-production.ts +24 -0
  92. package/corpus/templates/forms/server/plugins/db.ts +1 -1
  93. package/corpus/templates/forms/tsconfig.json +1 -0
  94. package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  95. package/corpus/templates/macros/netlify.toml +1 -1
  96. package/corpus/templates/macros/package.json +1 -0
  97. package/corpus/templates/macros/scripts/migrate-production.ts +24 -0
  98. package/corpus/templates/macros/server/plugins/db.ts +1 -1
  99. package/corpus/templates/macros/tsconfig.json +1 -0
  100. package/corpus/templates/mail/.agents/skills/self-modifying-code/SKILL.md +7 -3
  101. package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  102. package/corpus/templates/mail/netlify.toml +1 -1
  103. package/corpus/templates/mail/package.json +1 -0
  104. package/corpus/templates/mail/scripts/migrate-production.ts +24 -0
  105. package/corpus/templates/mail/server/plugins/db.ts +1 -1
  106. package/corpus/templates/mail/tsconfig.json +1 -0
  107. package/corpus/templates/plan/.agents/skills/self-modifying-code/SKILL.md +7 -3
  108. package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  109. package/corpus/templates/plan/netlify.toml +1 -1
  110. package/corpus/templates/plan/package.json +1 -0
  111. package/corpus/templates/plan/scripts/migrate-production.ts +24 -0
  112. package/corpus/templates/plan/server/plugins/00-mcp.ts +3 -2
  113. package/corpus/templates/plan/server/plugins/db.ts +1 -1
  114. package/corpus/templates/plan/tsconfig.json +1 -0
  115. package/corpus/templates/slides/.agents/skills/self-modifying-code/SKILL.md +7 -3
  116. package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  117. package/corpus/templates/slides/netlify.toml +1 -1
  118. package/corpus/templates/slides/package.json +1 -0
  119. package/corpus/templates/slides/scripts/migrate-production.ts +24 -0
  120. package/corpus/templates/slides/server/plugins/db.ts +1 -1
  121. package/corpus/templates/slides/tsconfig.json +1 -0
  122. package/corpus/templates/tasks/.agents/skills/self-modifying-code/SKILL.md +7 -3
  123. package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  124. package/corpus/templates/tasks/netlify.toml +1 -1
  125. package/corpus/templates/tasks/package.json +1 -0
  126. package/corpus/templates/tasks/scripts/migrate-production.ts +24 -0
  127. package/corpus/templates/tasks/server/plugins/db.ts +1 -1
  128. package/corpus/templates/tasks/tsconfig.json +1 -0
  129. package/dist/action.d.ts +2 -0
  130. package/dist/agent/production-agent.d.ts +1 -0
  131. package/dist/agent/production-agent.js +2 -0
  132. package/dist/agent/thread-data-builder.d.ts +4 -0
  133. package/dist/agent/thread-data-builder.js +44 -0
  134. package/dist/automations/service.d.ts +1 -0
  135. package/dist/automations/service.js +21 -2
  136. package/dist/cli/create.js +20 -2
  137. package/dist/client/agent-page/AgentJobsTab.js +3 -1
  138. package/dist/client/agent-page/AutomationDetailsDialog.js +9 -2
  139. package/dist/collab/awareness.d.ts +2 -2
  140. package/dist/collab/struct-routes.d.ts +1 -1
  141. package/dist/db/migrations.js +7 -13
  142. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  143. package/dist/jobs/actions/list-automation-runs.d.ts +1 -0
  144. package/dist/jobs/actions/list-automation-runs.js +9 -2
  145. package/dist/jobs/actions/list-recurring-jobs.js +3 -1
  146. package/dist/jobs/actions/manage-recurring-job.js +1 -1
  147. package/dist/jobs/actions/run-automation-now.js +1 -0
  148. package/dist/jobs/background-automation-runner.js +2 -0
  149. package/dist/jobs/frontmatter.d.ts +2 -0
  150. package/dist/jobs/frontmatter.js +4 -0
  151. package/dist/jobs/run-history.d.ts +4 -0
  152. package/dist/jobs/run-history.js +28 -8
  153. package/dist/jobs/run-now.d.ts +4 -1
  154. package/dist/jobs/run-now.js +4 -3
  155. package/dist/jobs/scheduler.js +18 -0
  156. package/dist/jobs/tools.d.ts +3 -2
  157. package/dist/jobs/tools.js +26 -12
  158. package/dist/localization/default-messages.d.ts +1 -0
  159. package/dist/localization/default-messages.js +1 -0
  160. package/dist/notifications/routes.d.ts +2 -2
  161. package/dist/observability/routes.d.ts +3 -3
  162. package/dist/progress/routes.d.ts +1 -1
  163. package/dist/resources/handlers.d.ts +1 -1
  164. package/dist/server/action-routes.d.ts +2 -0
  165. package/dist/server/action-routes.js +1 -0
  166. package/dist/server/agent-chat-plugin.js +3 -2
  167. package/dist/server/builder-browser.js +24 -8
  168. package/dist/server/transcribe-voice.d.ts +1 -1
  169. package/dist/templates/chat/.agents/skills/self-modifying-code/SKILL.md +7 -3
  170. package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  171. package/dist/templates/chat/netlify.toml +1 -1
  172. package/dist/templates/chat/package.json +1 -0
  173. package/dist/templates/chat/scripts/migrate-production.ts +31 -0
  174. package/dist/templates/chat/tsconfig.json +1 -0
  175. package/dist/templates/default/.agents/skills/self-modifying-code/SKILL.md +7 -3
  176. package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  177. package/dist/templates/default/package.json +1 -0
  178. package/dist/templates/default/scripts/migrate-production.ts +31 -0
  179. package/dist/templates/default/tsconfig.json +1 -0
  180. package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  181. package/dist/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +7 -3
  182. package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  183. package/dist/templates/workspace-root/AGENTS.md +2 -1
  184. package/dist/triggers/actions/list-automations.js +1 -1
  185. package/dist/triggers/actions/manage-automation.js +5 -1
  186. package/dist/triggers/actions.d.ts +1 -1
  187. package/dist/triggers/actions.js +21 -15
  188. package/dist/triggers/dispatcher.js +17 -2
  189. package/dist/triggers/routes.d.ts +1 -0
  190. package/dist/triggers/routes.js +1 -0
  191. package/package.json +1 -1
  192. package/src/templates/chat/.agents/skills/self-modifying-code/SKILL.md +7 -3
  193. package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  194. package/src/templates/chat/netlify.toml +1 -1
  195. package/src/templates/chat/package.json +1 -0
  196. package/src/templates/chat/scripts/migrate-production.ts +31 -0
  197. package/src/templates/chat/tsconfig.json +1 -0
  198. package/src/templates/default/.agents/skills/self-modifying-code/SKILL.md +7 -3
  199. package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  200. package/src/templates/default/package.json +1 -0
  201. package/src/templates/default/scripts/migrate-production.ts +31 -0
  202. package/src/templates/default/tsconfig.json +1 -0
  203. package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  204. package/src/templates/workspace-core/.agents/skills/self-modifying-code/SKILL.md +7 -3
  205. package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +5 -2
  206. package/src/templates/workspace-root/AGENTS.md +2 -1
@@ -14,6 +14,12 @@ function getOwner() {
14
14
  function getSharedOwner() {
15
15
  return sharedResourceOwner(getRequestOrgId());
16
16
  }
17
+ export function jobBelongsToApp(meta, appId) {
18
+ const ownerAppId = meta.appId?.trim();
19
+ if (!ownerAppId)
20
+ return true;
21
+ return ownerAppId === appId?.trim();
22
+ }
17
23
  /**
18
24
  * Determine if the current request's user is an org owner/admin in the
19
25
  * given org. Used to allow privileged users to update or delete shared
@@ -52,7 +58,10 @@ async function isCurrentUserOrgAdmin(orgId) {
52
58
  * Returns null when the mutation is allowed, or an error string suitable
53
59
  * for returning to the caller when not.
54
60
  */
55
- export async function authorizeJobMutation(resourceOwner, meta) {
61
+ export async function authorizeJobMutation(resourceOwner, meta, appId) {
62
+ if (!jobBelongsToApp(meta, appId)) {
63
+ return "This job belongs to another app and cannot be changed here.";
64
+ }
56
65
  const resourceOrgId = organizationIdFromResourceOwner(resourceOwner);
57
66
  if (resourceOwner !== SHARED_OWNER && !resourceOrgId) {
58
67
  // Personal-scope job — owner is the request's user. resourceGetByPath is
@@ -69,7 +78,7 @@ export async function authorizeJobMutation(resourceOwner, meta) {
69
78
  return null;
70
79
  return "Only the job's creator (or an org admin) can update or delete it.";
71
80
  }
72
- async function runCreate(args) {
81
+ async function runCreate(args, appId) {
73
82
  const { name, schedule, instructions, scope, runAs, model } = args;
74
83
  const requestedTimezone = args.timezone;
75
84
  if (!name || !schedule || !instructions) {
@@ -111,6 +120,7 @@ async function runCreate(args) {
111
120
  enabled: true,
112
121
  createdBy: getOwner(),
113
122
  orgId: getRequestOrgId() || undefined,
123
+ appId: appId?.trim() || undefined,
114
124
  runAs: runAs === "shared" ? "shared" : "creator",
115
125
  nextRun: next.toISOString(),
116
126
  ...(integration?.scopeId ? { originScopeId: integration.scopeId } : {}),
@@ -143,7 +153,7 @@ async function runCreate(args) {
143
153
  ...(mcpTools?.length ? { mcpTools } : {}),
144
154
  });
145
155
  }
146
- async function runList(args) {
156
+ async function runList(args, appId) {
147
157
  const owner = getOwner();
148
158
  const sharedOwner = getSharedOwner();
149
159
  // Fetch only current user's and shared jobs (not other users')
@@ -164,6 +174,8 @@ async function runList(args) {
164
174
  if (classifyJobResource(full.content).kind === "automation")
165
175
  return null;
166
176
  const { meta } = parseJobFrontmatter(full.content);
177
+ if (!jobBelongsToApp(meta, appId))
178
+ return null;
167
179
  return {
168
180
  name: r.path.replace(/^jobs\//, "").replace(/\.md$/, ""),
169
181
  path: r.path,
@@ -191,7 +203,7 @@ async function runList(args) {
191
203
  }
192
204
  return JSON.stringify(scheduledJobs, null, 2);
193
205
  }
194
- async function runUpdate(args) {
206
+ async function runUpdate(args, appId) {
195
207
  const { name, schedule, instructions, enabled, scope, runAs, model } = args;
196
208
  const path = `jobs/${name}.md`;
197
209
  // Try to find the resource
@@ -213,10 +225,12 @@ async function runUpdate(args) {
213
225
  // `createdBy` is alice@…, and the next cron tick would run the
214
226
  // attacker's instructions as alice (creator-runAs schedules in
215
227
  // jobs/scheduler.ts line 273-278).
216
- const denied = await authorizeJobMutation(resource.owner, meta);
228
+ const denied = await authorizeJobMutation(resource.owner, meta, appId);
217
229
  if (denied) {
218
230
  return JSON.stringify({ error: denied });
219
231
  }
232
+ if (!meta.appId && appId?.trim())
233
+ meta.appId = appId.trim();
220
234
  if (schedule) {
221
235
  if (!isValidCron(schedule)) {
222
236
  return JSON.stringify({
@@ -273,7 +287,7 @@ async function runUpdate(args) {
273
287
  mcpTools: meta.mcpTools || [],
274
288
  });
275
289
  }
276
- async function runDelete(args) {
290
+ async function runDelete(args, appId) {
277
291
  const { name, scope } = args;
278
292
  const path = `jobs/${name}.md`;
279
293
  let resource = await resourceGetByPath(getSharedOwner(), path);
@@ -292,14 +306,14 @@ async function runDelete(args) {
292
306
  error: `"${name}" is an automation. Use manage-automations to delete it.`,
293
307
  });
294
308
  }
295
- const denied = await authorizeJobMutation(resource.owner, meta);
309
+ const denied = await authorizeJobMutation(resource.owner, meta, appId);
296
310
  if (denied) {
297
311
  return JSON.stringify({ error: denied });
298
312
  }
299
313
  await resourceDelete(resource.id);
300
314
  return JSON.stringify({ deleted: true, name });
301
315
  }
302
- export function createJobTools() {
316
+ export function createJobTools(appId) {
303
317
  return {
304
318
  "manage-jobs": {
305
319
  tool: {
@@ -374,13 +388,13 @@ For jobs that use a connected MCP, pass the exact tool names in mcpTools. This b
374
388
  run: async (args) => {
375
389
  switch (args.action) {
376
390
  case "create":
377
- return runCreate(args);
391
+ return runCreate(args, appId);
378
392
  case "list":
379
- return runList(args);
393
+ return runList(args, appId);
380
394
  case "update":
381
- return runUpdate(args);
395
+ return runUpdate(args, appId);
382
396
  case "delete":
383
- return runDelete(args);
397
+ return runDelete(args, appId);
384
398
  default:
385
399
  return JSON.stringify({
386
400
  error: `Unknown action "${args.action}". Use "create", "list", or "update".`,
@@ -616,6 +616,7 @@ declare const messages: {
616
616
  cronFieldCount: string;
617
617
  saveSchedule: string;
618
618
  details: string;
619
+ viewDetails: string;
619
620
  pause: string;
620
621
  resume: string;
621
622
  delete: string;
@@ -622,6 +622,7 @@ const messages = {
622
622
  cronFieldCount: "A cron expression needs exactly 5 fields.",
623
623
  saveSchedule: "Save schedule",
624
624
  details: "Details",
625
+ viewDetails: "View details",
625
626
  pause: "Pause",
626
627
  resume: "Resume",
627
628
  delete: "Delete",
@@ -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;
@@ -41,16 +41,16 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
41
41
  thumbsUpRate: number;
42
42
  avgEvalScore: number;
43
43
  } | {
44
+ error?: undefined;
44
45
  summary: import("./types.js").TraceSummary;
45
46
  spans: import("./types.js").TraceSpan[];
46
47
  id?: undefined;
47
- error?: undefined;
48
48
  ok?: undefined;
49
49
  } | {
50
+ error?: undefined;
50
51
  summary?: undefined;
51
52
  spans?: undefined;
52
53
  id: string;
53
- error?: undefined;
54
54
  ok?: undefined;
55
55
  } | {
56
56
  summary?: undefined;
@@ -59,9 +59,9 @@ export declare function createObservabilityHandler(): import("h3").EventHandlerW
59
59
  error: any;
60
60
  ok?: undefined;
61
61
  } | {
62
+ error?: undefined;
62
63
  summary?: undefined;
63
64
  spans?: undefined;
64
65
  id?: undefined;
65
- error?: undefined;
66
66
  ok: boolean;
67
67
  }>>;
@@ -15,6 +15,6 @@ export declare function createProgressHandler(): import("h3").EventHandlerWithFe
15
15
  error: string;
16
16
  ok?: undefined;
17
17
  } | {
18
- error?: undefined;
19
18
  ok: boolean;
19
+ error?: undefined;
20
20
  }>>;
@@ -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;
@@ -45,6 +45,8 @@ export interface ActionRouteAuthAdapter {
45
45
  export interface MountActionRoutesOptions {
46
46
  /** Resolve owner email from the H3 event (for data scoping). */
47
47
  getOwnerFromEvent?: (event: any) => string | Promise<string>;
48
+ /** Hosting app/template id used for app-owned action resources. */
49
+ appId?: string;
48
50
  /** Resolve display name from the H3 event, when available. */
49
51
  getUserNameFromEvent?: (event: any) => string | undefined | Promise<string | undefined>;
50
52
  /** Resolve org ID from the H3 event (for org scoping). */
@@ -423,6 +423,7 @@ export function mountActionRoutes(nitroApp, actions, options) {
423
423
  const result = await entry.run(params, {
424
424
  userEmail,
425
425
  orgId: orgId ?? null,
426
+ appId: options?.appId,
426
427
  caller,
427
428
  requestHeaders: event.headers,
428
429
  actionName: name,
@@ -673,7 +673,7 @@ export function createAgentChatPlugin(options) {
673
673
  try {
674
674
  if (automationGroupEnabled) {
675
675
  const { createAutomationToolEntries } = await import("../triggers/actions.js");
676
- automationTools = createAutomationToolEntries(() => requireCurrentRunOwner("manage automations"));
676
+ automationTools = createAutomationToolEntries(() => requireCurrentRunOwner("manage automations"), options?.appId);
677
677
  }
678
678
  }
679
679
  catch { }
@@ -1914,6 +1914,7 @@ export function createAgentChatPlugin(options) {
1914
1914
  mountActionRoutes(nitroApp, httpActions, {
1915
1915
  getOwnerFromEvent,
1916
1916
  getUserNameFromEvent,
1917
+ appId: options?.appId,
1917
1918
  resolveOrgId: options?.resolveOrgId,
1918
1919
  actionRouteAuth: options?.actionRouteAuth,
1919
1920
  });
@@ -2243,7 +2244,7 @@ export function createAgentChatPlugin(options) {
2243
2244
  try {
2244
2245
  if (automationGroupEnabled) {
2245
2246
  const { createJobTools } = await import("../jobs/tools.js");
2246
- jobTools = createJobTools();
2247
+ jobTools = createJobTools(options?.appId);
2247
2248
  }
2248
2249
  }
2249
2250
  catch { }
@@ -5,6 +5,7 @@ import { getAuthSecret, resolveSignupTrackingIdentity, } from "./better-auth-ins
5
5
  import { getAppBasePath, getOrigin } from "./google-oauth.js";
6
6
  const DEFAULT_BUILDER_APP_HOST = "https://builder.io";
7
7
  const DEFAULT_BUILDER_API_HOST = "https://api.builder.io";
8
+ const BUILDER_API_REQUEST_TIMEOUT_MS = 30_000;
8
9
  const BUILDER_BROWSER_HOST = "agent-native-browser";
9
10
  const BUILDER_BROWSER_CLIENT_ID = "Agent Native Browser";
10
11
  export const BUILDER_CALLBACK_PATH = "/_agent-native/builder/callback";
@@ -1359,6 +1360,21 @@ async function resolveBuilderApiCredentials() {
1359
1360
  publicKey: creds.publicKey,
1360
1361
  };
1361
1362
  }
1363
+ async function fetchBuilderApi(input, init, operation) {
1364
+ try {
1365
+ return await fetch(input, {
1366
+ ...init,
1367
+ signal: AbortSignal.timeout(BUILDER_API_REQUEST_TIMEOUT_MS),
1368
+ });
1369
+ }
1370
+ catch (error) {
1371
+ const errorName = error instanceof Error ? error.name : "";
1372
+ if (errorName === "AbortError" || errorName === "TimeoutError") {
1373
+ throw new Error(`Builder ${operation} timed out after ${BUILDER_API_REQUEST_TIMEOUT_MS}ms`, { cause: error });
1374
+ }
1375
+ throw error;
1376
+ }
1377
+ }
1362
1378
  async function readBuilderApiObject(response, operation) {
1363
1379
  let parsed;
1364
1380
  try {
@@ -1400,10 +1416,10 @@ export async function findBuilderProjectForRepo(args) {
1400
1416
  const url = new URL("/projects", getBuilderApiHost());
1401
1417
  url.searchParams.set("apiKey", creds.publicKey);
1402
1418
  url.searchParams.set("includeHidden", "true");
1403
- const response = await fetch(url, {
1419
+ const response = await fetchBuilderApi(url, {
1404
1420
  method: "GET",
1405
1421
  headers: { Authorization: `Bearer ${creds.privateKey}` },
1406
- });
1422
+ }, "project lookup");
1407
1423
  const parsed = await readBuilderApiObject(response, "project lookup");
1408
1424
  if (!response.ok) {
1409
1425
  throw new Error(builderApiErrorMessage(parsed, `Builder project lookup failed (${response.status})`));
@@ -1432,7 +1448,7 @@ export async function createBuilderProject(args) {
1432
1448
  const creds = await resolveBuilderApiCredentials();
1433
1449
  const url = new URL("/projects/create", getBuilderApiHost());
1434
1450
  url.searchParams.set("apiKey", creds.publicKey);
1435
- const response = await fetch(url, {
1451
+ const response = await fetchBuilderApi(url, {
1436
1452
  method: "POST",
1437
1453
  headers: {
1438
1454
  Authorization: `Bearer ${creds.privateKey}`,
@@ -1442,7 +1458,7 @@ export async function createBuilderProject(args) {
1442
1458
  source: { kind: "repo", repoUrl },
1443
1459
  name,
1444
1460
  }),
1445
- });
1461
+ }, "project creation");
1446
1462
  const parsed = await readBuilderApiObject(response, "project creation");
1447
1463
  if (!response.ok) {
1448
1464
  throw new Error(builderApiErrorMessage(parsed, `Builder project creation failed (${response.status})`));
@@ -1526,14 +1542,14 @@ export async function runBuilderAgent(args) {
1526
1542
  body.userEmail = actor.userEmail;
1527
1543
  if (actor.userId)
1528
1544
  body.userId = actor.userId;
1529
- const response = await fetch(url, {
1545
+ const response = await fetchBuilderApi(url, {
1530
1546
  method: "POST",
1531
1547
  headers: {
1532
1548
  Authorization: `Bearer ${creds.privateKey}`,
1533
1549
  "Content-Type": "application/json",
1534
1550
  },
1535
1551
  body: JSON.stringify(body),
1536
- });
1552
+ }, "agent run");
1537
1553
  const parsed = (await response.json().catch(() => ({})));
1538
1554
  return { response, parsed };
1539
1555
  };
@@ -1582,7 +1598,7 @@ export async function requestBuilderBrowserConnection(args) {
1582
1598
  if (creds.userId) {
1583
1599
  url.searchParams.set("userId", creds.userId);
1584
1600
  }
1585
- const response = await fetch(url, {
1601
+ const response = await fetchBuilderApi(url, {
1586
1602
  method: "POST",
1587
1603
  headers: {
1588
1604
  Authorization: `Bearer ${creds.privateKey}`,
@@ -1596,7 +1612,7 @@ export async function requestBuilderBrowserConnection(args) {
1596
1612
  proxyDefaultOrigin: args.proxyDefaultOrigin || undefined,
1597
1613
  proxyDst: args.proxyDestination || undefined,
1598
1614
  }),
1599
- });
1615
+ }, "browser connection request");
1600
1616
  const body = (await response.json().catch(() => ({})));
1601
1617
  if (!response.ok) {
1602
1618
  const error = typeof body.error === "string"
@@ -20,6 +20,6 @@ export declare function createTranscribeVoiceHandler(): import("h3").EventHandle
20
20
  error: string;
21
21
  text?: undefined;
22
22
  } | {
23
- text: string;
24
23
  error?: undefined;
24
+ text: string;
25
25
  }>>;
@@ -36,8 +36,10 @@ Tier 4 includes **all** of the following — not only editing package source:
36
36
  - Files under `node_modules/@agent-native/*` (core, dispatch, scheduling, …)
37
37
  - `pnpm.overrides`, `overrides`, `resolutions`, or `patchedDependencies` that
38
38
  target any `@agent-native/*` package
39
- - Local package patches or invented "dispatch/core behavior" shims meant to
40
- paper over a version skew or failed upgrade
39
+ - `pnpm patch`, `pnpm patch-commit`, or local package patch artifacts for any
40
+ dependency
41
+ - Invented "dispatch/core behavior" shims meant to paper over a version skew
42
+ or failed upgrade
41
43
 
42
44
  This does not prohibit intentional app-owned UI customization. When public
43
45
  props and composition are insufficient, the `customizing-agent-native` skill
@@ -100,8 +102,10 @@ inline strings in components.
100
102
  - Don't confuse readable package source with app-owned code: use
101
103
  `customizing-agent-native` and `agent-native eject` for supported ownership
102
104
  transfer
105
+ - Don't use `pnpm patch` / `pnpm patch-commit`, commit `patches/` artifacts, or
106
+ add `pnpm.patchedDependencies` to "make the app run" after a version bump
103
107
  - Don't add `pnpm.overrides` / `patchedDependencies` / `resolutions` for
104
- `@agent-native/*` to "make the app run" after a version bump
108
+ `@agent-native/*` to paper over a broken upgrade
105
109
  - Don't invent local dispatch/core behavior overrides when upgrade fails —
106
110
  run `npx @agent-native/core@latest upgrade`, then fix app-level errors only
107
111
  - Don't modify `.agents/skills/` or `AGENTS.md` unless explicitly requested
@@ -15,8 +15,9 @@ metadata:
15
15
 
16
16
  When an older Agent Native app/branch needs to run on current packages, use
17
17
  `agent-native upgrade`. Never "fix" upgrade breakage with
18
- `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patches, or
19
- edits under `node_modules/@agent-native/*` — especially not against
18
+ `pnpm patch`, `pnpm patch-commit`, `pnpm.patchedDependencies`,
19
+ `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patch artifacts,
20
+ or edits under `node_modules/@agent-native/*` — especially not against
20
21
  `@agent-native/core` or `@agent-native/dispatch`.
21
22
 
22
23
  ## Why
@@ -109,6 +110,8 @@ install → refresh scaffold skills → verify, then fix **app** code only.
109
110
 
110
111
  - Don't add `pnpm.overrides`, `overrides`, `resolutions`, or
111
112
  `patchedDependencies` for any `@agent-native/*` package
113
+ - Don't run `pnpm patch` or `pnpm patch-commit`, or commit files under
114
+ `patches/`, for any dependency
112
115
  - Don't edit `node_modules/@agent-native/core` or
113
116
  `node_modules/@agent-native/dispatch`
114
117
  - Don't invent local "dispatch behavior" shims to paper over version skew
@@ -1,6 +1,6 @@
1
1
  [build]
2
2
  ignore = "node ./scripts/netlify-ignore-build.mjs chat"
3
- command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter chat build"
3
+ command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter chat build && if [ \"${CONTEXT:-}\" = \"production\" ]; then pnpm --filter chat migrate:production; fi"
4
4
  publish = "templates/chat/dist"
5
5
  functions = "templates/chat/.netlify/functions-internal"
6
6
 
@@ -5,6 +5,7 @@
5
5
  "description": "Minimal chat-first agent-native app template.",
6
6
  "type": "module",
7
7
  "scripts": {
8
+ "migrate:production": "tsx scripts/migrate-production.ts",
8
9
  "dev": "agent-native dev --open",
9
10
  "build": "agent-native build",
10
11
  "start": "agent-native start",
@@ -0,0 +1,31 @@
1
+ import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
+ import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+
4
+ /**
5
+ * Release-time schema entrypoint.
6
+ *
7
+ * Every deploy runs this once, and request functions never touch schema. That
8
+ * ordering is not an optimization: on serverless, "migrate on first use" means
9
+ * migrate on EVERY cold start, and a production incident traced a multi-hour
10
+ * outage to schema introspection running 4-6 times concurrently on the request
11
+ * path.
12
+ *
13
+ * `withMigrationRuntime()` is load-bearing. The Netlify BUILD environment sets
14
+ * NETLIFY=true, so this script looks like a serverless request to the guard in
15
+ * `runMigrations` — it is allowed to migrate only because it claims duty here.
16
+ * A release entrypoint that forgets the wrapper silently does nothing.
17
+ *
18
+ * If this app owns tables of its own, export its migration runner from
19
+ * `server/plugins/db.ts` and call it inside the same block.
20
+ */
21
+ async function main(): Promise<void> {
22
+ await withMigrationRuntime(async () => {
23
+ await runFrameworkReleaseMigrations(null);
24
+ });
25
+ }
26
+
27
+ try {
28
+ await main();
29
+ } finally {
30
+ await closeDbExec();
31
+ }
@@ -13,6 +13,7 @@
13
13
  "app/**/*",
14
14
  "server/**/*",
15
15
  "shared/**/*",
16
+ "scripts/**/*",
16
17
  "vite.config.ts",
17
18
  "react-router.config.ts",
18
19
  ".react-router/types/**/*",
@@ -36,8 +36,10 @@ Tier 4 includes **all** of the following — not only editing package source:
36
36
  - Files under `node_modules/@agent-native/*` (core, dispatch, scheduling, …)
37
37
  - `pnpm.overrides`, `overrides`, `resolutions`, or `patchedDependencies` that
38
38
  target any `@agent-native/*` package
39
- - Local package patches or invented "dispatch/core behavior" shims meant to
40
- paper over a version skew or failed upgrade
39
+ - `pnpm patch`, `pnpm patch-commit`, or local package patch artifacts for any
40
+ dependency
41
+ - Invented "dispatch/core behavior" shims meant to paper over a version skew
42
+ or failed upgrade
41
43
 
42
44
  This does not prohibit intentional app-owned UI customization. When public
43
45
  props and composition are insufficient, the `customizing-agent-native` skill
@@ -100,8 +102,10 @@ inline strings in components.
100
102
  - Don't confuse readable package source with app-owned code: use
101
103
  `customizing-agent-native` and `agent-native eject` for supported ownership
102
104
  transfer
105
+ - Don't use `pnpm patch` / `pnpm patch-commit`, commit `patches/` artifacts, or
106
+ add `pnpm.patchedDependencies` to "make the app run" after a version bump
103
107
  - Don't add `pnpm.overrides` / `patchedDependencies` / `resolutions` for
104
- `@agent-native/*` to "make the app run" after a version bump
108
+ `@agent-native/*` to paper over a broken upgrade
105
109
  - Don't invent local dispatch/core behavior overrides when upgrade fails —
106
110
  run `npx @agent-native/core@latest upgrade`, then fix app-level errors only
107
111
  - Don't modify `.agents/skills/` or `AGENTS.md` unless explicitly requested
@@ -15,8 +15,9 @@ metadata:
15
15
 
16
16
  When an older Agent Native app/branch needs to run on current packages, use
17
17
  `agent-native upgrade`. Never "fix" upgrade breakage with
18
- `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patches, or
19
- edits under `node_modules/@agent-native/*` — especially not against
18
+ `pnpm patch`, `pnpm patch-commit`, `pnpm.patchedDependencies`,
19
+ `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patch artifacts,
20
+ or edits under `node_modules/@agent-native/*` — especially not against
20
21
  `@agent-native/core` or `@agent-native/dispatch`.
21
22
 
22
23
  ## Why
@@ -109,6 +110,8 @@ install → refresh scaffold skills → verify, then fix **app** code only.
109
110
 
110
111
  - Don't add `pnpm.overrides`, `overrides`, `resolutions`, or
111
112
  `patchedDependencies` for any `@agent-native/*` package
113
+ - Don't run `pnpm patch` or `pnpm patch-commit`, or commit files under
114
+ `patches/`, for any dependency
112
115
  - Don't edit `node_modules/@agent-native/core` or
113
116
  `node_modules/@agent-native/dispatch`
114
117
  - Don't invent local "dispatch behavior" shims to paper over version skew
@@ -11,6 +11,7 @@
11
11
  "agent-native:doctor": "agent-native doctor",
12
12
  "action": "agent-native action",
13
13
  "script": "agent-native script",
14
+ "migrate:production": "tsx scripts/migrate-production.ts",
14
15
  "skills:update": "agent-native skills update scaffold --project",
15
16
  "upgrade:agent-native": "agent-native upgrade"
16
17
  },
@@ -0,0 +1,31 @@
1
+ import { closeDbExec, withMigrationRuntime } from "@agent-native/core/db";
2
+ import { runFrameworkReleaseMigrations } from "@agent-native/core/server";
3
+
4
+ /**
5
+ * Release-time schema entrypoint.
6
+ *
7
+ * Every deploy runs this once, and request functions never touch schema. That
8
+ * ordering is not an optimization: on serverless, "migrate on first use" means
9
+ * migrate on EVERY cold start, and a production incident traced a multi-hour
10
+ * outage to schema introspection running 4-6 times concurrently on the request
11
+ * path.
12
+ *
13
+ * `withMigrationRuntime()` is load-bearing. The Netlify BUILD environment sets
14
+ * NETLIFY=true, so this script looks like a serverless request to the guard in
15
+ * `runMigrations` — it is allowed to migrate only because it claims duty here.
16
+ * A release entrypoint that forgets the wrapper silently does nothing.
17
+ *
18
+ * If this app owns tables of its own, export its migration runner from
19
+ * `server/plugins/db.ts` and call it inside the same block.
20
+ */
21
+ async function main(): Promise<void> {
22
+ await withMigrationRuntime(async () => {
23
+ await runFrameworkReleaseMigrations(null);
24
+ });
25
+ }
26
+
27
+ try {
28
+ await main();
29
+ } finally {
30
+ await closeDbExec();
31
+ }
@@ -4,6 +4,7 @@
4
4
  "app/**/*",
5
5
  "server/**/*",
6
6
  "shared/**/*",
7
+ "scripts/**/*",
7
8
  "vite.config.ts",
8
9
  "react-router.config.ts",
9
10
  ".react-router/types/**/*",
@@ -15,8 +15,9 @@ metadata:
15
15
 
16
16
  When an older Agent Native app/branch needs to run on current packages, use
17
17
  `agent-native upgrade`. Never "fix" upgrade breakage with
18
- `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patches, or
19
- edits under `node_modules/@agent-native/*` — especially not against
18
+ `pnpm patch`, `pnpm patch-commit`, `pnpm.patchedDependencies`,
19
+ `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patch artifacts,
20
+ or edits under `node_modules/@agent-native/*` — especially not against
20
21
  `@agent-native/core` or `@agent-native/dispatch`.
21
22
 
22
23
  ## Why
@@ -109,6 +110,8 @@ install → refresh scaffold skills → verify, then fix **app** code only.
109
110
 
110
111
  - Don't add `pnpm.overrides`, `overrides`, `resolutions`, or
111
112
  `patchedDependencies` for any `@agent-native/*` package
113
+ - Don't run `pnpm patch` or `pnpm patch-commit`, or commit files under
114
+ `patches/`, for any dependency
112
115
  - Don't edit `node_modules/@agent-native/core` or
113
116
  `node_modules/@agent-native/dispatch`
114
117
  - Don't invent local "dispatch behavior" shims to paper over version skew
@@ -36,8 +36,10 @@ Tier 4 includes **all** of the following — not only editing package source:
36
36
  - Files under `node_modules/@agent-native/*` (core, dispatch, scheduling, …)
37
37
  - `pnpm.overrides`, `overrides`, `resolutions`, or `patchedDependencies` that
38
38
  target any `@agent-native/*` package
39
- - Local package patches or invented "dispatch/core behavior" shims meant to
40
- paper over a version skew or failed upgrade
39
+ - `pnpm patch`, `pnpm patch-commit`, or local package patch artifacts for any
40
+ dependency
41
+ - Invented "dispatch/core behavior" shims meant to paper over a version skew
42
+ or failed upgrade
41
43
 
42
44
  This does not prohibit intentional app-owned UI customization. When public
43
45
  props and composition are insufficient, the `customizing-agent-native` skill
@@ -100,8 +102,10 @@ inline strings in components.
100
102
  - Don't confuse readable package source with app-owned code: use
101
103
  `customizing-agent-native` and `agent-native eject` for supported ownership
102
104
  transfer
105
+ - Don't use `pnpm patch` / `pnpm patch-commit`, commit `patches/` artifacts, or
106
+ add `pnpm.patchedDependencies` to "make the app run" after a version bump
103
107
  - Don't add `pnpm.overrides` / `patchedDependencies` / `resolutions` for
104
- `@agent-native/*` to "make the app run" after a version bump
108
+ `@agent-native/*` to paper over a broken upgrade
105
109
  - Don't invent local dispatch/core behavior overrides when upgrade fails —
106
110
  run `npx @agent-native/core@latest upgrade`, then fix app-level errors only
107
111
  - Don't modify `.agents/skills/` or `AGENTS.md` unless explicitly requested
@@ -15,8 +15,9 @@ metadata:
15
15
 
16
16
  When an older Agent Native app/branch needs to run on current packages, use
17
17
  `agent-native upgrade`. Never "fix" upgrade breakage with
18
- `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patches, or
19
- edits under `node_modules/@agent-native/*` — especially not against
18
+ `pnpm patch`, `pnpm patch-commit`, `pnpm.patchedDependencies`,
19
+ `pnpm.overrides`, `patchedDependencies`, `resolutions`, local patch artifacts,
20
+ or edits under `node_modules/@agent-native/*` — especially not against
20
21
  `@agent-native/core` or `@agent-native/dispatch`.
21
22
 
22
23
  ## Why
@@ -109,6 +110,8 @@ install → refresh scaffold skills → verify, then fix **app** code only.
109
110
 
110
111
  - Don't add `pnpm.overrides`, `overrides`, `resolutions`, or
111
112
  `patchedDependencies` for any `@agent-native/*` package
113
+ - Don't run `pnpm patch` or `pnpm patch-commit`, or commit files under
114
+ `patches/`, for any dependency
112
115
  - Don't edit `node_modules/@agent-native/core` or
113
116
  `node_modules/@agent-native/dispatch`
114
117
  - Don't invent local "dispatch behavior" shims to paper over version skew
@@ -36,7 +36,8 @@ Preview before `--apply`, commit `agent-native.ejections.json`, and never edit
36
36
  To bring an older workspace current, run `pnpm upgrade:agent-native` or
37
37
  `npx @agent-native/core@latest upgrade` from the workspace root. That bumps
38
38
  `@agent-native/*` deps, installs, refreshes scaffold skills, and typechecks.
39
- Do **not** add `pnpm.overrides` / patches against `@agent-native/*` or edit
39
+ Do **not** run `pnpm patch` / `pnpm patch-commit`, add
40
+ `pnpm.patchedDependencies`, commit dependency patches, or edit
40
41
  `node_modules/@agent-native/*` when an upgrade fails — fix app code or ask.
41
42
  See the `upgrade-agent-native` and `self-modifying-code` skills.
42
43
  After a manual core bump only, `pnpm skills:update` (or